From 9361123198ee6afe4b7b4278d677b619765faae8 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期一, 15 五月 2023 13:01:06 +0800
Subject: [PATCH] 库位查询

---
 src/main/webapp/views/tpl/theme/img/theme-cyan.png               |    0 
 src/main/webapp/views/tpl/theme/img/theme-pink.png               |    0 
 src/main/java/com/zy/asrs/controller/LocMastController.java      |  130 +++++
 src/main/resources/mapper/LocMastMapper.xml                      |    1 
 src/main/webapp/views/tpl/theme/img/theme-colorful.png           |    0 
 src/main/webapp/views/tpl/tpl-theme.html                         |  229 +++++++++
 src/main/webapp/static/js/stoMan/stoQue.js                       |  342 ++++++++++++++
 src/main/webapp/views/tpl/theme/img/theme-red.png                |    0 
 src/main/java/com/zy/asrs/service/BasLocStsService.java          |    8 
 src/main/webapp/views/tpl/theme/img/theme-green.png              |    0 
 src/main/java/com/zy/asrs/mapper/BasLocStsMapper.java            |   12 
 src/main/webapp/views/tpl/theme/img/theme-my.png                 |    0 
 src/main/webapp/views/tpl/theme/img/icon_date.png                |    0 
 src/main/webapp/views/tpl/tpl-note.html                          |  206 ++++++++
 src/main/webapp/views/stoMan/stoQue.html                         |   85 +++
 src/main/webapp/views/tpl/theme/img/theme-blue.png               |    0 
 src/main/webapp/views/tpl/theme/img/icon_search.png              |    0 
 src/main/java/com/zy/asrs/entity/LocMast.java                    |   13 
 src/main/webapp/views/tpl/theme/img/ic_loading.gif               |    0 
 src/main/webapp/views/tpl/alarm-detl.html                        |   52 ++
 src/main/webapp/views/tpl/theme/img/theme-admin.png              |    0 
 src/main/java/com/zy/asrs/service/impl/BasLocStsServiceImpl.java |   12 
 src/main/resources/mapper/BasLocStsMapper.xml                    |   16 
 src/main/webapp/static/css/common.css                            |   54 --
 src/main/webapp/views/tpl/theme/img/theme-white.png              |    0 
 src/main/webapp/views/tpl/theme/img/theme-purple.png             |    0 
 src/main/java/com/zy/asrs/entity/BasLocSts.java                  |  164 +++++++
 27 files changed, 1,277 insertions(+), 47 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/LocMastController.java b/src/main/java/com/zy/asrs/controller/LocMastController.java
