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 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;
}
}
This diff is collapsed.
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;
}
}
This diff is collapsed.
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);
}
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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