一、登录部分
(1)在输入域名时,首页判断用户是否进行过登录
在Base控制器中初始化两个方法,根据是否获取到用户的id进行判断,并首先进行执行:
class Base extends Controller
{
protected function _initialize()
{
parent::_initialize();
define('USER_ID', Session::get('user_id'));
}
protected function isLogin()
{
if (empty(USER_ID)) {
$this->error('用户未登录,无权访问', url('user/login'));
}
}
protected function alreadyLogin()
{
if (!empty(USER_ID)) {
$this->error('用户已经登录,请勿重复登录', url('index/index'));
}
}
}
(2)登录场景
使用到thinkphp提供的验证码功能,并进行校验,通过ajax的方式进行用户信息的校验和提交
调用User的控制器中调用checkLogin的方法,获取并校验:
//验证登录
public function checkLogin(Request $request)
{
//初始返回参数
$status = 0;
$result = '';
$data = $request->param();
$rule = [
'name|用户名' => 'require',
'password|密码' => 'require',
'verify|验证码' => 'require|captcha',
];
$msg = [
'name' => ['require'=>'用户名不能为空,请检查'],
'password' => ['require'=>'密码不能为空,请检查'],
'verify' => [
'require' => '验证码不能为空,请检查!',
'captcha' => '验证码错误,请检查!',
],
];
$result = $this->validate($data, $rule,$msg);
if ($result === true) {
$map = [
'name' =>$data['name'],
'password' =>md5($data['password']),
];
$user = UserModel::get($map);
if ($user === null) {
$status = 0;
$result = '没有找到该用户';
} else {
$status = 1;
$result = '验证通过,点击【确定】进入';
Session::set('user_id',$user->id);
Session::set('user_info', $user->getData());
$user->setInc('login_count');
}
}
return ['status'=>$status,'message'=>$result,'data'=>$data];
}
验证码的其他配置参考:https://www.kancloud.cn/manual/thinkphp5/154295
二、主页面及主要功能
这里主要是使用到了thinkphp模板中的内置标签,包括不同角色查看不同的内容,超级管理员可以查看到所有的管理员,并可以对他们的内容进行修改,而普通的管理员只可以对自己的信息进行修改。
主页面显示的信息:
<tr>
<th width="30%">服务器计算机名</th>
<td><span id="lbServerName">{$Reque
</tr>
<tr>
<td>服务器IP地址</td>
<td>{$Request.ip}</td>
</tr>
<tr>
<td>服务器域名</td>
<td>{$Request.domain}</td>
</tr>
<tr>
<td>当前PHP版本</td>
<td>{$Think.const.PHP_VERSION}</td>
</tr>
<tr>
<td>服务器版本 </td>
<td>{$Think.const.PHP_OS}</td>
</tr>
<tr>
<td>当前请求URL</td>
<td>{$Request.url.true}</td>
</tr>
<tr>
<td>当前Session数量 </td>
<td>{:count($_SESSION)}</td>
</tr>
<tr>
<td>当前SessionID </td>
<td>{:session_id()}</td>
</tr>
三、对管理员的操作
对管理员的操作主要包括超级管理员对管理员状态的修改,可以对管理员登录系统进行控制,添加新的管理员;删除管理员;和批量恢复删除的管理员;
(1)显示管理员列表及权限控制
//显示管理员界面
public function adminList()
{
$this->assign('title', '管理员列表');
$this->assign('keywords', '教学管理系统');
$this->assign('dsc', '教学案例');
$this->view->count = UserModel::count();
$userName = Session::get('user_info.name');
if ($userName == 'admin') {
$list = UserModel::all();
} else {
$list=UserModel::all(['name'=>$userName]);
}
$this->assign('list', $list);
return $this->fetch('admin_List');
}
对权限的控制:
{eq name="$Think.session.user_info.name" value="admin"}
{if condition="$vo.status eq '已启用'"}
<a style="text-decoration:none" onClick="admin_stop(this,{$vo.id})" href="javascript:;" title="停用">
<i class="Hui-iconfont"></i>
</a>
{else /}
<a style="text-decoration:none" onClick="admin_start(this,{$vo.id})" href="javascript:;" title="启用">
<i class="Hui-iconfont"></i>
</a>
{/if}
{/eq}
(2)添加管理员
//添加管理员提交
public function addUser(Request $request)
{
$data = $request->param();
$status = 1;
$message = '添加成功';
$rule = [
'name|用户名' => "require|min:3|max:10",
'password|密码' => "require|min:3|max:10",
'email|邮箱' => 'require|email'
];
$result = $this -> validate($data, $rule);
if ($result === true) {
$user= UserModel::create($request->param());
if ($user === null) {
$status = 0;
$message = '添加失败~~';
}
}else{
$status = 0;
$message = '添加失败~~';
}
return ['status'=>$status, 'message'=>$message];
}
(3)批量恢复管理员与删除管理员
主要是在设计数据库的时候,增加一个is_delete的字段,当选择删除时,修改字段值为1,并记录修改删除的时间
同理,批量的恢复了逻辑就是把is_delete字段值为1的重新变为0,并且把删除时间字段置空。这其实也就是软删除的操作。
//删除用户
public function deleteUser(Request $request)
{
$user_id = $request->param('id');
UserModel::update(['is_delete' => 1], ['id' => $user_id]);
UserModel::destroy($user_id);
}
//恢复删除内容
public function unDelete()
{
UserModel::update(['delete_time'=>null],['is_delete'=>1]);
}
四、对班级、教师、学生的操作
有了之前对管理员的操作基础、后面的内容其实已经可以根据自己的逻辑来逐步实现。
(1)班级列表
(2)添加教师
(3)学生列表
对于列表中显示数据,会用到分页的功能,拿学生列表的显示来说明:
在页面中使用:
<div class="container">
<div class="row">
<div class="col-md-4"></div>
<div class="col-md-4">{$studentList->render()}</div></div>
<div class="col-md-4"></div>
</div>
在控制器中使用模型中自带的分页方法进行分页操作:
$studentList = StudentModel::paginate(8);
五、总结
这是我第一个使用thinkphp制作的小项目,其中存在诸多问题,比如首先要说道的安全性的问题,在后续的内容中我会采用到AES对一些重要的数据进行加密,另外,没有进行路由配置,都是直接通过模块-》控制器-》方法进行操作,这也是需要改进的地方,还有分页的操作,模型自带的分页操作感觉不够灵活,后续会更新采用layui进行分页的方法。