new file mode 100644
index 0000000..45f0bbb
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/LocMastController.java
@@ -0,0 +1,130 @@
+package com.zy.asrs.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.core.annotations.ManagerAuth;
+import com.core.common.BaseRes;
+import com.core.common.Cools;
+import com.core.common.DateUtils;
+import com.core.common.R;
+import com.zy.asrs.entity.LocMast;
+import com.zy.asrs.service.LocDetlService;
+import com.zy.asrs.service.LocMastService;
+import com.zy.asrs.service.WrkMastService;
+import com.zy.common.entity.Parameter;
+import com.zy.common.web.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+
+@RestController
+public class LocMastController extends BaseController {
+
+    @Autowired
+    private LocMastService locMastService;
+
+    @PostMapping(value = "/group/empty/stock")
+    @ManagerAuth(memo = "鑾峰彇鍚岀粍璐ф灦鐨勭┖搴撲綅")
+    public R getGroupEmptyStock(@RequestParam(required = false) String sourceLocNo) {
+        return R.ok().add(locMastService.queryGroupEmptyStock(sourceLocNo));
+    }
+
+    @RequestMapping(value = "/locMast/{id}/auth")
+    @ManagerAuth
+    public R get(@PathVariable("id") String id) {
+        return R.ok(locMastService.selectById(String.valueOf(id)));
+    }
+
+    @RequestMapping(value = "/locMast/list/auth")
+    @ManagerAuth
+    public R list(@RequestParam(defaultValue = "1")Integer curr,
+                  @RequestParam(defaultValue = "10")Integer limit,
+                  @RequestParam(required = false)String orderByField,
+                  @RequestParam(required = false)String orderByType,
+                  @RequestParam Map<String, Object> param){
+        excludeTrash(param);
+        EntityWrapper<LocMast> wrapper = new EntityWrapper<>();
+        convert(param, wrapper);
+        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
+        return R.ok(locMastService.selectPage(new Page<>(curr, limit), wrapper.eq("status",0)));
+    }
+
+    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
+        for (Map.Entry<String, Object> entry : map.entrySet()){
+            String val = String.valueOf(entry.getValue());
+            if (val.contains(RANGE_TIME_LINK)){
+                String[] dates = val.split(RANGE_TIME_LINK);
+                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
+                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
+            } else {
+                wrapper.like(entry.getKey(), val);
+            }
+        }
+    }
+
+    @RequestMapping(value = "/locMast/add/auth")
+    @ManagerAuth(memo = "搴撲綅娣诲姞")
+    public R add(LocMast locMast) {
+        locMast.setModiUser(getUserId());
+        locMast.setModiTime(new Date());
+        locMast.setAppeUser(getUserId());
+        locMast.setAppeTime(new Date());
+        locMastService.insert(locMast);
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/locMast/delete/auth")
+    @ManagerAuth(memo = "搴撲綅鍒犻櫎")
+    public R delete(@RequestParam String param){
+        List<LocMast> list = JSONArray.parseArray(param, LocMast.class);
+        if (Cools.isEmpty(list)){
+            return R.error();
+        }
+        for (LocMast entity : list){
+            locMastService.delete(new EntityWrapper<>(entity));
+        }
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/locMast/export/auth")
+    @ManagerAuth(memo = "搴撲綅瀵煎嚭")
+    public R export(@RequestBody JSONObject param){
+        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
+        EntityWrapper<LocMast> wrapper = new EntityWrapper<>();
+        Map<String, Object> map = excludeTrash(param.getJSONObject("locMast"));
+        convert(map, wrapper);
+        List<LocMast> list = locMastService.selectList(wrapper);
+        return R.ok(exportSupport(list, fields));
+    }
+
+    @RequestMapping(value = "/locMastQuery/auth")
+    @ManagerAuth
+    public R query(String condition) {
+        EntityWrapper<LocMast> wrapper = new EntityWrapper<>();
+        wrapper.like("loc_no", condition);
+        Page<LocMast> page = locMastService.selectPage(new Page<>(0, 10), wrapper);
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (LocMast locMast : page.getRecords()){
+            Map<String, Object> map = new HashMap<>();
+            map.put("id", locMast.getLocNo());
+            map.put("value", locMast.getLocNo());
+            result.add(map);
+        }
+        return R.ok(result);
+    }
+
+    @RequestMapping(value = "/locMast/check/column/auth")
+    @ManagerAuth
+    public R query(@RequestBody JSONObject param) {
+        Wrapper<LocMast> wrapper = new EntityWrapper<LocMast>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
+        if (null != locMastService.selectOne(wrapper)){
+            return R.parse(BaseRes.REPEAT).add(getComment(LocMast.class, String.valueOf(param.get("key"))));
+        }
+        return R.ok();
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/BasLocSts.java b/src/main/java/com/zy/asrs/entity/BasLocSts.java
new file mode 100644
index 0000000..13d16b9
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/BasLocSts.java
@@ -0,0 +1,164 @@
+package com.zy.asrs.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.core.common.Cools;
+import com.core.common.SpringUtils;
+import com.zy.system.entity.User;
+import com.zy.system.service.UserService;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+@TableName("asr_bas_loc_sts")
+public class BasLocSts implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 搴撲綅鐘舵�佷唬鍙�
+     */
+    @ApiModelProperty(value= "搴撲綅鐘舵�佷唬鍙�")
+    @TableId(value = "loc_sts", type = IdType.INPUT)
+    @TableField("loc_sts")
+    private String locSts;
+
+    /**
+     * 搴撲綅鐘舵�佹弿杩�
+     */
+    @ApiModelProperty(value= "搴撲綅鐘舵�佹弿杩�")
+    @TableField("loc_desc")
+    private String locDesc;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    @TableField("modi_user")
+    private Long modiUser;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    @TableField("modi_time")
+    private Date modiTime;
+
+    /**
+     * 鍒涘缓鑰�
+     */
+    @ApiModelProperty(value= "鍒涘缓鑰�")
+    @TableField("appe_user")
+    private Long appeUser;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    @TableField("appe_time")
+    private Date appeTime;
+
+    public BasLocSts() {}
+
+    public BasLocSts(String locDesc, Long modiUser, Date modiTime, Long appeUser, Date appeTime) {
+        this.locDesc = locDesc;
+        this.modiUser = modiUser;
+        this.modiTime = modiTime;
+        this.appeUser = appeUser;
+        this.appeTime = appeTime;
+    }
+
+//    BasLocSts basLocSts = new BasLocSts(
+//            null,    // 搴撲綅鐘舵�佹弿杩�
+//            null,    // 淇敼浜哄憳
+//            null,    // 淇敼鏃堕棿
+//            null,    // 鍒涘缓鑰�
+//            null    // 娣诲姞鏃堕棿
+//    );
+
+    public String getLocSts() {
+        return locSts;
+    }
+
+    public void setLocSts(String locSts) {
+        this.locSts = locSts;
+    }
+
+    public String getLocDesc() {
+        return locDesc;
+    }
+
+    public void setLocDesc(String locDesc) {
+        this.locDesc = locDesc;
+    }
+
+    public Long getModiUser() {
+        return modiUser;
+    }
+
+    public String getModiUser$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.selectById(this.modiUser);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getUsername());
+        }
+        return null;
+    }
+
+    public void setModiUser(Long modiUser) {
+        this.modiUser = modiUser;
+    }
+
+    public Date getModiTime() {
+        return modiTime;
+    }
+
+    public String getModiTime$(){
+        if (Cools.isEmpty(this.modiTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.modiTime);
+    }
+
+    public void setModiTime(Date modiTime) {
+        this.modiTime = modiTime;
+    }
+
+    public Long getAppeUser() {
+        return appeUser;
+    }
+
+    public String getAppeUser$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.selectById(this.appeUser);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getUsername());
+        }
+        return null;
+    }
+
+    public void setAppeUser(Long appeUser) {
+        this.appeUser = appeUser;
+    }
+
+    public Date getAppeTime() {
+        return appeTime;
+    }
+
+    public String getAppeTime$(){
+        if (Cools.isEmpty(this.appeTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.appeTime);
+    }
+
+    public void setAppeTime(Date appeTime) {
+        this.appeTime = appeTime;
+    }
+
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/LocMast.java b/src/main/java/com/zy/asrs/entity/LocMast.java
index cd931b9..f1606c7 100644
--- a/src/main/java/com/zy/asrs/entity/LocMast.java
+++ b/src/main/java/com/zy/asrs/entity/LocMast.java
@@ -6,6 +6,7 @@
 import com.baomidou.mybatisplus.enums.IdType;
 import com.core.common.Cools;
 import com.core.common.SpringUtils;
+import com.zy.asrs.service.BasLocStsService;
 import com.zy.system.entity.User;
 import com.zy.system.service.UserService;
 import io.swagger.annotations.ApiModelProperty;
@@ -174,6 +175,9 @@
     @TableField("ctn_no")
     private String ctnNo;
 
+    @ApiModelProperty(value= "")
+    private String status;
+
     public String getIoTime$(){
         if (Cools.isEmpty(this.ioTime)){
             return "";
@@ -269,4 +273,13 @@
         return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.errorTime);
     }
 
+    public String getLocSts$(){
+        BasLocStsService service = SpringUtils.getBean(BasLocStsService.class);
+        BasLocSts basLocSts = service.selectById(this.locSts);
+        if (!Cools.isEmpty(basLocSts)){
+            return String.valueOf(basLocSts.getLocDesc());
+        }
+        return null;
+    }
+
 }
