baolei 3 недель назад
Родитель
Сommit
360d9cdd36
88 измененных файлов с 5458 добавлено и 1846 удалено
  1. 49 0
      pom.xml
  2. 19 0
      src/main/java/com/qryord/QryOrdApplication.java
  3. 2 2
      src/main/java/com/qryord/QryOrdServletInitializer.java
  4. 0 30
      src/main/java/com/qryord/RuoYiApplication.java
  5. 25 0
      src/main/java/com/qryord/common/constant/Constants.java
  6. 30 0
      src/main/java/com/qryord/common/enums/EDelete.java
  7. 30 0
      src/main/java/com/qryord/common/enums/EQueryStatus.java
  8. 31 0
      src/main/java/com/qryord/common/enums/EQueryType.java
  9. 21 0
      src/main/java/com/qryord/common/enums/ERole.java
  10. 21 0
      src/main/java/com/qryord/common/enums/EYesNo.java
  11. 13 0
      src/main/java/com/qryord/common/utils/DateUtils.java
  12. 107 0
      src/main/java/com/qryord/common/utils/MailUtil.java
  13. 107 9
      src/main/java/com/qryord/common/utils/http/HttpUtils.java
  14. 16 0
      src/main/java/com/qryord/framework/config/MailConfig.java
  15. 32 3
      src/main/java/com/qryord/framework/web/domain/BaseEntity.java
  16. 10 0
      src/main/java/com/qryord/mp/common/AccessTokenDTO.java
  17. 20 0
      src/main/java/com/qryord/mp/common/ApiException.java
  18. 25 0
      src/main/java/com/qryord/mp/common/BaseApiController.java
  19. 21 0
      src/main/java/com/qryord/mp/common/BaseReq.java
  20. 26 0
      src/main/java/com/qryord/mp/common/BusinessException.java
  21. 22 0
      src/main/java/com/qryord/mp/common/LocaleMessageUtil.java
  22. 95 0
      src/main/java/com/qryord/mp/common/RespResultModel.java
  23. 22 0
      src/main/java/com/qryord/mp/common/UserContext.java
  24. 94 0
      src/main/java/com/qryord/mp/common/WxUtil.java
  25. 353 0
      src/main/java/com/qryord/mp/controller/QueryApiController.java
  26. 97 0
      src/main/java/com/qryord/mp/controller/UserApiController.java
  27. 27 0
      src/main/java/com/qryord/mp/model/ModelKindResp.java
  28. 25 0
      src/main/java/com/qryord/mp/model/ModelResp.java
  29. 37 0
      src/main/java/com/qryord/mp/model/QueryHisResp.java
  30. 31 0
      src/main/java/com/qryord/mp/model/QueryReq.java
  31. 63 0
      src/main/java/com/qryord/mp/model/QueryResp.java
  32. 28 0
      src/main/java/com/qryord/mp/model/RoleFieldResp.java
  33. 43 0
      src/main/java/com/qryord/mp/model/UserReq.java
  34. 44 0
      src/main/java/com/qryord/mp/model/UserResp.java
  35. 10 0
      src/main/java/com/qryord/mp/service/SysUserServiceI.java
  36. 66 0
      src/main/java/com/qryord/mp/service/impl/SysUserServiceImpl.java
  37. 137 0
      src/main/java/com/qryord/project/business/query/controller/TQueryController.java
  38. 63 0
      src/main/java/com/qryord/project/business/query/domain/TQuery.java
  39. 62 0
      src/main/java/com/qryord/project/business/query/mapper/TQueryMapper.java
  40. 62 0
      src/main/java/com/qryord/project/business/query/service/ITQueryService.java
  41. 98 0
      src/main/java/com/qryord/project/business/query/service/impl/TQueryServiceImpl.java
  42. 147 0
      src/main/java/com/qryord/project/master/field/controller/MFieldController.java
  43. 35 0
      src/main/java/com/qryord/project/master/field/domain/MField.java
  44. 69 0
      src/main/java/com/qryord/project/master/field/mapper/MFieldMapper.java
  45. 69 0
      src/main/java/com/qryord/project/master/field/service/IMFieldService.java
  46. 196 0
      src/main/java/com/qryord/project/master/field/service/impl/MFieldServiceImpl.java
  47. 156 0
      src/main/java/com/qryord/project/master/model/controller/ModelController.java
  48. 37 0
      src/main/java/com/qryord/project/master/model/domain/Model.java
  49. 62 0
      src/main/java/com/qryord/project/master/model/mapper/ModelMapper.java
  50. 62 0
      src/main/java/com/qryord/project/master/model/service/IModelService.java
  51. 98 0
      src/main/java/com/qryord/project/master/model/service/impl/ModelServiceImpl.java
  52. 124 0
      src/main/java/com/qryord/project/master/modelKind/controller/ModelKindController.java
  53. 32 0
      src/main/java/com/qryord/project/master/modelKind/domain/ModelKind.java
  54. 62 0
      src/main/java/com/qryord/project/master/modelKind/mapper/ModelKindMapper.java
  55. 62 0
      src/main/java/com/qryord/project/master/modelKind/service/IModelKindService.java
  56. 98 0
      src/main/java/com/qryord/project/master/modelKind/service/impl/ModelKindServiceImpl.java
  57. 165 0
      src/main/java/com/qryord/project/master/roleField/controller/RoleFieldController.java
  58. 40 0
      src/main/java/com/qryord/project/master/roleField/domain/RoleField.java
  59. 79 0
      src/main/java/com/qryord/project/master/roleField/mapper/RoleFieldMapper.java
  60. 87 0
      src/main/java/com/qryord/project/master/roleField/service/IRoleFieldService.java
  61. 160 0
      src/main/java/com/qryord/project/master/roleField/service/impl/RoleFieldServiceImpl.java
  62. 7 3
      src/main/resources/application-druid.yml
  63. 1 1
      src/main/resources/application.yml
  64. 118 0
      src/main/resources/mybatis/business/TQueryMapper.xml
  65. 100 0
      src/main/resources/mybatis/master/MFieldMapper.xml
  66. 77 0
      src/main/resources/mybatis/master/ModelKindMapper.xml
  67. 90 0
      src/main/resources/mybatis/master/ModelMapper.xml
  68. 107 0
      src/main/resources/mybatis/master/RoleFieldMapper.xml
  69. 82 0
      src/main/resources/templates/business/query/add.html
  70. 83 0
      src/main/resources/templates/business/query/edit.html
  71. 129 0
      src/main/resources/templates/business/query/query.html
  72. 2 2
      src/main/resources/templates/index.html
  73. 15 16
      src/main/resources/templates/login.html
  74. 0 1776
      src/main/resources/templates/main.html
  75. 31 0
      src/main/resources/templates/master/field/add.html
  76. 32 0
      src/main/resources/templates/master/field/edit.html
  77. 117 0
      src/main/resources/templates/master/field/field.html
  78. 41 0
      src/main/resources/templates/master/model/add.html
  79. 42 0
      src/main/resources/templates/master/model/edit.html
  80. 98 0
      src/main/resources/templates/master/model/model.html
  81. 31 0
      src/main/resources/templates/master/modelKind/add.html
  82. 32 0
      src/main/resources/templates/master/modelKind/edit.html
  83. 86 0
      src/main/resources/templates/master/modelKind/modelKind.html
  84. 40 0
      src/main/resources/templates/master/roleField/add.html
  85. 41 0
      src/main/resources/templates/master/roleField/edit.html
  86. 128 0
      src/main/resources/templates/master/roleField/roleField.html
  87. 2 2
      src/main/resources/templates/system/user/add.html
  88. 2 2
      src/main/resources/templates/system/user/edit.html

+ 49 - 0
pom.xml

@@ -234,7 +234,56 @@
             <artifactId>poi-ooxml</artifactId>
             <version>${poi.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-to-slf4j</artifactId>
+            <version>${log4j2.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>wx-java-miniapp-spring-boot-starter</artifactId>
+            <version>4.2.7.B</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.github.binarywang</groupId>
+                    <artifactId>weixin-java-miniapp</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>weixin-java-miniapp</artifactId>
+            <version>4.3.1.B</version>
+        </dependency>
 
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt-api</artifactId>
+            <version>0.11.2</version>
+        </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt-impl</artifactId>
+            <version>0.11.2</version>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt-jackson</artifactId> <!-- or jjwt-gson if Gson is preferred -->
+            <version>0.11.2</version>
+            <scope>runtime</scope>
+        </dependency>
+        <!-- mail -->
+        <dependency>
+            <groupId>com.sun.mail</groupId>
+            <artifactId>javax.mail</artifactId>
+            <version>1.5.6</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 19 - 0
src/main/java/com/qryord/QryOrdApplication.java

@@ -0,0 +1,19 @@
+package com.qryord;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+
+/**
+ * 启动程序
+ * 
+ * @author ruoyi
+ */
+@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
+public class QryOrdApplication
+{
+    public static void main(String[] args)
+    {
+        SpringApplication.run(QryOrdApplication.class, args);
+    }
+}

+ 2 - 2
src/main/java/com/qryord/RuoYiServletInitializer.java → src/main/java/com/qryord/QryOrdServletInitializer.java

@@ -8,11 +8,11 @@ import org.springframework.boot.web.servlet.support.SpringBootServletInitializer
  * 
  * @author ruoyi
  */
-public class RuoYiServletInitializer extends SpringBootServletInitializer
+public class QryOrdServletInitializer extends SpringBootServletInitializer
 {
     @Override
     protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
     {
-        return application.sources(RuoYiApplication.class);
+        return application.sources(QryOrdApplication.class);
     }
 }

+ 0 - 30
src/main/java/com/qryord/RuoYiApplication.java

@@ -1,30 +0,0 @@
-package com.qryord;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
-
-/**
- * 启动程序
- * 
- * @author ruoyi
- */
-@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
-public class RuoYiApplication
-{
-    public static void main(String[] args)
-    {
-        // System.setProperty("spring.devtools.restart.enabled", "false");
-        SpringApplication.run(RuoYiApplication.class, args);
-        System.out.println("(♥◠‿◠)ノ゙  若依启动成功   ლ(´ڡ`ლ)゙  \n" +
-                " .-------.       ____     __        \n" +
-                " |  _ _   \\      \\   \\   /  /    \n" +
-                " | ( ' )  |       \\  _. /  '       \n" +
-                " |(_ o _) /        _( )_ .'         \n" +
-                " | (_,_).' __  ___(_ o _)'          \n" +
-                " |  |\\ \\  |  ||   |(_,_)'         \n" +
-                " |  | \\ `'   /|   `-'  /           \n" +
-                " |  |  \\    /  \\      /           \n" +
-                " ''-'   `'-'    `-..-'              ");
-    }
-}

+ 25 - 0
src/main/java/com/qryord/common/constant/Constants.java

@@ -119,4 +119,29 @@ public class Constants
      */
     public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
             "org.springframework", "com.qryord.common.utils.file", "com.qryord.framework.config", "com.qryord.project.tool" };
+
+    public static final String mailTo = "scan.failure.maillist";
+
+    // EDP用户名
+    public static final String edp_userName = "edp.username";
+    // EDP密码
+    public static final String edp_password = "edp.password";
+    // 获取Token
+    public static final String edp_tokenUrl = "edp.url.token";
+    // 箱号查询
+    public static final String edp_boxQryUrl = "edp.url.boxqry";
+    // 按商品查询
+    public static final String edp_prodQryUrl = "edp.url.prodqry";
+
+    /**邮件信息*/
+    // 邮件编码格式
+    public final static String MAIL_CHARSET = "utf-8";
+    // 邮件发送人
+    public final static String MAIL_SENDER = "系统管理员";
+    // 邮件标题
+    public final static String MAIL_TITLE = "SN序列号查询通知";
+    // 邮件正文
+    public final static String MAIL_CONTENT_ITEM = "用户{0}查询{1}未得到结果。<br/>查询号为:{2} 产品型号:{3}";
+    public final static String MAIL_CONTENT_BOX = "用户{0}查询{1}未得到结果。<br/>查询号为:{2}";
+
 }

+ 30 - 0
src/main/java/com/qryord/common/enums/EDelete.java

@@ -0,0 +1,30 @@
+package com.qryord.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @program: biandan
+ * @description: 删除标志
+ * @author: dong
+ * @create: 2020-01-06 22:10
+ */
+@AllArgsConstructor
+@Getter
+public enum EDelete {
+    TRUE("2", "是"),
+    FALSE("0", "否");
+
+    private String val;
+    private String desc;
+
+    /** 解析 */
+    public static EDelete parseByVal(String val) {
+        for(EDelete type :EDelete.values()) {
+            if(type.getVal().equalsIgnoreCase(val)) {
+                return type;
+            }
+        }
+        return EDelete.FALSE;
+    }
+}

+ 30 - 0
src/main/java/com/qryord/common/enums/EQueryStatus.java

@@ -0,0 +1,30 @@
+package com.qryord.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @program: biandan
+ * @description: 是否标志
+ * @author: bao
+ * @create: 2022-02-14
+ */
+@AllArgsConstructor
+@Getter
+public enum EQueryStatus {
+    SUCCESS("SUCCESS", "查询成功"),
+    FAILURE("FAILURE", "查询失败");
+
+    private String val;
+    private String desc;
+
+    /** 解析 */
+    public static EQueryStatus parseByVal(String val) {
+        for(EQueryStatus type :EQueryStatus.values()) {
+            if(type.getVal().equalsIgnoreCase(val)) {
+                return type;
+            }
+        }
+        return EQueryStatus.SUCCESS;
+    }
+}

+ 31 - 0
src/main/java/com/qryord/common/enums/EQueryType.java

@@ -0,0 +1,31 @@
+package com.qryord.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @program: biandan
+ * @description: 是否标志
+ * @author: bao
+ * @create: 2022-02-14
+ */
+@AllArgsConstructor
+@Getter
+public enum EQueryType {
+    ITEM("ITEM", "小箱号"),
+    BOX("BOX", "大箱号"),
+    NUMBER("NUMBER", "数字码");
+
+    private String val;
+    private String desc;
+
+    /** 解析 */
+    public static EQueryType parseByVal(String val) {
+        for(EQueryType type :EQueryType.values()) {
+            if(type.getVal().equalsIgnoreCase(val)) {
+                return type;
+            }
+        }
+        return EQueryType.ITEM;
+    }
+}

+ 21 - 0
src/main/java/com/qryord/common/enums/ERole.java

@@ -0,0 +1,21 @@
+package com.qryord.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @program: biandan
+ * @description: 角色
+ * @author: bao
+ * @create: 2022-02-14
+ */
+@AllArgsConstructor
+@Getter
+public enum ERole {
+    LEADER("leader", "课长以上"),
+    NORMAL("normal", "课长以下");
+
+    private String val;
+    private String desc;
+
+}

+ 21 - 0
src/main/java/com/qryord/common/enums/EYesNo.java

@@ -0,0 +1,21 @@
+package com.qryord.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @program: biandan
+ * @description: 是否标志
+ * @author: bao
+ * @create: 2022-02-14
+ */
+@AllArgsConstructor
+@Getter
+public enum EYesNo {
+    YES("1", "是"),
+    NO("0", "否");
+
+    private String val;
+    private String desc;
+
+}

+ 13 - 0
src/main/java/com/qryord/common/utils/DateUtils.java

@@ -8,6 +8,7 @@ import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.ZoneId;
 import java.time.ZonedDateTime;
+import java.util.Calendar;
 import java.util.Date;
 import org.apache.commons.lang3.time.DateFormatUtils;
 
@@ -188,4 +189,16 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
         return Date.from(zdt.toInstant());
     }
+
+    /**
+     * 获取财年开始时间(日本财年为每年4月1日)
+     */
+    public static Date getFinanceDate()
+    {
+        Calendar calendar = Calendar.getInstance();
+        int year = calendar.get(Calendar.YEAR);
+        calendar.set(year,3,1,0,0,0);
+
+        return calendar.getTime();
+    }
 }

+ 107 - 0
src/main/java/com/qryord/common/utils/MailUtil.java

@@ -0,0 +1,107 @@
+package com.qryord.common.utils;
+
+import com.qryord.common.constant.Constants;
+import com.qryord.framework.config.MailConfig;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.context.annotation.Configuration;
+
+import javax.mail.BodyPart;
+import javax.mail.Multipart;
+import javax.mail.Session;
+import javax.mail.Transport;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMessage.RecipientType;
+import javax.mail.internet.MimeMultipart;
+import java.util.Date;
+import java.util.Properties;
+
+@Configuration
+@EnableAutoConfiguration
+public class MailUtil {
+
+    private String smtpServer;
+	private String smtpPort;
+	private String accout;
+	private String pwd;
+
+    public MailUtil() {
+    }
+
+    public MailUtil(MailConfig mailConfig) {
+    	smtpServer = mailConfig.getSmtpServer();
+    	smtpPort = mailConfig.getSmtpPort();
+    	accout = mailConfig.getAccout();
+    	pwd = mailConfig.getPwd();
+    }
+
+    public void sendEmail(String recipient, String nickName, String mailContent) throws Exception {
+        // 创建邮件配置
+        Properties props = new Properties();
+        // 使用的协议(JavaMail规范要求)
+        props.setProperty("mail.transport.protocol", "smtp");
+        // 发件人的邮箱的 SMTP 服务器地址
+        props.setProperty("mail.smtp.host", smtpServer);
+        props.setProperty("mail.smtp.port", smtpPort); 
+        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
+        props.setProperty("mail.smtp.auth", "true"); // 需要请求认证
+        props.setProperty("mail.smtp.ssl.enable", "true");// 开启ssl
+
+        // 根据邮件配置创建会话,注意session别导错包
+        Session session = Session.getDefaultInstance(props);
+        // 开启debug模式,可以看到更多详细的输入日志
+        session.setDebug(true);
+        //创建邮件
+        MimeMessage message = createEmail(session, recipient, nickName, mailContent);
+        //获取传输通道
+        Transport transport = session.getTransport();
+        transport.connect(smtpServer, accout, pwd);
+
+        //连接,并发送邮件
+        transport.sendMessage(message, message.getAllRecipients());
+        transport.close();
+    }
+
+
+    public MimeMessage createEmail(Session session, String recipient, String nickName, String mailContent) throws Exception {
+        // 根据会话创建邮件
+        MimeMessage msg = new MimeMessage(session);
+        // address邮件地址, personal邮件昵称, charset编码方式
+        InternetAddress fromAddress = new InternetAddress(accout, Constants.MAIL_SENDER, Constants.MAIL_CHARSET);
+        // 设置发送邮件方
+        msg.setFrom(fromAddress);
+
+        InternetAddress[] receiveAddress =null;
+        String[] toAddrs = recipient.split(",");
+        receiveAddress = new InternetAddress[toAddrs.length];
+
+        int idx = 0;
+
+        for (String toAddress : toAddrs) {
+            InternetAddress toIntAddr = new InternetAddress(toAddress, nickName, Constants.MAIL_CHARSET);
+            receiveAddress[idx] = toIntAddr;
+            idx = idx + 1;
+        }
+
+        // 设置邮件接收方
+        msg.setRecipients(RecipientType.TO, receiveAddress);
+        // 设置邮件标题
+        msg.setSubject(Constants.MAIL_TITLE, "utf-8");
+
+        Multipart multipart = new MimeMultipart("related");
+
+        BodyPart htmlPart = new MimeBodyPart();
+        String htmlContent = mailContent;
+        htmlPart.setContent(htmlContent, "text/html;charset=UTF-8");
+
+        multipart.addBodyPart(htmlPart);
+        msg.setContent(multipart);
+
+        // 设置显示的发件时间
+        msg.setSentDate(new Date());
+        // 保存设置
+        msg.saveChanges();
+        return msg;
+    }
+}

+ 107 - 9
src/main/java/com/qryord/common/utils/http/HttpUtils.java

@@ -1,22 +1,28 @@
 package com.qryord.common.utils.http;
 
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.PrintWriter;
-import java.net.ConnectException;
-import java.net.SocketTimeoutException;
-import java.net.URL;
-import java.net.URLConnection;
+import java.io.*;
+import java.net.*;
 import java.nio.charset.StandardCharsets;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
 import java.security.cert.X509Certificate;
+import java.util.Map;
 import javax.net.ssl.HostnameVerifier;
 import javax.net.ssl.HttpsURLConnection;
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLSession;
 import javax.net.ssl.TrustManager;
 import javax.net.ssl.X509TrustManager;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.conn.ClientConnectionManager;
+import org.apache.http.conn.scheme.Scheme;
+import org.apache.http.conn.scheme.SchemeRegistry;
+import org.apache.http.conn.ssl.SSLSocketFactory;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.DefaultHttpClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import com.qryord.common.constant.Constants;
@@ -271,4 +277,96 @@ public class HttpUtils
             return true;
         }
     }
+
+    /**
+     * post form
+     *
+     * @param url
+     * @param headers
+     * @param bodyStr
+     * @return
+     * @throws Exception
+     */
+    public static HttpResponse doPost(String url,
+                                      Map<String, String> headers,
+                                      String bodyStr)
+            throws Exception {
+        HttpClient httpClient = wrapClient(url);
+
+        HttpPost request = new HttpPost(buildUrl(url, null));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+            request.addHeader(e.getKey(), e.getValue());
+        }
+
+        if (StringUtils.isNotBlank(bodyStr)) {
+            request.setEntity(new StringEntity(bodyStr, "utf-8"));
+        }
+
+        return httpClient.execute(request);
+    }
+
+    private static String buildUrl(String host, Map<String, String> querys) throws UnsupportedEncodingException {
+        StringBuilder sbUrl = new StringBuilder();
+        sbUrl.append(host);
+
+        if (null != querys) {
+            StringBuilder sbQuery = new StringBuilder();
+            for (Map.Entry<String, String> query : querys.entrySet()) {
+                if (0 < sbQuery.length()) {
+                    sbQuery.append("&");
+                }
+                if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) {
+                    sbQuery.append(query.getValue());
+                }
+                if (!StringUtils.isBlank(query.getKey())) {
+                    sbQuery.append(query.getKey());
+                    if (!StringUtils.isBlank(query.getValue())) {
+                        sbQuery.append("=");
+                        sbQuery.append(URLEncoder.encode(query.getValue(), "utf-8"));
+                    }
+                }
+            }
+            if (0 < sbQuery.length()) {
+                sbUrl.append("?").append(sbQuery);
+            }
+        }
+
+        return sbUrl.toString();
+    }
+
+    private static HttpClient wrapClient(String host) {
+        HttpClient httpClient = new DefaultHttpClient();
+        if (host.startsWith("https://")) {
+            sslClient(httpClient);
+        }
+
+        return httpClient;
+    }
+
+    private static void sslClient(HttpClient httpClient) {
+        try {
+            SSLContext ctx = SSLContext.getInstance("TLS");
+            X509TrustManager tm = new X509TrustManager() {
+                public X509Certificate[] getAcceptedIssuers() {
+                    return null;
+                }
+                public void checkClientTrusted(X509Certificate[] xcs, String str) {
+
+                }
+                public void checkServerTrusted(X509Certificate[] xcs, String str) {
+
+                }
+            };
+            ctx.init(null, new TrustManager[] { tm }, null);
+            SSLSocketFactory ssf = new SSLSocketFactory(ctx);
+            ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
+            ClientConnectionManager ccm = httpClient.getConnectionManager();
+            SchemeRegistry registry = ccm.getSchemeRegistry();
+            registry.register(new Scheme("https", 443, ssf));
+        } catch (KeyManagementException ex) {
+            throw new RuntimeException(ex);
+        } catch (NoSuchAlgorithmException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
 }

+ 16 - 0
src/main/java/com/qryord/framework/config/MailConfig.java

@@ -0,0 +1,16 @@
+package com.qryord.framework.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix="mail")
+public class MailConfig {
+	
+    private String smtpServer;
+	private String smtpPort;
+	private String accout;
+	private String pwd;
+}

+ 32 - 3
src/main/java/com/qryord/framework/web/domain/BaseEntity.java

@@ -1,12 +1,14 @@
 package com.qryord.framework.web.domain;
 
 import java.io.Serializable;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
+
+import com.alibaba.fastjson.JSON;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonInclude;
+import com.google.common.collect.Lists;
+import com.qryord.common.utils.text.Convert;
 
 /**
  * Entity基类
@@ -115,4 +117,31 @@ public class BaseEntity implements Serializable
     {
         this.params = params;
     }
+
+
+    /**
+     * 只接受分号分隔和JSON数据
+     * @param name
+     * @param tClass
+     * @param <T>
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    public <T> List<T> getPramsByName(String name, Class<T> tClass){
+        List<T> list = Lists.newArrayList();
+        if (getParams().containsKey(name)) {
+            Object obj = getParams().get(name);
+            if (obj != null) {
+                try {
+                    list = JSON.parseArray((String) obj, tClass);
+                } catch (Exception ex) {
+                    String str = (String) obj;
+                    if(!str.isEmpty()) {
+                        list = (List<T>) Arrays.asList(Convert.toStrArray((String) obj));
+                    }
+                }
+            }
+        }
+        return list;
+    }
 }

+ 10 - 0
src/main/java/com/qryord/mp/common/AccessTokenDTO.java

@@ -0,0 +1,10 @@
+package com.qryord.mp.common;
+
+import lombok.Value;
+
+@Value
+public class AccessTokenDTO {
+    String accessToken;
+    long expiresIn;
+    String type = "Bearer";
+}

+ 20 - 0
src/main/java/com/qryord/mp/common/ApiException.java

@@ -0,0 +1,20 @@
+package com.qryord.mp.common;
+
+public class ApiException extends RuntimeException {
+
+    private final String message;
+    private final Object[] args;
+
+    public ApiException(final String message, Object... args){
+        super(message);
+        this.message = message;
+        this.args = args;
+    }
+
+    @Override
+    public String getMessage() {
+        return LocaleMessageUtil.getMessage(message, args);
+    }
+
+
+}

+ 25 - 0
src/main/java/com/qryord/mp/common/BaseApiController.java

@@ -0,0 +1,25 @@
+package com.qryord.mp.common;
+
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.subject.Subject;
+import org.apache.tomcat.websocket.AuthenticationException;
+
+@Slf4j
+public class BaseApiController {
+
+    @SneakyThrows
+    protected UserContext getUserContext() {
+        Subject subject = SecurityUtils.getSubject();
+        if (subject != null
+                && subject.getPrincipal() != null
+                && subject.getPrincipal() instanceof UserContext) {
+            return (UserContext)subject.getPrincipal();
+        } else {
+            log.error("UNLOGIN");
+            throw new AuthenticationException("UNLOGIN");
+        }
+    }
+
+}

+ 21 - 0
src/main/java/com/qryord/mp/common/BaseReq.java

@@ -0,0 +1,21 @@
+package com.qryord.mp.common;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.ToString;
+
+@Data
+@ToString
+public class BaseReq {
+
+    /** 用户编号 */
+    @ApiModelProperty(name = "sysUserId", value = "用户编号", required = false)
+    private Long sysUserId;
+    /** 分页页码 */
+    @ApiModelProperty(name = "pageIndex", value = "分页页码", required = false)
+    private Integer pageIndex = 1;
+    /** 分页大小 */
+    @ApiModelProperty(name = "pageSize", value = "分页大小", required = false)
+    private Integer pageSize = 10;
+
+}

+ 26 - 0
src/main/java/com/qryord/mp/common/BusinessException.java

@@ -0,0 +1,26 @@
+package com.qryord.mp.common;
+
+/**
+ * 业务异常
+ *
+ * @author biandan
+ */
+public class BusinessException extends RuntimeException {
+    private static final long serialVersionUID = 1L;
+
+    protected final String message;
+
+    public BusinessException(String message) {
+        this.message = message;
+    }
+
+    public BusinessException(String message, Throwable e) {
+        super(message, e);
+        this.message = message;
+    }
+
+    @Override
+    public String getMessage() {
+        return message;
+    }
+}

+ 22 - 0
src/main/java/com/qryord/mp/common/LocaleMessageUtil.java

@@ -0,0 +1,22 @@
+package com.qryord.mp.common;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.MessageSource;
+import org.springframework.context.MessageSourceAware;
+import org.springframework.context.i18n.LocaleContextHolder;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component
+public final class LocaleMessageUtil implements MessageSourceAware {
+    private static MessageSource messageSource = null;
+    @Override
+    public void setMessageSource(MessageSource messageSource) {
+        LocaleMessageUtil.messageSource = messageSource;
+    }
+
+    public static String getMessage(String message, Object[] args) {
+        return messageSource.getMessage(message, args, LocaleContextHolder.getLocale());
+    }
+
+}

+ 95 - 0
src/main/java/com/qryord/mp/common/RespResultModel.java

