修正用户管理

This commit is contained in:
1099438829 2021-02-20 13:45:56 +08:00
parent 50114953fb
commit 3471a2bfa8
3 changed files with 267 additions and 75 deletions

View File

@ -5,8 +5,12 @@ namespace app\admin\controller;
use app\admin\model\User as aModel; use app\admin\model\User as aModel;
use app\Request; use app\Request;
use app\admin\services\UtilService as Util; use app\admin\services\UtilService as Util;
use FormBuilder\Factory\Elm;
use app\admin\services\FormBuilderService as Form;
use think\facade\Route as Url;
/** /**
* 用户管理
* Class User * Class User
* @package app\admin\controller\system * @package app\admin\controller\system
* @author 李玉坤 * @author 李玉坤
@ -15,11 +19,9 @@ use app\admin\services\UtilService as Util;
class User extends AuthController class User extends AuthController
{ {
/** /**
* 活动列表 * 账号列表
* @return string * @return string
* @throws \Exception * @throws \Exception
* @author 李玉坤
* @date 2021-02-16 13:15
*/ */
public function index() public function index()
{ {
@ -27,20 +29,19 @@ class User extends AuthController
} }
/** /**
* 文章列表 * 账号列表
* @param Request $request * @param Request $request
* @return mixed * @return
* @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException * @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException * @throws \think\db\exception\ModelNotFoundException
* @author 李玉坤
* @date 2021-02-15 23:26
*/ */
public function lst(Request $request) public function lst(Request $request)
{ {
$where = Util::postMore([ $where = Util::postMore([
['name',''], ['username',''],
['tel',''], ['tel',''],
['is_admin',''],
['start_time',''], ['start_time',''],
['end_time',''], ['end_time',''],
['status',''], ['status',''],
@ -49,4 +50,94 @@ class User extends AuthController
]); ]);
return app("json")->layui(aModel::systemPage($where)); return app("json")->layui(aModel::systemPage($where));
} }
/**
* 添加账号
* @param Request $request
* @return string
* @throws \FormBuilder\Exception\FormBuilderException
*/
public function add(Request $request)
{
$form = array();
$form[] = Elm::input('username','登录账号')->col(10);
$form[] = Elm::input('nickname','昵称')->col(10);
$form[] = Elm::frameImage('avatar','头像',Url::buildUrl('admin/images/index',array('fodder'=>'avatar','limit'=>1)))->icon("ios-image")->width('96%')->height('440px')->col(10);
$form[] = Elm::password('password','密码')->col(10);
$form[] = Elm::input('tel','电话')->col(10);
$form[] = Elm::email('email','邮箱')->col(10);
$form[] = Elm::radio('is_admin','管理员',0)->options([['label'=>'是','value'=>1],['label'=>'否','value'=>0]])->col(10);
$form[] = Elm::radio('status','状态',1)->options([['label'=>'启用','value'=>1],['label'=>'冻结','value'=>0]])->col(10);
$form = Form::make_post_form($form, url('save')->build());
$this->assign(compact('form'));
return $this->fetch("public/form-builder");
}
/**
* 修改账号
* @return string
* @throws \FormBuilder\Exception\FormBuilderException
*/
public function edit($id="")
{
if (!$id) return app("json")->fail("账号id不能为空");
$ainfo = aModel::get($id);
if (!$ainfo) return app("json")->fail("没有该账号");
$form = array();
$form[] = Elm::input('username','登录账号',$ainfo['username'])->col(10);
$form[] = Elm::input('nickname','昵称',$ainfo['nickname'])->col(10);
$form[] = Elm::frameImage('avatar','头像',Url::buildUrl('admin/images/index',array('fodder'=>'avatar','limit'=>1)),$ainfo['avatar'])->icon("ios-image")->width('96%')->height('440px')->col(10);
$form[] = Elm::password('password','密码',$ainfo['password'])->col(10);
$form[] = Elm::input('tel','电话',$ainfo['tel'])->col(10);
$form[] = Elm::email('email','邮箱',$ainfo['email'])->col(10);
$form[] = Elm::radio('is_admin','管理员',$ainfo['is_admin'])->options([['label'=>'是','value'=>1],['label'=>'否','value'=>0]])->col(10);
$form[] = Elm::radio('status','状态',$ainfo['status'])->options([['label'=>'启用','value'=>1],['label'=>'冻结','value'=>0]])->col(10);
$form = Form::make_post_form($form, url('save',['id'=>$id])->build());
$this->assign(compact('form'));
return $this->fetch("public/form-builder");
}
/**
* 保存修改
* @param string $id
* @return mixed
*/
public function save($id="")
{
$data = Util::postMore([
['username',''],
['nickname',''],
['avatar',''],
['password',''],
['tel',''],
['email',''],
['is_admin',''],
['status','']
]);
if ($data['username'] == "") return app("json")->fail("登录账号不能为空");
if ($data['password'] == "") return app("json")->fail("密码不能为空");
if ($data['tel'] == "") return app("json")->fail("手机号不能为空");
if ($data['email'] == "") return app("json")->fail("邮箱不能为空");
if (is_array($data['avatar'])) $data['avatar'] = $data['avatar'][0];
if ($id=="")
{
//判断下用户是否存在
$info = aModel::where('username',$data['username'])->find();
if ($info){
return app("json")->fail("用户已存在");
}
$data['password'] = md5(md5($data['password']));
$data['ip'] = $this->request->ip();
$data['create_user'] = $this->adminId;
$res = aModel::create($data);
}else
{
$ainfo = aModel::get($id);
if ($ainfo['password'] != $data['password']) $data['password'] = md5(md5($data['password']));
$data['update_user'] = $this->adminId;
$res = aModel::update($data,['id'=>$id]);
}
return $res ? app("json")->success("操作成功",'code') : app("json")->fail("操作失败");
}
} }