diff --git a/src/main/java/com/zy/asrs/mapper/BasLocStsMapper.java b/src/main/java/com/zy/asrs/mapper/BasLocStsMapper.java
new file mode 100644
index 0000000..6b4fbce
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/BasLocStsMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.zy.asrs.entity.BasLocSts;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface BasLocStsMapper extends BaseMapper<BasLocSts> {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/BasLocStsService.java b/src/main/java/com/zy/asrs/service/BasLocStsService.java
new file mode 100644
index 0000000..85f68fb
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/BasLocStsService.java
@@ -0,0 +1,8 @@
+package com.zy.asrs.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.zy.asrs.entity.BasLocSts;
+
+public interface BasLocStsService extends IService<BasLocSts> {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/BasLocStsServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/BasLocStsServiceImpl.java
new file mode 100644
index 0000000..59a5106
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/BasLocStsServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.zy.asrs.entity.BasLocSts;
+import com.zy.asrs.mapper.BasLocStsMapper;
+import com.zy.asrs.service.BasLocStsService;
+import org.springframework.stereotype.Service;
+
+@Service("basLocStsService")
+public class BasLocStsServiceImpl extends ServiceImpl<BasLocStsMapper, BasLocSts> implements BasLocStsService {
+
+}
diff --git a/src/main/resources/mapper/BasLocStsMapper.xml b/src/main/resources/mapper/BasLocStsMapper.xml
new file mode 100644
index 0000000..1933fd0
--- /dev/null
+++ b/src/main/resources/mapper/BasLocStsMapper.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.asrs.mapper.BasLocStsMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasLocSts">
+        <id column="loc_sts" property="locSts" />
+        <result column="loc_desc" property="locDesc" />
+        <result column="modi_user" property="modiUser" />
+        <result column="modi_time" property="modiTime" />
+        <result column="appe_user" property="appeUser" />
+        <result column="appe_time" property="appeTime" />
+
+    </resultMap>
+
+</mapper>
diff --git a/src/main/resources/mapper/LocMastMapper.xml b/src/main/resources/mapper/LocMastMapper.xml
index 7821af2..04b10a7 100644
--- a/src/main/resources/mapper/LocMastMapper.xml
+++ b/src/main/resources/mapper/LocMastMapper.xml
@@ -34,6 +34,7 @@
         <result column="mk" property="mk" />
         <result column="barcode" property="barcode" />
         <result column="ctn_no" property="ctnNo" />
+        <result column="status" property="status" />
 
     </resultMap>
 
diff --git a/src/main/webapp/static/css/common.css b/src/main/webapp/static/css/common.css
index 281a57e..d1a71bc 100644
--- a/src/main/webapp/static/css/common.css
+++ b/src/main/webapp/static/css/common.css
@@ -1,53 +1,13 @@
-/* 缁熶竴澶勭悊 */
-*, *::before, *::after {
-    -webkit-box-sizing: border-box;
-    box-sizing: border-box;
-    margin: 0;
-    padding: 0;
-}
-html {
-    line-height: 1.5;
-    font-size: 15px;
-    font-family: sans-serif;
-    height: 100%;
-}
+/**, *::before, *::after {*/
+/*    -webkit-box-sizing: border-box;*/
+/*    box-sizing: border-box;*/
+/*    margin: 0;*/
+/*    padding: 0;*/
+/*}*/
+
 body {
-    height: 100%;
     background-color: #fff;
 }
-
-iframe {
-    border-width: 0;
-}
-
-/* 甯冨眬 */
-.row::after, .row::before {
-    content: "";
-    display: table;
-    clear: both;
-}
-.col-md3:empty {
-    background:rgba(0,0,0,0.04);
-    border: 1px solid rgba(0,0,0,.3);
-    min-height:32px;
-    height: inherit;
-    z-index:1;
-}
-.col-md1,.col-md10,.col-md11,.col-md12,.col-md2,.col-md3,.col-md4,.col-md5,.col-md6,.col-md7,.col-md8,.col-md9{
-    float:left;
-}
-.col-md1{width:8.33333333%}
-.col-md2{width:16.66666667%}
-.col-md3{width:25%}
-.col-md4{width:33.33333333%}
-.col-md5{width:41.66666667%}
-.col-md6{width:50%}
-.col-md7{width:58.33333333%}
-.col-md8{width:66.66666667%}
-.col-md9{width:75%}
-.col-md10{width:83.33333333%}
-.col-md11{width:91.66666667%}
-.col-md12{width:100%}
 
 input::placeholder {
     color: #b4b4b4;
diff --git a/src/main/webapp/static/js/stoMan/stoQue.js b/src/main/webapp/static/js/stoMan/stoQue.js
new file mode 100644
index 0000000..a4630e5
--- /dev/null
+++ b/src/main/webapp/static/js/stoMan/stoQue.js
@@ -0,0 +1,342 @@
+var pageCurr;
+var locNo;
+layui.use(['table','laydate', 'form'], function(){
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    var form = layui.form;
+
+    layDate.render({
+        elem: '.layui-laydate-range'
+        ,type: 'datetime'
+        ,range: true
+    });
+
+    // 鏁版嵁娓叉煋
+    tableIns = table.render({
+        elem: '#stoQue',
+        headers: {token: localStorage.getItem('token')},
+        url: baseUrl+'/locMast/list/auth',
+        page: true,
+        limit: 20,
+        limits: [20, 30, 50, 100, 200, 500],
+        even: true,
+        toolbar: '#toolbar',
+        cellMinWidth: 50,
+        cols: [[
+            {type: 'checkbox'}
+            ,{field: 'locNo', align: 'center',title: '搴撲綅鍙�'}
+            ,{field: 'locSts$', align: 'center',title: '搴撲綅鐘舵��', width: 180, style: 'color: #8E2323'}
+            // ,{field: 'whsType$', align: 'center',title: '搴撲綅绫诲瀷'}
+            ,{field: 'crnNo', align: 'center',title: '鍫嗗灈鏈哄彿'}
+            ,{field: 'row1', align: 'center',title: '鎺�'}
+            ,{field: 'bay1', align: 'center',title: '鍒�'}
+            ,{field: 'lev1', align: 'center',title: '灞�'}
+            ,{field: 'fullPlt', align: 'center',title: '婊℃澘', templet:function(row){
+                    var html = "<input value='fullPlt' type='checkbox' lay-skin='primary' lay-filter='tableCheckbox' table-index='"+row.LAY_TABLE_INDEX+"'";
+                    if(row.fullPlt === 'Y'){html += " checked ";}
+                    html += "disabled='disabled' >";
+                    return html;
+                },width:80}
+            ,{field: 'modiUser$', align: 'center',title: '淇敼浜哄憳'}
+            ,{field: 'modiTime$', align: 'center',title: '淇敼鏃堕棿', width: 180}
+            ,{ fixed: 'right', title:'鎿嶄綔', align: 'center', toolbar: '#operate'}
+        ]],
+        request: {
+            pageName: 'curr',
+            pageSize: 'limit'
+        },
+        parseData: function (res) {
+            return {
+                'code': res.code,
+                'msg': res.msg,
+                'count': res.data.total,
+                'data': res.data.records
+            }
+        },
+        response: {
+            statusCode: 200
+        },
+        done: function(res, curr, count) {
+            if (res.code === 403) {
+                top.location.href = baseUrl+"/";
+            }
+            pageCurr=curr;
+            limit();
+            form.on('checkbox(tableCheckbox)', function (data) {
+                var _index = $(data.elem).attr('table-index')||0;
+                if(data.elem.checked){
+                    res.data[_index][data.value] = 'Y';
+                }else{
+                    res.data[_index][data.value] = 'N';
+                }
+            });
+            if (count === 1){
+                // locDetl(res.data[0][locNo]);
+            }
+        }
+    });
+
+    // 鐩戝惉鎺掑簭浜嬩欢
+    table.on('sort(stoQue)', function (obj) {
+        var searchData = {};
+        $.each($('#search-box [name]').serializeArray(), function() {
+            searchData[this.name] = this.value;
+        });
+        searchData['orderByField'] = obj.field;
+        searchData['orderByType'] = obj.type;
+        tableIns.reload({
+            where: searchData,
+            page: {
+                curr: 1
+            },
+            done: function (res, curr, count) {
+                if (res.code === 403) {
+                    top.location.href = baseUrl+"/";
+                }
+                pageCurr=curr;
+                limit();
+            }
+        });
+    });
+
+    // 鐩戝惉澶村伐鍏锋爮浜嬩欢
+    table.on('toolbar(stoQue)', function (obj) {
+        var checkStatus = table.checkStatus(obj.config.id);
+        switch(obj.event) {
+            // 鏇存柊搴撳瓨
+            case 'refreshSto': // todo:luxiaotao
+                alert("杩樻病鍋�");
+                break;
+            case 'exportData':
+                layer.confirm('纭畾瀵煎嚭Excel鍚�', {shadeClose: true}, function(){
+                    var titles=[];
+                    var fields=[];
+                    obj.config.cols[0].map(function (col) {
+                        if (col.type === 'normal' && col.hide === false && col.toolbar == null) {
+                            titles.push(col.title);
+                            fields.push(col.field);
+                        }
+                    });
+                    var exportData = {};
+                    $.each($('#search-box [name]').serializeArray(), function() {
+                        exportData[this.name] = this.value;
+                    });
+                    var param = {
+                        'wrkLastno': exportData,
+                        'fields': fields
+                    };
+                    $.ajax({
+                        url: baseUrl+"/wrkLastno/export/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: JSON.stringify(param),
+                        dataType:'json',
+                        contentType:'application/json;charset=UTF-8',
+                        method: 'POST',
+                        success: function (res) {
+                            layer.closeAll();
+                            if (res.code === 200) {
+                                table.exportFile(titles,res.data,'xls');
+                            } else if (res.code === 403) {
+                                top.location.href = baseUrl+"/";
+                            } else {
+                                layer.msg(res.msg)
+                            }
+                        }
+                    });
+                });
+                break;
+        }
+    });
+
+    // 鐩戝惉琛屽伐鍏蜂簨浠�
+    table.on('tool(stoQue)', function(obj) {
+        var data = obj.data;
+        switch (obj.event) {
+            // 鏌ョ湅鏄庣粏
+            case 'locDetl':
+                // locDetl(data.locNo);
+                if (data.locSts.trim() === ''
+                    || data.locSts.trim() === 'S'
+                    || data.locSts.trim() === 'D'
+                    || data.locSts.trim() === 'O')  {
+                    layer.msg("姝ゅ簱浣嶇殑鐘舵�佷笉瀛樺湪鐗╂枡");
+                    return;
+                }
+                locDetlToLayer(data.locNo);
+                break;
+        }
+    });
+
+    // iframe鐗╂枡璇︽儏
+    function locDetlToLayer(val) {
+        locNo = val;
+        layer.open({
+            type: 2,
+            title: '搴撳瓨鏄庣粏',
+            maxmin: true,
+            area: [top.detailWidth, top.detailHeight],
+            shadeClose: true,
+            content: '../report/locDetl.html',
+            success: function(layero, index){
+            }
+        });
+    }
+    // div鐗╂枡璇︽儏
+    var pageCur;
+    function locDetl(locNo){
+        $('#detlTable').css("display", 'block');
+        // 鏁版嵁娓叉煋
+        tableIns1 = table.render({
+            elem: '#locDetlByMap',
+            headers: {token: localStorage.getItem('token')},
+            url: baseUrl+'/locDetl/list/auth',
+            page: true,
+            limit: 5,
+            skin: 'line',
+            where: {loc_no: locNo},
+            even: true,
+            cellMinWidth: 50,
+            cols: [[
+                // {type: 'checkbox'}
+                {field: 'locNo$', align: 'center',title: '搴撲綅鍙�'}
+                ,{field: 'matnr', align: 'center',title: '鐗╂枡'}
+                ,{field: 'lgnum', align: 'center',title: '浠撳簱鍙�'}
+                ,{field: 'tbnum', align: 'center',title: '杞偍璇锋眰缂栧彿'}
+                // ,{field: 'tbpos', align: 'center',title: '琛岄」鐩�'}
+                ,{field: 'zmatid', align: 'center',title: '鐗╂枡鏍囩ID'}
+                ,{field: 'maktx', align: 'center',title: '鐗╂枡鎻忚堪'}
+                ,{field: 'werks', align: 'center',title: '宸ュ巶'}
+                ,{field: 'anfme', align: 'center',title: '鏁伴噺'}
+                ,{field: 'altme', align: 'center',title: '鍗曚綅'}
+                ,{field: 'zpallet', align: 'center',title: '鎵樼洏鏉$爜'}
+                ,{field: 'bname', align: 'center',title: '鐢ㄦ埛ID'}
+            ]],
+            request: {
+                pageName: 'curr',
+                pageSize: 'limit'
+            },
+            parseData: function (res) {
+                return {
+                    'code': res.code,
+                    'msg': res.msg,
+                    'count': res.data.total,
+                    'data': res.data.records
+                }
+            },
+            response: {
+                statusCode: 200
+            },
+            done: function(res, curr, count) {
+                if (res.code === 403) {
+                    top.location.href = baseUrl+"/";
+                }
+                pageCur=curr;
+                form.on('checkbox(tableCheckbox)', function (data) {
+                    var _index = $(data.elem).attr('table-index')||0;
+                    if(data.elem.checked){
+                        res.data[_index][data.value] = 'Y';
+                    }else{
+                        res.data[_index][data.value] = 'N';
+                    }
+                });
+            }
+        });
+    }
+
+    // 鎼滅储鏍忛噸缃簨浠�
+    form.on('submit(reset)', function (data) {
+        pageCurr = 1;
+        clearFormVal($('#search-box'));
+        $('#detlTable').css("display", 'none');
+        tableReload(false);
+    });
+
+    // 鎼滅储鏍忔悳绱簨浠�
+    form.on('submit(search)', function (data) {
+        pageCurr = 1;
+        $('#detlTable').css("display", 'none');
+        tableReload(false);
+    });
+
+    function tableReload(child) {
+        var searchData = {};
+        $.each($('#search-box [name]').serializeArray(), function() {
+            searchData[this.name] = this.value;
+        });
+        (child ? parent.tableIns : tableIns).reload({
+            where: searchData,
+            page: {
+                curr: pageCurr
+            },
+            done: function (res, curr, count) {
+                if (res.code === 403) {
+                    top.location.href = baseUrl+"/";
+                }
+                pageCurr=curr;
+                if (count === 1){
+                    // locDetl(res.data[0][locNo]);
+                }
+                if (res.data.length === 0 && count !== 0) {
+                    tableIns.reload({
+                        where: searchData,
+                        page: {
+                            curr: pageCurr-1
+                        }
+                    });
+                    pageCurr -= 1;
+                }
+                limit(child);
+            }
+        });
+    }
+});
+
+// 鍏抽棴鍔ㄤ綔
+$(document).on('click','#data-detail-close', function () {
+    parent.layer.closeAll();
+});
+
+function setFormVal(el, data, showImg) {
+    for (var val in data) {
+        var find = el.find(":input[id='" + val + "']");
+        find.val(data[val]);
+        if (showImg){
+            var next = find.next();
+            if (next.get(0)){
+                if (next.get(0).localName === "img") {
+                    find.hide();
+                    next.attr("src", data[val]);
+                    next.show();
+                }
+            }
+        }
+    }
+}
+
+function clearFormVal(el) {
+    $(':input', el)
+        .val('')
+        .removeAttr('checked')
+        .removeAttr('selected');
+}
+
+function detailScreen(index) {
+    var detail = layer.getChildFrame('#data-detail', index);
+    var height = detail.height()+60;
+    if (height > ($(window).height()*0.9)) {
+        height = ($(window).height()*0.9);
+    }
+    layer.style(index, {
+        top: (($(window).height()-height)/3)+"px",
+        height: height+'px'
+    });
+    $(".layui-layer-shade").remove();
+}
+
+$('body').keydown(function () {
+    if (event.keyCode === 13) {
+        $("#search").click();
+    }
+});
diff --git a/src/main/webapp/views/stoMan/stoQue.html b/src/main/webapp/views/stoMan/stoQue.html
new file mode 100644
index 0000000..897b0dc
--- /dev/null
+++ b/src/main/webapp/views/stoMan/stoQue.html
@@ -0,0 +1,85 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title></title>
+    <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">
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/common.css" media="all">
+    <style>
+        #btn-export {
+        }
+        #refresh-sto {
+            display: none;
+        }
+        .loc-detl {
+            display: none;
+        }
+        #detlTable {
+            margin-top: 20px;
+        }
+    </style>
+</head>
+<body>
+
+<!-- 鎼滅储鏍� -->
+<div id="search-box" class="layui-form layui-card-header">
+    <div class="layui-inline">
+        <div class="layui-input-inline">
+            <input class="layui-input" type="text" name="loc_no" placeholder="搴撲綅鍙�" autocomplete="off">
+        </div>
+    </div>
+    <div class="layui-inline">
+        <div class="layui-input-inline">
+            <input class="layui-input" type="text" name="loc_sts" placeholder="搴撲綅鐘舵��" autocomplete="off">
+        </div>
+    </div>
+    <div class="layui-inline">
+        <div class="layui-input-inline">
+            <input class="layui-input" type="text" name="barcode" placeholder="鎵樼洏鐮�" autocomplete="off">
+        </div>
+    </div>
+    <!-- 鏃ユ湡鑼冨洿 -->
+    <div class="layui-inline" style="width: 300px">
+        <div class="layui-input-inline">
+            <input class="layui-input layui-laydate-range" name="modi_time" type="text" placeholder="璧峰鏃堕棿 - 缁堟鏃堕棿" autocomplete="off" style="width: 300px">
+        </div>
+    </div>
+    <!-- 寰呮坊鍔� -->
+    <div id="data-search-btn" class="layui-btn-container layui-form-item" style="display: inline-block">
+        <button id="search" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="search">鎼滅储</button>
+        <button id="reset" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="reset">閲嶇疆</button>
+    </div>
+</div>
+<script type="text/html" id="toolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData">瀵煎嚭</button>
+    </div>
+</script>
+<!-- 琛ㄦ牸 -->
+<table class="layui-hide" id="stoQue" lay-filter="stoQue"></table>
+
+<script type="text/html" id="operate">
+    <a class="layui-btn layui-btn-xs loc-detl" lay-event="locDetl">鏌ョ湅鏄庣粏</a>
+</script>
+
+<!--鏄庣粏琛�-->
+<div id="detlTable" style="display: none">
+    <div class="layui-inline"  style="width:90%;margin-top: 10px;margin-left: 20px">
+        <span style=" color: indianred">浠ヤ笅涓哄綋鍓嶅簱浣嶇殑鐗╂枡鏄庣粏</span>
+    </div>
+
+    <table class="layui-hide" id="locDetlByMap" lay-filter="locDetlByMap"></table>
+</div>
+
+<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/stoMan/stoQue.js" charset="utf-8"></script>
+</body>
+</html>
+
diff --git a/src/main/webapp/views/tpl/alarm-detl.html b/src/main/webapp/views/tpl/alarm-detl.html
new file mode 100644
index 0000000..1539922
--- /dev/null
+++ b/src/main/webapp/views/tpl/alarm-detl.html
@@ -0,0 +1,52 @@
+<style>
+    pre {
+        font-family: 'DejaVu Sans Mono','Courier New',monospace;
+        padding: 15px 10px;
+        line-height: 17px;
+        margin: 5px;
+        word-wrap: break-word;
+        border: solid 1px #9e9e9e;
+        border-radius: 3px;
+        color: #729fcf;
+    }
+    .string { color: #4e9a06; }
+    .number { color: #ad7fa8; }
+    .boolean { color: #c4a000; }
+    .null { color: #babdb6; }
+    .key { color: #204a87; }
+</style>
+
+<div style="padding: 25px 25px 15px 25px;" id="callbackDialog">
+    <fieldset class="layui-elem-field layui-field-title">
+        <legend>鍩虹淇℃伅</legend>
+    </fieldset>
+    <div class="layui-text" style="margin-bottom: 5px;">
+        浜嬩欢缂栧彿锛歿{d.request}}<br />
+        璁惧缂栧彿锛歿{d.response.sensorId$}}<br />
+        璁惧绫诲瀷锛歿{d.response.sensorType$}}<br />
+    </div>
+    <fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">
+        <legend>鎶ヨ淇℃伅</legend>
+    </fieldset>
+    <div class="layui-text" style="margin-bottom: 5px;">
+        鍙戦�佹椂闂达細{{d.response.createTime$}}<br />
+        鏁呴殰鎻忚堪锛歿{d.response.desc}}<br />
+    </div>
+    <div class="text-center" style="padding-top: 15px;text-align: right">
+        <button class="layui-btn layui-btn-normal" ew-event="closeDialog">鍏抽棴</button>
+    </div>
+</div>
+
+<!-- js閮ㄥ垎 -->
+<script>
+    layui.config({
+        base: baseUrl + "/static/layui/lay/modules/"
+    }).use(['layer', 'admin'], function () {
+        var $ = layui.jquery;
+        var layer = layui.layer;
+        var admin = layui.admin;
+
+        var layerData = admin.getLayerData('#callbackDialog');
+    });
+
+</script>
diff --git a/src/main/webapp/views/tpl/theme/img/ic_loading.gif b/src/main/webapp/views/tpl/theme/img/ic_loading.gif
new file mode 100644
index 0000000..071ecd6
--- /dev/null
+++ b/src/main/webapp/views/tpl/theme/img/ic_loading.gif
Binary files differ
diff --git a/src/main/webapp/views/tpl/theme/img/icon_date.png b/src/main/webapp/views/tpl/theme/img/icon_date.png
new file mode 100644
index 0000000..5a50673
--- /dev/null
+++ b/src/main/webapp/views/tpl/theme/img/icon_date.png
Binary files differ
diff --git a/src/main/webapp/views/tpl/theme/img/icon_search.png b/src/main/webapp/views/tpl/theme/img/icon_search.png
new file mode 100644
index 0000000..7db69d2
--- /dev/null
+++ b/src/main/webapp/views/tpl/theme/img/icon_search.png
Binary files differ
diff --git a/src/main/webapp/views/tpl/theme/img/theme-admin.png b/src/main/webapp/views/tpl/theme/img/theme-admin.png
new file mode 100644
index 0000000..6b4696f
--- /dev/null
+++ b/src/main/webapp/views/tpl/theme/img/theme-admin.png
Binary files differ
diff --git a/src/main/webapp/views/tpl/theme/img/theme-blue.png b/src/main/webapp/views/tpl/theme/img/theme-blue.png
new file mode 100644
index 0000000..33c9d24
--- /dev/null
+++ b/src/main/webapp/views/tpl/theme/img/theme-blue.png
Binary files differ
diff --git a/src/main/webapp/views/tpl/theme/img/theme-colorful.png b/src/main/webapp/views/tpl/theme/img/theme-colorful.png
new file mode 100644
index 0000000..2cbeba0
--- /dev/null
+++ b/src/main/webapp/views/tpl/theme/img/theme-colorful.png
Binary files differ
diff --git a/src/main/webapp/views/tpl/theme/img/theme-cyan.png b/src/main/webapp/views/tpl/theme/img/theme-cyan.png
new file mode 100644
index 0000000..368c04f
--- /dev/null
+++ b/src/main/webapp/views/tpl/theme/img/theme-cyan.png
Binary files differ
diff --git a/src/main/webapp/views/tpl/theme/img/theme-green.png b/src/main/webapp/views/tpl/theme/img/theme-green.png
new file mode 100644
index 0000000..f7a5ca5
--- /dev/null
+++ b/src/main/webapp/views/tpl/theme/img/theme-green.png
Binary files differ
diff --git a/src/main/webapp/views/tpl/theme/img/theme-my.png b/src/main/webapp/views/tpl/theme/img/theme-my.png
new file mode 100644
index 0000000..9fd7419
--- /dev/null
+++ b/src/main/webapp/views/tpl/theme/img/theme-my.png
Binary files differ
diff --git a/src/main/webapp/views/tpl/theme/img/theme-pink.png b/src/main/webapp/views/tpl/theme/img/theme-pink.png
new file mode 100644
index 0000000..6088b1e
--- /dev/null
+++ b/src/main/webapp/views/tpl/theme/img/theme-pink.png
Binary files differ
diff --git a/src/main/webapp/views/tpl/theme/img/theme-purple.png b/src/main/webapp/views/tpl/theme/img/theme-purple.png
new file mode 100644
index 0000000..072f439
--- /dev/null
+++ b/src/main/webapp/views/tpl/theme/img/theme-purple.png
Binary files differ
diff --git a/src/main/webapp/views/tpl/theme/img/theme-red.png b/src/main/webapp/views/tpl/theme/img/theme-red.png
new file mode 100644
index 0000000..db9922e
--- /dev/null
+++ b/src/main/webapp/views/tpl/theme/img/theme-red.png
Binary files differ
diff --git a/src/main/webapp/views/tpl/theme/img/theme-white.png b/src/main/webapp/views/tpl/theme/img/theme-white.png
new file mode 100644
index 0000000..4b4cb1f
--- /dev/null
+++ b/src/main/webapp/views/tpl/theme/img/theme-white.png
Binary files differ
diff --git a/src/main/webapp/views/tpl/tpl-note.html b/src/main/webapp/views/tpl/tpl-note.html
new file mode 100644
index 0000000..5910e86
--- /dev/null
+++ b/src/main/webapp/views/tpl/tpl-note.html
@@ -0,0 +1,206 @@
+<div class="layui-card-header">鏈湴渚跨</div>
+<div class="note-wrapper"></div>
+<div class="note-empty">
+    <i class="layui-icon layui-icon-face-surprised"></i>
+    <p>娌℃湁渚跨</p>
+</div>
+<div class="btn-circle" id="noteAddBtn" title="娣诲姞渚跨" style="position: absolute;">
+    <i class="layui-icon layui-icon-add-1"></i>
+</div>
+
+<script>
+    layui.use(['layer', 'form', 'util', 'admin'], function () {
+        var $ = layui.jquery;
+        var layer = layui.layer;
+        var util = layui.util;
+        var admin = layui.admin;
+        var dataList = [];  // 渚跨鍒楄〃
+        var $noteWrapper = $('.note-wrapper');
+
+        /* 娓叉煋鍒楄〃 */
+        function renderList() {
+            $noteWrapper.empty();
+            dataList = layui.data(admin.setter.tableName).notes;
+            if (dataList === undefined) dataList = [];
+            for (var i = 0; i < dataList.length; i++) {
+                var item = dataList[i];
+                $noteWrapper.prepend([
+                    '<div class="note-item" data-id="', item.id, '">',
+                    '   <div class="note-item-content">', util.escape(item.content), '</div>',
+                    '   <div class="note-item-time">', item.time, '</div>',
+                    '   <i class="layui-icon layui-icon-close-fill note-item-del"></i>',
+                    '</div>'
+                ].join(''));
+            }
+            $('.note-empty').css('display', dataList.length === 0 ? 'block' : 'none');
+            // 鐐瑰嚮淇敼
+            $('.note-item').click(function () {
+                var index = parseInt($(this).attr('data-id'));
+                showNote(dataList[index]);
+            });
+            // 鐐瑰嚮鍒犻櫎
+            $('.note-item-del').click(function (e) {
+                var id = parseInt($(this).parent().attr('data-id'));
+                layer.confirm('纭鍒犻櫎鍚楋紵', {
+                    skin: 'layui-layer-admin',
+                    shade: .1,
+                    shadeClose: true
+                }, function (index) {
+                    layer.close(index);
+                    dataList.splice(id, 1);
+                    for (var i = 0; i < dataList.length; i++) dataList[i].id = i;
+                    putDataList();
+                    renderList();
+                });
+                e.stopPropagation();
+            });
+        }
+
+        renderList();
+
+        /* 娣诲姞 */
+        $('#noteAddBtn').click(function () {
+            showNote();
+        });
+
+        // 鏄剧ず缂栬緫寮圭獥
+        function showNote(data) {
+            var id = data ? data.id : undefined, content = data ? data.content : '';
+            admin.open({
+                id: 'layer-note-edit',
+                title: '渚跨',
+                type: 1,
+                area: 'auto',
+                offset: '50px',
+                shadeClose: true,
+                content: '<textarea id="noteEditText" placeholder="璇疯緭鍏ュ唴瀹�" style="width: 280px;height: 150px;border: none;color: #666666;word-wrap: break-word;padding: 10px 20px;resize: vertical;">' + content + '</textarea>',
+                success: function () {
+                    $('#noteEditText').change(function () {
+                        content = $(this).val();
+                    });
+                },
+                end: function () {
+                    if (id !== undefined) {
+                        if (!content) {
+                            dataList.splice(id, 1);
+                            for (var i = 0; i < dataList.length; i++) dataList[i].id = i;
+                        } else if (content !== dataList[id].content) {
+                            dataList[id].content = content;
+                            dataList[id].time = util.toDateString(new Date(), 'yyyy-MM-dd HH:mm');
+                        }
+                    } else if (content) {
+                        dataList.push({
+                            id: dataList.length, content: content,
+                            time: util.toDateString(new Date(), 'yyyy-MM-dd HH:mm')
+                        });
+                    }
+                    putDataList();
+                    renderList();
+                }
+            });
+        }
+
+        /* 鏇存柊鏈湴缂撳瓨 */
+        function putDataList() {
+            layui.data(admin.setter.tableName, {key: 'notes', value: dataList});
+        }
+
+    });
+</script>
+
+<style>
+    .note-wrapper {
+        padding: 15px 0 15px 15px;
+        background-color: #fbfbfb;
+        position: absolute;
+        top: 43px;
+        left: 0;
+        right: 0;
+        bottom: 0;
+        overflow-y: auto;
+        -webkit-overflow-scrolling: touch;
+    }
+
+    .note-wrapper .note-item {
+        display: inline-block;
+        width: 110px;
+        padding: 12px;
+        cursor: pointer;
+        position: relative;
+        border-radius: 8px;
+        margin: 0 15px 15px 0;
+        border: 1px solid #eeeeee;
+        background-color: #ffffff;
+        -webkit-user-select: none;
+        -moz-user-select: none;
+        -ms-user-select: none;
+        user-select: none;
+        -webkit-transition: all .3s ease;
+        -moz-transition: all .3s ease;
+        -ms-transition: all .3s ease;
+        -o-transition: all .3s ease;
+        transition: all .3s ease;
+    }
+
+    .note-wrapper .note-item:hover {
+        box-shadow: 0 0 8px rgba(0, 0, 0, .05);
+        -webkit-transform: scale(1.02);
+        -moz-transform: scale(1.02);
+        -ms-transform: scale(1.02);
+        -o-transform: scale(1.02);
+        transform: scale(1.02);
+    }
+
+    .note-wrapper .note-item .note-item-content {
+        color: #666;
+        height: 80px;
+        font-size: 14px;
+        overflow: hidden;
+        word-break: break-all;
+    }
+
+    .note-wrapper .note-item .note-item-time {
+        color: #999;
+        font-size: 12px;
+        margin-top: 8px;
+    }
+
+    .note-wrapper .note-item .note-item-del {
+        position: absolute;
+        top: 2px;
+        right: 2px;
+        color: #FF5722;
+        font-size: 24px;
+        height: 24px;
+        width: 24px;
+        background-color: #fff;
+        border-radius: 50%;
+        visibility: hidden;
+        -webkit-transition: all .3s ease;
+        -moz-transition: all .3s ease;
+        -ms-transition: all .3s ease;
+        -o-transition: all .3s ease;
+        transition: all .3s ease;
+        opacity: 0;
+    }
+
+    .note-wrapper .note-item:hover .note-item-del {
+        visibility: visible;
+        opacity: 1;
+    }
+
+    .note-empty {
+        color: #999;
+        padding: 80px 0;
+        text-align: center;
+        display: none;
+        position: relative;
+        z-index: 1
+    }
+
+    .note-empty .layui-icon {
+        font-size: 60px;
+        margin-bottom: 10px;
+        display: inline-block;
+    }
+</style>
\ No newline at end of file
diff --git a/src/main/webapp/views/tpl/tpl-theme.html b/src/main/webapp/views/tpl/tpl-theme.html
new file mode 100644
index 0000000..7a1add0
--- /dev/null
+++ b/src/main/webapp/views/tpl/tpl-theme.html
@@ -0,0 +1,229 @@
+<div class="layui-card-header">涓婚璁剧疆</div>
+<div class="more-theme-list">
+    <div class="more-theme-item" data-theme="theme-normal">
+        <img src="tpl/theme/img/theme-admin.png"/>
+    </div>
+    <div class="more-theme-item" data-theme="theme-cyan">
+        <img src="tpl/theme/img/theme-cyan.png"/>
+    </div>
+    <div class="more-theme-item" data-theme="theme-white">
+        <img src="tpl/theme/img/theme-white.png"/>
+    </div>
+    <div class="more-theme-item" data-theme="theme-pink">
+        <img src="tpl/theme/img/theme-pink.png"/>
+    </div>
+    <div class="more-theme-item active" data-theme="theme-colorful">
+        <img src="tpl/theme/img/theme-colorful.png"/>
+    </div>
+    <div class="more-theme-item" data-theme="theme-blue">
+        <img src="tpl/theme/img/theme-blue.png"/>
+    </div>
+    <div class="more-theme-item" data-theme="theme-green">
+        <img src="tpl/theme/img/theme-green.png"/>
+    </div>
+    <div class="more-theme-item" data-theme="theme-purple">
+        <img src="tpl/theme/img/theme-purple.png"/>
+    </div>
+<!--    <div class="more-theme-item" data-theme="theme-red">-->
+<!--        <img src="tpl/theme/img/theme-red.png"/>-->
+<!--    </div>-->
+    <div class="more-theme-item" data-theme="theme-my">
+        <img src="tpl/theme/img/theme-my.png"/>
+    </div>
+</div>
+<!-- 瀵艰埅 -->
+<div class="more-menu-list">
+<!--    <a class="more-menu-item" href="https://easyweb.vip/doc/" target="_blank">-->
+<!--        <i class="layui-icon layui-icon-read" style="font-size: 19px;"></i> 寮�鍙戞枃妗�-->
+<!--    </a>-->
+<!--    <a class="more-menu-item" href="https://demo.easyweb.vip/spa" target="_blank">-->
+<!--        <i class="layui-icon layui-icon-tabs" style="font-size: 16px;"></i> &nbsp;spa鐗堟湰-->
+<!--    </a>-->
+<!--    <a class="more-menu-item" href="https://demo.easyweb.vip/theme" target="_blank">-->
+<!--        <i class="layui-icon layui-icon-theme"></i> 涓婚鐢熸垚鍣�-->
+<!--    </a>-->
+</div>
+<!-- 鎺у埗寮�鍏� -->
+<div class="layui-form" style="margin: 25px 0;" lay-filter="more-set-form">
+    <div class="layui-form-item">
+        <label class="set-item-label">椤�&emsp;鑴氾細</label>
+        <div class="set-item-ctrl">
+            <input id="setFooter" lay-filter="setFooter" type="checkbox" lay-skin="switch" lay-text="寮�鍚瘄鍏抽棴">
+        </div>
+        <label class="set-item-label"> Tab&nbsp;璁板繂锛�</label>
+        <div class="set-item-ctrl">
+            <input id="setTab" lay-filter="setTab" type="checkbox" lay-skin="switch" lay-text="寮�鍚瘄鍏抽棴">
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="set-item-label">澶氭爣绛撅細</label>
+        <div class="set-item-ctrl">
+            <input id="setMoreTab" lay-filter="setMoreTab" type="checkbox" lay-skin="switch" lay-text="寮�鍚瘄鍏抽棴">
+        </div>
+        <label class="set-item-label">鍒囨崲鍒锋柊锛�</label>
+        <div class="set-item-ctrl">
+            <input id="setRefresh" lay-filter="setRefresh" type="checkbox" lay-skin="switch" lay-text="寮�鍚瘄鍏抽棴">
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="set-item-label">瀵艰埅绠ご锛�</label>
+        <div class="set-item-ctrl">
+            <input lay-filter="navArrow" type="radio" value="" title="榛樿" name="navArrow">
+            <input lay-filter="navArrow" type="radio" value="arrow2" title="绠ご" name="navArrow">
+            <input lay-filter="navArrow" type="radio" value="arrow3" title="鍔犲彿" name="navArrow">
+        </div>
+    </div>
+</div>
+
+<script>
+    layui.use(['form', 'admin'], function () {
+        var $ = layui.jquery;
+        var form = layui.form;
+        var admin = layui.admin;
+        var setter = admin.setter;
+        var $body = $('body');
+
+        // 鍒囨崲涓婚
+        var $themItem = $('.more-theme-item');
+        $themItem.click(function () {
+            $themItem.removeClass('active');
+            $(this).addClass('active');
+            admin.changeTheme($(this).data('theme'));
+        });
+        var theme = $body.data('theme');
+        if (theme) {
+            $themItem.removeClass('active');
+            $themItem.filter('[data-theme="' + theme + '"]').addClass('active');
+        }
+
+        // 鍏抽棴/寮�鍚〉鑴�
+        form.on('switch(setFooter)', function (data) {
+            var checked = data.elem.checked;
+            admin.putSetting('closeFooter', !checked);
+            checked ? $body.removeClass('close-footer') : $body.addClass('close-footer');
+        });
+        $('#setFooter').prop('checked', !$body.hasClass('close-footer'));
+
+        // 鍏抽棴/寮�鍚疶ab璁板繂鍔熻兘
+        form.on('switch(setTab)', function (data) {
+            layui.index.setTabCache(data.elem.checked);
+        });
+        $('#setTab').prop('checked', setter.cacheTab);
+
+        // 鍏抽棴/寮�鍚鏍囩
+        form.on('switch(setMoreTab)', function (data) {
+            var checked = data.elem.checked;
+            admin.putSetting('pageTabs', checked);
+            admin.putTempData('indexTabs', undefined);
+            location.reload();
+        });
+        $('#setMoreTab').prop('checked', setter.pageTabs);
+
+        // 鍒囨崲Tab鑷姩鍒锋柊
+        var $mainTab = $('.layui-body>.layui-tab[lay-filter="admin-pagetabs"]');
+        form.on('switch(setRefresh)', function (data) {
+            var checked = data.elem.checked;
+            admin.putSetting('tabAutoRefresh', checked);
+            checked ? $mainTab.attr('lay-autoRefresh', 'true') : $mainTab.removeAttr('lay-autoRefresh');
+        });
+        $('#setRefresh').prop('checked', setter.tabAutoRefresh === true);
+
+        // 瀵艰埅灏忎笁瑙�
+        var $leftNav = $('.layui-layout-admin>.layui-side>.layui-side-scroll>.layui-nav');
+        form.on('radio(navArrow)', function (data) {
+            $leftNav.removeClass('arrow2 arrow3');
+            data.value && $leftNav.addClass(data.value);
+            admin.putSetting('navArrow', data.value);
+        });
+        var navArrow = $leftNav.hasClass('arrow2') ? 'arrow2' : $leftNav.hasClass('arrow3') ? 'arrow3' : '';
+        $('[name="navArrow"][value="' + navArrow + '"]').prop('checked', true);
+
+        form.render('radio', 'more-set-form');
+        form.render('checkbox', 'more-set-form');
+    });
+</script>
+
+<style>
+    /* theme */
+    .more-theme-list {
+        padding-left: 15px;
+        padding-top: 20px;
+        margin-bottom: 10px;
+    }
+
+    .more-theme-item {
+        padding: 4px;
+        margin: 0 6px 15px 0;
+        display: inline-block;
+        border: 1px solid transparent;
+    }
+
+    .more-theme-item img {
+        width: 80px;
+        height: 50px;
+        background: #f5f7f9;
+        box-sizing: border-box;
+        border: 1px solid #f5f7f9;
+        cursor: pointer;
+    }
+
+    .more-theme-item:hover, .more-theme-item.active {
+        border-color: #5FB878;
+    }
+
+    .more-menu-item {
+        color: #595959;
+        height: 50px;
+        line-height: 50px;
+        font-size: 16px;
+        padding: 0 25px;
+        border-bottom: 1px solid #e8e8e8;
+        font-style: normal;
+        display: block;
+    }
+
+    /* menu */
+    .more-menu-item:first-child {
+        border-top: 1px solid #e8e8e8;
+    }
+
+    .more-menu-item:hover {
+        color: #595959;
+        background: #f6f6f6;
+    }
+
+    .more-menu-item .layui-icon {
+        font-size: 18px;
+        padding-right: 10px;
+    }
+
+    .more-menu-item:after {
+        color: #8c8c8c;
+        right: 16px;
+        content: "\e602";
+        position: absolute;
+        font-family: layui-icon !important;
+    }
+
+    .more-menu-item.no-icon:after {
+        display: none;
+    }
+
+    /* setting from */
+    .set-item-label {
+        height: 38px;
+        line-height: 38px;
+        padding-left: 20px;
+        display: inline-block;
+    }
+
+    .set-item-ctrl {
+        height: 38px;
+        line-height: 38px;
+        display: inline-block;
+    }
+
+    .set-item-ctrl > * {
+        margin: 0 !important;
+    }
+</style>

--
Gitblit v1.9.1