@@ -0,0 +1,95 @@
+package com.qryord.mp.common;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+public class RespResultModel<T> implements Serializable {
+    private int code = 200;
+    private LocalDateTime timestamp;
+    private boolean success;
+    private String message = "successful";
+    private String requestId;
+    private T data;
+
+    public RespResultModel(){}
+
+    public RespResultModel(T data){
+        this.success = true;
+        this.timestamp = LocalDateTime.now();
+        this.data = data;
+    }
+
+    public RespResultModel(int code){
+        this.code = code;
+        this.success = code == 200;
+        this.timestamp = LocalDateTime.now();
+    }
+
+    public RespResultModel(String message){
+        this.code = 500;
+        this.success = false;
+        this.message = message;
+        this.timestamp = LocalDateTime.now();
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public LocalDateTime getTimestamp() {
+        return timestamp;
+    }
+
+    public void setTimestamp(LocalDateTime timestamp) {
+        this.timestamp = timestamp;
+    }
+
+    public boolean isSuccess() {
+        return success;
+    }
+
+    public void setSuccess(boolean success) {
+        this.success = success;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public String getRequestId() {
+        return requestId;
+    }
+
+    public void setRequestId(String requestId) {
+        this.requestId = requestId;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+
+
+    @Override
+    public String toString() {
+        return "ResponseDTO{" +
+                "code=" + code +
+                ", timestamp=" + timestamp +
+                ", success=" + success +
+                ", message='" + message + '\'' +
+                ", requestId='" + requestId + '\'' +
+                ", data=" + data +
+                '}';
+    }
+}

+ 22 - 0
src/main/java/com/qryord/mp/common/UserContext.java

@@ -0,0 +1,22 @@
+package com.qryord.mp.common;
+
+import com.qryord.project.system.user.domain.User;
+import lombok.*;
+
+@Data
+@ToString
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserContext {
+    private Long userId;
+    private String username;
+    private String phoneNum;
+    private Long deptId;
+    // ...
+
+
+    public UserContext(Long userId, String username) {
+        this.userId = userId;
+        this.username = username;
+    }
+}

+ 94 - 0
src/main/java/com/qryord/mp/common/WxUtil.java

@@ -0,0 +1,94 @@
+package com.qryord.mp.common;
+
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.stereotype.Component;
+
+import java.io.BufferedReader;
+import java.io.DataOutputStream;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * 阿里云Util
+ *
+ * @author biandan
+ */
+@Slf4j
+@Component
+@ConditionalOnProperty(name = "wx.miniapp.appid")
+public class WxUtil {
+    private static String appId;
+    private static String appKey;
+
+    @Value("${wx.miniapp.appid}")
+    public void setAppId(String appId) {
+        WxUtil.appId = appId;
+    }
+
+    @Value("${wx.miniapp.secret}")
+    public void setAppKey(String appKey) {
+        WxUtil.appKey = appKey;
+    }
+
+    /**
+     * 获取微信AccessToken
+     *
+     * @param wxAppId  微信小程序AppId
+     * @param wxAppKey 微信小程序AppKey
+     * @return accessToken
+     */
+    public static String getWxAccessToken(String wxAppId, String wxAppKey) throws BusinessException {
+        String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + wxAppId + "&secret=" + wxAppKey;
+        try {
+            URL url = new URL(tokenUrl);
+            // 打开和URL之间的连接
+            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+            connection.setRequestMethod("POST");
+            // 设置通用的请求属性
+            connection.setRequestProperty("Content-Type", "application/json");
+            connection.setRequestProperty("Connection", "Keep-Alive");
+            connection.setUseCaches(false);
+            connection.setDoOutput(true);
+            connection.setDoInput(true);
+
+            // 得到请求的输出流对象
+            DataOutputStream out = new DataOutputStream(connection.getOutputStream());
+            out.writeBytes("");
+            out.flush();
+            out.close();
+
+            // 建立实际的连接
+            connection.connect();
+            // 定义 BufferedReader输入流来读取URL的响应
+            BufferedReader in;
+            if (tokenUrl.contains("nlp"))
+                in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "GBK"));
+            else
+                in = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
+            StringBuilder result = new StringBuilder();
+            String getLine;
+            while ((getLine = in.readLine()) != null) {
+                result.append(getLine);
+            }
+            in.close();
+
+            JSONObject jsonObject = JSON.parseObject(result.toString());
+            if (jsonObject.containsKey("access_token")) {
+                return jsonObject.getString("access_token");
+            } else {
+                log.error("token获取失败");
+                throw new BusinessException("token获取失败");
+            }
+        } catch (Exception e) {
+            log.error("token获取失败");
+            throw new BusinessException(e.getMessage());
+        }
+    }
+}

+ 353 - 0
src/main/java/com/qryord/mp/controller/QueryApiController.java

@@ -0,0 +1,353 @@
+package com.qryord.mp.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.qryord.common.constant.Constants;
+import com.qryord.common.enums.EDelete;
+import com.qryord.common.enums.EQueryStatus;
+import com.qryord.common.enums.EQueryType;
+import com.qryord.common.enums.ERole;
+import com.qryord.common.utils.DateUtils;
+import com.qryord.common.utils.MailUtil;
+import com.qryord.common.utils.PageUtils;
+import com.qryord.common.utils.StringUtils;
+import com.qryord.common.utils.http.HttpUtils;
+import com.qryord.framework.config.MailConfig;
+import com.qryord.mp.common.BaseApiController;
+import com.qryord.mp.common.RespResultModel;
+import com.qryord.mp.model.*;
+import com.qryord.project.business.query.domain.TQuery;
+import com.qryord.project.business.query.service.ITQueryService;
+import com.qryord.project.master.model.domain.Model;
+import com.qryord.project.master.model.service.IModelService;
+import com.qryord.project.master.modelKind.domain.ModelKind;
+import com.qryord.project.master.modelKind.service.IModelKindService;
+import com.qryord.project.master.roleField.domain.RoleField;
+import com.qryord.project.master.roleField.service.IRoleFieldService;
+import com.qryord.project.system.config.service.IConfigService;
+import com.qryord.project.system.user.domain.User;
+import com.qryord.project.system.user.service.IUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpResponse;
+import org.apache.http.util.EntityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.text.MessageFormat;
+import java.util.*;
+
+@Api("用户相关使用")
+@Slf4j
+@AllArgsConstructor
+@RestController
+@RequestMapping("/api/app")
+public class QueryApiController extends BaseApiController {
+
+    @Autowired
+    private IRoleFieldService roleFieldService;
+    @Autowired
+    private ITQueryService queryService;
+    @Autowired
+    private IConfigService configService;
+    @Autowired
+    private IUserService userService;
+    @Autowired
+    private IModelService modelService;
+    @Autowired
+    private IModelKindService modelKindService;
+    @Autowired
+    private MailConfig mailConfig;
+
+    @ApiOperation(value = "获取画面字段控制,roleKey必须")
+    @PostMapping("/getFieldRight")
+    public RespResultModel<List<RoleFieldResp>> getFieldRight(@RequestBody UserReq userReq) {
+
+        List<RoleFieldResp> rtn = new ArrayList<>();
+
+        RoleField cond = new RoleField();
+        cond.setRoleKey(userReq.getRoleKey());
+        cond.setDelFlag(EDelete.FALSE.getVal());
+
+        List<RoleField> roleFields = roleFieldService.selectRoleFieldList(cond);
+
+        for (RoleField rf : roleFields) {
+            RoleFieldResp rfResp = new RoleFieldResp();
+
+            rfResp.setFieldKey(rf.getFieldKey());
+            rfResp.setRoleKey(rf.getRoleKey());
+            rfResp.setShowFlag(rf.getShowFlag());
+            rtn.add(rfResp);
+        }
+
+        return new RespResultModel(rtn);
+    }
+
+    @ApiOperation(value = "查询数据,查询类型,序列号必须,code:200 查询成功 code:500 查询失败,报message")
+    @PostMapping("/getQryResult")
+    public RespResultModel<QueryResp> getQryResult(@RequestBody QueryReq req) {
+
+        if (req.getSysUserId() == null || req.getSysUserId() == 0L) {
+            return new RespResultModel("用户ID必须输入。");
+        }
+        if (StringUtils.isBlank(req.getQueryType())) {
+            return new RespResultModel("请先确认查询种类。");
+        }
+        if (StringUtils.isBlank(req.getSnNo())) {
+            return new RespResultModel("商品序列号必须输入。");
+        }
+        if (EQueryType.ITEM.getVal().equals(req.getQueryType())) {
+            if (StringUtils.isBlank(req.getModelName())) {
+                return new RespResultModel("商品查询时,商品型号必须输入。");
+            }
+        }
+
+        // 对于限制权限的用户来说,发货日期两年前的数据不让看
+        User user = userService.selectUserById(req.getSysUserId());
+
+        QueryResp rtn = new QueryResp();
+
+        Date nowDate = DateUtils.getNowDate();
+        TQuery qry = new TQuery();
+        qry.setUserId(req.getSysUserId());
+        qry.setQryTime(nowDate);
+        qry.setQueryType(req.getQueryType());
+        qry.setModelId(req.getModelId());
+        qry.setModelName(req.getModelName());
+        qry.setSerialNo(req.getSnNo());
+        qry.setDelFlag(EDelete.FALSE.getVal());
+        qry.setCreateBy(req.getSysUserId().toString());
+        qry.setCreateTime(nowDate);
+        qry.setUpdateBy(req.getSysUserId().toString());
+        qry.setUpdateTime(nowDate);
+
+        // 通过EDP用户名密码,获取accessToken
+        String userName = configService.selectConfigByKey(Constants.edp_userName);
+        String pswd = configService.selectConfigByKey(Constants.edp_password);
+        String tokenUrl =configService.selectConfigByKey(Constants.edp_tokenUrl);
+
+        String token = "";
+
+        Map<String, String> headers = new HashMap<String, String>();
+        headers.put("Content-Type", "application/json");
+        Map<String, String> tokenBody = new HashMap<String, String>();
+        tokenBody.put("loginName", userName);
+        tokenBody.put("loginPwd", pswd);
+
+        HttpResponse response = null;
+        try {
+            response = HttpUtils.doPost(tokenUrl, headers,JSON.toJSONString(tokenBody, SerializerFeature.PrettyFormat));
+
+            String rtnSrc = EntityUtils.toString(response.getEntity());
+            JSONObject jsonObject = JSON.parseObject(rtnSrc);
+
+            if (jsonObject != null) {
+                if ("1".equals(jsonObject.getString("code"))) {
+                    JSONObject objBody = JSON.parseObject(jsonObject.getString("data"));
+                    token = objBody.getString("xaccessToken");
+                } else {
+                    log.error(jsonObject.getString("msg"));
+                    qry.setQryStatus(EQueryStatus.FAILURE.getVal());
+                    queryService.insertTQuery(qry);
+                    SendMail(user.getUserName(),req.getQueryType(),req.getSnNo(), req.getModelName());
+                    return new RespResultModel("结果异常,请联系SCM人工查询。");
+                }
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage());
+            qry.setQryStatus(EQueryStatus.FAILURE.getVal());
+            queryService.insertTQuery(qry);
+            SendMail(user.getUserName(),req.getQueryType(),req.getSnNo(), req.getModelName());
+            return new RespResultModel("结果异常,请联系SCM人工查询。");
+        }
+
+        response = null;
+
+        headers.put("x-access-token", token);
+        Map<String, String> bodys = new HashMap<String, String>();
+        String qryUrl = "";
+
+        //通过token和参数,获取数据。
+        if (EQueryType.BOX.getVal().equals(req.getQueryType())) {
+            // 通过箱号查询
+            bodys.put("cartonNumber", req.getSnNo());
+            qryUrl =configService.selectConfigByKey(Constants.edp_boxQryUrl);
+        } else {
+            // 通过型号和序列号查询
+            bodys.put("itemDescription", req.getModelName());
+            bodys.put("serialNumber", req.getSnNo());
+            qryUrl =configService.selectConfigByKey(Constants.edp_prodQryUrl);
+        }
+
+//        if (startDate != null) {
+//            // 日期
+//            bodys.put("createTimeBegin", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,startDate));
+//        }
+
+        try {
+            response = HttpUtils.doPost(qryUrl, headers,JSON.toJSONString(bodys, SerializerFeature.PrettyFormat));
+
+            String rtnSrc = EntityUtils.toString(response.getEntity());
+            JSONObject jsonObject = JSON.parseObject(rtnSrc);
+
+            if (jsonObject != null) {
+                if ("1".equals(jsonObject.getString("code"))) {
+                    JSONObject objBody = JSON.parseObject(jsonObject.getString("data"));
+                } else {
+                    log.error(jsonObject.getString("msg"));
+                    qry.setQryStatus(EQueryStatus.FAILURE.getVal());
+                    queryService.insertTQuery(qry);
+                    SendMail(user.getUserName(),req.getQueryType(),req.getSnNo(), req.getModelName());
+                    return new RespResultModel("结果异常,请联系SCM人工查询。");
+                }
+            }
+
+            if (jsonObject != null) {
+                if ("1".equals(jsonObject.getString("code"))) {
+                    JSONObject objBody = JSON.parseObject(jsonObject.getString("data"));
+
+                    rtn.setSnNo(objBody.getString("serialNumber"));
+                    rtn.setItemCode(objBody.getString("itemNumber"));
+                    rtn.setCustNo(objBody.getString("customerNumber"));
+                    rtn.setCustName(objBody.getString("customerName"));
+                    rtn.setProdName(objBody.getString("itemDescription1"));
+                    rtn.setPropName(objBody.getString("itemDescription2"));
+                    rtn.setBatchNo(objBody.getString("lotNumber"));
+                    rtn.setAddress(objBody.getString("shipAddress"));
+                    rtn.setOutDate(objBody.getDate("operatorDate"));
+                    rtn.setOrderNo(objBody.getString("purchaseOrder"));
+                    if (objBody.getBigDecimal("quantity") != null) {
+                        rtn.setQuantity(objBody.getBigDecimal("quantity").intValue());
+                    }
+
+                    if (user.getRoles() != null && user.getRoles().size()>0) {
+                        if (ERole.NORMAL.getVal().equals(user.getRoles().get(0).getRoleKey())) {
+                            //按日本财年计算开始时间。
+                            if (DateUtils.getNowDate().compareTo(DateUtils.getFinanceDate())>0) {
+                                //当前年财年已经开始,只能查看前一年4月1日至今的。
+                                Date startDate = null;
+                                startDate = DateUtils.getFinanceDate();
+                                startDate = DateUtils.addYears(startDate,-1);
+                                if (rtn.getOutDate() != null) {
+                                    if (rtn.getOutDate().compareTo(startDate) < 0) {
+                                        return new RespResultModel("超出可查询时限。");
+                                    }
+                                }
+                            }
+                        }
+                    } else {
+                        return new RespResultModel("无权限查看数据。");
+                    }
+
+                } else {
+                    log.error(jsonObject.getString("msg"));
+                    qry.setQryStatus(EQueryStatus.FAILURE.getVal());
+                    queryService.insertTQuery(qry);
+                    SendMail(user.getUserName(),req.getQueryType(),req.getSnNo(), req.getModelName());
+                    return new RespResultModel("结果异常,请联系SCM人工查询。");
+                }
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage());
+            qry.setQryStatus(EQueryStatus.FAILURE.getVal());
+            queryService.insertTQuery(qry);
+            SendMail(user.getUserName(),req.getQueryType(),req.getSnNo(), req.getModelName());
+            return new RespResultModel("结果异常,请联系SCM人工查询。");
+        }
+
+        qry.setQryStatus(EQueryStatus.SUCCESS.getVal());
+        queryService.insertTQuery(qry);
+        return new RespResultModel(rtn);
+    }
+
+    @ApiOperation(value = "查询历史数据")
+    @PostMapping("/getQryHis")
+    public RespResultModel<List<QueryHisResp>> getQryHis(@RequestBody QueryReq req) {
+
+        List<QueryHisResp> rtn = new ArrayList<>();
+        TQuery cond = new TQuery();
+        cond.setUserId(req.getSysUserId());
+
+        PageUtils.startPage();
+        List<TQuery> queryList = queryService.selectTQueryList(cond);
+
+        for (TQuery q : queryList) {
+            QueryHisResp qhResp = new QueryHisResp();
+
+            qhResp.setModelId(q.getModelId());
+            qhResp.setModelName(q.getModelName());
+            qhResp.setSnNo(q.getSerialNo());
+            qhResp.setQryTime(q.getQryTime());
+            qhResp.setQueryType(EQueryType.parseByVal(q.getQueryType()));
+            qhResp.setQueryStatus(EQueryStatus.parseByVal(q.getQryStatus()));
+
+            rtn.add(qhResp);
+        }
+
+        return new RespResultModel(rtn);
+    }
+
+    @ApiOperation(value = "获取商品型号")
+    @PostMapping("/getModels")
+    public RespResultModel<List<ModelKindResp>> getModels() {
+
+        List<ModelKindResp> rtn = new ArrayList<>();
+
+        ModelKind condMk = new ModelKind();
+        condMk.setDelFlag(EDelete.FALSE.getVal());
+
+        List<ModelKind> modelKindList = modelKindService.selectModelKindList(condMk);
+
+        for (ModelKind mk : modelKindList) {
+            ModelKindResp mkResp = new ModelKindResp();
+            mkResp.setModelKindId(mk.getId());
+            mkResp.setKindName(mk.getKindName());
+
+            Model cond = new Model();
+            cond.setDelFlag(EDelete.FALSE.getVal());
+            cond.setMkId(mk.getId());
+
+            List<Model> modelList = modelService.selectModelList(cond);
+            List<ModelResp> modelRespList = new ArrayList<>();
+            for (Model m : modelList) {
+                ModelResp mResp = new ModelResp();
+
+                mResp.setModelId(m.getId());
+                mResp.setModelName(m.getModelName());
+
+                modelRespList.add(mResp);
+            }
+            mkResp.setModelList(modelRespList);
+            rtn.add(mkResp);
+        }
+
+        return new RespResultModel(rtn);
+    }
+
+    private void SendMail(String userName,String queryType, String sn, String modelName) {
+
+        MailUtil mailUtil = new MailUtil(mailConfig);
+
+        // 通过邮件将查询结果通知用户
+        String mailBox = configService.selectConfigByKey("scan.failure.maillist");
+
+        try {
+            if (EQueryType.BOX.getVal().equals(queryType)) {
+                mailUtil.sendEmail(mailBox, "联系人", MessageFormat.format(Constants.MAIL_CONTENT_BOX,userName,EQueryType.parseByVal(queryType).getDesc(), sn));
+            } else {
+                mailUtil.sendEmail(mailBox, "联系人", MessageFormat.format(Constants.MAIL_CONTENT_ITEM,userName,EQueryType.parseByVal(queryType).getDesc(), sn, modelName));
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage());
+        }
+
+
+    }
+
+}

+ 97 - 0
src/main/java/com/qryord/mp/controller/UserApiController.java

@@ -0,0 +1,97 @@
+package com.qryord.mp.controller;
+
+import com.qryord.common.exception.user.*;
+import com.qryord.framework.shiro.service.LoginService;
+import com.qryord.framework.web.domain.AjaxResult;
+import com.qryord.mp.common.BaseApiController;
+import com.qryord.mp.common.RespResultModel;
+import com.qryord.mp.model.UserReq;
+import com.qryord.mp.model.UserResp;
+import com.qryord.mp.service.SysUserServiceI;
+import com.qryord.project.system.config.service.IConfigService;
+import com.qryord.project.system.role.domain.Role;
+import com.qryord.project.system.role.service.IRoleService;
+import com.qryord.project.system.user.domain.User;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.authc.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Api("用户相关使用")
+@Slf4j
+@AllArgsConstructor
+@RestController
+@RequestMapping("/api/app")
+public class UserApiController extends BaseApiController {
+
+    @Autowired
+    private IRoleService roleService;
+    @Autowired
+    private LoginService loginService;
+
+    @ApiOperation(value = "小程序登录,loginName,password必须")
+    @PostMapping("/mplogin")
+    public RespResultModel mplogin(@RequestBody UserReq userReq) {
+
+        User user = null;
+        try
+        {
+            user = loginService.login(userReq.getLoginName(), userReq.getPassword());
+        }
+        catch (CaptchaException e)
+        {
+            throw new AuthenticationException(e.getMessage(), e);
+        }
+        catch (UserNotExistsException e)
+        {
+            throw new UnknownAccountException(e.getMessage(), e);
+        }
+        catch (UserPasswordNotMatchException e)
+        {
+            throw new IncorrectCredentialsException(e.getMessage(), e);
+        }
+        catch (UserPasswordRetryLimitExceedException e)
+        {
+            throw new ExcessiveAttemptsException(e.getMessage(), e);
+        }
+        catch (UserBlockedException e)
+        {
+            throw new LockedAccountException(e.getMessage(), e);
+        }
+        catch (RoleBlockedException e)
+        {
+            throw new LockedAccountException(e.getMessage(), e);
+        }
+        catch (Exception e)
+        {
+            log.info("对用户[" + userReq.getLoginName() + "]进行登录验证..验证未通过{}", e.getMessage());
+            throw new AuthenticationException(e.getMessage(), e);
+        }
+
+        UserResp userResp = new UserResp();
+
+        userResp.setUserId(user.getUserId());
+        userResp.setUserName(user.getUserName());
+        userResp.setPhonenumber(user.getPhonenumber());
+        userResp.setEmail(user.getEmail());
+
+        if (user.getRoles() != null && user.getRoles().size()>0) {
+            Role role = roleService.selectRoleById(user.getRoles().get(0).getRoleId());
+
+            userResp.setRoleKey(role.getRoleKey());
+            userResp.setRoleName(role.getRoleName());
+        } else {
+            log.info("用户[" + userReq.getLoginName() + "]未设置角色。");
+            throw new AuthenticationException("用户[" + userReq.getLoginName() + "]未设置角色。");
+        }
+
+        return new RespResultModel(userResp);
+    }
+
+}

+ 27 - 0
src/main/java/com/qryord/mp/model/ModelKindResp.java

@@ -0,0 +1,27 @@
+package com.qryord.mp.model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@ApiModel(value = "查询结果")
+public class ModelKindResp implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    @ApiModelProperty(name = "modelId", value = "型号分类主键", required = false)
+    private Long modelKindId;
+
+    /** 分类名称 */
+    @ApiModelProperty(name = "kindName", value = "型号分类名称", required = false)
+    private String kindName;
+
+    /** 商品型号 */
+    @ApiModelProperty(name = "modelList", value = "型号列表", required = false)
+    private List<ModelResp> modelList;
+
+}

+ 25 - 0
src/main/java/com/qryord/mp/model/ModelResp.java

@@ -0,0 +1,25 @@
+package com.qryord.mp.model;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.qryord.framework.aspectj.lang.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@ApiModel(value = "查询结果")
+public class ModelResp implements Serializable {
+    private static final long serialVersionUID = 3236936010274484670L;
+
+    /** 主键 */
+    @ApiModelProperty(name = "modelId", value = "主键", required = false)
+    private Long modelId;
+
+    /** 型号名称 */
+    @ApiModelProperty(name = "modelName", value = "型号名称", required = false)
+    private String modelName;
+
+}

+ 37 - 0
src/main/java/com/qryord/mp/model/QueryHisResp.java

@@ -0,0 +1,37 @@
+package com.qryord.mp.model;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.qryord.common.enums.EQueryStatus;
+import com.qryord.common.enums.EQueryType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@ApiModel(value = "用户内容(用户模块)")
+public class QueryHisResp implements Serializable {
+    private static final long serialVersionUID = 3236936010274484670L;
+
+    /** 商品型号ID */
+    @ApiModelProperty(name = "modelId", value = "商品型号ID", required = false)
+    private Long modelId;
+    /** 商品型号名称 */
+    @ApiModelProperty(name = "modelName", value = "商品型号ID", required = false)
+    private String modelName;
+    /** 序列号 */
+    @ApiModelProperty(name = "snNo", value = "序列号", required = false)
+    private String snNo;
+    /** 查询时间 */
+    @ApiModelProperty(name = "qryTime", value = "查询时间", required = false)
+    private Date qryTime;
+    /** 查询类型 */
+    @ApiModelProperty(name = "queryType", value = "查询类型", required = false)
+    private EQueryType queryType;
+    /** 查询状态 */
+    @ApiModelProperty(name = "queryStatus", value = "查询状态", required = false)
+    private EQueryStatus queryStatus;
+
+}

+ 31 - 0
src/main/java/com/qryord/mp/model/QueryReq.java

@@ -0,0 +1,31 @@
+package com.qryord.mp.model;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.qryord.mp.common.BaseReq;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.ToString;
+
+import java.util.Date;
+
+@Data
+@ToString(callSuper = true)
+public class QueryReq extends BaseReq {
+
+    /** 商品型号ID */
+    @ApiModelProperty(name = "modelId", value = "商品型号ID", required = false)
+    private Long modelId;
+    /** 商品型号 */
+    @ApiModelProperty(name = "modelName", value = "商品型号", required = false)
+    private String modelName;
+    /** 序列号 */
+    @ApiModelProperty(name = "snNo", value = "序列号", required = false)
+    private String snNo;
+    /** 查询时间 */
+    @ApiModelProperty(name = "qryTime", value = "查询时间", required = false)
+    private Date qryTime;
+    /** 查询类型 */
+    @ApiModelProperty(name = "queryType", value = "查询类型(BOX:箱号查询;ITEM:单号查询)", required = false)
+    private String queryType;
+
+}

+ 63 - 0
src/main/java/com/qryord/mp/model/QueryResp.java

@@ -0,0 +1,63 @@
+package com.qryord.mp.model;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@ApiModel(value = "查询结果")
+public class QueryResp implements Serializable {
+    private static final long serialVersionUID = 3236936010274484670L;
+
+    /** 客户编号 */
+    @ApiModelProperty(name = "custNo", value = "顾客编号", required = false)
+    private String custNo;
+
+    /** 客户名称 */
+    @ApiModelProperty(name = "custName", value = "顾客名称", required = false)
+    private String custName;
+
+    /** 商品名称 */
+    @ApiModelProperty(name = "itemCode", value = "产品名称", required = false)
+    private String itemCode;
+
+    /** 商品名称 */
+    @ApiModelProperty(name = "prodName", value = "产品描述", required = false)
+    private String prodName;
+
+    /** 商品规格 */
+    @ApiModelProperty(name = "propName", value = "产品名称", required = false)
+    private String propName;
+
+    /** 序列号 */
+    @ApiModelProperty(name = "snNo", value = "序列号", required = false)
+    private String snNo;
+
+    /** 批号 */
+    @ApiModelProperty(name = "batchNo", value = "批号", required = false)
+    private String batchNo;
+
+    /** 发货到(地址) */
+    @ApiModelProperty(name = "address", value = "发货到(地址)", required = false)
+    private String address;
+
+    /** 出库日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(name = "outDate", value = "出库日期", required = false)
+    private Date outDate;
+
+    /** 订单编号 */
+    @ApiModelProperty(name = "orderNo", value = "订单编号", required = false)
+    private String orderNo;
+
+    /** 订单数量 */
+    @ApiModelProperty(name = "quantity", value = "订单数量", required = false)
+    private Integer quantity;
+
+
+
+}

+ 28 - 0
src/main/java/com/qryord/mp/model/RoleFieldResp.java

@@ -0,0 +1,28 @@
+package com.qryord.mp.model;
+
+import com.qryord.project.master.roleField.domain.RoleField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@ApiModel(value = "用户内容(用户模块)")
+public class RoleFieldResp implements Serializable {
+    private static final long serialVersionUID = 3236936010274484670L;
+
+    /** 角色主键 */
+    @ApiModelProperty(name = "roleKey", value = "角色主键", required = false)
+    private String roleKey;
+
+    /** 字段主键 */
+    @ApiModelProperty(name = "fieldKey", value = "字段主键", required = false)
+    private String fieldKey;
+
+    /** 显示标志 */
+    @ApiModelProperty(name = "showFlag", value = "显示标志", required = false)
+    private String showFlag;
+
+}

+ 43 - 0
src/main/java/com/qryord/mp/model/UserReq.java

@@ -0,0 +1,43 @@
+package com.qryord.mp.model;
+
+import com.qryord.mp.common.BaseReq;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.ToString;
+
+@Data
+@ToString(callSuper = true)
+public class UserReq extends BaseReq {
+
+    /** 用户编号 */
+    @ApiModelProperty(name = "userId", value = "用户编号", required = false)
+    private Long userId;
+    /** 用户名称 */
+    @ApiModelProperty(name = "userName", value = "用户名称", required = false)
+    private String userName;
+    /** 登录名称 */
+    @ApiModelProperty(name = "loginName", value = "登录名称", required = false)
+    private String loginName;
+    /** 密码 */
+    @ApiModelProperty(name = "password", value = "密码", required = false)
+    private String password;
+    /** 用户性别 (0=男,1=女,2=未知)*/
+    @ApiModelProperty(name = "sex", value = "用户性别(0=未知,1=男,2=女)", required = false)
+    private String sex;
+    /** 用户头像 */
+    @ApiModelProperty(name = "avatar", value = "用户头像", required = false)
+    private String avatar;
+    /** 用户手机 */
+    @ApiModelProperty(name = "phonenumber", value = "用户手机", required = false)
+    private String phonenumber;
+    /** 角色Key */
+    @ApiModelProperty(name = "roleKey", value = "角色Key", required = false)
+    private String roleKey;
+//    /** 微信openId */
+//    @ApiModelProperty(name = "wxOpenId", value = "微信openId", required = false)
+//    private String wxOpenId;
+//    /** 微信SessionKey */
+//    @ApiModelProperty(name = "wxSessionKey", value = "微信SessionKey", required = false)
+//    private String wxSessionKey;
+
+}

+ 44 - 0
src/main/java/com/qryord/mp/model/UserResp.java

@@ -0,0 +1,44 @@
+package com.qryord.mp.model;
+
+import com.qryord.project.system.role.domain.Role;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel(value = "用户内容(用户模块)")
+public class UserResp implements Serializable {
+    private static final long serialVersionUID = 3236936010274484670L;
+
+    /** 用户ID */
+    @ApiModelProperty(name = "userId", value = "用户ID", required = false)
+    private Long userId;
+    /** 用户名称 */
+    @ApiModelProperty(name = "userName", value = "用户名称", required = false)
+    private String userName;
+    /** 角色KEY */
+    @ApiModelProperty(name = "roleKey", value = "角色KEY", required = false)
+    private String roleKey;
+    /** 角色名称 */
+    @ApiModelProperty(name = "roleName", value = "角色名称", required = false)
+    private String roleName;
+    /** 手机号码 */
+    @ApiModelProperty(name = "phonenumber", value = "手机号码", required = false)
+    private String phonenumber;
+    /** 用户性别 (0=男,1=女,2=未知)*/
+    @ApiModelProperty(name = "sex", value = "用户性别(0=男,1=女,2=未知)", required = false)
+    private String sex;
+    /** 用户头像 */
+    @ApiModelProperty(name = "avatar", value = "用户头像", required = false)
+    private String avatar;
+    /** 登录名称 */
+    @ApiModelProperty(name = "loginName", value = "登录名称", required = false)
+    private String loginName;
+    /** 用户邮箱 */
+    @ApiModelProperty(name = "email", value = "用户邮箱", required = false)
+    private String email;
+
+
+}

+ 10 - 0
src/main/java/com/qryord/mp/service/SysUserServiceI.java

@@ -0,0 +1,10 @@
+package com.qryord.mp.service;
+
+import com.qryord.mp.model.UserReq;
+import com.qryord.mp.model.UserResp;
+
+public interface SysUserServiceI {
+
+    public UserResp authenticate(UserReq userReq);
+
+}

+ 66 - 0
src/main/java/com/qryord/mp/service/impl/SysUserServiceImpl.java

