Initial commit

This commit is contained in:
易焱
2019-07-30 18:14:32 +08:00
commit daa60cf523
1624 changed files with 90832 additions and 0 deletions
@@ -0,0 +1,51 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
<link rel="stylesheet" th:href="@{/lib/zTree_v3/css/zTreeStyle/zTreeStyle.css}" type="text/css">
</head>
<body>
<div class="layui-form timo-compile">
<form th:action="@{/bss/dept/add}">
<input type="hidden" name="id" th:if="${dept}" th:value="${dept.id}">
<div class="layui-form-item">
<label class="layui-form-label">名称</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="name" placeholder="请输入名称" th:value="${dept?.name}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">描述</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="description" placeholder="请输入描述" th:value="${dept?.description}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">所属</label>
<div class="layui-input-inline">
<select name="bssPlatform" mo-selected="${dept?.bssPlatform?.id}" mo-empty="" lay-verify="bssPlatform">
<option th:each="bssPlatform,userStat:${bssPlatforms}" th:value="${bssPlatform.id}" th:text="${bssPlatform.name}" th:selected="${bssPlatform.id == dept?.bssPlatform?.id}"></option>
</select>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">备注</label>
<div class="layui-input-block">
<textarea placeholder="请输入内容" class="layui-textarea" name="remark">[[${dept?.remark}]]</textarea>
</div>
</div>
<div class="layui-form-item timo-finally">
<button class="layui-btn ajax-submit"><i class="fa fa-check-circle"></i> 保存</button>
<button class="layui-btn btn-secondary close-popup"><i class="fa fa-times-circle"></i> 关闭</button>
</div>
</form>
</div>
<script th:replace="/common/template :: script"></script>
<script type="text/javascript" th:src="@{/js/plugins/jquery-3.3.1.min.js}"></script>
<script type="text/javascript" th:src="@{/lib/zTree_v3/js/jquery.ztree.core.min.js}"></script>
<script type="text/javascript" th:src="@{/js/timoTree.js}"></script>
<script type="text/javascript">
// 树形菜单
$.fn.selectTree();
</script>
</body>
</html>
@@ -0,0 +1,47 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
</head>
<body>
<div class="timo-detail-page">
<div class="timo-detail-title">基本信息</div>
<table class="layui-table timo-detail-table">
<colgroup>
<col width="100px"><col>
<col width="100px"><col>
</colgroup>
<tbody>
<tr>
<th>主键ID</th>
<td th:text="${dept.id}"></td>
<th>名称</th>
<td th:text="${dept.name}"></td>
</tr>
<tr>
<th>描述</th>
<td th:text="${dept.description}"></td>
<th>所属</th>
<td th:text="${dept.bssPlatform.name}"></td>
</tr>
<tr>
<th>创建者</th>
<td th:text="${dept.createBy?.nickname}"></td>
<th>更新者</th>
<td th:text="${dept.updateBy?.nickname}"></td>
</tr>
<tr>
<th>创建时间</th>
<td th:text="${#dates.format(dept.createDate, 'yyyy-MM-dd HH:mm:ss')}"></td>
<th>更新时间</th>
<td th:text="${#dates.format(dept.updateDate, 'yyyy-MM-dd HH:mm:ss')}"></td>
</tr>
<tr>
<th>备注</th>
<td th:text="${dept.remark}" colspan="3"></td>
</tr>
</tbody>
</table>
</div>
<script th:replace="/common/template :: script"></script>
</body>
</html>
@@ -0,0 +1,80 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
</head>
<body class="timo-layout-page">
<div class="layui-card">
<div class="layui-card-header timo-card-header">
<span><i class="fa fa-bars"></i> 业务部门管理</span>
<i class="layui-icon layui-icon-refresh refresh-btn"></i>
</div>
<div class="layui-card-body">
<div class="layui-row timo-card-screen">
<div class="pull-left layui-form-pane timo-search-box">
<div class="layui-inline">
<label class="layui-form-label">状态</label>
<div class="layui-input-block timo-search-status">
<select class="timo-search-select" name="status" mo:dict="SEARCH_STATUS" mo-selected="${param.status}"></select>
</div>
</div>
<div class="layui-inline">
<button class="layui-btn timo-search-btn">
<i class="fa fa-search"></i>
</button>
</div>
</div>
<div class="pull-right screen-btn-group">
<button class="layui-btn open-popup" data-title="添加业务部门" th:attr="data-url=@{/bss/dept/add}" data-size="auto">
<i class="fa fa-plus"></i> 添加</button>
<div class="btn-group">
<button class="layui-btn">操作<span class="caret"></span></button>
<dl class="layui-nav-child layui-anim layui-anim-upbit">
<dd><a class="ajax-status" th:href="@{/bss/dept/status/ok}">启用</a></dd>
<dd><a class="ajax-status" th:href="@{/bss/dept/status/freezed}">冻结</a></dd>
<dd><a class="ajax-status" th:href="@{/bss/dept/status/delete}">删除</a></dd>
</dl>
</div>
</div>
</div>
<div class="timo-table-wrap">
<table class="layui-table timo-table">
<thead>
<tr>
<th class="timo-table-checkbox">
<label class="timo-checkbox"><input type="checkbox">
<i class="layui-icon layui-icon-ok"></i></label>
</th>
<th>主键ID</th>
<th>名称</th>
<th>所属</th>
<th class="sortable" data-field="createDate">创建时间</th>
<th class="sortable" data-field="updateDate">更新时间</th>
<th class="sortable" data-field="status">数据状态</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr th:each="item:${list}">
<td><label class="timo-checkbox"><input type="checkbox" th:value="${item.id}">
<i class="layui-icon layui-icon-ok"></i></label></td>
<td th:text="${item.id}">主键ID</td>
<td th:text="${item.name}">名称</td>
<td th:text="${item.bssPlatform.name}">所属平台</td>
<td th:text="${#dates.format(item.createDate, 'yyyy-MM-dd HH:mm:ss')}">创建时间</td>
<td th:text="${#dates.format(item.updateDate, 'yyyy-MM-dd HH:mm:ss')}">更新时间</td>
<td th:text="${#dicts.dataStatus(item.status)}">数据状态</td>
<td>
<a class="open-popup" data-title="编辑业务部门" th:attr="data-url=@{'/bss/dept/edit/'+${item.id}}" data-size="auto" href="#">编辑</a>
<a class="open-popup" data-title="详细信息" th:attr="data-url=@{'/bss/dept/detail/'+${item.id}}" data-size="800,600" href="#">详细</a>
<a class="ajax-get" data-msg="您是否确认删除" th:href="@{/bss/dept/status/delete(ids=${item.id})}">删除</a>
</td>
</tr>
</tbody>
</table>
</div>
<div th:replace="/common/fragment :: page"></div>
</div>
</div>
<script th:replace="/common/template :: script"></script>
</body>
</html>
@@ -0,0 +1,59 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
</head>
<body>
<div class="layui-form timo-compile">
<form th:action="@{/bss/platform/add}">
<input type="hidden" name="id" th:if="${platform}" th:value="${platform.id}">
<div class="layui-form-item">
<label class="layui-form-label required">名称</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="name" placeholder="请输入名称" th:value="${platform?.name}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">联系人</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="contact" placeholder="请输入联系人" th:value="${platform?.contact}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">联系人电话</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="contactTel" placeholder="请输入联系人电话" th:value="${platform?.contactTel}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">联系人身份证号码</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="contactCard" placeholder="请输入联系人身份证号码" th:value="${platform?.contactCard}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">邮箱</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="email" placeholder="请输入邮箱" th:value="${platform?.email}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">类型</label>
<div class="layui-input-inline">
<select name="type" mo:dict="BSS_PLATFORM_TYPE" mo-selected="${menu?.type}" mo-empty="" lay-verify="type"></select>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">备注</label>
<div class="layui-input-block">
<textarea placeholder="请输入内容" class="layui-textarea" name="remark">[[${platform?.remark}]]</textarea>
</div>
</div>
<div class="layui-form-item timo-finally">
<button class="layui-btn ajax-submit"><i class="fa fa-check-circle"></i> 保存</button>
<button class="layui-btn btn-secondary close-popup"><i class="fa fa-times-circle"></i> 关闭</button>
</div>
</form>
</div>
<script th:replace="/common/template :: script"></script>
</body>
</html>
@@ -0,0 +1,57 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
</head>
<body>
<div class="timo-detail-page">
<div class="timo-detail-title">基本信息</div>
<table class="layui-table timo-detail-table">
<colgroup>
<col width="100px"><col>
<col width="100px"><col>
</colgroup>
<tbody>
<tr>
<th>主键ID</th>
<td th:text="${platform.id}"></td>
<th>名称</th>
<td th:text="${platform.name}"></td>
</tr>
<tr>
<th>联系人</th>
<td th:text="${platform.contact}"></td>
<th>联系人电话</th>
<td th:text="${platform.contactTel}"></td>
</tr>
<tr>
<th>联系人身份证号码</th>
<td th:text="${platform.contactCard}"></td>
<th>邮箱</th>
<td th:text="${platform.email}"></td>
</tr>
<tr>
<th>类型</th>
<td th:text="${platform.type}" colspan="3"></td>
</tr>
<tr>
<th>创建者</th>
<td th:text="${platform.createBy?.nickname}"></td>
<th>更新者</th>
<td th:text="${platform.updateBy?.nickname}"></td>
</tr>
<tr>
<th>创建时间</th>
<td th:text="${#dates.format(platform.createDate, 'yyyy-MM-dd HH:mm:ss')}"></td>
<th>更新时间</th>
<td th:text="${#dates.format(platform.updateDate, 'yyyy-MM-dd HH:mm:ss')}"></td>
</tr>
<tr>
<th>备注</th>
<td th:text="${platform.remark}" colspan="3"></td>
</tr>
</tbody>
</table>
</div>
<script th:replace="/common/template :: script"></script>
</body>
</html>
@@ -0,0 +1,117 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
</head>
<body class="timo-layout-page">
<div class="layui-card">
<div class="layui-card-header timo-card-header">
<span><i class="fa fa-bars"></i> 平台信息管理</span>
<i class="layui-icon layui-icon-refresh refresh-btn"></i>
</div>
<div class="layui-card-body">
<div class="layui-row timo-card-screen">
<div class="pull-left layui-form-pane timo-search-box">
<div class="layui-inline">
<label class="layui-form-label">状态</label>
<div class="layui-input-block timo-search-status">
<select class="timo-search-select" name="status" mo:dict="SEARCH_STATUS" mo-selected="${param.status}"></select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">名称</label>
<div class="layui-input-block">
<input type="text" name="name" th:value="${param.name}" placeholder="请输入名称" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">联系人</label>
<div class="layui-input-block">
<input type="text" name="contact" th:value="${param.contact}" placeholder="请输入联系人" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">联系人电话</label>
<div class="layui-input-block">
<input type="text" name="contactTel" th:value="${param.contactTel}" placeholder="请输入联系人电话" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">联系人身份证号码</label>
<div class="layui-input-block">
<input type="text" name="contactCard" th:value="${param.contactCard}" placeholder="请输入联系人身份证号码" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">类型</label>
<div class="layui-input-block timo-search-status">
<select class="timo-search-select" name="type" mo:dict="BSS_PLATFORM_TYPE" mo-selected="${param.type}" mo-empty="请选择" >
</select>
</div>
</div>
<div class="layui-inline">
<button class="layui-btn timo-search-btn">
<i class="fa fa-search"></i>
</button>
</div>
</div>
<div class="pull-right screen-btn-group">
<button class="layui-btn open-popup" data-title="添加平台信息" th:attr="data-url=@{/bss/platform//add}" data-size="auto">
<i class="fa fa-plus"></i> 添加</button>
<div class="btn-group">
<button class="layui-btn">操作<span class="caret"></span></button>
<dl class="layui-nav-child layui-anim layui-anim-upbit">
<dd><a class="ajax-status" th:href="@{/bss/platform//status/ok}">启用</a></dd>
<dd><a class="ajax-status" th:href="@{/bss/platform//status/freezed}">冻结</a></dd>
<dd><a class="ajax-status" th:href="@{/bss/platform//status/delete}">删除</a></dd>
</dl>
</div>
</div>
</div>
<div class="timo-table-wrap">
<table class="layui-table timo-table">
<thead>
<tr>
<th class="timo-table-checkbox">
<label class="timo-checkbox"><input type="checkbox">
<i class="layui-icon layui-icon-ok"></i></label>
</th>
<th>名称</th>
<th>联系人</th>
<th>联系人电话</th>
<th>联系人身份证号码</th>
<th>邮箱</th>
<th >类型</th>
<th class="sortable" data-field="createDate">创建时间</th>
<th class="sortable" data-field="updateDate">更新时间</th>
<th class="sortable" data-field="status">数据状态</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr th:each="item:${list}">
<td><label class="timo-checkbox"><input type="checkbox" th:value="${item.id}">
<i class="layui-icon layui-icon-ok"></i></label></td>
<td th:text="${item.name}">名称</td>
<td th:text="${item.contact}">联系人</td>
<td th:text="${item.contactTel}">联系人电话</td>
<td th:text="${item.contactCard}">联系人身份证号码</td>
<td th:text="${item.email}">邮箱</td>
<td th:text="${#dicts.keyValue('BSS_PLATFORM_TYPE', item.type)}">类型</td>
<td th:text="${#dates.format(item.createDate, 'yyyy-MM-dd HH:mm:ss')}">创建时间</td>
<td th:text="${#dates.format(item.updateDate, 'yyyy-MM-dd HH:mm:ss')}">更新时间</td>
<td th:text="${#dicts.dataStatus(item.status)}">数据状态</td>
<td>
<a class="open-popup" data-title="编辑平台信息" th:attr="data-url=@{'/bss/platform//edit/'+${item.id}}" data-size="auto" href="#">编辑</a>
<a class="open-popup" data-title="详细信息" th:attr="data-url=@{'/bss/platform//detail/'+${item.id}}" data-size="800,600" href="#">详细</a>
<a class="ajax-get" data-msg="您是否确认删除" th:href="@{/bss/platform//status/delete(ids=${item.id})}">删除</a>
</td>
</tr>
</tbody>
</table>
</div>
<div th:replace="/common/fragment :: page"></div>
</div>
</div>
<script th:replace="/common/template :: script"></script>
</body>
</html>
@@ -0,0 +1,51 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<!-- 分页模块 -->
<th:block th:fragment="page">
<div class="layui-row" th:if="${#pageUtil.pageInit(page,#request)}">
<div class="layui-col-sm6">
<div class="page-info">
<span>显示 [[${(page.number*page.size)+1}]]/[[${(page.number*page.size)+page.numberOfElements}]] 条,共 [[${page.totalElements}]] 条记录</span>
<select class="timo-select page-number">
<option th:value="${num*10}" th:selected="${page.size} eq ${num*10}" th:each="num:${#numbers.sequence(1,3)}">[[${num*10}]] 条/页</option>
</select>
</div>
</div>
<div class="layui-col-sm6">
<ul class="pagination list-page">
<li class="page-item" th:if="${#pageUtil.isPrevious(page)}"><a class="page-link"
th:href="@{${#pageUtil.pageHref(page.number)}}">上一页</a>
</li>
<li th:class="'page-item'+ ${#pageUtil.pageActive(page, pageCode, 'active')}"
th:each="pageCode:${#pageUtil.pageCode(page)}">
<a class="page-link" th:if="${#pageUtil.isCode(pageCode)} ne true"
th:href="@{${#pageUtil.pageHref(pageCode)}}">[[${pageCode}]]</a>
<a class="page-link breviary" th:if="${#pageUtil.isCode(pageCode)}"></a>
</li>
<li class="page-item" th:if="${#pageUtil.isNext(page)}"><a class="page-link"
th:href="@{${#pageUtil.pageHref(page.number+2)}}">下一页</a>
</li>
</ul>
</div>
</div>
</th:block>
<!-- 日志展示模块 -->
<th:block th:fragment="log(entity)">
<table class="layui-table timo-detail-table">
<tbody>
<tr>
<th>操作时间</th>
<th>操作人</th>
<th>日志名称</th>
<th>日志消息</th>
</tr>
<tr th:each="item:${#logs.entityList(entity)}">
<td th:text="${#dates.format(item.createDate, 'yyyy-MM-dd HH:mm:ss')}"></td>
<td th:text="${item.operName}"></td>
<td th:text="${item.name}"></td>
<td th:text="${item.message}"></td>
</tr>
</tbody>
</table>
</th:block>
@@ -0,0 +1,36 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:fragment="header(title, link, style)">
<th:block th:if="${title == null}">
<title>财务帮</title>
</th:block>
<th:block th:if="${title != null}">
<title th:replace="${title}">title</title>
</th:block>
<meta charset="utf-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="description" content="财务帮管理系统" />
<meta name="keywords" content="财务帮, 财务帮管理系统, SpringBoot, Jpa, Thymeleaf, Shiro" />
<link rel="shortcut icon" th:href="@{/favicon.ico}" type="image/x-icon">
<link rel="stylesheet" th:href="@{/css/plugins/font-awesome-4.7.0/css/font-awesome.min.css}" media="all">
<link rel="stylesheet" th:href="@{/lib/layui-v2.3.0/css/layui.css}" media="all">
<link rel="stylesheet" th:href="@{/css/main.css}" media="all">
<th:block th:if="${link != null}">
<th:block th:replace="${link}"></th:block>
</th:block>
<th:block th:if="${style != null}">
<th:block th:replace="${style}"></th:block>
</th:block>
</head>
<body>
<th:block th:fragment="script">
<script th:src="@{/lib/layui-v2.3.0/layui.js}" charset="utf-8"></script>
<script th:src="@{/js/main.js}" charset="utf-8"></script>
</th:block>
</body>
</html>
@@ -0,0 +1,37 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
<title>财务帮登录</title>
</head>
<body class="layui-layout-login">
<div class="login-bg">
<div class="cover"></div>
</div>
<div class="login-content" th:th:classappend="${isCaptcha} ? 'captcha'">
<h1 class="login-box-title"><i class="fa fa-fw fa-user"></i>登录</h1>
<form class="layui-form" th:action="@{/login}" method="post">
<div class="layui-form-item">
<label class="layui-icon layui-icon-username" for="username"></label>
<input class="layui-input" type="text" name="username" id="username" placeholder="用户名">
</div>
<div class="layui-form-item">
<label class="layui-icon layui-icon-password" for="password"></label>
<input class="layui-input" type="password" name="password" id="password" placeholder="密码">
</div>
<div th:if="${isCaptcha}" class="layui-form-item captcha-item">
<label class="layui-icon layui-icon-vercode"></label>
<input class="layui-input" type="text" name="captcha" autocomplete="off" placeholder="验证码">
<img class="captcha-img" th:src="@{/captcha}" />
</div>
<div class="layui-form-item">
<input type="checkbox" name="rememberMe" title="记住我" lay-skin="primary">
<a class="layui-layout-right forget-password" href="javascript:alert('请联系超级管理员!')">忘记密码?</a>
</div>
<button type="submit" class="layui-btn layui-btn-fluid ajax-login"><i class="fa fa-sign-in fa-lg fa-fw"></i> 登录</button>
</form>
</div>
<script th:replace="/common/template :: script"></script>
<script th:src="@{/js/login.js}" charset="utf-8"></script>
</body>
</html>
@@ -0,0 +1,89 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
<title>财务帮</title>
</head>
<body class="layui-layout-body">
<div class="layui-layout layui-layout-admin">
<!-- 导航栏 -->
<div class="layui-header">
<a href="#" class="layui-logo">
<span class="layui-logo-mini">财务帮</span>
<span class="layui-logo-lg">财务帮</span>
</a>
<a class="side-toggle layui-layout-left" href="#">
<i class="layui-icon layui-icon-shrink-right"></i>
<i class="layui-icon layui-icon-spread-left"></i>
</a>
<ul class="layui-nav layui-layout-right">
<!--<li class="layui-nav-item timo-search">
<input class="timo-search-input" type="search" placeholder="搜索">
<button class="timo-search-button"><i class="fa fa-search"></i></button>
</li>-->
<li class="layui-nav-item">
<a href="#">
<i class="fa fa-bell-o fa-lg"></i>
</a>
</li>
<li class="layui-nav-item">
<a class="timo-screen-full" href="#">
<i class="fa layui-icon layui-icon-screen-full"></i>
</a>
</li>
<li class="layui-nav-item timo-nav-user">
<a class="timo-header-nickname" th:text="${user.nickname}">TIMO</a>
<div class="layui-nav-child">
<div class="timo-nav-child-box">
<div><a class="open-popup" data-title="个人信息" th:attr="data-url=@{/userInfo}"
data-size="680,464"><!--
--><i class="fa fa-user-o"></i>个人信息</a></div>
<div><a class="open-popup" data-title="修改密码" th:attr="data-url=@{/editPwd}"
data-size="456,296"><!--
--><i class="fa fa-lock" style="font-size:17px;width:12px;"></i>修改密码</a></div>
<div><a th:href="@{/logout}"><i class="fa fa-power-off"></i>退出登录</a></div>
</div>
</div>
</li>
</ul>
</div>
<!-- 侧边栏 -->
<div class="layui-side layui-bg-black">
<div class="layui-side-scroll">
<div class="layui-side-user">
<img class="layui-side-user-avatar open-popup" th:attr="data-url=@{/userInfo}" data-size="680,464"
th:src="@{'/system/user/picture?p='+${user.picture}}" alt="头像">
<div>
<p class="layui-side-user-name" th:text="${user.nickname}">TIMO</p>
<p class="layui-side-user-designation">在线</p>
</div>
</div>
<!-- 导航区域 -->
<ul class="layui-nav layui-nav-tree" lay-filter="layui-nav-side">
<li class="layui-nav-item" th:each="item:${treeMenu}">
<a href="javascript:;" th:attr="lay-url=${item.value.url}"><i th:class="${item.value.icon}"></i><span class="layui-nav-title" th:text="${item.value.title}">一级菜单</span></a>
<dl class="layui-nav-child" th:if="${item.value.children.size()}">
<dd th:each="sItem:${item.value.children}">
<a href="javascript:;" th:attr="lay-url=${sItem.value.url}"><span class="layui-nav-title" th:text="${sItem.value.title}">二级菜单</span></a>
<dl class="layui-nav-child" th:if="${sItem.value.children.size()}">
<dd th:each="tItem:${sItem.value.children}">
<a href="javascript:;" th:attr="lay-url=${tItem.value.url}"><span class="layui-nav-title" th:text="${tItem.value.title}">三级菜单</span></a>
</dd>
</dl>
</dd>
</dl>
</li>
</ul>
</div>
</div>
<!-- 主体区域 -->
<div class="layui-body layui-tab layui-tab-brief" lay-allowclose="true" lay-filter="iframe-tabs">
<!-- 标签栏 -->
<ul class="layui-tab-title"></ul>
<!-- 内容区域 -->
<div class="layui-tab-content"></div>
</div>
</div>
<script th:replace="/common/template :: script"></script>
</body>
</html>
@@ -0,0 +1,50 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
</head>
<body>
<div class="timo-detail-page">
<div class="timo-detail-title">基本信息</div>
<table class="layui-table timo-detail-table">
<tbody>
<tr>
<th width='100px'>日志编号</th>
<td th:text="${actionLog.id}"></td>
<th width='100px'>日志名称</th>
<td th:text="${actionLog.name}"></td>
</tr>
<tr>
<th>日志类型</th>
<td th:text="${#dicts.keyValue('LOG_TYPE', actionLog.type)}"></td>
<th>操作IP地址</th>
<td th:text="${actionLog.ipaddr}"></td>
</tr>
<tr>
<th>产生日志的表</th>
<td th:text="${actionLog.model}"></td>
<th>产生日志数据id</th>
<td th:text="${actionLog.recordId}"></td>
</tr>
<tr>
<th>操作人</th>
<td th:if="${actionLog.operBy eq null}">[[${actionLog.operName}]]</td>
<td th:if="${actionLog.operBy ne null}">
<a th:href="@{/system/user/index(id=${actionLog.operBy?.id})}">[[${actionLog.operName}]][[${actionLog.operBy?.id}]]</a>
</td>
<th>记录时间</th>
<td th:text="${#dates.format(actionLog.createDate, 'yyyy-MM-dd HH:mm:ss')}"></td>
</tr>
<tr>
<th>切入点</th>
<td colspan="4" th:text="${actionLog.clazz}+'.'+${actionLog.method}+'()'"></td>
</tr>
<tr>
<th>日志消息</th>
<td colspan="4"><pre>[[${actionLog.message}]]</pre></td>
</tr>
</tbody>
</table>
</div>
<script th:replace="/common/template :: script"></script>
</body>
</html>
@@ -0,0 +1,78 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
>
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
</head>
<body class="timo-layout-page">
<div class="layui-card">
<div class="layui-card-header timo-card-header">
<span><i class="fa fa-bars"></i> 日志管理</span>
<i class="layui-icon layui-icon-refresh refresh-btn"></i>
</div>
<div class="layui-card-body">
<div class="layui-row timo-card-screen">
<div class="pull-left layui-form-pane timo-search-box">
<div class="layui-inline">
<label class="layui-form-label">类型</label>
<div class="layui-input-block timo-search-status">
<select class="timo-search-select" name="type" mo:dict="LOG_TYPE" mo-selected="${param.type}" mo-empty="全部"></select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">日志名称 </label>
<div class="layui-input-block">
<input type="text" name="name" th:value="${param.name}" placeholder="请输入日志名称" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<button class="layui-btn timo-search-btn">
<i class="fa fa-search"></i>
</button>
</div>
</div>
<div class="pull-right screen-btn-group">
<a class="layui-btn ajax-get" data-msg="您是否确认清空日志" th:href="@{/system/actionLog/status/delete}">
<i class="fa fa-trash"></i>清空日志</a>
</div>
</div>
<div class="timo-table-wrap">
<table class="layui-table timo-table timo-table-fixed">
<thead>
<tr>
<th class="timo-table-checkbox">
<label class="timo-checkbox"><input type="checkbox">
<i class="layui-icon layui-icon-ok"></i></label>
</th>
<th class="sortable" data-field="name">日志名称</th>
<th class="sortable" data-field="operBy">操作人</th>
<th class="sortable" data-field="type">日志类型</th>
<th class="sortable" data-field="ipaddr">IP地址</th>
<th class="sortable" data-field="message">日志消息</th>
<th class="sortable" data-field="createDate">记录时间</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr th:each="item:${list}">
<td><label class="timo-checkbox"><input type="checkbox" th:value="${item.id}">
<i class="layui-icon layui-icon-ok"></i></label></td>
<td th:text="${item.name}">日志名称</td>
<td th:text="${item.operName}">操作人</td>
<td th:text="${#dicts.keyValue('LOG_TYPE', item.type)}">日志类型</td>
<td th:text="${item.ipaddr}">IP地址</td>
<td th:text="${item.message}">日志消息</td>
<td th:text="${#dates.format(item.createDate, 'yyyy-MM-dd HH:mm:ss')}">创建时间</td>
<td>
<a class="open-popup" data-title="详细信息" th:attr="data-url=@{'/system/actionLog/detail/'+${item.id}}" data-size="800,600" href="#">详细</a>
<a class="ajax-get" data-msg="您是否确认删除" th:href="@{/system/actionLog/status/delete(ids=${item.id})}">删除</a>
</td>
</tr>
</tbody>
</table>
</div>
<div th:replace="/common/fragment :: page"></div>
</div>
</div>
<script th:replace="/common/template :: script"></script>
</body>
</html>
@@ -0,0 +1,87 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
>
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
<link rel="stylesheet" th:href="@{/lib/zTree_v3/css/zTreeStyle/zTreeStyle.css}" type="text/css">
</head>
<body>
<div class="layui-form timo-compile">
<form th:action="@{/system/dept/save}">
<input type="hidden" name="id" th:if="${dept}" th:value="${dept.id}"/>
<div class="layui-form-item">
<label class="layui-form-label required">部门名称</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="title" placeholder="请输入标题" th:value="${dept?.title}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">父级部门</label>
<div class="layui-input-inline">
<input class="layui-input select-tree" th:attr="data-url=@{/system/dept/list}, data-value=${pDept?.id}" type="text" name="pid" placeholder="请输入父级部门" th:value="${pDept?.title}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序</label>
<div class="layui-input-inline">
<select class="select-sort" name="sort"
th:attr="data-url=@{/system/dept/sortList}, data-id=${dept?.id}, data-sort=${dept?.sort}" lay-verify="sort"></select>
</div>
<div class="layui-input-info">(之后)</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">备注</label>
<div class="layui-input-block">
<textarea placeholder="请输入内容" class="layui-textarea" name="remark">[[${dept?.remark}]]</textarea>
</div>
</div>
<div class="layui-form-item timo-finally">
<button class="layui-btn ajax-submit"><i class="fa fa-check-circle"></i> 保存</button>
<button class="layui-btn btn-secondary close-popup"><i class="fa fa-times-circle"></i> 关闭</button>
</div>
</form>
</div>
<script th:replace="/common/template :: script"></script>
<script type="text/javascript" th:src="@{/js/plugins/jquery-3.3.1.min.js}"></script>
<script type="text/javascript" th:src="@{/lib/zTree_v3/js/jquery.ztree.core.min.js}"></script>
<script type="text/javascript" th:src="@{/js/timoTree.js}"></script>
<script type="text/javascript">
layui.use(['form'], function () {
window.form = layui.form;
// 初始化排序下拉选项
var pid = $(".select-tree").data('value');
if (pid != undefined){
sortRender({id: pid});
}
});
// 初始化下拉树
$.fn.selectTree({
rootTree: '顶级',
// 选中后事件
onSelected: sortRender
});
// 更新渲染排序下拉选项
function sortRender(treeNode) {
var pid = treeNode.id;
var sort = $(".select-sort");
var id = sort.data('id') ? sort.data('id') : 0;
var url = sort.data('url') + "/" + pid + "/" + id;
$.get(url, function (result) {
var options = '';
var sortNum = Object.keys(result).length;
if(pid === $(".select-tree").data('value') && sort.data('sort')){
sortNum = sort.data('sort') - 1;
}
result[0] = "首位";
for(var key in result){
var selected = sortNum == key ? "selected=''" : "";
options += "<option value='"+ key +"' " + selected + ">"+ result[key] +"</option>";
}
sort.html(options);
form.render('select');
});
}
</script>
</body>
</html>
@@ -0,0 +1,52 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
</head>
<body>
<div class="timo-detail-page">
<div class="timo-detail-title">基本信息</div>
<table class="layui-table timo-detail-table">
<colgroup>
<col width="100px"><col>
<col width="100px"><col>
</colgroup>
<tbody>
<tr>
<th>主键ID</th>
<td th:text="${dept.id}"></td>
<th>部门名称</th>
<td th:text="${dept.title}"></td>
</tr>
<tr>
<th>父级编号</th>
<td th:text="${dept.pid}"></td>
<th>排序</th>
<td th:text="${dept.sort}"></td>
</tr>
<tr>
</tr>
<tr>
<th>创建时间</th>
<td th:text="${#dates.format(dept.createDate, 'yyyy-MM-dd HH:mm:ss')}"></td>
<th>更新时间</th>
<td th:text="${#dates.format(dept.updateDate, 'yyyy-MM-dd HH:mm:ss')}"></td>
</tr>
<tr>
</tr>
<tr>
<th>创建者</th>
<td th:text="${dept.createBy?.nickname}"></td>
<th>更新者</th>
<td th:text="${dept.updateBy?.nickname}"></td>
</tr>
<tr>
<th>备注</th>
<td th:text="${dept.remark}" colspan="4"></td>
</tr>
</tbody>
</table>
<div th:replace="/common/fragment :: log(${dept})"></div>
</div>
<script th:replace="/common/template :: script"></script>
</body>
</html>
@@ -0,0 +1,98 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
>
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
<link rel="stylesheet" th:href="@{/lib/zTree_v3/css/zTreeStyle/zTreeStyle.css}" type="text/css">
</head>
<body class="timo-layout-page">
<div class="layui-card timo-tree" th:attr="data-url=@{'/system/dept/list?'+${search}}">
<div class="layui-card-header timo-card-header">
<span><i class="fa fa-bars"></i> 部门管理</span>
<i class="layui-icon layui-icon-refresh refresh-btn"></i>
</div>
<div class="layui-card-body layui-row">
<div class="layui-col-lg2 layui-col-sm3">
<div class="layui-card timo-nav-tree">
<div class="layui-card-header">部门结构</div>
<div class="layui-card-body">
<ul class="ztree"></ul>
</div>
</div>
</div>
<div class="layui-col-lg10 layui-col-sm9">
<div class="layui-row timo-card-screen">
<div class="pull-left layui-form-pane timo-search-box">
<div class="layui-inline">
<label class="layui-form-label">状态</label>
<div class="layui-input-block timo-search-status">
<select class="timo-search-select" name="status" mo:dict="SEARCH_STATUS" mo-selected="${param.status}"></select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">名称</label>
<div class="layui-input-block">
<input type="text" name="title" th:value="${param.title}" placeholder="请输入部门名称" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<button class="layui-btn timo-search-btn">
<i class="fa fa-search"></i>
</button>
</div>
</div>
<div class="pull-right screen-btn-group">
<button class="layui-btn open-popup popup-add" data-title="添加部门" th:attr="data-url=@{/system/dept/add}" data-size="500,410">
<i class="fa fa-plus"></i> 添加</button>
<div class="btn-group">
<button class="layui-btn">操作<span class="caret"></span></button>
<dl class="layui-nav-child layui-anim layui-anim-upbit">
<dd><a class="ajax-status" th:href="@{/system/dept/status/ok}">启用</a></dd>
<dd><a class="ajax-status" th:href="@{/system/dept/status/freezed}">冻结</a></dd>
<dd><a class="ajax-status" th:href="@{/system/dept/status/delete}">删除</a></dd>
</dl>
</div>
</div>
</div>
<div class="timo-table-wrap">
<table class="layui-table timo-table timo-tree-table">
<thead>
<tr>
<th class="timo-table-checkbox">
<label class="timo-checkbox"><input type="checkbox">
<i class="layui-icon layui-icon-ok"></i></label>
</th>
<th>名称</th>
<th>序号 </th>
<th>状态</th>
<th>操作</th>
</tr>
</thead>
<tbody class="tree-hide">
<tr class="{{$hide}}" tree-pid="{{pid}}" tree-id="{{id}}">
<td><label class="timo-checkbox"><input type="checkbox" value="{{id}}">
<i class="layui-icon layui-icon-ok"></i></label></td>
<td>{{title}}</td>
<td>{{sort}}</td>
<td>正常</td>
<td>
<a class="open-popup popup-edit" data-title="编辑部门" th:attr="data-url=@{'/system/dept/edit/{{id}}'}" data-size="500,410" href="#">编辑</a>
<a class="open-popup" data-title="详细信息" th:attr="data-url=@{'/system/dept/detail/{{id}}'}" data-size="800,600" href="#">详细</a>
<a class="ajax-get popup-delete" th:attr="data-msg='您是否确定删除'" th:href="@{'/system/dept/status/delete?ids={{id}}'}">删除</a>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<script th:replace="/common/template :: script"></script>
<script type="text/javascript" th:src="@{/js/plugins/jquery-3.3.1.min.js}"></script>
<script type="text/javascript" th:src="@{/lib/zTree_v3/js/jquery.ztree.core.min.js}"></script>
<script type="text/javascript" th:src="@{/lib/zTree_v3/js/jquery.ztree.exedit.min.js}"></script>
<script type="text/javascript" th:src="@{/js/timoTree.js}"></script>
<script type="text/javascript">
$.fn.timoTree();
</script>
</body>
</html>
@@ -0,0 +1,267 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
>
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
<style>
.dict-value {
max-width: 358px;
height: 130px;
border: 1px solid #e6e6e6;
}
.dict-value:hover,
.dict-value:hover .control {
border-color: #C9C9C9;
}
.dict-value .control {
padding: 4px 8px;
border-bottom: 1px solid #e6e6e6;
}
.dict-value .control button {
margin: 0;
border-color: #ffffff;
}
.dict-value .control button:hover {
border-color: #888888;
}
.dict-value .control button .fa {
margin-right: 4px;
color: #888888;
}
.dict-value .control .field-order .fa {
margin: 0;
}
.dict-value .control .field-order.active {
border-color: #C9C9C9;
}
.dict-value .content {
height: 95px;
padding: 2px 0;
overflow: auto;
}
.dict-value .content .dict-option {
margin: 0;
padding: 2px 0;
display: block;
width: 100%;
border: none;
text-indent: 4px;
font-size: 14px;
}
.dict-value .content .dict-option:hover {
background-color: rgba(1, 170, 237, 0.17);
}
.dict-value .content .dict-option.active {
background-color: rgba(1, 170, 237, 0.37);
font-weight: bold;
}
.dict-value .content .dict-option.error {
background-color: rgba(255, 16, 0, 0.41);
font-weight: bold;
}
</style>
</head>
<body>
<div class="layui-form timo-compile">
<form th:action="@{/system/dict/add}">
<input type="hidden" name="id" th:if="${dict}" th:value="${dict.id}"/>
<div class="layui-form-item">
<label class="layui-form-label required">字典标识</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="name" placeholder="请输入字典键名" th:value="${dict?.name}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">字典标题</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="title" placeholder="请输入字典标题" th:value="${dict?.title}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">字典类型</label>
<div class="layui-input-inline">
<select name="type" mo:dict="DICT_TYPE" mo-selected="${dict} ? ${dict.type} : 2"
lay-verify="type"></select>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label required">字典值</label>
<div class="layui-input-block">
<input id="dictValue" name="value" type="hidden" th:value="${dict?.value}">
<div class="dict-value">
<div class="control">
<button class="field-add layui-btn layui-btn-primary layui-btn-xs">
<i class="fa fa-plus-circle"></i>添加
</button>
<button class="field-del layui-btn layui-btn-primary layui-btn-xs">
<i class="fa fa-minus-circle"></i>删除
</button>
<button class="field-up layui-btn layui-btn-primary layui-btn-xs">
<i class="fa fa-arrow-up"></i>向上
</button>
<button class="field-down layui-btn layui-btn-primary layui-btn-xs">
<i class="fa fa-arrow-down"></i>向下
</button>
<button class="field-order pull-right layui-btn layui-btn-primary layui-btn-xs"><!--
--><i class="fa fa-list-ol" aria-hidden="true"></i></button>
</div>
<div class="content"></div>
</div>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">备注</label>
<div class="layui-input-block">
<textarea placeholder="请输入内容" class="layui-textarea" name="remark">[[${dict?.remark}]]</textarea>
</div>
</div>
<div class="layui-form-item timo-finally">
<button class="layui-btn ajax-submit"><i class="fa fa-check-circle"></i> 保存</button>
<button class="layui-btn btn-secondary close-popup"><i class="fa fa-times-circle"></i> 关闭</button>
</div>
</form>
</div>
<script th:replace="/common/template :: script"></script>
<script>
layui.use(['element'], function () {
var $ = layui.jquery;
// 默认变量
var active = null;
var option = $("<input class='dict-option'>");
var optionSort = false;
// 初始化数据
var dictValue = $("#dictValue");
if(dictValue.val() !== ""){
var dict = dictValue.val().split(",");
var box = $(".dict-value>.content");
dict.forEach(function (val) {
box.append(option.clone().val(val));
});
}
// 获取焦点是选项事件
$(document).on("focus", ".dict-option", function () {
if (active != null) {
active.removeClass("active");
}
active = $(this).addClass("active");
});
// 失去焦点是选项事件
$(document).on("blur", ".dict-option", function () {
var kv = $(this).val().split(":");
if(kv.length > 1 && kv[1] !== ""){
$(this).removeClass("error");
updateDict();
}else{
$(this).addClass("error");
}
});
// 向下添加
var addOption = function () {
var clone = option.clone().val("").addClass("active");
active.after(clone).removeClass("active");
resetOrder();
clone.focus();
};
// 输入框回车事件
$(document).on("keypress", ".dict-option", function (e) {
if (e.keyCode === 13) {
e.preventDefault();
addOption();
}
});
// 添加字段
$(document).on("click", ".field-add", function (e) {
e.preventDefault();
if (active != null) {
addOption();
} else {
var clone = option.clone();
$(".dict-value>.content").append(clone);
clone.focus().addClass("active");
}
});
// 删除字段
$(document).on("click", ".field-del", function (e) {
e.preventDefault();
if (active != null) {
active.remove();
active = null;
}
updateDict();
});
// 上移字段
$(document).on("click", ".field-up", function (e) {
e.preventDefault();
if (active != null) {
var prev = active.prev();
active.insertBefore(prev);
resetOrder();
}
updateDict();
});
// 下移字段
$(document).on("click", ".field-down", function (e) {
e.preventDefault();
if (active != null) {
active.insertAfter(active.next());
resetOrder();
}
updateDict();
});
// 数字顺序开关
$(document).on("click", ".field-order", function (e) {
e.preventDefault();
if ((optionSort = !optionSort)) {
$(this).addClass("active");
resetOrder();
updateDict();
} else {
$(this).removeClass("active");
}
});
// 重置数字顺序
var resetOrder = function () {
if(!optionSort) return;
var index = 1;
$(".dict-value>.content input").each(function (key, val) {
var kv = $(val).val().split(":");
if (key === 0 && kv.length > 0 && kv[0] !== "") {
index = kv[0];
}
var oVal = (index++) + ":";
if (kv.length > 1 && kv[1] !== "") {
oVal += kv[1];
}
$(val).val(oVal);
});
}
// 更新字典值
var updateDict = function () {
var value = "";
$(".dict-value>.content input").each(function (key, val) {
var kv = $(val).val().split(":");
if(kv.length > 1 && kv[1] !== ""){
value += kv[0] + ":" + kv[1] + ",";
}
});
if (value !== "") {
value = value.substr(0, value.length - 1);
}
dictValue.val(value);
}
});
</script>
</body>
</html>
@@ -0,0 +1,51 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
>
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
</head>
<body>
<div class="timo-detail-page">
<div class="timo-detail-title">基本信息</div>
<table class="layui-table timo-detail-table">
<tbody>
<tr>
<th width='100px'>字典编号</th>
<td th:text="${dict.id}"></td>
<th width='100px'>字典标识</th>
<td th:text="${dict.name}"></td>
</tr>
<tr>
<th width='100px'>字典标题</th>
<td th:text="${dict.title}"></td>
<th width='100px'>字典类型</th>
<td th:text="${#dicts.keyValue('DICT_TYPE', dict.type)}">字典类型</td>
</tr>
<tr>
<th>字典值</th>
<td colspan="4">
<div class="detail-remark">[[${dict.value}]]</div>
</td>
</tr>
<tr>
<th>创建用户</th>
<td th:text="${dict.createBy?.nickname}"></td>
<th>更新用户</th>
<td th:text="${dict.updateBy?.nickname}"></td>
</tr>
<tr>
<th>创建时间</th>
<td th:text="${#dates.format(dict.createDate, 'yyyy-MM-dd HH:mm:ss')}"></td>
<th>最后修改</th>
<td th:text="${#dates.format(dict.updateDate, 'yyyy-MM-dd HH:mm:ss')}"></td>
</tr>
<tr>
<th>备注</th>
<td th:text="${dict.remark}" colspan="4"></td>
</tr>
</tbody>
</table>
<div th:replace="/common/fragment :: log(${dict})"></div>
</div>
<script th:replace="/common/template :: script"></script>
</body>
</html>
@@ -0,0 +1,116 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
>
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
<style>
.dict-value {
max-width: 300px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
</style>
</head>
<body class="timo-layout-page">
<div class="layui-card">
<div class="layui-card-header timo-card-header">
<span><i class="fa fa-bars"></i> 字典管理</span>
<i class="layui-icon layui-icon-refresh refresh-btn"></i>
</div>
<div class="layui-card-body">
<div class="layui-row timo-card-screen">
<div class="pull-left layui-form-pane timo-search-box">
<div class="layui-inline">
<label class="layui-form-label">状态</label>
<div class="layui-input-block timo-search-status">
<select class="timo-search-select" name="status" mo:dict="SEARCH_STATUS" mo-selected="${param.status}"></select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">字典标识</label>
<div class="layui-input-block">
<input type="text" name="name" th:value="${param.name}" placeholder="请输入字典标识" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">字典标题</label>
<div class="layui-input-block">
<input type="text" name="title" th:value="${param.title}" placeholder="请输入字典标题" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<button class="layui-btn timo-search-btn">
<i class="fa fa-search"></i>
</button>
</div>
</div>
<div class="pull-right screen-btn-group">
<button class="layui-btn open-popup" data-title="添加字典" th:attr="data-url=@{/system/dict/add}" data-size="615,558">
<i class="fa fa-plus"></i> 添加
</button>
<div class="btn-group">
<button class="layui-btn">操作<span class="caret"></span></button>
<dl class="layui-nav-child layui-anim layui-anim-upbit">
<dd><a class="ajax-status" th:href="@{/system/dict/status/ok}">启用</a></dd>
<dd><a class="ajax-status" th:href="@{/system/dict/status/freezed}">冻结</a></dd>
<dd><a class="ajax-status" th:href="@{/system/dict/status/delete}">删除</a></dd>
</dl>
</div>
</div>
</div>
<div class="timo-table-wrap">
<table class="layui-table timo-table">
<thead>
<tr>
<th class="timo-table-checkbox">
<label class="timo-checkbox"><input type="checkbox">
<i class="layui-icon layui-icon-ok"></i></label>
</th>
<th class="sortable" data-field="name">字典标识</th>
<th class="sortable" data-field="title">字典标题</th>
<th class="sortable" data-field="type">字典类型</th>
<th class="sortable" data-field="value">字典值</th>
<th class="sortable" data-field="createDate">创建时间</th>
<th class="sortable" data-field="updateDate">更新时间</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr th:each="item:${list}">
<td><label class="timo-checkbox"><input type="checkbox" th:value="${item.id}">
<i class="layui-icon layui-icon-ok"></i></label></td>
<td th:text="${item.name}">字典键名</td>
<td th:text="${item.title}">字典标题</td>
<td th:text="${#dicts.keyValue('DICT_TYPE', item.type)}">字典类型</td>
<td th:text="${item.value}" class="dict-value">字典键值</td>
<td th:text="${#dates.format(item.createDate, 'yyyy-MM-dd HH:mm:ss')}">创建时间</td>
<td th:text="${#dates.format(item.updateDate, 'yyyy-MM-dd HH:mm:ss')}">更新时间</td>
<td>
<a class="open-popup" data-title="编辑字典" th:attr="data-url=@{'/system/dict/edit/'+${item.id}}" data-size="615,558" href="#">编辑</a>
<a class="open-popup" data-title="详细信息" th:attr="data-url=@{'/system/dict/detail/'+${item.id}}" data-size="800,600" href="#">详细</a>
<a class="ajax-get" data-msg="您是否确认删除" th:href="@{/system/dict/status/delete(ids=${item.id})}">删除</a>
</td>
</tr>
</tbody>
</table>
</div>
<div th:replace="/common/fragment :: page"></div>
</div>
</div>
<script th:replace="/common/template :: script"></script>
<script>
layui.use(['element'], function () {
var $ = layui.jquery;
var dv = $(".dict-value");
$(window).on("resize", function () {
var width = $("body").width();
if(width > 1200){
dv.css("max-width", width * 0.32);
}else{
dv.css("max-width", width * 0.20);
}
}).resize();
});
</script>
</body>
</html>
@@ -0,0 +1,34 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
</head>
<body>
<div class="layui-form timo-compile">
<form th:action="@{/editPwd}">
<div class="layui-form-item">
<label class="layui-form-label">原来密码</label>
<div class="layui-input-inline">
<input class="layui-input" type="password" name="original" placeholder="请输入原来密码">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">新密码</label>
<div class="layui-input-inline">
<input class="layui-input" type="password" name="password" placeholder="请输入新密码">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">确认密码</label>
<div class="layui-input-inline">
<input class="layui-input" type="password" name="confirm" placeholder="再一次输入密码">
</div>
</div>
<div class="layui-form-item timo-finally">
<button class="layui-btn ajax-submit"><i class="fa fa-check-circle"></i> 保存</button>
<button class="layui-btn btn-secondary close-popup"><i class="fa fa-times-circle"></i> 关闭</button>
</div>
</form>
</div>
<script th:replace="/common/template :: script"></script>
</body>
</html>
@@ -0,0 +1,30 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
<style>
.page-error {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-ms-flex-direction: column;
flex-direction: column;
min-height: calc(100vh - 110px);
margin-bottom: 0;
}
</style>
</head>
<body>
<div class="page-error" style="color: #009688">
<div style="font-size: 120px" th:text="${statusCode}"></div>
<div style="font-size: 24px" th:text="${msg}"></div>
</div>
</body>
</html>
@@ -0,0 +1,160 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
<style>
a{
color: #005980;
}
.widget-small{
background-color: #FFFFFF;
overflow: hidden;
text-align: center;
border-radius: 2px;
box-shadow: 0 1px 2px 0 rgba(0,0,0,.05);
}
.widget-small .fa{
float: left;
width: 40%;
line-height: 80px;
color: #FFFFFF;
}
.widget-user .fa{
background-color: #029789;
}
.widget-visit .fa{
background-color: #17a2b8;
}
.widget-message .fa{
background-color: #fbad4c;
}
.widget-like .fa{
background-color: #ff646d;
}
.widget-small-info{
float: left;
text-align: left;
width: 40%;
margin-left: 20px;
margin-top: 18px;
line-height: 24px;
}
.widget-small-info h4{
font-size: 18px;
}
.widget-small-info span{
font-size: 16px;
}
.project-introduce{
min-height: 466px;
}
.project-introduce h4{
font-weight: bold;
margin-top: 12px;
margin-bottom: 8px;
}
.project-introduce li{
list-style: decimal;
margin-left: 28px;
}
</style>
</head>
<body class="timo-layout-page">
<div class="layui-row layui-col-space15">
<div class="layui-col-md3 layui-col-sm6 layui-col-xs12">
<div class="widget-small widget-user">
<i class="icon fa fa-users fa-3x"></i>
<div class="widget-small-info">
<h4>用户</h4>
<span>0</span>
</div>
</div>
</div>
<div class="layui-col-md3 layui-col-sm6 layui-col-xs12">
<div class="widget-small widget-visit">
<i class="icon fa fa-line-chart fa-3x"></i>
<div class="widget-small-info">
<h4>访问</h4>
<span>0</span>
</div>
</div>
</div>
<div class="layui-col-md3 layui-col-sm6 layui-col-xs12">
<div class="widget-small widget-message">
<i class="icon fa fa-comments-o fa-3x"></i>
<div class="widget-small-info">
<h4>信息</h4>
<span>0</span>
</div>
</div>
</div>
<div class="layui-col-md3 layui-col-sm6 layui-col-xs12">
<div class="widget-small widget-like">
<i class="icon fa fa-star fa-3x"></i>
<div class="widget-small-info">
<h4>收藏</h4>
<span>0</span>
</div>
</div>
</div>
</div>
<div class="layui-row layui-col-space15">
<div class="layui-col-md8">
<div class="layui-card">
<div class="layui-card-header">项目介绍</div>
<div class="layui-card-body project-introduce">
<blockquote class="layui-elem-quote layui-quote-nm">
Cwhelp后台管理系统,基于SpringBoot2.0 + Spring Data Jpa + Thymeleaf + Shiro 开发的后台管理系统,采用分模块的方式便于开发和维护,目前支持的功能有:权限管理、部门管理、字典管理、日志记录、文件上传、代码生成等!
</blockquote>
<div>
<h4>技术选型</h4>
<ol>
<li>后端技术:SpringBoot + Spring Data Jpa + Thymeleaf + Shiro + EhCache</li>
<li>前端技术:Layui + Jquery + zTree + Font-awesome</li>
</ol>
</div>
<div>
<h4>功能列表</h4>
<ol>
<li>用户管理:用于管理后台系统的用户,可进行增删改查等操作。</li>
<li>角色管理:分配权限的最小单元,通过角色给用户分配权限。</li>
<li>菜单管理:用于配置系统菜单,同时也作为权限资源。</li>
<li>部门管理:通过不同的部门来管理和区分用户。</li>
<li>字典管理:对一些需要转换的数据进行统一管理,如:男、女等。</li>
<li>行为日志:用于记录用户对系统的操作,同时监视系统运行时发生的错误。</li>
<li>文件上传:内置了文件上传接口,方便开发者使用文件上传功能。</li>
<li>代码生成:可以帮助开发者快速开发项目,减少不必要的重复操作,花更多精力注重业务实现。</li>
<li>表单构建:通过拖拽的方式快速构建一个表单模块。</li>
<li>数据接口:根据业务代码自动生成相关的api接口文档</li>
</ol>
</div>
</div>
</div>
</div>
<div class="layui-col-md4">
<div class="layui-card">
<div class="layui-card-header">更新日志</div>
<div class="layui-card-body">
<ul class="layui-timeline">
<li class="layui-timeline-item">
<i class="layui-icon layui-timeline-axis">&#xe63f;</i>
<div class="layui-timeline-content layui-text">
<h3 class="layui-timeline-title">v2.0.1</h3>
<p>
1.项目初始化<br>
</p>
</div>
</li>
<li class="layui-timeline-item">
<i class="layui-icon layui-timeline-axis">&#xe63f;</i>
<div class="layui-timeline-content layui-text">
<div class="layui-timeline-title">yan.y</div>
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
<script th:replace="/common/template :: script"></script>
</body>
</html>
@@ -0,0 +1,26 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
<style>
.page-error {
display: -webkit-box;
display: flex;
-webkit-box-align: center;
align-items: center;
-webkit-box-pack: center;
justify-content: center;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
flex-direction: column;
min-height: calc(100vh - 110px);
margin-bottom: 0;
}
</style>
</head>
<body>
<div class="page-error" style="color: #009688">
<i class="fa fa-exclamation-circle" style="font-size: 100px"></i>
<div style="font-size: 24px; margin-top: 14px">您的权限不足,无法访问本页面!</div>
</div>
</body>
</html>
@@ -0,0 +1,203 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
</head>
<body>
<div class="layui-form timo-compile user-info-page">
<div class="user-info">
<div class="user-avatar-box">
<img class="user-avatar" th:src="@{'/system/user/picture?p='+${user.picture}}" alt="头像">
<span class="edit-avatar" th:attr="data-url=@{/userPicture}">修改头像</span>
</div>
<ul class="detail-info">
<li>账号:<span th:text="${user.username}" th:title="${user.username}"></span></li>
<li>昵称:<span th:text="${user.nickname}" th:title="${user.nickname}"></span></li>
<li>性别:<span th:text="${#dicts.keyValue('USER_SEX', user.sex)}"
th:title="${#dicts.keyValue('USER_SEX', user.sex)}"></span></li>
<li>电话:<span th:text="${user.phone}" th:title="${user.phone}"></span></li>
<li>邮箱:<span th:text="${user.email}" th:title="${user.email}"></span></li>
</ul>
</div>
<form class="user-edit" th:action="@{/userInfo}">
<input type="hidden" name="username" th:value="${user.username}"/>
<input type="hidden" name="bssDept" th:value="${user.bssDept?.id}"/>
<div class="layui-form-item">
<label class="layui-form-label">用户昵称</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="nickname" placeholder="请输入用户昵称" th:value="${user.nickname}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">电话号码</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="phone" placeholder="请输入电话号码" th:value="${user.phone}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">邮箱</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="email" placeholder="请输入邮箱" th:value="${user.email}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">选择性别</label>
<div class="layui-input-inline">
<input type="radio" name="sex" value="1" title="男" checked><div class="layui-unselect layui-form-radio layui-form-radioed"><i class="layui-anim layui-icon"></i><div></div></div>
<input type="radio" name="sex" value="2" title="女" th:checked="${user.sex} eq 2"><div class="layui-unselect layui-form-radio"><i class="layui-anim layui-icon"></i><div></div></div>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">备注</label>
<div class="layui-input-block">
<textarea placeholder="请输入内容" class="layui-textarea" name="remark">[[${user.remark}]]</textarea>
</div>
</div>
<div class="layui-form-item timo-finally">
<button class="layui-btn ajax-submit"><i class="fa fa-check-circle"></i> 保存</button>
<a class="layui-btn btn-secondary close-popup"><i class="fa fa-times-circle"></i> 关闭</a>
</div>
</form>
<!-- 编辑头像面板 -->
<div class="canvas-panel">
<img class="canvas-bg"/>
<div class="canvas-shade"></div>
<canvas class="canvas-crop"></canvas>
</div>
<div class="canvas-group layui-btn-group">
<button class="upload-close layui-btn layui-btn-primary layui-btn-sm">取消</button>
<button class="upload-btn layui-btn layui-btn-primary layui-btn-sm">保存</button>
</div>
</div>
<script th:replace="/common/template :: script"></script>
<script type="text/javascript" th:src="@{/js/plugins/jquery-3.3.1.min.js}"></script>
<script type="text/javascript" th:src="@{/js/plugins/jquery.mousewheel.min.js}"></script>
<script>
layui.use(['jquery','upload'], function () {
var $ = layui.jquery;
var upload = layui.upload;
$(".user-edit").on("mousedown", function () {
$(this).css("opacity", 1);
});
/* 修改头像 */
var image = new Image();
var panel = $(".canvas-panel");
var bgImg = $(".canvas-bg");
var canvas = $(".canvas-crop");
// 激活或停止移动
var moveEvent = false;
var screenX = 0, screenY = 0;
var moveTop = 0, moveLeft = 0;
panel.on("mousedown",function (e) {
screenX = e.screenX;
screenY = e.screenY;
moveTop = parseFloat(bgImg.css("top"));
moveLeft = parseFloat(bgImg.css("left"));
moveEvent = true;
});
panel.on("mouseup",function (e) {
moveEvent = false;
});
panel.on("mousemove", function (e) {
if (moveEvent){
bgImg.css("left", moveLeft + e.screenX - screenX);
bgImg.css("top", moveTop + e.screenY - screenY);
renderPanel();
}
});
panel.on("mousewheel", function(event, delta) {
var dir = delta > 0 ? 'Up' : 'Down';
var width = parseFloat(bgImg.css("width"));
var height = parseFloat(bgImg.css("height"));
if (dir == 'Up') {
delta = 1;
} else {
delta = -1;
}
bgImg.css("width", width * (1 + 0.1 * delta));
bgImg.css("height", height * (1 + 0.1 * delta));
bgImg.css("left", parseFloat(bgImg.css("left")) - (width * 0.1 / 2) * delta);
bgImg.css("top", parseFloat(bgImg.css("top")) - (height * 0.1 / 2) * delta);
renderPanel();
return false;
});
// 渲染画布面板
function renderPanel() {
canvas[0].width = 256;
canvas[0].height = 256;
var imgScale = image.width / bgImg.width();
var context = canvas[0].getContext('2d');
var sx = (bgImg.width() * imgScale / 2 ) - canvas.width() / 2 * imgScale,
sy = (bgImg.height() * imgScale / 2) - canvas.height() / 2 * imgScale,
sw = canvas.width() * imgScale, sh = canvas.height() * imgScale;
var moveX = panel.width() / 2 - parseFloat(bgImg.css("left")) - bgImg.width() / 2;
var moveY = panel.height() / 2 - parseFloat(bgImg.css("top")) - bgImg.height() / 2;
context.drawImage(image, sx + moveX * imgScale, sy + moveY * imgScale, sw, sh, 0, 0, canvas[0].width, canvas[0].height);
}
var files = [];
var uploadInst = upload.render({
elem: '.edit-avatar'
,field: 'picture'
,url: $('.edit-avatar').data('url')
,exts: 'jpg|png|gif|jpeg'
,auto: false
,bindAction: ".upload-btn"
// 选择文件回调
,choose: function(obj){
obj.preview(function(index, file, result){
panel.show();
$(".canvas-group").show();
image.src = result;
image.onload = function(){
bgImg.attr("src", result);
if(bgImg.width() >= bgImg.height()){
bgImg.css("height", canvas.width());
}else {
bgImg.css("width", canvas.height());
}
bgImg.css("top", (panel.height() - bgImg.height()) / 2);
bgImg.css("left", (panel.width() - bgImg.width()) / 2);
renderPanel();
}
});
}
,before: function(obj){
files = obj.pushFile();
var index, file;
for(index in files) {
file = files[index];
}
var dataurl = canvas[0].toDataURL(file.type, 0.92);
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while(n--){
u8arr[n] = bstr.charCodeAt(n);
}
files[index] = new File([u8arr], file.name, {type:mime});
}
,done: function(res, index){
if(res.code == 200){
panel.hide();
$(".canvas-group").hide();
layer.msg("修改头像成功", {offset: '15px', time: 3000, icon: 1});
$(".user-avatar").attr("src", canvas[0].toDataURL());
delete files[index];
}else {
layer.msg(res.msg, {offset: '15px', time: 3000, icon: 2});
}
}
});
// 关闭裁切面板及清空文件
$(".upload-close").on("click", function () {
panel.hide();
$(".canvas-group").hide();
});
});
</script>
</body>
</html>
@@ -0,0 +1,138 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
>
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
<link rel="stylesheet" th:href="@{/lib/zTree_v3/css/zTreeStyle/zTreeStyle.css}" type="text/css">
</head>
<body>
<div class="layui-form timo-compile">
<form th:action="@{/system/menu/save}">
<input type="hidden" name="id" th:if="${menu}" th:value="${menu.id}"/>
<div class="layui-form-item">
<label class="layui-form-label required">标题</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="title" placeholder="请输入标题" th:value="${menu?.title}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">URL地址</label>
<div class="layui-input-inline">
<input class="layui-input url-input" type="text" name="url" placeholder="请输入URL地址" th:value="${menu?.url}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">权限标识</label>
<div class="layui-input-inline">
<input class="layui-input perms-input" type="text" name="perms" placeholder="请输入权限标识" th:value="${menu?.perms}">
</div>
<button class="layui-btn layui-btn-primary layui-btn-xs perms-refresh" style="margin-top: 8px">
<i class="layui-icon layui-icon-refresh" style="margin-right: 0"></i>
</button>
</div>
<div class="layui-form-item">
<label class="layui-form-label">菜单图标</label>
<div class="layui-input-inline">
<input class="layui-input icon-input" type="text" name="icon" placeholder="请输入菜单图标" th:value="${menu?.icon}">
</div>
<i th:class="'icon-show '+${menu?.icon}" style="line-height: 38px;"></i>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">父级菜单</label>
<div class="layui-input-inline">
<input class="layui-input select-tree" th:attr="data-url=@{/system/menu/list}, data-value=${pMenu?.id}" type="text" name="pid" placeholder="请输入父级菜单" th:value="${pMenu?.title}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">菜单类型</label>
<div class="layui-input-inline">
<select name="type" mo:dict="MENU_TYPE" mo-selected="${menu?.type}" mo-empty="" lay-verify="type"></select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序</label>
<div class="layui-input-inline">
<select class="select-sort" name="sort"
th:attr="data-url=@{/system/menu/sortList}, data-id=${menu?.id}, data-sort=${menu?.sort}" lay-verify="sort"></select>
</div>
<div class="layui-input-info">(之后)</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">备注</label>
<div class="layui-input-block">
<textarea placeholder="请输入内容" class="layui-textarea" name="remark">[[${menu?.remark}]]</textarea>
</div>
</div>
<div class="layui-form-item timo-finally">
<button class="layui-btn ajax-submit"><i class="fa fa-check-circle"></i> 保存</button>
<button class="layui-btn btn-secondary close-popup"><i class="fa fa-times-circle"></i> 关闭</button>
</div>
</form>
</div>
<script th:replace="/common/template :: script"></script>
<script type="text/javascript" th:src="@{/js/plugins/jquery-3.3.1.min.js}"></script>
<script type="text/javascript" th:src="@{/lib/zTree_v3/js/jquery.ztree.core.min.js}"></script>
<script type="text/javascript" th:src="@{/js/timoTree.js}"></script>
<script type="text/javascript">
layui.use(['form'], function () {
window.form = layui.form;
// 初始化排序下拉选项
var pid = $(".select-tree").data('value');
if (pid !== undefined){
sortRender({id: pid});
}
});
// 初始化下拉树
$.fn.selectTree({
rootTree: '顶级菜单',
// 选中后事件
onSelected: sortRender
});
// 更新渲染排序下拉选项
function sortRender(treeNode) {
var pid = treeNode.id;
var sort = $(".select-sort");
var id = sort.data('id') ? sort.data('id') : 0;
var url = sort.data('url') + "/" + pid + "/" + id;
$.get(url, function (result) {
var options = '';
var sortNum = Object.keys(result).length;
if(pid === $(".select-tree").data('value') && sort.data('sort')){
sortNum = sort.data('sort') - 1;
}
result[0] = "首位";
for(var key in result){
var selected = sortNum == key ? "selected=''" : "";
options += "<option value='"+ key +"' " + selected + ">"+ result[key] +"</option>";
}
sort.html(options);
form.render('select');
});
}
// 监听变动图标
$(".icon-input").on("input propertychange", function(){
$(".icon-show").attr("class", "icon-show "+$(this).val());
});
// 同步操作权限输入框
var $perms = $(".perms-input").val();
$(".url-input").on("input propertychange", function(){
if($perms === ''){
$(".perms-refresh").click();
}
});
// 更新权限标识
$(".perms-refresh").on("click", function (e) {
e.preventDefault();
var $perms = $(".perms-input");
var url = $(".url-input").val().substr(1);
var perms = url.replace(new RegExp( '/' , "g" ), ':');
$perms.val(perms);
})
</script>
</body>
</html>
@@ -0,0 +1,57 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
>
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
</head>
<body>
<div class="timo-detail-page">
<div class="timo-detail-title">基本信息</div>
<table class="layui-table timo-detail-table">
<tbody>
<tr>
<th width='100px'>菜单编号</th>
<td th:text="${menu.id}"></td>
<th width='100px'>菜单标题</th>
<td th:text="${menu.title}"></td>
</tr>
<tr>
<th width='100px'>图标</th>
<td th:text="${menu.icon}"></td>
<th width='100px'>菜单父编号</th>
<td th:text="${menu.pid}"></td>
</tr>
<tr>
<th width='100px'>URl地址</th>
<td th:text="${menu.url}"></td>
<th width='100px'>权限标识</th>
<td th:text="${menu.perms}"></td>
</tr>
<tr>
<th width='100px'>菜单类型</th>
<td th:text="${#dicts.keyValue('MENU_TYPE', menu.type)}"></td>
<th width='100px'>本级排序</th>
<td th:text="${menu.sort}"></td>
</tr>
<tr>
<th>创建用户</th>
<td th:text="${menu.createBy?.nickname}"></td>
<th>更新用户</th>
<td th:text="${menu.updateBy?.nickname}"></td>
</tr>
<tr>
<th>创建时间</th>
<td th:text="${#dates.format(menu.createDate, 'yyyy-MM-dd HH:mm:ss')}"></td>
<th>最后修改</th>
<td th:text="${#dates.format(menu.updateDate, 'yyyy-MM-dd HH:mm:ss')}"></td>
</tr>
<tr>
<th>备注</th>
<td th:text="${menu.remark}" colspan="4"></td>
</tr>
</tbody>
</table>
<div th:replace="/common/fragment :: log(${menu})"></div>
</div>
<script th:replace="/common/template :: script"></script>
</body>
</html>
@@ -0,0 +1,108 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
>
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
<link rel="stylesheet" th:href="@{/lib/zTree_v3/css/zTreeStyle/zTreeStyle.css}" type="text/css">
</head>
<body class="timo-layout-page">
<div class="layui-card timo-tree" th:attr="data-url=@{'/system/menu/list?'+${search}}">
<div class="layui-card-header timo-card-header">
<span><i class="fa fa-bars"></i> 菜单管理</span>
<i class="layui-icon layui-icon-refresh refresh-btn"></i>
</div>
<div class="layui-card-body layui-row">
<div class="layui-col-lg2 layui-col-sm3">
<div class="layui-card timo-nav-tree">
<div class="layui-card-header">菜单结构</div>
<div class="layui-card-body">
<ul class="ztree"></ul>
</div>
</div>
</div>
<div class="layui-col-lg10 layui-col-sm9">
<div class="layui-row timo-card-screen">
<div class="pull-left layui-form-pane timo-search-box">
<div class="layui-inline">
<label class="layui-form-label">状态</label>
<div class="layui-input-block timo-search-status">
<select class="timo-search-select" name="status" mo:dict="SEARCH_STATUS" mo-selected="${param.status}"></select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">名称</label>
<div class="layui-input-block">
<input type="text" name="title" th:value="${param.title}" placeholder="请输入菜单名称" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">URL地址</label>
<div class="layui-input-block">
<input type="text" name="url" th:value="${param.url}" placeholder="请输入菜单URL地址" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<button class="layui-btn timo-search-btn">
<i class="fa fa-search"></i>
</button>
</div>
</div>
<div class="pull-right screen-btn-group">
<button class="layui-btn open-popup popup-add" data-title="添加菜单" th:attr="data-url=@{/system/menu/add}">
<i class="fa fa-plus"></i> 添加</button>
<div class="btn-group">
<button class="layui-btn">操作<span class="caret"></span></button>
<dl class="layui-nav-child layui-anim layui-anim-upbit">
<dd><a class="ajax-status" th:href="@{/system/menu/status/ok}">启用</a></dd>
<dd><a class="ajax-status" th:href="@{/system/menu/status/freezed}">冻结</a></dd>
<dd><a class="ajax-status" th:href="@{/system/menu/status/delete}">删除</a></dd>
</dl>
</div>
</div>
</div>
<div class="timo-table-wrap">
<table class="layui-table timo-table timo-tree-table">
<thead>
<tr>
<th class="timo-table-checkbox">
<label class="timo-checkbox"><input type="checkbox">
<i class="layui-icon layui-icon-ok"></i></label>
</th>
<th>名称</th>
<th>URL地址</th>
<th>权限标识</th>
<th>菜单类型</th>
<th>状态</th>
<th>操作</th>
</tr>
</thead>
<tbody class="tree-hide">
<tr class="{{$hide}}" tree-pid="{{pid}}" tree-id="{{id}}">
<td><label class="timo-checkbox"><input type="checkbox" value="{{id}}">
<i class="layui-icon layui-icon-ok"></i></label></td>
<td>{{title}}</td>
<td>{{url}}</td>
<td>{{perms}}</td>
<td>{{remark}}</td>
<td>正常</td>
<td>
<a class="open-popup popup-edit" data-title="编辑菜单" th:attr="data-url=@{'/system/menu/edit/{{id}}'}" href="#">编辑</a>
<a class="open-popup" data-title="详细信息" th:attr="data-url=@{'/system/menu/detail/{{id}}'}" data-size="800,600" href="#">详细</a>
<a class="ajax-get popup-delete" th:attr="data-msg='您是否确定删除'" th:href="@{'/system/menu/status/delete?ids={{id}}'}">删除</a>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<script th:replace="/common/template :: script"></script>
<script type="text/javascript" th:src="@{/js/plugins/jquery-3.3.1.min.js}"></script>
<script type="text/javascript" th:src="@{/lib/zTree_v3/js/jquery.ztree.core.min.js}"></script>
<script type="text/javascript" th:src="@{/lib/zTree_v3/js/jquery.ztree.exedit.min.js}"></script>
<script type="text/javascript" th:src="@{/js/timoTree.js}"></script>
<script type="text/javascript">
$.fn.timoTree();
</script>
</body>
</html>
@@ -0,0 +1,35 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
</head>
<body>
<div class="layui-form timo-compile">
<form th:action="@{/system/role/save}">
<input type="hidden" name="id" th:if="${role}" th:value="${role.id}"/>
<div class="layui-form-item">
<label class="layui-form-label required">角色标识</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="name" placeholder="请输入角色编号" th:value="${role?.name}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">角色名称</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="title" placeholder="请输入角色名称" th:value="${role?.title}">
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">备注</label>
<div class="layui-input-block">
<textarea placeholder="请输入内容" class="layui-textarea" name="remark">[[${role?.remark}]]</textarea>
</div>
</div>
<div class="layui-form-item timo-finally">
<button class="layui-btn ajax-submit"><i class="fa fa-check-circle"></i> 保存</button>
<button class="layui-btn btn-secondary close-popup"><i class="fa fa-times-circle"></i> 关闭</button>
</div>
</form>
</div>
<script th:replace="/common/template :: script"></script>
</body>
</html>
@@ -0,0 +1,100 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
<link rel="stylesheet" th:href="@{/lib/zTree_v3/css/zTreeStyle/zTreeStyle.css}" type="text/css">
<style>
.ztree{
margin-left: 12px;
margin-bottom: 70px;
}
.timo-compile .timo-finally{
position: fixed;
bottom: 0;
left: 0;
right: 0;
padding-bottom: 14px;
margin-bottom: 0;
background-color: #ffffff;
}
</style>
</head>
<body>
<div class="layui-form timo-compile">
<ul id="authTree" class="ztree" th:attr="data-url=@{/system/role/authList(ids=${id})}"></ul>
<div class="layui-form-item timo-finally">
<button id="submit" class="layui-btn" th:attr="data-url=@{/system/role/auth}, data-id=${id}"><i class="fa fa-check-circle"></i> 保存</button>
<button class="layui-btn btn-secondary close-popup"><i class="fa fa-times-circle"></i> 关闭</button>
</div>
</div>
<script th:replace="/common/template :: script"></script>
<script type="text/javascript" th:src="@{/js/plugins/jquery-3.3.1.min.js}"></script>
<script type="text/javascript" th:src="@{/lib/zTree_v3/js/jquery.ztree.core.min.js}"></script>
<script type="text/javascript" th:src="@{/lib/zTree_v3/js/jquery.ztree.excheck.min.js}"></script>
<SCRIPT type="text/javascript">
$(function(){
var setting = {
check: {
enable: true,
chkboxType: { "Y" : "ps", "N" : "ps" }
},
data: {
simpleData: {
enable: true
}
}
};
$.get($("#authTree").data("url"), function(result){
var keyPid = [];
result.data.forEach(function(item){
keyPid[item.pid] = true;
});
var zNodes =[];
result.data.forEach(function (item) {
var menu = {
id: item.id,
pId: item.pid,
name: item.title
};
if(item.pid === 0){
menu.open = true;
}
if(item.url.indexOf("/index") !== -1 && keyPid[item.id]){
var index = {
id: item.id*-1,
pId: item.id,
name: "列表"
};
if(item.remark === "auth:true"){
index.checked = true;
}
zNodes.push(index);
}
if(item.remark === "auth:true"){
menu.checked = true;
}
zNodes.push(menu);
});
$.fn.zTree.init($("#authTree"), setting, zNodes);
});
$("#submit").click(function () {
var zTreeObj = $.fn.zTree.getZTreeObj("authTree");
var authList = zTreeObj.getCheckedNodes(true);
var authIds = [];
authIds.push("id="+$(this).data("id"));
authList.forEach(function(item){
if(item.id > 0){
authIds.push("authId="+item.id);
}
});
$.post($(this).data("url"), authIds.join("&"), function(result){
if (result.data == null) {
result.data = 'submit[refresh]';
}
$.fn.Messager(result);
});
});
});
</SCRIPT>
</body>
</html>
@@ -0,0 +1,38 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
</head>
<body>
<div class="timo-detail-page">
<div class="timo-detail-title">基本信息</div>
<table class="layui-table timo-detail-table">
<tbody>
<tr>
<th width='100px'>角色ID</th>
<td th:text="${role.id}"></td>
<th width='100px'>角色编号名称</th>
<td>[[${role.title}]][[${role.name}]]</td>
</tr>
<tr>
<th>创建用户</th>
<td th:text="${role.createBy?.nickname}"></td>
<th>更新用户</th>
<td th:text="${role.updateBy?.nickname}"></td>
</tr>
<tr>
<th>创建时间</th>
<td th:text="${#dates.format(role.createDate, 'yyyy-MM-dd HH:mm:ss')}"></td>
<th>最后修改</th>
<td th:text="${#dates.format(role.updateDate, 'yyyy-MM-dd HH:mm:ss')}"></td>
</tr>
<tr>
<th>备注</th>
<td th:text="${role.remark}" colspan="4"></td>
</tr>
</tbody>
</table>
<div th:replace="/common/fragment :: log(${role})"></div>
</div>
<script th:replace="/common/template :: script"></script>
</body>
</html>
@@ -0,0 +1,95 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
>
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
</head>
<body class="timo-layout-page">
<div class="layui-card">
<div class="layui-card-header timo-card-header">
<span><i class="fa fa-bars"></i> 角色管理</span>
<i class="layui-icon layui-icon-refresh refresh-btn"></i>
</div>
<div class="layui-card-body">
<div class="layui-row timo-card-screen">
<div class="pull-left layui-form-pane timo-search-box">
<div class="layui-inline">
<label class="layui-form-label">状态</label>
<div class="layui-input-block timo-search-status">
<select class="timo-search-select" name="status" mo:dict="SEARCH_STATUS" mo-selected="${param.status}"></select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">编号</label>
<div class="layui-input-block">
<input type="text" name="name" th:value="${param.name}" placeholder="请输入角色编号" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">名称</label>
<div class="layui-input-block">
<input type="text" name="title" th:value="${param.title}" placeholder="请输入角色名称" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<button class="layui-btn timo-search-btn">
<i class="fa fa-search"></i>
</button>
</div>
</div>
<div class="pull-right screen-btn-group">
<button class="layui-btn open-popup" data-title="添加角色" th:attr="data-url=@{/system/role/add}" data-size="460,357">
<i class="fa fa-plus"></i> 添加</button>
<button class="layui-btn open-popup-param" data-type="radio" data-title="授权管理" th:attr="data-url=@{/system/role/auth}" data-size="600,500">
<i class="fa fa-user-secret"></i> 授权</button>
<div class="btn-group">
<button class="layui-btn">操作<span class="caret"></span></button>
<dl class="layui-nav-child layui-anim layui-anim-upbit">
<dd><a class="ajax-status" th:href="@{/system/role/status/ok}">启用</a></dd>
<dd><a class="ajax-status" th:href="@{/system/role/status/freezed}">冻结</a></dd>
<dd><a class="ajax-status" th:href="@{/system/role/status/delete}">删除</a></dd>
</dl>
</div>
</div>
</div>
<div class="timo-table-wrap">
<table class="layui-table timo-table">
<thead>
<tr>
<th class="timo-table-checkbox">
<label class="timo-checkbox"><input type="checkbox">
<i class="layui-icon layui-icon-ok"></i></label>
</th>
<th class="sortable" data-field="name">角色编号</th>
<th class="sortable" data-field="title">角色名称</th>
<th class="sortable" data-field="createDate">创建时间</th>
<th class="sortable" data-field="updateDate">更新时间</th>
<th>查看</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr th:each="item:${list}">
<td><label class="timo-checkbox"><input type="checkbox" th:value="${item.id}">
<i class="layui-icon layui-icon-ok"></i></label></td>
<td th:text="${item.name}">角色编号</td>
<td th:text="${item.title}">角色名称</td>
<td th:text="${#dates.format(item.createDate, 'yyyy-MM-dd HH:mm:ss')}">创建时间</td>
<td th:text="${#dates.format(item.updateDate, 'yyyy-MM-dd HH:mm:ss')}">更新时间</td>
<td>
<a class="open-popup" data-title="用户列表" th:attr="data-url=@{'/system/role/userList/'+${item.id}}" data-size="800,600" href="#">用户列表</a>
</td>
<td>
<a class="open-popup" data-title="编辑角色" th:attr="data-url=@{'/system/role/edit/'+${item.id}}" data-size="460,357" href="#">编辑</a>
<a class="open-popup" data-title="详细信息" th:attr="data-url=@{'/system/role/detail/'+${item.id}}" data-size="800,600" href="#">详细</a>
<a class="ajax-get" data-msg="您是否确认删除" th:href="@{/system/role/status/delete(ids=${item.id})}">删除</a>
</td>
</tr>
</tbody>
</table>
</div>
<div th:replace="/common/fragment :: page"></div>
</div>
</div>
<script th:replace="/common/template :: script"></script>
</body>
</html>
@@ -0,0 +1,38 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
<style>
a{
color: #009688;
}
a:hover{
color: #004a43;
text-decoration: underline;
}
</style>
</head>
<body>
<div class="timo-detail-page">
<table class="layui-table">
<thead>
<tr>
<th>用户名</th>
<th>用户昵称</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr th:each="item:${list}">
<td>[[${item.username}]]</td>
<td>[[${item.nickname}]]</td>
<td><a th:href="@{/system/user/index(id=${item.id})}">查看</a></td>
</tr>
<tr th:if="${list.isEmpty()}">
<td style="text-align: center" colspan="3">未有分配该角色的用户</td>
</tr>
</tbody>
</table>
</div>
<script th:replace="/common/template :: script"></script>
</body>
</html>
@@ -0,0 +1,82 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
<link rel="stylesheet" th:href="@{/lib/zTree_v3/css/zTreeStyle/zTreeStyle.css}" type="text/css">
</head>
<body>
<div class="layui-form timo-compile">
<form th:action="@{/system/user/save}">
<input type="hidden" name="id" th:if="${user}" th:value="${user.id}"/>
<div class="layui-form-item">
<label class="layui-form-label required">用户名</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="username" placeholder="请输入用户名" th:value="${user?.username}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">用户昵称</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="nickname" placeholder="请输入用户昵称" th:value="${user?.nickname}">
</div>
</div>
<div class="layui-form-item" th:if="!${user}">
<label class="layui-form-label required">用户密码</label>
<div class="layui-input-inline">
<input class="layui-input" type="password" name="password" placeholder="请输入用户密码">
</div>
</div>
<div class="layui-form-item" th:if="!${user}">
<label class="layui-form-label required">确认密码</label>
<div class="layui-input-inline">
<input class="layui-input" type="password" name="confirm" placeholder="再一次输入密码">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">所属</label>
<div class="layui-input-inline">
<input class="layui-input select-tree" th:attr="data-url=@{/system/dept/list}, data-value=${user?.dept?.id}"
type="text" name="dept" placeholder="请选择" th:value="${user?.dept?.title}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">电话号码</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="phone" placeholder="请输入电话号码" th:value="${user?.phone}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">邮箱</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="email" placeholder="请输入邮箱" th:value="${user?.email}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">选择性别</label>
<div class="layui-input-inline">
<input type="radio" name="sex" value="1" title="男" checked><div class="layui-unselect layui-form-radio layui-form-radioed"><i class="layui-anim layui-icon"></i><div></div></div>
<input type="radio" name="sex" value="2" title="女" th:checked="${user?.sex} eq 2"><div class="layui-unselect layui-form-radio"><i class="layui-anim layui-icon"></i><div></div></div>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">备注</label>
<div class="layui-input-block">
<textarea placeholder="请输入内容" class="layui-textarea" name="remark">[[${user?.remark}]]</textarea>
</div>
</div>
<div class="layui-form-item timo-finally">
<button class="layui-btn ajax-submit"><i class="fa fa-check-circle"></i> 保存</button>
<button class="layui-btn btn-secondary close-popup"><i class="fa fa-times-circle"></i> 关闭</button>
</div>
</form>
</div>
<script th:replace="/common/template :: script"></script>
<script type="text/javascript" th:src="@{/js/plugins/jquery-3.3.1.min.js}"></script>
<script type="text/javascript" th:src="@{/lib/zTree_v3/js/jquery.ztree.core.min.js}"></script>
<script type="text/javascript" th:src="@{/js/timoTree.js}"></script>
<script type="text/javascript">
// 树形菜单
$.fn.selectTree();
</script>
</body>
</html>
@@ -0,0 +1,50 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
>
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
</head>
<body>
<div class="timo-detail-page">
<div class="timo-detail-title">基本信息</div>
<table class="layui-table timo-detail-table">
<tbody>
<tr>
<th width='100px'>用户编号</th>
<td th:text="${user.id}"></td>
<th width='100px'>用户账号</th>
<td th:text="${user.username}"></td>
</tr>
<tr>
<th>用户昵称</th>
<td th:text="${user.nickname}"></td>
<th>用户性别</th>
<td th:text="${#dicts.keyValue('USER_SEX', user.sex)}"></td>
</tr>
<tr>
<th>所属</th>
<td colspan="4" th:text="${user.dept?.title}"></td>
</tr>
<tr>
<th>电话号码</th>
<td th:text="${user.phone}"></td>
<th>邮箱</th>
<td th:text="${user.email}"></td>
</tr>
<tr>
<th>创建时间</th>
<td th:text="${#dates.format(user.createDate, 'yyyy-MM-dd HH:mm:ss')}"></td>
<th>最后修改</th>
<td th:text="${#dates.format(user.updateDate, 'yyyy-MM-dd HH:mm:ss')}"></td>
</tr>
<tr>
<th>备注</th>
<td th:text="${user.remark}" colspan="4"></td>
</tr>
</tbody>
</table>
<div th:replace="/common/fragment :: log(${user})"></div>
</div>
<script th:replace="/common/template :: script"></script>
</body>
</html>
@@ -0,0 +1,126 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
>
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
<link rel="stylesheet" th:href="@{/lib/zTree_v3/css/zTreeStyle/zTreeStyle.css}" type="text/css">
</head>
<body class="timo-layout-page">
<div class="layui-card">
<div class="layui-card-header timo-card-header">
<span><i class="fa fa-bars"></i> 用户管理</span>
<i class="layui-icon layui-icon-refresh refresh-btn"></i>
<a th:href="@{/system/user/export}"><i class="fa fa-download"></i></a>
</div>
<div class="layui-card-body">
<div class="layui-row timo-card-screen put-row">
<div class="pull-left layui-form-pane timo-search-box">
<div class="layui-inline">
<label class="layui-form-label">状态</label>
<div class="layui-input-block timo-search-status">
<select class="timo-search-select" name="status" mo:dict="SEARCH_STATUS" mo-selected="${param.status}"></select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">所属</label>
<div class="layui-input-block">
<input class="layui-input select-tree" th:attr="data-url=@{/system/dept/list}, data-value=${dept?.id}" th:value="${dept?.title}" type="text" name="dept" placeholder="请选择部门">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">用户名</label>
<div class="layui-input-block">
<input type="text" name="username" th:value="${param.username}" placeholder="请输入用户名" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">用户昵称</label>
<div class="layui-input-block">
<input type="text" name="nickname" th:value="${param.nickname}" placeholder="请输入用户昵称" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<button class="layui-btn timo-search-btn">
<i class="fa fa-search"></i>
</button>
</div>
</div>
<div class="pull-right screen-btn-group">
<div class="btn-group-left">
<button class="layui-btn open-popup-param" data-title="修改密码" th:attr="data-url=@{/system/user/pwd}" data-size="456,242">
<i class="fa fa-refresh"></i> 修改密码</button>
<button class="layui-btn open-popup-param" data-type="radio" data-title="角色分配" th:attr="data-url=@{/system/user/role}" data-size="480,400">
<i class="fa fa-user-secret"></i> 角色分配</button>
</div>
<div class="btn-group-right">
<button class="layui-btn open-popup" data-title="添加用户" th:attr="data-url=@{/system/user/add}" data-size="auto">
<i class="fa fa-plus"></i> 添加</button>
<div class="btn-group">
<button class="layui-btn">操作<span class="caret"></span></button>
<dl class="layui-nav-child layui-anim layui-anim-upbit">
<dd><a class="ajax-status" th:href="@{/system/user/status/ok}">启用</a></dd>
<dd><a class="ajax-status" th:href="@{/system/user/status/freezed}">冻结</a></dd>
<dd><a class="ajax-status" th:href="@{/system/user/status/delete}">删除</a></dd>
</dl>
</div>
</div>
</div>
</div>
<div class="timo-table-wrap">
<table class="layui-table timo-table">
<thead>
<tr>
<th class="timo-table-checkbox">
<label class="timo-checkbox"><input type="checkbox">
<i class="layui-icon layui-icon-ok"></i></label>
</th>
<th class="sortable" data-field="username">用户名</th>
<th class="sortable" data-field="nickname">用户昵称</th>
<th class="sortable" data-field="dept">所属</th>
<th class="sortable" data-field="sex">性别</th>
<th class="sortable" data-field="phone">电话</th>
<th class="sortable" data-field="email">邮箱</th>
<th class="sortable" data-field="createDate">创建时间</th>
<th>状态</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr th:each="item:${list}">
<td><label class="timo-checkbox"><input type="checkbox" th:value="${item.id}">
<i class="layui-icon layui-icon-ok"></i></label></td>
<td th:text="${item.username}">用户名</td>
<td th:text="${item.nickname}">用户昵称</td>
<td th:text="${item.dept?.title}">用户昵称</td>
<td th:text="${#dicts.keyValue('USER_SEX', item.sex)}">性别</td>
<td th:text="${item.phone}">电话</td>
<td th:text="${item.email}">邮箱</td>
<td th:text="${#dates.format(item.createDate, 'yyyy-MM-dd HH:mm:ss')}">创建时间</td>
<td th:text="${#dicts.dataStatus(item.status)}">状态</td>
<td>
<a class="open-popup" data-title="编辑用户" th:attr="data-url=@{'/system/user/edit/'+${item.id}}" data-size="600,570" href="#">编辑</a>
<a class="open-popup" data-title="详细信息" th:attr="data-url=@{'/system/user/detail/'+${item.id}}" data-size="800,600" href="#">详细</a>
<a class="ajax-get" th:attr="data-msg='您是否删除'+${item.nickname}" th:href="@{/system/user/status/delete(ids=${item.id})}">删除</a>
</td>
</tr>
</tbody>
</table>
</div>
<div th:replace="/common/fragment :: page"></div>
</div>
</div>
<script th:replace="/common/template :: script"></script>
<script type="text/javascript" th:src="@{/js/plugins/jquery-3.3.1.min.js}"></script>
<script type="text/javascript" th:src="@{/lib/zTree_v3/js/jquery.ztree.core.min.js}"></script>
<script type="text/javascript" th:src="@{/js/timoTree.js}"></script>
<script type="text/javascript">
var local = window.localStorage;
// 树形菜单
$.fn.selectTree({
rootTree: '全部',
onSelected: function(treeNode){
local.setItem('deptTitle', treeNode.name);
}
});
</script>
</body>
</html>
@@ -0,0 +1,29 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
</head>
<body>
<div class="layui-form timo-compile">
<form th:action="@{/system/user/pwd}">
<input th:each="id:${idList}" type="hidden" name="ids" th:value="${id}"/>
<div class="layui-form-item">
<label class="layui-form-label">新密码</label>
<div class="layui-input-inline">
<input class="layui-input" type="password" name="password" placeholder="请输入新密码">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">确认密码</label>
<div class="layui-input-inline">
<input class="layui-input" type="password" name="confirm" placeholder="再一次输入密码">
</div>
</div>
<div class="layui-form-item timo-finally">
<button class="layui-btn ajax-submit"><i class="fa fa-check-circle"></i> 保存</button>
<button class="layui-btn btn-secondary close-popup"><i class="fa fa-times-circle"></i> 关闭</button>
</div>
</form>
</div>
<script th:replace="/common/template :: script"></script>
</body>
</html>
@@ -0,0 +1,39 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
<style>
.layui-input-block{
margin-left: 20px;
margin-right: 20px;
margin-bottom: 70px;
}
.timo-compile .timo-finally{
position: fixed;
bottom: 0;
left: 0;
right: 0;
padding-bottom: 14px;
margin-bottom: 0;
background-color: #ffffff;
}
</style>
</head>
<body>
<div class="layui-form timo-compile">
<form th:action="@{/system/user/role}">
<input type="hidden" name="id" th:value="${id}"/>
<div class="layui-form-item">
<div class="layui-input-block">
<input th:each="item:${list}" type="checkbox" name="roleId" th:title="${item.title}"
th:value="${item.id}" th:checked="${#sets.contains(authRoles, item)}" lay-skin="primary">
</div>
</div>
<div class="layui-form-item timo-finally">
<button class="layui-btn ajax-submit"><i class="fa fa-check-circle"></i> 保存</button>
<button class="layui-btn btn-secondary close-popup"><i class="fa fa-times-circle"></i> 关闭</button>
</div>
</form>
</div>
<script th:replace="/common/template :: script"></script>
</body>
</html>