Browse Source

增加问题处理菜单及对应功能

tntdc 2 years ago
parent
commit
ac52724166
67 changed files with 1453 additions and 861 deletions
  1. 3 4
      adm/.classpath
  2. 1 0
      adm/.settings/org.eclipse.core.resources.prefs
  3. 0 1
      adm/.settings/org.eclipse.wst.common.component
  4. 17 8
      adm/pom.xml
  5. 27 0
      adm/src/main/java/com/minpay/SpringContextUtil.java
  6. 0 2
      adm/src/main/java/com/minpay/common/event/PasswordFilter.java
  7. 1 0
      adm/src/main/java/com/minpay/common/event/SSOFilter.java
  8. 140 0
      adm/src/main/java/com/minpay/db/PageInterceptors.java
  9. 16 0
      adm/src/main/java/com/minpay/db/table/mapper/ObsQuestionMapper.java
  10. 150 0
      adm/src/main/java/com/minpay/db/table/model/ObsQuestion.java
  11. 20 0
      adm/src/main/java/com/minpay/db/table/own/mapper/QuestionMapper.java
  12. 16 0
      adm/src/main/java/com/minpay/db/table/service/IObsQuestionService.java
  13. 20 0
      adm/src/main/java/com/minpay/db/table/serviceImpl/ObsQuestionServiceImpl.java
  14. 156 0
      adm/src/main/java/com/minpay/guomao/obsmanage/action/ObsQuestionManage.java
  15. 1 5
      adm/src/main/java/com/minpay/guomao/personmanage/action/PersonManageAction.java
  16. 34 0
      adm/src/main/resources/com/minpay/db/table/own/mapper/QuestionMapper.xml
  17. 17 2
      adm/src/main/webapp/WEB-INF/database.xml
  18. BIN
      adm/src/main/webapp/WEB-INF/lib/ueditor-1.1.2.jar
  19. BIN
      adm/src/main/webapp/WEB-INF/lib/ueditor.jar
  20. 24 0
      adm/src/main/webapp/WEB-INF/mybatisConfigure.xml
  21. 2 1
      adm/src/main/webapp/WEB-INF/spring.xml
  22. 1 1
      adm/src/main/webapp/admin/changePwd.html
  23. 125 0
      adm/src/main/webapp/admin/ops/addQuestion.html
  24. 154 0
      adm/src/main/webapp/admin/ops/editQuestion.html
  25. 206 0
      adm/src/main/webapp/admin/ops/questionManage.html
  26. 1 1
      adm/src/main/webapp/ueditor/dialogs/anchor/anchor.html
  27. 1 1
      adm/src/main/webapp/ueditor/dialogs/attachment/attachment.html
  28. 1 1
      adm/src/main/webapp/ueditor/dialogs/background/background.html
  29. 1 1
      adm/src/main/webapp/ueditor/dialogs/charts/charts.html
  30. 1 1
      adm/src/main/webapp/ueditor/dialogs/emotion/emotion.html
  31. 1 1
      adm/src/main/webapp/ueditor/dialogs/gmap/gmap.html
  32. 1 1
      adm/src/main/webapp/ueditor/dialogs/help/help.html
  33. 1 1
      adm/src/main/webapp/ueditor/dialogs/image/image.html
  34. 6 3
      adm/src/main/webapp/ueditor/dialogs/image/image.js
  35. 1 1
      adm/src/main/webapp/ueditor/dialogs/insertframe/insertframe.html
  36. 1 1
      adm/src/main/webapp/ueditor/dialogs/link/link.html
  37. 1 1
      adm/src/main/webapp/ueditor/dialogs/map/map.html
  38. 1 1
      adm/src/main/webapp/ueditor/dialogs/music/music.html
  39. 1 1
      adm/src/main/webapp/ueditor/dialogs/scrawl/scrawl.html
  40. 1 1
      adm/src/main/webapp/ueditor/dialogs/searchreplace/searchreplace.html
  41. 1 1
      adm/src/main/webapp/ueditor/dialogs/snapscreen/snapscreen.html
  42. 1 1
      adm/src/main/webapp/ueditor/dialogs/spechars/spechars.html
  43. 1 1
      adm/src/main/webapp/ueditor/dialogs/table/edittable.html
  44. 1 1
      adm/src/main/webapp/ueditor/dialogs/table/edittd.html
  45. 1 1
      adm/src/main/webapp/ueditor/dialogs/table/edittip.html
  46. 1 1
      adm/src/main/webapp/ueditor/dialogs/template/template.html
  47. 1 1
      adm/src/main/webapp/ueditor/dialogs/video/video.html
  48. 5 3
      adm/src/main/webapp/ueditor/dialogs/video/video.js
  49. 1 1
      adm/src/main/webapp/ueditor/dialogs/webapp/webapp.html
  50. 1 1
      adm/src/main/webapp/ueditor/dialogs/wordimage/wordimage.html
  51. 1 1
      adm/src/main/webapp/ueditor/index.html
  52. 4 30
      adm/src/main/webapp/ueditor/jsp/config.json
  53. 1 1
      adm/src/main/webapp/ueditor/jsp/controller.jsp
  54. BIN
      adm/src/main/webapp/ueditor/jsp/lib/commons-codec-1.9.jar
  55. BIN
      adm/src/main/webapp/ueditor/jsp/lib/commons-fileupload-1.3.1.jar
  56. BIN
      adm/src/main/webapp/ueditor/jsp/lib/commons-io-2.4.jar
  57. BIN
      adm/src/main/webapp/ueditor/jsp/lib/json.jar
  58. BIN
      adm/src/main/webapp/ueditor/jsp/lib/ueditor-1.1.2.jar
  59. 1 2
      adm/src/main/webapp/ueditor/themes/default/css/ueditor.css
  60. 1 1
      adm/src/main/webapp/ueditor/themes/default/css/ueditor.min.css
  61. 1 0
      adm/src/main/webapp/ueditor/third-party/xss.min.js
  62. 156 18
      adm/src/main/webapp/ueditor/ueditor.all.js
  63. 18 709
      adm/src/main/webapp/ueditor/ueditor.all.min.js
  64. 97 17
      adm/src/main/webapp/ueditor/ueditor.config.js
  65. 1 1
      adm/src/main/webapp/ueditor/ueditor.parse.js
  66. 7 28
      adm/src/main/webapp/ueditor/ueditor.parse.min.js
  67. BIN
      adm/src/main/webapp/ueditor/webapp - 快捷方式.lnk

+ 3 - 4
adm/.classpath

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry kind="src" output="target/classes" path="src/main/java">
+	<classpathentry excluding="bin/com/fap/generartor/api/|bin.com.fap.generartor.api/" kind="src" output="target/classes" path="src/main/java">
 		<attributes>
 			<attribute name="optional" value="true"/>
 			<attribute name="maven.pomderived" value="true"/>
@@ -11,9 +11,8 @@
 			<attribute name="maven.pomderived" value="true"/>
 		</attributes>
 	</classpathentry>
-	<classpathentry kind="lib" path="src/main/webapp/WEB-INF/lib/min-1.0.0.jar"/>
+	<classpathentry kind="lib" path="src/main/webapp/WEB-INF/lib/min-1.0.0.jar" sourcepath="src/main/webapp/WEB-INF/lib/min-1.0.0.jar"/>
 	<classpathentry kind="lib" path="src/main/webapp/WEB-INF/lib/minencrypt-1.0.0.jar"/>
-	<classpathentry kind="lib" path="src/main/webapp/WEB-INF/lib/ueditor.jar"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
 		<attributes>
 			<attribute name="maven.pomderived" value="true"/>
@@ -32,6 +31,6 @@
 			<attribute name="maven.pomderived" value="true"/>
 		</attributes>
 	</classpathentry>
-	<classpathentry kind="lib" path="D:/workspace/guomao/taskmam/src/main/webapp/WEB-INF/lib/cache.jar"/>
+	<classpathentry kind="lib" path="D:/workspace/shanghai/guomao/taskman/src/main/webapp/WEB-INF/lib/cache.jar"/>
 	<classpathentry kind="output" path="target/classes"/>
 </classpath>

+ 1 - 0
adm/.settings/org.eclipse.core.resources.prefs

@@ -1,5 +1,6 @@
 eclipse.preferences.version=1
 encoding//src/main/java=UTF-8
 encoding//src/main/resources=UTF-8
+encoding//src/main/webapp/WEB-INF/web.xml=UTF-8
 encoding//src/test/java=UTF-8
 encoding/<project>=UTF-8

+ 0 - 1
adm/.settings/org.eclipse.wst.common.component

@@ -4,7 +4,6 @@
         <wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
         <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
         <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
-        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/test/java"/>
         <property name="context-root" value="adm"/>
         <property name="java-output-path" value="/adm/target/classes"/>
     </wb-module>

+ 17 - 8
adm/pom.xml

@@ -157,7 +157,7 @@
 			<artifactId>druid</artifactId>
 			<version>${druid.version}</version>
 		</dependency>
-		<dependency>
+		<!-- <dependency>
 			<groupId>org.mybatis</groupId>
 			<artifactId>mybatis</artifactId>
 			<version>${mybatis.version}</version>
@@ -166,7 +166,7 @@
 			<groupId>org.mybatis</groupId>
 			<artifactId>mybatis-spring</artifactId>
 			<version>${mybatis_spring.version}</version>
-		</dependency>
+		</dependency> -->
 		<dependency>
 			<groupId>mysql</groupId>
 			<artifactId>mysql-connector-java</artifactId>
@@ -443,7 +443,16 @@
 			<artifactId>easyexcel</artifactId>
 			<version>3.0.5</version>
 		</dependency>
-
+		<dependency>
+	    	<groupId>com.baomidou</groupId>
+		    <artifactId>mybatis-plus</artifactId>
+		    <version>3.5.3.1</version>
+		</dependency>
+		<dependency>
+			<groupId>com.github.pagehelper</groupId>
+			<artifactId>pagehelper</artifactId>
+			<version>5.0.0</version>
+		</dependency>
 
 		<dependency>
 			<groupId>gson</groupId>
@@ -478,7 +487,7 @@
 			<artifactId>ueditor</artifactId>
 			<version>1.0</version>
 			<scope>system</scope>
-			<systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/ueditor.jar</systemPath>
+			<systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/ueditor-1.1.2.jar</systemPath>
 		</dependency>
 </dependencies>
 
@@ -486,12 +495,12 @@
 		<finalName>adm</finalName>
 		<plugins>
 			<plugin>
-				<groupId>org.apache.tomcat.maven</groupId>
-				<artifactId>tomcat7-maven-plugin</artifactId>
-				<version>2.2</version>
+			    <groupId>org.opoo.maven</groupId>
+			    <artifactId>tomcat9-maven-plugin</artifactId>
+			    <version>3.0.0</version>
 				<configuration>
 					<url>http://localhost:8099/adm</url>
-					<server>tomcat</server>
+					<server>tomcat9</server>
 					<username>admin</username>
 					<password>password</password>
 					<path>/adm</path>

+ 27 - 0
adm/src/main/java/com/minpay/SpringContextUtil.java

@@ -0,0 +1,27 @@
+package com.minpay;
+
+
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+@Component
+public class SpringContextUtil implements ApplicationContextAware {
+    private static ApplicationContext applicationContext;//spring上下文
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        SpringContextUtil.applicationContext=applicationContext;
+    }
+    public static ApplicationContext getApplicationContext(){
+        return applicationContext;
+    }
+
+    public static <T> T getBean(String name) throws BeansException{
+        return (T)applicationContext.getBean(name);
+    }
+
+    public static <T> T getBean(Class name) throws BeansException{
+        return (T)applicationContext.getBean(name);
+    }
+}