@@ -0,0 +1,66 @@
+package com.qryord.mp.service.impl;
+
+import com.qryord.common.utils.DateUtils;
+import com.qryord.common.utils.bean.BeanUtils;
+import com.qryord.mp.model.UserReq;
+import com.qryord.mp.model.UserResp;
+import com.qryord.mp.service.SysUserServiceI;
+import com.qryord.project.system.user.domain.User;
+import com.qryord.project.system.user.mapper.UserMapper;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+
+import javax.annotation.Resource;
+import java.util.Date;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+class SysUserServiceImpl implements SysUserServiceI {
+
+    @Resource
+    private UserMapper wxaStoreSysUserMapper;
+
+    @Override
+    public UserResp authenticate(UserReq userReq) {
+
+//        String wxOpenId = userReq.getWxOpenId();
+//        String wxSessionKey = userReq.getWxSessionKey();
+//
+//        User dbUser = wxaStoreSysUserMapper.selectUserByOpenId(wxOpenId);
+//        if (ObjectUtils.isEmpty(dbUser)) {
+//
+//            dbUser = new User();
+//            dbUser.setLoginName("wx_user");
+//            dbUser.setDeptId(0L);
+//            dbUser.setWxOpenId(wxOpenId);
+//            dbUser.setWxSessionKey(wxSessionKey);
+//            dbUser.setUserType("01");
+//            dbUser.setLoginDate(DateUtils.getNowDate());
+//            dbUser.setCreateBy(wxOpenId);
+//            dbUser.setCreateTime(new Date());
+//            wxaStoreSysUserMapper.insertUser(dbUser);
+//
+//        } else {
+//
+//            User updateSysUser = new User();
+//            updateSysUser.setUserId(dbUser.getUserId());
+//            updateSysUser.setWxSessionKey(wxSessionKey);
+//            updateSysUser.setLoginDate(DateUtils.getNowDate());
+//            updateSysUser.setUpdateBy(wxOpenId);
+//            updateSysUser.setUpdateTime(new Date());
+//            wxaStoreSysUserMapper.updateUser(updateSysUser);
+//
+//            // 后续使用
+//            dbUser.setLoginDate(updateSysUser.getLoginDate());
+//        }
+//
+//        //todo
+//        UserResp rtn = new UserResp();
+//        BeanUtils.copyBeanProp(rtn, dbUser);
+
+        return new UserResp();
+    }
+}

+ 137 - 0
src/main/java/com/qryord/project/business/query/controller/TQueryController.java

