老版本归档与清理

This commit is contained in:
vben
2025-11-15 13:28:18 +08:00
parent 50722b4ba1
commit ab83308a4e
436 changed files with 0 additions and 33326 deletions
-12
View File
@@ -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/
-3
View File
@@ -1,3 +0,0 @@
- **初始化项目 V0.2**
- [更新] README.md、项目介绍
-21
View File
@@ -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.
-63
View File
@@ -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⭐关注 ,感谢支持开源!
```
-102
View File
@@ -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>
-56
View File
@@ -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(-&#45;&#45;){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(-&#45;&#45;){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>
-359
View File
@@ -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;
}
}
@@ -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