+ 0 - 2
adm/src/main/java/com/minpay/common/event/PasswordFilter.java

@@ -46,8 +46,6 @@ public class PasswordFilter implements Filter {
 		
 		if (session != null) {
 			User user = (User)session.getUser();
-			System.out.println(user.getAuthpwd());
-			System.out.println(user.getLogonname());
 			if(CheckPassword.checkPasswordRule(user.getAuthpwd(), user.getLogonname())) {
 				chain.doFilter(request, response);
 				return;

+ 1 - 0
adm/src/main/java/com/minpay/common/event/SSOFilter.java

@@ -83,6 +83,7 @@ public class SSOFilter implements Filter {
 //		user.setId(String.valueOf(b)userJson.get(""));
 		User user = new User(imUser);
 		user.setBranchId(userJson.get("branchid").toString());
+		user.setRoleId(userJson.get("roleId").toString());
 		MINServiceLocator.getInstance().lookup(IMINSessionService.class).registerSession(request, user);
 		chain.doFilter(request, response);
 	}

+ 140 - 0
adm/src/main/java/com/minpay/db/PageInterceptors.java

@@ -0,0 +1,140 @@
+package com.minpay.db;
+
+import com.github.pagehelper.Dialect;
+import com.github.pagehelper.PageException;
+import com.github.pagehelper.cache.Cache;
+import com.github.pagehelper.cache.CacheFactory;
+import com.github.pagehelper.util.MSUtils;
+import com.github.pagehelper.util.StringUtil;
+import com.startup.minpay.frame.jdbc.MINRowBounds;
+import org.apache.ibatis.cache.CacheKey;
+import org.apache.ibatis.executor.Executor;
+import org.apache.ibatis.mapping.BoundSql;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.plugin.*;
+import org.apache.ibatis.session.ResultHandler;
+import org.apache.ibatis.session.RowBounds;
+
+import java.lang.reflect.Field;
+import java.util.*;
+
+@Intercepts({@Signature(
+        type = Executor.class,
+        method = "query",
+        args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}
+), @Signature(
+        type = Executor.class,
+        method = "query",
+        args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}
+)})
+public class PageInterceptors implements Interceptor {
+
+    protected Cache<CacheKey, MappedStatement> msCountMap = null;
+    private Dialect dialect;
+    private String default_dialect_class = "com.github.pagehelper.PageHelper";
+    private Field additionalParametersField;
+
+    public Object intercept(Invocation invocation) throws Throwable {
+        try {
+            Object[] args = invocation.getArgs();
+            MappedStatement ms = (MappedStatement)args[0];
+            Object parameter = args[1];
+            RowBounds rowBounds = (RowBounds)args[2];
+            ResultHandler resultHandler = (ResultHandler)args[3];
+            Executor executor = (Executor)invocation.getTarget();
+            CacheKey cacheKey;
+            BoundSql boundSql;
+            if (args.length == 4) {
+                boundSql = ms.getBoundSql(parameter);
+                cacheKey = executor.createCacheKey(ms, parameter, rowBounds, boundSql);
+            } else {
+                cacheKey = (CacheKey)args[4];
+                boundSql = (BoundSql)args[5];
+            }
+
+            List resultList;
+            if (rowBounds instanceof MINRowBounds || this.dialect.skip(ms, parameter, rowBounds)) {
+                resultList = executor.query(ms, parameter, rowBounds, resultHandler, cacheKey, boundSql);
+            } else {
+                Map<String, Object> additionalParameters = (Map)this.additionalParametersField.get(boundSql);
+                if (this.dialect.beforeCount(ms, parameter, rowBounds)) {
+                    CacheKey countKey = executor.createCacheKey(ms, parameter, RowBounds.DEFAULT, boundSql);
+                    countKey.update("_Count");
+                    MappedStatement countMs = (MappedStatement)this.msCountMap.get(countKey);
+                    if (countMs == null) {
+                        countMs = MSUtils.newCountMappedStatement(ms);
+                        this.msCountMap.put(countKey, countMs);
+                    }
+
+                    String countSql = this.dialect.getCountSql(ms, boundSql, parameter, rowBounds, countKey);
+                    BoundSql countBoundSql = new BoundSql(ms.getConfiguration(), countSql, boundSql.getParameterMappings(), parameter);
+                    Iterator var16 = additionalParameters.keySet().iterator();
+
+                    while(var16.hasNext()) {
+                        String key = (String)var16.next();
+                        countBoundSql.setAdditionalParameter(key, additionalParameters.get(key));
+                    }
+
+                    Object countResultList = executor.query(countMs, parameter, RowBounds.DEFAULT, resultHandler, countKey, countBoundSql);
+                    Long count = (Long)((List)countResultList).get(0);
+                    if (!this.dialect.afterCount(count, parameter, rowBounds)) {
+                        Object var18 = this.dialect.afterPage(new ArrayList(), parameter, rowBounds);
+                        return var18;
+                    }
+                }
+
+                if (!this.dialect.beforePage(ms, parameter, rowBounds)) {
+                    resultList = executor.query(ms, parameter, RowBounds.DEFAULT, resultHandler, cacheKey, boundSql);
+                } else {
+                    parameter = this.dialect.processParameterObject(ms, parameter, boundSql, cacheKey);
+                    String pageSql = this.dialect.getPageSql(ms, boundSql, parameter, rowBounds, cacheKey);
+                    BoundSql pageBoundSql = new BoundSql(ms.getConfiguration(), pageSql, boundSql.getParameterMappings(), parameter);
+                    Iterator var25 = additionalParameters.keySet().iterator();
+
+                    while(true) {
+                        if (!var25.hasNext()) {
+                            resultList = executor.query(ms, parameter, RowBounds.DEFAULT, resultHandler, cacheKey, pageBoundSql);
+                            break;
+                        }
+
+                        String key = (String)var25.next();
+                        pageBoundSql.setAdditionalParameter(key, additionalParameters.get(key));
+                    }
+                }
+            }
+
+            Object var22 = this.dialect.afterPage(resultList, parameter, rowBounds);
+            return var22;
+        } finally {
+            this.dialect.afterAll();
+        }
+    }
+
+    public Object plugin(Object target) {
+        return Plugin.wrap(target, this);
+    }
+
+    public void setProperties(Properties properties) {
+        this.msCountMap = CacheFactory.createCache(properties.getProperty("msCountCache"), "ms", properties);
+        String dialectClass = properties.getProperty("dialect");
+        if (StringUtil.isEmpty(dialectClass)) {
+            dialectClass = this.default_dialect_class;
+        }
+
+        try {
+            Class<?> aClass = Class.forName(dialectClass);
+            this.dialect = (Dialect)aClass.newInstance();
+        } catch (Exception var5) {
+            throw new PageException(var5);
+        }
+
+        this.dialect.setProperties(properties);
+
+        try {
+            this.additionalParametersField = BoundSql.class.getDeclaredField("additionalParameters");
+            this.additionalParametersField.setAccessible(true);
+        } catch (NoSuchFieldException var4) {
+            throw new PageException(var4);
+        }
+    }
+}

+ 16 - 0
adm/src/main/java/com/minpay/db/table/mapper/ObsQuestionMapper.java

@@ -0,0 +1,16 @@
+package com.minpay.db.table.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.minpay.db.table.model.ObsQuestion;
+
+/**
+ * <p>
+ * 运维问题表 Mapper 接口
+ * </p>
+ *
+ * @author baomidou
+ * @since 2023-06-21
+ */
+public interface ObsQuestionMapper extends BaseMapper<ObsQuestion> {
+	
+}

+ 150 - 0
adm/src/main/java/com/minpay/db/table/model/ObsQuestion.java

@@ -0,0 +1,150 @@
+package com.minpay.db.table.model;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.startup.minpay.frame.data.AbstractMINBean;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 运维问题表
+ * </p>
+ *
+ * @author baomidou
+ * @since 2023-06-21
+ */
+@TableName("obs_question")
+public class ObsQuestion extends AbstractMINBean implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 编号
+     */
+    @TableId("oq_id")
+    private String oqId;
+      
+    /**
+      * 类型
+      */
+    private String oqType;
+
+    /**
+     * 名称
+     */
+    private String oqName;
+
+    /**
+     * 验证程度
+     */
+    private String oqDegree;
+
+    /**
+     * 重现步骤
+     */
+    private String oqStep;
+
+    /**
+     * 状态
+     */
+    private String oqState;
+
+    /**
+     * 创建人
+     */
+    private String oqCreateUser;
+
+    /**
+     * 创建时间
+     */
+    private String oqCreateTime;
+
+    /**
+     * 修改人
+     */
+    private String oqUpdateUser;
+
+    /**
+     * 修改时间
+     */
+    private String oqUpdateTime;
+
+    public String getOqId() {
+        return oqId;
+    }
+
+    public void setOqId(String oqId) {
+        this.oqId = oqId;
+    }
+    public String getOqType() {
+        return oqType;
+    }
+
+    public void setoqType(String oqType) {
+        this.oqType = oqType;
+    }
+    public String getOqName() {
+        return oqName;
+    }
+
+    public void setOqName(String oqName) {
+        this.oqName = oqName;
+    }
+
+    public String getOqDegree() {
+        return oqDegree;
+    }
+
+    public void setOqDegree(String oqDegree) {
+        this.oqDegree = oqDegree;
+    }
+
+    public String getOqStep() {
+        return oqStep;
+    }
+
+    public void setOqStep(String oqStep) {
+        this.oqStep = oqStep;
+    }
+
+    public String getOqState() {
+        return oqState;
+    }
+
+    public void setOqState(String oqState) {
+        this.oqState = oqState;
+    }
+
+    public String getOqCreateUser() {
+        return oqCreateUser;
+    }
+
+    public void setOqCreateUser(String oqCreateUser) {
+        this.oqCreateUser = oqCreateUser;
+    }
+
+    public String getOqCreateTime() {
+        return oqCreateTime;
+    }
+
+    public void setOqCreateTime(String oqCreateTime) {
+        this.oqCreateTime = oqCreateTime;
+    }
+
+    public String getOqUpdateUser() {
+        return oqUpdateUser;
+    }
+
+    public void setOqUpdateUser(String oqUpdateUser) {
+        this.oqUpdateUser = oqUpdateUser;
+    }
+
+    public String getOqUpdateTime() {
+        return oqUpdateTime;
+    }
+
+    public void setOqUpdateTime(String oqUpdateTime) {
+        this.oqUpdateTime = oqUpdateTime;
+    }
+}

+ 20 - 0
adm/src/main/java/com/minpay/db/table/own/mapper/QuestionMapper.java

@@ -0,0 +1,20 @@
+package com.minpay.db.table.own.mapper;
+
+import java.util.List;
+import java.util.Map;
+
+import com.minpay.db.table.model.ImUser;
+import com.minpay.db.table.model.ImUserExample;
+import com.startup.minpay.frame.jdbc.IMINMybatisEntityMapper;
+
+/**
+ * <p>
+ * 运维问题表 Mapper 接口
+ * </p>
+ *
+ * @author baomidou
+ * @since 2023-06-21
+ */
+public interface QuestionMapper  extends  IMINMybatisEntityMapper<ImUser, String, ImUserExample> {
+	public List<Map<String, String>> getList(Map<String, Object> param);
+}

+ 16 - 0
adm/src/main/java/com/minpay/db/table/service/IObsQuestionService.java