@@ -0,0 +1,137 @@
+package com.qryord.project.business.query.controller;
+
+import com.qryord.common.enums.EDelete;
+import com.qryord.common.utils.poi.ExcelUtil;
+import com.qryord.framework.aspectj.lang.annotation.Log;
+import com.qryord.framework.aspectj.lang.enums.BusinessType;
+import com.qryord.framework.web.controller.BaseController;
+import com.qryord.framework.web.domain.AjaxResult;
+import com.qryord.framework.web.page.TableDataInfo;
+import com.qryord.project.business.query.domain.TQuery;
+import com.qryord.project.business.query.service.ITQueryService;
+import com.qryord.project.master.model.domain.Model;
+import com.qryord.project.master.model.service.IModelService;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 查询履历Controller
+ * 
+ * @author ruoyi
+ * @date 2022-08-06
+ */
+@Controller
+@RequestMapping("/business/query")
+public class TQueryController extends BaseController
+{
+    private String prefix = "business/query";
+
+    @Autowired
+    private ITQueryService tQueryService;
+    @Autowired
+    private IModelService modelService;
+
+    @RequiresPermissions("business:query:view")
+    @GetMapping()
+    public String query(ModelMap mmap)
+    {
+
+        Model cond = new Model();
+        cond.setDelFlag(EDelete.FALSE.getVal());
+        List<Model> modelList = modelService.selectModelList(cond);
+
+        mmap.put("modelList",modelList);
+
+        return prefix + "/query";
+    }
+
+    /**
+     * 查询查询履历列表
+     */
+    @RequiresPermissions("business:query:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(TQuery tQuery)
+    {
+        tQuery.setDelFlag(EDelete.FALSE.getVal());
+        startPage();
+        List<TQuery> list = tQueryService.selectTQueryList(tQuery);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出查询履历列表
+     */
+    @RequiresPermissions("business:query:export")
+    @Log(title = "查询履历", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    @ResponseBody
+    public AjaxResult export(TQuery tQuery)
+    {
+        List<TQuery> list = tQueryService.selectTQueryList(tQuery);
+        ExcelUtil<TQuery> util = new ExcelUtil<TQuery>(TQuery.class);
+        return util.exportExcel(list, "查询履历数据");
+    }
+
+    /**
+     * 新增查询履历
+     */
+    @GetMapping("/add")
+    public String add()
+    {
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存查询履历
+     */
+    @RequiresPermissions("business:query:add")
+    @Log(title = "查询履历", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(TQuery tQuery)
+    {
+        return toAjax(tQueryService.insertTQuery(tQuery));
+    }
+
+    /**
+     * 修改查询履历
+     */
+    @RequiresPermissions("business:query:edit")
+    @GetMapping("/edit/{id}")
+    public String edit(@PathVariable("id") Long id, ModelMap mmap)
+    {
+        TQuery tQuery = tQueryService.selectTQueryById(id);
+        mmap.put("tQuery", tQuery);
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改保存查询履历
+     */
+    @RequiresPermissions("business:query:edit")
+    @Log(title = "查询履历", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(TQuery tQuery)
+    {
+        return toAjax(tQueryService.updateTQuery(tQuery));
+    }
+
+    /**
+     * 删除查询履历
+     */
+    @RequiresPermissions("business:query:remove")
+    @Log(title = "查询履历", businessType = BusinessType.DELETE)
+    @PostMapping( "/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids)
+    {
+        return toAjax(tQueryService.deleteTQueryByIds(ids));
+    }
+}

+ 63 - 0
src/main/java/com/qryord/project/business/query/domain/TQuery.java

@@ -0,0 +1,63 @@
+package com.qryord.project.business.query.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.qryord.framework.aspectj.lang.annotation.Excel;
+import com.qryord.framework.web.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.util.Date;
+
+/**
+ * 查询履历对象 t_query
+ * 
+ * @author ruoyi
+ * @date 2022-08-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString
+public class TQuery extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    private Long id;
+
+    /** 查询用户 */
+    @Excel(name = "查询用户")
+    private Long userId;
+
+    /** 查询用户 */
+    @Excel(name = "用户名称")
+    private String userName;
+
+    /** 查询时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "查询时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date qryTime;
+
+    /** 查询类型 */
+    @Excel(name = "查询类型", readConverterExp = "ITEM=小箱号,BOX=大箱号,NUMBER=数字码")
+    private String queryType;
+
+    /** 查询状态 */
+    @Excel(name = "查询状态", readConverterExp = "SUCCESS=查询成功,FAILURE=查询失败")
+    private String qryStatus;
+
+    /** 型号ID */
+    private Long modelId;
+
+    /** 型号名称 */
+    @Excel(name = "型号名称")
+    private String modelName;
+
+    /** 序列号 */
+    @Excel(name = "序列号")
+    private String serialNo;
+
+    /** 删除标志 */
+    private String delFlag;
+
+}

+ 62 - 0
src/main/java/com/qryord/project/business/query/mapper/TQueryMapper.java

@@ -0,0 +1,62 @@
+package com.qryord.project.business.query.mapper;
+
+import com.qryord.project.business.query.domain.TQuery;
+
+import java.util.List;
+
+/**
+ * 查询履历Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2022-08-06
+ */
+public interface TQueryMapper 
+{
+    /**
+     * 查询查询履历
+     * 
+     * @param id 查询履历主键
+     * @return 查询履历
+     */
+    public TQuery selectTQueryById(Long id);
+
+    /**
+     * 查询查询履历列表
+     * 
+     * @param tQuery 查询履历
+     * @return 查询履历集合
+     */
+    public List<TQuery> selectTQueryList(TQuery tQuery);
+
+    /**
+     * 新增查询履历
+     * 
+     * @param tQuery 查询履历
+     * @return 结果
+     */
+    public int insertTQuery(TQuery tQuery);
+
+    /**
+     * 修改查询履历
+     * 
+     * @param tQuery 查询履历
+     * @return 结果
+     */
+    public int updateTQuery(TQuery tQuery);
+
+    /**
+     * 删除查询履历
+     * 
+     * @param id 查询履历主键
+     * @return 结果
+     */
+    public int deleteTQueryById(Long id);
+
+    /**
+     * 批量删除查询履历
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteTQueryByIds(String[] ids);
+}

+ 62 - 0
src/main/java/com/qryord/project/business/query/service/ITQueryService.java

@@ -0,0 +1,62 @@
+package com.qryord.project.business.query.service;
+
+import com.qryord.project.business.query.domain.TQuery;
+
+import java.util.List;
+
+/**
+ * 查询履历Service接口
+ * 
+ * @author ruoyi
+ * @date 2022-08-06
+ */
+public interface ITQueryService 
+{
+    /**
+     * 查询查询履历
+     * 
+     * @param id 查询履历主键
+     * @return 查询履历
+     */
+    public TQuery selectTQueryById(Long id);
+
+    /**
+     * 查询查询履历列表
+     * 
+     * @param tQuery 查询履历
+     * @return 查询履历集合
+     */
+    public List<TQuery> selectTQueryList(TQuery tQuery);
+
+    /**
+     * 新增查询履历
+     * 
+     * @param tQuery 查询履历
+     * @return 结果
+     */
+    public int insertTQuery(TQuery tQuery);
+
+    /**
+     * 修改查询履历
+     * 
+     * @param tQuery 查询履历
+     * @return 结果
+     */
+    public int updateTQuery(TQuery tQuery);
+
+    /**
+     * 批量删除查询履历
+     * 
+     * @param ids 需要删除的查询履历主键集合
+     * @return 结果
+     */
+    public int deleteTQueryByIds(String ids);
+
+    /**
+     * 删除查询履历信息
+     * 
+     * @param id 查询履历主键
+     * @return 结果
+     */
+    public int deleteTQueryById(Long id);
+}

+ 98 - 0
src/main/java/com/qryord/project/business/query/service/impl/TQueryServiceImpl.java

@@ -0,0 +1,98 @@
+package com.qryord.project.business.query.service.impl;
+
+import com.qryord.common.utils.DateUtils;
+import com.qryord.common.utils.text.Convert;
+import com.qryord.project.business.query.domain.TQuery;
+import com.qryord.project.business.query.mapper.TQueryMapper;
+import com.qryord.project.business.query.service.ITQueryService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 查询履历Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2022-08-06
+ */
+@Service
+public class TQueryServiceImpl implements ITQueryService 
+{
+    @Autowired
+    private TQueryMapper tQueryMapper;
+
+    /**
+     * 查询查询履历
+     * 
+     * @param id 查询履历主键
+     * @return 查询履历
+     */
+    @Override
+    public TQuery selectTQueryById(Long id)
+    {
+        return tQueryMapper.selectTQueryById(id);
+    }
+
+    /**
+     * 查询查询履历列表
+     * 
+     * @param tQuery 查询履历
+     * @return 查询履历
+     */
+    @Override
+    public List<TQuery> selectTQueryList(TQuery tQuery)
+    {
+        return tQueryMapper.selectTQueryList(tQuery);
+    }
+
+    /**
+     * 新增查询履历
+     * 
+     * @param tQuery 查询履历
+     * @return 结果
+     */
+    @Override
+    public int insertTQuery(TQuery tQuery)
+    {
+        tQuery.setCreateTime(DateUtils.getNowDate());
+        return tQueryMapper.insertTQuery(tQuery);
+    }
+
+    /**
+     * 修改查询履历
+     * 
+     * @param tQuery 查询履历
+     * @return 结果
+     */
+    @Override
+    public int updateTQuery(TQuery tQuery)
+    {
+        tQuery.setUpdateTime(DateUtils.getNowDate());
+        return tQueryMapper.updateTQuery(tQuery);
+    }
+
+    /**
+     * 批量删除查询履历
+     * 
+     * @param ids 需要删除的查询履历主键
+     * @return 结果
+     */
+    @Override
+    public int deleteTQueryByIds(String ids)
+    {
+        return tQueryMapper.deleteTQueryByIds(Convert.toStrArray(ids));
+    }
+
+    /**
+     * 删除查询履历信息
+     * 
+     * @param id 查询履历主键
+     * @return 结果
+     */
+    @Override
+    public int deleteTQueryById(Long id)
+    {
+        return tQueryMapper.deleteTQueryById(id);
+    }
+}

+ 147 - 0
src/main/java/com/qryord/project/master/field/controller/MFieldController.java

@@ -0,0 +1,147 @@
+package com.qryord.project.master.field.controller;
+
+import com.qryord.common.enums.EDelete;
+import com.qryord.common.utils.DateUtils;
+import com.qryord.common.utils.poi.ExcelUtil;
+import com.qryord.common.utils.security.ShiroUtils;
+import com.qryord.framework.aspectj.lang.annotation.Log;
+import com.qryord.framework.aspectj.lang.enums.BusinessType;
+import com.qryord.framework.web.controller.BaseController;
+import com.qryord.framework.web.domain.AjaxResult;
+import com.qryord.framework.web.page.TableDataInfo;
+import com.qryord.project.master.field.domain.MField;
+import com.qryord.project.master.field.service.IMFieldService;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 字段Controller
+ * 
+ * @author ruoyi
+ * @date 2022-08-06
+ */
+@Controller
+@RequestMapping("/master/field")
+public class MFieldController extends BaseController
+{
+    private String prefix = "master/field";
+
+    @Autowired
+    private IMFieldService mFieldService;
+
+    @RequiresPermissions("master:field:view")
+    @GetMapping()
+    public String field()
+    {
+        return prefix + "/field";
+    }
+
+    /**
+     * 查询字段列表
+     */
+    @RequiresPermissions("master:field:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(MField mField)
+    {
+        mField.setDelFlag(EDelete.FALSE.getVal());
+        startPage();
+        List<MField> list = mFieldService.selectMFieldList(mField);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出字段列表
+     */
+    @RequiresPermissions("master:field:export")
+    @Log(title = "字段", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    @ResponseBody
+    public AjaxResult export(MField mField)
+    {
+        List<MField> list = mFieldService.selectMFieldList(mField);
+        ExcelUtil<MField> util = new ExcelUtil<MField>(MField.class);
+        return util.exportExcel(list, "字段数据");
+    }
+
+    /**
+     * 新增字段
+     */
+    @GetMapping("/add")
+    public String add()
+    {
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存字段
+     */
+    @RequiresPermissions("master:field:add")
+    @Log(title = "字段", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(MField mField)
+    {
+        Date nowDate = DateUtils.getNowDate();
+        mField.setDelFlag(EDelete.FALSE.getVal());
+        mField.setCreateBy(ShiroUtils.getLoginName());
+        mField.setCreateTime(nowDate);
+        mField.setUpdateBy(ShiroUtils.getLoginName());
+        mField.setUpdateTime(nowDate);
+        return toAjax(mFieldService.insertMField(mField));
+    }
+
+    /**
+     * 修改字段
+     */
+    @RequiresPermissions("master:field:edit")
+    @GetMapping("/edit/{id}")
+    public String edit(@PathVariable("id") Long id, ModelMap mmap)
+    {
+        MField mField = mFieldService.selectMFieldById(id);
+        mmap.put("mField", mField);
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改保存字段
+     */
+    @RequiresPermissions("master:field:edit")
+    @Log(title = "字段", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(MField mField)
+    {
+        mField.setUpdateBy(ShiroUtils.getLoginName());
+        mField.setUpdateTime(DateUtils.getNowDate());
+        return toAjax(mFieldService.updateMField(mField));
+    }
+
+    /**
+     * 删除字段
+     */
+    @RequiresPermissions("master:field:remove")
+    @Log(title = "字段", businessType = BusinessType.DELETE)
+    @PostMapping( "/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids)
+    {
+        return toAjax(mFieldService.deleteMFieldByIds(ids));
+    }
+
+
+    @RequiresPermissions("master:field:edit")
+    @Log(title = "字段拖动排序", businessType = BusinessType.UPDATE)
+    @PostMapping("/sorted")
+    @ResponseBody
+    public AjaxResult saveSorted(MField mField){
+        return toAjax(mFieldService.dragSorted(mField));
+    }
+
+}

+ 35 - 0
src/main/java/com/qryord/project/master/field/domain/MField.java

@@ -0,0 +1,35 @@
+package com.qryord.project.master.field.domain;
+
+import com.qryord.framework.aspectj.lang.annotation.Excel;
+import com.qryord.framework.web.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+/**
+ * 字段对象 m_field
+ * 
+ * @author ruoyi
+ * @date 2022-08-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString
+public class MField extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    private Long id;
+
+    /** 字段KEYID */
+    @Excel(name = "字段KEYID")
+    private String fieldKey;
+
+    /** 排序 */
+    private Integer sort;
+
+    /** 删除标志 */
+    private String delFlag;
+
+}

+ 69 - 0
src/main/java/com/qryord/project/master/field/mapper/MFieldMapper.java

@@ -0,0 +1,69 @@
+package com.qryord.project.master.field.mapper;
+
+import com.qryord.project.master.field.domain.MField;
+
+import java.util.List;
+
+/**
+ * 字段Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2022-08-06
+ */
+public interface MFieldMapper 
+{
+    /**
+     * 查询字段
+     * 
+     * @param id 字段主键
+     * @return 字段
+     */
+    public MField selectMFieldById(Long id);
+
+    /**
+     * 查询字段列表
+     * 
+     * @param mField 字段
+     * @return 字段集合
+     */
+    public List<MField> selectMFieldList(MField mField);
+
+    /**
+     * 新增字段
+     * 
+     * @param mField 字段
+     * @return 结果
+     */
+    public int insertMField(MField mField);
+
+    /**
+     * 修改字段
+     * 
+     * @param mField 字段
+     * @return 结果
+     */
+    public int updateMField(MField mField);
+
+    /**
+     * 删除字段
+     * 
+     * @param id 字段主键
+     * @return 结果
+     */
+    public int deleteMFieldById(Long id);
+
+    /**
+     * 批量删除字段
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteMFieldByIds(String[] ids);
+
+    /**
+     * 批量修改字段
+     * @param list
+     * @return
+     */
+    int updateList(List<MField> list);
+}

+ 69 - 0
src/main/java/com/qryord/project/master/field/service/IMFieldService.java

@@ -0,0 +1,69 @@
+package com.qryord.project.master.field.service;
+
+import com.qryord.project.master.field.domain.MField;
+
+import java.util.List;
+
+/**
+ * 字段Service接口
+ * 
+ * @author ruoyi
+ * @date 2022-08-06
+ */
+public interface IMFieldService 
+{
+    /**
+     * 查询字段
+     * 
+     * @param id 字段主键
+     * @return 字段
+     */
+    public MField selectMFieldById(Long id);
+
+    /**
+     * 查询字段列表
+     * 
+     * @param mField 字段
+     * @return 字段集合
+     */
+    public List<MField> selectMFieldList(MField mField);
+
+    /**
+     * 新增字段
+     * 
+     * @param mField 字段
+     * @return 结果
+     */
+    public int insertMField(MField mField);
+
+    /**
+     * 修改字段
+     * 
+     * @param mField 字段
+     * @return 结果
+     */
+    public int updateMField(MField mField);
+
+    /**
+     * 批量删除字段
+     * 
+     * @param ids 需要删除的字段主键集合
+     * @return 结果
+     */
+    public int deleteMFieldByIds(String ids);
+
+    /**
+     * 删除字段信息
+     * 
+     * @param id 字段主键
+     * @return 结果
+     */
+    public int deleteMFieldById(Long id);
+
+    /**
+     * 字段拖动排序
+     * @param mField
+     * @return
+     */
+    int dragSorted(MField mField);
+}

+ 196 - 0
src/main/java/com/qryord/project/master/field/service/impl/MFieldServiceImpl.java

@@ -0,0 +1,196 @@
+package com.qryord.project.master.field.service.impl;
+
+import com.qryord.common.enums.EDelete;
+import com.qryord.common.utils.DateUtils;
+import com.qryord.common.utils.security.ShiroUtils;
+import com.qryord.common.utils.text.Convert;
+import com.qryord.project.master.field.domain.MField;
+import com.qryord.project.master.field.mapper.MFieldMapper;
+import com.qryord.project.master.field.service.IMFieldService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * 字段Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2022-08-06
+ */
+@Service
+public class MFieldServiceImpl implements IMFieldService 
+{
+    @Autowired
+    private MFieldMapper mFieldMapper;
+
+    /**
+     * 查询字段
+     * 
+     * @param id 字段主键
+     * @return 字段
+     */
+    @Override
+    public MField selectMFieldById(Long id)
+    {
+        return mFieldMapper.selectMFieldById(id);
+    }
+
+    /**
+     * 查询字段列表
+     * 
+     * @param mField 字段
+     * @return 字段
+     */
+    @Override
+    public List<MField> selectMFieldList(MField mField)
+    {
+        return mFieldMapper.selectMFieldList(mField);
+    }
+
+    /**
+     * 新增字段
+     * 
+     * @param mField 字段
+     * @return 结果
+     */
+    @Override
+    public int insertMField(MField mField)
+    {
+        mField.setCreateTime(DateUtils.getNowDate());
+        return mFieldMapper.insertMField(mField);
+    }
+
+    /**
+     * 修改字段
+     * 
+     * @param mField 字段
+     * @return 结果
+     */
+    @Override
+    public int updateMField(MField mField)
+    {
+        mField.setUpdateTime(DateUtils.getNowDate());
+        return mFieldMapper.updateMField(mField);
+    }
+
+    /**
+     * 批量删除字段
+     * 
+     * @param ids 需要删除的字段主键
+     * @return 结果
+     */
+    @Override
+    public int deleteMFieldByIds(String ids)
+    {
+        return mFieldMapper.deleteMFieldByIds(Convert.toStrArray(ids));
+    }
+
+    /**
+     * 删除字段信息
+     * 
+     * @param id 字段主键
+     * @return 结果
+     */
+    @Override
+    public int deleteMFieldById(Long id)
+    {
+        return mFieldMapper.deleteMFieldById(id);
+    }
+
+    @Transactional
+    @Override
+    public int dragSorted(MField mField) {
+
+        if (mField.getParams().containsKey("inputSort")) {
+            inputSort(mField);
+            return 1;
+
+        } else {
+
+            int result = 0;
+            int pageSize = 10;
+            int pageNumber = 1;
+            Object pz = mField.getParams().get("pageSize");
+            if (pz != null) {
+                pageSize = Convert.toInt(pz, 10);
+            }
+            Object pn = mField.getParams().get("pageNumber");
+            if (pn != null) {
+                pageNumber = Convert.toInt(pn, 1);
+            }
+            List<MField> sorteds = mField.getPramsByName("sorted", MField.class);
+            if (!sorteds.isEmpty()) {
+                int sort = pageSize * (pageNumber - 1) + 1;
+                for (MField entity : sorteds) {
+                    entity.setUpdateBy(ShiroUtils.getLoginName());
+                    entity.setUpdateTime(new Date());
+                    entity.setSort(sort++);
+                }
+                result = mFieldMapper.updateList(sorteds);
+            }
+            return result;
+        }
+    }
+
+
+    public void inputSort(MField mField) {
+        Object obj = mField.getParams().get("inputSort");
+        int inputSort = Integer.parseInt((String) obj);
+
+        MField cond = new MField();
+        cond.setDelFlag(EDelete.FALSE.getVal());
+        List<MField> fields = mFieldMapper.selectMFieldList(cond);
+        if (fields != null && !fields.isEmpty()) {
+
+            int size = fields.size();
+            int newIdx = inputSort;
+            if (inputSort >= size) {
+                newIdx = size - 1;
+            } else {
+                if (newIdx <= 0) {
+                    newIdx = 0;
+                } else {
+                    newIdx = newIdx - 1;
+                }
+            }
+
+            String prodTableId = mField.getId() + "";
+            LinkedList<MField> newProds = new LinkedList<>(fields);
+
+            int oldIndex = -1;
+            for (int i = 0; i < size; i++) {
+                MField data = newProds.get(i);
+                String oldId = data.getId() + "";
+                if (oldId.equals(prodTableId)) {
+                    oldIndex = i;
+                    break;
+                }
+            }
+
+            if (oldIndex >= 0 && oldIndex != newIdx) {
+
+                for (int i = 0; i < size; i++) {
+                    MField data = newProds.get(i);
+                    String recordId = data.getId() + "";
+                    if (recordId.equals(prodTableId)) {
+                        newProds.remove(oldIndex);
+                        newProds.add(newIdx, data);
+                        break;
+                    }
+                }
+
+                for (int i = 0; i < size; i++) {
+                    MField data = newProds.get(i);
+                    data.setSort(i + 1);
+                }
+
+                // 1000个以内
+                mFieldMapper.updateList(newProds);
+            }
+        }
+    }
+}

+ 156 - 0
src/main/java/com/qryord/project/master/model/controller/ModelController.java

@@ -0,0 +1,156 @@
+package com.qryord.project.master.model.controller;
+
+import com.qryord.common.enums.EDelete;
+import com.qryord.common.utils.DateUtils;
+import com.qryord.common.utils.poi.ExcelUtil;
+import com.qryord.common.utils.security.ShiroUtils;
+import com.qryord.framework.aspectj.lang.annotation.Log;
+import com.qryord.framework.aspectj.lang.enums.BusinessType;
+import com.qryord.framework.web.controller.BaseController;
+import com.qryord.framework.web.domain.AjaxResult;
+import com.qryord.framework.web.page.TableDataInfo;
+import com.qryord.project.master.model.domain.Model;
+import com.qryord.project.master.model.service.IModelService;
+import com.qryord.project.master.modelKind.domain.ModelKind;
+import com.qryord.project.master.modelKind.service.IModelKindService;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 商品型号Controller
+ * 
+ * @author ruoyi
+ * @date 2022-08-06
+ */
+@Controller
+@RequestMapping("/master/model")
+public class ModelController extends BaseController
+{
+    private String prefix = "master/model";
+
+    @Autowired
+    private IModelKindService modelKindService;
+    @Autowired
+    private IModelService modelService;
+
+    @RequiresPermissions("master:model:view")
+    @GetMapping()
+    public String model(ModelMap mmap)
+    {
+        ModelKind cond = new ModelKind();
+        cond.setDelFlag(EDelete.FALSE.getVal());
+        List<ModelKind> modelKindList = modelKindService.selectModelKindList(cond);
+        mmap.put("modelKindList", modelKindList);
+
+        return prefix + "/model";
+    }
+
+    /**
+     * 查询商品型号列表
+     */
+    @RequiresPermissions("master:model:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(Model model)
+    {
+        model.setDelFlag(EDelete.FALSE.getVal());
+        startPage();
+        List<Model> list = modelService.selectModelList(model);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出商品型号列表
+     */
+    @RequiresPermissions("master:model:export")
+    @Log(title = "商品型号", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    @ResponseBody
+    public AjaxResult export(Model model)
+    {
+        List<Model> list = modelService.selectModelList(model);
+        ExcelUtil<Model> util = new ExcelUtil<Model>(Model.class);
+        return util.exportExcel(list, "商品型号数据");
+    }
+
+    /**
+     * 新增商品型号
+     */
+    @GetMapping("/add")
+    public String add(ModelMap mmap)
+    {
+        ModelKind cond = new ModelKind();
+        cond.setDelFlag(EDelete.FALSE.getVal());
+        List<ModelKind> modelKindList = modelKindService.selectModelKindList(cond);
+        mmap.put("modelKindList", modelKindList);
+
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存商品型号
+     */
+    @RequiresPermissions("master:model:add")
+    @Log(title = "商品型号", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(Model model)
+    {
+        Date nowDate = DateUtils.getNowDate();
+        model.setDelFlag(EDelete.FALSE.getVal());
+        model.setCreateBy(ShiroUtils.getLoginName());
+        model.setCreateTime(nowDate);
+        model.setUpdateBy(ShiroUtils.getLoginName());
+        model.setUpdateTime(nowDate);
+        return toAjax(modelService.insertModel(model));
+    }
+
+    /**
+     * 修改商品型号
+     */
+    @RequiresPermissions("master:model:edit")
+    @GetMapping("/edit/{id}")
+    public String edit(@PathVariable("id") Long id, ModelMap mmap)
+    {
+        Model model = modelService.selectModelById(id);
+        mmap.put("model", model);
+        ModelKind cond = new ModelKind();
+        cond.setDelFlag(EDelete.FALSE.getVal());
+        List<ModelKind> modelKindList = modelKindService.selectModelKindList(cond);
+        mmap.put("modelKindList", modelKindList);
+
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改保存商品型号
+     */
+    @RequiresPermissions("master:model:edit")
+    @Log(title = "商品型号", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(Model model)
+    {
+        model.setUpdateBy(ShiroUtils.getLoginName());
+        model.setUpdateTime(DateUtils.getNowDate());
+        return toAjax(modelService.updateModel(model));
+    }
+
+    /**
+     * 删除商品型号
+     */
+    @RequiresPermissions("master:model:remove")
+    @Log(title = "商品型号", businessType = BusinessType.DELETE)
+    @PostMapping( "/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids)
+    {
+        return toAjax(modelService.deleteModelByIds(ids));
+    }
+}

+ 37 - 0
src/main/java/com/qryord/project/master/model/domain/Model.java

@@ -0,0 +1,37 @@
+package com.qryord.project.master.model.domain;
+
+import com.qryord.framework.aspectj.lang.annotation.Excel;
+import com.qryord.framework.web.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+/**
+ * 商品型号对象 m_model
+ * 
+ * @author ruoyi
+ * @date 2022-08-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString
+public class Model extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    private Long id;
+
+    /** 商品型号分类主键 */
+    private Long mkId;
+
+    /** 型号名称 */
+    @Excel(name = "型号名称")
+    private String modelName;
+
+    /** 删除标志 */
+    private String delFlag;
+
+    private String modelKindName;
+
+}

+ 62 - 0
src/main/java/com/qryord/project/master/model/mapper/ModelMapper.java

@@ -0,0 +1,62 @@
+package com.qryord.project.master.model.mapper;
+
+import com.qryord.project.master.model.domain.Model;
+
+import java.util.List;
+
+/**
+ * 商品型号Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2022-08-06
+ */
+public interface ModelMapper 
+{
+    /**
+     * 查询商品型号
+     * 
+     * @param id 商品型号主键
+     * @return 商品型号
+     */
+    public Model selectModelById(Long id);
+
+    /**
+     * 查询商品型号列表
+     * 
+     * @param model 商品型号
+     * @return 商品型号集合
+     */
+    public List<Model> selectModelList(Model model);
+
+    /**
+     * 新增商品型号
+     * 
+     * @param model 商品型号
+     * @return 结果
+     */
+    public int insertModel(Model model);
+
+    /**
+     * 修改商品型号
+     * 
+     * @param model 商品型号
+     * @return 结果
+     */
+    public int updateModel(Model model);
+
+    /**
+     * 删除商品型号
+     * 
+     * @param id 商品型号主键
+     * @return 结果
+     */
+    public int deleteModelById(Long id);
+
+    /**
+     * 批量删除商品型号
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteModelByIds(String[] ids);
+}

+ 62 - 0
src/main/java/com/qryord/project/master/model/service/IModelService.java

@@ -0,0 +1,62 @@
+package com.qryord.project.master.model.service;
+
+import com.qryord.project.master.model.domain.Model;
+
+import java.util.List;
+
+/**
+ * 商品型号Service接口
+ * 
+ * @author ruoyi
+ * @date 2022-08-06
+ */
+public interface IModelService 
+{
+    /**
+     * 查询商品型号
+     * 
+     * @param id 商品型号主键
+     * @return 商品型号
+     */
+    public Model selectModelById(Long id);
+
+    /**
+     * 查询商品型号列表
+     * 
+     * @param model 商品型号
+     * @return 商品型号集合
+     */
+    public List<Model> selectModelList(Model model);
+
+    /**
+     * 新增商品型号
+     * 
+     * @param model 商品型号
+     * @return 结果
+     */
+    public int insertModel(Model model);
+
+    /**
+     * 修改商品型号
+     * 
+     * @param model 商品型号
+     * @return 结果
+     */
+    public int updateModel(Model model);
+
+    /**
+     * 批量删除商品型号
+     * 
+     * @param ids 需要删除的商品型号主键集合
+     * @return 结果
+     */
+    public int deleteModelByIds(String ids);
+
+    /**
+     * 删除商品型号信息
+     * 
+     * @param id 商品型号主键
+     * @return 结果
+     */
+    public int deleteModelById(Long id);
+}

+ 98 - 0
src/main/java/com/qryord/project/master/model/service/impl/ModelServiceImpl.java

@@ -0,0 +1,98 @@
+package com.qryord.project.master.model.service.impl;
+
+import com.qryord.common.utils.DateUtils;
+import com.qryord.common.utils.text.Convert;
+import com.qryord.project.master.model.domain.Model;
+import com.qryord.project.master.model.mapper.ModelMapper;
+import com.qryord.project.master.model.service.IModelService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 商品型号Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2022-08-06
+ */
+@Service
+public class ModelServiceImpl implements IModelService 
+{
+    @Autowired
+    private ModelMapper modelMapper;
+
+    /**
+     * 查询商品型号
+     * 
+     * @param id 商品型号主键
+     * @return 商品型号
+     */
+    @Override
+    public Model selectModelById(Long id)
+    {
+        return modelMapper.selectModelById(id);
+    }
+
+    /**
+     * 查询商品型号列表
+     * 
+     * @param model 商品型号
+     * @return 商品型号
+     */
+    @Override
+    public List<Model> selectModelList(Model model)
+    {
+        return modelMapper.selectModelList(model);
+    }
+
+    /**
+     * 新增商品型号
+     * 
+     * @param model 商品型号
+     * @return 结果
+     */
+    @Override
+    public int insertModel(Model model)
+    {
+        model.setCreateTime(DateUtils.getNowDate());
+        return modelMapper.insertModel(model);
+    }
+
+    /**
+     * 修改商品型号
+     * 
+     * @param model 商品型号
+     * @return 结果
+     */
+    @Override
+    public int updateModel(Model model)
+    {
+        model.setUpdateTime(DateUtils.getNowDate());
+        return modelMapper.updateModel(model);
+    }
+
+    /**
+     * 批量删除商品型号
+     * 
+     * @param ids 需要删除的商品型号主键
+     * @return 结果
+     */
+    @Override
+    public int deleteModelByIds(String ids)
+    {
+        return modelMapper.deleteModelByIds(Convert.toStrArray(ids));
+    }
+
+    /**
+     * 删除商品型号信息
+     * 
+     * @param id 商品型号主键
+     * @return 结果
+     */
+    @Override
+    public int deleteModelById(Long id)
+    {
+        return modelMapper.deleteModelById(id);
+    }
+}

+ 124 - 0
src/main/java/com/qryord/project/master/modelKind/controller/ModelKindController.java

@@ -0,0 +1,124 @@
+package com.qryord.project.master.modelKind.controller;
+
+import com.qryord.common.utils.poi.ExcelUtil;
+import com.qryord.framework.aspectj.lang.annotation.Log;
+import com.qryord.framework.aspectj.lang.enums.BusinessType;
+import com.qryord.framework.web.controller.BaseController;
+import com.qryord.framework.web.domain.AjaxResult;
+import com.qryord.framework.web.page.TableDataInfo;
+import com.qryord.project.master.modelKind.domain.ModelKind;
+import com.qryord.project.master.modelKind.service.IModelKindService;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 商品型号分类Controller
+ * 
+ * @author ruoyi
+ * @date 2022-09-30
+ */
+@Controller
+@RequestMapping("/master/modelKind")
+public class ModelKindController extends BaseController
+{
+    private String prefix = "master/modelKind";
+
+    @Autowired
+    private IModelKindService mModelKindService;
+
+    @RequiresPermissions("master:modelKind:view")
+    @GetMapping()
+    public String modelKind()
+    {
+        return prefix + "/modelKind";
+    }
+
+    /**
+     * 查询商品型号分类列表
+     */
+    @RequiresPermissions("master:modelKind:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(ModelKind mModelKind)
+    {
+        startPage();
+        List<ModelKind> list = mModelKindService.selectModelKindList(mModelKind);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出商品型号分类列表
+     */
+    @RequiresPermissions("master:modelKind:export")
+    @Log(title = "商品型号分类", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    @ResponseBody
+    public AjaxResult export(ModelKind mModelKind)
+    {
+        List<ModelKind> list = mModelKindService.selectModelKindList(mModelKind);
+        ExcelUtil<ModelKind> util = new ExcelUtil<ModelKind>(ModelKind.class);
+        return util.exportExcel(list, "商品型号分类数据");
+    }
+
+    /**
+     * 新增商品型号分类
+     */
+    @GetMapping("/add")
+    public String add()
+    {
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存商品型号分类
+     */
+    @RequiresPermissions("master:modelKind:add")
+    @Log(title = "商品型号分类", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(ModelKind mModelKind)
+    {
+        return toAjax(mModelKindService.insertModelKind(mModelKind));
+    }
+
+    /**
+     * 修改商品型号分类
+     */
+    @RequiresPermissions("master:modelKind:edit")
+    @GetMapping("/edit/{id}")
+    public String edit(@PathVariable("id") Long id, ModelMap mmap)
+    {
+        ModelKind mModelKind = mModelKindService.selectModelKindById(id);
+        mmap.put("mModelKind", mModelKind);
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改保存商品型号分类
+     */
+    @RequiresPermissions("master:modelKind:edit")
+    @Log(title = "商品型号分类", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(ModelKind mModelKind)
+    {
+        return toAjax(mModelKindService.updateModelKind(mModelKind));
+    }
+
+    /**
+     * 删除商品型号分类
+     */
+    @RequiresPermissions("master:modelKind:remove")
+    @Log(title = "商品型号分类", businessType = BusinessType.DELETE)
+    @PostMapping( "/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids)
+    {
+        return toAjax(mModelKindService.deleteModelKindByIds(ids));
+    }
+}

+ 32 - 0
src/main/java/com/qryord/project/master/modelKind/domain/ModelKind.java

@@ -0,0 +1,32 @@
+package com.qryord.project.master.modelKind.domain;
+
+import com.qryord.framework.aspectj.lang.annotation.Excel;
+import com.qryord.framework.web.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+/**
+ * 商品型号分类对象 m_model_kind
+ * 
+ * @author ruoyi
+ * @date 2022-09-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString
+public class ModelKind extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    private Long id;
+
+    /** 分类名称 */
+    @Excel(name = "分类名称")
+    private String kindName;
+
+    /** 删除标志 */
+    private String delFlag;
+
+}

+ 62 - 0
src/main/java/com/qryord/project/master/modelKind/mapper/ModelKindMapper.java

@@ -0,0 +1,62 @@
+package com.qryord.project.master.modelKind.mapper;
+
+import com.qryord.project.master.modelKind.domain.ModelKind;
+
+import java.util.List;
+
+/**
+ * 商品型号分类Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2022-09-30
+ */
+public interface ModelKindMapper
+{
+    /**
+     * 查询商品型号分类
+     * 
+     * @param id 商品型号分类主键
+     * @return 商品型号分类
+     */
+    public ModelKind selectModelKindById(Long id);
+
+    /**
+     * 查询商品型号分类列表
+     * 
+     * @param modelKind 商品型号分类
+     * @return 商品型号分类集合
+     */
+    public List<ModelKind> selectModelKindList(ModelKind modelKind);
+
+    /**
+     * 新增商品型号分类
+     * 
+     * @param modelKind 商品型号分类
+     * @return 结果
+     */
+    public int insertModelKind(ModelKind modelKind);
+
+    /**
+     * 修改商品型号分类
+     * 
+     * @param modelKind 商品型号分类
+     * @return 结果
+     */
+    public int updateModelKind(ModelKind modelKind);
+
+    /**
+     * 删除商品型号分类
+     * 
+     * @param id 商品型号分类主键
+     * @return 结果
+     */
+    public int deleteModelKindById(Long id);
+
+    /**
+     * 批量删除商品型号分类
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteModelKindByIds(String[] ids);
+}

+ 62 - 0
src/main/java/com/qryord/project/master/modelKind/service/IModelKindService.java

@@ -0,0 +1,62 @@
+package com.qryord.project.master.modelKind.service;
+
+import com.qryord.project.master.modelKind.domain.ModelKind;
+
+import java.util.List;
+
+/**
+ * 商品型号分类Service接口
+ * 
+ * @author ruoyi
+ * @date 2022-09-30
+ */
+public interface IModelKindService
+{
+    /**
+     * 查询商品型号分类
+     * 
+     * @param id 商品型号分类主键
+     * @return 商品型号分类
+     */
+    public ModelKind selectModelKindById(Long id);
+
+    /**
+     * 查询商品型号分类列表
+     * 
+     * @param mModelKind 商品型号分类
+     * @return 商品型号分类集合
+     */
+    public List<ModelKind> selectModelKindList(ModelKind mModelKind);
+
+    /**
+     * 新增商品型号分类
+     * 
+     * @param mModelKind 商品型号分类
+     * @return 结果
+     */
+    public int insertModelKind(ModelKind mModelKind);
+
+    /**
+     * 修改商品型号分类
+     * 
+     * @param mModelKind 商品型号分类
+     * @return 结果
+     */
+    public int updateModelKind(ModelKind mModelKind);
+
+    /**
+     * 批量删除商品型号分类
+     * 
+     * @param ids 需要删除的商品型号分类主键集合
+     * @return 结果
+     */
+    public int deleteModelKindByIds(String ids);
+
+    /**
+     * 删除商品型号分类信息
+     * 
+     * @param id 商品型号分类主键
+     * @return 结果
+     */
+    public int deleteModelKindById(Long id);
+}

+ 98 - 0
src/main/java/com/qryord/project/master/modelKind/service/impl/ModelKindServiceImpl.java

@@ -0,0 +1,98 @@
+package com.qryord.project.master.modelKind.service.impl;
+
+import com.qryord.common.utils.DateUtils;
+import com.qryord.common.utils.text.Convert;
+import com.qryord.project.master.modelKind.domain.ModelKind;
+import com.qryord.project.master.modelKind.mapper.ModelKindMapper;
+import com.qryord.project.master.modelKind.service.IModelKindService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 商品型号分类Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2022-09-30
+ */
+@Service
+public class ModelKindServiceImpl implements IModelKindService
+{
+    @Autowired
+    private ModelKindMapper mModelKindMapper;
+
+    /**
+     * 查询商品型号分类
+     * 
+     * @param id 商品型号分类主键
+     * @return 商品型号分类
+     */
+    @Override
+    public ModelKind selectModelKindById(Long id)
+    {
+        return mModelKindMapper.selectModelKindById(id);
+    }
+
+    /**
+     * 查询商品型号分类列表
+     * 
+     * @param mModelKind 商品型号分类
+     * @return 商品型号分类
+     */
+    @Override
+    public List<ModelKind> selectModelKindList(ModelKind mModelKind)
+    {
+        return mModelKindMapper.selectModelKindList(mModelKind);
+    }
+
+    /**
+     * 新增商品型号分类
+     * 
+     * @param mModelKind 商品型号分类
+     * @return 结果
+     */
+    @Override
+    public int insertModelKind(ModelKind mModelKind)
+    {
+        mModelKind.setCreateTime(DateUtils.getNowDate());
+        return mModelKindMapper.insertModelKind(mModelKind);
+    }
+
+    /**
+     * 修改商品型号分类
+     * 
+     * @param mModelKind 商品型号分类
+     * @return 结果
+     */
+    @Override
+    public int updateModelKind(ModelKind mModelKind)
+    {
+        mModelKind.setUpdateTime(DateUtils.getNowDate());
+        return mModelKindMapper.updateModelKind(mModelKind);
+    }
+
+    /**
+     * 批量删除商品型号分类
+     * 
+     * @param ids 需要删除的商品型号分类主键
+     * @return 结果
+     */
+    @Override
+    public int deleteModelKindByIds(String ids)
+    {
+        return mModelKindMapper.deleteModelKindByIds(Convert.toStrArray(ids));
+    }
+
+    /**
+     * 删除商品型号分类信息
+     * 
+     * @param id 商品型号分类主键
+     * @return 结果
+     */
+    @Override
+    public int deleteModelKindById(Long id)
+    {
+        return mModelKindMapper.deleteModelKindById(id);
+    }
+}

+ 165 - 0
src/main/java/com/qryord/project/master/roleField/controller/RoleFieldController.java

@@ -0,0 +1,165 @@
+package com.qryord.project.master.roleField.controller;
+
+import com.qryord.common.enums.EDelete;
+import com.qryord.common.utils.DateUtils;
+import com.qryord.common.utils.poi.ExcelUtil;
+import com.qryord.common.utils.security.ShiroUtils;
+import com.qryord.framework.aspectj.lang.annotation.Log;
+import com.qryord.framework.aspectj.lang.enums.BusinessType;
+import com.qryord.framework.web.controller.BaseController;
+import com.qryord.framework.web.domain.AjaxResult;
+import com.qryord.framework.web.page.TableDataInfo;
+import com.qryord.project.master.roleField.domain.RoleField;
+import com.qryord.project.master.roleField.service.IRoleFieldService;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 角色字段控制Controller
+ * 
+ * @author ruoyi
+ * @date 2022-08-06
+ */
+@Controller
+@RequestMapping("/master/roleField")
+public class RoleFieldController extends BaseController
+{
+    private String prefix = "master/roleField";
+
+    @Autowired
+    private IRoleFieldService roleFieldService;
+
+    @RequiresPermissions("master:roleField:view")
+    @GetMapping()
+    public String roleField()
+    {
+        return prefix + "/roleField";
+    }
+
+    /**
+     * 查询角色字段控制列表
+     */
+    @RequiresPermissions("master:roleField:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(RoleField roleField)
+    {
+        roleField.setDelFlag(EDelete.FALSE.getVal());
+        startPage();
+        List<RoleField> list = roleFieldService.selectRoleList(roleField);
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询角色字段控制列表
+     */
+    @RequiresPermissions("master:roleField:list")
+    @PostMapping("/listDetail")
+    @ResponseBody
+    public TableDataInfo listDetail(RoleField roleField)
+    {
+        roleField.setDelFlag(EDelete.FALSE.getVal());
+        startPage();
+        List<RoleField> list = roleFieldService.selectFieldList(roleField);
+        for (RoleField rf : list) {
+            rf.setRoleKey(roleField.getRoleKey());
+        }
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出角色字段控制列表
+     */
+    @RequiresPermissions("master:roleField:export")
+    @Log(title = "角色字段控制", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    @ResponseBody
+    public AjaxResult export(RoleField roleField)
+    {
+        List<RoleField> list = roleFieldService.selectRoleFieldList(roleField);
+        ExcelUtil<RoleField> util = new ExcelUtil<RoleField>(RoleField.class);
+        return util.exportExcel(list, "角色字段控制数据");
+    }
+
+    /**
+     * 新增角色字段控制
+     */
+    @GetMapping("/add")
+    public String add()
+    {
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存角色字段控制
+     */
+    @RequiresPermissions("master:roleField:add")
+    @Log(title = "角色字段控制", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(RoleField roleField)
+    {
+        Date nowDate = DateUtils.getNowDate();
+        roleField.setDelFlag(EDelete.FALSE.getVal());
+        roleField.setCreateBy(ShiroUtils.getLoginName());
+        roleField.setCreateTime(nowDate);
+        roleField.setUpdateBy(ShiroUtils.getLoginName());
+        roleField.setUpdateTime(nowDate);
+        return toAjax(roleFieldService.insertRoleField(roleField));
+    }
+
+    /**
+     * 修改角色字段控制
+     */
+    @RequiresPermissions("master:roleField:edit")
+    @GetMapping("/edit/{id}")
+    public String edit(@PathVariable("id") Long id, ModelMap mmap)
+    {
+        RoleField roleField = roleFieldService.selectRoleFieldById(id);
+        mmap.put("roleField", roleField);
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改保存角色字段控制
+     */
+    @RequiresPermissions("master:roleField:edit")
+    @Log(title = "角色字段控制", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(RoleField roleField)
+    {
+        roleField.setUpdateBy(ShiroUtils.getLoginName());
+        roleField.setUpdateTime(DateUtils.getNowDate());
+        return toAjax(roleFieldService.updateRoleField(roleField));
+    }
+
+    /**
+     * 删除角色字段控制
+     */
+    @RequiresPermissions("master:roleField:remove")
+    @Log(title = "角色字段控制", businessType = BusinessType.DELETE)
+    @PostMapping( "/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids)
+    {
+        return toAjax(roleFieldService.deleteRoleFieldByIds(ids));
+    }
+
+    @Log(title = "角色字段控制;", businessType = BusinessType.UPDATE)
+    @RequiresPermissions("master:roleField:edit")
+    @PostMapping("/changeShowFlag")
+    @ResponseBody
+    public AjaxResult changeShowFlag(RoleField roleField) {
+
+        roleField.setUpdateBy(ShiroUtils.getLoginName());
+        roleField.setUpdateTime(DateUtils.getNowDate());
+        return toAjax(roleFieldService.changeShowFlag(roleField));
+    }
+}

+ 40 - 0
src/main/java/com/qryord/project/master/roleField/domain/RoleField.java

@@ -0,0 +1,40 @@
+package com.qryord.project.master.roleField.domain;
+
+import com.qryord.framework.aspectj.lang.annotation.Excel;
+import com.qryord.framework.web.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+/**
+ * 角色字段控制对象 m_role_field
+ * 
+ * @author ruoyi
+ * @date 2022-08-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString
+public class RoleField extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    private Long id;
+
+    /** 角色主键 */
+    @Excel(name = "角色主键")
+    private String roleKey;
+
+    /** 字段KEYID */
+    @Excel(name = "字段KEY")
+    private String fieldKey;
+
+    /** 显示标志 */
+    @Excel(name = "显示标志", readConverterExp = "0=不显示,1=显示")
+    private String showFlag;
+
+    /** 删除标志 */
+    private String delFlag;
+
+}

+ 79 - 0
src/main/java/com/qryord/project/master/roleField/mapper/RoleFieldMapper.java

@@ -0,0 +1,79 @@
+package com.qryord.project.master.roleField.mapper;
+
+import com.qryord.project.master.roleField.domain.RoleField;
+
+import java.util.List;
+
+/**
+ * 角色字段控制Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2022-08-06
+ */
+public interface RoleFieldMapper 
+{
+    /**
+     * 查询角色字段控制
+     * 
+     * @param id 角色字段控制主键
+     * @return 角色字段控制
+     */
+    public RoleField selectRoleFieldById(Long id);
+
+    /**
+     * 查询角色字段控制列表
+     * 
+     * @param roleField 角色字段控制
+     * @return 角色字段控制集合
+     */
+    public List<RoleField> selectRoleFieldList(RoleField roleField);
+
+    /**
+     * 新增角色字段控制
+     * 
+     * @param roleField 角色字段控制
+     * @return 结果
+     */
+    public int insertRoleField(RoleField roleField);
+
+    /**
+     * 修改角色字段控制
+     * 
+     * @param roleField 角色字段控制
+     * @return 结果
+     */
+    public int updateRoleField(RoleField roleField);
+
+    /**
+     * 删除角色字段控制
+     * 
+     * @param id 角色字段控制主键
+     * @return 结果
+     */
+    public int deleteRoleFieldById(Long id);
+
+    /**
+     * 批量删除角色字段控制
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteRoleFieldByIds(String[] ids);
+
+
+    /**
+     * 查询角色字段控制列表
+     *
+     * @param roleField 角色字段控制
+     * @return 角色字段控制集合
+     */
+    public List<RoleField> selectRoleList(RoleField roleField);
+
+    /**
+     * 查询角色字段控制列表
+     *
+     * @param roleField 角色字段控制
+     * @return 角色字段控制集合
+     */
+    public List<RoleField> selectFieldList(RoleField roleField);
+}

+ 87 - 0
src/main/java/com/qryord/project/master/roleField/service/IRoleFieldService.java

@@ -0,0 +1,87 @@
+package com.qryord.project.master.roleField.service;
+
+import com.qryord.project.master.roleField.domain.RoleField;
+
+import java.util.List;
+
+/**
+ * 角色字段控制Service接口
+ * 
+ * @author ruoyi
+ * @date 2022-08-06
+ */
+public interface IRoleFieldService 
+{
+    /**
+     * 查询角色字段控制
+     * 
+     * @param id 角色字段控制主键
+     * @return 角色字段控制
+     */
+    public RoleField selectRoleFieldById(Long id);
+
+    /**
+     * 查询角色字段控制列表
+     * 
+     * @param roleField 角色字段控制
+     * @return 角色字段控制集合
+     */
+    public List<RoleField> selectRoleFieldList(RoleField roleField);
+
+    /**
+     * 新增角色字段控制
+     * 
+     * @param roleField 角色字段控制
+     * @return 结果
+     */
+    public int insertRoleField(RoleField roleField);
+
+    /**
+     * 修改角色字段控制
+     * 
+     * @param roleField 角色字段控制
+     * @return 结果
+     */
+    public int updateRoleField(RoleField roleField);
+
+    /**
+     * 批量删除角色字段控制
+     * 
+     * @param ids 需要删除的角色字段控制主键集合
+     * @return 结果
+     */
+    public int deleteRoleFieldByIds(String ids);
+
+    /**
+     * 删除角色字段控制信息
+     * 
+     * @param id 角色字段控制主键
+     * @return 结果
+     */
+    public int deleteRoleFieldById(Long id);
+
+    /**
+     * 更新角色字段控制可见信息
+     *
+     * @param roleField 角色字段控制
+     * @return 结果
+     */
+    public int changeShowFlag(RoleField roleField);
+
+    /**
+     * 查询角色字段控制列表
+     *
+     * @param roleField 角色字段控制
+     * @return 角色字段控制集合
+     */
+    public List<RoleField> selectRoleList(RoleField roleField);
+
+    /**
+     * 查询角色字段控制列表
+     *
+     * @param roleField 角色字段控制
+     * @return 角色字段控制集合
+     */
+    public List<RoleField> selectFieldList(RoleField roleField);
+
+}

+ 160 - 0
src/main/java/com/qryord/project/master/roleField/service/impl/RoleFieldServiceImpl.java

@@ -0,0 +1,160 @@
+package com.qryord.project.master.roleField.service.impl;
+
+import com.qryord.common.enums.EDelete;
+import com.qryord.common.enums.EYesNo;
+import com.qryord.common.utils.DateUtils;
+import com.qryord.common.utils.security.ShiroUtils;
+import com.qryord.common.utils.text.Convert;
+import com.qryord.project.master.roleField.domain.RoleField;
+import com.qryord.project.master.roleField.mapper.RoleFieldMapper;
+import com.qryord.project.master.roleField.service.IRoleFieldService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 角色字段控制Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2022-08-06
+ */
+@Service
+public class RoleFieldServiceImpl implements IRoleFieldService 
+{
+    @Autowired
+    private RoleFieldMapper roleFieldMapper;
+
+    /**
+     * 查询角色字段控制
+     * 
+     * @param id 角色字段控制主键
+     * @return 角色字段控制
+     */
+    @Override
+    public RoleField selectRoleFieldById(Long id)
+    {
+        return roleFieldMapper.selectRoleFieldById(id);
+    }
+
+    /**
+     * 查询角色字段控制列表
+     * 
+     * @param roleField 角色字段控制
+     * @return 角色字段控制
+     */
+    @Override
+    public List<RoleField> selectRoleFieldList(RoleField roleField)
+    {
+        return roleFieldMapper.selectRoleFieldList(roleField);
+    }
+
+    /**
+     * 新增角色字段控制
+     * 
+     * @param roleField 角色字段控制
+     * @return 结果
+     */
+    @Override
+    public int insertRoleField(RoleField roleField)
+    {
+        roleField.setCreateTime(DateUtils.getNowDate());
+        return roleFieldMapper.insertRoleField(roleField);
+    }
+
+    /**
+     * 修改角色字段控制
+     * 
+     * @param roleField 角色字段控制
+     * @return 结果
+     */
+    @Override
+    public int updateRoleField(RoleField roleField)
+    {
+        roleField.setUpdateTime(DateUtils.getNowDate());
+        return roleFieldMapper.updateRoleField(roleField);
+    }
+
+    /**
+     * 批量删除角色字段控制
+     * 
+     * @param ids 需要删除的角色字段控制主键
+     * @return 结果
+     */
+    @Override
+    public int deleteRoleFieldByIds(String ids)
+    {
+        return roleFieldMapper.deleteRoleFieldByIds(Convert.toStrArray(ids));
+    }
+
+    /**
+     * 删除角色字段控制信息
+     * 
+     * @param id 角色字段控制主键
+     * @return 结果
+     */
+    @Override
+    public int deleteRoleFieldById(Long id)
+    {
+        return roleFieldMapper.deleteRoleFieldById(id);
+    }
+
+    /**
+     * 更新角色字段控制可见信息
+     *
+     * @param roleField 角色字段控制
+     * @return 结果
+     */
+    @Override
+    public int changeShowFlag(RoleField roleField) {
+
+        // 如果ID为空,则说明该记录还没不存在,需要新建。
+        if (roleField.getId() == null || roleField.getId() == 0L) {
+            RoleField newRf = new RoleField();
+
+            newRf.setRoleKey(roleField.getRoleKey());
+            newRf.setFieldKey(roleField.getFieldKey());
+            newRf.setShowFlag(EYesNo.YES.getVal());
+            newRf.setDelFlag(EDelete.FALSE.getVal());
+            newRf.setCreateBy(roleField.getUpdateBy());
+            newRf.setUpdateBy(roleField.getUpdateBy());
+            newRf.setCreateTime(roleField.getUpdateTime());
+            newRf.setUpdateTime(roleField.getUpdateTime());
+            return roleFieldMapper.insertRoleField(newRf);
+        }
+
+        RoleField oldRf = roleFieldMapper.selectRoleFieldById(roleField.getId());
+        String shelfFlag = EYesNo.YES.getVal().equals(oldRf.getShowFlag()) ? EYesNo.NO.getVal()
+                : EYesNo.YES.getVal();
+        roleField.setShowFlag(shelfFlag);
+        roleField.setUpdateBy(ShiroUtils.getLoginName());
+        roleField.setUpdateTime(new Date());
+        return roleFieldMapper.updateRoleField(roleField);
+    }
+
+    /**
+     * 查询角色字段控制列表
+     *
+     * @param roleField 角色字段控制
+     * @return 角色字段控制
+     */
+    @Override
+    public List<RoleField> selectRoleList(RoleField roleField)
+    {
+        return roleFieldMapper.selectRoleList(roleField);
+    }
+
+    /**
+     * 查询角色字段控制列表
+     *
+     * @param roleField 角色字段控制
+     * @return 角色字段控制
+     */
+    @Override
+    public List<RoleField> selectFieldList(RoleField roleField)
+    {
+        return roleFieldMapper.selectFieldList(roleField);
+    }
+
+}

+ 7 - 3
src/main/resources/application-druid.yml

@@ -6,9 +6,9 @@ spring:
         druid:
             # 主库数据源
             master:
-                url: jdbc:mysql://localhost:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                url: jdbc:mysql://47.98.241.144:3306/qryord?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
                 username: root
-                password: password
+                password: $TyH69i4EEG^om!!
             # 从库数据源
             slave:
                 # 从数据源开关/默认关闭
@@ -58,4 +58,8 @@ spring:
                     merge-sql: true
                 wall:
                     config:
-                        multi-statement-allow: true
+                        multi-statement-allow: true
+wx:
+    miniapp:
+        appid: "wxfa0929d642df6f7c"
+        secret: "55a8228b32a2b6dac3f908f1903ea72a"

+ 1 - 1
src/main/resources/application.yml

@@ -7,7 +7,7 @@ ruoyi:
   # 版权年份
   copyrightYear: 2025
   # 实例演示开关
-  demoEnabled: true
+  demoEnabled: false
   # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
   profile: D:/ruoyi/uploadPath
   # 获取ip地址开关

+ 118 - 0
src/main/resources/mybatis/business/TQueryMapper.xml

@@ -0,0 +1,118 @@
+<?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.qryord.project.business.query.mapper.TQueryMapper">
+    
+    <resultMap type="TQuery" id="TQueryResult">
+        <result property="id"    column="id"    />
+        <result property="userId"    column="user_id"    />
+        <result property="qryTime"    column="qry_time"    />
+        <result property="queryType"    column="query_type"    />
+        <result property="qryStatus"    column="qry_status"    />
+        <result property="modelId"    column="model_id"    />
+        <result property="modelName"    column="model_name"    />
+        <result property="serialNo"    column="serial_no"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="userName"    column="user_name"    />
+    </resultMap>
+
+    <sql id="selectTQueryVo">
+        select qry.id, qry.user_id, qry.qry_time, qry.query_type, qry.qry_status, qry.model_id, qry.model_name, qry.serial_no, qry.del_flag, qry.create_by, qry.create_time, qry.update_by, qry.update_time,
+               su.user_name
+        from t_query qry
+        inner join sys_user su on qry.user_id = su.user_id
+    </sql>
+
+    <select id="selectTQueryList" parameterType="TQuery" resultMap="TQueryResult">
+        <include refid="selectTQueryVo"/>
+        <where>  
+            <if test="userId != null "> and qry.user_id = #{userId}</if>
+            <if test="params.beginTime != null and params.beginTime != ''"> and DATE_FORMAT(qry.qry_time,'%Y-%m-%d %H:%i:%S') <![CDATA[ >= ]]> DATE_FORMAT(#{params.beginTime},'%Y-%m-%d %H:%i:%S')</if>
+            <if test="params.endTime != null and params.endTime != ''"> and DATE_FORMAT(qry.qry_time,'%Y-%m-%d %H:%i:%S') <![CDATA[ <= ]]> DATE_FORMAT(#{params.endTime},'%Y-%m-%d %H:%i:%S') </if>
+            <if test="queryType != null  and queryType != ''"> and qry.query_type = #{queryType}</if>
+            <if test="qryStatus != null  and qryStatus != ''"> and qry.qry_status = #{qryStatus}</if>
+            <if test="modelId != null "> and qry.model_id = #{modelId}</if>
+            <if test="modelName != null  and modelName != ''"> and qry.model_name like concat('%', #{modelName}, '%')</if>
+            <if test="serialNo != null  and serialNo != ''"> and qry.serial_no = #{serialNo}</if>
+            <if test="delFlag != null and delFlag != ''"> and qry.del_flag = #{delFlag}</if>
+        </where>
+        order by qry_time desc
+    </select>
+    
+    <select id="selectTQueryById" parameterType="Long" resultMap="TQueryResult">
+        <include refid="selectTQueryVo"/>
+        where qry.id = #{id}
+    </select>
+        
+    <insert id="insertTQuery" parameterType="TQuery" useGeneratedKeys="true" keyProperty="id">
+        insert into t_query
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="userId != null">user_id,</if>
+            <if test="qryTime != null">qry_time,</if>
+            <if test="queryType != null">query_type,</if>
+            <if test="qryStatus != null">qry_status,</if>
+            <if test="modelId != null">model_id,</if>
+            <if test="modelName != null">model_name,</if>
+            <if test="serialNo != null">serial_no,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="userId != null">#{userId},</if>
+            <if test="qryTime != null">#{qryTime},</if>
+            <if test="queryType != null">#{queryType},</if>
+            <if test="qryStatus != null">#{qryStatus},</if>
+            <if test="modelId != null">#{modelId},</if>
+            <if test="modelName != null">#{modelName},</if>
+            <if test="serialNo != null">#{serialNo},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateTQuery" parameterType="TQuery">
+        update t_query
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="qryTime != null">qry_time = #{qryTime},</if>
+            <if test="queryType != null">query_type = #{queryType},</if>
+            <if test="qryStatus != null">qry_status = #{qryStatus},</if>
+            <if test="modelId != null">model_id = #{modelId},</if>
+            <if test="modelName != null">model_name = #{modelName},</if>
+            <if test="serialNo != null">serial_no = #{serialNo},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <update id="deleteTQueryById" parameterType="Long">
+        update t_query
+        set del_flag = '2'
+        where id = #{id}
+    </update>
+
+    <update id="deleteTQueryByIds" parameterType="String">
+        update t_query
+        set del_flag = '2'
+        where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </update>
+
+</mapper>

+ 100 - 0
src/main/resources/mybatis/master/MFieldMapper.xml

@@ -0,0 +1,100 @@
+<?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.qryord.project.master.field.mapper.MFieldMapper">
+    
+    <resultMap type="MField" id="MFieldResult">
+        <result property="id"    column="id"    />
+        <result property="fieldKey"    column="field_key"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="sort"    column="sort"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectMFieldVo">
+        select id, field_key, sort, del_flag, create_by, create_time, update_by, update_time from m_field
+    </sql>
+
+    <select id="selectMFieldList" parameterType="MField" resultMap="MFieldResult">
+        <include refid="selectMFieldVo"/>
+        <where>  
+            <if test="fieldKey != null  and fieldKey != ''"> and field_key like concat('%', #{fieldKey}, '%')</if>
+            <if test="delFlag != null and delFlag != ''"> and del_flag = #{delFlag}</if>
+        </where>
+        order by sort
+    </select>
+    
+    <select id="selectMFieldById" parameterType="Long" resultMap="MFieldResult">
+        <include refid="selectMFieldVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertMField" parameterType="MField" useGeneratedKeys="true" keyProperty="id">
+        insert into m_field
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="fieldKey != null">field_key,</if>
+            <if test="sort != null">sort,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="fieldKey != null">#{fieldKey},</if>
+            <if test="sort != null">#{sort},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateMField" parameterType="MField">
+        update m_field
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="fieldKey != null">field_key = #{fieldKey},</if>
+            <if test="sort != null">sort = #{sort},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <update id="deleteMFieldById" parameterType="Long">
+        update m_field
+        set del_flag = '2'
+        where id = #{id}
+    </update>
+
+    <update id="deleteMFieldByIds" parameterType="String">
+        update m_field
+        set del_flag = '2'
+        where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </update>
+
+    <update id="updateList" parameterType="java.util.List">
+        <foreach collection="list" item="item" separator=";">
+            update m_field
+            <trim prefix="SET" suffixOverrides=",">
+                <if test="item.fieldKey != null  and item.fieldKey != ''  ">field_key = #{item.fieldKey},</if>
+                <if test="item.sort != null  ">sort = #{item.sort},</if>
+                <if test="item.delFlag != null  and item.delFlag != ''  ">del_flag = #{item.delFlag},</if>
+                <if test="item.updateBy != null  and item.updateBy != ''  ">update_by = #{item.updateBy},</if>
+                <if test="item.updateTime != null  ">update_time = #{item.updateTime},</if>
+            </trim>
+            where id = #{item.id}
+        </foreach>
+    </update>
+</mapper>

+ 77 - 0
src/main/resources/mybatis/master/ModelKindMapper.xml

@@ -0,0 +1,77 @@
+<?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.qryord.project.master.modelKind.mapper.ModelKindMapper">
+    
+    <resultMap type="ModelKind" id="ModelKindResult">
+        <result property="id"    column="id"    />
+        <result property="kindName"    column="kindName"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectModelKindVo">
+        select id, kindName, del_flag, create_by, create_time, update_by, update_time from m_model_kind
+    </sql>
+
+    <select id="selectModelKindList" parameterType="ModelKind" resultMap="ModelKindResult">
+        <include refid="selectModelKindVo"/>
+        <where>  
+            <if test="kindName != null  and kindName != ''"> and kindName like concat('%', #{kindName}, '%')</if>
+        </where>
+    </select>
+    
+    <select id="selectModelKindById" parameterType="Long" resultMap="ModelKindResult">
+        <include refid="selectModelKindVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertModelKind" parameterType="ModelKind" useGeneratedKeys="true" keyProperty="id">
+        insert into m_model_kind
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="kindName != null and kindName != ''">kindName,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="kindName != null and kindName != ''">#{kindName},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateModelKind" parameterType="ModelKind">
+        update m_model_kind
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="kindName != null and kindName != ''">kindName = #{kindName},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteModelKindById" parameterType="Long">
+        delete from m_model_kind where id = #{id}
+    </delete>
+
+    <delete id="deleteModelKindByIds" parameterType="String">
+        delete from m_model_kind where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+</mapper>

+ 90 - 0
src/main/resources/mybatis/master/ModelMapper.xml

@@ -0,0 +1,90 @@
+<?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.qryord.project.master.model.mapper.ModelMapper">
+    
+    <resultMap type="Model" id="ModelResult">
+        <result property="id"    column="id"    />
+        <result property="mkId"    column="mkId"    />
+        <result property="modelName"    column="modelName"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="modelKindName"    column="modelKindName"    />
+
+    </resultMap>
+
+    <sql id="selectModelVo">
+        select mm.id, mm.mkId, mm.modelName, mm.del_flag, mm.create_by, mm.create_time, mm.update_by, mm.update_time,mmk.kindName modelKindName from m_model mm
+        inner join m_model_kind mmk on mm.mkId = mmk.id
+    </sql>
+
+    <select id="selectModelList" parameterType="Model" resultMap="ModelResult">
+        <include refid="selectModelVo"/>
+        <where>
+            <if test="mkId != null "> and mm.mkId = #{mkId}</if>
+            <if test="modelName != null  and modelName != ''"> and mm.modelName like concat('%', #{modelName}, '%')</if>
+            <if test="delFlag != null and delFlag != ''"> and mm.del_flag = #{delFlag}</if>
+        </where>
+    </select>
+    
+    <select id="selectModelById" parameterType="Long" resultMap="ModelResult">
+        <include refid="selectModelVo"/>
+        where mm.id = #{id}
+    </select>
+        
+    <insert id="insertModel" parameterType="Model" useGeneratedKeys="true" keyProperty="id">
+        insert into m_model
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="mkId != null "> mkId,</if>
+            <if test="modelName != null">modelName,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="mkId != null "> #{mkId},</if>
+            <if test="modelName != null">#{modelName},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateModel" parameterType="Model">
+        update m_model
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="mkId != null "> mkId = #{mkId},</if>
+            <if test="modelName != null">modelName = #{modelName},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <update id="deleteModelById" parameterType="Long">
+        update m_model
+        set del_flag = '2'
+        where id = #{id}
+    </update>
+
+    <update id="deleteModelByIds" parameterType="String">
+        update m_model
+        set del_flag = '2'
+        where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </update>
+
+</mapper>

+ 107 - 0
src/main/resources/mybatis/master/RoleFieldMapper.xml

@@ -0,0 +1,107 @@
+<?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.qryord.project.master.roleField.mapper.RoleFieldMapper">
+    
+    <resultMap type="RoleField" id="RoleFieldResult">
+        <result property="id"    column="id"    />
+        <result property="roleKey"    column="role_key"    />
+        <result property="fieldKey"    column="field_key"    />
+        <result property="showFlag"    column="show_flag"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectRoleFieldVo">
+        select id, role_key, field_key, show_flag, del_flag, create_by, create_time, update_by, update_time
+        from m_role_field
+    </sql>
+
+    <select id="selectRoleList" parameterType="RoleField" resultMap="RoleFieldResult">
+        select role_key
+        from sys_role sr
+        where sr.del_flag = 0
+    </select>
+
+    <select id="selectFieldList" parameterType="RoleField" resultMap="RoleFieldResult">
+        select mrf.id, mf.field_key, ifnull(mrf.show_flag,0) show_flag
+        from m_field mf
+        left join m_role_field mrf on mrf.field_key = mf.field_key and mrf.role_key = #{roleKey}
+        where mf.del_flag = 0
+        order by mf.sort
+    </select>
+
+    <select id="selectRoleFieldList" parameterType="RoleField" resultMap="RoleFieldResult">
+        <include refid="selectRoleFieldVo"/>
+        <where>  
+            <if test="roleKey != null  and roleKey != ''"> and role_key = #{roleKey}</if>
+            <if test="fieldKey != null and fieldKey != ''"> and field_key like concat('%', #{fieldKey}, '%')</if>
+            <if test="showFlag != null  and showFlag != ''"> and show_flag = #{showFlag}</if>
+            <if test="delFlag != null and delFlag != ''"> and del_flag = #{delFlag}</if>
+        </where>
+    </select>
+    
+    <select id="selectRoleFieldById" parameterType="Long" resultMap="RoleFieldResult">
+        <include refid="selectRoleFieldVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertRoleField" parameterType="RoleField" useGeneratedKeys="true" keyProperty="id">
+        insert into m_role_field
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="roleKey != null">role_key,</if>
+            <if test="fieldKey != null">field_key,</if>
+            <if test="showFlag != null">show_flag,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="roleKey != null">#{roleKey},</if>
+            <if test="fieldKey != null">#{fieldKey},</if>
+            <if test="showFlag != null">#{showFlag},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateRoleField" parameterType="RoleField">
+        update m_role_field
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="roleKey != null">role_key = #{roleKey},</if>
+            <if test="fieldKey != null">field_key = #{fieldKey},</if>
+            <if test="showFlag != null">show_flag = #{showFlag},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <update id="deleteRoleFieldById" parameterType="Long">
+        update m_role_field
+        set del_flag = '2'
+        where id = #{id}
+    </update>
+
+    <update id="deleteRoleFieldByIds" parameterType="String">
+        update m_role_field
+        set del_flag = '2'
+        where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </update>
+
+</mapper>

+ 82 - 0
src/main/resources/templates/business/query/add.html

@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('新增查询履历')" />
+    <th:block th:include="include :: datetimepicker-css" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-query-add">
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">查询用户:</label>
+                <div class="col-sm-8">
+                    <input name="userId" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">查询时间:</label>
+                <div class="col-sm-8">
+                    <div class="input-group date">
+                        <input name="qryTime" class="form-control" placeholder="yyyy-MM-dd" type="text">
+                        <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
+                    </div>
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">查询类型:</label>
+                <div class="col-sm-8">
+                    <select name="queryType" class="form-control m-b" th:with="type=${@dict.getType('query_type')}">
+                        <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                    </select>
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">查询状态:</label>
+                <div class="col-sm-8">
+                    <select name="qryStatus" class="form-control m-b" th:with="type=${@dict.getType('query_status')}">
+                        <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                    </select>
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">型号ID:</label>
+                <div class="col-sm-8">
+                    <input name="modelId" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">型号名称:</label>
+                <div class="col-sm-8">
+                    <input name="modelName" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">序列号:</label>
+                <div class="col-sm-8">
+                    <input name="serialNo" class="form-control" type="text">
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: datetimepicker-js" />
+    <script th:inline="javascript">
+        var prefix = ctx + "business/query";
+        $("#form-query-add").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/add", $('#form-query-add').serialize());
+            }
+        }
+
+        $("input[name='qryTime']").datetimepicker({
+            format: "yyyy-mm-dd",
+            minView: "month",
+            autoclose: true
+        });
+    </script>
+</body>
+</html>

+ 83 - 0
src/main/resources/templates/business/query/edit.html

@@ -0,0 +1,83 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('修改查询履历')" />
+    <th:block th:include="include :: datetimepicker-css" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-query-edit" th:object="${tQuery}">
+            <input name="id" th:field="*{id}" type="hidden">
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">查询用户:</label>
+                <div class="col-sm-8">
+                    <input name="userId" th:field="*{userId}" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">查询时间:</label>
+                <div class="col-sm-8">
+                    <div class="input-group date">
+                        <input name="qryTime" th:value="${#dates.format(tQuery.qryTime, 'yyyy-MM-dd')}" class="form-control" placeholder="yyyy-MM-dd" type="text">
+                        <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
+                    </div>
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">查询类型:</label>
+                <div class="col-sm-8">
+                    <select name="queryType" class="form-control m-b" th:with="type=${@dict.getType('query_type')}">
+                        <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}" th:field="*{queryType}"></option>
+                    </select>
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">查询状态:</label>
+                <div class="col-sm-8">
+                    <select name="qryStatus" class="form-control m-b" th:with="type=${@dict.getType('query_status')}">
+                        <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}" th:field="*{qryStatus}"></option>
+                    </select>
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">型号ID:</label>
+                <div class="col-sm-8">
+                    <input name="modelId" th:field="*{modelId}" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">型号名称:</label>
+                <div class="col-sm-8">
+                    <input name="modelName" th:field="*{modelName}" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">序列号:</label>
+                <div class="col-sm-8">
+                    <input name="serialNo" th:field="*{serialNo}" class="form-control" type="text">
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: datetimepicker-js" />
+    <script th:inline="javascript">
+        var prefix = ctx + "business/query";
+        $("#form-query-edit").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/edit", $('#form-query-edit').serialize());
+            }
+        }
+
+        $("input[name='qryTime']").datetimepicker({
+            format: "yyyy-mm-dd",
+            minView: "month",
+            autoclose: true
+        });
+    </script>
+</body>
+</html>

+ 129 - 0
src/main/resources/templates/business/query/query.html

@@ -0,0 +1,129 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+    <th:block th:include="include :: header('查询履历列表')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+        <div class="row">
+            <div class="col-sm-12 search-collapse">
+                <form id="formId">
+                    <div class="select-list">
+                        <ul>
+                            <li>
+                                <label>查询用户:</label>
+                                <input type="text" name="userId"/>
+                            </li>
+                            <li>
+                                <label>查询时间:</label>
+                                <input type="text" class="time-input" id="startTime" data-type="datetime" data-format="yyyy-MM-dd HH:mm:ss" placeholder="开始时间" name="params[beginTime]"/>
+                                <span>-</span>
+                                <input type="text" class="time-input" id="endTime" data-type="datetime" data-format="yyyy-MM-dd HH:mm:ss" placeholder="结束时间" name="params[endTime]"/>
+                            </li>
+                            <li>
+                                <label>查询类型:</label>
+                                <select name="queryType" th:with="type=${@dict.getType('query_type')}">
+                                    <option value="">所有</option>
+                                    <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                                </select>
+                            </li>
+                            <li>
+                                <label>查询状态:</label>
+                                <select name="qryStatus" th:with="type=${@dict.getType('query_status')}">
+                                    <option value="">所有</option>
+                                    <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                                </select>
+                            </li>
+                            <li>
+                                <label>型号名称:</label>
+                                <select id="modelId" name="modelId">
+                                    <option value="">所有</option>
+                                    <option th:each="item : ${modelList}" th:text="${item.modelName}" th:value="${item.id}"></option>
+                                </select>
+
+                            </li>
+                            <li>
+                                <label>序列号:</label>
+                                <input type="text" name="serialNo"/>
+                            </li>
+                            <li>
+                                <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
+                                <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
+                            </li>
+                        </ul>
+                    </div>
+                </form>
+            </div>
+
+            <div class="btn-group-sm" id="toolbar" role="group">
+                <a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="business:query:export">
+                    <i class="fa fa-download"></i> 导出
+                </a>
+            </div>
+            <div class="col-sm-12 select-table table-striped">
+                <table id="bootstrap-table"></table>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var editFlag = [[${@permission.hasPermi('business:query:edit')}]];
+        var removeFlag = [[${@permission.hasPermi('business:query:remove')}]];
+        var queryTypeDatas = [[${@dict.getType('query_type')}]];
+        var qryStatusDatas = [[${@dict.getType('query_status')}]];
+        var prefix = ctx + "business/query";
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+                createUrl: prefix + "/add",
+                updateUrl: prefix + "/edit/{id}",
+                removeUrl: prefix + "/remove",
+                exportUrl: prefix + "/export",
+                modalName: "查询履历",
+                columns: [
+                {
+                    field: 'id',
+                    title: '主键',
+                    visible: false
+                },
+                {
+                    field: 'userId',
+                    title: '查询用户'
+                },
+                {
+                    field: 'userName',
+                    title: '用户名称'
+                },
+                {
+                    field: 'qryTime',
+                    title: '查询时间'
+                },
+                {
+                    field: 'queryType',
+                    title: '查询类型',
+                    formatter: function(value, row, index) {
+                       return $.table.selectDictLabel(queryTypeDatas, value);
+                    }
+                },
+                {
+                    field: 'qryStatus',
+                    title: '查询状态',
+                    formatter: function(value, row, index) {
+                       return $.table.selectDictLabel(qryStatusDatas, value);
+                    }
+                },
+                {
+                    field: 'modelName',
+                    title: '型号名称'
+                },
+                {
+                    field: 'serialNo',
+                    title: '序列号'
+                }]
+            };
+            $.table.init(options);
+        });
+    </script>
+</body>
+</html>

+ 2 - 2
src/main/resources/templates/index.html

@@ -4,7 +4,7 @@
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <meta name="renderer" content="webkit">
-    <title>订单查询系统首页</title>
+    <title>OHC订单查询系统首页</title>
     <!-- 避免IE使用兼容模式 -->
  	<meta http-equiv="X-UA-Compatible" content="IE=edge">
     <link th:href="@{favicon.ico}" rel="shortcut icon"/>
@@ -26,7 +26,7 @@
         </div>
         <a th:href="@{/index}">
             <li class="logo hidden-xs">
-                <span class="logo-lg">RuoYi</span>
+                <span class="logo-lg">OHC</span>
             </li>
          </a>
         <div class="sidebar-collapse">

+ 15 - 16
src/main/resources/templates/login.html

@@ -26,26 +26,25 @@
             <div class="col-sm-7">
                 <div class="signin-info">
                     <div class="logopanel m-b">
-                        <h1><img alt="[ 若依 ]" src="../static/ruoyi.png" th:src="@{/ruoyi.png}"></h1>
+                        <h1><img alt="[ OHC登录订单查询系统 ]" src="../static/ruoyi.png" th:src="@{/ruoyi.png}"></h1>
                     </div>
                     <div class="m-b"></div>
                     <h4>欢迎使用 <strong>订单查询系统</strong></h4>
-                    <ul class="m-b">
-                        <li><i class="fa fa-arrow-circle-o-right m-r-xs"></i> SpringBoot</li>
-                        <li><i class="fa fa-arrow-circle-o-right m-r-xs"></i> Mybatis</li>
-                        <li><i class="fa fa-arrow-circle-o-right m-r-xs"></i> Shiro</li>
-                        <li><i class="fa fa-arrow-circle-o-right m-r-xs"></i> Thymeleaf</li>
-                        <li><i class="fa fa-arrow-circle-o-right m-r-xs"></i> Bootstrap</li>
-                    </ul>
-                    <strong th:if="${isAllowRegister}">还没有账号? <a th:href="@{/register}">立即注册&raquo;</a></strong>
+<!--                    <ul class="m-b">-->
+<!--                        <li><i class="fa fa-arrow-circle-o-right m-r-xs"></i> SpringBoot</li>-->
+<!--                        <li><i class="fa fa-arrow-circle-o-right m-r-xs"></i> Mybatis</li>-->
+<!--                        <li><i class="fa fa-arrow-circle-o-right m-r-xs"></i> Shiro</li>-->
+<!--                        <li><i class="fa fa-arrow-circle-o-right m-r-xs"></i> Thymeleaf</li>-->
+<!--                        <li><i class="fa fa-arrow-circle-o-right m-r-xs"></i> Bootstrap</li>-->
+<!--                    </ul>-->
+<!--                    <strong th:if="${isAllowRegister}">还没有账号? <a th:href="@{/register}">立即注册&raquo;</a></strong>-->
                 </div>
             </div>
             <div class="col-sm-5">
                 <form id="signupForm" autocomplete="off">
                     <h4 class="no-margins">登录:</h4>
-                    <p class="m-t-md">你若不离不弃,我必生死相依</p>
-                    <input type="text"     name="username" class="form-control uname"     placeholder="用户名" value="admin"    />
-                    <input type="password" name="password" class="form-control pword"     placeholder="密码"   value="admin123" />
+                    <input type="text"     name="username" class="form-control uname"     placeholder="用户名" value=""    />
+                    <input type="password" name="password" class="form-control pword"     placeholder="密码"   value="" />
 					<div class="row m-t" th:if="${captchaEnabled==true}">
 						<div class="col-xs-6">
 						    <input type="text" name="validateCode" class="form-control code" placeholder="验证码" maxlength="5" />
@@ -56,16 +55,16 @@
 							</a>
 						</div>
 					</div>
-                    <div class="checkbox-custom" th:if="${isRemembered}" th:classappend="${captchaEnabled==false} ? 'm-t'">
-				        <input type="checkbox" id="rememberme" name="rememberme"> <label for="rememberme">记住我</label>
-				    </div>
+<!--                    <div class="checkbox-custom" th:if="${isRemembered}" th:classappend="${captchaEnabled==false} ? 'm-t'">-->
+<!--				        <input type="checkbox" id="rememberme" name="rememberme"> <label for="rememberme">记住我</label>-->
+<!--				    </div>-->
                     <button class="btn btn-success btn-block" id="btnSubmit" data-loading="正在验证登录,请稍候...">登录</button>
                 </form>
             </div>
         </div>
         <div class="signup-footer">
             <div class="pull-left">
-                Copyright © 2018-2025 ruoyi.vip All Rights Reserved. <br>
+<!--                Copyright © 2018-2025 ruoyi.vip All Rights Reserved. <br>-->
             </div>
         </div>
     </div>

+ 0 - 1776
src/main/resources/templates/main.html

@@ -13,1791 +13,15 @@
 
 <body class="gray-bg">
     <div class="row border-bottom white-bg dashboard-header">
-        <div class="col-sm-3">
-            <h2>Hello,Guest</h2>
-            <small>移动设备访问请扫描以下二维码:</small>
-            <br>
-            <br>
-            <img th:src="@{/img/qr_code.png}" width="100%" style="max-width:264px;">
-            <br>
-        </div>
-        <div class="col-sm-5">
-            <h2>若依后台管理框架</h2>
-            <p>一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适自己的。于是利用空闲休息时间开始自己写一套后台系统。如此有了若依管理系统。,她可以用于所有的Web应用程序,如<b>网站管理后台</b>,<b>网站会员中心</b>,<b>CMS</b>,<b>CRM</b>,<b>OA</b>等等,当然,您也可以对她进行深度定制,以做出更强系统。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。</p>
-            <p>
-                <b>当前版本:</b><span>v[[${version}]]</span>
-            </p>
-            <p>
-                <span class="label label-warning">&yen;免费开源</span>
-            </p>
-            <br>
-            <p>
-                <a class="btn btn-success btn-outline" href="https://gitee.com/y_project/RuoYi" target="_blank">
-                    <i class="fa fa-cloud"> </i> 访问码云
-                </a>
-                <a class="btn btn-white btn-bitbucket" href="http://ruoyi.vip" target="_blank">
-                    <i class="fa fa-home"></i> 访问主页
-                </a>
-            </p>
-        </div>
-        <div class="col-sm-4">
-            <h4>技术选型:</h4>
-            <ol>
-                <li>核心框架:Spring Boot。</li>
-                <li>安全框架:Apache Shiro。</li>
-                <li>模板引擎:Thymeleaf。</li>
-                <li>持久层框架:MyBatis。</li>
-                <li>定时任务:Quartz。</li>
-                <li>数据库连接池:Druid。</li>
-                <li>工具类:Fastjson。</li>
-                <li>更多……</li>
-            </ol>
-        </div>
-
     </div>
     <div class="wrapper wrapper-content">
         <div class="row">
             <div class="col-sm-4">
-
                 <div class="ibox float-e-margins">
-                    <div class="ibox-title">
-                        <h5>联系信息</h5>
-
-                    </div>
-                    <div class="ibox-content">
-                        <p><i class="fa fa-send-o"></i> 官网:<a href="http://www.ruoyi.vip" target="_blank">http://www.ruoyi.vip</a>
-                        </p>
-                        <p><i class="fa fa-qq"></i> QQ群:<s>满1389287</s> <s>满1679294</s> <s>满1529866</s> <s>满1772718</s> <s>满1366522</s> <s>满1382251</s> <s>满1145125</s> <s>满86752435</s> <s>满134072510</s> <s>满210336300</s> <s>满339522636</s> <s>满130035985</s> <s>满143151071</s> <s>满158781320</s> <s>满201531282</s> <s>满101526938</s> <s>满264355400</s> <s>满298522656</s> <s>满139845794</s>  <s>满185760789</s> <s>满175104288</s> <s>满174942938</s> <s>满287843737</s> <s>满232896766</s> <s>满180208928</s> <a href="http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=WqsGDxpGkqOPeWGOf3I32f_rXxdhqYNr&authKey=kvdF5df7PO9bzWxmixKhZN6ShsECBiuGUmmzTZBWVr2MVOfJ8%2F4oD0Gws0rbgYfz&noverify=0&group_code=140284548" target="_blank">140284548</a>
-                        </p>
-                        <p><i class="fa fa-weixin"></i> 微信:<a href="javascript:;">/ *若依</a>
-                        </p>
-                        <p><i class="fa fa-credit-card"></i> 支付宝:<a href="javascript:;" class="支付宝信息">/ *若依</a>
-                        </p>
-                    </div>
                 </div>
             </div>
             <div class="col-sm-4">
                 <div class="ibox float-e-margins">
-                    <div class="ibox-title">
-                        <h5>更新日志</h5>
-                    </div>
-                    <div class="ibox-content no-padding">
-                        <div class="panel-body">
-                            <div class="panel-group" id="version">
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v481">v4.8.1</a><code class="pull-right">2025.05.20</code>
-								   </h5>
-								</div>
-								<div id="v481" class="panel-collapse collapse in">
-									<div class="panel-body">
-									   <ol>
-									        <li>新增CSRF防护功能</li>
-									        <li>Excel导入导出支持多图片</li>
-									        <li>菜单管理支持批量保存排序</li>
-									        <li>用户分配角色页禁用不允许分配</li>
-									        <li>优化Tab页签跟随主题样式效果</li>
-									        <li>优化浅色主题下菜单右边框同步主题色</li>
-									        <li>优化空指针异常时日志无法记录错误信息问题</li>
-									        <li>新增表格参数(自定义radio/checkbox的name值)</li>
-									        <li>升级oshi到最新版本6.8.1</li>
-									        <li>升级tomcat到最新版本9.0.105</li>
-									        <li>升级commons.io到最新版本2.19.0</li>
-									        <li>升级bootstrap-table到最新版本1.24.1</li>
-									        <li>升级bootstrap-fileinput到最新版本5.5.4</li>
-									        <li>用户更新方法移除login_name更新字段</li>
-									        <li>修复定时任务参数值带括号时异常问题</li>
-									        <li>进入新增页面前方法校验数据权限</li>
-									        <li>进入授权角色&重置密码页校验数据权限</li>
-									        <li>优化Excel匹配数值型.0结尾</li>
-									        <li>优化HttpUtils加入请求类型传参</li>
-									        <li>优化管理员登录不设置权限permissions属性</li>
-									        <li>优化successCallback方法对于非特定表格类型无响应问题</li>
-									        <li>优化导出Excel日期格式双击离开后与设定的格式不一致问题</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v480">v4.8.0</a><code class="pull-right">2024.12.26</code>
-								   </h5>
-								</div>
-								<div id="v480" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>支持自定义显示Excel属性列</li>
-									        <li>表格默认转义HTML字符串</li>
-									        <li>新增列宽拖动长内容自适应显示示例</li>
-									        <li>Excel注解支持wrapText是否允许内容换行</li>
-									        <li>代码生成新增配置是否允许文件覆盖到本地</li>
-									        <li>升级oshi到最新版本6.6.5</li>
-									        <li>升级tomcat到最新版本9.0.96</li>
-									        <li>升级logback到最新版本1.2.13</li>
-									        <li>升级commons.io到最新版本2.16.1</li>
-									        <li>升级spring-framework到最新版本5.3.39</li>
-									        <li>升级jquery.validate到最新版本v1.21.0</li>
-									        <li>优化导入带标题文件关闭清理</li>
-									        <li>代码生成创建表屏蔽违规的字符</li>
-									        <li>修复主子表数据显示问题</li>
-									        <li>修复记住我请求头过大的问题</li>
-									        <li>修复角色禁用权限不失效问题</li>
-									        <li>修复类匿名注解访问失效问题</li>
-									        <li>修复导出子列表对象只能在最后的问题</li>
-									        <li>修复多选下拉框open导致页签空白问题</li>
-									        <li>优化身份证脱敏正则</li>
-									        <li>优化查询时间范围日期格式</li>
-									        <li>优化异步树表格折叠同步子状态</li>
-									        <li>优化时间控件清除按钮样式问题</li>
-									        <li>优化表格图片预览动态路径显示问题</li>
-									        <li>优化select2下拉框必填背景色无法清空问题</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v479">v4.7.9</a><code class="pull-right">2024.06.06</code>
-								   </h5>
-								</div>
-								<div id="v479" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>通知公告新增详细显示</li>
-									        <li>新增数据脱敏过滤注解</li>
-									        <li>新增表格示例(虚拟滚动)</li>
-									        <li>新增表格示例(全文检索)</li>
-									        <li>新增表格示例(保存状态)</li>
-									        <li>代码生成支持表单布局选项</li>
-									        <li>限制用户操作数据权限范围</li>
-									        <li>用户密码新增非法字符验证</li>
-									        <li>默认加载layer扩展皮肤</li>
-									        <li>未修改初始密码弹框提醒</li>
-									        <li>定时任务白名单配置范围缩小</li>
-									        <li>操作日志列表重置回第一页</li>
-									        <li>定时任务日志默认按时间排序</li>
-									        <li>Excel注解ColumnType类型新增文本</li>
-									        <li>Excel注解新增属性comboReadDict</li>
-									        <li>新增Anonymous匿名访问不鉴权注解</li>
-									        <li>升级oshi到最新版本6.6.1</li>
-									        <li>升级druid到最新版本1.2.23</li>
-									        <li>升级commons.io到最新版本2.13.0</li>
-									        <li>升级spring-framework到安全版本</li>
-									        <li>升级bootstrap-table到最新版本1.22.6</li>
-									        <li>修复重置日期时出现的异常问题</li>
-									        <li>修复页签关闭后存在的跳转问题</li>
-									        <li>修复tooltip单击复制文本不生效的问题</li>
-									        <li>更新缓存管理键名排序方式</li>
-									        <li>更新HttpUtils中的User-Agent</li>
-									        <li>优化自定义XSS注解匹配方式</li>
-									        <li>优化登录注册页面验证码验证</li>
-									        <li>优化数据权限自定义匹配方式</li>
-									        <li>优化高频率定时任务不执行问题</li>
-									        <li>优化树表格align属性在标题生效</li>
-									        <li>优化代码生成主子表关联查询方式</li>
-									        <li>优化导入Excel时设置dictType属性重复查缓存问题</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v478">v4.7.8</a><code class="pull-right">2023.11.23</code>
-								   </h5>
-								</div>
-								<div id="v478" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>用户列表新增抽屉效果详细信息</li>
-									        <li>操作日志列表新增IP地址查询</li>
-									        <li>定时任务新增页去除状态选项</li>
-									        <li>系统管理角色列表显示数据权限</li>
-									        <li>通用排序属性orderBy参数限制长度</li>
-									        <li>新增isScrollToTop页签切换滚动到顶部</li>
-									        <li>Excel自定义数据处理器增加单元格/工作簿对象</li>
-									        <li>新增表格参数(数据值为空时显示的内容undefinedText)</li>
-									        <li>升级oshi到最新版本6.4.7</li>
-									        <li>升级shiro到最新版本1.13.0</li>
-									        <li>升级druid到最新版本1.2.20</li>
-									        <li>升级pagehelper到最新版1.4.7</li>
-									        <li>升级spring-boot到最新版本2.5.15</li>
-									        <li>升级jquery到最新版v3.7.1</li>
-									        <li>升级layer到最新版本v3.7.0</li>
-									        <li>升级layui到最新版本v2.8.18</li>
-									        <li>升级x-editable到最新版本1.5.3</li>
-									        <li>修复自定义字典样式不生效的问题</li>
-									        <li>修复弹窗按钮启用禁用方法无效问题</li>
-									        <li>修复横向菜单关闭最后一个页签状态问题</li>
-									        <li>修复Excel导入数据临时文件无法删除问题</li>
-									        <li>修复表格行内编辑启用翻页记住选择无效问题</li>
-									        <li>修复Excels导入时无法获取到dictType字典值问题</li>
-									        <li>优化重置密码鼠标按下显示密码</li>
-									        <li>优化参数键值文本框改为文本域</li>
-									        <li>优化表格重置默认返回到第一页</li>
-									        <li>优化菜单管理类型为按钮状态可选</li>
-									        <li>优化数字金额大写转换精度丢失问题</li>
-									        <li>优化树表查询无数据时清除分页信息</li>
-									        <li>优化通用detail详细信息弹窗不显示按钮</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v477">v4.7.7</a><code class="pull-right">2023.04.14</code>
-								   </h5>
-								</div>
-								<div id="v477" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>操作日志新增消耗时间属性</li>
-									        <li>日志管理使用索引提升查询性能</li>
-									        <li>日志注解支持排除指定的请求参数</li>
-									        <li>新增监控页面图标显示</li>
-									        <li>新增支持登录IP黑名单限制</li>
-									        <li>更新fontawesome图标示例</li>
-									        <li>屏蔽定时任务bean违规的字符</li>
-									        <li>支持自定义隐藏属性列过滤子对象</li>
-									        <li>连接池Druid支持新的配置connectTimeout和socketTimeout</li>
-									        <li>升级jquery到最新版v3.6.3</li>
-									        <li>升级layui到最新版本2.7.6</li>
-									        <li>升级jasny-bootstrap到最新版4.0.0</li>
-									        <li>升级oshi到最新版本6.4.1</li>
-									        <li>升级druid到最新版本1.2.16</li>
-									        <li>修复异步表格树子项排序问题</li>
-									        <li>修复冻结列不支持IE浏览器的问题</li>
-									        <li>修复主子表使用suggest插件无法新增问题</li>
-									        <li>修复菜单栏快速点击导致展开折叠样式问题</li>
-									        <li>修复用户多角色数据权限可能出现权限抬升的情况</li>
-									        <li>修复异步加载表格树重置列表父节点展开异常问题</li>
-									        <li>修复页签属性refresh为undefined时页面被刷新问题</li>
-									        <li>移除apache/commons-fileupload依赖</li>
-									        <li>优化前端属性提醒说明</li>
-									        <li>优化用户导入更新时需获取用户编号问题</li>
-									        <li>优化主子表根据序号删除方法加入表格ID参数</li>
-									        <li>优化导出Excel时设置dictType属性重复查缓存问题</li>
-									        <li>优化在线用户服务缓存改为从Bean容器获取不使用自动装配</li>
-									        <li>优化表格示例行拖拽后列表底部总记录条数变成了undefined问题</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v476">v4.7.6</a><code class="pull-right">2022.12.16</code>
-								   </h5>
-								</div>
-								<div id="v476" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>定时任务违规的字符</li>
-									        <li>忽略不必要的属性数据返回</li>
-									        <li>导入更新用户数据前校验数据权限</li>
-									        <li>修改参数键名时移除前缓存配置</li>
-									        <li>修改用户登录账号进行重复验证</li>
-									        <li>兼容Excel下拉框内容过多无法显示</li>
-									        <li>升级oshi到最新版本6.4.0</li>
-									        <li>升级kaptcha到最新版2.3.3</li>
-									        <li>升级druid到最新版本1.2.15</li>
-									        <li>升级shiro到最新版本1.10.1</li>
-									        <li>升级pagehelper到最新版1.4.6</li>
-									        <li>升级bootstrap-fileinput到最新版本5.5.2</li>
-									        <li>修复sheet超出最大行数异常问题</li>
-									        <li>修复关闭父页签后提交无法跳转的问题</li>
-									        <li>修复操作日志类型多选导出不生效问题</li>
-									        <li>修复导出包含空子列表数据异常的问题</li>
-									        <li>优化树形表格层级显示</li>
-									        <li>优化SQL关键字检查防止注入</li>
-									        <li>优化用户管理重置时取消部门选择</li>
-									        <li>优化代码生成同步后字典值NULL问题</li>
-									        <li>优化导出对象的子列表为空会出现[]问题</li>
-									        <li>优化select2搜索下拉后校验必填样式问题</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v475">v4.7.5</a><code class="pull-right">2022.09.05</code>
-								   </h5>
-								</div>
-								<div id="v475" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>Excel支持导出对象的子列表方法</li>
-									        <li>数据逻辑删除不进行唯一验证</li>
-									        <li>优化多角色数据权限匹配规则</li>
-									        <li>新增主子表提交校验示例</li>
-									        <li>支持自定义隐藏Excel属性列</li>
-									        <li>Excel注解支持backgroundColor属性设置背景颜色</li>
-									        <li>菜单配置刷新时Tab页签切换时刷新</li>
-									        <li>增加对AjaxResult消息结果类型的判断</li>
-									        <li>新增示例(进度条)</li>
-									        <li>新增内容编码/解码方便插件集成使用</li>
-									        <li>升级jquery到最新版3.6.1</li>
-									        <li>升级layui到最新版本2.7.5</li>
-									        <li>升级shiro到最新版本1.9.1</li>
-									        <li>升级druid到最新版本1.2.11</li>
-									        <li>升级pagehelper到最新版1.4.3</li>
-									        <li>升级oshi到最新版本6.2.2</li>
-									        <li>修复树表onLoadSuccess不生效的问题</li>
-											<li>修复用户分配角色大于默认页数丢失问题</li>
-									        <li>定时任务支持执行父类方法</li>
-									        <li>自动设置切换多个树表格实例配置</li>
-									        <li>页签创建标题优先data-title属性</li>
-									        <li>优化任务过期不执行调度</li>
-									        <li>优化横向菜单下激活菜单样式</li>
-									        <li>优化按钮打开窗口后按回车反复弹出</li>
-									        <li>优化excel/scale属性导出单元格数值类型</li>
-									        <li>优化druid开启wall过滤器出现的异常问题</li>
-									        <li>优化多个相同角色数据导致权限SQL重复问题</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v474">v4.7.4</a><code class="pull-right">2022.06.01</code>
-								   </h5>
-								</div>
-								<div id="v474" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>用户头像上传图片格式限制</li>
-									        <li>Excel注解支持color属性设置字体颜色</li>
-									        <li>设置分页参数默认值</li>
-									        <li>主子表操作列新增单个删除</li>
-									        <li>定时任务检查Bean包名是否为白名单配置</li>
-									        <li>升级spring-boot到最新版本2.5.14</li>
-									        <li>升级shiro到最新版本1.9.0</li>
-									        <li>升级oshi到最新版本6.1.6</li>
-									        <li>升级fastjson到最新版1.2.83 安全修复版本</li>
-									        <li>文件上传兼容Weblogic环境</li>
-									        <li>新增清理分页的线程变量方法</li>
-									        <li>新增获取不带后缀文件名称方法</li>
-									        <li>用户缓存信息添加部门ancestors祖级列表</li>
-									        <li>自定义ShiroFilterFactoryBean防止中文请求被拦截</li>
-									        <li>字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)</li>
-									        <li>优化IP地址获取到多个的问题</li>
-									        <li>优化表格冻结列阴影效果显示</li>
-									        <li>优化菜单侧边栏滚动条尺寸及颜色</li>
-									        <li>优化显示顺序orderNum类型为整型</li>
-									        <li>优化接口使用泛型使其看到响应属性字段</li>
-									        <li>优化导出数据LocalDateTime类型无数据问题</li>
-									        <li>修复导入Excel时字典字段类型为Long转义为空问题</li>
-									        <li>优化导出excel单元格验证,包含变更为开头.防止正常内容被替换</li>
-									        <li>修复URL类型回退键被禁止问题</li>
-									        <li>修复表格客户端分页序号显示错误问题</li>
-									        <li>修复代码生成拖拽多次出现的排序不正确问题</li>
-									        <li>修复表格打印组件不识别多层对象属性值问题</li>
-									        <li>修复操作日志查询类型条件为0时会查到所有数据</li>
-									        <li>修复Excel注解prompt/combo同时使用不生效问题</li>
-									        <li>修复初始化多表格处理回调函数时获取的表格配置不一致问题</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v473">v4.7.3</a><code class="pull-right">2022.03.01</code>
-								   </h5>
-								</div>
-								<div id="v473" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>表格树支持分页/异步加载</li>
-									        <li>代码生成预览支持复制内容</li>
-									        <li>定时任务默认保存到内存中执行</li>
-									        <li>代码生成同步保留必填/类型选项</li>
-									        <li>页面若未匹配到字典标签则返回原字典值</li>
-									        <li>用户访问控制时校验数据权限,防止越权</li>
-									        <li>导出Excel时屏蔽公式,防止CSV注入风险</li>
-									        <li>升级spring-boot到最新版本2.5.10</li>
-									        <li>升级spring-boot-mybatis到最新版2.2.2</li>
-									        <li>升级pagehelper到最新版1.4.1</li>
-									        <li>升级oshi到最新版本6.1.2</li>
-									        <li>升级bootstrap-table到最新版本1.19.1</li>
-									        <li>服务监控新增运行参数信息显示</li>
-									        <li>定时任务目标字符串验证包名白名单</li>
-									        <li>文件上传接口新增原/新文件名返回参数</li>
-									        <li>定时任务屏蔽违规的字符</li>
-									        <li>分页数据新增分页参数合理化参数</li>
-									        <li>表格父子视图添加点击事件打开示例</li>
-									        <li>优化上传文件名称命名规则</li>
-									        <li>优化加载字典缓存数据</li>
-									        <li>优化任务队列满时任务拒绝策略</li>
-									        <li>优化IE11上传预览不显示的问题</li>
-									        <li>优化Excel格式化不同类型的日期对象</li>
-									        <li>优化国际化配置多余的zh请求问题</li>
-									        <li>优化新版Chrome浏览器回退出现的遮罩层</li>
-									        <li>修复EMAIL类型回退键被禁止问题</li>
-									        <li>修复Xss注解字段值为空时的异常问题</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v472">v4.7.2</a><code class="pull-right">2021.12.23</code>
-								   </h5>
-								</div>
-								<div id="v472" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>自定义xss校验注解实现</li>
-									        <li>进入修改页面方法添加权限标识</li>
-									        <li>代码生成创建按钮添加超级管理员权限</li>
-									        <li>代码生成创建表检查关键字,防止注入风险</li>
-									        <li>修复定时任务多参数逗号分隔的问题</li>
-									        <li>修复表格插件一起使用出现的声明报错问题</li>
-									        <li>修复代码生成主子表模板删除方法缺少事务</li>
-									        <li>升级oshi到最新版本v5.8.6</li>
-									        <li>升级velocity到最新版本2.3</li>
-									        <li>升级fastjson到最新版1.2.79</li>
-									        <li>升级log4j2到最新版2.17.0 防止漏洞风险</li>
-									        <li>升级thymeleaf到最新版3.0.14 阻止远程代码执行漏洞</li>
-									        <li>优化修改/授权角色实时生效</li>
-									        <li>修整tomcat配置参数已过期问题</li>
-									        <li>前端添加单独的二代身份证校验</li>
-									        <li>优化新增部门时验证用户所属部门</li>
-									        <li>优化查询用户的角色组&岗位组代码</li>
-									        <li>请求分页方法设置成通用方便灵活调用</li>
-									        <li>优化日期类型错误提示与图标重叠问题</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v471">v4.7.1</a><code class="pull-right">2021.11.10</code>
-								   </h5>
-								</div>
-								<div id="v471" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>新增是否开启页签功能</li>
-									        <li>代码生成的模块增加创建表功能</li>
-									        <li>Excel导入支持@Excels注解</li>
-									        <li>Excel注解支持导入导出标题信息</li>
-									        <li>Excel注解支持自定义数据处理器</li>
-									        <li>日志注解新增是否保存响应参数</li>
-									        <li>防重提交注解支持配置间隔时间/提示消息</li>
-									        <li>网页部分操作禁止使用后退键(Backspace)</li>
-									        <li>实例演示中增加多层窗口获取值</li>
-									        <li>弹出层openOptions增加动画属性</li>
-									        <li>升级spring-boot到最新版本2.5.6</li>
-									        <li>升级spring-boot-mybatis到最新版2.2.0</li>
-									        <li>升级pagehelper到最新版1.4.0</li>
-									        <li>升级oshi到最新版本v5.8.2</li>
-									        <li>升级druid到最新版1.2.8</li>
-									        <li>升级fastjson到最新版1.2.78</li>
-									        <li>升级thymeleaf-extras-shiro到最新版本v2.1.0</li>
-									        <li>升级bootstrap-fileinput到最新版本v5.2.4</li>
-									        <li>修改阿里云maven仓库地址为新版地址</li>
-									        <li>定时任务屏蔽违规字符</li>
-									        <li>增加sendGet无参请求方法</li>
-									        <li>代码生成去掉多余的排序字段</li>
-									        <li>优化启动脚本参数优化</li>
-									        <li>优化页签关闭右侧清除iframe元素</li>
-									        <li>优化多表格切换表单查询参数</li>
-									        <li>优化表格实例切换event不能为空</li>
-									        <li>优化mybatis全局默认的执行器</li>
-									        <li>优化导入Excel数据关闭时清理file</li>
-									        <li>优化Excel导入图片可能出现的异常</li>
-									        <li>优化记录登录信息,防止不必要的修改</li>
-									        <li>优化aop语法,使用spring自动注入注解</li>
-									        <li>修复无法被反转义问题</li>
-									        <li>修复拖拽行数据错位问题</li>
-									        <li>修复新窗口打开页面关闭弹窗报错</li>
-									        <li>修复富文本回退键被禁止&控制台报错问题</li>
-									        <li>修复自定义弹出层全屏参数无效问题</li>
-									        <li>修复树表代码生成短字段无法识别问题</li>
-									        <li>修复apple/webkit浏览器时间无法格式化</li>
-									        <li>修复后端主子表代码模板方法名生成错误问题</li>
-									        <li>修复swagger没有指定dataTypeClass导致启动出现warn日志</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v470">v4.7.0</a><code class="pull-right">2021.09.01</code>
-								   </h5>
-								</div>
-								<div id="v470" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>优化弹出层显示在顶层窗口</li>
-									        <li>定时任务支持在线生成cron表达式</li>
-									        <li>Excel注解支持Image图片导入</li>
-									        <li>支持配置是否开启记住我功能</li>
-									        <li>修改时检查用户数据权限范围</li>
-									        <li>表单重置开始/结束时间控件</li>
-									        <li>新增多图上传示例</li>
-									        <li>启用父部门状态排除顶级节点</li>
-									        <li>富文本默认dialogsInBody属性</li>
-									        <li>去除默认分页合理化参数</li>
-									        <li>顶部菜单跳转添加绝对路径</li>
-									        <li>升级oshi到最新版本v5.8.0</li>
-									        <li>升级shiro到最新版本v1.8.0</li>
-									        <li>升级commons.io到最新版本v2.11.0</li>
-									        <li>升级jquery到最新版v3.6.0</li>
-									        <li>升级icheck到最新版v1.0.3</li>
-									        <li>升级layer到最新版本v3.5.1</li>
-									        <li>升级layui到最新版本v2.6.8</li>
-									        <li>升级laydate到最新版本v5.3.1</li>
-									        <li>升级select2到最新版v4.0.13</li>
-									        <li>升级cropper到最新版本v1.5.12</li>
-									        <li>升级summernote到最新版本v0.8.18</li>
-									        <li>升级duallistbox到最新版本v3.0.9</li>
-									        <li>升级jquery.validate到最新版本v1.19.3</li>
-									        <li>升级bootstrap-suggest到最新版本v0.1.29</li>
-									        <li>升级bootstrap-select到最新版本v1.13.18</li>
-									        <li>升级bootstrap-fileinput到最新版本v5.2.3</li>
-									        <li>查询表格指定列值增加是否去重属性</li>
-									        <li>删除sourceMappingURL源映射</li>
-									        <li>去除多余的favicon.ico引入</li>
-									        <li>优化代码生成模板</li>
-									        <li>优化XSS跨站脚本过滤</li>
-									        <li>补充定时任务表字段注释</li>
-									        <li>定时任务屏蔽ldap远程调用</li>
-									        <li>定时任务屏蔽http(s)远程调用</li>
-									        <li>定时任务对检查异常进行事务回滚</li>
-									        <li>调度日志详细页添加关闭按钮</li>
-									        <li>优化异常打印输出信息</li>
-									        <li>优化移动端进入首页样式</li>
-									        <li>优化用户操作不能删除自己</li>
-									        <li>默认开始/结束时间绑定控件选择类型</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v462">v4.6.2</a><code class="pull-right">2021.07.01</code>
-								   </h5>
-								</div>
-								<div id="v462" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>优化参数&字典缓存操作</li>
-									        <li>新增表格参数(导出方式&导出文件类型)</li>
-									        <li>新增表格示例(自定义视图分页)</li>
-									        <li>新增示例(表格列拖拽)</li>
-									        <li>集成yuicompressor实现(CSS/JS压缩)</li>
-									        <li>新增表格参数(是否支持打印页面showPrint)</li>
-									        <li>支持bat脚本执行应用</li>
-									        <li>修复存在的SQL注入漏洞问题</li>
-									        <li>定时任务屏蔽rmi远程调用</li>
-									        <li>导出Excel文件支持数据流下载方式</li>
-									        <li>实例演示弹层组件增加相册层示例</li>
-									        <li>删除操作日志记录信息</li>
-									        <li>增加表格重置分页的参数</li>
-									        <li>限制超级管理员不允许操作</li>
-									        <li>树级结构更新子节点使用replaceFirst</li>
-									        <li>支持动态生成密匙,防止默认密钥泄露</li>
-									        <li>升级pagehelper到最新版1.3.1</li>
-									        <li>升级oshi到最新版本v5.7.4</li>
-									        <li>升级swagger到最新版本v3.0.0</li>
-									        <li>升级commons.io到最新版本v2.10.0</li>
-									        <li>升级commons.fileupload到最新版本v1.4</li>
-									        <li>升级bootstrap-table到最新版本v1.18.3</li>
-									        <li>升级druid到最新版本v1.2.6</li>
-									        <li>升级fastjson到最新版1.2.76</li>
-									        <li>升级layui到最新版本v2.6.6</li>
-									        <li>升级layer到最新版本v3.5.0</li>
-									        <li>升级laydate到最新版本v5.3.0</li>
-									        <li>优化表格树移动端&边框显示</li>
-									        <li>新增表格刷新options配置方法</li>
-									        <li>优化图片工具类读取文件,防止异常</li>
-									        <li>修复表格图片预览移动端宽高无效问题</li>
-									        <li>主子表通用操作封装处理增加文本域类型</li>
-									        <li>日志注解兼容获取json类型的参数</li>
-									        <li>修复表单向导插件有滚动条时底部工具栏无法固定问题</li>
-									        <li>修复导出角色数据范围翻译缺少仅本人</li>
-									        <li>修正Velocity模板初始字符集</li>
-									        <li>升级mybatis到最新版3.5.6 阻止远程代码执行漏洞</li>
-									        <li>优化代码生成导出模板名称</li>
-									        <li>修改个人中心密码长度提醒</li>
-									        <li>实例演示中弹出表格增加以回调形式回显到父窗体</li>
-									        <li>修复登录页面弹窗文字不显示的问题</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v461">v4.6.1</a><code class="pull-right">2021.04.12</code>
-								   </h5>
-								</div>
-								<div id="v461" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>新增IE浏览器版本过低提示页面</li>
-									        <li>新增详细信息tab页签方式</li>
-									        <li>新增解锁屏幕打开上次页签</li>
-									        <li>数据监控默认账户密码防止越权访问</li>
-									        <li>新增表格示例(导出选择列)</li>
-									        <li>个人信息添加手机&邮箱重复验证</li>
-									        <li>个人中心刷新后样式问题</li>
-									        <li>操作日志返回参数添加非空验证</li>
-									        <li>velocity剔除commons-collections版本,防止3.2.1版本的反序列化漏洞</li>
-									        <li>子表模板默认日期格式化</li>
-									        <li>代码生成预览语言根据后缀名高亮显示</li>
-									        <li>代码生成主子表相同字段导致数据问题</li>
-									        <li>升级SpringBoot到最新版本2.2.13</li>
-									        <li>升级shiro到最新版1.7.1 阻止身份认证绕过漏洞</li>
-									        <li>升级bootstrapTable到最新版本v1.18.2</li>
-									        <li>升级bootstrapTable相关组件到最新版本v1.18.2</li>
-									        <li>升级fastjson到最新版1.2.75</li>
-									        <li>升级druid到最新版本v1.2.4</li>
-									        <li>升级oshi到最新版本v5.6.0</li>
-									        <li>修改ip字段长度防止ipv6地址长度不够</li>
-									        <li>搜索建议示例选择后隐藏列表</li>
-									        <li>主子表示例增加初始化数据</li>
-									        <li>优化Excel导入增加空行判断</li>
-									        <li>修复横向菜单无法打开页签问题</li>
-									        <li>修复导入数据为负浮点数时,导入结果会丢失精度问题</li>
-									        <li>优化更多操作按钮左侧移入内容闪现消失情况</li>
-									        <li>修复主子表提交中列隐藏后出现列偏移问题</li>
-									        <li>单据打印网页时通过hidden-print隐藏元素</li>
-									        <li>表格销毁清除记住选择数据</li>
-									        <li>增加表格动态列示例</li>
-									        <li>代码生成选择主子表关联元素必填</li>
-									        <li>tree根据Id和Name选中指定节点增加空判断</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v46">v4.6.0</a><code class="pull-right">2021.01.01</code>
-								   </h5>
-								</div>
-								<div id="v46" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>新增缓存监控管理</li>
-									        <li>新增锁定屏幕功能</li>
-									        <li>菜单新增是否刷新页面</li>
-									        <li>删除用户和角色解绑关联</li>
-									        <li>新增密码强度字符范围提示</li>
-									        <li>防止匿名访问进行过滤</li>
-									        <li>升级SpringBoot到最新版本2.2.12</li>
-									        <li>升级poi到最新版本4.1.2</li>
-									        <li>升级bitwalker到最新版本1.21</li>
-									        <li>升级bootstrap-fileinput到最新版本5.1.3</li>
-									        <li>升级bootstrapTable到最新版本v1.18.0</li>
-									        <li>升级bootstrapTable相关组件到最新版本v1.18.0</li>
-									        <li>升级oshi到最新版本v5.3.6</li>
-									        <li>新增示例(标签 & 提示)</li>
-									        <li>添加单据打印示例</li>
-									        <li>修改表格初始参数sortName默认值为undefined</li>
-									        <li>新增表格参数(自定义打印页面模板printPageBuilder)</li>
-									        <li>新增表格参数(是否显示行间隔色striped)</li>
-									        <li>新增表格参数(渲染完成后执行的事件onPostBody)</li>
-									        <li>Excel注解支持Image图片导出</li>
-									        <li>Excel支持注解align对齐方式</li>
-									        <li>Excel支持导入Boolean型数据</li>
-									        <li>主子表操作添加通用addColumn方法</li>
-									        <li>代码生成日期控件区分范围</li>
-									        <li>代码生成数据库文本类型生成表单文本域</li>
-									        <li>修复生成主子表外键名错误</li>
-									        <li>选项卡新增是否刷新属性</li>
-									        <li>修复树表格表头跟表格宽度不同步的问题</li>
-									        <li>表格树加载完成触发tooltip方法</li>
-									        <li>使用widthUnit定义树表格选项单位</li>
-									        <li>修复主子表editColumn序列问题</li>
-									        <li>修复添加全屏在无参数时没有替换url参数问题</li>
-									        <li>弹出层openOptions移动端自适应</li>
-									        <li>防止错误页返回主页出现嵌套问题</li>
-									        <li>设置回显数据字典验证防止空值</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v451">v4.5.1</a><code class="pull-right">2020.11.18</code>
-								   </h5>
-								</div>
-								<div id="v451" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>阻止任意文件下载漏洞</li>
-									        <li>升级shiro到最新版1.7.0 阻止权限绕过漏洞</li>
-									        <li>升级druid到最新版本v1.2.2</li>
-									        <li>新增表格行触发事件(onCheck、onUncheck、onCheckAll、onUncheckAll)</li>
-									        <li>修复多页签关闭非当前选项出现空白问题</li>
-									        <li>代码生成预览支持高亮显示</li>
-									        <li>mapperLocations配置支持分隔符</li>
-									        <li>权限信息调整</li>
-									        <li>个人中心头像和上传头像增加默认图片</li>
-									        <li>全局配置类保持和其他应用命名相同</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v45">v4.5.0</a><code class="pull-right">2020.10.20</code>
-								   </h5>
-								</div>
-								<div id="v45" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>新增菜单导航显示风格(default为左侧导航菜单,topnav为顶部导航菜单)</li>
-									        <li>菜单&数据权限新增(展开/折叠 全选/全不选 父子联动)</li>
-									        <li>账号密码支持自定义更新周期</li>
-									        <li>初始密码支持自定义修改策略</li>
-									        <li>新增校验用户修改新密码不能与旧密码相同</li>
-									        <li>添加检查密码范围支持的特殊字符包括:~!@#$%^&*()-=_+</li>
-									        <li>注册账号设置默认用户名称及密码最后更新时间</li>
-									        <li>去除用户手机邮箱部门必填验证</li>
-									        <li>新增日期格式化方法</li>
-									        <li>代码生成添加bit类型</li>
-									        <li>树结构加载添加callBack回调方法</li>
-									        <li>修复用户管理页面滚动返回顶部条失效</li>
-									        <li>修复代码生成模板文件上传组件缺少ctx的问题</li>
-									        <li>限制系统内置参数不允许删除</li>
-									        <li>新增表格列宽拖动插件</li>
-									        <li>新增Ajax局部刷新demo</li>
-									        <li>新增是否开启页脚功能</li>
-									        <li>新增表格参数(通过自定义函数设置标题样式headerStyle)</li>
-									        <li>新增表格参数(通过自定义函数设置页脚样式footerStyle)</li>
-									        <li>修复窗体大小改变后浮动提示框失效问题</li>
-									        <li>生成代码补充必填样式</li>
-									        <li>生成页面时不忽略remark属性</li>
-									        <li>字典数据列表页添加关闭按钮</li>
-									        <li>Excel注解支持自动统计数据总和</li>
-									        <li>升级springboot到2.1.17 提升安全性</li>
-									        <li>升级pagehelper到最新版1.3.0</li>
-									        <li>升级druid到最新版本v1.2.1</li>
-									        <li>升级fastjson到最新版1.2.74</li>
-									        <li>升级bootstrap-fileinput到最新版本5.1.2</li>
-									        <li>升级oshi到最新版本v5.2.5</li>
-									        <li>表单向导插件更换为jquery-smartwizard</li>
-									        <li>修改主子表提交示例代码防止渲染失效</li>
-									        <li>添加导入数据弹出窗体自定义宽高</li>
-									        <li>用户信息参数返回忽略掉密码字段</li>
-									        <li>优化关闭窗体添加index参数</li>
-									        <li>回显数据字典(字符串数组)增加空值判断</li>
-									        <li>修改前端密码长度校验和错误提示不符问题</li>
-									        <li>AjaxResult重写put方法,以方便链式调用</li>
-									        <li>增强验证码校验的语义,更易懂</li>
-									        <li>导入excel整形值校验优化</li>
-									        <li>Excel导出类型NUMERIC支持精度浮点类型</li>
-									        <li>导出Excel调整targetAttr获取值方法,防止get方法不规范</li>
-									        <li>输入框组验证错误后置图标提示颜色</li>
-									        <li>上传媒体类型添加视频格式</li>
-									        <li>数据权限判断参数类型</li>
-									        <li>修正数据库字符串类型nvarchar</li>
-									        <li>优化递归子节点</li>
-									        <li>修复多表格搜索formId无效</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v44">v4.4.0</a><code class="pull-right">2020.08.24</code>
-								   </h5>
-								</div>
-								<div id="v44" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>升级bootstrapTable到最新版本1.17.1</li>
-									        <li>升级shiro到最新版1.6.0 阻止权限绕过漏洞</li>
-									        <li>升级fastjson到最新版1.2.73</li>
-									        <li>代码生成支持同步数据库</li>
-									        <li>代码生成支持富文本控件</li>
-									        <li>用户密码支持自定义配置规则</li>
-									        <li>新增表格自动刷新插件</li>
-									        <li>新增表格打印配置插件</li>
-									        <li>更换图片裁剪工具为cropper</li>
-									        <li>Excel支持sort导出排序</li>
-									        <li>代码生成支持自定义路径</li>
-									        <li>代码生成支持选择上级菜单</li>
-									        <li>代码生成支持上传控件</li>
-									        <li>新增表格参数(自定义加载文本的字体大小loadingFontSize)</li>
-									        <li>Excel注解支持设置BigDecimal精度&舍入规则</li>
-									        <li>操作日志记录排除敏感属性字段</li>
-									        <li>修复不同浏览器附件下载中文名乱码的问题</li>
-									        <li>用户分配角色不允许选择超级管理员角色</li>
-									        <li>更换表格冻结列插件</li>
-									        <li>添加右侧冻结列示例</li>
-									        <li>升级表格行编辑&移动端适应插件</li>
-									        <li>修复更新表格插件后无法设置实例配置问题</li>
-									        <li>修复更新表格插件后导致的主子表错误</li>
-									        <li>修复页面存在多表格,回调函数res数据不正确问题</li>
-									        <li>强退&过期清理登录账号缓存会话</li>
-									        <li>表格树标题内容支持html语义化标签</li>
-									        <li>修复配置应用的访问路径首页页签重复问题</li>
-									        <li>优化openTab打开时滚动到当前页签</li>
-									        <li>表格请求方式method支持自定义配置</li>
-									        <li>菜单页签联动优化</li>
-									        <li>用户邮箱长度限制修改为50</li>
-									        <li>主子表示例添加日期格式案例</li>
-									        <li>修改表格行内编辑示例旧值参数</li>
-									        <li>操作日志查询方式调整</li>
-									        <li>唯一限制条件只返回单条数据</li>
-									        <li>修改Excel设置STRING单元格类型</li>
-									        <li>添加获取当前的环境配置方法</li>
-									        <li>截取返回参数长度,防止超出异常</li>
-									        <li>定时任务cron表达式验证</li>
-									        <li>拆分表格插件,按需引入</li>
-									        <li>多行文本框补齐必填错误提示背景</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v431">v4.3.1</a><code class="pull-right">2020.07.05</code>
-								   </h5>
-								</div>
-								<div id="v431" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>国家信息安全漏洞(请务必保持cipherKey密钥唯一性)</li>
-									        <li>升级shiro到最新版1.5.3 阻止权限绕过漏洞</li>
-									        <li>修改验证码在使用后清除,防止多次使用</li>
-									        <li>检查字符支持小数点&降级改成异常提醒</li>
-									        <li>openOptions函数中加入自定义maxmin属性</li>
-									        <li>支持openOptions方法最大化</li>
-									        <li>支持openOptions方法多个按钮回调</li>
-									        <li>新增isLinkage支持页签与菜单联动</li>
-									        <li>修改代码生成导入表结构出现异常页面不提醒问题</li>
-									        <li>优化用户头像发生错误,则显示一个默认头像</li>
-									        <li>Excel导出支持字典类型</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v43">v4.3.0</a><code class="pull-right">2020.06.22</code>
-								   </h5>
-								</div>
-								<div id="v43" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>代码生成模板支持主子表</li>
-									        <li>代码生成显示类型支持复选框</li>
-									        <li>前端表单样式修改成圆角</li>
-									        <li>新增回显数据字典(字符串数组)</li>
-									        <li>修复浏览器手动缩放比例后菜单无法自适应问题</li>
-									        <li>限制用户不允许选择系统管理员角色</li>
-									        <li>用户信息添加输入框组图标&鼠标按下显示密码</li>
-									        <li>升级fastjson到最新版1.2.70 修复高危安全漏洞</li>
-									        <li>升级Bootstrap版本到v3.3.7</li>
-									        <li>修复selectColumns方法获取子对象数据无效问题</li>
-									        <li>修改数据源类型优先级,先根据方法,再根据类</li>
-									        <li>修改上级部门(选择项排除本身和下级)</li>
-									        <li>首页菜单显示调整</li>
-									        <li>添加是否开启swagger配置</li>
-									        <li>新增示例(主子表提交)</li>
-									        <li>新增示例(多级联动下拉示例)</li>
-									        <li>新增示例(表格属性data数据加载)</li>
-									        <li>新增表格列参数(是否列选项可见ignore)</li>
-									        <li>新增表格参数(是否启用显示卡片视图cardView)</li>
-									        <li>新增表格参数(是否显示全屏按钮showFullscreen)</li>
-									        <li>新增表格参数(是否启用分页条无限循环的功能paginationLoop)</li>
-									        <li>新增表格参数(是否显示表头showHeader)</li>
-									        <li>表格添加显示/隐藏所有列方法 showAllColumns/hideAllColumns</li>
-									        <li>修复部分情况节点不展开问题</li>
-									        <li>修复关闭标签页后刷新还是上次地址问题</li>
-									        <li>修复选择菜单后刷新页面,菜单箭头显示不对问题</li>
-											<li>修复jquery表单序列化时复选框未选中不会序列化到对象中问题</li>
-											<li>Excel支持readConverterExp读取字符串组内容</li>
-									        <li>更换IP地址查询接口</li>
-									        <li>默认关闭获取ip地址</li>
-									        <li>操作处理ajaxSuccess判断修正</li>
-									        <li>HttpUtils.sendPost()方法,参数无需拼接参数到url</li>
-									        <li>通用http发送方法增加参数 contentType 编码类型</li>
-									        <li>HTML过滤器不替换&实体</li>
-									        <li>代码生成浮点型改用BigDecimal</li>
-									        <li>修复表单构建单选和多选框渲染问题</li>
-									        <li>代码生成模板调整,字段为String并且必填则加空串条件</li>
-									        <li>字典数据查询列表根据dictSort升序排序</li>
-									        <li>修复树表对imageView和tooltip方法无效问题</li>
-									        <li>修复Long类型比较相等问题调整</li>
-									        <li>示例demo页面清除html链接,防止点击后跳转出现404</li>
-									        <li>在线用户强退方法合并</li>
-									        <li>添加校验部门包含未停用的子部门</li>
-									        <li>取消回车自动提交表单</li>
-									        <li>'A','I','BUTTON' 标签忽略clickToSelect事件,防止点击操作按钮时选中</li>
-									        <li>邮箱显示截取部分字符串,防止低分辨率错位</li>
-									        <li>代码生成列属性根据sort排序</li>
-									        <li>修复更多操作部分浏览器不兼容情况</li>
-									        <li>图片预览事件属性修正</li>
-									        <li>修复冻结列排序样式无效问题</li>
-									        <li>修复context-path的情况下个人中心刷新导致样式问题</li>
-									        <li>全屏editFull打开适配表树</li>
-									        <li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v42">v4.2.0</a><code class="pull-right">2020.03.23</code>
-								   </h5>
-								</div>
-								<div id="v42" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>用户管理添加分配角色页面</li>
-									        <li>定时任务添加调度日志按钮</li>
-									        <li>新增是否开启用户注册功能</li>
-											<li>新增页面滚动显示返回顶部按钮</li>
-											<li>用户&角色&任务添加更多操作按钮</li>
-											<li>iframe框架页会话过期弹出超时提示</li>
-											<li>移动端登录不显示左侧菜单</li>
-											<li>侧边栏添加一套深蓝色主题</li>
-											<li>首页logo固定,不随菜单滚动</li>
-											<li>支持mode配置history(表示去掉地址栏的#)</li>
-											<li>任务分组字典翻译(调度日志详细)</li>
-											<li>字典管理添加缓存读取</li>
-											<li>字典数据列表标签显示样式</li>
-											<li>参数管理支持缓存操作</li>
-											<li>日期控件清空结束时间设置开始默认值为2099-12-31</li>
-											<li>表格树添加获取数据后响应回调处理</li>
-											<li>批量替换表前缀调整</li>
-											<li>支持表格导入模板的弹窗表单加入其它输入控件</li>
-											<li>表单重置刷新表格树</li>
-											<li>新增支持导出数据字段排序</li>
-											<li>新增表格参数(是否单选checkbox)</li>
-											<li>druid未授权不允许访问</li>
-											<li>表格树父节点兼容0,'0','',null</li>
-											<li>表单必填的项添加星号</li>
-											<li>修复select2不显示校验错误信息</li>
-											<li>添加自定义HTML过滤器</li>
-											<li>修复多数据源下开关关闭出现异常问题</li>
-											<li>修复翻页记住选择项数据问题</li>
-											<li>用户邮箱长度限制20</li>
-											<li>修改错误页面返回主页出现嵌套问题</li>
-											<li>表格浮动提示单双引号转义</li>
-											<li>支持配置四级菜单</li>
-											<li>升级shiro到最新版1.4.2 阻止rememberMe漏洞攻击</li>
-											<li>升级summernote到最新版本v0.8.12</li>
-											<li>导入Excel根据dateFormat属性格式处理</li>
-											<li>修复War部署无法正常shutdown,ehcache内存泄漏</li>
-											<li>修复代码生成短字段无法识别问题</li>
-											<li>修复serviceImpl模版,修改方法判断日期错误</li>
-											<li>代码生成模板增加导出功能日志记录</li>
-											<li>代码生成唯一编号调整为tableId</li>
-											<li>代码生成查询时忽略大小写</li>
-											<li>代码生成支持翻页记住选中</li>
-											<li>代码生成表注释未填写也允许导入</li>
-											<li>Global全局配置类修改为注解,防止多环境配置下读取问题</li>
-											<li>修复多表格情况下,firstLoad只对第一个表格生效</li>
-											<li>处理Maven打包出现警告问题</li>
-											<li>默认主题样式,防止网速慢情况下出现空白</li>
-											<li>修复文件上传多级目录识别问题</li>
-											<li>锚链接解码url,防止中文导致页面不能加载问题</li>
-											<li>修复右键Tab页刷新事件重复请求问题</li>
-											<li>角色禁用&菜单隐藏不查询权限</li>
-											<li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v41">v4.1.0</a><code class="pull-right">2019.10.22</code>
-								   </h5>
-								</div>
-								<div id="v41" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>支持多表格实例操作</li>
-									        <li>浮动提示方法tooltip支持弹窗</li>
-											<li>代码生成&字典数据支持模糊条件查询</li>
-											<li>增加页签全屏方法</li>
-											<li>增加清除表单验证错误信息方法</li>
-											<li>支持iframe局部刷新页面</li>
-											<li>支持在线切换主题</li>
-											<li>修改图片预览设置的高宽参数颠倒问题</li>
-											<li>操作日志新增解锁账户功能</li>
-											<li>管理员用户&角色不允许操作</li>
-											<li>去掉jsoup包调用自定义转义工具</li>
-											<li>添加时间轴示例</li>
-											<li>修复翻页记住选择时获取指定列值的问题</li>
-											<li>代码生成sql脚本添加导出按钮</li>
-											<li>添加表格父子视图示例</li>
-											<li>添加表格行内编辑示例</li>
-											<li>升级fastjson到最新版1.2.60 阻止漏洞攻击</li>
-											<li>升级echarts到最新版4.2.1</li>
-											<li>操作日志新增返回参数</li>
-											<li>支持mybatis通配符扫描任意多个包</li>
-											<li>权限验证多种情况处理</li>
-											<li>修复树形类型的代码生成的部分必要属性无法显示</li>
-											<li>修复非表格插件情况下重置出现异常</li>
-											<li>修复富文本编辑器有序列表冲突</li>
-											<li>代码生成表前缀配置支持多个</li>
-											<li>修复自动去除表前缀配置无效问题</li>
-											<li>菜单列表按钮数据可见不显示(权限标识控制)</li>
-											<li>修复设置会话超时时间无效问题</li>
-											<li>新增本地资源通用下载方法</li>
-											<li>操作日志记录新增请求方式</li>
-											<li>代码生成单选按钮属性重名修复</li>
-											<li>优化select2下拉框宽度不会随浏览器改变</li>
-											<li>修复代码生成树表异常</li>
-											<li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v40">v4.0.0</a><code class="pull-right">2019.08.08</code>
-								   </h5>
-								</div>
-								<div id="v40" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>代码生成支持预览、编辑,保存方案</li>
-									        <li>新增防止表单重复提交注解</li>
-											<li>新增后端校验(和前端保持一致)</li>
-											<li>新增同一个用户最大会话数控制</li>
-											<li>Excel导出子对象支持多个字段</li>
-											<li>定时任务支持静态调用和多参数</li>
-											<li>定时任务增加分组条件查询</li>
-											<li>字典类型增加任务分组数据</li>
-											<li>新增表格是否首次加载数据</li>
-											<li>新增parentTab选项卡可在同一页签打开</li>
-											<li>多数据源支持类注解(允许继承父类的注解)</li>
-											<li>部门及以下数据权限(调整为以下及所有子节点)</li>
-											<li>新增角色数据权限配(仅本人数据权限)</li>
-											<li>修改菜单权限显示问题</li>
-											<li>上传文件修改路径及返回名称</li>
-											<li>添加报表插件及示例</li>
-											<li>添加首页统计模板</li>
-											<li>添加表格拖拽示例</li>
-											<li>添加卡片列表示例</li>
-											<li>添加富文本编辑器示例</li>
-											<li>添加表格动态增删改查示例</li>
-											<li>添加用户页面岗位选择框提示</li>
-											<li>点击菜单操作添加背景高亮显示</li>
-											<li>表格树新增showSearch是否显示检索信息</li>
-											<li>解决表格列设置sortName无效问题</li>
-											<li>表格图片预览支持自定义设置宽高</li>
-											<li>添加表格列浮动提示(单击文本复制)</li>
-											<li>PC端收起菜单后支持浮动显示</li>
-											<li>详细操作样式调整</li>
-											<li>修改用户更新描述空串不更新问题</li>
-											<li>导入修改为模板渲染</li>
-											<li>修改菜单及部门排序规则</li>
-											<li>角色导出数据范围表达式翻译</li>
-											<li>添加summernote富文本字体大小</li>
-											<li>优化表格底部下边框防重叠&汇总像素问题</li>
-											<li>树表格支持属性多层级访问</li>
-											<li>修复IE浏览器用户管理界面右侧留白问题</li>
-											<li>重置按钮刷新表格</li>
-											<li>重置密码更新用户缓存</li>
-											<li>优化验证码属性参数</li>
-											<li>支持数据监控配置用户名和密码</li>
-											<li>文件上传修改按钮背景及加载动画</li>
-											<li>支持配置一级菜单href跳转</li>
-											<li>侧边栏添加一套浅色主题</li>
-											<li>树表格添加回调函数(校验异常状态)</li>
-											<li>用户个人中心适配手机端显示</li>
-											<li>Excel支持设置导出类型&更换样式</li>
-											<li>检查属性改变修改为克隆方式(防止热部署强转异常)</li>
-											<li>其他细节优化</li>
-										</ol>
-									</div>
-							    </div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v34">v3.4.0</a><code class="pull-right">2019.06.03</code>
-								   </h5>
-								</div>
-								<div id="v34" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-									        <li>新增实例演示菜单及demo</li>
-											<li>新增页签右键操作</li>
-											<li>菜单管理新增打开方式</li>
-											<li>新增点击某行触发的事件</li>
-											<li>新增双击某行触发的事件</li>
-											<li>新增单击某格触发的事件</li>
-											<li>新增双击某格触发的事件</li>
-											<li>新增是否启用显示细节视图</li>
-											<li>支持上传任意格式文件</li>
-											<li>修复角色权限注解失效问题</li>
-											<li>左侧的菜单栏宽度调整</li>
-											<li>新增响应完成后自定义回调函数</li>
-											<li>支持前端及其他模块直接获取用户信息</li>
-											<li>升级swagger到最新版2.9.2</li>
-											<li>升级jquery.slimscroll到最新版1.3.8</li>
-											<li>升级select2到最新版4.0.7</li>
-											<li>新增角色配置本部门数据权限</li>
-											<li>新增角色配置本部门及以下数据权限</li>
-											<li>优化底部操作防止跳到页面顶端</li>
-											<li>修改冻结列选框无效及样式问题</li>
-											<li>修复部门四层级修改祖级无效问题</li>
-											<li>更换开关切换按钮样式</li>
-											<li>新增select2-bootstrap美化下拉框</li>
-											<li>添加表格内图片预览方法</li>
-											<li>修复权限校验失败跳转页面路径错误</li>
-											<li>国际化资源文件调整</li>
-											<li>通知公告布局调整</li>
-											<li>删除页签操作功能</li>
-											<li>表格树新增查询指定列值</li>
-											<li>更改系统接口扫描方式及完善测试案例</li>
-											<li>表格列浮动提示及字典回显默认去背景</li>
-											<li>修复启用翻页记住前面的选择check没选中问题</li>
-											<li>去除监控页面底部的广告</li>
-											<li>日期控件功问题修复及data功能增强</li>
-											<li>新增角色权限可见性(前端直接调用)</li>
-											<li>新增获取当前登录用户方法(前端及子模块调用)</li>
-											<li>修复热部署重启导致菜单丢失问题</li>
-											<li>优化业务校验失败普通请求跳转页面</li>
-											<li>操作日志新增状态条件查询</li>
-											<li>操作类型支持多选条件查询</li>
-											<li>通知公告防止滚动触底回弹优化</li>
-											<li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							 </div>
-                             <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v33">v3.3.0</a><code class="pull-right">2019.04.01</code>
-								   </h5>
-								</div>
-								<div id="v33" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-											<li>新增线程池统一管理</li>
-											<li>新增支持左右冻结列</li>
-											<li>新增表格字符超长浮动提示</li>
-											<li>升级datepicker拓展并汉化</li>
-											<li>升级druid到最新版本v1.1.14</li>
-											<li>修复个人头像为图片服务器跨域问题</li>
-											<li>修改上传文件按日期存储</li>
-											<li>新增表格客户端分页选项</li>
-											<li>新增表格的高度参数</li>
-											<li>新增表格销毁方法</li>
-											<li>新增表格下拉按钮切换方法</li>
-											<li>新增表格分页跳转到指定页码</li>
-											<li>新增表格启用点击选中行参数</li>
-											<li>修复表格数据重新加载未触发部分按钮禁用</li>
-											<li>使用jsonview展示操作日志参数</li>
-											<li>新增方法(addTab、editTab)</li>
-											<li>修改用户管理界面为Tab打开方式</li>
-											<li>表单验证代码优化</li>
-											<li>修复@Excel注解 prompt 属性使用报错</li>
-											<li>修复combo属性Excel兼容性问题</li>
-											<li>新增@Excel导入导出支持父类字段</li>
-											<li>修复关闭最后选项卡无法激活滚动问题</li>
-											<li>增加日期控件显示类型及回显格式扩展选项</li>
-											<li>修复定时任务执行失败后入库状态为成功状态</li>
-											<li>支持定时任务并发开关控制</li>
-											<li>优化权限校验失败普通请求跳转页面</li>
-											<li>捕获线程池执行任务抛出的异常</li>
-											<li>修复IE浏览器导出功能报错</li>
-											<li>新增角色管理分配用户功能</li>
-											<li>新增表格翻页记住前面的选择</li>
-											<li>调整用户个人中心页面</li>
-											<li>修复界面存在的一些安全问题</li>
-											<li>其他细节优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v32">v3.2.0</a><code class="pull-right">2019.01.18</code>
-								   </h5>
-								</div>
-								<div id="v32" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-											<li>部门修改时不允许选择最后节点</li>
-											<li>修复部门菜单排序字段无效</li>
-											<li>修复光驱磁盘导致服务监控异常</li>
-											<li>登录界面去除check插件</li>
-											<li>验证码文本字符间距修正</li>
-											<li>升级SpringBoot到最新版本2.1.1</li>
-											<li>升级MYSQL驱动</li>
-											<li>修正登录必填项位置偏移</li>
-											<li>Session会话检查优化</li>
-											<li>Excel注解支持多级获取</li>
-											<li>新增序列号生成方法</li>
-											<li>修复WAR部署tomcat退出线程异常</li>
-											<li>全屏操作增加默认确认/关闭</li>
-											<li>修复个人信息可能导致漏洞</li>
-											<li>字典数据根据下拉选择新增类型</li>
-											<li>升级Summernote到最新版本v0.8.11</li>
-											<li>新增用户数据导入</li>
-											<li>首页主题样式更换</li>
-											<li>layer扩展主题更换</li>
-											<li>用户管理移动端默认隐藏左侧布局</li>
-											<li>详细信息弹出层显示在顶层</li>
-											<li>表格支持切换状态(用户/角色/定时任务)</li>
-											<li>Druid数据源支持配置继承</li>
-											<li>修正部分iPhone手机端表格适配问题</li>
-											<li>新增防止重复提交表单方法</li>
-											<li>新增表格数据统计汇总方法</li>
-											<li>支持富文本上传图片文件</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v31">v3.1.0</a><code class="pull-right">2018.12.03</code>
-								   </h5>
-								</div>
-								<div id="v31" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-											<li>新增内网不获取IP地址</li>
-											<li>新增cron表达式有效校验</li>
-											<li>定时任务新增详细信息</li>
-											<li>定时任务默认策略修改(不触发立即执行)</li>
-											<li>定时任务显示下一个执行周期</li>
-											<li>支持前端任意日期格式处理</li>
-											<li>上传头像删除多余提交按钮</li>
-											<li>表格增加行间隔色配置项</li>
-											<li>表格增加转义HTML字符串配置项</li>
-											<li>表格增加显示/隐藏指定列</li>
-											<li>代码生成优化</li>
-											<li>操作日志参数格式化显示</li>
-											<li>页签新增新增全屏显示</li>
-											<li>新增一键打包部署</li>
-											<li>Excel注解新增多个参数</li>
-											<li>新增提交静默更新表格方法</li>
-											<li>新增服务监控菜单</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-							<div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v30">v3.0.0</a><code class="pull-right">2018.10.08</code>
-								   </h5>
-								</div>
-								<div id="v30" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-											<li>升级poi到最新版3.17</li>
-											<li>导出修改临时目录绝对路径</li>
-											<li>升级laydate到最新版5.0.9</li>
-											<li>升级SpringBoot到最新版本2.0.5</li>
-											<li>优化开始/结束时间校验限制</li>
-											<li>重置密码参数表中获取默认值</li>
-											<li>修复头像修改显示问题</li>
-											<li>新增数据权限过滤注解</li>
-											<li>新增表格检索折叠按钮</li>
-											<li>新增清空(登录、操作、调度)日志</li>
-											<li>固定按钮位置(提交/关闭)</li>
-											<li>部门/菜单支持(展开/折叠)</li>
-											<li>部分细节调整优化</li>
-											<li>项目采用分模块</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-							<div class="panel panel-default">
-								<div class="panel-heading">
-								   <h5 class="panel-title">
-									   <a data-toggle="collapse" data-parent="#version" href="#v24">v2.4.0</a><code class="pull-right">2018.09.03</code>
-								   </h5>
-								</div>
-								<div id="v24" class="panel-collapse collapse">
-									<div class="panel-body">
-									   <ol>
-											<li>支持部门多级查询</li>
-											<li>修复菜单状态查询无效</li>
-											<li>支持IP地址开关</li>
-											<li>支持XSS开关</li>
-											<li>记录日志异步处理</li>
-											<li>字典回显样式更改为下拉框</li>
-											<li>菜单类型必填校验</li>
-											<li>修复在线用户排序报错</li>
-											<li>增加重置按钮</li>
-											<li>支持注解导入数据</li>
-											<li>支持弹层外区域关闭</li>
-											<li>备注更换为文本区域</li>
-											<li>新增角色逻辑删除</li>
-											<li>新增部门逻辑删除</li>
-											<li>支持部门数据权限</li>
-											<li>管理员默认拥有所有授权</li>
-											<li>字典数据采用分页</li>
-											<li>部分细节调整优化</li>
-										</ol>
-									</div>
-								</div>
-							</div>
-                            <div class="panel panel-default">
-									<div class="panel-heading">
-									   <h5 class="panel-title">
-										   <a data-toggle="collapse" data-parent="#version" href="#v23">v2.3.0</a><code class="pull-right">2018.08.06</code>
-									   </h5>
-									</div>
-									<div id="v23" class="panel-collapse collapse">
-										<div class="panel-body">
-										   <ol>
-										        <li>支持表格不分页开关控制</li>
-										        <li>修改字典类型同步修改字典数据</li>
-										        <li>代码生成新增修改后缀处理</li>
-										        <li>代码生成新增实体toString</li>
-										        <li>代码生成非字符串去除!=''</li>
-												<li>导出数据前加载遮罩层</li>
-												<li>部门删除校验条件修改</li>
-												<li>搜索查询下载优化</li>
-												<li>手机打开弹出层自适应</li>
-												<li>角色岗位禁用显示置灰</li>
-												<li>角色禁用不显示菜单</li>
-												<li>新增导出权限</li>
-												<li>角色权限唯一校验</li>
-												<li>岗位名称编码唯一校验</li>
-                                                <li>TreeTable优化</li>
-                                                <li>支持多数据源</li>
-												<li>其他细节优化</li>
-											</ol>
-										</div>
-									</div>
-								</div>
-                                <div class="panel panel-default">
-									<div class="panel-heading">
-									   <h5 class="panel-title">
-										   <a data-toggle="collapse" data-parent="#version" href="#v22">v2.2.0</a><code class="pull-right">2018.07.23</code>
-									   </h5>
-									</div>
-									<div id="v22" class="panel-collapse collapse">
-										<div class="panel-body">
-										   <ol>
-										        <li>修复批量生成代码异常问题</li>
-										        <li>修复定时器保存失败问题</li>
-										        <li>修复热部署转换问题</li>
-												<li>支持查询菜单管理,部门管理</li>
-												<li>大多数功能支持时间查询</li>
-												<li>自定义导出注解自动匹配column</li>
-												<li>新增任务执行策略</li>
-												<li>操作详细动态显示类型</li>
-												<li>支持动态回显字典数据</li>
-												<li>后台代码优化调整</li>
-												<li>其他细节优化</li>
-											</ol>
-										</div>
-									</div>
-								</div>
-                                <div class="panel panel-default">
-									<div class="panel-heading">
-									   <h5 class="panel-title">
-										   <a data-toggle="collapse" data-parent="#version" href="#v21">v2.1.0</a><code class="pull-right">2018.07.10</code>
-									   </h5>
-									</div>
-									<div id="v21" class="panel-collapse collapse">
-										<div class="panel-body">
-										   <ol>
-										        <li>新增登录超时提醒</li>
-										        <li>修复定时器热部署转换问题</li>
-										        <li>修复登录验证码校验无效问题</li>
-												<li>定时任务新增立即执行一次</li>
-												<li>存在字典数据不允许删除字典</li>
-												<li>字典数据支持按名称查询</li>
-												<li>代码生成增加日志注解&表格优化</li>
-												<li>修复用户逻辑删除后能登录问题</li>
-												<li>表格支持多字段动态排序</li>
-												<li>支持三级菜单显示</li>
-												<li>新增ry.sh启动程序脚本</li>
-												<li>其他细节优化</li>
-											</ol>
-										</div>
-									</div>
-								</div>
-                            	<div class="panel panel-default">
-									<div class="panel-heading">
-									   <h5 class="panel-title">
-										   <a data-toggle="collapse" data-parent="#version" href="#v20">v2.0.0</a><code class="pull-right">2018.07.02</code>
-									   </h5>
-									</div>
-									<div id="v20" class="panel-collapse collapse">
-										<div class="panel-body">
-										   <ol>
-										        <li>升级SpringBoot到最新版本2.0.3</li>
-										        <li>新增公告管理</li>
-												<li>表单校验示提体验优化</li>
-												<li>前端通用方法封装调整</li>
-												<li>前端去除js文件,合并到html</li>
-												<li>操作加载遮罩层</li>
-												<li>支持全屏模式操作</li>
-												<li>支持注解导出数据</li>
-												<li>系统支持多查询&下载</li>
-												<li>系统样式调整</li>
-											</ol>
-										</div>
-									</div>
-								</div>
-                                <div class="panel panel-default">
-									<div class="panel-heading">
-									   <h5 class="panel-title">
-										   <a data-toggle="collapse" data-parent="#version" href="#v16">v1.1.6</a><code class="pull-right">2018.06.04</code>
-									   </h5>
-									</div>
-									<div id="v16" class="panel-collapse collapse">
-										<div class="panel-body">
-										   <ol>
-												<li>新增用户列表部门列</li>
-												<li>新增登录地点</li>
-												<li>新增swagger</li>
-												<li>修复排序数字校验</li>
-												<li>优化头像上传文件类型限定为图片</li>
-												<li>新增XSS过滤</li>
-												<li>新增热部署提高开发效率</li>
-												<li>修复treegrid居中无效</li>
-												<li>角色多条件查询</li>
-											</ol>
-										</div>
-									</div>
-								</div>
-                            	<div class="panel panel-default">
-									<div class="panel-heading">
-									   <h5 class="panel-title">
-										   <a data-toggle="collapse" data-parent="#version" href="#v15">v1.1.5</a><code class="pull-right">2018.05.28</code>
-									   </h5>
-									</div>
-									<div id="v15" class="panel-collapse collapse">
-										<div class="panel-body">
-										   <ol>
-												<li>优化登录失败刷新验证码</li>
-												<li>新增用户登录地址时间</li>
-												<li>修复ajax超时退出问题</li>
-												<li>新增html调用数据字典(若依首创)</li>
-												<li>调整系统部分样式</li>
-												<li>新增用户逻辑删除</li>
-												<li>新增管理员不允许删除修改</li>
-												<li>升级bootstrapTable到最新版本1.12.1</li>
-												<li>升级layer到最新版本3.1.1</li>
-											</ol>
-										</div>
-									</div>
-								</div>
-							    <div class="panel panel-default">
-									<div class="panel-heading">
-									   <h5 class="panel-title">
-										   <a data-toggle="collapse" data-parent="#version" href="#v14">v1.1.4</a><code class="pull-right">2018.05.20</code>
-									   </h5>
-									</div>
-									<div id="v14" class="panel-collapse collapse">
-										<div class="panel-body">
-										   <ol>
-												<li>新增参数管理</li>
-												<li>修复头像上传bug</li>
-												<li>手机邮箱唯一校验</li>
-												<li>支持手机邮箱登录</li>
-												<li>代码生成优化</li>
-												<li>支持模糊查询</li>
-												<li>支持切换主题皮肤</li>
-												<li>修改权限即时生效</li>
-												<li>修复页签Tab关闭问题</li>
-											</ol>
-										</div>
-									</div>
-								</div>
-								<div class="panel panel-default">
-									<div class="panel-heading">
-									   <h5 class="panel-title">
-										   <a data-toggle="collapse" data-parent="#version" href="#v13">v1.1.3</a><code class="pull-right">2018.05.14</code>
-									   </h5>
-									</div>
-									<div id="v13" class="panel-collapse collapse">
-										<div class="panel-body">
-										   <ol>
-												<li>新增验证码(数组计算、字符验证)</li>
-												<li>新增cookie记住我</li>
-												<li>新增头像上传</li>
-												<li>用户名密码长度限制</li>
-												<li>通用字段提取</li>
-												<li>支持自定义条件查询</li>
-												<li>部门名称必填、时间格式调整</li>
-												<li>其他细节优化</li>
-											</ol>
-										</div>
-									</div>
-								</div>
-								<div class="panel panel-default">
-									<div class="panel-heading">
-                                        <h5 class="panel-title">
-											<a data-toggle="collapse" data-parent="#version" href="#v12">v1.1.2</a><code class="pull-right">2018.05.07</code>
-										</h5>
-                                    </div>
-                                    <div id="v12" class="panel-collapse collapse">
-                                        <div class="panel-body">
-                                            <ol>
-                                            	<li>新增个人信息修改</li>
-												<li>菜单存在子菜单不允许删除</li>
-												<li>菜单分配角色不允许删除</li>
-												<li>角色分配人员不允许删除</li>
-												<li>岗位使用后不允许删除</li>
-												<li>保证用户的数据完整性加入事物</li>
-												<li>新增环境使用手册、数据建模</li>
-												<li>Thymeleaf升级到3.0</li>
-												<li>支持非ROOT部署</li>
-                                            </ol>
-                                        </div>
-                                    </div>
-                                </div>
-                                <div class="panel panel-default">
-									<div class="panel-heading">
-                                        <h5 class="panel-title">
-											<a data-toggle="collapse" data-parent="#version" href="#v11">v1.1.1</a><code class="pull-right">2018.04.23</code>
-										</h5>
-                                    </div>
-                                    <div id="v11" class="panel-collapse collapse">
-                                        <div class="panel-body">
-                                            <ol>
-                                            	<li>新增表单构建器</li>
-												<li>代码生成优化</li>
-												<li>支持新增主部门</li>
-												<li>支持选择上级部门、上级菜单</li>
-												<li>新增字典管理单条删除</li>
-												<li>优化一些其他细节</li>
-                                            </ol>
-                                        </div>
-                                    </div>
-                                </div>
-                                <div class="panel panel-default">
-									<div class="panel-heading">
-                                        <h5 class="panel-title">
-											<a data-toggle="collapse" data-parent="#version" href="#v10">v1.1.0</a><code class="pull-right">2018.04.20</code>
-										</h5>
-                                    </div>
-                                    <div id="v10" class="panel-collapse collapse">
-                                        <div class="panel-body">
-                                            <ol>
-                                            	<li>支持密码盐</li>
-												<li>支持新增主目录</li>
-												<li>支持批量生成代码</li>
-												<li>支持表格导出(csv、txt、doc、excel)</li>
-												<li>自动适应宽高模式窗体</li>
-												<li>重复校验(角色名、菜单名、部门名)</li>
-												<li>优化一些其他细节</li>
-                                            </ol>
-                                        </div>
-                                    </div>
-                                </div>
-                                <div class="panel panel-default">
-									<div class="panel-heading">
-                                        <h5 class="panel-title">
-											<a data-toggle="collapse" data-parent="#version" href="#v09">v1.0.9</a><code class="pull-right">2018.04.14</code>
-										</h5>
-                                    </div>
-                                    <div id="v09" class="panel-collapse collapse">
-                                        <div class="panel-body">
-                                            <ol>
-                                            	<li>新增代码生成(生成包括 java、html、js、xml、sql)</li>
-												<li>新增按钮权限控制隐藏(若依首创)</li>
-                                            </ol>
-                                        </div>
-                                    </div>
-                                </div>
-								<div class="panel panel-default">
-									<div class="panel-heading">
-                                        <h5 class="panel-title">
-											<a data-toggle="collapse" data-parent="#version" href="#v08">v1.0.8</a><code class="pull-right">2018.04.08</code>
-										</h5>
-                                    </div>
-                                    <div id="v08" class="panel-collapse collapse">
-                                        <div class="panel-body">
-                                            <ol>
-                                            	<li>新增定时任务(新增、修改、删除、查询、启动/暂停)</li>
-												<li>新增调度日志(查询、删除)</li>
-                                            </ol>
-                                        </div>
-                                    </div>
-                                </div>
-                            	<div class="panel panel-default">
-									<div class="panel-heading">
-                                        <h5 class="panel-title">
-											<a data-toggle="collapse" data-parent="#version" href="#v07">v1.0.7</a><code class="pull-right">2018.04.04</code>
-										</h5>
-                                    </div>
-                                    <div id="v07" class="panel-collapse collapse">
-                                        <div class="panel-body">
-                                            <ol>
-                                            	<li>新增岗位管理(新增、修改、删除、查询)</li>
-												<li>优化用户管理,菜单管理部分细节</li>
-                                            </ol>
-                                        </div>
-                                    </div>
-                                </div>
-								<div class="panel panel-default">
-									<div class="panel-heading">
-                                        <h5 class="panel-title">
-											<a data-toggle="collapse" data-parent="#version" href="#v06">v1.0.6</a><code class="pull-right">2018.03.15</code>
-										</h5>
-                                    </div>
-                                    <div id="v06" class="panel-collapse collapse">
-                                        <div class="panel-body">
-                                            <ol>
-                                            	<li>新增字典管理(新增、删除、修改、查询、数据选择)</li>
-												<li>新增用户密码重置</li>
-												<li>优化一些其他细节</li>
-                                            </ol>
-                                        </div>
-                                    </div>
-                                </div>
-								<div class="panel panel-default">
-									<div class="panel-heading">
-                                        <h5 class="panel-title">
-											<a data-toggle="collapse" data-parent="#version" href="#v05">v1.0.5</a><code class="pull-right">2018.03.12</code>
-										</h5>
-                                    </div>
-                                    <div id="v05" class="panel-collapse collapse">
-                                        <div class="panel-body">
-                                            <ol>
-                                            	<li>新增菜单管理(新增、删除、修改、查询、图标选择)</li>
-												<li>部门管理优化(添加责任人、联系电话、邮箱、修改者)</li>
-                                            </ol>
-                                        </div>
-                                    </div>
-                                </div>
-								<div class="panel panel-default">
-									<div class="panel-heading">
-                                        <h5 class="panel-title">
-											<a data-toggle="collapse" data-parent="#version" href="#v04">v1.0.4</a><code class="pull-right">2018.03.11</code>
-										</h5>
-                                    </div>
-                                    <div id="v04" class="panel-collapse collapse">
-                                        <div class="panel-body">
-                                            <ol>
-                                            	<li>新增角色管理(新增、删除、修改、查询、菜单选择)</li>
-                                            </ol>
-                                        </div>
-                                    </div>
-                                </div>
-								<div class="panel panel-default">
-									<div class="panel-heading">
-                                        <h5 class="panel-title">
-											<a data-toggle="collapse" data-parent="#version" href="#v03">v1.0.3</a><code class="pull-right">2018.03.08</code>
-										</h5>
-                                    </div>
-                                    <div id="v03" class="panel-collapse collapse">
-                                        <div class="panel-body">
-                                            <ol>
-                                            	<li>新增用户管理(新增、删除、修改、查询、部门选择)</li>
-                                            </ol>
-                                        </div>
-                                    </div>
-                                </div>
-                            	<div class="panel panel-default">
-									<div class="panel-heading">
-                                        <h5 class="panel-title">
-											<a data-toggle="collapse" data-parent="#version" href="#v02">v1.0.2</a><code class="pull-right">2018.03.04</code>
-										</h5>
-                                    </div>
-                                    <div id="v02" class="panel-collapse collapse">
-                                        <div class="panel-body">
-                                            <ol>
-                                            	<li>新增部门管理 (新增、删除、修改、查询)</li>
-                                            </ol>
-                                        </div>
-                                    </div>
-                                </div>
-                                <div class="panel panel-default">
-                                    <div class="panel-heading">
-                                        <h5 class="panel-title">
-											<a data-toggle="collapse" data-parent="#version" href="#v01">v1.0.1</a><code class="pull-right">2018.03.03</code>
-										</h5>
-                                    </div>
-                                    <div id="v01" class="panel-collapse collapse">
-                                        <div class="panel-body">
-                                            <ol>
-                                            	<li>新增在线用户 (批量强退、单条强退、查询)</li>
-                                                <li>新增登录日志 (批量删除、查询)</li>
-												<li>新增操作日志 (批量删除、查询、详细)</li>
-												<li>新增数据监控 (监控DB池连接和SQL的执行)</li>
-                                            </ol>
-                                        </div>
-                                    </div>
-                                </div>
-                                <div class="panel panel-default">
-                                    <div class="panel-heading">
-                                        <h4 class="panel-title">
-                                            <a data-toggle="collapse" data-parent="#version" href="#v00">v1.0.0</a><code class="pull-right">2018.03.01</code>
-                                        </h4>
-                                    </div>
-                                    <div id="v00" class="panel-collapse collapse">
-                                        <div class="panel-body">
-                                            <ol>
-                                                <li>若依管理系统正式发布。</li>
-                                            </ol>
-                                        </div>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="col-sm-4">
-                <div class="ibox float-e-margins">
-                    <div class="ibox-title">
-                        <h5>捐赠</h5>
-                    </div>
-                    <div class="ibox-content">
-                        <div class="alert alert-warning">
-                            	请作者喝杯咖啡(点击图片放大)
-                        </div>
-                        <p id="pay-qrcode">
-                            <a href="javascript:;"><img th:src="@{/img/pay.png}" width="100%" alt="请使用手机支付宝或者微信扫码支付">
-                            </a>
-                        </p>
-
-                    </div>
                 </div>
             </div>
         </div>

+ 31 - 0
src/main/resources/templates/master/field/add.html

@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('新增字段')" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-field-add">
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">字段主键:</label>
+                <div class="col-sm-8">
+                    <input name="fieldKey" class="form-control" type="text">
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var prefix = ctx + "master/field";
+        $("#form-field-add").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/add", $('#form-field-add').serialize());
+            }
+        }
+    </script>
+</body>
+</html>

+ 32 - 0
src/main/resources/templates/master/field/edit.html

@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('修改字段')" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-field-edit" th:object="${mField}">
+            <input name="id" th:field="*{id}" type="hidden">
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">字段主键:</label>
+                <div class="col-sm-8">
+                    <input name="fieldKey" th:field="*{fieldKey}" class="form-control" type="text">
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var prefix = ctx + "master/field";
+        $("#form-field-edit").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/edit", $('#form-field-edit').serialize());
+            }
+        }
+    </script>
+</body>
+</html>

+ 117 - 0
src/main/resources/templates/master/field/field.html

@@ -0,0 +1,117 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+    <th:block th:include="include :: header('字段列表')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+        <div class="row">
+            <div class="col-sm-12 search-collapse">
+                <form id="formId">
+                    <div class="select-list">
+                        <ul>
+                            <li>
+                                <label>字段主键:</label>
+                                <input type="text" name="fieldKey"/>
+                            </li>
+                            <li>
+                                <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
+                                <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
+                            </li>
+                        </ul>
+                    </div>
+                </form>
+            </div>
+
+            <div class="btn-group-sm" id="toolbar" role="group">
+                <a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="master:field:add">
+                    <i class="fa fa-plus"></i> 添加
+                </a>
+                <a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="master:field:edit">
+                    <i class="fa fa-edit"></i> 修改
+                </a>
+                <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" shiro:hasPermission="master:field:remove">
+                    <i class="fa fa-remove"></i> 删除
+                </a>
+            </div>
+            <div class="col-sm-12 select-table table-striped">
+                <table id="bootstrap-table"
+                       data-mobile-responsive="true"
+                       data-use-row-attr-func="true"
+                       data-reorderable-rows="true"></table>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+     <th:block th:include="include :: bootstrap-table-reorder-rows-js"/>
+    <script th:inline="javascript">
+        var editFlag = [[${@permission.hasPermi('master:field:edit')}]];
+        var removeFlag = [[${@permission.hasPermi('master:field:remove')}]];
+        var prefix = ctx + "master/field";
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+                createUrl: prefix + "/add",
+                updateUrl: prefix + "/edit/{id}",
+                removeUrl: prefix + "/remove",
+                exportUrl: prefix + "/export",
+                modalName: "字段",
+                onReorderRow: function (data) {
+                    saveSorted(JSON.stringify(data));
+                    return true;
+                },
+                columns: [{
+                    checkbox: true
+                },
+                {
+                    field: 'id',
+                    title: '主键',
+                    visible: false
+                },
+                {
+                    field: 'fieldKey',
+                    title: '字段主键'
+                },
+                {
+                    field: 'sort',
+                    title: '排序'
+                },
+                {
+                    title: '操作',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                        var actions = [];
+                        actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.id + '\')"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.id + '\')"><i class="fa fa-remove"></i>删除</a>');
+                        return actions.join('');
+                    }
+                }]
+            };
+            $.table.init(options);
+        });
+
+        function saveSorted(data) {
+            $.ajax({
+                url: prefix + "/sorted",
+                type: "post",
+                dataType: "json",
+                data: {
+                    params: {
+                        sorted: data
+                    }
+                },
+                beforeSend: function () {
+                    $.modal.loading("正在处理中,请稍后...");
+                    $.modal.disable();
+                },
+                success: function (result) {
+                    $.table.search();
+                    $.modal.closeLoading();
+                    $.modal.enable();
+                }
+            })
+        }
+    </script>
+</body>
+</html>

+ 41 - 0
src/main/resources/templates/master/model/add.html

@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('新增商品型号')" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-model-add">
+            <div class="form-group">
+                <label class="col-sm-3 control-label">型号分类:</label>
+                <div class="col-sm-8">
+                    <select name="mkId" id="mkId" class="form-control" th:with="kinds=${modelKindList}" required>
+                        <option value="">请选择</option>
+                        <option th:each="kind : ${kinds}" th:text="${kind.kindName}"
+                                th:value="${kind.id}"></option>
+                    </select>
+                </div>
+            </div>
+            <div class="form-group">
+                <label class="col-sm-3 control-label">型号名称:</label>
+                <div class="col-sm-8">
+                    <input name="modelName" class="form-control" type="text" required>
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var prefix = ctx + "master/model";
+        $("#form-model-add").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/add", $('#form-model-add').serialize());
+            }
+        }
+    </script>
+</body>
+</html>

+ 42 - 0
src/main/resources/templates/master/model/edit.html

@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('修改商品型号')" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-model-edit" th:object="${model}">
+            <input name="id" th:field="*{id}" type="hidden">
+            <div class="form-group">
+                <label class="col-sm-3 control-label">型号分类:</label>
+                <div class="col-sm-8">
+                    <select name="mkId" id="mkId" class="form-control" th:with="kinds=${modelKindList}" required>
+                        <option value="">请选择</option>
+                        <option th:each="kind : ${kinds}" th:text="${kind.kindName}" th:field="*{mkId}"
+                                th:value="${kind.id}"></option>
+                    </select>
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">型号名称:</label>
+                <div class="col-sm-8">
+                    <input name="modelName" th:field="*{modelName}" class="form-control" type="text">
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var prefix = ctx + "master/model";
+        $("#form-model-edit").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/edit", $('#form-model-edit').serialize());
+            }
+        }
+    </script>
+</body>
+</html>

+ 98 - 0
src/main/resources/templates/master/model/model.html

@@ -0,0 +1,98 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+    <th:block th:include="include :: header('商品型号列表')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+        <div class="row">
+            <div class="col-sm-12 search-collapse">
+                <form id="formId">
+                    <div class="select-list">
+                        <ul>
+                            <li>
+                                <label>型号分类:</label>
+                                <select id="mkId" name="mkId" th:with="kinds=${modelKindList}">
+                                    <option value="">所有</option>
+                                    <option th:each="kind : ${kinds}" th:text="${kind.kindName}"
+                                            th:value="${kind.id}"></option>
+                                </select>
+                            </li>
+                            <li>
+                                <label>型号名称:</label>
+                                <input type="text" name="modelName"/>
+                            </li>
+                            <li>
+                                <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
+                                <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
+                            </li>
+                        </ul>
+                    </div>
+                </form>
+            </div>
+
+            <div class="btn-group-sm" id="toolbar" role="group">
+                <a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="master:model:add">
+                    <i class="fa fa-plus"></i> 添加
+                </a>
+                <a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="master:model:edit">
+                    <i class="fa fa-edit"></i> 修改
+                </a>
+                <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" shiro:hasPermission="master:model:remove">
+                    <i class="fa fa-remove"></i> 删除
+                </a>
+                <a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="master:model:export">
+                    <i class="fa fa-download"></i> 导出
+                </a>
+            </div>
+            <div class="col-sm-12 select-table table-striped">
+                <table id="bootstrap-table"></table>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var editFlag = [[${@permission.hasPermi('master:model:edit')}]];
+        var removeFlag = [[${@permission.hasPermi('master:model:remove')}]];
+        var prefix = ctx + "master/model";
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+                createUrl: prefix + "/add",
+                updateUrl: prefix + "/edit/{id}",
+                removeUrl: prefix + "/remove",
+                exportUrl: prefix + "/export",
+                modalName: "商品型号",
+                columns: [{
+                    checkbox: true
+                },
+                {
+                    field: 'id',
+                    title: '主键',
+                    visible: false
+                },
+                {
+                    field: 'modelKindName',
+                    title: '型号分类名称'
+                },
+                {
+                    field: 'modelName',
+                    title: '型号名称'
+                },
+                {
+                    title: '操作',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                        var actions = [];
+                        actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.id + '\')"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.id + '\')"><i class="fa fa-remove"></i>删除</a>');
+                        return actions.join('');
+                    }
+                }]
+            };
+            $.table.init(options);
+        });
+    </script>
+</body>
+</html>

+ 31 - 0
src/main/resources/templates/master/modelKind/add.html

@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('新增商品型号分类')" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-modelKind-add">
+            <div class="form-group">    
+                <label class="col-sm-3 control-label is-required">分类名称:</label>
+                <div class="col-sm-8">
+                    <input name="kindName" class="form-control" type="text" required>
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var prefix = ctx + "master/modelKind"
+        $("#form-modelKind-add").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/add", $('#form-modelKind-add').serialize());
+            }
+        }
+    </script>
+</body>
+</html>

+ 32 - 0
src/main/resources/templates/master/modelKind/edit.html

@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('修改商品型号分类')" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-modelKind-edit" th:object="${mModelKind}">
+            <input name="id" th:field="*{id}" type="hidden">
+            <div class="form-group">    
+                <label class="col-sm-3 control-label is-required">分类名称:</label>
+                <div class="col-sm-8">
+                    <input name="kindName" th:field="*{kindName}" class="form-control" type="text" required>
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var prefix = ctx + "master/modelKind";
+        $("#form-modelKind-edit").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/edit", $('#form-modelKind-edit').serialize());
+            }
+        }
+    </script>
+</body>
+</html>

+ 86 - 0
src/main/resources/templates/master/modelKind/modelKind.html

@@ -0,0 +1,86 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+    <th:block th:include="include :: header('商品型号分类列表')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+        <div class="row">
+            <div class="col-sm-12 search-collapse">
+                <form id="formId">
+                    <div class="select-list">
+                        <ul>
+                            <li>
+                                <label>分类名称:</label>
+                                <input type="text" name="kindName"/>
+                            </li>
+                            <li>
+                                <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
+                                <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
+                            </li>
+                        </ul>
+                    </div>
+                </form>
+            </div>
+
+            <div class="btn-group-sm" id="toolbar" role="group">
+                <a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="master:modelKind:add">
+                    <i class="fa fa-plus"></i> 添加
+                </a>
+                <a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="master:modelKind:edit">
+                    <i class="fa fa-edit"></i> 修改
+                </a>
+                <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" shiro:hasPermission="master:modelKind:remove">
+                    <i class="fa fa-remove"></i> 删除
+                </a>
+<!--                <a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="master:modelKind:export">-->
+<!--                    <i class="fa fa-download"></i> 导出-->
+<!--                </a>-->
+            </div>
+            <div class="col-sm-12 select-table table-striped">
+                <table id="bootstrap-table"></table>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var editFlag = [[${@permission.hasPermi('master:modelKind:edit')}]];
+        var removeFlag = [[${@permission.hasPermi('master:modelKind:remove')}]];
+        var prefix = ctx + "master/modelKind";
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+                createUrl: prefix + "/add",
+                updateUrl: prefix + "/edit/{id}",
+                removeUrl: prefix + "/remove",
+                // exportUrl: prefix + "/export",
+                modalName: "商品型号分类",
+                columns: [{
+                    checkbox: true
+                },
+                {
+                    field: 'id',
+                    title: '主键',
+                    visible: false
+                },
+                {
+                    field: 'kindName',
+                    title: '分类名称'
+                },
+                {
+                    title: '操作',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                        var actions = [];
+                        actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.id + '\')"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.id + '\')"><i class="fa fa-remove"></i>删除</a>');
+                        return actions.join('');
+                    }
+                }]
+            };
+            $.table.init(options);
+        });
+    </script>
+</body>
+</html>

+ 40 - 0
src/main/resources/templates/master/roleField/add.html

@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('新增角色字段控制')" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-roleField-add">
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">字段ID:</label>
+                <div class="col-sm-8">
+                    <input name="fieldKey" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">显示标志:</label>
+                <div class="col-sm-8">
+                    <div class="radio-box" th:each="dict : ${@dict.getType('sys_yes_no')}">
+                        <input type="radio" th:id="${'showFlag_' + dict.dictCode}" name="showFlag" th:value="${dict.dictValue}" th:checked="${dict.default}">
+                        <label th:for="${'showFlag_' + dict.dictCode}" th:text="${dict.dictLabel}"></label>
+                    </div>
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var prefix = ctx + "master/roleField";
+        $("#form-roleField-add").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/add", $('#form-roleField-add').serialize());
+            }
+        }
+    </script>
+</body>
+</html>

+ 41 - 0
src/main/resources/templates/master/roleField/edit.html

@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('修改角色字段控制')" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-roleField-edit" th:object="${roleField}">
+            <input name="id" th:field="*{id}" type="hidden">
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">字段ID:</label>
+                <div class="col-sm-8">
+                    <input name="fieldKey" th:field="*{fieldKey}" class="form-control" type="text">
+                </div>
+            </div>
+            <div class="form-group">    
+                <label class="col-sm-3 control-label">显示标志:</label>
+                <div class="col-sm-8">
+                    <div class="radio-box" th:each="dict : ${@dict.getType('sys_yes_no')}">
+                        <input type="radio" th:id="${'showFlag_' + dict.dictCode}" name="showFlag" th:value="${dict.dictValue}" th:field="*{showFlag}">
+                        <label th:for="${'showFlag_' + dict.dictCode}" th:text="${dict.dictLabel}"></label>
+                    </div>
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var prefix = ctx + "master/roleField";
+        $("#form-roleField-edit").validate({
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/edit", $('#form-roleField-edit').serialize());
+            }
+        }
+    </script>
+</body>
+</html>

+ 128 - 0
src/main/resources/templates/master/roleField/roleField.html

@@ -0,0 +1,128 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+    <th:block th:include="include :: header('角色字段控制列表')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+        <div class="row">
+            <div class="col-sm-12 search-collapse">
+                <form id="formId">
+                    <div class="select-list">
+                        <ul>
+                            <li>
+                                <label>字段主键:</label>
+                                <input type="text" name="fieldKey"/>
+                            </li>
+                            <li>
+                                <label>显示标志:</label>
+                                <select name="showFlag" th:with="type=${@dict.getType('sys_yes_no')}">
+                                    <option value="">所有</option>
+                                    <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                                </select>
+                            </li>
+                            <li>
+                                <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
+                                <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
+                            </li>
+                        </ul>
+                    </div>
+                </form>
+            </div>
+
+            <div class="btn-group-sm" id="toolbar" role="group">
+<!--                <a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="master:roleField:add">-->
+<!--                    <i class="fa fa-plus"></i> 添加-->
+<!--                </a>-->
+<!--                <a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="master:roleField:edit">-->
+<!--                    <i class="fa fa-edit"></i> 修改-->
+<!--                </a>-->
+<!--                <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" shiro:hasPermission="master:roleField:remove">-->
+<!--                    <i class="fa fa-remove"></i> 删除-->
+<!--                </a>-->
+            </div>
+            <div class="col-sm-12 select-table table-striped">
+                <table id="bootstrap-table"></table>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var editFlag = [[${@permission.hasPermi('master:roleField:edit')}]];
+        var removeFlag = [[${@permission.hasPermi('master:roleField:remove')}]];
+        var prefix = ctx + "master/roleField";
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+                createUrl: prefix + "/add",
+                updateUrl: prefix + "/edit/{id}",
+                removeUrl: prefix + "/remove",
+                exportUrl: prefix + "/export",
+                modalName: "角色字段控制",
+                detailView: true,
+                onExpandRow : function(index, row, $detail) {
+                    initChildTable(index, row, $detail);
+                },
+                columns: [
+                // {
+                //     checkbox: true
+                // },
+                {
+                    field: 'id',
+                    title: '主键',
+                    visible: false
+                },
+                {
+                    field: 'roleKey',
+                    title: '角色主键'
+                }]
+            };
+            $.table.init(options);
+        });
+
+        initChildTable = function(index, row, $detail) {
+            var childTable = $detail.html('<table style="table-layout:fixed"></table>').find('table');
+            $(childTable).bootstrapTable({
+                url: prefix + "/listDetail",
+                method: 'post',
+                sidePagination: "server",
+                contentType: "application/x-www-form-urlencoded",
+                queryParams : {
+                    roleKey: row.roleKey
+                },
+                columns: [{
+                        field: 'fieldKey',
+                        title: '字段主键'
+                    },
+                    {
+                        field: 'showFlag',
+                        title: '显示标志',
+                        formatter: function(value, row, index) {
+                            return statusTools(row);
+                        }
+                    }]
+            });
+        };
+
+        function statusTools(row) {
+            if ($.common.equals('1', row.showFlag)) {
+                return '<i class=\"fa fa-toggle-on text-info fa-2x\" onclick="changeShowFlag(\'' + row.id + '\',\'' + row.roleKey + '\',\'' + row.fieldKey + '\',\'' + row.showFlag + '\')"></i> ';
+            } else {
+                return '<i class=\"fa fa-toggle-off text-info fa-2x\" onclick="changeShowFlag(\'' + row.id + '\',\'' + row.roleKey + '\',\'' + row.fieldKey + '\',\'' + row.showFlag + '\')"></i> ';
+            }
+        }
+
+        function changeShowFlag(id, roleKey,fieldKey,showFlag) {
+            var text = !$.common.equals('1', showFlag) ? '显示' : '控制';
+            $.modal.confirm("确认要" + text + "字段吗?", function () {
+                if ($.common.isEmpty(id) || id == 'null') {
+                    $.operate.post(prefix + "/changeShowFlag", {"roleKey":roleKey,"fieldKey":fieldKey});
+                } else {
+                    $.operate.post(prefix + "/changeShowFlag", {"id": id,"roleKey":roleKey,"fieldKey":fieldKey});
+                }
+            })
+        }
+    </script>
+</body>
+</html>

+ 2 - 2
src/main/resources/templates/system/user/add.html

@@ -118,8 +118,8 @@
                         <label class="col-xs-2 control-label">角色:</label>
                         <div class="col-xs-10">
                             <label th:each="role:${roles}" class="check-box">
-								<input name="role" type="checkbox" th:value="${role.roleId}" th:text="${role.roleName}" th:disabled="${role.status == '1'}">
-							</label>
+                                <input name="role" type="radio" th:value="${role.roleId}" th:text="${role.roleName}" th:disabled="${role.status == '1'}">
+                            </label>
                         </div>
                     </div>
                 </div>

+ 2 - 2
src/main/resources/templates/system/user/edit.html

@@ -104,8 +104,8 @@
                         <label class="col-xs-2 control-label">角色:</label>
                         <div class="col-xs-10">
                             <label th:each="role:${roles}" class="check-box">
-								<input name="role" type="checkbox" th:value="${role.roleId}" th:text="${role.roleName}" th:checked="${role.flag}" th:disabled="${role.status == '1'}">
-							</label>
+                                <input name="role" type="radio" th:value="${role.roleId}" th:text="${role.roleName}" th:checked="${role.flag}" th:disabled="${role.status == '1'}">
+                            </label>
                         </div>
                     </div>
                 </div>