小程序
2021-05-17 14:12:47 1 举报
AI智能生成
商城小程序的功能模块讲解
作者其他创作
大纲/内容
小知识
配置虚拟域名,简化前面url路径
在apache的apache\conf\extra目录下的httpd-vhosts.conf文件中
配置apache的虚拟路由
<VirtualHost *:80>
DocumentRoot "D:\XAMPP\htdocs\zerg\public"
ServerName jecht.com
</VirtualHost>
配置apache的虚拟路由
<VirtualHost *:80>
DocumentRoot "D:\XAMPP\htdocs\zerg\public"
ServerName jecht.com
</VirtualHost>
配置hosts文件,使本地可以使用域名
127.0.0.1 jecht.com
127.0.0.1 jecht.com
配置路由,简化后面url路径
编写路由文件:route.php
在config.php中可以设置路由模式
有两种路由写法:1:配置写法(PATH_INFO)
2:动态注册写法(路由模式)
3:混合模式
在config.php中可以设置路由模式
有两种路由写法:1:配置写法(PATH_INFO)
2:动态注册写法(路由模式)
3:混合模式
PATH_INFO访问模式
混合模式
既可以使用PATH_INFO,也可以使用路由模式,但是不是使用同一个路由
强制使用路由模式(原有的PATH_INFO会失效)(推荐)
定义路由:Route::rule("路由表达式","路由地址","请求类型","路由参数(数组)","变量规则(数组)");
请求类型:GET,POST,DELETE,PUT,*
请求类型:GET,POST,DELETE,PUT,*
use think\Route;
Route::rule("hello",'sample/test/hello',"GET|POST","['https'=>true]");
TP5的方法:
Route::get("hello",'sample/test/hello');
post()
any()
Route::get("hello",'sample/test/hello');
post()
any()
在路由内传递参数:(为了在操作方法function hello内获取参数)
在url路径内传参数:Route::get("hello/:id",'sample/test/hello');
在url路径内传参数:Route::get("hello/:id",'sample/test/hello');
前期准备
环境、工具的安装
1.下载安装XMAPP:一种打包安装php、mysql、apache的工具
2.微信客户端的安装
3.thinkphp5.7框架源码包的下载安装(think-5.07、farmework-5.07)
4.安装php开发IDE——phpstorm
5.安装接口的测试工具——PostMan
项目文件夹的命名
服务器程序:Zerg(重命名think-5.07——Zerg,framework-5.07——Zerg/thinkphp)
客户端小程序:Protoss
CMS后台管理系统:Terran
TP5目录层次结构
(官方文档:https://www.kancloud.cn/manual/thinkphp5/118003)
(官方文档:https://www.kancloud.cn/manual/thinkphp5/118003)
入口文件(可以有多个)
Zerg/public/index.php
1.定义应用目录
2.加载框架引导文件
2.加载框架引导文件
应用目录
(Zerg/application/)
(Zerg/application/)
模块文件夹(包含多个模块)
(Zerg/application/index/)
(Zerg/application/index/)
有多个控制器,控制器中有多个action,
通过action方法调用业务层返回view
通过action方法调用业务层返回view
有多个控制器,控制器中有多个action,
通过action方法调用业务层返回view
通过action方法调用业务层返回view
业务层
(model)
(model)
控制器
(cortroller)
(class Index)
(cortroller)
(class Index)
动作
(action1)
(public function index())
(action1)
(public function index())
动作
(action2)
(action2)
默认文件
route.php
子主题
database.php
数据库配置
config.php
服务配置文件
command.php
公共函数文件
verdor
存放第三方类库,或插件类库
thinkphp
官方核心框架目录
runtime
缓存、日志文件夹
public
外部站点目录(可以直接访问)
extend
存放第三方类库
前期设计
数据库的设计
研究sql文件中,对数据插入的技巧
banner轮播图的编写
url:
application/api/controller/Banner/v1/Banner.php
application/api/controller/Banner/v1/Banner.php
携带参数的路由编写:
use think\Route;
Route::post("Banner/:id",'api/v1.Banner/GetBanner');
use think\Route;
Route::post("Banner/:id",'api/v1.Banner/GetBanner');
接口编写:
class Banner{
public function GetBanner($id)
}
class Banner{
public function GetBanner($id)
}
测试:
jecht.com/Banner/123
jecht.com/Banner/123
TP5的validate构建参数验证层
用法
独立验证
(对数据对象配置传递规则)
(对数据对象配置传递规则)
use think/validate
public function GetBanner($id)
{
$data =[
'name' =>'vendorjecht',
'email' =>'jechtqq.com'
];
$validate = new Validate([
'name' => 'require|max:10',
'email' =>'email'
]);
$result = $validate->batch()->check($data);
var_dump($validate->getError());
}
public function GetBanner($id)
{
$data =[
'name' =>'vendorjecht',
'email' =>'jechtqq.com'
];
$validate = new Validate([
'name' => 'require|max:10',
'email' =>'email'
]);
$result = $validate->batch()->check($data);
var_dump($validate->getError());
}
通过TP5内置的规则库对数据data的去进行规则设置
(可查询官方文档查看)
如:name的取值设置为必须填写且 最大值不超过10
email的去只需要符合email格式
(可查询官方文档查看)
如:name的取值设置为必须填写且 最大值不超过10
email的去只需要符合email格式
验证器(推荐)
封装性更好
封装性更好
采用TP5库内的规则
新建validate控制器文件:api/validate/TestValidate.php
use think\Validate;
class TestValidate extends Validate
{
protectend $rule = [
'name' => 'require|max:10',
'email' =>'email'
];
}
use think\validate;
public function GetBanner($id)
{
$data =[
'name' =>'jecht',
'email' =>'jecht@qq.com'
];
}
$validate = new TestValidate([
'name' => 'require|max:10',
'email' =>'email'
]);
$result = $validate->batch()->check($data);
var_dump($validate->getError());
}
use think\Validate;
class TestValidate extends Validate
{
protectend $rule = [
'name' => 'require|max:10',
'email' =>'email'
];
}
use think\validate;
public function GetBanner($id)
{
$data =[
'name' =>'jecht',
'email' =>'jecht@qq.com'
];
}
$validate = new TestValidate([
'name' => 'require|max:10',
'email' =>'email'
]);
$result = $validate->batch()->check($data);
var_dump($validate->getError());
}
配置的数据规则在TestValidate中属于成员属性变量,可见性是protected
默认的变量为$rule
默认的变量为$rule
自定义规则
use think\Validate;
class TestValidate extends Validate
{
protectend $rule = [
'name' => 'require|max:10',
'email' =>'email'
];
}
class TestValidate extends Validate
{
protectend $rule = [
'name' => 'require|max:10',
'email' =>'email'
];
}
架构图
支付流程
构建验证层
验证层用于传入参数时验证参数的正确性
1.建立BaseValidate的goCheck()方法,作为获取http传入参数,并对参数进行校验的功能
use think\Exception;
use think\Request;
use think\Validate;
class BaseValidate extends Validate{
public function gocheck(){
//获取http传入参数
//对参数做校验
$request = Request::instance();
$params = $request->param();
$result = $this->check($params);
if (!$result){
$error = $this->getError();
throw new Exception($error);
}
else{
return true;
}
}
2.建立Validate校验库,用于各种数据传参时的校验,引用BaseValidate,编写校验规则
class IDMustBePositiveInt extends BaseValidate
{
protected $rule = [
"id" => "require|isPositiveInteger"
];
protected function isPositiveInteger($value,$rule = "",
$data = "",$field = "")
{
if(is_numeric($value) && is_int($value + 0) && ($value + 0) > 0){
return true;
}
else{
return $field."必须是正整数";
}
}
}
3.在建立每个控制器时,需要对传入的参数进行校验,
校验直接可以调用其中的校验器例如IDMustBePositiveInt()的gocheck方法
校验直接可以调用其中的校验器例如IDMustBePositiveInt()的gocheck方法
use app\api\validate\IDMustBePositiveInt;
class Banner
{
public function GetBanner($id)
{
(new IDMustBePositiveInt())->gocheck();
}
}
构建全局异常处理层
操作数据库
DB的querry()方法把数据从数据库中查询出来
在model的Banner中,编写GetBannerByID函数
public stric
$result = Db::query('select * from banner_item where banner_id=?',[$id]);
return $result;
public stric
$result = Db::query('select * from banner_item where banner_id=?',[$id]);
return $result;
构建TP5的数据库访问层
DB操作数据库接口
Drivers驱动器
Collectioon判断数据库类型
Builder生成器处理差异
Query查询构建器
包含数据的读写操作
#find方法访问一条,select访问所有,还有update、delete、insert等数据库操作方法
DB::table->where()返回一个querry对象,where('字段名','表达式','查询条件');
$result = Db::table('banner_item')->where('banner_id',"=",$id)
-> select();
return $result;
where()的闭包写法
$result = DB::table->('banner_item')
->where(function ($querry) use ($id){
$querry->where('banner_id','=',$id);
})
->select();
return $result
DB::table->where()返回一个querry对象,where('字段名','表达式','查询条件');
$result = Db::table('banner_item')->where('banner_id',"=",$id)
-> select();
return $result;
where()的闭包写法
$result = DB::table->('banner_item')
->where(function ($querry) use ($id){
$querry->where('banner_id','=',$id);
})
->select();
return $result
链式方法的注意点:
1.链式方法只能在sql执行方法之前
2.不同的链式方法之间的位置关系可以无顺序的
3.相同的链式方法之间的位置关系是有顺序的(例如两个order)
1.链式方法只能在sql执行方法之前
2.不同的链式方法之间的位置关系可以无顺序的
3.相同的链式方法之间的位置关系是有顺序的(例如两个order)
ORM(关系对象映射)对象模型和关联模型
Bannermodel继承了Model:class Banner extends Model
在编写业务逻辑时:
$Banner = BannerModel::GetBannerByID($id):返回一个数组
$Banner = BannerModel::get($id):返回一个业务对象,方便对对象进行后续操作
在编写业务逻辑时:
$Banner = BannerModel::GetBannerByID($id):返回一个数组
$Banner = BannerModel::get($id):返回一个业务对象,方便对对象进行后续操作
关联模型(Banner中的id关联BannerItem中的banner_id)
v1/Banner.php
#关联item模型,hasmany(关联的模型名,关联的外键,当前模型的主键)
$banner = BannerModel::with('items')->find($id);
#多个模型可以用数组加入with中,例如with(['items','item1s'])。
Banner.php
public function items(){
return $this->hasMany('BannerItem','banner_id','id')
}
#关联item模型,hasmany(关联的模型名,关联的外键,当前模型的主键)
$banner = BannerModel::with('items')->find($id);
#多个模型可以用数组加入with中,例如with(['items','item1s'])。
Banner.php
public function items(){
return $this->hasMany('BannerItem','banner_id','id')
}
嵌套模型(Banner关联的BannerItem中的img_id关联着img模型中的id)
v1/Banner.php
$banner = BannerModel::with(['items','items.img'])->find($id);
Banner.php
public function items(){
return $this->hasMany('BannerItem','banner_id','id')
}
BannerItem.php
public function img(){
return $this->belongsTo('Image','img_id','id');
}
$banner = BannerModel::with(['items','items.img'])->find($id);
Banner.php
public function items(){
return $this->hasMany('BannerItem','banner_id','id')
}
BannerItem.php
public function img(){
return $this->belongsTo('Image','img_id','id');
}
隐藏banner数据中的字段
toArry(将$banner中的data以数组的方式提取出来,对数组进行操作)
$data = $banner->toArry();
unset($data['update_time']);
unset($data['update_time']);
hiddle(对$banner中的$data数据进行操作)
$data = $banner->hidden(['update_time']);
visible(只显示$banner中data里选中的数据)
$data = $banner->visible(['update_time','item']);
(推荐)在模型类里隐藏数据
model/Banner.php、BannerItem.php、Img.php
在class Banner extends Model中
{
protected $hidden = ['id'];
}
在class Banner extends Model中
{
protected $hidden = ['id'];
}
模块的关联
http://blog.csdn.net/github_37512301/article/details/75675054
一对一
主表不包含外键,从表包含外键,
若在从表关联主表使用belongTo,主表关联从表使用hasMany
若在从表关联主表使用belongTo,主表关联从表使用hasMany
return $this->HasOne('关联的模型','关联模型的外键','当前模型的主键')
return $this->belongsTo('关联的模型','当前模型的外键','关联模型的主键')
一对多
return $this->hasMany('关联的模型','关联模型的外键','当前模型的主键')
多对多
return $this->belongsToMany('关联的模型','中间表名','中间表名与关联模型相关的的外键名','中间表名与当前模型相关的外键名')
页面建设
轮播图页面接口
(app\api)
(app\api)
url
jecht.com/api/v1/banner/?XDEBUG_SESSION_START=11508
Banner控制器
1.对ID通过IDMustBePositiveInt()模块进行验证
2.根据GetBannerByID获取Banner对象
3.通过错误检测层对Banner对象的报错进行判断和显示
4.返回banner到客户端
(api\controller\v1\Banner.php)
获取数据库中Banner中对应的banneritem表和对应的img数据
2.根据GetBannerByID获取Banner对象
3.通过错误检测层对Banner对象的报错进行判断和显示
4.返回banner到客户端
(api\controller\v1\Banner.php)
获取数据库中Banner中对应的banneritem表和对应的img数据
Banner模块及其关联模块
基础model模型
(model\BaseModel.php)
(model\BaseModel.php)
获得id参数
(model\Banner.php)
(model\Banner.php)
获得Banner_id参数,并关联到BannerModel中的id参数
model\BannerItem.php
model\BannerItem.php
将Img中的id与item中的img_id关联
model\Img.php
model\Img.php
validate字符验证
基础的字符验证模型
validate\BaseValidate.php
validate\BaseValidate.php
验证传入的id参数是否为正整数
IDMustBePostivenInt.php
IDMustBePostivenInt.php
全局异常处理层
全局异常处理执行中心
lib\exception\ExceptionHandler.php
lib\exception\ExceptionHandler.php
基础异常处理模板
lib\exception\BaseException.php
lib\exception\BaseException.php
public $code = 400;
public $msg = 'invalid parameters';
public $errorCode = 999;
public $msg = 'invalid parameters';
public $errorCode = 999;
通用参数错误
lib\exception\ParameterException.php
lib\exception\ParameterException.php
public $code = 400;
public $errorCode = 10000;
public $msg = "invalid parameters";
public $errorCode = 10000;
public $msg = "invalid parameters";
Banner丢失异常处理
lib\exception\BannerMissException.php
lib\exception\BannerMissException.php
public $code = 404;
public $msg = '请求的Banner不存在';
public $errCode = 40000;
public $msg = '请求的Banner不存在';
public $errCode = 40000;
三大主题及主题头部图片接口
url
jecht.com/api/v1/Theme?id=1,2,3
Theme主题控制器
获取数据库中theme表,以及topic_img的url和head_img的url
api\controller\v1\Theme.php
api\controller\v1\Theme.php
Theme及其关联模块
使用关联模型,将theme数据表的topic_img_id字段和head_img_id字段关联到img表的id字段
model\Theme.php
model\Theme.php
获得topic_id和head_img_id,并关联到img表中的id
model\Product.php
model\Product.php
validate字符验证
验证传入的id必须是以逗号分割的正整数
validate\IDCollection.php
validate\IDCollection.php
全局异常处理层
主题异常处理
\lib\exception\ThemeException.php
\lib\exception\ThemeException.php
public $code = 404;
public $msg = '指定的主题不存在,请检查ID';
public $errCode = 30000;
public $msg = '指定的主题不存在,请检查ID';
public $errCode = 30000;
分类商品接口
url
所有分类产品内容
jecht.com/api/v1/category/all
category分类控制器
获得头部图片
controller\v1\Category.php
controller\v1\Category.php
category关联模块
关联Img模块处理图片
model\Category.php
model\Category.php
category字符验证
category异常处理
lib\exception\CategoryException.php
public $code = 404;
public $msg = "指定类目不存在,请检查参数";
public $errCode = 50000;
public $msg = "指定类目不存在,请检查参数";
public $errCode = 50000;
产品接口
url
最近新品
jecht.com/api/v1/category/recent?count=15
分类产品及头图
jecht.com/api/v1/category/by_product?id=7
product分类控制器
实现两个功能的函数
controller\v1\category
controller\v1\category
product关联模块
两个功能函数的数据库查询操作
model\Category.php
model\Category.php
product字符验证
验证传入的count在1到15之间,默认不填为15
validata\Count.php
validata\Count.php
验证id在分类大类的id之间,且为正整数
validata\IDMustBePositiveInt.php
validata\IDMustBePositiveInt.php
product异常处理
ProductException.php
public $code = 404;
public $msg = '产品不存在';
public $errCode = 20000;
public $msg = '产品不存在';
public $errCode = 20000;
CategoryproductException.php
public $code = 404;
public $msg = "指定的分类产品不存在,请检查ID";
public $errCode = 50001;
public $msg = "指定的分类产品不存在,请检查ID";
public $errCode = 50001;
下单接口的访问权限控制
权限校验模型
验证是否合法
验证是否有效
验证token所对应的权限
子主题
验证过程:验证身份的时候依靠小程序的身份体系传递的code码传向gettoken接口;
gettoken接收到code码后,传递给微信服务器,微信服务器返回两个参数:openid、session_key;
openid就是用户身份id,gettoken接收id后生成token令牌,存储openid到数据库;
gettoken接收到code码后,传递给微信服务器,微信服务器返回两个参数:openid、session_key;
openid就是用户身份id,gettoken接收id后生成token令牌,存储openid到数据库;
0 条评论
下一页