页面
authorXia Kaixiang <kaixiang.xia@supwisdom.com>
Tue, 23 Apr 2019 08:46:37 +0000 (16:46 +0800)
committerXia Kaixiang <kaixiang.xia@supwisdom.com>
Thu, 25 Apr 2019 06:34:12 +0000 (14:34 +0800)
23 files changed:
config/application-devel-oracle.properties
src/main/java/com/supwisdom/dlpay/framework/dao/OperatorDao.java
src/main/java/com/supwisdom/dlpay/framework/dao/RoleDao.java
src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
src/main/java/com/supwisdom/dlpay/framework/util/PageResult.java [new file with mode: 0644]
src/main/java/com/supwisdom/dlpay/framework/util/WebConstant.java [new file with mode: 0644]
src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
src/main/kotlin/com/supwisdom/dlpay/framework/service/framework_service.kt [new file with mode: 0644]
src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt [new file with mode: 0644]
src/main/kotlin/com/supwisdom/dlpay/system/bean/system_bean.kt [new file with mode: 0644]
src/main/kotlin/com/supwisdom/dlpay/system/controller/system_controller.kt
src/main/kotlin/com/supwisdom/dlpay/system/service/impl/system_service_impl.kt
src/main/kotlin/com/supwisdom/dlpay/system/service/system_service.kt
src/main/resources/db/migration/V1.0__init_data.sql
src/main/resources/static/custom/css/console.css [new file with mode: 0755]
src/main/resources/static/libs/q.js
src/main/resources/templates/home/console.html [new file with mode: 0755]
src/main/resources/templates/home/message.html [new file with mode: 0755]
src/main/resources/templates/home/password.html [new file with mode: 0755]
src/main/resources/templates/home/theme.html [new file with mode: 0755]
src/main/resources/templates/index.html
src/main/resources/templates/system/operator/index.html [new file with mode: 0644]
src/main/resources/templates/system/role/index.html [new file with mode: 0644]

index 1357d12..d1fe9ba 100644 (file)
@@ -19,4 +19,6 @@ redis.database=0
 # 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
index da67163..c25df48 100644 (file)
@@ -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);
 }
index 25eee0d..bd2e5d7 100644 (file)
@@ -2,8 +2,13 @@ package com.supwisdom.dlpay.framework.dao;
 
 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();
 }