@@ -0,0 +1,16 @@
+package com.minpay.db.table.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.minpay.db.table.model.ObsQuestion;
+
+/**
+ * <p>
+ * 运维问题表 服务类
+ * </p>
+ *
+ * @author baomidou
+ * @since 2023-06-21
+ */
+public interface IObsQuestionService extends IService<ObsQuestion> {
+	
+}

+ 20 - 0
adm/src/main/java/com/minpay/db/table/serviceImpl/ObsQuestionServiceImpl.java

@@ -0,0 +1,20 @@
+package com.minpay.db.table.serviceImpl;
+
+import com.minpay.db.table.model.ObsQuestion;
+import com.minpay.db.table.mapper.ObsQuestionMapper;
+import com.minpay.db.table.service.IObsQuestionService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 运维问题表 服务实现类
+ * </p>
+ *
+ * @author baomidou
+ * @since 2023-06-21
+ */
+@Service
+public class ObsQuestionServiceImpl extends ServiceImpl<ObsQuestionMapper, ObsQuestion> implements IObsQuestionService {
+
+}

+ 156 - 0
adm/src/main/java/com/minpay/guomao/obsmanage/action/ObsQuestionManage.java

@@ -0,0 +1,156 @@
+package com.minpay.guomao.obsmanage.action;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.context.ApplicationContext;
+
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.minpay.SpringContextUtil;
+import com.minpay.common.bean.User;
+import com.minpay.common.format.IFormatService;
+import com.minpay.db.table.model.ObsQuestion;
+import com.minpay.db.table.own.mapper.QuestionMapper;
+import com.minpay.db.table.service.IObsQuestionService;
+import com.startup.minpay.frame.business.IMINAction;
+import com.startup.minpay.frame.business.res.MINActionResult;
+import com.startup.minpay.frame.constant.IMINBusinessConstant;
+import com.startup.minpay.frame.data.format.MINCopyFormat;
+import com.startup.minpay.frame.exception.MINBusinessException;
+import com.startup.minpay.frame.service.base.IMINDataBaseService;
+import com.startup.minpay.frame.service.base.Service;
+import com.startup.minpay.frame.session.MINSession;
+import com.startup.minpay.frame.target.MINAction;
+import com.startup.minpay.frame.target.MINComponent;
+import com.startup.minpay.frame.target.MINParam;
+
+@MINComponent
+public class ObsQuestionManage implements IMINAction{
+	public final static String	QUESTION_ADD				= "questionAdd";
+	public final static String	QUESTION_LIST				= "questionList";
+	public final static String	QUESTION_QUERY				= "questionQuery";
+	public final static String	QUESTION_EDIT				= "questionEdit";
+	public final static String	QUESTION_DEAL				= "questionDeal";
+
+	ApplicationContext applicationContext = SpringContextUtil.getApplicationContext();
+	
+	@MINAction(value = QUESTION_ADD)
+	public MINActionResult questionAdd(
+			MINSession session,
+			@MINParam(key = "name") String name,
+			@MINParam(key = "degree") String degree,
+			@MINParam(key = "step") String step
+			){
+		IObsQuestionService iObsQuestionService = applicationContext.getBean(IObsQuestionService.class);
+		User u = session.getUser();
+		
+		Date date = new Date();
+		SimpleDateFormat sd = new SimpleDateFormat("yyyyMMddhhmmss");
+		String dateString = sd.format(date);
+		
+		MINActionResult res = new MINActionResult();
+		ObsQuestion obsQuestion = new ObsQuestion();
+		obsQuestion.setOqId(String.valueOf(System.currentTimeMillis()));
+		obsQuestion.setoqType("问题");
+		obsQuestion.setOqName(name);
+		obsQuestion.setOqDegree(degree);
+		obsQuestion.setOqStep(step);
+		obsQuestion.setOqState("00");
+		obsQuestion.setOqCreateTime(dateString);
+		obsQuestion.setOqCreateUser(u.getId());
+		iObsQuestionService.save(obsQuestion);
+		return res;
+	}
+
+	@MINAction(value = QUESTION_LIST)
+	public MINActionResult questionList(
+			MINSession session,
+			@MINParam(key = "keyword") String keyword,
+			@MINParam(key = "state") String state,
+			@MINParam(key = "page", defaultValue = "1") int page,
+			@MINParam(key = "limit", defaultValue = "10") int limit
+	) throws MINBusinessException{
+		
+		PageHelper.startPage(page, limit);
+		Map<String, Object> param = new HashMap<>();
+		param.put("keyword", keyword);
+		param.put("state", state);
+		List<Map<String, String>> list = Service.lookup(IMINDataBaseService.class).getMybatisMapper(QuestionMapper.class)
+				  .getList(param);
+		list = Service.lookup(IFormatService.class).formatDateTime(list, "oqCreateTime", "oqUpdateTime");
+		list = new MINCopyFormat("{oqState:'oqStateDesc'}").format(list);
+		list = Service.lookup(IFormatService.class).formatEnum(list,"{oqStateDesc:'obs_question_state'}");
+		
+		PageInfo<Map<String, String>> pageList = new PageInfo<>(list);
+
+		MINActionResult res = new MINActionResult();
+		res.set(IMINBusinessConstant.F_PAGING_LAY, list);
+		res.set(IMINBusinessConstant.F_PAGING_COUNT, pageList.getTotal());
+		return res;
+	}
+	
+	@MINAction(value = QUESTION_QUERY)
+	public MINActionResult questionQuery(
+			@MINParam(key = "oqId") String oqId
+			){
+		IObsQuestionService iObsQuestionService = applicationContext.getBean(IObsQuestionService.class);
+		ObsQuestion obsQuestion = iObsQuestionService.getById(oqId);
+		MINActionResult res = new MINActionResult();
+		res.set(IMINBusinessConstant.F_PAGING_LAY, obsQuestion);
+		return res;
+	}
+	
+	@MINAction(value = QUESTION_EDIT)
+	public MINActionResult questionEdit(
+			MINSession session,
+			@MINParam(key = "id") String id,
+			@MINParam(key = "name") String name,
+			@MINParam(key = "degree") String degree,
+			@MINParam(key = "step") String step
+			){
+		Date date = new Date();
+		SimpleDateFormat sd = new SimpleDateFormat("yyyyMMddhhmmss");
+		String dateString = sd.format(date);
+		User u = session.getUser();
+		
+		IObsQuestionService iObsQuestionService = applicationContext.getBean(IObsQuestionService.class);
+		ObsQuestion obsQuestion = new ObsQuestion();
+		obsQuestion.setOqId(id);
+		obsQuestion.setOqName(name);
+		obsQuestion.setOqDegree(degree);
+		obsQuestion.setOqStep(step);
+		obsQuestion.setOqUpdateUser(u.getId());
+		obsQuestion.setOqUpdateTime(dateString);
+		iObsQuestionService.updateById(obsQuestion);
+		
+		MINActionResult res = new MINActionResult();
+		return res;
+	}
+	
+	@MINAction(value = QUESTION_DEAL)
+	public MINActionResult questionDeal(
+			MINSession session,
+			@MINParam(key = "id") String id,
+			@MINParam(key = "state") String state
+			){
+		Date date = new Date();
+		SimpleDateFormat sd = new SimpleDateFormat("yyyyMMddhhmmss");
+		String dateString = sd.format(date);
+		User u = session.getUser();
+		
+		IObsQuestionService iObsQuestionService = applicationContext.getBean(IObsQuestionService.class);
+		ObsQuestion obsQuestion = new ObsQuestion();
+		obsQuestion.setOqId(id);
+		obsQuestion.setOqState(state);
+		obsQuestion.setOqUpdateUser(u.getId());
+		obsQuestion.setOqUpdateTime(dateString);
+		iObsQuestionService.updateById(obsQuestion);
+		
+		MINActionResult res = new MINActionResult();
+		return res;
+	}
+}

+ 1 - 5
adm/src/main/java/com/minpay/guomao/personmanage/action/PersonManageAction.java

