forked from gitee/vben-java
老版本归档与清理
This commit is contained in:
-12
@@ -1,12 +0,0 @@
|
||||
# 项目排除路径
|
||||
/vben-admin/target/
|
||||
/vben-admin/src/main/resources/static/
|
||||
/vben-admin-bi/target/
|
||||
/vben-admin-bi/src/main/resources/static/
|
||||
/vben-core/target/
|
||||
/vben-extend/target/
|
||||
/vben-extend-bi/target/
|
||||
/.idea/
|
||||
#/vben-extend/src/main/java/vben/extend/bi/
|
||||
#/vben-extend/src/main/java/vben/extend/sa/
|
||||
#/vben-extend/src/main/java/vben/extend/te/
|
||||
@@ -1,3 +0,0 @@
|
||||
- **初始化项目 V0.2**
|
||||
|
||||
- [更新] README.md、项目介绍
|
||||
@@ -1,21 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2022 vben
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -1,63 +0,0 @@
|
||||
<div align="center"><h1 align="center">vben-java</h1></div>
|
||||
<div align="center"><h3 align="center">一个开箱即用的快速开发平台JAVA版</h3></div>
|
||||
|
||||
# 🍿 相关地址
|
||||
* PC端体验地址 :[http://8.153.168.178/](http://8.153.168.178/) (演示版本采用最新vben5版本)
|
||||
* 移动端体验地址 :[http://8.153.168.178/unibest/](http://8.153.168.178/unibest/)
|
||||
* 文档地址 :[http://8.153.168.178/doc](http://8.153.168.178/doc)
|
||||
* QQ交流群:[795417789](https://jq.qq.com/?_wv=1027&k=yoKKIlIG)
|
||||
|
||||
### 🍟 概述
|
||||
* 特别说明:vben系列项目是由https://gitee.com/zsvg 大哥原vboot项目转移的。
|
||||
* 特别说明:目前前端是基于vue-next-admin的,vben5 ui目前正在适配中。
|
||||
* 基于JAVA实现的快速开发平台。模块化插件式开发,前后端分离,开箱即用。
|
||||
* 后台基于SpringBoot框架,数据库访问同时集成了Jpa与MyBatis-Plus,即可自动生成数据库表结构,又可灵活编写sql。
|
||||
* 前端基于vue-next-admin/vben框架,引入了bpmn.js工作流、VForm可视化表单。
|
||||
* 前端项目地址:[https://gitee.com/vben/vben-ui](https://gitee.com/vben/vben-ui)
|
||||
* .NET8实现的同功能项目地址[https://gitee.com/vben/vben-net](https://gitee.com/vben/vben-net) 两个项目会同步开发
|
||||
|
||||
### 🍄 快速启动
|
||||
* 准备工作:1.配置一个名为vben-java的mysql数据库,默认账号root,密码123456(可改) 2.开启redis 可不设置密码
|
||||
* 启动后台:打开项目,找到vben-admin下的vbenApplication启动类启动运行
|
||||
* 启动前端:下载配套的前端UI[https://gitee.com/vben/vben-ui](https://gitee.com/vben/vben-ui)使用npm构建,访问 `http://localhost:868` 预览
|
||||
|
||||
### 🏀 分层说明
|
||||
```
|
||||
├─vben-admin ->自定义管理应用层,在此写您具体业务代码
|
||||
├─vben-core ->框架核心层,包含框架集成,基础模块与通用工具类等
|
||||
├─vben-extend ->框架扩展层,包含扩展的常用功能与模块
|
||||
注:建议将自己的业务代码写在【vben-admin】层里面,可随框架升级减少冲突。
|
||||
```
|
||||
|
||||
### 🍖 详细功能
|
||||
1. 主控面板:控制台页面,可进行工作台,分析页,统计等功能的展示。
|
||||
2. 部门管理:部门维护,支持多层级结构的树形结构。
|
||||
3. 用户管理:用户维护,可设置用户部门,岗位,群组,职务,角色,数据权限等。
|
||||
4. 岗位管理:岗位维护,岗位可作为用户的一个标签,岗位也可与权限等其他功能挂钩。
|
||||
5. 群组管理:群组维护,群组可设置部门,用户,岗位,用于更广泛的权限设置。
|
||||
6. 菜单管理:菜单目录,菜单,和按钮的维护是权限控制的基本单位。
|
||||
7. 角色管理:角色绑定菜单后,可限制相关角色的人员登录系统的功能范围。
|
||||
8. 字典管理:系统内各种枚举类型的维护。
|
||||
9. 访问日志:用户的登录和退出日志的查看和管理。
|
||||
10. 操作日志:用户的操作业务的日志的查看和管理。
|
||||
11. 定时任务:定时任务的维护,通过cron表达式控制任务的执行频率。
|
||||
12. 流程引擎:流程图展示,自解析bpmn.js,支持驳回、转办、废弃,跳转等功能
|
||||
13. 在线表单:在线表单设计,配合流程可以实现表单数据流转
|
||||
14. 消息机制:待办待阅功能,联通钉钉与企业微信接口
|
||||
15. 代码生成:在线配置,一键生成前后端代码
|
||||
|
||||
### ⚡ 近期计划
|
||||
- [ ] 完善文档
|
||||
- [ ] 完善工作流
|
||||
|
||||
### 💐 特别鸣谢
|
||||
- 👉 eladmin:[https://gitee.com/elunez/eladmin](https://gitee.com/elunez/eladmin)
|
||||
- 👉 ruoyi:[https://gitee.com/y_project/RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue)
|
||||
- 👉 Vben-Admin:[https://vvbin.cn/doc-next](https://vvbin.cn/doc-next)
|
||||
- 👉 vue-next-admin:[https://gitee.com/lyt-top/vue-next-admin](https://gitee.com/lyt-top/vue-next-admin)
|
||||
- 👉 vxe-table:[https://gitee.com/xuliangzhan_admin/vxe-table](https://gitee.com/xuliangzhan_admin/vxe-table)
|
||||
- 👉 VForm:[https://www.vform666.com](https://www.vform666.com/)
|
||||
|
||||
```
|
||||
如果对您有帮助,点击右上角⭐Star⭐关注 ,感谢支持开源!
|
||||
```
|
||||
@@ -1,102 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<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.zsvg</groupId>
|
||||
<artifactId>vben</artifactId>
|
||||
<packaging>pom</packaging>
|
||||
<version>0.1</version>
|
||||
<modules>
|
||||
<module>vben-core</module>
|
||||
<module>vben-extend</module>
|
||||
<module>vben-admin</module>
|
||||
</modules>
|
||||
|
||||
<!--定义属性值-->
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||
<java.version>1.8</java.version>
|
||||
<vben.version>0.1</vben.version>
|
||||
<spring.boot.version>2.5.15</spring.boot.version>
|
||||
</properties>
|
||||
|
||||
<!-- 依赖声明 -->
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
|
||||
<!-- SpringBoot的依赖配置-->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-dependencies</artifactId>
|
||||
<version>${spring.boot.version}</version>
|
||||
<type>pom</type>
|
||||
<scope>import</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
|
||||
<!--编译管理 jdk版本和字符集编码-->
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.1</version>
|
||||
<configuration>
|
||||
<skip>true</skip>
|
||||
<source>${java.version}</source>
|
||||
<target>${java.version}</target>
|
||||
<encoding>${project.build.sourceEncoding}</encoding>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>lib</directory>
|
||||
<targetPath>/WEB-INF/lib/</targetPath>
|
||||
<includes>
|
||||
<include>**/*.jar</include>
|
||||
</includes>
|
||||
</resource>
|
||||
<resource>
|
||||
<directory>src/main/resources</directory>
|
||||
<includes>
|
||||
<include>**/*</include>
|
||||
</includes>
|
||||
</resource>
|
||||
</resources>
|
||||
|
||||
</build>
|
||||
|
||||
<!--Maven远程仓库设置 非必要,可以删除-->
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>public</id>
|
||||
<name>aliyun nexus</name>
|
||||
<url>https://maven.aliyun.com/repository/public/</url>
|
||||
<releases>
|
||||
<enabled>true</enabled>
|
||||
</releases>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<!--Maven远程插件库设置 非必要,可以删除-->
|
||||
<pluginRepositories>
|
||||
<pluginRepository>
|
||||
<id>public</id>
|
||||
<name>aliyun nexus</name>
|
||||
<url>https://maven.aliyun.com/repository/public/</url>
|
||||
<releases>
|
||||
<enabled>true</enabled>
|
||||
</releases>
|
||||
<snapshots>
|
||||
<enabled>false</enabled>
|
||||
</snapshots>
|
||||
</pluginRepository>
|
||||
</pluginRepositories>
|
||||
</project>
|
||||
@@ -1,56 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<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">
|
||||
<parent>
|
||||
<artifactId>vben</artifactId>
|
||||
<groupId>com.zsvg</groupId>
|
||||
<version>0.1</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>vben-admin</artifactId>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.zsvg</groupId>
|
||||
<artifactId>vben-extend</artifactId>
|
||||
<version>${vben.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
<!-- <version>5.1.49</version>-->
|
||||
<version>8.0.26</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<!-- 打包 -->
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
<version>${spring.boot.version}</version>
|
||||
<configuration>
|
||||
<includeSystemScope>true</includeSystemScope>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>repackage</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
@@ -1,42 +0,0 @@
|
||||
package vben;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.cache.annotation.EnableCaching;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.core.env.Environment;
|
||||
import org.springframework.scheduling.annotation.EnableAsync;
|
||||
|
||||
import java.net.InetAddress;
|
||||
import java.net.UnknownHostException;
|
||||
|
||||
@EnableCaching
|
||||
@SpringBootApplication
|
||||
@Slf4j
|
||||
@EnableAsync
|
||||
public class VbenAdmin {
|
||||
|
||||
public static void main(String[] args) {
|
||||
ApplicationContext app = SpringApplication.run(VbenAdmin.class, args);
|
||||
Environment env = app.getEnvironment();
|
||||
String ip = null;
|
||||
try {
|
||||
ip = InetAddress.getLocalHost().getHostAddress();
|
||||
} catch (UnknownHostException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
String port = env.getProperty("server.port");
|
||||
String path = env.getProperty("server.servlet.context-path");
|
||||
if (StrUtil.isBlank(path)) {
|
||||
path = "";
|
||||
}
|
||||
System.out.println("-----------------------系统启动成功!-----------------------");
|
||||
log.info("\n\tLocal接口访问地址: \thttp://localhost:" + port + path + "/doc.html" + "\n" +
|
||||
"\tExternal访问网址: \thttp://" + ip + ":" + port + path + "/doc.html");
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
package vben.admin.my.demo.cate;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import vben.core.common.mvc.entity.BaseCateEntity;
|
||||
import vben.core.module.sys.org.root.SysOrg;
|
||||
|
||||
import javax.persistence.*;
|
||||
import java.util.List;
|
||||
|
||||
@Entity
|
||||
@Getter
|
||||
@Setter
|
||||
@ApiModel("DEMO分类")
|
||||
public class MyDemoCate extends BaseCateEntity {
|
||||
|
||||
@ManyToOne(fetch= FetchType.EAGER)
|
||||
@JoinColumn(name = "pid")
|
||||
@ApiModelProperty("父类别")
|
||||
private MyDemoCate parent;
|
||||
|
||||
@Column(length = 32)
|
||||
private String fomod;//表单形式
|
||||
|
||||
private Boolean prtag;//是否有流程
|
||||
|
||||
@Column(length = 32)
|
||||
private String protd;//全局流程模板ID
|
||||
|
||||
@Transient
|
||||
private String prxml;//流程XML
|
||||
|
||||
@Lob
|
||||
private String fjson;//fields 表单字段
|
||||
|
||||
@Lob
|
||||
private String tjson;//tabs 表单页签
|
||||
|
||||
@Lob
|
||||
private String ljson;//links 表单联动
|
||||
|
||||
@ManyToMany
|
||||
@JoinTable(name = "my_demo_cate_reman", joinColumns = {@JoinColumn(name = "mid")},
|
||||
inverseJoinColumns = {@JoinColumn(name = "oid")})
|
||||
@ApiModelProperty("数据可阅读者")
|
||||
private List<SysOrg> remen;
|
||||
|
||||
@ManyToMany
|
||||
@JoinTable(name = "my_demo_cate_usman", joinColumns = {@JoinColumn(name = "mid")},
|
||||
inverseJoinColumns = {@JoinColumn(name = "oid")})
|
||||
@ApiModelProperty("分类可使用者")
|
||||
private List<SysOrg> usmen;
|
||||
|
||||
}
|
||||
@@ -1,102 +0,0 @@
|
||||
package vben.admin.my.demo.cate;
|
||||
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.jdbc.core.BeanPropertyRowMapper;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import vben.core.common.mvc.api.R;
|
||||
import vben.core.common.mvc.dao.JdbcDao;
|
||||
import vben.core.common.mvc.dao.Sqler;
|
||||
import vben.core.common.mvc.pojo.Ztree;
|
||||
import vben.core.common.utils.lang.TreeUtils;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("my/demo/cate")
|
||||
@Api(tags = {"DEMO分类管理"})
|
||||
public class MyDemoCateApi {
|
||||
|
||||
private String table = "my_demo_cate";
|
||||
|
||||
@GetMapping("treez")
|
||||
@ApiOperation("查询DEMO除自身外的分类树")
|
||||
public R getTreez(String name, String id) {
|
||||
List<Ztree> list = service.tier2Choose(table, id, name);
|
||||
return R.ok(list);
|
||||
}
|
||||
|
||||
@GetMapping("treea")
|
||||
@ApiOperation("查询DEMO分类树")
|
||||
public R getTreea(String name) {
|
||||
Sqler sqler=new Sqler(table);
|
||||
sqler.addSelect("t.pid,t.fomod type");
|
||||
sqler.addOrder("t.ornum");
|
||||
sqler.addWhere("t.avtag=1");
|
||||
List<Ztree> list = jdbcDao.getTp().query(sqler.getSql(),sqler.getParams(),
|
||||
new BeanPropertyRowMapper<>(Ztree.class));
|
||||
return R.ok(TreeUtils.build(list)) ;
|
||||
}
|
||||
|
||||
@GetMapping("tree")
|
||||
@ApiOperation("查询DEMO分类列表")
|
||||
public R getTree(String name) {
|
||||
Sqler sqler = new Sqler(table);
|
||||
sqler.addLike("t.name", name);
|
||||
sqler.addOrder("t.ornum");
|
||||
sqler.addWhere("t.avtag=1");
|
||||
sqler.addSelect("t.pid,t.notes");
|
||||
sqler.selectCUinfo();
|
||||
List<MyDemoCateVo> list = jdbcDao.getTp().query(sqler.getSql(), sqler.getParams(),
|
||||
new BeanPropertyRowMapper<>(MyDemoCateVo.class));
|
||||
return R.ok(TreeUtils.buildEtree(list));
|
||||
}
|
||||
|
||||
@GetMapping
|
||||
@ApiOperation("查询DEMO分类分页")
|
||||
public R get(String name) {
|
||||
Sqler sqler = new Sqler(table);
|
||||
sqler.addLike("t.name", name);
|
||||
sqler.addSelect("t.notes");
|
||||
return R.ok(service.findPageData(sqler));
|
||||
}
|
||||
|
||||
@GetMapping("one/{id}")
|
||||
@ApiOperation("查询DEMO分类详情")
|
||||
public R getOne(@PathVariable String id) {
|
||||
MyDemoCate cate = service.findOne(id);
|
||||
if(cate.getPrtag()!=null&&cate.getPrtag()){
|
||||
String sql = "select orxml from bpm_proc_temp where id=?";
|
||||
Map<String, Object> map = jdbcDao.findMap(sql, cate.getProtd());
|
||||
cate.setPrxml((String)map.get("orxml"));
|
||||
}
|
||||
return R.ok(cate);
|
||||
}
|
||||
|
||||
@PostMapping
|
||||
@ApiOperation("新增DEMO分类")
|
||||
public R post(@RequestBody MyDemoCate main) {
|
||||
return R.ok(service.insertx(main));
|
||||
}
|
||||
|
||||
@PutMapping
|
||||
@ApiOperation("更新DEMO分类")
|
||||
public R put(@RequestBody MyDemoCate main) {
|
||||
return R.ok(service.updatex(main, table));
|
||||
}
|
||||
|
||||
@DeleteMapping("{ids}")
|
||||
@ApiOperation("删除DEMO分类")
|
||||
public R delete(@PathVariable String[] ids) {
|
||||
return R.ok(service.delete(ids));
|
||||
}
|
||||
|
||||
@Autowired
|
||||
private MyDemoCateService service;
|
||||
|
||||
@Autowired
|
||||
private JdbcDao jdbcDao;
|
||||
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
package vben.admin.my.demo.cate;
|
||||
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
//DEMO分类JPA仓储
|
||||
public interface MyDemoCateRepo extends JpaRepository<MyDemoCate,String> {
|
||||
|
||||
|
||||
}
|
||||
@@ -1,68 +0,0 @@
|
||||
package vben.admin.my.demo.cate;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.jdbc.core.BeanPropertyRowMapper;
|
||||
import org.springframework.stereotype.Service;
|
||||
import vben.core.common.mvc.dao.Sqler;
|
||||
import vben.core.common.mvc.service.BaseCateService;
|
||||
import vben.core.module.bpm.proc.temp.BpmProcTemp;
|
||||
import vben.core.module.bpm.proc.temp.BpmProcTempService;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import java.util.List;
|
||||
|
||||
//DEMO分类服务
|
||||
@Service
|
||||
public class MyDemoCateService extends BaseCateService<MyDemoCate> {
|
||||
|
||||
//获取分类treeTable数据
|
||||
public List<MyDemoCate> findTree(Sqler sqler) {
|
||||
List<MyDemoCate> list = jdbcDao.getTp().query(sqler.getSql(), sqler.getParams(),
|
||||
new BeanPropertyRowMapper<>(MyDemoCate.class));
|
||||
return buildByRecursive(list);
|
||||
}
|
||||
|
||||
public String insertx(MyDemoCate cate) {
|
||||
BpmProcTemp bpmProcTemp = new BpmProcTemp();
|
||||
bpmProcTemp.setName(cate.getName());
|
||||
bpmProcTemp.setOrxml(cate.getPrxml());
|
||||
if(StrUtil.isNotBlank((bpmProcTemp.getOrxml()))){
|
||||
String chxml = "<?xml version=\"1.0\" encoding=\"gb2312\"?>"
|
||||
+ "\n<process" + bpmProcTemp.getOrxml().split("bpmn2:process")[1]
|
||||
.replaceAll("bpmn2:", "")
|
||||
.replaceAll("activiti:", "") + "process>";
|
||||
bpmProcTemp.setChxml(chxml);
|
||||
}
|
||||
String temid = bpmProcTempService.insert(bpmProcTemp);
|
||||
cate.setProtd(temid);
|
||||
return super.insert(cate);
|
||||
}
|
||||
|
||||
public String updatex(MyDemoCate cate,String table) {
|
||||
BpmProcTemp bpmProcTemp = bpmProcTempService.findOne(cate.getProtd());
|
||||
bpmProcTemp.setName(cate.getName());
|
||||
bpmProcTemp.setOrxml(cate.getPrxml());
|
||||
if(StrUtil.isNotBlank((bpmProcTemp.getOrxml()))) {
|
||||
String chxml = "<?xml version=\"1.0\" encoding=\"gb2312\"?>"
|
||||
+ "\n<process" + bpmProcTemp.getOrxml().split("bpmn2:process")[1]
|
||||
.replaceAll("bpmn2:", "")
|
||||
.replaceAll("activiti:", "") + "process>";
|
||||
bpmProcTemp.setChxml(chxml);
|
||||
}
|
||||
bpmProcTempService.update(bpmProcTemp);
|
||||
return super.update(cate,table,false);
|
||||
}
|
||||
|
||||
@Autowired
|
||||
private BpmProcTempService bpmProcTempService;
|
||||
|
||||
@Autowired
|
||||
private MyDemoCateRepo repo;
|
||||
|
||||
@PostConstruct
|
||||
public void initDao() {
|
||||
super.setRepo(repo);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
package vben.admin.my.demo.cate;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import vben.core.common.mvc.pojo.Ztree;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public class MyDemoCateVo extends Ztree {
|
||||
|
||||
private Date crtim;
|
||||
|
||||
private String crman;
|
||||
|
||||
private Date uptim;
|
||||
|
||||
private String upman;
|
||||
|
||||
private String notes;
|
||||
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
package vben.admin.my.demo.main;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.Id;
|
||||
|
||||
@Entity
|
||||
@Data
|
||||
@ApiModel("DEMO附件")
|
||||
public class MyDemoAtt
|
||||
{
|
||||
@Id
|
||||
@Column(length = 32)
|
||||
@ApiModelProperty("主键ID")
|
||||
private String id;
|
||||
|
||||
@ApiModelProperty("附件名称")
|
||||
private String name;
|
||||
|
||||
@ApiModelProperty("附件大小")
|
||||
private String zsize;
|
||||
|
||||
@ApiModelProperty("存储地址")
|
||||
private String path;
|
||||
|
||||
@ApiModelProperty("文件ID")
|
||||
@Column(length = 32)
|
||||
private String filid;
|
||||
|
||||
@ApiModelProperty("业务ID")
|
||||
@Column(length = 32)
|
||||
private String busid;
|
||||
|
||||
@ApiModelProperty("排序号")
|
||||
private Integer ornum;
|
||||
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
package vben.admin.my.demo.main;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.Id;
|
||||
|
||||
//主记录OneToMany
|
||||
@Data
|
||||
@Entity
|
||||
@ApiModel("DEMO明细行")
|
||||
public class MyDemoItem {
|
||||
@Id
|
||||
@Column(length = 36)
|
||||
@ApiModelProperty("主键ID")
|
||||
private String id;
|
||||
|
||||
@Column(length = 32)
|
||||
@ApiModelProperty("姓名")
|
||||
private String name;
|
||||
|
||||
@Column(length = 32)
|
||||
@ApiModelProperty("手机号")
|
||||
private String monum;
|
||||
|
||||
@Column(length = 32)
|
||||
@ApiModelProperty("性别")
|
||||
private String gender;
|
||||
|
||||
@Column(length = 64)
|
||||
@ApiModelProperty("职务")
|
||||
private String post;
|
||||
|
||||
@Column(length = 32)
|
||||
@ApiModelProperty("邮箱")
|
||||
private String email;
|
||||
|
||||
@ApiModelProperty("备注")
|
||||
private String notes;
|
||||
|
||||
@ApiModelProperty("排序号")
|
||||
private Integer ornum;
|
||||
}
|
||||
@@ -1,108 +0,0 @@
|
||||
package vben.admin.my.demo.main;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import vben.core.common.mvc.entity.BaseMainEntity;
|
||||
import vben.core.module.bpm.proc.main.Zbpm;
|
||||
import vben.core.module.sys.org.root.SysOrg;
|
||||
|
||||
import javax.persistence.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@Entity
|
||||
@Getter
|
||||
@Setter
|
||||
@ApiModel("DEMO主数据")
|
||||
public class MyDemoMain extends BaseMainEntity {
|
||||
|
||||
//分类关联示例
|
||||
@Column(length = 32)
|
||||
@ApiModelProperty("分类ID")
|
||||
private String catid;
|
||||
|
||||
//流水号示例
|
||||
@Column(length = 32)
|
||||
@ApiModelProperty("流水号")
|
||||
private String senum;
|
||||
|
||||
//数据字典示例
|
||||
@Column(length = 32)
|
||||
@ApiModelProperty("等级")
|
||||
private String grade;
|
||||
|
||||
//ManyToOne示例
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "opman")
|
||||
@ApiModelProperty("经办人")
|
||||
private SysOrg opman;
|
||||
|
||||
//ManyToMany示例
|
||||
@ManyToMany
|
||||
@JoinTable(name = "my_demo_viman", joinColumns = {@JoinColumn(name = "mid")},
|
||||
inverseJoinColumns = {@JoinColumn(name = "oid")})
|
||||
@ApiModelProperty("可查看者")
|
||||
private List<SysOrg> vimen;
|
||||
|
||||
//ManyToMany示例
|
||||
@ManyToMany
|
||||
@JoinTable(name = "my_demo_edman", joinColumns = {@JoinColumn(name = "mid")},
|
||||
inverseJoinColumns = {@JoinColumn(name = "oid")})
|
||||
@ApiModelProperty("可编辑者")
|
||||
private List<SysOrg> edmen;
|
||||
|
||||
//OneToMany示例
|
||||
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
|
||||
@JoinColumn(name = "maiid")
|
||||
@OrderBy("ornum ASC")
|
||||
@ApiModelProperty("明细行")
|
||||
private List<MyDemoItem> items = new ArrayList<>();
|
||||
|
||||
//附件示例
|
||||
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
|
||||
@JoinColumn(name = "busid")
|
||||
@OrderBy("ornum ASC")
|
||||
@ApiModelProperty("附件清单")
|
||||
private List<MyDemoAtt> atts = new ArrayList<>();
|
||||
|
||||
//地址选择示例,可根据实际情况存想要的字段
|
||||
//region-----地址相关信息-----
|
||||
@ApiModelProperty("完整地址")
|
||||
private String addre;
|
||||
|
||||
@Column(length = 64)
|
||||
@ApiModelProperty("省市区")
|
||||
private String adreg;
|
||||
|
||||
@Column(length = 128)
|
||||
@ApiModelProperty("省市区以外的详细信息")
|
||||
private String addet;
|
||||
|
||||
@Column(length = 32)
|
||||
@ApiModelProperty("经纬度")
|
||||
private String adcoo;
|
||||
|
||||
@Column(length = 32)
|
||||
@ApiModelProperty("省")
|
||||
private String adpro;
|
||||
|
||||
@Column(length = 32)
|
||||
@ApiModelProperty("市")
|
||||
private String adcit;
|
||||
|
||||
@Column(length = 32)
|
||||
@ApiModelProperty("区")
|
||||
private String addis;
|
||||
//endregion
|
||||
|
||||
@Column(length = 32)
|
||||
private String protd;//全局流程模板ID
|
||||
|
||||
@Transient
|
||||
private Zbpm zbpm;
|
||||
|
||||
@Column(length = 8)
|
||||
private String state;
|
||||
}
|
||||
@@ -1,83 +0,0 @@
|
||||
package vben.admin.my.demo.main;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import vben.core.common.mvc.api.PageData;
|
||||
import vben.core.common.mvc.api.R;
|
||||
import vben.core.common.mvc.dao.Sqler;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import vben.core.module.ass.num.main.AssNumMainService;
|
||||
import vben.core.module.bpm.task.main.BpmTaskMainService;
|
||||
import vben.core.module.mon.log.oper.Oplog;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("my/demo/main")
|
||||
@Api(tags = {"DEMO管理"})
|
||||
public class MyDemoMainApi {
|
||||
|
||||
@Oplog("查询DEMO分页")
|
||||
@GetMapping
|
||||
@ApiOperation("查询DEMO分页")
|
||||
public R get(String name) {
|
||||
Sqler sqler = new Sqler("my_demo_main");
|
||||
sqler.addLike("t.name", name);
|
||||
sqler.addLeftJoin("c.name catna,c.fomod type","my_demo_cate c","c.id=t.catid");
|
||||
sqler.addSelect("t.state,t.senum,t.notes");
|
||||
PageData pageData = service.findPageData(sqler);
|
||||
taskMainService.findCurrentExmen(pageData.getItems());
|
||||
return R.ok(pageData);
|
||||
}
|
||||
|
||||
@Oplog("查询DEMO详情")
|
||||
@GetMapping("one/{id}")
|
||||
@ApiOperation("查询DEMO详情")
|
||||
public R getOne(@PathVariable String id) {
|
||||
MyDemoMain main = service.findOne(id);
|
||||
return R.ok(main);
|
||||
}
|
||||
|
||||
@Oplog("新增DEMO")
|
||||
@PostMapping
|
||||
@ApiOperation("新增DEMO")
|
||||
public R post(@RequestBody MyDemoMain main) throws Exception {
|
||||
main.setSenum(numService.getNum("DEMO"));//设置供应商流水号
|
||||
if(StrUtil.isBlank(main.getProtd())){
|
||||
main.setState("30");
|
||||
service.insert(main);
|
||||
}else{
|
||||
service.insertx(main);
|
||||
}
|
||||
return R.ok();
|
||||
}
|
||||
|
||||
@Oplog("更新DEMO")
|
||||
@PutMapping
|
||||
@ApiOperation("更新DEMO")
|
||||
public R put(@RequestBody MyDemoMain main) throws Exception {
|
||||
if(StrUtil.isBlank(main.getProtd())){
|
||||
service.update(main);
|
||||
}else{
|
||||
service.updatex(main);
|
||||
}
|
||||
return R.ok();
|
||||
}
|
||||
|
||||
@Oplog("删除DEMO")
|
||||
@DeleteMapping("{ids}")
|
||||
@ApiOperation("删除DEMO")
|
||||
public R delete(@PathVariable String[] ids) {
|
||||
return R.ok(service.delete(ids));
|
||||
}
|
||||
|
||||
@Autowired
|
||||
private BpmTaskMainService taskMainService;
|
||||
|
||||
@Autowired
|
||||
private MyDemoMainService service;
|
||||
|
||||
@Autowired
|
||||
private AssNumMainService numService;
|
||||
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
package vben.admin.my.demo.main;
|
||||
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
//DEMO主数据JPA仓储
|
||||
public interface MyDemoMainRepo extends JpaRepository<MyDemoMain,String> {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,91 +0,0 @@
|
||||
package vben.admin.my.demo.main;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import vben.core.common.mvc.service.BaseMainService;
|
||||
import vben.core.common.utils.web.XuserUtil;
|
||||
import vben.core.module.bpm.proc.cond.BpmProcCond;
|
||||
import vben.core.module.bpm.proc.cond.BpmProcCondRepo;
|
||||
import vben.core.module.bpm.proc.main.BpmProcMainService;
|
||||
import vben.core.module.bpm.proc.main.Zbpm;
|
||||
import vben.core.module.bpm.proc.main.Znode;
|
||||
import vben.core.common.utils.lang.IdUtils;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import java.util.Date;
|
||||
|
||||
//DEMO主数据服务
|
||||
@Service
|
||||
public class MyDemoMainService extends BaseMainService<MyDemoMain> {
|
||||
|
||||
public void insertx(MyDemoMain main) throws Exception {
|
||||
main.setState("20");
|
||||
main.setId(IdUtils.getUID());
|
||||
main.setUptim(new Date());
|
||||
if (main.getCrman() == null) {
|
||||
main.setCrman(XuserUtil.getUser());
|
||||
}
|
||||
MyDemoMain dbMain = repo.save(main);
|
||||
BpmProcCond cond = new BpmProcCond();
|
||||
cond.setId(dbMain.getId());
|
||||
Gson gson = new Gson();
|
||||
cond.setCond(gson.toJson(dbMain));
|
||||
condRepo.saveAndFlush(cond);
|
||||
|
||||
Zbpm zbpm = main.getZbpm();
|
||||
zbpm.setModty("app_demo");
|
||||
zbpm.setProid(dbMain.getId());
|
||||
zbpm.setProna(dbMain.getName());
|
||||
zbpm.setHaman(dbMain.getCrman().getId());
|
||||
zbpm.setTemid(dbMain.getProtd());
|
||||
Znode znode = procService.start(zbpm);
|
||||
if ("NE".equals(znode.getFacno())) {
|
||||
dbMain.setState("30");
|
||||
super.update(dbMain);
|
||||
}
|
||||
}
|
||||
|
||||
public void updatex(MyDemoMain main) throws Exception {
|
||||
main.setState("20");
|
||||
super.update(main);
|
||||
BpmProcCond cond = new BpmProcCond();
|
||||
cond.setId(main.getId());
|
||||
Gson gson = new Gson();
|
||||
cond.setCond(gson.toJson(main));
|
||||
condRepo.saveAndFlush(cond);
|
||||
|
||||
main.getZbpm().setModty("app_demo");
|
||||
if ("pass".equals(main.getZbpm().getOpkey())) {
|
||||
Znode znode = procService.handlerPass(main.getZbpm());
|
||||
if ("NE".equals(znode.getFacno())) {
|
||||
main.setState("30");
|
||||
super.update(main);
|
||||
}
|
||||
} else if ("refuse".equals(main.getZbpm().getOpkey())) {
|
||||
if ("N1".equals(main.getZbpm().getTarno())) {
|
||||
main.setState("11");
|
||||
super.update(main);
|
||||
}
|
||||
Znode znode = procService.handlerRefuse(main.getZbpm());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Autowired
|
||||
private BpmProcMainService procService;
|
||||
|
||||
@Autowired
|
||||
private BpmProcCondRepo condRepo;
|
||||
|
||||
@Autowired
|
||||
private MyDemoMainRepo repo;
|
||||
|
||||
@PostConstruct
|
||||
public void initDao() {
|
||||
super.setRepo(repo);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,136 +0,0 @@
|
||||
package vben.init;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
import vben.core.module.ass.dict.data.AssDictData;
|
||||
import vben.core.module.ass.dict.data.AssDictDataRepo;
|
||||
import vben.core.module.ass.dict.main.AssDictMain;
|
||||
import vben.core.module.ass.dict.main.AssDictMainRepo;
|
||||
import vben.core.module.ass.num.main.AssNumMain;
|
||||
import vben.core.module.ass.num.main.AssNumMainRepo;
|
||||
import vben.core.common.utils.lang.IdUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
//辅助数据初始化
|
||||
@Component
|
||||
public class AssInit {
|
||||
|
||||
protected void initData() throws Exception {
|
||||
initNum();
|
||||
initDict();
|
||||
}
|
||||
|
||||
//流水号初始化
|
||||
private void initNum() {
|
||||
List<AssNumMain> numList = new ArrayList<>();
|
||||
AssNumMain suppNum = new AssNumMain();
|
||||
suppNum.setId("DEMO");
|
||||
suppNum.setName("DEMO流水号");
|
||||
suppNum.setNumod("yy");
|
||||
suppNum.setNulen(4);
|
||||
suppNum.setNflag(true);
|
||||
suppNum.setNupre("D");
|
||||
numList.add(suppNum);
|
||||
|
||||
numRepo.saveAll(numList);
|
||||
}
|
||||
|
||||
//数据字典初始化
|
||||
private void initDict() {
|
||||
List<AssDictMain> dictList = new ArrayList<>();
|
||||
|
||||
AssDictMain demoDict = new AssDictMain();
|
||||
demoDict.setId("DEMO_GRADE");
|
||||
demoDict.setName("DEMO等级");
|
||||
demoDict.setAvtag(true);
|
||||
dictList.add(demoDict);
|
||||
|
||||
dictRepo.saveAll(dictList);
|
||||
|
||||
List<AssDictData> dictDataList = new ArrayList<>();
|
||||
AssDictData demo1 = new AssDictData();
|
||||
demo1.setId(IdUtils.getUID());
|
||||
demo1.setCode("A");
|
||||
demo1.setName("等级A");
|
||||
demo1.setAvtag(true);
|
||||
demo1.setOrnum(1);
|
||||
demo1.setMaiid("DEMO_GRADE");
|
||||
dictDataList.add(demo1);
|
||||
|
||||
AssDictData demo2 = new AssDictData();
|
||||
demo2.setId(IdUtils.getUID());
|
||||
demo2.setCode("B");
|
||||
demo2.setName("等级B");
|
||||
demo2.setAvtag(true);
|
||||
demo2.setOrnum(2);
|
||||
demo2.setMaiid("DEMO_GRADE");
|
||||
dictDataList.add(demo2);
|
||||
|
||||
AssDictData demo3 = new AssDictData();
|
||||
demo3.setId(IdUtils.getUID());
|
||||
demo3.setCode("C");
|
||||
demo3.setName("等级C");
|
||||
demo3.setAvtag(true);
|
||||
demo3.setOrnum(3);
|
||||
demo3.setMaiid("DEMO_GRADE");
|
||||
dictDataList.add(demo3);
|
||||
|
||||
AssDictData demo4 = new AssDictData();
|
||||
demo4.setId(IdUtils.getUID());
|
||||
demo4.setCode("Z");
|
||||
demo4.setName("不合格");
|
||||
demo4.setAvtag(true);
|
||||
demo4.setOrnum(4);
|
||||
demo4.setMaiid("DEMO_GRADE");
|
||||
dictDataList.add(demo4);
|
||||
|
||||
AssDictData dist1 = new AssDictData();
|
||||
dist1.setId(IdUtils.getUID());
|
||||
dist1.setCode("A");
|
||||
dist1.setName("A级资质");
|
||||
dist1.setAvtag(true);
|
||||
dist1.setOrnum(1);
|
||||
dist1.setMaiid("DIST_GRADE");
|
||||
dictDataList.add(dist1);
|
||||
|
||||
AssDictData dist2 = new AssDictData();
|
||||
dist2.setId(IdUtils.getUID());
|
||||
dist2.setCode("B");
|
||||
dist2.setName("B级资质");
|
||||
dist2.setAvtag(true);
|
||||
dist2.setOrnum(2);
|
||||
dist2.setMaiid("DIST_GRADE");
|
||||
dictDataList.add(dist2);
|
||||
|
||||
AssDictData dist3 = new AssDictData();
|
||||
dist3.setId(IdUtils.getUID());
|
||||
dist3.setCode("C");
|
||||
dist3.setName("C级资质");
|
||||
dist3.setAvtag(true);
|
||||
dist3.setOrnum(3);
|
||||
dist3.setMaiid("DIST_GRADE");
|
||||
dictDataList.add(dist3);
|
||||
|
||||
AssDictData dist4 = new AssDictData();
|
||||
dist4.setId(IdUtils.getUID());
|
||||
dist4.setCode("Z");
|
||||
dist4.setName("不合格");
|
||||
dist4.setAvtag(true);
|
||||
dist4.setOrnum(4);
|
||||
dist4.setMaiid("DIST_GRADE");
|
||||
dictDataList.add(dist4);
|
||||
|
||||
dictDataRepo.saveAll(dictDataList);
|
||||
}
|
||||
|
||||
@Autowired
|
||||
private AssDictMainRepo dictRepo;
|
||||
|
||||
@Autowired
|
||||
private AssDictDataRepo dictDataRepo;
|
||||
|
||||
@Autowired
|
||||
private AssNumMainRepo numRepo;
|
||||
}
|
||||
@@ -1,87 +0,0 @@
|
||||
package vben.init;
|
||||
|
||||
import org.springframework.context.annotation.PropertySource;
|
||||
import vben.core.module.ass.oss.config.AssOssConfigService;
|
||||
import vben.core.module.sys.org.user.SysOrgUserRepo;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.ApplicationListener;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.event.ContextRefreshedEvent;
|
||||
|
||||
//数据库初始化监听器
|
||||
@Configuration
|
||||
@Slf4j
|
||||
@PropertySource(value = { "classpath:config/app-init.properties" },encoding = "UTF-8")
|
||||
public class DbInitListener implements ApplicationListener<ContextRefreshedEvent> {
|
||||
|
||||
@Value("${app.init.orgType}")
|
||||
private String ORG_TYPE;
|
||||
|
||||
@Value("${app.init.orgName}")
|
||||
private String ORG_NAME;
|
||||
|
||||
@Value("${app.init.orgRootId}")
|
||||
private String ORG_ROOT_ID;
|
||||
|
||||
@Value("${app.init.uiType}")
|
||||
private String UI_TYPE;
|
||||
|
||||
|
||||
//首次启动,数据库生成后,初始化组织架构,菜单,权限角色,接口等信息
|
||||
@Override
|
||||
public void onApplicationEvent(ContextRefreshedEvent event) {
|
||||
try {
|
||||
if (!userDao.existsById("sa")) {
|
||||
System.out.println("首次启动系统,正在进行数据库初始化,请耐心等待。");
|
||||
sysOrgInit.initRoot(ORG_NAME,ORG_ROOT_ID);
|
||||
sysOrgInit.initSa();
|
||||
if ("test".equals(ORG_TYPE)) {
|
||||
sysOrgInit.initTestOrg();
|
||||
}
|
||||
System.out.println("1 初始化组织架构完毕");
|
||||
if ("vben".equals(UI_TYPE)) {
|
||||
sysPortalVbenInit.initPortal();
|
||||
sysPortalVbenInit.initSysMenu();
|
||||
sysPortalVbenInit.initSaMenu();
|
||||
}else{
|
||||
sysPortalVueInit.initPortal();
|
||||
sysPortalVueInit.initSysMenu();
|
||||
sysPortalVueInit.initSaMenu();
|
||||
}
|
||||
System.out.println("2 初始化门户菜单完毕");
|
||||
assInit.initData();
|
||||
System.out.println("3 初始化辅助数据完毕");
|
||||
}
|
||||
sysApiInit.initApi();
|
||||
assOssConfigService.init();
|
||||
|
||||
} catch (Exception e) {
|
||||
System.err.println("初始化出错");
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Autowired
|
||||
private SysOrgUserRepo userDao;
|
||||
|
||||
@Autowired
|
||||
private AssOssConfigService assOssConfigService;
|
||||
|
||||
@Autowired
|
||||
private SysOrgInit sysOrgInit;
|
||||
|
||||
@Autowired
|
||||
private AssInit assInit;
|
||||
|
||||
@Autowired
|
||||
private SysApiInit sysApiInit;
|
||||
|
||||
@Autowired
|
||||
private SysPortalVbenInit sysPortalVbenInit;
|
||||
|
||||
@Autowired
|
||||
private SysPortalVueInit sysPortalVueInit;
|
||||
|
||||
}
|
||||
@@ -1,298 +0,0 @@
|
||||
package vben.init;
|
||||
|
||||
import cn.hutool.core.lang.ClassScanner;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import vben.core.common.mvc.dao.JdbcDao;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
import vben.core.framework.security.authz.AuthzApiData;
|
||||
import vben.core.framework.security.pojo.Yapi;
|
||||
import vben.core.framework.security.pojo.Yurl;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* API接口初始化,每次修改代码重启后,都会从代码搜集比对需要认证的请求URL,生成唯一的权限码存入数据库
|
||||
* 并将最新的需要认证的Url根据Method分类放到公共内存,用于用户每次请求时获取权限码做权限认证
|
||||
*/
|
||||
@Component
|
||||
public class SysApiInit {
|
||||
|
||||
protected void initApi() {
|
||||
//扫描Controller中的所有Mapping方法,得到需要认证的URL集合
|
||||
List<Yurl> codeUrlList = getScanList();
|
||||
|
||||
//从数据库获取所有已存的URL集合
|
||||
List<String> dbUrlList = jdbcDao.findStringList("select id from sys_api_main");
|
||||
|
||||
//收集最大权限位及最大权限位的最大权限码
|
||||
String sql = "select max(u.pos) as pos,max(u.code) as code from sys_api_main u where u.pos = (select max(uu.pos) from sys_api_main uu)";
|
||||
Map<String, Object> maxMap = jdbcDao.findMap(sql);
|
||||
int pos = 0;
|
||||
long code = 0;
|
||||
if (maxMap != null && maxMap.get("pos") != null) {
|
||||
pos = Integer.parseInt(String.valueOf(maxMap.get("pos")));
|
||||
code = Long.parseLong(String.valueOf(maxMap.get("code")));
|
||||
}
|
||||
|
||||
//比较两个集合,计算得到需要插入数据库的insertList与需要更新数据库的updateList
|
||||
List<Object[]> insertList = new ArrayList<Object[]>();
|
||||
List<Object[]> updateList = new ArrayList<Object[]>();
|
||||
for (Yurl yurl : codeUrlList) {
|
||||
boolean flag = false;
|
||||
for (String dbUrlstr : dbUrlList) {
|
||||
if (yurl.getId().equals(dbUrlstr)) {
|
||||
flag = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!flag) {//插入
|
||||
if (yurl.getType() == null) {
|
||||
Object[] objects = new Object[7];
|
||||
objects[0] = yurl.getId();
|
||||
objects[1] = yurl.getPid();
|
||||
objects[2] = 0;
|
||||
objects[3] = 0;
|
||||
objects[4] = yurl.getUrl();
|
||||
objects[5] = yurl.getType();
|
||||
objects[6] = new Date();
|
||||
insertList.add(objects);
|
||||
} else {
|
||||
if (code >= (1L << 62)) {
|
||||
pos = pos + 1;
|
||||
code = 1;
|
||||
} else {
|
||||
if (code == 0) {
|
||||
code = 1;
|
||||
} else {
|
||||
code = code << 1;
|
||||
}
|
||||
}
|
||||
Object[] objects = new Object[7];
|
||||
objects[0] = yurl.getId();
|
||||
objects[1] = yurl.getPid();
|
||||
objects[2] = pos;
|
||||
objects[3] = code;
|
||||
objects[4] = yurl.getUrl();
|
||||
objects[5] = yurl.getType();
|
||||
objects[6] = new Date();
|
||||
insertList.add(objects);
|
||||
}
|
||||
} else {//更新
|
||||
Object[] objects = new Object[3];
|
||||
objects[0] = yurl.getPid();
|
||||
objects[1] = yurl.getType();
|
||||
objects[2] = yurl.getId();
|
||||
updateList.add(objects);
|
||||
}
|
||||
}
|
||||
//设置是否为公共资源
|
||||
// for (Object[] objects : insertList) {
|
||||
// if (objects[0].toString().contains("_c")) {
|
||||
// objects[5] = 1;
|
||||
// }
|
||||
// }
|
||||
|
||||
//批量插入与更新数据库
|
||||
String initSql = "UPDATE sys_api_main SET avtag=0";
|
||||
String updateSql = "UPDATE sys_api_main SET pid=?,type=?,avtag=1 WHERE id=?";
|
||||
String insertSql = "INSERT INTO sys_api_main(id,pid,pos,code,url,type,crtim,avtag) VALUES(?,?,?,?,?,?,?,1)";
|
||||
jdbcDao.update(initSql);
|
||||
jdbcDao.batch(updateSql, updateList);
|
||||
jdbcDao.batch(insertSql, insertList);
|
||||
AuthzApiData.AUTHPOS = pos;
|
||||
|
||||
//初始化所有用户权限
|
||||
String updateUserSql = "update sys_org_user set catag=0";
|
||||
jdbcDao.update(updateUserSql);
|
||||
|
||||
String updateCoopUserSql = "update sys_coop_user set catag=0";
|
||||
jdbcDao.update(updateCoopUserSql);
|
||||
|
||||
//将所有要求认证的Url分Method放入内存,用于每次请求时的权限校验
|
||||
String g1ApiSql = "SELECT url,pos,code from sys_api_main where avtag=1 and type='get' and id not like '%}:get'";
|
||||
AuthzApiData.GET1_APIS = findDbApis(g1ApiSql);
|
||||
|
||||
String g2ApiSql = "SELECT url,pos,code from sys_api_main where avtag=1 and type='get' and id like '%}:get'";
|
||||
AuthzApiData.GET2_APIS = findDbApis(g2ApiSql);
|
||||
|
||||
String postApiSql = "SELECT url,pos,code from sys_api_main where avtag=1 and type='post'";
|
||||
AuthzApiData.POST_APIS = findDbApis(postApiSql);
|
||||
|
||||
String putApiSql = "SELECT url,pos,code from sys_api_main where avtag=1 and type='put'";
|
||||
AuthzApiData.PUT_APIS = findDbApis(putApiSql);
|
||||
|
||||
String deleteApiSql = "SELECT url,pos,code from sys_api_main where avtag= 1 and type='delete'";
|
||||
AuthzApiData.DELETE_APIS = findDbApis(deleteApiSql);
|
||||
|
||||
String patchApiSql = "SELECT url,pos,code from sys_api_main where avtag=1 and type='patch'";
|
||||
AuthzApiData.PATCH_APIS = findDbApis(patchApiSql);
|
||||
|
||||
}
|
||||
|
||||
//扫描Controller中的所有Mapping方法,得到需要认证的URL集合
|
||||
private List<Yurl> getScanList() {
|
||||
List<Yurl> list = new ArrayList<>();
|
||||
Set<Class<?>> classes = ClassScanner.scanPackage("vben");
|
||||
for (Class<?> clazz : classes) {
|
||||
RequestMapping requestMapping = clazz.getAnnotation(RequestMapping.class);
|
||||
if (requestMapping != null) {
|
||||
String classUrl = requestMapping.value()[0];
|
||||
//---> /authc 开头的不需要登录, /gen 只要登录就有权限 /sys 需要管理员才有权限 其余通过rbac权限机制判断
|
||||
// if (!url.startsWith("authc")&&!url.startsWith("gen")&&!url.startsWith("sys")) {
|
||||
if (!classUrl.startsWith("authc") && !classUrl.startsWith("gen")) {
|
||||
Yurl topUrl = new Yurl();
|
||||
topUrl.setId(classUrl.replaceAll("/", "-"));
|
||||
if (!classUrl.startsWith("/")) {
|
||||
classUrl = "/" + classUrl;
|
||||
}
|
||||
if (topUrl.getId().contains("-")) {
|
||||
topUrl.setPid(topUrl.getId().split("-")[0]);
|
||||
}
|
||||
topUrl.setUrl(classUrl);
|
||||
if(StrUtil.isNotBlank(topUrl.getId())){
|
||||
list.add(topUrl);
|
||||
}
|
||||
Method[] methods = clazz.getDeclaredMethods();
|
||||
for (Method method : methods) {
|
||||
GetMapping getMapping = method.getAnnotation(GetMapping.class);
|
||||
if (getMapping != null) {
|
||||
Yurl yurl = new Yurl();
|
||||
String methodUrl = "";
|
||||
if (getMapping.value().length > 0) {
|
||||
methodUrl = getMapping.value()[0];
|
||||
yurl.setUrl(topUrl.getUrl() + "/" + methodUrl);
|
||||
methodUrl = methodUrl.replaceAll("/", "-");
|
||||
yurl.setId(topUrl.getId() + "-" + methodUrl + ":get");
|
||||
} else {
|
||||
yurl.setId(topUrl.getId() + ":get");
|
||||
yurl.setUrl(topUrl.getUrl());
|
||||
}
|
||||
yurl.setPid(topUrl.getId());
|
||||
yurl.setType("get");
|
||||
list.add(yurl);
|
||||
continue;
|
||||
}
|
||||
|
||||
PostMapping postMapping = method.getAnnotation(PostMapping.class);
|
||||
if (postMapping != null) {
|
||||
Yurl yurl = new Yurl();
|
||||
String methodUrl = "";
|
||||
if (postMapping.value().length > 0) {
|
||||
methodUrl = postMapping.value()[0];
|
||||
yurl.setUrl(topUrl.getUrl() + "/" + methodUrl);
|
||||
methodUrl = methodUrl.replaceAll("/", "-");
|
||||
yurl.setId(topUrl.getId() + "-" + methodUrl + ":post");
|
||||
} else {
|
||||
yurl.setId(topUrl.getId() + ":post");
|
||||
yurl.setUrl(topUrl.getUrl());
|
||||
}
|
||||
yurl.setPid(topUrl.getId());
|
||||
yurl.setType("post");
|
||||
list.add(yurl);
|
||||
continue;
|
||||
}
|
||||
|
||||
PutMapping putMapping = method.getAnnotation(PutMapping.class);
|
||||
if (putMapping != null) {
|
||||
Yurl yurl = new Yurl();
|
||||
String methodUrl = "";
|
||||
if (putMapping.value().length > 0) {
|
||||
methodUrl = putMapping.value()[0];
|
||||
yurl.setUrl(topUrl.getUrl() + "/" + methodUrl);
|
||||
methodUrl = methodUrl.replaceAll("/", "-");
|
||||
yurl.setId(topUrl.getId() + "-" + methodUrl + ":put");
|
||||
} else {
|
||||
yurl.setId(topUrl.getId() + ":put");
|
||||
yurl.setUrl(topUrl.getUrl());
|
||||
}
|
||||
yurl.setPid(topUrl.getId());
|
||||
yurl.setType("put");
|
||||
list.add(yurl);
|
||||
continue;
|
||||
}
|
||||
|
||||
DeleteMapping deleteMapping = method.getAnnotation(DeleteMapping.class);
|
||||
if (deleteMapping != null) {
|
||||
Yurl yurl = new Yurl();
|
||||
String methodUrl = "";
|
||||
if (deleteMapping.value().length > 0) {
|
||||
methodUrl = deleteMapping.value()[0];
|
||||
yurl.setUrl(topUrl.getUrl() + "/" + methodUrl);
|
||||
methodUrl = methodUrl.replaceAll("/", "-");
|
||||
yurl.setId(topUrl.getId() + "-" + methodUrl + ":delete");
|
||||
} else {
|
||||
yurl.setId(topUrl.getId() + ":delete");
|
||||
yurl.setUrl(topUrl.getUrl());
|
||||
}
|
||||
|
||||
yurl.setPid(topUrl.getId());
|
||||
yurl.setType("delete");
|
||||
list.add(yurl);
|
||||
continue;
|
||||
}
|
||||
|
||||
PatchMapping patchMapping = method.getAnnotation(PatchMapping.class);
|
||||
if (patchMapping != null) {
|
||||
Yurl yurl = new Yurl();
|
||||
String methodUrl = "";
|
||||
if (patchMapping.value().length > 0) {
|
||||
methodUrl = patchMapping.value()[0];
|
||||
yurl.setUrl(topUrl.getUrl() + "/" + methodUrl);
|
||||
methodUrl = methodUrl.replaceAll("/", "-");
|
||||
yurl.setId(topUrl.getId() + "-" + methodUrl + ":patch");
|
||||
} else {
|
||||
yurl.setId(topUrl.getId() + ":patch");
|
||||
yurl.setUrl(topUrl.getUrl());
|
||||
}
|
||||
yurl.setPid(topUrl.getId());
|
||||
yurl.setType("patch");
|
||||
list.add(yurl);
|
||||
continue;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//设置请求URL的root根目录,方便后面API权限分配
|
||||
Set<String> rootSet = new HashSet<>();
|
||||
for (Yurl yurl : list) {
|
||||
if (yurl.getType() == null && yurl.getPid() != null) {
|
||||
rootSet.add(yurl.getPid());
|
||||
}
|
||||
}
|
||||
for (String str : rootSet) {
|
||||
Yurl yurl = new Yurl();
|
||||
yurl.setId(str);
|
||||
if(StrUtil.isNotBlank(yurl.getId())){
|
||||
list.add(yurl);
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
//获取数据库请求的通用方法
|
||||
private List<Yapi> findDbApis(String sql) {
|
||||
return jdbcDao.getTp().query(sql, (rs, rowNum) -> {
|
||||
Yapi yperm = new Yapi();
|
||||
String url = rs.getString("url");
|
||||
if (url.endsWith("}")) {
|
||||
yperm.setUrl(url.substring(0, url.lastIndexOf("/")));
|
||||
} else {
|
||||
yperm.setUrl(url);
|
||||
}
|
||||
yperm.setPos(rs.getInt("pos"));
|
||||
yperm.setCode(rs.getLong("code"));
|
||||
return yperm;
|
||||
});
|
||||
}
|
||||
|
||||
@Autowired
|
||||
private JdbcDao jdbcDao;
|
||||
|
||||
|
||||
}
|
||||
@@ -1,333 +0,0 @@
|
||||
package vben.init;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import vben.core.module.sys.org.dept.SysOrgDept;
|
||||
import vben.core.module.sys.org.dept.SysOrgDeptService;
|
||||
import vben.core.module.sys.org.group.SysOrgGroup;
|
||||
import vben.core.module.sys.org.group.SysOrgGroupCate;
|
||||
import vben.core.module.sys.org.group.SysOrgGroupCateService;
|
||||
import vben.core.module.sys.org.group.SysOrgGroupService;
|
||||
import vben.core.module.sys.org.post.SysOrgPost;
|
||||
import vben.core.module.sys.org.post.SysOrgPostService;
|
||||
import vben.core.module.sys.org.role.*;
|
||||
import vben.core.module.sys.org.root.SysOrg;
|
||||
import vben.core.module.sys.org.user.SysOrgUser;
|
||||
import vben.core.module.sys.org.user.SysOrgUserService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
//组织架构初始化,可根据application.properties的app.init.orgType配置生成不同的基础数据
|
||||
@Component
|
||||
public class SysOrgInit {
|
||||
|
||||
private String rootId = "1";
|
||||
|
||||
protected void initRoot(String name,String id) {
|
||||
if(StrUtil.isNotBlank(id)){
|
||||
rootId=id;
|
||||
}
|
||||
SysOrgDept root = new SysOrgDept();
|
||||
root.setId(rootId);
|
||||
root.setName(name);
|
||||
root.setLabel("1");
|
||||
root.setOrnum(0);
|
||||
root.setAvtag(true);
|
||||
root.setTier("x"+rootId+"x");
|
||||
root.setType(1);
|
||||
deptService.insert(root);
|
||||
}
|
||||
|
||||
//初始化管理员
|
||||
protected void initSa() {
|
||||
SysOrgUser user = new SysOrgUser();
|
||||
user.setId("sa");
|
||||
user.setUsnam("sa");
|
||||
user.setName("管理员");
|
||||
user.setPacod("1");
|
||||
user.setAvtag(true);
|
||||
user.setDept(new SysOrg(rootId));
|
||||
user.setTier("x"+rootId+"xsax");
|
||||
userService.insert(user);
|
||||
|
||||
SysOrgUser user2 = new SysOrgUser();
|
||||
user2.setId("vben");
|
||||
user2.setUsnam("vben");
|
||||
user2.setName("小维");
|
||||
user2.setPacod("123456");
|
||||
user2.setAvtag(true);
|
||||
user2.setDept(new SysOrg(rootId));
|
||||
user2.setTier("x"+rootId+"xvbenx");
|
||||
userService.insert(user2);
|
||||
}
|
||||
|
||||
//初始化测试部门与人员
|
||||
protected void initTestOrg() {
|
||||
SysOrgDept d1=new SysOrgDept();
|
||||
d1.setId("dept1");
|
||||
d1.setName("测试一部");
|
||||
d1.setLabel("1");
|
||||
d1.setOrnum(9991);
|
||||
d1.setAvtag(true);
|
||||
d1.setType(2);
|
||||
d1.setParent(new SysOrg(rootId));
|
||||
d1.setTier("x"+rootId+"xdept1x");
|
||||
deptService.insert(d1);
|
||||
|
||||
SysOrgDept d2=new SysOrgDept();
|
||||
d2.setId("dept2");
|
||||
d2.setName("测试二部");
|
||||
d2.setLabel("1");
|
||||
d2.setOrnum(9992);
|
||||
d2.setAvtag(true);
|
||||
d2.setType(2);
|
||||
d2.setParent(new SysOrg(rootId));
|
||||
d2.setTier("x"+rootId+"xdept2x");
|
||||
deptService.insert(d2);
|
||||
|
||||
List<SysOrgUser> userList=new ArrayList<>();
|
||||
SysOrgUser u1 = new SysOrgUser();
|
||||
u1.setId("l1");
|
||||
u1.setUsnam("l1");
|
||||
u1.setName("刘一");
|
||||
u1.setPacod("1");
|
||||
u1.setOrnum(1);
|
||||
u1.setAvtag(true);
|
||||
u1.setDept(new SysOrg("dept1"));
|
||||
u1.setTier("x"+rootId+"xdept1xl1x");
|
||||
userList.add(u1);
|
||||
|
||||
SysOrgUser u2 = new SysOrgUser();
|
||||
u2.setId("c2");
|
||||
u2.setUsnam("c2");
|
||||
u2.setName("陈二");
|
||||
u2.setPacod("1");
|
||||
u2.setOrnum(2);
|
||||
u2.setAvtag(true);
|
||||
u2.setDept(new SysOrg("dept1"));
|
||||
u2.setTier("x"+rootId+"xdept1xc2x");
|
||||
userList.add(u2);
|
||||
|
||||
SysOrgUser u3 = new SysOrgUser();
|
||||
u3.setId("z3");
|
||||
u3.setUsnam("z3");
|
||||
u3.setName("张三");
|
||||
u3.setPacod("1");
|
||||
u3.setOrnum(3);
|
||||
u3.setAvtag(true);
|
||||
u3.setDept(new SysOrg("dept1"));
|
||||
u3.setTier("x"+rootId+"xdept1xz3x");
|
||||
userList.add(u3);
|
||||
|
||||
SysOrgUser u4 = new SysOrgUser();
|
||||
u4.setId("l4");
|
||||
u4.setUsnam("l4");
|
||||
u4.setName("李四");
|
||||
u4.setPacod("1");
|
||||
u4.setOrnum(4);
|
||||
u4.setAvtag(true);
|
||||
u4.setDept(new SysOrg("dept1"));
|
||||
u4.setTier("x"+rootId+"xdept1xl4x");
|
||||
userList.add(u4);
|
||||
|
||||
SysOrgUser u5 = new SysOrgUser();
|
||||
u5.setId("w5");
|
||||
u5.setUsnam("w5");
|
||||
u5.setName("王五");
|
||||
u5.setPacod("1");
|
||||
u5.setOrnum(5);
|
||||
u5.setAvtag(true);
|
||||
u5.setDept(new SysOrg("dept2"));
|
||||
u5.setTier("x"+rootId+"xdept2xw5x");
|
||||
userList.add(u5);
|
||||
|
||||
SysOrgUser u6 = new SysOrgUser();
|
||||
u6.setId("z6");
|
||||
u6.setUsnam("z6");
|
||||
u6.setName("赵六");
|
||||
u6.setPacod("1");
|
||||
u6.setOrnum(6);
|
||||
u6.setAvtag(true);
|
||||
u6.setDept(new SysOrg("dept2"));
|
||||
u6.setTier("x"+rootId+"xdept2xz6x");
|
||||
userList.add(u6);
|
||||
|
||||
SysOrgUser u7 = new SysOrgUser();
|
||||
u7.setId("s7");
|
||||
u7.setUsnam("s7");
|
||||
u7.setName("孙七");
|
||||
u7.setPacod("1");
|
||||
u7.setOrnum(7);
|
||||
u7.setAvtag(true);
|
||||
u7.setDept(new SysOrg("dept2"));
|
||||
u7.setTier("x"+rootId+"xdept2xs7x");
|
||||
userList.add(u7);
|
||||
|
||||
SysOrgUser u8 = new SysOrgUser();
|
||||
u8.setId("z8");
|
||||
u8.setUsnam("z8");
|
||||
u8.setName("周八");
|
||||
u8.setPacod("1");
|
||||
u8.setOrnum(8);
|
||||
u8.setAvtag(true);
|
||||
u8.setDept(new SysOrg("dept2"));
|
||||
u8.setTier("x"+rootId+"xdept2xz8x");
|
||||
userList.add(u8);
|
||||
|
||||
userService.insertAll(userList);
|
||||
|
||||
SysOrgPost p1 = new SysOrgPost();
|
||||
p1.setId("post1");
|
||||
p1.setName("一部负责人");
|
||||
p1.setOrnum(0);
|
||||
p1.setAvtag(true);
|
||||
p1.setDept(new SysOrg("dept1"));
|
||||
p1.setTier("x"+rootId+"xdept1xpost1x");
|
||||
p1.setUsers(new ArrayList<>());
|
||||
p1.getUsers().add(new SysOrg("l1","刘一",8));
|
||||
postService.insert(p1);
|
||||
|
||||
SysOrgPost p2 = new SysOrgPost();
|
||||
p2.setId("post2");
|
||||
p2.setName("二部负责人");
|
||||
p2.setOrnum(0);
|
||||
p2.setAvtag(true);
|
||||
p2.setDept(new SysOrg("dept2"));
|
||||
p2.setTier("x"+rootId+"xdept2xpost2x");
|
||||
p2.setUsers(new ArrayList<>());
|
||||
p2.getUsers().add(new SysOrg("w5","王五",8));
|
||||
p2.getUsers().add(new SysOrg("z6","赵六",8));
|
||||
postService.insert(p2);
|
||||
|
||||
SysOrgGroupCate gcate = new SysOrgGroupCate();
|
||||
gcate.setId("gcate");
|
||||
gcate.setName("测试群组分类");
|
||||
gcate.setAvtag(true);
|
||||
gcate.setOrnum(1);
|
||||
gcate.setCrman(new SysOrg("sa"));
|
||||
groupCateService.insert(gcate);
|
||||
|
||||
SysOrgGroup g1 = new SysOrgGroup();
|
||||
g1.setId("group1");
|
||||
g1.setName("张三李四组");
|
||||
g1.setOrnum(1);
|
||||
g1.setAvtag(true);
|
||||
g1.setCatid("gcate");
|
||||
g1.setMembers(new ArrayList<>());
|
||||
g1.getMembers().add(new SysOrg("z3","张三",8));
|
||||
g1.getMembers().add(new SysOrg("l4","李四",8));
|
||||
groupService.insert(g1);
|
||||
|
||||
SysOrgGroup g2 = new SysOrgGroup();
|
||||
g2.setId("group2");
|
||||
g2.setName("用户岗位部门混合组");
|
||||
g2.setOrnum(2);
|
||||
g2.setAvtag(true);
|
||||
g2.setCatid("gcate");
|
||||
g2.setMembers(new ArrayList<>());
|
||||
g2.getMembers().add(new SysOrg("c2","陈二",8));
|
||||
g2.getMembers().add(new SysOrg("post1","一部负责人",4));
|
||||
g2.getMembers().add(new SysOrg("dept2","测试二部",2));
|
||||
groupService.insert(g2);
|
||||
|
||||
SysOrgRoleTree rtree1 = new SysOrgRoleTree();
|
||||
rtree1.setId("rtree1");
|
||||
rtree1.setName("业务角色树");
|
||||
rtree1.setOrnum(1);
|
||||
rtree1.setAvtag(true);
|
||||
rtree1.setRoles(new ArrayList<>());
|
||||
rtree1.getRoles().add(new SysOrgRole("role1","分管领导",1));
|
||||
rtree1.getRoles().add(new SysOrgRole("role2","部门领导",2));
|
||||
rtree1.setCrman(new SysOrg("sa"));
|
||||
roleTreeService.insertx(rtree1);
|
||||
|
||||
SysOrgRoleNode rnode1 = new SysOrgRoleNode();
|
||||
rnode1.setId("rnode1");
|
||||
rnode1.setName("一部分管领导");
|
||||
rnode1.setTreid("rtree1");
|
||||
rnode1.setOrnum(1);
|
||||
rnode1.setAvtag(true);
|
||||
rnode1.setMember(new SysOrg("post1"));
|
||||
rnode1.setTier("xrnode1x");
|
||||
roleNodeService.insert(rnode1);
|
||||
|
||||
SysOrgRoleNode rnode11 = new SysOrgRoleNode();
|
||||
rnode11.setId("rnode11");
|
||||
rnode11.setName("一部部门领导");
|
||||
rnode11.setTreid("rtree1");
|
||||
rnode11.setOrnum(1);
|
||||
rnode11.setAvtag(true);
|
||||
rnode11.setMember(new SysOrg("c2"));
|
||||
rnode11.setParent(new SysOrgRoleNode("rnode1"));
|
||||
rnode11.setTier("xrnode1xrnode11x");
|
||||
roleNodeService.insert(rnode11);
|
||||
|
||||
SysOrgRoleNode rnode111 = new SysOrgRoleNode();
|
||||
rnode111.setId("rnode111");
|
||||
rnode111.setName("一部人员");
|
||||
rnode111.setTreid("rtree1");
|
||||
rnode111.setOrnum(1);
|
||||
rnode111.setAvtag(true);
|
||||
rnode111.setMember(new SysOrg("dept1"));
|
||||
rnode111.setParent(new SysOrgRoleNode("rnode11"));
|
||||
rnode111.setTier("xrnode1xrnode11xrnode111x");
|
||||
roleNodeService.insert(rnode111);
|
||||
|
||||
SysOrgRoleNode rnode2 = new SysOrgRoleNode();
|
||||
rnode2.setId("rnode2");
|
||||
rnode2.setName("二部分管领导");
|
||||
rnode2.setTreid("rtree1");
|
||||
rnode2.setOrnum(2);
|
||||
rnode2.setAvtag(true);
|
||||
rnode2.setMember(new SysOrg("post2"));
|
||||
rnode2.setTier("xrnode2x");
|
||||
roleNodeService.insert(rnode2);
|
||||
|
||||
SysOrgRoleNode rnode21 = new SysOrgRoleNode();
|
||||
rnode21.setId("rnode21");
|
||||
rnode21.setName("二部部门领导");
|
||||
rnode21.setTreid("rtree1");
|
||||
rnode21.setOrnum(1);
|
||||
rnode21.setAvtag(true);
|
||||
rnode21.setMember(new SysOrg("z6"));
|
||||
rnode21.setParent(new SysOrgRoleNode("rnode2"));
|
||||
rnode21.setTier("xrnode2xrnode21x");
|
||||
roleNodeService.insert(rnode21);
|
||||
|
||||
SysOrgRoleNode rnode211 = new SysOrgRoleNode();
|
||||
rnode211.setId("rnode211");
|
||||
rnode211.setName("二部人员");
|
||||
rnode211.setTreid("rtree1");
|
||||
rnode211.setOrnum(1);
|
||||
rnode211.setAvtag(true);
|
||||
rnode211.setMember(new SysOrg("dept2"));
|
||||
rnode211.setParent(new SysOrgRoleNode("rnode21"));
|
||||
rnode211.setTier("xrnode2xrnode21xrnode211x");
|
||||
roleNodeService.insert(rnode211);
|
||||
|
||||
}
|
||||
|
||||
@Autowired
|
||||
private SysOrgRoleNodeService roleNodeService;
|
||||
|
||||
@Autowired
|
||||
private SysOrgRoleTreeService roleTreeService;
|
||||
|
||||
@Autowired
|
||||
private SysOrgGroupCateService groupCateService;
|
||||
|
||||
@Autowired
|
||||
private SysOrgGroupService groupService;
|
||||
|
||||
@Autowired
|
||||
private SysOrgDeptService deptService;
|
||||
|
||||
@Autowired
|
||||
private SysOrgUserService userService;
|
||||
|
||||
@Autowired
|
||||
private SysOrgPostService postService;
|
||||
|
||||
}
|
||||
@@ -1,981 +0,0 @@
|
||||
package vben.init;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
import vben.core.module.sys.portal.main.SysPortalMain;
|
||||
import vben.core.module.sys.portal.main.SysPortalMainService;
|
||||
import vben.core.module.sys.portal.menu.SysPortalMenu;
|
||||
import vben.core.module.sys.portal.menu.SysPortalMenuService;
|
||||
|
||||
//系统门户与菜单初始化
|
||||
@Component
|
||||
public class SysPortalVbenInit {
|
||||
|
||||
//门户初始化
|
||||
protected void initPortal() {
|
||||
SysPortalMain sysPortalMain=new SysPortalMain();
|
||||
sysPortalMain.setId("sys");
|
||||
sysPortalMain.setOrnum(0);
|
||||
sysPortalMain.setName("管理员门户");
|
||||
mainService.save(sysPortalMain);
|
||||
|
||||
SysPortalMain sysPortalMain2=new SysPortalMain();
|
||||
sysPortalMain2.setId("sa");
|
||||
sysPortalMain2.setOrnum(1);
|
||||
sysPortalMain2.setName("营销门户");
|
||||
mainService.save(sysPortalMain2);
|
||||
}
|
||||
|
||||
//管理员门户的菜单初始化
|
||||
protected void initSysMenu() {
|
||||
// SysPortalMenu home = new SysPortalMenu();
|
||||
// home.setId("Home");
|
||||
// home.setName("首页");
|
||||
// home.setCode("Home");
|
||||
// home.setComp("/home/index");
|
||||
// home.setPath("/home");
|
||||
// home.setOrnum(0);
|
||||
// home.setIcon("ele-House");
|
||||
// home.setAvtag(true);
|
||||
// home.setShtag(true);
|
||||
// home.setType("M");
|
||||
// home.setPorid("sys");
|
||||
// menuService.insert(home);
|
||||
|
||||
//-----------------系统管理--------------------
|
||||
SysPortalMenu menu1 = new SysPortalMenu();
|
||||
menu1.setId("Sys");
|
||||
menu1.setName("系统管理");
|
||||
menu1.setCode("Sys");
|
||||
menu1.setComp("LAYOUT");
|
||||
menu1.setPath("/sys");
|
||||
menu1.setRedirect("/sys/org/user");
|
||||
menu1.setOrnum(1);
|
||||
menu1.setIcon("ant-design:setting-outlined");
|
||||
menu1.setAvtag(true);
|
||||
menu1.setShtag(true);
|
||||
menu1.setType("D");
|
||||
menu1.setPorid("sys");
|
||||
menuService.insert(menu1);
|
||||
|
||||
SysPortalMenu menu11 = new SysPortalMenu();
|
||||
menu11.setId("SysOrg");
|
||||
menu11.setName("组织架构");
|
||||
menu11.setCode("SysOrg");
|
||||
menu11.setComp("LAYOUT");
|
||||
menu11.setPath("/sys/org");
|
||||
menu11.setRedirect("/sys/org/user");
|
||||
menu11.setOrnum(1);
|
||||
menu11.setIcon("ant-design:partition-outlined");
|
||||
menu11.setPid("Sys");
|
||||
menu11.setAvtag(true);
|
||||
menu11.setShtag(true);
|
||||
menu11.setType("D");
|
||||
menu11.setPorid("sys");
|
||||
menuService.insert(menu11);
|
||||
|
||||
SysPortalMenu menu111 = new SysPortalMenu();
|
||||
menu111.setId("SysOrgDept");
|
||||
menu111.setName("部门管理");
|
||||
menu111.setCode("SysOrgDept");
|
||||
menu111.setPath("/sys/org/dept");
|
||||
menu111.setComp("/sys/org/dept/index");
|
||||
menu111.setOrnum(10);
|
||||
menu111.setPid("SysOrg");
|
||||
menu111.setCatag(true);
|
||||
menu111.setAvtag(true);
|
||||
menu111.setShtag(true);
|
||||
menu111.setType("M");
|
||||
menu111.setPorid("sys");
|
||||
menuService.insert(menu111);
|
||||
|
||||
SysPortalMenu menu111a = new SysPortalMenu();
|
||||
menu111a.setId("SysOrgDeptEdit");
|
||||
menu111a.setName("部门编辑");
|
||||
menu111a.setCode("SysOrgDeptEdit");
|
||||
menu111a.setPath("/sys/org/dept/edit");
|
||||
menu111a.setComp("/sys/org/dept/edit");
|
||||
menu111a.setOrnum(11);
|
||||
menu111a.setPid("SysOrg");
|
||||
menu111a.setCatag(true);
|
||||
menu111a.setAvtag(true);
|
||||
menu111a.setShtag(false);
|
||||
menu111a.setType("M");
|
||||
menu111a.setPorid("sys");
|
||||
menuService.insert(menu111a);
|
||||
|
||||
SysPortalMenu menu112 = new SysPortalMenu();
|
||||
menu112.setId("SysOrgUser");
|
||||
menu112.setName("用户管理");
|
||||
menu112.setCode("SysOrgUser");
|
||||
menu112.setPath("/sys/org/user");
|
||||
menu112.setComp("/sys/org/user/index");
|
||||
menu112.setOrnum(20);
|
||||
menu112.setPid("SysOrg");
|
||||
menu112.setCatag(true);
|
||||
menu112.setAvtag(true);
|
||||
menu112.setShtag(true);
|
||||
menu112.setType("M");
|
||||
menu112.setPorid("sys");
|
||||
menuService.insert(menu112);
|
||||
|
||||
SysPortalMenu menu112a = new SysPortalMenu();
|
||||
menu112a.setId("SysOrgUserEdit");
|
||||
menu112a.setName("用户编辑");
|
||||
menu112a.setCode("SysOrgUserEdit");
|
||||
menu112a.setPath("/sys/org/user/edit");
|
||||
menu112a.setComp("/sys/org/user/edit");
|
||||
menu112a.setOrnum(21);
|
||||
menu112a.setPid("SysOrg");
|
||||
menu112a.setCatag(true);
|
||||
menu112a.setAvtag(true);
|
||||
menu112a.setShtag(false);
|
||||
menu112a.setType("M");
|
||||
menu112a.setPorid("sys");
|
||||
menuService.insert(menu112a);
|
||||
|
||||
SysPortalMenu menu113 = new SysPortalMenu();
|
||||
menu113.setId("SysOrgPost");
|
||||
menu113.setName("岗位管理");
|
||||
menu113.setCode("SysOrgPost");
|
||||
menu113.setPath("/sys/org/post");
|
||||
menu113.setComp("/sys/org/post/index");
|
||||
menu113.setOrnum(31);
|
||||
menu113.setPid("SysOrg");
|
||||
menu113.setCatag(true);
|
||||
menu113.setAvtag(true);
|
||||
menu113.setShtag(true);
|
||||
menu113.setType("M");
|
||||
menu113.setPorid("sys");
|
||||
menuService.insert(menu113);
|
||||
|
||||
SysPortalMenu menu113a = new SysPortalMenu();
|
||||
menu113a.setId("SysOrgPostEdit");
|
||||
menu113a.setName("岗位编辑");
|
||||
menu113a.setCode("SysOrgPostEdit");
|
||||
menu113a.setPath("/sys/org/post/edit");
|
||||
menu113a.setComp("/sys/org/post/edit");
|
||||
menu113a.setOrnum(32);
|
||||
menu113a.setPid("SysOrg");
|
||||
menu113a.setCatag(true);
|
||||
menu113a.setAvtag(true);
|
||||
menu113a.setShtag(false);
|
||||
menu113a.setType("M");
|
||||
menu113a.setPorid("sys");
|
||||
menuService.insert(menu113a);
|
||||
|
||||
SysPortalMenu menu114 = new SysPortalMenu();
|
||||
menu114.setId("SysOrgGroup");
|
||||
menu114.setName("群组管理");
|
||||
menu114.setCode("SysOrgGroup");
|
||||
menu114.setPath("/sys/org/group");
|
||||
menu114.setComp("/sys/org/group/index");
|
||||
menu114.setOrnum(40);
|
||||
menu114.setPid("SysOrg");
|
||||
menu114.setCatag(true);
|
||||
menu114.setAvtag(true);
|
||||
menu114.setShtag(true);
|
||||
menu114.setType("M");
|
||||
menu114.setPorid("sys");
|
||||
menuService.insert(menu114);
|
||||
|
||||
SysPortalMenu menu114a = new SysPortalMenu();
|
||||
menu114a.setId("SysOrgGroupEdit");
|
||||
menu114a.setName("群组编辑");
|
||||
menu114a.setCode("SysOrgGroupEdit");
|
||||
menu114a.setPath("/sys/org/group/edit");
|
||||
menu114a.setComp("/sys/org/group/edit");
|
||||
menu114a.setOrnum(41);
|
||||
menu114a.setPid("SysOrg");
|
||||
menu114a.setCatag(true);
|
||||
menu114a.setAvtag(true);
|
||||
menu114a.setShtag(false);
|
||||
menu114a.setType("M");
|
||||
menu114a.setPorid("sys");
|
||||
menuService.insert(menu114a);
|
||||
|
||||
SysPortalMenu menu12 = new SysPortalMenu();
|
||||
menu12.setId("SysApi");
|
||||
menu12.setName("接口管理");
|
||||
menu12.setCode("SysApi");
|
||||
menu12.setComp("LAYOUT");
|
||||
menu12.setPath("/sys/api");
|
||||
menu12.setRedirect("/sys/api/main");
|
||||
menu12.setOrnum(2);
|
||||
menu12.setIcon("ant-design:safety-certificate-outlined");
|
||||
menu12.setPid("Sys");
|
||||
menu12.setAvtag(true);
|
||||
menu12.setShtag(true);
|
||||
menu12.setType("D");
|
||||
menu12.setPorid("sys");
|
||||
menuService.insert(menu12);
|
||||
|
||||
SysPortalMenu menu121 = new SysPortalMenu();
|
||||
menu121.setId("SysApiMain");
|
||||
menu121.setName("接口清单");
|
||||
menu121.setCode("SysApiMain");
|
||||
menu121.setPath("/sys/api/main");
|
||||
menu121.setComp("/sys/api/main/index");
|
||||
menu121.setOrnum(10);
|
||||
menu121.setPid("SysApi");
|
||||
menu121.setCatag(true);
|
||||
menu121.setAvtag(true);
|
||||
menu121.setShtag(true);
|
||||
menu121.setType("M");
|
||||
menu121.setPorid("sys");
|
||||
menuService.insert(menu121);
|
||||
|
||||
SysPortalMenu menu121a = new SysPortalMenu();
|
||||
menu121a.setId("SysApiMainEdit");
|
||||
menu121a.setName("接口编辑");
|
||||
menu121a.setCode("SysApiMainEdit");
|
||||
menu121a.setPath("/sys/api/main/edit");
|
||||
menu121a.setComp("/sys/api/main/edit");
|
||||
menu121a.setOrnum(11);
|
||||
menu121a.setPid("SysApi");
|
||||
menu121a.setCatag(true);
|
||||
menu121a.setAvtag(true);
|
||||
menu121a.setShtag(false);
|
||||
menu121a.setType("M");
|
||||
menu121a.setPorid("sys");
|
||||
menuService.insert(menu121a);
|
||||
|
||||
// SysPortalMenu menu122 = new SysPortalMenu();
|
||||
// menu122.setId("SysApiMainDoc");
|
||||
// menu122.setName("接口文档");
|
||||
// menu122.setCode("SysApiMainDoc");
|
||||
// menu122.setPath("/sys/api/role/doc");
|
||||
// //menu122.setExtag(true);//外链
|
||||
// menu122.setIftag(true);
|
||||
// menu122.setComp("http://localhost:5000/doc.html");
|
||||
// menu122.setOrnum(12);
|
||||
// menu122.setPid("SysApi");
|
||||
// menu122.setCatag(false);
|
||||
// menu122.setAvtag(true);
|
||||
// menu122.setShtag(true);
|
||||
// menu122.setType("M");
|
||||
// menu122.setPorid("sys");
|
||||
// menuService.insert(menu122);
|
||||
|
||||
SysPortalMenu menu123 = new SysPortalMenu();
|
||||
menu123.setId("SysApiRole");
|
||||
menu123.setName("接口角色");
|
||||
menu123.setCode("SysApiRole");
|
||||
menu123.setPath("/sys/api/role");
|
||||
menu123.setComp("/sys/api/role/index");
|
||||
menu123.setOrnum(20);
|
||||
menu123.setPid("SysApi");
|
||||
menu123.setCatag(true);
|
||||
menu123.setAvtag(true);
|
||||
menu123.setShtag(true);
|
||||
menu123.setType("M");
|
||||
menu123.setPorid("sys");
|
||||
menuService.insert(menu123);
|
||||
|
||||
SysPortalMenu menu123a = new SysPortalMenu();
|
||||
menu123a.setId("SysApiRoleEdit");
|
||||
menu123a.setName("角色编辑");
|
||||
menu123a.setCode("SysApiRoleEdit");
|
||||
menu123a.setPath("/sys/api/role/edit");
|
||||
menu123a.setComp("/sys/api/role/edit");
|
||||
menu123a.setOrnum(21);
|
||||
menu123a.setPid("SysApi");
|
||||
menu123a.setCatag(true);
|
||||
menu123a.setAvtag(true);
|
||||
menu123a.setShtag(false);
|
||||
menu123a.setType("M");
|
||||
menu123a.setPorid("sys");
|
||||
menuService.insert(menu123a);
|
||||
|
||||
SysPortalMenu menu13 = new SysPortalMenu();
|
||||
menu13.setId("SysPortal");
|
||||
menu13.setName("菜单管理");
|
||||
menu13.setCode("SysPortal");
|
||||
menu13.setComp("LAYOUT");
|
||||
menu13.setPath("/sys/portal");
|
||||
menu13.setRedirect("/sys/portal/main");
|
||||
menu13.setOrnum(3);
|
||||
menu13.setIcon("ant-design:profile-outlined");
|
||||
menu13.setPid("Sys");
|
||||
menu13.setAvtag(true);
|
||||
menu13.setShtag(true);
|
||||
menu13.setType("D");
|
||||
menu13.setPorid("sys");
|
||||
menuService.insert(menu13);
|
||||
|
||||
// SysPortalMenu menu131 = new SysPortalMenu();
|
||||
// menu131.setId("SysPortalMain");
|
||||
// menu131.setName("门户清单");
|
||||
// menu131.setCode("SysPortalMain");
|
||||
// menu131.setPath("/sys/portal/main");
|
||||
// menu131.setComp("/sys/portal/main/index");
|
||||
// menu131.setOrnum(10);
|
||||
// menu131.setIcon("ele-Tickets");
|
||||
// menu131.setPid("SysPortal");
|
||||
// menu131.setCatag(true);
|
||||
// menu131.setAvtag(true);
|
||||
// menu131.setShtag(true);
|
||||
// menu131.setType("M");
|
||||
// menu131.setPorid("sys");
|
||||
// menuService.insert(menu131);
|
||||
|
||||
// SysPortalMenu menu131a = new SysPortalMenu();
|
||||
// menu131a.setId("SysPortalMainEdit");
|
||||
// menu131a.setName("门户编辑");
|
||||
// menu131a.setCode("SysPortalMainEdit");
|
||||
// menu131a.setPath("/sys/portal/main/edit");
|
||||
// menu131a.setComp("/sys/portal/main/edit");
|
||||
// menu131a.setOrnum(11);
|
||||
// menu131a.setIcon("ele-Tickets");
|
||||
// menu131a.setPid("SysPortal");
|
||||
// menu131a.setCatag(true);
|
||||
// menu131a.setAvtag(true);
|
||||
// menu131a.setShtag(false);
|
||||
// menu131a.setType("M");
|
||||
// menu131a.setPorid("sys");
|
||||
// menuService.insert(menu131a);
|
||||
|
||||
SysPortalMenu menu132 = new SysPortalMenu();
|
||||
menu132.setId("SysPortalMenu");
|
||||
menu132.setName("菜单列表");
|
||||
menu132.setCode("SysPortalMenu");
|
||||
menu132.setPath("/sys/portal/menu");
|
||||
menu132.setComp("/sys/portal/menu/index");
|
||||
menu132.setOrnum(12);
|
||||
menu132.setPid("SysPortal");
|
||||
menu132.setCatag(true);
|
||||
menu132.setAvtag(true);
|
||||
menu132.setShtag(true);
|
||||
menu132.setType("M");
|
||||
menu132.setPorid("sys");
|
||||
menuService.insert(menu132);
|
||||
|
||||
SysPortalMenu menu132a = new SysPortalMenu();
|
||||
menu132a.setId("SysPortalMenuEdit");
|
||||
menu132a.setName("菜单编辑");
|
||||
menu132a.setCode("SysPortalMenuEdit");
|
||||
menu132a.setPath("/sys/portal/menu/edit");
|
||||
menu132a.setComp("/sys/portal/menu/edit");
|
||||
menu132a.setOrnum(13);
|
||||
menu132a.setPid("SysPortal");
|
||||
menu132a.setCatag(true);
|
||||
menu132a.setAvtag(true);
|
||||
menu132a.setShtag(false);
|
||||
menu132a.setType("M");
|
||||
menu132a.setPorid("sys");
|
||||
menuService.insert(menu132a);
|
||||
|
||||
SysPortalMenu menu133 = new SysPortalMenu();
|
||||
menu133.setId("SysPortalRole");
|
||||
menu133.setName("菜单角色");
|
||||
menu133.setCode("SysPortalRole");
|
||||
menu133.setPath("/sys/portal/role");
|
||||
menu133.setComp("/sys/portal/role/index");
|
||||
menu133.setOrnum(14);
|
||||
menu133.setPid("SysPortal");
|
||||
menu133.setCatag(true);
|
||||
menu133.setAvtag(true);
|
||||
menu133.setShtag(true);
|
||||
menu133.setType("M");
|
||||
menu133.setPorid("sys");
|
||||
menuService.insert(menu133);
|
||||
|
||||
SysPortalMenu menu133a = new SysPortalMenu();
|
||||
menu133a.setId("SysPortalRoleEdit");
|
||||
menu133a.setName("角色编辑");
|
||||
menu133a.setCode("SysPortalRoleEdit");
|
||||
menu133a.setPath("/sys/portal/role/edit");
|
||||
menu133a.setComp("/sys/portal/role/edit");
|
||||
menu133a.setOrnum(15);
|
||||
menu133a.setPid("SysPortal");
|
||||
menu133a.setCatag(true);
|
||||
menu133a.setAvtag(true);
|
||||
menu133a.setShtag(false);
|
||||
menu133a.setType("M");
|
||||
menu133a.setPorid("sys");
|
||||
menuService.insert(menu133a);
|
||||
|
||||
//-----------------监控中心--------------------
|
||||
SysPortalMenu menu2 = new SysPortalMenu();
|
||||
menu2.setId("Mon");
|
||||
menu2.setName("监控中心");
|
||||
menu2.setCode("Mon");
|
||||
menu2.setComp("LAYOUT");
|
||||
menu2.setPath("/mon");
|
||||
menu2.setRedirect("/mon/server/main");
|
||||
menu2.setOrnum(2);
|
||||
menu2.setIcon("ant-design:fund-outlined");
|
||||
menu2.setAvtag(true);
|
||||
menu2.setShtag(true);
|
||||
menu2.setType("D");
|
||||
menu2.setPorid("sys");
|
||||
menuService.insert(menu2);
|
||||
|
||||
SysPortalMenu menu211 = new SysPortalMenu();
|
||||
menu211.setId("MonOnlineUser");
|
||||
menu211.setName("在线用户");
|
||||
menu211.setCode("MonOnlineUser");
|
||||
menu211.setPath("/mon/online/user");
|
||||
menu211.setComp("/mon/online/user/index");
|
||||
menu211.setOrnum(211);
|
||||
menu211.setPid("Mon");
|
||||
menu211.setCatag(true);
|
||||
menu211.setAvtag(true);
|
||||
menu211.setShtag(true);
|
||||
menu211.setType("M");
|
||||
menu211.setPorid("sys");
|
||||
menuService.insert(menu211);
|
||||
|
||||
SysPortalMenu menu221 = new SysPortalMenu();
|
||||
menu221.setId("MonLogLogin");
|
||||
menu221.setName("登录日志");
|
||||
menu221.setCode("MonLogLogin");
|
||||
menu221.setPath("/mon/log/login");
|
||||
menu221.setComp("/mon/log/login/index");
|
||||
menu221.setOrnum(221);
|
||||
menu221.setPid("Mon");
|
||||
menu221.setCatag(true);
|
||||
menu221.setAvtag(true);
|
||||
menu221.setShtag(true);
|
||||
menu221.setType("M");
|
||||
menu221.setPorid("sys");
|
||||
menuService.insert(menu221);
|
||||
|
||||
SysPortalMenu menu222 = new SysPortalMenu();
|
||||
menu222.setId("MonLogOper");
|
||||
menu222.setName("操作日志");
|
||||
menu222.setCode("MonLogOper");
|
||||
menu222.setPath("/mon/log/oper");
|
||||
menu222.setComp("/mon/log/oper/index");
|
||||
menu222.setOrnum(222);
|
||||
menu222.setPid("Mon");
|
||||
menu222.setCatag(true);
|
||||
menu222.setAvtag(true);
|
||||
menu222.setShtag(true);
|
||||
menu222.setType("M");
|
||||
menu222.setPorid("sys");
|
||||
menuService.insert(menu222);
|
||||
|
||||
SysPortalMenu menu223 = new SysPortalMenu();
|
||||
menu223.setId("MonLogError");
|
||||
menu223.setName("错误日志");
|
||||
menu223.setCode("MonLogError");
|
||||
menu223.setPath("/mon/log/error");
|
||||
menu223.setComp("/mon/log/error/index");
|
||||
menu223.setOrnum(223);
|
||||
menu223.setPid("Mon");
|
||||
menu223.setCatag(true);
|
||||
menu223.setAvtag(true);
|
||||
menu223.setShtag(true);
|
||||
menu223.setType("M");
|
||||
menu223.setPorid("sys");
|
||||
menuService.insert(menu223);
|
||||
|
||||
SysPortalMenu menu261 = new SysPortalMenu();
|
||||
menu261.setId("MonJobMain");
|
||||
menu261.setName("定时任务");
|
||||
menu261.setCode("MonJobMain");
|
||||
menu261.setPath("/mon/job/main");
|
||||
menu261.setComp("/mon/job/main/index");
|
||||
menu261.setOrnum(261);
|
||||
menu261.setPid("Mon");
|
||||
menu261.setCatag(true);
|
||||
menu261.setAvtag(true);
|
||||
menu261.setShtag(true);
|
||||
menu261.setType("M");
|
||||
menu261.setPorid("sys");
|
||||
menuService.insert(menu261);
|
||||
|
||||
SysPortalMenu menu262 = new SysPortalMenu();
|
||||
menu262.setId("MonJobMainEdit");
|
||||
menu262.setName("任务编辑");
|
||||
menu262.setCode("MonJobMainEdit");
|
||||
menu262.setPath("/mon/job/main/edit");
|
||||
menu262.setComp("/mon/job/main/edit");
|
||||
menu262.setOrnum(262);
|
||||
menu262.setPid("Mon");
|
||||
menu262.setCatag(true);
|
||||
menu262.setAvtag(true);
|
||||
menu262.setShtag(false);
|
||||
menu262.setType("M");
|
||||
menu262.setPorid("sys");
|
||||
menuService.insert(menu262);
|
||||
|
||||
SysPortalMenu menu263 = new SysPortalMenu();
|
||||
menu263.setId("MonJobLog");
|
||||
menu263.setName("任务日志");
|
||||
menu263.setCode("MonJobLog");
|
||||
menu263.setPath("/mon/job/log");
|
||||
menu263.setComp("/mon/job/log/index");
|
||||
menu263.setOrnum(263);
|
||||
menu263.setPid("Mon");
|
||||
menu263.setCatag(true);
|
||||
menu263.setAvtag(true);
|
||||
menu263.setShtag(false);
|
||||
menu263.setType("M");
|
||||
menu263.setPorid("sys");
|
||||
menuService.insert(menu263);
|
||||
|
||||
// SysPortalMenu menu271 = new SysPortalMenu();
|
||||
// menu271.setId("MonServerMain");
|
||||
// menu271.setName("服务监控");
|
||||
// menu271.setCode("MonServerMain");
|
||||
// menu271.setPath("/mon/server/main");
|
||||
// menu271.setComp("/mon/server/main/show");
|
||||
// menu271.setOrnum(271);
|
||||
// menu271.setPid("Mon");
|
||||
// menu271.setCatag(false);
|
||||
// menu271.setAvtag(true);
|
||||
// menu271.setShtag(true);
|
||||
// menu271.setType("M");
|
||||
// menu271.setPorid("sys");
|
||||
// menuService.insert(menu271);
|
||||
//
|
||||
// SysPortalMenu menu281 = new SysPortalMenu();
|
||||
// menu281.setId("MonCacheMain");
|
||||
// menu281.setName("缓存监控");
|
||||
// menu281.setCode("MonCacheMain");
|
||||
// menu281.setPath("/mon/cache/main");
|
||||
// menu281.setComp("/mon/cache/main/show");
|
||||
// menu281.setOrnum(281);
|
||||
// menu281.setPid("Mon");
|
||||
// menu281.setCatag(false);
|
||||
// menu281.setAvtag(true);
|
||||
// menu281.setShtag(true);
|
||||
// menu281.setType("M");
|
||||
// menu281.setPorid("sys");
|
||||
// menuService.insert(menu281);
|
||||
//
|
||||
// SysPortalMenu menu291 = new SysPortalMenu();
|
||||
// menu291.setId("MonDbMain");
|
||||
// menu291.setName("数据监控");
|
||||
// menu291.setCode("MonDbMain");
|
||||
// menu291.setPath("/mon/db/main");
|
||||
// menu291.setComp("http://localhost:5000/druid/sql.html");
|
||||
// menu291.setOrnum(291);
|
||||
// menu291.setPid("Mon");
|
||||
// menu291.setIftag(true);
|
||||
// //menu122.setExtag(true);//外链
|
||||
// menu291.setCatag(false);
|
||||
// menu291.setAvtag(true);
|
||||
// menu291.setShtag(true);
|
||||
// menu291.setType("M");
|
||||
// menu291.setPorid("sys");
|
||||
// menuService.insert(menu291);
|
||||
|
||||
//-----------------辅助工具--------------------
|
||||
SysPortalMenu menu3 = new SysPortalMenu();
|
||||
menu3.setId("Ass");
|
||||
menu3.setName("辅助工具");
|
||||
menu3.setCode("Ass");
|
||||
menu3.setComp("LAYOUT");
|
||||
menu3.setPath("/ass");
|
||||
menu3.setRedirect("/ass/dict/main");
|
||||
menu3.setOrnum(3);
|
||||
menu3.setIcon("ant-design:tool-outlined");
|
||||
menu3.setAvtag(true);
|
||||
menu3.setShtag(true);
|
||||
menu3.setType("D");
|
||||
menu3.setPorid("sys");
|
||||
menuService.insert(menu3);
|
||||
|
||||
// SysPortalMenu menu311 = new SysPortalMenu();
|
||||
// menu311.setId("AssCogeForm");
|
||||
// menu311.setName("表单设计");
|
||||
// menu311.setCode("AssCogeForm");
|
||||
// menu311.setPath("/ass/coge/form");
|
||||
// menu311.setComp("/ass/coge/form/index");
|
||||
// menu311.setOrnum(311);
|
||||
// menu311.setPid("Ass");
|
||||
// menu311.setCatag(false);
|
||||
// menu311.setAvtag(true);
|
||||
// menu311.setShtag(true);
|
||||
// menu311.setType("M");
|
||||
// menu311.setPorid("sys");
|
||||
// menuService.insert(menu311);
|
||||
//
|
||||
// SysPortalMenu menu312 = new SysPortalMenu();
|
||||
// menu312.setId("AssCogeFormEdit");
|
||||
// menu312.setName("表单设计编辑");
|
||||
// menu312.setCode("AssCogeFormEdit");
|
||||
// menu312.setPath("/ass/coge/form/edit");
|
||||
// menu312.setComp("/ass/coge/form/edit");
|
||||
// menu312.setOrnum(312);
|
||||
// menu312.setPid("Ass");
|
||||
// menu312.setCatag(false);
|
||||
// menu312.setAvtag(true);
|
||||
// menu312.setShtag(false);
|
||||
// menu312.setType("M");
|
||||
// menu312.setPorid("sys");
|
||||
// menuService.insert(menu312);
|
||||
|
||||
// SysPortalMenu menu341 = new SysPortalMenu();
|
||||
// menu341.setId("AssCogeTable");
|
||||
// menu341.setName("代码生成");
|
||||
// menu341.setCode("AssCogeTable");
|
||||
// menu341.setPath("/ass/coge/table");
|
||||
// menu341.setComp("/ass/coge/table/index");
|
||||
// menu341.setOrnum(341);
|
||||
// menu341.setPid("Ass");
|
||||
// menu341.setCatag(false);
|
||||
// menu341.setAvtag(true);
|
||||
// menu341.setShtag(true);
|
||||
// menu341.setType("M");
|
||||
// menu341.setPorid("sys");
|
||||
// menuService.insert(menu341);
|
||||
//
|
||||
// SysPortalMenu menu342 = new SysPortalMenu();
|
||||
// menu342.setId("AssCogeTableEdit");
|
||||
// menu342.setName("代码生成");
|
||||
// menu342.setCode("AssCogeTableEdit");
|
||||
// menu342.setPath("/ass/coge/table/edit");
|
||||
// menu342.setComp("/ass/coge/table/edit");
|
||||
// menu342.setOrnum(342);
|
||||
// menu342.setPid("Ass");
|
||||
// menu342.setCatag(false);
|
||||
// menu342.setAvtag(true);
|
||||
// menu342.setShtag(false);
|
||||
// menu342.setType("M");
|
||||
// menu342.setPorid("sys");
|
||||
// menuService.insert(menu342);
|
||||
|
||||
SysPortalMenu menu351 = new SysPortalMenu();
|
||||
menu351.setId("AssDictMain");
|
||||
menu351.setName("数据字典");
|
||||
menu351.setCode("AssDictMain");
|
||||
menu351.setPath("/ass/dict/main");
|
||||
menu351.setComp("/ass/dict/main/index");
|
||||
menu351.setOrnum(351);
|
||||
menu351.setPid("Ass");
|
||||
menu351.setCatag(false);
|
||||
menu351.setAvtag(true);
|
||||
menu351.setShtag(true);
|
||||
menu351.setType("M");
|
||||
menu351.setPorid("sys");
|
||||
menuService.insert(menu351);
|
||||
|
||||
SysPortalMenu menu352 = new SysPortalMenu();
|
||||
menu352.setId("AssDictData");
|
||||
menu352.setName("字典数据");
|
||||
menu352.setCode("AssDictData");
|
||||
menu352.setPath("/ass/dict/data");
|
||||
menu352.setComp("/ass/dict/data/index");
|
||||
menu352.setOrnum(352);
|
||||
menu352.setPid("Ass");
|
||||
menu352.setCatag(false);
|
||||
menu352.setAvtag(true);
|
||||
menu352.setShtag(false);
|
||||
menu352.setType("M");
|
||||
menu352.setPorid("sys");
|
||||
menuService.insert(menu352);
|
||||
|
||||
SysPortalMenu menu361 = new SysPortalMenu();
|
||||
menu361.setId("AssNumMain");
|
||||
menu361.setName("编号策略");
|
||||
menu361.setCode("AssNumMain");
|
||||
menu361.setPath("/ass/num/main");
|
||||
menu361.setComp("/ass/num/main/index");
|
||||
menu361.setOrnum(361);
|
||||
menu361.setPid("Ass");
|
||||
menu361.setCatag(false);
|
||||
menu361.setAvtag(true);
|
||||
menu361.setShtag(true);
|
||||
menu361.setType("M");
|
||||
menu361.setPorid("sys");
|
||||
menuService.insert(menu361);
|
||||
|
||||
// SysPortalMenu menu371 = new SysPortalMenu();
|
||||
// menu371.setId("AssAddrMain");
|
||||
// menu371.setName("省市区县");
|
||||
// menu371.setCode("AssAddrMain");
|
||||
// menu371.setPath("/ass/addr/main");
|
||||
// menu371.setComp("/ass/addr/main/index");
|
||||
// menu371.setOrnum(371);
|
||||
// menu371.setPid("Ass");
|
||||
// menu371.setCatag(false);
|
||||
// menu371.setAvtag(true);
|
||||
// menu371.setShtag(true);
|
||||
// menu371.setType("M");
|
||||
// menu371.setPorid("sys");
|
||||
// menuService.insert(menu371);
|
||||
|
||||
//-----------------数字办公--------------------
|
||||
// SysPortalMenu menu4 = new SysPortalMenu();
|
||||
// menu4.setId("Oa");
|
||||
// menu4.setName("数字办公");
|
||||
// menu4.setCode("Oa");
|
||||
// menu4.setComp("LAYOUT");
|
||||
// menu4.setPath("/oa");
|
||||
// menu4.setRedirect("/oa/flow/temp");
|
||||
// menu4.setOrnum(4);
|
||||
// menu4.setIcon("ele-Menu");
|
||||
// menu4.setAvtag(true);
|
||||
// menu4.setShtag(true);
|
||||
// menu4.setType("D");
|
||||
// menu4.setPorid("sys");
|
||||
// menuService.insert(menu4);
|
||||
|
||||
SysPortalMenu menu41 = new SysPortalMenu();
|
||||
menu41.setId("OaFlow");
|
||||
menu41.setName("流程管理");
|
||||
menu41.setCode("OaFlow");
|
||||
menu41.setComp("LAYOUT");
|
||||
menu41.setPath("/oa/flow");
|
||||
menu41.setRedirect("/oa/flow/temp");
|
||||
menu41.setOrnum(4);
|
||||
menu41.setIcon("ant-design:retweet-outlined");
|
||||
menu41.setAvtag(true);
|
||||
menu41.setShtag(true);
|
||||
menu41.setType("D");
|
||||
menu41.setPorid("sys");
|
||||
menuService.insert(menu41);
|
||||
|
||||
SysPortalMenu menu411 = new SysPortalMenu();
|
||||
menu411.setId("OaFlowCate");
|
||||
menu411.setName("流程分类");
|
||||
menu411.setCode("OaFlowCate");
|
||||
menu411.setPath("/oa/flow/cate");
|
||||
menu411.setComp("/oa/flow/cate/index");
|
||||
menu411.setOrnum(411);
|
||||
menu411.setIcon("ele-Tickets");
|
||||
menu411.setPid("OaFlow");
|
||||
menu411.setCatag(true);
|
||||
menu411.setAvtag(true);
|
||||
menu411.setShtag(true);
|
||||
menu411.setType("M");
|
||||
menu411.setPorid("sys");
|
||||
menuService.insert(menu411);
|
||||
|
||||
SysPortalMenu menu411a = new SysPortalMenu();
|
||||
menu411a.setId("OaFlowCateEdit");
|
||||
menu411a.setName("流程分类编辑");
|
||||
menu411a.setCode("OaFlowCateEdit");
|
||||
menu411a.setPath("/oa/flow/cate/edit");
|
||||
menu411a.setComp("/oa/flow/cate/edit");
|
||||
menu411a.setOrnum(4111);
|
||||
menu411a.setIcon("ele-Tickets");
|
||||
menu411a.setPid("OaFlow");
|
||||
menu411a.setCatag(true);
|
||||
menu411a.setAvtag(true);
|
||||
menu411a.setShtag(false);
|
||||
menu411a.setType("M");
|
||||
menu411a.setPorid("sys");
|
||||
menuService.insert(menu411a);
|
||||
|
||||
SysPortalMenu menu412 = new SysPortalMenu();
|
||||
menu412.setId("OaFlowTemp");
|
||||
menu412.setName("流程模板");
|
||||
menu412.setCode("OaFlowTemp");
|
||||
menu412.setPath("/oa/flow/temp");
|
||||
menu412.setComp("/oa/flow/temp/index");
|
||||
menu412.setOrnum(412);
|
||||
menu412.setIcon("ele-Tickets");
|
||||
menu412.setPid("OaFlow");
|
||||
menu412.setCatag(true);
|
||||
menu412.setAvtag(true);
|
||||
menu412.setShtag(true);
|
||||
menu412.setType("M");
|
||||
menu412.setPorid("sys");
|
||||
menuService.insert(menu412);
|
||||
|
||||
SysPortalMenu menu412a = new SysPortalMenu();
|
||||
menu412a.setId("OaFlowTempEdit");
|
||||
menu412a.setName("流程模板编辑");
|
||||
menu412a.setCode("OaFlowTempEdit");
|
||||
menu412a.setPath("/oa/flow/temp/edit");
|
||||
menu412a.setComp("/oa/flow/temp/edit");
|
||||
menu412a.setOrnum(4121);
|
||||
menu412a.setIcon("ele-Tickets");
|
||||
menu412a.setPid("OaFlow");
|
||||
menu412a.setCatag(true);
|
||||
menu412a.setAvtag(true);
|
||||
menu412a.setShtag(false);
|
||||
menu412a.setType("M");
|
||||
menu412a.setPorid("sys");
|
||||
menuService.insert(menu412a);
|
||||
|
||||
SysPortalMenu menu413 = new SysPortalMenu();
|
||||
menu413.setId("OaFlowMain");
|
||||
menu413.setName("流程实例");
|
||||
menu413.setCode("OaFlowMain");
|
||||
menu413.setPath("/oa/flow/main");
|
||||
menu413.setComp("/oa/flow/main/index");
|
||||
menu413.setOrnum(413);
|
||||
menu413.setIcon("ele-Tickets");
|
||||
menu413.setPid("OaFlow");
|
||||
menu413.setCatag(true);
|
||||
menu413.setAvtag(true);
|
||||
menu413.setShtag(true);
|
||||
menu413.setType("M");
|
||||
menu413.setPorid("sys");
|
||||
menuService.insert(menu413);
|
||||
|
||||
SysPortalMenu menu413a = new SysPortalMenu();
|
||||
menu413a.setId("OaFlowMainEdit");
|
||||
menu413a.setName("流程实例编辑");
|
||||
menu413a.setCode("OaFlowMainEdit");
|
||||
menu413a.setPath("/oa/flow/main/edit");
|
||||
menu413a.setComp("/oa/flow/main/edit");
|
||||
menu413a.setOrnum(4131);
|
||||
menu413a.setIcon("ele-Tickets");
|
||||
menu413a.setPid("OaFlow");
|
||||
menu413a.setCatag(true);
|
||||
menu413a.setAvtag(true);
|
||||
menu413a.setShtag(false);
|
||||
menu413a.setType("M");
|
||||
menu413a.setPorid("sys");
|
||||
menuService.insert(menu413a);
|
||||
|
||||
SysPortalMenu menu413b = new SysPortalMenu();
|
||||
menu413b.setId("OaFlowMainView");
|
||||
menu413b.setName("流程实例查看");
|
||||
menu413b.setCode("OaFlowMainView");
|
||||
menu413b.setPath("/oa/flow/main/view");
|
||||
menu413b.setComp("/oa/flow/main/view");
|
||||
menu413b.setOrnum(4132);
|
||||
menu413b.setIcon("ele-Tickets");
|
||||
menu413b.setPid("OaFlow");
|
||||
menu413b.setCatag(true);
|
||||
menu413b.setAvtag(true);
|
||||
menu413b.setShtag(false);
|
||||
menu413b.setType("M");
|
||||
menu413b.setPorid("sys");
|
||||
menuService.insert(menu413b);
|
||||
|
||||
//-----------------DEMO--------------------
|
||||
SysPortalMenu menu8 = new SysPortalMenu();
|
||||
menu8.setId("My");
|
||||
menu8.setName("测试样例");
|
||||
menu8.setCode("My");
|
||||
menu8.setComp("LAYOUT");
|
||||
menu8.setPath("/my");
|
||||
menu8.setRedirect("/my/demo/main");
|
||||
menu8.setOrnum(8);
|
||||
menu8.setIcon("ant-design:trophy-outlined");
|
||||
menu8.setAvtag(true);
|
||||
menu8.setShtag(true);
|
||||
menu8.setType("D");
|
||||
menu8.setPorid("sys");
|
||||
menuService.insert(menu8);
|
||||
|
||||
SysPortalMenu menu811 = new SysPortalMenu();
|
||||
menu811.setId("MyDemoCate");
|
||||
menu811.setName("DEMO分类");
|
||||
menu811.setCode("MyDemoCate");
|
||||
menu811.setPath("/my/demo/cate");
|
||||
menu811.setComp("/my/demo/cate/index");
|
||||
menu811.setOrnum(811);
|
||||
menu811.setIcon("ele-Tickets");
|
||||
menu811.setPid("My");
|
||||
menu811.setCatag(true);
|
||||
menu811.setAvtag(true);
|
||||
menu811.setShtag(true);
|
||||
menu811.setType("M");
|
||||
menu811.setPorid("sys");
|
||||
menuService.insert(menu811);
|
||||
|
||||
SysPortalMenu menu812 = new SysPortalMenu();
|
||||
menu812.setId("MyDemoMain");
|
||||
menu812.setName("DEMO清单");
|
||||
menu812.setCode("MyDemoMain");
|
||||
menu812.setPath("/my/demo/main");
|
||||
menu812.setComp("/my/demo/main/index");
|
||||
menu812.setOrnum(812);
|
||||
menu812.setIcon("ele-Tickets");
|
||||
menu812.setPid("My");
|
||||
menu812.setCatag(true);
|
||||
menu812.setAvtag(true);
|
||||
menu812.setShtag(true);
|
||||
menu812.setType("M");
|
||||
menu812.setPorid("sys");
|
||||
menuService.insert(menu812);
|
||||
|
||||
SysPortalMenu menu813 = new SysPortalMenu();
|
||||
menu813.setId("MyDemoMainEdit");
|
||||
menu813.setName("DEMO编辑");
|
||||
menu813.setCode("MyDemoMainEdit");
|
||||
menu813.setPath("/my/demo/main/edit");
|
||||
menu813.setComp("/my/demo/main/edit");
|
||||
menu813.setOrnum(813);
|
||||
menu813.setIcon("ele-Tickets");
|
||||
menu813.setPid("My");
|
||||
menu813.setCatag(true);
|
||||
menu813.setAvtag(true);
|
||||
menu813.setShtag(false);
|
||||
menu813.setType("M");
|
||||
menu813.setPorid("sys");
|
||||
menuService.insert(menu813);
|
||||
|
||||
SysPortalMenu menu999 = new SysPortalMenu();
|
||||
menu999.setId("AboutPage");
|
||||
menu999.setName("关于");
|
||||
menu999.setCode("AboutPage");
|
||||
menu999.setPath("/sys/about");
|
||||
menu999.setComp("/sys/about/index");
|
||||
menu999.setOrnum(999);
|
||||
menu999.setIcon("simple-icons:about-dot-me");
|
||||
menu999.setCatag(true);
|
||||
menu999.setAvtag(true);
|
||||
menu999.setShtag(true);
|
||||
menu999.setType("M");
|
||||
menu999.setPorid("sys");
|
||||
menuService.insert(menu999);
|
||||
|
||||
}
|
||||
|
||||
//营销门户的菜单初始化
|
||||
protected void initSaMenu() {
|
||||
SysPortalMenu home = new SysPortalMenu();
|
||||
home.setId("Sa-Home");
|
||||
home.setName("营销首页");
|
||||
home.setCode("Home");
|
||||
home.setComp("/home/sa");
|
||||
home.setPath("/home");
|
||||
home.setOrnum(0);
|
||||
home.setIcon("ele-House");
|
||||
home.setAvtag(true);
|
||||
home.setShtag(true);
|
||||
home.setType("M");
|
||||
home.setPorid("sa");
|
||||
menuService.insert(home);
|
||||
|
||||
SysPortalMenu menu1 = new SysPortalMenu();
|
||||
menu1.setId("Sa-Oa");
|
||||
menu1.setName("日常办公");
|
||||
menu1.setCode("Oa");
|
||||
menu1.setComp("LAYOUT");
|
||||
menu1.setPath("/oa");
|
||||
menu1.setRedirect("/oa/flow/main");
|
||||
menu1.setOrnum(1);
|
||||
menu1.setIcon("ele-Menu");
|
||||
menu1.setAvtag(true);
|
||||
menu1.setShtag(true);
|
||||
menu1.setType("D");
|
||||
menu1.setPorid("sa");
|
||||
menuService.insert(menu1);
|
||||
|
||||
SysPortalMenu menu11 = new SysPortalMenu();
|
||||
menu11.setId("Sa-OaFlowMain");
|
||||
menu11.setName("流程审批");
|
||||
menu11.setCode("OaFlowMain");
|
||||
menu11.setPath("/oa/flow/main");
|
||||
menu11.setComp("/oa/flow/main/index");
|
||||
menu11.setOrnum(11);
|
||||
menu11.setIcon("ele-Tickets");
|
||||
menu11.setPid("Sa-Oa");
|
||||
menu11.setCatag(true);
|
||||
menu11.setAvtag(true);
|
||||
menu11.setShtag(true);
|
||||
menu11.setType("M");
|
||||
menu11.setPorid("sa");
|
||||
menuService.insert(menu11);
|
||||
}
|
||||
|
||||
@Autowired
|
||||
private SysPortalMainService mainService;
|
||||
|
||||
@Autowired
|
||||
private SysPortalMenuService menuService;
|
||||
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,76 +0,0 @@
|
||||
server.port=5000
|
||||
|
||||
#主数据源druid连接池配置
|
||||
spring.datasource.primary.initialSize=5
|
||||
spring.datasource.primary.minIdle=10
|
||||
spring.datasource.primary.maxActive=20
|
||||
spring.datasource.primary.maxWait=60000
|
||||
spring.datasource.primary.timeBetweenEvictionRunsMillis=60000
|
||||
spring.datasource.primary.minEvictableIdleTimeMillis=300000
|
||||
spring.datasource.primary.maxEvictableIdleTimeMillis=900000
|
||||
spring.datasource.primary.testWhileIdle=true
|
||||
spring.datasource.primary.testOnBorrow=false
|
||||
spring.datasource.primary.testOnReturn=false
|
||||
|
||||
#主数据源JPA配置
|
||||
spring.datasource.primary.jpa.entityScan=com.abc.module
|
||||
spring.datasource.primary.jpa.hbm2ddl.auto=update
|
||||
#spring.datasource.primary.jpa.hbm2ddl.auto=none
|
||||
|
||||
#主数据源-mysql5.7
|
||||
#spring.datasource.primary.dbType=mysql
|
||||
#spring.datasource.primary.validationQuery=SELECT 1 FROM DUAL
|
||||
#spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver
|
||||
#spring.datasource.primary.url=jdbc:mysql://localhost:3306/vben-java?characterEncoding=utf-8&useSSL=false
|
||||
#spring.datasource.primary.username=root
|
||||
#spring.datasource.primary.password=123456
|
||||
|
||||
#主数据源-mysql8
|
||||
spring.datasource.primary.dbType=mysql
|
||||
spring.datasource.primary.validationQuery=SELECT 1 FROM DUAL
|
||||
spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver
|
||||
spring.datasource.primary.url=jdbc:mysql://localhost:3306/vben-java?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC&nullCatalogMeansCurrent=true
|
||||
spring.datasource.primary.username=root
|
||||
spring.datasource.primary.password=123456
|
||||
|
||||
#主数据源-oracle
|
||||
#spring.datasource.primary.dbType=oracle
|
||||
#spring.datasource.primary.validationQuery=SELECT 1 FROM DUAL
|
||||
#spring.datasource.primary.driver-class-name=oracle.jdbc.OracleDriver
|
||||
##spring.datasource.primary.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
|
||||
##spring.datasource.primary.username=scott
|
||||
##spring.datasource.primary.password=123456
|
||||
|
||||
#主数据源-sqlserver
|
||||
#spring.datasource.primary.dbType=sqlserver
|
||||
#spring.datasource.primary.validationQuery=SELECT 1
|
||||
#spring.datasource.primary.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
|
||||
##spring.datasource.primary.url=jdbc:sqlserver://127.0.0.1:1433;SelectMethod=cursor;DatabaseName=vben
|
||||
##spring.datasource.primary.username=sa
|
||||
##spring.datasource.primary.password=123456
|
||||
|
||||
#本地附件上传位置
|
||||
app.att.path=C:/vben/att
|
||||
#app.att.path=/home/linux64/java/att
|
||||
#认证方式 1代表session,2待办jwt token
|
||||
app.authc.type=2
|
||||
|
||||
ldap.url=ldap://10.0.0.0:389
|
||||
ldap.base=OU=xxx,DC=xxx,DC=com
|
||||
ldap.userDn=CN=xxx,CN=Users,DC=xxx,DC=com
|
||||
ldap.userPwd=xxx
|
||||
ldap.referral=follow
|
||||
ldap.domainName=%s@xxx.com
|
||||
management.health.ldap.enabled=false
|
||||
|
||||
oss.configkey=
|
||||
oss.accesskey=
|
||||
oss.secretkey=
|
||||
oss.bucket=
|
||||
oss.endpoint=
|
||||
oss.ishttps=N
|
||||
oss.region=
|
||||
|
||||
vben.amap.key=key维护地址:https://lbs.amap.com/api/webservice/summary/
|
||||
|
||||
logging.config=classpath:config/logback-dev.xml
|
||||
@@ -1,76 +0,0 @@
|
||||
server.port=5000
|
||||
|
||||
#主数据源druid连接池配置
|
||||
spring.datasource.primary.initialSize=5
|
||||
spring.datasource.primary.minIdle=10
|
||||
spring.datasource.primary.maxActive=20
|
||||
spring.datasource.primary.maxWait=60000
|
||||
spring.datasource.primary.timeBetweenEvictionRunsMillis=60000
|
||||
spring.datasource.primary.minEvictableIdleTimeMillis=300000
|
||||
spring.datasource.primary.maxEvictableIdleTimeMillis=900000
|
||||
spring.datasource.primary.testWhileIdle=true
|
||||
spring.datasource.primary.testOnBorrow=false
|
||||
spring.datasource.primary.testOnReturn=false
|
||||
|
||||
#主数据源JPA配置
|
||||
spring.datasource.primary.jpa.entityScan=com.abc.module
|
||||
spring.datasource.primary.jpa.hbm2ddl.auto=update
|
||||
#spring.datasource.primary.jpa.hbm2ddl.auto=none
|
||||
|
||||
#主数据源-mysql5.7
|
||||
#spring.datasource.primary.dbType=mysql
|
||||
#spring.datasource.primary.validationQuery=SELECT 1 FROM DUAL
|
||||
#spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver
|
||||
#spring.datasource.primary.url=jdbc:mysql://localhost:3306/vben-java?characterEncoding=utf-8&useSSL=false
|
||||
#spring.datasource.primary.username=root
|
||||
#spring.datasource.primary.password=123456
|
||||
|
||||
#主数据源-mysql8
|
||||
spring.datasource.primary.dbType=mysql
|
||||
spring.datasource.primary.validationQuery=SELECT 1 FROM DUAL
|
||||
spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver
|
||||
spring.datasource.primary.url=jdbc:mysql://localhost:3306/vben-java?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC&nullCatalogMeansCurrent=true
|
||||
spring.datasource.primary.username=root
|
||||
spring.datasource.primary.password=123456
|
||||
|
||||
#主数据源-oracle
|
||||
#spring.datasource.primary.dbType=oracle
|
||||
#spring.datasource.primary.validationQuery=SELECT 1 FROM DUAL
|
||||
#spring.datasource.primary.driver-class-name=oracle.jdbc.OracleDriver
|
||||
##spring.datasource.primary.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
|
||||
##spring.datasource.primary.username=scott
|
||||
##spring.datasource.primary.password=123456
|
||||
|
||||
#主数据源-sqlserver
|
||||
#spring.datasource.primary.dbType=sqlserver
|
||||
#spring.datasource.primary.validationQuery=SELECT 1
|
||||
#spring.datasource.primary.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
|
||||
##spring.datasource.primary.url=jdbc:sqlserver://127.0.0.1:1433;SelectMethod=cursor;DatabaseName=vben
|
||||
##spring.datasource.primary.username=sa
|
||||
##spring.datasource.primary.password=123456
|
||||
|
||||
#本地附件上传位置
|
||||
app.att.path=C:/vben/att
|
||||
#app.att.path=/home/linux64/java/att
|
||||
#认证方式 1代表session,2待办jwt token
|
||||
app.authc.type=2
|
||||
|
||||
ldap.url=ldap://10.0.0.0:389
|
||||
ldap.base=OU=xxx,DC=xxx,DC=com
|
||||
ldap.userDn=CN=xxx,CN=Users,DC=xxx,DC=com
|
||||
ldap.userPwd=xxx
|
||||
ldap.referral=follow
|
||||
ldap.domainName=%s@xxx.com
|
||||
management.health.ldap.enabled=false
|
||||
|
||||
oss.configkey=
|
||||
oss.accesskey=
|
||||
oss.secretkey=
|
||||
oss.bucket=
|
||||
oss.endpoint=
|
||||
oss.ishttps=N
|
||||
oss.region=
|
||||
|
||||
vben.amap.key=key维护地址:https://lbs.amap.com/api/webservice/summary/
|
||||
|
||||
logging.config=classpath:config/logback-dev.xml
|
||||
@@ -1,19 +0,0 @@
|
||||
#web配置
|
||||
spring.servlet.multipart.max-file-size=10240000
|
||||
spring.servlet.multipart.max-request-size=10240000
|
||||
server.compression.enabled=true
|
||||
server.compression.mime-types=application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css
|
||||
server.compression.min-response-size=40960000
|
||||
|
||||
|
||||
#最大连接数
|
||||
http.maxTotal=100
|
||||
http.defaultMaxPerRoute=20
|
||||
http.connectTimeout=1000
|
||||
http.connectionRequestTimeout=500
|
||||
http.socketTimeout=10000
|
||||
http.staleConnectionCheckEnabled=true
|
||||
http.validateAfterInactivity=3000000
|
||||
|
||||
spring.profiles.active=dev
|
||||
#spring.profiles.active=prd
|
||||
@@ -1,115 +0,0 @@
|
||||
# druid配置
|
||||
spring:
|
||||
datasource:
|
||||
druid:
|
||||
webStatFilter:
|
||||
enabled: true
|
||||
statViewServlet:
|
||||
enabled: true
|
||||
# 设置白名单,不填则允许所有访问
|
||||
allow:
|
||||
url-pattern: /druid/*
|
||||
# 控制台管理用户名和密码
|
||||
# login-username: 1
|
||||
# login-password: 1
|
||||
filter:
|
||||
stat:
|
||||
enabled: true
|
||||
# 慢SQL记录
|
||||
log-slow-sql: true
|
||||
slow-sql-millis: 20000
|
||||
merge-sql: true
|
||||
wall:
|
||||
config:
|
||||
multi-statement-allow: true
|
||||
jpa:
|
||||
open-in-view: true
|
||||
banner:
|
||||
location: classpath:config/banner.txt
|
||||
jackson:
|
||||
date-format: yyyy-MM-dd HH:mm:ss
|
||||
time-zone: GMT+8
|
||||
|
||||
|
||||
--- # redis
|
||||
spring:
|
||||
redis:
|
||||
# 地址
|
||||
host: localhost
|
||||
# 端口,默认为6379
|
||||
port: 6379
|
||||
# 数据库索引
|
||||
database: 1
|
||||
# 密码
|
||||
# password:
|
||||
# # 连接超时时间
|
||||
timeout: 10s
|
||||
# 是否开启ssl
|
||||
ssl: false
|
||||
|
||||
redisson:
|
||||
# 线程池数量
|
||||
threads: 4
|
||||
# Netty线程池数量
|
||||
nettyThreads: 8
|
||||
# 单节点配置
|
||||
singleServerConfig:
|
||||
# 客户端名称
|
||||
clientName: zsvg
|
||||
# 最小空闲连接数
|
||||
connectionMinimumIdleSize: 8
|
||||
# 连接池大小
|
||||
connectionPoolSize: 32
|
||||
# 连接空闲超时,单位:毫秒
|
||||
idleConnectionTimeout: 10000
|
||||
# 命令等待超时,单位:毫秒
|
||||
timeout: 3000
|
||||
# 发布和订阅连接池大小
|
||||
subscriptionConnectionPoolSize: 50
|
||||
|
||||
|
||||
#logging.config: classpath:config/logback.xml
|
||||
|
||||
knife4j:
|
||||
# 是否开启Knife4j增强模式
|
||||
enable: true
|
||||
# 是否开启生产环境保护策略
|
||||
production: false
|
||||
# basic:
|
||||
# enable: true
|
||||
# username: vben
|
||||
# password: 123456
|
||||
# 前端Ui的个性化配置属性
|
||||
setting:
|
||||
# 默认语言
|
||||
language: zh-CN
|
||||
# 是否显示Footer
|
||||
enableFooter: false
|
||||
# 是否开启动态参数调试功能
|
||||
enableDynamicParameter: true
|
||||
# 是否在每个Debug调试栏后显示刷新变量按钮
|
||||
enableReloadCacheParameter: true
|
||||
|
||||
zsvg:
|
||||
jwt:
|
||||
header: Authorization
|
||||
prefix: "Bearer "
|
||||
#生成accessToken用的key
|
||||
akey: 6EtRVaDRFyIe5pBlBh1p6dRD+fLA5phPMyEeVkaNcEMUcpvQwZtGNby24TzuTZ4OBuXTYUaWgZqsRwROg1XWFA==
|
||||
#生成refreshToken用的key
|
||||
rkey: W3UZyVu0VQCGMRPvU11CqDovDUku3XASJlXLu0zFZdvUyAvXoEVrumKnz1DSBJ4O5l49Mi2Hesx7Kct4UPTL9g==
|
||||
#accessToken过期时间 此处单位秒 ,默认8小时 28800
|
||||
atime: 28800
|
||||
#accessToken过期时间 此处单位秒 ,默认30天 3456000
|
||||
rtime: 3456000
|
||||
# # 在线用户key
|
||||
# online-key: online-token-
|
||||
# # 验证码
|
||||
# code-key: code-key-
|
||||
# # token 续期检查时间范围(默认30分钟,单位毫秒),在token即将过期的一段时间内用户操作了,则给用户的token续期
|
||||
# detect: 1800000
|
||||
# # 续期时间范围,默认1小时,单位毫秒
|
||||
# renew: 3600000
|
||||
|
||||
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
#应用初始化类型
|
||||
app.init.orgName=XX集团
|
||||
app.init.orgRootId=1
|
||||
#-- sa:组织架构只包含一个sa管理员与一个vben的演示账户
|
||||
#-- test:除了以上数据还包含张三李四等测试人员
|
||||
#-- wc:除了以上数据还包含了一些世界杯球队与球员,用于测试大数据量
|
||||
app.init.orgType=test
|
||||
#第一次启动为哪个ui生成菜单
|
||||
app.init.uiType=vue
|
||||
@@ -1,6 +0,0 @@
|
||||
${AnsiColor.GREEN}
|
||||
|
||||
vben V0.1 一个开箱即用的快速开发平台JAVA版
|
||||
|
||||
${AnsiColor.GREEN}
|
||||
${spring-boot.version}
|
||||
@@ -1,199 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
|
||||
<!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新加载,默认值为true -->
|
||||
<!-- scanPeriod:设置监测配置文档是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。
|
||||
当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
|
||||
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
|
||||
<configuration scan="true" scanPeriod="10 seconds">
|
||||
<contextName>logback</contextName>
|
||||
|
||||
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
|
||||
<property name="log.path" value="C:/vben/logs" />
|
||||
|
||||
<!--0. 日志格式和颜色渲染 -->
|
||||
<!-- 彩色日志依赖的渲染类 -->
|
||||
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
|
||||
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
|
||||
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
|
||||
<!-- 彩色日志格式 -->
|
||||
<!--<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>-->
|
||||
|
||||
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
|
||||
|
||||
<!--1. 输出到控制台-->
|
||||
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
|
||||
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
|
||||
<level>debug</level>
|
||||
</filter>
|
||||
<encoder>
|
||||
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
|
||||
<!-- 设置字符集 -->
|
||||
<!--<charset>UTF-8</charset>-->
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<!--2. 输出到文档-->
|
||||
<!-- 2.1 level为 DEBUG 日志,时间滚动输出 -->
|
||||
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<!-- 正在记录的日志文档的路径及文档名 -->
|
||||
<file>${log.path}/web_debug.log</file>
|
||||
<!--日志文档输出格式-->
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
|
||||
<charset>UTF-8</charset> <!-- 设置字符集 -->
|
||||
</encoder>
|
||||
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<!-- 日志归档 -->
|
||||
<fileNamePattern>${log.path}/web-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
|
||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
|
||||
<maxFileSize>100MB</maxFileSize>
|
||||
</timeBasedFileNamingAndTriggeringPolicy>
|
||||
<!--日志文档保留天数-->
|
||||
<maxHistory>15</maxHistory>
|
||||
</rollingPolicy>
|
||||
<!-- 此日志文档只记录debug级别的 -->
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||
<level>debug</level>
|
||||
<onMatch>ACCEPT</onMatch>
|
||||
<onMismatch>DENY</onMismatch>
|
||||
</filter>
|
||||
</appender>
|
||||
|
||||
<!-- 2.2 level为 INFO 日志,时间滚动输出 -->
|
||||
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<!-- 正在记录的日志文档的路径及文档名 -->
|
||||
<file>${log.path}/web_info.log</file>
|
||||
<!--日志文档输出格式-->
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
|
||||
<charset>UTF-8</charset>
|
||||
</encoder>
|
||||
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<!-- 每天日志归档路径以及格式 -->
|
||||
<fileNamePattern>${log.path}/web-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
|
||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
|
||||
<maxFileSize>100MB</maxFileSize>
|
||||
</timeBasedFileNamingAndTriggeringPolicy>
|
||||
<!--日志文档保留天数-->
|
||||
<maxHistory>15</maxHistory>
|
||||
</rollingPolicy>
|
||||
<!-- 此日志文档只记录info级别的 -->
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||
<level>info</level>
|
||||
<onMatch>ACCEPT</onMatch>
|
||||
<onMismatch>DENY</onMismatch>
|
||||
</filter>
|
||||
</appender>
|
||||
|
||||
<!-- 2.3 level为 WARN 日志,时间滚动输出 -->
|
||||
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<!-- 正在记录的日志文档的路径及文档名 -->
|
||||
<file>${log.path}/web_warn.log</file>
|
||||
<!--日志文档输出格式-->
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
|
||||
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
|
||||
</encoder>
|
||||
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<fileNamePattern>${log.path}/web-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
|
||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
|
||||
<maxFileSize>100MB</maxFileSize>
|
||||
</timeBasedFileNamingAndTriggeringPolicy>
|
||||
<!--日志文档保留天数-->
|
||||
<maxHistory>15</maxHistory>
|
||||
</rollingPolicy>
|
||||
<!-- 此日志文档只记录warn级别的 -->
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||
<level>warn</level>
|
||||
<onMatch>ACCEPT</onMatch>
|
||||
<onMismatch>DENY</onMismatch>
|
||||
</filter>
|
||||
</appender>
|
||||
|
||||
<!-- 2.4 level为 ERROR 日志,时间滚动输出 -->
|
||||
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<!-- 正在记录的日志文档的路径及文档名 -->
|
||||
<file>${log.path}/web_error.log</file>
|
||||
<!--日志文档输出格式-->
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
|
||||
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
|
||||
</encoder>
|
||||
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<fileNamePattern>${log.path}/web-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
|
||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
|
||||
<maxFileSize>100MB</maxFileSize>
|
||||
</timeBasedFileNamingAndTriggeringPolicy>
|
||||
<!--日志文档保留天数-->
|
||||
<maxHistory>15</maxHistory>
|
||||
</rollingPolicy>
|
||||
<!-- 此日志文档只记录ERROR级别的 -->
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||
<level>ERROR</level>
|
||||
<onMatch>ACCEPT</onMatch>
|
||||
<onMismatch>DENY</onMismatch>
|
||||
</filter>
|
||||
</appender>
|
||||
|
||||
<!--
|
||||
<logger>用来设置某一个包或者具体的某一个类的日志打印级别、
|
||||
以及指定<appender>。<logger>仅有一个name属性,
|
||||
一个可选的level和一个可选的addtivity属性。
|
||||
name:用来指定受此logger约束的某一个包或者具体的某一个类。
|
||||
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
|
||||
还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
|
||||
如果未设置此属性,那么当前logger将会继承上级的级别。
|
||||
addtivity:是否向上级logger传递打印信息。默认是true。
|
||||
<logger name="org.springframework.web" level="info"/>
|
||||
<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>
|
||||
-->
|
||||
|
||||
<!--
|
||||
使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
|
||||
第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
|
||||
第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:
|
||||
【logging.level.org.mybatis=debug logging.level.dao=debug】
|
||||
-->
|
||||
|
||||
<!--
|
||||
root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
|
||||
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
|
||||
不能设置为INHERITED或者同义词NULL。默认是DEBUG
|
||||
可以包含零个或多个元素,标识这个appender将会添加到这个logger。
|
||||
-->
|
||||
<!--<springProfile name="dev">-->
|
||||
<!--<logger name="logging.level.org.hibernate" level="error"/>-->
|
||||
<!--</springProfile>-->
|
||||
|
||||
<!-- 4. 最终的策略 -->
|
||||
<!-- 4.1 开发环境:打印控制台-->
|
||||
<logger name="vben" level="debug" additivity="false">
|
||||
<appender-ref ref="CONSOLE" />
|
||||
<appender-ref ref="INFO_FILE"/>
|
||||
</logger>
|
||||
|
||||
<root level="warn">
|
||||
<appender-ref ref="CONSOLE" />
|
||||
<appender-ref ref="DEBUG_FILE" />
|
||||
<appender-ref ref="INFO_FILE" />
|
||||
<appender-ref ref="WARN_FILE" />
|
||||
<appender-ref ref="ERROR_FILE" />
|
||||
</root>
|
||||
|
||||
<!--4.2 生产环境:输出到文档-->
|
||||
<!--<logger name="vben" level="info" additivity="true">-->
|
||||
<!--<appender-ref ref="CONSOLE"/>-->
|
||||
<!--<appender-ref ref="INFO_FILE"/>-->
|
||||
<!--</logger>-->
|
||||
|
||||
<!--<root level="warn">-->
|
||||
<!--<appender-ref ref="WARN_FILE" />-->
|
||||
<!--<appender-ref ref="ERROR_FILE" />-->
|
||||
<!--</root>-->
|
||||
|
||||
</configuration>
|
||||
@@ -1,198 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
|
||||
<!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新加载,默认值为true -->
|
||||
<!-- scanPeriod:设置监测配置文档是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。
|
||||
当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
|
||||
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
|
||||
<configuration scan="true" scanPeriod="10 seconds">
|
||||
<contextName>logback</contextName>
|
||||
|
||||
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
|
||||
<property name="log.path" value="/home/vben/logs" />
|
||||
|
||||
<!--0. 日志格式和颜色渲染 -->
|
||||
<!-- 彩色日志依赖的渲染类 -->
|
||||
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
|
||||
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
|
||||
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
|
||||
<!-- 彩色日志格式 -->
|
||||
<!--<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>-->
|
||||
|
||||
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
|
||||
|
||||
<!--1. 输出到控制台-->
|
||||
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
|
||||
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
|
||||
<level>debug</level>
|
||||
</filter>
|
||||
<encoder>
|
||||
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
|
||||
<!-- 设置字符集 -->
|
||||
<!--<charset>UTF-8</charset>-->
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<!--2. 输出到文档-->
|
||||
<!-- 2.1 level为 DEBUG 日志,时间滚动输出 -->
|
||||
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<!-- 正在记录的日志文档的路径及文档名 -->
|
||||
<file>${log.path}/web_debug.log</file>
|
||||
<!--日志文档输出格式-->
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
|
||||
<charset>UTF-8</charset> <!-- 设置字符集 -->
|
||||
</encoder>
|
||||
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<!-- 日志归档 -->
|
||||
<fileNamePattern>${log.path}/web-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
|
||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
|
||||
<maxFileSize>100MB</maxFileSize>
|
||||
</timeBasedFileNamingAndTriggeringPolicy>
|
||||
<!--日志文档保留天数-->
|
||||
<maxHistory>15</maxHistory>
|
||||
</rollingPolicy>
|
||||
<!-- 此日志文档只记录debug级别的 -->
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||
<level>debug</level>
|
||||
<onMatch>ACCEPT</onMatch>
|
||||
<onMismatch>DENY</onMismatch>
|
||||
</filter>
|
||||
</appender>
|
||||
|
||||
<!-- 2.2 level为 INFO 日志,时间滚动输出 -->
|
||||
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<!-- 正在记录的日志文档的路径及文档名 -->
|
||||
<file>${log.path}/web_info.log</file>
|
||||
<!--日志文档输出格式-->
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
|
||||
<charset>UTF-8</charset>
|
||||
</encoder>
|
||||
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<!-- 每天日志归档路径以及格式 -->
|
||||
<fileNamePattern>${log.path}/web-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
|
||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
|
||||
<maxFileSize>100MB</maxFileSize>
|
||||
</timeBasedFileNamingAndTriggeringPolicy>
|
||||
<!--日志文档保留天数-->
|
||||
<maxHistory>15</maxHistory>
|
||||
</rollingPolicy>
|
||||
<!-- 此日志文档只记录info级别的 -->
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||
<level>info</level>
|
||||
<onMatch>ACCEPT</onMatch>
|
||||
<onMismatch>DENY</onMismatch>
|
||||
</filter>
|
||||
</appender>
|
||||
|
||||
<!-- 2.3 level为 WARN 日志,时间滚动输出 -->
|
||||
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<!-- 正在记录的日志文档的路径及文档名 -->
|
||||
<file>${log.path}/web_warn.log</file>
|
||||
<!--日志文档输出格式-->
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
|
||||
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
|
||||
</encoder>
|
||||
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<fileNamePattern>${log.path}/web-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
|
||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
|
||||
<maxFileSize>100MB</maxFileSize>
|
||||
</timeBasedFileNamingAndTriggeringPolicy>
|
||||
<!--日志文档保留天数-->
|
||||
<maxHistory>15</maxHistory>
|
||||
</rollingPolicy>
|
||||
<!-- 此日志文档只记录warn级别的 -->
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||
<level>warn</level>
|
||||
<onMatch>ACCEPT</onMatch>
|
||||
<onMismatch>DENY</onMismatch>
|
||||
</filter>
|
||||
</appender>
|
||||
|
||||
<!-- 2.4 level为 ERROR 日志,时间滚动输出 -->
|
||||
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<!-- 正在记录的日志文档的路径及文档名 -->
|
||||
<file>${log.path}/web_error.log</file>
|
||||
<!--日志文档输出格式-->
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
|
||||
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
|
||||
</encoder>
|
||||
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<fileNamePattern>${log.path}/web-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
|
||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
|
||||
<maxFileSize>100MB</maxFileSize>
|
||||
</timeBasedFileNamingAndTriggeringPolicy>
|
||||
<!--日志文档保留天数-->
|
||||
<maxHistory>15</maxHistory>
|
||||
</rollingPolicy>
|
||||
<!-- 此日志文档只记录ERROR级别的 -->
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||
<level>ERROR</level>
|
||||
<onMatch>ACCEPT</onMatch>
|
||||
<onMismatch>DENY</onMismatch>
|
||||
</filter>
|
||||
</appender>
|
||||
|
||||
<!--
|
||||
<logger>用来设置某一个包或者具体的某一个类的日志打印级别、
|
||||
以及指定<appender>。<logger>仅有一个name属性,
|
||||
一个可选的level和一个可选的addtivity属性。
|
||||
name:用来指定受此logger约束的某一个包或者具体的某一个类。
|
||||
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
|
||||
还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
|
||||
如果未设置此属性,那么当前logger将会继承上级的级别。
|
||||
addtivity:是否向上级logger传递打印信息。默认是true。
|
||||
<logger name="org.springframework.web" level="info"/>
|
||||
<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>
|
||||
-->
|
||||
|
||||
<!--
|
||||
使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
|
||||
第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
|
||||
第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:
|
||||
【logging.level.org.mybatis=debug logging.level.dao=debug】
|
||||
-->
|
||||
|
||||
<!--
|
||||
root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
|
||||
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
|
||||
不能设置为INHERITED或者同义词NULL。默认是DEBUG
|
||||
可以包含零个或多个元素,标识这个appender将会添加到这个logger。
|
||||
-->
|
||||
<!--<springProfile name="dev">-->
|
||||
<!--<logger name="logging.level.org.hibernate" level="error"/>-->
|
||||
<!--</springProfile>-->
|
||||
|
||||
<!-- 4. 最终的策略 -->
|
||||
<!-- 4.1 开发环境:打印控制台-->
|
||||
<!-- <logger name="vben" level="debug" additivity="false">-->
|
||||
<!-- <appender-ref ref="CONSOLE" />-->
|
||||
<!-- <appender-ref ref="INFO_FILE"/>-->
|
||||
<!-- </logger>-->
|
||||
|
||||
<!-- <root level="warn">-->
|
||||
<!-- <appender-ref ref="CONSOLE" />-->
|
||||
<!-- <appender-ref ref="DEBUG_FILE" />-->
|
||||
<!-- <appender-ref ref="INFO_FILE" />-->
|
||||
<!-- <appender-ref ref="WARN_FILE" />-->
|
||||
<!-- <appender-ref ref="ERROR_FILE" />-->
|
||||
<!-- </root>-->
|
||||
|
||||
<!--4.2 生产环境:输出到文档-->
|
||||
<logger name="vben" level="info" additivity="true">
|
||||
<appender-ref ref="INFO_FILE"/>
|
||||
</logger>
|
||||
|
||||
<root level="warn">
|
||||
<appender-ref ref="WARN_FILE" />
|
||||
<appender-ref ref="ERROR_FILE" />
|
||||
</root>
|
||||
|
||||
</configuration>
|
||||
@@ -1,44 +0,0 @@
|
||||
package ${packageName};
|
||||
|
||||
import vben.core.common.mvc.api.R;
|
||||
import vben.core.common.mvc.dao.Sqler;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("${table.name.replace("_","/")}")
|
||||
public class ${table.bunam}Api {
|
||||
|
||||
@GetMapping
|
||||
public R get(String name) {
|
||||
Sqler sqler = new Sqler("${table.name}");
|
||||
sqler.addLike("t.name", name);
|
||||
return R.ok(service.findPageData(sqler));
|
||||
}
|
||||
|
||||
|
||||
@GetMapping("one/{id}")
|
||||
public R getOne(@PathVariable String id) {
|
||||
${table.bunam} main = service.findOne(id);
|
||||
return R.ok(main);
|
||||
}
|
||||
|
||||
@PostMapping
|
||||
public R post(@RequestBody ${table.bunam} main) {
|
||||
return R.ok(service.insert(main));
|
||||
}
|
||||
|
||||
@PutMapping
|
||||
public R put(@RequestBody ${table.bunam} main) {
|
||||
return R.ok(service.update(main));
|
||||
}
|
||||
|
||||
@DeleteMapping("{ids}")
|
||||
public R delete(@PathVariable String[] ids) {
|
||||
return R.ok(service.delete(ids));
|
||||
}
|
||||
|
||||
@Autowired
|
||||
private ${table.bunam}Service service;
|
||||
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
package ${packageName};
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import javax.persistence.*;
|
||||
|
||||
@Entity
|
||||
@Getter
|
||||
@Setter
|
||||
public class $table.bunam extends BaseMainEntity {
|
||||
|
||||
#foreach ($field in $fields)
|
||||
#if($field.type=="string")
|
||||
@Column(length = $field.length)
|
||||
private String $field.name;
|
||||
|
||||
#elseif($field.type=="int")
|
||||
private Integer $field.name;
|
||||
|
||||
#elseif($field.type=="long")
|
||||
private Long $field.name;
|
||||
|
||||
#elseif($field.type=="bool")
|
||||
private Boolean $field.name;
|
||||
|
||||
#elseif($field.type=="date")
|
||||
private Date $field.name;
|
||||
|
||||
#elseif($field.type=="decimal")
|
||||
private BigDecimal $field.name;
|
||||
|
||||
#end
|
||||
#end
|
||||
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
package ${packageName};
|
||||
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
public interface ${table.bunam}Repo extends JpaRepository<${table.bunam},String> {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
package ${packageName};
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import vben.core.common.mvc.service.BaseMainService;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
|
||||
@Service
|
||||
public class ${table.bunam}Service extends BaseMainService<${table.bunam}> {
|
||||
|
||||
@Autowired
|
||||
private ${table.bunam}Repo repo;
|
||||
|
||||
@PostConstruct
|
||||
public void initDao() {
|
||||
super.setRepo(repo);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
path: '/${table.name.replace("_","/")}',
|
||||
name: '${table.bunam}',
|
||||
component: () => import('/@/pages/${table.name.replace("_","/")}/index.vue'),
|
||||
meta:{
|
||||
title: '${table.remark}清单',
|
||||
isLink: '',
|
||||
isHide: false,
|
||||
isKeepAlive: true,
|
||||
isAffix: false,
|
||||
isIframe: false,
|
||||
roles: ['admin'],
|
||||
icon: 'ele-Tickets',
|
||||
},
|
||||
},
|
||||
#if($table.edtyp=="tab")
|
||||
{
|
||||
path: '/${table.name.replace("_","/")}/edit',
|
||||
name: '${table.bunam}Edit',
|
||||
component: () => import('/@/pages/${table.name.replace("_","/")}/edit.vue'),
|
||||
meta: {
|
||||
title: '${table.remark}编辑',
|
||||
isLink: '',
|
||||
isHide: true,
|
||||
isKeepAlive: true,
|
||||
isAffix: false,
|
||||
isIframe: false,
|
||||
roles: ['admin'],
|
||||
icon: 'ele-Tickets',
|
||||
},
|
||||
},
|
||||
#end
|
||||
@@ -1,7 +0,0 @@
|
||||
insert into sys_portal_menu (id,ornum,pid,porid,type,code,icon,path,comp,extag,catag,shtag,iftag,name,crman,avtag)
|
||||
values ('${table.bunam}',999991,null,'sys','M','${table.bunam}','ele-Tickets','/${table.name.replace("_","/")}','/${table.name.replace("_","/")}/index',0,1,1,0,'${table.remark}清单','sa',1);
|
||||
|
||||
#if($table.edtyp=="tab")
|
||||
insert into sys_portal_menu (id,ornum,pid,porid,type,code,icon,path,comp,extag,catag,shtag,iftag,name,crman,avtag)
|
||||
values ('${table.bunam}Edit',999992,null,'sys','M','${table.bunam}Edit','ele-Tickets','/${table.name.replace("_","/")}/edit','/${table.name.replace("_","/")}/edit',0,1,0,0,'${table.remark}编辑','sa',1);
|
||||
#end
|
||||
@@ -1,86 +0,0 @@
|
||||
<template>
|
||||
<el-drawer v-model='state.show' size='70%'>
|
||||
<template #title>
|
||||
<h4>${table.remark}编辑</h4>
|
||||
</template>
|
||||
<template #default>
|
||||
<div style='padding: 20px;border-top: 1px solid #ccc'>
|
||||
<el-form ref='formRef' #if($table.pecol==2)class='xform' :inline="true"#end :model='form' label-width='160px'>
|
||||
<el-form-item label='${table.remark}名称:' prop='name' :rules="[{ required: true, message: '名称不能为空'}]">
|
||||
<el-input v-model='form.name'/>
|
||||
</el-form-item>
|
||||
#foreach ($field in $fields)
|
||||
<el-form-item label='${field.remark}:' prop='${field.name}'>
|
||||
#if($field.type=="bool")
|
||||
<el-switch v-model='form.${field.name}'/>
|
||||
#elseif($field.type=="int")
|
||||
<el-input-number v-model='form.${field.name}' controls-position='right' style='width: 100%'/>
|
||||
#elseif($field.type=="long")
|
||||
<el-input-number v-model='form.${field.name}' controls-position='right' style='width: 100%'/>
|
||||
#elseif($field.type=="date")
|
||||
<el-date-picker v-model='form.${field.name}' type="date" #if($table.pecol==2)style='width: 100%'#end/>
|
||||
#else
|
||||
<el-input v-model='form.${field.name}'/>
|
||||
#end
|
||||
</el-form-item>
|
||||
#end
|
||||
<el-form-item label='备注:' style='width: 100%'>
|
||||
<el-input v-model='form.notes' type='textarea' />
|
||||
</el-form-item>
|
||||
<el-form-item label='排序号:'>
|
||||
<el-input-number v-model='form.ornum' controls-position='right'/>
|
||||
</el-form-item>
|
||||
<el-form-item label='是否启用:'>
|
||||
<el-switch v-model='form.avtag'/>
|
||||
</el-form-item>
|
||||
<el-form-item label='创建人:'>
|
||||
<div class="zinput">{{ form.crman ? form.crman.name : '' }}</div>
|
||||
</el-form-item>
|
||||
<el-form-item label='创建时间:'>
|
||||
<div class="zinput">{{ form.crtim }}</div>
|
||||
</el-form-item>
|
||||
<el-form-item label='更新人:'>
|
||||
<div class="zinput">{{ form.upman ? form.upman.name : '' }}</div>
|
||||
</el-form-item>
|
||||
<el-form-item label='更新时间:'>
|
||||
<div class="zinput">{{ form.uptim }}</div>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
</template>
|
||||
<template #footer>
|
||||
<div style='flex: auto;margin: 20px'>
|
||||
<el-button type='primary' @click='confirm'>确认</el-button>
|
||||
<el-button @click='state.show = false'>取消</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-drawer>
|
||||
</template>
|
||||
|
||||
<script lang='ts' setup>
|
||||
import { reactive, ref, toRefs } from 'vue';
|
||||
import { drawerOpen, drawerSave } from '/@/comps/page/edit';
|
||||
import { FormInstance } from 'element-plus';
|
||||
|
||||
const formRef = ref<FormInstance>();
|
||||
|
||||
const state = reactive({
|
||||
url: '/${table.name.replace("_","/")}', show: false, apis: [] as any,
|
||||
form: { avtag: true } as any,
|
||||
});
|
||||
|
||||
const { form } = toRefs(state);
|
||||
|
||||
//暴露open方法给父组件调用
|
||||
const open = async (data: any) => {
|
||||
await drawerOpen({ state, id: data.id });
|
||||
};
|
||||
defineExpose({ open });
|
||||
|
||||
//取得父组件listQuery方法的调用权
|
||||
const emits = defineEmits(['listQuery']);
|
||||
const confirm = async () => {
|
||||
await drawerSave({ formRef: formRef.value, state });
|
||||
emits('listQuery');
|
||||
};
|
||||
</script>
|
||||
@@ -1,72 +0,0 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-card class='box-card'>
|
||||
<template #header>
|
||||
<div class='zjustify'>
|
||||
<div>
|
||||
<el-input v-model='state.form.name' placeholder='输入名称回车查询' class='list-search' clearable @keyup.enter='listQuery(state)'/>
|
||||
<el-button type='primary' @click='listQuery(state)' plain>查 询</el-button>
|
||||
<el-button class='more-button' :icon='state.moreParams?ArrowUp:ArrowDown' plain @click='state.moreParams=!state.moreParams'/>
|
||||
</div>
|
||||
<div>
|
||||
<el-button type='success' :icon='Plus' @click='editRef.open({})' plain>新增</el-button>
|
||||
<el-button type='danger' :icon='Delete' :disabled='state.multiple' @click='listDelete(state)' plain>删除</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<div v-show='state.moreParams' class='more-params'>
|
||||
<el-form :inline='true' label-width='100px'>
|
||||
<el-form-item label='更多参数1'>
|
||||
<el-input v-model='state.form.xxx' placeholder='更多参数1'/>
|
||||
</el-form-item>
|
||||
<el-form-item label='更多参数2'>
|
||||
<el-input v-model='state.form.yyy' placeholder='更多参数2'/>
|
||||
</el-form-item>
|
||||
<el-form-item/>
|
||||
</el-form>
|
||||
</div>
|
||||
</template>
|
||||
<el-table height='400' :cell-style="{padding:'2px'}" :row-style="{height: '36px'}"
|
||||
v-loading='state.loading' :data='state.list'
|
||||
border stripe @selection-change='listSelect($event,state)'>
|
||||
<el-table-column type='selection' width='55' align='center'/>
|
||||
<el-table-column label='序号' type='index' width='55' align='center'/>
|
||||
<el-table-column label='${table.remark}名称' prop='id' width='160'>
|
||||
<template #default='scope'>
|
||||
<span style='cursor:pointer;color: #3e9ece' @click='editRef.open({id:scope.row.id})'>
|
||||
{{ scope.row.name }}
|
||||
</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label='备注' prop='notes' />
|
||||
<el-table-column label='创建时间' prop='crtim' width='160' />
|
||||
<el-table-column label='更新时间' prop='uptim' width='160' />
|
||||
</el-table>
|
||||
|
||||
<el-pagination
|
||||
@size-change='listQuery(state)' @current-change='listQuery(state)'
|
||||
class='mt8' :pager-count='5' :page-sizes='[10, 20, 30]' background
|
||||
:total='state.total' v-model:current-page='state.form.page'
|
||||
v-model:page-size='state.form.pageSize'
|
||||
layout='total, sizes, prev, pager, next, jumper'
|
||||
/>
|
||||
</el-card>
|
||||
<Dedit ref="editRef" @close="listQuery(state)"/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang='ts' setup>
|
||||
import {Plus, Delete, ArrowDown, ArrowUp} from '@element-plus/icons-vue';
|
||||
import {onMounted, reactive, ref} from 'vue';
|
||||
import {listQuery, listDelete, listSelect} from '/@/comps/page/index';
|
||||
import Dedit from './edit.vue';
|
||||
|
||||
const editRef = ref() as any;
|
||||
const state = reactive({
|
||||
url: '/${table.name.replace("_","/")}', loading: true, ids: [],
|
||||
form: {}, single: true, multiple: true, list: [], total: 0,
|
||||
});
|
||||
|
||||
onMounted(() => {
|
||||
listQuery(state);
|
||||
});
|
||||
</script>
|
||||
@@ -1,76 +0,0 @@
|
||||
<template>
|
||||
<el-dialog v-model='state.show' title='${table.remark}编辑' draggable width='800px'>
|
||||
<el-form ref='formRef' :model='form' #if($table.pecol==2)class='xform' :inline="true"#end label-width='120px'>
|
||||
<el-form-item label='${table.remark}名称:' prop='name' :rules="[{ required: true, message: '名称不能为空'}]">
|
||||
<el-input v-model='form.name'/>
|
||||
</el-form-item>
|
||||
#foreach ($field in $fields)
|
||||
<el-form-item label='${field.remark}:' prop='${field.name}'>
|
||||
#if($field.type=="bool")
|
||||
<el-switch v-model='form.${field.name}'/>
|
||||
#elseif($field.type=="int")
|
||||
<el-input-number v-model='form.${field.name}' controls-position='right' style='width: 100%'/>
|
||||
#elseif($field.type=="long")
|
||||
<el-input-number v-model='form.${field.name}' controls-position='right' style='width: 100%'/>
|
||||
#elseif($field.type=="date")
|
||||
<el-date-picker v-model='form.${field.name}' type="date" #if($table.pecol==2)style='width: 100%'#end/>
|
||||
#else
|
||||
<el-input v-model='form.${field.name}'/>
|
||||
#end
|
||||
</el-form-item>
|
||||
#end
|
||||
<el-form-item label='是否可用:' prop='avtag' style='width: 50%'>
|
||||
<el-switch v-model='form.avtag'>
|
||||
</el-switch>
|
||||
</el-form-item>
|
||||
<el-form-item label='排序号:' prop='ornum' style='width: 50%'>
|
||||
<el-input-number v-model='form.ornum' controls-position='right' style='width: 100%'/>
|
||||
</el-form-item>
|
||||
<el-form-item label='备注:' prop='notes' style='width: 100%'>
|
||||
<el-input v-model='form.notes'></el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<span class='dialog-footer'>
|
||||
<el-button type='primary' @click='handleConfirm'>确 认</el-button>
|
||||
<el-button @click='state.show = false'>取 消</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script lang='ts' setup>
|
||||
import {defineExpose, reactive, ref, toRefs} from 'vue';
|
||||
import {modalSave} from '/@/comps/page/edit';
|
||||
import request from "/@/utils/request";
|
||||
|
||||
const state = reactive({
|
||||
url: '/${table.name.replace("_","/")}', show: false,
|
||||
form: {avtag: true} as any,
|
||||
});
|
||||
|
||||
const {form} = toRefs(state);
|
||||
|
||||
const formRef = ref();
|
||||
const open = async (data: any) => {
|
||||
if (data && data.id) {
|
||||
state.form = await request({
|
||||
url: state.url + '/one/' + data.id,
|
||||
method: 'get',
|
||||
});
|
||||
} else {
|
||||
state.form = {avtag: true};
|
||||
if (formRef.value) {
|
||||
formRef.value.resetFields();
|
||||
}
|
||||
}
|
||||
state.show = true;
|
||||
};
|
||||
defineExpose({open});
|
||||
|
||||
const emits = defineEmits(['close']);
|
||||
const handleConfirm = async () => {
|
||||
await modalSave({formRef: formRef.value, state, iouField: "crtim"});
|
||||
emits('close');
|
||||
};
|
||||
</script>
|
||||
@@ -1,71 +0,0 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-card class='box-card'>
|
||||
<template #header>
|
||||
<div class='zjustify'>
|
||||
<div>
|
||||
<el-input v-model='state.form.name' placeholder='输入名称回车查询' class='list-search' clearable @keyup.enter='listQuery(state)'/>
|
||||
<el-button type='primary' @click='listQuery(state)' plain>查 询</el-button>
|
||||
<el-button class='more-button' :icon='state.moreParams?ArrowUp:ArrowDown' plain @click='state.moreParams=!state.moreParams'/>
|
||||
</div>
|
||||
<div>
|
||||
<el-button type='success' :icon='Plus' @click='editRef.open()' plain>新增</el-button>
|
||||
<el-button type='danger' :icon='Delete' :disabled='state.multiple' @click='listDelete(state)' plain>删除</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<div v-show='state.moreParams' class='more-params'>
|
||||
<el-form :inline='true' label-width='100px'>
|
||||
<el-form-item label='更多参数1'>
|
||||
<el-input v-model='state.form.xxx' placeholder='更多参数1'/>
|
||||
</el-form-item>
|
||||
<el-form-item label='更多参数2'>
|
||||
<el-input v-model='state.form.yyy' placeholder='更多参数2'/>
|
||||
</el-form-item>
|
||||
<el-form-item/>
|
||||
</el-form>
|
||||
</div>
|
||||
</template>
|
||||
<el-table height='400' :cell-style="{padding:'2px'}" :row-style="{height: '36px'}"
|
||||
v-loading='state.loading' :data='state.list'
|
||||
border stripe @selection-change='listSelect($event,state)'>
|
||||
<el-table-column type='selection' width='55' align='center'/>
|
||||
<el-table-column label='序号' type='index' width='55' align='center'/>
|
||||
<el-table-column label='${table.remark}名称' prop='id' width='160'>
|
||||
<template #default='scope'>
|
||||
<span style='cursor:pointer;color: #3e9ece' @click='editRef.open({id:scope.row.id})'>
|
||||
{{ scope.row.name }}
|
||||
</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label='备注' prop='notes' />
|
||||
<el-table-column label='创建时间' prop='crtim' width='160' />
|
||||
<el-table-column label='更新时间' prop='uptim' width='160' />
|
||||
</el-table>
|
||||
<el-pagination
|
||||
@size-change='listQuery(state)' @current-change='listQuery(state)'
|
||||
class='mt8' :pager-count='5' :page-sizes='[10, 20, 30]' background
|
||||
:total='state.total' v-model:current-page='state.form.page'
|
||||
v-model:page-size='state.form.pageSize'
|
||||
layout='total, sizes, prev, pager, next, jumper'
|
||||
/>
|
||||
</el-card>
|
||||
<Pedit ref="editRef" @close="listQuery(state)"/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang='ts' setup>
|
||||
import {Plus, Delete, ArrowDown, ArrowUp} from '@element-plus/icons-vue';
|
||||
import {onMounted, reactive, ref} from 'vue';
|
||||
import {listQuery, listDelete, listSelect} from '/@/comps/page/index';
|
||||
import Pedit from './edit.vue';
|
||||
|
||||
const editRef = ref() as any;
|
||||
const state = reactive({
|
||||
url: '/${table.name.replace("_","/")}', loading: true, ids: [],
|
||||
form: {}, single: true, multiple: true, list: [], total: 0,
|
||||
});
|
||||
|
||||
onMounted(() => {
|
||||
listQuery(state);
|
||||
});
|
||||
</script>
|
||||
@@ -1,88 +0,0 @@
|
||||
<template>
|
||||
<el-card class='box-card' :body-style="{padding:'2px 8px'}" shadow='never'>
|
||||
<template #header>
|
||||
<div class='zjustify'>
|
||||
<div>
|
||||
<div style='line-height: 32px'>${table.remark}编辑</div>
|
||||
</div>
|
||||
<div>
|
||||
<el-button type='success' @click='tabSave({formRef,state,proxy,route})' plain>保 存</el-button>
|
||||
<el-button type='info' @click='tabClose({proxy,route})' plain>关 闭</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<div style='margin-top: 8px;margin-bottom: 8px'>
|
||||
<el-form ref="formRef" :inline="true" class='yform #if($table.pecol==1)yform100#elseif($table.pecol==4)yform25#end' :model='form' label-width='140px'>
|
||||
<el-tabs type='card' v-model='activeName'>
|
||||
<el-tab-pane label='基本信息' name='tab1'>
|
||||
<div class="yform-div">
|
||||
<el-form-item label='${table.remark}名称:' prop='name' :rules="[{ required: true, message: '名称不能为空'}]">
|
||||
<el-input v-model='form.name'/>
|
||||
</el-form-item>
|
||||
#foreach ($field in $fields)
|
||||
<el-form-item label='${field.remark}:' prop='${field.name}'>
|
||||
#if($field.type=="bool")
|
||||
<el-switch v-model='form.${field.name}'/>
|
||||
#elseif($field.type=="int")
|
||||
<el-input-number v-model='form.${field.name}' controls-position='right' #if($table.pecol!=1)style='width: 100%'#end/>
|
||||
#elseif($field.type=="long")
|
||||
<el-input-number v-model='form.${field.name}' controls-position='right' #if($table.pecol!=1)style='width: 100%'#end/>
|
||||
#elseif($field.type=="date")
|
||||
<el-date-picker v-model='form.${field.name}' type="date" #if($table.pecol!=1)style='width: 100%'#end/>
|
||||
#else
|
||||
<el-input v-model='form.${field.name}'/>
|
||||
#end
|
||||
</el-form-item>
|
||||
#end
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label='其他信息' name='tab9'>
|
||||
<div class="yform-div">
|
||||
<el-form-item label='备注:' style="width: 100%">
|
||||
<el-input type='textarea' :rows='4' v-model='form.notes'/>
|
||||
</el-form-item>
|
||||
<el-form-item label='创建人:' style="width: 25%">
|
||||
<div class="zinput">{{ form.crman ? form.crman.name : '' }}</div>
|
||||
</el-form-item>
|
||||
<el-form-item label='创建时间:' style="width: 25%">
|
||||
<div class='zinput'> {{ form.crtim }}</div>
|
||||
</el-form-item>
|
||||
<el-form-item label='更新人:' style="width: 25%">
|
||||
<div class="zinput">{{ form.upman ? form.upman.name : '' }}</div>
|
||||
</el-form-item>
|
||||
<el-form-item label='更新时间:' style="width: 25%">
|
||||
<div class='zinput'> {{ form.uptim }}</div>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</el-form>
|
||||
</div>
|
||||
</el-card>
|
||||
</template>
|
||||
<script lang='ts'>
|
||||
export default {name: '${table.bunam}Edit}'};
|
||||
</script>
|
||||
<script lang='ts' setup>
|
||||
import {getCurrentInstance, onMounted, reactive, ref, toRefs} from 'vue';
|
||||
import {editInit, tabSave, tabClose} from '/@/comps/page/edit';
|
||||
import {useRoute} from 'vue-router';
|
||||
import {FormInstance} from "element-plus";
|
||||
|
||||
const route = useRoute();
|
||||
const formRef = ref<FormInstance>();
|
||||
const {proxy} = getCurrentInstance() as any;
|
||||
const activeName = ref('tab1');
|
||||
|
||||
const state = reactive({
|
||||
url: '/${table.name.replace("_","/")}',
|
||||
params: {path: '', query: ''},
|
||||
form: {avtag: true} as any,
|
||||
});
|
||||
|
||||
const {form} = toRefs(state);
|
||||
|
||||
onMounted(async () => {
|
||||
await editInit({state, route});
|
||||
});
|
||||
</script>
|
||||
@@ -1,70 +0,0 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-card class='box-card'>
|
||||
<template #header>
|
||||
<div class='zjustify'>
|
||||
<div>
|
||||
<el-input v-model='state.form.name' placeholder='输入名称回车查询' class='list-search' clearable @keyup.enter='listQuery(state)' />
|
||||
<el-button type='primary' @click='listQuery(state)' plain>查 询</el-button>
|
||||
<el-button class='more-button' :icon='state.moreParams?ArrowUp:ArrowDown' plain @click='state.moreParams=!state.moreParams' />
|
||||
</div>
|
||||
<div>
|
||||
<el-button type='success' :icon='Plus' @click='tabAdd(state.url)' plain>新增</el-button>
|
||||
<el-button type='danger' :icon='Delete' :disabled='state.multiple' @click='listDelete(state)' plain>删除</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<div v-show='state.moreParams' class='more-params'>
|
||||
<el-form :inline='true' label-width='100px'>
|
||||
<el-form-item label='更多参数1'>
|
||||
<el-input v-model='state.form.xxx' placeholder='更多参数1'/>
|
||||
</el-form-item>
|
||||
<el-form-item label='更多参数2'>
|
||||
<el-input v-model='state.form.yyy' placeholder='更多参数2'/>
|
||||
</el-form-item>
|
||||
<el-form-item/>
|
||||
</el-form>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<el-table height='400' :cell-style="{padding:'2px'}" :row-style="{height: '36px'}"
|
||||
v-loading='state.loading' :data='state.list'
|
||||
border stripe @selection-change='listSelect($event,state)'>
|
||||
<el-table-column type='selection' width='55' align='center' />
|
||||
<el-table-column label='序号' type='index' width='55' align='center' />
|
||||
<el-table-column label='${table.remark}名称' width='180'>
|
||||
<template #default='scope'>
|
||||
<span style='cursor:pointer;color: #3e9ece' @click='tabEdit(state.url,scope.row.id)'>
|
||||
{{ scope.row.name }}
|
||||
</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label='备注' prop='notes' />
|
||||
<el-table-column label='创建时间' prop='crtim' width='160' />
|
||||
<el-table-column label='更新时间' prop='uptim' width='160' />
|
||||
</el-table>
|
||||
|
||||
<el-pagination
|
||||
@size-change='listQuery(state)' @current-change='listQuery(state)'
|
||||
class='mt8' :pager-count='5' :page-sizes='[10, 20, 30]' background
|
||||
:total='state.total' v-model:current-page='state.form.page'
|
||||
v-model:page-size='state.form.pageSize'
|
||||
layout='total, sizes, prev, pager, next, jumper'
|
||||
/>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang='ts' setup>
|
||||
import { Plus, Delete, ArrowDown, ArrowUp } from '@element-plus/icons-vue';
|
||||
import { onMounted, reactive } from 'vue';
|
||||
import { listQuery, listDelete, tabAdd, tabEdit, listSelect } from '/@/comps/page/index';
|
||||
|
||||
const state = reactive({
|
||||
url: '/${table.name.replace("_","/")}', loading: true, ids: [],
|
||||
form: {}, single: true, multiple: true, list: [], total: 0,
|
||||
});
|
||||
|
||||
onMounted(() => {
|
||||
listQuery(state);
|
||||
});
|
||||
</script>
|
||||
@@ -1,359 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<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">
|
||||
<parent>
|
||||
<artifactId>vben</artifactId>
|
||||
<groupId>com.zsvg</groupId>
|
||||
<version>0.1</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>vben-core</artifactId>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>druid-spring-boot-starter</artifactId>
|
||||
<version>1.2.23</version>
|
||||
</dependency>
|
||||
|
||||
<!--测试相关开始-->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.databene</groupId>
|
||||
<artifactId>contiperf</artifactId>
|
||||
<version>2.3.4</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<!--测试相关结束-->
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-configuration-processor</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
|
||||
<!--数据库相关开始-->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- <dependency>-->
|
||||
<!-- <groupId>org.springframework.boot</groupId>-->
|
||||
<!-- <artifactId>spring-boot-starter-data-ldap</artifactId>-->
|
||||
<!-- </dependency>-->
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-redis</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.microsoft.sqlserver</groupId>
|
||||
<artifactId>sqljdbc4</artifactId>
|
||||
<version>4.0</version>
|
||||
</dependency>
|
||||
<!--数据库相关结束-->
|
||||
|
||||
<!--可用DATA注解自动生成get set toString等,idea需要插件支持-->
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!--图片压缩-->
|
||||
<dependency>
|
||||
<groupId>net.coobird</groupId>
|
||||
<artifactId>thumbnailator</artifactId>
|
||||
<version>0.4.8</version>
|
||||
</dependency>
|
||||
|
||||
<!--自动生成API文档开始-->
|
||||
<dependency>
|
||||
<groupId>com.github.xiaoymin</groupId>
|
||||
<artifactId>knife4j-spring-boot-starter</artifactId>
|
||||
<version>3.0.3</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.swagger</groupId>
|
||||
<artifactId>swagger-annotations</artifactId>
|
||||
<version>1.5.22</version>
|
||||
</dependency>
|
||||
<!--自动生成API文档结束-->
|
||||
|
||||
<!-- <dependency>-->
|
||||
<!-- <groupId>org.apache.httpcomponents</groupId>-->
|
||||
<!-- <artifactId>httpclient</artifactId>-->
|
||||
<!-- <version>4.5.12</version>-->
|
||||
<!-- </dependency>-->
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
<version>3.8.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-collections4</artifactId>
|
||||
<version>4.2</version>
|
||||
</dependency>
|
||||
|
||||
<!--AUTH权限相关开始-->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-security</artifactId>
|
||||
</dependency>
|
||||
<!-- <dependency>-->
|
||||
<!-- <groupId>org.springframework.session</groupId>-->
|
||||
<!-- <artifactId>spring-session-data-redis</artifactId>-->
|
||||
<!-- </dependency>-->
|
||||
<!--AUTH权限相关结束-->
|
||||
|
||||
<!--定时调度开始-->
|
||||
<dependency>
|
||||
<groupId>org.quartz-scheduler</groupId>
|
||||
<artifactId>quartz</artifactId>
|
||||
<version>2.3.0</version>
|
||||
</dependency>
|
||||
<!--定时调度结束-->
|
||||
|
||||
<!--消息机制开始-->
|
||||
<dependency>
|
||||
<groupId>javax.mail</groupId>
|
||||
<artifactId>mail</artifactId>
|
||||
<version>1.4.7</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-websocket</artifactId>
|
||||
</dependency>
|
||||
<!--消息机制结束-->
|
||||
|
||||
<!--word,excel处理开始-->
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>easyexcel</artifactId>
|
||||
<version>3.0.5</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<artifactId>cglib</artifactId>
|
||||
<groupId>cglib</groupId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cglib</groupId>
|
||||
<artifactId>cglib</artifactId>
|
||||
<version>3.1</version>
|
||||
</dependency>
|
||||
<!--word,excel处理结束-->
|
||||
|
||||
<!--服务器连接与监控开始-->
|
||||
<dependency>
|
||||
<groupId>ch.ethz.ganymed</groupId>
|
||||
<artifactId>ganymed-ssh2</artifactId>
|
||||
<version>build210</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.jcraft</groupId>
|
||||
<artifactId>jsch</artifactId>
|
||||
<version>0.1.55</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.github.oshi</groupId>
|
||||
<artifactId>oshi-core</artifactId>
|
||||
<version>6.1.6</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.snmp4j</groupId>
|
||||
<artifactId>snmp4j</artifactId>
|
||||
<version>2.6.3</version>
|
||||
</dependency>
|
||||
<!--服务器连接与监控结束-->
|
||||
|
||||
<!--json包开始-->
|
||||
<dependency>
|
||||
<groupId>net.sf.json-lib</groupId>
|
||||
<artifactId>json-lib</artifactId>
|
||||
<version>2.2.3</version>
|
||||
<classifier>jdk15</classifier>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>fastjson</artifactId>
|
||||
<version>1.2.83</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.google.code.gson</groupId>
|
||||
<artifactId>gson</artifactId>
|
||||
<version>2.8.6</version>
|
||||
</dependency>
|
||||
<!--json包结束-->
|
||||
|
||||
<!--二维码-->
|
||||
<dependency>
|
||||
<groupId>com.google.zxing</groupId>
|
||||
<artifactId>core</artifactId>
|
||||
<version>3.4.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.google.zxing</groupId>
|
||||
<artifactId>javase</artifactId>
|
||||
<version>3.4.0</version>
|
||||
</dependency>
|
||||
|
||||
<!--pdf水印-->
|
||||
<dependency>
|
||||
<groupId>com.itextpdf</groupId>
|
||||
<artifactId>itextpdf</artifactId>
|
||||
<version>5.5.9</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.itextpdf</groupId>
|
||||
<artifactId>itext-asian</artifactId>
|
||||
<version>5.2.0</version>
|
||||
</dependency>
|
||||
|
||||
<!--webservice-->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web-services</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-validation</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.cxf</groupId>
|
||||
<artifactId>cxf-rt-frontend-jaxws</artifactId>
|
||||
<version>3.2.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.cxf</groupId>
|
||||
<artifactId>cxf-core</artifactId>
|
||||
<version>3.3.5</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.cxf</groupId>
|
||||
<artifactId>cxf-rt-transports-http</artifactId>
|
||||
<version>3.2.4</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-api</artifactId>
|
||||
<version>0.11.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-impl</artifactId>
|
||||
<version>0.11.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-jackson</artifactId>
|
||||
<version>0.11.1</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>cn.hutool</groupId>
|
||||
<artifactId>hutool-all</artifactId>
|
||||
<version>5.8.35</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.lionsoul</groupId>
|
||||
<artifactId>ip2region</artifactId>
|
||||
<version>1.7.2</version>
|
||||
</dependency>
|
||||
|
||||
<!-- 浏览器客户端识别开始 -->
|
||||
<dependency>
|
||||
<groupId>nl.basjes.parse.useragent</groupId>
|
||||
<artifactId>yauaa</artifactId>
|
||||
<version>5.23</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>eu.bitwalker</groupId>
|
||||
<artifactId>UserAgentUtils</artifactId>
|
||||
<version>1.21</version>
|
||||
</dependency>
|
||||
<!--浏览器客户端识别结束-->
|
||||
|
||||
<!-- io常用工具类 -->
|
||||
<dependency>
|
||||
<groupId>commons-io</groupId>
|
||||
<artifactId>commons-io</artifactId>
|
||||
<version>2.11.0</version>
|
||||
</dependency>
|
||||
|
||||
<!--velocity代码生成使用模板 -->
|
||||
<dependency>
|
||||
<groupId>org.apache.velocity</groupId>
|
||||
<artifactId>velocity-engine-core</artifactId>
|
||||
<version>2.3</version>
|
||||
</dependency>
|
||||
|
||||
<!-- 阿里JSON解析器 -->
|
||||
<dependency>
|
||||
<groupId>com.alibaba.fastjson2</groupId>
|
||||
<artifactId>fastjson2</artifactId>
|
||||
<version>2.0.4</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.baomidou</groupId>
|
||||
<artifactId>mybatis-plus-boot-starter</artifactId>
|
||||
<version>3.4.1</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.jsoup</groupId>
|
||||
<artifactId>jsoup</artifactId>
|
||||
<version>1.14.3</version>
|
||||
</dependency>
|
||||
|
||||
<!--redisson-->
|
||||
<dependency>
|
||||
<groupId>org.redisson</groupId>
|
||||
<artifactId>redisson-spring-boot-starter</artifactId>
|
||||
<version>3.17.4</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.amazonaws</groupId>
|
||||
<artifactId>aws-java-sdk-s3</artifactId>
|
||||
<version>1.12.248</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.dom4j</groupId>
|
||||
<artifactId>dom4j</artifactId>
|
||||
<version>2.1.4</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
@@ -1,77 +0,0 @@
|
||||
package vben.core.common.exception;
|
||||
|
||||
public class BadConfigurationException extends RuntimeException {
|
||||
/**
|
||||
* Constructs a new runtime exception with {@code null} as its
|
||||
* detail message. The cause is not initialized, and may subsequently be
|
||||
* initialized by a call to {@link #initCause}.
|
||||
*/
|
||||
public BadConfigurationException() {
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a new runtime exception with the specified detail message.
|
||||
* The cause is not initialized, and may subsequently be initialized by a
|
||||
* call to {@link #initCause}.
|
||||
*
|
||||
* @param message the detail message. The detail message is saved for
|
||||
* later retrieval by the {@link #getMessage()} method.
|
||||
*/
|
||||
public BadConfigurationException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a new runtime exception with the specified detail message and
|
||||
* cause. <p>Note that the detail message associated with
|
||||
* {@code cause} is <i>not</i> automatically incorporated in
|
||||
* this runtime exception's detail message.
|
||||
*
|
||||
* @param message the detail message (which is saved for later retrieval
|
||||
* by the {@link #getMessage()} method).
|
||||
* @param cause the cause (which is saved for later retrieval by the
|
||||
* {@link #getCause()} method). (A {@code null} value is
|
||||
* permitted, and indicates that the cause is nonexistent or
|
||||
* unknown.)
|
||||
* @since 1.4
|
||||
*/
|
||||
public BadConfigurationException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a new runtime exception with the specified cause and a
|
||||
* detail message of {@code (cause==null ? null : cause.toString())}
|
||||
* (which typically contains the class and detail message of
|
||||
* {@code cause}). This constructor is useful for runtime exceptions
|
||||
* that are little more than wrappers for other throwables.
|
||||
*
|
||||
* @param cause the cause (which is saved for later retrieval by the
|
||||
* {@link #getCause()} method). (A {@code null} value is
|
||||
* permitted, and indicates that the cause is nonexistent or
|
||||
* unknown.)
|
||||
* @since 1.4
|
||||
*/
|
||||
public BadConfigurationException(Throwable cause) {
|
||||
super(cause);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a new runtime exception with the specified detail
|
||||
* message, cause, suppression enabled or disabled, and writable
|
||||
* stack trace enabled or disabled.
|
||||
*
|
||||
* @param message the detail message.
|
||||
* @param cause the cause. (A {@code null} value is permitted,
|
||||
* and indicates that the cause is nonexistent or unknown.)
|
||||
* @param enableSuppression whether or not suppression is enabled
|
||||
* or disabled
|
||||
* @param writableStackTrace whether or not the stack trace should
|
||||
* be writable
|
||||
* @since 1.7
|
||||
*/
|
||||
protected BadConfigurationException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
|
||||
super(message, cause, enableSuppression, writableStackTrace);
|
||||
}
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
package vben.core.common.exception;
|
||||
|
||||
import lombok.Getter;
|
||||
import org.springframework.http.HttpStatus;
|
||||
|
||||
import static org.springframework.http.HttpStatus.BAD_REQUEST;
|
||||
|
||||
@Getter
|
||||
public class BadRequestException extends RuntimeException{
|
||||
|
||||
private Integer status = BAD_REQUEST.value();
|
||||
|
||||
public BadRequestException(String msg){
|
||||
super(msg);
|
||||
}
|
||||
|
||||
public BadRequestException(HttpStatus status, String msg){
|
||||
super(msg);
|
||||
this.status = status.value();
|
||||
}
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
package vben.core.common.exception;
|
||||
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
public class EntityExistException extends RuntimeException {
|
||||
|
||||
public EntityExistException(Class clazz, String field, String val) {
|
||||
super(EntityExistException.generateMessage(clazz.getSimpleName(), field, val));
|
||||
}
|
||||
|
||||
private static String generateMessage(String entity, String field, String val) {
|
||||
return StringUtils.capitalize(entity)
|
||||
+ " with " + field + " "+ val + " existed";
|
||||
}
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
package vben.core.common.exception;
|
||||
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
public class EntityNotFoundException extends RuntimeException {
|
||||
|
||||
public EntityNotFoundException(Class clazz, String field, String val) {
|
||||
super(EntityNotFoundException.generateMessage(clazz.getSimpleName(), field, val));
|
||||
}
|
||||
|
||||
private static String generateMessage(String entity, String field, String val) {
|
||||
return StringUtils.capitalize(entity)
|
||||
+ " with " + field + " "+ val + " does not exist";
|
||||
}
|
||||
}
|
||||
@@ -1,74 +0,0 @@
|
||||
package vben.core.common.exception.base;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.NoArgsConstructor;
|
||||
import vben.core.common.utils.ruoyi.StringUtils;
|
||||
|
||||
/**
|
||||
* 基础异常
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@NoArgsConstructor
|
||||
public class BaseException extends RuntimeException {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 所属模块
|
||||
*/
|
||||
private String module;
|
||||
|
||||
/**
|
||||
* 错误码
|
||||
*/
|
||||
private String code;
|
||||
|
||||
/**
|
||||
* 错误码对应的参数
|
||||
*/
|
||||
private Object[] args;
|
||||
|
||||
/**
|
||||
* 错误消息
|
||||
*/
|
||||
private String defaultMessage;
|
||||
|
||||
public BaseException(String module, String code, Object[] args, String defaultMessage) {
|
||||
this.module = module;
|
||||
this.code = code;
|
||||
this.args = args;
|
||||
this.defaultMessage = defaultMessage;
|
||||
}
|
||||
|
||||
public BaseException(String module, String code, Object[] args) {
|
||||
this(module, code, args, null);
|
||||
}
|
||||
|
||||
public BaseException(String module, String defaultMessage) {
|
||||
this(module, null, null, defaultMessage);
|
||||
}
|
||||
|
||||
public BaseException(String code, Object[] args) {
|
||||
this(null, code, args, null);
|
||||
}
|
||||
|
||||
public BaseException(String defaultMessage) {
|
||||
this(null, null, null, defaultMessage);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMessage() {
|
||||
String message = null;
|
||||
if (!StringUtils.isEmpty(code)) {
|
||||
message = MessageUtils.message(code, args);
|
||||
}
|
||||
if (message == null) {
|
||||
message = defaultMessage;
|
||||
}
|
||||
return message;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
package vben.core.common.exception.base;
|
||||
|
||||
import lombok.AccessLevel;
|
||||
import lombok.NoArgsConstructor;
|
||||
import org.springframework.context.MessageSource;
|
||||
import org.springframework.context.i18n.LocaleContextHolder;
|
||||
import vben.core.common.utils.extra.SpringUtils;
|
||||
|
||||
/**
|
||||
* 获取i18n资源文件
|
||||
*
|
||||
* @author Lion Li
|
||||
*/
|
||||
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public class MessageUtils {
|
||||
|
||||
private static final MessageSource MESSAGE_SOURCE = SpringUtils.getBean(MessageSource.class);
|
||||
|
||||
/**
|
||||
* 根据消息键和参数 获取消息 委托给spring messageSource
|
||||
*
|
||||
* @param code 消息键
|
||||
* @param args 参数
|
||||
* @return 获取国际化翻译值
|
||||
*/
|
||||
public static String message(String code, Object... args) {
|
||||
return MESSAGE_SOURCE.getMessage(code, args, LocaleContextHolder.getLocale());
|
||||
}
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
package vben.core.common.exception.handler;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import lombok.Data;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
class ApiError {
|
||||
|
||||
private Integer code = 500;
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private LocalDateTime timestamp;
|
||||
private String msg;
|
||||
|
||||
private ApiError() {
|
||||
timestamp = LocalDateTime.now();
|
||||
}
|
||||
|
||||
public static ApiError error(String message){
|
||||
ApiError apiError = new ApiError();
|
||||
apiError.setMsg(message);
|
||||
return apiError;
|
||||
}
|
||||
|
||||
public static ApiError error(Integer status, String message){
|
||||
ApiError apiError = new ApiError();
|
||||
apiError.setCode(status);
|
||||
apiError.setMsg(message);
|
||||
return apiError;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
-96
@@ -1,96 +0,0 @@
|
||||
package vben.core.common.exception.handler;
|
||||
|
||||
import vben.core.common.exception.BadRequestException;
|
||||
import vben.core.common.exception.EntityExistException;
|
||||
import vben.core.common.exception.EntityNotFoundException;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.security.authentication.BadCredentialsException;
|
||||
import org.springframework.web.bind.MethodArgumentNotValidException;
|
||||
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||
import org.springframework.web.bind.annotation.RestControllerAdvice;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
import static org.springframework.http.HttpStatus.NOT_FOUND;
|
||||
|
||||
@Slf4j
|
||||
@RestControllerAdvice
|
||||
public class GlobalExceptionHandler {
|
||||
|
||||
/**
|
||||
* 处理所有不可知的异常
|
||||
*/
|
||||
@ExceptionHandler(Throwable.class)
|
||||
public ResponseEntity<ApiError> handleException(Throwable e){
|
||||
System.out.println("处理所有不可知的异常");
|
||||
// 打印堆栈信息
|
||||
log.error(ThrowableUtil.getStackTrace(e));
|
||||
return buildResponseEntity(ApiError.error(e.getMessage()));
|
||||
}
|
||||
|
||||
/**
|
||||
* BadCredentialsException
|
||||
*/
|
||||
@ExceptionHandler(BadCredentialsException.class)
|
||||
public ResponseEntity<ApiError> badCredentialsException(BadCredentialsException e){
|
||||
// 打印堆栈信息
|
||||
String message = "坏的凭证".equals(e.getMessage()) ? "用户名或密码不正确" : e.getMessage();
|
||||
log.error(message);
|
||||
return buildResponseEntity(ApiError.error(message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理自定义异常
|
||||
*/
|
||||
@ExceptionHandler(value = BadRequestException.class)
|
||||
public ResponseEntity<ApiError> badRequestException(BadRequestException e) {
|
||||
// 打印堆栈信息
|
||||
log.error(ThrowableUtil.getStackTrace(e));
|
||||
return buildResponseEntity(ApiError.error(e.getStatus(),e.getMessage()));
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理 EntityExist
|
||||
*/
|
||||
@ExceptionHandler(value = EntityExistException.class)
|
||||
public ResponseEntity<ApiError> entityExistException(EntityExistException e) {
|
||||
// 打印堆栈信息
|
||||
log.error(ThrowableUtil.getStackTrace(e));
|
||||
return buildResponseEntity(ApiError.error(e.getMessage()));
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理 EntityNotFound
|
||||
*/
|
||||
@ExceptionHandler(value = EntityNotFoundException.class)
|
||||
public ResponseEntity<ApiError> entityNotFoundException(EntityNotFoundException e) {
|
||||
// 打印堆栈信息
|
||||
log.error(ThrowableUtil.getStackTrace(e));
|
||||
return buildResponseEntity(ApiError.error(NOT_FOUND.value(),e.getMessage()));
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理所有接口数据验证异常
|
||||
*/
|
||||
@ExceptionHandler(MethodArgumentNotValidException.class)
|
||||
public ResponseEntity<ApiError> handleMethodArgumentNotValidException(MethodArgumentNotValidException e){
|
||||
// 打印堆栈信息
|
||||
log.error(ThrowableUtil.getStackTrace(e));
|
||||
String[] str = Objects.requireNonNull(e.getBindingResult().getAllErrors().get(0).getCodes())[1].split("\\.");
|
||||
String message = e.getBindingResult().getAllErrors().get(0).getDefaultMessage();
|
||||
String msg = "不能为空";
|
||||
if(msg.equals(message)){
|
||||
message = str[1] + ":" + message;
|
||||
}
|
||||
return buildResponseEntity(ApiError.error(message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 统一返回
|
||||
*/
|
||||
private ResponseEntity<ApiError> buildResponseEntity(ApiError apiError) {
|
||||
return new ResponseEntity<>(apiError, HttpStatus.valueOf(200));
|
||||
}
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
package vben.core.common.exception.handler;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
|
||||
public class ThrowableUtil {
|
||||
|
||||
/**
|
||||
* 获取堆栈信息
|
||||
*/
|
||||
public static String getStackTrace(Throwable throwable){
|
||||
StringWriter sw = new StringWriter();
|
||||
try (PrintWriter pw = new PrintWriter(sw)) {
|
||||
throwable.printStackTrace(pw);
|
||||
return sw.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
package vben.core.common.mvc.api;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
//分页数据返回用VO
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class PageData {
|
||||
|
||||
private Integer total;
|
||||
|
||||
private List<Map<String, Object>> items;
|
||||
|
||||
}
|
||||
@@ -1,72 +0,0 @@
|
||||
package vben.core.common.mvc.api;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
||||
//Rest Result结果返回
|
||||
public class R extends HashMap<String, Object> {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public static final String CODE_TAG = "code";
|
||||
|
||||
// public static final String MSG_TAG = "message";
|
||||
public static final String MSG_TAG = "msg";
|
||||
|
||||
// public static final String DATA_TAG = "result";
|
||||
public static final String DATA_TAG = "data";
|
||||
|
||||
public R() {
|
||||
|
||||
}
|
||||
|
||||
public R(int code, String msg) {
|
||||
super.put(CODE_TAG, code);
|
||||
super.put(MSG_TAG, msg);
|
||||
}
|
||||
|
||||
public R(int code, String msg, Object data) {
|
||||
super.put(CODE_TAG, code);
|
||||
super.put(MSG_TAG, msg);
|
||||
super.put(DATA_TAG, data);
|
||||
}
|
||||
|
||||
public R put(String key, Object value) {
|
||||
super.put(key, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public static R ok() {
|
||||
return R.ok("操作成功");
|
||||
}
|
||||
|
||||
public static R ok(Object data) {
|
||||
return R.ok("操作成功", data);
|
||||
}
|
||||
|
||||
public static R empty() {
|
||||
return R.ok("操作成功", new ArrayList<>());
|
||||
}
|
||||
|
||||
// public static R ok(String msg, Object data) {
|
||||
// return new R(0, msg, data);
|
||||
// }
|
||||
public static R ok(String msg, Object data) {
|
||||
return new R(200, msg, data);
|
||||
}
|
||||
|
||||
public static R error(Object data) {
|
||||
return R.error("操作失败", data);
|
||||
}
|
||||
|
||||
public static R error(String msg, Object data) {
|
||||
return new R(500, msg, data);
|
||||
}
|
||||
|
||||
public static R build(int code, String msg) {
|
||||
return new R(code, msg, null);
|
||||
}
|
||||
|
||||
public static R build(int code, String msg, Object data) {
|
||||
return new R(code, msg, data);
|
||||
}
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
package vben.core.common.mvc.dao;
|
||||
|
||||
import java.sql.SQLException;
|
||||
|
||||
|
||||
//增删改SqlHelper的基类 为多个增删改时提供方便的统一处理
|
||||
public abstract class BaseSqler {
|
||||
|
||||
public abstract String getSql() throws SQLException;
|
||||
|
||||
public abstract Object[] getParams();
|
||||
|
||||
}
|
||||
@@ -1,170 +0,0 @@
|
||||
package vben.core.common.mvc.dao;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.redis.core.RedisTemplate;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
//缓存Dao
|
||||
@Component
|
||||
public class CacheDao<T> {
|
||||
|
||||
private RedisTemplate<String, T> redisTemplate;
|
||||
|
||||
@Autowired
|
||||
public CacheDao(RedisTemplate<String, T> redisTemplate) {
|
||||
this.redisTemplate = redisTemplate;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 普通缓存获取
|
||||
*
|
||||
* @param key 键
|
||||
* @return 值
|
||||
*/
|
||||
public T getCache(String key) {
|
||||
return key == null ? null : redisTemplate.opsForValue().get(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* 普通缓存放入
|
||||
*
|
||||
* @param key 键
|
||||
* @param value 值
|
||||
* @return true成功 false失败
|
||||
*/
|
||||
public boolean setCache(String key, T value) {
|
||||
try {
|
||||
redisTemplate.opsForValue().set(key, value);
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 普通缓存放入并设置时间
|
||||
*
|
||||
* @param key 键
|
||||
* @param value 值
|
||||
* @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
|
||||
* @return true成功 false 失败
|
||||
*/
|
||||
public boolean setCache(String key, T value, long time) {
|
||||
try {
|
||||
if (time > 0) {
|
||||
redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
|
||||
} else {
|
||||
setCache(key, value);
|
||||
}
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* HashGet
|
||||
*
|
||||
* @param key 键 不能为null
|
||||
* @param item 项 不能为null
|
||||
* @return 值
|
||||
*/
|
||||
public Object getHashCache(String key, String item) {
|
||||
return redisTemplate.opsForHash().get(key, item);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取hashKey对应的所有键值
|
||||
*
|
||||
* @param key 键
|
||||
* @return 对应的多个键值
|
||||
*/
|
||||
public Map<Object, Object> getHashCache(String key) {
|
||||
return redisTemplate.opsForHash().entries(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* HashSet
|
||||
*
|
||||
* @param key 键
|
||||
* @param map 对应多个键值
|
||||
* @return true 成功 false 失败
|
||||
*/
|
||||
public boolean setHashCache(String key, Map<String, T> map) {
|
||||
try {
|
||||
redisTemplate.opsForHash().putAll(key, map);
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// /**
|
||||
// * HashSet 并设置时间
|
||||
// *
|
||||
// * @param key 键
|
||||
// * @param map 对应多个键值
|
||||
// * @param time 时间(秒)
|
||||
// * @return true成功 false失败
|
||||
// */
|
||||
// public boolean setHashCache(String key, Map<String, T> map, long time) {
|
||||
// try {
|
||||
// redisTemplate.opsForHash().putAll(key, map);
|
||||
// if (time > 0) {
|
||||
// setExpireTime(key, time);
|
||||
// }
|
||||
// return true;
|
||||
// } catch (Exception e) {
|
||||
// e.printStackTrace();
|
||||
// return false;
|
||||
// }
|
||||
// }
|
||||
|
||||
/**
|
||||
* 向一张hash表中放入数据,如果不存在将创建
|
||||
*
|
||||
* @param key 键
|
||||
* @param item 项
|
||||
* @param value 值
|
||||
* @return true 成功 false失败
|
||||
*/
|
||||
public boolean setHashCache(String key, String item, T value) {
|
||||
try {
|
||||
redisTemplate.opsForHash().put(key, item, value);
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// /**
|
||||
// * 向一张hash表中放入数据,如果不存在将创建
|
||||
// *
|
||||
// * @param key 键
|
||||
// * @param hashKey 项
|
||||
// * @param value 值
|
||||
// * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间
|
||||
// * @return true 成功 false失败
|
||||
// */
|
||||
// public boolean setHashCache(String key, String hashKey, T value, long time) {
|
||||
// try {
|
||||
// redisTemplate.opsForHash().put(key, hashKey, value);
|
||||
// if (time > 0) {
|
||||
// setExpireTime(key, time);
|
||||
// }
|
||||
// return true;
|
||||
// } catch (Exception e) {
|
||||
// e.printStackTrace();
|
||||
// return false;
|
||||
// }
|
||||
// }
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
package vben.core.common.mvc.dao;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
//删除用的SqlHelper 配合JdbcTemplate使用
|
||||
public class Dsqler extends BaseSqler{
|
||||
private String deleteClause = "";
|
||||
private String whereClause = "";
|
||||
private List<Object> whereParameters = new ArrayList<Object>();
|
||||
|
||||
|
||||
public Dsqler(String table)
|
||||
{
|
||||
this.deleteClause = "DELETE FROM " + table + " ";
|
||||
}
|
||||
|
||||
|
||||
public Dsqler addWhere(String condition, Object... params)
|
||||
{
|
||||
if (whereClause.length() == 0)
|
||||
{
|
||||
whereClause = " WHERE " + condition;
|
||||
} else
|
||||
{
|
||||
whereClause += " AND " + condition;
|
||||
}
|
||||
if (params != null && params.length > 0)
|
||||
{
|
||||
for (Object obj : params)
|
||||
{
|
||||
whereParameters.add(obj);
|
||||
}
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public String getSql() throws SQLException {
|
||||
if("".equals(whereClause)){
|
||||
throw new SQLException("为防止误删,delete 语句必须要有where条件");
|
||||
}
|
||||
return deleteClause + whereClause;
|
||||
}
|
||||
|
||||
public Object[] getParams()
|
||||
{
|
||||
return whereParameters.toArray();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -1,63 +0,0 @@
|
||||
package vben.core.common.mvc.dao;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
//插入用的SqlHelper 配合JdbcTemplate使用
|
||||
public class Isqler extends BaseSqler
|
||||
{
|
||||
private String insertClause = "";
|
||||
private String keyClause = "";
|
||||
private String valueClause = "";
|
||||
private List<Object> parameters = new ArrayList<Object>();
|
||||
|
||||
public Isqler(String table)
|
||||
{
|
||||
this.insertClause = "INSERT INTO " + table;
|
||||
}
|
||||
|
||||
public Isqler add(String key, Object value)
|
||||
{
|
||||
if ("true".equals(value))
|
||||
{
|
||||
keyClause += key + ",";
|
||||
valueClause += "?,";
|
||||
parameters.add(true);
|
||||
} else if ("false".equals(value))
|
||||
{
|
||||
keyClause += key + ",";
|
||||
valueClause += "?,";
|
||||
parameters.add(false);
|
||||
} else
|
||||
{
|
||||
keyClause += key + ",";
|
||||
valueClause += "?,";
|
||||
parameters.add(value);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public String getSql()
|
||||
{
|
||||
return insertClause + "(" + keyClause.substring(0, keyClause.length() - 1) + ")" + " VALUES(" + valueClause.substring(0, valueClause.length() - 1) + ")";
|
||||
}
|
||||
|
||||
public Object[] getParams()
|
||||
{
|
||||
return parameters.toArray();
|
||||
}
|
||||
|
||||
public void testParams()
|
||||
{
|
||||
for (int i = 0; i < parameters.size(); i++)
|
||||
{
|
||||
if (i == parameters.size() - 1)
|
||||
{
|
||||
System.out.println(parameters.get(i) + ";");
|
||||
} else
|
||||
{
|
||||
System.out.print(parameters.get(i) + ",");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,217 +0,0 @@
|
||||
package vben.core.common.mvc.dao;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import org.springframework.jdbc.core.BeanPropertyRowMapper;
|
||||
import vben.core.common.utils.db.DbType;
|
||||
import vben.core.module.sys.org.root.SysOrg;
|
||||
import vben.core.common.mvc.api.PageData;
|
||||
import vben.core.common.mvc.pojo.ZidName;
|
||||
import vben.core.common.mvc.pojo.Ztree;
|
||||
import vben.core.common.utils.lang.TreeUtils;
|
||||
import vben.core.common.utils.web.XreqUtil;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.jdbc.core.JdbcTemplate;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Component
|
||||
public class JdbcDao {
|
||||
|
||||
@Value("${spring.datasource.primary.dbType}")
|
||||
private String DB_TYPE;
|
||||
|
||||
public PageData findPageData(Sqler sqler) {
|
||||
XreqUtil.setPageParam(sqler);
|
||||
Integer count = jdbcTemplate.queryForObject(sqler.getSizeSql(), sqler.getParams(), Integer.class);
|
||||
if (count == null || count == 0) {
|
||||
return new PageData(0, new ArrayList<>());
|
||||
}
|
||||
List<Map<String, Object>> list;
|
||||
if (DbType.MYSQL.equals(DB_TYPE)) {
|
||||
list = jdbcTemplate.queryForList(sqler.getMysqlPagingSql(), sqler.getParams());
|
||||
} else if (DbType.ORACLE.equals(DB_TYPE)) {
|
||||
list = jdbcTemplate.queryForList(sqler.getOraclePagingLowerCaseSql(), sqler.getParams());
|
||||
} else if (DbType.SQL_SERVER.equals(DB_TYPE)) {
|
||||
System.out.println(sqler.getSqlserverPagingSql());
|
||||
list = jdbcTemplate.queryForList(sqler.getSqlserverPagingSql(), sqler.getParams());
|
||||
} else {
|
||||
System.err.println("目前只支持mysql,oracle与sqlserver");
|
||||
list = new ArrayList<>();
|
||||
}
|
||||
return new PageData(count, list);
|
||||
}
|
||||
|
||||
public List<Map<String, Object>> findPageMapList(Sqler sqler) {
|
||||
Integer count = jdbcTemplate.queryForObject(sqler.getSizeSql(), sqler.getParams(), Integer.class);
|
||||
if (count == null || count == 0) {
|
||||
return null;
|
||||
}
|
||||
List<Map<String, Object>> list;
|
||||
if (DbType.MYSQL.equals(DB_TYPE)) {
|
||||
list = jdbcTemplate.queryForList(sqler.getMysqlPagingSql(), sqler.getParams());
|
||||
} else if (DbType.ORACLE.equals(DB_TYPE)) {
|
||||
list = jdbcTemplate.queryForList(sqler.getOraclePagingLowerCaseSql(), sqler.getParams());
|
||||
} else if (DbType.SQL_SERVER.equals(DB_TYPE)) {
|
||||
System.out.println(sqler.getSqlserverPagingSql());
|
||||
list = jdbcTemplate.queryForList(sqler.getSqlserverPagingSql(), sqler.getParams());
|
||||
} else {
|
||||
System.err.println("目前只支持mysql,oracle与sqlserver");
|
||||
list = new ArrayList<>();
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
public List<Ztree> findTreeList(String sql, Object... args) {
|
||||
List<Ztree> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Ztree.class));
|
||||
return TreeUtils.build(list);
|
||||
}
|
||||
|
||||
public List<Ztree> findTreeList(Sqler sqler) {
|
||||
List<Ztree> list = jdbcTemplate.query(sqler.getSql(), sqler.getParams(), (rs, rowNum) -> {
|
||||
Ztree ztree = new Ztree();
|
||||
ztree.setId(rs.getString("id"));
|
||||
ztree.setName(rs.getString("name"));
|
||||
ztree.setPid(rs.getString("pid"));
|
||||
return ztree;
|
||||
});
|
||||
return TreeUtils.build(list);
|
||||
}
|
||||
|
||||
public List<ZidName> findIdNameList(String sql, Object... args) {
|
||||
return jdbcTemplate.query(sql, args, (rs, rowNum) -> {
|
||||
ZidName ztwo = new ZidName();
|
||||
ztwo.setId(rs.getString("id"));
|
||||
ztwo.setName(rs.getString("name"));
|
||||
return ztwo;
|
||||
});
|
||||
}
|
||||
|
||||
public List<ZidName> getIdNameListByTable(String table, String name) {
|
||||
String sql = "select id,name from " + table + " where avtag = 1";
|
||||
if (StrUtil.isBlank(name)) {
|
||||
return findIdNameList(sql);
|
||||
} else {
|
||||
return jdbcTemplate.query(sql + " and name like ?", new Object[]{"%" + name + "%"}, (rs, rowNum) -> {
|
||||
ZidName ztwo = new ZidName();
|
||||
ztwo.setId(rs.getString("id"));
|
||||
ztwo.setName(rs.getString("name"));
|
||||
return ztwo;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public List<ZidName> findIdNameList(Sqler sqler) {
|
||||
return findIdNameList((sqler.getSql()), sqler.getParams());
|
||||
}
|
||||
|
||||
public List<SysOrg> findOrgList(String sql, Object... args) {
|
||||
return jdbcTemplate.query(sql, args, (rs, rowNum) -> {
|
||||
SysOrg sysOrg = new SysOrg();
|
||||
sysOrg.setId(rs.getString("id"));
|
||||
sysOrg.setName(rs.getString("name"));
|
||||
return sysOrg;
|
||||
});
|
||||
}
|
||||
|
||||
public List<String> findStringList(String sql, Object... args) {
|
||||
return jdbcTemplate.query(sql, args, (rs, rowNum) -> rs.getString("id"));
|
||||
}
|
||||
|
||||
public List<String> findStringList(Sqler sqler) {
|
||||
return jdbcTemplate.query(sqler.getSql(), sqler.getParams(), (rs, rowNum) -> rs.getString("id"));
|
||||
}
|
||||
|
||||
public Integer findSize(Sqler sqler) {
|
||||
return jdbcTemplate.queryForObject(sqler.getSizeSql(), sqler.getParams(), Integer.class);
|
||||
}
|
||||
|
||||
public String findOneString(String sql, Object... args) {
|
||||
String str = null;
|
||||
try {
|
||||
str = jdbcTemplate.queryForObject(sql, args, String.class);
|
||||
} catch (Exception ignored) {
|
||||
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
public String findOneString(Sqler sqler) {
|
||||
return findOneString(sqler.getSql(), sqler.getParams());
|
||||
}
|
||||
|
||||
public Map<String, Object> findMap(Sqler sqler) {
|
||||
List<Map<String, Object>> list = jdbcTemplate.queryForList(sqler.getSql(), sqler.getParams());
|
||||
if (list.size() > 0) {
|
||||
return list.get(0);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
// return jdbcTemplate.queryForMap(sqler.getSql(), sqler.getParams());
|
||||
}
|
||||
|
||||
public Map<String, Object> findMap(String sql, Object... args) {
|
||||
List<Map<String, Object>> list = jdbcTemplate.queryForList(sql, args);
|
||||
if (list.size()==0) {
|
||||
return null;
|
||||
} else {
|
||||
return list.get(0);
|
||||
}
|
||||
}
|
||||
|
||||
public List<Map<String, Object>> findMapList(Sqler sqler) {
|
||||
if (DbType.ORACLE.equals(DB_TYPE)) {
|
||||
return jdbcTemplate.queryForList(sqler.getLowerCaseSql(), sqler.getParams());
|
||||
} else{
|
||||
return jdbcTemplate.queryForList(sqler.getSql(), sqler.getParams());
|
||||
}
|
||||
}
|
||||
|
||||
public List<Map<String, Object>> findMapList(String sql, Object... args) {
|
||||
return jdbcTemplate.queryForList(sql, args);
|
||||
}
|
||||
|
||||
|
||||
public String findOneName(String table, String id) {
|
||||
if (StrUtil.isBlank(id)) {
|
||||
return null;
|
||||
} else {
|
||||
return jdbcTemplate.queryForObject("select name from " + table + " where id = ?", new Object[]{id}, String.class);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//queryForObject 如果返回没结果会报错
|
||||
|
||||
|
||||
//增删改----------------------------------------------------------------------------------
|
||||
public int update(String sql, Object... args) {
|
||||
return jdbcTemplate.update(sql, args);
|
||||
}
|
||||
|
||||
public int update(BaseSqler sqler) throws SQLException {
|
||||
return jdbcTemplate.update(sqler.getSql(), sqler.getParams());
|
||||
}
|
||||
|
||||
public int[] batch(String sql, List<java.lang.Object[]> list) {
|
||||
return jdbcTemplate.batchUpdate(sql, list);
|
||||
}
|
||||
|
||||
public String getDbType() {
|
||||
return DB_TYPE;
|
||||
}
|
||||
|
||||
public JdbcTemplate getTp() {
|
||||
// jdbcDao.getTp().query(sql, new Object[]{}, new BeanPropertyRowMapper<>(Qmarg.class));
|
||||
return jdbcTemplate;
|
||||
}
|
||||
|
||||
@Resource
|
||||
private JdbcTemplate jdbcTemplate;
|
||||
}
|
||||
@@ -1,487 +0,0 @@
|
||||
package vben.core.common.mvc.dao;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import vben.core.common.utils.db.DbType;
|
||||
import vben.core.framework.security.pojo.Zuser;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
//查询用的SqlHelper 配合JdbcTemplate使用
|
||||
public class Sqler
|
||||
{
|
||||
private String fromClause = "";
|
||||
private String whereClause = "";
|
||||
private String orderClause = "";
|
||||
private String selectClause = "";
|
||||
private String groupClause = "";
|
||||
private Integer panum = 1;
|
||||
private Integer pasiz = 10;
|
||||
private int autoType=1;
|
||||
private List<Object> parameters = new ArrayList<>(); // 参数清单
|
||||
|
||||
public Sqler()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public Sqler(String table, Integer panum, Integer pasiz)
|
||||
{
|
||||
this.selectClause = "SELECT t.id,t.name";
|
||||
this.fromClause = " FROM " + table+" t";
|
||||
if (panum != null)
|
||||
{
|
||||
this.panum = panum;
|
||||
}
|
||||
if (pasiz != null)
|
||||
{
|
||||
this.pasiz = pasiz;
|
||||
}
|
||||
}
|
||||
|
||||
public Sqler(String fields, String table, Integer panum, Integer pasiz)
|
||||
{
|
||||
this.selectClause = "SELECT " + fields;
|
||||
this.fromClause = " FROM " + table+" t";
|
||||
if (panum != null)
|
||||
{
|
||||
this.panum = panum;
|
||||
}
|
||||
if (pasiz != null)
|
||||
{
|
||||
this.pasiz = pasiz;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public Sqler(String table)
|
||||
{
|
||||
this.selectClause = "SELECT t.id,t.name";
|
||||
this.fromClause = " FROM " + table+" t";
|
||||
}
|
||||
|
||||
public Sqler(String fields, String table)
|
||||
{
|
||||
this.selectClause = "SELECT " + fields;
|
||||
this.fromClause = " FROM " + table+" t";
|
||||
}
|
||||
|
||||
public void addSelect(String fields)
|
||||
{
|
||||
selectClause += "," + fields;
|
||||
}
|
||||
|
||||
public Sqler addInnerJoin(String fields, String table, String condition)
|
||||
{
|
||||
if (!fields.equals(""))
|
||||
{
|
||||
selectClause += "," + fields;
|
||||
}
|
||||
fromClause += " INNER JOIN " + table + " ON " + condition;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Sqler addLeftJoin(String fields, String table, String condition)
|
||||
{
|
||||
if (!fields.equals(""))
|
||||
{
|
||||
selectClause += "," + fields;
|
||||
}
|
||||
fromClause += " Left JOIN " + table + " ON " + condition;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Sqler addWhere(String condition, Object... params)
|
||||
{
|
||||
if (whereClause.length() == 0)
|
||||
{
|
||||
whereClause = " WHERE " + condition;
|
||||
} else
|
||||
{
|
||||
whereClause += " AND " + condition;
|
||||
}
|
||||
if (params != null && params.length > 0)
|
||||
{
|
||||
for (Object obj : params)
|
||||
{
|
||||
parameters.add(obj);
|
||||
}
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public Sqler addWhere(boolean append, String condition, Object... params)
|
||||
{
|
||||
if (append)
|
||||
{
|
||||
addWhere(condition, params);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public Sqler addEqual(String name, String value)
|
||||
{
|
||||
if (StrUtil.isNotBlank(value))
|
||||
{
|
||||
if (whereClause.length() == 0)
|
||||
{
|
||||
whereClause = " WHERE " + name + " = ?";
|
||||
} else
|
||||
{
|
||||
whereClause += " AND " + name + " = ?";
|
||||
}
|
||||
parameters.add(value);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public Sqler addLike(String name, String value)
|
||||
{
|
||||
if (StrUtil.isNotBlank(value))
|
||||
{
|
||||
if (whereClause.length() == 0)
|
||||
{
|
||||
whereClause = " WHERE " + name + " like ?";
|
||||
} else
|
||||
{
|
||||
whereClause += " AND " + name + " like ?";
|
||||
}
|
||||
parameters.add("%"+value.trim()+"%");
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public Sqler addGtStringDate(String name, String value)
|
||||
{
|
||||
if (StrUtil.isNotBlank(value))
|
||||
{
|
||||
if (whereClause.length() == 0)
|
||||
{
|
||||
whereClause = " WHERE " + name + ">=?";
|
||||
} else
|
||||
{
|
||||
whereClause += " AND " + name + ">=?";
|
||||
}
|
||||
parameters.add(value);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public Sqler addGtDate(String name, String value, String dbType)
|
||||
{
|
||||
if(DbType.ORACLE.equals(dbType)){
|
||||
if (StrUtil.isNotBlank(value))
|
||||
{
|
||||
if (whereClause.length() == 0)
|
||||
{
|
||||
whereClause = " WHERE " + name + ">=to_date(?,'yyyy-MM-dd')";
|
||||
} else
|
||||
{
|
||||
whereClause += " AND " + name + ">=to_date(?,'yyyy-MM-dd')";
|
||||
}
|
||||
parameters.add(value);
|
||||
}
|
||||
}else if(DbType.MYSQL.equals(dbType)){
|
||||
if (StrUtil.isNotBlank(value))
|
||||
{
|
||||
if (whereClause.length() == 0)
|
||||
{
|
||||
whereClause = " WHERE unix_timestamp(" + name + ") >=unix_timestamp(?)";
|
||||
} else
|
||||
{
|
||||
whereClause += " AND unix_timestamp(" + name + ") >=unix_timestamp(?)";
|
||||
}
|
||||
parameters.add(value);
|
||||
}
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public Sqler addLtDate(String name, String value, String dbType)
|
||||
{
|
||||
if(DbType.ORACLE.equals(dbType)) {
|
||||
if (StrUtil.isNotBlank(value)) {
|
||||
if (whereClause.length() == 0) {
|
||||
whereClause = " WHERE " + name + "<to_date(?,'yyyy-MM-dd')+1";
|
||||
} else {
|
||||
whereClause += " AND " + name + "<to_date(?,'yyyy-MM-dd')+1";
|
||||
}
|
||||
parameters.add(value);
|
||||
}
|
||||
}else{
|
||||
if (StrUtil.isNotBlank(value)) {
|
||||
if (whereClause.length() == 0) {
|
||||
whereClause = " WHERE unix_timestamp(" + name + ") <=unix_timestamp(?)";
|
||||
} else {
|
||||
whereClause += " AND unix_timestamp(" + name + ") <=unix_timestamp(?)";
|
||||
}
|
||||
parameters.add(value+" 23:59:59");
|
||||
}
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public Sqler addLtStringDate(String name, String value)
|
||||
{
|
||||
if (StrUtil.isNotBlank(value))
|
||||
{
|
||||
if (whereClause.length() == 0)
|
||||
{
|
||||
whereClause = " WHERE " + name + "<=?";
|
||||
} else
|
||||
{
|
||||
whereClause += " AND " + name + "<=?";
|
||||
}
|
||||
parameters.add(value);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public Sqler addOrder(String propertyName)
|
||||
{
|
||||
if (orderClause.length() == 0)
|
||||
{
|
||||
orderClause = " ORDER BY " + propertyName;
|
||||
} else
|
||||
{
|
||||
orderClause += ", " + propertyName;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public Sqler addDescOrder(String propertyName)
|
||||
{
|
||||
if (orderClause.length() == 0)
|
||||
{
|
||||
orderClause = " ORDER BY " + propertyName + " DESC";
|
||||
} else
|
||||
{
|
||||
orderClause += ", " + propertyName + " DESC";
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public Sqler addGroup(String gclause)
|
||||
{
|
||||
groupClause=" GROUP BY "+gclause;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Sqler addJoin(String joinClause)
|
||||
{
|
||||
this.fromClause += " " + joinClause;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Sqler addAuth(Zuser zuser, String table)
|
||||
{
|
||||
addJoin(" left join "+table+"_viewer vvv on vvv.id=t.id");
|
||||
addJoin(" left join "+table+"_editor eee on eee.id=t.id");
|
||||
if (!zuser.isAdmin())
|
||||
{
|
||||
addWhere("(t.crmid=? or vvv.org in (" + zuser.getConds() + ") or eee.org in (" + zuser.getConds() + "))", zuser.getId());
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public Sqler selectCinfo(){
|
||||
addLeftJoin("oo1.name as crman,t.crtim", "sys_org oo1", "oo1.id=t.crmid");
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public Sqler selectCUinfo(){
|
||||
addLeftJoin("oo1.name as crman,t.crtim", "sys_org oo1", "oo1.id=t.crmid");
|
||||
addLeftJoin("oo2.name as upman,t.uptim", "sys_org oo2", "oo2.id=t.upmid");
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//get and set-------------------------------------------
|
||||
|
||||
public String getSql()
|
||||
{
|
||||
return selectClause + fromClause + whereClause +groupClause+ orderClause;
|
||||
}
|
||||
|
||||
public String getLowerCaseSql()
|
||||
{
|
||||
//字段转成小写
|
||||
StringBuilder changeSelectClause= new StringBuilder();
|
||||
String[] strArr= selectClause.split(",");
|
||||
lowerCaseSelect(changeSelectClause, strArr);
|
||||
changeSelectClause.deleteCharAt(changeSelectClause.length()-1);
|
||||
return changeSelectClause.toString() + fromClause + whereClause+groupClause + orderClause;
|
||||
}
|
||||
|
||||
public Sqler getNewGroupSqler(String groupClause){
|
||||
Sqler sqler = new Sqler("");
|
||||
sqler.fromClause=this.fromClause;
|
||||
sqler.whereClause=this.whereClause;
|
||||
sqler.groupClause=" group by "+groupClause;
|
||||
return sqler;
|
||||
}
|
||||
|
||||
|
||||
public String getSizeSql()
|
||||
{
|
||||
if("".equals(groupClause)){
|
||||
return "SELECT count(1)" + fromClause + whereClause;
|
||||
}
|
||||
else {
|
||||
return "SELECT count(1) FROM (SELECT 1 " + fromClause + whereClause+groupClause+") SSZZ";
|
||||
}
|
||||
}
|
||||
|
||||
public String getMysqlPagingSql()
|
||||
{
|
||||
int fromIndex = pasiz * (panum - 1);
|
||||
return selectClause + fromClause + whereClause+groupClause + orderClause + " limit " + fromIndex + "," + pasiz;
|
||||
}
|
||||
|
||||
public String getSqlserverPagingSql()
|
||||
{
|
||||
int rownum = panum * pasiz;
|
||||
int rn = (panum - 1) * pasiz;
|
||||
if("".equals(orderClause)){
|
||||
orderClause = "order by t.id";
|
||||
}
|
||||
return " SELECT * FROM ("+selectClause+", ROW_NUMBER() OVER("+orderClause+") AS RowId " + fromClause + whereClause+groupClause + ") PPGG WHERE PPGG.RowId between " + rn + " and "+ rownum;
|
||||
// return " SELECT * FROM (SELECT PPGG.*, ROWNUM RN FROM (" + changeSelectClause.toString() + fromClause + whereClause+groupClause + orderClause + ") PPGG WHERE ROWNUM <= " + rownum + ") WHERE RN > " + rn;
|
||||
}
|
||||
|
||||
public String getOraclePagingSql()
|
||||
{
|
||||
int rownum = panum * pasiz;
|
||||
int rn = (panum - 1) * pasiz;
|
||||
return " SELECT * FROM (SELECT PPGG.*, ROWNUM RN FROM (" + selectClause + fromClause + whereClause+groupClause + orderClause + ") PPGG WHERE ROWNUM <= " + rownum + ") WHERE RN > " + rn;
|
||||
// return " SELECT * FROM (SELECT PPGG.*, ROWNUM RN FROM (" + changeSelectClause.toString() + fromClause + whereClause+groupClause + orderClause + ") PPGG WHERE ROWNUM <= " + rownum + ") WHERE RN > " + rn;
|
||||
}
|
||||
|
||||
public String getOraclePagingLowerCaseSql()
|
||||
{
|
||||
//字段转成小写
|
||||
StringBuilder changeSelectClause= new StringBuilder();
|
||||
String[] strArr= selectClause.split(",");
|
||||
lowerCaseSelect(changeSelectClause, strArr);
|
||||
changeSelectClause.deleteCharAt(changeSelectClause.length()-1);
|
||||
//分页
|
||||
int rownum = panum * pasiz;
|
||||
int rn = (panum - 1) * pasiz;
|
||||
return " SELECT * FROM (SELECT PPGG.*, ROWNUM RN FROM (" + changeSelectClause.toString() + fromClause + whereClause+groupClause + orderClause + ") PPGG WHERE ROWNUM <= " + rownum + ") WHERE RN > " + rn;
|
||||
}
|
||||
|
||||
private void lowerCaseSelect(StringBuilder changeSelectClause, String[] strArr) {
|
||||
for (String aStrArr : strArr) {
|
||||
if(aStrArr.contains("(")&&!aStrArr.contains(")")){
|
||||
changeSelectClause.append(" ").append(aStrArr);
|
||||
}else if(aStrArr.contains("SELECT")){
|
||||
String[] firstArr = aStrArr.split(" ");
|
||||
if(firstArr.length>=3){
|
||||
firstArr[firstArr.length - 1] = "\"" + firstArr[firstArr.length - 1] + "\"";
|
||||
}else{
|
||||
firstArr[1]=firstArr[1]+" \"" + firstArr[1].substring(firstArr[1].lastIndexOf(".")+1) + "\"";
|
||||
}
|
||||
for (String afirstArr : firstArr) {
|
||||
changeSelectClause.append(" ").append(afirstArr);
|
||||
}
|
||||
}else{
|
||||
|
||||
String[] strArr2 = aStrArr.split(" ");
|
||||
if(strArr2.length>=2){
|
||||
strArr2[strArr2.length - 1] = "\"" + strArr2[strArr2.length - 1] + "\"";
|
||||
}else{
|
||||
strArr2[0]=strArr2[0]+" \"" + strArr2[0].substring(strArr2[0].lastIndexOf(".")+1) + "\"";
|
||||
}
|
||||
for (String aStrArr2 : strArr2) {
|
||||
changeSelectClause.append(" ").append(aStrArr2);
|
||||
}
|
||||
}
|
||||
changeSelectClause.append(",");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// public String getOraclePagingSql()
|
||||
// {
|
||||
// int rownum = panum * pasiz;
|
||||
// int rn = (panum - 1) * pasiz;
|
||||
// return " SELECT * FROM (SELECT PPGG.*, ROWNUM RN FROM (" + selectClause + fromClause + whereClause+groupClause + orderClause + ") PPGG WHERE ROWNUM <= " + rownum + ") WHERE RN > " + rn;
|
||||
//// return " SELECT * FROM (SELECT PPGG.*, ROWNUM RN FROM (" + changeSelectClause.toString() + fromClause + whereClause+groupClause + orderClause + ") PPGG WHERE ROWNUM <= " + rownum + ") WHERE RN > " + rn;
|
||||
// }
|
||||
//
|
||||
// public String getOraclePagingLowerCaseSql()
|
||||
// {
|
||||
// //字段转成小写
|
||||
// StringBuilder changeSelectClause= new StringBuilder();
|
||||
// String[] strArr= selectClause.split(",");
|
||||
// lowerCaseSelect(changeSelectClause, strArr);
|
||||
// changeSelectClause.deleteCharAt(changeSelectClause.length()-1);
|
||||
// //分页
|
||||
// int rownum = panum * pasiz;
|
||||
// int rn = (panum - 1) * pasiz;
|
||||
// return " SELECT * FROM (SELECT PPGG.*, ROWNUM RN FROM (" + changeSelectClause.toString() + fromClause + whereClause+groupClause + orderClause + ") PPGG WHERE ROWNUM <= " + rownum + ") WHERE RN > " + rn;
|
||||
// }
|
||||
//
|
||||
// private void lowerCaseSelect(StringBuilder changeSelectClause, String[] strArr) {
|
||||
// for (String aStrArr : strArr) {
|
||||
// if(aStrArr.contains("(")&&!aStrArr.contains(")")){
|
||||
// changeSelectClause.append(" ").append(aStrArr);
|
||||
// }else{
|
||||
// String[] strArr2 = aStrArr.split(" ");
|
||||
// strArr2[strArr2.length - 1] = "\"" + strArr2[strArr2.length - 1] + "\"";
|
||||
// for (String aStrArr2 : strArr2) {
|
||||
// changeSelectClause.append(" ").append(aStrArr2);
|
||||
// }
|
||||
// }
|
||||
// changeSelectClause.append(",");
|
||||
// }
|
||||
// }
|
||||
|
||||
public Object[] getParams()
|
||||
{
|
||||
return parameters.toArray();
|
||||
}
|
||||
|
||||
public void testParams()
|
||||
{
|
||||
for (int i = 0; i < parameters.size(); i++)
|
||||
{
|
||||
if (i == parameters.size() - 1)
|
||||
{
|
||||
System.out.println(parameters.get(i) + ";");
|
||||
} else
|
||||
{
|
||||
System.out.print(parameters.get(i) + ",");
|
||||
}
|
||||
}
|
||||
}
|
||||
//get and set-----------------------------------------------
|
||||
|
||||
|
||||
public Integer getPanum() {
|
||||
return panum;
|
||||
}
|
||||
|
||||
public Integer getPasiz() {
|
||||
return pasiz;
|
||||
}
|
||||
|
||||
public int getAutoType() {
|
||||
return autoType;
|
||||
}
|
||||
|
||||
public void setAutoType(int autoType) {
|
||||
this.autoType = autoType;
|
||||
}
|
||||
|
||||
public void setPanum(Integer panum) {
|
||||
this.panum = panum;
|
||||
}
|
||||
|
||||
public void setPasiz(Integer pasiz) {
|
||||
this.pasiz = pasiz;
|
||||
}
|
||||
}
|
||||
@@ -1,85 +0,0 @@
|
||||
package vben.core.common.mvc.dao;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
//更新用的SqlHelper 配合JdbcTemplate使用
|
||||
public class Usqler extends BaseSqler
|
||||
{
|
||||
private String updateClause = "";
|
||||
private String keyClause = "";
|
||||
private String whereClause = "";
|
||||
private List<Object> parameters = new ArrayList<Object>(); //参数列表
|
||||
private List<Object> whereParameters = new ArrayList<Object>();
|
||||
|
||||
|
||||
public Usqler(String table)
|
||||
{
|
||||
this.updateClause = "UPDATE " + table + " SET ";
|
||||
}
|
||||
|
||||
public Usqler add(String key, Object value)
|
||||
{
|
||||
if ("true".equals(value))
|
||||
{
|
||||
keyClause += key + "=?,";
|
||||
parameters.add(true);
|
||||
} else if ("false".equals(value))
|
||||
{
|
||||
keyClause += key + "=?,";
|
||||
parameters.add(false);
|
||||
} else
|
||||
{
|
||||
keyClause += key + "=?,";
|
||||
parameters.add(value);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public Usqler addWhere(String condition, Object... params)
|
||||
{
|
||||
if (whereClause.length() == 0)
|
||||
{
|
||||
whereClause = " WHERE " + condition;
|
||||
} else
|
||||
{
|
||||
whereClause += " AND " + condition;
|
||||
}
|
||||
if (params != null && params.length > 0)
|
||||
{
|
||||
for (Object obj : params)
|
||||
{
|
||||
whereParameters.add(obj);
|
||||
}
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public String getSql() throws SQLException {
|
||||
if("".equals(whereClause)){
|
||||
throw new SQLException("为防止误更新,update 语句必须要有where条件");
|
||||
}
|
||||
return updateClause + keyClause.substring(0, keyClause.length() - 1) + whereClause;
|
||||
}
|
||||
|
||||
public Object[] getParams()
|
||||
{
|
||||
parameters.addAll(whereParameters);
|
||||
return parameters.toArray();
|
||||
}
|
||||
|
||||
public void testParams()
|
||||
{
|
||||
for (int i = 0; i < parameters.size(); i++)
|
||||
{
|
||||
if (i == parameters.size() - 1)
|
||||
{
|
||||
System.out.println(parameters.get(i) + ";");
|
||||
} else
|
||||
{
|
||||
System.out.print(parameters.get(i) + ",");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,74 +0,0 @@
|
||||
package vben.core.common.mvc.entity;
|
||||
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import vben.core.module.sys.org.root.SysOrg;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import javax.persistence.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
//分类Entity基类,可实现无限多级的树结构
|
||||
@MappedSuperclass
|
||||
@Getter
|
||||
@Setter
|
||||
public class BaseCateEntity {
|
||||
@Id
|
||||
@Column(length = 32)
|
||||
@ApiModelProperty("主键ID")
|
||||
protected String id;
|
||||
|
||||
//----------------------层级属性参考-----------------------
|
||||
@Column(length = 1000)
|
||||
@ApiModelProperty("层级信息")
|
||||
protected String tier;
|
||||
|
||||
@Transient
|
||||
@ApiModelProperty("父分类ID")
|
||||
protected String pid;
|
||||
|
||||
@Transient
|
||||
@ApiModelProperty("父分类")
|
||||
protected BaseCateEntity parent;
|
||||
|
||||
@Transient
|
||||
@ApiModelProperty("子分类列表")
|
||||
protected List<BaseCateEntity> children = new ArrayList<>();
|
||||
//----------------------通用属性-----------------------
|
||||
@ApiModelProperty("名称")
|
||||
protected String name;
|
||||
|
||||
@Column(length = 64)
|
||||
@ApiModelProperty("标签")
|
||||
protected String label;
|
||||
|
||||
@Column(length = 500)
|
||||
@ApiModelProperty("备注")
|
||||
protected String notes;
|
||||
|
||||
@ApiModelProperty("可用标记 1启用,0禁用")
|
||||
protected Boolean avtag;
|
||||
|
||||
@ApiModelProperty("排序号")
|
||||
protected Integer ornum;
|
||||
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "crmid", updatable = false)
|
||||
@ApiModelProperty("创建人")
|
||||
protected SysOrg crman;
|
||||
|
||||
@Column(updatable = false)
|
||||
@ApiModelProperty("创建时间")
|
||||
protected Date crtim = new Date();
|
||||
|
||||
@ApiModelProperty("更新时间")
|
||||
protected Date uptim;
|
||||
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "upmid")
|
||||
@ApiModelProperty("更新人")
|
||||
protected SysOrg upman;
|
||||
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
package vben.core.common.mvc.entity;
|
||||
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.MappedSuperclass;
|
||||
|
||||
//简单Entity基类,仅提供id与name字段,如有租户需求,可加租户ID。
|
||||
@MappedSuperclass
|
||||
@Getter
|
||||
@Setter
|
||||
public class BaseEntity {
|
||||
|
||||
@Id
|
||||
@Column(length = 32)
|
||||
@ApiModelProperty("主键ID")
|
||||
protected String id;
|
||||
|
||||
@Column(length = 126)
|
||||
@ApiModelProperty("名称")
|
||||
protected String name;
|
||||
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
package vben.core.common.mvc.entity;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelIgnore;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import vben.core.module.sys.org.root.SysOrg;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import javax.persistence.*;
|
||||
import java.util.Date;
|
||||
|
||||
//主数据Entity基类,提供通用的字段
|
||||
@MappedSuperclass
|
||||
@Getter
|
||||
@Setter
|
||||
public class BaseMainEntity {
|
||||
//----------------------id属性-----------------------
|
||||
@Id
|
||||
@Column(length = 32)
|
||||
@ApiModelProperty("主键ID")
|
||||
protected String id;
|
||||
|
||||
//----------------------权限属性-----------------------
|
||||
// @ManyToMany
|
||||
// @JoinTable(name = "xxx_viewer", joinColumns = {@JoinColumn(name = "id")},
|
||||
// inverseJoinColumns = {@JoinColumn(name = "org")})
|
||||
// private List<SysOrg> viewers;//记录可查看者
|
||||
//
|
||||
// @ManyToMany
|
||||
// @JoinTable(name = "xxx_editor", joinColumns = {@JoinColumn(name = "id")},
|
||||
// inverseJoinColumns = {@JoinColumn(name = "org")})
|
||||
// private List<SysOrg> editors;//记录可编辑者
|
||||
|
||||
|
||||
//----------------------norm标准属性-----------------------
|
||||
@Column(length = 126)
|
||||
@ApiModelProperty("名称")
|
||||
protected String name;
|
||||
|
||||
@ApiModelProperty("可用标记")// 1启用,0禁用
|
||||
protected Boolean avtag = true;
|
||||
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "crmid", updatable = false)
|
||||
@ExcelIgnore
|
||||
@ApiModelProperty("创建人")
|
||||
protected SysOrg crman;
|
||||
|
||||
@Column(updatable = false)
|
||||
@ApiModelProperty("创建时间")
|
||||
protected Date crtim = new Date();
|
||||
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "upmid")
|
||||
@ExcelIgnore
|
||||
@ApiModelProperty("更新人")
|
||||
protected SysOrg upman;
|
||||
|
||||
@ApiModelProperty("更新时间")
|
||||
protected Date uptim;
|
||||
|
||||
@ApiModelProperty("备注")
|
||||
protected String notes;
|
||||
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
package vben.core.common.mvc.pojo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class TreeMovePo {
|
||||
|
||||
private String draid;
|
||||
|
||||
private String droid;
|
||||
|
||||
private String type;
|
||||
|
||||
}
|
||||
@@ -1,47 +0,0 @@
|
||||
package vben.core.common.mvc.pojo;
|
||||
|
||||
//基础pojo,只有id与name属性
|
||||
public class ZidName
|
||||
{
|
||||
private String id;
|
||||
private String name;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ZidName{" +
|
||||
"id='" + id + '\'' +
|
||||
", name='" + name + '\'' +
|
||||
'}';
|
||||
}
|
||||
|
||||
public ZidName(String id, String name)
|
||||
{
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public ZidName()
|
||||
{
|
||||
}
|
||||
|
||||
//get and set-------
|
||||
public String getId()
|
||||
{
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(String id)
|
||||
{
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getName()
|
||||
{
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name)
|
||||
{
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
package vben.core.common.mvc.pojo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class ZidNamePid {
|
||||
|
||||
private String id;
|
||||
|
||||
private String name;
|
||||
|
||||
private String pid;
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
package vben.core.common.mvc.pojo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class ZidOrnum {
|
||||
|
||||
private String id;
|
||||
|
||||
private Integer ornum;
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
package vben.core.common.mvc.pojo;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class Ztree {
|
||||
private String id;
|
||||
|
||||
private String name;
|
||||
|
||||
@JsonIgnore
|
||||
private String pid;
|
||||
|
||||
private String type;
|
||||
|
||||
private List<Ztree> children;
|
||||
|
||||
}
|
||||
@@ -1,241 +0,0 @@
|
||||
package vben.core.common.mvc.service;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import vben.core.common.mvc.api.PageData;
|
||||
import vben.core.common.mvc.dao.JdbcDao;
|
||||
import vben.core.common.mvc.dao.Sqler;
|
||||
import vben.core.common.mvc.entity.BaseCateEntity;
|
||||
import vben.core.common.mvc.pojo.ZidName;
|
||||
import vben.core.common.utils.lang.IdUtils;
|
||||
import vben.core.common.mvc.pojo.Ztree;
|
||||
import vben.core.common.utils.web.XuserUtil;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
//分类Service基类,提供分类Entity增删改查的通用方法
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public abstract class BaseCateService<T extends BaseCateEntity> {
|
||||
|
||||
//---------------------------------------查询-------------------------------------
|
||||
//查询Tree树形集合数据
|
||||
public List<Ztree> findTreeList(String table, String name) {
|
||||
Sqler sqler = new Sqler(table);
|
||||
sqler.addSelect("t.pid");
|
||||
sqler.addLike("t.name", name);
|
||||
sqler.addOrder("t.ornum");
|
||||
List<Ztree> list = jdbcDao.findTreeList(sqler);
|
||||
return list;
|
||||
}
|
||||
|
||||
//查询分页
|
||||
@Transactional(readOnly = true)
|
||||
public PageData findPageData(Sqler sqler) {
|
||||
sqler.selectCUinfo().addSelect("t.label");
|
||||
sqler.addOrder("t.ornum");
|
||||
return jdbcDao.findPageData(sqler);
|
||||
}
|
||||
|
||||
//查询ZidName集合
|
||||
@Transactional(readOnly = true)
|
||||
public List<ZidName> findIdNameRes(Sqler sqler) {
|
||||
return jdbcDao.findIdNameList(sqler);
|
||||
}
|
||||
|
||||
|
||||
//用户编辑时选择父类别,不能选择自己及孩子节点,否则会造成无限循环
|
||||
// @Transactional(readOnly = true)
|
||||
// public List<Ztree> inpChoose(String table, String id, String name){
|
||||
// Sqler sqler = new Sqler(table);
|
||||
// sqler.addSelect("pid");
|
||||
// sqler.addWhere("t.avtag = 1");
|
||||
// if (StrUtil.isNotBlank(id)) {
|
||||
// sqler.addWhere("t.tier not like ?", "%;" + id + ";%");
|
||||
// sqler.addWhere("t.id <> ?", id);
|
||||
// }
|
||||
// if(StrUtil.isNotBlank(name)){
|
||||
// sqler.addLike("t.name", name);
|
||||
// }
|
||||
// sqler.addOrder("t.ornum");
|
||||
// return jdbcDao.findInpList(sqler);
|
||||
// }
|
||||
|
||||
//查询ZidName集合
|
||||
@Transactional(readOnly = true)
|
||||
public List<Ztree> tier2Choose(String table, String id, String name){
|
||||
Sqler sqler = new Sqler(table);
|
||||
sqler.addSelect("pid");
|
||||
sqler.addWhere("t.avtag = 1");
|
||||
if (StrUtil.isNotBlank(id)) {
|
||||
sqler.addWhere("t.tier not like ?", "%x" + id + "x%");
|
||||
sqler.addWhere("t.id <> ?", id);
|
||||
}
|
||||
if(StrUtil.isNotBlank(name)){
|
||||
sqler.addLike("t.name", name);
|
||||
}
|
||||
sqler.addOrder("t.ornum");
|
||||
return jdbcDao.findTreeList(sqler);
|
||||
}
|
||||
|
||||
// @Transactional(readOnly = true)
|
||||
// public R inpFind(String table){
|
||||
// Sqler sqlHelper = new Sqler(table);
|
||||
// sqlHelper.addSelect("pid");
|
||||
// sqlHelper.addWhere("t.avtag = 1");
|
||||
// sqlHelper.addOrder("t.ornum");
|
||||
// return R.ok(jdbcDao.findInpList(sqlHelper));
|
||||
// }
|
||||
//
|
||||
// public R inpDele(String table, String id){
|
||||
// String sql = "select id from " + table + " where tier like ? order by tier";
|
||||
// List<String> stringList = jdbcDao.findStringList(sql, "%;" + id + ";%");
|
||||
// for (String sid : stringList) {
|
||||
// repo.deleteById(sid);
|
||||
// }
|
||||
// repo.deleteById(id);
|
||||
// return R.ok();
|
||||
// }
|
||||
|
||||
//查询单个实体详细信息
|
||||
@Transactional(readOnly = true)
|
||||
public T findOne(String id) {
|
||||
return repo.findById(id).get();
|
||||
}
|
||||
|
||||
//---------------------------------------增删改-------------------------------------
|
||||
//新增
|
||||
public String insert(T cate) {
|
||||
if(cate.getId()==null||"".equals(cate.getId())){
|
||||
cate.setId(IdUtils.getUID());
|
||||
}
|
||||
if(cate.getCrman()==null){
|
||||
cate.setCrman(XuserUtil.getUser());
|
||||
}
|
||||
if (cate.getParent() != null) {
|
||||
T parent = repo.findById(cate.getParent().getId()).get();
|
||||
cate.setTier(parent.getTier()+cate.getId()+ "x");
|
||||
} else {
|
||||
cate.setTier("x"+cate.getId()+"x");
|
||||
}
|
||||
// cate.setCrtim(new Date());
|
||||
cate.setUptim(cate.getCrtim());
|
||||
repo.save(cate);
|
||||
return cate.getId();
|
||||
}
|
||||
|
||||
//更新
|
||||
public String update(T cate){
|
||||
cate.setUptim(new Date());
|
||||
if(cate.getUpman()==null){
|
||||
cate.setUpman(XuserUtil.getUser());
|
||||
}
|
||||
repo.save(cate);
|
||||
return cate.getId();
|
||||
}
|
||||
|
||||
//级联更新
|
||||
public String update(T cate,String table,boolean tierChange){
|
||||
cate.setUptim(new Date());
|
||||
if(cate.getUpman()==null){
|
||||
cate.setUpman(XuserUtil.getUser());
|
||||
}
|
||||
String newPid = "";
|
||||
if(cate.getParent()!=null){
|
||||
newPid=cate.getParent().getId();
|
||||
}
|
||||
T oldCate=repo.findById(cate.getId()).get();
|
||||
String oldPid="";
|
||||
if(oldCate.getParent()!=null){
|
||||
oldPid =oldCate.getParent().getId();
|
||||
}
|
||||
String oldTier=oldCate.getTier();
|
||||
if(oldPid.equals(newPid)&&!tierChange){//如果父节点没有变,则只更新自己
|
||||
// System.out.println("父节点没有变");
|
||||
cate.setTier(oldTier);
|
||||
repo.save(cate);
|
||||
}else{//如果父节点变了,则另外需要更新自己孩子节点的tier层级
|
||||
String newTier = "x"+cate.getId()+"x";
|
||||
if(cate.getParent()!=null){
|
||||
// System.out.println("父节点变成其他点了");
|
||||
T newParentCate=repo.findById(cate.getParent().getId()).get();
|
||||
newTier =newParentCate.getTier()+cate.getId()+"x";
|
||||
}
|
||||
cate.setTier(newTier);
|
||||
repo.save(cate);
|
||||
//更新子节点
|
||||
String sql = "select id,tier as name from " + table + " where tier like ? and id<>?";
|
||||
// System.out.println(sql);
|
||||
List<ZidName> list = jdbcDao.findIdNameList(sql, oldTier+"%",cate.getId());
|
||||
|
||||
String updateSql = "update " + table + " set tier=? where id=?";
|
||||
List<Object[]> updateList = new ArrayList<Object[]>();
|
||||
for (ZidName ztwo : list) {
|
||||
Object[] arr = new Object[2];
|
||||
arr[0] = ztwo.getName().replace(oldTier,newTier);
|
||||
arr[1] = ztwo.getId();
|
||||
updateList.add(arr);
|
||||
}
|
||||
jdbcDao.batch(updateSql, updateList);
|
||||
}
|
||||
return cate.getId();
|
||||
}
|
||||
|
||||
//删除
|
||||
public int delete(String[] ids) {
|
||||
for (String id : ids) {
|
||||
repo.deleteById(id);
|
||||
}
|
||||
return ids.length;
|
||||
}
|
||||
|
||||
//---------------------------------------构建树形结构辅助方法-------------------------------------
|
||||
//使用递归方法建树
|
||||
public List<T> buildByRecursive(List<T> nodes) {
|
||||
List<T> list = new ArrayList<>();
|
||||
for (T node : nodes) {
|
||||
if (node.getPid() == null) {
|
||||
list.add(findChildrenByTier(node, nodes));
|
||||
} else {
|
||||
boolean flag = false;
|
||||
for (BaseCateEntity node2 : nodes) {
|
||||
if (node.getPid().equals(node2.getId())) {
|
||||
flag = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!flag) {
|
||||
list.add(findChildrenByTier(node, nodes));
|
||||
}
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
//递归查找子节点
|
||||
private T findChildrenByTier(T node, List<T> nodes) {
|
||||
for (T item : nodes) {
|
||||
if (node.getId().equals(item.getPid())) {
|
||||
if (node.getChildren() == null) {
|
||||
node.setChildren(new ArrayList<>());
|
||||
}
|
||||
node.getChildren().add(findChildrenByTier(item, nodes));
|
||||
}
|
||||
}
|
||||
return node;
|
||||
}
|
||||
|
||||
//---------------------------------------bean注入-------------------------------------
|
||||
|
||||
@Autowired
|
||||
protected JdbcDao jdbcDao;
|
||||
|
||||
protected JpaRepository<T,String> repo;
|
||||
|
||||
public void setRepo(JpaRepository<T,String> repo) {
|
||||
this.repo = repo;
|
||||
}
|
||||
}
|
||||
@@ -1,105 +0,0 @@
|
||||
package vben.core.common.mvc.service;
|
||||
|
||||
import vben.core.common.mvc.api.PageData;
|
||||
import vben.core.common.mvc.dao.JdbcDao;
|
||||
import vben.core.common.mvc.dao.Sqler;
|
||||
import vben.core.common.mvc.entity.BaseMainEntity;
|
||||
import vben.core.common.utils.web.XuserUtil;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import vben.core.common.utils.lang.IdUtils;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
//主数据Service基类,提供主数据Entity增删改查的通用方法
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public abstract class BaseMainService<T extends BaseMainEntity> {
|
||||
|
||||
//---------------------------------------查询-------------------------------------
|
||||
//查询分页
|
||||
@Transactional(readOnly = true)
|
||||
public PageData findPageData(Sqler sqler) {
|
||||
if (sqler.getAutoType() == 1) {
|
||||
sqler.selectCUinfo();
|
||||
sqler.addOrder("t.crtim desc");
|
||||
}
|
||||
return jdbcDao.findPageData(sqler);
|
||||
}
|
||||
|
||||
//查询MapList数据
|
||||
@Transactional(readOnly = true)
|
||||
public List<Map<String, Object>> findMapList(Sqler sqler) {
|
||||
return jdbcDao.findMapList(sqler);
|
||||
}
|
||||
|
||||
//根据ID判断数据库实体是否存在
|
||||
@Transactional(readOnly = true)
|
||||
public boolean existsById(String id) {
|
||||
return repo.existsById(id);
|
||||
}
|
||||
|
||||
//查询单个实体详细信息
|
||||
@Transactional(readOnly = true)
|
||||
public T findOne(String id) {
|
||||
return repo.findById(id).get();
|
||||
}
|
||||
|
||||
//查询所有记录
|
||||
@Transactional(readOnly = true)
|
||||
public List<T> findAll() {
|
||||
return repo.findAll();
|
||||
}
|
||||
|
||||
//---------------------------------------增删改-------------------------------------
|
||||
//新增
|
||||
public String insert(T main) {
|
||||
if (main.getId() == null || "".equals(main.getId())) {
|
||||
main.setId(IdUtils.getUID());
|
||||
}
|
||||
// main.setCrtim(new Date());
|
||||
main.setUptim(main.getCrtim());
|
||||
if (main.getCrman() == null) {
|
||||
main.setCrman(XuserUtil.getUser());
|
||||
}
|
||||
repo.save(main);
|
||||
return main.getId();
|
||||
}
|
||||
|
||||
//修改
|
||||
public String update(T main) {
|
||||
main.setUptim(new Date());
|
||||
if (main.getUpman() == null) {
|
||||
main.setUpman(XuserUtil.getUser());
|
||||
}
|
||||
repo.save(main);
|
||||
return main.getId();
|
||||
}
|
||||
|
||||
//删除
|
||||
public int delete(String[] ids) {
|
||||
for (String id : ids) {
|
||||
repo.deleteById(id);
|
||||
}
|
||||
return ids.length;
|
||||
}
|
||||
|
||||
//新增或修改
|
||||
public T save(T t) {
|
||||
return repo.save(t);
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------bean注入-------------------------------------
|
||||
@Autowired
|
||||
protected JdbcDao jdbcDao;
|
||||
|
||||
protected JpaRepository<T, String> repo;
|
||||
|
||||
public void setRepo(JpaRepository<T, String> repo) {
|
||||
this.repo = repo;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,92 +0,0 @@
|
||||
package vben.core.common.mvc.service;
|
||||
|
||||
import vben.core.common.mvc.api.PageData;
|
||||
import vben.core.common.mvc.dao.JdbcDao;
|
||||
import vben.core.common.mvc.dao.Sqler;
|
||||
import vben.core.common.mvc.entity.BaseEntity;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import vben.core.common.utils.lang.IdUtils;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
//简单表Service基类,提供简单Entity增删改查的通用方法
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public abstract class BaseService<T extends BaseEntity> {
|
||||
|
||||
//---------------------------------------查询-------------------------------------
|
||||
//查询分页
|
||||
@Transactional(readOnly = true)
|
||||
public PageData findPageData(Sqler sqler) {
|
||||
return jdbcDao.findPageData(sqler);
|
||||
}
|
||||
|
||||
//查询MapList数据
|
||||
@Transactional(readOnly = true)
|
||||
public List<Map<String, Object>> findMapList(Sqler sqler) {
|
||||
return jdbcDao.findMapList(sqler);
|
||||
}
|
||||
|
||||
//根据ID判断数据库实体是否存在
|
||||
@Transactional(readOnly = true)
|
||||
public boolean existsById(String id) {
|
||||
return repo.existsById(id);
|
||||
}
|
||||
|
||||
//查询单个实体详细信息
|
||||
@Transactional(readOnly = true)
|
||||
public T findOne(String id) {
|
||||
return repo.findById(id).get();
|
||||
}
|
||||
|
||||
//查询所有记录
|
||||
@Transactional(readOnly = true)
|
||||
public List<T> findAll() {
|
||||
return repo.findAll();
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------增删改-------------------------------------
|
||||
//新增
|
||||
public String insert(T main) {
|
||||
if (main.getId() == null||"".equals(main.getId())) {
|
||||
main.setId(IdUtils.getUID());
|
||||
}
|
||||
repo.save(main);
|
||||
return main.getId();
|
||||
}
|
||||
|
||||
//修改
|
||||
public String update(T main) {
|
||||
repo.save(main);
|
||||
return main.getId();
|
||||
}
|
||||
|
||||
//删除
|
||||
public int delete(String[] ids) {
|
||||
for (String id : ids) {
|
||||
repo.deleteById(id);
|
||||
}
|
||||
return ids.length;
|
||||
}
|
||||
|
||||
//新增或修改
|
||||
public T save(T t) {
|
||||
return repo.save(t);
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------bean注入-------------------------------------
|
||||
@Autowired
|
||||
protected JdbcDao jdbcDao;
|
||||
|
||||
protected JpaRepository<T, String> repo;
|
||||
|
||||
public void setRepo(JpaRepository<T, String> repo) {
|
||||
this.repo = repo;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
package vben.core.common.others;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class MapHelper {
|
||||
private Map<String,String> map;
|
||||
|
||||
public MapHelper(){
|
||||
map = new LinkedHashMap<>();
|
||||
}
|
||||
|
||||
public MapHelper(String field,String title){
|
||||
map = new LinkedHashMap<>();
|
||||
map.put("field", field);
|
||||
map.put("title", title);
|
||||
}
|
||||
|
||||
public MapHelper put(String key,String value){
|
||||
map.put(key, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Map<String,String> get(){
|
||||
return map;
|
||||
}
|
||||
|
||||
public MapHelper addTo(List list){
|
||||
list.add(map);
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,139 +0,0 @@
|
||||
/*
|
||||
* <<
|
||||
* Davinci
|
||||
* ==
|
||||
* Copyright (C) 2016 - 2019 EDP
|
||||
* ==
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* >>
|
||||
*
|
||||
*/
|
||||
|
||||
package vben.core.common.utils.db;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
/**
|
||||
* @author /
|
||||
*/
|
||||
@Slf4j
|
||||
@SuppressWarnings({"unchecked","all"})
|
||||
public enum DataTypeEnum {
|
||||
|
||||
/** mysql */
|
||||
MYSQL("mysql", "mysql", "com.mysql.jdbc.Driver", "`", "`", "'", "'"),
|
||||
|
||||
/** oracle */
|
||||
ORACLE("oracle", "oracle", "oracle.jdbc.driver.OracleDriver", "\"", "\"", "\"", "\""),
|
||||
|
||||
/** sql server */
|
||||
SQLSERVER("sqlserver", "sqlserver", "com.microsoft.sqlserver.jdbc.SQLServerDriver", "\"", "\"", "\"", "\""),
|
||||
|
||||
/** h2 */
|
||||
H2("h2", "h2", "org.h2.Driver", "`", "`", "\"", "\""),
|
||||
|
||||
/** phoenix */
|
||||
PHOENIX("phoenix", "hbase phoenix", "org.apache.phoenix.jdbc.PhoenixDriver", "", "", "\"", "\""),
|
||||
|
||||
/** mongo */
|
||||
MONGODB("mongo", "mongodb", "mongodb.jdbc.MongoDriver", "`", "`", "\"", "\""),
|
||||
|
||||
/** sql4es */
|
||||
ELASTICSEARCH("sql4es", "elasticsearch", "nl.anchormen.sql4es.jdbc.ESDriver", "", "", "'", "'"),
|
||||
|
||||
/** presto */
|
||||
PRESTO("presto", "presto", "com.facebook.presto.jdbc.PrestoDriver", "", "", "\"", "\""),
|
||||
|
||||
/** moonbox */
|
||||
MOONBOX("moonbox", "moonbox", "moonbox.jdbc.MbDriver", "`", "`", "`", "`"),
|
||||
|
||||
/** cassandra */
|
||||
CASSANDRA("cassandra", "cassandra", "com.github.adejanovski.cassandra.jdbc.CassandraDriver", "", "", "'", "'"),
|
||||
|
||||
/** click house */
|
||||
CLICKHOUSE("clickhouse", "clickhouse", "ru.yandex.clickhouse.ClickHouseDriver", "", "", "\"", "\""),
|
||||
|
||||
/** kylin */
|
||||
KYLIN("kylin", "kylin", "org.apache.kylin.jdbc.Driver", "\"", "\"", "\"", "\""),
|
||||
|
||||
/** vertica */
|
||||
VERTICA("vertica", "vertica", "com.vertica.jdbc.Driver", "", "", "'", "'"),
|
||||
|
||||
/** sap */
|
||||
HANA("sap", "sap hana", "com.sap.db.jdbc.Driver", "", "", "'", "'"),
|
||||
|
||||
/** impala */
|
||||
IMPALA("impala", "impala", "com.cloudera.impala.jdbc41.Driver", "", "", "'", "'");
|
||||
|
||||
private String feature;
|
||||
private String desc;
|
||||
private String driver;
|
||||
private String keywordPrefix;
|
||||
private String keywordSuffix;
|
||||
private String aliasPrefix;
|
||||
private String aliasSuffix;
|
||||
|
||||
private static final String JDBC_URL_PREFIX = "jdbc:";
|
||||
|
||||
DataTypeEnum(String feature, String desc, String driver, String keywordPrefix, String keywordSuffix, String aliasPrefix, String aliasSuffix) {
|
||||
this.feature = feature;
|
||||
this.desc = desc;
|
||||
this.driver = driver;
|
||||
this.keywordPrefix = keywordPrefix;
|
||||
this.keywordSuffix = keywordSuffix;
|
||||
this.aliasPrefix = aliasPrefix;
|
||||
this.aliasSuffix = aliasSuffix;
|
||||
}
|
||||
|
||||
public static DataTypeEnum urlOf(String jdbcUrl) {
|
||||
String url = jdbcUrl.toLowerCase().trim();
|
||||
for (DataTypeEnum dataTypeEnum : values()) {
|
||||
if (url.startsWith(JDBC_URL_PREFIX + dataTypeEnum.feature)) {
|
||||
try {
|
||||
Class<?> aClass = Class.forName(dataTypeEnum.getDriver());
|
||||
if (null == aClass) {
|
||||
throw new RuntimeException("Unable to get driver instance for jdbcUrl: " + jdbcUrl);
|
||||
}
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new RuntimeException("Unable to get driver instance: " + jdbcUrl);
|
||||
}
|
||||
return dataTypeEnum;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public String getFeature() {
|
||||
return feature;
|
||||
}
|
||||
|
||||
public String getDesc() {
|
||||
return desc;
|
||||
}
|
||||
|
||||
public String getDriver() {
|
||||
return driver;
|
||||
}
|
||||
|
||||
public String getKeywordPrefix() {
|
||||
return keywordPrefix;
|
||||
}
|
||||
|
||||
public String getKeywordSuffix() {
|
||||
return keywordSuffix;
|
||||
}
|
||||
|
||||
public String getAliasPrefix() {
|
||||
return aliasPrefix;
|
||||
}
|
||||
|
||||
public String getAliasSuffix() {
|
||||
return aliasSuffix;
|
||||
}
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
package vben.core.common.utils.db;
|
||||
|
||||
public class DbType {
|
||||
|
||||
public static final String MYSQL = "mysql";
|
||||
|
||||
public static final String MYSQL8 = "mysql8";
|
||||
|
||||
public static final String ORACLE = "oracle";
|
||||
|
||||
public static final String SQL_SERVER = "sqlserver";
|
||||
|
||||
public static final String DB2 = "db2";
|
||||
|
||||
}
|
||||
@@ -1,215 +0,0 @@
|
||||
package vben.core.common.utils.db;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import org.springframework.jdbc.core.JdbcTemplate;
|
||||
import vben.core.common.mvc.api.PageData;
|
||||
import vben.core.common.mvc.dao.BaseSqler;
|
||||
import vben.core.common.mvc.dao.Sqler;
|
||||
import vben.core.common.mvc.pojo.ZidName;
|
||||
import vben.core.common.mvc.pojo.Ztree;
|
||||
import vben.core.common.utils.lang.TreeUtils;
|
||||
import vben.core.common.utils.web.XreqUtil;
|
||||
import vben.core.module.sys.org.root.SysOrg;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class Jdao {
|
||||
|
||||
public Jdao(JdbcTemplate jdbcTemplate, String dbType){
|
||||
this.jdbcTemplate=jdbcTemplate;
|
||||
this.DB_TYPE=dbType;
|
||||
}
|
||||
|
||||
private JdbcTemplate jdbcTemplate;
|
||||
|
||||
private String DB_TYPE;
|
||||
|
||||
public PageData findPageData(Sqler sqler) {
|
||||
XreqUtil.setPageParam(sqler);
|
||||
Integer count = jdbcTemplate.queryForObject(sqler.getSizeSql(), sqler.getParams(), Integer.class);
|
||||
if (count == null || count == 0) {
|
||||
return new PageData(0, new ArrayList<>());
|
||||
}
|
||||
List<Map<String, Object>> list;
|
||||
if (DbType.MYSQL.equals(DB_TYPE)) {
|
||||
list = jdbcTemplate.queryForList(sqler.getMysqlPagingSql(), sqler.getParams());
|
||||
} else if (DbType.ORACLE.equals(DB_TYPE)) {
|
||||
list = jdbcTemplate.queryForList(sqler.getOraclePagingLowerCaseSql(), sqler.getParams());
|
||||
} else if (DbType.SQL_SERVER.equals(DB_TYPE)) {
|
||||
System.out.println(sqler.getSqlserverPagingSql());
|
||||
list = jdbcTemplate.queryForList(sqler.getSqlserverPagingSql(), sqler.getParams());
|
||||
} else {
|
||||
System.err.println("目前只支持mysql,oracle与sqlserver");
|
||||
list = new ArrayList<>();
|
||||
}
|
||||
return new PageData(count, list);
|
||||
}
|
||||
|
||||
public List<Map<String, Object>> findPageMapList(Sqler sqler) {
|
||||
Integer count = jdbcTemplate.queryForObject(sqler.getSizeSql(), sqler.getParams(), Integer.class);
|
||||
if (count == null || count == 0) {
|
||||
return null;
|
||||
}
|
||||
List<Map<String, Object>> list;
|
||||
if (DbType.MYSQL.equals(DB_TYPE)) {
|
||||
list = jdbcTemplate.queryForList(sqler.getMysqlPagingSql(), sqler.getParams());
|
||||
} else if (DbType.ORACLE.equals(DB_TYPE)) {
|
||||
list = jdbcTemplate.queryForList(sqler.getOraclePagingLowerCaseSql(), sqler.getParams());
|
||||
} else if (DbType.SQL_SERVER.equals(DB_TYPE)) {
|
||||
System.out.println(sqler.getSqlserverPagingSql());
|
||||
list = jdbcTemplate.queryForList(sqler.getSqlserverPagingSql(), sqler.getParams());
|
||||
} else {
|
||||
System.err.println("目前只支持mysql,oracle与sqlserver");
|
||||
list = new ArrayList<>();
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
public List<Ztree> findTreeList(Sqler sqler) {
|
||||
List<Ztree> list = jdbcTemplate.query(sqler.getSql(), sqler.getParams(), (rs, rowNum) -> {
|
||||
Ztree ztree = new Ztree();
|
||||
ztree.setId(rs.getString("id"));
|
||||
ztree.setName(rs.getString("name"));
|
||||
ztree.setPid(rs.getString("pid"));
|
||||
return ztree;
|
||||
});
|
||||
return TreeUtils.build(list);
|
||||
}
|
||||
|
||||
|
||||
public List<ZidName> findIdNameList(String sql, Object... args) {
|
||||
return jdbcTemplate.query(sql, args, (rs, rowNum) -> {
|
||||
ZidName ztwo = new ZidName();
|
||||
ztwo.setId(rs.getString("id"));
|
||||
ztwo.setName(rs.getString("name"));
|
||||
return ztwo;
|
||||
});
|
||||
}
|
||||
|
||||
public List<ZidName> getIdNameListByTable(String table, String name) {
|
||||
String sql = "select id,name from " + table + " where avtag = 1";
|
||||
if (StrUtil.isBlank(name)) {
|
||||
return findIdNameList(sql);
|
||||
} else {
|
||||
return jdbcTemplate.query(sql + " and name like ?", new Object[]{"%" + name + "%"}, (rs, rowNum) -> {
|
||||
ZidName ztwo = new ZidName();
|
||||
ztwo.setId(rs.getString("id"));
|
||||
ztwo.setName(rs.getString("name"));
|
||||
return ztwo;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public List<ZidName> findIdNameList(Sqler sqlHelper) {
|
||||
return findIdNameList((sqlHelper.getSql()), sqlHelper.getParams());
|
||||
}
|
||||
|
||||
|
||||
public List<SysOrg> findOrgList(String sql, Object... args) {
|
||||
return jdbcTemplate.query(sql, args, (rs, rowNum) -> {
|
||||
SysOrg sysOrg = new SysOrg();
|
||||
sysOrg.setId(rs.getString("id"));
|
||||
sysOrg.setName(rs.getString("name"));
|
||||
return sysOrg;
|
||||
});
|
||||
}
|
||||
|
||||
public List<String> findStringList(String sql, Object... args) {
|
||||
return jdbcTemplate.query(sql, args, (rs, rowNum) -> rs.getString("id"));
|
||||
}
|
||||
|
||||
public List<String> findStringList(Sqler sqler) {
|
||||
return jdbcTemplate.query(sqler.getSql(), sqler.getParams(), (rs, rowNum) -> rs.getString("id"));
|
||||
}
|
||||
|
||||
public Integer findSize(Sqler sqler) {
|
||||
return jdbcTemplate.queryForObject(sqler.getSizeSql(), sqler.getParams(), Integer.class);
|
||||
}
|
||||
|
||||
public String findOneString(String sql, Object... args) {
|
||||
String str = null;
|
||||
try {
|
||||
str = jdbcTemplate.queryForObject(sql, args, String.class);
|
||||
} catch (Exception ignored) {
|
||||
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
public String findOneString(Sqler sqler) {
|
||||
return findOneString(sqler.getSql(), sqler.getParams());
|
||||
}
|
||||
|
||||
public Map<String, Object> findMap(Sqler sqler) {
|
||||
List<Map<String, Object>> list = jdbcTemplate.queryForList(sqler.getSql(), sqler.getParams());
|
||||
if (list.size() > 0) {
|
||||
return list.get(0);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
// return jdbcTemplate.queryForMap(sqler.getSql(), sqler.getParams());
|
||||
}
|
||||
|
||||
public Map<String, Object> findMap(String sql, Object... args) {
|
||||
List<Map<String, Object>> list = jdbcTemplate.queryForList(sql, args);
|
||||
if (list.size()==0) {
|
||||
return null;
|
||||
} else {
|
||||
return list.get(0);
|
||||
}
|
||||
}
|
||||
|
||||
public List<Map<String, Object>> findMapList(Sqler sqler) {
|
||||
if (DbType.ORACLE.equals(DB_TYPE)) {
|
||||
return jdbcTemplate.queryForList(sqler.getLowerCaseSql(), sqler.getParams());
|
||||
} else{
|
||||
return jdbcTemplate.queryForList(sqler.getSql(), sqler.getParams());
|
||||
}
|
||||
}
|
||||
|
||||
public List<Map<String, Object>> findMapList(String sql, Object... args) {
|
||||
return jdbcTemplate.queryForList(sql, args);
|
||||
}
|
||||
|
||||
|
||||
public String findOneName(String table, String id) {
|
||||
if (StrUtil.isBlank(id)) {
|
||||
return null;
|
||||
} else {
|
||||
return jdbcTemplate.queryForObject("select name from " + table + " where id = ?", new Object[]{id}, String.class);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//queryForObject 如果返回没结果会报错
|
||||
|
||||
|
||||
//增删改----------------------------------------------------------------------------------
|
||||
public int update(String sql, Object... args) {
|
||||
return jdbcTemplate.update(sql, args);
|
||||
}
|
||||
|
||||
public int update(BaseSqler sqler) throws SQLException {
|
||||
return jdbcTemplate.update(sqler.getSql(), sqler.getParams());
|
||||
}
|
||||
|
||||
public int[] batch(String sql, List<Object[]> list) {
|
||||
return jdbcTemplate.batchUpdate(sql, list);
|
||||
}
|
||||
|
||||
public String getDbType() {
|
||||
return DB_TYPE;
|
||||
}
|
||||
|
||||
public JdbcTemplate getTp() {
|
||||
// jdbcDao.getTp().query(sql, new Object[]{}, new BeanPropertyRowMapper<>(Qmarg.class));
|
||||
return jdbcTemplate;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,267 +0,0 @@
|
||||
/*
|
||||
* Copyright 2019-2020 Zheng Jie
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package vben.core.common.utils.db;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.alibaba.druid.pool.DruidDataSource;
|
||||
import com.alibaba.druid.util.StringUtils;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.jdbc.core.JdbcTemplate;
|
||||
import vben.core.module.mon.server.main.CloseUtil;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
import java.sql.Connection;
|
||||
import java.sql.DriverManager;
|
||||
import java.sql.SQLException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author /
|
||||
*/
|
||||
@Slf4j
|
||||
public class SqlUtils {
|
||||
|
||||
private static Map<String, DruidDataSource> dataSourceMap = new HashMap<>();
|
||||
|
||||
private static Map<String, Jdao> jdaoMap = new HashMap<>();
|
||||
|
||||
private static DataSource getDataSource(Zconn zconn) {
|
||||
if (StrUtil.isNotBlank(zconn.getName())) {
|
||||
DruidDataSource ds = dataSourceMap.get(zconn.getName());
|
||||
if (ds != null) {
|
||||
return ds;
|
||||
}
|
||||
}
|
||||
DruidDataSource druidDataSource = new DruidDataSource();
|
||||
String className;
|
||||
try {
|
||||
className = DriverManager.getDriver(zconn.getUrl().trim()).getClass().getName();
|
||||
} catch (SQLException e) {
|
||||
throw new RuntimeException("Get class name error: =" + zconn.getUrl());
|
||||
}
|
||||
if (StringUtils.isEmpty(className)) {
|
||||
DataTypeEnum dataTypeEnum = DataTypeEnum.urlOf(zconn.getUrl());
|
||||
if (null == dataTypeEnum) {
|
||||
throw new RuntimeException("Not supported data type: jdbcUrl=" + zconn.getUrl());
|
||||
}
|
||||
druidDataSource.setDriverClassName(dataTypeEnum.getDriver());
|
||||
} else {
|
||||
druidDataSource.setDriverClassName(className);
|
||||
}
|
||||
|
||||
if (StrUtil.isNotBlank(zconn.getName())) {
|
||||
druidDataSource.setName(zconn.getName());
|
||||
}
|
||||
druidDataSource.setUrl(zconn.getUrl());
|
||||
druidDataSource.setUsername(zconn.getUsername());
|
||||
druidDataSource.setPassword(zconn.getPasscode());
|
||||
// 配置获取连接等待超时的时间
|
||||
druidDataSource.setMaxWait(3000);
|
||||
// 配置初始化大小、最小、最大
|
||||
druidDataSource.setInitialSize(1);
|
||||
druidDataSource.setMinIdle(1);
|
||||
druidDataSource.setMaxActive(5);
|
||||
|
||||
if(DbType.SQL_SERVER.equals(zconn.getType())){
|
||||
druidDataSource.setValidationQuery("SELECT 1");
|
||||
}
|
||||
|
||||
// 如果链接出现异常则直接判定为失败而不是一直重试
|
||||
druidDataSource.setBreakAfterAcquireFailure(true);
|
||||
try {
|
||||
druidDataSource.init();
|
||||
} catch (SQLException e) {
|
||||
log.error("Exception during pool initialization", e);
|
||||
throw new RuntimeException(e.getMessage());
|
||||
}
|
||||
if(StrUtil.isNotBlank(zconn.getName())){
|
||||
dataSourceMap.put(zconn.getName(), druidDataSource);
|
||||
}
|
||||
return druidDataSource;
|
||||
}
|
||||
|
||||
public static Jdao getJdao(Zconn zconn) {
|
||||
Jdao jdao = jdaoMap.get(zconn.getName());
|
||||
if (jdao != null) {
|
||||
return jdao;
|
||||
} else {
|
||||
DataSource druidDataSource = getDataSource(zconn);
|
||||
JdbcTemplate jdbcTemplate = new JdbcTemplate(druidDataSource);
|
||||
jdao = new Jdao(jdbcTemplate, zconn.getType());
|
||||
jdaoMap.put(zconn.getName(), jdao);
|
||||
return jdao;
|
||||
}
|
||||
}
|
||||
|
||||
private static Connection getConnection(Zconn zconn) {
|
||||
DataSource dataSource = getDataSource(zconn);
|
||||
Connection connection = null;
|
||||
try {
|
||||
connection = dataSource.getConnection();
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
try {
|
||||
int timeOut = 5;
|
||||
if (null == connection || connection.isClosed() || !connection.isValid(timeOut)) {
|
||||
log.info("connection is closed or invalid, retry get connection!");
|
||||
connection = dataSource.getConnection();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("create connection error, jdbcUrl: {}", zconn.getUrl());
|
||||
throw new RuntimeException("create connection error, jdbcUrl: " + zconn.getUrl());
|
||||
} finally {
|
||||
CloseUtil.close(connection);
|
||||
}
|
||||
return connection;
|
||||
}
|
||||
|
||||
private static void releaseConnection(Connection connection) {
|
||||
if (null != connection) {
|
||||
try {
|
||||
connection.close();
|
||||
} catch (Exception e) {
|
||||
log.error(e.getMessage(), e);
|
||||
log.error("connection close error:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean testConnection(Zconn zconn) {
|
||||
Connection connection = null;
|
||||
DataSource dataSource = null;
|
||||
try {
|
||||
dataSource = getDataSource(zconn);
|
||||
connection = dataSource.getConnection();
|
||||
int timeOut = 5;
|
||||
if (null == connection || connection.isClosed() || !connection.isValid(timeOut)) {
|
||||
log.info("connection is closed or invalid, retry get connection!");
|
||||
connection = dataSource.getConnection();
|
||||
}
|
||||
if (null != connection) {
|
||||
return true;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.info("Get connection failed:" + e.getMessage());
|
||||
} finally {
|
||||
CloseUtil.close(connection);
|
||||
releaseConnection(connection);
|
||||
assert dataSource != null;
|
||||
((DruidDataSource) dataSource).close();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// public static boolean testConnection(String name,String jdbcUrl, String userName, String password) {
|
||||
// Connection connection = null;
|
||||
// try {
|
||||
// connection = getConnection(name,jdbcUrl, userName, password);
|
||||
// if (null != connection) {
|
||||
// return true;
|
||||
// }
|
||||
// } catch (Exception e) {
|
||||
// log.info("Get connection failed:" + e.getMessage());
|
||||
// } finally {
|
||||
// releaseConnection(connection);
|
||||
// }
|
||||
// return false;
|
||||
// }
|
||||
|
||||
// public static boolean execSql(String name, String jdbcUrl, String userName, String password) {
|
||||
// Connection connection = null;
|
||||
// try {
|
||||
// connection = getConnection(name, jdbcUrl, userName, password);
|
||||
// if (null != connection) {
|
||||
// return true;
|
||||
// }
|
||||
// } catch (Exception e) {
|
||||
// log.info("Get connection failed:" + e.getMessage());
|
||||
// } finally {
|
||||
// releaseConnection(connection);
|
||||
// }
|
||||
// return false;
|
||||
// }
|
||||
|
||||
// public static String executeFile(String name, String jdbcUrl, String userName, String password, File sqlFile) {
|
||||
// Connection connection = getConnection(name, jdbcUrl, userName, password);
|
||||
// try {
|
||||
// batchExecute(connection, readSqlList(sqlFile));
|
||||
// } catch (Exception e) {
|
||||
// log.error("sql脚本执行发生异常:{}", e.getMessage());
|
||||
// return e.getMessage();
|
||||
// } finally {
|
||||
// releaseConnection(connection);
|
||||
// }
|
||||
// return "success";
|
||||
// }
|
||||
|
||||
|
||||
/**
|
||||
* 批量执行sql
|
||||
*
|
||||
* @param connection /
|
||||
* @param sqlList /
|
||||
*/
|
||||
// public static void batchExecute(Connection connection, List<String> sqlList) {
|
||||
// Statement st = null;
|
||||
// try {
|
||||
// st = connection.createStatement();
|
||||
// for (String sql : sqlList) {
|
||||
// if (sql.endsWith(";")) {
|
||||
// sql = sql.substring(0, sql.length() - 1);
|
||||
// }
|
||||
// st.addBatch(sql);
|
||||
// }
|
||||
// st.executeBatch();
|
||||
// } catch (SQLException throwables) {
|
||||
// throwables.printStackTrace();
|
||||
// } finally {
|
||||
// CloseUtil.close(st);
|
||||
// }
|
||||
// }
|
||||
|
||||
/**
|
||||
* 将文件中的sql语句以;为单位读取到列表中
|
||||
*
|
||||
* @param sqlFile /
|
||||
* @return /
|
||||
* @throws Exception e
|
||||
*/
|
||||
// private static List<String> readSqlList(File sqlFile) throws Exception {
|
||||
// List<String> sqlList = Lists.newArrayList();
|
||||
// StringBuilder sb = new StringBuilder();
|
||||
// try (BufferedReader reader = new BufferedReader(new InputStreamReader(
|
||||
// new FileInputStream(sqlFile), StandardCharsets.UTF_8))) {
|
||||
// String tmp;
|
||||
// while ((tmp = reader.readLine()) != null) {
|
||||
// log.info("line:{}", tmp);
|
||||
// if (tmp.endsWith(";")) {
|
||||
// sb.append(tmp);
|
||||
// sqlList.add(sb.toString());
|
||||
// sb.delete(0, sb.length());
|
||||
// } else {
|
||||
// sb.append(tmp);
|
||||
// }
|
||||
// }
|
||||
// if (!"".endsWith(sb.toString().trim())) {
|
||||
// sqlList.add(sb.toString());
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// return sqlList;
|
||||
// }
|
||||
|
||||
}
|
||||
@@ -1,86 +0,0 @@
|
||||
package vben.core.common.utils.db;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
//数据库连接Pojo
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class Zconn {
|
||||
private String name;
|
||||
|
||||
private String type;
|
||||
|
||||
private String url;
|
||||
|
||||
private String username;
|
||||
|
||||
private String passcode;
|
||||
|
||||
public String getSid()
|
||||
{
|
||||
if(isMysql())
|
||||
{
|
||||
String lasturl=url.split("\\?")[0];
|
||||
return lasturl.substring(lasturl.lastIndexOf("/")+1);
|
||||
}
|
||||
else if (isOracle())
|
||||
{
|
||||
if(url.indexOf("/")>0){
|
||||
return url.substring(url.lastIndexOf("/")+1);
|
||||
}else{
|
||||
return url.substring(url.lastIndexOf(":")+1);
|
||||
}
|
||||
}
|
||||
else if (isSqlserver())
|
||||
{
|
||||
return url.substring(url.lastIndexOf("Name=")+5);
|
||||
}
|
||||
else if (isDb2())
|
||||
{
|
||||
return url.substring(url.lastIndexOf("/")+1);
|
||||
}
|
||||
else{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public String getDriver(){
|
||||
if(isOracle()){
|
||||
return "oracle.jdbc.driver.OracleDriver";
|
||||
}else if(isMysql()){
|
||||
return "com.mysql.jdbc.Driver";
|
||||
}else if(isMysql8()){
|
||||
return "com.mysql.cj.jdbc.Driver";
|
||||
}else if(isDb2()){
|
||||
return "com.ibm.db2.jcc.DB2Driver";
|
||||
}else{
|
||||
return "暂不支持";
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isOracle()
|
||||
{
|
||||
return DbType.ORACLE.equals(type);
|
||||
}
|
||||
public boolean isMysql()
|
||||
{
|
||||
return DbType.MYSQL.equals(type);
|
||||
}
|
||||
public boolean isMysql8()
|
||||
{
|
||||
return DbType.MYSQL8.equals(type);
|
||||
}
|
||||
|
||||
public boolean isDb2()
|
||||
{
|
||||
return DbType.DB2.equals(type);
|
||||
}
|
||||
|
||||
public boolean isSqlserver()
|
||||
{
|
||||
return DbType.SQL_SERVER.equals(type);
|
||||
}
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
package vben.core.common.utils.extra;
|
||||
|
||||
import cn.hutool.extra.spring.SpringUtil;
|
||||
import org.springframework.aop.framework.AopContext;
|
||||
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* spring工具类
|
||||
*
|
||||
* @author Lion Li
|
||||
*/
|
||||
@Component
|
||||
public final class SpringUtils extends SpringUtil {
|
||||
|
||||
/**
|
||||
* 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
|
||||
*
|
||||
* @param name
|
||||
* @return boolean
|
||||
*/
|
||||
public static boolean containsBean(String name) {
|
||||
return getBeanFactory().containsBean(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断以给定名字注册的bean定义是一个singleton还是一个prototype。
|
||||
* 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
|
||||
*
|
||||
* @param name
|
||||
* @return boolean
|
||||
*/
|
||||
public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
|
||||
return getBeanFactory().isSingleton(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param name
|
||||
* @return Class 注册对象的类型
|
||||
*/
|
||||
public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {
|
||||
return getBeanFactory().getType(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* 如果给定的bean名字在bean定义中有别名,则返回这些别名
|
||||
*
|
||||
* @param name
|
||||
*/
|
||||
public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
|
||||
return getBeanFactory().getAliases(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取aop代理对象
|
||||
*
|
||||
* @param invoker
|
||||
* @return
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T> T getAopProxy(T invoker) {
|
||||
return (T) AopContext.currentProxy();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,159 +0,0 @@
|
||||
package vben.core.common.utils.file;
|
||||
|
||||
import com.alibaba.excel.EasyExcel;
|
||||
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.NoArgsConstructor;
|
||||
import vben.core.common.utils.file.excel.DefaultExcelListener;
|
||||
import vben.core.common.utils.file.excel.ExcelBigNumberConvert;
|
||||
import vben.core.common.utils.file.excel.ExcelListener;
|
||||
import vben.core.common.utils.file.excel.ExcelResult;
|
||||
import vben.core.common.utils.ruoyi.StringUtils;
|
||||
|
||||
import javax.servlet.ServletOutputStream;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Excel相关处理
|
||||
*
|
||||
* @author Lion Li
|
||||
*/
|
||||
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public class ExcelUtil {
|
||||
|
||||
/**
|
||||
* 同步导入(适用于小数据量)
|
||||
*
|
||||
* @param is 输入流
|
||||
* @return 转换后集合
|
||||
*/
|
||||
public static <T> List<T> importExcel(InputStream is, Class<T> clazz) {
|
||||
return EasyExcel.read(is).head(clazz).autoCloseStream(false).sheet().doReadSync();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 使用校验监听器 异步导入 同步返回
|
||||
*
|
||||
* @param is 输入流
|
||||
* @param clazz 对象类型
|
||||
* @param isValidate 是否 Validator 检验 默认为是
|
||||
* @return 转换后集合
|
||||
*/
|
||||
public static <T> ExcelResult<T> importExcel(InputStream is, Class<T> clazz, boolean isValidate) {
|
||||
DefaultExcelListener<T> listener = new DefaultExcelListener<>(isValidate);
|
||||
EasyExcel.read(is, clazz, listener).sheet().doRead();
|
||||
return listener.getExcelResult();
|
||||
}
|
||||
|
||||
/**
|
||||
* 使用自定义监听器 异步导入 自定义返回
|
||||
*
|
||||
* @param is 输入流
|
||||
* @param clazz 对象类型
|
||||
* @param listener 自定义监听器
|
||||
* @return 转换后集合
|
||||
*/
|
||||
public static <T> ExcelResult<T> importExcel(InputStream is, Class<T> clazz, ExcelListener<T> listener) {
|
||||
EasyExcel.read(is, clazz, listener).sheet().doRead();
|
||||
return listener.getExcelResult();
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出excel
|
||||
*
|
||||
* @param list 导出数据集合
|
||||
* @param sheetName 工作表的名称
|
||||
* @return 结果
|
||||
*/
|
||||
public static <T> void exportExcel(List<T> list, String sheetName, Class<T> clazz, HttpServletResponse response) {
|
||||
try {
|
||||
String filename = encodingFilename(sheetName);
|
||||
// response.reset();
|
||||
FileUtils.setAttachmentResponseHeader(response, filename);
|
||||
// response.setContentType("application/vnd.ms-excel");
|
||||
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");
|
||||
// response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");
|
||||
ServletOutputStream os = response.getOutputStream();
|
||||
EasyExcel.write(os, clazz)
|
||||
.autoCloseStream(false)
|
||||
// 自动适配
|
||||
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
|
||||
// 大数值自动转换 防止失真
|
||||
.registerConverter(new ExcelBigNumberConvert())
|
||||
.sheet(sheetName).doWrite(list);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException("导出Excel异常");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析导出值 0=男,1=女,2=未知
|
||||
*
|
||||
* @param propertyValue 参数值
|
||||
* @param converterExp 翻译注解
|
||||
* @param separator 分隔符
|
||||
* @return 解析后值
|
||||
*/
|
||||
public static String convertByExp(String propertyValue, String converterExp, String separator) {
|
||||
StringBuilder propertyString = new StringBuilder();
|
||||
String[] convertSource = converterExp.split(",");
|
||||
for (String item : convertSource) {
|
||||
String[] itemArray = item.split("=");
|
||||
if (StringUtils.containsAny(separator, propertyValue)) {
|
||||
for (String value : propertyValue.split(separator)) {
|
||||
if (itemArray[0].equals(value)) {
|
||||
propertyString.append(itemArray[1] + separator);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (itemArray[0].equals(propertyValue)) {
|
||||
return itemArray[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
return StringUtils.stripEnd(propertyString.toString(), separator);
|
||||
}
|
||||
|
||||
/**
|
||||
* 反向解析值 男=0,女=1,未知=2
|
||||
*
|
||||
* @param propertyValue 参数值
|
||||
* @param converterExp 翻译注解
|
||||
* @param separator 分隔符
|
||||
* @return 解析后值
|
||||
*/
|
||||
public static String reverseByExp(String propertyValue, String converterExp, String separator) {
|
||||
StringBuilder propertyString = new StringBuilder();
|
||||
String[] convertSource = converterExp.split(",");
|
||||
for (String item : convertSource) {
|
||||
String[] itemArray = item.split("=");
|
||||
if (StringUtils.containsAny(separator, propertyValue)) {
|
||||
for (String value : propertyValue.split(separator)) {
|
||||
if (itemArray[1].equals(value)) {
|
||||
propertyString.append(itemArray[0] + separator);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (itemArray[1].equals(propertyValue)) {
|
||||
return itemArray[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
return StringUtils.stripEnd(propertyString.toString(), separator);
|
||||
}
|
||||
|
||||
/**
|
||||
* 编码文件名
|
||||
*/
|
||||
public static String encodingFilename(String filename) {
|
||||
// return IdUtil.fastSimpleUUID() + "_" + filename + ".xlsx";
|
||||
return filename + ".xlsx";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
package vben.core.common.utils.file;
|
||||
|
||||
import cn.hutool.core.io.FileUtil;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
/**
|
||||
* 文件处理工具类
|
||||
*
|
||||
* @author Lion Li
|
||||
*/
|
||||
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public class FileUtils extends FileUtil {
|
||||
|
||||
/**
|
||||
* 下载文件名重新编码
|
||||
*
|
||||
* @param response 响应对象
|
||||
* @param realFileName 真实文件名
|
||||
*/
|
||||
public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException {
|
||||
String percentEncodedFileName = percentEncode(realFileName);
|
||||
|
||||
StringBuilder contentDispositionValue = new StringBuilder();
|
||||
contentDispositionValue.append("attachment; filename=")
|
||||
.append(percentEncodedFileName)
|
||||
.append(";")
|
||||
.append("filename*=")
|
||||
.append("utf-8''")
|
||||
.append(percentEncodedFileName);
|
||||
|
||||
response.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename");
|
||||
response.setHeader("Content-disposition", contentDispositionValue.toString());
|
||||
response.setHeader("download-filename", percentEncodedFileName);
|
||||
}
|
||||
|
||||
/**
|
||||
* 百分号编码工具方法
|
||||
*
|
||||
* @param s 需要百分号编码的字符串
|
||||
* @return 百分号编码后的字符串
|
||||
*/
|
||||
public static String percentEncode(String s) throws UnsupportedEncodingException {
|
||||
String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString());
|
||||
return encode.replaceAll("\\+", "%20");
|
||||
}
|
||||
}
|
||||
@@ -1,186 +0,0 @@
|
||||
package vben.core.common.utils.file;
|
||||
|
||||
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
|
||||
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
||||
import org.apache.poi.ss.usermodel.*;
|
||||
import org.apache.poi.ss.util.CellRangeAddress;
|
||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Iterator;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public class XexcelUtil
|
||||
{
|
||||
//转换列数字序号列字母序号
|
||||
public static String excelColIndexToStr(int columnIndex)
|
||||
{
|
||||
if (columnIndex <= 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
String columnStr = "";
|
||||
columnIndex--;
|
||||
do
|
||||
{
|
||||
if (columnStr.length() > 0)
|
||||
{
|
||||
columnIndex--;
|
||||
}
|
||||
columnStr = ((char) (columnIndex % 26 + (int) 'A')) + columnStr;
|
||||
columnIndex = ((columnIndex - columnIndex % 26) / 26);
|
||||
} while (columnIndex > 0);
|
||||
return columnStr;
|
||||
}
|
||||
|
||||
|
||||
//---------------------以下为EXCEL复制功能-----------------
|
||||
|
||||
|
||||
//行复制功能
|
||||
public static void copyRow(Row fromRow, Row toRow, boolean copyValueFlag) {
|
||||
toRow.setHeight(fromRow.getHeight());
|
||||
for(Iterator cellIt = fromRow.cellIterator(); cellIt.hasNext(); ) {
|
||||
Cell tmpCell = (Cell) cellIt.next();
|
||||
Cell newCell = toRow.createCell(tmpCell.getColumnIndex());
|
||||
copyCell(tmpCell, newCell, copyValueFlag);
|
||||
}
|
||||
Sheet worksheet = fromRow.getSheet();
|
||||
for(int i = 0; i < worksheet.getNumMergedRegions(); i++) {
|
||||
CellRangeAddress cellRangeAddress = worksheet.getMergedRegion(i);
|
||||
if(cellRangeAddress.getFirstRow() == fromRow.getRowNum()) {
|
||||
CellRangeAddress newCellRangeAddress = new CellRangeAddress(toRow.getRowNum(), (toRow.getRowNum() +
|
||||
(cellRangeAddress.getLastRow() - cellRangeAddress.getFirstRow())), cellRangeAddress
|
||||
.getFirstColumn(), cellRangeAddress.getLastColumn());
|
||||
worksheet.addMergedRegionUnsafe(newCellRangeAddress);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//复制单元格 true则连同cell的内容一起复制
|
||||
public static void copyCell(Cell srcCell, Cell distCell, boolean copyValueFlag) {
|
||||
//样式
|
||||
distCell.setCellStyle(srcCell.getCellStyle());
|
||||
//评论
|
||||
if(srcCell.getCellComment() != null) {
|
||||
distCell.setCellComment(srcCell.getCellComment());
|
||||
}
|
||||
// 不同数据类型处理
|
||||
CellType srcCellType = srcCell.getCellTypeEnum();
|
||||
distCell.setCellType(srcCellType);
|
||||
if(copyValueFlag) {
|
||||
if(srcCellType == CellType.NUMERIC) {
|
||||
if(DateUtil.isCellDateFormatted(srcCell)) {
|
||||
distCell.setCellValue(srcCell.getDateCellValue());
|
||||
} else {
|
||||
distCell.setCellValue(srcCell.getNumericCellValue());
|
||||
}
|
||||
} else if(srcCellType == CellType.STRING) {
|
||||
distCell.setCellValue(srcCell.getRichStringCellValue());
|
||||
} else if(srcCellType == CellType.BLANK) {
|
||||
|
||||
} else if(srcCellType == CellType.BOOLEAN) {
|
||||
distCell.setCellValue(srcCell.getBooleanCellValue());
|
||||
} else if(srcCellType == CellType.ERROR) {
|
||||
distCell.setCellErrorValue(srcCell.getErrorCellValue());
|
||||
} else if(srcCellType == CellType.FORMULA) {
|
||||
distCell.setCellFormula(srcCell.getCellFormula());
|
||||
} else {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//复制单元格 true则连同cell的内容一起复制
|
||||
public static HSSFCellStyle createCellStyle(HSSFWorkbook workbook,short index)
|
||||
{
|
||||
HSSFCellStyle style = workbook.createCellStyle();
|
||||
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
|
||||
style.setFillForegroundColor(index);
|
||||
style.setBorderBottom(BorderStyle.HAIR);
|
||||
style.setBorderTop(BorderStyle.HAIR);
|
||||
style.setBorderLeft(BorderStyle.HAIR);
|
||||
style.setBorderRight(BorderStyle.HAIR);
|
||||
return style;
|
||||
}
|
||||
|
||||
public static Object getCellValue(Cell cell)
|
||||
{
|
||||
Object back = null;
|
||||
if (null != cell)
|
||||
{
|
||||
switch (cell.getCellType())
|
||||
{
|
||||
case BLANK:
|
||||
back = null;
|
||||
break;
|
||||
case BOOLEAN:
|
||||
back = Boolean.toString(cell.getBooleanCellValue());
|
||||
break;
|
||||
//数值
|
||||
case NUMERIC:
|
||||
if (DateUtil.isCellDateFormatted(cell))
|
||||
{
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
|
||||
back = dateFormat.format(cell.getDateCellValue());
|
||||
} else
|
||||
{
|
||||
cell.setCellType(CellType.STRING);
|
||||
String temp = cell.getStringCellValue();
|
||||
//判断是否包含小数点,如果不含小数点,则以字符串读取,如果含小数点,则转换为Double类型的字符串
|
||||
if (temp.indexOf(".") > -1)
|
||||
{
|
||||
back = String.valueOf(new Double(temp)).trim();
|
||||
} else
|
||||
{
|
||||
back = temp.trim();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case STRING:
|
||||
back = cell.getStringCellValue().trim();
|
||||
if ("".equals(back))
|
||||
{
|
||||
back = null;
|
||||
}
|
||||
break;
|
||||
case ERROR:
|
||||
back = null;
|
||||
break;
|
||||
case FORMULA:
|
||||
cell.setCellType(CellType.STRING);
|
||||
back = cell.getStringCellValue();
|
||||
break;
|
||||
default:
|
||||
back = null;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return back;
|
||||
}
|
||||
|
||||
public static Workbook getWorkbook(MultipartFile file) throws IOException {
|
||||
InputStream in = file.getInputStream();
|
||||
String fileName = file.getOriginalFilename();
|
||||
if (fileName.toLowerCase().endsWith("xls")) {
|
||||
return new HSSFWorkbook(in);
|
||||
}
|
||||
if (fileName.toLowerCase().endsWith("xlsx")) {
|
||||
return new XSSFWorkbook(in);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static void closeWorkBook(Workbook workbook) {
|
||||
if(workbook!=null){
|
||||
try {
|
||||
workbook.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
package vben.core.common.utils.file;
|
||||
|
||||
import java.io.*;
|
||||
import java.nio.charset.Charset;
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.Enumeration;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipFile;
|
||||
|
||||
public class XfileUtil
|
||||
{
|
||||
public static String getFileSize(long fileS)
|
||||
{
|
||||
String size = "";
|
||||
DecimalFormat df = new DecimalFormat("#.00");
|
||||
if (fileS < 1024)
|
||||
{
|
||||
size = df.format((double) fileS) + "B";
|
||||
} else if (fileS < 1048576)
|
||||
{
|
||||
size = df.format((double) fileS / 1024) + "KB";
|
||||
} else if (fileS < 1073741824)
|
||||
{
|
||||
size = df.format((double) fileS / 1048576) + "MB";
|
||||
} else
|
||||
{
|
||||
size = df.format((double) fileS / 1073741824) + "GB";
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
public static void unZipFiles(File zipFile,String descDir)throws IOException
|
||||
{
|
||||
File pathFile = new File(descDir);
|
||||
if(!pathFile.exists())
|
||||
{
|
||||
pathFile.mkdirs();
|
||||
}
|
||||
//解决zip文件中有中文目录或者中文文件
|
||||
ZipFile zip = new ZipFile(zipFile, Charset.forName("GBK"));
|
||||
for(Enumeration entries = zip.entries(); entries.hasMoreElements();)
|
||||
{
|
||||
ZipEntry entry = (ZipEntry)entries.nextElement();
|
||||
String zipEntryName = entry.getName();
|
||||
int len2=zipEntryName.split("/")[0].length();
|
||||
zipEntryName = zipEntryName.substring(len2, zipEntryName.length());
|
||||
System.out.println(zipEntryName);
|
||||
InputStream in = zip.getInputStream(entry);
|
||||
String outPath = (descDir+zipEntryName).replaceAll("\\*", "/");;
|
||||
//判断路径是否存在,不存在则创建文件路径
|
||||
File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));
|
||||
if(!file.exists())
|
||||
{
|
||||
file.mkdirs();
|
||||
}
|
||||
//判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
|
||||
if(new File(outPath).isDirectory())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
//输出文件路径信息
|
||||
// System.out.println(outPath);
|
||||
OutputStream out = new FileOutputStream(outPath);
|
||||
byte[] buf1 = new byte[1024];
|
||||
int len;
|
||||
while((len=in.read(buf1))>0)
|
||||
{
|
||||
out.write(buf1,0,len);
|
||||
}
|
||||
in.close();
|
||||
out.close();
|
||||
}
|
||||
// System.out.println("******************解压完毕********************");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,100 +0,0 @@
|
||||
package vben.core.common.utils.file;
|
||||
|
||||
import com.itextpdf.text.BaseColor;
|
||||
import com.itextpdf.text.DocumentException;
|
||||
import com.itextpdf.text.Element;
|
||||
import com.itextpdf.text.pdf.BaseFont;
|
||||
import com.itextpdf.text.pdf.PdfContentByte;
|
||||
import com.itextpdf.text.pdf.PdfGState;
|
||||
import com.itextpdf.text.pdf.PdfReader;
|
||||
import com.itextpdf.text.pdf.PdfStamper;
|
||||
|
||||
import java.io.*;
|
||||
|
||||
public class XpdfUtil {
|
||||
|
||||
|
||||
/**
|
||||
* 中间或者两边水印
|
||||
* @param bos 添加完水印的输出
|
||||
* @param input 原PDF文件输入
|
||||
* @param word 水印内容
|
||||
* @param model 水印添加位置1中间,2两边
|
||||
*/
|
||||
public static void setWatermark(BufferedOutputStream bos, InputStream input, String word, int model) {
|
||||
PdfReader reader = null;
|
||||
try {
|
||||
reader = new PdfReader(input);
|
||||
PdfStamper stamper = new PdfStamper(reader, bos);
|
||||
PdfContentByte content;
|
||||
// 创建字体,第一个参数是字体路径,itext有一些默认的字体比如说:
|
||||
// BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
|
||||
//2 BaseFont base = BaseFont.createFont("/msyh.ttf", BaseFont.IDENTITY_H,
|
||||
// BaseFont.EMBEDDED);
|
||||
//这个是为了解决linux服务器,水印乱码问题,如果是windows服务器,用第一个就可以。
|
||||
// 需要指定的字体,用第2,3个写法,在resources文件夹下放置对应字体就行。
|
||||
|
||||
// BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
|
||||
BaseFont base = BaseFont.createFont("C:/WINDOWS/Fonts/simhei.ttf", BaseFont.IDENTITY_H,BaseFont.EMBEDDED);
|
||||
// BaseFont base = BaseFont.createFont();
|
||||
|
||||
PdfGState gs = new PdfGState();
|
||||
// 获取PDF页数
|
||||
int total = reader.getNumberOfPages();
|
||||
// 遍历每一页
|
||||
for (int i = 0; i < total; i++) {
|
||||
// 页宽度
|
||||
float width = reader.getPageSize(i + 1).getWidth();
|
||||
// 页高度
|
||||
float height = reader.getPageSize(i + 1).getHeight();
|
||||
// 内容
|
||||
content = stamper.getOverContent(i + 1);
|
||||
//开始写入文本
|
||||
content.beginText();
|
||||
//水印透明度
|
||||
gs.setFillOpacity(0.2f);
|
||||
content.setGState(gs);
|
||||
content.setColorFill(BaseColor.LIGHT_GRAY);
|
||||
//设置字体的输出位置
|
||||
content.setTextMatrix(70, 200);
|
||||
|
||||
if (model == 1) {
|
||||
//平行居中的3条水印
|
||||
//字体大小
|
||||
content.setFontAndSize(base, 50);
|
||||
//showTextAligned 方法的参数分别是(文字对齐方式,位置内容,输出水印X轴位置,Y轴位置,旋转角度)
|
||||
content.showTextAligned(Element.ALIGN_CENTER, word, width / 2, 650, 30);
|
||||
content.showTextAligned(Element.ALIGN_CENTER, word, width / 2, 400, 30);
|
||||
content.showTextAligned(Element.ALIGN_CENTER, word, width / 2, 150, 30);
|
||||
} else {
|
||||
// 左右两边个从上到下4条水印
|
||||
// 水印旋转度数
|
||||
float rotation = 30;
|
||||
content.setFontAndSize(base, 20);
|
||||
content.showTextAligned(Element.ALIGN_LEFT, word, 20, height - 50, rotation);
|
||||
content.showTextAligned(Element.ALIGN_LEFT, word, 20, height / 4 * 3 - 50, rotation);
|
||||
content.showTextAligned(Element.ALIGN_LEFT, word, 20, height / 2 - 50, rotation);
|
||||
content.showTextAligned(Element.ALIGN_LEFT, word, 20, height / 4 - 50, rotation);
|
||||
|
||||
content.setFontAndSize(base, 22);
|
||||
content.showTextAligned(Element.ALIGN_RIGHT, word, width - 20, height - 50, rotation);
|
||||
content.showTextAligned(Element.ALIGN_RIGHT, word, width - 20, height / 4 * 3 - 50, rotation);
|
||||
content.showTextAligned(Element.ALIGN_RIGHT, word, width - 20, height / 2 - 50, rotation);
|
||||
content.showTextAligned(Element.ALIGN_RIGHT, word, width - 20, height / 4 - 50, rotation);
|
||||
}
|
||||
//结束写入文本
|
||||
content.endText();
|
||||
//要打图片水印的话
|
||||
//Image image = Image.getInstance("c:/1.jpg");
|
||||
//content.addImage(image);
|
||||
}
|
||||
stamper.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} catch (DocumentException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,103 +0,0 @@
|
||||
package vben.core.common.utils.file;
|
||||
|
||||
import com.google.zxing.*;
|
||||
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
|
||||
import com.google.zxing.common.BitMatrix;
|
||||
import com.google.zxing.common.HybridBinarizer;
|
||||
import com.google.zxing.qrcode.QRCodeReader;
|
||||
import com.google.zxing.qrcode.QRCodeWriter;
|
||||
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import java.awt.*;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.*;
|
||||
import java.util.Hashtable;
|
||||
|
||||
public class XqcodeUtil {
|
||||
/**
|
||||
* 生成包含字符串信息的二维码图片
|
||||
* @param outputStream 文件输出流路径
|
||||
* @param content 二维码携带信息
|
||||
* @param qrCodeSize 二维码图片大小
|
||||
* @param imageFormat 二维码的格式
|
||||
* @throws WriterException
|
||||
* @throws IOException
|
||||
*/
|
||||
public static boolean createQrCode(OutputStream outputStream, String content, int qrCodeSize, String imageFormat) throws WriterException, IOException{
|
||||
//设置二维码纠错级别MAP
|
||||
Hashtable<EncodeHintType, ErrorCorrectionLevel> hintMap = new Hashtable<EncodeHintType, ErrorCorrectionLevel>();
|
||||
hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L); // 矫错级别
|
||||
QRCodeWriter qrCodeWriter = new QRCodeWriter();
|
||||
//创建比特矩阵(位矩阵)的QR码编码的字符串
|
||||
BitMatrix byteMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, qrCodeSize, qrCodeSize, hintMap);
|
||||
// 使BufferedImage勾画QRCode (matrixWidth 是行二维码像素点)
|
||||
int matrixWidth = byteMatrix.getWidth();
|
||||
BufferedImage image = new BufferedImage(matrixWidth-200, matrixWidth-200, BufferedImage.TYPE_INT_RGB);
|
||||
image.createGraphics();
|
||||
Graphics2D graphics = (Graphics2D) image.getGraphics();
|
||||
graphics.setColor(Color.WHITE);
|
||||
graphics.fillRect(0, 0, matrixWidth, matrixWidth);
|
||||
// 使用比特矩阵画并保存图像
|
||||
graphics.setColor(Color.BLACK);
|
||||
for (int i = 0; i < matrixWidth; i++){
|
||||
for (int j = 0; j < matrixWidth; j++){
|
||||
if (byteMatrix.get(i, j)){
|
||||
graphics.fillRect(i-100, j-100, 1, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
return ImageIO.write(image, imageFormat, outputStream);
|
||||
}
|
||||
|
||||
|
||||
public static InputStream createQrCode(String content, int qrCodeSize, String imageFormat) throws WriterException, IOException{
|
||||
//设置二维码纠错级别MAP
|
||||
Hashtable<EncodeHintType, ErrorCorrectionLevel> hintMap = new Hashtable<EncodeHintType, ErrorCorrectionLevel>();
|
||||
hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L); // 矫错级别
|
||||
QRCodeWriter qrCodeWriter = new QRCodeWriter();
|
||||
//创建比特矩阵(位矩阵)的QR码编码的字符串
|
||||
BitMatrix byteMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, qrCodeSize, qrCodeSize, hintMap);
|
||||
// 使BufferedImage勾画QRCode (matrixWidth 是行二维码像素点)
|
||||
int matrixWidth = byteMatrix.getWidth();
|
||||
BufferedImage image = new BufferedImage(matrixWidth-200, matrixWidth-200, BufferedImage.TYPE_INT_RGB);
|
||||
image.createGraphics();
|
||||
Graphics2D graphics = (Graphics2D) image.getGraphics();
|
||||
graphics.setColor(Color.WHITE);
|
||||
graphics.fillRect(0, 0, matrixWidth, matrixWidth);
|
||||
// 使用比特矩阵画并保存图像
|
||||
graphics.setColor(Color.BLACK);
|
||||
for (int i = 0; i < matrixWidth; i++){
|
||||
for (int j = 0; j < matrixWidth; j++){
|
||||
if (byteMatrix.get(i, j)){
|
||||
graphics.fillRect(i-100, j-100, 1, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
||||
ImageIO.write(image, imageFormat, os);
|
||||
return new ByteArrayInputStream(os.toByteArray());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 读二维码并输出携带的信息
|
||||
*/
|
||||
public static void readQrCode(InputStream inputStream) throws IOException{
|
||||
//从输入流中获取字符串信息
|
||||
BufferedImage image = ImageIO.read(inputStream);
|
||||
//将图像转换为二进制位图源
|
||||
LuminanceSource source = new BufferedImageLuminanceSource(image);
|
||||
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
|
||||
QRCodeReader reader = new QRCodeReader();
|
||||
Result result = null ;
|
||||
try {
|
||||
result = reader.decode(bitmap);
|
||||
} catch (ReaderException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
// System.out.println(result.getText());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -1,107 +0,0 @@
|
||||
package vben.core.common.utils.file.excel;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.alibaba.excel.context.AnalysisContext;
|
||||
import com.alibaba.excel.event.AnalysisEventListener;
|
||||
import com.alibaba.excel.exception.ExcelAnalysisException;
|
||||
import com.alibaba.excel.exception.ExcelDataConvertException;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import javax.validation.ConstraintViolation;
|
||||
import javax.validation.ConstraintViolationException;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Excel 导入监听
|
||||
*
|
||||
* @author Yjoioooo
|
||||
* @author Lion Li
|
||||
*/
|
||||
@Slf4j
|
||||
@NoArgsConstructor
|
||||
public class DefaultExcelListener<T> extends AnalysisEventListener<T> implements ExcelListener<T> {
|
||||
|
||||
/**
|
||||
* 是否Validator检验,默认为是
|
||||
*/
|
||||
private Boolean isValidate = Boolean.TRUE;
|
||||
|
||||
/**
|
||||
* excel 表头数据
|
||||
*/
|
||||
private Map<Integer, String> headMap;
|
||||
|
||||
/**
|
||||
* 导入回执
|
||||
*/
|
||||
private ExcelResult<T> excelResult;
|
||||
|
||||
public DefaultExcelListener(boolean isValidate) {
|
||||
this.excelResult = new DefautExcelResult<>();
|
||||
this.isValidate = isValidate;
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理异常
|
||||
*
|
||||
* @param exception ExcelDataConvertException
|
||||
* @param context Excel 上下文
|
||||
*/
|
||||
@Override
|
||||
public void onException(Exception exception, AnalysisContext context) throws Exception {
|
||||
String errMsg = null;
|
||||
if (exception instanceof ExcelDataConvertException) {
|
||||
// 如果是某一个单元格的转换异常 能获取到具体行号
|
||||
ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException) exception;
|
||||
Integer rowIndex = excelDataConvertException.getRowIndex();
|
||||
Integer columnIndex = excelDataConvertException.getColumnIndex();
|
||||
errMsg = StrUtil.format("第{}行-第{}列-表头{}: 解析异常<br/>",
|
||||
rowIndex + 1, columnIndex + 1, headMap.get(columnIndex));
|
||||
if (log.isDebugEnabled()) {
|
||||
log.error(errMsg);
|
||||
}
|
||||
}
|
||||
if (exception instanceof ConstraintViolationException) {
|
||||
ConstraintViolationException constraintViolationException = (ConstraintViolationException) exception;
|
||||
Set<ConstraintViolation<?>> constraintViolations = constraintViolationException.getConstraintViolations();
|
||||
String constraintViolationsMsg = constraintViolations.stream()
|
||||
.map(ConstraintViolation::getMessage)
|
||||
.collect(Collectors.joining(", "));
|
||||
errMsg = StrUtil.format("第{}行数据校验异常: {}", context.readRowHolder().getRowIndex() + 1, constraintViolationsMsg);
|
||||
if (log.isDebugEnabled()) {
|
||||
log.error(errMsg);
|
||||
}
|
||||
}
|
||||
excelResult.getErrorList().add(errMsg);
|
||||
throw new ExcelAnalysisException(errMsg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
|
||||
this.headMap = headMap;
|
||||
// log.debug("解析到一条表头数据: {}", JsonUtils.toJsonString(headMap));
|
||||
log.debug("解析到一条表头数据: {}");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void invoke(T data, AnalysisContext context) {
|
||||
if (isValidate) {
|
||||
// ValidatorUtils.validate(data);
|
||||
}
|
||||
excelResult.getList().add(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doAfterAllAnalysed(AnalysisContext context) {
|
||||
log.debug("所有数据解析完成!");
|
||||
}
|
||||
|
||||
@Override
|
||||
public ExcelResult<T> getExcelResult() {
|
||||
return excelResult;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,73 +0,0 @@
|
||||
package vben.core.common.utils.file.excel;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 默认excel返回对象
|
||||
*
|
||||
* @author Yjoioooo
|
||||
* @author Lion Li
|
||||
*/
|
||||
public class DefautExcelResult<T> implements ExcelResult<T> {
|
||||
|
||||
/**
|
||||
* 数据对象list
|
||||
*/
|
||||
@Setter
|
||||
private List<T> list;
|
||||
|
||||
/**
|
||||
* 错误信息列表
|
||||
*/
|
||||
@Setter
|
||||
private List<String> errorList;
|
||||
|
||||
public DefautExcelResult() {
|
||||
this.list = new ArrayList<>();
|
||||
this.errorList = new ArrayList<>();
|
||||
}
|
||||
|
||||
public DefautExcelResult(List<T> list, List<String> errorList) {
|
||||
this.list = list;
|
||||
this.errorList = errorList;
|
||||
}
|
||||
|
||||
public DefautExcelResult(ExcelResult<T> excelResult) {
|
||||
this.list = excelResult.getList();
|
||||
this.errorList = excelResult.getErrorList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<T> getList() {
|
||||
return list;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getErrorList() {
|
||||
return errorList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取导入回执
|
||||
*
|
||||
* @return 导入回执
|
||||
*/
|
||||
@Override
|
||||
public String getAnalysis() {
|
||||
int successCount = list.size();
|
||||
int errorCount = errorList.size();
|
||||
if (successCount == 0) {
|
||||
return "读取失败,未解析到数据";
|
||||
} else {
|
||||
if (errorCount == 0) {
|
||||
return StrUtil.format("恭喜您,全部读取成功!共{}条", successCount);
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
package vben.core.common.utils.file.excel;
|
||||
|
||||
import cn.hutool.core.convert.Convert;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import com.alibaba.excel.converters.Converter;
|
||||
import com.alibaba.excel.enums.CellDataTypeEnum;
|
||||
import com.alibaba.excel.metadata.GlobalConfiguration;
|
||||
import com.alibaba.excel.metadata.data.ReadCellData;
|
||||
import com.alibaba.excel.metadata.data.WriteCellData;
|
||||
import com.alibaba.excel.metadata.property.ExcelContentProperty;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* 大数值转换
|
||||
* Excel 数值长度位15位 大于15位的数值转换位字符串
|
||||
*
|
||||
* @author Lion Li
|
||||
*/
|
||||
@Slf4j
|
||||
public class ExcelBigNumberConvert implements Converter<Long> {
|
||||
|
||||
@Override
|
||||
public Class<Long> supportJavaTypeKey() {
|
||||
return Long.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CellDataTypeEnum supportExcelTypeKey() {
|
||||
return CellDataTypeEnum.STRING;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
|
||||
return Convert.toLong(cellData.getData());
|
||||
}
|
||||
|
||||
@Override
|
||||
public WriteCellData<Object> convertToExcelData(Long object, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
|
||||
if (ObjectUtil.isNotNull(object)) {
|
||||
String str = Convert.toStr(object);
|
||||
if (str.length() > 15) {
|
||||
return new WriteCellData<>(str);
|
||||
}
|
||||
}
|
||||
WriteCellData<Object> cellData = new WriteCellData<>(new BigDecimal(object));
|
||||
cellData.setType(CellDataTypeEnum.NUMBER);
|
||||
return cellData;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,62 +0,0 @@
|
||||
package vben.core.common.utils.file.excel;
|
||||
|
||||
import cn.hutool.core.annotation.AnnotationUtil;
|
||||
import com.alibaba.excel.converters.Converter;
|
||||
import com.alibaba.excel.enums.CellDataTypeEnum;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
/**
|
||||
* 字典格式化转换处理
|
||||
*
|
||||
* @author Lion Li
|
||||
*/
|
||||
@Slf4j
|
||||
public class ExcelDictConvert implements Converter<Object> {
|
||||
|
||||
@Override
|
||||
public Class<Object> supportJavaTypeKey() {
|
||||
return Object.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CellDataTypeEnum supportExcelTypeKey() {
|
||||
return null;
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public Object convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
|
||||
// ExcelDictFormat anno = getAnnotation(contentProperty.getField());
|
||||
// String type = anno.dictType();
|
||||
// String label = cellData.getStringValue();
|
||||
// String value;
|
||||
// if (StringUtils.isBlank(type)) {
|
||||
// value = ExcelUtil.reverseByExp(label, anno.readConverterExp(), anno.separator());
|
||||
// } else {
|
||||
// value = SpringUtils.getBean(DictService.class).getDictValue(type, label, anno.separator());
|
||||
// }
|
||||
// return Convert.convert(contentProperty.getField().getType(), value);
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public WriteCellData<String> convertToExcelData(Object object, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
|
||||
// if (ObjectUtil.isNull(object)) {
|
||||
// return new WriteCellData<>("");
|
||||
// }
|
||||
// ExcelDictFormat anno = getAnnotation(contentProperty.getField());
|
||||
// String type = anno.dictType();
|
||||
// String value = Convert.toStr(object);
|
||||
// String label;
|
||||
// if (StringUtils.isBlank(type)) {
|
||||
// label = ExcelUtil.convertByExp(value, anno.readConverterExp(), anno.separator());
|
||||
// } else {
|
||||
// label = SpringUtils.getBean(DictService.class).getDictLabel(type, value, anno.separator());
|
||||
// }
|
||||
// return new WriteCellData<>(label);
|
||||
// }
|
||||
|
||||
private ExcelDictFormat getAnnotation(Field field) {
|
||||
return AnnotationUtil.getAnnotation(field, ExcelDictFormat.class);
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
package vben.core.common.utils.file.excel;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
/**
|
||||
* 字典格式化
|
||||
*
|
||||
* @author Lion Li
|
||||
*/
|
||||
@Target({ElementType.FIELD})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Inherited
|
||||
public @interface ExcelDictFormat {
|
||||
|
||||
/**
|
||||
* 如果是字典类型,请设置字典的type值 (如: sys_user_sex)
|
||||
*/
|
||||
String dictType() default "";
|
||||
|
||||
/**
|
||||
* 读取内容转表达式 (如: 0=男,1=女,2=未知)
|
||||
*/
|
||||
String readConverterExp() default "";
|
||||
|
||||
/**
|
||||
* 分隔符,读取字符串组内容
|
||||
*/
|
||||
String separator() default ",";
|
||||
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
package vben.core.common.utils.file.excel;
|
||||
|
||||
import com.alibaba.excel.read.listener.ReadListener;
|
||||
|
||||
/**
|
||||
* Excel 导入监听
|
||||
*
|
||||
* @author Lion Li
|
||||
*/
|
||||
public interface ExcelListener<T> extends ReadListener<T> {
|
||||
|
||||
ExcelResult<T> getExcelResult();
|
||||
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
package vben.core.common.utils.file.excel;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* excel返回对象
|
||||
*
|
||||
* @author Lion Li
|
||||
*/
|
||||
public interface ExcelResult<T> {
|
||||
|
||||
/**
|
||||
* 对象列表
|
||||
*/
|
||||
List<T> getList();
|
||||
|
||||
/**
|
||||
* 错误列表
|
||||
*/
|
||||
List<String> getErrorList();
|
||||
|
||||
/**
|
||||
* 导入回执
|
||||
*/
|
||||
String getAnalysis();
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
package vben.core.common.utils.lang;
|
||||
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
public class IdUtils {
|
||||
|
||||
public static String getUID()
|
||||
{
|
||||
return IdUtil.getSnowflake().nextIdStr();
|
||||
}
|
||||
|
||||
public static String getRSID(int length) {
|
||||
String val = "";
|
||||
Random random = new Random();
|
||||
//参数length,表示生成几位随机数
|
||||
for(int i = 0; i < length; i++) {
|
||||
String charOrNum = random.nextInt(2) % 2 == 0 ? "char" : "num";
|
||||
//输出字母还是数字
|
||||
if( "char".equalsIgnoreCase(charOrNum) ) {
|
||||
//输出是大写字母还是小写字母
|
||||
// int temp = random.nextInt(2) % 2 == 0 ? 65 : 97;
|
||||
val += (char)(random.nextInt(26) + 97);
|
||||
} else if( "num".equalsIgnoreCase(charOrNum) ) {
|
||||
val += String.valueOf(random.nextInt(10));
|
||||
}
|
||||
}
|
||||
return val;
|
||||
}
|
||||
|
||||
public static String getRSID4() { return getRSID(4); }
|
||||
|
||||
public static String getRSID8() {
|
||||
return getRSID(8);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
package vben.core.common.utils.lang;
|
||||
|
||||
import cn.hutool.crypto.SecureUtil;
|
||||
|
||||
public class SecureUtils {
|
||||
|
||||
public static String passwordEncrypt(String password){
|
||||
return SecureUtil.md5("abc" + password + "xyz");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,85 +0,0 @@
|
||||
package vben.core.common.utils.lang;
|
||||
|
||||
import vben.core.common.mvc.pojo.Ztree;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class TreeUtils {
|
||||
|
||||
//高性能转换,但是要求顶层有pid,这里假设为0
|
||||
// public static List<Ztree> buildTree(List<Ztree> pidList) {
|
||||
// Map<String, List<Ztree>> pidListMap = pidList.stream().collect(Collectors.groupingBy(Ztree::getPid));
|
||||
// pidList.stream().forEach(item -> item.setChildren(pidListMap.get(item.getId())));
|
||||
// //返回结果也改为返回顶层节点的list
|
||||
// return pidListMap.get("0");
|
||||
// }
|
||||
|
||||
public static List<Ztree> build(List<Ztree> nodes) {
|
||||
List<Ztree> list = new ArrayList<>();
|
||||
for (Ztree node : nodes) {
|
||||
if (node.getPid() == null) {
|
||||
list.add(findZtreeChildrenByTier(node, nodes));
|
||||
} else {
|
||||
boolean flag = false;
|
||||
for (Ztree node2 : nodes) {
|
||||
if (node.getPid().equals(node2.getId())) {
|
||||
flag = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!flag) {
|
||||
list.add(findZtreeChildrenByTier(node, nodes));
|
||||
}
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
//递归查找子节点
|
||||
private static Ztree findZtreeChildrenByTier(Ztree node, List<Ztree> nodes) {
|
||||
for (Ztree item : nodes) {
|
||||
if (node.getId().equals(item.getPid())) {
|
||||
if (node.getChildren() == null) {
|
||||
node.setChildren(new ArrayList<>());
|
||||
}
|
||||
node.getChildren().add(findZtreeChildrenByTier(item, nodes));
|
||||
}
|
||||
}
|
||||
return node;
|
||||
}
|
||||
|
||||
public static <T extends Ztree> List<T> buildEtree(List<T> nodes) {
|
||||
List<T> list = new ArrayList<>();
|
||||
for (T node : nodes) {
|
||||
if (node.getPid() == null) {
|
||||
list.add(findEtreeChildrenByTier(node, nodes));
|
||||
} else {
|
||||
boolean flag = false;
|
||||
for (T node2 : nodes) {
|
||||
if (node.getPid().equals(node2.getId())) {
|
||||
flag = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!flag) {
|
||||
list.add(findEtreeChildrenByTier(node, nodes));
|
||||
}
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
private static <T extends Ztree> T findEtreeChildrenByTier(T node, List<T> nodes) {
|
||||
for (T item : nodes) {
|
||||
if (node.getId().equals(item.getPid())) {
|
||||
if (node.getChildren() == null) {
|
||||
node.setChildren(new ArrayList<>());
|
||||
}
|
||||
node.getChildren().add(findEtreeChildrenByTier(item, nodes));
|
||||
}
|
||||
}
|
||||
return node;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,114 +0,0 @@
|
||||
package vben.core.common.utils.ruoyi;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
|
||||
/**
|
||||
* 精确的浮点数运算
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
public class Arith
|
||||
{
|
||||
|
||||
/** 默认除法运算精度 */
|
||||
private static final int DEF_DIV_SCALE = 10;
|
||||
|
||||
/** 这个类不能实例化 */
|
||||
private Arith()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* 提供精确的加法运算。
|
||||
* @param v1 被加数
|
||||
* @param v2 加数
|
||||
* @return 两个参数的和
|
||||
*/
|
||||
public static double add(double v1, double v2)
|
||||
{
|
||||
BigDecimal b1 = new BigDecimal(Double.toString(v1));
|
||||
BigDecimal b2 = new BigDecimal(Double.toString(v2));
|
||||
return b1.add(b2).doubleValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* 提供精确的减法运算。
|
||||
* @param v1 被减数
|
||||
* @param v2 减数
|
||||
* @return 两个参数的差
|
||||
*/
|
||||
public static double sub(double v1, double v2)
|
||||
{
|
||||
BigDecimal b1 = new BigDecimal(Double.toString(v1));
|
||||
BigDecimal b2 = new BigDecimal(Double.toString(v2));
|
||||
return b1.subtract(b2).doubleValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* 提供精确的乘法运算。
|
||||
* @param v1 被乘数
|
||||
* @param v2 乘数
|
||||
* @return 两个参数的积
|
||||
*/
|
||||
public static double mul(double v1, double v2)
|
||||
{
|
||||
BigDecimal b1 = new BigDecimal(Double.toString(v1));
|
||||
BigDecimal b2 = new BigDecimal(Double.toString(v2));
|
||||
return b1.multiply(b2).doubleValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
|
||||
* 小数点以后10位,以后的数字四舍五入。
|
||||
* @param v1 被除数
|
||||
* @param v2 除数
|
||||
* @return 两个参数的商
|
||||
*/
|
||||
public static double div(double v1, double v2)
|
||||
{
|
||||
return div(v1, v2, DEF_DIV_SCALE);
|
||||
}
|
||||
|
||||
/**
|
||||
* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
|
||||
* 定精度,以后的数字四舍五入。
|
||||
* @param v1 被除数
|
||||
* @param v2 除数
|
||||
* @param scale 表示表示需要精确到小数点以后几位。
|
||||
* @return 两个参数的商
|
||||
*/
|
||||
public static double div(double v1, double v2, int scale)
|
||||
{
|
||||
if (scale < 0)
|
||||
{
|
||||
throw new IllegalArgumentException(
|
||||
"The scale must be a positive integer or zero");
|
||||
}
|
||||
BigDecimal b1 = new BigDecimal(Double.toString(v1));
|
||||
BigDecimal b2 = new BigDecimal(Double.toString(v2));
|
||||
if (b1.compareTo(BigDecimal.ZERO) == 0)
|
||||
{
|
||||
return BigDecimal.ZERO.doubleValue();
|
||||
}
|
||||
return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* 提供精确的小数位四舍五入处理。
|
||||
* @param v 需要四舍五入的数字
|
||||
* @param scale 小数点后保留几位
|
||||
* @return 四舍五入后的结果
|
||||
*/
|
||||
public static double round(double v, int scale)
|
||||
{
|
||||
if (scale < 0)
|
||||
{
|
||||
throw new IllegalArgumentException(
|
||||
"The scale must be a positive integer or zero");
|
||||
}
|
||||
BigDecimal b = new BigDecimal(Double.toString(v));
|
||||
BigDecimal one = BigDecimal.ONE;
|
||||
return b.divide(one, scale, RoundingMode.HALF_UP).doubleValue();
|
||||
}
|
||||
}
|
||||
@@ -1,184 +0,0 @@
|
||||
package vben.core.common.utils.ruoyi;
|
||||
|
||||
import org.apache.commons.lang3.time.DateFormatUtils;
|
||||
|
||||
import java.lang.management.ManagementFactory;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.*;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 时间工具类
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
public class DateUtils extends org.apache.commons.lang3.time.DateUtils
|
||||
{
|
||||
public static String YYYY = "yyyy";
|
||||
|
||||
public static String YYYY_MM = "yyyy-MM";
|
||||
|
||||
public static String YYYY_MM_DD = "yyyy-MM-dd";
|
||||
|
||||
public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
|
||||
|
||||
public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
|
||||
|
||||
private static String[] parsePatterns = {
|
||||
"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
|
||||
"yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
|
||||
"yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
|
||||
|
||||
/**
|
||||
* 获取当前Date型日期
|
||||
*
|
||||
* @return Date() 当前日期
|
||||
*/
|
||||
public static Date getNowDate()
|
||||
{
|
||||
return new Date();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前日期, 默认格式为yyyy-MM-dd
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public static String getDate()
|
||||
{
|
||||
return dateTimeNow(YYYY_MM_DD);
|
||||
}
|
||||
|
||||
public static final String getTime()
|
||||
{
|
||||
return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
|
||||
}
|
||||
|
||||
public static final String dateTimeNow()
|
||||
{
|
||||
return dateTimeNow(YYYYMMDDHHMMSS);
|
||||
}
|
||||
|
||||
public static final String dateTimeNow(final String format)
|
||||
{
|
||||
return parseDateToStr(format, new Date());
|
||||
}
|
||||
|
||||
public static final String dateTime(final Date date)
|
||||
{
|
||||
return parseDateToStr(YYYY_MM_DD, date);
|
||||
}
|
||||
|
||||
public static final String parseDateToStr(final String format, final Date date)
|
||||
{
|
||||
return new SimpleDateFormat(format).format(date);
|
||||
}
|
||||
|
||||
public static final Date dateTime(final String format, final String ts)
|
||||
{
|
||||
try
|
||||
{
|
||||
return new SimpleDateFormat(format).parse(ts);
|
||||
}
|
||||
catch (ParseException e)
|
||||
{
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 日期路径 即年/月/日 如2018/08/08
|
||||
*/
|
||||
public static final String datePath()
|
||||
{
|
||||
Date now = new Date();
|
||||
return DateFormatUtils.format(now, "yyyy/MM/dd");
|
||||
}
|
||||
|
||||
/**
|
||||
* 日期路径 即年/月/日 如20180808
|
||||
*/
|
||||
public static final String dateTime()
|
||||
{
|
||||
Date now = new Date();
|
||||
return DateFormatUtils.format(now, "yyyyMMdd");
|
||||
}
|
||||
|
||||
/**
|
||||
* 日期型字符串转化为日期 格式
|
||||
*/
|
||||
public static Date parseDate(Object str)
|
||||
{
|
||||
if (str == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
try
|
||||
{
|
||||
return parseDate(str.toString(), parsePatterns);
|
||||
}
|
||||
catch (ParseException e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取服务器启动时间
|
||||
*/
|
||||
public static Date getServerStartDate()
|
||||
{
|
||||
long time = ManagementFactory.getRuntimeMXBean().getStartTime();
|
||||
return new Date(time);
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算相差天数
|
||||
*/
|
||||
public static int differentDaysByMillisecond(Date date1, Date date2)
|
||||
{
|
||||
return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24)));
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算两个时间差
|
||||
*/
|
||||
public static String getDatePoor(Date endDate, Date nowDate)
|
||||
{
|
||||
long nd = 1000 * 24 * 60 * 60;
|
||||
long nh = 1000 * 60 * 60;
|
||||
long nm = 1000 * 60;
|
||||
// long ns = 1000;
|
||||
// 获得两个时间的毫秒时间差异
|
||||
long diff = endDate.getTime() - nowDate.getTime();
|
||||
// 计算差多少天
|
||||
long day = diff / nd;
|
||||
// 计算差多少小时
|
||||
long hour = diff % nd / nh;
|
||||
// 计算差多少分钟
|
||||
long min = diff % nd % nh / nm;
|
||||
// 计算差多少秒//输出结果
|
||||
// long sec = diff % nd % nh % nm / ns;
|
||||
return day + "天" + hour + "小时" + min + "分钟";
|
||||
}
|
||||
|
||||
/**
|
||||
* 增加 LocalDateTime ==> Date
|
||||
*/
|
||||
public static Date toDate(LocalDateTime temporalAccessor)
|
||||
{
|
||||
ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault());
|
||||
return Date.from(zdt.toInstant());
|
||||
}
|
||||
|
||||
/**
|
||||
* 增加 LocalDate ==> Date
|
||||
*/
|
||||
public static Date toDate(LocalDate temporalAccessor)
|
||||
{
|
||||
LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0));
|
||||
ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
|
||||
return Date.from(zdt.toInstant());
|
||||
}
|
||||
}
|
||||
@@ -1,264 +0,0 @@
|
||||
package vben.core.common.utils.ruoyi;
|
||||
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.net.InetAddress;
|
||||
import java.net.UnknownHostException;
|
||||
|
||||
/**
|
||||
* 获取IP方法
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
public class IpUtils
|
||||
{
|
||||
/**
|
||||
* 获取客户端IP
|
||||
*
|
||||
* @param request 请求对象
|
||||
* @return IP地址
|
||||
*/
|
||||
public static String getIpAddr(HttpServletRequest request)
|
||||
{
|
||||
if (request == null)
|
||||
{
|
||||
return "unknown";
|
||||
}
|
||||
String ip = request.getHeader("x-forwarded-for");
|
||||
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("X-Forwarded-For");
|
||||
}
|
||||
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("X-Real-IP");
|
||||
}
|
||||
|
||||
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
|
||||
{
|
||||
ip = request.getRemoteAddr();
|
||||
}
|
||||
|
||||
return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : getMultistageReverseProxyIp(ip);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否为内部IP地址
|
||||
*
|
||||
* @param ip IP地址
|
||||
* @return 结果
|
||||
*/
|
||||
public static boolean internalIp(String ip)
|
||||
{
|
||||
byte[] addr = textToNumericFormatV4(ip);
|
||||
return internalIp(addr) || "127.0.0.1".equals(ip);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否为内部IP地址
|
||||
*
|
||||
* @param addr byte地址
|
||||
* @return 结果
|
||||
*/
|
||||
private static boolean internalIp(byte[] addr)
|
||||
{
|
||||
if ( addr==null || addr.length < 2)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
final byte b0 = addr[0];
|
||||
final byte b1 = addr[1];
|
||||
// 10.x.x.x/8
|
||||
final byte SECTION_1 = 0x0A;
|
||||
// 172.16.x.x/12
|
||||
final byte SECTION_2 = (byte) 0xAC;
|
||||
final byte SECTION_3 = (byte) 0x10;
|
||||
final byte SECTION_4 = (byte) 0x1F;
|
||||
// 192.168.x.x/16
|
||||
final byte SECTION_5 = (byte) 0xC0;
|
||||
final byte SECTION_6 = (byte) 0xA8;
|
||||
switch (b0)
|
||||
{
|
||||
case SECTION_1:
|
||||
return true;
|
||||
case SECTION_2:
|
||||
if (b1 >= SECTION_3 && b1 <= SECTION_4)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
case SECTION_5:
|
||||
switch (b1)
|
||||
{
|
||||
case SECTION_6:
|
||||
return true;
|
||||
}
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 将IPv4地址转换成字节
|
||||
*
|
||||
* @param text IPv4地址
|
||||
* @return byte 字节
|
||||
*/
|
||||
public static byte[] textToNumericFormatV4(String text)
|
||||
{
|
||||
if (text.length() == 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
byte[] bytes = new byte[4];
|
||||
String[] elements = text.split("\\.", -1);
|
||||
try
|
||||
{
|
||||
long l;
|
||||
int i;
|
||||
switch (elements.length)
|
||||
{
|
||||
case 1:
|
||||
l = Long.parseLong(elements[0]);
|
||||
if ((l < 0L) || (l > 4294967295L))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
bytes[0] = (byte) (int) (l >> 24 & 0xFF);
|
||||
bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF);
|
||||
bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
|
||||
bytes[3] = (byte) (int) (l & 0xFF);
|
||||
break;
|
||||
case 2:
|
||||
l = Integer.parseInt(elements[0]);
|
||||
if ((l < 0L) || (l > 255L))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
bytes[0] = (byte) (int) (l & 0xFF);
|
||||
l = Integer.parseInt(elements[1]);
|
||||
if ((l < 0L) || (l > 16777215L))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
bytes[1] = (byte) (int) (l >> 16 & 0xFF);
|
||||
bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
|
||||
bytes[3] = (byte) (int) (l & 0xFF);
|
||||
break;
|
||||
case 3:
|
||||
for (i = 0; i < 2; ++i)
|
||||
{
|
||||
l = Integer.parseInt(elements[i]);
|
||||
if ((l < 0L) || (l > 255L))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
bytes[i] = (byte) (int) (l & 0xFF);
|
||||
}
|
||||
l = Integer.parseInt(elements[2]);
|
||||
if ((l < 0L) || (l > 65535L))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
bytes[2] = (byte) (int) (l >> 8 & 0xFF);
|
||||
bytes[3] = (byte) (int) (l & 0xFF);
|
||||
break;
|
||||
case 4:
|
||||
for (i = 0; i < 4; ++i)
|
||||
{
|
||||
l = Integer.parseInt(elements[i]);
|
||||
if ((l < 0L) || (l > 255L))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
bytes[i] = (byte) (int) (l & 0xFF);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
catch (NumberFormatException e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return bytes;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取IP地址
|
||||
*
|
||||
* @return 本地IP地址
|
||||
*/
|
||||
public static String getHostIp()
|
||||
{
|
||||
try
|
||||
{
|
||||
return InetAddress.getLocalHost().getHostAddress();
|
||||
}
|
||||
catch (UnknownHostException e)
|
||||
{
|
||||
}
|
||||
return "127.0.0.1";
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取主机名
|
||||
*
|
||||
* @return 本地主机名
|
||||
*/
|
||||
public static String getHostName()
|
||||
{
|
||||
try
|
||||
{
|
||||
return InetAddress.getLocalHost().getHostName();
|
||||
}
|
||||
catch (UnknownHostException e)
|
||||
{
|
||||
}
|
||||
return "未知";
|
||||
}
|
||||
|
||||
/**
|
||||
* 从多级反向代理中获得第一个非unknown IP地址
|
||||
*
|
||||
* @param ip 获得的IP地址
|
||||
* @return 第一个非unknown IP地址
|
||||
*/
|
||||
public static String getMultistageReverseProxyIp(String ip)
|
||||
{
|
||||
// 多级反向代理检测
|
||||
if (ip != null && ip.indexOf(",") > 0)
|
||||
{
|
||||
final String[] ips = ip.trim().split(",");
|
||||
for (String subIp : ips)
|
||||
{
|
||||
if (false == isUnknown(subIp))
|
||||
{
|
||||
ip = subIp;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return ip;
|
||||
}
|
||||
|
||||
/**
|
||||
* 检测给定字符串是否为未知,多用于检测HTTP请求相关
|
||||
*
|
||||
* @param checkString 被检测的字符串
|
||||
* @return 是否未知
|
||||
*/
|
||||
public static boolean isUnknown(String checkString)
|
||||
{
|
||||
return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString);
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user