View File

@ -26,7 +26,7 @@ class User extends BaseModel
*/ */
public static function login(string $name,string $pwd): bool public static function login(string $name,string $pwd): bool
{ {
$info = self::where("name|tel","=", $name)->find(); $info = self::where("username|tel","=", $name)->find();
if (!$info) return self::setErrorInfo("登录账号不存在"); if (!$info) return self::setErrorInfo("登录账号不存在");
if ($info['pwd'] != md5(md5($pwd))) return self::setErrorInfo("密码不正确!"); if ($info['pwd'] != md5(md5($pwd))) return self::setErrorInfo("密码不正确!");
if ($info['status'] == 2) return self::setErrorInfo("账号已被冻结!"); if ($info['status'] == 2) return self::setErrorInfo("账号已被冻结!");
@ -78,11 +78,12 @@ class User extends BaseModel
public static function systemPage(array $where): array public static function systemPage(array $where): array
{ {
$model = new self; $model = new self;
if ($where['name'] != '') $model = $model->where("username|nickname","like","%$where[name]%"); if ($where['username'] != '') $model = $model->where("username|nickname","like","%$where[name]%");
if ($where['start_time'] != '') $model = $model->where("create_time",">",strtotime($where['start_time']." 00:00:00")); if ($where['start_time'] != '') $model = $model->where("create_time",">",strtotime($where['start_time']." 00:00:00"));
if ($where['end_time'] != '') $model = $model->where("create_time","<", strtotime($where['end_time']." 23:59:59")); if ($where['end_time'] != '') $model = $model->where("create_time","<", strtotime($where['end_time']." 23:59:59"));
if ($where['tel'] != '') $model = $model->where("tel|mail", "like","%$where[tel]%"); if ($where['tel'] != '') $model = $model->where("tel|email", "like","%$where[tel]%");
if ($where['status'] != '') $model = $model->where("status",$where['status']); if ($where['status'] != '') $model = $model->where("status",$where['status']);
if ($where['is_admin'] != '') $model = $model->where("is_admin",$where['is_admin']);
$count = self::counts($model); $count = self::counts($model);
if ($where['page'] && $where['limit']) $model = $model->page((int)$where['page'],(int)$where['limit']); if ($where['page'] && $where['limit']) $model = $model->page((int)$where['page'],(int)$where['limit']);
$data = $model->select(); $data = $model->select();

View File

@ -13,26 +13,35 @@
<div class="card-body"> <div class="card-body">
<form class="form-inline searchForm" onsubmit="return false;"> <form class="form-inline searchForm" onsubmit="return false;">
<div class="form-group"> <div class="form-group">
<label for="create_time">留言时间</label> <label for="username">账号昵称</label>
<div class="input-group"> <div class="input-group">
<input class="form-control js-datetimepicker" type="text" id="create_time" name="create_time" value="" data-side-by-side="true" data-locale="zh-cn" data-format="YYYY-MM-DD" placeholder="开始时间"> <div class="input-group">
<span class="input-group-addon">~</span> <input type="text" class="form-control" id="username" value="" name="username" placeholder="请输入账号或者昵称搜索">
<input class="form-control js-datetimepicker" type="text" name="create_time" value="" data-side-by-side="true" data-locale="zh-cn" data-format="YYYY-MM-DD" placeholder="结束时间"> </div>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="type">来源</label> <label for="tel">电话邮箱</label>
<select name="type" id="type" class="form-control"> <div class="input-group">
<option value="">所有</option> <div class="input-group">
<option value="1">CMS留言</option> <input type="text" class="form-control" id="tel" value="" name="tel" placeholder="请输入电话或者邮箱">
</select> </div>
</div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="is_read">是否已读</label> <label for="start_time">创建时间</label>
<select name="is_read" class="form-control" id="is_read"> <div class="input-group">
<option value="">全部</option> <input class="form-control js-datetimepicker" type="text" id="start_time" name="start_time" value="" autocomplete="off" data-side-by-side="true" data-locale="zh-cn" data-format="YYYY-MM-DD" placeholder="开始时间">
<option value="0">未读</option> <span class="input-group-addon">~</span>
<option value="1">已读</option> <input class="form-control js-datetimepicker" type="text" name="end_time" value="" autocomplete="off" data-side-by-side="true" data-locale="zh-cn" data-format="YYYY-MM-DD" placeholder="结束时间">
</div>
</div>
<div class="form-group">
<label for="status">状态</label>
<select name="status" id="status" class="form-control">
<option value="">所有</option>
<option value="1">启用</option>
<option value="0">禁用</option>
</select> </select>
</div> </div>
<button type="submit" class="btn btn-success" style="margin: -10px 0 0 10px;" id="search">搜索</button> <button type="submit" class="btn btn-success" style="margin: -10px 0 0 10px;" id="search">搜索</button>
@ -42,10 +51,19 @@
</div> </div>
<div class="col-lg-12"> <div class="col-lg-12">
<div class="card"> <div class="card">
<div class="card-header"><h4>用户留言</h4></div> <div class="card-header"><h4>用户管理</h4></div>
<div class="card-body"> <div class="card-body">
<div id="toolbar" class="toolbar-btn-action"> <div id="toolbar" class="toolbar-btn-action">
<button id="btn_delete" type="button" class="btn btn-danger"> <button id="btn_add" type="button" class="btn btn-primary m-r-5" onclick="iframe.createIframe('添加用户','/admin/user/add')">
<span class="mdi mdi-plus" aria-hidden="true"></span>新增
</button>
<button id="btn_edit" type="button" class="btn btn-success m-r-5" onclick="isEnable('enable')">
<span class="mdi mdi-check" aria-hidden="true"></span>启用
</button>
<button id="btn_disable" type="button" class="btn btn-warning m-r-5" onclick="isEnable('disable')">
<span class="mdi mdi-block-helper" aria-hidden="true"></span>禁用
</button>
<button id="btn_delete" type="button" class="btn btn-danger" onclick="del()">
<span class="mdi mdi-window-close" aria-hidden="true"></span>删除 <span class="mdi mdi-window-close" aria-hidden="true"></span>删除
</button> </button>
</div> </div>
@ -55,7 +73,7 @@
</div> </div>
</div> </div>
</div> </div>
{include file="public/footer" /} {include file="public/footer"/}
<script type="text/javascript"> <script type="text/javascript">
$('#tb_departments').bootstrapTable({ $('#tb_departments').bootstrapTable({
classes: 'table table-bordered table-hover table-striped', classes: 'table table-bordered table-hover table-striped',
@ -73,56 +91,56 @@
"rows": res.data, "rows": res.data,
}; };
}, },
pagination: true, // 是否显示分页 pagination: true,
sortOrder: "asc", // 排序方式
queryParams: function(params) { queryParams: function(params) {
let temp = toArrayList($(".searchForm").serializeArray()); var temp = toArrayList($(".searchForm").serializeArray());
temp['limit'] = params.limit; temp['limit'] = params.limit;
temp['page'] = (params.offset / params.limit) + 1; temp['page'] = (params.offset / params.limit) + 1;
return temp; return temp;
}, // 传递参数 },
sidePagination: "server", // 分页方式client客户端分页server服务端分页 sidePagination: "server",
pageNumber: 1, // 初始化加载第一页,默认第一页 pageNumber: 1,
pageSize: 10, // 每页的记录行数 pageSize: 20,
pageList: [20, 50, 100], // 可供选择的每页的行数 pageList: [20, 50, 100],
columns: [{ columns: [{
checkbox: true // 是否显示复选框 checkbox: true // 是否显示复选框
}, { }, {
field: 'id', field: 'id',
title: '留言ID', title: 'ID',
sortable: true // 是否排序
}, { }, {
field: 'truename', field: 'username',
title: '用户昵称' title: '账号'
}, { }, {
field: 'nickname',
title: '昵称',
}, {
field: 'avatar',
title: '头像',
formatter:function (value,row,index) {
return '<img src="'+value+'" style="width: 64px;"/>';
},
},{
field: 'tel', field: 'tel',
title: '电话' title: '电话'
}, { }, {
field: 'email', field: 'email',
title: '邮箱' title: '邮箱'
}, {
field: 'ip',
title: 'ip',
}, { }, {
field: 'is_admin', field: 'is_admin',
title: '管理员', title: '是否是管理员',
formatter: function (value, row, index) { formatter:function (value,row,index) {
return value?'是':'否'; return value === 1 ? '是' : '否';
} },
}, { },{
field: 'create_time', field: 'create_time',
title: '创建时间', title: '创建时间'
}, { }
, {
field: 'status', field: 'status',
title: '状态', title: '状态',
formatter: function (value, row, index) { formatter:function (value,row,index) {
if (value == 0) { return value === 1 ? '启用' : '冻结';
is_checked = '';
} else if (value == 1){
is_checked = 'checked="checked"';
}
var field = "status";
result = '<label class="lyear-switch switch-primary switch-solid lyear-status"><input type="checkbox" '+ is_checked +'><span onClick="updateStatus('+ row.id +', '+ value +', \''+ field +'\')"></span></label>';
return result;
}, },
}, { }, {
field: 'operate', field: 'operate',
@ -130,7 +148,7 @@
formatter: btnGroup, // 自定义方法 formatter: btnGroup, // 自定义方法
events: { events: {
'click .edit-btn': function (event, value, row, index) { 'click .edit-btn': function (event, value, row, index) {
iframe.createIframe('修改','/admin/user/edit?id='+row.id) iframe.createIframe('修改用户','/admin/user/edit?id='+row.id)
}, },
'click .del-btn': function (event, value, row, index) { 'click .del-btn': function (event, value, row, index) {
$.alert({ $.alert({
@ -155,35 +173,117 @@
} }
} }
}], }],
onEditableSave: function (field, row, oldValue, $el) {
$.ajax({
type: "get",
url: "/admin/user/lst",
data: row,
dataType: 'jsonp',
success: function (data, status) {
if (data.code == '200') {
// 这里的状态显示有自定义样式区分,做单行的更新
$('.example-table').bootstrapTable('updateRow', {index: row.id, row: row});
} else {
alert(data.msg);
}
},
error: function () {
alert('修改失败,请稍后再试');
}
});
},
onLoadSuccess: function(data){ onLoadSuccess: function(data){
$("[data-toggle='tooltip']").tooltip(); $("[data-toggle='tooltip']").tooltip();
} }
}); });
$("#search").click(function () {
$("#tb_departments").bootstrapTable('refresh',{query:{page:1},pageNumber:1});
});
// 操作按钮 // 操作按钮
function btnGroup () function btnGroup ()
{ {
let html = let html =
'<a href="#!" class="btn btn-xs btn-default m-r-5 edit-btn" title="编辑" data-toggle="tooltip"><i class="mdi mdi-pencil"></i></a>' +
'<a href="#!" class="btn btn-xs btn-default del-btn" title="删除" data-toggle="tooltip"><i class="mdi mdi-window-close"></i></a>'; '<a href="#!" class="btn btn-xs btn-default del-btn" title="删除" data-toggle="tooltip"><i class="mdi mdi-window-close"></i></a>';
return html; return html;
} }
$("#search").click(function () { // 删除
$("#tb_departments").bootstrapTable('refresh',{query:{page:1},pageNumber:1}); function del() {
}); var checkID = "";
function updateStatus(id, value, field) { var selectedItem = $('#tb_departments').bootstrapTable('getAllSelections');
var newstate = (value == 1) ? 0 : 1; // 发送参数值跟当前参数值相反 if (selectedItem=="") return lightyear.notify("没有选中项", 'danger', 3000, 'mdi mdi-emoticon-neutral', 'top', 'center');
$.ajax({ for (var i = 0 ; i< selectedItem.length; i++)
type: "post", {
url: "/admin/user/field?id="+id, checkID += selectedItem[i]['id']+",";
data: {field: field, value: newstate}, }
dataType: 'json', if (checkID=="") return lightyear.notify("没有选中项", 'danger', 3000, 'mdi mdi-emoticon-neutral', 'top', 'center');
success: function (res) { $.confirm({
if (res.status == 200) {parent.lightyear.notify('修改成功', 'success', 3000, 'mdi mdi-emoticon-happy', 'top', 'center');$(".tree-table").bootstrapTable('refresh');} title: '重要提醒!',
else parent.lightyear.notify('修改失败', 'danger', 3000, 'mdi mdi-emoticon-happy', 'top', 'center'); content: '选中项将全部被删除,请谨慎操作!' ,
}, backgroundDismiss: true,
error: function () { buttons: {
parent.lightyear.notify('修改失败', 'danger', 3000, 'mdi mdi-emoticon-happy', 'top', 'center'); ok: {
text: '确认',
btnClass: 'btn-danger',
action: function () {
$.post("/admin/user/del",data={id:checkID},function (res) {
if (res.status == 200){ lightyear.notify(res.msg, 'success', 3000, 'mdi mdi-emoticon-happy', 'top', 'center');location.reload();}
else lightyear.notify(res.msg, 'danger', 3000, 'mdi mdi-emoticon-neutral', 'top', 'center');
})
}
},
cancel: {
text: '取消',
btnClass: 'btn-primary'
}
}
});
}
// 批量启用或者禁用
function isEnable(type) {
var checkID = "";
var selectedItem = $('#tb_departments').bootstrapTable('getAllSelections');
if (selectedItem=="") return lightyear.notify("没有选中项", 'danger', 3000, 'mdi mdi-emoticon-neutral', 'top', 'center');
for (var i = 0 ; i< selectedItem.length; i++)
{
checkID += selectedItem[i]['id']+",";
}
if (checkID=="") return lightyear.notify("没有选中项", 'danger', 3000, 'mdi mdi-emoticon-neutral', 'top', 'center');
$.confirm({
title: '重要提醒!',
content: type == 'enable' ? '选中项将全部启用,请谨慎操作!' : '选中项将全部禁用,请谨慎操作!',
backgroundDismiss: true,
buttons: {
ok: {
text: '确认',
btnClass: 'btn-danger',
action: function () {
if (type == 'enable')
{
$.post("/admin/user/enabled",data={id:checkID},function (res) {
if (res.status == 200) {lightyear.notify(res.msg, 'success', 3000, 'mdi mdi-emoticon-happy', 'top', 'center');location.reload();}
else lightyear.notify(res.msg, 'danger', 3000, 'mdi mdi-emoticon-neutral', 'top', 'center');
})
}else
{
$.post("/admin/user/disabled",data={id:checkID},function (res) {
if (res.status == 200) {lightyear.notify(res.msg, 'success', 3000, 'mdi mdi-emoticon-happy', 'top', 'center');location.reload();}
else lightyear.notify(res.msg, 'danger', 3000, 'mdi mdi-emoticon-neutral', 'top', 'center');
})
}
}
},
cancel: {
text: '取消',
btnClass: 'btn-primary'
}
} }
}); });
} }