@@ -217,11 +217,7 @@ public class PersonManageAction implements IMINAction {
 		
 		try {
 			//处理正常状态
-			if( session != null ){
-				MINServiceLocator.getInstance()
-				.lookup(IMINSessionService.class)
-				.unRegisterSession(request, session);
-			}
+			user.setAuthpwd(newPassword);
 		} catch (Exception ex){
 			
 		}

+ 34 - 0
adm/src/main/resources/com/minpay/db/table/own/mapper/QuestionMapper.xml

@@ -0,0 +1,34 @@
+<?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.minpay.db.table.own.mapper.QuestionMapper">
+	<select id="getList" parameterType="map" resultType="map">
+		select
+			oq_Id oqId,
+			oq_Name oqName,
+			oq_Degree oqDegree,
+			oq_State oqState,
+			c.USR_NAME createUser,
+			oq_Create_Time oqCreateTime,
+			u.USR_NAME updateUser,
+			oq_Update_Time oqUpdateTime
+		from
+			obs_question
+			left join im_user c
+			on c.USR_ID = oq_Create_User
+			left join im_user u
+			on u.USR_ID = oq_Update_User
+		where
+			1 = 1
+			<if test="keyword != null and keyword != ''">
+				and (
+					oq_Name like concat('%',#{keyword},'%')
+					or
+					oq_Step like concat('%',#{keyword},'%')
+				)
+			</if>
+			<if test="state != null and state != ''">
+				and oq_State = #{state}
+			</if>
+			order by oq_Id desc
+	</select>
+</mapper>

+ 17 - 2
adm/src/main/webapp/WEB-INF/database.xml

@@ -53,7 +53,7 @@
 		<!-- 监控数据库 -->
 		<property name="filters" value="stat"/>
 	</bean>
-	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
+	<!-- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
 		scope="singleton" lazy-init="true">
 		<property name="configLocation"
 			value="classpath:com/startup/minpay/frame/jdbc/mybatisConfigure.xml"></property>
@@ -65,10 +65,25 @@
 			</list>
 		</property>
 		<property name="typeAliasesPackage" value="com.minpay.db" />
+	</bean> -->
+	<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
+		<property name="configLocation"
+				  value="WEB-INF/mybatisConfigure.xml"></property>
+	    <property name="dataSource" ref="dataSource"/>
+	    <property name="mapperLocations">
+			<list>
+				<value>classpath:com/minpay/db/table/mapper/*.xml</value>
+				<value>classpath:com/minpay/db/table/own/mapper/*.xml</value>
+			</list>
+		</property>
+		<property name="typeAliasesPackage" value="com.minpay.db" />
 	</bean>
-	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
+	<!-- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
 		scope="singleton" lazy-init="true">
 		<property name="basePackage" value="com.min.xxpro.db" />
+	</bean> -->
+	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
+	    <property name="basePackage" value="com.minpay.db.table.mapper"/>
 	</bean>
 	<bean id="transactionFactory"
 		class="org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory"

BIN
adm/src/main/webapp/WEB-INF/lib/ueditor-1.1.2.jar


BIN
adm/src/main/webapp/WEB-INF/lib/ueditor.jar


+ 24 - 0
adm/src/main/webapp/WEB-INF/mybatisConfigure.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>  
+<!DOCTYPE configuration  
+PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"  
+"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
+<configuration>
+	<!-- 本次修改cacheEnabled和lazyLoadingEnabled为false为了解决多线程并发请求带事务操作时,获取连接对象未及时加载导致报空 -->
+	<settings>
+		<!-- 这个配置使全局的映射器启用或禁用 缓存 -->
+		<setting name="cacheEnabled" value="false" />
+		<!-- 全局启用或禁用延迟加载。当禁用时, 所有关联对象都会即时加载 -->
+		<setting name="lazyLoadingEnabled" value="false" />
+		<!-- 当启用时, 有延迟加载属性的对象在被 调用时将会完全加载任意属性。否则, 每种属性将会按需要加载 -->
+		<setting name="aggressiveLazyLoading" value="false" />
+	</settings>
+	<plugins>
+		<plugin interceptor="com.startup.minpay.frame.jdbc.interceptor.MINResultSetInterceptor" />
+		<plugin interceptor="com.startup.minpay.frame.jdbc.interceptor.MINStatementInterceptor" />
+		<!--<plugin interceptor="com.github.pagehelper.PageInterceptor">
+			&lt;!&ndash; 分页参数合理化, 当页码数 < 0 时, 显示第一页.   当页码数 > 总页码数时, 显示最后一页  &ndash;&gt;
+			<property name="reasonable" value="true"/>
+		</plugin>-->
+		<plugin interceptor="com.minpay.db.PageInterceptors" />
+	</plugins>
+</configuration>  

+ 2 - 1
adm/src/main/webapp/WEB-INF/spring.xml

@@ -17,7 +17,8 @@
         http://www.springframework.org/schema/task/spring-task-3.0.xsd   
         http://www.springframework.org/schema/aop  
         http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
-        
+	<context:component-scan base-package="com.minpay"/>
+
 	<bean
 		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
 		<property name="locations">

+ 1 - 1
adm/src/main/webapp/admin/changePwd.html

@@ -72,7 +72,7 @@
 					data :  data.field ,
 					success : function(data) {
 						$.Alert('密码修改成功,请重新登录!');
-						setTimeout('top.location.href = "http://'+ window.location.host +getContextPath() + loginUrl +'"', 3000);
+						setTimeout('top.location.href = "http://'+ window.location.host +getContextPath() +'"', 3000);
 					},
 					error : function(data) {
 						$.ErrorAlert(data.msg);

+ 125 - 0
adm/src/main/webapp/admin/ops/addQuestion.html

@@ -0,0 +1,125 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <meta charset="utf-8">
+    <title>编辑问题</title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <script src="../../js/min-loader-next.js"></script>
+    <script type="text/javascript" charset="utf-8" src="../../ueditor/ueditor.config.js"></script>
+    <script type="text/javascript" charset="utf-8" src="../../ueditor/ueditor.all.min.js"> </script>
+    <!--建议手动加在语言,避免在ie下有时因为加载语言失败导致编辑器加载失败-->
+    <!--这里加载的语言文件会覆盖你在配置项目里添加的语言类型,比如你在配置项目里配置的是英文,这里加载的中文,那最后就是中文-->
+    <script type="text/javascript" charset="utf-8" src="../../ueditor/lang/zh-cn/zh-cn.js"></script>
+    <style type="text/css">
+	    .layui-anim-upbit {
+		    animation-name: layui-upbit;
+		    z-index: 1000 !important;
+		}
+    </style>
+</head>
+
+<body class="">
+<fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
+    </fieldset>
+
+<form class="layui-form" action="javascript:void(0)" id = "form2">
+	<div class="layui-form-item">
+		<div class="layui-inline">
+			<label class="layui-form-label">*问题标题:</label>
+			<div class="layui-input-inline">
+				<input type="text" name="name" id="name" lay-verify="name" maxlength="20" autocomplete="off" placeholder="请输入问题标题" class="layui-input">
+			</div>
+		</div>
+		<div class="layui-inline">
+			<label class="layui-form-label">*严重程度:</label>
+			<div class="layui-input-inline">
+				<select name="degree">
+					<option value="1" selected>1</option>
+					<option value="2">2</option>
+					<option value="3">3</option>
+					<option value="4">4</option>
+				</select>
+			</div>
+		</div>
+	</div>
+	
+	<div class="layui-form-item">	
+		<div class="layui-inline">
+			<label class="layui-form-label">*重现步骤:</label>
+			<div class="layui-input-inline">
+				<script id="editor" type="text/plain" style="width:1024px;height:500px;"></script>
+			</div>
+		</div>
+	</div>
+      <div class="layui-form-item box-button">
+          <div class="layui-input-block">
+              <button class="layui-btn" lay-submit="" lay-filter="demo1">提交</button>
+          </div>
+      </div>
+      
+	</form>
+    <!-- 注意:如果你直接复制所有代码到本地,上述js路径需要改成你本地的 -->
+    <script>
+    //建议使用工厂方法getEditor创建和引用编辑器实例,如果在某个闭包下引用该编辑器,直接调用UE.getEditor('editor')就能拿到相关的实例
+	$(function(){
+		layui.use(['form'], function() {
+			var ue = UE.getEditor('editor',{
+				toolbars : [
+					[
+						'undo', //撤销
+						'redo', //重做
+						'bold', //加粗
+						'indent', //首行缩进
+						'pasteplain', //纯文本粘贴模式
+						'print', //打印
+						'horizontal', //分隔线
+						'removeformat', //清除格式
+						'fontfamily', //字体
+						'justifyleft', //居左对齐
+						'justifyright', //居右对齐
+						'justifycenter', //居中对齐
+						'justifyjustify', //两端对齐
+						'forecolor', //字体颜色
+					]
+				]
+			});
+			ue.ready(function() {
+				ue.setContent('<p>[步骤]</p><p></p><p>[结果]</p><p></p><p>[期望]</p><p></p>');
+			});
+
+			var form = layui.form;
+			//监听提交
+			form.on('submit(demo1)', function(data) {
+				var param = {};
+				param.type = data.field.type;
+				param.name = data.field.name;
+				param.degree = data.field.degree;
+				param.step = ue.getContent();
+				$.request({
+					action : 'ObsQuestionManage/questionAdd',
+					data :  param,
+					success : function(data) {
+						layer.alert('保存成功!',  function(){
+							window.parent.location.reload();
+							parent.layer.close(layer.index);
+						});
+					},
+					error : function(data2) {
+						layer.alert(data2.MINErrorMessage, {
+							icon: 5,
+							title: "提示"
+						});
+					}
+				});
+			})
+		})
+	})
+
+    </script>
+
+</body>
+
+</html>

+ 154 - 0
adm/src/main/webapp/admin/ops/editQuestion.html

@@ -0,0 +1,154 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <meta charset="utf-8">
+    <title>新增问题</title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <script src="../../js/min-loader-next.js"></script>
+    <script type="text/javascript" charset="utf-8" src="../../ueditor/ueditor.config.js"></script>
+    <script type="text/javascript" charset="utf-8" src="../../ueditor/ueditor.all.min.js"> </script>
+    <!--建议手动加在语言,避免在ie下有时因为加载语言失败导致编辑器加载失败-->
+    <!--这里加载的语言文件会覆盖你在配置项目里添加的语言类型,比如你在配置项目里配置的是英文,这里加载的中文,那最后就是中文-->
+    <script type="text/javascript" charset="utf-8" src="../../ueditor/lang/zh-cn/zh-cn.js"></script>
+    <style type="text/css">
+	    .layui-anim-upbit {
+		    animation-name: layui-upbit;
+		    z-index: 1000 !important;
+		}
+    </style>
+</head>
+
+<body class="">
+<fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
+    </fieldset>
+
+<form class="layui-form" action="javascript:void(0)" id = "form2">
+	<div class="layui-form-item">
+		<div class="layui-inline">
+			<label class="layui-form-label">*问题标题:</label>
+			<div class="layui-input-inline">
+				<input type="text" name="name" id="name" lay-verify="name" maxlength="20" autocomplete="off" placeholder="请输入问题标题" class="layui-input">
+			</div>
+		</div>
+		<div class="layui-inline">
+			<label class="layui-form-label">*严重程度:</label>
+			<div class="layui-input-inline">
+				<select name="degree" id="degree">
+					<option value="1" selected>1</option>
+					<option value="2">2</option>
+					<option value="3">3</option>
+					<option value="4">4</option>
+				</select>
+			</div>
+		</div>
+	</div>
+	
+	<div class="layui-form-item">	
+		<div class="layui-inline">
+			<label class="layui-form-label">*重现步骤:</label>
+			<div class="layui-input-inline">
+				<script id="editor" type="text/plain" style="width:1024px;height:500px;"></script>
+			</div>
+		</div>
+	</div>
+      <div class="layui-form-item box-button">
+          <div class="layui-input-block">
+              <button class="layui-btn" lay-submit="" lay-filter="demo1">提交</button>
+          </div>
+      </div>
+      
+	</form>
+    <!-- 注意:如果你直接复制所有代码到本地,上述js路径需要改成你本地的 -->
+    <script>
+    //建议使用工厂方法getEditor创建和引用编辑器实例,如果在某个闭包下引用该编辑器,直接调用UE.getEditor('editor')就能拿到相关的实例
+	$(function(){
+		layui.use(['form'], function() {
+			var form = layui.form;
+			var ue = UE.getEditor('editor',{
+				toolbars : [
+					[
+						'undo', //撤销
+						'redo', //重做
+						'bold', //加粗
+						'indent', //首行缩进
+						'pasteplain', //纯文本粘贴模式
+						'print', //打印
+						'horizontal', //分隔线
+						'removeformat', //清除格式
+						'fontfamily', //字体
+						'justifyleft', //居左对齐
+						'justifyright', //居右对齐
+						'justifycenter', //居中对齐
+						'justifyjustify', //两端对齐
+						'forecolor', //字体颜色
+					]
+				]
+			});
+			ue.ready(function() {
+				var oqId = getQueryString("oqId");
+				$.request({
+					action : 'ObsQuestionManage/questionQuery',
+					data :  {'oqId': oqId},
+					success : function(data) {
+						$("#name").val(data.data.oqName);
+						var options = $("#degree").children("option");
+						for(let i = 0; i < options.length; i ++) {
+							if($(options[i]).attr("value") != data.data.oqDegree) {
+								$(options[i]).removeAttr("selected");
+							} else {
+								$(options[i]).attr("selected", true);
+							}
+						}
+						if(isEmpty(data.data.oqStep)) {
+							ue.setContent('<p>[步骤]</p><p></p><p>[结果]</p><p></p><p>[期望]</p><p></p>');
+						} else {
+							ue.setContent(data.data.oqStep);
+						}
+						form.render();
+					},
+					error : function(data2) {
+						layer.alert(data2.MINErrorMessage, {
+							icon: 5,
+							title: "提示"
+						});
+					}
+				});
+				
+			});
+
+			
+			//监听提交
+			form.on('submit(demo1)', function(data) {
+				var param = {};
+				param.id = getQueryString("oqId");
+				param.name = data.field.name;
+				param.degree = data.field.degree;
+				param.step = ue.getContent();
+				$.request({
+					action : 'ObsQuestionManage/questionEdit',
+					data :  param,
+					success : function(data) {
+						layer.alert('保存成功!',  function(){
+							window.parent.location.reload();
+							parent.layer.close(layer.index);
+						});
+					},
+					error : function(data2) {
+						layer.alert(data2.MINErrorMessage, {
+							icon: 5,
+							title: "提示"
+						});
+					}
+				});
+			})
+		})
+	})
+
+    </script>
+
+</body>
+
+</html>

+ 206 - 0
adm/src/main/webapp/admin/ops/questionManage.html

@@ -0,0 +1,206 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <meta charset="utf-8">
+    <title>问题处理</title>
+    <script src="../../js/min-loader-next.js"></script>
+</head>
+	  
+<body class="body-content">
+<div class="order-body">
+	<div class="order-tiaojian back-gray">
+		<div class="tiaojian-part1" id="conditions">
+			<div class="fl f12-gray4-op mt4">所选条件:</div>
+		</div>
+		<div class="tiaojian-part2 fr  demoTable">
+			<button class="order-bnt1" onclick="loadAA();">查询</button>
+			<button class="order-bnt2" onclick="cancle();">重置</button>
+			<a href="#" id="toggle" class="top">收起<i class="iconfont up iconSelect_drop-down"></i></a>
+		</div>
+	</div>		
+   	<form class="layui-form" id = "formName" >
+		<div class="order-select back-border" id="content" style="display: block;">
+         	<div class="layui-inline">
+            	<label class="f12-gray4">关键字:</label>
+	            <input type="text" name="keyword"  id ="keyword" autocomplete="off" placeholder="请输入关键字" class="search-select">
+            </div>
+         	<div class="layui-inline">
+				<label class="f12-gray4">状态:</label>
+				<div class="layui-input-inline">
+					<select name="state" id="state">
+						<option value="">请选择</option>
+						<option value="00">激活</option>
+						<option value="01">已解决</option>
+						<option value="02">已关闭</option>
+						<option value="99">已作废</option>
+					</select>
+				</div>
+			</div>
+   		</div>
+	 </form>
+</div>
+<div class="shadow-content"  >
+	<div class="gray-title  demoTable"  >
+	  <button class="layui-btn left-bnt1 in-b" data-type="addQuestion" id="addQuestion">
+	  	<i class="layui-icon">&#xe608;</i>添加
+	  </button>
+	</div>
+	<table id="tabletest" lay-filter="tableFilter"></table>
+</div>	
+    <!--操作功能-->
+    <script type="text/html" id="barDemo1">
+	<a class="f12-blue ml0-4" lay-event="edit">编辑</a>
+	{{#  if(d.oqState == '01'){ }}
+		<a class="f12-blue ml0-4" lay-event="active">激活</a>
+		<a class="f12-blue ml0-4" lay-event="complete">已完成</a>
+		<a class="f12-red2 ml0-4" lay-event="delete">作废</a>
+	{{#  } }}
+	{{#  if(d.oqState == '00'){ }}
+		<a class="f12-blue ml0-4" lay-event="deal">已解决</a>
+		<a class="f12-red2 ml0-4" lay-event="delete">作废</a>
+	{{#  } }}
+   </script>
+   
+	<script>
+	$("#toggle").click(function() {
+		$(this).html($("#content").is(":hidden") ? "收起" + "<i class='iconfont up iconSelect_drop-down'/></i>" : "展开" +
+			"<i class='iconfont up iconSelect_drop-down'/></i>");
+		$("#content").slideToggle();
+	});
+	
+	var table;
+	layui.use('table', function(){
+		table = layui.table;
+		table.render({
+			 id : 'tabletest'
+		    ,elem: '#tabletest'
+		    ,limit:10
+		    ,url: 'ObsQuestionManage/questionList' //数据接口
+		    ,method: 'post'
+		    ,where:{MINView:"JSON"}
+		    ,page: true //开启分页
+		    ,cols: [[ //表头
+		       {type:'numbers',title: '序号',width:"5%"}   
+		      ,{field: 'oqName', title: '标题', width:"15%"}
+		      ,{field: 'oqDegree', title: '严重程度', width:"10%"}
+		      ,{field: 'oqStateDesc', title: '状态', width:"10%"}
+		      ,{field: 'createUser', title: '创建人', width:"10%"}
+		      ,{field: 'oqCreateTime', title: '创建时间', width:"15%"}
+		      ,{field: 'updateUser', title: '修改人', width:"10%"}
+		      ,{field: 'oqUpdateTime', title: '修改时间', width:"15%"}
+		      ,{field: 'operate', title: '操作',width:"10%", toolbar: '#barDemo1'}	   
+		    ]]
+		    ,done: function(res, curr, count){
+		    }
+		    ,even: true //开启隔行背景
+		  });
+		  
+		 // 监听工具条(操作)
+		 table.on('tool(tableFilter)', function(obj){ //注:tool是工具条事件名,tableFilter是table原始容器的属性 lay-filter="对应的值"
+		    var data = obj.data; //获得当前行数据
+		    var layEvent = obj.event; //获得 lay-event 对应的值(也可以是表头的 event 参数对应的值)
+		    if(layEvent === 'delete'){ //删除
+		    	changeState(data, '99');
+	    	}
+		    else if(layEvent === 'edit'){ //编辑
+		    	editDetail(data);
+		  	}
+		    // 已完成
+		    else if(layEvent === 'complete'){
+		    	changeState(data, '02');
+		  	}
+		 	// 已激活
+		    else if(layEvent === 'active'){
+		    	changeState(data, '00');
+		  	}
+		    // 已解决
+		    else if(layEvent === 'deal'){
+		    	changeState(data, '01');
+		  	}
+		});
+	});
+	
+	
+	//新增
+	$(document).on('click','#addQuestion',function(data){
+	    // 寄存当前数据
+    	layer.open({
+    	      type: 2,
+    	      title: '新增',
+    	      shadeClose: true,
+    	      // shade: true , 
+    	      shade: 0.8,
+    	      //maxmin: true, //开启最大化最小化按钮
+    	      area: ['90%', '90%'],
+    	      content: 'addQuestion.html'
+    	});
+	});
+	//编辑
+  	function editDetail(data) {
+    	layer.open({
+    	      type: 2,
+    	      title: '编辑',
+    	      shadeClose: true,
+    	      // shade: true , 
+    	      shade: 0.8,
+    	      //maxmin: true, //开启最大化最小化按钮
+    	      area: ['90%', '90%'],
+    	      content: 'editQuestion.html?oqId='+data.oqId
+    	});
+  	}
+	
+  	function loadAA() {
+  		var keyword = $('#keyword').val();
+  		var state = $("#state option:selected").val();
+  	     //执行重载
+  	  	table.reload('tabletest', {
+  		        page: {
+  		          curr: 1 //重新从第 1 页开始
+  		        }
+  		        ,where: {
+					keyword : keyword,
+					state: state
+  		        }
+  	   	});
+	}
+	
+  	//重置
+  	function cancle(){
+		$('#formName')[0].reset();
+	}
+  	function changeState(data, state){
+  		layer.confirm('确认当前操作?', function(index){
+    		layer.close(index);
+    		//向服务端发送删除指令roleDelete
+    		$.request({
+				action : "ObsQuestionManage/questionDeal",
+				data : {
+					id : data.oqId,
+					state : state
+				},
+				success : function(resData) {
+					if (resData.MINStatus == 0) {
+						layer.alert('操作成功!', {icon: 1});
+						loadAA();
+					} else {
+						layer.alert(resData.MINErrorMessage, {
+								icon: 5,
+								title: "提示"
+							}); 
+					}
+				},
+				error : function(data2){
+					layer.alert(data2.MINErrorMessage, {
+							icon: 5,
+							title: "提示"
+						}); 
+				}
+  			});
+  		});
+  	}
+
+</script>
+</body>
+
+</html>

+ 1 - 1
adm/src/main/webapp/ueditor/dialogs/anchor/anchor.html

@@ -11,7 +11,7 @@
             input{width:210px;height:21px;line-height:21px;margin-left: 4px;}
         </style>
     </head>
-    <body class="body-content">
+    <body>
         <div class="content">
             <span><var id="lang_input_anchorName"></var></span><input id="anchorName"  value="" />
         </div>

+ 1 - 1
adm/src/main/webapp/ueditor/dialogs/attachment/attachment.html

@@ -15,7 +15,7 @@
     <!-- attachment dialog -->
     <link rel="stylesheet" href="attachment.css" type="text/css" />
 </head>
-<body class="body-content">
+<body>
 
     <div class="wrapper">
         <div id="tabhead" class="tabhead">

+ 1 - 1
adm/src/main/webapp/ueditor/dialogs/background/background.html

@@ -5,7 +5,7 @@
     <script type="text/javascript" src="../internal.js"></script>
     <link rel="stylesheet" type="text/css" href="background.css">
 </head>
-<body class="body-content">
+<body>
     <div id="bg_container" class="wrapper">
         <div id="tabHeads" class="tabhead">
             <span class="focus" data-content-id="normal"><var id="lang_background_normal"></var></span>

+ 1 - 1
adm/src/main/webapp/ueditor/dialogs/charts/charts.html

@@ -6,7 +6,7 @@
         <link rel="stylesheet" type="text/css" href="charts.css">
         <script type="text/javascript" src="../internal.js"></script>
     </head>
-    <body class="body-content">
+    <body>
         <div class="main">
             <div class="table-view">
                 <h3><var id="lang_data_source"></var></h3>

+ 1 - 1
adm/src/main/webapp/ueditor/dialogs/emotion/emotion.html

@@ -7,7 +7,7 @@
     <script type="text/javascript" src="../internal.js"></script>
     <link rel="stylesheet" type="text/css" href="emotion.css">
 </head>
-<body class="body-content">
+<body>
 <div id="tabPanel" class="wrapper">
     <div id="tabHeads" class="tabhead">
         <span><var id="lang_input_choice"></var></span>

+ 1 - 1
adm/src/main/webapp/ueditor/dialogs/gmap/gmap.html

@@ -13,7 +13,7 @@
     </style>
     <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script>
 </head>
-<body class="body-content">
+<body>
 <div class="content">
     <table>
         <tr>

+ 1 - 1
adm/src/main/webapp/ueditor/dialogs/help/help.html

@@ -7,7 +7,7 @@
     <script type="text/javascript" src="../internal.js"></script>
     <link rel="stylesheet" type="text/css" href="help.css">
 </head>
-<body class="body-content">
+<body>
 <div class="wrapper" id="helptab">
     <div id="tabHeads" class="tabhead">
         <span class="focus" tabsrc="about"><var id="lang_input_about"></var></span>

+ 1 - 1
adm/src/main/webapp/ueditor/dialogs/image/image.html

@@ -15,7 +15,7 @@
     <!-- image dialog -->
     <link rel="stylesheet" href="image.css" type="text/css" />
 </head>
-<body class="body-content">
+<body>
 
     <div class="wrapper">
         <div id="tabhead" class="tabhead">

+ 6 - 3
adm/src/main/webapp/ueditor/dialogs/image/image.js

@@ -247,14 +247,17 @@
         },
         setPreview: function(){
             var url = $G('url').value,
-                ow = $G('width').value,
-                oh = $G('height').value,
-                border = $G('border').value,
+                ow = parseInt($G('width').value, 10) || 0,
+                oh = parseInt($G('height').value, 10) || 0,
+                border = parseInt($G('border').value, 10) || 0,
                 title = $G('title').value,
                 preview = $G('preview'),
                 width,
                 height;
 
+            url = utils.unhtmlForUrl(url);
+            title = utils.unhtml(title);
+
             width = ((!ow || !oh) ? preview.offsetWidth:Math.min(ow, preview.offsetWidth));
             width = width+(border*2) > preview.offsetWidth ? width:(preview.offsetWidth - (border*2));
             height = (!ow || !oh) ? '':width*oh/ow;

+ 1 - 1
adm/src/main/webapp/ueditor/dialogs/insertframe/insertframe.html

@@ -12,7 +12,7 @@
         #align{width: 65px;height: 23px;line-height: 22px;}
     </style>
 </head>
-<body class="body-content">
+<body>
 <div class="warp">
         <table width="300" cellpadding="0" cellspacing="0">
             <tr>

+ 1 - 1
adm/src/main/webapp/ueditor/dialogs/link/link.html

@@ -11,7 +11,7 @@
         .txt{width:300px;height:21px;line-height:21px;border:1px solid #d7d7d7;}
     </style>
 </head>
-<body class="body-content">
+<body>
     <table>
         <tr>
             <td><label for="text"> <var id="lang_input_text"></var></label></td>

+ 1 - 1
adm/src/main/webapp/ueditor/dialogs/map/map.html

@@ -16,7 +16,7 @@
         #is_dynamic_label input{vertical-align:middle;margin: 3px 3px 3px 50px;}
     </style>
 </head>
-<body class="body-content">
+<body>
 <div class="content">
     <table>
         <tr>

+ 1 - 1
adm/src/main/webapp/ueditor/dialogs/music/music.html

@@ -6,7 +6,7 @@
     <script type="text/javascript" src="../internal.js"></script>
     <link rel="stylesheet" type="text/css" href="music.css">
 </head>
-<body class="body-content">
+<body>
 <div class="wrapper">
     <div class="searchBar">
         <input id="J_searchName" type="text"/>

+ 1 - 1
adm/src/main/webapp/ueditor/dialogs/scrawl/scrawl.html

@@ -7,7 +7,7 @@
     <script type="text/javascript" src="../internal.js"></script>
     <link rel="stylesheet" type="text/css" href="scrawl.css">
 </head>
-<body class="body-content">
+<body>
 <div class="main" id="J_wrap">
     <div class="hot">
         <div class="drawBoard border_style1">

+ 1 - 1
adm/src/main/webapp/ueditor/dialogs/searchreplace/searchreplace.html

@@ -14,7 +14,7 @@
         .tabbody input.btn{padding: 0 5px; text-align:center;line-height:24px; text-decoration: none;height:24px;background:url("../../themes/default/images/dialog-title-bg.png") repeat-x;border:1px solid #ccc; }
     </style>
 </head>
-<body class="body-content">
+<body>
 <div class="warpper" id="searchtab">
     <div id="head" class="tabhead">
         <span  tabsrc="find" class="focus"><var id="lang_tab_search"></var></span>

+ 1 - 1
adm/src/main/webapp/ueditor/dialogs/snapscreen/snapscreen.html

@@ -45,7 +45,7 @@
 
         </style>
     </head>
-    <body class="body-content">
+    <body>
         <div class="content">
             <h2><var id="lang_showMsg"></var></h2>
             <dl>

+ 1 - 1
adm/src/main/webapp/ueditor/dialogs/spechars/spechars.html

@@ -12,7 +12,7 @@
         .tabbody span{ margin: 5px 3px;text-align: center;display:inline-block;width: 40px;height:16px;line-height: 16px;cursor: pointer; }
     </style>
 </head>
-<body class="body-content">
+<body>
     <div id="specharsTab">
         <div id="tabHeads" class="tabhead"></div><div id="tabBodys" class="tabbody"></div>
     </div>

+ 1 - 1
adm/src/main/webapp/ueditor/dialogs/table/edittable.html

@@ -5,7 +5,7 @@
     <script type="text/javascript" src="../internal.js"></script>
     <link rel="stylesheet" type="text/css" href="edittable.css">
 </head>
-<body class="body-content">
+<body>
 <div class="wrapper">
     <div class="left">
         <div class="section">

+ 1 - 1
adm/src/main/webapp/ueditor/dialogs/table/edittd.html

@@ -14,7 +14,7 @@
         }
     </style>
 </head>
-<body class="body-content">
+<body>
 <div class="section">
     <span><var id="lang_tdBkColor"></var></span>
     <input type="text" id="J_tone"/>

+ 1 - 1
adm/src/main/webapp/ueditor/dialogs/table/edittip.html

@@ -15,7 +15,7 @@
         }
     </style>
 </head>
-<body class="body-content">
+<body>
 <div class="section">
     <div class="item">
         <label><input type="radio" id="J_delRow" name="cmd" checked/><var id="lang_delRow"></var></label>

+ 1 - 1
adm/src/main/webapp/ueditor/dialogs/template/template.html

@@ -6,7 +6,7 @@
     <script type="text/javascript" src="../internal.js"></script>
     <link rel="stylesheet" type="text/css" href="template.css">
 </head>
-<body class="body-content">
+<body>
     <div class="wrap">
         <div class="left">
             <div class="top">

+ 1 - 1
adm/src/main/webapp/ueditor/dialogs/video/video.html

@@ -7,7 +7,7 @@
     <script type="text/javascript" src="../internal.js"></script>
     <link rel="stylesheet" type="text/css" href="video.css" />
 </head>
-<body class="body-content">
+<body>
 <div class="wrapper">
     <div id="videoTab">
         <div id="tabHeads" class="tabhead">

+ 5 - 3
adm/src/main/webapp/ueditor/dialogs/video/video.js

@@ -270,6 +270,8 @@
 
         var conUrl = convert_url(url);
 
+        conUrl = utils.unhtmlForUrl(conUrl);
+
         $G("preview").innerHTML = '<div class="previewMsg"><span>'+lang.urlError+'</span></div>'+
         '<embed class="previewVideo" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"' +
             ' src="' + conUrl + '"' +
@@ -284,8 +286,8 @@
     function insertUpload(){
         var videoObjs=[],
             uploadDir = editor.getOpt('videoUrlPrefix'),
-            width = $G('upload_width').value || 420,
-            height = $G('upload_height').value || 280,
+            width = parseInt($G('upload_width').value, 10) || 420,
+            height = parseInt($G('upload_height').value, 10) || 280,
             align = findFocus("upload_alignment","name") || 'none';
         for(var key in uploadVideoList) {
             var file = uploadVideoList[key];
@@ -786,4 +788,4 @@
         }
     };
 
-})();
+})();

+ 1 - 1
adm/src/main/webapp/ueditor/dialogs/webapp/webapp.html

@@ -10,7 +10,7 @@
         .errorMsg{font-size: 13px;margin: 10px;color: #dd0000}
     </style>
 </head>
-<body class="body-content">
+<body>
     <div class="wrapper">
         <div id="appShow"></div>
     </div>

+ 1 - 1
adm/src/main/webapp/ueditor/dialogs/wordimage/wordimage.html

@@ -14,7 +14,7 @@
         #msg{ width: 140px; height: 30px; line-height:25px;float: left;color: red}
     </style>
 </head>
-<body class="body-content">
+<body>
     <div class="wrapper">
         <div class="localPath">
             <input id="localPath" type="text" readonly />

+ 1 - 1
adm/src/main/webapp/ueditor/index.html

@@ -16,7 +16,7 @@
         }
     </style>
 </head>
-<body class="body-content">
+<body>
 <div>
     <h1>完整demo</h1>
     <script id="editor" type="text/plain" style="width:1024px;height:500px;"></script>

+ 4 - 30
adm/src/main/webapp/ueditor/jsp/config.json

@@ -1,3 +1,4 @@
+/* 前后端通信相关的配置,注释只允许使用多行方式 */
 {
     /* 上传图片配置项 */
     "imageActionName": "uploadimage", /* 执行上传图片的action名称 */
@@ -6,36 +7,9 @@
     "imageAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 上传图片格式显示 */
     "imageCompressEnable": true, /* 是否压缩图片,默认是true */
     "imageCompressBorder": 1600, /* 图片压缩最长边限制 */
-    "imageInsertAlign": "none", /* 插入的图片浮动方式 */ 
-    /*  FTP上传  */
-    "isFtpServer": 'true', /* 是否是上传到FTP服务器  */ 
-    "isFtpServerIp": "123.138.111.22", /* FTP服务器地址  */ 
-    "isFtpServerPort": 21, /* FTP服务器端口号  */ 
-    "isFtpServerUser": "ftp_user", /* FTP服务器用户 */ 
-    "isFtpServerPwd": "1qaz!QAZ", /* FTP服务器密码  */
-    "isFtpServerRootPath": '/home/ftp_file/guomao/img/', /* 根目录  */
-    "isFtpServerUrl": 'http://img.minpay.cc/guomao/img/', /* 访问路径  */
-    /*  生产测试环境  */
-    "imageUrlPrefix": "http://img.minpay.cc/guomao/img/", /* 图片访问路径前缀 */
-   	"localSavePathPrefix":'/home/ftp_file/guomao/img/', /* 图片存放服务器绝对路径 */
-    
-    
-    /*  生产PRO环境  */
-    /*"imageUrlPrefix": "http://www.minpay.cc/pmon/",  图片访问路径前缀 */
-    /*"localSavePathPrefix":'/root/nginx/html/pmon/', 图片存放服务器绝对路径 */
-    
-   /*  测试环境  */ 
-   /* "imageUrlPrefix": "http://xiequn.minpay.cc/mon/", /* 图片访问路径前缀 */
-   /* "localSavePathPrefix":'/usr/local/nginx/html/mon/', /* 图片存放服务器绝对路径 */
-   
-   /* 本地 */
-   /* "imageUrlPrefix": "http://127.0.0.1/",  /*图片访问路径前缀 */
-   /* "localSavePathPrefix":'D:/Files/dangjian/', /* 图片存放服务器绝对路径 */
-   
-    "isBase64":'true',
-    "isHasUrl":'false',
-    "getImageSevlet":'',
-    "imagePathFormat": "img/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
+    "imageInsertAlign": "none", /* 插入的图片浮动方式 */
+    "imageUrlPrefix": "/adm", /* 图片访问路径前缀 */
+    "imagePathFormat": "/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
                                 /* {filename} 会替换成原文件名,配置这项需要注意中文乱码问题 */
                                 /* {rand:6} 会替换成随机数,后面的数字是随机数的位数 */
                                 /* {time} 会替换成时间戳 */

+ 1 - 1
adm/src/main/webapp/ueditor/jsp/controller.jsp

@@ -8,7 +8,7 @@
 	response.setHeader("Content-Type" , "text/html");
 	
 	String rootPath = application.getRealPath( "/" );
-	System.out.println("------------------"+request.getParameter("action"));
+	
 	out.write( new ActionEnter( request, rootPath ).exec() );
 	
 %>

BIN
adm/src/main/webapp/ueditor/jsp/lib/commons-codec-1.9.jar


BIN
adm/src/main/webapp/ueditor/jsp/lib/commons-fileupload-1.3.1.jar


BIN
adm/src/main/webapp/ueditor/jsp/lib/commons-io-2.4.jar


BIN
adm/src/main/webapp/ueditor/jsp/lib/json.jar


BIN
adm/src/main/webapp/ueditor/jsp/lib/ueditor-1.1.2.jar


+ 1 - 2
adm/src/main/webapp/ueditor/themes/default/css/ueditor.css

@@ -1041,7 +1041,6 @@ div.edui-box {
     top: 0;
     width: 100%;
     height: 100%;
-    z-index: -99999 !important;
 }
 
 .edui-default .edui-popup-content {
@@ -1901,4 +1900,4 @@ div.edui-box {
 }
 .edui-default  .edui-pastecontainer .edui-button  .edui-state-hover .edui-plaintxticon{
     background-position: -72px -34px;
-}
+}

+ 1 - 1
adm/src/main/webapp/ueditor/themes/default/css/ueditor.min.css

@@ -1,7 +1,7 @@
 /*!
  * UEditor
  * version: ueditor
- * build: Tue Aug 25 2015 15:27:16 GMT+0800 (CST)
+ * build: Wed Jun 21 2023 16:24:48 GMT+0800 (GMT+08:00)
  */
 
 

File diff suppressed because it is too large
+ 1 - 0
adm/src/main/webapp/ueditor/third-party/xss.min.js


+ 156 - 18
adm/src/main/webapp/ueditor/ueditor.all.js

@@ -1,7 +1,7 @@
 /*!
  * UEditor
  * version: ueditor
- * build: Tue Aug 25 2015 15:27:16 GMT+0800 (CST)
+ * build: Wed Jun 21 2023 16:24:48 GMT+0800 (GMT+08:00)
  */
 
 (function(){
@@ -743,7 +743,7 @@ var utils = UE.utils = {
      * @return { String } 转义后的字符串
      * @example
      * ```javascript
-     * var html = '<body class="body-content">&</body>';
+     * var html = '<body>&</body>';
      *
      * //output: &lt;body&gt;&amp;&lt;/body&gt;
      * console.log( UE.utils.unhtml( html ) );
@@ -766,6 +766,24 @@ var utils = UE.utils = {
 
         }) : '';
     },
+    /**
+     * 将url中的html字符转义, 仅转义  ', ", <, > 四个字符
+     * @param  { String } str 需要转义的字符串
+     * @param  { RegExp } reg 自定义的正则
+     * @return { String }     转义后的字符串
+     */
+    unhtmlForUrl:function (str, reg) {
+        return str ? str.replace(reg || /[<">']/g, function (a) {
+            return {
+                '<':'&lt;',
+                '&':'&amp;',
+                '"':'&quot;',
+                '>':'&gt;',
+                "'":'&#39;'
+            }[a]
+
+        }) : '';
+    },
 
     /**
      * 将str中的转义字符还原成html字符
@@ -778,7 +796,7 @@ var utils = UE.utils = {
      *
      * var str = '&lt;body&gt;&amp;&lt;/body&gt;';
      *
-     * //output: <body class="body-content">&</body>
+     * //output: <body>&</body>
      * console.log( UE.utils.html( str ) );
      *
      * ```
@@ -1483,6 +1501,7 @@ utils.each(['String', 'Function', 'Array', 'Number', 'RegExp', 'Object', 'Date']
     }
 });
 
+
 // core/EventBase.js
 /**
  * UE采用的事件基类
@@ -2114,7 +2133,7 @@ var domUtils = dom.domUtils = {
      * @return { Node | Null } 如果找到符合过滤条件的节点, 就返回该节点, 否则返回NULL
      * @example
      * ```html
-     * <body class="body-content">
+     * <body>
      *
      *      <div id="test">
      *      </div>
@@ -2280,7 +2299,7 @@ var domUtils = dom.domUtils = {
      * @return { Node | NULL } 如果找满足条件的节点, 则返回该节点, 否则返回NULL
      * @example
      * ```html
-     *     <body class="body-content">
+     *     <body>
      *      <div id="test">
      *          <span></span>
      *      </div>
@@ -2295,7 +2314,7 @@ var domUtils = dom.domUtils = {
      * ```
      * @example
      * ```html
-     * <body class="body-content">
+     * <body>
      *      <div>
      *          <span></span>
      *          <i id="test">xxx</i>
@@ -2408,7 +2427,7 @@ var domUtils = dom.domUtils = {
      * @grammar UE.dom.domUtils.clearEmptySibling(node,ignoreNext,ignorePre)  //ignorePre指定是否忽略左边空节点
      * @example
      * ```html
-     * <body class="body-content">
+     * <body>
      *     <div></div>
      *     <span id="test"></span>
      *     <i></i>
@@ -4506,7 +4525,7 @@ var fillCharReg = new RegExp(domUtils.fillChar, 'g');
          * @return { DocumentFragment | NULL } 如果选区是闭合的将返回null, 否则, 返回包含所clone内容的DocumentFragment元素
          * @example
          * ```html
-         * <body class="body-content">
+         * <body>
          *      <!-- 中括号表示选区 -->
          *      <b>x<i>x[x</i>xx]x</b>
          *
@@ -4535,7 +4554,7 @@ var fillCharReg = new RegExp(domUtils.fillChar, 'g');
          * @return { UE.dom.Range } 当前操作的Range对象
          * @example
          * ```html
-         * <body class="body-content">
+         * <body>
          *      <!-- 中括号表示选区 -->
          *      <b>x<i>x[x</i>xx]x</b>
          *
@@ -4586,7 +4605,7 @@ var fillCharReg = new RegExp(domUtils.fillChar, 'g');
          * @return { DocumentFragment } 返回包含所提取内容的DocumentFragment对象
          * @example
          * ```html
-         * <body class="body-content">
+         * <body>
          *      <!-- 中括号表示选区 -->
          *      <b>x<i>x[x</i>xx]x</b>
          *
@@ -5044,7 +5063,7 @@ var fillCharReg = new RegExp(domUtils.fillChar, 'g');
          * @see UE.dom.Range:getCommonAncestor()
          * @example
          * ```html
-         * <body class="body-content">
+         * <body>
          *
          *     <!-- 选区示例 -->
          *     <b>xxx<i>xxxx<span>xx[x</span>xx]x</i>xxxxxxx</b>
@@ -5076,7 +5095,7 @@ var fillCharReg = new RegExp(domUtils.fillChar, 'g');
          * @see UE.dom.Range:getCommonAncestor(Boolean)
          * @example
          * ```html
-         * <body class="body-content">
+         * <body>
          *
          *     <!-- 选区示例 -->
          *     <b>xxx<i>xxxx<span>x[x]x</span>xxx</i>xxxxxxx</b>
@@ -5847,7 +5866,7 @@ var fillCharReg = new RegExp(domUtils.fillChar, 'g');
          * @return { Boolean } 返回开始和结束的位置
          * @example
          * ```html
-         * <body class="body-content">
+         * <body>
          *     <p>
          *         aaaa
          *         <em>
@@ -5931,7 +5950,7 @@ var fillCharReg = new RegExp(domUtils.fillChar, 'g');
          * @return { Boolean } 返回开始和结束的位置
          * @example
          * ```html
-         * <body class="body-content">
+         * <body>
          *     <p>
          *         aaaa
          *         <em>
@@ -6010,7 +6029,7 @@ var fillCharReg = new RegExp(domUtils.fillChar, 'g');
          * @example
          * ```html
          *
-         * <body class="body-content">
+         * <body>
          *
          *     <!-- 选区开始 -->
          *     <span></span>
@@ -6054,7 +6073,7 @@ var fillCharReg = new RegExp(domUtils.fillChar, 'g');
          * @example
          * ```html
          *
-         * <body class="body-content">
+         * <body>
          *
          *     <!-- 选区开始 -->
          *     <span></span>
@@ -7230,7 +7249,7 @@ var fillCharReg = new RegExp(domUtils.fillChar, 'g');
          * @return { String } 编辑器的内容html文档字符串
          * @eaxmple
          * ```javascript
-         * editor.getAllHtml(); //返回格式大致是: <html><head>...</head><body class="body-content">...</body></html>
+         * editor.getAllHtml(); //返回格式大致是: <html><head>...</head><body>...</body></html>
          * ```
          */
         getAllHtml: function () {
@@ -8062,6 +8081,7 @@ UE.Editor.defaultOptions = function(editor){
 
                 var configUrl = me.getActionUrl('config'),
                     isJsonp = utils.isCrossDomainUrl(configUrl);
+
                 /* 发出ajax请求 */
                 me._serverConfigLoaded = false;
 
@@ -11101,6 +11121,29 @@ UE.commands['insertimage'] = {
             return;
         }
 
+        function unhtmlData(imgCi) {
+
+            utils.each('width,height,border,hspace,vspace'.split(','), function (item) {
+
+                if (imgCi[item]) {
+                    imgCi[item] = parseInt(imgCi[item], 10) || 0;
+                }
+            });
+
+            utils.each('src,_src'.split(','), function (item) {
+
+                if (imgCi[item]) {
+                    imgCi[item] = utils.unhtmlForUrl(imgCi[item]);
+                }
+            });
+            utils.each('title,alt'.split(','), function (item) {
+
+                if (imgCi[item]) {
+                    imgCi[item] = utils.unhtml(imgCi[item]);
+                }
+            });
+        }
+
         if (img && /img/i.test(img.tagName) && (img.className != "edui-faked-video" || img.className.indexOf("edui-upload-video")!=-1) && !img.getAttribute("word_img")) {
             var first = opt.shift();
             var floatStyle = first['floatStyle'];
@@ -11119,6 +11162,8 @@ UE.commands['insertimage'] = {
             var html = [], str = '', ci;
             ci = opt[0];
             if (opt.length == 1) {
+                unhtmlData(ci);
+
                 str = '<img src="' + ci.src + '" ' + (ci._src ? ' _src="' + ci._src + '" ' : '') +
                     (ci.width ? 'width="' + ci.width + '" ' : '') +
                     (ci.height ? ' height="' + ci.height + '" ' : '') +
@@ -11135,6 +11180,7 @@ UE.commands['insertimage'] = {
 
             } else {
                 for (var i = 0; ci = opt[i++];) {
+                    unhtmlData(ci);
                     str = '<p ' + (ci['floatStyle'] == 'center' ? 'style="text-align: center" ' : '') + '><img src="' + ci.src + '" ' +
                         (ci.width ? 'width="' + ci.width + '" ' : '') + (ci._src ? ' _src="' + ci._src + '" ' : '') +
                         (ci.height ? ' height="' + ci.height + '" ' : '') +
@@ -11152,6 +11198,7 @@ UE.commands['insertimage'] = {
     }
 };
 
+
 // plugins/justify.js
 /**
  * 段落格式
@@ -12505,7 +12552,7 @@ UE.commands['preview'] = {
         d.open();
         d.write('<!DOCTYPE html><html><head><meta charset="utf-8"/><script src="'+this.options.UEDITOR_HOME_URL+'ueditor.parse.js"></script><script>' +
             "setTimeout(function(){uParse('div',{rootPath: '"+ this.options.UEDITOR_HOME_URL +"'})},300)" +
-            '</script></head><body class="body-content"><div>'+this.getContent(null,null,true)+'</div></body></html>');
+            '</script></head><body><div>'+this.getContent(null,null,true)+'</div></body></html>');
         d.close();
     },
     notNeedUndo : 1
@@ -17595,6 +17642,14 @@ UE.plugins['video'] = function (){
      * @param addParagraph  是否需要添加P 标签
      */
     function creatInsertStr(url,width,height,id,align,classname,type){
+
+        url = utils.unhtmlForUrl(url);
+        align = utils.unhtml(align);
+        classname = utils.unhtml(classname);
+
+        width = parseInt(width, 10) || 0;
+        height = parseInt(height, 10) || 0;
+
         var str;
         switch (type){
             case 'image':
@@ -17730,6 +17785,7 @@ UE.plugins['video'] = function (){
     };
 };
 
+
 // plugins/table.core.js
 /**
  * Created with JetBrains WebStorm.
@@ -24752,6 +24808,88 @@ UE.plugin.register('insertfile', function (){
 
 
 
+// plugins/xssFilter.js
+/**
+ * @file xssFilter.js
+ * @desc xss过滤器
+ * @author robbenmu
+ */
+
+UE.plugins.xssFilter = function() {
+
+	var config = UEDITOR_CONFIG;
+	var whitList = config.whitList;
+
+	function filter(node) {
+
+		var tagName = node.tagName;
+		var attrs = node.attrs;
+
+		if (!whitList.hasOwnProperty(tagName)) {
+			node.parentNode.removeChild(node);
+			return false;
+		}
+
+		UE.utils.each(attrs, function (val, key) {
+
+			if (whitList[tagName].indexOf(key) === -1) {
+				node.setAttr(key);
+			}
+		});
+	}
+
+	// 添加inserthtml\paste等操作用的过滤规则
+	if (whitList && config.xssFilterRules) {
+		this.options.filterRules = function () {
+
+			var result = {};
+
+			UE.utils.each(whitList, function(val, key) {
+				result[key] = function (node) {
+					return filter(node);
+				};
+			});
+
+			return result;
+		}();
+	}
+
+	var tagList = [];
+
+	UE.utils.each(whitList, function (val, key) {
+		tagList.push(key);
+	});
+
+	// 添加input过滤规则
+	//
+	if (whitList && config.inputXssFilter) {
+		this.addInputRule(function (root) {
+
+			root.traversal(function(node) {
+				if (node.type !== 'element') {
+					return false;
+				}
+				filter(node);
+			});
+		});
+	}
+	// 添加output过滤规则
+	//
+	if (whitList && config.outputXssFilter) {
+		this.addOutputRule(function (root) {
+
+			root.traversal(function(node) {
+				if (node.type !== 'element') {
+					return false;
+				}
+				filter(node);
+			});
+		});
+	}
+
+};
+
+
 // ui/ui.js
 var baidu = baidu || {};
 baidu.editor = baidu.editor || {};

File diff suppressed because it is too large
+ 18 - 709
adm/src/main/webapp/ueditor/ueditor.all.min.js


+ 97 - 17
adm/src/main/webapp/ueditor/ueditor.config.js

@@ -19,7 +19,8 @@
      * 因此,UEditor提供了针对不同页面的编辑器可单独配置的根路径,具体来说,在需要实例化编辑器的页面最顶部写上如下代码即可。当然,需要令此处的URL等于对应的配置。
      * window.UEDITOR_HOME_URL = "/xxxx/xxxx/";
      */
-    var URL = window.UEDITOR_HOME_URL || getUEBasePath() + "/";
+    var URL = window.UEDITOR_HOME_URL || getUEBasePath();
+
     /**
      * 配置项主体。注意,此处所有涉及到路径的配置别遗漏URL变量。
      */
@@ -31,22 +32,19 @@
         // 服务器统一请求接口路径
         , serverUrl: URL + "jsp/controller.jsp"
 
-        //工具栏上的所有的功能按钮和下拉框,可以在new编辑器的实例时选择自己需要的新定义
+        //工具栏上的所有的功能按钮和下拉框,可以在new编辑器的实例时选择自己需要的新定义
         , toolbars: [[
-            'fullscreen','source', 'undo', 'redo', '|',
-            'bold', 'italic', 'underline', 'fontborder', 'strikethrough', 'superscript', 'subscript', 'removeformat', 'formatmatch', 'autotypeset', 'blockquote', 'pasteplain', '|',
-            'forecolor', 'backcolor', 'insertorderedlist', 'insertunorderedlist', 'selectall', 'cleardoc', '|',
+            'fullscreen', 'source', '|', 'undo', 'redo', '|',
+            'bold', 'italic', 'underline', 'fontborder', 'strikethrough', 'superscript', 'subscript', 'removeformat', 'formatmatch', 'autotypeset', 'blockquote', 'pasteplain', '|', 'forecolor', 'backcolor', 'insertorderedlist', 'insertunorderedlist', 'selectall', 'cleardoc', '|',
             'rowspacingtop', 'rowspacingbottom', 'lineheight', '|',
             'customstyle', 'paragraph', 'fontfamily', 'fontsize', '|',
             'directionalityltr', 'directionalityrtl', 'indent', '|',
-            'justifyleft', 'justifycenter', 'justifyright', 'justifyjustify', '|', 
-            'touppercase', 'tolowercase', '|',
-            'link', 'unlink', '|', 
-            'imagenone', 'imageleft', 'imageright', 'imagecenter', '|',
-            'simpleupload', 'insertimage', 'emotion', 'scrawl', 'attachment', 'map', 'pagebreak', 'template', 'background', '|',
-            'horizontal', 'spechars', 'wordimage', '|',
+            'justifyleft', 'justifycenter', 'justifyright', 'justifyjustify', '|', 'touppercase', 'tolowercase', '|',
+            'link', 'unlink', 'anchor', '|', 'imagenone', 'imageleft', 'imageright', 'imagecenter', '|',
+            'simpleupload', 'insertimage', 'emotion', 'scrawl', 'insertvideo', 'music', 'attachment', 'map', 'gmap', 'insertframe', 'insertcode', 'webapp', 'pagebreak', 'template', 'background', '|',
+            'horizontal', 'date', 'time', 'spechars', 'snapscreen', 'wordimage', '|',
             'inserttable', 'deletetable', 'insertparagraphbeforetable', 'insertrow', 'deleterow', 'insertcol', 'deletecol', 'mergecells', 'mergeright', 'mergedown', 'splittocells', 'splittorows', 'splittocols', 'charts', '|',
-            'print', 'preview', 'searchreplace', 'help', 'drafts'
+            'print', 'preview', 'searchreplace', 'drafts', 'help'
         ]]
         //当鼠标放在工具栏上时显示的tooltip提示,留空支持自动多语言配置,否则以配置值为准
         //,labelMap:{
@@ -63,7 +61,7 @@
         //,theme:'default'
         //,themePath:URL +"themes/"
 
-//        ,zIndex : 900     //编辑器层级的基数,默认是900
+        //,zIndex : 900     //编辑器层级的基数,默认是900
 
         //针对getAllHtml方法,会在对应的head标签中增加该编码设置。
         //,charset:"utf-8"
@@ -85,7 +83,7 @@
         //如果自定义,最好给p标签如下的行高,要不输入中文时,会有跳动感
         //,initialStyle:'p{line-height:1em}'//编辑器层级的基数,可以用来改变字体等
 
-        //,iframeCssUrl: URL + '/themes/iframe.css' //给编辑器内部引入一个css文件
+        //,iframeCssUrl: URL + '/themes/iframe.css' //给编辑区域的iframe引入一个css文件
 
         //indentValue
         //首行缩进距离,默认是2em
@@ -295,6 +293,9 @@
         //编辑器底部距离工具栏高度(如果参数大于等于编辑器高度,则设置无效)
         //,toolbarTopOffset:400
 
+        //设置远程图片是否抓取到本地保存
+        //,catchRemoteImageEnable: true //设置是否抓取远程图片
+
         //pageBreakTag
         //分页标识符,默认是_ueditor_page_break_tag_
         //,pageBreakTag:'_ueditor_page_break_tag_'
@@ -323,7 +324,7 @@
         //表格是否可以拖拽
         //,tableDragable: true
 
-        //,disabledTableInTable:true  //禁止表格嵌套
+
 
         //sourceEditor
         //源码的查看方式,codemirror 是代码高亮,textarea是文本框,默认是codemirror
@@ -343,10 +344,89 @@
         //    'anchor':'~/dialogs/anchor/anchor.html',
         //}
 
+        //allowLinkProtocol 允许的链接地址,有这些前缀的链接地址不会自动添加http
+        //, allowLinkProtocols: ['http:', 'https:', '#', '/', 'ftp:', 'mailto:', 'tel:', 'git:', 'svn:']
+
         //webAppKey 百度应用的APIkey,每个站长必须首先去百度官网注册一个key后方能正常使用app功能,注册介绍,http://app.baidu.com/static/cms/getapikey.html
         //, webAppKey: ""
-    	//关闭抓取远程图片的监听
-    	,catchRemoteImageEnable:false
+
+        //默认过滤规则相关配置项目
+        //,disabledTableInTable:true  //禁止表格嵌套
+        //,allowDivTransToP:true      //允许进入编辑器的div标签自动变成p标签
+        //,rgb2Hex:true               //默认产出的数据中的color自动从rgb格式变成16进制格式
+
+		// xss 过滤是否开启,inserthtml等操作
+		,xssFilterRules: true
+		//input xss过滤
+		,inputXssFilter: true
+		//output xss过滤
+		,outputXssFilter: true
+		// xss过滤白名单 名单来源: https://raw.githubusercontent.com/leizongmin/js-xss/master/lib/default.js
+		,whitList: {
+			a:      ['target', 'href', 'title', 'class', 'style'],
+			abbr:   ['title', 'class', 'style'],
+			address: ['class', 'style'],
+			area:   ['shape', 'coords', 'href', 'alt'],
+			article: [],
+			aside:  [],
+			audio:  ['autoplay', 'controls', 'loop', 'preload', 'src', 'class', 'style'],
+			b:      ['class', 'style'],
+			bdi:    ['dir'],
+			bdo:    ['dir'],
+			big:    [],
+			blockquote: ['cite', 'class', 'style'],
+			br:     [],
+			caption: ['class', 'style'],
+			center: [],
+			cite:   [],
+			code:   ['class', 'style'],
+			col:    ['align', 'valign', 'span', 'width', 'class', 'style'],
+			colgroup: ['align', 'valign', 'span', 'width', 'class', 'style'],
+			dd:     ['class', 'style'],
+			del:    ['datetime'],
+			details: ['open'],
+			div:    ['class', 'style'],
+			dl:     ['class', 'style'],
+			dt:     ['class', 'style'],
+			em:     ['class', 'style'],
+			font:   ['color', 'size', 'face'],
+			footer: [],
+			h1:     ['class', 'style'],
+			h2:     ['class', 'style'],
+			h3:     ['class', 'style'],
+			h4:     ['class', 'style'],
+			h5:     ['class', 'style'],
+			h6:     ['class', 'style'],
+			header: [],
+			hr:     [],
+			i:      ['class', 'style'],
+			img:    ['src', 'alt', 'title', 'width', 'height', 'id', '_src', 'loadingclass', 'class', 'data-latex'],
+			ins:    ['datetime'],
+			li:     ['class', 'style'],
+			mark:   [],
+			nav:    [],
+			ol:     ['class', 'style'],
+			p:      ['class', 'style'],
+			pre:    ['class', 'style'],
+			s:      [],
+			section:[],
+			small:  [],
+			span:   ['class', 'style'],
+			sub:    ['class', 'style'],
+			sup:    ['class', 'style'],
+			strong: ['class', 'style'],
+			table:  ['width', 'border', 'align', 'valign', 'class', 'style'],
+			tbody:  ['align', 'valign', 'class', 'style'],
+			td:     ['width', 'rowspan', 'colspan', 'align', 'valign', 'class', 'style'],
+			tfoot:  ['align', 'valign', 'class', 'style'],
+			th:     ['width', 'rowspan', 'colspan', 'align', 'valign', 'class', 'style'],
+			thead:  ['align', 'valign', 'class', 'style'],
+			tr:     ['rowspan', 'align', 'valign', 'class', 'style'],
+			tt:     [],
+			u:      [],
+			ul:     ['class', 'style'],
+			video:  ['autoplay', 'controls', 'loop', 'preload', 'src', 'height', 'width', 'class', 'style']
+		}
     };
 
     function getUEBasePath(docUrl, confUrl) {

+ 1 - 1
adm/src/main/webapp/ueditor/ueditor.parse.js

@@ -1,7 +1,7 @@
 /*!
  * UEditor
  * version: ueditor
- * build: Tue Aug 25 2015 15:27:16 GMT+0800 (CST)
+ * build: Wed Jun 21 2023 16:24:48 GMT+0800 (GMT+08:00)
  */
 
 (function(){

File diff suppressed because it is too large
+ 7 - 28
adm/src/main/webapp/ueditor/ueditor.parse.min.js


BIN
adm/src/main/webapp/ueditor/webapp - 快捷方式.lnk