Commit cb33404f authored by 郭晓俊's avatar 郭晓俊

Merge branch 'GJYZJ_V1.0' of

http://gitlab.archser.com/common/aserver.git into GJYZJ_V1.0 Conflicts: src/main/resources/DBUpdate/DM_UpdateSQL.xml
parents 216d4228 3d672676
<project xmlns="http://maven.apache.org/POM/4.0.0" <project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>com.archser</groupId> <groupId>com.archser</groupId>
<artifactId>aserver</artifactId> <artifactId>aserver</artifactId>
<version>1.0</version> <version>1.0</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>aserver</name> <name>aserver</name>
<properties> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding> <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<jdk.version>1.8</jdk.version> <jdk.version>1.8</jdk.version>
<junit.version>3.8.1</junit.version> <junit.version>3.8.1</junit.version>
<jfinal.version>4.2</jfinal.version> <jfinal.version>4.2</jfinal.version>
<cos.version>2017.5</cos.version> <cos.version>2017.5</cos.version>
<apachelog4j.version>2.11.1</apachelog4j.version> <apachelog4j.version>2.11.1</apachelog4j.version>
<log4j.version>1.2.17</log4j.version> <log4j.version>1.2.17</log4j.version>
<jfinalundertow.version>1.6</jfinalundertow.version> <jfinalundertow.version>1.6</jfinalundertow.version>
<druid.version>1.0.29</druid.version> <druid.version>1.0.29</druid.version>
<fastjson.version>1.2.55</fastjson.version> <fastjson.version>1.2.55</fastjson.version>
<oracle.version>11.2.0.3</oracle.version> <oracle.version>11.2.0.3</oracle.version>
<jjwt.version>0.10.6</jjwt.version> <jjwt.version>0.10.6</jjwt.version>
<dubbo.version>2.7.2</dubbo.version> <dubbo.version>2.7.2</dubbo.version>
<resteasy.version>4.1.1.Final</resteasy.version> <resteasy.version>4.1.1.Final</resteasy.version>
</properties> </properties>
<!-- 使用阿里 maven 库 --> <!-- 使用阿里 maven 库 -->
<repositories> <repositories>
<repository> <repository>
<id>nexus</id> <id>nexus</id>
<url>http://nexus.archser.com:8081/repository/maven-public/</url> <url>http://nexus.archser.com:8081/repository/maven-public/</url>
<releases> <releases>
<enabled>true</enabled> <enabled>true</enabled>
</releases> </releases>
<snapshots> <snapshots>
<enabled>true</enabled> <enabled>true</enabled>
<updatePolicy>always</updatePolicy> <updatePolicy>always</updatePolicy>
<checksumPolicy>fail</checksumPolicy> <checksumPolicy>fail</checksumPolicy>
</snapshots> </snapshots>
</repository> </repository>
</repositories> </repositories>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>junit</groupId> <groupId>junit</groupId>
<artifactId>junit</artifactId> <artifactId>junit</artifactId>
<version>${junit.version}</version> <version>${junit.version}</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.jfinal</groupId> <groupId>com.jfinal</groupId>
<artifactId>cos</artifactId> <artifactId>cos</artifactId>
<version>${cos.version}</version> <version>${cos.version}</version>
</dependency> </dependency>
<!-- <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <!-- <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId>
<version>${apachelog4j.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <version>${apachelog4j.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId> <version>${apachelog4j.version}</version> <artifactId>log4j-core</artifactId> <version>${apachelog4j.version}</version>
</dependency> --> </dependency> -->
<dependency> <dependency>
<groupId>log4j</groupId> <groupId>log4j</groupId>
<artifactId>log4j</artifactId> <artifactId>log4j</artifactId>
<version>${log4j.version}</version> <version>${log4j.version}</version>
</dependency> </dependency>
<!-- undertow --> <!-- undertow -->
<dependency> <dependency>
<groupId>com.jfinal</groupId> <groupId>com.jfinal</groupId>
<artifactId>jfinal-undertow</artifactId> <artifactId>jfinal-undertow</artifactId>
<version>${jfinalundertow.version}</version> <version>${jfinalundertow.version}</version>
</dependency> </dependency>
<!-- WebSocket 支持 --> <!-- WebSocket 支持 -->
<dependency> <dependency>
<groupId>io.undertow</groupId> <groupId>io.undertow</groupId>
<artifactId>undertow-websockets-jsr</artifactId> <artifactId>undertow-websockets-jsr</artifactId>
<version>2.0.16.Final</version> <version>2.0.16.Final</version>
</dependency> </dependency>
<!-- 避免控制台输出如下提示信息: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". <!-- 避免控制台输出如下提示信息: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
项目中实际上用不到这个 jar 包 注意:eclipse 下可以将 scope 设置为 provided --> 项目中实际上用不到这个 jar 包 注意:eclipse 下可以将 scope 设置为 provided -->
<dependency> <dependency>
<groupId>org.slf4j</groupId> <groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId> <artifactId>slf4j-nop</artifactId>
<version>1.7.25</version> <version>1.7.25</version>
<!-- 打包前改成 provided,此处使用 compile 仅为支持 IDEA --> <!-- 打包前改成 provided,此处使用 compile 仅为支持 IDEA -->
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>redis.clients</groupId>
<dependency> <artifactId>jedis</artifactId>
<groupId>com.alibaba</groupId> <version>2.9.0</version>
<artifactId>druid</artifactId> </dependency>
<version>${druid.version}</version>
</dependency> <dependency>
<groupId>de.ruedigermoeller</groupId>
<dependency> <artifactId>fst</artifactId>
<groupId>com.alibaba</groupId> <version>2.50</version>
<artifactId>fastjson</artifactId> </dependency>
<version>${fastjson.version}</version>
</dependency> <dependency>
<dependency> <groupId>com.alibaba</groupId>
<groupId>com.oracle</groupId> <artifactId>druid</artifactId>
<artifactId>ojdbc6</artifactId> <version>${druid.version}</version>
<version>${oracle.version}</version> </dependency>
</dependency>
<dependency> <dependency>
<groupId>io.jsonwebtoken</groupId> <groupId>com.alibaba</groupId>
<artifactId>jjwt-api</artifactId> <artifactId>fastjson</artifactId>
<version>${jjwt.version}</version> <version>${fastjson.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>io.jsonwebtoken</groupId> <groupId>com.oracle</groupId>
<artifactId>jjwt-impl</artifactId> <artifactId>ojdbc6</artifactId>
<version>${jjwt.version}</version> <version>${oracle.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>io.jsonwebtoken</groupId> <groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId> <artifactId>jjwt-api</artifactId>
<version>${jjwt.version}</version> <version>${jjwt.version}</version>
</dependency> </dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<!-- webSocket 开始--> <artifactId>jjwt-impl</artifactId>
<dependency> <version>${jjwt.version}</version>
<groupId>javax.websocket</groupId> </dependency>
<dependency>
<artifactId>javax.websocket-api</artifactId> <groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>1.1</version> <version>${jjwt.version}</version>
</dependency>
</dependency>
<dependency> <!-- webSocket 开始 -->
<dependency>
<groupId>javax</groupId> <groupId>javax.websocket</groupId>
<artifactId>javaee-api</artifactId> <artifactId>javax.websocket-api</artifactId>
<version>7.0</version> <version>1.1</version>
<scope>provided</scope>
</dependency>
</dependency> <dependency>
<!-- webSocket 结束-->
<groupId>javax</groupId>
<dependency>
<groupId>org.apache.dubbo</groupId> <artifactId>javaee-api</artifactId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version> <version>7.0</version>
<exclusions>
<exclusion> <scope>provided</scope>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId> </dependency>
</exclusion> <!-- webSocket 结束 -->
<exclusion>
<groupId>org.yaml</groupId> <dependency>
<artifactId>snakeyaml</artifactId> <groupId>org.apache.dubbo</groupId>
</exclusion> <artifactId>dubbo</artifactId>
</exclusions> <version>${dubbo.version}</version>
</dependency> <exclusions>
<!-- 国密加密需要的依赖 --> <exclusion>
<dependency> <groupId>org.springframework</groupId>
<groupId>org.bouncycastle</groupId> <artifactId>spring-context</artifactId>
<artifactId>bcprov-jdk15on</artifactId> </exclusion>
<version>1.60</version> <exclusion>
</dependency> <groupId>org.yaml</groupId>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io --> <artifactId>snakeyaml</artifactId>
<dependency> </exclusion>
<groupId>commons-io</groupId> </exclusions>
<artifactId>commons-io</artifactId> </dependency>
<version>2.4</version> <!-- 国密加密需要的依赖 -->
</dependency> <dependency>
<!-- 对接单点登录调用的依赖 --> <groupId>org.bouncycastle</groupId>
<dependency> <artifactId>bcprov-jdk15on</artifactId>
<groupId>com.spbportal.sso</groupId> <version>1.60</version>
<artifactId>spbportal-ssoClient-test</artifactId> </dependency>
<version>1.0</version> <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
</dependency> <dependency>
<groupId>commons-io</groupId>
<!--自选库 --> <artifactId>commons-io</artifactId>
<dependency> <version>2.4</version>
<groupId>com.jfinal</groupId> </dependency>
<artifactId>jfinal</artifactId> <!-- 对接单点登录调用的依赖 -->
<version>${jfinal.version}</version> <dependency>
</dependency> <groupId>com.spbportal.sso</groupId>
<dependency> <artifactId>spbportal-ssoClient-test</artifactId>
<groupId>dm.jdbc</groupId> <version>1.0</version>
<artifactId>DmJdbcDriver17</artifactId> </dependency>
<version>8.1.1.30</version>
</dependency> <!--自选库 -->
<dependency> <dependency>
<groupId>org.jdom</groupId> <groupId>com.jfinal</groupId>
<artifactId>jdom</artifactId> <artifactId>jfinal</artifactId>
<version>1.1</version> <version>${jfinal.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>jaxen</groupId> <groupId>dm.jdbc</groupId>
<artifactId>jaxen</artifactId> <artifactId>DmJdbcDriver17</artifactId>
<version>1.1.1</version> <version>8.1.1.30</version>
</dependency> </dependency>
</dependencies> <dependency>
<groupId>org.jdom</groupId>
<artifactId>jdom</artifactId>
<build> <version>1.1</version>
<finalName>aserver</finalName> </dependency>
<plugins> <dependency>
<groupId>jaxen</groupId>
<plugin> <artifactId>jaxen</artifactId>
<groupId>org.apache.maven.plugins</groupId> <version>1.1.1</version>
<artifactId>maven-compiler-plugin</artifactId> </dependency>
<version>3.6.1</version> </dependencies>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target> <build>
<encoding>${project.build.sourceEncoding}</encoding> <finalName>aserver</finalName>
<!-- java8 保留参数名编译参数 --> <plugins>
<compilerArgument>-parameters</compilerArgument>
<compilerArguments> <plugin>
<verbose /> <groupId>org.apache.maven.plugins</groupId>
</compilerArguments> <artifactId>maven-compiler-plugin</artifactId>
</configuration> <version>3.6.1</version>
</plugin> <configuration>
<source>${jdk.version}</source>
<!-- jar 包中的配置文件优先级高于 config 目录下的 "同名文件" 因此,打包时需要排除掉 jar 包中来自 src/main/resources <target>${jdk.version}</target>
目录的 配置文件,否则部署时 config 目录中的同名配置文件不会生效 --> <encoding>${project.build.sourceEncoding}</encoding>
<plugin> <!-- java8 保留参数名编译参数 -->
<groupId>org.apache.maven.plugins</groupId> <compilerArgument>-parameters</compilerArgument>
<artifactId>maven-jar-plugin</artifactId> <compilerArguments>
<version>2.6</version> <verbose />
<configuration> </compilerArguments>
<excludes> </configuration>
<exclude>*.txt</exclude> </plugin>
<exclude>*.xml</exclude>
<exclude>*.properties</exclude> <!-- jar 包中的配置文件优先级高于 config 目录下的 "同名文件" 因此,打包时需要排除掉 jar 包中来自 src/main/resources
</excludes> 目录的 配置文件,否则部署时 config 目录中的同名配置文件不会生效 -->
</configuration> <plugin>
</plugin> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<!-- 使用 mvn clean package 打包 更多配置可参考官司方文档:http://maven.apache.org/plugins/maven-assembly-plugin/single-mojo.html --> <version>2.6</version>
<plugin> <configuration>
<groupId>org.apache.maven.plugins</groupId> <excludes>
<artifactId>maven-assembly-plugin</artifactId> <exclude>*.txt</exclude>
<executions> <exclude>*.xml</exclude>
<execution> <exclude>*.properties</exclude>
<id>make-assembly</id> </excludes>
<phase>package</phase> </configuration>
<goals> </plugin>
<goal>single</goal>
</goals> <!-- 使用 mvn clean package 打包 更多配置可参考官司方文档:http://maven.apache.org/plugins/maven-assembly-plugin/single-mojo.html -->
<plugin>
<configuration> <groupId>org.apache.maven.plugins</groupId>
<!-- 打包生成的文件名 --> <artifactId>maven-assembly-plugin</artifactId>
<finalName>${project.artifactId}</finalName> <executions>
<!-- jar 等压缩文件在被打包进入 zip、tar.gz 时是否压缩,设置为 false 可加快打包速度 --> <execution>
<recompressZippedFiles>false</recompressZippedFiles> <id>make-assembly</id>
<!-- 打包生成的文件是否要追加 release.xml 中定义的 id 值 --> <phase>package</phase>
<appendAssemblyId>true</appendAssemblyId> <goals>
<!-- 指向打包描述文件 package.xml --> <goal>single</goal>
<descriptors> </goals>
<descriptor>package.xml</descriptor>
</descriptors> <configuration>
<!-- 打包结果输出的基础目录 --> <!-- 打包生成的文件名 -->
<outputDirectory>${project.build.directory}/</outputDirectory> <finalName>${project.artifactId}</finalName>
</configuration> <!-- jar 等压缩文件在被打包进入 zip、tar.gz 时是否压缩,设置为 false 可加快打包速度 -->
</execution> <recompressZippedFiles>false</recompressZippedFiles>
</executions> <!-- 打包生成的文件是否要追加 release.xml 中定义的 id 值 -->
</plugin> <appendAssemblyId>true</appendAssemblyId>
<!-- 指向打包描述文件 package.xml -->
</plugins> <descriptors>
</build> <descriptor>package.xml</descriptor>
</descriptors>
<!-- 打包结果输出的基础目录 -->
<outputDirectory>${project.build.directory}/</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project> </project>
\ No newline at end of file
package com.archser.aserver.common.config; package com.archser.aserver.common.config;
import com.alibaba.druid.filter.stat.StatFilter; import com.alibaba.druid.filter.stat.StatFilter;
import com.archser.aserver.controller.BugController; import com.archser.aserver.controller.BugController;
import com.archser.aserver.controller.IndexController; import com.archser.aserver.controller.IndexController;
import com.archser.aserver.controller.KeyController; import com.archser.aserver.controller.KeyController;
import com.archser.aserver.controller.MediumController; import com.archser.aserver.controller.MediumController;
import com.archser.aserver.controller.MenuController; import com.archser.aserver.controller.MenuController;
import com.archser.aserver.controller.MessageController; import com.archser.aserver.controller.MessageController;
import com.archser.aserver.controller.SettingController; import com.archser.aserver.controller.SettingController;
import com.archser.aserver.controller.SystemController; import com.archser.aserver.controller.SystemController;
import com.archser.aserver.controller.UserController; import com.archser.aserver.controller.UserController;
import com.archser.aserver.interceptor.JwtInterceptor; import com.archser.aserver.interceptor.JwtInterceptor;
import com.archser.aserver.model._MappingKit; import com.archser.aserver.model._MappingKit;
import com.archser.aserver.service.DBService; import com.archser.aserver.service.DBService;
import com.archser.aserver.websocket.MessageWebSocket; import com.archser.aserver.websocket.MessageWebSocket;
import com.jfinal.config.Constants; import com.jfinal.config.Constants;
import com.jfinal.config.Handlers; import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors; import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig; import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins; import com.jfinal.config.Plugins;
import com.jfinal.config.Routes; import com.jfinal.config.Routes;
import com.jfinal.ext.handler.UrlSkipHandler; import com.jfinal.ext.handler.UrlSkipHandler;
import com.jfinal.json.MixedJsonFactory; import com.jfinal.json.MixedJsonFactory;
import com.jfinal.kit.PathKit; import com.jfinal.kit.PathKit;
import com.jfinal.kit.Prop; import com.jfinal.kit.Prop;
import com.jfinal.kit.PropKit; import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin; import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.CaseInsensitiveContainerFactory; import com.jfinal.plugin.activerecord.CaseInsensitiveContainerFactory;
import com.jfinal.plugin.activerecord.dialect.OracleDialect; import com.jfinal.plugin.activerecord.dialect.OracleDialect;
import com.jfinal.plugin.druid.DruidPlugin; import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.render.ViewType; import com.jfinal.plugin.redis.RedisPlugin;
import com.jfinal.server.undertow.UndertowServer; import com.jfinal.render.ViewType;
import com.jfinal.server.undertow.WebBuilder; import com.jfinal.server.undertow.UndertowServer;
import com.jfinal.template.Engine; import com.jfinal.server.undertow.WebBuilder;
import com.jfinal.template.Engine;
public class MainConfig extends JFinalConfig {
/** public class MainConfig extends JFinalConfig {
* 将全局配置提出来 方便其他地方重用 /**
*/ * 将全局配置提出来 方便其他地方重用
private static Prop p; */
private static Prop p;
/**
* 配置JFinal常量 /**
*/ * 配置JFinal常量
@Override */
public void configConstant(Constants me) { @Override
// 读取数据库配置文件 public void configConstant(Constants me) {
loadConfig(); // 读取数据库配置文件
// 设置当前是否为开发模式 loadConfig();
me.setDevMode(p.getBoolean("devMode")); // 设置当前是否为开发模式
// 设置默认上传文件保存路径 getFile等使用 me.setDevMode(p.getBoolean("devMode"));
me.setBaseUploadPath("upload/temp/"); // 设置默认上传文件保存路径 getFile等使用
// 设置上传最大限制尺寸 me.setBaseUploadPath("upload/temp/");
// me.setMaxPostSize(1024*1024*10); // 设置上传最大限制尺寸
// 设置默认下载文件路径 renderFile使用 // me.setMaxPostSize(1024*1024*10);
me.setBaseDownloadPath("download"); // 设置默认下载文件路径 renderFile使用
// 设置默认视图类型 me.setBaseDownloadPath("download");
me.setViewType(ViewType.JFINAL_TEMPLATE); // 设置默认视图类型
// 设置404渲染视图 me.setViewType(ViewType.JFINAL_TEMPLATE);
// me.setError404View("404.html"); // 设置404渲染视图
// 设置json工厂 // me.setError404View("404.html");
me.setJsonFactory(MixedJsonFactory.me()); // 设置json工厂
me.setJsonFactory(MixedJsonFactory.me());
// 设置启用依赖注入
me.setInjectDependency(true); // 设置启用依赖注入
me.setInjectDependency(true);
}
}
/**
* 配置项目路由 路由拆分到 FrontRutes 与 AdminRoutes 之中配置的好处: 1:可分别配置不同的 baseViewPath 与 Interceptor /**
* 2:避免多人协同开发时,频繁修改此文件带来的版本冲突 3:避免本文件中内容过多,拆分后可读性增强 4:便于分模块管理路由 * 配置项目路由 路由拆分到 FrontRutes 与 AdminRoutes 之中配置的好处: 1:可分别配置不同的 baseViewPath 与 Interceptor
*/ * 2:避免多人协同开发时,频繁修改此文件带来的版本冲突 3:避免本文件中内容过多,拆分后可读性增强 4:便于分模块管理路由
@Override */
public void configRoute(Routes me) { @Override
// 推荐拆分方式 如果需要就解开注释 创建对应的 Routes public void configRoute(Routes me) {
// 推荐拆分方式 如果需要就解开注释 创建对应的 Routes
// me.add(new WechatRoutes());//配置微信端访问路由
// me.add(new WechatRoutes());//配置微信端访问路由
// 普通不拆分的方式配置 如下
// 设置默认访问首页路由 可使用http://localhost:port 直接访问 如果80端口 port可以省略 // 普通不拆分的方式配置 如下
me.add("/", IndexController.class); // 设置默认访问首页路由 可使用http://localhost:port 直接访问 如果80端口 port可以省略
me.add("/setting", SettingController.class); me.add("/", IndexController.class);
me.add("/user", UserController.class); me.add("/setting", SettingController.class);
me.add("/message", MessageController.class); me.add("/user", UserController.class);
me.add("/menu", MenuController.class); me.add("/message", MessageController.class);
me.add("/key", KeyController.class); me.add("/menu", MenuController.class);
me.add("/system", SystemController.class); me.add("/key", KeyController.class);
me.add("/bug", BugController.class); me.add("/system", SystemController.class);
me.add("/medium",MediumController.class); me.add("/bug", BugController.class);
} me.add("/medium",MediumController.class);
}
// 先加载开发环境配置,再追加生产环境的少量配置覆盖掉开发环境配置
static void loadConfig() { // 先加载开发环境配置,再追加生产环境的少量配置覆盖掉开发环境配置
if (p == null) { static void loadConfig() {
p = PropKit.use("config.properties").appendIfExists("config-pro.properties"); if (p == null) {
} p = PropKit.use("config.properties").appendIfExists("config-pro.properties");
} }
}
/**
* 获取数据库插件 抽取成独立的方法,便于重用该方法,减少代码冗余 /**
*/ * 获取数据库插件 抽取成独立的方法,便于重用该方法,减少代码冗余
public static DruidPlugin getDruidPlugin() { */
loadConfig(); public static DruidPlugin getDruidPlugin() {
return new DruidPlugin(p.get("jdbcUrl"), p.get("user"), p.get("password"), p.get("jdbc.driver")); loadConfig();
} return new DruidPlugin(p.get("jdbcUrl"), p.get("user"), p.get("password"), p.get("jdbc.driver"));
}
/**
* 配置JFinal插件 数据库连接池 ActiveRecordPlugin 缓存 定时任务 自定义插件 /**
*/ * 配置JFinal插件 数据库连接池 ActiveRecordPlugin 缓存 定时任务 自定义插件
@Override */
public void configPlugin(Plugins me) { @Override
loadConfig(); public void configPlugin(Plugins me) {
// 配置数据库连接池插件 loadConfig();
DruidPlugin dbPlugin = getDruidPlugin(); // 配置数据库连接池插件
dbPlugin.addFilter(new StatFilter()); // 添加 StatFilter 才会有统计数据 DruidPlugin dbPlugin = getDruidPlugin();
dbPlugin.addFilter(new StatFilter()); // 添加 StatFilter 才会有统计数据
// 数据映射 配置ActiveRecord插件
ActiveRecordPlugin arp = new ActiveRecordPlugin(dbPlugin); // 数据映射 配置ActiveRecord插件
arp.setShowSql(p.getBoolean("devMode")); ActiveRecordPlugin arp = new ActiveRecordPlugin(dbPlugin);
arp.setContainerFactory(new CaseInsensitiveContainerFactory(true)); arp.setShowSql(p.getBoolean("devMode"));
arp.setDialect(new OracleDialect()); arp.setContainerFactory(new CaseInsensitiveContainerFactory(true));
arp.addSqlTemplate("oracle.sql"); arp.setDialect(new OracleDialect());
/******** 在此添加数据库 表-Model 映射 *********/ arp.addSqlTemplate("oracle.sql");
// 如果使用了JFinal Model 生成器 生成了BaseModel 把下面注释解开即可 /******** 在此添加数据库 表-Model 映射 *********/
_MappingKit.mapping(arp); // 如果使用了JFinal Model 生成器 生成了BaseModel 把下面注释解开即可
_MappingKit.mapping(arp);
// 添加到插件列表中
me.add(dbPlugin); // 添加到插件列表中
me.add(arp); me.add(dbPlugin);
me.add(arp);
} // 添加Redis 配置
RedisPlugin redis = new RedisPlugin("redis", PropKit.get("redis.url"), PropKit.get("redis.password"));
/** me.add(redis);
* 配置全局拦截器
*/
@Override }
public void configInterceptor(Interceptors me) {
me.add(new JwtInterceptor()); /**
//统一拦截错误 * 配置全局拦截器
// me.add(new UnifiedErrorInterceptor()); */
//错误不会返回页面 @Override
// RenderManager.me().setRenderFactory(new ErrorRender()); public void configInterceptor(Interceptors me) {
} me.add(new JwtInterceptor());
//统一拦截错误
/** // me.add(new UnifiedErrorInterceptor());
* 配置全局处理器 //错误不会返回页面
*/ // RenderManager.me().setRenderFactory(new ErrorRender());
@Override }
public void configHandler(Handlers me) {
// 说明:druid的统计页面涉及安全性 需要自行处理根据登录权限判断是否能访问统计页面 /**
// me.add(DruidKit.getDruidStatViewHandler()); // druid 统计页面功能 * 配置全局处理器
me.add(new UrlSkipHandler("^/services/.+", false)); */
me.add(new UrlSkipHandler("/*\\.ws/", false)); @Override
} public void configHandler(Handlers me) {
// 说明:druid的统计页面涉及安全性 需要自行处理根据登录权限判断是否能访问统计页面
/** // me.add(DruidKit.getDruidStatViewHandler()); // druid 统计页面功能
* 项目启动后调用 me.add(new UrlSkipHandler("^/services/.+", false));
*/ me.add(new UrlSkipHandler("/*\\.ws/", false));
@Override }
public void onStart() {
String dbType=p.get("dbType"); /**
if(dbType==null || "".equals(dbType.trim())) { * 项目启动后调用
System.out.println("数据库配置文件中dbType不能为空值"); */
return; @Override
} public void onStart() {
dbType=dbType.trim(); String dbType=p.get("dbType");
dbType=dbType.toUpperCase(); if(dbType==null || "".equals(dbType.trim())) {
String configPath=PathKit.getRootClassPath()+"/DBUpdate/"; System.out.println("数据库配置文件中dbType不能为空值");
DBService dbService= new DBService(); return;
dbService.upgrade(configPath, dbType); }
} dbType=dbType.trim();
dbType=dbType.toUpperCase();
/** String configPath=PathKit.getRootClassPath()+"/DBUpdate/";
* 配置模板引擎 DBService dbService= new DBService();
*/ dbService.upgrade(configPath, dbType);
@Override }
public void configEngine(Engine me) {
// 配置模板支持热加载 /**
me.setDevMode(p.getBoolean("engineDevMode", false)); * 配置模板引擎
// 这里只有选择JFinal TPL的时候才用 */
// 配置共享函数模板 @Override
// me.addSharedFunction("/view/common/layout.html") public void configEngine(Engine me) {
} // 配置模板支持热加载
me.setDevMode(p.getBoolean("engineDevMode", false));
// 这里只有选择JFinal TPL的时候才用
public static void main(String[] args) { // 配置共享函数模板
UndertowServer.create(MainConfig.class, "undertow.properties").configWeb(builder -> { // me.addSharedFunction("/view/common/layout.html")
addWebSocket(builder); }
}) .start();
}
public static void main(String[] args) {
/** UndertowServer.create(MainConfig.class, "undertow.properties").configWeb(builder -> {
* 添加websocket addWebSocket(builder);
* @param builder }) .start();
*/ }
public static void addWebSocket(WebBuilder builder) {
loadConfig(); /**
if(p.getBoolean("openMessageWebSocket") != null && p.getBoolean("openMessageWebSocket") ) { * 添加websocket
addMessageWebSocket(builder); * @param builder
} */
} public static void addWebSocket(WebBuilder builder) {
loadConfig();
/** if(p.getBoolean("openMessageWebSocket") != null && p.getBoolean("openMessageWebSocket") ) {
* 添加消息中心的websocket addMessageWebSocket(builder);
* @param builder }
*/ }
public static void addMessageWebSocket(WebBuilder builder) {
builder.addWebSocketEndpoint(MessageWebSocket.class); /**
} * 添加消息中心的websocket
* @param builder
} */
public static void addMessageWebSocket(WebBuilder builder) {
builder.addWebSocketEndpoint(MessageWebSocket.class);
}
}
package com.archser.aserver.controller; package com.archser.aserver.controller;
import java.math.BigInteger; import java.math.BigInteger;
import java.util.Date; import java.util.Date;
import java.util.Iterator; import java.util.HashMap;
import java.util.LinkedHashMap; import java.util.Iterator;
import java.util.List; import java.util.LinkedHashMap;
import java.util.Map; import java.util.List;
import java.util.Map.Entry; import java.util.Map;
import java.util.Optional; import java.util.Map.Entry;
import java.util.Optional;
import org.bouncycastle.crypto.InvalidCipherTextException; import org.bouncycastle.crypto.InvalidCipherTextException;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters; import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils; import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSON; import com.archser.aserver.interceptor.JwtInterceptor;
import com.archser.aserver.interceptor.JwtInterceptor; import com.archser.aserver.model.System;
import com.archser.aserver.model.System; import com.archser.aserver.model.User;
import com.archser.aserver.model.User; import com.archser.aserver.service.LogService;
import com.archser.aserver.service.LogService; import com.archser.aserver.service.UserService;
import com.archser.aserver.service.UserService; import com.archser.aserver.util.HttpRequestUtil;
import com.archser.aserver.util.CollectionUtil; import com.archser.aserver.util.KeysUtil;
import com.archser.aserver.util.HttpRequestUtil; import com.archser.aserver.util.gm.BCECUtil;
import com.archser.aserver.util.KeysUtil; import com.archser.aserver.util.gm.SM2Util;
import com.archser.aserver.util.gm.BCECUtil; import com.jfinal.aop.Clear;
import com.archser.aserver.util.gm.SM2Util; import com.jfinal.aop.Inject;
import com.jfinal.aop.Clear; import com.jfinal.core.Controller;
import com.jfinal.aop.Inject; import com.jfinal.kit.HashKit;
import com.jfinal.core.Controller; import com.jfinal.kit.Kv;
import com.jfinal.kit.HashKit; import com.jfinal.kit.PropKit;
import com.jfinal.kit.Kv; import com.jfinal.kit.Ret;
import com.jfinal.kit.PropKit; import com.jfinal.kit.StrKit;
import com.jfinal.kit.Ret; import com.jfinal.log.Log;
import com.jfinal.kit.StrKit; import com.jfinal.plugin.activerecord.Db;
import com.jfinal.log.Log; import com.jfinal.plugin.activerecord.Record;
import com.jfinal.plugin.activerecord.Db; import com.jfinal.plugin.redis.Redis;
import com.jfinal.plugin.activerecord.Record; import com.spbportal.sso.SsoToken;
import com.spbportal.sso.SsoToken;
import io.jsonwebtoken.JwsHeader;
import io.jsonwebtoken.JwsHeader; import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.SignatureAlgorithm;
/**
/** * IndexController 指向系统访问首页
* IndexController 指向系统访问首页 *
* * @author jbolt.cn
* @author jbolt.cn * @email 909854136@qq.com
* @email 909854136@qq.com * @date 2018年11月4日 下午9:02:52
* @date 2018年11月4日 下午9:02:52 */
*/ public class IndexController extends Controller {
public class IndexController extends Controller { /**
/** * 登陆用户名,密码解密
* 登陆用户名,密码解密 */
*/ public static final String PRIVATE_KEY_D = "38627fffe8003e6d2faa76d4eae2f74fd9cd7be257ab36c356c4f01bbc17e41d";
public static final String PRIVATE_KEY_D = "38627fffe8003e6d2faa76d4eae2f74fd9cd7be257ab36c356c4f01bbc17e41d"; public static final ECPrivateKeyParameters USER_PRIVATE_KEY = BCECUtil.createECPrivateKeyParameters(
public static final ECPrivateKeyParameters USER_PRIVATE_KEY = BCECUtil.createECPrivateKeyParameters( new BigInteger(ByteUtils.fromHexString(PRIVATE_KEY_D)), SM2Util.DOMAIN_PARAMS);
new BigInteger(ByteUtils.fromHexString(PRIVATE_KEY_D)), SM2Util.DOMAIN_PARAMS);
private static Log log = Log.getLog(IndexController.class);
private static Log log = Log.getLog(IndexController.class); /**
/** * 超期时间:24小时,即:24 * 60 * 60 * 1000
* 超期时间:24小时,即:24 * 60 * 60 * 1000 */
*/ private static int EXPIRATION = 24 * 60 * 60 * 1000;
private static int EXPIRATION = 24 * 60 * 60 * 1000; private static int permitLoginTimes = 5;// 允许登陆次数
private static int permitLoginTimes = 5;// 允许登陆次数 private static int hour = 2; // 两小时内不可登录
private static int hour = 2; // 两小时内不可登录 @Inject
@Inject private LogService logService;
private LogService logService; @Inject
@Inject private UserService userService;
private UserService userService;
/**
* 首页Action
/** */
* 首页Action public void index() {
*/ render("index.html");
public void index() { }
render("index.html");
} /**
* 修改密码
/** */
* 修改密码 public void updatePassword() {
*/ String username = this.getPara("username");
public void updatePassword() { String password = this.getPara("newPwd");
String username = this.getPara("username"); password = HashKit.sha256(password);
String password = this.getPara("newPwd"); int a = userService.updatePwd(password, username);
password = HashKit.sha256(password); if (a == 0) {
int a = userService.updatePwd(password, username); this.renderJson(Ret.fail("msg", "修改失败"));
if (a == 0) { logService.saveAsLog("operate", username, JwtInterceptor.getIpAddr(getRequest()),
this.renderJson(Ret.fail("msg", "修改失败")); username + "修改密码操作:修改密码失败", "aserver");
logService.saveAsLog("operate", username, JwtInterceptor.getIpAddr(getRequest()), return;
username + "修改密码操作:修改密码失败", "aserver"); }
return; this.renderJson(Ret.ok("msg", "修改成功"));
} logService.saveAsLog("operate", username, JwtInterceptor.getIpAddr(getRequest()), username + "修改密码操作:修改密码成功",
this.renderJson(Ret.ok("msg", "修改成功")); "aserver");
logService.saveAsLog("operate", username, JwtInterceptor.getIpAddr(getRequest()), username + "修改密码操作:修改密码成功", }
"aserver");
} private String decrypt(String sm2Cipher) throws InvalidCipherTextException {
return new String(SM2Util.decrypt(USER_PRIVATE_KEY, ByteUtils.fromHexString("04" + sm2Cipher)));
private String decrypt(String sm2Cipher) throws InvalidCipherTextException { }
return new String(SM2Util.decrypt(USER_PRIVATE_KEY, ByteUtils.fromHexString("04" + sm2Cipher)));
} /**
* 登录验证
/** */
* 登录验证 @Clear(JwtInterceptor.class)
*/ // @Before(LoginValidator.class)
@Clear(JwtInterceptor.class) public void login() {
// @Before(LoginValidator.class) String app = this.getPara("app");
public void login() { String username = this.getPara("username");
String app = this.getPara("app"); String password = this.getPara("password");
String username = this.getPara("username"); String callback = this.getPara("callback");
String password = this.getPara("password"); // 解密用户名和密码
String callback = this.getPara("callback"); try {
username = decrypt(username);
// 解密用户名和密码 password = decrypt(password);
try { } catch (Exception e1) {
username = decrypt(username); e1.printStackTrace();
password = decrypt(password); username = this.getPara("username");
} catch (Exception e1) { password = this.getPara("password");
e1.printStackTrace(); }
username = this.getPara("username"); password = HashKit.sha256(password);
password = this.getPara("password"); User user = User.dao.template("getUser", username).findFirst();
} if (user == null) {
this.renderJson(Ret.fail("msg", "用户名或密码不存在: " + username));
password = HashKit.sha256(password); logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "该用户非本系统用户正在非法登录", app);
java.lang.System.out.println("Login: " + username); return;
}
User user = User.dao.template("getUser", username).findFirst(); // 一旦开启三员 admin用户不能使用
if (user == null) { if ("admin".equals(user.getUsername())) {
this.renderJson(Ret.fail("msg", "用户名或密码不存在: " + username)); Integer userCount = Db.queryInt(Db.getSql("hasThreeMemberUsersCount"));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "该用户非本系统用户正在非法登录", app); boolean isExistThreeMemberUsers = userCount == null ? false : (userCount.intValue() > 0 ? true : false);
return; if (isExistThreeMemberUsers) {
} this.renderJson(Ret.fail("msg", "已开启三员管理,admin失效了。"));
// 一旦开启三员 admin用户不能使用 logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:已开启三员管理", app);
if ("admin".equals(user.getUsername())) { return;
Integer userCount = Db.queryInt(Db.getSql("hasThreeMemberUsersCount")); }
boolean isExistThreeMemberUsers = userCount == null ? false : (userCount.intValue() > 0 ? true : false); }
if (isExistThreeMemberUsers) { if (Integer.valueOf(user.getLocked()) == 1) {
this.renderJson(Ret.fail("msg", "已开启三员管理,admin失效了。")); this.renderJson(Ret.fail("msg", "当前账户已被锁定"));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:已开启三员管理", app); logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:该用户已被锁定", app);
return; return;
} }
} if (!password.equals(user.getPassword())) {
if (Integer.valueOf(user.getLocked()) == 1) { if (this.checkErrorCount(user)) {
this.renderJson(Ret.fail("msg", "当前账户已被锁定")); this.renderJson(Ret.fail("msg", "您的错误次数已达5次以上,请稍后再试!"));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:该用户已被锁定", app); return;
return; } else {
} int errorCount = permitLoginTimes - (user.getErrorcount() == null ? 0 : user.getErrorcount()) - 1;
if (!password.equals(user.getPassword())) { if (user.getErrorcount() == 4) {
if (this.checkErrorCount(user)) { this.renderJson(Ret.fail("msg", "用户名或密码验证失败,您的账户于两小时后才可登录!"));
this.renderJson(Ret.fail("msg", "您的错误次数已达5次以上,请稍后再试!")); return;
return; } else {
} else { this.renderJson(Ret.fail("msg", "用户名或密码验证失败,您还有" + errorCount + "次机会!"));
int errorCount = permitLoginTimes - (user.getErrorcount() == null ? 0 : user.getErrorcount()) - 1; logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:密码验证错误",
if (user.getErrorcount() == 4) { app);
this.renderJson(Ret.fail("msg", "用户名或密码验证失败,您的账户于两小时后才可登录!")); return;
return; }
} else { }
this.renderJson(Ret.fail("msg", "用户名或密码验证失败,您还有" + errorCount + "次机会!")); }
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:密码验证错误", Integer errorcount = user.getErrorcount();
app); if (errorcount != null && errorcount != 0) {
return; if (!this.checkWhenPwdOk(user)) {
} Date date = new Date();
} long hour1 = 2 * 60 * 60;
} long begin = date.getTime();
Integer errorcount = user.getErrorcount(); long end = user.getLastLoginTime().getTime();
if (errorcount != null && errorcount != 0) { long between = (begin - end) / 1000;
if (!this.checkWhenPwdOk(user)) { long hour2 = (hour1 - between) % (24 * 3600) / 3600;
Date date = new Date(); long minute = (hour1 - between) % 3600 / 60;
long hour1 = 2 * 60 * 60; long second = (hour1 - between) % 60;
long begin = date.getTime(); if (between < hour1) {
long end = user.getLastLoginTime().getTime(); this.renderJson(Ret.fail("msg", "您的账户还剩" + hour2 + "小时" + minute + "分" + second + "秒才可登录!"));
long between = (begin - end) / 1000; return;
long hour2 = (hour1 - between) % (24 * 3600) / 3600; }
long minute = (hour1 - between) % 3600 / 60; }
long second = (hour1 - between) % 60; }
if (between < hour1) {
this.renderJson(Ret.fail("msg", "您的账户还剩" + hour2 + "小时" + minute + "分" + second + "秒才可登录!")); if (!"admin".equals(user.getUsername())) {
return; Integer noLockedRolesCount = Db.queryInt(Db.getSql("hasNoLockedRolesCount"), user.getUsername());
} boolean noLockedRolesFlag = noLockedRolesCount == null ? false
} : (noLockedRolesCount.intValue() > 0 ? true : false);
} if (!noLockedRolesFlag) {
this.renderJson(Ret.fail("msg", "拥有的角色全部被锁定,不能登录系统了。"));
if (!"admin".equals(user.getUsername())) { logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:该用户拥有的角色全部被锁定",
Integer noLockedRolesCount = Db.queryInt(Db.getSql("hasNoLockedRolesCount"), user.getUsername()); app);
boolean noLockedRolesFlag = noLockedRolesCount == null ? false return;
: (noLockedRolesCount.intValue() > 0 ? true : false); }
if (!noLockedRolesFlag) { }
this.renderJson(Ret.fail("msg", "拥有的角色全部被锁定,不能登录系统了。")); System system = System.dao.template("getSystemPrivatekey", app).findFirst();
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:该用户拥有的角色全部被锁定", if (system == null) {
app); this.renderJson(Ret.fail("msg", "没有找到应用:" + app));
return; logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:没有找到应用" + app,
} app);
} return;
System system = System.dao.template("getSystemPrivatekey", app).findFirst(); }
if (system == null) { if (StrKit.isBlank(system.getPrivatekey()) || StrKit.isBlank(system.getKeyid())) {
this.renderJson(Ret.fail("msg", "没有找到应用:" + app)); this.renderJson(Ret.fail("msg", "没有找到应用的密钥:" + app));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:没有找到应用" + app, logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:没有找到应用的密钥" + app,
app); app);
return; return;
} }
if (StrKit.isBlank(system.getPrivatekey()) || StrKit.isBlank(system.getKeyid())) {
this.renderJson(Ret.fail("msg", "没有找到应用的密钥:" + app)); //查询用户是否有该系统的权限
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:没有找到应用的密钥" + app, // boolean homeAuth = userService.checkUserSystemPermission(user.getId(), app);
app); // if (!homeAuth) {
return; // this.renderJson(Ret.fail("msg", "您没有权限登录" + system.getTitle() + "系统"));
} // logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:您没有权限登录此系统" + app,
// app);
//查询用户是否有该系统的权限 // return;
// boolean homeAuth = userService.checkUserSystemPermission(user.getId(), app); // }
// if (!homeAuth) {
// this.renderJson(Ret.fail("msg", "您没有权限登录" + system.getTitle() + "系统")); List<System> systemList = userService.findSystemWithUserPermission(user.getId());
// logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:您没有权限登录此系统" + app, /** 修改如果登陆用户为admin用户则直接登陆 huwenbin 2020/5/20 start */
// app); if (!"admin".equals(user.getUsername())) {
// return; if ((systemList == null || systemList.isEmpty())) {
// } this.renderJson(Ret.fail("msg", "您没有权限登录" + system.getTitle() + "系统"));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()),
List<System> systemList = userService.findSystemWithUserPermission(user.getId()); "登录失败,原因:您没有权限登录此系统" + app, app);
/** 修改如果登陆用户为admin用户则直接登陆 huwenbin 2020/5/20 start*/ return;
if (!"admin".equals(user.getUsername())) { }
if ((systemList == null || systemList.isEmpty())) {
this.renderJson(Ret.fail("msg", "您没有权限登录" + system.getTitle() + "系统")); Optional<System> systemOptional = userService.getSystemByName(app, systemList);
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:您没有权限登录此系统" + app, if (!systemOptional.isPresent()) {// 没有当前系统的权限
app); system = systemList.get(0);
return; app = system.getName();
} callback = system.getUrl();
}
Optional<System> systemOptional = userService.getSystemByName(app, systemList); }
if (!systemOptional.isPresent()) {// 没有当前系统的权限 /** 修改如果登陆用户为admin用户则直接登陆 huwenbin 2020/5/20 end */
system = systemList.get(0); try {
app = system.getName(); String jws = Jwts.builder()
callback = system.getUrl(); // 设置密匙ID
} .setHeaderParam(JwsHeader.KEY_ID, system.getKeyid())
} // 赋予应用
/** 修改如果登陆用户为admin用户则直接登陆 huwenbin 2020/5/20 end */ .setSubject(app)
try { // 签发时间
String jws = Jwts.builder() .setIssuedAt(new Date())
// 设置密匙ID // 超期时间
.setHeaderParam(JwsHeader.KEY_ID, system.getKeyid()) .setExpiration(new Date(java.lang.System.currentTimeMillis() + EXPIRATION))
// 赋予应用 // 用户名
.setSubject(app) .claim("name", username).claim("ip", JwtInterceptor.getIpAddr(getRequest()))
// 签发时间 // 签名
.setIssuedAt(new Date()) .signWith(KeysUtil.privatekey(system.getPrivatekey()), SignatureAlgorithm.RS256).compact();
// 超期时间
.setExpiration(new Date(java.lang.System.currentTimeMillis() + EXPIRATION)) if (errorcount != null && errorcount != 0) {
// 用户名 this.setErrZero(user);
.claim("name", username).claim("ip", JwtInterceptor.getIpAddr(getRequest())) }
// 签名 /**
.signWith(KeysUtil.privatekey(system.getPrivatekey()), SignatureAlgorithm.RS256).compact(); * 20200706 lidecai 将用户信息保存到Redis start
*/
if (errorcount != null && errorcount != 0) { Map<Object, Object> userInfo = new HashMap<>();
this.setErrZero(user); Iterator<Entry<String, Object>> userIterator = user._getAttrsEntrySet().iterator();
} Entry<String, Object> nextAttr = null;
this.renderJson(Ret.ok("token", jws).set("callback", callback)); while(userIterator.hasNext()) {
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), nextAttr = userIterator.next();
username + "登录" + app + "成功", app); userInfo.put(nextAttr.getKey().trim().toLowerCase(), nextAttr.getValue());
} catch (Exception e) { }
log.error("生成登录票据失败", e); try {
this.renderJson(Ret.fail("msg", "生成登录票据失败")); Redis.use().hmset(username + "_INFO", userInfo);
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "生成登录票据失败", app); // 设置过期时间
} Redis.use().expire(username, 60 * 60 * 24);
} }catch (Exception e) {
e.printStackTrace();
// 密码正确时错误次数清零 }
private void setErrZero(User user) { this.renderJson(Ret.ok("token", jws).set("callback", callback));
Db.update(Db.getSqlPara("updateForOk", Kv.by("id", user.getId()))); logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), username + "登录" + app + "成功", app);
} /**
* 20200706 lidecai 将用户信息保存到Redis end
//密码错误时判断错误次数是否为5次 */
private boolean checkErrorCount(User user) { } catch (Exception e) {
Kv cond= Kv.by("id", user.getId()).set("hour",hour).set("permitLoginTimes",permitLoginTimes); log.error("生成登录票据失败", e);
List<Record> currentList =Db.find(Db.getSqlPara("getErrorCount",cond)); this.renderJson(Ret.fail("msg", "生成登录票据失败"));
int currentNum = 0; logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "生成登录票据失败", app);
for (Record record : currentList) { }
currentNum = Integer.parseInt(record.get("flag").toString()); }
}
if (currentNum >= permitLoginTimes) { // 密码正确时错误次数清零
return true; private void setErrZero(User user) {
}else { Db.update(Db.getSqlPara("updateForOk", Kv.by("id", user.getId())));
//执行+1或=1的操作 }
Db.update(Db.getSqlPara("updateForErr",cond));
return false; //密码错误时判断错误次数是否为5次
} private boolean checkErrorCount(User user) {
} Kv cond = Kv.by("id", user.getId()).set("hour", hour).set("permitLoginTimes", permitLoginTimes);
//密码正确时判断次数和锁定时间是否在指定范围内 List<Record> currentList = Db.find(Db.getSqlPara("getErrorCount", cond));
private boolean checkWhenPwdOk(User user) { int currentNum = 0;
List<Record> currentList =Db.find(Db.getSqlPara("checkWhenPwdOk", Kv.by("id", user.getId()).set("hour",hour).set("permitLoginTimes",permitLoginTimes))); for (Record record : currentList) {
int currentNum = 0; currentNum = Integer.parseInt(record.get("flag").toString());
if (currentList == null || currentList.size() == 0) { }
return true; if (currentNum >= permitLoginTimes) {
} return true;
for (Record record : currentList) { } else {
currentNum = Integer.parseInt(record.get("flag").toString()); //执行+1或=1的操作
} Db.update(Db.getSqlPara("updateForErr", cond));
if(currentNum >= permitLoginTimes) { return false;
return false; }
}else { }
return true;
} //密码正确时判断次数和锁定时间是否在指定范围内
} private boolean checkWhenPwdOk(User user) {
List<Record> currentList = Db.find(Db.getSqlPara("checkWhenPwdOk",
/** Kv.by("id", user.getId()).set("hour", hour).set("permitLoginTimes", permitLoginTimes)));
* 通过门户系统单点登录 int currentNum = 0;
* if (currentList == null || currentList.size() == 0) {
* @author Guo XJ return true;
* @date 2019-12-13 15:08:00 }
*/ for (Record record : currentList) {
public void ssoByPortalSystem() { currentNum = Integer.parseInt(record.get("flag").toString());
try { }
//获取app if (currentNum >= permitLoginTimes) {
String app = getPara("app",null); return false;
if(app == null) { } else {
renderJson(Ret.fail("msg","获取服务信息失败")); return true;
return ; }
} }
//获取到门户系统的Token
String ssotoken = getPara("ssotoken"); /**
//获取到personCode(用户唯一标识) * 通过门户系统单点登录
SsoToken st = new SsoToken(); *
st.initialise(ssotoken); * @author Guo XJ
String personCode = st.getTokenId(); * @date 2019-12-13 15:08:00
//获取用户 */
Record user = userService.getUserInfoByPersonCode(personCode); public void ssoByPortalSystem() {
System system = System.dao.template("getSystemPrivatekey", app).findFirst(); try {
if(system == null) { //获取app
renderJson(Ret.fail("msg","获取服务信息失败")); String app = getPara("app", null);
return ; if (app == null) {
} renderJson(Ret.fail("msg", "获取服务信息失败"));
//判断用户是否存在 return;
if(user != null && user.getStr("username") != null) { }
String jws = Jwts.builder() //获取到门户系统的Token
// 设置密匙ID String ssotoken = getPara("ssotoken");
.setHeaderParam(JwsHeader.KEY_ID, system.getKeyid()) //获取到personCode(用户唯一标识)
// 赋予应用 SsoToken st = new SsoToken();
.setSubject(app) st.initialise(ssotoken);
// 签发时间 String personCode = st.getTokenId();
.setIssuedAt(new Date()) //获取用户
// 超期时间 Record user = userService.getUserInfoByPersonCode(personCode);
.setExpiration(new Date(java.lang.System.currentTimeMillis() + EXPIRATION)) System system = System.dao.template("getSystemPrivatekey", app).findFirst();
// 用户名 if (system == null) {
.claim("name", user.getStr("username")).claim("ip", JwtInterceptor.getIpAddr(getRequest())) renderJson(Ret.fail("msg", "获取服务信息失败"));
// 签名 return;
.signWith(KeysUtil.privatekey(system.getPrivatekey()), SignatureAlgorithm.RS256).compact(); }
this.renderJson(Ret.ok("token", jws)); //判断用户是否存在
return; if (user != null && user.getStr("username") != null) {
}else { String jws = Jwts.builder()
this.renderJson(Ret.fail("msg","没有找到当前用户")); // 设置密匙ID
return; .setHeaderParam(JwsHeader.KEY_ID, system.getKeyid())
} // 赋予应用
} catch (Exception e) { .setSubject(app)
// TODO: handle exception // 签发时间
e.printStackTrace(); .setIssuedAt(new Date())
this.renderJson(Ret.fail("msg","登录出错!")); // 超期时间
} .setExpiration(new Date(java.lang.System.currentTimeMillis() + EXPIRATION))
// 用户名
} .claim("name", user.getStr("username")).claim("ip", JwtInterceptor.getIpAddr(getRequest()))
// 签名
/** .signWith(KeysUtil.privatekey(system.getPrivatekey()), SignatureAlgorithm.RS256).compact();
* 根据邮政门户传回的code 获取用户信息 this.renderJson(Ret.ok("token", jws));
* return;
* @Title: getUserInfoForH5 } else {
* @author LDC this.renderJson(Ret.fail("msg", "没有找到当前用户"));
* @date 2019-11-19 03:22:34 return;
*/ }
@Clear } catch (Exception e) {
public void getUserInfoForH5() { // TODO: handle exception
String code = getPara("code", null); e.printStackTrace();
if (code == null) { this.renderJson(Ret.fail("msg", "登录出错!"));
renderJson(Ret.fail("msg", "获取用户信息失败")); }
return;
} }
String app = getPara("app", null); /**
if (app == null) { * 根据邮政门户传回的code 获取用户信息
renderJson(Ret.fail("msg", "获取服务信息失败")); *
return; * @Title: getUserInfoForH5
} * @author LDC
* @date 2019-11-19 03:22:34
Map<String, String> paramMap = new LinkedHashMap<String, String>(); */
paramMap.put("client_id", "MmEepJkH7Hiz7EtS"); @Clear
paramMap.put("code", code); public void getUserInfoForH5() {
paramMap.put("state", "1"); String code = getPara("code", null);
paramMap.put("grant_type", "authorization_code"); if (code == null) {
paramMap.put("scope", "scope"); renderJson(Ret.fail("msg", "获取用户信息失败"));
paramMap.put("redirect_uri", PropKit.get("redirect_uri")); return;
}
Iterator<Entry<String, String>> entrySet = paramMap.entrySet().iterator();
StringBuilder builder = new StringBuilder(); String app = getPara("app", null);
while (entrySet.hasNext()) { if (app == null) {
Entry<String, String> next = entrySet.next(); renderJson(Ret.fail("msg", "获取服务信息失败"));
builder.append(next.getKey()).append("=").append(next.getValue()).append("&"); return;
} }
String param = builder.deleteCharAt(builder.length() - 1).toString(); Map<String, String> paramMap = new LinkedHashMap<String, String>();
String result = HttpRequestUtil.sendPost(PropKit.get("authUrl"), param); paramMap.put("client_id", "MmEepJkH7Hiz7EtS");
Kv parseObject = JSON.parseObject(result, Kv.class); paramMap.put("code", code);
Object access_token = parseObject.get("access_token"); paramMap.put("state", "1");
if (access_token == null) { paramMap.put("grant_type", "authorization_code");
renderJson(Ret.fail("msg", "获取授权失败,请重新登录")); paramMap.put("scope", "scope");
return; paramMap.put("redirect_uri", PropKit.get("redirect_uri"));
}
String sendPost = HttpRequestUtil.sendPost(PropKit.get("userInfoUrl"), Iterator<Entry<String, String>> entrySet = paramMap.entrySet().iterator();
"access_token=" + access_token.toString()); StringBuilder builder = new StringBuilder();
Kv userObj = JSON.parseObject(sendPost, Kv.class); while (entrySet.hasNext()) {
Object uuid = userObj.get("uuid"); Entry<String, String> next = entrySet.next();
if (uuid == null) { builder.append(next.getKey()).append("=").append(next.getValue()).append("&");
renderJson(Ret.fail("msg", "获取用户信息失败")); }
return;
} String param = builder.deleteCharAt(builder.length() - 1).toString();
System system = System.dao.template("getSystemPrivatekey", app).findFirst(); String result = HttpRequestUtil.sendPost(PropKit.get("authUrl"), param);
if (system == null) { Kv parseObject = JSON.parseObject(result, Kv.class);
renderJson(Ret.fail("msg", "获取服务信息失败")); Object access_token = parseObject.get("access_token");
return; if (access_token == null) {
} renderJson(Ret.fail("msg", "获取授权失败,请重新登录"));
Record userInfo = Db.findById("AS_USER", "UUID", uuid.toString()); return;
if (userInfo == null) { }
renderJson(Ret.fail("msg", "没有找到当前用户")); String sendPost = HttpRequestUtil.sendPost(PropKit.get("userInfoUrl"),
return; "access_token=" + access_token.toString());
} Kv userObj = JSON.parseObject(sendPost, Kv.class);
String userName = userInfo.getStr("USERNAME"); Object uuid = userObj.get("uuid");
if (userName == null) { if (uuid == null) {
renderJson(Ret.fail("msg", "获取用户名失败")); renderJson(Ret.fail("msg", "获取用户信息失败"));
return; return;
} }
try { System system = System.dao.template("getSystemPrivatekey", app).findFirst();
String jws = Jwts.builder() if (system == null) {
// 设置密匙ID renderJson(Ret.fail("msg", "获取服务信息失败"));
.setHeaderParam(JwsHeader.KEY_ID, system.getKeyid()) return;
// 赋予应用 }
.setSubject(app) Record userInfo = Db.findById("AS_USER", "UUID", uuid.toString());
// 签发时间 if (userInfo == null) {
.setIssuedAt(new Date()) renderJson(Ret.fail("msg", "没有找到当前用户"));
// 超期时间 return;
.setExpiration(new Date(java.lang.System.currentTimeMillis() + EXPIRATION)) }
// 用户名 String userName = userInfo.getStr("USERNAME");
.claim("name", userName).claim("ip", JwtInterceptor.getIpAddr(getRequest())) if (userName == null) {
// 签名 renderJson(Ret.fail("msg", "获取用户名失败"));
.signWith(KeysUtil.privatekey(system.getPrivatekey()), SignatureAlgorithm.RS256).compact(); return;
this.renderJson(Ret.ok("token", jws)); }
logService.saveAsLog("login", userName, JwtInterceptor.getIpAddr(getRequest()), try {
userName + "登录" + app + "成功", app); String jws = Jwts.builder()
} catch (Exception e) { // 设置密匙ID
log.error("生成登录票据失败", e); .setHeaderParam(JwsHeader.KEY_ID, system.getKeyid())
this.renderJson(Ret.fail("msg", "生成登录票据失败")); // 赋予应用
logService.saveAsLog("login", userName, JwtInterceptor.getIpAddr(getRequest()), "生成登录票据失败", app); .setSubject(app)
} // 签发时间
.setIssuedAt(new Date())
} // 超期时间
} .setExpiration(new Date(java.lang.System.currentTimeMillis() + EXPIRATION))
// 用户名
.claim("name", userName).claim("ip", JwtInterceptor.getIpAddr(getRequest()))
// 签名
.signWith(KeysUtil.privatekey(system.getPrivatekey()), SignatureAlgorithm.RS256).compact();
this.renderJson(Ret.ok("token", jws));
logService.saveAsLog("login", userName, JwtInterceptor.getIpAddr(getRequest()),
userName + "登录" + app + "成功", app);
} catch (Exception e) {
log.error("生成登录票据失败", e);
this.renderJson(Ret.fail("msg", "生成登录票据失败"));
logService.saveAsLog("login", userName, JwtInterceptor.getIpAddr(getRequest()), "生成登录票据失败", app);
}
}
/**
* 退出系统,清空Redis 中的用户信息
* @Time:2020年7月6日 - 下午5:19:58
* @author:李德才
* @param:
* @return: void
* @throws
*/
public void loginOut() {
String userName = getAttrForStr("username");
Redis.use().del(userName + "_INFO");
renderJson(Ret.ok());
}
}
...@@ -6,7 +6,9 @@ import java.io.IOException; ...@@ -6,7 +6,9 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import com.archser.aserver.interceptor.JwtInterceptor;
import com.archser.aserver.model.Config; import com.archser.aserver.model.Config;
import com.archser.aserver.service.LogService;
import com.archser.aserver.service.SystemService; import com.archser.aserver.service.SystemService;
import com.archser.aserver.validator.SettingValidator; import com.archser.aserver.validator.SettingValidator;
import com.jfinal.aop.Before; import com.jfinal.aop.Before;
...@@ -28,176 +30,212 @@ import sun.misc.BASE64Encoder; ...@@ -28,176 +30,212 @@ import sun.misc.BASE64Encoder;
@SuppressWarnings("restriction") @SuppressWarnings("restriction")
public class SettingController extends Controller { public class SettingController extends Controller {
/** @Inject
* 通用的获取配置方法 private LogService logService;
*
* @param name /**
*/ * 通用的获取配置方法
@Before(SettingValidator.class) *
public void index(String name) { * @param name
String val = null; */
try { @Before(SettingValidator.class)
val = this.getConfig(name); public void index(String name) {
} catch (Exception e) { String val = null;
this.renderJson(Ret.fail("msg", e.getMessage())); try {
} val = this.getConfig(name);
} catch (Exception e) {
this.renderJson(Ret.ok(name, val)); this.renderJson(Ret.fail("msg", e.getMessage()));
} }
/** this.renderJson(Ret.ok(name, val));
* 获取所有配置 }
*/
public void all() { /**
this.renderJson(Ret.ok("configs", Config.dao.findAll())); * 获取所有配置
} */
public void all() {
@Inject this.renderJson(Ret.ok("configs", Config.dao.findAll()));
private SystemService systemService; }
/** @Inject
* private SystemService systemService;
*/
public void findConfigList() { /**
String searchText = this.getPara("searchText"); *
List<Config> configs = systemService.findConfigList(searchText); */
this.renderJson(Ret.ok("configs", configs)); public void findConfigList() {
} String searchText = this.getPara("searchText");
List<Config> configs = systemService.findConfigList(searchText);
/** /** xiaoying 20200715 YZJ-4212 功能操作中没有应用管理的日志 start */
* 获取单点登录地址<br> if (configs != null && configs.size() != 0) {
* 常用配置项 this.renderJson(Ret.ok("configs", configs));
*/ logService.saveAsLog("operate", getAttr("username"), JwtInterceptor.getIpAddr(getRequest()),
@Clear "应用管理-配置-查询数据包含:" + searchText + "的数据", "aserver");
// @Before(UnifiedErrorInterceptor.class) } else {
public void sso() { logService.saveAsLog("operate", getAttr("username"), JwtInterceptor.getIpAddr(getRequest()),
String val = null; "应用管理-配置-查询数据失败", "aserver");
try { }
val = this.getConfig("sso"); /** xiaoying 20200715 YZJ-4212 功能操作中没有应用管理的日志 end */
} catch (Exception e) { }
this.renderJson(Ret.fail("msg", e.getMessage()));
} /**
* 获取单点登录地址<br>
this.renderJson(Ret.ok("sso", val)); * 常用配置项
} */
@Clear
/** // @Before(UnifiedErrorInterceptor.class)
* 获取设置信息<br> public void sso() {
* 常用配置项 String val = null;
*/ try {
public void search() { val = this.getConfig("sso");
String val = null; } catch (Exception e) {
try { this.renderJson(Ret.fail("msg", e.getMessage()));
val = this.getConfig("search"); }
} catch (Exception e) {
this.renderJson(Ret.fail("msg", e.getMessage())); this.renderJson(Ret.ok("sso", val));
} }
this.renderJson(Ret.ok("search", val)); /**
} * 获取设置信息<br>
* 常用配置项
/** */
* 获取设置信息<br> public void search() {
* 常用配置项 String val = null;
*/ try {
public void logoUrl() { val = this.getConfig("search");
String filePath = PathKit.getWebRootPath() + File.separator + "logo" + File.separator + "logo.png"; } catch (Exception e) {
this.renderJson(Ret.ok("logoUrl", ImageToBase64(filePath))); this.renderJson(Ret.fail("msg", e.getMessage()));
} }
private static String ImageToBase64(String imgPath) { this.renderJson(Ret.ok("search", val));
byte[] data = null; }
// 读取图片字节数组
try { /**
InputStream in = new FileInputStream(imgPath); * 获取设置信息<br>
data = new byte[in.available()]; * 常用配置项
in.read(data); */
in.close(); public void logoUrl() {
} catch (IOException e) { String filePath =
e.printStackTrace(); PathKit.getWebRootPath() + File.separator + "logo" + File.separator + "logo.png";
} this.renderJson(Ret.ok("logoUrl", ImageToBase64(filePath)));
// 对字节数组Base64编码 }
BASE64Encoder encoder = new BASE64Encoder();
// 返回Base64编码过的字节数组字符串 private static String ImageToBase64(String imgPath) {
return encoder.encode(Objects.requireNonNull(data)); byte[] data = null;
// System.out.println("本地图片转换Base64:" + encoder.encode(Objects.requireNonNull(data))); // 读取图片字节数组
} try {
// public void logoUrl() { InputStream in = new FileInputStream(imgPath);
// String val = null; data = new byte[in.available()];
// try { in.read(data);
// val = this.getConfig("logoUrl"); in.close();
// } catch (Exception e) { } catch (IOException e) {
// this.renderJson(Ret.fail("msg", e.getMessage())); e.printStackTrace();
// } }
// this.renderJson(Ret.ok("logoUrl", val)); // 对字节数组Base64编码
// } BASE64Encoder encoder = new BASE64Encoder();
// 返回Base64编码过的字节数组字符串
return encoder.encode(Objects.requireNonNull(data));
public void getServerName() { // System.out.println("本地图片转换Base64:" + encoder.encode(Objects.requireNonNull(data)));
String val = null; }
try { // public void logoUrl() {
val = this.getConfig("serverName"); // String val = null;
} catch (Exception e) { // try {
this.renderJson(Ret.fail("msg", e.getMessage())); // val = this.getConfig("logoUrl");
} // } catch (Exception e) {
// this.renderJson(Ret.fail("msg", e.getMessage()));
this.renderJson(Ret.ok("serverName", val)); // }
} // this.renderJson(Ret.ok("logoUrl", val));
// }
/**
* 获取配置项目
* public void getServerName() {
* @param name String val = null;
* @return try {
* @throws Exception val = this.getConfig("serverName");
*/ } catch (Exception e) {
private String getConfig(String name) throws Exception { this.renderJson(Ret.fail("msg", e.getMessage()));
String val = Db.queryStr(Db.getSql("getConfigByName"), name); }
if (val == null) {
throw new Exception("配置项不存在(name='" + name + "')"); this.renderJson(Ret.ok("serverName", val));
} }
return val; /**
} * 获取配置项目
*
/** * @param name
* @used 添加修改配置 * @return
*/ * @throws Exception
@Before(Tx.class) */
public void add() { private String getConfig(String name) throws Exception {
Config config = getModel(Config.class, "", true); String val = Db.queryStr(Db.getSql("getConfigByName"), name);
if (config == null) { if (val == null) {
renderJson(Ret.fail("msg", "请填写完整数据")); throw new Exception("配置项不存在(name='" + name + "')");
} else if (config.getId() == null || config.getId() == 0) { }
config.set("ID", Config.SEQ_NEXTVAL);
config.save(); return val;
renderJson(Ret.ok("ok", "添加成功")); }
} else if (config.getId() != 0) {
config.update(); /**
renderJson(Ret.ok("ok", "修改成功")); * @used 添加修改配置
} */
} @Before(Tx.class)
public void add() {
/** Config config = getModel(Config.class, "", true);
* @used 删除配置 Boolean success = false;
*/ if (config == null) {
@Before(Tx.class) renderJson(Ret.fail("msg", "请填写完整数据"));
public void dele() { } else if (config.getId() == null || config.getId() == 0) {
String ids = this.getPara("ids"); config.set("ID", Config.SEQ_NEXTVAL);
String[] idsArray = ids.split(","); success = config.save();
if (ids == null || idsArray.length == 0) { /** xiaoying 20200715 YZJ-4212 功能操作中没有应用管理的日志 start */
renderJson(Ret.fail("msg", "请选择数据")); if (success) {
} renderJson(Ret.ok("ok", "添加成功"));
Boolean success = false; logService.saveAsLog("operate", getAttr("username"), JwtInterceptor.getIpAddr(getRequest()),
for (String id : idsArray) { "应用管理-配置-添加配置-配置名称为-" + config.getName() + "-添加成功", "aserver");
Config config = new Config(); } else {
config.setId(Integer.valueOf(id)); logService.saveAsLog("operate", getAttr("username"), JwtInterceptor.getIpAddr(getRequest()),
success = config.delete(); "应用管理-配置-添加配置-配置名称为-" + config.getName() + "-添加失败", "aserver");
} }
if (success) { } else if (config.getId() != 0) {
renderJson(Ret.ok()); success = config.update();
} else { if (success) {
renderJson(Ret.fail("msg", "删除数据出错")); renderJson(Ret.ok("ok", "修改成功"));
} logService.saveAsLog("operate", getAttr("username"), JwtInterceptor.getIpAddr(getRequest()),
} "应用管理-配置-编辑配置-配置名称为-" + config.getName() + "-修改成功", "aserver");
} else {
logService.saveAsLog("operate", getAttr("username"), JwtInterceptor.getIpAddr(getRequest()),
"应用管理-配置-编辑配置-配置名称为-" + config.getName() + "-修改失败", "aserver");
}
/** xiaoying 20200715 YZJ-4212 功能操作中没有应用管理的日志 end */
}
}
/**
* @used 删除配置
*/
@Before(Tx.class)
public void dele() {
String ids = this.getPara("ids");
String[] idsArray = ids.split(",");
if (ids == null || idsArray.length == 0) {
renderJson(Ret.fail("msg", "请选择数据"));
}
Boolean success = false;
StringBuilder sb = new StringBuilder();
/** xiaoying 20200715 YZJ-4212 功能操作中没有应用管理的日志 start */
for (String id : idsArray) {
sb.append(Config.dao.findById(Integer.valueOf(id)).getName() + ",");
success = Config.dao.deleteById(Integer.valueOf(id));
}
if (success) {
renderJson(Ret.ok());
logService.saveAsLog("operate", getAttr("username"), JwtInterceptor.getIpAddr(getRequest()),
"应用管理-配置-删除配置-配置名称为-" + sb.substring(0, sb.lastIndexOf(",")) + "-删除成功", "aserver");
} else {
renderJson(Ret.fail("msg", "删除数据出错"));
logService.saveAsLog("operate", getAttr("username"), JwtInterceptor.getIpAddr(getRequest()),
"应用管理-配置-删除配置-配置名称为-" + sb.substring(0, sb.lastIndexOf(",")) + "-删除失败", "aserver");
}
/** xiaoying 20200715 YZJ-4212 功能操作中没有应用管理的日志 end */
}
} }
package com.archser.aserver.controller; package com.archser.aserver.controller;
import java.util.ArrayList; import java.sql.SQLException;
import java.util.List; import java.util.ArrayList;
import javax.inject.Inject; import java.util.HashMap;
import com.archser.aserver.model.User; import java.util.Iterator;
import com.archser.aserver.service.UserService; import java.util.List;
import com.jfinal.core.Controller; import java.util.Map;
import com.jfinal.kit.HashKit; import java.util.Map.Entry;
import com.jfinal.kit.Kv;
import com.jfinal.kit.Ret; import javax.inject.Inject;
import com.jfinal.plugin.activerecord.Db; import com.archser.aserver.model.User;
import com.jfinal.plugin.activerecord.Record; import com.archser.aserver.service.UserService;
import com.jfinal.core.Controller;
/** import com.jfinal.kit.HashKit;
* 用户相关操作 import com.jfinal.kit.Kv;
* import com.jfinal.kit.Ret;
* @author dgq import com.jfinal.plugin.activerecord.Db;
* import com.jfinal.plugin.activerecord.Record;
*/ import com.jfinal.plugin.redis.Redis;
public class UserController extends Controller {
/**
@Inject * 用户相关操作
UserService userService; *
/** * @author dgq
* 获取用户信息 *
*/ */
public void info() { public class UserController extends Controller {
String username = this.getAttr("username");
User user = User.dao.template("getUser", username).findFirst(); @Inject
user.remove("password"); UserService userService;
this.renderJson(Ret.ok("userInfo", user)); private static final String _INFO = "_INFO";
}
/** /**
* 修改用户密码 * 获取用户信息
*/ */
@SuppressWarnings("unused") public void info() {
public void updatePwd() { String username = this.getAttr("username");
String username = this.getAttr("username"); User user = User.dao.template("getUser", username).findFirst();
String password = this.getPara("newPwd"); user.remove("password");
password = HashKit.sha256(password); this.renderJson(Ret.ok("userInfo", user));
int flag = Db.update(Db.getSql("updatePassword"), password, username); }
if (flag == 0) {
this.renderJson(Ret.fail("msg","修改失败")); /**
} * 修改用户密码
this.renderJson(Ret.ok("msg","修改成功")); * @throws SQLException
} */
public void updatePwd() {
/** String username = this.getAttr("username");
* 修改用户 String password = this.getPara("newPwd");
*/ password = HashKit.sha256(password);
public void updateUser() { int flag = Db.update(Db.getSql("updatePassword"), password, username);
User user = this.getModel(User.class, "user", true); if (flag == 0) {
if (user == null) { this.renderJson(Ret.fail("msg","修改失败"));
renderJson("msg", "数据参数错误,请重新修改"); return ;
return; }
} try {
boolean flag = user.update(); Redis.use().hset(username+ _INFO, "password", password);
if (flag) { }catch (Exception e) {
renderJson(Ret.ok("msg", "数据修改成功!")); e.printStackTrace();
return; }
} else { this.renderJson(Ret.ok("msg","修改成功"));
renderJson(Ret.fail("msg", "Error ! 请联系管理员解决。")); }
}
} /**
* 修改用户
/** */
* 查询角色 public void updateUser() {
*/ User user = this.getModel(User.class, "user", true);
@SuppressWarnings("unused") if (user == null) {
public void getRoleData() { renderJson("msg", "数据参数错误,请重新修改");
String username = this.getAttr("username"); return;
User user = User.dao.template("getUser", username).findFirst(); }
int userId = user.getId(); boolean flag = user.update();
List<Record> records = Db.find(Db.getSql("getRolesByUserId"), userId); if (flag) {
List<Integer> ids = new ArrayList<Integer>(); updateUserForRedis(user);
for (Record record : records) { renderJson(Ret.ok("msg", "数据修改成功!"));
ids.add(record.getInt("ROLE_ID")); return;
} } else {
List<Record> dataList = Db.find(Db.getSqlPara("getRole",Kv.by("ids", ids))); renderJson(Ret.fail("msg", "Error ! 请联系管理员解决。"));
if (dataList != null) { }
this.renderJson(Ret.ok("list", dataList)); }
} else {
this.renderJson(Ret.fail("msg", "未找到数据")); /**
} * 修改Redis中的用户信息
} *@Time:2020年7月10日 - 上午8:48:48
* @author:李德才
/** * @param: @param user
* 验证原密码输入的是否正确 * @return: void
*/ * @throws
public void validateOldPassword() { */
String username = this.getAttr("username"); public void updateUserForRedis(User user) {
User user = User.dao.template("getUser", username).findFirst(); try {
String oldPwd = getPara("oldPwd"); Iterator<Entry<String, Object>> userIterator = user._getAttrsEntrySet().iterator();
String encryptionString = HashKit.sha256(oldPwd); Map<Object, Object> userMap = new HashMap<>();
if (encryptionString.equals(user.getPassword())) { Entry<String, Object> userAttr = null;
renderJson(Ret.ok()); while (userIterator.hasNext()) {
} else { userAttr = userIterator.next();
renderJson(Ret.fail()); userMap.put(userAttr.getKey().toString().trim().toLowerCase(), userAttr.getValue());
} }
} Redis.use().hmset(user.getUsername() + _INFO, userMap);
} catch (Exception e) {
} e.printStackTrace();
}
}
/**
* 查询角色
*/
public void getRoleData() {
String username = this.getAttr("username");
User user = User.dao.template("getUser", username).findFirst();
int userId = user.getId();
List<Record> records = Db.find(Db.getSql("getRolesByUserId"), userId);
List<Integer> ids = new ArrayList<Integer>();
for (Record record : records) {
ids.add(record.getInt("ROLE_ID"));
}
List<Record> dataList = Db.find(Db.getSqlPara("getRole",Kv.by("ids", ids)));
if (dataList != null) {
this.renderJson(Ret.ok("list", dataList));
} else {
this.renderJson(Ret.fail("msg", "未找到数据"));
}
}
/**
* 验证原密码输入的是否正确
*/
public void validateOldPassword() {
String username = this.getAttr("username");
User user = User.dao.template("getUser", username).findFirst();
String oldPwd = getPara("oldPwd");
String encryptionString = HashKit.sha256(oldPwd);
if (encryptionString.equals(user.getPassword())) {
renderJson(Ret.ok());
} else {
renderJson(Ret.fail());
}
}
}
...@@ -764,6 +764,7 @@ ...@@ -764,6 +764,7 @@
alter table AS_CHECK_RECORD_RESULT add(DATASIGN1 VARCHAR2(200)); alter table AS_CHECK_RECORD_RESULT add(DATASIGN1 VARCHAR2(200));
</sql> </sql>
</version> </version>
<version edition="43" description="档案分类排序"> <version edition="43" description="档案分类排序">
<sql creator="xiaoying" createDate="20200703" note="档案分类排序"> <sql creator="xiaoying" createDate="20200703" note="档案分类排序">
alter table AS_TREECLASSFIC add(SERIALINDEX VARCHAR2(500)); alter table AS_TREECLASSFIC add(SERIALINDEX VARCHAR2(500));
...@@ -918,7 +919,6 @@ ...@@ -918,7 +919,6 @@
</sql> </sql>
</version> </version>
<version edition="45" description="ES搜索模板升级"> <version edition="45" description="ES搜索模板升级">
<sql creator="zhanglongfa" createDate="20200708" note="盘点记录详细表添加字段"> <sql creator="zhanglongfa" createDate="20200708" note="盘点记录详细表添加字段">
alter table AS_CHECK_RECORD_RESULT add(STATE VARCHAR2(50)); alter table AS_CHECK_RECORD_RESULT add(STATE VARCHAR2(50));
...@@ -926,11 +926,378 @@ ...@@ -926,11 +926,378 @@
alter table AS_CHECK_RECORD_RESULT add(LEVEL VARCHAR2(200)); alter table AS_CHECK_RECORD_RESULT add(LEVEL VARCHAR2(200));
alter table AS_CHECK_RECORD_RESULT add(DATASIGN VARCHAR2(200)); alter table AS_CHECK_RECORD_RESULT add(DATASIGN VARCHAR2(200));
</sql> </sql>
</version>
<version edition="46" description="序列">
<sql creator="yangrifei" createDate="20200715" note="序列">
CREATE SEQUENCE "SEQ_AS_VIDEO_TRANSITION" INCREMENT BY 1 START WITH 1 MAXVALUE 9223372036854775807 MINVALUE 1;
</sql>
</version>
<version edition="47" description="添加全宗信息表">
<sql creator="yangchengwu" createDate="20200715" note="全宗信息表">
CREATE TABLE "AS_FOND"
(
"ID" NUMBER NOT NULL,
"FOND_ID" VARCHAR2(40),
"NAME" VARCHAR2(40),
"DESCRIPTION" VARCHAR2(255),
"ORGAN_ID" VARCHAR2(40),
"CREATE_TIME" TIMESTAMP(6),
"REMARK" VARCHAR2(255),
"IDSEQ" VARCHAR2(500),
CONSTRAINT "SYS_C0090555" NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN "AS_FOND"."CREATE_TIME" IS '创建时间';
COMMENT ON COLUMN "AS_FOND"."DESCRIPTION" IS '全宗描述';
COMMENT ON COLUMN "AS_FOND"."FOND_ID" IS '全宗id';
COMMENT ON COLUMN "AS_FOND"."NAME" IS '全宗名称';
COMMENT ON COLUMN "AS_FOND"."ORGAN_ID" IS '关联机构';
COMMENT ON COLUMN "AS_FOND"."REMARK" IS '备注';
</sql>
</version>
<version edition="48" description="修改AS_VIDEO_TRANSITION表字段长度">
<sql creator="yangrifei" createDate="20200716" note="修改AS_VIDEO_TRANSITION表字段长度">
alter table AS_VIDEO_TRANSITION modify(VIDEO_KEY VARCHAR(255));
alter table AS_VIDEO_TRANSITION modify(VIDEO_VALUE VARCHAR(255));
</sql>
</version>
<version edition="49" description="编研管理专题表添加主键">
<sql creator="zhanglongfa" createDate="20200716" note="编研管理专题表添加主键">
alter table as_compilation_topic add primary key(id);
alter table as_compilation_plan add primary key(id);
</sql>
</version>
<version edition="50" description="更新统一检索高级检索搜索模板">
<sql creator="zhanglongfa" createDate="20200717" note="添加上级可查询下级全总">
delete from AS_SEARCH_TEMPLATE where key
in('advance_search_and',
'advance_search_and_original',
'advance_search_and_original_noSearchData',
'advance_search_or',
'advance_search_or_original');
insert into "AS_SEARCH_TEMPLATE" ("ID","KEY","TEMPLATE","DESCRIPTION","PARAS","INDICES") values (181, 'advance_search_and_original', '{
"_source" : {
"excludes" : ["files.*"]
},
"query" : {
"bool" : {
"must" :{
"bool": {
"must": [
{
"bool": {
"must": {
"match_phrase": {
"idseq": {
"query": "{{idseq}}"
}
}
}
}
},
{{#toJson}}searchData{{/toJson}},
{
"nested": {
"path": "files",
"query": {
"multi_match": {
"query": "{{original}}",
"type": "best_fields"
}
}
}
}
]
}
},
"filter": [
{"term" : {"business_id": "{{businessId}}"}},
{"term" : {"lib_id": "{{libId}}"}}
]
}
},
"from" : "{{from}}",
"size" : "{{size}}",
"highlight" : {
"fields" : {
"*" : {}
}
}
}', '搜索指定档案分类,类型,以及搜索项', '{
"idseq": "109.",
"libId": "881",
"original": "测试",
"size": "10",
"businessId": "2",
"from": "0",
"searchData": [
{
"match": {
"题名": "测试归档"
}
}
]
}', 'archser');
insert into "AS_SEARCH_TEMPLATE" ("ID","KEY","TEMPLATE","DESCRIPTION","PARAS","INDICES") values (44, 'advance_search_or', '{
"_source" : {
"excludes" : ["files.*"]
},
"query" : {
"bool" : {
"must" : {
"bool":{
"must" : [
{
"bool": {
"should": {{#toJson}}searchData{{/toJson}}
}
}
]
}
},
"filter": [
{
"bool": {
"should": [
{
"prefix": {
"idseq": "109."
}
},
{
"term": {
"idseq.keyword": "109."
}
}
]
}
},
{"term" : {"business_id": "{{businessId}}"}},
{"term" : {"lib_id": "{{libId}}"}}
]
}
},
"from" : "{{from}}",
"size" : "{{size}}",
"highlight" : {
"fields" : {
"*" : {}
}
}
}
', '搜索指定档案分类,类型,以及搜索项', '{
"idseq": "109.",
"businessId": "2",
"libId": "1",
"from":"0",
"size":"100",
"searchData":[{
"match": {"保管期限": "永久"}
},{
"terms": {"年度":[2017,2018,2019]}
}]
}', 'archser');
insert into "AS_SEARCH_TEMPLATE" ("ID","KEY","TEMPLATE","DESCRIPTION","PARAS","INDICES") values (45, 'advance_search_and', '{
"_source" : {
"excludes" : ["files.*"]
},
"query" : {
"bool" : {
"must" : [
{
"bool": {
"must":{{#toJson}}searchData{{/toJson}}
}
}
],
"filter": [
{
"bool": {
"should": [
{
"prefix": {
"idseq": "109."
}
},
{
"term": {
"idseq.keyword": "109."
}
}
]
}
},
{"term" : {"business_id": "{{businessId}}"}},
{"term" : {"lib_id": "{{libId}}"}}
]
}
},
"from" : "{{from}}",
"size" : "{{size}}",
"highlight" : {
"fields" : {
"*" : {}
}
}
}', '搜索指定档案分类,类型,以及搜索项', '{
"idseq": "109.",
"businessId": "1",
"libId": "1",
"from":"0",
"size":"10",
"searchData":[{
"match":{
"保管期限":"永久"
}
},{
"terms":{
"年度": [2017,2018,2019]
}
}]
}', 'archser');
insert into "AS_SEARCH_TEMPLATE" ("ID","KEY","TEMPLATE","DESCRIPTION","PARAS","INDICES") values (368, 'advance_search_or_original', '{
"_source" : {
"excludes" : ["files.*"]
},
"query" : {
"bool" : {
"must" :{
"bool": {
"must" : [
{
"bool": {
"should": [
{{#toJson}}searchData{{/toJson}},
{
"nested": {
"path": "files",
"query": {
"multi_match": {
"query": "{{original}}",
"type": "best_fields"
}
}
}
}
]
}
}
]
}
},
"filter": [
{
"bool": {
"should": [
{
"prefix": {
"idseq": "109."
}
},
{
"term": {
"idseq.keyword": "109."
}
}
]
}
},
{"term" : {"business_id": "{{businessId}}"}},
{"term" : {"lib_id": "{{libId}}"}}
]
}
},
"from" : "{{from}}",
"size" : "{{size}}",
"highlight" : {
"fields" : {
"*" : {}
}
}
}', '搜索指定档案分类,类型,以及搜索项', '{
"idseq": "109.",
"libId": "881",
"original": "测试",
"size": "10",
"businessId": "2",
"from": "0",
"searchData": [
{
"match": {
"题名": "测试归档"
}
}
]
}', 'archser');
insert into "AS_SEARCH_TEMPLATE" ("ID","KEY","TEMPLATE","DESCRIPTION","PARAS","INDICES") values (371, 'advance_search_and_original_noSearchData', '{
"_source" : {
"excludes" : ["files.*"]
},
"query" : {
"bool" : {
"must" :{
"bool": {
"must": [
{
"nested": {
"path": "files",
"query": {
"multi_match": {
"query": "{{original}}",
"type": "best_fields"
}
}
}
}
]
}
},
"filter": [
{
"bool": {
"should": [
{
"prefix": {
"idseq": "109."
}
},
{
"term": {
"idseq.keyword": "109."
}
}
]
}
},
{"term" : {"business_id": "{{businessId}}"}},
{"term" : {"lib_id": "{{libId}}"}}
]
}
},
"from" : "{{from}}",
"size" : "{{size}}",
"highlight" : {
"fields" : {
"*" : {}
}
}
}', '搜索指定档案分类,类型,以及搜索项', '{
"idseq": "109.",
"libId": "881",
"original": "测试",
"size": "10",
"businessId": "2",
"from": "0"
}', 'archser');
</sql>
</version> </version>
<version edition="46" description="档案分类ID"> <version edition="51" description="档案分类ID">
<sql creator="guoxiaojun" createDate="20200717" note="档案分类ID"> <sql creator="guoxiaojun" createDate="20200717" note="档案分类ID">
alter table AS_IDENTIFY_TASK add CLASSIFY_ID NUMBER(9,0); alter table AS_IDENTIFY_TASK add CLASSIFY_ID NUMBER(9,0);
</sql> </sql>
</version> </version>
</update> </update>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment