# tp5-tpblog **Repository Path**: itlyf/tp5-tpblog ## Basic Information - **Project Name**: tp5-tpblog - **Description**: No description available - **Primary Language**: PHP - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-04-04 - **Last Updated**: 2024-05-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # php->thinkphp5 ## 安装: > composer create-project topthink/think 项目名称 ## 安装空控制器 > php think make:controller admin/Index --plain ## 创建模型 > php think make:model common/Admin ## 创建tpblog项目 > composer create-project topthink/think tpblog ### 项目配置 打开项目并配置 在config目录下app.php中配置 > ```php > // 应用调试模式 > 'app_debug' => true, > // 是否强制使用路由 > 'url_route_must' => true, > // 路由是否完全匹配 > 'route_complete_match' => true, > ``` 在config目录下database.php中配置连接的数据库 > ```php > // 数据库类型 > 'type' => 'mysql', > // 服务器地址 > 'hostname' => '127.0.0.1', > // 数据库名 > 'database' => 'tp_blog', > // 用户名 > 'username' => 'root', > // 密码 > 'password' => '123456', > // 端口 > 'hostport' => '', > // 连接dsn > 'dsn' => '', > // 数据库连接参数 > 'params' => [], > // 数据库编码默认采用utf8 > 'charset' => 'utf8', > // 数据库表前缀 > 'prefix' => 'tp_', > ``` 在public目录下.htaccess中配置路由访问去掉链接中带有index.php > ```css > RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1] > ``` ### 登录功能 创建Index.php控制器在application下的admin中 > php think make:controller admin/Index --plain 创建view目录用于加载视图模板 配置登录路由 > ```php > //登录路由 > Route::rule('/','admin/index/login','get|post'); > ``` 在index控制器中创建访问 > ```php > //get > //后台登录 > public function login(){ > return view(); > } > ``` 引入视图模板login.html并打开访问, 将视图模板中的样式放在公共的public/static下 然后再html文件中引入模板 配置ajax请求登录 > ```javascript > $(function () { > $('#login').click(function () { > $.ajax({ > url:"{:url('admin/index/login')}", > type:"post", > data:$('form').serialize(), > dataType:'json', > success:function (data) { > console.log(data) > if(data.code==1){ > layer.msg(data.msg,{ > icon:6, > time:2000 > },function () { > location.href=data.url; > }) > }else{ > layer.open({ > title:'登录失败', > content:data.msg, > icon:5, > anim:6 > }) > } > } > }); > return false; > }) > }) > ``` 再后台登录中配置了路由方式提交有get和post,我们可以再同一个控制器中执行 > ```php > //后台登录 > public function login(){ > //判断前台视图传过来的数据是否是ajax请求 > if(request()->isAjax()){ > //用$data获取传过来的数据 > $data=[ > 'username'=>input('post.username'), > 'password'=>input('post.password'), > ]; > //创建管理员模型 做后台登录和校验 > $result=model('Admin')->login($data); > //响应给前台信息 > if ($result==1){ > $this->success('登录成功','admin/home/index'); > }else{ > $this->error($result); > } > } > //执行路由显示的get方法 > return view(); > } > ``` 创建Admin模型,并做登录和校验 > php think make:model common\Admin 在admin.php中执行登录操作和后台校验 ```php //post //登录校验 public function login($data){ //在公共的common中创建Admin方式校验前台传过来的数据 $validate=new \app\common\validate\Admin(); //根据创建的校验scene中的seneLogin校验数据 if(!$validate->scene('login')->check($data)){ return $validate->getError(); }else{ //如果成功后执行数据库查询 $result=$this->where($data)->find(); if($result) { //判断用户是否可用 if($result['status']!=1){ return '次账户已被禁用'; } //表示有这个用户,且用户名和密码正确 $sessionDate=[ 'id'=>$result['id'], 'nickname'=>$result['nickname'], 'is_super'=>$result['is_super'], ]; //保存session session('admin',$sessionDate); return 1; }else{ return "用户名和密码错误"; } } } ``` 在此过程中使用软删除方式 ```php //软删除 use SoftDelete; ``` 在common目录的validate下的Admin.php中 ```php //需要校验的字段 protected $rule=[ 'username|管理员账户'=>'require', 'password|管理员密码'=>'require', 'nickname|昵称'=>'require', 'email|邮箱'=>'require|email', ]; ``` 创建登录场景校验 ```php //登录验证场景-创建validate目录和校验php public function sceneLogin() { return $this->only(['username','password']); } ``` ### 注册功能 创建注册路由 > ```php > //注册路由 > Route::rule('register','admin/index/register','get|post'); > ``` 在controller下Admin.php中创建注册控制器,同样是get和post提交并执行对应操作 > ```php > //get > //后台注册 > public function register(){ > return view(); > } > ``` 引入register.html在view下的index目录下并配置相关样式后执行ajax操作 > ```javascript > $("#register").click(function () { > $.ajax({ > url:"{:url('admin/index/register')}", > type:"post", > data:$('form').serialize(), > dataType:'json', > success:function (data) { > if(data.code==1){ > layer.msg(data.msg,{ > icon:6, > time:2000 > },function () { > location.href=data.url; > }) > }else{ > layer.open({ > title:'注册失败', > content:data.msg, > icon:5, > anim:6 > }) > } > } > }); > return false; > }); > ``` 在控制器中执行获取数据并做注册 ```php //post //后台注册 public function register(){ if(request()->isAjax()){ $data=[ 'username'=>input('post.username'), 'password'=>input('post.password'), 'nickname'=>input('post.nickname'), 'email'=>input('post.email'), ]; //创建管理员模型 做后台注册和校验 $result=model('Admin')->register($data); if ($result==1){ $this->success('注册成功','admin/index/login'); }else{ $this->error($result); } } return view(); } ``` 在common下的model下的Admin.php中新建register的模型并执行注册操作 > ```php > //注册校验 > public function register($data){ > $validate=new \app\common\validate\Admin(); > if(!$validate->scene('register')->check($data)){ > return $validate->getError(); > }else{ > $result=$this->allowField(true)->save($data); > if ($result){ > return 1; > }else{ > return "注册失败"; > } > } > } > ``` 在validate下的Admin.php中创建register字段校验 ```php //这里是上面和登录一样的校验字段 //注册验证场景-创建validatemul和校验的php public function sceneRegister() { return $this->only(['username','password','nickname','email']) ->append('username','unique:admin'); //判断用户是否已经注册校验 } ``` ### 后台首页 创建首页路由 > ```php > //后台首页路由 > Route::rule('index','admin/home/index','get'); > ``` 新建Home控制器 > php think make:controller admin/Home --plain 在控制器中返回视图 > ```php > //后台首页 > public function index(){ > return view(); > } > ``` 新建视图并配置样式显示 新建Base控制器做登录拦截操作 > php think make:controller admin/Home --plain 在登录的Index.php控制器中新增判断用户是否登录 > ```php > //判断用户是否登录 > public function initialize() > { > if(session('?admin.id')){ > $this->redirect('admin/home/index'); > } > } > ``` 在登录拦截控制器中Base.php中 ```php //判断用户是否登录 public function initialize() { if(!session('?admin.id')){ $this->redirect('admin/home/index'); } } ``` 让控制器Home.php继承Base.php ```php class Home extends Base { } ``` ### 退出登录 创建退出登录的路由 > ```php > //退出登录路由 > Route::rule('logout','admin/home/logout','post'); > ``` 创建退出登录的控制器和退出功能 > ```php > //退出登录 > public function logout(){ > session(null); > if(session('?admin.id')){ > $this->error("退出失败"); > }else{ > $this->success('退出成功','admin/index/login'); > } > } > ``` 首页的下拉下有一个退出添加ajax请求并完成退出登录功能操作 > ```javascript > $("#logout").click(function () { > $.ajax({ > url:"{:url('admin/home/logout')}", > type:'post', > dataType:'json', > success:function (data) { > if(data.code==1){ > layer.msg(data.msg,{ > icon:6, > time:2000, > },function () { > location.href=data.url > }) > }else{ > layer.open({ > title:'退出失败', > content:data.msg, > icon:5, > anim:6 > }) > } > } > }) > }); > ``` ### 首页欢迎页 创建欢迎页路由 > ```php > //首页欢迎页面路由 > Route::rule('welcome','admin/home/welcome','get'); > ``` 在home控制器中创建返回欢迎页面 > ```php > //后台欢迎页 > public function welcome(){ > return view(); > } > ``` 在view下新建home中创建welcome.html页面 ### 用户的增删改查操作 新建user控制器 > php think make:controller admin/User --plain 新建view下user视图并加载add.html,edit.html,list.html 新建用户操作路由 ```php //用户赠删改查路由 //列表显示路由 Route::rule('list','admin/user/list','get'); //用户添加路由 Route::rule('add','admin/user/add','get|post'); //用户编辑路由 Route::rule('edit/[:id]','admin/user/edit','get|post'); //用户删除路由 Route::rule('list','admin/user/del','post'); ``` 创建ajax请求 - 增加 ```javascript $("#addUser").click(function () { $.ajax({ url:"{:url('admin/user/add')}", type:"post", data:$('form').serialize(), dataType:'json', success:function (data) { if(data.code==1){ layer.msg(data.msg,{ icon:6, time:2000 },function () { location.href=data.url; }) }else{ layer.open({ title:'添加失败', content:data.msg, icon:5, anim:6 }) } } }); return false; }); ``` - 删 ```javascript $(".user-del").click(function () { var id=$(this).attr('dataid'); layer.confirm('确认删除吗?',{ title:'删除用户', icon:3 },function (index) { layer.close(index); $.ajax({ url:"{:url('admin/user/del')}", type:"post", data:{id:id}, dataType:'json', success:function (data) { if(data.code==1){ layer.msg(data.msg,{ icon:6, time:2000 },function () { location.href=data.url; }) }else{ layer.open({ title:'删除失败', content:data.msg, icon:5, anim:6 }) } } }) }); return false; }); ``` - 改 ```javascrip $("#editUser").click(function () { $.ajax({ url:"{:url('admin/user/edit')}", type:"post", data:$('form').serialize(), dataType:'json', success:function (data) { if(data.code==1){ layer.msg(data.msg,{ icon:6, time:2000 },function () { location.href=data.url; }) }else{ layer.open({ title:'修改失败', content:data.msg, icon:5, anim:6 }) } } }); return false; }); ``` 在User.php控制其中创建增删改查操作 ```php isAjax()){ $data=[ 'uname'=>input('post.uname'), 'age'=>input('post.age'), 'sex'=>input('post.sex'), 'address'=>input('post.address'), 'tel'=>input('post.tel'), ]; //创建管理员模型 做后台登录和校验 $result=model('User')->add($data); if ($result==1){ $this->success('添加成功','admin/user/list'); }else{ $this->error($result); } } return view(); } //用户列表页 public function list(){ $user=model('User')->order('id','asc')->all(); $data=[ 'users'=>$user ]; $this->assign($data); return view(); } //用户编辑页 public function edit(){ if(request()->isAjax()){ $data=[ 'id'=>input('post.id'), 'uname'=>input('post.uname'), 'age'=>input('post.age'), 'sex'=>input('post.sex'), 'address'=>input('post.address'), 'tel'=>input('post.tel'), ]; //创建管理员模型 做后台登录和校验 $result=model('User')->edit($data); if ($result==1){ $this->success('编辑成功','admin/user/list'); }else{ $this->error($result); } } $userInfo=model('User')->find(input('id')); //模板变量 $data=[ 'userInfo'=>$userInfo ]; //赋值给模板 $this->assign($data); return view(); } //用户删除 public function del(){ $userInfo=model('User')->find(input('post.id')); $result=$userInfo->delete(); if ($result){ $this->success('用户删除成功','admin/user/list'); }else{ $this->error('用户删除失败'); } } } ``` 创建用户增删改查的model > php think make:model common/User 在User.php模型中做增删改查操作和后台校验 ```php scene('add')->check($data)){ return $validate->getError(); }else{ $result=$this->allowField(true)->save($data); if($result) { return 1; }else{ return "用户添加失败"; } } } //后台编辑校验 public function edit($data){ $validate=new \app\common\validate\User(); if(!$validate->scene('edit')->check($data)){ return $validate->getError(); }else{ $userInfo=$this->find($data['id']); $userInfo->uname=$data['uname']; $userInfo->age=$data['age']; $userInfo->sex=$data['sex']; $userInfo->address=$data['address']; $userInfo->tel=$data['tel']; $result=$userInfo->save(); if($result) { return 1; }else{ return "用户修改失败"; } } } } ``` 在validate中新建User.php字段校验 ```php 'require', 'age|年龄'=>'require', 'sex|性别'=>'require', 'address|地址'=>'require', 'tel|电话'=>'require', ]; //登录验证场景-创建validate目录和校验php public function sceneAdd() { return $this->only(['uname','age','sex','address','tel']); } public function sceneEdit() { return $this->only(['uname','age','sex','address','tel']); } } ``` ### 数据库设计 创建tp_blog数据库 - tp_admin表 | id | 序号,自增 | | :---------: | :----------------------------------------------------------: | | username | 用户名 | | password | 密码 | | nickname | 昵称 | | email | 邮箱 | | status | 状态(1,启用,0,禁用) | | is_super | 是否是管理员(1,是,0,不是) | | create_time | 由tp5自动生成的时间,需要在database.php中开启// 自动写入时间戳字段 'auto_timestamp' => true, | | update_time | 修改的时间,同样是由tp5自动添加时间 | | delete_time | 删除的时间,同样是有tp5在用户执行删除操作是自动填充删除时间戳 | - tp_user表 | id | 序号,自增 | | ----------- | ------------------------------------------------------------ | | uname | 姓名 | | age | 年龄 | | sex | 性别 | | address | 地址 | | tel | 电话 | | create_time | 由tp5自动生成的时间,需要在database.php中开启// 自动写入时间戳字段 'auto_timestamp' => true, | | update_time | 修改的时间,同样是由tp5自动添加时间 | | delete_time | 删除的时间,同样是有tp5在用户执行删除操作是自动填充删除时间戳 |