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 |
|||
/** |
|||
* 随机盐值 |
|||
* @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