页面
diff --git a/config/application-devel-oracle.properties b/config/application-devel-oracle.properties
index 1357d12..d1fe9ba 100644
--- a/config/application-devel-oracle.properties
+++ b/config/application-devel-oracle.properties
@@ -19,4 +19,6 @@
 # jwt settings
 jwt.secret=Zj5taLomEbrM0lk+NMQZbHfSxaDU1wekjT+kiC3YzDw=
 # timeout seconds
-jwt.expiration=3600
\ No newline at end of file
+jwt.expiration=3600
+# user password
+auth.password.bcrypt.seed=
\ No newline at end of file
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/OperatorDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/OperatorDao.java
index da67163..c25df48 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/OperatorDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/OperatorDao.java
@@ -1,10 +1,17 @@
 package com.supwisdom.dlpay.framework.dao;
 
 import com.supwisdom.dlpay.framework.domain.TOperator;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
 
 @Repository
-public interface OperatorDao extends JpaRepository<TOperator, String> {
+public interface OperatorDao extends JpaRepository<TOperator, String>, JpaSpecificationExecutor<TOperator> {
   TOperator findByOpercode(String opercode);
+
+  @Query(value = "select t from TOperator t where (t.opercode=?1 or ?1 is null) and (t.opername like %?2% or ?2 is null)")
+  Page<TOperator> getTOperatorsByPage(String opercode, String opername, String mobile, String status, Pageable pageable);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/RoleDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/RoleDao.java
index 25eee0d..bd2e5d7 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/RoleDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/RoleDao.java
@@ -2,8 +2,13 @@
 
 import com.supwisdom.dlpay.framework.domain.TRole;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 @Repository
 public interface RoleDao extends JpaRepository<TRole, String> {
+  @Query("from TRole order by createtime asc ")
+  List<TRole> getAllRoles();
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
index 520f19a..ec03a6d 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
@@ -33,6 +33,12 @@
   @Column(name = "STATUS", nullable = false, length = 32)
   private String status;
 
+  @Column(name = "MOBILE", length = 20)
+  private String mobile;
+
+  @Column(name = "EMAIL", length = 60)
+  private String email;
+
   @Column(name = "OPENDATE", length = 8)
   private String opendate;
 
@@ -50,12 +56,14 @@
     this.opername = opername;
   }
 
-  public TOperator(String opercode, String opertype, String opername, String operpwd, String status, String opendate, String closedate, Collection<? extends GrantedAuthority> authorities) {
+  public TOperator(String opercode, String opertype, String opername, String operpwd, String status, String mobile, String email, String opendate, String closedate, Collection<? extends GrantedAuthority> authorities) {
     this.opercode = opercode;
     this.opertype = opertype;
     this.opername = opername;
     this.operpwd = operpwd;
     this.status = status;
+    this.mobile = mobile;
+    this.email = email;
     this.opendate = opendate;
     this.closedate = closedate;
     this.authorities = authorities;
@@ -109,6 +117,22 @@
     this.status = status;
   }
 
+  public String getMobile() {
+    return mobile;
+  }
+
+  public void setMobile(String mobile) {
+    this.mobile = mobile;
+  }
+
+  public String getEmail() {
+    return email;
+  }
+
+  public void setEmail(String email) {
+    this.email = email;
+  }
+
   public String getOpendate() {
     return opendate;
   }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/PageResult.java b/src/main/java/com/supwisdom/dlpay/framework/util/PageResult.java
new file mode 100644
index 0000000..13921a5
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/PageResult.java
@@ -0,0 +1,63 @@
+package com.supwisdom.dlpay.framework.util;
+
+import java.util.List;
+
+public class PageResult<T> {
+
+  private int code; //状态码, 0表示成功
+
+  private String msg;  //提示信息
+
+  private long count; // 总数量
+
+  private List<T> data; // 当前数据
+
+  public PageResult() {
+  }
+
+  public PageResult(List<T> rows) {
+    this.data = rows;
+    this.count = rows.size();
+    this.code = 0;
+    this.msg = "";
+  }
+
+  public PageResult(long total, List<T> rows) {
+    this.count = total;
+    this.data = rows;
+    this.code = 0;
+    this.msg = "";
+  }
+
+  public int getCode() {
+    return code;
+  }
+
+  public void setCode(int code) {
+    this.code = code;
+  }
+
+  public String getMsg() {
+    return msg;
+  }
+
+  public void setMsg(String msg) {
+    this.msg = msg;
+  }
+
+  public long getCount() {
+    return count;
+  }
+
+  public void setCount(long count) {
+    this.count = count;
+  }
+
+  public List<T> getData() {
+    return data;
+  }
+
+  public void setData(List<T> data) {
+    this.data = data;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/WebConstant.java b/src/main/java/com/supwisdom/dlpay/framework/util/WebConstant.java
new file mode 100644
index 0000000..01df8c7
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/WebConstant.java
@@ -0,0 +1,6 @@
+package com.supwisdom.dlpay.framework.util;
+
+public class WebConstant {
+  public static final int PAGENO_DEFAULT = 1;
+  public static final int PAGESIZE_DEFAULT = 10;
+}
diff --git a/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
index e2ba3ab..24afe10 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
@@ -11,11 +11,11 @@
 import com.supwisdom.dlpay.framework.redisrepo.ApiJwtRepository
 import com.supwisdom.dlpay.framework.security.validate.ImageCodeUtil
 import com.supwisdom.dlpay.framework.security.validate.VerifyCode
+import com.supwisdom.dlpay.framework.service.CommonService
 import com.supwisdom.dlpay.framework.service.SystemUtilService
 import com.supwisdom.dlpay.framework.util.DateUtil
 import com.supwisdom.dlpay.framework.util.HmacUtil
 import com.supwisdom.dlpay.framework.util.TradeDict
-import com.supwisdom.dlpay.system.service.CommonService
 import com.supwisdom.dlpay.system.service.FunctionService
 import mu.KotlinLogging
 import org.springframework.beans.factory.annotation.Autowired
@@ -175,28 +175,28 @@
 
 
 @Controller
-class WebHomeController {
-
-    private val logger = KotlinLogging.logger {}
+class WebMainController {
     @Autowired
     lateinit var functionService: FunctionService
     @Autowired
     lateinit var commonService: CommonService
 
+    private val logger = KotlinLogging.logger {}
+
     @GetMapping("/login")
     fun loginView() = "login"
 
     @GetMapping("/logout")
     fun logout(request: HttpServletRequest, response: HttpServletResponse): String {
         SecurityContextHolder.getContext().authentication?.also {
-            logger.debug { "user logout!!" }
+            logger.debug { "user logout!! " }
             SecurityContextLogoutHandler().logout(request, response, it)
         }
         return "redirect:/login?logout"
     }
 
     @GetMapping(value = ["/", "/index"])
-    fun homeView(@AuthenticationPrincipal operUser: UserDetails, model: Model): String {
+    fun menuView(@AuthenticationPrincipal operUser: UserDetails, model: Model): String {
         model.addAttribute("loginOper", operUser as TOperator)
         val funclist = functionService.getFunctionsByOperid(operUser.operid)
         model.addAttribute("menus", functionService.getMenuTree(funclist, "-1"))
@@ -204,3 +204,53 @@
         return "index"
     }
 }
+
+@Controller
+@RequestMapping("/home")
+class HomeController {
+    /**
+     * 控制台
+     */
+    @GetMapping("/console")
+    fun console() :String{
+        return "home/console"
+    }
+
+    /**
+     * 消息弹窗
+     */
+    @GetMapping("/message")
+    fun message(): String {
+        return "home/message"
+    }
+
+    /**
+     * 修改密码弹窗
+     */
+    @GetMapping("/password")
+    fun password(): String {
+        return "home/password"
+    }
+
+    /**
+     * 主题设置弹窗
+     */
+    @GetMapping("/theme")
+    fun theme(): String {
+        return "home/theme"
+    }
+
+    /**
+     * 设置主题
+     */
+    @RequestMapping("/setTheme")
+    fun setTheme(themeName: String?, request: HttpServletRequest): String {
+        if (null == themeName) {
+            request.session.removeAttribute("theme")
+        } else {
+            request.session.setAttribute("theme", themeName)
+        }
+        return "redirect:/"
+    }
+
+}
diff --git a/src/main/kotlin/com/supwisdom/dlpay/framework/service/framework_service.kt b/src/main/kotlin/com/supwisdom/dlpay/framework/service/framework_service.kt
new file mode 100644
index 0000000..b072cc2
--- /dev/null
+++ b/src/main/kotlin/com/supwisdom/dlpay/framework/service/framework_service.kt
@@ -0,0 +1,5 @@
+package com.supwisdom.dlpay.framework.service
+
+interface CommonService{
+    fun getSystemVersion(): String
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt
new file mode 100644
index 0000000..7429de9
--- /dev/null
+++ b/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt
@@ -0,0 +1,17 @@
+package com.supwisdom.dlpay.framework.service.impl
+
+import com.jcabi.manifests.Manifests
+import com.supwisdom.dlpay.framework.service.CommonService
+import org.springframework.stereotype.Service
+
+@Service
+class CommonServiceImpl : CommonService {
+    override fun getSystemVersion(): String {
+        try {
+            return Manifests.read("Payapi-Version") ?: "version 1.0"
+        } catch (ex: Exception) {
+//            ex.printStackTrace()
+            return "unknown"
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/system/bean/system_bean.kt b/src/main/kotlin/com/supwisdom/dlpay/system/bean/system_bean.kt
new file mode 100644
index 0000000..10328b5
--- /dev/null
+++ b/src/main/kotlin/com/supwisdom/dlpay/system/bean/system_bean.kt
@@ -0,0 +1,11 @@
+package com.supwisdom.dlpay.system.bean
+
+/**
+ *  操作员查询类
+ */
+class OperatorSearchBean {
+    var opercode: String? = ""
+    var opername: String? = ""
+    var mobile: String? = ""
+    var deleteShow: Boolean? = true
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/system/controller/system_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/system/controller/system_controller.kt
index 7477a8f..235309b 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/system/controller/system_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/system/controller/system_controller.kt
@@ -1 +1,34 @@
-package com.supwisdom.dlpay.system.controller
\ No newline at end of file
+package com.supwisdom.dlpay.system.controller
+
+import com.supwisdom.dlpay.system.service.OperatorService
+import com.supwisdom.dlpay.system.service.RoleService
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.stereotype.Controller
+import org.springframework.ui.Model
+import org.springframework.web.bind.annotation.GetMapping
+import org.springframework.web.bind.annotation.RequestMapping
+
+@Controller
+@RequestMapping("/operator")
+class OperatorController {
+    @Autowired
+    lateinit var roleService: RoleService
+    @Autowired
+    lateinit var operatorService: OperatorService
+
+    @GetMapping("/index")
+    fun indexView(model: Model): String {
+        model.addAttribute("roles", roleService.findAllRoles())
+        return "system/operator/index"
+    }
+
+}
+
+@Controller
+@RequestMapping("/role")
+class RoleController {
+    @GetMapping("/index")
+    fun indexView(model: Model): String {
+        return "system/role/index"
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/system/service/impl/system_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/system/service/impl/system_service_impl.kt
index 8e017d5..92ce6a9 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/system/service/impl/system_service_impl.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/system/service/impl/system_service_impl.kt
@@ -2,24 +2,34 @@
 
 import com.jcabi.manifests.Manifests
 import com.supwisdom.dlpay.framework.dao.FunctionDao
+import com.supwisdom.dlpay.framework.dao.OperatorDao
+import com.supwisdom.dlpay.framework.dao.RoleDao
 import com.supwisdom.dlpay.framework.domain.TFunction
-import com.supwisdom.dlpay.system.service.CommonService
+import com.supwisdom.dlpay.framework.domain.TOperator
+import com.supwisdom.dlpay.framework.domain.TRole
+import com.supwisdom.dlpay.framework.util.PageResult
+import com.supwisdom.dlpay.framework.util.StringUtil
+import com.supwisdom.dlpay.system.bean.OperatorSearchBean
 import com.supwisdom.dlpay.system.service.FunctionService
+import com.supwisdom.dlpay.system.service.OperatorService
+import com.supwisdom.dlpay.system.service.RoleService
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.stereotype.Service
 import java.util.HashMap
+import org.springframework.data.domain.PageRequest
+import org.springframework.data.domain.Sort
+import reactor.core.publisher.Operators.`as`
+import java.util.ArrayList
+import javax.persistence.criteria.CriteriaBuilder
+import java.awt.print.Book
+import org.springframework.data.jpa.domain.Specification
+import org.springframework.data.repository.support.PageableExecutionUtils
+import javax.persistence.criteria.CriteriaQuery
+import javax.persistence.criteria.Predicate
+import javax.persistence.criteria.Root
 
-@Service
-class CommonServiceImpl : CommonService {
-    override fun getSystemVersion(): String {
-        try {
-            return Manifests.read("Payapi-Version") ?: "version 1.0"
-        } catch (ex: Exception) {
-            ex.printStackTrace()
-            return "unknown"
-        }
-    }
-}
+
+
 
 @Service
 class FunctionServiceImpl : FunctionService {
@@ -49,4 +59,22 @@
         return list
     }
 
+}
+
+@Service
+class OperatorServiceImpl : OperatorService {
+    @Autowired
+    lateinit var operatorDao: OperatorDao
+
+}
+
+@Service
+class RoleServiceImpl: RoleService{
+    @Autowired
+    lateinit var roleDao: RoleDao
+
+    override fun findAllRoles(): List<TRole> {
+        return roleDao.getAllRoles() ?: ArrayList(0)
+    }
+
 }
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/system/service/system_service.kt b/src/main/kotlin/com/supwisdom/dlpay/system/service/system_service.kt
index 7133732..d4d7557 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/system/service/system_service.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/system/service/system_service.kt
@@ -1,12 +1,14 @@
 package com.supwisdom.dlpay.system.service
 
 import com.supwisdom.dlpay.framework.domain.TFunction
+import com.supwisdom.dlpay.framework.domain.TOperator
+import com.supwisdom.dlpay.framework.domain.TRole
+import com.supwisdom.dlpay.framework.util.PageResult
+import com.supwisdom.dlpay.system.bean.OperatorSearchBean
 import org.springframework.transaction.annotation.Propagation
 import org.springframework.transaction.annotation.Transactional
 
-interface CommonService{
-    fun getSystemVersion(): String;
-}
+
 
 interface FunctionService {
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
@@ -16,4 +18,14 @@
     fun getMenuTree(funcList: List<TFunction>, parentId: String): List<Map<String, Any>>
 
 
+}
+
+interface OperatorService{
+//    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
+//    fun getOperatorsPageBySearch(pageNo: Int, pageSize: Int, searchBean: OperatorSearchBean): PageResult<TOperator>
+
+}
+
+interface RoleService{
+    fun findAllRoles(): List<TRole>
 }
\ No newline at end of file
diff --git a/src/main/resources/db/migration/V1.0__init_data.sql b/src/main/resources/db/migration/V1.0__init_data.sql
index a28028b..e735951 100644
--- a/src/main/resources/db/migration/V1.0__init_data.sql
+++ b/src/main/resources/db/migration/V1.0__init_data.sql
@@ -2,7 +2,7 @@
 values ('100001', 'oUw2NmA09ficiVWD4TUQLDOkPyzQa3VzbjjsW0B2qTk=', 'normal', 'ROLE_THIRD_ADMIN');
 INSERT INTO tb_operator(
 	operid, closedate, opendate, opercode, opername, operpwd, opertype, status)
-	VALUES ('LOR2IwRkbOjp+sVG9KR2BpHZbwGKepS4', '20500101', '20190101', 'system', '系统管理员', '$2a$10$Ex9xp11.vCaD8D0a7ahiUOKqDij1TcCUBwRAmrqXeDvAkmzLibn4.', '', 'normal');
+	VALUES ('LOR2IwRkbOjp+sVG9KR2BpHZbwGKepS4', '20500101', '20190101', 'system', '系统管理员', '$2a$10$Ex9xp11.vCaD8D0a7ahiUOKqDij1TcCUBwRAmrqXeDvAkmzLibn4.', 'oper', 'normal');
 
 INSERT INTO tb_role(
 	roleid, createtime, editflag, lastsaved, rolecode, roledesc, rolename)
@@ -19,4 +19,19 @@
 values ('2','1','管理员维护',1,'#','layui-icon-set',1);
 
 Insert into TB_ROLE_FUNCTION (ID,FUNCTIONID,ROLEID) values ('1','1','d1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-Insert into TB_ROLE_FUNCTION (ID,FUNCTIONID,ROLEID) values ('2','2','d1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
\ No newline at end of file
+Insert into TB_ROLE_FUNCTION (ID,FUNCTIONID,ROLEID) values ('2','2','d1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+
+Insert into TB_FUNCTION (ID,CREATETIME,ISLEAF,LASTSAVED,MENUICON,MENUURL,NAME,ORDERNUM,PARENTID) values ('1',null,0,null,'layui-icon-home','#','主页',1,'-1');
+Insert into TB_FUNCTION (ID,CREATETIME,ISLEAF,LASTSAVED,MENUICON,MENUURL,NAME,ORDERNUM,PARENTID) values ('2',null,1,null,'layui-icon-home','/home/console','控制台',1,'1');
+Insert into TB_FUNCTION (ID,CREATETIME,ISLEAF,LASTSAVED,MENUICON,MENUURL,NAME,ORDERNUM,PARENTID) values ('3',null,0,null,'layui-icon-set','#','系统中心',2,'-1');
+Insert into TB_FUNCTION (ID,CREATETIME,ISLEAF,LASTSAVED,MENUICON,MENUURL,NAME,ORDERNUM,PARENTID) values ('4',null,1,null,'layui-icon-set','/operator/index','管理员维护',1,'3');
+Insert into TB_FUNCTION (ID,CREATETIME,ISLEAF,LASTSAVED,MENUICON,MENUURL,NAME,ORDERNUM,PARENTID) values ('5',null,1,null,'layui-icon-set','/role/index','角色管理',2,'3');
+
+
+Insert into TB_ROLE_FUNCTION (ID,FUNCTIONID,ROLEID) values ('5','5','d1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+Insert into TB_ROLE_FUNCTION (ID,FUNCTIONID,ROLEID) values ('1','1','d1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+Insert into TB_ROLE_FUNCTION (ID,FUNCTIONID,ROLEID) values ('2','2','d1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+Insert into TB_ROLE_FUNCTION (ID,FUNCTIONID,ROLEID) values ('3','3','d1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+Insert into TB_ROLE_FUNCTION (ID,FUNCTIONID,ROLEID) values ('4','4','d1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
+
+commit;
diff --git a/src/main/resources/static/custom/css/console.css b/src/main/resources/static/custom/css/console.css
new file mode 100755
index 0000000..1e550bf
--- /dev/null
+++ b/src/main/resources/static/custom/css/console.css
@@ -0,0 +1,29 @@
+/** 卡片轮播图样式 */
+.admin-carousel .layui-carousel-ind {
+    position: absolute;
+    top: -41px;
+    text-align: right;
+}
+
+.admin-carousel .layui-carousel-ind ul {
+    background: 0 0;
+}
+
+.admin-carousel .layui-carousel-ind li {
+    background-color: #e2e2e2;
+}
+
+.admin-carousel .layui-carousel-ind li.layui-this {
+    background-color: #999;
+}
+
+/** 广告位轮播图 */
+.admin-news .layui-carousel-ind {
+    height: 45px;
+}
+
+.admin-news a {
+    display: block;
+    line-height: 60px;
+    text-align: center;
+}
diff --git a/src/main/resources/static/libs/q.js b/src/main/resources/static/libs/q.js
index a809434..b235b20 100755
--- a/src/main/resources/static/libs/q.js
+++ b/src/main/resources/static/libs/q.js
@@ -85,7 +85,6 @@
             return this
         },
         V: function () {
-            console.log('q.js <https://github.com/itorr/q.js> 2014/12/28');
             return this
         },
         go: function (u) {
diff --git a/src/main/resources/templates/home/console.html b/src/main/resources/templates/home/console.html
new file mode 100755
index 0000000..027897c
--- /dev/null
+++ b/src/main/resources/templates/home/console.html
@@ -0,0 +1,71 @@
+<div class="layui-row layui-col-space15">

+    <div class="layui-col-xs6 layui-col-md3">

+        <div class="layui-card">

+            <div class="layui-card-header">

+                访问量<span class="layui-badge layui-bg-blue pull-right">周</span>

+            </div>

+            <div class="layui-card-body">

+                <p class="lay-big-font">9,999,666</p>

+                <p>总计访问量<span class="pull-right">88万 <i class="layui-icon layui-icon-flag"></i></span></p>

+            </div>

+        </div>

+    </div>

+    <div class="layui-col-xs6 layui-col-md3">

+        <div class="layui-card">

+            <div class="layui-card-header">

+                下载<span class="layui-badge layui-bg-black pull-right">月</span>

+            </div>

+            <div class="layui-card-body">

+                <p class="lay-big-font">33,555</p>

+                <p>新下载<span class="pull-right">10% <i class="layui-icon layui-icon-download-circle"></i></span></p>

+            </div>

+        </div>

+    </div>

+    <div class="layui-col-xs6 layui-col-md3">

+        <div class="layui-card">

+            <div class="layui-card-header">

+                Start<span class="layui-badge layui-bg-green pull-right">周</span>

+            </div>

+            <div class="layui-card-body">

+                <p class="lay-big-font">999,666</p>

+                <p>总Start数<span class="pull-right">88万 <i class="layui-icon layui-icon-rate"></i></span></p>

+            </div>

+        </div>

+    </div>

+    <div class="layui-col-xs6 layui-col-md3">

+        <div class="layui-card">

+            <div class="layui-card-header">

+                活跃用户<span class="layui-badge layui-bg-orange pull-right">月</span>

+            </div>

+            <div class="layui-card-body">

+                <p class="lay-big-font">66,666</p>

+                <p>最近一个月<span class="pull-right">15% <i class="layui-icon layui-icon-user"></i></span></p>

+            </div>

+        </div>

+    </div>

+</div>

+

+

+

+    

+

+<script>

+    layui.use(['carousel', 'element'], function () {

+        var carousel = layui.carousel;

+        var element = layui.element;

+        var device = layui.device;

+

+        layui.link('/static/custom/css/console.css');

+

+        // 渲染轮播

+        carousel.render({

+            elem: '.layui-carousel',

+            width: '100%',

+            height: '60px',

+            arrow: 'none',

+            autoplay: true,

+            trigger: device.ios || device.android ? 'click' : 'hover',

+            anim: 'fade'

+        });

+    });

+</script>

diff --git a/src/main/resources/templates/home/message.html b/src/main/resources/templates/home/message.html
new file mode 100755
index 0000000..71a097b
--- /dev/null
+++ b/src/main/resources/templates/home/message.html
@@ -0,0 +1,92 @@
+<div id="message-view" class="layui-card-body layui-tab layui-tab-brief" style="padding: 5px 0;margin: 0;">
+    <ul class="layui-tab-title" style="text-align: center;">
+        <li class="layui-this">通知(5)</li>
+        <li>私信(12)</li>
+        <li>待办(3)</li>
+    </ul>
+    <div class="layui-tab-content" style="padding: 5px 0;">
+        <!-- tab1 -->
+        <div class="layui-tab-item message-list layui-show">
+            <!-- 实际项目请使用后台数据循环出来 -->
+            <a class="message-list-item" href="javascript:;">
+                <img class="message-item-icon" th:src="@{/static/assets/images/message.png}">
+                <div class="message-item-right">
+                    <h2 class="message-item-title">你收到了14份新周报</h2>
+                    <p class="message-item-text">10个月前</p>
+                </div>
+            </a>
+            <a class="message-list-item" href="javascript:;">
+                <img class="message-item-icon" th:src="@{/static/assets/images/message.png}">
+                <div class="message-item-right">
+                    <h2 class="message-item-title">你收到了14份新周报</h2>
+                    <p class="message-item-text">10个月前</p>
+                </div>
+            </a>
+            <a class="message-list-item" href="javascript:;">
+                <img class="message-item-icon" th:src="@{/static/assets/images/message.png}">
+                <div class="message-item-right">
+                    <h2 class="message-item-title">你收到了14份新周报</h2>
+                    <p class="message-item-text">10个月前</p>
+                </div>
+            </a>
+        </div>
+        <!-- tab2 -->
+        <div class="layui-tab-item">
+            <a class="message-list-item" href="javascript:;">
+                <img class="message-item-icon" th:src="@{/static/assets/images/head.png}">
+                <div class="message-item-right">
+                    <h2 class="message-item-title">xx评论了你</h2>
+                    <p class="message-item-text">哈哈哈哈哈哈</p>
+                    <p class="message-item-text">10个月前</p>
+                </div>
+            </a>
+            <a class="message-list-item" href="javascript:;">
+                <img class="message-item-icon" th:src="@{/static/assets/images/head.png}">
+                <div class="message-item-right">
+                    <h2 class="message-item-title">xx评论了你</h2>
+                    <p class="message-item-text">哈哈哈哈哈哈</p>
+                    <p class="message-item-text">10个月前</p>
+                </div>
+            </a>
+            <a class="message-list-item" href="javascript:;">
+                <img class="message-item-icon" th:src="@{/static/assets/images/head.png}">
+                <div class="message-item-right">
+                    <h2 class="message-item-title">xx评论了你</h2>
+                    <p class="message-item-text">哈哈哈哈哈哈</p>
+                    <p class="message-item-text">10个月前</p>
+                </div>
+            </a>
+        </div>
+        <!-- tab3 -->
+        <div class="layui-tab-item">
+            <a class="message-list-item" href="javascript:;">
+                <div class="message-item-right">
+                    <span class="layui-badge pull-right">待完成</span>
+                    <h2 class="message-item-title">你收到了14份新周报</h2>
+                    <p class="message-item-text">10个月前</p>
+                </div>
+            </a>
+            <a class="message-list-item" href="javascript:;">
+                <div class="message-item-right">
+                    <span class="layui-badge layui-bg-gray pull-right">已完成</span>
+                    <h2 class="message-item-title">你收到了14份新周报</h2>
+                    <p class="message-item-text">10个月前</p>
+                </div>
+            </a>
+            <a class="message-list-item" href="javascript:;">
+                <div class="message-item-right">
+                    <span class="layui-badge layui-bg-gray pull-right">已完成</span>
+                    <h2 class="message-item-title">你收到了14份新周报</h2>
+                    <p class="message-item-text">10个月前</p>
+                </div>
+            </a>
+        </div>
+    </div>
+</div>
+
+<script>
+    layui.use('element', function () {
+        var element = layui.element;
+
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/home/password.html b/src/main/resources/templates/home/password.html
new file mode 100755
index 0000000..931eb25
--- /dev/null
+++ b/src/main/resources/templates/home/password.html
@@ -0,0 +1,58 @@
+<div class="layui-card-header">

+    <h2 class="header-title">修改密码</h2>

+</div>

+<div class="layui-card-body" style="padding: 30px;">

+    <form class="layui-form" id="form-psw">

+        <div class="layui-form-item">

+            <input type="password" name="oldPsw" required lay-verify="required" class="layui-input"

+                   placeholder="请输入原密码" lay-verType="tips">

+        </div>

+        <div class="layui-form-item">

+            <input type="password" name="newPsw" required lay-verify="required|psw" class="layui-input"

+                   placeholder="请输入新密码" lay-verType="tips">

+        </div>

+        <div class="layui-form-item">

+            <input type="password" name="rePsw" required lay-verify="required|repsw" class="layui-input"

+                   placeholder="再次输入新密码" lay-verType="tips">

+        </div>

+        <div class="layui-form-item">

+            <button class="layui-btn layui-btn-fluid" lay-submit lay-filter="submit-psw">确认修改</button>

+        </div>

+    </form>

+</div>

+

+<script>

+    layui.use(['form', 'admin', 'layer'], function () {

+        var form = layui.form;

+        var admin = layui.admin;

+        var layer = layui.layer;

+

+        // 监听提交

+        form.on('submit(submit-psw)', function (data) {

+            layer.load(2);

+            $.post('/system/user/updatePsw', data.field, function (data) {

+                if (data.code == 200) {

+                    layer.closeAll('loading');

+                    admin.closePopupRight();

+                    layer.msg(data.msg, {icon: 1, time: 1000}, function () {

+                        location.replace('logout');

+                    });

+                } else {

+                    layer.closeAll('loading');

+                    layer.msg(data.msg, {icon: 2});

+                }

+            });

+            return false;

+        });

+

+        // 添加表单验证方法

+        form.verify({

+            psw: [/^[\S]{5,12}$/, '密码必须5到12位,且不能出现空格'],

+            repsw: function (t) {

+                if (t !== $('#form-psw input[name=newPsw]').val()) {

+                    return '两次密码输入不一致';

+                }

+            }

+        });

+    });

+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/home/theme.html b/src/main/resources/templates/home/theme.html
new file mode 100755
index 0000000..67cb12a
--- /dev/null
+++ b/src/main/resources/templates/home/theme.html
@@ -0,0 +1,37 @@
+<div class="layui-card-header">

+    <h2 class="header-title">多标签:</h2>

+    <div class="pull-right layui-form">

+        <input type="checkbox" lay-skin="switch" lay-text="ON|OFF" id="set-tab" lay-filter="set-tab" checked/>

+    </div>

+</div>

+

+<div class="layui-card-header"><h2 class="header-title">设置主题:</h2></div>

+<div class="layui-card-body layui-text">

+    <a href="/home/setTheme" class="layui-btn" style="background-color: #009688;">默认主题</a>

+    <a href="/home/setTheme?themeName=blue" class="layui-btn layui-btn-normal">蓝色主题</a>

+    <br><br><br>

+  

+</div>

+

+<script>

+    layui.use(['form', 'index', 'admin'], function () {

+        var form = layui.form;

+        var index = layui.index;

+        var admin = layui.admin;

+

+        $('#set-tab').prop('checked', index.pageTabs);

+        form.render('checkbox');

+

+        form.on('switch(set-tab)', function (data) {

+            if (data.elem.checked) {

+                location.reload();

+            } else {

+                index.pageTabs = false;

+                index.checkPageTabs();

+                admin.refresh();

+                admin.closePopupRight();

+            }

+        });

+

+    });

+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html
index 95f2dee..011e8f8 100755
--- a/src/main/resources/templates/index.html
+++ b/src/main/resources/templates/index.html
@@ -65,6 +65,7 @@
     <div class="layui-side">

         <div class="layui-side-scroll">

             <ul class="layui-nav layui-nav-tree" style="margin-top: 15px;">

+

                 <li class="layui-nav-item" th:each="menu : ${menus}">

                     <a th:lay-href="${menu.menuUrl}"><i th:class="'layui-icon '+${menu.menuIcon}"></i>&emsp;<cite>[[${menu.menuName}]]</cite></a>

                     <dl class="layui-nav-child" th:if="${menu.subMenus.size()} > 0">

diff --git a/src/main/resources/templates/system/operator/index.html b/src/main/resources/templates/system/operator/index.html
new file mode 100644
index 0000000..d191a52
--- /dev/null
+++ b/src/main/resources/templates/system/operator/index.html
@@ -0,0 +1,157 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h2 class="header-title">管理员维护</h2>
+        <span class="layui-breadcrumb pull-right">
+          <a href="#!_operator_index">系统中心</a>
+          <a><cite>管理员维护</cite></a>
+        </span>
+    </div>
+    <div class="layui-card-body">
+        <div class="layui-form toolbar">
+            搜索:
+            <select id="user-search-key">
+                <option value="">-请选择-</option>
+                <option value="opercode">账号</option>
+                <option value="opername">用户名</option>
+                <option value="mobile">手机号</option>
+            </select>&emsp;
+            <input id="user-search-value" class="layui-input search-input" type="text" placeholder="输入关键字"/>&emsp;
+            <button id="user-btn-search" class="layui-btn icon-btn"><i class="layui-icon">&#xe615;</i>搜索</button>
+            <button id="user-btn-add" class="layui-btn icon-btn" lay-tips="新用户密码为123456"><i
+                    class="layui-icon">&#xe654;</i>添加
+            </button>
+        </div>
+
+        <table class="layui-table" id="user-table" lay-filter="user-table"></table>
+    </div>
+</div>
+
+
+
+
+<!-- 表格操作列 -->
+<script type="text/html" id="user-table-bar">
+    <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">修改</a>
+    <a class="layui-btn layui-btn-xs" lay-event="reset">重置密码</a>
+</script>
+
+<!-- 表格状态列 -->
+<script type="text/html" id="user-tpl-state">
+    <input type="checkbox" lay-filter="user-tpl-state" value="{{d.userId}}" lay-skin="switch" lay-text="正常|锁定"
+           {{d.state==0?'checked':''}}/>
+</script>
+<script>
+    layui.use(['form', 'table','layer', 'util', 'admin', 'element'], function () {
+        var form = layui.form;
+        var table = layui.table;
+        var layer = layui.layer;
+        var util = layui.util;
+        var admin = layui.admin;
+        var element = layui.element;
+
+        form.render('select');
+
+        // 渲染表格
+        table.render({
+            elem: '#user-table',
+            url: '/system/user/list',
+            page: true,
+            cols: [
+                [
+                    {type: 'numbers'},
+                    {field: 'username', sort: true, title: '账号'},
+                    {field: 'nickName', sort: true, title: '用户名'},
+                    {field: 'phone', sort: true, title: '手机号'},
+                    {field: 'sex', sort: true, title: '性别'},
+                    {
+                        sort: true, templet: function (d) {
+                            return util.toDateString(d.createTime);
+                        }, title: '创建时间'
+                    },
+                    {field: 'state', sort: true, templet: '#user-tpl-state', title: '状态'},
+                    {align: 'center', toolbar: '#user-table-bar', title: '操作'}
+                ]
+            ]
+        });
+
+        // 添加按钮点击事件
+        $('#user-btn-add').click(function () {
+            showEditModel();
+        });
+
+
+        // 工具条点击事件
+        table.on('tool(user-table)', function (obj) {
+            console.log(obj);
+            var data = obj.data;
+            var layEvent = obj.event;
+
+            if (layEvent === 'edit') { // 修改
+                showEditModel(data);
+            } else if (layEvent === 'reset') { // 重置密码
+                layer.confirm('确定重置此用户的密码吗?', function (i) {
+                    layer.close(i);
+                    layer.load(2);
+                    admin.go('/system/user/restPsw', {
+                        userId: obj.data.userId
+                    }, function (data) {
+                        console.log(data.code);
+                        layer.closeAll('loading');
+                        if (data.code == 200) {
+                            layer.msg(data.msg, {icon: 1});
+                        }else if(data.code == 401){
+                            layer.msg(data.msg, {icon: 2, time: 1500}, function () {location.replace('/login'); }, 1000);
+                            return;
+                        }
+                        else {
+                            layer.msg(data.msg, {icon: 2});
+                        }
+                    });
+                });
+            }
+        });
+
+        // 显示表单弹窗
+        var showEditModel = function (data) {
+            var title = data ? '修改用户' : '添加用户';
+            admin.putTempData('t_user', data);
+            admin.popupCenter({
+                title: title,
+                path: '/system/user/editForm',
+                finish: function () {
+                    table.reload('user-table', {});
+                }
+            });
+        };
+
+        // 搜索按钮点击事件
+        $('#user-btn-search').click(function () {
+            var key = $('#user-search-key').val();
+            var value = $('#user-search-value').val();
+            table.reload('user-table', {where: {searchKey: key, searchValue: value}});
+        });
+
+        // 修改user状态
+        form.on('switch(user-tpl-state)', function (obj) {
+            layer.load(2);
+            admin.go('/system/user/updateState', {
+                userId: obj.elem.value,
+                state: obj.elem.checked ? 0 : 1
+            }, function (data) {
+                layer.closeAll('loading');
+                if (data.code == 200) {
+                    layer.msg(data.msg, {icon: 1});
+                    //table.reload('table-user', {});
+                }else if(data.code == 401){
+                    layer.msg(data.msg, {icon: 2, time: 1500}, function () {location.replace('/login'); }, 1000);
+                    return;
+                } else {
+                    layer.msg(data.msg, {icon: 2});
+                    $(obj.elem).prop('checked', !obj.elem.checked);
+                    form.render('checkbox');
+                }
+            });
+        });
+
+    });
+</script>
diff --git a/src/main/resources/templates/system/role/index.html b/src/main/resources/templates/system/role/index.html
new file mode 100644
index 0000000..df1c415
--- /dev/null
+++ b/src/main/resources/templates/system/role/index.html
@@ -0,0 +1,12 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h2 class="header-title">角色管理</h2>
+        <span class="layui-breadcrumb pull-right">
+          <a href="#!_operator_index">系统中心</a>
+          <a><cite>角色管理</cite></a>
+        </span>
+    </div>
+    <div class="layui-card-body">
+        <table class="layui-table" id="user-table" lay-filter="user-table"></table>
+    </div>
+</div>
\ No newline at end of file