index 520f19a..ec03a6d 100644 (file)
@@ -33,6 +33,12 @@ public class TOperator implements UserDetails {
   @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 @@ public class TOperator implements UserDetails {
     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 @@ public class TOperator implements UserDetails {
     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 (file)
index 0000000..13921a5
--- /dev/null
@@ -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 (file)
index 0000000..01df8c7
--- /dev/null
@@ -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;
+}
index e2ba3ab..24afe10 100644 (file)
@@ -11,11 +11,11 @@ import com.supwisdom.dlpay.framework.redisrepo.ApiClientRepository
 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 @@ class ValidateCodeController {
 
 
 @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 @@ class WebHomeController {
         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 (file)
index 0000000..b072cc2
--- /dev/null
@@ -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 (file)
index 0000000..7429de9
--- /dev/null
@@ -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 (file)
index 0000000..10328b5
--- /dev/null
@@ -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
index 7477a8f..235309b 100644 (file)
@@ -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
index 8e017d5..92ce6a9 100644 (file)
@@ -2,24 +2,34 @@ package com.supwisdom.dlpay.system.service.impl
 
 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 @@ class FunctionServiceImpl : FunctionService {
         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
index 7133732..d4d7557 100644 (file)
@@ -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 @@ interface FunctionService {
     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
index a28028b..e735951 100644 (file)
@@ -2,7 +2,7 @@ insert into tb_apiclient(appid, secret, status, roles)
 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 @@ Insert into TB_FUNCTION (ID,PARENTID,NAME,ORDERNUM,MENUURL,MENUICON,ISLEAF)
 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 (executable)
index 0000000..1e550bf
--- /dev/null
@@ -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;
+}
index a809434..b235b20 100755 (executable)
@@ -85,7 +85,6 @@ var Q = function (W, D, HTML, hash, view, arg, _arg, i, index, Regex, key, Q) {
             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 (executable)
index 0000000..027897c
--- /dev/null
@@ -0,0 +1,71 @@
+<div class="layui-row layui-col-space15">\r
+    <div class="layui-col-xs6 layui-col-md3">\r
+        <div class="layui-card">\r
+            <div class="layui-card-header">\r
+                访问量<span class="layui-badge layui-bg-blue pull-right">周</span>\r
+            </div>\r
+            <div class="layui-card-body">\r
+                <p class="lay-big-font">9,999,666</p>\r
+                <p>总计访问量<span class="pull-right">88万 <i class="layui-icon layui-icon-flag"></i></span></p>\r
+            </div>\r
+        </div>\r
+    </div>\r
+    <div class="layui-col-xs6 layui-col-md3">\r
+        <div class="layui-card">\r
+            <div class="layui-card-header">\r
+                下载<span class="layui-badge layui-bg-black pull-right">月</span>\r
+            </div>\r
+            <div class="layui-card-body">\r
+                <p class="lay-big-font">33,555</p>\r
+                <p>新下载<span class="pull-right">10% <i class="layui-icon layui-icon-download-circle"></i></span></p>\r
+            </div>\r
+        </div>\r
+    </div>\r
+    <div class="layui-col-xs6 layui-col-md3">\r
+        <div class="layui-card">\r
+            <div class="layui-card-header">\r
+                Start<span class="layui-badge layui-bg-green pull-right">周</span>\r
+            </div>\r
+            <div class="layui-card-body">\r
+                <p class="lay-big-font">999,666</p>\r
+                <p>总Start数<span class="pull-right">88万 <i class="layui-icon layui-icon-rate"></i></span></p>\r
+            </div>\r
+        </div>\r
+    </div>\r
+    <div class="layui-col-xs6 layui-col-md3">\r
+        <div class="layui-card">\r
+            <div class="layui-card-header">\r
+                活跃用户<span class="layui-badge layui-bg-orange pull-right">月</span>\r
+            </div>\r
+            <div class="layui-card-body">\r
+                <p class="lay-big-font">66,666</p>\r
+                <p>最近一个月<span class="pull-right">15% <i class="layui-icon layui-icon-user"></i></span></p>\r
+            </div>\r
+        </div>\r
+    </div>\r
+</div>\r
+\r
+\r
+\r
+    \r
+\r
+<script>\r
+    layui.use(['carousel', 'element'], function () {\r
+        var carousel = layui.carousel;\r
+        var element = layui.element;\r
+        var device = layui.device;\r
+\r
+        layui.link('/static/custom/css/console.css');\r
+\r
+        // 渲染轮播\r
+        carousel.render({\r
+            elem: '.layui-carousel',\r
+            width: '100%',\r
+            height: '60px',\r
+            arrow: 'none',\r
+            autoplay: true,\r
+            trigger: device.ios || device.android ? 'click' : 'hover',\r
+            anim: 'fade'\r
+        });\r
+    });\r
+</script>\r
diff --git a/src/main/resources/templates/home/message.html b/src/main/resources/templates/home/message.html
new file mode 100755 (executable)
index 0000000..71a097b
--- /dev/null
@@ -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 (executable)
index 0000000..931eb25
--- /dev/null
@@ -0,0 +1,58 @@
+<div class="layui-card-header">\r
+    <h2 class="header-title">修改密码</h2>\r
+</div>\r
+<div class="layui-card-body" style="padding: 30px;">\r
+    <form class="layui-form" id="form-psw">\r
+        <div class="layui-form-item">\r
+            <input type="password" name="oldPsw" required lay-verify="required" class="layui-input"\r
+                   placeholder="请输入原密码" lay-verType="tips">\r
+        </div>\r
+        <div class="layui-form-item">\r
+            <input type="password" name="newPsw" required lay-verify="required|psw" class="layui-input"\r
+                   placeholder="请输入新密码" lay-verType="tips">\r
+        </div>\r
+        <div class="layui-form-item">\r
+            <input type="password" name="rePsw" required lay-verify="required|repsw" class="layui-input"\r
+                   placeholder="再次输入新密码" lay-verType="tips">\r
+        </div>\r
+        <div class="layui-form-item">\r
+            <button class="layui-btn layui-btn-fluid" lay-submit lay-filter="submit-psw">确认修改</button>\r
+        </div>\r
+    </form>\r
+</div>\r
+\r
+<script>\r
+    layui.use(['form', 'admin', 'layer'], function () {\r
+        var form = layui.form;\r
+        var admin = layui.admin;\r
+        var layer = layui.layer;\r
+\r
+        // 监听提交\r
+        form.on('submit(submit-psw)', function (data) {\r
+            layer.load(2);\r
+            $.post('/system/user/updatePsw', data.field, function (data) {\r
+                if (data.code == 200) {\r
+                    layer.closeAll('loading');\r
+                    admin.closePopupRight();\r
+                    layer.msg(data.msg, {icon: 1, time: 1000}, function () {\r
+                        location.replace('logout');\r
+                    });\r
+                } else {\r
+                    layer.closeAll('loading');\r
+                    layer.msg(data.msg, {icon: 2});\r
+                }\r
+            });\r
+            return false;\r
+        });\r
+\r
+        // 添加表单验证方法\r
+        form.verify({\r
+            psw: [/^[\S]{5,12}$/, '密码必须5到12位,且不能出现空格'],\r
+            repsw: function (t) {\r
+                if (t !== $('#form-psw input[name=newPsw]').val()) {\r
+                    return '两次密码输入不一致';\r
+                }\r
+            }\r
+        });\r
+    });\r
+</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 (executable)
index 0000000..67cb12a
--- /dev/null
@@ -0,0 +1,37 @@
+<div class="layui-card-header">\r
+    <h2 class="header-title">多标签:</h2>\r
+    <div class="pull-right layui-form">\r
+        <input type="checkbox" lay-skin="switch" lay-text="ON|OFF" id="set-tab" lay-filter="set-tab" checked/>\r
+    </div>\r
+</div>\r
+\r
+<div class="layui-card-header"><h2 class="header-title">设置主题:</h2></div>\r
+<div class="layui-card-body layui-text">\r
+    <a href="/home/setTheme" class="layui-btn" style="background-color: #009688;">默认主题</a>\r
+    <a href="/home/setTheme?themeName=blue" class="layui-btn layui-btn-normal">蓝色主题</a>\r
+    <br><br><br>\r
+  \r
+</div>\r
+\r
+<script>\r
+    layui.use(['form', 'index', 'admin'], function () {\r
+        var form = layui.form;\r
+        var index = layui.index;\r
+        var admin = layui.admin;\r
+\r
+        $('#set-tab').prop('checked', index.pageTabs);\r
+        form.render('checkbox');\r
+\r
+        form.on('switch(set-tab)', function (data) {\r
+            if (data.elem.checked) {\r
+                location.reload();\r
+            } else {\r
+                index.pageTabs = false;\r
+                index.checkPageTabs();\r
+                admin.refresh();\r
+                admin.closePopupRight();\r
+            }\r
+        });\r
+\r
+    });\r
+</script>
\ No newline at end of file
index 95f2dee..011e8f8 100755 (executable)
@@ -65,6 +65,7 @@
     <div class="layui-side">\r
         <div class="layui-side-scroll">\r
             <ul class="layui-nav layui-nav-tree" style="margin-top: 15px;">\r
+\r
                 <li class="layui-nav-item" th:each="menu : ${menus}">\r
                     <a th:lay-href="${menu.menuUrl}"><i th:class="'layui-icon '+${menu.menuIcon}"></i>&emsp;<cite>[[${menu.menuName}]]</cite></a>\r
                     <dl class="layui-nav-child" th:if="${menu.subMenus.size()} > 0">\r
diff --git a/src/main/resources/templates/system/operator/index.html b/src/main/resources/templates/system/operator/index.html
new file mode 100644 (file)
index 0000000..d191a52
--- /dev/null
@@ -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 (file)
index 0000000..df1c415
--- /dev/null
@@ -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