Commit cfbc6ed6 authored by 陈勇's avatar 陈勇

从邮政项目抽取形成初始版本

parents
#JBolt Config Gen by jbolt
#JBolt project database config--------------------------------
dbType=oracle
dbname=ychy
jdbcUrl =jdbc:oracle:thin:@archser.com:1521:ychy
user = archser_yz
password =archser_yz
devMode =true
engineDevMode=true
#Jbolt project config--------------------------------
projectType=maven
projectName=aserver
projectPath=D:/projects//aserver
groupId=com.archser
artifactId=aserver
version=1.0
packaging=jar
packagFormat=zip
mainPkg=com.archser.aserver
jfinalConfigClassName=MainConfig
jfinalConfigClassFullName=com.archser.aserver.common.config.MainConfig
jfinalConfigClassPath=/src/main/java/com/archser/aserver/common/config/MainConfig.java
webxmlPath=/src/main/webapp/WEB-INF/web.xml
methodMain=true
injectDependency=true
useDefaultViewPath=true
baseViewPath=/
baseUploadPath=upload/temp/
baseDownloadPath=download
viewType=ViewType.JFINAL_TEMPLATE
dbplugin=DruidPlugin
canUseUnion=true
jsonFactory=MixedJsonFactory
needIndexController=true
adminRoutes=false
frontRoutes=false
apiRoutes=false
otherRoutes=
#JBolt model gen config--------------------------------
modelPackageName=com.archser.aserver.model
baseModelPackageName=com.archser.aserver.model.base
generateDaoInModel=true
generateChainSetterInBaseModel=true
generateDataDictionary=true
removedTableNamePrefixes=AS_
#server config--------------------------------
serverType=jfinalundertow
jettyPort=80
homeUrl=http://localhost
#JBolt Class gen config--------------------------------
controller_name=Controller
controller_superClass =com.jfinal.core.Controller
controller_superInterface =
model_name=
model_superClass =com.jfinal.plugin.activerecord.Model<M>
model_superInterface =
service_name=
service_superClass =
service_superInterface =
handler_name=Handler
handler_superClass =com.jfinal.handler.Handler
handler_superInterface =
interceptor_name=Interceptor
interceptor_superClass =
interceptor_superInterface =com.jfinal.aop.Interceptor
validator_name=Validator
validator_superClass =com.jfinal.validate.Validator
validator_superInterface =
\ No newline at end of file
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
.jsdtscope
/target/
/.project
/.classpath
/.settings/
FROM openjdk:8
MAINTAINER dengguoqi
COPY target/aserver-release/aserver /aserver
RUN chmod +x /aserver/start.sh
EXPOSE 11038
CMD java -Xverify:none -cp /aserver/config:/aserver/lib/* com.archser.aserver.common.config.MainConfig
\ No newline at end of file
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
<!--
assembly 打包配置更多配置可参考官司方文档:
http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html
-->
<id>release</id>
<!--
设置打包格式,可同时设置多种格式,常用格式有:dir、zip、tar、tar.gz
dir 格式便于在本地测试打包结果
zip 格式便于 windows 系统下解压运行
tar、tar.gz 格式便于 linux 系统下解压运行
-->
<formats>
<format>dir</format>
<format>zip</format>
</formats>
<!-- 打 zip 设置为 true 时,会在 zip 包中生成一个根目录,打 dir 时设置为 false 少层目录 -->
<includeBaseDirectory>true</includeBaseDirectory>
<fileSets>
<!-- src/main/resources 全部 copy 到 config 目录下 -->
<fileSet>
<directory>${basedir}/src/main/resources</directory>
<outputDirectory>config</outputDirectory>
</fileSet>
<!-- src/main/webapp 全部 copy 到 webapp 目录下 -->
<fileSet>
<directory>${basedir}/src/main/webapp</directory>
<outputDirectory>webapp</outputDirectory>
<excludes>
<exclude>WEB-INF</exclude>
<exclude>WEB-INF/web.xml</exclude>
</excludes>
</fileSet>
<!-- 项目根下面的脚本文件 copy 到根目录下 -->
<fileSet>
<directory>${basedir}</directory>
<outputDirectory></outputDirectory>
<!-- 脚本文件在 linux 下的权限设为 755,无需 chmod 可直接运行 -->
<fileMode>755</fileMode>
<includes>
<include>*.sh</include>
<include>*.bat</include>
</includes>
</fileSet>
</fileSets>
<!-- 依赖的 jar 包 copy 到 lib 目录下 -->
<dependencySets>
<dependencySet>
<outputDirectory>lib</outputDirectory>
</dependencySet>
</dependencySets>
</assembly>
\ No newline at end of file
<project xmlns="http://maven.apache.org/POM/4.0.0"
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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.archser</groupId>
<artifactId>aserver</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>aserver</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<jdk.version>1.8</jdk.version>
<junit.version>3.8.1</junit.version>
<jfinal.version>4.2</jfinal.version>
<cos.version>2017.5</cos.version>
<apachelog4j.version>2.11.1</apachelog4j.version>
<log4j.version>1.2.17</log4j.version>
<jfinalundertow.version>1.6</jfinalundertow.version>
<druid.version>1.0.29</druid.version>
<fastjson.version>1.2.55</fastjson.version>
<oracle.version>11.2.0.3</oracle.version>
<jjwt.version>0.10.6</jjwt.version>
<dubbo.version>2.7.2</dubbo.version>
<resteasy.version>4.1.1.Final</resteasy.version>
</properties>
<!-- 使用阿里 maven 库 -->
<repositories>
<repository>
<id>nexus</id>
<url>http://nexus.archser.com:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>cos</artifactId>
<version>${cos.version}</version>
</dependency>
<!-- <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId>
<version>${apachelog4j.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId> <version>${apachelog4j.version}</version>
</dependency> -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- undertow -->
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal-undertow</artifactId>
<version>${jfinalundertow.version}</version>
</dependency>
<!-- WebSocket 支持 -->
<dependency>
<groupId>io.undertow</groupId>
<artifactId>undertow-websockets-jsr</artifactId>
<version>2.0.16.Final</version>
</dependency>
<!-- 避免控制台输出如下提示信息: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
项目中实际上用不到这个 jar 包 注意:eclipse 下可以将 scope 设置为 provided -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.25</version>
<!-- 打包前改成 provided,此处使用 compile 仅为支持 IDEA -->
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>${oracle.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>${jjwt.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>${jjwt.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>${jjwt.version}</version>
</dependency>
<!-- webSocket 开始-->
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<!-- webSocket 结束-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</exclusion>
<exclusion>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 国密加密需要的依赖 -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.60</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<!-- 对接单点登录调用的依赖 -->
<dependency>
<groupId>com.spbportal.sso</groupId>
<artifactId>spbportal-ssoClient-test</artifactId>
<version>1.0</version>
</dependency>
<!--自选库 -->
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal</artifactId>
<version>${jfinal.version}</version>
</dependency>
<dependency>
<groupId>dm.jdbc</groupId>
<artifactId>DmJdbcDriver17</artifactId>
<version>8.1.1.30</version>
</dependency>
<dependency>
<groupId>org.jdom</groupId>
<artifactId>jdom</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
<build>
<finalName>aserver</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
<!-- java8 保留参数名编译参数 -->
<compilerArgument>-parameters</compilerArgument>
<compilerArguments>
<verbose />
</compilerArguments>
</configuration>
</plugin>
<!-- jar 包中的配置文件优先级高于 config 目录下的 "同名文件" 因此,打包时需要排除掉 jar 包中来自 src/main/resources
目录的 配置文件,否则部署时 config 目录中的同名配置文件不会生效 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<excludes>
<exclude>*.txt</exclude>
<exclude>*.xml</exclude>
<exclude>*.properties</exclude>
</excludes>
</configuration>
</plugin>
<!-- 使用 mvn clean package 打包 更多配置可参考官司方文档:http://maven.apache.org/plugins/maven-assembly-plugin/single-mojo.html -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<!-- 打包生成的文件名 -->
<finalName>${project.artifactId}</finalName>
<!-- jar 等压缩文件在被打包进入 zip、tar.gz 时是否压缩,设置为 false 可加快打包速度 -->
<recompressZippedFiles>false</recompressZippedFiles>
<!-- 打包生成的文件是否要追加 release.xml 中定义的 id 值 -->
<appendAssemblyId>true</appendAssemblyId>
<!-- 指向打包描述文件 package.xml -->
<descriptors>
<descriptor>package.xml</descriptor>
</descriptors>
<!-- 打包结果输出的基础目录 -->
<outputDirectory>${project.build.directory}/</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
#!/bin/bash
# ---------------------------------------------------------------------------
#
# 使用说明:
#
# 1: 本脚本仅仅通过调用 stop.sh 与 start.sh 实现重启
#
# 2:要特别注意 stop.sh 脚本中有关 MAIN_CLASS 配置的注意事项,
# 只有先确保 stop.sh 可以正常工作时才能使用该脚本
#
# ---------------------------------------------------------------------------
# 得到基础路径
APP_BASE_PATH=$(cd `dirname $0`; pwd)
${APP_BASE_PATH}/stop.sh && ${APP_BASE_PATH}/start.sh
package com.archser.aserver.common.config;
import com.alibaba.druid.filter.stat.StatFilter;
import com.archser.aserver.controller.BugController;
import com.archser.aserver.controller.IndexController;
import com.archser.aserver.controller.KeyController;
import com.archser.aserver.controller.MediumController;
import com.archser.aserver.controller.MenuController;
import com.archser.aserver.controller.MessageController;
import com.archser.aserver.controller.SettingController;
import com.archser.aserver.controller.SystemController;
import com.archser.aserver.controller.UserController;
import com.archser.aserver.interceptor.JwtInterceptor;
import com.archser.aserver.model._MappingKit;
import com.archser.aserver.service.DBService;
import com.archser.aserver.websocket.MessageWebSocket;
import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.ext.handler.UrlSkipHandler;
import com.jfinal.json.MixedJsonFactory;
import com.jfinal.kit.PathKit;
import com.jfinal.kit.Prop;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.CaseInsensitiveContainerFactory;
import com.jfinal.plugin.activerecord.dialect.OracleDialect;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.render.ViewType;
import com.jfinal.server.undertow.UndertowServer;
import com.jfinal.server.undertow.WebBuilder;
import com.jfinal.template.Engine;
public class MainConfig extends JFinalConfig {
/**
* 将全局配置提出来 方便其他地方重用
*/
private static Prop p;
/**
* 配置JFinal常量
*/
@Override
public void configConstant(Constants me) {
// 读取数据库配置文件
loadConfig();
// 设置当前是否为开发模式
me.setDevMode(p.getBoolean("devMode"));
// 设置默认上传文件保存路径 getFile等使用
me.setBaseUploadPath("upload/temp/");
// 设置上传最大限制尺寸
// me.setMaxPostSize(1024*1024*10);
// 设置默认下载文件路径 renderFile使用
me.setBaseDownloadPath("download");
// 设置默认视图类型
me.setViewType(ViewType.JFINAL_TEMPLATE);
// 设置404渲染视图
// me.setError404View("404.html");
// 设置json工厂
me.setJsonFactory(MixedJsonFactory.me());
// 设置启用依赖注入
me.setInjectDependency(true);
}
/**
* 配置项目路由 路由拆分到 FrontRutes 与 AdminRoutes 之中配置的好处: 1:可分别配置不同的 baseViewPath 与 Interceptor
* 2:避免多人协同开发时,频繁修改此文件带来的版本冲突 3:避免本文件中内容过多,拆分后可读性增强 4:便于分模块管理路由
*/
@Override
public void configRoute(Routes me) {
// 推荐拆分方式 如果需要就解开注释 创建对应的 Routes
// me.add(new WechatRoutes());//配置微信端访问路由
// 普通不拆分的方式配置 如下
// 设置默认访问首页路由 可使用http://localhost:port 直接访问 如果80端口 port可以省略
me.add("/", IndexController.class);
me.add("/setting", SettingController.class);
me.add("/user", UserController.class);
me.add("/message", MessageController.class);
me.add("/menu", MenuController.class);
me.add("/key", KeyController.class);
me.add("/system", SystemController.class);
me.add("/bug", BugController.class);
me.add("/medium",MediumController.class);
}
// 先加载开发环境配置,再追加生产环境的少量配置覆盖掉开发环境配置
static void loadConfig() {
if (p == null) {
p = PropKit.use("config.properties").appendIfExists("config-pro.properties");
}
}
/**
* 获取数据库插件 抽取成独立的方法,便于重用该方法,减少代码冗余
*/
public static DruidPlugin getDruidPlugin() {
loadConfig();
return new DruidPlugin(p.get("jdbcUrl"), p.get("user"), p.get("password"), p.get("jdbc.driver"));
}
/**
* 配置JFinal插件 数据库连接池 ActiveRecordPlugin 缓存 定时任务 自定义插件
*/
@Override
public void configPlugin(Plugins me) {
loadConfig();
// 配置数据库连接池插件
DruidPlugin dbPlugin = getDruidPlugin();
dbPlugin.addFilter(new StatFilter()); // 添加 StatFilter 才会有统计数据
// 数据映射 配置ActiveRecord插件
ActiveRecordPlugin arp = new ActiveRecordPlugin(dbPlugin);
arp.setShowSql(p.getBoolean("devMode"));
arp.setContainerFactory(new CaseInsensitiveContainerFactory(true));
arp.setDialect(new OracleDialect());
arp.addSqlTemplate("oracle.sql");
/******** 在此添加数据库 表-Model 映射 *********/
// 如果使用了JFinal Model 生成器 生成了BaseModel 把下面注释解开即可
_MappingKit.mapping(arp);
// 添加到插件列表中
me.add(dbPlugin);
me.add(arp);
}
/**
* 配置全局拦截器
*/
@Override
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 onStart() {
String dbType=p.get("dbType");
if(dbType==null || "".equals(dbType.trim())) {
System.out.println("数据库配置文件中dbType不能为空值");
return;
}
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的时候才用
// 配置共享函数模板
// me.addSharedFunction("/view/common/layout.html")
}
public static void main(String[] args) {
UndertowServer.create(MainConfig.class, "undertow.properties").configWeb(builder -> {
addWebSocket(builder);
}) .start();
}
/**
* 添加websocket
* @param builder
*/
public static void addWebSocket(WebBuilder builder) {
loadConfig();
if(p.getBoolean("openMessageWebSocket") != null && p.getBoolean("openMessageWebSocket") ) {
addMessageWebSocket(builder);
}
}
/**
* 添加消息中心的websocket
* @param builder
*/
public static void addMessageWebSocket(WebBuilder builder) {
builder.addWebSocketEndpoint(MessageWebSocket.class);
}
}
package com.archser.aserver.controller;
import java.util.Calendar;
import java.util.Date;
import com.archser.aserver.model.Log;
import com.archser.aserver.model.User;
import com.jfinal.aop.Before;
import com.jfinal.core.Controller;
import com.jfinal.ext.kit.DateKit;
import com.jfinal.kit.Kv;
import com.jfinal.kit.Ret;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.Record;
import com.jfinal.plugin.activerecord.tx.Tx;
/**
* 异常错误相关路由
*
* @author dgq
*
*/
public class BugController extends Controller {
/**
* 保存日志
*
* @param log
*/
@Before(Tx.class)
public void save(Log log) {
Record user = Db.findFirst(Db.getSql("getUserId"),this.getAttrForStr("username"));
log.set("ID", Log.SEQ_NEXTVAL);
log.setCreateTime(new Date());
log.setUserId(user.getInt("id"));
boolean success = log.save();
if (success) {
this.renderJson(Ret.ok("log", log));
} else {
this.renderJson(Ret.fail("msg", "保存日志失败"));
}
}
/**
* 分页调试日志信息
*
* @param page
* @param size
*/
public void page(int pageNumber, int pageSize, String range, String q) {
String condition = "";
if (StrKit.notBlank(q)) {
condition = "(lower(USERNAME) like lower('%" + q + "%') or lower(CONTENT) like lower('%" + q + "%'))";
} else {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
switch (range) {
case "1M":
calendar.add(Calendar.MONTH, -1);
break;
case "3M":
calendar.add(Calendar.MONTH, -3);
break;
case "6M":
calendar.add(Calendar.MONTH, -6);
break;
}
String time = DateKit.toStr(calendar.getTime(), DateKit.timeStampPattern);
condition = "CREATE_TIME > to_date('" + time + "','yyyy-mm-dd hh24:mi:ss')";
}
Page<User> page =
User.dao.template("getLogs", Kv.by("condition", condition)).paginate(pageNumber, pageSize);
this.renderJson(Ret.ok("list", page.getList()).set("pageNumber", page.getPageNumber())
.set("pageSize", page.getPageSize()).set("totalPage", page.getTotalPage())
.set("totalRow", page.getTotalRow()));
}
}
package com.archser.aserver.controller;
import java.math.BigInteger;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;
import org.bouncycastle.crypto.InvalidCipherTextException;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import com.alibaba.fastjson.JSON;
import com.archser.aserver.interceptor.JwtInterceptor;
import com.archser.aserver.model.System;
import com.archser.aserver.model.User;
import com.archser.aserver.service.LogService;
import com.archser.aserver.service.UserService;
import com.archser.aserver.util.CollectionUtil;
import com.archser.aserver.util.HttpRequestUtil;
import com.archser.aserver.util.KeysUtil;
import com.archser.aserver.util.gm.BCECUtil;
import com.archser.aserver.util.gm.SM2Util;
import com.jfinal.aop.Clear;
import com.jfinal.aop.Inject;
import com.jfinal.core.Controller;
import com.jfinal.kit.HashKit;
import com.jfinal.kit.Kv;
import com.jfinal.kit.PropKit;
import com.jfinal.kit.Ret;
import com.jfinal.kit.StrKit;
import com.jfinal.log.Log;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
import com.spbportal.sso.SsoToken;
import io.jsonwebtoken.JwsHeader;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
/**
* IndexController 指向系统访问首页
*
* @author jbolt.cn
* @email 909854136@qq.com
* @date 2018年11月4日 下午9:02:52
*/
public class IndexController extends Controller {
/**
* 登陆用户名,密码解密
*/
public static final String PRIVATE_KEY_D = "38627fffe8003e6d2faa76d4eae2f74fd9cd7be257ab36c356c4f01bbc17e41d";
public static final ECPrivateKeyParameters USER_PRIVATE_KEY = BCECUtil.createECPrivateKeyParameters(
new BigInteger(ByteUtils.fromHexString(PRIVATE_KEY_D)), SM2Util.DOMAIN_PARAMS);
private static Log log = Log.getLog(IndexController.class);
/**
* 超期时间:24小时,即:24 * 60 * 60 * 1000
*/
private static int EXPIRATION = 24 * 60 * 60 * 1000;
private static int permitLoginTimes = 5;// 允许登陆次数
private static int hour = 2; // 两小时内不可登录
@Inject
private LogService logService;
@Inject
private UserService userService;
/**
* 首页Action
*/
public void index() {
render("index.html");
}
/**
* 修改密码
*/
public void updatePassword() {
String username = this.getPara("username");
String password = this.getPara("newPwd");
password = HashKit.sha256(password);
int a = userService.updatePwd(password, username);
if (a == 0) {
this.renderJson(Ret.fail("msg", "修改失败"));
logService.saveAsLog("operate", username, JwtInterceptor.getIpAddr(getRequest()),
username + "修改密码操作:修改密码失败", "aserver");
return;
}
this.renderJson(Ret.ok("msg", "修改成功"));
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)));
}
/**
* 登录验证
*/
@Clear(JwtInterceptor.class)
// @Before(LoginValidator.class)
public void login() {
String app = this.getPara("app");
String username = this.getPara("username");
String password = this.getPara("password");
String callback = this.getPara("callback");
// 解密用户名和密码
try {
username = decrypt(username);
password = decrypt(password);
} catch (Exception e1) {
e1.printStackTrace();
username = this.getPara("username");
password = this.getPara("password");
}
password = HashKit.sha256(password);
java.lang.System.out.println("Login: " + username);
User user = User.dao.template("getUser", username).findFirst();
if (user == null) {
this.renderJson(Ret.fail("msg", "用户名或密码不存在: " + username));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "该用户非本系统用户正在非法登录", app);
return;
}
// 一旦开启三员 admin用户不能使用
if ("admin".equals(user.getUsername())) {
Integer userCount = Db.queryInt(Db.getSql("hasThreeMemberUsersCount"));
boolean isExistThreeMemberUsers = userCount == null ? false : (userCount.intValue() > 0 ? true : false);
if (isExistThreeMemberUsers) {
this.renderJson(Ret.fail("msg", "已开启三员管理,admin失效了。"));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:已开启三员管理", app);
return;
}
}
if (Integer.valueOf(user.getLocked()) == 1) {
this.renderJson(Ret.fail("msg", "当前账户已被锁定"));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:该用户已被锁定", app);
return;
}
if (!password.equals(user.getPassword())) {
if (this.checkErrorCount(user)) {
this.renderJson(Ret.fail("msg", "您的错误次数已达5次以上,请稍后再试!"));
return;
} else {
int errorCount = permitLoginTimes - (user.getErrorcount() == null ? 0 : user.getErrorcount()) - 1;
if (user.getErrorcount() == 4) {
this.renderJson(Ret.fail("msg", "用户名或密码验证失败,您的账户于两小时后才可登录!"));
return;
} else {
this.renderJson(Ret.fail("msg", "用户名或密码验证失败,您还有" + errorCount + "次机会!"));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:密码验证错误",
app);
return;
}
}
}
Integer errorcount = user.getErrorcount();
if (errorcount != null && errorcount != 0) {
if (!this.checkWhenPwdOk(user)) {
Date date = new Date();
long hour1 = 2 * 60 * 60;
long begin = date.getTime();
long end = user.getLastLoginTime().getTime();
long between = (begin - end) / 1000;
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 + "秒才可登录!"));
return;
}
}
}
if (!"admin".equals(user.getUsername())) {
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", "拥有的角色全部被锁定,不能登录系统了。"));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:该用户拥有的角色全部被锁定",
app);
return;
}
}
System system = System.dao.template("getSystemPrivatekey", app).findFirst();
if (system == null) {
this.renderJson(Ret.fail("msg", "没有找到应用:" + app));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:没有找到应用" + app,
app);
return;
}
if (StrKit.isBlank(system.getPrivatekey()) || StrKit.isBlank(system.getKeyid())) {
this.renderJson(Ret.fail("msg", "没有找到应用的密钥:" + app));
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() + "系统"));
// logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:您没有权限登录此系统" + app,
// app);
// return;
// }
List<System> systemList = userService.findSystemWithUserPermission(user.getId());
/** 修改如果登陆用户为admin用户则直接登陆 huwenbin 2020/5/20 start*/
if (!"admin".equals(user.getUsername())) {
if ((systemList == null || systemList.isEmpty())) {
this.renderJson(Ret.fail("msg", "您没有权限登录" + system.getTitle() + "系统"));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:您没有权限登录此系统" + app,
app);
return;
}
Optional<System> systemOptional = userService.getSystemByName(app, systemList);
if (!systemOptional.isPresent()) {// 没有当前系统的权限
system = systemList.get(0);
app = system.getName();
callback = system.getUrl();
}
}
/** 修改如果登陆用户为admin用户则直接登陆 huwenbin 2020/5/20 end */
try {
String jws = Jwts.builder()
// 设置密匙ID
.setHeaderParam(JwsHeader.KEY_ID, system.getKeyid())
// 赋予应用
.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();
if (errorcount != null && errorcount != 0) {
this.setErrZero(user);
}
this.renderJson(Ret.ok("token", jws).set("callback", callback));
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);
}
}
// 密码正确时错误次数清零
private void setErrZero(User user) {
Db.update(Db.getSqlPara("updateForOk", Kv.by("id", user.getId())));
}
//密码错误时判断错误次数是否为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));
int currentNum = 0;
for (Record record : currentList) {
currentNum = Integer.parseInt(record.get("flag").toString());
}
if (currentNum >= permitLoginTimes) {
return true;
}else {
//执行+1或=1的操作
Db.update(Db.getSqlPara("updateForErr",cond));
return false;
}
}
//密码正确时判断次数和锁定时间是否在指定范围内
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) {
return true;
}
for (Record record : currentList) {
currentNum = Integer.parseInt(record.get("flag").toString());
}
if(currentNum >= permitLoginTimes) {
return false;
}else {
return true;
}
}
/**
* 通过门户系统单点登录
*
* @author Guo XJ
* @date 2019-12-13 15:08:00
*/
public void ssoByPortalSystem() {
try {
//获取app
String app = getPara("app",null);
if(app == null) {
renderJson(Ret.fail("msg","获取服务信息失败"));
return ;
}
//获取到门户系统的Token
String ssotoken = getPara("ssotoken");
//获取到personCode(用户唯一标识)
SsoToken st = new SsoToken();
st.initialise(ssotoken);
String personCode = st.getTokenId();
//获取用户
Record user = userService.getUserInfoByPersonCode(personCode);
System system = System.dao.template("getSystemPrivatekey", app).findFirst();
if(system == null) {
renderJson(Ret.fail("msg","获取服务信息失败"));
return ;
}
//判断用户是否存在
if(user != null && user.getStr("username") != null) {
String jws = Jwts.builder()
// 设置密匙ID
.setHeaderParam(JwsHeader.KEY_ID, system.getKeyid())
// 赋予应用
.setSubject(app)
// 签发时间
.setIssuedAt(new Date())
// 超期时间
.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();
this.renderJson(Ret.ok("token", jws));
return;
}else {
this.renderJson(Ret.fail("msg","没有找到当前用户"));
return;
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
this.renderJson(Ret.fail("msg","登录出错!"));
}
}
/**
* 根据邮政门户传回的code 获取用户信息
*
* @Title: getUserInfoForH5
* @author LDC
* @date 2019-11-19 03:22:34
*/
@Clear
public void getUserInfoForH5() {
String code = getPara("code", null);
if (code == null) {
renderJson(Ret.fail("msg", "获取用户信息失败"));
return;
}
String app = getPara("app", null);
if (app == null) {
renderJson(Ret.fail("msg", "获取服务信息失败"));
return;
}
Map<String, String> paramMap = new LinkedHashMap<String, String>();
paramMap.put("client_id", "MmEepJkH7Hiz7EtS");
paramMap.put("code", code);
paramMap.put("state", "1");
paramMap.put("grant_type", "authorization_code");
paramMap.put("scope", "scope");
paramMap.put("redirect_uri", PropKit.get("redirect_uri"));
Iterator<Entry<String, String>> entrySet = paramMap.entrySet().iterator();
StringBuilder builder = new StringBuilder();
while (entrySet.hasNext()) {
Entry<String, String> next = entrySet.next();
builder.append(next.getKey()).append("=").append(next.getValue()).append("&");
}
String param = builder.deleteCharAt(builder.length() - 1).toString();
String result = HttpRequestUtil.sendPost(PropKit.get("authUrl"), param);
Kv parseObject = JSON.parseObject(result, Kv.class);
Object access_token = parseObject.get("access_token");
if (access_token == null) {
renderJson(Ret.fail("msg", "获取授权失败,请重新登录"));
return;
}
String sendPost = HttpRequestUtil.sendPost(PropKit.get("userInfoUrl"),
"access_token=" + access_token.toString());
Kv userObj = JSON.parseObject(sendPost, Kv.class);
Object uuid = userObj.get("uuid");
if (uuid == null) {
renderJson(Ret.fail("msg", "获取用户信息失败"));
return;
}
System system = System.dao.template("getSystemPrivatekey", app).findFirst();
if (system == null) {
renderJson(Ret.fail("msg", "获取服务信息失败"));
return;
}
Record userInfo = Db.findById("AS_USER", "UUID", uuid.toString());
if (userInfo == null) {
renderJson(Ret.fail("msg", "没有找到当前用户"));
return;
}
String userName = userInfo.getStr("USERNAME");
if (userName == null) {
renderJson(Ret.fail("msg", "获取用户名失败"));
return;
}
try {
String jws = Jwts.builder()
// 设置密匙ID
.setHeaderParam(JwsHeader.KEY_ID, system.getKeyid())
// 赋予应用
.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);
}
}
}
package com.archser.aserver.controller;
import com.archser.aserver.util.KeysUtil;
import com.jfinal.core.Controller;
/**
* 密钥操作
*
* @author dgq
*
*/
public class KeyController extends Controller {
/**
* 创建密钥对
*/
public void create() {
this.renderJson(KeysUtil.keypair());
}
}
package com.archser.aserver.controller;
import com.archser.aserver.util.GetDiskSpaceUtil;
import com.jfinal.aop.Clear;
import com.jfinal.core.Controller;
/*
* 介质预警接口
* */
public class MediumController extends Controller {
@Clear // 接口-获取服务器的剩余磁盘空间
public void getFreeSpaceOfDriver() throws Exception {
Integer freeSpace = GetDiskSpaceUtil.getFreeSpaceOfDriver();
renderJson("freeSpace", freeSpace);
}
}
package com.archser.aserver.controller;
import java.util.ArrayList;
import java.util.List;
import com.archser.aserver.interceptor.JwtInterceptor;
import com.archser.aserver.model.Menu;
import com.archser.aserver.model.MenuStar;
import com.archser.aserver.model.System;
import com.archser.aserver.service.LogService;
import com.archser.aserver.service.MenuService;
import com.archser.aserver.util.CollectionUtil;
import com.jfinal.aop.Inject;
import com.jfinal.core.Controller;
import com.jfinal.kit.Kv;
import com.jfinal.kit.Ret;
import com.jfinal.plugin.activerecord.Db;
/**
* 应用菜单相关操作
*
* @author dgq
*
*/
public class MenuController extends Controller {
@Inject
private LogService logService;
@Inject
private MenuService menuService;
/**
* 获取权限菜单
*/
public void index() {
String username = this.getAttrForStr("username");
Integer userId = Db.queryInt(Db.getSql("getUserId"), username);
List<System> systems = System.dao.template("getSystems").find();
Kv kvSystems = CollectionUtil.toIntMap(systems, "ID");
List<Menu> menus = null;
if ("admin".equals(username)) {
menus = Menu.dao.template("getMenus").find();
} else {
menus = Menu.dao.template("getMenusByUser", Kv.by("userId", userId)).find();
}
List<MenuStar> stars = MenuStar.dao.template("getMenuStar", userId).find();
for (Menu menu : menus) {
System system = (System) kvSystems.get(menu.getSystemId());
if (system != null) {
menu.put("system", system.getName());
menu.put("url", system.getUrl());
menu.put("star", exist(menu.getId(), stars));
List<Menu> abilities = system.get("menus", new ArrayList<Menu>());
abilities.add(menu);
system.put("menus", abilities);
}
}
this.renderJson(Ret.ok("apps", systems));
}
/**
* 获取菜单列表
*/
public void getMenuList() {
try {
Integer sysId = getParaToInt("sysId");
String condStr = getPara("condStr");
renderJson(Ret.ok("data", menuService.getMenuListBySysId(sysId, condStr)));
} catch (Exception e) {
e.printStackTrace();
renderJson(Ret.fail("msg", "获取菜单列表出错,请刷新后重试!"));
}
}
/**
* 保存菜单数据
*/
public void saveMenuData() {
try {
Menu menu = getBean(Menu.class, "menu");
boolean state = menuService.saveMenuData(menu);
renderJson(Ret.ok("msg", state?"保存菜单数据成功!":"保存菜单数据出错,请刷新后重试!"));
} catch (Exception e) {
e.printStackTrace();
renderJson(Ret.fail("msg", "保存菜单数据出错,请刷新后重试!"));
}
}
/**
* 删除菜单数据
*/
public void deleteMenu() {
try {
String[] ids = getPara("ids").split(",");
boolean state = menuService.deleteMenu(ids);
renderJson(Ret.ok("msg", state?"删除菜单数据成功!":"删除菜单数据出错!"));
} catch (Exception e) {
e.printStackTrace();
renderJson(Ret.fail("msg", "删除菜单数据出错,请刷新后重试!"));
}
}
/**
* 菜单加星
*
* @param menuId
*/
public void star(int menuId) {
String username = this.getAttrForStr("username");
Integer userId = Db.queryInt(Db.getSql("getUserId"), username);
MenuStar star = new MenuStar();
star.setMenuId(menuId);
star.setUserId(userId);
star.set("ID", "SEQ_MENU_STAR.nextval");
Menu MeunStr = Menu.dao.findById(menuId);
System systemStr = System.dao.findById(MeunStr.getSystemId());
if (star.save()) {
this.renderJson(Ret.ok("star", star.getId()));
logService.saveAsLog("operate", username, JwtInterceptor.getIpAddr(getRequest()),
MeunStr.getTitle() + "-菜单加星成功", systemStr.getName());
} else {
this.renderJson(Ret.fail("msg", "菜单加星操作失败"));
logService.saveAsLog("operate", username, JwtInterceptor.getIpAddr(getRequest()),
MeunStr.getTitle() + "-菜单加星失败", systemStr.getName());
}
}
/**
* 取消菜单加星
*
* @param menuId
*/
@SuppressWarnings("unused")
public void cancelStar(int menuId) {
String username = this.getAttrForStr("username");
String app = this.getPara("app");
Integer userId = Db.queryInt(Db.getSql("getUserId"), username);
Menu MeunStr = Menu.dao.findById(menuId);
System systemStr = System.dao.findById(MeunStr.getSystemId());
Db.update(Db.getSqlPara("deleteMenuStar", Kv.by("userId", userId).set("menuId", menuId)));
this.renderJson(Ret.ok("star", 0));
logService.saveAsLog("operate", username, JwtInterceptor.getIpAddr(getRequest()),
MeunStr.getTitle() + "-菜单取消加星成功", systemStr.getName());
}
/**
* 菜单是否加星
*
* @param menuId
* @param stars
* @return
*/
private Integer exist(Integer menuId, List<MenuStar> stars) {
for (MenuStar star : stars) {
if (menuId.intValue() == star.getMenuId().intValue()) {
return star.getId();
}
}
return 0;
}
public void accessLog() {
String routName = getPara("routname");
String app = getPara("app");
String title = Db.queryStr(Db.getSql("findSystemTitleByType"), app);
String username = getAttr("username");
String ip = JwtInterceptor.getIpAddr(getRequest());
String content = title + "-功能访问-" + routName;
logService.saveAsLog("access", username, ip, content, app);
renderJson(Ret.ok());
}
}
package com.archser.aserver.controller;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import com.alibaba.fastjson.JSON;
import com.archser.aserver.interceptor.JwtInterceptor;
import com.archser.aserver.model.Message;
import com.archser.aserver.service.LogService;
import com.archser.aserver.service.MessageService;
import com.archser.aserver.websocket.MessageRefreshTrigger;
import com.jfinal.aop.Clear;
import com.jfinal.aop.Inject;
import com.jfinal.core.Controller;
import com.jfinal.kit.Ret;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.Page;
/**
* 消息相关
*
* @author dgq
*
*/
public class MessageController extends Controller {
@Inject
LogService logService;
@Inject
MessageService messageService;
private static final Logger logger = Logger.getLogger(MessageController.class);
/**
* 获取未读消息数量
*/
public void count() {
String username = this.getAttr("username");
Long count = messageService.getCountByRead(null, username);
this.renderJson(Ret.ok("count", count));
}
/**
* menu unread:未读,readed:已读,其他;查询所有
*/
public void getMessagePageData() {
int pageNumber = this.getParaToInt("pageNumber");
int pageSize = this.getParaToInt("pageSize");
String username = this.getAttr("username");
String menu = this.getPara("menu");
Page<Message> page = messageService.getMessagePageData(pageNumber, pageSize, username, menu);
if (page != null) {
renderJson(Ret.ok("page", page));
} else {
renderJson(Ret.fail("msg", "获取消息列表失败"));
}
}
/**
* 标记为已读
*/
public void markRead() {
int id = this.getParaToInt("id");
boolean markRead = this.messageService.markRead(id);
renderJson(markRead ? Ret.ok(): Ret.fail());
}
/**
* 删除消息
*/
public void deleteMessage() {
String ids = this.getPara("ids");
if (ids.length() == 0) {
renderJson(Ret.fail());
}
boolean deleted = this.messageService.deleteMessage(ids.split(","));
if (deleted) {
renderJson(Ret.ok());
logService.saveAsLog("operate", getAttr("username"), JwtInterceptor.getIpAddr(getRequest()),
"个人首页-消息中心-删除消息-" + "-已删除了"+ids.split(",").length+"个消息","aserver");
}else {
renderJson(Ret.fail());
logService.saveAsLog("operate", getAttr("username"), JwtInterceptor.getIpAddr(getRequest()),
"个人首页-消息中心-删除消息-删除消息失败","aserver");
}
}
/**
* 根据指定用户更新websocket的消息
*/
@Clear(JwtInterceptor.class)
public void refreshMessage() {
try {
String userId = this.getPara("userId");
if (StrKit.isBlank(userId)) {
userId = IOUtils.toString(this.getRequest().getInputStream());
userId = JSON.parseObject(userId).getString("userId");
}
logger.error("接受到消息刷新" + userId);
if (StrKit.notBlank(userId)) {
boolean refrashed = MessageRefreshTrigger.refresh(userId);
renderJson(Ret.ok("refrashed", refrashed));
} else {
renderJson(Ret.fail("msg", "userId为null或userId不是一个数字"));
}
} catch (Exception e) {
logger.error("刷新消息出错", e);
renderJson(Ret.fail("msg", "刷新消息出错"));
}
}
}
package com.archser.aserver.controller;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Objects;
import com.archser.aserver.model.Config;
import com.archser.aserver.service.SystemService;
import com.archser.aserver.validator.SettingValidator;
import com.jfinal.aop.Before;
import com.jfinal.aop.Clear;
import com.jfinal.aop.Inject;
import com.jfinal.core.Controller;
import com.jfinal.kit.PathKit;
import com.jfinal.kit.Ret;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.tx.Tx;
import sun.misc.BASE64Encoder;
/**
* 应用全局设置
*
* @author dgq
*
*/
@SuppressWarnings("restriction")
public class SettingController extends Controller {
/**
* 通用的获取配置方法
*
* @param name
*/
@Before(SettingValidator.class)
public void index(String name) {
String val = null;
try {
val = this.getConfig(name);
} catch (Exception e) {
this.renderJson(Ret.fail("msg", e.getMessage()));
}
this.renderJson(Ret.ok(name, val));
}
/**
* 获取所有配置
*/
public void all() {
this.renderJson(Ret.ok("configs", Config.dao.findAll()));
}
@Inject
private SystemService systemService;
/**
*
*/
public void findConfigList() {
String searchText = this.getPara("searchText");
List<Config> configs = systemService.findConfigList(searchText);
this.renderJson(Ret.ok("configs", configs));
}
/**
* 获取单点登录地址<br>
* 常用配置项
*/
@Clear
// @Before(UnifiedErrorInterceptor.class)
public void sso() {
String val = null;
try {
val = this.getConfig("sso");
} catch (Exception e) {
this.renderJson(Ret.fail("msg", e.getMessage()));
}
this.renderJson(Ret.ok("sso", val));
}
/**
* 获取设置信息<br>
* 常用配置项
*/
public void search() {
String val = null;
try {
val = this.getConfig("search");
} catch (Exception e) {
this.renderJson(Ret.fail("msg", e.getMessage()));
}
this.renderJson(Ret.ok("search", val));
}
/**
* 获取设置信息<br>
* 常用配置项
*/
public void logoUrl() {
String filePath = PathKit.getWebRootPath() + File.separator + "logo" + File.separator + "logo.png";
this.renderJson(Ret.ok("logoUrl", ImageToBase64(filePath)));
}
private static String ImageToBase64(String imgPath) {
byte[] data = null;
// 读取图片字节数组
try {
InputStream in = new FileInputStream(imgPath);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
// 对字节数组Base64编码
BASE64Encoder encoder = new BASE64Encoder();
// 返回Base64编码过的字节数组字符串
return encoder.encode(Objects.requireNonNull(data));
// System.out.println("本地图片转换Base64:" + encoder.encode(Objects.requireNonNull(data)));
}
// public void logoUrl() {
// String val = null;
// try {
// val = this.getConfig("logoUrl");
// } catch (Exception e) {
// this.renderJson(Ret.fail("msg", e.getMessage()));
// }
// this.renderJson(Ret.ok("logoUrl", val));
// }
public void getServerName() {
String val = null;
try {
val = this.getConfig("serverName");
} catch (Exception e) {
this.renderJson(Ret.fail("msg", e.getMessage()));
}
this.renderJson(Ret.ok("serverName", val));
}
/**
* 获取配置项目
*
* @param name
* @return
* @throws Exception
*/
private String getConfig(String name) throws Exception {
String val = Db.queryStr(Db.getSql("getConfigByName"), name);
if (val == null) {
throw new Exception("配置项不存在(name='" + name + "')");
}
return val;
}
/**
* @used 添加修改配置
*/
@Before(Tx.class)
public void add() {
Config config = getModel(Config.class, "", true);
if (config == null) {
renderJson(Ret.fail("msg", "请填写完整数据"));
} else if (config.getId() == null || config.getId() == 0) {
config.set("ID", Config.SEQ_NEXTVAL);
config.save();
renderJson(Ret.ok("ok", "添加成功"));
} else if (config.getId() != 0) {
config.update();
renderJson(Ret.ok("ok", "修改成功"));
}
}
/**
* @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;
for (String id : idsArray) {
Config config = new Config();
config.setId(Integer.valueOf(id));
success = config.delete();
}
if (success) {
renderJson(Ret.ok());
} else {
renderJson(Ret.fail("msg", "删除数据出错"));
}
}
}
package com.archser.aserver.controller;
import java.util.List;
import com.archser.aserver.interceptor.JwtInterceptor;
import com.archser.aserver.model.System;
import com.archser.aserver.service.LogService;
import com.archser.aserver.service.SystemService;
import com.jfinal.aop.Before;
import com.jfinal.aop.Clear;
import com.jfinal.aop.Inject;
import com.jfinal.core.Controller;
import com.jfinal.kit.Ret;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.tx.Tx;
/**
* 应用相关
*
* @author dgq
*
*/
public class SystemController extends Controller {
@Inject
private LogService logService;
@Inject
private SystemService systemService;
/**
* 所有系统
*/
public void index() {
String searchText = this.getPara("searchText");
List<System> systems = systemService.findList(searchText);
this.renderJson(Ret.ok("systems", systems));
}
/**
* @used添加修改
*/
@Before(Tx.class)
public void addorEdit() {
System system = getModel(System.class, "", true);
if (system == null) {
renderJson(Ret.fail("msg", "请填写完整数据"));
} else if (system.getId() == null || system.getId() == 0) {
system.set("ID", System.SEQ_NEXTVAL);
system.save();
renderJson(Ret.ok("ok", "添加成功"));
logService.saveAsLog("operate", getAttr("username"), JwtInterceptor.getIpAddr(getRequest()),
"添加-" + system.getName() + "-系统模块成功", "aserver");
} else if (system.getId() != 0) {
system.update();
renderJson(Ret.ok("ok", "修改成功"));
logService.saveAsLog("operate", getAttr("username"), JwtInterceptor.getIpAddr(getRequest()),
"修改-" + system.getName() + "-系统模块成功", "aserver");
}
}
/**
* @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;
String systemName = null;
for (String id : idsArray) {
System system = new System();
system.setId(Integer.valueOf(id));
systemName = system.findById(id).getName();
success = system.delete();
}
if (success) {
renderJson(Ret.ok());
logService.saveAsLog("operate", getAttr("username"), JwtInterceptor.getIpAddr(getRequest()),
"删除" + systemName, "aserver");
} else {
renderJson(Ret.fail("msg", "删除数据出错"));
logService.saveAsLog("operate", getAttr("username"), JwtInterceptor.getIpAddr(getRequest()), "删除系统模块数据失败",
"aserver");
}
}
/**
* 获取私钥
*/
public void privatekey() {
String keyId = this.getPara("keyid");
if (StrKit.isBlank(keyId)) {
this.renderJson(Ret.fail("msg", "参数不能为空"));
return;
}
System system = System.dao.findFirst("select privatekey from as_system where keyid=?", keyId);
if (system == null) {
this.renderJson(Ret.fail("msg", "参数不正确"));
} else {
this.renderJson(Ret.ok("privatekey", system.getPrivatekey()));
}
}
/**
* 获取公钥
*/
@Clear(JwtInterceptor.class)
public void publickey() {
String keyId = this.getPara("keyid");
if (StrKit.isBlank(keyId)) {
this.renderJson(Ret.fail("msg", "参数不能为空"));
return;
}
System system = System.dao.findFirst("select publickey from as_system where keyid=?", keyId);
if (system == null) {
this.renderJson(Ret.fail("msg", "参数不正确"));
} else {
this.renderJson(Ret.ok("publickey", system.getPublickey()));
}
}
/**
* 获取指定应用的URL
*/
@Clear(JwtInterceptor.class)
public void url() {
String app = this.getPara("app");
if (StrKit.isBlank(app)) {
this.renderJson(Ret.fail("msg", "参数不能为空"));
return;
}
System system = System.dao.findFirst("select url from as_system where name=?", app);
if (system == null) {
this.renderJson(Ret.fail("msg", "参数不正确"));
} else {
this.renderJson(Ret.ok("url", system.getUrl()));
}
}
/**
* 根据系统id获取系统信息
*/
public void getSystemById() {
Integer id = this.getParaToInt("id");
System system = System.dao.findById(id);
this.renderJson(Ret.ok("system", system));
}
}
package com.archser.aserver.controller;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import com.archser.aserver.model.User;
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;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
/**
* 用户相关操作
*
* @author dgq
*
*/
public class UserController extends Controller {
@Inject
UserService userService;
/**
* 获取用户信息
*/
public void info() {
String username = this.getAttr("username");
User user = User.dao.template("getUser", username).findFirst();
user.remove("password");
this.renderJson(Ret.ok("userInfo", user));
}
/**
* 修改用户密码
*/
@SuppressWarnings("unused")
public void updatePwd() {
String username = this.getAttr("username");
String password = this.getPara("newPwd");
password = HashKit.sha256(password);
int flag = Db.update(Db.getSql("updatePassword"), password, username);
if (flag == 0) {
this.renderJson(Ret.fail("msg","修改失败"));
}
this.renderJson(Ret.ok("msg","修改成功"));
}
/**
* 修改用户
*/
public void updateUser() {
User user = this.getModel(User.class, "user", true);
if (user == null) {
renderJson("msg", "数据参数错误,请重新修改");
return;
}
boolean flag = user.update();
if (flag) {
renderJson(Ret.ok("msg", "数据修改成功!"));
return;
} else {
renderJson(Ret.fail("msg", "Error ! 请联系管理员解决。"));
}
}
/**
* 查询角色
*/
@SuppressWarnings("unused")
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());
}
}
}
package com.archser.aserver.generator;
import javax.sql.DataSource;
import com.jfinal.kit.Prop;
import com.jfinal.plugin.activerecord.dialect.OracleDialect;
import com.jfinal.plugin.activerecord.generator.Generator;
import com.jfinal.plugin.druid.DruidPlugin;
/**
* 生成器
*
* @author dengguopqi
*
*/
public class MyGenerator extends Generator {
public MyGenerator(DataSource dataSource, String baseModelPackageName, String baseModelOutputDir,
String modelPackageName, String modelOutputDir) {
super(dataSource, baseModelPackageName, baseModelOutputDir, modelPackageName, modelOutputDir);
}
public static void main(String[] args) {
Prop p = new Prop("config.properties");
String url = p.get("jdbcUrl");
String user = p.get("user");
String password = p.get("password");
DruidPlugin dp = new DruidPlugin(url, user, password);
dp.start();
MyGenerator g = new MyGenerator(dp.getDataSource(), "com.archser.aserver.model.base",
"src/main/java/com/archser/aserver/model/base", "com.archser.aserver.model",
"src/main/java/com/archser/aserver/model");
g.setMetaBuilder(new MyMetaBuilder(dp.getDataSource()));
g.setRemovedTableNamePrefixes("AS_");
g.setGenerateChainSetter(true);
g.setGenerateRemarks(true);
g.setGenerateDaoInModel(true);
g.setGenerateDataDictionary(true);
g.setDialect(new OracleDialect());
g.generate();
}
}
package com.archser.aserver.generator;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.jfinal.plugin.activerecord.dialect.OracleDialect;
import com.jfinal.plugin.activerecord.generator.MetaBuilder;
public class MyMetaBuilder extends MetaBuilder {
public MyMetaBuilder(DataSource dataSource) {
super(dataSource);
}
@Override
protected boolean isSkipTable(String tableName) {
switch (tableName.toUpperCase()) {
case "AS_CONFIG":
case "AS_MENU":
case "AS_ORGAN":
case "AS_ROLE":
case "AS_ROLE_MENU":
case "AS_ROLE_USER":
case "AS_SYSTEM":
case "AS_USER":
case "AS_MENU_STAR":
case "AS_LOG":
case "AS_MESSAGE":
return false;
default:
return true;
}
}
@Override
protected ResultSet getTablesResultSet() throws SQLException {
String schemaPattern = dialect instanceof OracleDialect ? dbMeta.getUserName() : null;
return dbMeta.getTables(conn.getCatalog(), schemaPattern, "%", new String[] {"TABLE"});
}
}
package com.archser.aserver.interceptor;
import com.jfinal.kit.Ret;
import com.jfinal.render.JsonRender;
import com.jfinal.render.Render;
import com.jfinal.render.RenderFactory;
/**
* @used
* @author CoolColor
* @date 2019年12月1日
*/
public class ErrorRender extends RenderFactory{
/* (non-Javadoc)
* @see com.jfinal.render.RenderFactory#getErrorRender(int)
*/
@Override
public Render getErrorRender(int errorCode) {
if (errorCode == 401) {
return new JsonRender(Ret.fail("msg", "CSRF validation failed"));
} else if (errorCode == 403) {
return new JsonRender(Ret.fail("msg", "please use post or get"));
} else if (errorCode == 404) {
return new JsonRender(Ret.fail("msg", "request not found"));
} else if (errorCode == 500) {
return new JsonRender(Ret.fail("msg", "serve error"));
} else if (errorCode == 503) {
return new JsonRender(Ret.fail("msg", "server overload or downtime for maintenance"));
}
return super.getErrorRender(errorCode);
}
}
package com.archser.aserver.interceptor;
import java.util.Arrays;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.core.Controller;
import com.jfinal.kit.PropKit;
import com.jfinal.kit.StrKit;
import com.jfinal.log.Log;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
/**
* 全局登录验证
*
* @author dengguoqi
*
*/
public class JwtInterceptor implements Interceptor {
private static final Log log = Log.getLog(Controller.class);
private static final String HEADER_AUTHORIZATION = "Authorization";
@Override
public void intercept(Invocation inv) {
if (this.verifyToken(inv)) {
inv.invoke();
} else {
inv.getController().renderError(401);
}
}
/**
* 验证cookie中记住的用户
*
* @param inv
* @return
*/
private boolean verifyToken(Invocation inv) {
String token = inv.getController().getHeader(HEADER_AUTHORIZATION);
if (StrKit.isBlank(token)) {
token = inv.getController().getPara("token");
}
if (StrKit.isBlank(token)) {
token = inv.getController().getCookie("token");
}
if (StrKit.isBlank(token)) {
return false;
} else {
inv.getController().setCookie("token", token, 24 * 60 * 60, true);
}
try {
// jwt解析器
Claims claims = Jwts.parser()
// 设置公钥
.setSigningKeyResolver(new JwtSigningKeyResolver())
// 解析jwt
.parseClaimsJws(token).getBody();
// 验证IP
if (!filterIpAddress(getIpAddr(inv.getController().getRequest()), claims.get("ip", String.class))) {
return false;
}
String username = claims.get("name", String.class);
inv.getController().setAttr("username", username);
return !StrKit.isBlank(username);
} catch (Exception e) {
log.error("JWT验证出错", e);
return false;
}
}
/**
* 过滤IP地址白名单
*
* @Title: filterIpAddress
* @param ipAddr
* @return
* @author LDC
* @date 2019-11-22 06:51:24
*/
public boolean filterIpAddress(String ipAddr, String tokenIp) {
if (tokenIp != null && !"".equals(tokenIp) && ipAddr != null && !"".equals(ipAddr) && tokenIp.equals(ipAddr)) {
return true;
}
String ipArray = PropKit.get("MyIpAddress");
List<String> ipList = Arrays.asList(ipArray.split(","));
for (String ip : ipList) {
if (ip.equals(ipAddr) || ip.equals(tokenIp)) {
return true;
}
}
return false;
}
/**
* 获取用户真实IP
*
* @Title: getIpAddr
* @author LDC
* @date 2019-11-21 02:23:42
*/
public static String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
// 多次反向代理后会有多个ip值,第一个ip才是真实ip
if (ip.indexOf(",") != -1) {
ip = ip.split(",")[0];
}
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Real-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
}
package com.archser.aserver.interceptor;
import java.security.Key;
import com.archser.aserver.util.KeysUtil;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.Db;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwsHeader;
import io.jsonwebtoken.SigningKeyResolverAdapter;
/**
* 公钥提供解析器
*
* @author dgq
*
*/
public class JwtSigningKeyResolver extends SigningKeyResolverAdapter {
@Override
public Key resolveSigningKey(@SuppressWarnings("rawtypes") JwsHeader jwsHeader, Claims claims) {
String keyId = jwsHeader.getKeyId();
String publickey = Db.queryStr(Db.getSql("getPublickeyByKeyId"), keyId);
if (publickey == null || StrKit.isBlank(publickey)) {
return null;
}
return KeysUtil.publickey(publickey);
}
}
package com.archser.aserver.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.core.Controller;
import com.jfinal.kit.Ret;
/**
* @used
* @author CoolColor
* @date 2019年12月1日
*/
public class UnifiedErrorInterceptor implements Interceptor{
private Controller controller;
private HttpServletResponse response;
@Override
public void intercept(Invocation inv) {
try {
controller = inv.getController();
HttpServletRequest request = controller.getRequest();
response=controller.getResponse();
String referer = request.getHeader("referer");
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(request.getScheme()).append("://").append(request.getServerName());
if(referer!=null&&!"".equals(referer)) {
if(referer.lastIndexOf(String.valueOf(stringBuffer))!=0) {
//验证失败
response.setStatus(401);
controller.renderJson(Ret.fail("msg","CSRF validation failed"));
return;
}
}
String method = request.getMethod();
if(!"post".equalsIgnoreCase(method)&&!"get".equalsIgnoreCase(method)) {
response.setStatus(403);
controller.renderJson(Ret.fail("msg","please use post or get"));
return;
}
inv.invoke();
} catch (Exception e) {
e.printStackTrace();
response.setStatus(500);
controller.renderJson(Ret.fail("msg","serve error"));
return;
}
}
}
package com.archser.aserver.model;
import com.archser.aserver.model.base.BaseConfig;
/**
* Generated by JFinal.
*/
@SuppressWarnings("serial")
public class Config extends BaseConfig<Config> {
public static final Config dao = new Config().dao();
public static final String SEQ = "SEQ_CONFIG";
public static final String SEQ_NEXTVAL = "SEQ_CONFIG.nextval";
}
package com.archser.aserver.model;
import com.archser.aserver.model.base.BaseLog;
/**
* Generated by JFinal.
*/
@SuppressWarnings("serial")
public class Log extends BaseLog<Log> {
public static final Log dao = new Log().dao();
public static final String SEQ_NEXTVAL = "SEQ_LOG.nextval";
}
package com.archser.aserver.model;
import com.archser.aserver.model.base.BaseMenu;
/**
* Generated by JFinal.
*/
@SuppressWarnings("serial")
public class Menu extends BaseMenu<Menu> {
public static final Menu dao = new Menu().dao();
public static final String SEQ_NEXTVAL= "SEQ_MENU.nextval";
}
package com.archser.aserver.model;
import com.archser.aserver.model.base.BaseMenuStar;
/**
* Generated by JFinal.
*/
@SuppressWarnings("serial")
public class MenuStar extends BaseMenuStar<MenuStar> {
public static final MenuStar dao = new MenuStar().dao();
}
package com.archser.aserver.model;
import com.archser.aserver.model.base.BaseMessage;
/**
* Generated by JFinal.
*/
@SuppressWarnings("serial")
public class Message extends BaseMessage<Message> {
public static final Message dao = new Message().dao();
public static final String SEQ_NEXTVAL= "SEQ_MESSAGE.nextval";
}
package com.archser.aserver.model;
import com.archser.aserver.model.base.BaseOrgan;
/**
* Generated by JFinal.
*/
@SuppressWarnings("serial")
public class Organ extends BaseOrgan<Organ> {
public static final Organ dao = new Organ().dao();
}
package com.archser.aserver.model;
import com.archser.aserver.model.base.BaseRole;
/**
* Generated by JFinal.
*/
@SuppressWarnings("serial")
public class Role extends BaseRole<Role> {
public static final Role dao = new Role().dao();
}
package com.archser.aserver.model;
import com.archser.aserver.model.base.BaseRoleMenu;
/**
* Generated by JFinal.
*/
@SuppressWarnings("serial")
public class RoleMenu extends BaseRoleMenu<RoleMenu> {
public static final RoleMenu dao = new RoleMenu().dao();
}
package com.archser.aserver.model;
import com.archser.aserver.model.base.BaseRoleUser;
/**
* Generated by JFinal.
*/
@SuppressWarnings("serial")
public class RoleUser extends BaseRoleUser<RoleUser> {
public static final RoleUser dao = new RoleUser().dao();
}
package com.archser.aserver.model;
import com.archser.aserver.model.base.BaseSystem;
/**
* Generated by JFinal.
*/
@SuppressWarnings("serial")
public class System extends BaseSystem<System> {
public static final System dao = new System().dao();
public static final String SEQ = "SEQ_SYSTEM";
public static final String SEQ_NEXTVAL = "SEQ_SYSTEM.nextval";
}
package com.archser.aserver.model;
import com.archser.aserver.model.base.BaseUser;
/**
* Generated by JFinal.
*/
@SuppressWarnings("serial")
public class User extends BaseUser<User> {
public static final User dao = new User().dao();
}
Table: AS_CONFIG
-------------+---------------+------+-----+---------+---------
Field | Type | Null | Key | Default | Remarks
-------------+---------------+------+-----+---------+---------
ID | NUMBER(9) | NO | PRI | |
NAME | VARCHAR2(255) | YES | | |
VAL | VARCHAR2(255) | YES | | |
DESCRIPTION | VARCHAR2(255) | YES | | |
-------------+---------------+------+-----+---------+---------
Table: AS_LOG
-------------+--------------------+------+-----+---------+---------
Field | Type | Null | Key | Default | Remarks
-------------+--------------------+------+-----+---------+---------
ID | NUMBER(9) | NO | PRI | |
TYPE | VARCHAR2(150) | YES | | |
USER_ID | NUMBER(9) | YES | | |
CONTENT | VARCHAR2(1000) | YES | | |
CREATE_TIME | TIMESTAMP(6)(11,6) | YES | | |
EXTENDING | VARCHAR2(200) | YES | | |
SYSTEM_TYPE | VARCHAR2(50) | YES | | |
IP | VARCHAR2(50) | YES | | |
CODE | VARCHAR2(255) | YES | | |
TOKEN | VARCHAR2(255) | YES | | |
URL | VARCHAR2(255) | YES | | |
-------------+--------------------+------+-----+---------+---------
Table: AS_MENU
-------------+---------------+------+-----+---------+---------
Field | Type | Null | Key | Default | Remarks
-------------+---------------+------+-----+---------+---------
ID | NUMBER(9) | NO | PRI | |
NAME | VARCHAR2(50) | YES | | |
TITLE | VARCHAR2(50) | YES | | |
ICON | VARCHAR2(50) | YES | | |
DESCRIPTION | VARCHAR2(255) | YES | | |
PATH | VARCHAR2(255) | YES | | |
TARGET | VARCHAR2(30) | YES | | |
SYSTEM_ID | NUMBER(9) | YES | | |
HIDDEN | NUMBER(9) | YES | | |
-------------+---------------+------+-----+---------+---------
Table: AS_MENU_STAR
---------+-----------+------+-----+---------+---------
Field | Type | Null | Key | Default | Remarks
---------+-----------+------+-----+---------+---------
ID | NUMBER(9) | NO | PRI | |
MENU_ID | NUMBER(9) | YES | | |
USER_ID | NUMBER(9) | YES | | |
---------+-----------+------+-----+---------+---------
Table: AS_MESSAGE
------------+--------------------+------+-----+---------+---------
Field | Type | Null | Key | Default | Remarks
------------+--------------------+------+-----+---------+---------
ID | NUMBER(9) | NO | PRI | |
SENDER_ID | NUMBER(9) | YES | | |
SEND_TO_ID | NUMBER(9) | YES | | |
TITLE | VARCHAR2(200) | YES | | |
CONTENT | VARCHAR2(1000) | YES | | |
SYSTEM_ID | NUMBER(9) | YES | | |
PATH | VARCHAR2(255) | YES | | |
PARAMS | VARCHAR2(400) | YES | | |
OPERATE | VARCHAR2(40) | YES | | |
READ | VARCHAR2(1) | YES | | |
SEND_TIME | TIMESTAMP(6)(11,6) | YES | | |
------------+--------------------+------+-----+---------+---------
Table: AS_ORGAN
--------+---------------+------+-----+---------+---------
Field | Type | Null | Key | Default | Remarks
--------+---------------+------+-----+---------+---------
ID | NUMBER(9) | NO | PRI | |
NAME | VARCHAR2(50) | YES | | |
PID | NUMBER(9) | YES | | |
ISUNIT | VARCHAR2(1) | YES | | 'N'
|
IDSEQ | VARCHAR2(500) | YES | | ''
|
UUID | VARCHAR2(500) | YES | | |
PUUID | VARCHAR2(500) | YES | | |
LOCKED | VARCHAR2(1) | YES | | |
--------+---------------+------+-----+---------+---------
Table: AS_ROLE
-------------+---------------+------+-----+---------+---------
Field | Type | Null | Key | Default | Remarks
-------------+---------------+------+-----+---------+---------
ID | NUMBER(9) | NO | PRI | |
NAME | VARCHAR2(50) | YES | | |
DESCRIPTION | VARCHAR2(255) | YES | | |
LOCKED | VARCHAR2(1) | YES | | |
CREATETIME | DATE(7) | YES | | |
IDSEQ | VARCHAR2(500) | YES | | ''
|
-------------+---------------+------+-----+---------+---------
Table: AS_ROLE_MENU
---------+-----------+------+-----+---------+---------
Field | Type | Null | Key | Default | Remarks
---------+-----------+------+-----+---------+---------
ID | NUMBER(9) | NO | PRI | |
ROLE_ID | NUMBER(9) | YES | | |
MENU_ID | NUMBER(9) | YES | | |
---------+-----------+------+-----+---------+---------
Table: AS_ROLE_USER
---------+-----------+------+-----+---------+---------
Field | Type | Null | Key | Default | Remarks
---------+-----------+------+-----+---------+---------
ID | NUMBER(9) | NO | PRI | |
USER_ID | NUMBER(9) | YES | | |
ROLE_ID | NUMBER(9) | YES | | |
---------+-----------+------+-----+---------+---------
Table: AS_SYSTEM
-------------+----------------+------+-----+---------+---------
Field | Type | Null | Key | Default | Remarks
-------------+----------------+------+-----+---------+---------
ID | NUMBER(9) | NO | PRI | |
NAME | VARCHAR2(50) | YES | | |
TITLE | VARCHAR2(50) | YES | | |
TYPE | VARCHAR2(50) | YES | | |
URL | VARCHAR2(255) | YES | | |
SERVICE | VARCHAR2(255) | YES | | |
KEYID | VARCHAR2(50) | YES | | |
PRIVATEKEY | VARCHAR2(2000) | YES | | |
PUBLICKEY | VARCHAR2(500) | YES | | |
DESCRIPTION | VARCHAR2(255) | YES | | |
-------------+----------------+------+-----+---------+---------
Table: AS_USER
-----------------+---------------+------+-----+---------+---------
Field | Type | Null | Key | Default | Remarks
-----------------+---------------+------+-----+---------+---------
ID | NUMBER(9) | NO | PRI | |
USERNAME | VARCHAR2(40) | YES | | |
PASSWORD | VARCHAR2(64) | YES | | |
LOCKED | VARCHAR2(1) | YES | | |
NAME | VARCHAR2(40) | YES | | |
EMAIL | VARCHAR2(50) | YES | | |
ORGAN_ID | NUMBER(9) | YES | | |
OFFICE_PHONE | VARCHAR2(20) | YES | | |
MOBILE_PHONE | VARCHAR2(20) | YES | | |
HOME_PHONE | VARCHAR2(20) | YES | | |
ADDRESS | VARCHAR2(500) | YES | | |
POSTCODE | VARCHAR2(10) | YES | | |
DESCRIPTION | VARCHAR2(500) | YES | | |
IMAGE | BLOB(4000) | YES | | |
UUID | VARCHAR2(500) | YES | | |
ERRORCOUNT | NUMBER(9) | YES | | |
LAST_LOGIN_TIME | DATE(7) | YES | | |
-----------------+---------------+------+-----+---------+---------
package com.archser.aserver.model;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
/**
* Generated by JFinal, do not modify this file.
* <pre>
* Example:
* public void configPlugin(Plugins me) {
* ActiveRecordPlugin arp = new ActiveRecordPlugin(...);
* _MappingKit.mapping(arp);
* me.add(arp);
* }
* </pre>
*/
public class _MappingKit {
public static void mapping(ActiveRecordPlugin arp) {
arp.addMapping("AS_CONFIG", "ID", Config.class);
arp.addMapping("AS_LOG", "ID", Log.class);
arp.addMapping("AS_MENU", "ID", Menu.class);
arp.addMapping("AS_MENU_STAR", "ID", MenuStar.class);
arp.addMapping("AS_MESSAGE", "ID", Message.class);
arp.addMapping("AS_ORGAN", "ID", Organ.class);
arp.addMapping("AS_ROLE", "ID", Role.class);
arp.addMapping("AS_ROLE_MENU", "ID", RoleMenu.class);
arp.addMapping("AS_ROLE_USER", "ID", RoleUser.class);
arp.addMapping("AS_SYSTEM", "ID", System.class);
arp.addMapping("AS_USER", "ID", User.class);
}
}
package com.archser.aserver.model.base;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.IBean;
/**
* Generated by JFinal, do not modify this file.
*/
@SuppressWarnings({"serial", "unchecked"})
public abstract class BaseConfig<M extends BaseConfig<M>> extends Model<M> implements IBean {
public M setId(java.lang.Integer id) {
set("ID", id);
return (M)this;
}
public java.lang.Integer getId() {
return getInt("ID");
}
public M setName(java.lang.String name) {
set("NAME", name);
return (M)this;
}
public java.lang.String getName() {
return getStr("NAME");
}
public M setVal(java.lang.String val) {
set("VAL", val);
return (M)this;
}
public java.lang.String getVal() {
return getStr("VAL");
}
public M setDescription(java.lang.String description) {
set("DESCRIPTION", description);
return (M)this;
}
public java.lang.String getDescription() {
return getStr("DESCRIPTION");
}
}
package com.archser.aserver.model.base;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.IBean;
/**
* Generated by JFinal, do not modify this file.
*/
@SuppressWarnings({"serial", "unchecked"})
public abstract class BaseLog<M extends BaseLog<M>> extends Model<M> implements IBean {
public M setId(java.lang.Integer id) {
set("ID", id);
return (M)this;
}
public java.lang.Integer getId() {
return getInt("ID");
}
public M setType(java.lang.String type) {
set("TYPE", type);
return (M)this;
}
public java.lang.String getType() {
return getStr("TYPE");
}
public M setUserId(java.lang.Integer userId) {
set("USER_ID", userId);
return (M)this;
}
public java.lang.Integer getUserId() {
return getInt("USER_ID");
}
public M setContent(java.lang.String content) {
set("CONTENT", content);
return (M)this;
}
public java.lang.String getContent() {
return getStr("CONTENT");
}
public M setCreateTime(java.util.Date createTime) {
set("CREATE_TIME", createTime);
return (M)this;
}
public java.util.Date getCreateTime() {
return get("CREATE_TIME");
}
public M setExtending(java.lang.String extending) {
set("EXTENDING", extending);
return (M)this;
}
public java.lang.String getExtending() {
return getStr("EXTENDING");
}
public M setSystemType(java.lang.String systemType) {
set("SYSTEM_TYPE", systemType);
return (M)this;
}
public java.lang.String getSystemType() {
return getStr("SYSTEM_TYPE");
}
public M setIp(java.lang.String ip) {
set("IP", ip);
return (M)this;
}
public java.lang.String getIp() {
return getStr("IP");
}
public M setCode(java.lang.String code) {
set("CODE", code);
return (M)this;
}
public java.lang.String getCode() {
return getStr("CODE");
}
public M setToken(java.lang.String token) {
set("TOKEN", token);
return (M)this;
}
public java.lang.String getToken() {
return getStr("TOKEN");
}
public M setUrl(java.lang.String url) {
set("URL", url);
return (M)this;
}
public java.lang.String getUrl() {
return getStr("URL");
}
}
package com.archser.aserver.model.base;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.IBean;
/**
* Generated by JFinal, do not modify this file.
*/
@SuppressWarnings({"serial", "unchecked"})
public abstract class BaseMenu<M extends BaseMenu<M>> extends Model<M> implements IBean {
public M setId(java.lang.Integer id) {
set("ID", id);
return (M)this;
}
public java.lang.Integer getId() {
return getInt("ID");
}
public M setName(java.lang.String name) {
set("NAME", name);
return (M)this;
}
public java.lang.String getName() {
return getStr("NAME");
}
public M setTitle(java.lang.String title) {
set("TITLE", title);
return (M)this;
}
public java.lang.String getTitle() {
return getStr("TITLE");
}
public M setIcon(java.lang.String icon) {
set("ICON", icon);
return (M)this;
}
public java.lang.String getIcon() {
return getStr("ICON");
}
public M setDescription(java.lang.String description) {
set("DESCRIPTION", description);
return (M)this;
}
public java.lang.String getDescription() {
return getStr("DESCRIPTION");
}
public M setPath(java.lang.String path) {
set("PATH", path);
return (M)this;
}
public java.lang.String getPath() {
return getStr("PATH");
}
public M setTarget(java.lang.String target) {
set("TARGET", target);
return (M)this;
}
public java.lang.String getTarget() {
return getStr("TARGET");
}
public M setSystemId(java.lang.Integer systemId) {
set("SYSTEM_ID", systemId);
return (M)this;
}
public java.lang.Integer getSystemId() {
return getInt("SYSTEM_ID");
}
public M setHidden(java.lang.Integer hidden) {
set("HIDDEN", hidden);
return (M)this;
}
public java.lang.Integer getHidden() {
return getInt("HIDDEN");
}
}
package com.archser.aserver.model.base;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.IBean;
/**
* Generated by JFinal, do not modify this file.
*/
@SuppressWarnings({"serial", "unchecked"})
public abstract class BaseMenuStar<M extends BaseMenuStar<M>> extends Model<M> implements IBean {
public M setId(java.lang.Integer id) {
set("ID", id);
return (M)this;
}
public java.lang.Integer getId() {
return getInt("ID");
}
public M setMenuId(java.lang.Integer menuId) {
set("MENU_ID", menuId);
return (M)this;
}
public java.lang.Integer getMenuId() {
return getInt("MENU_ID");
}
public M setUserId(java.lang.Integer userId) {
set("USER_ID", userId);
return (M)this;
}
public java.lang.Integer getUserId() {
return getInt("USER_ID");
}
}
package com.archser.aserver.model.base;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.IBean;
/**
* Generated by JFinal, do not modify this file.
*/
@SuppressWarnings({"serial", "unchecked"})
public abstract class BaseMessage<M extends BaseMessage<M>> extends Model<M> implements IBean {
public M setId(java.lang.Integer id) {
set("ID", id);
return (M)this;
}
public java.lang.Integer getId() {
return getInt("ID");
}
public M setSenderId(java.lang.Integer senderId) {
set("SENDER_ID", senderId);
return (M)this;
}
public java.lang.Integer getSenderId() {
return getInt("SENDER_ID");
}
public M setSendToId(java.lang.Integer sendToId) {
set("SEND_TO_ID", sendToId);
return (M)this;
}
public java.lang.Integer getSendToId() {
return getInt("SEND_TO_ID");
}
public M setTitle(java.lang.String title) {
set("TITLE", title);
return (M)this;
}
public java.lang.String getTitle() {
return getStr("TITLE");
}
public M setContent(java.lang.String content) {
set("CONTENT", content);
return (M)this;
}
public java.lang.String getContent() {
return getStr("CONTENT");
}
public M setSystemId(java.lang.Integer systemId) {
set("SYSTEM_ID", systemId);
return (M)this;
}
public java.lang.Integer getSystemId() {
return getInt("SYSTEM_ID");
}
public M setPath(java.lang.String path) {
set("PATH", path);
return (M)this;
}
public java.lang.String getPath() {
return getStr("PATH");
}
public M setParams(java.lang.String params) {
set("PARAMS", params);
return (M)this;
}
public java.lang.String getParams() {
return getStr("PARAMS");
}
public M setOperate(java.lang.String operate) {
set("OPERATE", operate);
return (M)this;
}
public java.lang.String getOperate() {
return getStr("OPERATE");
}
public M setRead(java.lang.String read) {
set("READ", read);
return (M)this;
}
public java.lang.String getRead() {
return getStr("READ");
}
public M setSendTime(java.util.Date sendTime) {
set("SEND_TIME", sendTime);
return (M)this;
}
public java.util.Date getSendTime() {
return get("SEND_TIME");
}
}
package com.archser.aserver.model.base;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.IBean;
/**
* Generated by JFinal, do not modify this file.
*/
@SuppressWarnings({"serial", "unchecked"})
public abstract class BaseOrgan<M extends BaseOrgan<M>> extends Model<M> implements IBean {
public M setId(java.lang.Integer id) {
set("ID", id);
return (M)this;
}
public java.lang.Integer getId() {
return getInt("ID");
}
public M setName(java.lang.String name) {
set("NAME", name);
return (M)this;
}
public java.lang.String getName() {
return getStr("NAME");
}
public M setPid(java.lang.Integer pid) {
set("PID", pid);
return (M)this;
}
public java.lang.Integer getPid() {
return getInt("PID");
}
public M setIsunit(java.lang.String isunit) {
set("ISUNIT", isunit);
return (M)this;
}
public java.lang.String getIsunit() {
return getStr("ISUNIT");
}
public M setIdseq(java.lang.String idseq) {
set("IDSEQ", idseq);
return (M)this;
}
public java.lang.String getIdseq() {
return getStr("IDSEQ");
}
public M setUuid(java.lang.String uuid) {
set("UUID", uuid);
return (M)this;
}
public java.lang.String getUuid() {
return getStr("UUID");
}
public M setPuuid(java.lang.String puuid) {
set("PUUID", puuid);
return (M)this;
}
public java.lang.String getPuuid() {
return getStr("PUUID");
}
public M setLocked(java.lang.String locked) {
set("LOCKED", locked);
return (M)this;
}
public java.lang.String getLocked() {
return getStr("LOCKED");
}
}
package com.archser.aserver.model.base;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.IBean;
/**
* Generated by JFinal, do not modify this file.
*/
@SuppressWarnings({"serial", "unchecked"})
public abstract class BaseRole<M extends BaseRole<M>> extends Model<M> implements IBean {
public M setId(java.lang.Integer id) {
set("ID", id);
return (M)this;
}
public java.lang.Integer getId() {
return getInt("ID");
}
public M setName(java.lang.String name) {
set("NAME", name);
return (M)this;
}
public java.lang.String getName() {
return getStr("NAME");
}
public M setDescription(java.lang.String description) {
set("DESCRIPTION", description);
return (M)this;
}
public java.lang.String getDescription() {
return getStr("DESCRIPTION");
}
public M setLocked(java.lang.String locked) {
set("LOCKED", locked);
return (M)this;
}
public java.lang.String getLocked() {
return getStr("LOCKED");
}
public M setCreatetime(java.util.Date createtime) {
set("CREATETIME", createtime);
return (M)this;
}
public java.util.Date getCreatetime() {
return get("CREATETIME");
}
public M setIdseq(java.lang.String idseq) {
set("IDSEQ", idseq);
return (M)this;
}
public java.lang.String getIdseq() {
return getStr("IDSEQ");
}
}
package com.archser.aserver.model.base;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.IBean;
/**
* Generated by JFinal, do not modify this file.
*/
@SuppressWarnings({"serial", "unchecked"})
public abstract class BaseRoleMenu<M extends BaseRoleMenu<M>> extends Model<M> implements IBean {
public M setId(java.lang.Integer id) {
set("ID", id);
return (M)this;
}
public java.lang.Integer getId() {
return getInt("ID");
}
public M setRoleId(java.lang.Integer roleId) {
set("ROLE_ID", roleId);
return (M)this;
}
public java.lang.Integer getRoleId() {
return getInt("ROLE_ID");
}
public M setMenuId(java.lang.Integer menuId) {
set("MENU_ID", menuId);
return (M)this;
}
public java.lang.Integer getMenuId() {
return getInt("MENU_ID");
}
}
package com.archser.aserver.model.base;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.IBean;
/**
* Generated by JFinal, do not modify this file.
*/
@SuppressWarnings({"serial", "unchecked"})
public abstract class BaseRoleUser<M extends BaseRoleUser<M>> extends Model<M> implements IBean {
public M setId(java.lang.Integer id) {
set("ID", id);
return (M)this;
}
public java.lang.Integer getId() {
return getInt("ID");
}
public M setUserId(java.lang.Integer userId) {
set("USER_ID", userId);
return (M)this;
}
public java.lang.Integer getUserId() {
return getInt("USER_ID");
}
public M setRoleId(java.lang.Integer roleId) {
set("ROLE_ID", roleId);
return (M)this;
}
public java.lang.Integer getRoleId() {
return getInt("ROLE_ID");
}
}
package com.archser.aserver.model.base;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.IBean;
/**
* Generated by JFinal, do not modify this file.
*/
@SuppressWarnings({"serial", "unchecked"})
public abstract class BaseSystem<M extends BaseSystem<M>> extends Model<M> implements IBean {
public M setId(java.lang.Integer id) {
set("ID", id);
return (M)this;
}
public java.lang.Integer getId() {
return getInt("ID");
}
public M setName(java.lang.String name) {
set("NAME", name);
return (M)this;
}
public java.lang.String getName() {
return getStr("NAME");
}
public M setTitle(java.lang.String title) {
set("TITLE", title);
return (M)this;
}
public java.lang.String getTitle() {
return getStr("TITLE");
}
public M setType(java.lang.String type) {
set("TYPE", type);
return (M)this;
}
public java.lang.String getType() {
return getStr("TYPE");
}
public M setUrl(java.lang.String url) {
set("URL", url);
return (M)this;
}
public java.lang.String getUrl() {
return getStr("URL");
}
public M setService(java.lang.String service) {
set("SERVICE", service);
return (M)this;
}
public java.lang.String getService() {
return getStr("SERVICE");
}
public M setKeyid(java.lang.String keyid) {
set("KEYID", keyid);
return (M)this;
}
public java.lang.String getKeyid() {
return getStr("KEYID");
}
public M setPrivatekey(java.lang.String privatekey) {
set("PRIVATEKEY", privatekey);
return (M)this;
}
public java.lang.String getPrivatekey() {
return getStr("PRIVATEKEY");
}
public M setPublickey(java.lang.String publickey) {
set("PUBLICKEY", publickey);
return (M)this;
}
public java.lang.String getPublickey() {
return getStr("PUBLICKEY");
}
public M setDescription(java.lang.String description) {
set("DESCRIPTION", description);
return (M)this;
}
public java.lang.String getDescription() {
return getStr("DESCRIPTION");
}
}
package com.archser.aserver.model.base;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.IBean;
/**
* Generated by JFinal, do not modify this file.
*/
@SuppressWarnings({"serial", "unchecked"})
public abstract class BaseUser<M extends BaseUser<M>> extends Model<M> implements IBean {
public M setId(java.lang.Integer id) {
set("ID", id);
return (M)this;
}
public java.lang.Integer getId() {
return getInt("ID");
}
public M setUsername(java.lang.String username) {
set("USERNAME", username);
return (M)this;
}
public java.lang.String getUsername() {
return getStr("USERNAME");
}
public M setPassword(java.lang.String password) {
set("PASSWORD", password);
return (M)this;
}
public java.lang.String getPassword() {
return getStr("PASSWORD");
}
public M setLocked(java.lang.String locked) {
set("LOCKED", locked);
return (M)this;
}
public java.lang.String getLocked() {
return getStr("LOCKED");
}
public M setName(java.lang.String name) {
set("NAME", name);
return (M)this;
}
public java.lang.String getName() {
return getStr("NAME");
}
public M setEmail(java.lang.String email) {
set("EMAIL", email);
return (M)this;
}
public java.lang.String getEmail() {
return getStr("EMAIL");
}
public M setOrganId(java.lang.Integer organId) {
set("ORGAN_ID", organId);
return (M)this;
}
public java.lang.Integer getOrganId() {
return getInt("ORGAN_ID");
}
public M setOfficePhone(java.lang.String officePhone) {
set("OFFICE_PHONE", officePhone);
return (M)this;
}
public java.lang.String getOfficePhone() {
return getStr("OFFICE_PHONE");
}
public M setMobilePhone(java.lang.String mobilePhone) {
set("MOBILE_PHONE", mobilePhone);
return (M)this;
}
public java.lang.String getMobilePhone() {
return getStr("MOBILE_PHONE");
}
public M setHomePhone(java.lang.String homePhone) {
set("HOME_PHONE", homePhone);
return (M)this;
}
public java.lang.String getHomePhone() {
return getStr("HOME_PHONE");
}
public M setAddress(java.lang.String address) {
set("ADDRESS", address);
return (M)this;
}
public java.lang.String getAddress() {
return getStr("ADDRESS");
}
public M setPostcode(java.lang.String postcode) {
set("POSTCODE", postcode);
return (M)this;
}
public java.lang.String getPostcode() {
return getStr("POSTCODE");
}
public M setDescription(java.lang.String description) {
set("DESCRIPTION", description);
return (M)this;
}
public java.lang.String getDescription() {
return getStr("DESCRIPTION");
}
public M setImage(byte[] image) {
set("IMAGE", image);
return (M)this;
}
public byte[] getImage() {
return get("IMAGE");
}
public M setUuid(java.lang.String uuid) {
set("UUID", uuid);
return (M)this;
}
public java.lang.String getUuid() {
return getStr("UUID");
}
public M setErrorcount(java.lang.Integer errorcount) {
set("ERRORCOUNT", errorcount);
return (M)this;
}
public java.lang.Integer getErrorcount() {
return getInt("ERRORCOUNT");
}
public M setLastLoginTime(java.util.Date lastLoginTime) {
set("LAST_LOGIN_TIME", lastLoginTime);
return (M)this;
}
public java.util.Date getLastLoginTime() {
return get("LAST_LOGIN_TIME");
}
}
package com.archser.aserver.service;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;
import com.jfinal.plugin.activerecord.Db;
public class DBService {
/**
* 不加载DTD的地址.
*/
private static final String DTD_not_load =
"http://apache.org/xml/features/nonvalidating/load-external-dtd";
/**
* 不验证DTD的地址.
*/
private static final String DTD_not_validation = "http://xml.org/sax/features/validation";
/**
* 日志文件存放路径.
*/
private static String logFilePath = null;
/**
* xml文件存放路径.
*/
private static String xmlFilePath = null;
private SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd 'T' HH-mm-ss");
/**
* 在AS_CONFIG存放的数据库配置名称
*/
private String configName = "DBUpdateVersion";
/**
* 升级数据库
*
* @param configPath 配置文件的路径
* @param dbType 数据库类型
* @return boolean false更新失败 true更新成功.
*/
public boolean upgrade(String configPath, String dbType) {
boolean success = false;
String basePath = configPath + dbType;
xmlFilePath = basePath + "_UpdateSQL.xml";
// 日志文件存放位置
logFilePath = basePath + "_UpdateLog.log";
File file = new File(xmlFilePath);
StringBuffer sb = new StringBuffer();
// 没有找到配置文件,直接返回
if (file.length() <= 0) {
System.out.println("在 " + xmlFilePath + " 未找到升级文件...");
return success;
}
long start = System.currentTimeMillis();
String editionStr = this.selectVersion();
// 没有找到数据库中配置的版本号,直接返回
if (editionStr == null || "".equals(editionStr.trim())) {
System.out.println("数据库表AS_CONFIG中未配置名称为" + configName + "的数据库升级版本号...");
return success;
}
int edition = Integer.parseInt(editionStr);
// 解释XML文件
SAXBuilder builder = new SAXBuilder();
builder.setFeature(DTD_not_load, false);
builder.setFeature(DTD_not_validation, false);
org.jdom.Document docs = null;
try {
docs = builder.build(file);
} catch (Exception e) {
e.printStackTrace();
System.out.println("解析 " + xmlFilePath + " 文件出现异常...");
return success;
}
String editionResult = null;
// 添加到日志文件的时间
Date nowTime = new Date(System.currentTimeMillis());
String nowTimeStr = sf.format(nowTime);
Element root = docs.getRootElement();
String type = null;// 类型
List node = null;
List childNodeSql = null;
List childNodeFuction = null;
List childNodeProcedure = null;
try {
node = XPath.selectNodes(root, "//version");
} catch (Exception e) {
e.printStackTrace();
System.out.println("解析 " + xmlFilePath + "文件中节点出现异常...");
return success;
}
System.out.println("数据库升级中,请稍侯...");
int maxVersion = edition;
Element enode = null;
int version = 0;
for (Iterator it = node.iterator(); it.hasNext();) {
enode = (Element) it.next();
version = Integer.parseInt(enode.getAttributeValue("edition"));
if (version > edition) {
// 最后把所有版本号中最大的一个更新的版本号保存
maxVersion = maxVersion < version ? version : maxVersion;
editionResult = String.valueOf(maxVersion);
try {
childNodeSql = XPath.selectNodes(enode, "sql");
childNodeFuction = XPath.selectNodes(enode, "function");
childNodeProcedure = XPath.selectNodes(enode, "procedure");
} catch (Exception e1) {
e1.printStackTrace();
continue;
}
sb.append("*******************************************************************\r\n");
sb.append(nowTimeStr + "  更新版本号为 【 version = " + version + " 】 日志信息 \r\n");
// sql标签的sql
type = "sql";
updateDB(childNodeSql, type, version, sb);
// function标签的函数
type = "function";
updateDB(childNodeFuction, type, version, sb);
// procedure标签的存储过程
type = "procedure";
updateDB(childNodeProcedure, type, version, sb);
}
}
if (editionResult != null) {
Db.update(Db.getSql("updateConfigVal"), editionResult, configName);
// 写日志文件
writerIntoWorkLog(sb);
long end = System.currentTimeMillis();
System.out.println("数据库完成自动升级,消耗时间为:" + (end - start) + " 毫秒");
} else {
System.out.println("目前数据库版本为[ version = " + edition + " ] 已为最新,暂不需要更新!");
}
success = true;
return success;
}
/**
* 更新数据库语句
*
* @param childNode
* @param type
* @param version
* @param sb
*/
private void updateDB(List childNode, String type, int version, StringBuffer sb) {
String sqlText = null;
Element sql = null;
for (Iterator itsql = childNode.iterator(); itsql.hasNext();) {
sql = (Element) itsql.next();
sqlText = sql.getText();
if (sqlText == null || "".equals(sqlText.trim())) {
continue;
}
sb.append(this.updateSql(sqlText.trim(), type, version));
}
}
/**
* 执行sql,function,procedure语句.
*
* @param sql sql语句.
* @param type 要执行sql的类型,如:insert,update等.
* @param version 版本号.
* @return StringBuffer 返回执行的sql于用于写人日志文件中.
*/
private StringBuffer updateSql(String sql, String type, float version) {
StringBuffer buffer = new StringBuffer();
String[] ls = null;
try {
if ("sql".equals(type)) {
if (sql.indexOf(";") >= 0) {
ls = sql.split(";");
/**chenyong 20200604 edit 升级时,在一个版本内,如果出现一个sql错误,其余依然能够执行 start**/
boolean successFlag=true;
for (int i = 0; i < ls.length; i++) {
try {
Db.update(ls[i]);
} catch (Exception e) {
successFlag=false;
buffer.append("sql:\r\n " + ls[i] + "\r\n" + "\r\n【States】:" + e.getMessage() + "\r\n");
buffer.append("---------------------------\r\n");
}
}
if(!successFlag) {
System.out.println("【更新[version=" + version + "]出现错误】 详细请查看日志文件 " + logFilePath);
}
/**chenyong 20200604 edit 升级时,在一个版本内,如果出现一个sql错误,其余依然能够执行 end**/
} else {
Db.update(sql);
}
} else if ("function".equals(type)) {
Db.update(sql);
} else if ("procedure".equals(type)) {
Db.update(sql);
}
// buffer.append("sql:\r\n " + sql + "\r\nStates: *** update success !!***\r\n");
buffer.append("---------------------------\r\n");
} catch (Exception e) {
System.out.println("【更新[version=" + version + "]出现一个错误sql】 详细请查看日志文件 " + logFilePath);
buffer.append("sql:\r\n " + sql + "\r\n" + "\r\n【States】:" + e.getMessage() + "\r\n");
buffer.append("---------------------------\r\n");
}
return buffer;
}
/**
* 写日志文件.
*
* @param log 存在日志文件的字符串.
*/
private void writerIntoWorkLog(StringBuffer log) {
File f = new File(logFilePath);
boolean flag = f.exists();// 标识文件是否存在,存在则把日志信息追到文件后面,不存在则创建
FileWriter outFile = null;
BufferedWriter bufferOut = null;
try {
outFile = new FileWriter(f, flag);
bufferOut = new BufferedWriter(outFile);
bufferOut.write(log.toString());
bufferOut.newLine();
bufferOut.flush();
} catch (IOException e) {
System.out.println(e.getMessage());
} finally {
if (bufferOut != null) {
try {
bufferOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bufferOut != null) {
try {
outFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 查找数据库中的版本号.
*
* @return String 返回数据库中的版本号.
*/
private String selectVersion() {
String name = "DBUpdateVersion";
String edition = Db.queryStr(Db.getSql("getConfigByName"), name);
return edition;
}
}
package com.archser.aserver.service;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.archser.aserver.model.Log;
import com.jfinal.plugin.activerecord.Db;
public class LogService {
public void saveAsLog(String type, String user, String ip, String content, String app) {
try {
Log asLog = new Log();
asLog.set("ID", "SEQ_LOG.nextval");
asLog.setType(type);
Integer userId = Db.queryInt(Db.getSql("getUserId"),user);
asLog.setUserId(userId);
asLog.setContent(content);
// 把时间精确到秒
SimpleDateFormat format2 = new SimpleDateFormat("yyyyMMdd 'T' HH:mm:ss");
Date date = new Date();
String time = format2.format(date);
Date date2 = format2.parse(time);
asLog.setCreateTime(date2);
asLog.setIp(ip);
asLog.setSystemType(app);
asLog.save();
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.archser.aserver.service;
import java.util.List;
import com.archser.aserver.model.Menu;
import com.jfinal.kit.Kv;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.Db;
public class MenuService {
/**
* 根据SysId获取菜单列表
* @param 系统Id
* @return
*/
public List<Menu> getMenuListBySysId(Integer sysId, String condStr) {
if(StrKit.notBlank(condStr)) {
String[] columns = new String[]{"name","title","icon","description","path","target"};
String condStrSpil = "";
String[] condStrs = condStr.split("\\s+");
for(String cond : condStrs) {
condStrSpil += "(";
for(String column : columns) {
condStrSpil += column+" like '%"+cond+"%' or ";
}
if("是".equals(cond) || "否".equals(cond)) {
condStrSpil += "否".equals(cond)?"hidden is null or ":"hidden is not null or ";
}
condStrSpil = condStrSpil.substring(0, condStrSpil.length()-4)+") and ";
}
condStr = "("+condStrSpil.substring(0, condStrSpil.length()-5)+")";
}
return Menu.dao.find(Db.getSqlPara("getMenuListBySysId", Kv.by("sysId", sysId).set("condStr",condStr)));
}
/**
* 保存菜单数据
* @param menu 菜单数据
* @return
*/
public boolean saveMenuData(Menu menu) {
if(menu.getId() == null) {
//将大写的id改为小写,否则保存的时候出错 LiuYimeng 20200430 YZJ-3218
menu.set("id", Menu.SEQ_NEXTVAL);
return menu.save();
}else {
return menu.update();
}
}
/**
* 删除菜单数据
* @param menuId
* @return
*/
public boolean deleteMenu(String[] ids) {
return Db.tx(() -> {
try {
Db.delete(Db.getSqlPara("deleteRoleMenuByIds", Kv.by("ids", ids)).getSql());
int conut = Db.delete(Db.getSqlPara("deleteMenuByIds", Kv.by("ids", ids)).getSql());
if(conut==ids.length) {
return true;
}
return false;
} catch (Exception e) {
e.printStackTrace();
return false;
}
});
}
}
package com.archser.aserver.service;
import java.util.List;
import org.apache.log4j.Logger;
import com.archser.aserver.model.Message;
import com.archser.aserver.websocket.MessageRefreshTrigger;
import com.jfinal.kit.Kv;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.Record;
public class MessageService {
private Message messageDao = Message.dao;
private static final Logger logger = Logger.getLogger(MessageService.class);
/**
* @param pageNumber
* @param pageSize
* @param username
* @param menu unread:未读,readed:已读,其他;查询所有
* @return
*/
public Page<Message> getMessagePageData(int pageNumber, int pageSize, String username, String menu) {
Integer userId = Db.queryInt(Db.getSql("getUserId"), username);
Page<Message> page = messageDao.paginate(pageNumber, pageSize, Db.getSqlPara("message.getMessagePageData", Kv.by("send_to_id", userId).set("menu", menu)));
return page;
}
public Page<Record> getUnreadMessage(int pageNumber, int pageSize,Integer userId) {
Page<Record> paginate = Db.paginate(pageNumber, pageSize, Db.getSqlPara("message.getMessagePageData", Kv.by("send_to_id", userId).set("menu", "unread")));
return paginate;
}
public boolean markRead(int id) {
int update = Db.update(Db.getSqlPara("message.markRead", Kv.by("id", id)));
return update == 1;
}
public boolean deleteMessage(String[] idArray) {
int update = Db.update(Db.getSqlPara("message.deleteMessage", Kv.by("ids", idArray)));
return update == idArray.length;
}
public Long getCountByRead(String read, String username) {
Record findFirst = Db.findFirst(Db.getSqlPara("message.getCountByRead", Kv.by("read", read).set("username", username)));
return findFirst.getLong("count");
}
/**
* 更新消息
* @param userIds 要更新的用户id 使用,分割用户id
* @return
*/
public static boolean refreshMessageByUserId(String userIds) {
try {
return loaclRefresh(userIds);
} catch(Exception e) {
logger.error("更新消息出错", e);
return false;
}
}
/**
* 更新消息
* @param userId 要更新的用户id
* @return
*/
public static boolean refreshMessageByUserId(Integer userId) {
if (userId == null) {
return false;
}
try {
return loaclRefresh(userId.toString());
} catch(Exception e) {
logger.error("更新消息出错", e);
return false;
}
}
/**
* 刷新消息
* @param asMessage
* @return
*/
public static boolean refreshMessage(Message asMessage) {
return refreshMessageByUserId(asMessage.getSendToId());
}
/**
* 刷新消息
* @param messageList
* @return
*/
public static boolean refreshMessage(List<Message> messageList) {
if (messageList == null || messageList.isEmpty()) {
return false;
}
StringBuilder idBuiler = new StringBuilder();
for (Message asMessage : messageList) {
idBuiler.append(asMessage.getSendToId());
idBuiler.append(",");
}
if (idBuiler.length() > 0) {
idBuiler.deleteCharAt(idBuiler.length() - 1);
}
return refreshMessageByUserId(idBuiler.toString());
}
/**
* 刷新消息
* @param asMessage
* @return
*/
public static boolean refreshMessageRecord(Record asMessage) {
return refreshMessageByUserId(asMessage.getInt("send_to_id"));
}
/**
* 刷新消息
* @param messageList
* @return
*/
public static boolean refreshMessageRecord(List<Record> messageList) {
if (messageList == null || messageList.isEmpty()) {
return false;
}
StringBuilder idBuiler = new StringBuilder();
for (Record asMessage : messageList) {
if (asMessage.getInt("send_to_id") != null) {
idBuiler.append(asMessage.getInt("send_to_id"));
idBuiler.append(",");
}
}
if (idBuiler.length() > 0) {
idBuiler.deleteCharAt(idBuiler.length() - 1);
}
return refreshMessageByUserId(idBuiler.toString());
}
/**
* 保存消息并且刷新消息
* @param asMessage
* @return
*/
public boolean saveMessageAndRefresh(Message asMessage) {
boolean save = asMessage.save();
if (save) {
return refreshMessage(asMessage);
}
return false;
}
/**
* 保存消息并且刷新消息
* @param asMessageList
* @return
*/
public boolean saveMessageAndRefresh(List<Message> asMessageList) {
int[] batchSave = Db.batchSave(asMessageList, asMessageList.size());
if (batchSave.length == asMessageList.size()) {
return refreshMessage(asMessageList);
}
return false;
}
private static boolean loaclRefresh(String userIds) {
MessageRefreshTrigger.refresh(userIds);
return true;
}
}
package com.archser.aserver.service;
import java.util.List;
import com.archser.aserver.model.Config;
import com.archser.aserver.model.System;
import com.jfinal.kit.Kv;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.Db;
public class SystemService {
public List<System> findList(String searchText) {
searchText = "%" + searchText + "%";
return System.dao.find(Db.getSqlPara("findSystemList", Kv.by("searchText", searchText)));
}
public List<Config> findConfigList(String searchText) {
if(StrKit.notBlank(searchText)) {
String queryStr = "";
String[] fields = new String[]{"AC.NAME","AC.VAL","AC.DESCRIPTION"};
String[] spaces = searchText.split("\\s+");
if(spaces.length>1) {
for(String space : spaces) {
queryStr += "(";
for(String field : fields) {
queryStr += field+" like '%"+space+"%' or ";
}
queryStr = queryStr.substring(0, queryStr.length()-4)+ ") and ";
}
searchText = queryStr.substring(0, queryStr.length()-5);
}else {
for(String field : fields) {
queryStr += field+" like '%"+searchText+"%' or ";
}
searchText = queryStr.substring(0, queryStr.length()-4);
}
}
return Config.dao.find(Db.getSqlPara("findConfigList", Kv.by("searchText", searchText)));
}
}
package com.archser.aserver.service;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import com.archser.aserver.model.Menu;
import com.archser.aserver.model.System;
import com.archser.aserver.model.User;
import com.jfinal.aop.Before;
import com.jfinal.kit.Kv;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
import com.jfinal.plugin.activerecord.tx.Tx;
public class UserService {
/**
* @description 修改用户密码
*/
@Before(Tx.class)
public int updatePwd(String password, String username) {
return Db.update(Db.getSql("updatePassword"), password, username);
}
/**
* 更新用户
*/
@Before(Tx.class)
public boolean updateUser(User user) {
return user.update();
}
/**
* 根据用户ID查询角色ID
*/
public List<Integer> getRolesByUserId(int userId) {
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"));
}
return ids;
}
/**
* 通过personCode获取用户信息
*
* @param personCode
* @return
* @author Guo XJ
*/
public Record getUserInfoByPersonCode(String personCode) {
return Db.findFirst(Db.getSqlPara("getUserByPersonCode", Kv.by("personCode", personCode)));
}
/**
* 判断用户是否有指定菜单的权限
*
* @param userId
* @param menuName
* @return
*/
public boolean checkUserHasMenu(int userId, String menuName) {
return findMenuIdByNameAndUserId(userId, menuName) != null;
}
/**
* 判断用户是否有指定菜单的权限
*
* @param userId
* @param menuName
* @return
*/
public boolean checkUserHasMenu(int userId, String systemType, String menuName) {
return findMenuByUserSystemAndName(userId, systemType, menuName) != null;
}
/**
* 判断用户是否有指定系统的权限
*
* @param userId
* @param menuName
* @return
*/
public boolean checkUserSystemPermission(int userId, String systemType) {
return findMenuBySystemType(userId, systemType) != null;
}
/**
* 查询用户拥有权限的指定菜单
*
* @param userId 用户id
* @param menuName 菜单名称
* @return 菜单id
*/
public Integer findMenuIdByNameAndUserId(int userId, String menuName) {
Record record = Db.findFirst(Db.getSqlPara("findMenuIdByNameAndUserId",
Kv.by("userId", userId).set("menuName", menuName)));
return record.getInt("menu_id");
}
/**
* 查询指定菜单且用户拥有权限
*
* @param userId 用户id
* @param systemType 系统类型
* @param menuName 菜单名称
* @return 菜单id 如果有
*/
public Integer findMenuByUserSystemAndName(int userId, String systemType, String menuName) {
Record record = Db.findFirst(Db.getSqlPara("findMenuByUserSystemAndName",
Kv.by("userId", userId).set("menuName", menuName).set("systemType", systemType)));
return record == null ? null : record.getInt("menu_id");
}
/**
* 查询指定菜单且用户拥有权限
*
* @param userId 用户id
* @param systemType 系统类型
* @param menuName 菜单名称
* @return 如果存在返回菜单id:menu_id 和 系统title: system
*/
public Record findMenuAndSystemIfUserHasRole(int userId, String systemType, String menuName) {
Record record = Db.findFirst(Db.getSqlPara("findMenuAndSystemIfUserHasRole",
Kv.by("userId", userId).set("menuName", menuName).set("systemType", systemType)));
return record;
}
public Integer findMenuBySystemType(int userId, String systemType) {
Record record = Db.findFirst(Db.getSqlPara("findMenuBySystemType",
Kv.by("userId", userId).set("systemType", systemType)));
return record == null ? null : record.getInt("menu_id");
}
/**
* 获取用户拥有权限的系统
*
* @param userId
* @return
*/
public List<System> findSystemWithUserPermission(int userId) {
/**
* xiaoying 20200414 YZJ-2725 隐藏菜单无法登录问题 start
*/
List<System> sysList =
System.dao.find(Db.getSqlPara("findSystemWithUserPermission", Kv.by("userId", userId)));
// xiaoying 20200608 勾选为隐藏菜单时找下一个服务
for (int i = sysList.size() - 1; i >= 0; i--) {
Integer count = 0;
List<Menu> menuList = Menu.dao.find(Db.getSqlPara("findMenuByUserIdAndSysId",
Kv.by("userId", userId).set("systemId", sysList.get(i).getId())));
for (Menu menu : menuList) {
if (menu.getHidden() != null && menu.getHidden() == 1) {
count++;
}
}
if (count == menuList.size()) {
sysList.remove(i);
}
}
return sysList;
/**
* xiaoying 20200414 YZJ-2725 隐藏菜单无法登录问题 end
*/
}
public Optional<System> getSystemByName(String systemName, List<System> systemList) {
return systemList.stream().filter(sys -> systemName.equalsIgnoreCase(sys.get("name")))
.findFirst();
}
}
package com.archser.aserver.util;
import java.util.List;
import com.jfinal.kit.Kv;
import com.jfinal.plugin.activerecord.Model;
/**
* 集合工具类
*
* @author dgq
*
*/
public class CollectionUtil {
/**
* 数组集合Map化
*
* @param list
* @param key
* @return
*/
public static Kv toIntMap(List<?> list, String key) {
Kv kv = Kv.create();
for (Object organ : list) {
Model<?> m = (Model<?>) organ;
kv.set(m.getInt(key), organ);
}
return kv;
}
}
package com.archser.aserver.util;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.swing.filechooser.FileSystemView;
/*
* 监控磁盘空间使用情况
* */
public class GetDiskSpaceUtil {
private static String osName = System.getProperty("os.name");
private static DecimalFormat decimalFormat = new DecimalFormat("##.00%");
// 解析文件大小
public static String FormetFileSize(long fileS) {
DecimalFormat df = new DecimalFormat("#.00");
String fileSizeString = "";
if (fileS < 1024) {
fileSizeString = df.format((double) fileS) + "B";
} else if (fileS < 1048576) {
fileSizeString = df.format((double) fileS / 1024) + "K";
} else if (fileS < 1073741824) {
fileSizeString = df.format((double) fileS / 1048576) + "M";
} else {
fileSizeString = df.format((double) fileS / 1073741824) + "G";
}
return fileSizeString;
}
/**
* 获取硬盘的每个盘符的大小和占用率,不包含Linux
*
* @param <V>
*/
public static ArrayList<Map<String, List<String>>> driver() {
// 当前文件系统类
FileSystemView fsv = FileSystemView.getFileSystemView();
ArrayList<Map<String, List<String>>> arrayList = new ArrayList<Map<String, List<String>>>();
// 列出所有windows 磁盘
File[] fs = File.listRoots();
// 显示磁盘卷标
for (int i = 0; i < fs.length; i++) {
Map<String, List<String>> dataMap = new LinkedHashMap<String, List<String>>();
ArrayList<String> dataList = new ArrayList<String>();
dataList.add(FormetFileSize(fs[i].getTotalSpace())); // getTotalSpace当前磁盘总大小
dataList.add(FormetFileSize(fs[i].getFreeSpace())); // getFreeSpace当前磁盘剩余大小
dataList.add(decimalFormat.format(fs[i].getFreeSpace() / (float) fs[i].getTotalSpace())); // 当前磁盘剩余百分比
dataMap.put(fsv.getSystemDisplayName(fs[i]), dataList); // getSystemDisplayName当前磁盘名称
arrayList.add(dataMap);
}
return arrayList;
}
/**
* 获取硬盘的剩余大小
*
* @param <V>
* @throws Exception
* @throws Exception
*/
public static Integer getFreeSpaceOfDriver() throws Exception {
double totalHD = 0;
double usedHD = 0;
if (osName.toLowerCase().contains("windows") || osName.toLowerCase().contains("win")) {
double free = 0;
Integer freeSpaceInteger = 0;
for (char c = 'C'; c <= 'G'; c++) {
String dirName = c + ":/";
File win = new File(dirName);
if (win.exists()) {
free += win.getFreeSpace() / 1024.0 / 1024.0 / 1024.0;
}
freeSpaceInteger = (int) free;
}
return freeSpaceInteger;
} else {
Runtime rt = Runtime.getRuntime();
Process p = rt.exec("df -hl");// 查看硬盘空间
BufferedReader in = null;
try {
in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String str = null;
String[] strArray = null;
while ((str = in.readLine()) != null) {
int m = 0;
strArray = str.split(" ");
for (String tmp : strArray) {
if (tmp.trim().length() == 0)
continue;
++m;
if (tmp.indexOf("G") != -1) {
if (m == 2) {
if (!tmp.equals("") && !tmp.equals("0"))
if (totalHD == 0) {
totalHD = Double.parseDouble(tmp.substring(0, tmp.length() - 1));
}
}
if (m == 3) {
if (!tmp.equals("none") && !tmp.equals("0"))
if (usedHD == 0) {
usedHD = Double.parseDouble(tmp.substring(0, tmp.length() - 1));
}
}
}
}
}
} catch (Exception e) {
} finally {
in.close();
}
}
Double precent = totalHD - usedHD;
return precent.intValue();
}
}
/**
* com.soft.test_h5
* @Title: HttpRequest.java
* @author LDC
* @date 2019-11-19 01:23:19
*/
package com.archser.aserver.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
public class HttpRequestUtil {
/**
* 向指定URL发送GET方法的请求
*
* @param url
* 发送请求的URL
* @param param
* 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return URL 所代表远程资源的响应结果
*/
public static String sendGet(String url, String param) {
String result = "";
BufferedReader in = null;
try {
String urlNameString = url + "?" + param;
URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 建立实际的连接
connection.connect();
// 获取所有响应头字段
// 定义 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return result;
}
/**
* 向指定 URL 发送POST方法的请求
* @param url 发送请求的 URL
* @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return 所代表远程资源的响应结果
*/
public static String sendPost(String url, String param) {
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try {
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection conn = realUrl.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
//1.获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
//2.中文有乱码的需要将PrintWriter改为如下
//out=new OutputStreamWriter(conn.getOutputStream(),"UTF-8")
// 发送请求参数
out.print(param);
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
System.err.println(result);
} catch (Exception e) {
System.out.println("发送 POST 请求出现异常!"+e);
e.printStackTrace();
}
//使用finally块来关闭输出流、输入流
finally{
try{
if(out!=null){
out.close();
}
if(in!=null){
in.close();
}
}
catch(IOException ex){
ex.printStackTrace();
}
}
return result;
}
public static void main(String[] args) {
//发送 GET 请求
String s=HttpRequestUtil.sendGet("http://localhost:6144/Home/RequestString", "key=123&v=456");
System.out.println(s);
//发送 POST 请求
String sr=HttpRequestUtil.sendPost("http://localhost:6144/Home/RequestPostString", "key=123&v=456");
System.out.println(sr);
}
}
\ No newline at end of file
package com.archser.aserver.util;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import com.jfinal.kit.Base64Kit;
import com.jfinal.kit.Ret;
import com.jfinal.kit.StrKit;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.impl.crypto.RsaProvider;
/**
* 密钥相关工具类
*
* @author dgq
*
*/
public class KeysUtil {
/**
* 生成随机Key(私钥,公钥)<br>
* 可用于JWT的私钥签名公钥验证
*/
public static Ret keypair() {
KeyPair keyPair = RsaProvider.generateKeyPair(SignatureAlgorithm.RS256);
String keyId = StrKit.getRandomUUID();
String privateKey = Base64Kit.encode(keyPair.getPrivate().getEncoded());
String publicKey = Base64Kit.encode(keyPair.getPublic().getEncoded());
return Ret.ok().set("keyid", keyId).set("privateKey", privateKey).set("publicKey", publicKey);
}
/**
* 转换Base64编码的私钥
*
* @param key
* @return
*/
public static PrivateKey privatekey(String key) {
PrivateKey pvt = null;
try {
pvt = KeyFactory.getInstance("RSA")
.generatePrivate(new PKCS8EncodedKeySpec(Base64Kit.decode(key)));
} catch (NoSuchAlgorithmException e) {
System.out.println("没有找到加密算法:RSA");
} catch (InvalidKeySpecException e) {
System.out.println("提供的私钥不可用:" + key);
}
return pvt;
}
/**
* 转换Base64编码的私钥
*
* @param key
* @return
*/
public static PublicKey publickey(String key) {
PublicKey pub = null;
try {
pub = KeyFactory.getInstance("RSA")
.generatePublic(new X509EncodedKeySpec(Base64Kit.decode(key)));
} catch (NoSuchAlgorithmException e) {
System.out.println("没有找到加密算法:RSA");
} catch (InvalidKeySpecException e) {
System.out.println("提供的私钥不可用:" + key);
}
return pub;
}
}
package com.archser.aserver.util.gm;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.math.BigInteger;
import java.security.InvalidAlgorithmParameterException;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import java.security.spec.ECGenParameterSpec;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.ASN1EncodableVector;
import org.bouncycastle.asn1.ASN1Encoding;
import org.bouncycastle.asn1.ASN1Integer;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.asn1.ASN1OctetString;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.DERNull;
import org.bouncycastle.asn1.DEROctetString;
import org.bouncycastle.asn1.DERSequence;
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
import org.bouncycastle.asn1.x9.X962Parameters;
import org.bouncycastle.asn1.x9.X9ECParameters;
import org.bouncycastle.asn1.x9.X9ObjectIdentifiers;
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.generators.ECKeyPairGenerator;
import org.bouncycastle.crypto.params.ECDomainParameters;
import org.bouncycastle.crypto.params.ECKeyGenerationParameters;
import org.bouncycastle.crypto.params.ECKeyParameters;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey;
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;
import org.bouncycastle.jcajce.provider.asymmetric.util.EC5Util;
import org.bouncycastle.jcajce.provider.asymmetric.util.ECUtil;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.jce.spec.ECNamedCurveSpec;
import org.bouncycastle.jce.spec.ECParameterSpec;
import org.bouncycastle.math.ec.ECCurve;
import org.bouncycastle.math.ec.ECPoint;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import org.bouncycastle.util.io.pem.PemObject;
import org.bouncycastle.util.io.pem.PemReader;
import org.bouncycastle.util.io.pem.PemWriter;
/**
* 这个工具类的方法,也适用于其他基于BC库的ECC算法
*/
public class BCECUtil {
private static final String ALGO_NAME_EC = "EC";
private static final String PEM_STRING_PUBLIC = "PUBLIC KEY";
private static final String PEM_STRING_ECPRIVATEKEY = "EC PRIVATE KEY";
/**
* 生成ECC密钥对
*
* @return ECC密钥对
*/
public static AsymmetricCipherKeyPair generateKeyPairParameter(ECDomainParameters domainParameters,
SecureRandom random) {
ECKeyGenerationParameters keyGenerationParams = new ECKeyGenerationParameters(domainParameters,
random);
ECKeyPairGenerator keyGen = new ECKeyPairGenerator();
keyGen.init(keyGenerationParams);
return keyGen.generateKeyPair();
}
public static KeyPair generateKeyPair(ECDomainParameters domainParameters, SecureRandom random)
throws NoSuchProviderException, NoSuchAlgorithmException,
InvalidAlgorithmParameterException {
KeyPairGenerator kpg = KeyPairGenerator.getInstance(ALGO_NAME_EC, BouncyCastleProvider.PROVIDER_NAME);
ECParameterSpec parameterSpec = new ECParameterSpec(domainParameters.getCurve(), domainParameters.getG(),
domainParameters.getN(), domainParameters.getH());
kpg.initialize(parameterSpec, random);
return kpg.generateKeyPair();
}
public static int getCurveLength(ECKeyParameters ecKey) {
return getCurveLength(ecKey.getParameters());
}
public static int getCurveLength(ECDomainParameters domainParams) {
return (domainParams.getCurve().getFieldSize() + 7) / 8;
}
public static byte[] fixToCurveLengthBytes(int curveLength, byte[] src) {
if (src.length == curveLength) {
return src;
}
byte[] result = new byte[curveLength];
if (src.length > curveLength) {
System.arraycopy(src, src.length - result.length, result, 0, result.length);
} else {
System.arraycopy(src, 0, result, result.length - src.length, src.length);
}
return result;
}
public static ECPrivateKeyParameters createECPrivateKeyParameters(BigInteger d,
ECDomainParameters domainParameters) {
return new ECPrivateKeyParameters(d, domainParameters);
}
public static ECPublicKeyParameters createECPublicKeyParameters(BigInteger x, BigInteger y,
ECCurve curve, ECDomainParameters domainParameters) {
return createECPublicKeyParameters(x.toByteArray(), y.toByteArray(), curve, domainParameters);
}
public static ECPublicKeyParameters createECPublicKeyParameters(String xHex, String yHex,
ECCurve curve, ECDomainParameters domainParameters) {
return createECPublicKeyParameters(ByteUtils.fromHexString(xHex), ByteUtils.fromHexString(yHex),
curve, domainParameters);
}
/**
* 复原公钥
* @param pubHex 公钥16进制字符串
* @param curve
* @param domainParameters
* @return
*/
public static ECPublicKeyParameters createECPublicKeyParameters(String pubHex,
ECCurve curve, ECDomainParameters domainParameters) {
ECPoint decodePoint = curve.decodePoint(ByteUtils.fromHexString(pubHex));
return new ECPublicKeyParameters(decodePoint, domainParameters);
}
public static ECPublicKeyParameters createECPublicKeyParameters(byte[] xBytes, byte[] yBytes,
ECCurve curve, ECDomainParameters domainParameters) {
final byte uncompressedFlag = 0x04;
int curveLength = getCurveLength(domainParameters);
xBytes = fixToCurveLengthBytes(curveLength, xBytes);
yBytes = fixToCurveLengthBytes(curveLength, yBytes);
byte[] encodedPubKey = new byte[1 + xBytes.length + yBytes.length];
encodedPubKey[0] = uncompressedFlag;
System.arraycopy(xBytes, 0, encodedPubKey, 1, xBytes.length);
System.arraycopy(yBytes, 0, encodedPubKey, 1 + xBytes.length, yBytes.length);
return new ECPublicKeyParameters(curve.decodePoint(encodedPubKey), domainParameters);
}
public static ECPrivateKeyParameters convertPrivateKeyToParameters(BCECPrivateKey ecPriKey) {
ECParameterSpec parameterSpec = ecPriKey.getParameters();
ECDomainParameters domainParameters = new ECDomainParameters(parameterSpec.getCurve(), parameterSpec.getG(),
parameterSpec.getN(), parameterSpec.getH());
return new ECPrivateKeyParameters(ecPriKey.getD(), domainParameters);
}
public static ECPublicKeyParameters convertPublicKeyToParameters(BCECPublicKey ecPubKey) {
ECParameterSpec parameterSpec = ecPubKey.getParameters();
ECDomainParameters domainParameters = new ECDomainParameters(parameterSpec.getCurve(), parameterSpec.getG(),
parameterSpec.getN(), parameterSpec.getH());
return new ECPublicKeyParameters(ecPubKey.getQ(), domainParameters);
}
public static BCECPublicKey createPublicKeyFromSubjectPublicKeyInfo(SubjectPublicKeyInfo subPubInfo) throws NoSuchProviderException,
NoSuchAlgorithmException, InvalidKeySpecException, IOException {
return BCECUtil.convertX509ToECPublicKey(subPubInfo.toASN1Primitive().getEncoded(ASN1Encoding.DER));
}
/**
* 将ECC私钥转换为PKCS8标准的字节流
*
* @param priKey
* @param pubKey 可以为空,但是如果为空的话得到的结果OpenSSL可能解析不了
* @return
*/
public static byte[] convertECPrivateKeyToPKCS8(ECPrivateKeyParameters priKey,
ECPublicKeyParameters pubKey) {
ECDomainParameters domainParams = priKey.getParameters();
ECParameterSpec spec = new ECParameterSpec(domainParams.getCurve(), domainParams.getG(),
domainParams.getN(), domainParams.getH());
BCECPublicKey publicKey = null;
if (pubKey != null) {
publicKey = new BCECPublicKey(ALGO_NAME_EC, pubKey, spec,
BouncyCastleProvider.CONFIGURATION);
}
BCECPrivateKey privateKey = new BCECPrivateKey(ALGO_NAME_EC, priKey, publicKey,
spec, BouncyCastleProvider.CONFIGURATION);
return privateKey.getEncoded();
}
/**
* 将PKCS8标准的私钥字节流转换为私钥对象
*
* @param pkcs8Key
* @return
* @throws NoSuchAlgorithmException
* @throws NoSuchProviderException
* @throws InvalidKeySpecException
*/
public static BCECPrivateKey convertPKCS8ToECPrivateKey(byte[] pkcs8Key)
throws NoSuchAlgorithmException, NoSuchProviderException, InvalidKeySpecException {
PKCS8EncodedKeySpec peks = new PKCS8EncodedKeySpec(pkcs8Key);
KeyFactory kf = KeyFactory.getInstance(ALGO_NAME_EC, BouncyCastleProvider.PROVIDER_NAME);
return (BCECPrivateKey) kf.generatePrivate(peks);
}
/**
* 将PKCS8标准的私钥字节流转换为PEM
*
* @param encodedKey
* @return
* @throws IOException
*/
public static String convertECPrivateKeyPKCS8ToPEM(byte[] encodedKey) throws IOException {
return convertEncodedDataToPEM(PEM_STRING_ECPRIVATEKEY, encodedKey);
}
/**
* 将PEM格式的私钥转换为PKCS8标准字节流
*
* @param pemString
* @return
* @throws IOException
*/
public static byte[] convertECPrivateKeyPEMToPKCS8(String pemString) throws IOException {
return convertPEMToEncodedData(pemString);
}
/**
* 将ECC私钥转换为SEC1标准的字节流
* openssl d2i_ECPrivateKey函数要求的DER编码的私钥也是SEC1标准的,
* 这个工具函数的主要目的就是为了能生成一个openssl可以直接“识别”的ECC私钥.
* 相对RSA私钥的PKCS1标准,ECC私钥的标准为SEC1
*
* @param priKey
* @param pubKey
* @return
* @throws IOException
*/
public static byte[] convertECPrivateKeyToSEC1(ECPrivateKeyParameters priKey,
ECPublicKeyParameters pubKey) throws IOException {
byte[] pkcs8Bytes = convertECPrivateKeyToPKCS8(priKey, pubKey);
PrivateKeyInfo pki = PrivateKeyInfo.getInstance(pkcs8Bytes);
ASN1Encodable encodable = pki.parsePrivateKey();
ASN1Primitive primitive = encodable.toASN1Primitive();
byte[] sec1Bytes = primitive.getEncoded();
return sec1Bytes;
}
/**
* 将SEC1标准的私钥字节流恢复为PKCS8标准的字节流
*
* @param sec1Key
* @return
* @throws IOException
*/
public static byte[] convertECPrivateKeySEC1ToPKCS8(byte[] sec1Key) throws IOException {
/**
* 参考org.bouncycastle.asn1.pkcs.PrivateKeyInfo和
* org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey,逆向拼装
*/
X962Parameters params = getDomainParametersFromName(SM2Util.JDK_EC_SPEC, false);
ASN1OctetString privKey = new DEROctetString(sec1Key);
ASN1EncodableVector v = new ASN1EncodableVector();
v.add(new ASN1Integer(0)); //版本号
v.add(new AlgorithmIdentifier(X9ObjectIdentifiers.id_ecPublicKey, params)); //算法标识
v.add(privKey);
DERSequence ds = new DERSequence(v);
return ds.getEncoded(ASN1Encoding.DER);
}
/**
* 将SEC1标准的私钥字节流转为BCECPrivateKey对象
*
* @param sec1Key
* @return
* @throws NoSuchAlgorithmException
* @throws NoSuchProviderException
* @throws InvalidKeySpecException
* @throws IOException
*/
public static BCECPrivateKey convertSEC1ToBCECPrivateKey(byte[] sec1Key)
throws NoSuchAlgorithmException, NoSuchProviderException, InvalidKeySpecException, IOException {
PKCS8EncodedKeySpec peks = new PKCS8EncodedKeySpec(convertECPrivateKeySEC1ToPKCS8(sec1Key));
KeyFactory kf = KeyFactory.getInstance(ALGO_NAME_EC, BouncyCastleProvider.PROVIDER_NAME);
return (BCECPrivateKey) kf.generatePrivate(peks);
}
/**
* 将SEC1标准的私钥字节流转为ECPrivateKeyParameters对象
* openssl i2d_ECPrivateKey函数生成的DER编码的ecc私钥是:SEC1标准的、带有EC_GROUP、带有公钥的,
* 这个工具函数的主要目的就是为了使Java程序能够“识别”openssl生成的ECC私钥
*
* @param sec1Key
* @return
* @throws NoSuchAlgorithmException
* @throws NoSuchProviderException
* @throws InvalidKeySpecException
*/
public static ECPrivateKeyParameters convertSEC1ToECPrivateKey(byte[] sec1Key)
throws NoSuchAlgorithmException, NoSuchProviderException, InvalidKeySpecException, IOException {
BCECPrivateKey privateKey = convertSEC1ToBCECPrivateKey(sec1Key);
return convertPrivateKeyToParameters(privateKey);
}
/**
* 将ECC公钥对象转换为X509标准的字节流
*
* @param pubKey
* @return
*/
public static byte[] convertECPublicKeyToX509(ECPublicKeyParameters pubKey) {
ECDomainParameters domainParams = pubKey.getParameters();
ECParameterSpec spec = new ECParameterSpec(domainParams.getCurve(), domainParams.getG(),
domainParams.getN(), domainParams.getH());
BCECPublicKey publicKey = new BCECPublicKey(ALGO_NAME_EC, pubKey, spec,
BouncyCastleProvider.CONFIGURATION);
return publicKey.getEncoded();
}
/**
* 将X509标准的公钥字节流转为公钥对象
*
* @param x509Bytes
* @return
* @throws NoSuchProviderException
* @throws NoSuchAlgorithmException
* @throws InvalidKeySpecException
*/
public static BCECPublicKey convertX509ToECPublicKey(byte[] x509Bytes) throws NoSuchProviderException,
NoSuchAlgorithmException, InvalidKeySpecException {
X509EncodedKeySpec eks = new X509EncodedKeySpec(x509Bytes);
KeyFactory kf = KeyFactory.getInstance("EC", BouncyCastleProvider.PROVIDER_NAME);
return (BCECPublicKey) kf.generatePublic(eks);
}
/**
* 将X509标准的公钥字节流转为PEM
*
* @param encodedKey
* @return
* @throws IOException
*/
public static String convertECPublicKeyX509ToPEM(byte[] encodedKey) throws IOException {
return convertEncodedDataToPEM(PEM_STRING_PUBLIC, encodedKey);
}
/**
* 将PEM格式的公钥转为X509标准的字节流
*
* @param pemString
* @return
* @throws IOException
*/
public static byte[] convertECPublicKeyPEMToX509(String pemString) throws IOException {
return convertPEMToEncodedData(pemString);
}
/**
* copy from BC
*
* @param genSpec
* @return
*/
public static X9ECParameters getDomainParametersFromGenSpec(ECGenParameterSpec genSpec) {
return getDomainParametersFromName(genSpec.getName());
}
/**
* copy from BC
*
* @param curveName
* @return
*/
public static X9ECParameters getDomainParametersFromName(String curveName) {
X9ECParameters domainParameters;
try {
if (curveName.charAt(0) >= '0' && curveName.charAt(0) <= '2') {
ASN1ObjectIdentifier oidID = new ASN1ObjectIdentifier(curveName);
domainParameters = ECUtil.getNamedCurveByOid(oidID);
} else {
if (curveName.indexOf(' ') > 0) {
curveName = curveName.substring(curveName.indexOf(' ') + 1);
domainParameters = ECUtil.getNamedCurveByName(curveName);
} else {
domainParameters = ECUtil.getNamedCurveByName(curveName);
}
}
} catch (IllegalArgumentException ex) {
domainParameters = ECUtil.getNamedCurveByName(curveName);
}
return domainParameters;
}
/**
* copy from BC
*
* @param ecSpec
* @param withCompression
* @return
*/
public static X962Parameters getDomainParametersFromName(java.security.spec.ECParameterSpec ecSpec,
boolean withCompression) {
X962Parameters params;
if (ecSpec instanceof ECNamedCurveSpec) {
ASN1ObjectIdentifier curveOid = ECUtil.getNamedCurveOid(((ECNamedCurveSpec) ecSpec).getName());
if (curveOid == null) {
curveOid = new ASN1ObjectIdentifier(((ECNamedCurveSpec) ecSpec).getName());
}
params = new X962Parameters(curveOid);
} else if (ecSpec == null) {
params = new X962Parameters(DERNull.INSTANCE);
} else {
ECCurve curve = EC5Util.convertCurve(ecSpec.getCurve());
X9ECParameters ecP = new X9ECParameters(
curve,
EC5Util.convertPoint(curve, ecSpec.getGenerator(), withCompression),
ecSpec.getOrder(),
BigInteger.valueOf(ecSpec.getCofactor()),
ecSpec.getCurve().getSeed());
params = new X962Parameters(ecP);
}
return params;
}
private static String convertEncodedDataToPEM(String type, byte[] encodedData) throws IOException {
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
PemWriter pWrt = new PemWriter(new OutputStreamWriter(bOut));
try {
PemObject pemObj = new PemObject(type, encodedData);
pWrt.writeObject(pemObj);
} finally {
pWrt.close();
}
return new String(bOut.toByteArray());
}
private static byte[] convertPEMToEncodedData(String pemString) throws IOException {
ByteArrayInputStream bIn = new ByteArrayInputStream(pemString.getBytes());
PemReader pRdr = new PemReader(new InputStreamReader(bIn));
try {
PemObject pemObject = pRdr.readPemObject();
return pemObject.getContent();
} finally {
pRdr.close();
}
}
/**
* 创建密钥对
* @param pubKeyX 公钥x
* @param pubKeyY 公钥y
* @param privetKeyD 私钥d
* @return
*/
public static BCECipherKeyPair createBCECipherKeyPair(BigInteger pubKeyX, BigInteger pubKeyY, BigInteger privetKeyD) {
ECPublicKeyParameters publicKeyParameters = BCECUtil.createECPublicKeyParameters(pubKeyX, pubKeyY, SM2Util.CURVE, SM2Util.DOMAIN_PARAMS);
ECPrivateKeyParameters privateParameters = BCECUtil.createECPrivateKeyParameters(privetKeyD, SM2Util.DOMAIN_PARAMS);
return new BCECipherKeyPair(publicKeyParameters, privateParameters);
}
/**
* 创建密钥对
* @param pubKeyX 公钥x
* @param pubKeyY 公钥y
* @param privetKeyD 私钥d
* @return
*/
public static BCECipherKeyPair createBCECipherKeyPair(String pubHex, BigInteger privetKeyD) {
ECPublicKeyParameters publicKeyParameters = BCECUtil.createECPublicKeyParameters(pubHex, SM2Util.CURVE, SM2Util.DOMAIN_PARAMS);
ECPrivateKeyParameters privateParameters = BCECUtil.createECPrivateKeyParameters(privetKeyD, SM2Util.DOMAIN_PARAMS);
return new BCECipherKeyPair(publicKeyParameters, privateParameters);
}
/**
*
* @param pubKeyX 公钥x hex 十六进制字符串
* @param pubKeyY 公钥y 十六进制字符串
* @param privetKeyD 私钥d
* @return
*/
public static BCECipherKeyPair createBCECipherKeyPair(String pubKeyX, String pubKeyY, BigInteger privetKeyD) {
ECPublicKeyParameters publicKeyParameters = BCECUtil.createECPublicKeyParameters(pubKeyX, pubKeyY, SM2Util.CURVE, SM2Util.DOMAIN_PARAMS);
ECPrivateKeyParameters privateParameters = BCECUtil.createECPrivateKeyParameters(privetKeyD, SM2Util.DOMAIN_PARAMS);
return new BCECipherKeyPair(publicKeyParameters, privateParameters);
}
public static String getPublicXHexByKeyPair(BCECipherKeyPair keyPair) {
return ByteUtils.toHexString(keyPair.getPublic().getQ().getAffineXCoord().getEncoded());
}
public static String getPublicYHexByKeyPair(BCECipherKeyPair keyPair) {
return ByteUtils.toHexString(keyPair.getPublic().getQ().getAffineYCoord().getEncoded());
}
public static BigInteger getPublicYByKeyPair(BCECipherKeyPair keyPair) {
return keyPair.getPublic().getQ().getAffineYCoord().toBigInteger();
}
public static BigInteger getPublicXByKeyPair(BCECipherKeyPair keyPair) {
return keyPair.getPublic().getQ().getAffineXCoord().toBigInteger();
}
public static BigInteger getPrivateDByKeyPair(BCECipherKeyPair keyPair) {
return keyPair.getPrivate().getD();
}
/**
* 随机生成密钥对
* @return
*/
public static BCECipherKeyPair generateKeyPair() {
AsymmetricCipherKeyPair pairParameter = SM2Util.generateKeyPairParameter();
return new BCECipherKeyPair((ECPublicKeyParameters) pairParameter.getPublic(), (ECPrivateKeyParameters)pairParameter.getPrivate());
}
}
package com.archser.aserver.util.gm;
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
public class BCECipherKeyPair extends AsymmetricCipherKeyPair{
private ECPublicKeyParameters publicParam;
private ECPrivateKeyParameters privateParam;
public BCECipherKeyPair(ECPublicKeyParameters publicParam, ECPrivateKeyParameters privateParam) {
super(publicParam, privateParam);
this.publicParam = publicParam;
this.privateParam = privateParam;
}
@Override
public ECPublicKeyParameters getPublic() {
return this.publicParam;
}
@Override
public ECPrivateKeyParameters getPrivate() {
return this.privateParam;
}
}
package com.archser.aserver.util.gm;
import java.math.BigInteger;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
/**
* 默认的密钥对
* 如果不需要随机生成密钥对可以使用默认的密钥对,默认密钥对要绝对保密
* @author robin
*
*/
public class DefaultKeyPair {
public static final BCECipherKeyPair DEFAULT_KEY_PAIR;
private static final BigInteger pubKeyX = new BigInteger("8815299357690997310575551761069802470273427614132079873422071008811795243000");
private static final BigInteger pubKeyY = new BigInteger("36419508145654997383515579413584320836939565740328270276659925146834537327814");
private static final BigInteger privetKeyD = new BigInteger("8154541204461798796808642075084111515726747051480979083042911320377630833866");
static {
ECPublicKeyParameters publicKeyParameters = BCECUtil.createECPublicKeyParameters(pubKeyX, pubKeyY, SM2Util.CURVE, SM2Util.DOMAIN_PARAMS);
ECPrivateKeyParameters privateParameters = BCECUtil.createECPrivateKeyParameters(privetKeyD, SM2Util.DOMAIN_PARAMS);
DEFAULT_KEY_PAIR = new BCECipherKeyPair(publicKeyParameters, privateParameters);
}
}
package com.archser.aserver.util.gm;
public enum EncryptStatus {
/**
* 加密成功
*/
ENCRYPT_SUCCESS,
/**
* 加密失败
*/
ENCRYPT_FAIL,
/**
* 未加密的文件
*/
UNENCRYPTED_FILE,
/**
* 已加密的文件
*/
ENCRYPTED_FILE,
/**
* 解密成功
*/
DECRYPT_SUCCESS,
/**
* 解密失败
*/
DECRYPT_FAIL
}
package com.archser.aserver.util.gm;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import java.security.Security;
public class GMBaseUtil {
static {
Security.addProvider(new BouncyCastleProvider());
}
}
package com.archser.aserver.util.gm;
public class SM2Cipher {
/**
* ECC密钥
*/
private byte[] c1;
/**
* 真正的密文
*/
private byte[] c2;
/**
* 对(c1+c2)的SM3-HASH值
*/
private byte[] c3;
/**
* SM2标准的密文,即(c1+c2+c3)
*/
private byte[] cipherText;
public byte[] getC1() {
return c1;
}
public void setC1(byte[] c1) {
this.c1 = c1;
}
public byte[] getC2() {
return c2;
}
public void setC2(byte[] c2) {
this.c2 = c2;
}
public byte[] getC3() {
return c3;
}
public void setC3(byte[] c3) {
this.c3 = c3;
}
public byte[] getCipherText() {
return cipherText;
}
public void setCipherText(byte[] cipherText) {
this.cipherText = cipherText;
}
}
package com.archser.aserver.util.gm;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigInteger;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import org.bouncycastle.crypto.InvalidCipherTextException;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
/**
* sm2加密文件
* @Auther: robin
*/
public class SM2EncryptFile {
public static final Logger logger = Logger.getLogger(SM2EncryptFile.class);
/**
* 已加密的文件标识
*/
public static final byte[] ENCRYPTED_FILE_IDENTIFY = "encryptedFile".getBytes();
/**
* 随机生成密钥对
* @return
*/
public static BCECipherKeyPair generateKeyPairParameter() {
return BCECUtil.generateKeyPair();
}
/**
* 创建密钥对
* @return
*/
public static BCECipherKeyPair createBCECipherKeyPair(BigInteger pubKeyX, BigInteger pubKeyY, BigInteger privetKeyD) {
return BCECUtil.createBCECipherKeyPair(pubKeyX, pubKeyY, privetKeyD);
}
/**
* 创建密钥对
* @return
*/
public static BCECipherKeyPair createBCECipherKeyPair(String pubKeyX, String pubKeyY, BigInteger privetKeyD) {
return BCECUtil.createBCECipherKeyPair(pubKeyX, pubKeyY, privetKeyD);
}
/**
* 创建密钥对
* @return
*/
public static BCECipherKeyPair createBCECipherKeyPair(String pubHex, BigInteger privetKeyD) {
return BCECUtil.createBCECipherKeyPair(pubHex, privetKeyD);
}
/**
* 加密文件
* @param sourceFile 要加密的文件
* @return 返回加密后的字节数组,如果加密失败返回null
* @throws IOException
* @throws InvalidCipherTextException
* @return SM2EncryptedResult SM2加密结果 可获取加密后的字节数组和密钥对
*/
public static SM2EncryptedResult encryptFile(File encryptFile) throws IOException, InvalidCipherTextException {
BCECipherKeyPair keyPair = generateKeyPairParameter();
byte[] fileByteArray = FileUtils.readFileToByteArray(encryptFile);
byte[] encryptedByteArray = SM2Util.encrypt(keyPair.getPublic(), fileByteArray);
return new SM2EncryptedResult(encryptedByteArray, keyPair);
}
/**
* 加密文件
* @param InputStream 要加密的文件的输入流
* @return 返回加密后的字节数组,如果加密失败返回null
* @throws IOException
* @throws InvalidCipherTextException
* @return SM2EncryptedResult SM2加密结果 可获取加密后的字节数组和密钥对
*/
public static SM2EncryptedResult encryptFile(InputStream encryptFile) throws IOException, InvalidCipherTextException {
BCECipherKeyPair keyPair = generateKeyPairParameter();
byte[] fileByteArray = IOUtils.toByteArray(encryptFile);
byte[] encryptedByteArray = SM2Util.encrypt(keyPair.getPublic(), fileByteArray);
return new SM2EncryptedResult(encryptedByteArray, keyPair);
}
/**
* 加密文件并将加密后的内容写到文件中
* @param sourceFile 要加密的文件
* @param writeFile 加密后文件
* @throws IOException
* @throws InvalidCipherTextException
* @return SM2EncryptedResult SM2加密结果 可获取加密后的字节数组和密钥对
*/
public static SM2EncryptedResult encryptFileAndWrite(File encryptFile, File writeFile) throws IOException, InvalidCipherTextException {
BCECipherKeyPair keyPair = generateKeyPairParameter();
byte[] encryptByteArray = encryptFile(encryptFile, keyPair.getPublic());
FileUtils.writeByteArrayToFile(writeFile,encryptByteArray);
return new SM2EncryptedResult(encryptByteArray, keyPair);
}
/**
* 加密文件并将加密后的内容写到文件中
* @param inputStream 要加密的文件的输入流
* @param writeFile 加密后文件
* @throws IOException
* @throws InvalidCipherTextException
* @return SM2EncryptedResult SM2加密结果 可获取加密后的字节数组和密钥对
*/
public static SM2EncryptedResult encryptFileAndWrite(InputStream encryptFile, File writeFile) throws IOException, InvalidCipherTextException {
BCECipherKeyPair keyPair = generateKeyPairParameter();
byte[] encryptByteArray = encryptFile(encryptFile, keyPair.getPublic());
FileUtils.writeByteArrayToFile(writeFile,encryptByteArray);
return new SM2EncryptedResult(encryptByteArray, keyPair);
}
/**
* 加密文件
* @param sourceFile 要加密的文件
* @param publickey 公钥
* @return 返回加密后的字节数组,如果加密失败返回null
* @throws IOException
* @throws InvalidCipherTextException
*/
public static byte[] encryptFile(File encryptFile, ECPublicKeyParameters publickey) throws IOException, InvalidCipherTextException {
byte[] fileByteArray = FileUtils.readFileToByteArray(encryptFile);
byte[] encryptedByteArray = SM2Util.encrypt(publickey, fileByteArray);
return encryptedByteArray;
}
/**
* 加密文件
* @param InputStream 要加密的文件的输入流
* @param publickey 公钥
* @return 返回加密后的字节数组,如果加密失败返回null
* @throws IOException
* @throws InvalidCipherTextException
*/
public static byte[] encryptFile(InputStream encryptFile, ECPublicKeyParameters publickey) throws IOException, InvalidCipherTextException {
byte[] fileByteArray = IOUtils.toByteArray(encryptFile);
byte[] encryptedByteArray = SM2Util.encrypt(publickey, fileByteArray);
return encryptedByteArray;
}
/**
* 加密文件并将加密后的内容写到文件中
* @param sourceFile 要加密的文件
* @param writeFile 加密后文件
* @param publickey 公钥
* @throws IOException
* @throws InvalidCipherTextException
*/
public static void encryptFileAndWrite(File encryptFile, File writeFile, ECPublicKeyParameters publickey) throws IOException, InvalidCipherTextException {
byte[] encryptByteArray = encryptFile(encryptFile, publickey);
FileUtils.writeByteArrayToFile(writeFile,encryptByteArray);
}
/**
* 加密文件
* @param sourceFile 要加密的文件
* @param publickey 公钥
* @return 返回加密后的字节数组,如果加密失败返回null
* @throws IOException
* @throws InvalidCipherTextException
*/
public static byte[] encryptFile(File encryptFile, String pubHex) throws IOException, InvalidCipherTextException {
byte[] fileByteArray = FileUtils.readFileToByteArray(encryptFile);
byte[] encryptedByteArray = SM2Util.encrypt(BCECUtil.createECPublicKeyParameters(pubHex, SM2Util.CURVE, SM2Util.DOMAIN_PARAMS), fileByteArray);
return encryptedByteArray;
}
/**
* 加密文件
* @param InputStream 要加密的文件的输入流
* @param publickey 公钥
* @return 返回加密后的字节数组,如果加密失败返回null
* @throws IOException
* @throws InvalidCipherTextException
*/
public static byte[] encryptFile(InputStream encryptFile, String pubHex) throws IOException, InvalidCipherTextException {
byte[] fileByteArray = IOUtils.toByteArray(encryptFile);
byte[] encryptedByteArray = SM2Util.encrypt(BCECUtil.createECPublicKeyParameters(pubHex, SM2Util.CURVE, SM2Util.DOMAIN_PARAMS), fileByteArray);
return encryptedByteArray;
}
/**
* 加密文件并将加密后的内容写到文件中
* @param sourceFile 要加密的文件
* @param writeFile 加密后文件
* @param publickey 公钥
* @throws IOException
* @throws InvalidCipherTextException
*/
public static void encryptFileAndWrite(File encryptFile, File writeFile, String pubHex) throws IOException, InvalidCipherTextException {
byte[] encryptByteArray = encryptFile(encryptFile, BCECUtil.createECPublicKeyParameters(pubHex, SM2Util.CURVE, SM2Util.DOMAIN_PARAMS));
FileUtils.writeByteArrayToFile(writeFile,encryptByteArray);
}
/**
* 加密文件并将加密后的内容写到文件中
* @param inputStream 要加密的文件的输入流
* @param writeFile 加密后文件
* @param publickey 公钥
* @throws IOException
* @throws InvalidCipherTextException
*/
public static void encryptFileAndWrite(InputStream encryptFile, File writeFile, String pubHex) throws IOException, InvalidCipherTextException {
byte[] encryptByteArray = encryptFile(encryptFile, BCECUtil.createECPublicKeyParameters(pubHex, SM2Util.CURVE, SM2Util.DOMAIN_PARAMS));
FileUtils.writeByteArrayToFile(writeFile,encryptByteArray);
}
/**
* 解密文件
* @param encryptedFile 要解密的文件
* @param privateKey 私钥
* @return 解密之后的字节数组
* @throws IOException
* @throws InvalidCipherTextException
*/
public static byte[] decryptFile(File decryptFile, ECPrivateKeyParameters privateKey) throws IOException, InvalidCipherTextException {
byte[] fileByteArray = FileUtils.readFileToByteArray(decryptFile);
byte[] decryptedByteArray = SM2Util.decrypt(privateKey, fileByteArray);
return decryptedByteArray;
}
/**
* 解密文件
* @param encryptedFile 要解密的文件
* @param privateD 私钥
* @return 解密之后的字节数组
* @throws IOException
* @throws InvalidCipherTextException
*/
public static byte[] decryptFile(File decryptFile, BigInteger privateD) throws IOException, InvalidCipherTextException {
byte[] fileByteArray = FileUtils.readFileToByteArray(decryptFile);
byte[] decryptedByteArray = SM2Util.decrypt(BCECUtil.createECPrivateKeyParameters(privateD, SM2Util.DOMAIN_PARAMS), fileByteArray);
return decryptedByteArray;
}
/**
* 解密文件
* @param inputStream 要解密的文件的输入流
* @param privateKey 私钥
* @return 解密之后的字节数组
* @throws IOException
* @throws InvalidCipherTextException
*/
public static byte[] decryptFile(InputStream decryptFile, ECPrivateKeyParameters privateKey) throws IOException, InvalidCipherTextException {
byte[] fileByteArray = IOUtils.toByteArray(decryptFile);
byte[] decryptedByteArray = SM2Util.decrypt(privateKey, fileByteArray);
return decryptedByteArray;
}
/**
* 解密文件
* @param inputStream 要解密的文件的输入流
* @param privateD 私钥
* @return 解密之后的字节数组
* @throws IOException
* @throws InvalidCipherTextException
*/
public static byte[] decryptFile(InputStream decryptFile, BigInteger privateD) throws IOException, InvalidCipherTextException {
byte[] fileByteArray = IOUtils.toByteArray(decryptFile);
byte[] decryptedByteArray = SM2Util.decrypt(BCECUtil.createECPrivateKeyParameters(privateD, SM2Util.DOMAIN_PARAMS), fileByteArray);
return decryptedByteArray;
}
/**
* 解密文件并将解密后的文件写到目标文件上
* @param encryptedFile 要解密的文件
* @param outputFile 解密后文件
* @param privateKey 私钥
* @throws IOException
* @throws InvalidCipherTextException
*/
public static void decryptFileAndWrite(File decryptFile, File outputFile, ECPrivateKeyParameters privateKey) throws IOException, InvalidCipherTextException {
byte[] decryptByteArray = decryptFile(decryptFile, privateKey);
FileUtils.writeByteArrayToFile(outputFile, decryptByteArray);
}
/**
* 解密文件并将解密后的文件写到目标文件上
* @param encryptedFile 要解密的文件
* @param outputFile 解密后文件
* @param privateD 私钥
* @throws IOException
* @throws InvalidCipherTextException
*/
public static void decryptFileAndWrite(File decryptFile, File outputFile, BigInteger privateD) throws IOException, InvalidCipherTextException {
byte[] decryptByteArray = decryptFile(decryptFile, BCECUtil.createECPrivateKeyParameters(privateD, SM2Util.DOMAIN_PARAMS));
FileUtils.writeByteArrayToFile(outputFile, decryptByteArray);
}
/**
* 解密文件并将解密后的文件写到目标文件上
* @param inputStream 要解密的文件的输入流
* @param outputFile 解密后文件
* @param privateKey 私钥
* @throws IOException
* @throws InvalidCipherTextException
*/
public static void decryptFileAndWrite(InputStream decryptFile, File outputFile, ECPrivateKeyParameters privateKey) throws IOException, InvalidCipherTextException {
byte[] decryptByteArray = decryptFile(decryptFile, privateKey);
FileUtils.writeByteArrayToFile(outputFile, decryptByteArray);
}
/**
* 解密文件并将解密后的文件写到目标文件上
* @param inputStream 要解密的文件的输入流
* @param outputFile 解密后文件
* @param privateD 私钥
* @throws IOException
* @throws InvalidCipherTextException
*/
public static void decryptFileAndWrite(InputStream decryptFile, File outputFile, BigInteger privateD) throws IOException, InvalidCipherTextException {
byte[] decryptByteArray = decryptFile(decryptFile, BCECUtil.createECPrivateKeyParameters(privateD, SM2Util.DOMAIN_PARAMS));
FileUtils.writeByteArrayToFile(outputFile, decryptByteArray);
}
/**
* 加密文件并使用默认的公钥加密
* @param encryptFile 要加密的文件
* @param outFile 加密后的文件
* @return
*/
public static EncryptStatus encryptFileByDefaultKeyPairQuietly(File encryptFile, File outFile) {
try {
byte[] fileByteArray = FileUtils.readFileToByteArray(encryptFile);
if (isEncryptedFile(fileByteArray)) {
return EncryptStatus.ENCRYPTED_FILE;
}
byte[] encryptedByteArray = SM2Util.encrypt(DefaultKeyPair.DEFAULT_KEY_PAIR.getPublic(),fileByteArray);
FileUtils.writeByteArrayToFile(outFile, ENCRYPTED_FILE_IDENTIFY);
FileUtils.writeByteArrayToFile(outFile, encryptedByteArray,true);
return EncryptStatus.ENCRYPT_SUCCESS;
} catch (Exception e1) {
logger.error("文件加密失败, 文件=" + encryptFile.getPath() + " 错误=" + e1);
e1.printStackTrace();
}
return EncryptStatus.ENCRYPT_FAIL;
}
/**
* 加密文件并使用默认的公钥加密
* @param encryptFile 要加密的文件
* @param outFile 加密后的文件
* @return
* @throws IOException
* @throws InvalidCipherTextException
*/
public static void encryptFileByDefaultKeyPair(File encryptFile, File outFile) throws IOException, InvalidCipherTextException {
byte[] fileByteArray = FileUtils.readFileToByteArray(encryptFile);
if (isEncryptedFile(fileByteArray)) {
return;
}
byte[] encryptedByteArray = SM2Util.encrypt(DefaultKeyPair.DEFAULT_KEY_PAIR.getPublic(), fileByteArray);
try (FileOutputStream outputStream = new FileOutputStream(outFile)){
outputStream.write(ENCRYPTED_FILE_IDENTIFY);
outputStream.write(encryptedByteArray);
outputStream.close();
}
}
/**
* 加密文件并使用默认的公钥加密
* 不支持把加密后的文件输出到源文件上
* @param encryptInputStream 要加密的文件 不会关闭此输入流
* @param outFile 加密后的文件
* @return
*/
public static EncryptStatus encryptFileByDefaultKeyPair(InputStream encryptInputStream, File outFile) {
try {
byte[] fileByteArray = IOUtils.toByteArray(encryptInputStream);
if (isEncryptedFile(fileByteArray)) {
return EncryptStatus.ENCRYPTED_FILE;
}
byte[] encryptedByteArray = SM2Util.encrypt(DefaultKeyPair.DEFAULT_KEY_PAIR.getPublic(), fileByteArray);
try (FileOutputStream outputStream = FileUtils.openOutputStream(outFile)){
outputStream.write(ENCRYPTED_FILE_IDENTIFY);
outputStream.write(encryptedByteArray);
return EncryptStatus.ENCRYPT_SUCCESS;
}
} catch (Exception e1) {
logger.error("文件加密失败, 文件=" + outFile.getPath() + " 错误=" + e1);
e1.printStackTrace();
}
return EncryptStatus.ENCRYPT_FAIL;
}
/**
* 解密文件并使用默认的私钥解密,
* 不支持把解密后的文件输出到源文件上
* @param decryptFile 要解密的文件
* @param fileOutputStream 解密后文件输出流。该文件流不会在此方法关闭
* @return 返回是否解密成功,true:解密成功. false: 解密失败或者文件是未加密的文件
*/
public static byte[] decryptFileByDefaultKeyPair(File decryptFile) {
try (FileInputStream inputStream = new FileInputStream(decryptFile);){
if (isEncryptedFile(inputStream)) {
byte[] encryptByteArray = IOUtils.toByteArray(inputStream);
byte[] decryptByteArray = SM2Util.decrypt(DefaultKeyPair.DEFAULT_KEY_PAIR.getPrivate(),encryptByteArray);
return decryptByteArray;
} else {
inputStream.close();
return FileUtils.readFileToByteArray(decryptFile);
}
} catch (InvalidCipherTextException | IOException e) {
logger.error("文件解密失败, 文件=" + decryptFile.getPath() + " 错误=" + e);
e.printStackTrace();
}
return null;
}
/**
* 解密文件并使用默认的私钥解密,
* 不支持把解密后的文件输出到源文件上
* @param decryptFile 要解密的文件
* @param fileOutputStream 解密后文件输出流。该文件流不会在此方法关闭
* @return 返回是否解密成功,true:解密成功. false: 解密失败或者文件是未加密的文件
*/
public static EncryptStatus decryptFileByDefaultKeyPair(File decryptFile, OutputStream fileOutputStream) {
try (FileInputStream inputStream = new FileInputStream(decryptFile);){
if (isEncryptedFile(inputStream)) {
byte[] encryptByteArray = IOUtils.toByteArray(inputStream);
byte[] decryptByteArray = SM2Util.decrypt(DefaultKeyPair.DEFAULT_KEY_PAIR.getPrivate(),encryptByteArray);
inputStream.close();
fileOutputStream.write(decryptByteArray);
return EncryptStatus.DECRYPT_SUCCESS;
} else {
return EncryptStatus.UNENCRYPTED_FILE;
}
} catch (InvalidCipherTextException | IOException e) {
logger.error("文件解密失败, 文件=" + decryptFile.getPath() + " 错误=" + e);
e.printStackTrace();
}
return EncryptStatus.DECRYPT_FAIL;
}
/**
* 解密文件并使用默认的私钥解密
* @param decryptFile 要解密的文件
* @param fileOutputStream 解密后文件输出流。该文件流不会在此方法关闭
* @return 返回是否解密成功,true:解密成功. false: 解密失败或者文件是未加密的文件
*/
public static EncryptStatus decryptFileByDefaultKeyPair(File decryptFile, File outputFile) {
try (FileInputStream decryptInputStream = new FileInputStream(decryptFile);){
if (isEncryptedFile(decryptInputStream)) {
byte[] encryptByteArray = IOUtils.toByteArray(decryptInputStream);
decryptInputStream.close();
byte[] decryptByteArray = SM2Util.decrypt(DefaultKeyPair.DEFAULT_KEY_PAIR.getPrivate(),encryptByteArray);
FileUtils.writeByteArrayToFile(outputFile, decryptByteArray);
return EncryptStatus.DECRYPT_SUCCESS;
} else {
return EncryptStatus.UNENCRYPTED_FILE;
}
} catch (InvalidCipherTextException | IOException e) {
logger.error("文件解密失败, 文件=" + decryptFile.getPath() + " 错误=" + e);
e.printStackTrace();
}
return EncryptStatus.DECRYPT_FAIL;
}
public static EncryptStatus decryptFileByDefaultKeyPair(FileInputStream decryptInputStream, FileOutputStream fileOutputStream) {
try (FileInputStream inputStream = decryptInputStream;
FileOutputStream outputStream = fileOutputStream){
if (isEncryptedFile(inputStream)) {
byte[] encryptByteArray = IOUtils.toByteArray(inputStream);
byte[] decryptByteArray = SM2Util.decrypt(DefaultKeyPair.DEFAULT_KEY_PAIR.getPrivate(),encryptByteArray);
inputStream.close();
outputStream.write(decryptByteArray);
return EncryptStatus.DECRYPT_SUCCESS;
} else {
return EncryptStatus.UNENCRYPTED_FILE;
}
} catch (InvalidCipherTextException | IOException e) {
logger.error("文件解密失败, 错误=" + e);
e.printStackTrace();
}
return EncryptStatus.DECRYPT_FAIL;
}
public static boolean isEncryptedFile(byte[] decryptByteArray, byte[] identifyByte) {
if (decryptByteArray.length == 0) {
return false;
}
if (decryptByteArray.length < identifyByte.length) {
return false;
}
for (int i = 0; i < identifyByte.length; i++) {
if (identifyByte[i] != decryptByteArray[i]) {
return false;
}
}
return true;
}
public static boolean isEncryptedFile(InputStream inputStream, byte[] identifyByte) throws IOException {
byte[] fileByteArray = new byte[identifyByte.length];
int index = inputStream.read(fileByteArray);
if (index == -1) {
return false;
}
if (index != identifyByte.length) {
return false;
}
for (int i = 0; i < identifyByte.length; i++) {
if (identifyByte[i] != fileByteArray[i]) {
return false;
}
}
return true;
}
/**
* 判断文件是否已经加密过
* @param inputStream 文件的读取流 使用默认的加密状态数组
* @return
* @throws IOException
*/
public static boolean isEncryptedFile(InputStream inputStream) throws IOException {
return isEncryptedFile(inputStream, ENCRYPTED_FILE_IDENTIFY);
}
/**
* 判断文件是否已经加密
* @param file
* @param identifyByte 加密状态数组
* @return
* @throws IOException
*/
public static boolean isEncryptedFile(File file, byte[] identifyByte) throws IOException {
FileInputStream inputStream = new FileInputStream(file);
return isEncryptedFile(inputStream, identifyByte);
}
/**
* 判断文件是否已经加密 使用默认的加密状态数组
* @param decryptByteArray 文件的字节数组
* @return
*/
public static boolean isEncryptedFile(byte[] decryptByteArray) {
return isEncryptedFile(decryptByteArray, ENCRYPTED_FILE_IDENTIFY);
}
}
package com.archser.aserver.util.gm;
import org.bouncycastle.crypto.InvalidCipherTextException;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
/*
* SM2加密字符串
*/
public class SM2EncryptString {
/**
*
* @param str 要加密的字符串
* @return 加密后的16进制字符串,长度随加密字符串的长度增加
* @throws InvalidCipherTextException
*/
public static String encryptByDefaultKeyPair(String str) throws InvalidCipherTextException {
return ByteUtils.toHexString(SM2Util.encrypt(DefaultKeyPair.DEFAULT_KEY_PAIR.getPublic(), str.getBytes()));
}
/**
*
* @param str 要加密的字符串
* @return 加密后的16进制字符串,长度随加密字符串的长度增加
* @throws InvalidCipherTextException
*/
public static String decrypttByDefaultKeyPair(String str) throws InvalidCipherTextException {
return new String(SM2Util.decrypt(DefaultKeyPair.DEFAULT_KEY_PAIR.getPrivate(), ByteUtils.fromHexString(str)));
}
public static void main(String[] args) throws Exception {
// System.out.println("adm32313121231231232321311231313213213121312312312312312312312312312312313131231231231i3231n56100你".getBytes().length);
// System.out.println(encryptByDefaultKeyPair("adm32313121231231232321311231313213213121312312312312312312312312312312313131231231231i3231n56100你").length());
// RSAUtil rsaUtil = new RSAUtil();
// System.out.println(rsaUtil.rsaEncrypt("admi323232131321131n").length());
System.err.println(encryptByDefaultKeyPair("asdfasdf"));
System.err.println(decrypttByDefaultKeyPair(encryptByDefaultKeyPair("asdfasdf")));
}
}
package com.archser.aserver.util.gm;
import java.math.BigInteger;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
/**
* SM2加密结果 可获取加密后的字节数组和密钥对
* @author robin
*
*/
public class SM2EncryptedResult {
/**
* 加密后的字节数组
*/
private byte[] encryptedByteArray;
/**
* 密钥对
*/
private BCECipherKeyPair keyPair;
public SM2EncryptedResult(byte[] encryptedByteArray, BCECipherKeyPair keyPair) {
this.encryptedByteArray = encryptedByteArray;
this.keyPair = keyPair;
}
public byte[] getEncryptedByteArray() {
return encryptedByteArray;
}
public void setEncryptedByteArray(byte[] encryptedByteArray) {
this.encryptedByteArray = encryptedByteArray;
}
public BCECipherKeyPair getKeyPair() {
return keyPair;
}
public void setKeyPair(BCECipherKeyPair keyPair) {
this.keyPair = keyPair;
}
public String getPublicXHex() {
return ByteUtils.toHexString(this.keyPair.getPublic().getQ().getAffineXCoord().getEncoded());
}
public String getPublicYHex() {
return ByteUtils.toHexString(keyPair.getPublic().getQ().getAffineYCoord().getEncoded());
}
public BigInteger getPublicY() {
return keyPair.getPublic().getQ().getAffineYCoord().toBigInteger();
}
public BigInteger getPublicX() {
return keyPair.getPublic().getQ().getAffineXCoord().toBigInteger();
}
public BigInteger getPrivateD() {
return keyPair.getPrivate().getD();
}
public ECPrivateKeyParameters getPrivate() {
return keyPair.getPrivate();
}
public ECPublicKeyParameters getPublic() {
return keyPair.getPublic();
}
public String getHexPublic() {
return ByteUtils.toHexString(keyPair.getPublic().getQ().getEncoded(false)).toUpperCase();
}
}
package com.archser.aserver.util.gm;
import org.bouncycastle.crypto.agreement.SM2KeyExchange;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.crypto.params.ParametersWithID;
import org.bouncycastle.crypto.params.SM2KeyExchangePrivateParameters;
import org.bouncycastle.crypto.params.SM2KeyExchangePublicParameters;
import java.util.Arrays;
public class SM2KeyExchangeUtil {
/**
* @param initiator true表示发起方,false表示响应方
* @param keyBits 生成的密钥长度
* @param selfStaticPriv 己方固定私钥
* @param selfEphemeralPriv 己方临时私钥
* @param selfId 己方ID
* @param otherStaticPub 对方固定公钥
* @param otherEphemeralPub 对方临时公钥
* @param otherId 对方ID
* @return 返回协商出的密钥,但是这个密钥是没有经过确认的
*/
public static byte[] calculateKey(boolean initiator, int keyBits,
ECPrivateKeyParameters selfStaticPriv, ECPrivateKeyParameters selfEphemeralPriv, byte[] selfId,
ECPublicKeyParameters otherStaticPub, ECPublicKeyParameters otherEphemeralPub, byte[] otherId) {
SM2KeyExchange exch = new SM2KeyExchange();
exch.init(new ParametersWithID(
new SM2KeyExchangePrivateParameters(initiator, selfStaticPriv, selfEphemeralPriv),
selfId));
return exch.calculateKey(
keyBits,
new ParametersWithID(new SM2KeyExchangePublicParameters(otherStaticPub, otherEphemeralPub), otherId));
}
/**
* @param initiator true表示发起方,false表示响应方
* @param keyBits 生成的密钥长度
* @param confirmationTag 确认信息,如果是响应方可以为null;如果是发起方则应为响应方的s1
* @param selfStaticPriv 己方固定私钥
* @param selfEphemeralPriv 己方临时私钥
* @param selfId 己方ID
* @param otherStaticPub 对方固定公钥
* @param otherEphemeralPub 对方临时公钥
* @param otherId 对方ID
* @return
*/
public static ExchangeResult calculateKeyWithConfirmation(boolean initiator, int keyBits, byte[] confirmationTag,
ECPrivateKeyParameters selfStaticPriv, ECPrivateKeyParameters selfEphemeralPriv, byte[] selfId,
ECPublicKeyParameters otherStaticPub, ECPublicKeyParameters otherEphemeralPub, byte[] otherId) {
SM2KeyExchange exch = new SM2KeyExchange();
exch.init(new ParametersWithID(
new SM2KeyExchangePrivateParameters(initiator, selfStaticPriv, selfEphemeralPriv),
selfId));
byte[][] result = exch.calculateKeyWithConfirmation(
keyBits,
confirmationTag,
new ParametersWithID(new SM2KeyExchangePublicParameters(otherStaticPub, otherEphemeralPub), otherId));
ExchangeResult confirmResult = new ExchangeResult();
confirmResult.setKey(result[0]);
if (initiator) {
confirmResult.setS2(result[1]);
} else {
confirmResult.setS1(result[1]);
confirmResult.setS2(result[2]);
}
return confirmResult;
}
/**
* @param s2
* @param confirmationTag 实际上是发起方的s2
* @return
*/
public static boolean responderConfirm(byte[] s2, byte[] confirmationTag) {
return Arrays.equals(s2, confirmationTag);
}
public static class ExchangeResult {
private byte[] key;
/**
* 发起方没有s1
*/
private byte[] s1;
private byte[] s2;
public byte[] getKey() {
return key;
}
public void setKey(byte[] key) {
this.key = key;
}
public byte[] getS1() {
return s1;
}
public void setS1(byte[] s1) {
this.s1 = s1;
}
public byte[] getS2() {
return s2;
}
public void setS2(byte[] s2) {
this.s2 = s2;
}
}
}
package com.archser.aserver.util.gm;
import org.bouncycastle.asn1.ASN1EncodableVector;
import org.bouncycastle.asn1.ASN1Encoding;
import org.bouncycastle.asn1.ASN1Integer;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.DERSequence;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.CryptoException;
import org.bouncycastle.crypto.CryptoServicesRegistrar;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.crypto.params.ECDomainParameters;
import org.bouncycastle.crypto.params.ECKeyParameters;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.crypto.params.ParametersWithID;
import org.bouncycastle.crypto.params.ParametersWithRandom;
import org.bouncycastle.crypto.signers.DSAKCalculator;
import org.bouncycastle.crypto.signers.RandomDSAKCalculator;
import org.bouncycastle.math.ec.ECAlgorithms;
import org.bouncycastle.math.ec.ECConstants;
import org.bouncycastle.math.ec.ECFieldElement;
import org.bouncycastle.math.ec.ECMultiplier;
import org.bouncycastle.math.ec.ECPoint;
import org.bouncycastle.math.ec.FixedPointCombMultiplier;
import org.bouncycastle.util.Arrays;
import org.bouncycastle.util.encoders.Hex;
import java.io.IOException;
import java.math.BigInteger;
/**
* 有的国密需求是用户可以自己做预处理,签名验签只是对预处理的结果进行签名和验签
*/
public class SM2PreprocessSigner implements ECConstants {
private static final int DIGEST_LENGTH = 32; // bytes
private final DSAKCalculator kCalculator = new RandomDSAKCalculator();
private Digest digest = null;
private ECDomainParameters ecParams;
private ECPoint pubPoint;
private ECKeyParameters ecKey;
private byte[] userID;
public void init(boolean forSigning, CipherParameters param) {
init(forSigning, new SM3Digest(), param);
}
public void init(boolean forSigning, Digest digest, CipherParameters param) throws RuntimeException {
CipherParameters baseParam;
if (digest.getDigestSize() != DIGEST_LENGTH) {
throw new RuntimeException("Digest size must be " + DIGEST_LENGTH);
}
this.digest = digest;
if (param instanceof ParametersWithID) {
baseParam = ((ParametersWithID) param).getParameters();
userID = ((ParametersWithID) param).getID();
} else {
baseParam = param;
userID = Hex.decode("31323334353637383132333435363738"); // the default value
}
if (forSigning) {
if (baseParam instanceof ParametersWithRandom) {
ParametersWithRandom rParam = (ParametersWithRandom) baseParam;
ecKey = (ECKeyParameters) rParam.getParameters();
ecParams = ecKey.getParameters();
kCalculator.init(ecParams.getN(), rParam.getRandom());
} else {
ecKey = (ECKeyParameters) baseParam;
ecParams = ecKey.getParameters();
kCalculator.init(ecParams.getN(), CryptoServicesRegistrar.getSecureRandom());
}
pubPoint = createBasePointMultiplier().multiply(ecParams.getG(), ((ECPrivateKeyParameters) ecKey).getD()).normalize();
} else {
ecKey = (ECKeyParameters) baseParam;
ecParams = ecKey.getParameters();
pubPoint = ((ECPublicKeyParameters) ecKey).getQ();
}
}
/**
* 预处理,辅助方法
* ZA=H256(ENT LA ∥ IDA ∥ a ∥ b ∥ xG ∥yG ∥ xA ∥ yA)。
* M=ZA ∥ M;
* e = Hv(M)
* @return
*/
public byte[] preprocess(byte[] m, int off, int len) {
byte[] z = getZ(userID);
digest.update(z, 0, z.length);
digest.update(m, off, len);
byte[] eHash = new byte[DIGEST_LENGTH];
digest.doFinal(eHash, 0);
return eHash;
}
public boolean verifySignature(byte[] eHash, byte[] signature) {
try {
BigInteger[] rs = derDecode(signature);
if (rs != null) {
return verifySignature(eHash, rs[0], rs[1]);
}
} catch (IOException e) {
}
return false;
}
public void reset() {
digest.reset();
}
public byte[] generateSignature(byte[] eHash) throws CryptoException {
BigInteger n = ecParams.getN();
BigInteger e = calculateE(eHash);
BigInteger d = ((ECPrivateKeyParameters) ecKey).getD();
BigInteger r, s;
ECMultiplier basePointMultiplier = createBasePointMultiplier();
// 5.2.1 Draft RFC: SM2 Public Key Algorithms
do // generate s
{
BigInteger k;
do // generate r
{
// A3
k = kCalculator.nextK();
// A4
ECPoint p = basePointMultiplier.multiply(ecParams.getG(), k).normalize();
// A5
r = e.add(p.getAffineXCoord().toBigInteger()).mod(n);
}
while (r.equals(ZERO) || r.add(k).equals(n));
// A6
BigInteger dPlus1ModN = d.add(ONE).modInverse(n);
s = k.subtract(r.multiply(d)).mod(n);
s = dPlus1ModN.multiply(s).mod(n);
}
while (s.equals(ZERO));
// A7
try {
return derEncode(r, s);
} catch (IOException ex) {
throw new CryptoException("unable to encode signature: " + ex.getMessage(), ex);
}
}
private boolean verifySignature(byte[] eHash, BigInteger r, BigInteger s) {
BigInteger n = ecParams.getN();
// 5.3.1 Draft RFC: SM2 Public Key Algorithms
// B1
if (r.compareTo(ONE) < 0 || r.compareTo(n) >= 0) {
return false;
}
// B2
if (s.compareTo(ONE) < 0 || s.compareTo(n) >= 0) {
return false;
}
// B3 eHash
// B4
BigInteger e = calculateE(eHash);
// B5
BigInteger t = r.add(s).mod(n);
if (t.equals(ZERO)) {
return false;
}
// B6
ECPoint q = ((ECPublicKeyParameters) ecKey).getQ();
ECPoint x1y1 = ECAlgorithms.sumOfTwoMultiplies(ecParams.getG(), s, q, t).normalize();
if (x1y1.isInfinity()) {
return false;
}
// B7
BigInteger expectedR = e.add(x1y1.getAffineXCoord().toBigInteger()).mod(n);
return expectedR.equals(r);
}
private byte[] digestDoFinal() {
byte[] result = new byte[digest.getDigestSize()];
digest.doFinal(result, 0);
reset();
return result;
}
private byte[] getZ(byte[] userID) {
digest.reset();
addUserID(digest, userID);
addFieldElement(digest, ecParams.getCurve().getA());
addFieldElement(digest, ecParams.getCurve().getB());
addFieldElement(digest, ecParams.getG().getAffineXCoord());
addFieldElement(digest, ecParams.getG().getAffineYCoord());
addFieldElement(digest, pubPoint.getAffineXCoord());
addFieldElement(digest, pubPoint.getAffineYCoord());
byte[] result = new byte[digest.getDigestSize()];
digest.doFinal(result, 0);
return result;
}
private void addUserID(Digest digest, byte[] userID) {
int len = userID.length * 8;
digest.update((byte) (len >> 8 & 0xFF));
digest.update((byte) (len & 0xFF));
digest.update(userID, 0, userID.length);
}
private void addFieldElement(Digest digest, ECFieldElement v) {
byte[] p = v.getEncoded();
digest.update(p, 0, p.length);
}
protected ECMultiplier createBasePointMultiplier() {
return new FixedPointCombMultiplier();
}
protected BigInteger calculateE(byte[] message) {
return new BigInteger(1, message);
}
protected BigInteger[] derDecode(byte[] encoding)
throws IOException {
ASN1Sequence seq = ASN1Sequence.getInstance(ASN1Primitive.fromByteArray(encoding));
if (seq.size() != 2) {
return null;
}
BigInteger r = ASN1Integer.getInstance(seq.getObjectAt(0)).getValue();
BigInteger s = ASN1Integer.getInstance(seq.getObjectAt(1)).getValue();
byte[] expectedEncoding = derEncode(r, s);
if (!Arrays.constantTimeAreEqual(expectedEncoding, encoding)) {
return null;
}
return new BigInteger[]{r, s};
}
protected byte[] derEncode(BigInteger r, BigInteger s)
throws IOException {
ASN1EncodableVector v = new ASN1EncodableVector();
v.add(new ASN1Integer(r));
v.add(new ASN1Integer(s));
return new DERSequence(v).getEncoded(ASN1Encoding.DER);
}
}
package com.archser.aserver.util.gm;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.ASN1EncodableVector;
import org.bouncycastle.asn1.ASN1Encoding;
import org.bouncycastle.asn1.ASN1Integer;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.DEROctetString;
import org.bouncycastle.asn1.DERSequence;
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.CryptoException;
import org.bouncycastle.crypto.InvalidCipherTextException;
import org.bouncycastle.crypto.engines.SM2Engine;
import org.bouncycastle.crypto.params.ECDomainParameters;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.crypto.params.ParametersWithID;
import org.bouncycastle.crypto.params.ParametersWithRandom;
import org.bouncycastle.crypto.signers.SM2Signer;
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey;
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;
import org.bouncycastle.math.ec.ECPoint;
import org.bouncycastle.math.ec.custom.gm.SM2P256V1Curve;
import java.io.IOException;
import java.math.BigInteger;
import java.security.InvalidAlgorithmParameterException;
import java.security.KeyPair;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import java.security.spec.ECFieldFp;
import java.security.spec.EllipticCurve;
public class SM2Util extends GMBaseUtil {
//////////////////////////////////////////////////////////////////////////////////////
/*
* 以下为SM2推荐曲线参数
*/
public static final SM2P256V1Curve CURVE = new SM2P256V1Curve();
public final static BigInteger SM2_ECC_P = CURVE.getQ();
public final static BigInteger SM2_ECC_A = CURVE.getA().toBigInteger();
public final static BigInteger SM2_ECC_B = CURVE.getB().toBigInteger();
public final static BigInteger SM2_ECC_N = CURVE.getOrder();
public final static BigInteger SM2_ECC_H = CURVE.getCofactor();
public final static BigInteger SM2_ECC_GX = new BigInteger(
"32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7", 16);
public final static BigInteger SM2_ECC_GY = new BigInteger(
"BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0", 16);
public static final ECPoint G_POINT = CURVE.createPoint(SM2_ECC_GX, SM2_ECC_GY);
public static final ECDomainParameters DOMAIN_PARAMS = new ECDomainParameters(CURVE, G_POINT,
SM2_ECC_N, SM2_ECC_H);
public static final int CURVE_LEN = BCECUtil.getCurveLength(DOMAIN_PARAMS);
//////////////////////////////////////////////////////////////////////////////////////
public static final EllipticCurve JDK_CURVE = new EllipticCurve(new ECFieldFp(SM2_ECC_P), SM2_ECC_A, SM2_ECC_B);
public static final java.security.spec.ECPoint JDK_G_POINT = new java.security.spec.ECPoint(
G_POINT.getAffineXCoord().toBigInteger(), G_POINT.getAffineYCoord().toBigInteger());
public static final java.security.spec.ECParameterSpec JDK_EC_SPEC = new java.security.spec.ECParameterSpec(
JDK_CURVE, JDK_G_POINT, SM2_ECC_N, SM2_ECC_H.intValue());
//////////////////////////////////////////////////////////////////////////////////////
public static final int SM3_DIGEST_LENGTH = 32;
/**
* 生成ECC密钥对
*
* @return ECC密钥对
*/
public static AsymmetricCipherKeyPair generateKeyPairParameter() {
SecureRandom random = new SecureRandom();
return BCECUtil.generateKeyPairParameter(DOMAIN_PARAMS, random);
}
public static KeyPair generateKeyPair() throws NoSuchProviderException, NoSuchAlgorithmException,
InvalidAlgorithmParameterException {
SecureRandom random = new SecureRandom();
return BCECUtil.generateKeyPair(DOMAIN_PARAMS, random);
}
/**
* 只获取私钥里的d,32字节
*
* @param privateKey
* @return
*/
public static byte[] getRawPrivateKey(BCECPrivateKey privateKey) {
return fixToCurveLengthBytes(privateKey.getD().toByteArray());
}
/**
* 只获取公钥里的XY分量,64字节
*
* @param publicKey
* @return
*/
public static byte[] getRawPublicKey(BCECPublicKey publicKey) {
byte[] src65 = publicKey.getQ().getEncoded(false);
byte[] rawXY = new byte[CURVE_LEN * 2];//SM2的话这里应该是64字节
System.arraycopy(src65, 1, rawXY, 0, rawXY.length);
return rawXY;
}
public static byte[] encrypt(BCECPublicKey pubKey, byte[] srcData) throws InvalidCipherTextException {
ECPublicKeyParameters pubKeyParameters = BCECUtil.convertPublicKeyToParameters(pubKey);
return encrypt(pubKeyParameters, srcData);
}
/**
* ECC公钥加密
*
* @param pubKeyParameters ECC公钥
* @param srcData 源数据
* @return SM2密文,实际包含三部分:ECC公钥、真正的密文、公钥和原文的SM3-HASH值
* @throws InvalidCipherTextException
*/
public static byte[] encrypt(ECPublicKeyParameters pubKeyParameters, byte[] srcData)
throws InvalidCipherTextException {
SM2Engine engine = new SM2Engine();
ParametersWithRandom pwr = new ParametersWithRandom(pubKeyParameters, new SecureRandom());
engine.init(true, pwr);
return engine.processBlock(srcData, 0, srcData.length);
}
public static byte[] decrypt(BCECPrivateKey priKey, byte[] sm2Cipher) throws InvalidCipherTextException {
ECPrivateKeyParameters priKeyParameters = BCECUtil.convertPrivateKeyToParameters(priKey);
return decrypt(priKeyParameters, sm2Cipher);
}
/**
* ECC私钥解密
*
* @param priKeyParameters ECC私钥
* @param sm2Cipher SM2密文,实际包含三部分:ECC公钥、真正的密文、公钥和原文的SM3-HASH值
* @return 原文
* @throws InvalidCipherTextException
*/
public static byte[] decrypt(ECPrivateKeyParameters priKeyParameters, byte[] sm2Cipher)
throws InvalidCipherTextException {
SM2Engine engine = new SM2Engine();
engine.init(false, priKeyParameters);
return engine.processBlock(sm2Cipher, 0, sm2Cipher.length);
}
/**
* 分解SM2密文
*
* @param cipherText SM2密文
* @return
*/
public static SM2Cipher parseSM2Cipher(byte[] cipherText) {
int curveLength = BCECUtil.getCurveLength(DOMAIN_PARAMS);
return parseSM2Cipher(curveLength, SM3_DIGEST_LENGTH, cipherText);
}
/**
* 分解SM2密文
*
* @param curveLength ECC曲线长度
* @param digestLength HASH长度
* @param cipherText SM2密文
* @return
*/
public static SM2Cipher parseSM2Cipher(int curveLength, int digestLength,
byte[] cipherText) {
byte[] c1 = new byte[curveLength * 2 + 1];
System.arraycopy(cipherText, 0, c1, 0, c1.length);
byte[] c2 = new byte[cipherText.length - c1.length - digestLength];
System.arraycopy(cipherText, c1.length, c2, 0, c2.length);
byte[] c3 = new byte[digestLength];
System.arraycopy(cipherText, c1.length + c2.length, c3, 0, c3.length);
SM2Cipher result = new SM2Cipher();
result.setC1(c1);
result.setC2(c2);
result.setC3(c3);
result.setCipherText(cipherText);
return result;
}
/**
* DER编码C1C2C3密文(根据《SM2密码算法使用规范》 GM/T 0009-2012)
*
* @param cipher
* @return
* @throws IOException
*/
public static byte[] encodeSM2CipherToDER(byte[] cipher) throws IOException {
int curveLength = BCECUtil.getCurveLength(DOMAIN_PARAMS);
return encodeSM2CipherToDER(curveLength, SM3_DIGEST_LENGTH, cipher);
}
/**
* DER编码C1C2C3密文(根据《SM2密码算法使用规范》 GM/T 0009-2012)
*
* @param curveLength
* @param digestLength
* @param cipher
* @return
* @throws IOException
*/
public static byte[] encodeSM2CipherToDER(int curveLength, int digestLength, byte[] cipher)
throws IOException {
int startPos = 1;
byte[] c1x = new byte[curveLength];
System.arraycopy(cipher, startPos, c1x, 0, c1x.length);
startPos += c1x.length;
byte[] c1y = new byte[curveLength];
System.arraycopy(cipher, startPos, c1y, 0, c1y.length);
startPos += c1y.length;
byte[] c2 = new byte[cipher.length - c1x.length - c1y.length - 1 - digestLength];
System.arraycopy(cipher, startPos, c2, 0, c2.length);
startPos += c2.length;
byte[] c3 = new byte[digestLength];
System.arraycopy(cipher, startPos, c3, 0, c3.length);
ASN1Encodable[] arr = new ASN1Encodable[4];
arr[0] = new ASN1Integer(c1x);
arr[1] = new ASN1Integer(c1y);
arr[2] = new DEROctetString(c3);
arr[3] = new DEROctetString(c2);
DERSequence ds = new DERSequence(arr);
return ds.getEncoded(ASN1Encoding.DER);
}
/**
* 解DER编码密文(根据《SM2密码算法使用规范》 GM/T 0009-2012)
*
* @param derCipher
* @return
*/
public static byte[] decodeDERSM2Cipher(byte[] derCipher) {
ASN1Sequence as = DERSequence.getInstance(derCipher);
byte[] c1x = ((ASN1Integer) as.getObjectAt(0)).getValue().toByteArray();
byte[] c1y = ((ASN1Integer) as.getObjectAt(1)).getValue().toByteArray();
byte[] c3 = ((DEROctetString) as.getObjectAt(2)).getOctets();
byte[] c2 = ((DEROctetString) as.getObjectAt(3)).getOctets();
int pos = 0;
byte[] cipherText = new byte[1 + c1x.length + c1y.length + c2.length + c3.length];
final byte uncompressedFlag = 0x04;
cipherText[0] = uncompressedFlag;
pos += 1;
System.arraycopy(c1x, 0, cipherText, pos, c1x.length);
pos += c1x.length;
System.arraycopy(c1y, 0, cipherText, pos, c1y.length);
pos += c1y.length;
System.arraycopy(c2, 0, cipherText, pos, c2.length);
pos += c2.length;
System.arraycopy(c3, 0, cipherText, pos, c3.length);
return cipherText;
}
public static byte[] sign(BCECPrivateKey priKey, byte[] srcData) throws NoSuchAlgorithmException,
NoSuchProviderException, CryptoException {
ECPrivateKeyParameters priKeyParameters = BCECUtil.convertPrivateKeyToParameters(priKey);
return sign(priKeyParameters, null, srcData);
}
/**
* ECC私钥签名
* 不指定withId,则默认withId为字节数组:"1234567812345678".getBytes()
*
* @param priKeyParameters ECC私钥
* @param srcData 源数据
* @return 签名
* @throws CryptoException
*/
public static byte[] sign(ECPrivateKeyParameters priKeyParameters, byte[] srcData) throws CryptoException {
return sign(priKeyParameters, null, srcData);
}
public static byte[] sign(BCECPrivateKey priKey, byte[] withId, byte[] srcData) throws CryptoException {
ECPrivateKeyParameters priKeyParameters = BCECUtil.convertPrivateKeyToParameters(priKey);
return sign(priKeyParameters, withId, srcData);
}
/**
* ECC私钥签名
*
* @param priKeyParameters ECC私钥
* @param withId 可以为null,若为null,则默认withId为字节数组:"1234567812345678".getBytes()
* @param srcData 源数据
* @return 签名
* @throws CryptoException
*/
public static byte[] sign(ECPrivateKeyParameters priKeyParameters, byte[] withId, byte[] srcData)
throws CryptoException {
SM2Signer signer = new SM2Signer();
CipherParameters param = null;
ParametersWithRandom pwr = new ParametersWithRandom(priKeyParameters, new SecureRandom());
if (withId != null) {
param = new ParametersWithID(pwr, withId);
} else {
param = pwr;
}
signer.init(true, param);
signer.update(srcData, 0, srcData.length);
return signer.generateSignature();
}
/**
* 将DER编码的SM2签名解析成64字节的纯R+S字节流
*
* @param derSign
* @return
*/
public static byte[] decodeDERSM2Sign(byte[] derSign) {
ASN1Sequence as = DERSequence.getInstance(derSign);
byte[] rBytes = ((ASN1Integer) as.getObjectAt(0)).getValue().toByteArray();
byte[] sBytes = ((ASN1Integer) as.getObjectAt(1)).getValue().toByteArray();
//由于大数的补0规则,所以可能会出现33个字节的情况,要修正回32个字节
rBytes = fixToCurveLengthBytes(rBytes);
sBytes = fixToCurveLengthBytes(sBytes);
byte[] rawSign = new byte[rBytes.length + sBytes.length];
System.arraycopy(rBytes, 0, rawSign, 0, rBytes.length);
System.arraycopy(sBytes, 0, rawSign, rBytes.length, sBytes.length);
return rawSign;
}
/**
* 把64字节的纯R+S字节流转换成DER编码字节流
*
* @param rawSign
* @return
* @throws IOException
*/
public static byte[] encodeSM2SignToDER(byte[] rawSign) throws IOException {
//要保证大数是正数
BigInteger r = new BigInteger(1, extractBytes(rawSign, 0, 32));
BigInteger s = new BigInteger(1, extractBytes(rawSign, 32, 32));
ASN1EncodableVector v = new ASN1EncodableVector();
v.add(new ASN1Integer(r));
v.add(new ASN1Integer(s));
return new DERSequence(v).getEncoded(ASN1Encoding.DER);
}
public static boolean verify(BCECPublicKey pubKey, byte[] srcData, byte[] sign) {
ECPublicKeyParameters pubKeyParameters = BCECUtil.convertPublicKeyToParameters(pubKey);
return verify(pubKeyParameters, null, srcData, sign);
}
/**
* ECC公钥验签
* 不指定withId,则默认withId为字节数组:"1234567812345678".getBytes()
*
* @param pubKeyParameters ECC公钥
* @param srcData 源数据
* @param sign 签名
* @return 验签成功返回true,失败返回false
*/
public static boolean verify(ECPublicKeyParameters pubKeyParameters, byte[] srcData, byte[] sign) {
return verify(pubKeyParameters, null, srcData, sign);
}
public static boolean verify(BCECPublicKey pubKey, byte[] withId, byte[] srcData, byte[] sign) {
ECPublicKeyParameters pubKeyParameters = BCECUtil.convertPublicKeyToParameters(pubKey);
return verify(pubKeyParameters, withId, srcData, sign);
}
/**
* ECC公钥验签
*
* @param pubKeyParameters ECC公钥
* @param withId 可以为null,若为null,则默认withId为字节数组:"1234567812345678".getBytes()
* @param srcData 源数据
* @param sign 签名
* @return 验签成功返回true,失败返回false
*/
public static boolean verify(ECPublicKeyParameters pubKeyParameters, byte[] withId, byte[] srcData, byte[] sign) {
SM2Signer signer = new SM2Signer();
CipherParameters param;
if (withId != null) {
param = new ParametersWithID(pubKeyParameters, withId);
} else {
param = pubKeyParameters;
}
signer.init(false, param);
signer.update(srcData, 0, srcData.length);
return signer.verifySignature(sign);
}
private static byte[] extractBytes(byte[] src, int offset, int length) {
byte[] result = new byte[length];
System.arraycopy(src, offset, result, 0, result.length);
return result;
}
private static byte[] fixToCurveLengthBytes(byte[] src) {
if (src.length == CURVE_LEN) {
return src;
}
byte[] result = new byte[CURVE_LEN];
if (src.length > CURVE_LEN) {
System.arraycopy(src, src.length - result.length, result, 0, result.length);
} else {
System.arraycopy(src, 0, result, result.length - src.length, src.length);
}
return result;
}
}
package com.archser.aserver.util.gm;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import org.apache.commons.io.FileUtils;
import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.crypto.macs.HMac;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
/**
*
* 不可逆SM3加密工具类
*
*/
public class SM3Util extends GMBaseUtil {
public static byte[] hash(byte[] srcData) {
SM3Digest digest = new SM3Digest();
digest.update(srcData, 0, srcData.length);
byte[] hash = new byte[digest.getDigestSize()];
digest.doFinal(hash, 0);
return hash;
}
public static boolean verify(byte[] srcData, byte[] sm3Hash) {
byte[] newHash = hash(srcData);
if (Arrays.equals(newHash, sm3Hash)) {
return true;
} else {
return false;
}
}
/**
* @param key 相当于salt
* @param srcData 要加密的字节数组
* @return 加密后的字节数组
*/
public static byte[] hmac(byte[] key, byte[] srcData) {
KeyParameter keyParameter = new KeyParameter(key);
SM3Digest digest = new SM3Digest();
HMac mac = new HMac(digest);
mac.init(keyParameter);
mac.update(srcData, 0, srcData.length);
byte[] result = new byte[mac.getMacSize()];
mac.doFinal(result, 0);
return result;
}
/**
*
* @param salt 相当于salt
* @param src 要加密的字符串
* @return 返回加密后 固定长度64的16进制字符串
*/
public static String encrypt(String salt, String src) {
byte[] hmac = hmac(salt.getBytes(), src.getBytes());
return ByteUtils.toHexString(hmac);
}
/**
*
* @param src 要加密的字符串
* @return 返回加密后 固定长度64的16进制字符串
*/
public static String encrypt(String src) {
byte[] srcData = src.getBytes();
byte[] hash = hash(srcData);
return ByteUtils.toHexString(hash);
}
/**
* 将文件生成SM3密码
* @param file
* @return
* @throws IOException
*/
public static String encryptFile(File file) throws IOException {
byte[] fileByteArray = FileUtils.readFileToByteArray(file);
byte[] hash = SM3Util.hash(fileByteArray);
return ByteUtils.toHexString(hash);
}
/**
* 校验文件的sm3密码是否正确
* @param file
* @param sm3HexHash
* @return
* @throws IOException
*/
public static boolean verify(File file, String sm3HexHash) throws IOException {
byte[] sm3Hash = ByteUtils.fromHexString(sm3HexHash);
byte[] fileByteArray = FileUtils.readFileToByteArray(file);
return verify(fileByteArray, sm3Hash);
}
}
package com.archser.aserver.util.gm;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.SecureRandom;
import org.apache.commons.io.FileUtils;
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.CryptoException;
import org.bouncycastle.crypto.InvalidCipherTextException;
import org.bouncycastle.crypto.engines.SM2Engine;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.crypto.params.ParametersWithRandom;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
public class TestEncryptFile {
public static void main(String[] args) throws IOException, CryptoException {
testjsSM44();
// List<HashMap<String, Object>> files = new ArrayList<HashMap<String, Object>>();
// HashMap<String, Object> hashmap = new HashMap<String, Object>();
// hashmap.put("path", "//5---121_424.pdf");
// hashmap.put("server", "");
// hashmap.put("filename", "5---121_424.pdf");
// hashmap.put("size", 3213121L);
// files.add(hashmap);
// String jsonString2 = JSON.toJSONString(Ret.ok("files", files));
//
// HashMap parseArray = JSON.parseObject(jsonString2, HashMap.class);
// List<JSONObject> filess = (List<JSONObject>) parseArray.get("files");
// JSONObject json = filess.get(0);
// System.out.println(json.getString("path"));
}
public static void testjsSM44() throws InvalidCipherTextException {
String value = "0464d391e3e4420ed0612c0f0f69c5bb9e42089baf6f12b409822102ffd21426d3158abca84827b5eb11731cd54770ac098c49e5d11ab69f8de8cfd537e20c3d0f1de357095ee58a33630749369d64142c57d723bdf3f9cb95133dd7cc07c04b9e80f6d5b4fa";
byte[] valueByte = ByteUtils.fromHexString(value);
String publicKey = "042fcdf16f6210cc068774ad92b7dec96946feae9a927c4ea4246d044ac8db3079a111c4101232d7aae8e6c6028f3ba93222cb59bff3969a2a3a700544085d1ef9";
String priKey = "38627fffe8003e6d2faa76d4eae2f74fd9cd7be257ab36c356c4f01bbc17e41d";
ECPrivateKeyParameters privateKeyParameters = BCECUtil.createECPrivateKeyParameters(new BigInteger(ByteUtils.fromHexString( priKey)), SM2Util.DOMAIN_PARAMS);
byte[] decrypt = SM2Util.decrypt(privateKeyParameters, valueByte);
// SM2Engine engine2 = new SM2Engine();
// engine2.init(false, privateKeyParameters);
// byte[] processBlock = engine2.processBlock(valueByte, 0, valueByte.length);
System.out.println(new String(decrypt));
}
public static void testjsSM23() throws InvalidCipherTextException {
String value = "0468c934a5cdb36a21c4c80c48c3de73c7ccb2720b959c8be7d12521a28b823eeb08853dcf0e4547ef5155f704ee26e0aaba0aaa983684ea9a4b4786927d6bea4f85a4f15ae3157f8a48e9e1039a0aa60c955976765e37f31eb583be9803eacb434fb8c72ee2e41094";
byte[] valueByte = ByteUtils.fromHexString(value);
String publicKey = "042fcdf16f6210cc068774ad92b7dec96946feae9a927c4ea4246d044ac8db3079a111c4101232d7aae8e6c6028f3ba93222cb59bff3969a2a3a700544085d1ef9";
String priKey = "a384edd62f620282ca3de1bfb49e1ec819f96b930c3fa4644f8c20eca3465194";
// ECPrivateKeyParameters privateKeyParameters = BCECUtil.createECPrivateKeyParameters(new BigInteger(ByteUtils.fromHexString( priKey)), SM2Util.DOMAIN_PARAMS);
BCECipherKeyPair createBCECipherKeyPair =
BCECUtil.createBCECipherKeyPair( publicKey, new BigInteger(ByteUtils.fromHexString( priKey)));
SM2Engine engine2 = new SM2Engine();
engine2.init(false, createBCECipherKeyPair.getPrivate());
byte[] processBlock = engine2.processBlock(valueByte, 0, valueByte.length);
System.out.println(new String(processBlock));
}
public static void testjsSM22() throws InvalidCipherTextException {
String value = "0424b41f1e61f5e8927c1422a5cfdc336bd702f20453f2f853c1689cdb7c73711377fc7904571e2525367263aad46bb0ab0d300e2f51fa00e01fedaf5c08fdd21a92c24846ba9281e6f125cf07473622936982897449b729d383b7a25bcd2fa2e0b75c4f8f58a2d19f";
byte[] valueByte = ByteUtils.fromHexString(value);
String publicKey = "04272a7c8997d9883078acc011f450f88d54fdbbd6ddab950d7856a565182aad7e0b5da415f50e1d4433c2b633752dfa3bc04de879311091361db05584d972ff06";
String priKey = "38627fffe8003e6d2faa76d4eae2f74fd9cd7be257ab36c356c4f01bbc17e41d";
BCECipherKeyPair createBCECipherKeyPair =
BCECUtil.createBCECipherKeyPair( publicKey, new BigInteger(ByteUtils.fromHexString( priKey)));
// String str = "tetstets";
// SM2Engine engine = new SM2Engine();
// engine.init(true, new ParametersWithRandom(BCECUtil.createECPublicKeyParameters(publicKey, SM2Util.CURVE, SM2Util.DOMAIN_PARAMS)));
// byte[] encrypt = engine.processBlock(str.getBytes(), 0, str.getBytes().length);
// System.out.println(ByteUtils.toHexString(encrypt));
ECPrivateKeyParameters privateKeyParameters = BCECUtil.createECPrivateKeyParameters(new BigInteger(ByteUtils.fromHexString( priKey)), SM2Util.DOMAIN_PARAMS);
SM2Engine engine2 = new SM2Engine();
engine2.init(false, privateKeyParameters);
byte[] processBlock = engine2.processBlock(valueByte, 0, valueByte.length);
System.out.println(new String(processBlock));
// byte[] decrypt = SM2Util.decrypt(privateKeyParameters, valueByte);
}
public static void testjsSM2() throws InvalidCipherTextException, UnsupportedEncodingException {
String pubKey = "86a3ff2dfa2022d0e773c0f47ff1b36c956eb7d84d3aaa9209d1921138fab19c7069ee2e6b3fa37cedc656f6e597235d636ac478856132e1d6bdc56b0c7131dd";
String priKey = "84e673971537310487e9825f30baf8f8b291b2e51319cec085d7cd5571f00591";
// BCECipherKeyPair createBCECipherKeyPair =
// BCECUtil.createBCECipherKeyPair( pubKey, new BigInteger(ByteUtils.fromHexString( priKey)));
ECPublicKeyParameters publicKeyParameters = BCECUtil.createECPublicKeyParameters(pubKey, SM2Util.CURVE, SM2Util.DOMAIN_PARAMS);
String str = "tetstets";
SM2Engine engine = new SM2Engine();
engine.init(true, new ParametersWithRandom(publicKeyParameters));
byte[] encrypt = engine.processBlock(str.getBytes(), 0, str.getBytes().length);
// byte[] encrypt = SM2Util.encrypt(public1, str.getBytes());
System.out.println(ByteUtils.toHexString(encrypt));
//04cf79e7438f13584f229e3721ae01afaa2a3a793e054cb71b9bc6f196910bee72086feca9301e59ed27edf541fe7736d3ca3e9450fdab4a5b6430fb1ad155acd7900a93787356e53572803c899fc43bc0368f78f44b1be24ad1038e81fff21864da78c1a553434d28
// byte[] decrypt = SM2Util.decrypt(createBCECipherKeyPair.getPrivate(), encrypt);
String kk = "9ff214c5935d7e6ed04b2deebe0cf8a4cc79acb43bd9a575fe2f5d44bf699a606e79a9baf295777f18bee82dbcbc32db029b6c2b7622176e9aa7fa5936c2049d01841860542732c4be7d5d0cfbff5b2a83717413ad094b206d2fda6cd1644f3d9f603e8ccd08e1d6";
byte[] fromHexString = ByteUtils.fromHexString(kk);
ECPrivateKeyParameters ecPrivateKeyParameters = BCECUtil.createECPrivateKeyParameters(new BigInteger(ByteUtils.fromHexString( priKey)), SM2Util.DOMAIN_PARAMS);
SM2Engine engine2 = new SM2Engine();
engine2.init(false, ecPrivateKeyParameters);
byte[] processBlock = engine2.processBlock(fromHexString, 0, fromHexString.length);
//
System.out.println(new String(processBlock, "utf-8"));
}
public static void testSM3File() throws IOException, InvalidCipherTextException {
File file = new File(new String("F:\\test\\aaaa.pdf"));
byte[] readFileToByteArray = FileUtils.readFileToByteArray(file);
byte[] hash = SM3Util.hash(readFileToByteArray);
System.out.println(ByteUtils.toHexString(hash));
File file2 = new File("F:\\test\\签名已加密.pdf");
SM2EncryptFile.encryptFileByDefaultKeyPair(file,file2 );
File file3 = new File("F:\\test\\签名已解密.pdf");
SM2EncryptFile.decryptFileByDefaultKeyPair(file2, file3);
boolean verify = SM3Util.verify(FileUtils.readFileToByteArray(file3), hash);
System.out.println(verify);
}
public static void testSign() throws CryptoException {
AsymmetricCipherKeyPair keyPair = DefaultKeyPair.DEFAULT_KEY_PAIR;
ECPrivateKeyParameters priKey = (ECPrivateKeyParameters) keyPair.getPrivate();
ECPublicKeyParameters pubKey = (ECPublicKeyParameters) keyPair.getPublic();
String str = "静安分局大i幅度十分反对反对反对房贷首付对方3213给";
byte[] sign = SM2Util.sign(priKey,"签章".getBytes(), str.getBytes());
System.out.println("SM2 = \n" + ByteUtils.toHexString(sign));
String ss = "3045022100b686ac7fd625b60553d5a353b72f3cae296a52102ac2a424badf7280fdbd3e320220757af1db9cd4750cc971ef0704198ab97e8a13048c79595720e8f5b42b90cbbd";
// ss = ByteUtils.toHexString(sign);
boolean flag = SM2Util.verify(pubKey, "签章".getBytes(),str.getBytes(), ByteUtils.fromHexString(ss));
// boolean flag = SM2Util.verify(pubKey, "签章".getBytes(),str.getBytes(), sign);
System.out.println(flag);
}
public static void testEnAndDe() throws FileNotFoundException {
File file = new File(new String("F:\\test\\加解密文件.pdf"));
// EncryptStatus defaultKeyPair = SM2EncryptFile.encryptFileByDefaultKeyPair(file, file);
EncryptStatus defaultKeyPair = SM2EncryptFile.decryptFileByDefaultKeyPair(file, file);
System.out.println(defaultKeyPair);
}
// public static void testEncryptttt() throws InvalidCipherTextException, IOException {
// File file = new File(new String("F:\\test\\upload\\_7323.xlsx"));
// File writeFile = new File("F:\\test\\upload\\加密后的文件ff.bak");
// byte[] array = SM2EncryptFile.testencryptFileByDefaultKeyPairQuietly(file, writeFile);
// File file2 = new File(new String("F:\\test\\upload\\解密后的文件ff.xlsx"));
// EncryptStatus EncryptStatus = SM2EncryptFile.ttdecryptFileByDefaultKeyPair(writeFile, file2, array);
// System.out.println(EncryptStatus);
//
// }
public static void testDecryptttt() throws InvalidCipherTextException, IOException {
File file = new File(new String("F:\\test\\upload\\解密后的文件ff.xlsx"));
File writeFile = new File("F:\\test\\upload\\加密后的文件ff.bak");
EncryptStatus EncryptStatus = SM2EncryptFile.decryptFileByDefaultKeyPair(writeFile, file);
System.out.println(EncryptStatus);
}
public static void testEncrypt() throws InvalidCipherTextException, IOException {
File file = new File(new String("F:\\test\\upload\\_7323.xlsx"));
File writeFile = new File("F:\\test\\upload\\加密后的文件000000.xlsx");
SM2EncryptFile.encryptFileByDefaultKeyPair(file, writeFile);
// System.out.print(encryptStatus);
}
public static void testDecrypt() throws InvalidCipherTextException, IOException {
File file = new File(new String("F:\\test\\upload\\解密后的文件000000.xlsx"));
File writeFile = new File("F:\\test\\upload\\加密后的文件000000.xlsx");
SM2EncryptFile.decryptFileByDefaultKeyPair(writeFile, file);
}
public static void testEncrypt2() throws InvalidCipherTextException, IOException {
File file = new File(new String("F:\\test\\aaaa.pdf"));
File writeFile = new File("F:\\test\\加密后的文件11.pdf");
SM2EncryptFile.encryptFileByDefaultKeyPair(file, writeFile);
}
public static void testDecrypt2() throws FileNotFoundException {
File file = new File(new String("F:\\test\\解密后的文件11.pdf"));
File writeFile = new File("F:\\test\\加密后的文件11.pdf");
EncryptStatus encryptStatus = SM2EncryptFile.decryptFileByDefaultKeyPair(writeFile, new FileOutputStream(file));
System.out.print(encryptStatus);
}
public static void testjiami() throws IOException, InvalidCipherTextException {
File file = new File(new String("F:\\test\\aaaa.pdf"));
File writeFile = new File("F:\\test\\加密后的文件2.pdf");
// 测试用的默认密钥对
BCECipherKeyPair keyPair = DefaultKeyPair.DEFAULT_KEY_PAIR;
// 生产环境使用随机生成的密钥对
//BCECipherKeyPair keyPair = SM2EncryptFile.generateKeyPairParameter();
SM2EncryptFile.encryptFileAndWrite(file, writeFile, keyPair.getPublic());
}
public static void testjm() throws IOException, InvalidCipherTextException {
File file = new File(new String("F:\\test\\解密后的文件2.pdf"));
File writeFile = new File("F:\\test\\加密后的文件2.pdf");
// 使用默认的密钥对
BCECipherKeyPair keyPair = DefaultKeyPair.DEFAULT_KEY_PAIR;
// 生产环境使用随机生成时记录下的密钥对
// BCECUtil.createBCECipherKeyPair(pubKeyX, pubKeyY, privetKeyD)
SM2EncryptFile.decryptFileAndWrite(writeFile, file, keyPair.getPrivate());
}
public static void testjiami2() throws IOException, InvalidCipherTextException {
File file = new File(new String("F:\\test\\aaaa.pdf"));
File writeFile = new File("F:\\test\\加密后的文件3.pdf");
File sss = new File(new String("F:\\test\\解密后的文件3.pdf"));
SM2EncryptedResult sm2EncryptedResult = SM2EncryptFile.encryptFileAndWrite(file, writeFile);
SM2EncryptFile.decryptFileAndWrite(writeFile, sss, sm2EncryptedResult.getKeyPair().getPrivate());
}
public static void testjiami3() throws IOException, InvalidCipherTextException {
File file = new File(new String("F:\\test\\aaaa.pdf"));
File writeFile = new File("F:\\test\\加密后的文件4.pdf");
File sss = new File(new String("F:\\test\\解密后的文件4.pdf"));
SM2EncryptedResult sm2EncryptedResult = SM2EncryptFile.encryptFileAndWrite(file, writeFile);
// ECPublicKeyParameters createECPublicKeyParameters = BCECUtil.createECPublicKeyParameters(sm2EncryptedResult.getHexPublic(), SM2Util.CURVE, SM2Util.DOMAIN_PARAMS);
SM2EncryptFile.decryptFileAndWrite(writeFile, sss, sm2EncryptedResult.getKeyPair().getPrivate().getD());
}
}
package com.archser.aserver.validator;
import com.jfinal.core.Controller;
import com.jfinal.kit.Ret;
import com.jfinal.validate.Validator;
/**
* 登录用户名密码验证
*
* @author dgq
*
*/
public class LoginValidator extends Validator {
@Override
protected void validate(Controller c) {
this.setShortCircuit(true);
this.setRet(Ret.fail());
this.validateRequiredString("username", "msg", "用户名不能为空");
this.validateRequiredString("password", "msg", "密码不能为空");
}
@Override
protected void handleError(Controller c) {
c.renderJson(this.getRet());
}
}
package com.archser.aserver.validator;
import com.jfinal.core.Controller;
import com.jfinal.kit.Ret;
import com.jfinal.validate.Validator;
/**
* 获取设置信息验证器<br>
* 验证参数(name)是否为空
*
* @author dgq
*
*/
public class SettingValidator extends Validator {
@Override
protected void validate(Controller c) {
this.setRet(Ret.fail());
this.validateRequiredString("name", "msg", "参数不能为空(name)");
}
@Override
protected void handleError(Controller c) {
c.renderJson(this.getRet());
}
}
package com.archser.aserver.websocket;
import java.util.Collection;
import java.util.List;
public class MessageRefreshTrigger {
/**
* 刷新消息
* @param userId
*/
public static boolean refresh(Integer userId) {
boolean refreshed = false;
Collection<MessageWebSocket> websocketset = MessageWebSocket.webSocketMap.values();
for (MessageWebSocket websocket : websocketset) {
if (userId.equals(websocket.getUserId())) {
websocket.sendMsgData();
refreshed = true;
}
}
return refreshed;
}
/**
* 刷新消息
* @param userIds
* @return
*/
public static boolean refresh(List<Integer> userIds) {
boolean refreshed = false;
Collection<MessageWebSocket> websocketset = MessageWebSocket.webSocketMap.values();
// websocketset.stream().filter(socket -> socket.getUserId() != null && userIds.contains(socket.getUserId())).findAny().ifPresent(socket -> socket.sendMsgData());
for (MessageWebSocket websocket : websocketset) {
if (websocket.getUserId() != null && userIds.contains(websocket.getUserId())) {
websocket.sendMsgData();
refreshed = true;
}
}
return refreshed;
}
/**
* 刷新消息
* @param userIds
* @return
*/
public static boolean refresh(String userIds) {
String[] idArray = userIds.split(",");
boolean refreshed = false;
Collection<MessageWebSocket> websocketset = MessageWebSocket.webSocketMap.values();
// websocketset.stream().filter(socket -> socket.getUserId() != null && userIds.contains(socket.getUserId())).findAny().ifPresent(socket -> socket.sendMsgData());
for (MessageWebSocket websocket : websocketset) {
for (String userId : idArray) {
if (websocket.getUserId() != null && userId.equals(websocket.getUserId().toString())) {
websocket.sendMsgData();
refreshed = true;
}
}
}
return refreshed;
}
}
package com.archser.aserver.websocket;
import java.io.IOException;
import java.util.Optional;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import javax.websocket.EndpointConfig;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import org.apache.log4j.Logger;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.archser.aserver.interceptor.JwtSigningKeyResolver;
import com.archser.aserver.service.MessageService;
import com.google.gson.JsonParser;
import com.jfinal.aop.Aop;
import com.jfinal.json.FastJson;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.Record;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.undertow.websockets.jsr.UndertowSession;
@ServerEndpoint(value = "/message.ws/{params}", configurator = MessageWebSocketConfig.class)
public class MessageWebSocket {
private static Logger logger = org.apache.log4j.Logger.getLogger(MessageWebSocket.class);
// 用来存放每个客户端对应的MessageWebSocket对象,适用于同时与多个客户端通信
// public static final CopyOnWriteArraySet<MessageWebSocket> webSocketSet = new CopyOnWriteArraySet<MessageWebSocket>();
// 若要实现服务端与指定客户端通信的话,可以使用Map来存放,其中Key可以为用户标识
public static final ConcurrentHashMap<UndertowSession, MessageWebSocket> webSocketMap = new ConcurrentHashMap<UndertowSession, MessageWebSocket>();
public static final String HEART_TEST_MSG = "keep-alive"; // 心跳测试接受到消息的字符串
public static final String REFRESH_MESSAGE = "refresh";
/**
* 根据用户id刷新新消息的token,其他系统保存消息后刷新指定用户的消息
*/
public static final String REFRESH_TOKEN = "refreshToken";
// public static final String INSERT_TOKEN = "insertToken";
// 与某个客户端的连接会话,通过它实现定向推送(只推送给某个用户)
private UndertowSession session;
MessageService messageService;
private Integer userId;
// private long period = 300000L;
private long period = 5000L;
private Timer task;
// private long delay = 300000L;
private long delay = 5000L;
/**
* session 是否关闭
*/
private boolean localClose = false;
private boolean receiveMeg = false; // 是否已经接受到消息
private Lock lock = new ReentrantLock(); // 接受消息使用的锁
private long timeout = 60000L; // 心跳测试的超时时间
// private long timeout = 3000L; // 心跳测试的超时时间
private long receiveMessageCount = 0; // 已经接受到的消息个数
@SuppressWarnings("unused")
private long currD = 0L;
private String userToken = null; // 用户token
/**
* 心跳测试-最后一次接受到消息的时间
*/
private Long lastHeartbateReceiveTime = -1L;
/**
* 最后一次发送消息的时间
*/
private Long lastSendTime = -1L;
private String params;
private Timer heartTestTimer = new Timer();
/**
* 连接建立成功调用的方法
*
* @param session 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
*/
@OnOpen
public void onOpen(Session session, @PathParam("params") String params, EndpointConfig config) {
this.initParam(config);
this.messageService = Aop.get(MessageService.class);
// session.setMaxIdleTimeout(this.timeout);
this.session = (UndertowSession) session;
this.receiveMeg = true;
webSocketMap.put(this.session, this); // 加入map中
this.params = params;
// this.userId = StringUtils.isInteger(params) ? StringUtils.parseInteger(params) : null;
this.currD = System.currentTimeMillis();
this.setToken(config);
this.initUserByToken();
if (this.userId != null) {
sendMsgData();
startTimeTask();
}
}
private void initParam(EndpointConfig config) {
Object delay = config.getUserProperties().get("delay");
if (delay != null) {
this.delay = Long.parseLong(delay.toString());
}
Object period = config.getUserProperties().get("period");
if (period != null) {
this.period = Long.parseLong(period.toString());
}
Object timeout = config.getUserProperties().get("timeout");
if (timeout != null) {
this.timeout = Long.parseLong(timeout.toString());
}
}
private void initUserByToken() {
if (this.userToken != null && !checkIsServer()) {
String username = getUsername(this.userToken);
Integer userId = Db.queryInt(Db.getSql("getUserId"), username);
this.userId = userId;
}
}
private void setToken(EndpointConfig config) {
Object object = config.getUserProperties().get("token");
if (object != null) {
this.userToken = String.valueOf(object);
} else {// 没有token关闭连接
if (!checkIsServer()) {
this.closeSession(this.session);
}
}
}
private void startTimeTask() {
Timer timer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
try {
logger.debug("定时发送信息");
logger.debug("定时周期:" + (System.currentTimeMillis() - currD));
currD = System.currentTimeMillis();
sendMsgData();
} catch (Exception e) {
logger.error("定时发送消息失败", e);
}
}
};
timer.schedule(timerTask, delay, period);
this.task = timer;
}
private Page<Record> getMessageList(Integer userId) {
return this.messageService.getUnreadMessage(1, 2, userId);
}
public void sendMsgData() {
refreshMessge(this.session, this.userId);
}
/**
* 刷新消息
*
* @param session
* @param userId
*/
private void refreshMessge(Session session, Integer userId) {
// if (heartbeatTest()) {
logger.debug("开始发送信息, sessionId={}" + session.getId());
Page<Record> messageList = this.getMessageList(userId);
String messageJson = FastJson.getJson().toJson(messageList);
this.sendMessage(this.session, messageJson);
this.lastSendTime = System.currentTimeMillis();
this.heartTest();
// }
}
/**
* 刷新指定用户id的消息
*
* @param userId
*/
public void refreshMessageByUserId(Integer userId) {
// if (heartbeatTest()) {
sendMessageByUserId(userId);
this.lastSendTime = System.currentTimeMillis();
// }
}
private void sendMessageByUserId(Integer userId) {
webSocketMap.values().stream().filter(socket -> {
return userId.equals(socket.getUserId());
}).forEach(MessageWebSocket::sendMsgData);
}
private void refreshMessageByUserIds(String message) {
// if (heartbeatTest()) {
JSONObject jsonObject = JSON.parseObject(message);
String userIds = jsonObject.getString("userId");
if (StrKit.notBlank(userIds)) {
String[] userIdArray = userIds.split(",");
for (String userId : userIdArray) {
sendMessageByUserId(Integer.parseInt(userId));
}
}
this.lastSendTime = System.currentTimeMillis();
// }
}
/**
* 心跳测试,每次发送消息会收到客户端返回的消息,根据返回消息的时间判断是否超时,超时表示客户端已断开连接,超时后关闭session
*
* @return 测试是否通过,
*/
public boolean heartbeatTest() {
if (localClose) {
return false;
}
if (lastSendTime - this.lastHeartbateReceiveTime > this.timeout) {
this.onClose(this.session);
logger.debug("客户端心跳测试超时," + session.getId());
System.out.println(
"客户端心跳测试超时,已超时 = " + (lastSendTime - this.lastHeartbateReceiveTime) + ", lastSendTime = "
+ lastSendTime + ", lastHeartbateReceiveTime = " + this.lastHeartbateReceiveTime);
return false;
}
// if (this.lastSendTime == null) {
// this.firstHeartbeatTime = System.currentTimeMillis();
// } else {
// long currentTime = System.currentTimeMillis();
// if (this.lastHeartbateReceiveTime == null) {
// /**
// * 第一次发送消息长时间没有接受到返回内容
// */
// if (lastSendTime - this.lastHeartbateReceiveTime > this.timeout) {
// this.onClose(this.session);
// logger.debug("客户端心跳测试超时," + session.getId());
// System.out.println("客户端心跳测试超时,已超时 = " + (lastSendTime - this.firstHeartbeatTime)
// + ", currentTime = " + lastSendTime + ", firstHeartbeatTime = " + this.firstHeartbeatTime);
// return false;
// }
// } else {
// /**
// * 客户端接返回消息超时
// */
// if (lastSendTime - this.lastHeartbateReceiveTime > this.timeout) {
// this.onClose(this.session);
// logger.debug("客户端心跳测试超时," + session.getId());
// System.out.println(
// "客户端心跳测试超时,已超时 = " + (lastSendTime - this.lastHeartbateReceiveTime) + ", lastSendTime = "
// + lastSendTime + ", lastHeartbateReceiveTime = " + this.lastHeartbateReceiveTime);
// return false;
// }
// }
// }
return true;
}
/**
* 心跳测试,每次发送消息需要客户端返回消息,发送消息timeout后如果没有接受到消息则关闭该session
*/
public void heartTest() {
heartTestTimer.cancel();
heartTestTimer = new Timer();
heartTestTimer.schedule(new TimerTask() {
@Override
public void run() {
try {
logger.debug("心跳测试 sessionId = " + session.getId());
// lock.lock();
if (receiveMeg) {
if (receiveMessageCount == 1) {
receiveMeg = false;
}
receiveMessageCount--;
} else {
closeSession(session);
}
} catch(Exception e) {
logger.error("消息心跳测试失败", e);
} finally {
// lock.unlock();
}
}
}, timeout);
}
/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose(Session closeSession) {
logger.debug("开始关闭信息" + session.getId());
closeSession(closeSession);
}
/**
* 收到客户端消息后调用的方法
*
* @param message 客户端发送过来的消息
* @param session 可选的参数
* @throws Exception
*/
@OnMessage
public void onMessage(String message, Session mySession) throws Exception {
logger.debug("收到信息:" + message + " session = " + mySession.getId());
if (StrKit.isBlank(message)) {
return;
}
if (HEART_TEST_MSG.equals(message)) { // 心跳测试
receiveHeartMsg();
} else if (REFRESH_MESSAGE.equals(message)) { // 刷新消息
this.sendMsgData();
} else if (REFRESH_TOKEN.equals(this.params)) {// 刷新指定用户的消息
refreshMessageByUserIds(message);
} else if (message.contains("=")) { // 更新指定userId的消息
String[] messageSplit = message.split("=");
if (messageSplit.length == 2) {
String userParam = messageSplit[2];
if (isDigits(userParam)) {
refreshMessageByUserId((Integer.parseInt(userParam)));
}
}
}
}
// private void insertMessage(String message) {
// JsonParser jsonParser=new JsonParser();
// int sendToId = jsonParser.parse(message).getAsJsonObject().get("sendToId").getAsInt();
// Optional<MessageWebSocket> messageWebSocket = getMessageWebSocket(sendToId);
// messageWebSocket.ifPresent(socket -> socket.sendMessage(message));
// }
/**
* 接收到heartbate的消息
*/
private void receiveHeartMsg() {
try {
lock.lock();
this.receiveMessageCount++;
this.receiveMeg = true;
this.lastHeartbateReceiveTime = System.currentTimeMillis();
} finally {
lock.unlock();
}
}
/**
* 发生错误时调用
*
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error) {
logger.error("消息出错 session = " + session.getId(), error);
closeSession(session);
}
private void closeSession(Session session) {
webSocketMap.remove(session); // 从map中删除
try {
if (session.isOpen()) {
session.close();
this.localClose = true;
}
} catch (IOException e) {
logger.error("关闭消息失败。session = " + session.getId() + "exception = " + e);
e.printStackTrace();
}
this.cancelTask();
}
private void cancelTask() {
if (this.task != null) {
this.task.cancel();
}
}
public void sendAllMessage(String message) throws IOException {
this.session.getBasicRemote().sendText(message);
}
public UndertowSession getSession() {
return this.session;
}
// 定向发送信息
private void sendMessage(UndertowSession mySession, String message) {
synchronized (this) {
try {
if (mySession.isOpen() && !localClose) {// 该session如果已被删除,则不执行发送请求,防止报错
mySession.getBasicRemote().sendText(message);
}
} catch (IOException e) {
logger.error("websocket——消息发送失败, exception=" + e + ", message = " + message + "sessionId = "
+ mySession.getId());
e.printStackTrace();
this.cancelTask();
}
}
}
private void sendMessage(String message) {
this.sendMessage(this.session, message);
}
public Integer getUserId() {
return this.userId;
}
/**
* 根据token获取用户名
*
* @param token
* @return
*/
public static String getUsername(String token) {
// jwt解析器
Claims claims = Jwts.parser()
// 设置公钥
.setSigningKeyResolver(new JwtSigningKeyResolver())
// 解析jwt
.parseClaimsJws(token).getBody();
String username = claims.get("name", String.class);
return username;
}
public static boolean isDigits(String str) {
for (int i = 0; i < str.length(); i++) {
if (!Character.isDigit(str.charAt(i))) {
return false;
}
}
return true;
}
private boolean checkIsServer() {
if (REFRESH_TOKEN.equals(this.params)) {
return true;
}
return false;
}
}
package com.archser.aserver.websocket;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import javax.websocket.Extension;
import javax.websocket.HandshakeResponse;
import javax.websocket.server.HandshakeRequest;
import javax.websocket.server.ServerEndpointConfig;
import com.archser.aserver.util.CollectionUtil;
import com.jfinal.kit.Prop;
import com.jfinal.kit.PropKit;
import io.undertow.websockets.jsr.ServerEndpointConfigImpl;
public class MessageWebSocketConfig extends ServerEndpointConfigImpl.Configurator{
/**
* 定时发送消息周期单位毫秒
*/
private static long period = 5000L;
/**
* 延期,第二次发送消息的延期时间,第一次发送在开始连接时就会发送
*/
private static long delay = 5000L;
/**
* 消息发送成功后,等待客户端反馈时间,超出此时间表示连接已经断开,会关闭连接
*/
private static long timeout = 60000L;
@Override
public String getNegotiatedSubprotocol(List<String> supported, List<String> requested) {
return super.getNegotiatedSubprotocol(supported, requested);
}
@Override
public List<Extension> getNegotiatedExtensions(List<Extension> installed, List<Extension> requested) {
return super.getNegotiatedExtensions(installed, requested);
}
@Override
public boolean checkOrigin(String originHeaderValue) {
return super.checkOrigin(originHeaderValue);
}
@Override
public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
Map<String, List<String>> headers = request.getHeaders();
List<String> cookies = headers.get("Cookie");
String token = getCookie("token", cookies);
sec.getUserProperties().put("token", token);
Prop prop = getProp();
sec.getUserProperties().put("period", prop.get("messageWsPeriod"));
sec.getUserProperties().put("delay", prop.get("messageWsDelay"));
sec.getUserProperties().put("timeout", prop.get("messageWsTimeout"));
super.modifyHandshake(sec, request, response);
}
private Prop getProp() {
return PropKit.use("config.properties").appendIfExists("config-pro.properties");
}
private String getCookie(String token, List<String> cookies) {
if (cookies == null || cookies.isEmpty()) {
return null;
}
String cookieStr = cookies.get(0);
String[] cookieSplit = cookieStr.split(";");
for (String cookie : cookieSplit) {
if (cookie.trim().startsWith("token")) {
return cookie.split("=")[1];
}
}
return null;
}
@Override
public <T> T getEndpointInstance(Class<T> endpointClass) throws InstantiationException {
return super.getEndpointInstance(endpointClass);
}
public static long getPeriod() {
return period;
}
public static void setPeriod(Long period) {
if (period != null) {
MessageWebSocketConfig.period = period;
}
}
public static long getDelay() {
return delay;
}
public static void setDelay(Long delay) {
if (delay != null) {
MessageWebSocketConfig.delay = delay;
}
}
public static long getTimeout() {
return timeout;
}
public static void setTimeout(Long timeout) {
if (timeout != null) {
MessageWebSocketConfig.timeout = timeout;
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT update (version+)>
<!ELEMENT version (sql | function | procedure )* >
<!ELEMENT sql (#PCDATA)>
<!ELEMENT function (#PCDATA)>
<!ELEMENT procedure (#PCDATA)>
<!--对根结点update添加两个属性 dataType:数据库类型; discription:描述-->
<!--dataType属性是必填项,discription是可选择填写-->
<!ATTLIST update dataType CDATA #REQUIRED
description CDATA #IMPLIED
>
<!--对结点version添加两个属性 edition:每次更新的版本号; discription:描述-->
<!--edition属性是必填项,discription是可选择填写-->
<!ATTLIST version edition CDATA #REQUIRED
description CDATA #IMPLIED
>
<!--对结点sql添加三个属性 creator:创建者; createDate:创建时间; note:对语句进行解释-->
<!--以下三个属性是必填项-->
<!ATTLIST sql creator CDATA #REQUIRED
createDate CDATA #REQUIRED
note CDATA #REQUIRED
>
<!--对结点function添加三个属性 creator:创建者; createDate:创建时间; note:对语句进行解释-->
<!--以下三个属性是必填项-->
<!ATTLIST function creator CDATA #REQUIRED
createDate CDATA #REQUIRED
note CDATA #REQUIRED
>
<!--对结点procedure添加三个属性 creator:创建者; createDate:创建时间; note:对语句进行解释-->
<!--以下三个属性是必填项-->
<!ATTLIST procedure creator NMTOKEN #REQUIRED
createDate CDATA #REQUIRED
note CDATA #REQUIRED
>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE update SYSTEM "DBUpdate_dtd.dtd">
<update dataType="DM" description="达梦数据库升级SQL语句">
<version edition="1" description="更新错误登陆次数为0">
<sql creator="chenyong" createDate="20200114" note="更新错误登陆次数为0">
UPDATE AS_USER
SET ERRORCOUNT=0
</sql>
</version>
<version edition="2" description="添加url长度">
<sql creator="cyq" createDate="20200211" note="添加url长度">
alter table AS_LOG
modify (URL varchar2(1000))
</sql>
</version>
<version edition="3" description="创建流程服务的表单表">
<sql creator="huwenbin" createDate="20200212" note="创建流程服务的表单表">
CREATE TABLE
"AS_PROCESS_FORM"
(
"ID" NUMBER(9,0) NOT NULL,
"CREATER" NUMBER(22,6),
"CREATE_TIME" TIMESTAMP(6),
"DESCRIPTION" VARCHAR2(250),
"NAME"
VARCHAR(250),
"PROCESS_ID" VARCHAR2(64),
"ISSUE" VARCHAR2(10),
"FORM_CONTENT" VARCHAR2(4000),
"SCHEDULE_CONTENT" VARCHAR2(4000),
NOT
CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON
TABLE "AS_PROCESS_FORM" IS '流程服务的表单表';
COMMENT ON COLUMN
"AS_PROCESS_FORM"."CREATER" IS '创建人id';
COMMENT ON COLUMN
"AS_PROCESS_FORM"."CREATE_TIME" IS
'创建时间';
COMMENT ON
COLUMN "AS_PROCESS_FORM"."DESCRIPTION" IS '表单描述';
COMMENT ON COLUMN "AS_PROCESS_FORM"."FORM_CONTENT" IS
'表单数据JSON';
COMMENT ON COLUMN "AS_PROCESS_FORM"."ID" IS
'主键';
COMMENT ON COLUMN "AS_PROCESS_FORM"."ISSUE" IS
'是否发布:0:否,1:是';
COMMENT ON COLUMN
"AS_PROCESS_FORM"."NAME" IS '表单名称';
COMMENT ON COLUMN
"AS_PROCESS_FORM"."PROCESS_ID" IS
'流程关联id';
COMMENT ON
COLUMN "AS_PROCESS_FORM"."SCHEDULE_CONTENT" IS
'附表数据JSON';
</sql>
</version>
<version edition="4" description="创建流程服务和角色关联的表">
<sql creator="huwenbin" createDate="20200212" note="创建流程服务和角色关联的表">
CREATE TABLE
"AS_ROLE_FORM"
(
"ID" NUMBER(9,6) NOT NULL,
"ROLE_ID" NUMBER(20,6),
"FORM_ID" NUMBER(20,6),
CLUSTER PRIMARY KEY("ID"),
UNIQUE("ID"))
STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE
"AS_ROLE_FORM" IS '流程管理角色和表单关联';
COMMENT ON COLUMN
"AS_ROLE_FORM"."FORM_ID" IS '表单id';
COMMENT ON COLUMN
"AS_ROLE_FORM"."ID" IS '主键id';
COMMENT ON COLUMN
"AS_ROLE_FORM"."ROLE_ID" IS '角色id';
</sql>
</version>
<version edition="5" description="创建流程模型和流程部署关联表">
<sql creator="huwenbin" createDate="20200312" note="创建流程模型和流程部署关联表">
create table AS_MODEL_DEPLOYMENT
(
ID INTEGER not null,
DEPLOYMENT_ID VARCHAR2(64),
MODEL_ID VARCHAR2(50)
);
comment on table
AS_MODEL_DEPLOYMENT is '流程图与流程部署表的关联表';
create unique index
INDEX33558234
on AS_MODEL_DEPLOYMENT (ID);
alter table
AS_MODEL_DEPLOYMENT
add constraint CONS134220130
primary key (ID);
CREATE SEQUENCE "SEQ_AS_MODEL_DEPLOYMENT" INCREMENT BY 1 START WITH 1
MAXVALUE 99999999999999 MINVALUE 1 CACHE 20;
CREATE SEQUENCE
"SEQ_AS_ROLE_FORM" INCREMENT BY 1 START WITH 1 MAXVALUE
9999999999999999 MINVALUE 1 CACHE 20;
CREATE SEQUENCE
"SEQ_AS_PROCESS_FORM" INCREMENT BY 1 START WITH 1 MAXVALUE
9999999999999999 MINVALUE 1 CACHE 20;
</sql>
</version>
<version edition="6" description="YZJ-1781 代码规则表">
<sql creator="lidecai" createDate="20200320" note="创建代码规则表">
CREATE TABLE
AS_CODEVALUE"
(
"ID" INTEGER NOT NULL,
"TABLE_ID" INTEGER,
"COLUMN_ID"
INTEGER,
"KEY" VARCHAR2(50),
"VALUE" VARCHAR2(50),
"IDSEQ" VARCHAR2(50),
"COLUMN_NAME" VARCHAR2(50),
CLUSTER PRIMARY KEY("ID")) STORAGE(ON
"MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN "AS_CODEVALUE"."COLUMN_ID" IS
'字段ID';
COMMENT ON COLUMN "AS_CODEVALUE"."IDSEQ" IS '全宗代码';
COMMENT ON
COLUMN "AS_CODEVALUE"."KEY" IS '代码';
COMMENT ON COLUMN
"AS_CODEVALUE"."TABLE_ID" IS '表ID';
COMMENT ON COLUMN
"AS_CODEVALUE"."VALUE" IS '值';
</sql>
<sql creator="lidecai" createDate="20200320" note="创建代码规则表的序列">
CREATE SEQUENCE
"SEQ_AS_CODEVALUE" INCREMENT BY 1 START WITH 1
MAXVALUE
9999999999 MINVALUE 1 CACHE 20;
</sql>
</version>
<version edition="7" description="报表与档案关联表添加全宗">
<sql creator="yangchegnwu" createDate="20200323" note="报表与档案关联表添加全宗">
alter table AS_REPORT_TABLE add "IDSEQ" VARCHAR2(50);
</sql>
<sql creator="ChengYaqing" createDate="20200327" note="主动接口任务表添加字段">
alter table AS_TASK add ("IDSEQ" VARCHAR2(255),"CREATOR"
VARCHAR2(50));
</sql>
<sql creator="ChengYaqing" createDate="20200327" note="主动接口配置表添加字段">
alter table AS_TASK_DBCONFIG add ("AJCONDITION"
VARCHAR2(500),"JNCONDITION" VARCHAR2(500));
</sql>
<sql creator="ChengYaqing" createDate="20200416" note="统计归档元数据统计">
CREATE TABLE
AS_FILING_METADATA_STATISTICS
(
"ID" NUMBER(9,0) NOT NULL,
"LIBRARY"
VARCHAR2(255),
"DATE" TIMESTAMP(6),
"PATH" VARCHAR2(255),
"DATACOUNT"
NUMBER(9,0),
"FILECOUNT" NUMBER(9,0),
CLUSTER PRIMARY
KEY("ID"))
STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN
"AS_FILING_METADATA_STATISTICS"."DATACOUNT"
IS '数据的数量';
COMMENT ON COLUMN
"AS_FILING_METADATA_STATISTICS"."DATE"
IS '时间';
COMMENT
ON COLUMN
"AS_FILING_METADATA_STATISTICS"."FILECOUNT" IS
'文件数量';
COMMENT ON COLUMN
"AS_FILING_METADATA_STATISTICS"."LIBRARY" IS '档案类型';
COMMENT ON COLUMN "AS_FILING_METADATA_STATISTICS"."PATH"
IS '下载文件路径';
</sql>
</version>
<version edition="8" description="库房字段类型修改">
<sql creator="lidecai" createDate="20200331" note="修改字段名称">
alter table
AS_ACCESS_MOVE rename column COUNT TO COUNT_COPY;
</sql>
<sql creator="lidecai" createDate="20200331" note="增加一个和原字段名同名的字段">
alter table
AS_ACCESS_MOVE add COUNT NUMBER(10);
</sql>
<sql creator="lidecai" createDate="20200331" note="将原字段 COUNT_COPY 数据更新到增加的字段 COUNT ">
update AS_ACCESS_MOVE set COUNT= trim (COUNT_COPY)
</sql>
<sql creator="lidecai" createDate="20200331" note="更新完,删除临时字段">
alter table
AS_ACCESS_MOVE drop column COUNT_COPY;
</sql>
</version>
<version edition="9" description="盘点记录">
<sql creator="lidecai" createDate="20200423" note="创建记录表">
CREATE TABLE
"AS_CHECK_RECORD"
(
"ID" INTEGER NOT NULL,
"CHECK_NAME"
VARCHAR2(50),
"CREATE_TIME" TIMESTAMP(6),
"CHECK_TIME" VARCHAR2(50),
"USER_NAME" VARCHAR2(50),
"CHECK_STATUS" VARCHAR2(50),
CLUSTER PRIMARY
KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN
"AS_CHECK_RECORD"."CHECK_NAME" IS '盘点名称';
COMMENT ON
COLUMN "AS_CHECK_RECORD"."CHECK_STATUS" IS
'盘点状态';
COMMENT ON COLUMN "AS_CHECK_RECORD"."CHECK_TIME" IS
'盘点时间';
COMMENT ON COLUMN "AS_CHECK_RECORD"."CREATE_TIME"
IS
'创建时间';
COMMENT ON COLUMN "AS_CHECK_RECORD"."USER_NAME"
IS '创建者名称';
</sql>
<sql creator="lidecai" createDate="20200423" note="创建序列">
CREATE SEQUENCE
"SEQ_AS_CHECK_RECORD" INCREMENT BY 1 START WITH 1
MAXVALUE 9999999999 MINVALUE 1 CACHE 20;
</sql>
</version>
<version edition="10" description="盘点记录详情">
<sql creator="lidecai" createDate="20200423" note="创建记录表">
CREATE TABLE
"AS_CHECK_RECORD_RESULT"
(
"ID" CHAR(10) NOT NULL,
"TABLE_ID" INTEGER,
"EPC" VARCHAR2(50),
"RECORD_ID" INTEGER,
"LIB_ID"
INTEGER,
"DATA_ID" INTEGER,
CLUSTER PRIMARY KEY("ID")) STORAGE(ON
"MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN
"AS_CHECK_RECORD_RESULT"."DATA_ID" IS
'档案条目ID';
COMMENT ON
COLUMN "AS_CHECK_RECORD_RESULT"."EPC" IS '档案唯一标识
RFID';
COMMENT ON COLUMN "AS_CHECK_RECORD_RESULT"."ID" IS '主键';
COMMENT ON COLUMN "AS_CHECK_RECORD_RESULT"."LIB_ID" IS
'档案类别ID';
COMMENT ON COLUMN
"AS_CHECK_RECORD_RESULT"."RECORD_ID" IS
'盘点记录ID';
COMMENT
ON COLUMN "AS_CHECK_RECORD_RESULT"."TABLE_ID" IS '表ID';
</sql>
<sql creator="lidecai" createDate="20200423" note="创建序列">
CREATE SEQUENCE
"SEQ_AS_CHECK_RECORD_RUEULT" INCREMENT BY 1 START WITH 1
MAXVALUE 999999999 MINVALUE 1 CACHE 20;
</sql>
</version>
<version edition="11" description="库房中间表">
<sql creator="lidecai" createDate="20200423" note="创建中间表">
CREATE TABLE
"AS_EPC_DATA"
(
"ID" INTEGER NOT NULL,
"EPC" VARCHAR2(50)
NOT NULL,
"LIB_ID" INTEGER,
"TABLE_ID" INTEGER,
"DATA_ID" VARCHAR2(50),
CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE
INDEX "AS_EPC_DATA_INDEX" ON "AS_EPC_DATA"("EPC" ASC)
STORAGE(ON "MAIN", CLUSTERBTR) ;
</sql>
<sql creator="lidecai" createDate="20200331" note="创建序列">
CREATE SEQUENCE
"SEQ_AS_EPC_DATA" INCREMENT BY 1 START WITH 1 MAXVALUE
999999999 MINVALUE 1 CACHE 20;
</sql>
</version>
<version edition="12" description="库房中间表">
<sql creator="lidecai" createDate="20200426" note="添加EPC字段">
ALTER TABLE As_Borrow_Data add EPC VARCHAR2(20);
</sql>
</version>
<version edition="13" description="流程附表拓展字段表">
<sql creator="huwenbin" createDate="20200428" note="流程附表拓展字段表">
CREATE TABLE "AS_SCHE_EXT_DATA"
(
"ID" NUMBER(9,0) NOT NULL,
"ORIGINAL_DATA" CLOB,
"SCHE_ID" NUMBER(9,0),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "AS_SCHE_EXT_DATA" IS '附表的拓展数据表';
COMMENT ON COLUMN "AS_SCHE_EXT_DATA"."ORIGINAL_DATA" IS '附表源数据';
COMMENT ON COLUMN "AS_SCHE_EXT_DATA"."SCHE_ID" IS '附表id';
CREATE SEQUENCE "SEQ_AS_SCHE_EXT_DATA" INCREMENT BY 1 START WITH 1 MAXVALUE 999999999999999 MINVALUE 1;
</sql>
</version>
<version edition="14" description="流程申请表">
<sql creator="huwenbin" createDate="20200428" note="流程申请表">
CREATE TABLE "AS_APPLY_BORROW"
(
"ID" NUMBER(22,6) NOT NULL,
"PROCESS_INST_ID" VARCHAR2(64),
"START_USER_ID" NUMBER(9,0),
"START_TIME" TIMESTAMP(6),
"END_TIME" TIMESTAMP(6),
"APPLY_STATUS" NUMBER(1,0),
"PROCESS_NAME" VARCHAR2(50),
"TEMPORARY_ID" NUMBER(9,0),
"PROCESS_DEF_ID" VARCHAR2(64),
"TEMPORARY_TIME" TIMESTAMP(6),
"SYSTEM_ID" NUMBER(9,0),
CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "AS_APPLY_BORROW" IS '档案申请借阅表';
COMMENT ON COLUMN "AS_APPLY_BORROW"."APPLY_STATUS" IS '申请状态';
COMMENT ON COLUMN "AS_APPLY_BORROW"."END_TIME" IS '结束时间';
COMMENT ON COLUMN "AS_APPLY_BORROW"."ID" IS '主键id';
COMMENT ON COLUMN "AS_APPLY_BORROW"."PROCESS_DEF_ID" IS '流程定义id';
COMMENT ON COLUMN "AS_APPLY_BORROW"."PROCESS_INST_ID" IS '流程实例id';
COMMENT ON COLUMN "AS_APPLY_BORROW"."PROCESS_NAME" IS '流程实例名称';
COMMENT ON COLUMN "AS_APPLY_BORROW"."START_TIME" IS '申请时间';
COMMENT ON COLUMN "AS_APPLY_BORROW"."START_USER_ID" IS '申请人';
COMMENT ON COLUMN "AS_APPLY_BORROW"."SYSTEM_ID" IS '系统id';
COMMENT ON COLUMN "AS_APPLY_BORROW"."TEMPORARY_ID" IS '暂存id';
</sql>
</version>
<version edition="15" description="流程附表拓展字段表">
<sql creator="huwenbin" createDate="20200428" note="流程附表拓展字段表增加字段">
alter table "AS_SCHE_EXT_DATA" add column("SCHE_TABLE_ID" NUMBER(9, 6));
comment on column "AS_SCHE_EXT_DATA"."SCHE_TABLE_ID" is '附表设计表id';
</sql>
</version>
<version edition="16" description="流程模型表单增加字段">
<sql creator="huwenbin" createDate="20200519" note="流程模型表单增加字段">
alter table "AS_MODEL_DEPLOYMENT" add column("FORM_ID" NUMBER(9, 0));
alter table "AS_MODEL_DEPLOYMENT" add column("TAG_ID" NUMBER(9, 0));
alter table "AS_MODEL_DEPLOYMENT" add column("TAG_NAME" VARCHAR2(50));
</sql>
</version>
<version edition="17" description="归档元数据统计表">
<sql creator="huwenbin" createDate="20200519" note="归档元数据统计表">
CREATE TABLE "AS_FILING_METADATA_STATISTICS"
(
"ID" NUMBER(9,0) NOT NULL,
"LIBRARY" VARCHAR2(255),
"DATE" TIMESTAMP(6),
"PATH" VARCHAR2(255),
"DATACOUNT" NUMBER(9,0),
"FILECOUNT" NUMBER(9,0),
CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN "AS_FILING_METADATA_STATISTICS"."DATACOUNT" IS '数据的数量';
COMMENT ON COLUMN "AS_FILING_METADATA_STATISTICS"."DATE" IS '时间';
COMMENT ON COLUMN "AS_FILING_METADATA_STATISTICS"."FILECOUNT" IS '文件数量';
COMMENT ON COLUMN "AS_FILING_METADATA_STATISTICS"."LIBRARY" IS '档案类型';
COMMENT ON COLUMN "AS_FILING_METADATA_STATISTICS"."PATH" IS '下载文件路径';
</sql>
</version>
<version edition="18" description="流程标签表">
<sql creator="huwenbin" createDate="20200519" note="流程标签表">
CREATE TABLE "AS_PROCESS_TAG"
(
"ID" NUMBER(9,6) NOT NULL,
"NAME" VARCHAR2(50),
"PROCESS_MODEL_ID" VARCHAR2(150),
"DATA_TYPE" NUMBER(22,6),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "AS_PROCESS_TAG" IS '流程标签表';
COMMENT ON COLUMN "AS_PROCESS_TAG"."DATA_TYPE" IS '1-内置的标签';
COMMENT ON COLUMN "AS_PROCESS_TAG"."NAME" IS '标签名';
COMMENT ON COLUMN "AS_PROCESS_TAG"."PROCESS_MODEL_ID" IS '流程模型表id';
</sql>
</version>
<version edition="19" description="流程申请表">
<sql creator="huwenbin" createDate="20200519" note="流程申请表">
CREATE TABLE "AS_APPLY_PROCESS"
(
"ID" NUMBER(9,0) NOT NULL,
"PROC_INST_ID" VARCHAR(64),
"TABLE_ID" NUMBER(9,0),
"DATA_ID" NUMBER(9,0),
"TITLE" VARCHAR(64),
"VIEW_PERMISSION_START_TIME" TIMESTAMP(6),
"VIEW_PERMISSION_END_TIME" TIMESTAMP(6),
"ENTITY_START_TIME" TIMESTAMP(6),
"ENTITY_END_TIME" TIMESTAMP(6),
"ENTITY_BACK_TIME" TIMESTAMP(6),
"IS_VIEW" NUMBER(22,6),
"IS_DOWN" NUMBER(22,6),
"START_USER_ID" NUMBER(9,0),
"DOWN_PERMISSION_START_TIME" TIMESTAMP(6),
"DOWN_PERMISSION_END_TIME" TIMESTAMP(6),
"PRINT_PERMISSION_START_TIME" TIMESTAMP(6),
"PRINT_PERMISSION_END_TIME" TIMESTAMP(6),
"VIEW_DAYS" NUMBER(3,0),
"DOWN_DAYS" NUMBER(3,0),
"PRINT_DAYS" NUMBER(3,0),
"IS_PRINT" NUMBER(3,0),
"APPLY_ID" NUMBER(9,0),
"ENTITY_BORROW_DAYS" NUMBER(9,6),
"BORROW_WAY" NUMBER(1,0),
"PROC_SCHE_ID" NUMBER(9,0),
CONSTRAINT "AS_APPLY_PROCEESS_PK" CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN "AS_APPLY_PROCESS"."BORROW_WAY" IS '借阅方式:1-实体,2-电子';
COMMENT ON COLUMN "AS_APPLY_PROCESS"."IS_DOWN" IS '1-可以下载,0-不能下载';
COMMENT ON COLUMN "AS_APPLY_PROCESS"."IS_VIEW" IS '1-可以预览,0-不可以预览';
COMMENT ON COLUMN "AS_APPLY_PROCESS"."PROC_SCHE_ID" IS '1';
</sql>
</version>
<version edition="20" description="普服快递办件接收表">
<sql creator="huwenbin" createDate="20200519" note="普服快递办件接收表">
CREATE TABLE "AS_FILING_ACCEPT"
(
"ID" VARCHAR2(50) NOT NULL,
"PROJECTNO" VARCHAR2(50),
"TASKNAME" VARCHAR2(255),
"FILINGSTATUS" VARCHAR2(50),
"TABLEAJID" VARCHAR2(50),
"TABLEJNID" VARCHAR2(50),
"ORGCODE" VARCHAR2(50),
"ADDRES S" VARCHAR2(1000),
"PROJECTNAME" VARCHAR2(255),
"SYSTEMNAME" VARCHAR2(50),
"OPERATE" VARCHAR2(50),
"APPLYERPAGECODE" VARCHAR2(50),
"APPLYERNAME" VARCHAR2(50),
CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
</sql>
</version>
<version edition="21" description="普服快递许可办件材料表">
<sql creator="huwenbin" createDate="20200519" note="普服快递许可办件材料表">
CREATE TABLE "AS_FILING_MATERIAL"
(
"ID" VARCHAR2(50) NOT NULL,
"ROWGUID" VARCHAR2(50),
"PROJECTNO" VARCHAR2(50),
"GETTYPE" VARCHAR2(2),
"MATERIALATTACHNAME" VARCHAR2(200),
"MATERIALNAME" VARCHAR2(200),
"CD_OPERATION" VARCHAR2(2),
"CD_BATCH" VARCHAR2(32),
"DATASOURCE" VARCHAR2(3),
"CD_TIME" DATETIME(6),
"REMARK" VARCHAR2(1000),
"GETNUM" VARCHAR2(5),
"SOURCE_ID" VARCHAR2(50),
"FILINGSTATUS" VARCHAR2(50),
"OPERATE" VARCHAR2(50),
"SYSTEMNAME" VARCHAR2(50),
"URL" VARCHAR2(1000),
CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
</sql>
</version>
<version edition="22" description="普服快递许可办件结果表">
<sql creator="huwenbin" createDate="20200519" note="普服快递许可办件结果表">
CREATE TABLE "AS_FILING_RESULT"
(
"ID" VARCHAR2(255) NOT NULL,
"PROJECTNO" VARCHAR2(50),
"HANDLEUSERNAME" VARCHAR2(100),
"RESULTDATE" DATETIME(6),
"RESULTEXPLAIN" VARCHAR2(2000),
"ISDELIVERYRESULTS" VARCHAR2(2),
"RESULTTYPE" VARCHAR2(2),
"RESULTCETRNAME" VARCHAR2(2000),
"RESULTCETRNO" VARCHAR2(2000),
"SATISFACTION" VARCHAR2(2),
"FILINGSTATUS" VARCHAR2(50),
"TABLEAJID" VARCHAR2(50),
"TABLEJNID" VARCHAR2(50),
"OPERATE" VARCHAR2(50),
"SYSTEMNAME" VARCHAR2(50),
"REMARK" VARCHAR2(50),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
</sql>
</version>
<version edition="23" description="代码值表">
<sql creator="liuyimeng" createDate="20200602" note="代码值表">
CREATE TABLE "AS_CODEVALUE"
(
"ID" INTEGER NOT NULL,
"TABLE_ID" INTEGER,
"COLUMN_ID" INTEGER,
"KEY" VARCHAR2(50),
"VALUE" VARCHAR2(50),
"IDSEQ" VARCHAR2(50),
"COLUMN_NAME" VARCHAR2(50),
CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN "AS_CODEVALUE"."COLUMN_ID" IS '字段ID';
COMMENT ON COLUMN "AS_CODEVALUE"."IDSEQ" IS '全宗代码';
COMMENT ON COLUMN "AS_CODEVALUE"."KEY" IS '代码';
COMMENT ON COLUMN "AS_CODEVALUE"."TABLE_ID" IS '表ID';
COMMENT ON COLUMN "AS_CODEVALUE"."VALUE" IS '值';
</sql>
</version>
<version edition="24" description="四性检测表">
<sql creator="liuyimeng" createDate="20200602" note="四性检测表">
alter table
AS_FOURTEST
add
CONDITION_DES
VARCHAR2(500);
</sql>
</version>
<version edition="25" description="表单列表">
<sql creator="liuyimeng" createDate="20200602" note="表单列表">
alter table
AS_FORM_COLUMN
add
IS_HIDE
VARCHAR2(500);
</sql>
</version>
<version edition="26" description="表单列表">
<sql creator="liuyimeng" createDate="20200602" note="表单列表">
alter table
AS_FORM_COLUMN
add
ID_EDIT
VARCHAR2(500);
</sql>
</version>
<version edition="27" description="库房表">
<sql creator="liuyimeng" createDate="20200602" note="库房表">
alter table
AS_STORAGE
add
IDSEQ
VARCHAR2(500);
</sql>
</version>
<version edition="28" description="库房表">
<sql creator="liuyimeng" createDate="20200602" note="库房表">
alter table
AS_STORAGE
add
ORGAN_ID
VARCHAR2(500);
</sql>
</version>
<version edition="29" description="日常管理表">
<sql creator="liuyimeng" createDate="20200602" note="日常管理表">
alter table
AS_DAILY
add
STORAGE_ID
VARCHAR2(500);
</sql>
</version>
<version edition="30" description="入库表">
<sql creator="liuyimeng" createDate="20200602" note="普服快递许可办件结果表">
alter table
AS_ACCESS_INTO
add
ORGAN_ID
VARCHAR2(500);
</sql>
</version>
<version edition="31" description="移库表">
<sql creator="liuyimeng" createDate="20200602" note="移库表">
alter table
AS_ACCESS_MOVE
add
ORGAN_ID
VARCHAR2(500);
</sql>
</version>
<version edition="32" description="出库表">
<sql creator="liuyimeng" createDate="20200602" note="出库表">
alter table
AS_ACCESS_OUT
add
ORGAN_ID
VARCHAR2(500);
</sql>
</version>
<version edition="33" description="出库表">
<sql creator="liuyimeng" createDate="20200602" note="出库表">
alter table
AS_ACCESS_OUT
add
MOBILEPHONE
VARCHAR2(500);
</sql>
</version>
<version edition="34" description="流程表单部署表">
<sql creator="huwenbin" createDate="20200604" note="流程表单部署表">
CREATE TABLE "AS_PROCESS_DEPLOY_FORM"
(
"ID" NUMBER(9,0) NOT NULL,
"NAME" VARCHAR2(250),
"DEPLOY_USER_ID" NUMBER(9,6),
"SCHE_ID" NUMBER(22,6),
"FORM_CONTENT" CLOB,
"CALLBACK_URL" VARCHAR2(1000),
"PROCESS_ID" NVARCHAR2(64),
"DEPLOY_TIME" DATE,
"ORIGINAL_ID" NUMBER(9,0),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "AS_PROCESS_DEPLOY_FORM" IS '流程表单部署表';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."CALLBACK_URL" IS '回调地址';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."DEPLOY_TIME" IS '部署时间';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."DEPLOY_USER_ID" IS '部署人id';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."FORM_CONTENT" IS '表单内容';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."ID" IS '主键id';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."NAME" IS '表单名称';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."ORIGINAL_ID" IS '源表单id';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."PROCESS_ID" IS '流程id';
CREATE TABLE "AS_PROCESS_DEPLOY_SCHE"
(
"ID" NUMBER(9,0) NOT NULL,
"NAME" VARCHAR2(250),
"FORM_ID" NUMBER(9,0),
"SCHEDULE_CONTENT" CLOB,
"DEPLOY_TIME" DATE,
"ORIGINAL_ID" NUMBER(9,0),
"PROCESS_ID" NVARCHAR2(64),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "AS_PROCESS_DEPLOY_SCHE" IS '流程部署附表';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_SCHE"."DEPLOY_TIME" IS '部署时间';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_SCHE"."FORM_ID" IS '表单id';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_SCHE"."ID" IS '主键';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_SCHE"."NAME" IS '附表名称';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_SCHE"."ORIGINAL_ID" IS '源附表id';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_SCHE"."SCHEDULE_CONTENT" IS '附表内容';
CREATE SEQUENCE "SEQ_AS_PROCESS_DEPLOY_FORM"
INCREMENT BY 1
START WITH 1
MAXVALUE 99999999999
MINVALUE 1
NOCYCLE
NOCACHE
NOORDER
;
CREATE SEQUENCE "SEQ_AS_PROCESS_DEPLOY_SCHE"
INCREMENT BY 1
START WITH 1
MAXVALUE 999999999999
MINVALUE 1
NOCYCLE
NOCACHE
NOORDER
;
</sql>
</version>
<version edition="35" description="修改表单字段表字段类型长度">
<sql creator="huwenbin" createDate="20200605" note="修改表单字段表字段类型长度">
alter table "AS_FORM_COLUMN" modify "ID" NUMBER(22, 0);
alter table "AS_FORM_COLUMN" modify "FORM_TABLE_ID" NUMBER(9, 0);
alter table "AS_FORM_COLUMN" modify "LENGTH" NUMBER(9, 0);
alter table "AS_FORM_COLUMN" modify "IS_HIDE" NUMBER(9, 0);
alter table "AS_FORM_COLUMN" modify "IS_EDIT" NUMBER(9, 0);
</sql>
</version>
<version edition="36" description="修改表字段长度">
<sql creator="huwenbin" createDate="20200608" note="修改表字段长度">
alter table "AS_SCHE_EXT_DATA" modify "SCHE_TABLE_ID" NUMBER(9, 0);
alter table "AS_SCHE_EXT_DATA" modify "SCHE_ID" NUMBER(9, 0);
alter table "AS_PROCESS_FORM" modify "SCHE_ID" NUMBER(9, 0);
alter table "AS_PROCESS_FORM" add primary key("ID");
alter table "AS_PROCESS_TAG" modify "ID" NUMBER(9, 0);
alter table "AS_PROCESS_DEPLOY_FORM" modify "DEPLOY_USER_ID" NUMBER(9, 0);
alter table "AS_PROCESS_DEPLOY_FORM" modify "SCHE_ID" NUMBER(9, 0);
</sql>
</version>
<version edition="37" description="文件批量操作日志表">
<sql creator="liuxiang" createDate="20200609" note="文件批量操作日志表">
CREATE TABLE "AS_FILELOG"
(
"ID" NUMBER(9,0) NOT NULL,
"USER_ID" NUMBER(9,0),
"IP" VARCHAR2(50),
"OPERATION" VARCHAR2(2000),
"STATE" NUMBER(1,0),
"CREATE_TIME" TIMESTAMP(6),
"END_TIME" TIMESTAMP(6),
"NAME" VARCHAR2(3000),
"FILEPATH" VARCHAR2(3000),
"RESULT" VARCHAR2(3000),
"CODE" VARCHAR2(10),
"DETAIL" VARCHAR2(3000),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN "AS_FILELOG"."CODE" IS '代码';
COMMENT ON COLUMN "AS_FILELOG"."CREATE_TIME" IS '创建时间';
COMMENT ON COLUMN "AS_FILELOG"."DETAIL" IS '详情';
COMMENT ON COLUMN "AS_FILELOG"."END_TIME" IS '结束时间';
COMMENT ON COLUMN "AS_FILELOG"."FILEPATH" IS '原始文件';
COMMENT ON COLUMN "AS_FILELOG"."ID" IS '主键';
COMMENT ON COLUMN "AS_FILELOG"."IP" IS 'ip地址';
COMMENT ON COLUMN "AS_FILELOG"."NAME" IS '任务标识';
COMMENT ON COLUMN "AS_FILELOG"."OPERATION" IS '操作';
COMMENT ON COLUMN "AS_FILELOG"."RESULT" IS '结果';
COMMENT ON COLUMN "AS_FILELOG"."STATE" IS '状态';
COMMENT ON COLUMN "AS_FILELOG"."USER_ID" IS '用户名,关联AS_USER表的USERNAME';
CREATE SEQUENCE "ARCHSER_YZ"."SEQ_FILELOG"
INCREMENT BY 1
START WITH 1
MAXVALUE 999999999999
MINVALUE 1
NOCYCLE
CACHE 20
NOORDER
;
</sql>
</version>
<version edition="38" description="生成档案分类管理表">
<sql creator="lidecai" createDate="20200612" note="生成档案分类管理表">
CREATE TABLE "AS_TREECLASSFIC"
(
"ID" NUMBER(22,0) NOT NULL,
"PID" NUMBER(22,0),
"NAME" VARCHAR2(80),
"DESCRIBE" VARCHAR2(100),
"LIBID" NUMBER(22,0),
"CONDITION" VARCHAR2(500),
"SQLCOND" VARCHAR2(500),
"BUSINESSID" VARCHAR2(50),
CLUSTER PRIMARY KEY("ID"),
UNIQUE("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "AS_TREECLASSFIC" IS '档案分类管理自定义';
COMMENT ON COLUMN "AS_TREECLASSFIC"."BUSINESSID" IS '业务类型(1文件接收;2档案著录)';
COMMENT ON COLUMN "AS_TREECLASSFIC"."CONDITION" IS '数据筛选条件';
COMMENT ON COLUMN "AS_TREECLASSFIC"."DESCRIBE" IS '描述';
COMMENT ON COLUMN "AS_TREECLASSFIC"."LIBID" IS '关联档案类型id';
COMMENT ON COLUMN "AS_TREECLASSFIC"."NAME" IS '节点名称';
COMMENT ON COLUMN "AS_TREECLASSFIC"."PID" IS '父节点id';
COMMENT ON COLUMN "AS_TREECLASSFIC"."SQLCOND" IS 'sql拼装条件';
</sql>
<sql creator="lidecai" createDate="20200612" note="创建序列">
CREATE SEQUENCE "SEQ_AS_TREECLASSFIC" INCREMENT BY 1 START WITH 1 MAXVALUE 9223372036854775807 MINVALUE 1;
</sql>
</version>
</update>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE update SYSTEM "DBUpdate_dtd.dtd">
<update dataType="ORACLE" description="Oracle数据库升级SQL语句">
<version edition="1" description="更新错误登陆次数为0">
<sql creator="chenyong" createDate="20200114" note="更新错误登陆次数为0">
UPDATE AS_USER SET ERRORCOUNT=0
</sql>
</version>
<version edition="3" description="创建流程服务的表单表">
<sql creator="huwenbin" createDate="20200212" note="创建流程服务的表单表">
CREATE TABLE "AS_PROCESS_FORM"
(
"ID" NUMBER(9,0) NOT NULL,
"CREATER" NUMBER(22,6),
"CREATE_TIME" TIMESTAMP(6),
"DESCRIPTION" VARCHAR2(250),
"NAME" VARCHAR(250),
"PROCESS_ID" VARCHAR2(64),
"ISSUE" VARCHAR2(10),
"FORM_CONTENT" VARCHAR2(4000),
"SCHEDULE_CONTENT" VARCHAR2(4000),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "ARCHSER_YZ"."AS_PROCESS_FORM" IS '流程服务的表单表';
COMMENT ON COLUMN "ARCHSER_YZ"."AS_PROCESS_FORM"."CREATER" IS '创建人id';
COMMENT ON COLUMN "ARCHSER_YZ"."AS_PROCESS_FORM"."CREATE_TIME" IS '创建时间';
COMMENT ON COLUMN "ARCHSER_YZ"."AS_PROCESS_FORM"."DESCRIPTION" IS '表单描述';
COMMENT ON COLUMN "ARCHSER_YZ"."AS_PROCESS_FORM"."FORM_CONTENT" IS '表单数据JSON';
COMMENT ON COLUMN "ARCHSER_YZ"."AS_PROCESS_FORM"."ID" IS '主键';
COMMENT ON COLUMN "ARCHSER_YZ"."AS_PROCESS_FORM"."ISSUE" IS '是否发布:0:否,1:是';
COMMENT ON COLUMN "ARCHSER_YZ"."AS_PROCESS_FORM"."NAME" IS '表单名称';
COMMENT ON COLUMN "ARCHSER_YZ"."AS_PROCESS_FORM"."PROCESS_ID" IS '流程关联id';
COMMENT ON COLUMN "ARCHSER_YZ"."AS_PROCESS_FORM"."SCHEDULE_CONTENT" IS '附表数据JSON';
</sql>
</version>
<version edition="4" description="创建流程服务和角色关联的表">
<sql creator="huwenbin" createDate="20200212" note="创建流程服务和角色关联的表">
CREATE TABLE "AS_ROLE_FORM"
(
"ID" NUMBER(9,6) NOT NULL,
"ROLE_ID" NUMBER(20,6),
"FORM_ID" NUMBER(20,6),
CLUSTER PRIMARY KEY("ID"),
UNIQUE("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "ARCHSER_YZ"."AS_ROLE_FORM" IS '流程管理角色和表单关联';
COMMENT ON COLUMN "ARCHSER_YZ"."AS_ROLE_FORM"."FORM_ID" IS '表单id';
COMMENT ON COLUMN "ARCHSER_YZ"."AS_ROLE_FORM"."ID" IS '主键id';
COMMENT ON COLUMN "ARCHSER_YZ"."AS_ROLE_FORM"."ROLE_ID" IS '角色id';
</sql>
</version>
<version edition="5" description="创建流程模型和流程部署关联表">
<sql creator="huwenbin" createDate="20200312" note="创建流程模型和流程部署关联表">
create table AS_MODEL_DEPLOYMENT
(
ID INTEGER not null,
DEPLOYMENT_ID VARCHAR2(64),
MODEL_ID VARCHAR2(50)
);
comment on table AS_MODEL_DEPLOYMENT is '流程图与流程部署表的关联表';
create unique index INDEX33558234
on AS_MODEL_DEPLOYMENT (ID);
alter table AS_MODEL_DEPLOYMENT
add constraint CONS134220130
primary key (ID);
CREATE SEQUENCE "SEQ_AS_MODEL_DEPLOYMENT" INCREMENT BY 1 START WITH 1 MAXVALUE 99999999999999 MINVALUE 1 CACHE 20;
CREATE SEQUENCE "SEQ_AS_ROLE_FORM" INCREMENT BY 1 START WITH 1 MAXVALUE 9999999999999999 MINVALUE 1 CACHE 20;
CREATE SEQUENCE "SEQ_AS_PROCESS_FORM" INCREMENT BY 1 START WITH 1 MAXVALUE 9999999999999999 MINVALUE 1 CACHE 20;
</sql>
</version>
<version edition="6" description="流程附表拓展字段表">
<sql creator="huwenbin" createDate="20200428" note="流程附表拓展字段表">
CREATE TABLE "AS_SCHE_EXT_DATA"
(
"ID" NUMBER(9,0) NOT NULL,
"ORIGINAL_DATA" CLOB,
"SCHE_ID" NUMBER(9,0),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "AS_SCHE_EXT_DATA" IS '附表的拓展数据表';
COMMENT ON COLUMN "AS_SCHE_EXT_DATA"."ORIGINAL_DATA" IS '附表源数据';
COMMENT ON COLUMN "AS_SCHE_EXT_DATA"."SCHE_ID" IS '附表id';
CREATE SEQUENCE "SEQ_AS_SCHE_EXT_DATA" INCREMENT BY 1 START WITH 1 MAXVALUE 999999999999999 MINVALUE 1;
</sql>
</version>
<version edition="7" description="流程申请表">
<sql creator="huwenbin" createDate="20200428" note="流程申请表">
CREATE TABLE "AS_APPLY_BORROW"
(
"ID" NUMBER(22,6) NOT NULL,
"PROCESS_INST_ID" VARCHAR2(64),
"START_USER_ID" NUMBER(9,0),
"START_TIME" TIMESTAMP(6),
"END_TIME" TIMESTAMP(6),
"APPLY_STATUS" NUMBER(1,0),
"PROCESS_NAME" VARCHAR2(50),
"TEMPORARY_ID" NUMBER(9,0),
"PROCESS_DEF_ID" VARCHAR2(64),
"TEMPORARY_TIME" TIMESTAMP(6),
"SYSTEM_ID" NUMBER(9,0),
CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "AS_APPLY_BORROW" IS '档案申请借阅表';
COMMENT ON COLUMN "AS_APPLY_BORROW"."APPLY_STATUS" IS '申请状态';
COMMENT ON COLUMN "AS_APPLY_BORROW"."END_TIME" IS '结束时间';
COMMENT ON COLUMN "AS_APPLY_BORROW"."ID" IS '主键id';
COMMENT ON COLUMN "AS_APPLY_BORROW"."PROCESS_DEF_ID" IS '流程定义id';
COMMENT ON COLUMN "AS_APPLY_BORROW"."PROCESS_INST_ID" IS '流程实例id';
COMMENT ON COLUMN "AS_APPLY_BORROW"."PROCESS_NAME" IS '流程实例名称';
COMMENT ON COLUMN "AS_APPLY_BORROW"."START_TIME" IS '申请时间';
COMMENT ON COLUMN "AS_APPLY_BORROW"."START_USER_ID" IS '申请人';
COMMENT ON COLUMN "AS_APPLY_BORROW"."SYSTEM_ID" IS '系统id';
COMMENT ON COLUMN "AS_APPLY_BORROW"."TEMPORARY_ID" IS '暂存id';
</sql>
</version>
<version edition="8" description="流程附表拓展字段表">
<sql creator="huwenbin" createDate="20200428" note="流程附表拓展字段表增加字段">
alter table "ARCHSER_YZ"."AS_SCHE_EXT_DATA" add column("SCHE_TABLE_ID" NUMBER(9, 6));
comment on column "ARCHSER_YZ"."AS_SCHE_EXT_DATA"."SCHE_TABLE_ID" is '附表设计表id';
</sql>
</version>
<version edition="9" description="流程模型表单增加字段">
<sql creator="huwenbin" createDate="20200519" note="流程模型表单增加字段">
alter table "AS_MODEL_DEPLOYMENT" add column("FORM_ID" NUMBER(9, 0));
alter table "AS_MODEL_DEPLOYMENT" add column("TAG_ID" NUMBER(9, 0));
alter table "AS_MODEL_DEPLOYMENT" add column("TAG_NAME" VARCHAR2(50));
</sql>
</version>
<version edition="10" description="流程表单部署表">
<sql creator="huwenbin" createDate="20200604" note="流程表单部署表">
CREATE TABLE "AS_PROCESS_DEPLOY_FORM"
(
"ID" NUMBER(9,0) NOT NULL,
"NAME" VARCHAR2(250),
"DEPLOY_USER_ID" NUMBER(9,6),
"SCHE_ID" NUMBER(22,6),
"FORM_CONTENT" CLOB,
"CALLBACK_URL" VARCHAR2(1000),
"PROCESS_ID" NVARCHAR2(64),
"DEPLOY_TIME" DATE,
"ORIGINAL_ID" NUMBER(9,0),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "AS_PROCESS_DEPLOY_FORM" IS '流程表单部署表';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."CALLBACK_URL" IS '回调地址';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."DEPLOY_TIME" IS '部署时间';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."DEPLOY_USER_ID" IS '部署人id';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."FORM_CONTENT" IS '表单内容';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."ID" IS '主键id';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."NAME" IS '表单名称';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."ORIGINAL_ID" IS '源表单id';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."PROCESS_ID" IS '流程id';
CREATE TABLE "AS_PROCESS_DEPLOY_SCHE"
(
"ID" NUMBER(9,0) NOT NULL,
"NAME" VARCHAR2(250),
"FORM_ID" NUMBER(9,0),
"SCHEDULE_CONTENT" CLOB,
"DEPLOY_TIME" DATE,
"ORIGINAL_ID" NUMBER(9,0),
"PROCESS_ID" NVARCHAR2(64),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "AS_PROCESS_DEPLOY_SCHE" IS '流程部署附表';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_SCHE"."DEPLOY_TIME" IS '部署时间';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_SCHE"."FORM_ID" IS '表单id';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_SCHE"."ID" IS '主键';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_SCHE"."NAME" IS '附表名称';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_SCHE"."ORIGINAL_ID" IS '源附表id';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_SCHE"."SCHEDULE_CONTENT" IS '附表内容';
CREATE SEQUENCE "SEQ_AS_PROCESS_DEPLOY_FORM"
INCREMENT BY 1
START WITH 1
MAXVALUE 99999999999
MINVALUE 1
NOCYCLE
NOCACHE
NOORDER
;
CREATE SEQUENCE "SEQ_AS_PROCESS_DEPLOY_SCHE"
INCREMENT BY 1
START WITH 1
MAXVALUE 999999999999
MINVALUE 1
NOCYCLE
NOCACHE
NOORDER
;
</sql>
</version>
<version edition="11" description="修改表单字段表字段类型长度">
<sql creator="huwenbin" createDate="20200605" note="修改表单字段表字段类型长度">
alter table "AS_FORM_COLUMN" modify "ID" NUMBER(22, 0);
alter table "AS_FORM_COLUMN" modify "FORM_TABLE_ID" NUMBER(9, 0);
alter table "AS_FORM_COLUMN" modify "LENGTH" NUMBER(9, 0);
alter table "AS_FORM_COLUMN" modify "IS_HIDE" NUMBER(9, 0);
alter table "AS_FORM_COLUMN" modify "IS_EDIT" NUMBER(9, 0);
</sql>
</version>
<version edition="12" description="修改表字段长度">
<sql creator="huwenbin" createDate="20200608" note="修改表字段长度">
alter table "AS_SCHE_EXT_DATA" modify "SCHE_TABLE_ID" NUMBER(9, 0);
alter table "AS_SCHE_EXT_DATA" modify "SCHE_ID" NUMBER(9, 0);
alter table "AS_PROCESS_FORM" modify "SCHE_ID" NUMBER(9, 0);
alter table "AS_PROCESS_FORM" add primary key("ID");
alter table "AS_PROCESS_TAG" modify "ID" NUMBER(9, 0);
alter table "AS_PROCESS_DEPLOY_FORM" modify "DEPLOY_USER_ID" NUMBER(9, 0);
alter table "AS_PROCESS_DEPLOY_FORM" modify "SCHE_ID" NUMBER(9, 0);
</sql>
</version>
</update>
dbType=DM
jdbcUrl=jdbc:dm://39.104.28.145:5236
jdbc.driver=dm.jdbc.driver.DmDriver
user=archser_yz
password=archser_yz
basic.url=http://39.104.28.145:11028
devMode =true
engineDevMode=true
authUrl=http://125.77.26.133:7001/auth/token
userInfoUrl=http://125.77.26.133:7001/api/info/user_info
redirect_uri=http://192.168.31.17:8080/
# --- 消息中心websocket配置 ---
## 定时发送消息的周期 单位毫秒
messageWsDelay=5000
## 延期,第二次发送消息的延期时间,第一次发送在开始连接时就会发送 单位毫秒
messageWsPeriod=5000
## 消息发送成功后,等待客户端反馈时间,超出此时间表示连接已经断开,会关闭连接 单位毫秒
messageWsTimeout=30000
## 是否开启消息中心的websocket
openMessageWebSocket=true
MyIpAddress=127.0.0.1,39.104.28.145
# ---\u5F00\u53D1\u73AF\u5883\u914D\u7F6E\u6587\u4EF6---
#database config
dbType=DM
#jdbcUrl=jdbc:oracle:thin:@db.archser.com:1521:ychy
#jdbc.driver=oracle.jdbc.driver.OracleDriver
#user = archser_yz_test
#password =archser_yz_test
jdbcUrl=jdbc:dm://192.168.31.119:5236
jdbc.driver=dm.jdbc.driver.DmDriver
user=archser_yz
password=archser_yz
basic.url=http://192.168.31.119:11028
devMode =true
engineDevMode=true
authUrl=http://125.77.26.133:7001/auth/token
userInfoUrl=http://125.77.26.133:7001/api/info/user_info
redirect_uri=http://192.168.31.17:8080/
# --- \u6D88\u606F\u4E2D\u5FC3websocket\u914D\u7F6E ---
## \u5B9A\u65F6\u53D1\u9001\u6D88\u606F\u7684\u5468\u671F \u5355\u4F4D\u6BEB\u79D2
messageWsDelay=5000
## \u5EF6\u671F\uFF0C\u7B2C\u4E8C\u6B21\u53D1\u9001\u6D88\u606F\u7684\u5EF6\u671F\u65F6\u95F4\uFF0C\u7B2C\u4E00\u6B21\u53D1\u9001\u5728\u5F00\u59CB\u8FDE\u63A5\u65F6\u5C31\u4F1A\u53D1\u9001 \u5355\u4F4D\u6BEB\u79D2
messageWsPeriod=5000
## \u6D88\u606F\u53D1\u9001\u6210\u529F\u540E\uFF0C\u7B49\u5F85\u5BA2\u6237\u7AEF\u53CD\u9988\u65F6\u95F4\uFF0C\u8D85\u51FA\u6B64\u65F6\u95F4\u8868\u793A\u8FDE\u63A5\u5DF2\u7ECF\u65AD\u5F00\uFF0C\u4F1A\u5173\u95ED\u8FDE\u63A5 \u5355\u4F4D\u6BEB\u79D2
messageWsTimeout=30000
## \u662F\u5426\u5F00\u542F\u6D88\u606F\u4E2D\u5FC3\u7684websocket
## 是否开启消息中心的websocket
openMessageWebSocket=true
MyIpAddress=127.0.0.1,192.168.31.192,192.168.31.119
# -------############------------------
log4j.rootLogger=WARN, stdout, file
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%n%-d{yyyy-MM-dd HH:mm:ss}%n[%p]-[Thread: %t]-[%C.%M()]: %m%n
# Output to the File
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=./aserver.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%n%-d{yyyy-MM-dd HH:mm:ss}%n[%p]-[Thread: %t]-[%C.%M()]: %m%n
\ No newline at end of file
# 下载地址:
# https://github.com/undertow-io/undertow/blob/master/examples/src/main/resources/logging.properties
#
# JBoss, Home of Professional Open Source.
# Copyright 2012 Red Hat, Inc., and individual contributors
# as indicated by the @author tags.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Additional logger names to configure (root logger is always configured)
loggers=org.xnio.listener,org.xnio.ssl,org.apache,io.undertow.util.TestHttpClient
# Root logger configuration
logger.level=${test.level:ERROR}
logger.handlers=CONSOLE
# Console handler configuration
handler.CONSOLE=org.jboss.logmanager.handlers.ConsoleHandler
handler.CONSOLE.properties=autoFlush,target
handler.CONSOLE.target=SYSTEM_ERR
handler.CONSOLE.level=ALL
handler.CONSOLE.autoFlush=true
handler.CONSOLE.formatter=PATTERN
# The log format pattern
formatter.PATTERN=org.jboss.logmanager.formatters.PatternFormatter
formatter.PATTERN.properties=pattern
formatter.PATTERN.pattern=%d{HH:mm:ss,SSS} %-5p (%t) [%c] <%F:%L> %m%n
logger.org.xnio.listener.level=DEBUG
logger.org.xnio.ssl.level=DEBUG
logger.org.apache.level=WARN
logger.org.apache.useParentHandlers=false
logger.io.undertow.util.TestHttpClient.level=WARN
\ No newline at end of file
#namespace("message")
#sql("getMessagePageData")
select t.id, t.sender_id,t.send_to_id,t.title,t.content,t.system_id,
t.path,t.params,t.operate,t.read,t.send_time,
su.name as sender, ru.name as receive, asys.title as system
from as_message t
left join as_user su
on su.id = t.sender_id
left join as_user ru
on ru.id = t.send_to_id
left join as_system asys
on asys.id = t.system_id
where t.send_to_id = #para(send_to_id)
#if(menu == 'unread')
and read is null
#else if(menu == 'readed')
and read = 'Y'
#end
order by t.send_time desc
#end
#sql("markRead")
update as_message t set t.read = 'Y'
where t.id = #para(id)
#end
#sql("deleteMessage")
delete as_message t
where t.id in (
#for(item : ids)
#(for.index==0 ? "" : ",") #(item)
#end
)
#end
#sql("getCountByRead")
select count(t.id) as count
from as_message t
where t.send_to_id is not null and t.send_to_id = (
select id from as_user u where u.username = #para(username)
)
#if(read)
and t.read = #para(read)
#else
and t.read is null
#end
#end
#end
### SQL模板
### 获取指定名称的配置
#sql("getConfigByName")
select val from AS_CONFIG where NAME=?
#end
### 根据SysId获取菜单列表
#sql("getMenuListBySysId")
select * from as_menu where system_id=#(sysId)
#if(condStr)
and #(condStr)
#end
#end
### 获取指定用户
#sql("getUserByUsername")
select * from AS_USER where USERNAME=#para(0)
#end
### 删除菜单数据
#sql("deleteMenuByIds")
delete as_menu where id in (
#for(item : ids)
#(for.index==0 ? "" : ",") #(item)
#end
)
#end
### 删除菜单权限表数据
#sql("deleteRoleMenuByIds")
delete as_role_menu where menu_id in (
#for(item : ids)
#(for.index==0 ? "" : ",") #(item)
#end
)
#end
### 获取系统,应用菜单使用
#sql("getSystems")
select ID, NAME, TITLE, TYPE, URL, DESCRIPTION from AS_SYSTEM order by ID
#end
### 获取系统
#sql("findSystemList")
select * from AS_SYSTEM t
#if(searchText != null && searchText != "" && searchText != "null")
where t.name like #para(searchText)
or t.title like #para(searchText)
or t.service like #para(searchText)
or t.url like #para(searchText)
or t.description like #para(searchText)
or t.type like #para(searchText)
#end
#end
#sql("findConfigList")
select * from AS_CONFIG AC
#if(searchText != null && searchText != "" && searchText != "null")
where #(searchText)
#end
#end
### 获取加星菜单
#sql("getMenuStar")
select * from AS_MENU_STAR where USER_ID=#para(0)
#end
### 获取用户
#sql("getUserId")
select ID from AS_USER where USERNAME=? and rownum =1
#end
### 删除加星菜单
#sql("deleteMenuStar")
delete from AS_MENU_STAR where USER_ID=#para(userId) and MENU_ID=#para(menuId)
#end
### 获取指定用户
#sql("getUser")
select * from AS_USER where "USERNAME"=#para(0)
#end
### 获取指定系统私钥
#sql("getSystemPrivatekey")
select "TYPE", KEYID, PRIVATEKEY, URL,TITLE from AS_SYSTEM where "NAME"=#para(0) and rownum =1
#end
### 获取所有菜单
#sql("getMenus")
select * from AS_MENU order by ID
#end
### 获取用户权限应用菜单
#sql("getMenusByUser")
select * from AS_MENU where ID in (
select MENU_ID from AS_ROLE_MENU where ROLE_ID in (
select r.ID from AS_ROLE r, AS_ROLE_USER ru where r.ID=ru.ROLE_ID and ru.USER_ID=#para(userId)
)
) order by ID
#end
### 查询用户是否有指定菜单权限
#sql("findMenuIdByNameAndUserId")
select menu_id
from as_role_menu
where role_id in (select r.id
from as_role r, as_role_user ru
where r.id = ru.role_id
and ru.user_id = #para(userId))
and menu_id = (select id from as_menu m where m.name = #para(menuName))
#end
### 查询菜单根据用户id和系统type和菜单名称
#sql("findMenuByUserSystemAndName")
select menu_id
from as_role_menu
where role_id in (select r.id
from as_role r, as_role_user ru
where r.id = ru.role_id
and ru.user_id = #para(userId))
and menu_id in
(select id
from as_menu m
where m.system_id in
(select id from as_system sys where sys.type = #para(systemType))
and m.name = #para(menuName))
#end
#sql("findMenuAndSystemIfUserHasRole")
select m.id as menu_id ,sys.title as system
from as_menu m
inner join as_system sys
on m.system_id = sys.id
where sys.type = #para(systemType)
and m.name = #para(menuName)
and exists
(select menu_id
from as_role_menu
where menu_id = m.id
and role_id in (select r.id
from as_role r, as_role_user ru
where r.id = ru.role_id
and ru.user_id = #para(userId))
)
#end
#sql("findMenuBySystemType")
select menu_id
from as_role_menu
where role_id in (select r.id
from as_role r, as_role_user ru
where r.id = ru.role_id
and ru.user_id = #para(userId))
and menu_id in
(select id
from as_menu m
where m.system_id in
(select id from as_system sys where sys.type = #para(systemType))
)
#end
#sql("findSystemWithUserPermission")
select sys.* from as_system sys
where sys.id in (
select m.system_id from as_menu m
where m.id in (
select rm.menu_id from as_role_menu rm
where rm.role_id in (
select role_id from as_role_user ru
where ru.user_id = #para(userId)
)
)
group by m.system_id
)
#end
### 获取调试信息日志
#sql("getLogs")
select ag.ID, CODE, TYPE, CONTENT, URL, au.USERNAME, CREATE_TIME as TIME
from AS_LOG ag,as_user au where #(condition) and ag.type='ajax' AND ag.user_id=au.id order by ag.ID desc
#end
### 获取用户角色关系
#sql("getRole")
SELECT * from AS_ROLE where ID in (
#for(item : ids)
#(for.index==0 ? "" : ",") #(item)
#end
)
#end
### 拥有三员角色的用户数
#sql("hasThreeMemberUsersCount")
select count(id) from as_role_user where role_id in(select id from as_role where name='Sysadmin' or name='Secadmin' or name='Audadmin')
#end
### 用户拥有的非锁定的角色个数
#sql("hasNoLockedRolesCount")
select count(id) from as_role where id in(select role_id from as_role_user where user_id=(select id from as_user where username=?)) and locked='N'
#end
###查询访问的系统名称
#sql("findSystemTitleByType")
select title from as_system where "TYPE"=? and rownum=1
#end
###查询错误次数
#sql("getErrorCount")
select decode (trunc(last_login_time), trunc(sysdate),
case when (sysdate - last_login_time) * 24 > #para(hour) and errorcount >= #para(permitLoginTimes)
then 1
else errorcount end,
1) "flag"
from as_user
where id =#para(id)
#end
###更改错误次数和最后登录时间
#sql("updateForErr")
update as_user
set errorcount = decode(trunc(last_login_time), trunc(sysdate),
case when (sysdate - last_login_time) * 24 > #para(hour)
and errorcount >= #para(permitLoginTimes)
then 1
else errorcount + 1 end,
1),
last_login_time = sysdate
where id =#para(id)
#end
###当密码正确时查询错误次数
###xiaoying 20200406 缺陷YZJ-2598 修改登录成功问题
#sql("checkWhenPwdOk")
select case
when trunc(last_login_time) != trunc(sysdate) then
0
when #(hour) / 24 < sysdate - last_login_time and errorcount >= #(permitLoginTimes) then
errorcount
else
0
end "flag"
from as_user
where id =#(id)
#end
###通过keyId得到密钥
#sql("getPublickeyByKeyId")
select publickey from as_system where keyid=? and rownum=1
#end
###错误次数清零
#sql("updateForOk")
update as_user
set errorcount = 0,
last_login_time = sysdate
where id =#(id)
and errorcount != 0
#end
--修改密码
#sql("updatePassword")
UPDATE AS_USER set PASSWORD = ? WHERE USERNAME = ?
#end
##根据用户ID查询角色
#sql("getRolesByUserId")
select ROLE_ID from AS_ROLE_USER WHERE USER_ID = ?
#end
### 获取用户信息通过personCode
#sql("getUserByPersonCode")
select * from AS_USER where DC_PERSONCODE = #para(personCode)
#end
###更新配置表的值
#sql("updateConfigVal")
UPDATE AS_CONFIG set VAL = ? WHERE NAME = ?
#end
###根据用户id和系统Id查找菜单 xiaoying 20200414 YZJ-2725 隐藏菜单无法登录问题
#sql("findMenuByUserIdAndSysId")
select * from AS_MENU where ID in (
select MENU_ID from AS_ROLE_MENU where ROLE_ID in (
select r.ID from AS_ROLE r, AS_ROLE_USER ru where r.ID=ru.ROLE_ID and ru.USER_ID=#para(userId)
)
) and system_id =#para(systemId) order by ID
#end
#include("message.sql")
\ No newline at end of file
# ---开发环境配置文件---
# 配置undertow使用说明:
#
# 1:系统默认在 class path 根目录下先加载 undertow-dev.properties 再加载 undertow-pro.properties
# 进行配置,当上述两个配置文件不存在时不抛异常并使用默认值配置
#
# 2:所有配置可以省略,省略时使用默认配置
#
# 3:开发阶段 undertow.devMode 配置为 true 才支持热加载
#
# 4:该文件列出了绝大多数可配置项,更多不常用配置可以查看 UndertowConfig 源码中的配置常量定义
#
# 5:当配置项不足以满足需求时,可以通过如下方式添加额外配置:
# UndertowServer
# .create(AppConfig.class)
# .config( config -> {
# config.setHost("0.0.0.0");
# config.setSessionTimeout(30 * 60);
# })
# .start();
#
# 类似上面的配置方式还有带 Builder 参数的 onStart(...) 可以对 undertow 进行配置
#
# true 值支持热加载,生产环境建议配置成 false
undertow.devMode=true
# 避免项目中的 .class 打成 jar 包以后,同时在使用 devMode 时报的异常
# 只要 undertow.devMode 设置为 false,或者不打包就不会有异常
# 添加此配置以后则无需关心上面这类事情,多个前缀用逗号分隔开
# undertow.hotSwapClassPrefix=com.jfinal.club.
undertow.host=0.0.0.0
undertow.port=11038
undertow.contextPath=/aserver
server.undertow.accesslog.pattern=%h %l %u %t &quot;%r&quot; %s %b %D
# js、css 等等 web 资源存放的目录
# undertow.resourcePath=webapp, src/main/webapp
# io 线程数与 worker 线程数
undertow.ioThreads=12
undertow.workerThreads=96
# session 过期时间,注意单位是秒
# undertow.session.timeout=1800
# 热加载保持 session 值,避免依赖于 session 的登录型项目反复登录,默认值为 true。仅用于 devMode,生产环境无影响
# undertow.session.hotSwap=true
# 开启 gzip 压缩
undertow.gzip.enable=true
# 配置压缩级别,默认值 -1。 可配置 1 到 9。 1 拥有最快压缩速度,9 拥有最高压缩率
undertow.gzip.level=-1
# 触发压缩的最小内容长度
undertow.gzip.minLength=1024
# SSL 配置 ----------------------------------------------------------------------------------
# 生产环境从阿里云下载 tomcat 类型的密钥库。以下两行命令生成密钥库仅用于测试:
# 下面两行命令生成密钥库
# keytool -genkeypair -validity 3650 -alias jbolt -keyalg RSA -keystore jbolt.jks
# keytool -importkeystore -srckeystore jbolt.jks -destkeystore jbolt.pfx -deststoretype PKCS12
# 生成过程中提示输入 "名字与姓氏" 时输入 localhost
# 是否开启 ssl
undertow.ssl.enable=false
# ssl 监听端口号,部署环境设置为 443
#undertow.ssl.port=443
# 密钥库类型,建议使用 PKCS12
#undertow.ssl.keyStoreType=PKCS12
# 密钥库文件 请在配置文件所在目录下放置 jbolt.pfx
#undertow.ssl.keyStore=jbolt.pfx
# 密钥库密码 请按照实际情况填写
#undertow.ssl.keyStorePassword=your_keyStorePassword
# 别名配置,一般不使用
# undertow.ssl.keyAlias=club
# ssl 开启时,是否开启 http2。检测该配置是否生效在 chrome 地址栏中输入: chrome://net-internals/#http2
#undertow.http2.enable=false
# ssl 开启时,http 请求是否重定向到 https
#undertow.http.toHttps=false
# ssl 开启时,http 请求重定向到 https 使用的状态码 默认就是302
# undertow.http.toHttpsStatusCode=302
# ssl 开启时,是否关闭 http
#undertow.http.disable=false
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<filter>
<filter-name>jfinal</filter-name>
<filter-class>com.jfinal.core.JFinalFilter</filter-class>
<init-param>
<param-name>configClass</param-name>
<param-value>com.archser.aserver.common.config.MainConfig</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>jfinal</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>应用管理API</title>
<style type="text/css">
@charset "UTF-8";
html {
line-height: 1.15; /* 1 */
-ms-text-size-adjust: 100%; /* 2 */
-webkit-text-size-adjust: 100%; /* 2 */
background: #fffcf4;
max-height: 100%;
max-width:100%;
width:100%;
min-height:100%;
padding: 0px;
overflow: auto;
}
body {
margin: 0;
background: #fffcf4;
max-height: 100%;
max-width:100%;
width:100%;
height:100%;
padding: 0px;
overflow: hidden;
}
heml,
body{
overflow-y: hidden;
}
</style>
</head>
<body oncontextmenu="return false">
<div class="main">
应用管理API
<script type="text/javascript">
document.location.href = "/";
</script>
</div>
</body>
</html>
\ No newline at end of file
@echo off
rem -------------------------------------------------------------------------
rem
rem 使用说明:
rem
rem 1: 该脚本用于别的项目时只需要修改 MAIN_CLASS 即可运行
rem
rem 2: JAVA_OPTS 可通过 -D 传入 undertow.port 与 undertow.host 这类参数覆盖
rem 配置文件中的相同值此外还有 undertow.resourcePath, undertow.ioThreads
rem undertow.workerThreads 共五个参数可通过 -D 进行传入
rem
rem 3: JAVA_OPTS 可传入标准的 java 命令行参数,例如 -Xms256m -Xmx1024m 这类常用参数
rem
rem
rem -------------------------------------------------------------------------
setlocal & pushd
rem 启动入口类,该脚本文件用于别的项目时要改这里
set MAIN_CLASS=com.archser.aserver.common.config.MainConfig
rem Java 命令行参数,根据需要开启下面的配置,改成自己需要的,注意等号前后不能有空格
rem set "JAVA_OPTS=-Xms256m -Xmx1024m -Dundertow.port=80 -Dundertow.host=0.0.0.0"
rem set "JAVA_OPTS=-Dundertow.port=80 -Dundertow.host=0.0.0.0"
set APP_BASE_PATH=%~dp0
set CP=%APP_BASE_PATH%config;%APP_BASE_PATH%lib\*
java -Xverify:none %JAVA_OPTS% -cp %CP% %MAIN_CLASS%
endlocal & popd
pause
#!/bin/bash
# ---------------------------------------------------------------------------
#
# 使用说明:
#
# 1: 该脚本用于别的项目时只需要修改 MAIN_CLASS 即可运行
#
# 2: JAVA_OPTS 可通过 -D 传入 undertow.port 与 undertow.host 这类参数覆盖
# 配置文件中的相同值此外还有 undertow.resourcePath、undertow.ioThreads、
# undertow.workerThreads 共五个参数可通过 -D 进行传入,该功能尽可能减少了
# 修改 undertow 配置文件的必要性
#
# 3: JAVA_OPTS 可传入标准的 java 命令行参数,例如 -Xms256m -Xmx1024m 这类常用参数
#
# 4: 脚本最后一部分给出了 4 种启动项目的命令行,根据注释中的提示自行选择合适的方式
#
# ---------------------------------------------------------------------------
# 启动入口类,该脚本文件用于别的项目时要改这里
MAIN_CLASS=com.archser.aserver.common.config.MainConfig
# Java 命令行参数,根据需要开启下面的配置,改成自己需要的,注意等号前后不能有空格
# JAVA_OPTS="-Xms256m -Xmx1024m -Dundertow.port=80 -Dundertow.host=0.0.0.0"
# JAVA_OPTS="-Dundertow.port=80 -Dundertow.host=0.0.0.0"
# 生成 class path 值
APP_BASE_PATH=$(cd `dirname $0`; pwd)
CP=${APP_BASE_PATH}/config:${APP_BASE_PATH}/lib/*
# 运行为后台进程,并在控制台输出信息
java -Xverify:none ${JAVA_OPTS} -cp ${CP} ${MAIN_CLASS} &
export CATALINA_OPTS="-Djava.awt.headless=true"
CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote
-Djava.rmi.server.hostname=10.15.183.51
-Dcom.sun.management.jmxremote.port=9996
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false"
# 运行为后台进程,并且不在控制台输出信息
# nohup java -Xverify:none ${JAVA_OPTS} -cp ${CP} ${MAIN_CLASS} >/dev/null 2>&1 &
# 运行为后台进程,并且将信息输出到 output.log 文件
# nohup java -Xverify:none ${JAVA_OPTS} -cp ${CP} ${MAIN_CLASS} > output.log &
# 运行为非后台进程,多用于开发阶段,快捷键 ctrl + c 可停止服务
# java -Xverify:none ${JAVA_OPTS} -cp ${CP} ${MAIN_CLASS}
#!/bin/bash
# ---------------------------------------------------------------------------
#
# 使用说明:
#
# 1: MAIN_CLASS 必须要与配对的 start.sh 文件中的 MAIN_CLASS 完全相同
#
# 2: 该脚本用于别的项目时只需要修改 MAIN_CLASS 即可使用
#
# 3: 注意:如果有其它项目的 MAIN_CLASS 与本项目一样则不能使用本脚本关闭服务
# 同理同一个项目使用了不同端口启动的,也会拥有相同的 MAIN_CLASS 值
# 也不能使用本脚本关闭服务,这种情况使用下面的命令先查 pid 值:
# ps aux | grep java
#
# 确认好 pid 以后,使用 kill pid 关闭服务
#
# 注意 kill 命令不要带 -9 这个参数,否则 jfinal 中的一些与服务关闭
# 有关的回调方法将不会被回调,例如 JFinalConfig.beforeJFinalStop()
#
# ---------------------------------------------------------------------------
# 启动入口类,该脚本文件用于别的项目时要改这里
MAIN_CLASS=com.archser.aserver.common.config.MainConfig
# kill 命令不使用 -9 参数时,项目被正常、温和地关闭,jfinal 项目中的回调会起作用
kill `pgrep -f ${MAIN_CLASS}` 2>/dev/null
# 以下代码与上述代码等价
# kill $(pgrep -f ${MAIN_CLASS}) 2>/dev/null
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