10 changed files with 459 additions and 14 deletions
@ -0,0 +1,213 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace app\admin\controller\user; |
||||
|
|
||||
|
use app\admin\model\User; |
||||
|
use app\common\controller\AdminController; |
||||
|
use EasyAdmin\tool\CommonTool; |
||||
|
use jianyan\excel\Excel; |
||||
|
use think\App; |
||||
|
use think\facade\Db; |
||||
|
|
||||
|
class Admin extends AdminController |
||||
|
{ |
||||
|
|
||||
|
public function __construct(App $app) |
||||
|
{ |
||||
|
parent::__construct($app); |
||||
|
$this->model = new User(); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @NodeAnotation(title="列表") |
||||
|
*/ |
||||
|
public function index() |
||||
|
{ |
||||
|
if ($this->request->isAjax()) { |
||||
|
if (input('selectFields')) { |
||||
|
return $this->selectList(); |
||||
|
} |
||||
|
list($page, $limit, $where) = $this->buildTableParames(); |
||||
|
$count = $this->model |
||||
|
->where($where) |
||||
|
->count(); |
||||
|
$list = $this->model |
||||
|
->withoutField('password,salt,delete_time') |
||||
|
->field('uid as id') |
||||
|
->where($where) |
||||
|
->page($page, $limit) |
||||
|
->order('uid') |
||||
|
->select(); |
||||
|
$data = [ |
||||
|
'code' => 0, |
||||
|
'msg' => '', |
||||
|
'count' => $count, |
||||
|
'data' => $list |
||||
|
]; |
||||
|
return json($data); |
||||
|
} |
||||
|
return $this->fetch(); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @NodeAnotation(title="添加") |
||||
|
*/ |
||||
|
public function add() |
||||
|
{ |
||||
|
if ($this->request->isPost()) { |
||||
|
$post = $this->request->post(); |
||||
|
$rule = [ |
||||
|
'avatar|用户头像' => 'require', |
||||
|
'nick_name|用户名' => 'require|unique:user', |
||||
|
'password|密码' => 'require', |
||||
|
'qr_password|确认密码' => 'require|confirm:password', |
||||
|
'mobile|手机' => 'require|mobile', |
||||
|
'gender|性别' => 'require|in:1,2,3', |
||||
|
'status|状态' => 'require|in:0,1' |
||||
|
]; |
||||
|
$this->validate($post, $rule); |
||||
|
try { |
||||
|
$salt = makeSalt(6); |
||||
|
$post['salt'] = $salt; |
||||
|
$post['password'] = password($post['password'] . $salt); |
||||
|
$save = $this->model->save($post); |
||||
|
} catch (\Exception $e) { |
||||
|
$this->error('保存失败'); |
||||
|
} |
||||
|
$save ? $this->success('保存成功') : $this->error('保存失败'); |
||||
|
} |
||||
|
return $this->fetch(); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @NodeAnotation(title="编辑") |
||||
|
*/ |
||||
|
public function edit($id) |
||||
|
{ |
||||
|
$row = $this->model->where('uid', $id)->find(); |
||||
|
empty($row) && $this->error('数据不存在'); |
||||
|
if ($this->request->isPost()) { |
||||
|
$post = $this->request->post(); |
||||
|
$rule = [ |
||||
|
'avatar|用户头像' => 'require', |
||||
|
'mobile|手机' => 'require|mobile', |
||||
|
'gender|性别' => 'require|in:1,2,3', |
||||
|
'status|状态' => 'require|in:0,1' |
||||
|
]; |
||||
|
$this->validate($post, $rule); |
||||
|
try { |
||||
|
$save = $row->save($post); |
||||
|
} catch (\Exception $e) { |
||||
|
$this->error('保存失败'); |
||||
|
} |
||||
|
$save ? $this->success('保存成功') : $this->error('保存失败'); |
||||
|
} |
||||
|
$this->assign('row', $row); |
||||
|
return $this->fetch(); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @NodeAnotation(title="编辑") |
||||
|
*/ |
||||
|
public function password($id) |
||||
|
{ |
||||
|
$row = $this->model->where('uid', $id)->find(); |
||||
|
empty($row) && $this->error('数据不存在'); |
||||
|
if ($this->request->isAjax()) { |
||||
|
$this->checkPostRequest(); |
||||
|
$post = $this->request->post(); |
||||
|
$rule = [ |
||||
|
'password|密码' => 'require', |
||||
|
'qr_password|确认密码' => 'require|confirm:password', |
||||
|
]; |
||||
|
$this->validate($post, $rule); |
||||
|
try { |
||||
|
$salt = makeSalt(6); |
||||
|
$post['salt'] = $salt; |
||||
|
$save = $row->save([ |
||||
|
'salt' => $salt, |
||||
|
'password' => password($post['password'] . $salt) |
||||
|
]); |
||||
|
} catch (\Exception $e) { |
||||
|
$this->error('保存失败'); |
||||
|
} |
||||
|
$save ? $this->success('保存成功') : $this->error('保存失败'); |
||||
|
} |
||||
|
$this->assign('row', $row); |
||||
|
return $this->fetch(); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @NodeAnotation(title="删除") |
||||
|
*/ |
||||
|
public function delete($id) |
||||
|
{ |
||||
|
$this->checkPostRequest(); |
||||
|
$row = $this->model->whereIn('uid', $id)->select(); |
||||
|
$row->isEmpty() && $this->error('数据不存在'); |
||||
|
try { |
||||
|
$save = false; |
||||
|
foreach ($row as $value) { |
||||
|
$save = $this->model->where('uid', $value['uid'])->useSoftDelete('delete_time',time())->delete(); |
||||
|
} |
||||
|
} catch (\Exception $e) { |
||||
|
$this->error('删除失败'); |
||||
|
} |
||||
|
$save ? $this->success('删除成功') : $this->error('删除失败'); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @NodeAnotation(title="属性修改") |
||||
|
*/ |
||||
|
public function modify() |
||||
|
{ |
||||
|
$this->checkPostRequest(); |
||||
|
$post = $this->request->post(); |
||||
|
$rule = [ |
||||
|
'id|ID' => 'require', |
||||
|
'field|字段' => 'require', |
||||
|
'value|值' => 'require', |
||||
|
]; |
||||
|
$this->validate($post, $rule); |
||||
|
if (!in_array($post['field'], $this->allowModifyFields)) { |
||||
|
$this->error('该字段不允许修改:' . $post['field']); |
||||
|
} |
||||
|
$row = $this->model->where('uid',$post['id'])->find(); |
||||
|
empty($row) && $this->error('数据不存在'); |
||||
|
try { |
||||
|
$row->save([ |
||||
|
$post['field'] => $post['value'], |
||||
|
]); |
||||
|
} catch (\Exception $e) { |
||||
|
$this->error($e->getMessage()); |
||||
|
} |
||||
|
$this->success('保存成功'); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @NodeAnotation(title="导出") |
||||
|
*/ |
||||
|
public function export() |
||||
|
{ |
||||
|
list($page, $limit, $where) = $this->buildTableParames(); |
||||
|
$tableName = $this->model->getName(); |
||||
|
$tableName = CommonTool::humpToLine(lcfirst($tableName)); |
||||
|
$prefix = config('database.connections.mysql.prefix'); |
||||
|
$dbList = Db::query("show full columns from {$prefix}{$tableName}"); |
||||
|
$header = []; |
||||
|
foreach ($dbList as $vo) { |
||||
|
$comment = !empty($vo['Comment']) ? $vo['Comment'] : $vo['Field']; |
||||
|
if (!in_array($vo['Field'], $this->noExportFields)) { |
||||
|
$header[] = [$comment, $vo['Field']]; |
||||
|
} |
||||
|
} |
||||
|
$list = $this->model |
||||
|
->where($where) |
||||
|
->limit(100000) |
||||
|
->order('uid', 'desc') |
||||
|
->select() |
||||
|
->toArray(); |
||||
|
$fileName = time(); |
||||
|
return Excel::exportData($list, $header, $fileName, 'xlsx'); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,14 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace app\admin\model; |
||||
|
|
||||
|
use app\common\model\TimeModel; |
||||
|
|
||||
|
class User extends TimeModel |
||||
|
{ |
||||
|
|
||||
|
protected $deleteTime = 'delete_time'; |
||||
|
|
||||
|
protected $defaultSoftDelete = '0'; |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,71 @@ |
|||||
|
<div class="layuimini-container"> |
||||
|
<form id="app-form" class="layui-form layuimini-form"> |
||||
|
|
||||
|
<div class="layui-form-item"> |
||||
|
<label class="layui-form-label required">用户头像</label> |
||||
|
<div class="layui-input-block layuimini-upload"> |
||||
|
<input name="avatar" class="layui-input layui-col-xs6" lay-verify="required" lay-reqtext="请上传用户头像" placeholder="请上传用户头像" value=""> |
||||
|
<div class="layuimini-upload-btn"> |
||||
|
<span><a class="layui-btn" data-upload="avatar" data-upload-number="one" data-upload-exts="png|jpg|ico|jpeg" data-upload-icon="image"><i class="fa fa-upload"></i> 上传</a></span> |
||||
|
<span><a class="layui-btn layui-btn-normal" id="select_avatar" data-upload-select="avatar" data-upload-number="one" data-upload-mimetype="image/*"><i class="fa fa-list"></i> 选择</a></span> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="layui-form-item"> |
||||
|
<label class="layui-form-label required">登录账户</label> |
||||
|
<div class="layui-input-block"> |
||||
|
<input type="text" name="nick_name" class="layui-input" lay-verify="required" lay-reqtext="请输入登录账户" placeholder="请输入登录账户" value=""> |
||||
|
<tip>填写登录账户。</tip> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="layui-form-item"> |
||||
|
<label class="layui-form-label required">登录密码</label> |
||||
|
<div class="layui-input-block"> |
||||
|
<input type="password" name="password" class="layui-input" lay-verify="required" lay-reqtext="请输入登录密码" placeholder="请输入登录密码" value=""> |
||||
|
<tip>填写登录密码。</tip> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="layui-form-item"> |
||||
|
<label class="layui-form-label required">确认登录密码</label> |
||||
|
<div class="layui-input-block"> |
||||
|
<input type="password" name="qr_password" class="layui-input" lay-verify="required" lay-reqtext="请输入登录密码" placeholder="请输入确认登录密码" value=""> |
||||
|
<tip>填写确认登录密码。</tip> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="layui-form-item"> |
||||
|
<label class="layui-form-label required">用户手机</label> |
||||
|
<div class="layui-input-block"> |
||||
|
<input type="text" name="mobile" class="layui-input" lay-verify="required" lay-reqtext="请输入用户手机" placeholder="请输入用户手机" value=""> |
||||
|
<tip>填写用户手机。</tip> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="layui-form-item"> |
||||
|
<label class="layui-form-label required">性别</label> |
||||
|
<div class="layui-input-block"> |
||||
|
<input type="radio" name="gender" value="1" title="男" checked> |
||||
|
<input type="radio" name="gender" value="2" title="女"> |
||||
|
<input type="radio" name="gender" value="3" title="未知"> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="layui-form-item"> |
||||
|
<label class="layui-form-label required">状态</label> |
||||
|
<div class="layui-input-block"> |
||||
|
<input type="radio" name="status" value="1" title="启用" checked> |
||||
|
<input type="radio" name="status" value="0" title="禁用"> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="hr-line"></div> |
||||
|
<div class="layui-form-item text-center"> |
||||
|
<button type="submit" class="layui-btn layui-btn-normal layui-btn-sm" lay-submit>确认</button> |
||||
|
<button type="reset" class="layui-btn layui-btn-primary layui-btn-sm">重置</button> |
||||
|
</div> |
||||
|
|
||||
|
</form> |
||||
|
</div> |
||||
@ -0,0 +1,47 @@ |
|||||
|
<div class="layuimini-container"> |
||||
|
<form id="app-form" class="layui-form layuimini-form"> |
||||
|
|
||||
|
<div class="layui-form-item"> |
||||
|
<label class="layui-form-label required">用户头像</label> |
||||
|
<div class="layui-input-block layuimini-upload"> |
||||
|
<input name="avatar" class="layui-input layui-col-xs6" lay-verify="required" lay-reqtext="请上传用户头像" placeholder="请上传用户头像" value="{$row.avatar|default=''}"> |
||||
|
<div class="layuimini-upload-btn"> |
||||
|
<span><a class="layui-btn" data-upload="avatar" data-upload-number="one" data-upload-exts="png|jpg|ico|jpeg" data-upload-icon="image"><i class="fa fa-upload"></i> 上传</a></span> |
||||
|
<span><a class="layui-btn layui-btn-normal" id="select_avatar" data-upload-select="avatar" data-upload-number="one" data-upload-mimetype="image/*"><i class="fa fa-list"></i> 选择</a></span> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="layui-form-item"> |
||||
|
<label class="layui-form-label required">用户手机</label> |
||||
|
<div class="layui-input-block"> |
||||
|
<input type="text" name="mobile" class="layui-input" lay-verify="required" lay-reqtext="请输入用户手机" placeholder="请输入用户手机" value="{$row.mobile|default=''}"> |
||||
|
<tip>填写用户手机。</tip> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="layui-form-item"> |
||||
|
<label class="layui-form-label required">性别</label> |
||||
|
<div class="layui-input-block"> |
||||
|
<input type="radio" name="gender" value="1" title="男" {if $row.gender == 1}checked{/if}> |
||||
|
<input type="radio" name="gender" value="2" title="女" {if $row.gender == 2}checked{/if}> |
||||
|
<input type="radio" name="gender" value="3" title="未知" {if $row.gender == 3}checked{/if}> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="layui-form-item"> |
||||
|
<label class="layui-form-label required">状态</label> |
||||
|
<div class="layui-input-block"> |
||||
|
<input type="radio" name="status" value="1" title="启用" {if $row.status == 1}checked{/if}> |
||||
|
<input type="radio" name="status" value="0" title="禁用" {if $row.status == 0}checked{/if}> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="hr-line"></div> |
||||
|
<div class="layui-form-item text-center"> |
||||
|
<button type="submit" class="layui-btn layui-btn-normal layui-btn-sm" lay-submit>确认</button> |
||||
|
<button type="reset" class="layui-btn layui-btn-primary layui-btn-sm">重置</button> |
||||
|
</div> |
||||
|
|
||||
|
</form> |
||||
|
</div> |
||||
@ -0,0 +1,10 @@ |
|||||
|
<div class="layuimini-container"> |
||||
|
<div class="layuimini-main"> |
||||
|
<table id="currentTable" class="layui-table layui-hide" |
||||
|
data-auth-add="{:auth('user.admin/add')}" |
||||
|
data-auth-edit="{:auth('user.admin/edit')}" |
||||
|
data-auth-delete="{:auth('user.admin/delete')}" |
||||
|
lay-filter="currentTable"> |
||||
|
</table> |
||||
|
</div> |
||||
|
</div> |
||||
@ -0,0 +1,27 @@ |
|||||
|
<div class="layuimini-container"> |
||||
|
<form id="app-form" class="layui-form layuimini-form"> |
||||
|
|
||||
|
<div class="layui-form-item"> |
||||
|
<label class="layui-form-label required">登录密码</label> |
||||
|
<div class="layui-input-block"> |
||||
|
<input type="password" name="password" class="layui-input" lay-verify="required" lay-reqtext="请输入登录密码" placeholder="请输入登录密码" value=""> |
||||
|
<tip>填写登录密码。</tip> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="layui-form-item"> |
||||
|
<label class="layui-form-label required">确认登录密码</label> |
||||
|
<div class="layui-input-block"> |
||||
|
<input type="password" name="qr_password" class="layui-input" lay-verify="required" lay-reqtext="请输入登录密码" placeholder="请输入确认登录密码" value=""> |
||||
|
<tip>填写确认登录密码。</tip> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="hr-line"></div> |
||||
|
<div class="layui-form-item text-center"> |
||||
|
<button type="submit" class="layui-btn layui-btn-normal layui-btn-sm" lay-submit>确认</button> |
||||
|
<button type="reset" class="layui-btn layui-btn-primary layui-btn-sm">重置</button> |
||||
|
</div> |
||||
|
|
||||
|
</form> |
||||
|
</div> |
||||
@ -1,14 +1 @@ |
|||||
<?php |
<?php |
||||
/** |
|
||||
* 随机盐值 |
|
||||
* @param int $len |
|
||||
* @return string |
|
||||
*/ |
|
||||
function makeSalt(int $len){ |
|
||||
$ss = "abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; |
|
||||
$salt = ''; |
|
||||
for ($i = 0; $i < $len; $i++) { |
|
||||
$salt .= $ss[mt_rand(0, strlen($ss) - 1)]; |
|
||||
} |
|
||||
return $salt; |
|
||||
} |
|
||||
@ -0,0 +1,62 @@ |
|||||
|
define(["jquery", "easy-admin"], function ($, ea) { |
||||
|
|
||||
|
var init = { |
||||
|
table_elem: '#currentTable', |
||||
|
table_render_id: 'currentTableRenderId', |
||||
|
index_url: 'user.admin/index', |
||||
|
add_url: 'user.admin/add', |
||||
|
edit_url: 'user.admin/edit', |
||||
|
delete_url: 'user.admin/delete', |
||||
|
modify_url: 'user.admin/modify', |
||||
|
export_url: 'user.admin/export', |
||||
|
password_url: 'user.admin/password', |
||||
|
}; |
||||
|
|
||||
|
var Controller = { |
||||
|
|
||||
|
index: function () { |
||||
|
|
||||
|
ea.table.render({ |
||||
|
init: init, |
||||
|
cols: [[ |
||||
|
{type: "checkbox"}, |
||||
|
{field: 'uid', width: 80, title: '用户ID'}, |
||||
|
{field: 'nick_name', minWidth: 80, title: '用户昵称'}, |
||||
|
{field: 'avatar', minWidth: 80, title: '头像', search: false, templet: ea.table.image}, |
||||
|
{field: 'mobile', minWidth: 80, title: '手机号'}, |
||||
|
{field: 'last_login_time', minWidth: 80, title: '最后登录时间'}, |
||||
|
{field: 'status', title: '状态', width: 100, search: 'select', selectList: {0: '禁用', 1: '启用'}, templet: ea.table.switch}, |
||||
|
{field: 'create_time', minWidth: 80, title: '创建时间', search: 'range'}, |
||||
|
{ |
||||
|
width: 250, |
||||
|
title: '操作', |
||||
|
templet: ea.table.tool, |
||||
|
operat: [ |
||||
|
'edit', |
||||
|
[{ |
||||
|
text: '设置密码', |
||||
|
url: init.password_url, |
||||
|
method: 'open', |
||||
|
auth: 'password', |
||||
|
class: 'layui-btn layui-btn-normal layui-btn-xs', |
||||
|
}], |
||||
|
'delete' |
||||
|
] |
||||
|
} |
||||
|
]], |
||||
|
}); |
||||
|
|
||||
|
ea.listen(); |
||||
|
}, |
||||
|
add: function () { |
||||
|
ea.listen(); |
||||
|
}, |
||||
|
edit: function () { |
||||
|
ea.listen(); |
||||
|
}, |
||||
|
password: function () { |
||||
|
ea.listen(); |
||||
|
} |
||||
|
}; |
||||
|
return Controller; |
||||
|
}); |
||||
Loading…
Reference in new issue