新增专为分离端提供的接口Web服务

This commit is contained in:
thinkgem
2022-02-21 16:20:38 +08:00
parent 3aef4ad672
commit 6655214eb2
59 changed files with 7805 additions and 1 deletions

View File

@@ -0,0 +1,30 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
* No deletion without permission, or be held responsible to law.
*/
package com.jeesite.modules;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
/**
* Application
* @author ThinkGem
* @version 2018-10-13
*/
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
this.setRegisterErrorPageFilter(false); // 错误页面有容器来处理而不是SpringBoot
return builder.sources(Application.class);
}
}

View File

@@ -0,0 +1,19 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
* No deletion without permission, or be held responsible to law.
*/
package com.jeesite.modules.test.dao;
import com.jeesite.common.dao.CrudDao;
import com.jeesite.common.mybatis.annotation.MyBatisDao;
import com.jeesite.modules.test.entity.TestDataChild;
/**
* 测试数据DAO接口
* @author ThinkGem
* @version 2018-04-22
*/
@MyBatisDao//(dataSourceName="ds2")
public interface TestDataChildDao extends CrudDao<TestDataChild> {
}

View File

@@ -0,0 +1,27 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
* No deletion without permission, or be held responsible to law.
*/
package com.jeesite.modules.test.dao;
import java.util.List;
import java.util.Map;
import com.jeesite.common.dao.CrudDao;
import com.jeesite.common.mybatis.annotation.MyBatisDao;
import com.jeesite.modules.test.entity.TestData;
/**
* 测试数据DAO接口
* @author ThinkGem
* @version 2018-04-22
*/
@MyBatisDao
public interface TestDataDao extends CrudDao<TestData> {
/**
* 演示Map参数和返回值支持分页
*/
public List<Map<String, Object>> findListForMap(Map<String, Object> params);
}

View File

@@ -0,0 +1,19 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
* No deletion without permission, or be held responsible to law.
*/
package com.jeesite.modules.test.dao;
import com.jeesite.common.dao.TreeDao;
import com.jeesite.common.mybatis.annotation.MyBatisDao;
import com.jeesite.modules.test.entity.TestTree;
/**
* 测试树表DAO接口
* @author ThinkGem
* @version 2018-04-22
*/
@MyBatisDao
public interface TestTreeDao extends TreeDao<TestTree> {
}

View File

@@ -0,0 +1,182 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
* No deletion without permission, or be held responsible to law.
*/
package com.jeesite.modules.test.db;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;
import com.jeesite.common.config.Global;
import com.jeesite.common.lang.StringUtils;
import com.jeesite.common.tests.BaseInitDataTests;
import com.jeesite.modules.gen.entity.GenTable;
import com.jeesite.modules.gen.entity.GenTableColumn;
import com.jeesite.modules.gen.service.GenTableService;
import com.jeesite.modules.gen.utils.GenUtils;
/**
* 初始化核心表数据
* @author ThinkGem
* @version 2020-5-26
*/
@Component
@ConditionalOnProperty(name="jeesite.initdata", havingValue="true", matchIfMissing=false)
public class InitTestData extends BaseInitDataTests {
@Override
public boolean initData() throws Exception {
if (GenUtils.isTableExists("test_data")) {
return true; // 如果表已存在,则无需初始化
}
runCreateScript("test.sql");
initGenDemoData();
return true;
}
@Autowired
private GenTableService genTableService;
/**
* 代码生成测试数据
*/
public void initGenDemoData() throws Exception{
if (!checkTable(GenTable.class)) {
return;
}
if (!checkTable(GenTableColumn.class)) {
return;
}
initGenTestData();
initGenTreeData();
}
/**
* 代码生成测试数据
*/
private void initGenTestData() throws Exception{
GenTable genTable = new GenTable();
genTable.setIsNewRecord(true);
genTable.setTableName("test_data");
genTable = genTableService.getFromDb(genTable);
genTable.setIsNewRecord(true);
genTable.setClassName("TestData");
genTable.setFunctionAuthor("ThinkGem");
genTable.setTplCategory("crud");
genTable.setPackageName("com.jeesite.modules");
genTable.setModuleName("test");
genTable.setSubModuleName("");
genTable.setFunctionName("测试数据");
genTable.setFunctionNameSimple("数据");
genTable.getOptionMap().put("isHaveDisableEnable", Global.YES);
genTable.getOptionMap().put("isHaveDelete", Global.YES);
genTable.getOptionMap().put("isFileUpload", Global.YES);
genTable.getOptionMap().put("isImageUpload", Global.YES);
initGenTableColumn(genTable);
genTableService.save(genTable);
// 子表
GenTable genTableChild = new GenTable();
genTableChild.setIsNewRecord(true);
genTableChild.setTableName("test_data_child");
genTableChild = genTableService.getFromDb(genTableChild);
genTableChild.setIsNewRecord(true);
genTableChild.setClassName("TestDataChild");
genTableChild.setFunctionAuthor("ThinkGem");
genTableChild.setTplCategory("crud");
genTableChild.setPackageName("com.jeesite.modules");
genTableChild.setModuleName("test");
genTableChild.setSubModuleName("");
genTableChild.setFunctionName("测试子表");
genTableChild.setFunctionNameSimple("数据");
genTableChild.setParentTableName("test_data");
genTableChild.setParentTableFkName("test_data_id");
initGenTableColumn(genTableChild);
genTableService.save(genTableChild);
}
/**
* 代码生成测试数据(列初始化)
*/
private void initGenTableColumn(GenTable genTable){
for(GenTableColumn column : genTable.getColumnList()){
if ("test_input".equals(column.getColumnName())
|| "test_textarea".equals(column.getColumnName())
|| "test_select".equals(column.getColumnName())
|| "test_select_multiple".equals(column.getColumnName())
|| "test_checkbox".equals(column.getColumnName())
|| "test_radio".equals(column.getColumnName())
|| "test_date".equals(column.getColumnName())
|| "test_datetime".equals(column.getColumnName())
){
column.setShowType(StringUtils.substringAfter(
column.getColumnName(), "test_"));
if ("test_input".equals(column.getColumnName())
){
column.setQueryType("LIKE");
}
else if ("test_textarea".equals(column.getColumnName())
){
column.setQueryType("LIKE");
column.getOptionMap().put("isNewLine", Global.YES);
// column.getOptionMap().put("gridRowCol", "12/2/10");
}
else if ("test_select".equals(column.getColumnName())
|| "test_select_multiple".equals(column.getColumnName())
|| "test_radio".equals(column.getColumnName())
|| "test_checkbox".equals(column.getColumnName())
){
column.getOptionMap().put("dictType", "sys_menu_type");
column.getOptionMap().put("dictName", "sys_menu_type");
}
else if ("test_date".equals(column.getColumnName())
|| "test_datetime".equals(column.getColumnName())
){
column.setQueryType("BETWEEN");
}
}else if ("test_user_code".equals(column.getColumnName())){
column.setAttrType("com.jeesite.modules.sys.entity.User");
column.setFullAttrName("testUser");
column.setShowType("userselect");
}else if ("test_office_code".equals(column.getColumnName())){
column.setAttrType("com.jeesite.modules.sys.entity.Office");
column.setFullAttrName("testOffice");
column.setShowType("officeselect");
}else if ("test_area_code".equals(column.getColumnName())){
column.setFullAttrName("testAreaCode|testAreaName");
column.setShowType("areaselect");
}else if ("test_area_name".equals(column.getColumnName())){
column.setIsEdit(Global.NO);
column.setIsQuery(Global.NO);
}else if ("test_data_id".equals(column.getColumnName())){
column.setFullAttrName("testData");
}
}
}
/**
* 代码生成树表测试数据
*/
private void initGenTreeData() throws Exception{
GenTable genTable = new GenTable();
genTable.setIsNewRecord(true);
genTable.setTableName("test_tree");
genTable = genTableService.getFromDb(genTable);
genTable.setIsNewRecord(true);
genTable.setClassName("TestTree");
genTable.setFunctionAuthor("ThinkGem");
genTable.setTplCategory("treeGrid");
genTable.setPackageName("com.jeesite.modules");
genTable.setModuleName("test");
genTable.setSubModuleName("");
genTable.setFunctionName("测试树表");
genTable.setFunctionNameSimple("数据");
genTable.getOptionMap().put("isHaveDisableEnable", Global.YES);
genTable.getOptionMap().put("isHaveDelete", Global.YES);
genTable.getOptionMap().put("isFileUpload", Global.YES);
genTable.getOptionMap().put("isImageUpload", Global.YES);
genTable.getOptionMap().put("treeViewCode", "tree_code");
genTable.getOptionMap().put("treeViewName", "tree_name");
initGenTableColumn(genTable);
genTableService.save(genTable);
}
}

View File

@@ -0,0 +1,226 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
* No deletion without permission, or be held responsible to law.
*/
package com.jeesite.modules.test.entity;
import javax.validation.constraints.Size;
import java.util.Date;
import com.jeesite.common.mybatis.annotation.JoinTable;
import com.jeesite.common.mybatis.annotation.JoinTable.Type;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.jeesite.modules.sys.entity.User;
import com.jeesite.modules.sys.entity.Office;
import java.util.List;
import com.jeesite.common.collect.ListUtils;
import com.jeesite.common.entity.DataEntity;
import com.jeesite.common.mybatis.annotation.Column;
import com.jeesite.common.mybatis.annotation.Table;
import com.jeesite.common.mybatis.mapper.query.QueryType;
/**
* 测试数据Entity
* @author ThinkGem
* @version 2018-04-22
*/
@Table(name="test_data", alias="a", columns={
@Column(name="id", attrName="id", label="编号", isPK=true),
@Column(name="test_input", attrName="testInput", label="单行文本", queryType=QueryType.LIKE),
@Column(name="test_textarea", attrName="testTextarea", label="多行文本", queryType=QueryType.LIKE),
@Column(name="test_select", attrName="testSelect", label="下拉框"),
@Column(name="test_select_multiple", attrName="testSelectMultiple", label="下拉多选"),
@Column(name="test_radio", attrName="testRadio", label="单选框"),
@Column(name="test_checkbox", attrName="testCheckbox", label="复选框"),
@Column(name="test_date", attrName="testDate", label="日期选择", isUpdateForce=true/*是否强制更新当调用update并且该属性为空的时候允许更新为空*/),
@Column(name="test_datetime", attrName="testDatetime", label="日期时间", isUpdateForce=true),
@Column(name="test_user_code", attrName="testUser.userCode", label="用户选择"),
@Column(name="test_office_code", attrName="testOffice.officeCode", label="机构选择"),
@Column(name="test_area_code", attrName="testAreaCode", label="区域选择"),
@Column(name="test_area_name", attrName="testAreaName", label="区域名称"),
@Column(includeEntity=DataEntity.class),
}, joinTable={
@JoinTable(type=Type.LEFT_JOIN, entity=User.class, attrName="testUser", alias="u10",
on="u10.user_code = a.test_user_code", columns={
@Column(name="user_code", label="用户编码", isPK=true),
@Column(name="user_name", label="用户名称", isQuery=false),
}),
@JoinTable(type=Type.LEFT_JOIN, entity=Office.class, attrName="testOffice", alias="u11",
on="u11.office_code = a.test_office_code", columns={
@Column(name="office_code", label="机构编码", isPK=true),
@Column(name="office_name", label="机构名称", isQuery=false),
}),
}, orderBy="a.update_date DESC"
)
public class TestData extends DataEntity<TestData> {
private static final long serialVersionUID = 1L;
private String testInput; // 单行文本
private String testTextarea; // 多行文本
private String testSelect; // 下拉框
private String testSelectMultiple; // 下拉多选
private String testRadio; // 单选框
private String testCheckbox; // 复选框
private Date testDate; // 日期选择
private Date testDatetime; // 日期时间
private User testUser; // 用户选择
private Office testOffice; // 机构选择
private String testAreaCode; // 区域选择
private String testAreaName; // 区域名称
private List<TestDataChild> testDataChildList = ListUtils.newArrayList(); // 子表列表
public TestData() {
this(null);
}
public TestData(String id){
super(id);
}
@Size(min=0, max=200, message="单行文本长度不能超过 200 个字符")
public String getTestInput() {
return testInput;
}
public void setTestInput(String testInput) {
this.testInput = testInput;
}
@Size(min=0, max=200, message="多行文本长度不能超过 200 个字符")
public String getTestTextarea() {
return testTextarea;
}
public void setTestTextarea(String testTextarea) {
this.testTextarea = testTextarea;
}
@Size(min=0, max=10, message="下拉框长度不能超过 10 个字符")
public String getTestSelect() {
return testSelect;
}
public void setTestSelect(String testSelect) {
this.testSelect = testSelect;
}
@Size(min=0, max=200, message="下拉多选长度不能超过 200 个字符")
public String getTestSelectMultiple() {
return testSelectMultiple;
}
public void setTestSelectMultiple(String testSelectMultiple) {
this.testSelectMultiple = testSelectMultiple;
}
@Size(min=0, max=10, message="单选框长度不能超过 10 个字符")
public String getTestRadio() {
return testRadio;
}
public void setTestRadio(String testRadio) {
this.testRadio = testRadio;
}
@Size(min=0, max=200, message="复选框长度不能超过 200 个字符")
public String getTestCheckbox() {
return testCheckbox;
}
public void setTestCheckbox(String testCheckbox) {
this.testCheckbox = testCheckbox;
}
@JsonFormat(pattern = "yyyy-MM-dd")
public Date getTestDate() {
return testDate;
}
public void setTestDate(Date testDate) {
this.testDate = testDate;
}
@JsonFormat(pattern = "yyyy-MM-dd HH:mm")
public Date getTestDatetime() {
return testDatetime;
}
public void setTestDatetime(Date testDatetime) {
this.testDatetime = testDatetime;
}
public User getTestUser() {
return testUser;
}
public void setTestUser(User testUser) {
this.testUser = testUser;
}
public Office getTestOffice() {
return testOffice;
}
public void setTestOffice(Office testOffice) {
this.testOffice = testOffice;
}
@Size(min=0, max=64, message="区域选择长度不能超过 64 个字符")
public String getTestAreaCode() {
return testAreaCode;
}
public void setTestAreaCode(String testAreaCode) {
this.testAreaCode = testAreaCode;
}
@Size(min=0, max=100, message="区域名称长度不能超过 100 个字符")
public String getTestAreaName() {
return testAreaName;
}
public void setTestAreaName(String testAreaName) {
this.testAreaName = testAreaName;
}
public Date getTestDate_gte() {
return sqlMap.getWhere().getValue("test_date", QueryType.GTE);
}
public void setTestDate_gte(Date testDate) {
sqlMap.getWhere().and("test_date", QueryType.GTE, testDate);
}
public Date getTestDate_lte() {
return sqlMap.getWhere().getValue("test_date", QueryType.LTE);
}
public void setTestDate_lte(Date testDate) {
sqlMap.getWhere().and("test_date", QueryType.LTE, testDate);
}
public Date getTestDatetime_gte() {
return sqlMap.getWhere().getValue("test_datetime", QueryType.GTE);
}
public void setTestDatetime_gte(Date testDatetime) {
sqlMap.getWhere().and("test_datetime", QueryType.GTE, testDatetime);
}
public Date getTestDatetime_lte() {
return sqlMap.getWhere().getValue("test_datetime", QueryType.LTE);
}
public void setTestDatetime_lte(Date testDatetime) {
sqlMap.getWhere().and("test_datetime", QueryType.LTE, testDatetime);
}
public List<TestDataChild> getTestDataChildList() {
return testDataChildList;
}
public void setTestDataChildList(List<TestDataChild> testDataChildList) {
this.testDataChildList = testDataChildList;
}
}

View File

@@ -0,0 +1,236 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
* No deletion without permission, or be held responsible to law.
*/
package com.jeesite.modules.test.entity;
import javax.validation.constraints.Size;
import java.util.Date;
import com.jeesite.common.mybatis.annotation.JoinTable;
import com.jeesite.common.mybatis.annotation.JoinTable.Type;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.jeesite.modules.sys.entity.User;
import com.jeesite.modules.sys.entity.Office;
import com.jeesite.common.entity.DataEntity;
import com.jeesite.common.mybatis.annotation.Column;
import com.jeesite.common.mybatis.annotation.Table;
import com.jeesite.common.mybatis.mapper.query.QueryType;
/**
* 测试数据Entity
* @author ThinkGem
* @version 2018-04-22
*/
@Table(name="test_data_child", alias="a", columns={
@Column(name="id", attrName="id", label="编号", isPK=true),
@Column(name="test_sort", attrName="testSort", label="排序号"),
@Column(name="test_data_id", attrName="testData.id", label="父表主键"),
@Column(name="test_input", attrName="testInput", label="单行文本", queryType=QueryType.LIKE),
@Column(name="test_textarea", attrName="testTextarea", label="多行文本", queryType=QueryType.LIKE),
@Column(name="test_select", attrName="testSelect", label="下拉框"),
@Column(name="test_select_multiple", attrName="testSelectMultiple", label="下拉多选"),
@Column(name="test_radio", attrName="testRadio", label="单选框"),
@Column(name="test_checkbox", attrName="testCheckbox", label="复选框"),
@Column(name="test_date", attrName="testDate", label="日期选择", isUpdateForce=true),
@Column(name="test_datetime", attrName="testDatetime", label="日期时间", isUpdateForce=true),
@Column(name="test_user_code", attrName="testUser.userCode", label="用户选择"),
@Column(name="test_office_code", attrName="testOffice.officeCode", label="机构选择"),
@Column(name="test_area_code", attrName="testAreaCode", label="区域选择"),
@Column(name="test_area_name", attrName="testAreaName", label="区域名称", isQuery=false),
}, joinTable={
@JoinTable(type=Type.LEFT_JOIN, entity=User.class, attrName="testUser", alias="u12",
on="u12.user_code = a.test_user_code", columns={
@Column(name="user_code", label="用户编码", isPK=true),
@Column(name="user_name", label="用户名称", isQuery=false),
}),
@JoinTable(type=Type.LEFT_JOIN, entity=Office.class, attrName="testOffice", alias="u13",
on="u13.office_code = a.test_office_code", columns={
@Column(name="office_code", label="机构编码", isPK=true),
@Column(name="office_name", label="机构名称", isQuery=false),
}),
}, orderBy="a.id ASC"
)
public class TestDataChild extends DataEntity<TestDataChild> {
private static final long serialVersionUID = 1L;
private Long testSort; // 排序号
private TestData testData; // 父表主键 父类
private String testInput; // 单行文本
private String testTextarea; // 多行文本
private String testSelect; // 下拉框
private String testSelectMultiple; // 下拉多选
private String testRadio; // 单选框
private String testCheckbox; // 复选框
private Date testDate; // 日期选择
private Date testDatetime; // 日期时间
private User testUser; // 用户选择
private Office testOffice; // 机构选择
private String testAreaCode; // 区域选择
private String testAreaName; // 区域名称
public TestDataChild() {
this(null);
}
public TestDataChild(TestData testData){
this.testData = testData;
}
public Long getTestSort() {
return testSort;
}
public void setTestSort(Long testSort) {
this.testSort = testSort;
}
@Size(min=0, max=64, message="父表主键长度不能超过 64 个字符")
public TestData getTestData() {
return testData;
}
public void setTestData(TestData testData) {
this.testData = testData;
}
@Size(min=0, max=200, message="单行文本长度不能超过 200 个字符")
public String getTestInput() {
return testInput;
}
public void setTestInput(String testInput) {
this.testInput = testInput;
}
@Size(min=0, max=200, message="多行文本长度不能超过 200 个字符")
public String getTestTextarea() {
return testTextarea;
}
public void setTestTextarea(String testTextarea) {
this.testTextarea = testTextarea;
}
@Size(min=0, max=10, message="下拉框长度不能超过 10 个字符")
public String getTestSelect() {
return testSelect;
}
public void setTestSelect(String testSelect) {
this.testSelect = testSelect;
}
@Size(min=0, max=200, message="下拉多选长度不能超过 200 个字符")
public String getTestSelectMultiple() {
return testSelectMultiple;
}
public void setTestSelectMultiple(String testSelectMultiple) {
this.testSelectMultiple = testSelectMultiple;
}
@Size(min=0, max=10, message="单选框长度不能超过 10 个字符")
public String getTestRadio() {
return testRadio;
}
public void setTestRadio(String testRadio) {
this.testRadio = testRadio;
}
@Size(min=0, max=200, message="复选框长度不能超过 200 个字符")
public String getTestCheckbox() {
return testCheckbox;
}
public void setTestCheckbox(String testCheckbox) {
this.testCheckbox = testCheckbox;
}
@JsonFormat(pattern = "yyyy-MM-dd")
public Date getTestDate() {
return testDate;
}
public void setTestDate(Date testDate) {
this.testDate = testDate;
}
@JsonFormat(pattern = "yyyy-MM-dd HH:mm")
public Date getTestDatetime() {
return testDatetime;
}
public void setTestDatetime(Date testDatetime) {
this.testDatetime = testDatetime;
}
public User getTestUser() {
return testUser;
}
public void setTestUser(User testUser) {
this.testUser = testUser;
}
public Office getTestOffice() {
return testOffice;
}
public void setTestOffice(Office testOffice) {
this.testOffice = testOffice;
}
@Size(min=0, max=64, message="区域选择长度不能超过 64 个字符")
public String getTestAreaCode() {
return testAreaCode;
}
public void setTestAreaCode(String testAreaCode) {
this.testAreaCode = testAreaCode;
}
@Size(min=0, max=100, message="区域名称长度不能超过 100 个字符")
public String getTestAreaName() {
return testAreaName;
}
public void setTestAreaName(String testAreaName) {
this.testAreaName = testAreaName;
}
public Date getTestDate_gte() {
return sqlMap.getWhere().getValue("test_date", QueryType.GTE);
}
public void setTestDate_gte(Date testDate) {
sqlMap.getWhere().and("test_date", QueryType.GTE, testDate);
}
public Date getTestDate_lte() {
return sqlMap.getWhere().getValue("test_date", QueryType.LTE);
}
public void setTestDate_lte(Date testDate) {
sqlMap.getWhere().and("test_date", QueryType.LTE, testDate);
}
public Date getTestDatetime_gte() {
return sqlMap.getWhere().getValue("test_datetime", QueryType.GTE);
}
public void setTestDatetime_gte(Date testDatetime) {
sqlMap.getWhere().and("test_datetime", QueryType.GTE, testDatetime);
}
public Date getTestDatetime_lte() {
return sqlMap.getWhere().getValue("test_datetime", QueryType.LTE);
}
public void setTestDatetime_lte(Date testDatetime) {
sqlMap.getWhere().and("test_datetime", QueryType.LTE, testDatetime);
}
}

View File

@@ -0,0 +1,70 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
* No deletion without permission, or be held responsible to law.
*/
package com.jeesite.modules.test.entity;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import com.jeesite.common.entity.DataEntity;
import com.jeesite.common.entity.TreeEntity;
import com.jeesite.common.mybatis.annotation.Column;
import com.jeesite.common.mybatis.annotation.Table;
import com.jeesite.common.mybatis.mapper.query.QueryType;
/**
* 测试树表Entity
* @author ThinkGem
* @version 2018-04-22
*/
@Table(name="test_tree", alias="a", columns={
@Column(name="tree_code", attrName="treeCode", label="节点编码", isPK=true),
@Column(includeEntity=TreeEntity.class),
@Column(name="tree_name", attrName="treeName", label="节点名称", queryType=QueryType.LIKE, isTreeName=true),
@Column(includeEntity=DataEntity.class),
}, orderBy="a.tree_sorts, a.tree_code"
)
public class TestTree extends TreeEntity<TestTree> {
private static final long serialVersionUID = 1L;
private String treeCode; // 节点编码
private String treeName; // 节点名称
public TestTree() {
this(null);
}
public TestTree(String id){
super(id);
}
@Override
public TestTree getParent() {
return parent;
}
@Override
public void setParent(TestTree parent) {
this.parent = parent;
}
public String getTreeCode() {
return treeCode;
}
public void setTreeCode(String treeCode) {
this.treeCode = treeCode;
}
@NotBlank(message="节点名称不能为空")
@Size(min=0, max=200, message="节点名称长度不能超过 200 个字符")
public String getTreeName() {
return treeName;
}
public void setTreeName(String treeName) {
this.treeName = treeName;
}
}

View File

@@ -0,0 +1,174 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
* No deletion without permission, or be held responsible to law.
*/
package com.jeesite.modules.test.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.jeesite.common.entity.Page;
import com.jeesite.common.idgen.IdGen;
import com.jeesite.common.lang.DateUtils;
import com.jeesite.common.service.CrudService;
import com.jeesite.modules.file.utils.FileUploadUtils;
import com.jeesite.modules.sys.service.UserService;
import com.jeesite.modules.test.dao.TestDataChildDao;
import com.jeesite.modules.test.dao.TestDataDao;
import com.jeesite.modules.test.entity.TestData;
import com.jeesite.modules.test.entity.TestDataChild;
/**
* 测试数据Service
* @author ThinkGem
* @version 2018-04-22
*/
@Service
@Transactional(readOnly=true)
public class TestDataService extends CrudService<TestDataDao, TestData> {
@Autowired
private TestDataChildDao testDataChildDao;
/**
* 获取单条数据
* @param testData
* @return
*/
@Override
public TestData get(TestData testData) {
TestData entity = super.get(testData);
if (entity != null){
TestDataChild testDataChild = new TestDataChild(entity);
testDataChild.setStatus(TestDataChild.STATUS_NORMAL);
entity.setTestDataChildList(testDataChildDao.findList(testDataChild));
}
return entity;
}
/**
* 查询分页数据
* @param page 分页对象
* @param testData
* @return
*/
@Override
public Page<TestData> findPage(TestData testData) {
// // 演示Map参数和返回值支持分页
// Page<Map<String, Object>> pageMap = new Page<>();
// Map<String, Object> params = MapUtils.newHashMap();
// params.put("testInput", "123");
// params.put("page", pageMap);
// pageMap.setList(dao.findListForMap(params));
// System.out.println(pageMap.getList());
// System.out.println(pageMap.getCount());
return super.findPage(testData);
}
/**
* 查询子表分页数据
* @param page 分页对象
* @param testData
* @return
*/
public List<TestDataChild> findSubList(TestDataChild testData) {
return testDataChildDao.findList(testData);
}
/**
* 保存数据(插入或更新)
* @param testData
*/
@Override
@Transactional(readOnly=false)
public void save(TestData testData) {
super.save(testData);
// 保存上传图片
FileUploadUtils.saveFileUpload(testData, testData.getId(), "testData_image");
// 保存上传附件
FileUploadUtils.saveFileUpload(testData, testData.getId(), "testData_file");
// 保存 TestData子表
int index = 0;
for (TestDataChild testDataChild : testData.getTestDataChildList()){
if (!TestDataChild.STATUS_DELETE.equals(testDataChild.getStatus())){
testDataChild.setTestData(testData);
if (testDataChild.getIsNewRecord()){
testDataChild.preInsert();
testDataChildDao.insert(testDataChild);
}else{
testDataChild.preUpdate();
testDataChildDao.update(testDataChild);
}
}else{
testDataChildDao.delete(testDataChild);
}
// 保存上传附件
FileUploadUtils.saveFileUpload(testDataChild, testDataChild.getId(),
"testDataChildList["+index+"].testDataChild_file");
index++;
}
}
/**
* 更新状态
* @param testData
*/
@Override
@Transactional(readOnly=false)
public void updateStatus(TestData testData) {
super.updateStatus(testData);
}
/**
* 删除数据
* @param testData
*/
@Override
@Transactional(readOnly=false)
public void delete(TestData testData) {
super.delete(testData);
TestDataChild testDataChild = new TestDataChild();
testDataChild.setTestData(testData);
testDataChildDao.deleteByEntity(testDataChild);
}
/**
* 任务调度测试testDataService.executeTestTask(userService, 1, 2L, 3F, 4D, 'abc')
*/
public void executeTestTask(UserService userService, Integer i, Long l, Float f, Double d, String s){
System.out.println(DateUtils.getTime() + " 任务执行了~~~ bean: " + userService + ", i: " + i
+ ", l: " + l + ", f: " + f + ", d: " + d + ", s: " + s);
}
/**
* 事务测试,若 Child 报错,则回滚
*/
@Transactional(readOnly=false/*, propagation=Propagation.NOT_SUPPORTED*/)
public void transTest(TestData testData) {
testData.setTestInput("transTest");
testData.setTestTextarea(IdGen.randomBase62(5));
dao.insert(testData);
TestDataChild testDataChild = new TestDataChild();
testDataChild.setTestData(testData);
// 设置一个超出数据库范围的值,抛出数据库异常
StringBuilder sb = new StringBuilder();
for (int i=0; i<500; i++){
sb.append("transTest" + i);
}
testDataChild.setTestInput(sb.toString());
testDataChildDao.insert(testDataChild);
}
/**
* 事务验证,返回空,则事务回滚成功
*/
public boolean transValid(TestData testData) {
return dao.get(testData) == null;
}
}

View File

@@ -0,0 +1,80 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
* No deletion without permission, or be held responsible to law.
*/
package com.jeesite.modules.test.service;
import java.util.List;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.jeesite.common.service.TreeService;
import com.jeesite.modules.file.utils.FileUploadUtils;
import com.jeesite.modules.test.dao.TestTreeDao;
import com.jeesite.modules.test.entity.TestTree;
/**
* 测试树表Service
* @author ThinkGem
* @version 2018-04-22
*/
@Service
@Transactional(readOnly=true)
public class TestTreeService extends TreeService<TestTreeDao, TestTree> {
/**
* 获取单条数据
* @param testTree
* @return
*/
@Override
public TestTree get(TestTree testTree) {
return super.get(testTree);
}
/**
* 查询列表数据
* @param testTree
* @return
*/
@Override
public List<TestTree> findList(TestTree testTree) {
return super.findList(testTree);
}
/**
* 保存数据(插入或更新)
* @param testTree
*/
@Override
@Transactional(readOnly=false)
public void save(TestTree testTree) {
super.save(testTree);
// 保存上传图片
FileUploadUtils.saveFileUpload(testTree, testTree.getId(), "testTree_image");
// 保存上传附件
FileUploadUtils.saveFileUpload(testTree, testTree.getId(), "testTree_file");
}
/**
* 更新状态
* @param testTree
*/
@Override
@Transactional(readOnly=false)
public void updateStatus(TestTree testTree) {
super.updateStatus(testTree);
}
/**
* 删除数据
* @param testTree
*/
@Override
@Transactional(readOnly=false)
public void delete(TestTree testTree) {
super.delete(testTree);
}
}

View File

@@ -0,0 +1,58 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
* No deletion without permission, or be held responsible to law.
*/
package com.jeesite.modules.test.web;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import com.jeesite.common.lang.StringUtils;
import com.jeesite.common.web.BaseController;
import com.jeesite.modules.test.entity.TestData;
import com.jeesite.modules.test.service.TestDataService;
/**
* 演示实例Controller
* @author ThinkGem
* @version 2018-03-24
*/
@Controller
@RequestMapping(value = "${adminPath}/demo")
public class DemoController extends BaseController {
@Autowired
private TestDataService testDataService;
/**
* 获取数据
*/
@ModelAttribute
public TestData get(String id, boolean isNewRecord) {
return testDataService.get(id, isNewRecord);
}
/**
* DataGrid
*/
@RequiresPermissions("test:testData:view")
@RequestMapping(value = "dataGrid/{viewName}")
public String dataGrid(@PathVariable String viewName, TestData testData, Model model) {
return "modules/demo/demoDataGrid" + StringUtils.cap(viewName);
}
/**
* Form
*/
@RequiresPermissions("test:testData:view")
@RequestMapping(value = "form/{viewName}")
public String form(@PathVariable String viewName, TestData testData, Model model) {
return "modules/demo/demoForm" + StringUtils.cap(viewName);
}
}

View File

@@ -0,0 +1,153 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
* No deletion without permission, or be held responsible to law.
*/
package com.jeesite.modules.test.web;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.jeesite.common.config.Global;
import com.jeesite.common.entity.Page;
import com.jeesite.common.web.BaseController;
import com.jeesite.modules.test.entity.TestData;
import com.jeesite.modules.test.entity.TestDataChild;
import com.jeesite.modules.test.service.TestDataService;
/**
* 测试数据Controller
* @author ThinkGem
* @version 2018-04-22
*/
@Controller
@RequestMapping(value = "${adminPath}/test/testData")
public class TestDataController extends BaseController {
@Autowired
private TestDataService testDataService;
/**
* 获取数据
*/
@ModelAttribute
public TestData get(String id, boolean isNewRecord) {
return testDataService.get(id, isNewRecord);
}
/**
* 查询列表
*/
@RequiresPermissions("test:testData:view")
@RequestMapping(value = {"list", ""})
public String list(TestData testData, Model model) {
model.addAttribute("testData", testData);
return "modules/test/testDataList";
}
/**
* 查询列表数据
*/
@RequiresPermissions("test:testData:view")
@RequestMapping(value = "listData")
@ResponseBody
public Page<TestData> listData(TestData testData, HttpServletRequest request, HttpServletResponse response) {
testData.setPage(new Page<>(request, response));
Page<TestData> page = testDataService.findPage(testData);
return page;
}
/**
* 查询子表列表数据
*/
@RequiresPermissions("test:testData:view")
@RequestMapping(value = "subListData")
@ResponseBody
public List<TestDataChild> subListData(TestDataChild testDataChild) {
return testDataService.findSubList(testDataChild);
}
/**
* 查看编辑表单
*/
@RequiresPermissions("test:testData:view")
@RequestMapping(value = "form")
public String form(TestData testData, Model model) {
model.addAttribute("testData", testData);
return "modules/test/testDataForm";
}
/**
* 保存数据
*/
@RequiresPermissions("test:testData:edit")
@PostMapping(value = "save")
@ResponseBody
public String save(@Validated TestData testData) {
testDataService.save(testData);
return renderResult(Global.TRUE, text("保存数据成功!"));
}
/**
* 停用数据
*/
@RequiresPermissions("test:testData:edit")
@RequestMapping(value = "disable")
@ResponseBody
public String disable(TestData testData) {
testData.setStatus(TestData.STATUS_DISABLE);
testDataService.updateStatus(testData);
return renderResult(Global.TRUE, text("停用数据成功"));
}
/**
* 启用数据
*/
@RequiresPermissions("test:testData:edit")
@RequestMapping(value = "enable")
@ResponseBody
public String enable(TestData testData) {
testData.setStatus(TestData.STATUS_NORMAL);
testDataService.updateStatus(testData);
return renderResult(Global.TRUE, text("启用数据成功"));
}
/**
* 删除数据
*/
@RequiresPermissions("test:testData:edit")
@RequestMapping(value = "delete")
@ResponseBody
public String delete(TestData testData) {
testDataService.delete(testData);
return renderResult(Global.TRUE, text("删除数据成功!"));
}
/**
* 事务测试
*/
@RequiresPermissions("test:testData:edit")
@RequestMapping(value = "transTest")
@ResponseBody
public String transTest(TestData testData) {
try{
testDataService.transTest(testData);
}catch (Exception e) {
logger.debug("事务测试信息,报错回滚:" + e.getMessage());
}
boolean bl = testDataService.transValid(testData);
return renderResult(Global.TRUE, "事务测试"+(bl?"成功,数据已":"失败,数据未")+"回滚!");
}
}

View File

@@ -0,0 +1,224 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
* No deletion without permission, or be held responsible to law.
*/
package com.jeesite.modules.test.web;
import java.util.List;
import java.util.Map;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.jeesite.common.config.Global;
import com.jeesite.common.collect.ListUtils;
import com.jeesite.common.collect.MapUtils;
import com.jeesite.common.lang.StringUtils;
import com.jeesite.common.idgen.IdGen;
import com.jeesite.modules.sys.utils.UserUtils;
import com.jeesite.common.web.BaseController;
import com.jeesite.modules.test.entity.TestTree;
import com.jeesite.modules.test.service.TestTreeService;
/**
* 测试树表Controller
* @author ThinkGem
* @version 2018-04-22
*/
@Controller
@RequestMapping(value = "${adminPath}/test/testTree")
public class TestTreeController extends BaseController {
@Autowired
private TestTreeService testTreeService;
/**
* 获取数据
*/
@ModelAttribute
public TestTree get(String treeCode, boolean isNewRecord) {
return testTreeService.get(treeCode, isNewRecord);
}
/**
* 查询列表
*/
@RequiresPermissions("test:testTree:view")
@RequestMapping(value = {"list", ""})
public String list(TestTree testTree, Model model) {
model.addAttribute("testTree", testTree);
return "modules/test/testTreeList";
}
/**
* 查询列表数据
*/
@RequiresPermissions("test:testTree:view")
@RequestMapping(value = "listData")
@ResponseBody
public List<TestTree> listData(TestTree testTree) {
if (StringUtils.isBlank(testTree.getParentCode())) {
testTree.setParentCode(TestTree.ROOT_CODE);
}
if (StringUtils.isNotBlank(testTree.getTreeName())){
testTree.setParentCode(null);
}
if (StringUtils.isNotBlank(testTree.getRemarks())){
testTree.setParentCode(null);
}
List<TestTree> list = testTreeService.findList(testTree);
return list;
}
/**
* 查看编辑表单
*/
@RequiresPermissions("test:testTree:view")
@RequestMapping(value = "form")
public String form(TestTree testTree, Model model) {
// 创建并初始化下一个节点信息
testTree = createNextNode(testTree);
model.addAttribute("testTree", testTree);
return "modules/test/testTreeForm";
}
/**
* 创建并初始化下一个节点信息,如:排序号、默认值
*/
@RequiresPermissions("test:testTree:edit")
@RequestMapping(value = "createNextNode")
@ResponseBody
public TestTree createNextNode(TestTree testTree) {
if (StringUtils.isNotBlank(testTree.getParentCode())){
testTree.setParent(testTreeService.get(testTree.getParentCode()));
}
if (testTree.getIsNewRecord()) {
TestTree where = new TestTree();
where.setParentCode(testTree.getParentCode());
TestTree last = testTreeService.getLastByParentCode(where);
// 获取到下级最后一个节点
if (last != null){
testTree.setTreeSort(last.getTreeSort() + 30);
testTree.setTreeCode(IdGen.nextCode(last.getTreeCode()));
}else if (testTree.getParent() != null){
testTree.setTreeCode(testTree.getParent().getTreeCode() + "001");
}
}
// 以下设置表单默认数据
if (testTree.getTreeSort() == null){
testTree.setTreeSort(TestTree.DEFAULT_TREE_SORT);
}
return testTree;
}
/**
* 保存数据
*/
@RequiresPermissions("test:testTree:edit")
@PostMapping(value = "save")
@ResponseBody
public String save(@Validated TestTree testTree) {
testTreeService.save(testTree);
return renderResult(Global.TRUE, text("保存数据成功!"));
}
/**
* 停用数据
*/
@RequiresPermissions("test:testTree:edit")
@RequestMapping(value = "disable")
@ResponseBody
public String disable(TestTree testTree) {
TestTree where = new TestTree();
where.setStatus(TestTree.STATUS_NORMAL);
where.setParentCodes("," + testTree.getId() + ",");
long count = testTreeService.findCount(where);
if (count > 0) {
return renderResult(Global.FALSE, text("该数据包含未停用的子数据!"));
}
testTree.setStatus(TestTree.STATUS_DISABLE);
testTreeService.updateStatus(testTree);
return renderResult(Global.TRUE, text("停用数据成功"));
}
/**
* 启用数据
*/
@RequiresPermissions("test:testTree:edit")
@RequestMapping(value = "enable")
@ResponseBody
public String enable(TestTree testTree) {
testTree.setStatus(TestTree.STATUS_NORMAL);
testTreeService.updateStatus(testTree);
return renderResult(Global.TRUE, text("启用数据成功"));
}
/**
* 删除数据
*/
@RequiresPermissions("test:testTree:edit")
@RequestMapping(value = "delete")
@ResponseBody
public String delete(TestTree testTree) {
testTreeService.delete(testTree);
return renderResult(Global.TRUE, text("删除数据成功!"));
}
/**
* 获取树结构数据
* @param excludeCode 排除的Code
* @param isShowCode 是否显示编码true or 1显示在左侧2显示在右侧false or null不显示
* @return
*/
@RequiresPermissions("test:testTree:view")
@RequestMapping(value = "treeData")
@ResponseBody
public List<Map<String, Object>> treeData(String excludeCode, String isShowCode) {
List<Map<String, Object>> mapList = ListUtils.newArrayList();
List<TestTree> list = testTreeService.findList(new TestTree());
for (int i=0; i<list.size(); i++){
TestTree e = list.get(i);
// 过滤非正常的数据
if (!TestTree.STATUS_NORMAL.equals(e.getStatus())){
continue;
}
// 过滤被排除的编码(包括所有子级)
if (StringUtils.isNotBlank(excludeCode)){
if (e.getId().equals(excludeCode)){
continue;
}
if (e.getParentCodes().contains("," + excludeCode + ",")){
continue;
}
}
Map<String, Object> map = MapUtils.newHashMap();
map.put("id", e.getId());
map.put("pId", e.getParentCode());
map.put("name", StringUtils.getTreeNodeName(isShowCode, e.getTreeCode(), e.getTreeName()));
mapList.add(map);
}
return mapList;
}
/**
* 修复表结构相关数据
*/
@RequiresPermissions("test:testTree:edit")
@RequestMapping(value = "fixTreeData")
@ResponseBody
public String fixTreeData(TestTree testTree){
if (!UserUtils.getUser().isAdmin()){
return renderResult(Global.FALSE, "操作失败,只有管理员才能进行修复!");
}
testTreeService.fixTreeData();
return renderResult(Global.TRUE, "数据修复成功");
}
}

View File

@@ -0,0 +1,854 @@
#======================================#
#========== Project settings ==========#
#======================================#
# 产品或项目名称、软件开发公司名称
productName: JeeSite Demo
companyName: ThinkGem
# 产品版本、版权年份
productVersion: V5.0
copyrightYear: 2022
# 是否演示模式
demoMode: false
# 为分离端提供接口服务,关闭内置登录页和主框架页视图
apiMode: true
#======================================#
#========== Server settings ===========#
#======================================#
server:
port: 8980
servlet:
context-path: /js
tomcat:
uri-encoding: UTF-8
# 表单请求数据的最大大小
max-http-form-post-size: 20MB
# # 进程的最大连接数
# max-connections: 8192
# # 连接数满后的排队个数
# accept-count: 100
# # 线程数最大和最小个数
# threads:
# max: 200
# min-spare: 10
# 当 Nginx 为 httpstomcat 为 http 时,设置该选项为 true
schemeHttps: false
#======================================#
#========== Database sttings ==========#
#======================================#
# 数据库连接
jdbc:
# Mysql 数据库配置
type: mysql
driver: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/jeesite_v5?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=Asia/Shanghai
username: root
password: 123456
testSql: SELECT 1
# # Oracle 数据库配置(若使用 12c请修改 /modules/core/pom.xml 文件,打开 12c 依赖,去掉 11g 依赖)
# type: oracle
# driver: oracle.jdbc.OracleDriver
# url: jdbc:oracle:thin:@127.0.0.1:1521/orcl
# username: jeesite
# password: jeesite
# testSql: SELECT 1 FROM DUAL
# # Sql Server 数据库配置2008
# type: mssql
# driver: net.sourceforge.jtds.jdbc.Driver
# url: jdbc:jtds:sqlserver://127.0.0.1:1433/jeesite
# username: jeesite
# password: jeesite
# testSql: SELECT 1
# # Sql Server 数据库配置2012以上版本请修改 /modules/core/pom.xml 文件,打开 SqlServer 2012 依赖)
# type: mssql2012
# driver: com.microsoft.sqlserver.jdbc.SQLServerDriver
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=jeesite
# username: jeesite
# password: jeesite
# testSql: SELECT 1
# # PostgreSql 数据库配置
# type: postgresql
# driver: org.postgresql.Driver
# url: jdbc:postgresql://127.0.0.1:5432/jeesite
# username: jeesite
# password: jeesite
# testSql: SELECT 1
# # H2 数据库配置(请修改 /modules/core/pom.xml 文件,打开 H2 DB 依赖)
# type: h2
# driver: org.h2.Driver
# url: jdbc:h2:~/jeesite-db/jeesite
# username: jeesite
# password: jeesite
# testSql: SELECT 1
# # 连接信息加密
# encrypt:
#
# # 加密连接用户名
# username: false
# # 加密连接密码
# password: true
#
# # 数据库连接池配置
# pool:
#
# # 初始化连接数
# init: 1
# # 最小空闲连接数
# minIdle: 3
# # 最大激活连接数
# maxActive: 20
#
# # 获取连接等待超时时间单位毫秒1分钟4.0.6+
# maxWait: 60000
#
# # 从池中取出连接前进行检验如果检验失败则从池中去除连接并尝试取出另一个4.0.6+
# testOnBorrow: false
# testOnReturn: false
#
# # 间隔多久才进行一次检测检测需要关闭的空闲连接单位毫秒1分钟4.0.6+
# timeBetweenEvictionRunsMillis: 60000
#
# # 一个连接在池中最小空闲的时间单位毫秒20分钟4.0.6+
# minEvictableIdleTimeMillis: 1200000
# # 一个连接在池中最大空闲的时间单位毫秒30分钟4.1.2+
# maxEvictableIdleTimeMillis: 1800000
#
# #连接池中的minIdle数量以内的连接空闲时间超过minEvictableIdleTimeMillis则会执行keepAlive操作4.1.8+
# keepAlive: false
#
# # 是否自动回收泄露的连接和超时时间单位秒35分钟4.0.6+
# removeAbandoned: false
# removeAbandonedTimeout: 2100
#
# # Oracle 下会自动开启 PSCache并指定每个连接上 PSCache 大小。若不指定,则与 maxActive 相同4.1.5+
# maxPoolPreparedStatementPerConnectionSize: ~
#
# # 设置连接属性,可获取到表的 remark (备注)
# remarksReporting: false
# # 读写分离配置专业版v4.3.0
# readwriteSplitting:
# # 读库的数据源名称列表(默认数据源)
# readDataSourceNames: ds_read_01, ds_read_02
# # 负载均衡算法ROUND_ROBIN轮询、RANDOM随机、自定义类名
# loadBalancerAlgorithm: RANDOM
# # 多数据源名称列表,多个用逗号隔开,使用方法:@MyBatisDao(dataSourceName="ds2")
# dataSourceNames: ds_read_01, ds_read_02, ds2
# dataSourceNames: ds2
# # 默认数据源的从库01
# ds_read_01:
# type: mysql
# driver: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://127.0.0.1:3306/jeesite_test?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=Asia/Shanghai
# username: root
# password: 123456
# testSql: SELECT 1
# pool:
# init: 1
# minIdle: 3
# maxActive: 20
#
# # 默认数据源的从库02
# ds_read_02:
# type: mysql
# driver: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://127.0.0.1:3306/jeesite_test2?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=Asia/Shanghai
# username: root
# password: 123456
# testSql: SELECT 1
# pool:
# init: 1
# minIdle: 3
# maxActive: 20
#
# # 多数据源配置ds2
# ds2:
# type: mysql
# driver: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://127.0.0.1:3306/jeesite2?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=Asia/Shanghai
# username: root
# password: 123456
# testSql: SELECT 1
# # 其它数据源支持密码加密
# encrypt:
# username: false
# password: true
# # 其它数据源支持连接池设置
# pool:
# init: 1
# minIdle: 3
# maxActive: 20
# # 其它数据源支持读写分离
# readwriteSplitting:
# readDataSourceNames: ~
# loadBalancerAlgorithm: RANDOM
# # 数据源映射Dao类名 = 数据源名称),优先于 @MyBatisDao(dataSourceName="ds2") 设置 v4.3.0
# # Dao类名不仅支持某个具体 Dao类名还支持 Dao 里的某个方法指定数据源名称,还支持包路径指定数据源等
# # 数据源名指定 {empty} 时支持动态,相当于 @MyBatisDao(dataSourceName=DataSourceHolder.EMPTY)
# # 数据源支持指定变量 {corpCode}、 {userCode}、{userCache中的Key名}、{yml或sys_config中的Key名}
# # 从上到下,先匹配先受用规则,默认数据源名为 default 扩展数据源为 dataSourceNames 列表里自定义的名字
# mybatisDaoAndDataSourceMappings: |
# TestDataChildDao = ds2
# EmpUserDao.findList = ds2
# com.jeesite.modules.sys = default
# com.jeesite.modules.filemanager = ds2
# # JTA XA 事务v4.0.4+
# jta:
# enabled: false
# 注意:如果报 oracle.jdbc.xa.OracleXAResource.recover 错误,则需要授权如下:
# grant select on sys.dba_pending_transactions to jeesite;
# grant select on sys.pending_trans$ to jeesite;
# grant select on sys.dba_2pc_pending to jeesite;
# grant execute on sys.dbms_system to jeesite;
# # 事务超时时间单位秒30分钟v4.1.5+
# transactionTimeout: 1800
# # 表名前缀
# tablePrefix: js_
#======================================#
#========== Spring settings ===========#
#======================================#
spring:
# 应用程序名称
application:
name: jeesite-web
# 环境名称(注意:不可设置为 test 它是单元测试专用的名称)
profiles:
active: default
# 打印横幅
main:
bannerMode: "off"
# # Redis 连接参数 RedisProperties
# redis:
# host: 127.0.0.1
# port: 6379
# ssl: false
# database: 0
# password: 1234
# timeout: 20000
# lettuce:
# pool:
# # 最大空闲连接数
# maxIdle: 3
# # 最大活动连接数
# maxActive: 20
#
# # 缓存配置
# cache:
# # 缓存及会话共享(专业版)
# isClusterMode: false
# # 清理全部缓存按钮所清理的缓存列表
# clearNames: sysCache,corpCache,userCache,cmsCache,msgPcPoolCache,roleCache,fileUploadCache,bpmFormCache
# 日志配置
logging:
config: classpath:config/logback-spring.xml
#======================================#
#========== System settings ===========#
#======================================#
# 管理基础路径
#adminPath: /a
# 前端基础路径
#frontPath: /f
# 分页相关
#page:
#
# # 默认每页显示的数据条数
# pageSize: 20
#
# # 每页最大条数,防止分页过大导致系统缓慢或内存溢出
# maxPageSize: 999
# 用户相关
#user:
#
# # 指定超级管理员编号(研发团队使用的账号)
# superAdminCode: system
#
# # 超级管理员获取菜单的最小权重默认20>=40二级管理员>=60系统管理员>=80超级管理员
# superAdminGetMenuMinWeight: 40
#
# # 系统管理员角色编号(客户方管理员使用的角色)
# corpAdminRoleCode: corpAdmin
#
# # 二级管理员的控制权限类型1拥有的权限 2管理的权限管理功能包括用户管理、组织机构、公司管理等v4.1.5+
# adminCtrlPermi: 2
#
# # 多租户模式SAAS模式专业版
# useCorpModel: false
#
# # 登录账号是否租户内唯一,否则全局唯一
# loginCodeCorpUnique: false
#
# # 是否启用验证码登录(手机、邮箱)
# loginByValidCode: true
#
# # 用户类型配置信息employee员工member会员btype往来单位persion个人expert专家...JSON 格式说明如下:
# # {"用户类型":{"beanName":"Service或Dao的Bean名称","loginView":"登录页面视图","indexView":"主框架页面视图,支持 redirect: 前缀"}}
# userTypeMap: >
# {
# employee: {beanName: "employeeService", loginView: "", indexView: "modules/sys/sysIndex"},
# member: {beanName: "memberService", loginView: "", indexView: "modules/sys/sysIndexMember"},
# btype: {beanName: "btypeInfoService", loginView: "", indexView: "modules/sys/sysIndexBtype"},
# expert: {beanName: "expertService", loginView: "", indexView: "modules/sys/sysIndexExpert"}
# }
#
# # 数据权限设置参数可新增自定义数据权限moduleCode: 针对模块, ctrlPermi: 权限类型, 0全部 1拥有权限 2管理权限
# dataScopes: >
# [{
# moduleCode: "core",
# ctrlPermi: "0",
# ctrlName: "机构权限",
# ctrlName_en: "Office",
# ctrlType: "Office",
# ctrlDataUrl: "/sys/office/treeData",
# chkboxType: {"Y":"ps","N":"ps"},
# expandLevel: -1,
# remarks: ""
# },{
# moduleCode: "core",
# ctrlName: "公司权限",
# ctrlName_en: "Company",
# ctrlType: "Company",
# ctrlPermi: "0",
# ctrlDataUrl: "/sys/company/treeData",
# chkboxType: {"Y":"ps","N":"ps"},
# expandLevel: -1,
# remarks: ""
# },{
# moduleCode: "core",
# ctrlName: "角色权限",
# ctrlName_en: "Role",
# ctrlType: "Role",
# ctrlPermi: "2",
# ctrlDataUrl: "/sys/role/treeData",
# chkboxType: {"Y":"ps","N":"ps"},
# expandLevel: -1,
# remarks: ""
# }]
#
# # 数据权限调试模式(会输出一些日志)
# dataScopeDebug: false
#
# # 数据权限使用 API 方式实现(适应 Cloud 环境,基础用户表与业务数据表跨库的情况)
# # 开启后设置 ctrlDataAttrName 加 AndChildren 后缀ctrlDataParentCodesAttrName 清空
# # 以方便读取树结构数据权限的表时包含子节点,举例如下:
# # ctrlDataAttrName: "officeCodesAndChildren", ctrlDataParentCodesAttrName: ""
# dataScopeApiMode: false
# 角色管理
#role:
# # 扩展数据权限定义3本部门4本公司5本部门和本公司
# extendDataScopes: >
# {
# 3: {
# Office: {
# #控制类型的类名 : "用来获取控制表名和主键字段名,如果为 NONE则代表是不控制该类型权限",
# ctrlTypeClass: "com.jeesite.modules.sys.entity.Office",
# #控制数据的类名: "指定一个静态类名,方便 ctrlDataAttrName 得到权限数据,如:当前机构编码、当前公司编码、当前行业编码等",
# ctrlDataClass: "com.jeesite.modules.sys.utils.EmpUtils",
# #控制数据的类名下的属性名 : "可看做 ctrlDataClass 下的 get 方法EmpUtils.getOfficeCodes(),支持返回字符串或字符串数组类型",
# ctrlDataAttrName: "officeCodes",
# #控制数据的所有上级编码 : "用于控制数据为树表的情况,为数组时,必须与 ctrlDataAttrName 返回的长度相同,不是树表设置为空",
# ctrlDataParentCodesAttrName: "officeParentCodess"
# },
# Company: {
# ctrlTypeClass: "NONE"
# }
# },
# 4: {
# Office: {
# ctrlTypeClass: "NONE"
# },
# Company: {
# ctrlTypeClass: "com.jeesite.modules.sys.entity.Company",
# ctrlDataClass: "com.jeesite.modules.sys.utils.EmpUtils",
# ctrlDataAttrName: "company.companyCode",
# ctrlDataParentCodesAttrName: "company.parentCodes"
# }
# },
# 5: {
# Office: {
# ctrlTypeClass: "com.jeesite.modules.sys.entity.Office",
# ctrlDataClass: "com.jeesite.modules.sys.utils.EmpUtils",
# ctrlDataAttrName: "officeCodes",
# ctrlDataParentCodesAttrName: "officeParentCodess"
# },
# Company: {
# ctrlTypeClass: "com.jeesite.modules.sys.entity.Company",
# ctrlDataClass: "com.jeesite.modules.sys.utils.EmpUtils",
# ctrlDataAttrName: "company.companyCode",
# ctrlDataParentCodesAttrName: "company.parentCodes"
# }
# }
# }
# 菜单管理
#menu:
# # 根据模块状态去更新相连的菜单状态
# updateStatusByModuleStatus: false
# 国际化管理(专业版)
#lang:
# enabled: false
#
# # 默认语言4.1.3+
# defaultLocale: zh_CN
# # 默认时区4.1.3+
# defaultTimeZone: GMT+08:00
# 任务调度(标准版)
#job:
# enabled: false
#
# # 是否自动启动任务调度(可关闭)
# autoStartup: true
#
# # 任务调度启动延迟设置(单位:秒)(建议设置项目启动完成后的时间)
# startupDelay: 60
#
# # 任务调度线程池
# threadPool:
# threadCount: 10
# threadPriority: 5
#
# # 调度设置集群中每一个实例都必须使用相同的instanceName名称 (区分特定的调度器实例)
# # 在微服务模式情况下请将instanceName名称设置为当前微服务的名称
# # 每一个instanceId必须不同设置AUTO则自动生成
# scheduler:
# instanceName: JeeSiteScheduler
# #instanceName: ${spring.application.name}
# instanceId: AUTO
#
# # 任务调度集群设置
# jobStore:
# isClustered: true
# dataSourceName: job
# clusterCheckinInterval: 1000
#
# # 调度日志
# log:
# # 计划调度日志
# scheduler:
# enabled: true
# # 是否只保存错误日志
# errorLevel: true
# # 任务执行日志
# jobDetail:
# enabled: true
# # 是否只保存错误日志
# errorLevel: true
# # 计划触发日志
# trigger:
# enabled: false
# 代码生成
#gen:
# enabled: true
#
# # 表名字段名是否强制小写
# forceLowerCase: true
# 系统监控
#state:
# enabled: true
#======================================#
#========= Framework settings =========#
#======================================#
# Shiro 相关
shiro:
# #索引页路径
# defaultPath: ${shiro.loginUrl}
#
# # 登录相关设置
# loginUrl: ${adminPath}/login
# logoutUrl: ${shiro.loginUrl}
# successUrl: ${adminPath}/index
#
## # Apereo CAS 相关配置(标准版)
## casServerUrl: http://127.0.0.1:8981/cas
## casClientUrl: http://127.0.0.1:8980/js
## loginUrl: ${shiro.casServerUrl}?service=${shiro.casClientUrl}${adminPath}/login-cas
## logoutUrl: ${shiro.casServerUrl}/logout?service=${shiro.loginUrl}
## successUrl: ${shiro.casClientUrl}${adminPath}/index
#
## # LDAP 相关设置(标准版)
## ldapUrl: ldap://127.0.0.1:389
## ldapUserDn: uid={0},ou=users,dc=mycompany,dc=com
#
# # 简单 SSO 登录相关配置
# sso:
# # 如果启用/sso/{username}/{token}单点登录请修改此安全key并与单点登录系统key一致。
# secretKey: ~
# # 是否加密单点登录安全Key
# encryptKey: true
#
# # 登录提交信息加密(如果不需要加密,设置为空即可)
# loginSubmit:
# # 加密用户名、密码、验证码后再提交key设置为3个用逗号分隔加密方式DES4.1.9及之前版本默认设置)
# # v4.2.0+ 开始支持 Base64 加密方式,方便移动端及第三方系统处理认证,可直接设置 Key 为 Base644.2.0+默认设置)
# #secretKey: thinkgem,jeesite,com
# secretKey: Base64
# #secretKey: ~
# 记住我密钥设置,你可以通过 com.jeesite.test.RememberMeKeyGen 类快速生成一个秘钥。
# 若不设置,则每次启动系统后自动生成一个新秘钥,这样会导致每次重启后,客户端记录的用户信息将失效。
rememberMe:
secretKey: ~
# # 指定获取客户端IP的Header名称防止IP伪造。指定为空则使用原生方法获取IP。
# remoteAddrHeaderName: X-Forwarded-For
#
# # 允许的请求方法设定解决安全审计问题BPM设计器用到了PUT或DELETE方法
# allowRequestMethods: GET, POST, OPTIONS, PUT, DELETE
#
# # 是否允许账号多地登录如果设置为false同一个设备类型的其它地点登录的相同账号被踢下线
# isAllowMultiAddrLogin: true
#
# # 是否允许多账号多设备登录如果设置为false其它地点登录的相同账号全部登录设备将被踢下线
# isAllowMultiDeviceLogin: true
#
# # 是否允许刷新主框架页如果设置为false刷新主页将导致重新登录。如安全性比较高的如银行个人首页不允许刷新。
# isAllowRefreshIndex: true
#
# # 是否允许嵌入到外部网站iframe中true不限制false不允许
# isAllowExternalSiteIframe: true
#
# # 设定允许获取的资源列表v4.2.3
# #contentSecurityPolicy: "default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-eval' 'unsafe-inline'; img-src 'self' 'unsafe-inline' 'unsafe-eval' data:"
#
# # 是否允许跨域访问 CORS如果允许设置允许的域名。v4.2.3 开始支持多个域名和模糊匹配例如http://*.jeesite.com,http://*.jeesite.net
# #accessControlAllowOrigin: '*'
#
# # 允许跨域访问时 CORS可以获取和返回的方法和请求头
# #accessControlAllowMethods: GET, POST, OPTIONS
# #accessControlAllowHeaders: content-type, x-requested-with, x-ajax, x-token, x-remember
# #accessControlExposeHeaders: x-remember
#
# # 是否允许接收跨域的Cookie凭证数据 CORS
# #accessControlAllowCredentials: false
#
# # 允许的网站来源地址,不设置为全部地址(避免一些跨站点请求伪造 CSRF、防盗链
# #allowReferers: http://127.0.0.1,http://localhost
#
# # 是否在登录后生成新的Session默认false
# isGenerateNewSessionAfterLogin: false
#
# # 内部系统访问过滤器可设置多个允许的内部系统IP地址串多个用逗号隔开
# innerFilter.allowIp: 127.0.0.1
#
# # URI 权限过滤器定义(自定义添加参数时,请不要移除 ${adminPath}/** = user否则会导致权限异常
# filterChainDefinitions: |
# ${adminPath}/** = user
# Session 相关
#session:
#
# # 全局会话超时,单位:毫秒, 20m=1200000ms, 30m=1800000ms, 60m=3600000ms, 12h=43200000ms, 1day=86400000ms
# # 注意如果超时超过30m你还需要同步修改当前配置文件的属性j2cache.caffeine.region.sessionCache 超时时间,大于这个值。
# sessionTimeout: 1800000
#
# # PC设备会话超时参数设置登录请求参数加 param_deviceType=pc 时有效
# #pcSessionTimeout: 1800000
#
# # 手机APP设备会话超时参数设置登录请求参数加 param_deviceType=mobileApp 时有效
# #mobileAppSessionTimeout: 43200000
#
# # 定时清理失效会话,清理用户直接关闭浏览器造成的孤立会话
# sessionTimeoutClean: 1200000
#
# # 会话唯一标识SessionId在Cookie中的名称。
# sessionIdCookieName: jeesite.session.id
# #sessionIdCookiePath: ${server.servlet.context-path}
#
# # 共享的SessionId的Cookie名称保存到跟路径下第三方应用获取。同一域名下多个项目时需设置共享Cookie的名称。
# #shareSessionIdCookieName: ${session.sessionIdCookieName}
#
# # 其它 SimpleCookie 参数v4.2.3
# #sessionIdCookieSecure: false
# #sessionIdCookieHttpOnly: true
# #sessionIdCookieSameSite: LAX
#
# # 设置接收 SessionId 请求参数和请求头的名称
# sessionIdParamName: __sid
# sessionIdHeaderName: x-token
#
# # 当直接通过 __sid 参数浏览器访问页面时,可将直接将 __sid 写入 Cookie 应用于后面的访问
# # 访问地址举例http://host/js/a/index?__sid=123456&__cookie=true
# writeCookieParamName: __cookie
#
# # 记住我的请求参数和请求头的名称v4.2.3
# rememberMeHeaderName: x-remember
#
# 系统缓存配置
#j2cache:
#
# # 一级缓存
# caffeine:
# region:
# #[cacheName]: size, xxxx[s|m|h|d]
# default: 10000, 1h
# sessionCache: 100000, 12h
#
# # 二级缓存
# redis:
# # 存储模式 generic|hash
# storage: hash
# # 通知订阅的通道名
# channel: j2cache
# # 缓存命名空间名
# namespace: jeesite
#
# # 通知订阅
# broadcast:
# # 缓存清理模式
# # passive -> 被动清除,一级缓存过期进行通知各节点清除一二级缓存
# # active -> 主动清除,二级缓存过期主动通知各节点清除,优点在于所有节点可以同时收到缓存清除,存储模式需要设置为 generic
# # blend -> 两种模式一起运作,对于各个节点缓存准确以及及时性要求高的可以使用,正常用前两种模式中一个就可
# cache_clean_mode: passive
# MyBatis 相关
#mybatis:
#
# # @MyBatisDao、Aliases 扫描基础包,如果多个,用“,”分隔
# scanBasePackage: com.jeesite.modules
#
# # TypeHandlers 扫描基础包,如果多个,用“,”分隔
# scanTypeHandlersPackage: ~
#
# # 是否开启 JDBC 管理事务,默认 Spring 管理事务 v4.2.3
# jdbcTransaction: false
#
# # Mapper文件刷新线程
# mapper:
# refresh:
# enabled: true
# delaySeconds: 60
# sleepSeconds: 3
# mappingPath: mappings
# Web 相关
#web:
#
# # AJAX 接受参数名和请求头名v4.3.0
# ajaxParamName: __ajax
# ajaxHeaderName: x-ajax
#
# # MVC 视图相关
# view:
#
# # 系统主题名称,主题视图优先级最高,如果主题下无这个视图文件则访问默认视图
# # 引入页面头部:'/themes/'+themeName+'/include/header.html'
# # 引入页面尾部:'/themes/'+themeName+'/include/footer.html'
# themeName: default
#
# # 使用智能参数接收器,同时支持 JSON 和 FormData 的参数接受
# smartMethodArgumentResolver: true
#
# # 使用 .json、.xml 后缀匹配返回视图数据Spring官方已不推荐使用
# favorPathExtension: false
# # 使用 __ajax=json、__ajax=xml 后缀匹配返回视图数据
# favorParameter: true
# # 使用 x-ajax=json、x-ajax=xml 请求头匹配返回视图数据
# favorHeader: true
#
# # MVC 拦截器
# interceptor:
#
# # 后台管理日志记录拦截器
# log:
# enabled: true
# addPathPatterns: >
# ${adminPath}/**
# excludePathPatterns: >
# ${adminPath}/index,
# ${adminPath}/login,
# ${adminPath}/desktop,
# ${adminPath}/index/menuTree,
# ${adminPath}/sys/online/count,
# ${adminPath}/state/server/rtInfo,
# ${adminPath}/**/treeData,
# ${adminPath}/file/**,
# ${adminPath}/tags/*,
# ${adminPath}/msg/**
#
# # 前台自动切换到手机视图拦截器
# mobile:
# enabled: false
# addPathPatterns: >
# ${frontPath}/**
# excludePathPatterns: ~
#
# # 静态文件后缀,过滤静态文件,以提高访问性能。
# staticFile: .css,.js,.map,.png,.jpg,.gif,.jpeg,.bmp,.ico,.swf,.psd,.htc,.crx,.xpi,.exe,.ipa,.apk,.otf,.eot,.svg,.ttf,.woff,.woff2
#
# # 静态文件后缀排除的url路径指定哪些uri路径不进行静态文件过滤。
# staticFileExcludeUri: /druid/
#
# # 静态资源路径前缀可做CDN加速优化
# staticPrefix: /static
#
# # 严格模式(更严格的数据安全验证)
# strictMode: false
#
# # 自定义正则表达式验证(主键、登录名)
# validator:
# id: '[a-zA-Z0-9_\-/#\u4e00-\u9fa5]{0,64}'
# user.loginCode: '[a-zA-Z0-9_\u4e00-\u9fa5]{4,20}'
#
# # 默认不启用(为兼用旧版保留,建议使用 CORS
# jsonp:
# enabled: false
# callback: __callback
#
# # 核心模块的Web功能仅作为微服务时设为false
# core:
# enabled: true
#
# # 在线API文档工具
# swagger:
# enabled: true
# 错误页面500.html是否输出错误信息正式环境为提供安全性可设置为false
#error:
# page:
# printErrorInfo: true
#======================================#
#======== FileUpload settings =========#
#======================================#
#file:
# enabled: true
#
# # 文件上传根路径设置路径中不允许包含“userfiles”在指定目录中系统会自动创建userfiles目录如果不设置默认为contextPath路径
# #baseDir: D:/jeesite
#
# # 上传文件的相对路径支持yyyy, MM, dd, HH, mm, ss, E
# uploadPath: '{yyyy}{MM}/'
#
# # 上传单个文件最大字节500M在这之上还有 > Tomcat限制 > Nginx限制此设置会覆盖 spring.http.multipart.maxFileSize 设置
# maxFileSize: 500*1024*1024
#
# # 设置允许上传的文件后缀(全局设置)
# imageAllowSuffixes: .gif,.bmp,.jpeg,.jpg,.ico,.png,.tif,.tiff,
# mediaAllowSuffixes: .flv,.swf,.mkv,webm,.mid,.mov,.mp3,.mp4,.m4v,.mpc,.mpeg,.mpg,.swf,.wav,.wma,.wmv,.avi,.rm,.rmi,.rmvb,.aiff,.asf,.ogg,.ogv,
# fileAllowSuffixes: .doc,.docx,.rtf,.xls,.xlsx,.csv,.ppt,.pptx,.pdf,.vsd,.txt,.md,.xml,.rar,.zip,7z,.tar,.tgz,.jar,.gz,.gzip,.bz2,.cab,.iso,.ipa,.apk,
#
# # 允许上传的文件内容类型图片、word、excel、ppt防止修改后缀恶意上传文件默认不启用验证
## allowContentTypes: image/jpeg,image/gif,image/bmp,image/png,image/x-png,
## application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,
## application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,
## application/vnd.ms-powerpoint,application/vnd.openxmlformats-officedocument.presentationml.presentation
#
# # 上传图片自动压缩宽高,指定为 -1 不进行压缩(全局设置) v4.1.7
# imageMaxWidth: 1024
# imageMaxHeight: 768
#
# # 是否启用秒传
# checkmd5: true
#
# # 是否开启分片上传
# chunked: true
# # 分片大小单位字节10M
# chunkSize: '10*1024*1024'
# # 最大上传线程数
# threads: 3
#
# # 是否启用检查点(支持断点续传,上传)
# checkpoint: true
#
# # 是否用文件流方式下载(支持断点续传)
# isFileStreamDown: true
#视频转码
#video:
#
# # 视频格式转换 ffmpeg.exe 所放的路径
# ffmpegFile: d:/tools/video/ffmpeg-4.9/bin/ffmpeg.exe
# #ffmpegFile: d:/tools/video/libav-10.6-win64/bin/avconv.exe
#
# # 视频格式转换 mencoder.exe 所放的路径
# mencoderFile: d:/tools/video/mencoder-4.9/mencoder.exe
#
# # 将mp4视频的元数据信息转到视频第一帧
# qtFaststartFile: d:/tools/video/qt-faststart/qt-faststart.exe
# 文件管理是否启用租户模式
#filemanager:
# useCorpModel: false
#======================================#
#========== Message settings ==========#
#======================================#
# 消息提醒中心(专业版)
#msg:
# enabled: false
#
# # 是否开启实时发送消息(保存消息后立即检查未读消息并发送),分布式部署下请单独配置消息发送服务,不建议开启此选项。
# realtime:
# # 是否开启
# enabled: true
# # 消息实时推送任务Bean名称
# beanName: msgLocalPushTask
# # 推送失败次数,如果推送次数超过了设定次数,仍不成功,则放弃并保存到历史
# pushFailNumber: 3
# # 邮件发送参数
# email:
# beanName: emailSendService
# fromAddress: test@163.com
# fromPassword: 123456
# fromHostName: smtp.163.com
# sslOnConnect: false
# sslSmtpPort: 994
#
# # 短信网关
# sms:
# beanName: smsSendService
# url: http://localhost:80/msg/sms/send
# data: username=jeesite&password=jeesite.com
# prefix: 【JeeSite】
# suffix: ~
#======================================#
#========== Project settings ==========#
#======================================#

View File

@@ -0,0 +1,21 @@
#设置与beetl-default.properties相同的属性将被覆盖默认设置
##导入项目中的调用静态方法类项目中设置自动合并IMPORT_PACKAGE设置
#IMPORT_PACKAGE_PROJECT=\
# com.jeesite.modules.project.utils.;\
## 内置的方法
#FN.date = org.beetl.ext.fn.DateFunction
##内置的功能包
#FNP.strutil = org.beetl.ext.fn.StringUtil
##内置的格式化函数
#FT.dateFormat = org.beetl.ext.format.DateFormat
##内置的默认格式化函数
#FTC.java.util.Date = org.beetl.ext.format.DateFormat
## 标签类
#TAG.include= org.beetl.ext.tag.IncludeTag

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="false">
<!-- Log file path -->
<property name="log.path" value="${logPath:-${java.io.tmpdir:-.}}/logs" />
<!-- Framework level setting -->
<include resource="config/logger-core.xml"/>
<!-- Project level setting -->
<!-- <logger name="your.package" level="DEBUG" /> -->
<!-- Console log output -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{MM-dd HH:mm:ss.SSS} %clr(%-5p) %clr([%-39logger{39}]){cyan} - %m%n%wEx</pattern>
</encoder>
</appender>
<!-- Log file debug output -->
<appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/debug.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/debug.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p ${PID:- } [%15.15t] [%-39logger{39}] [%X{TRACE_ID}] - %m%n%wEx</pattern>
</encoder>
<!--<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>NEUTRAL</onMismatch>
</filter>-->
</appender>
<!-- Log file error output -->
<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p ${PID:- } [%15.15t] [%-39logger{39}] [%X{TRACE_ID}] - %m%n%wEx</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<!-- Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 -->
<root level="WARN">
<appender-ref ref="console" />
<appender-ref ref="debug" />
<appender-ref ref="error" />
</root>
</configuration>

View File

@@ -0,0 +1,75 @@
/* Create Tables */
-- 测试数据
CREATE TABLE test_data
(
id varchar(64) NOT NULL,
test_input varchar(200),
test_textarea varchar(200),
test_select varchar(10),
test_select_multiple varchar(200),
test_radio varchar(10),
test_checkbox varchar(200),
test_date datetime,
test_datetime datetime,
test_user_code varchar(64),
test_office_code varchar(64),
test_area_code varchar(64),
test_area_name varchar(100),
status char(1) DEFAULT '0' NOT NULL,
create_by varchar(64) NOT NULL,
create_date datetime NOT NULL,
update_by varchar(64) NOT NULL,
update_date datetime NOT NULL,
remarks varchar(500),
PRIMARY KEY (id)
);
-- 测试数据子表
CREATE TABLE test_data_child
(
id varchar(64) NOT NULL,
test_sort int,
test_data_id varchar(64),
test_input varchar(200),
test_textarea varchar(200),
test_select varchar(10),
test_select_multiple varchar(200),
test_radio varchar(10),
test_checkbox varchar(200),
test_date datetime,
test_datetime datetime,
test_user_code varchar(64),
test_office_code varchar(64),
test_area_code varchar(64),
test_area_name varchar(100),
PRIMARY KEY (id)
);
-- 测试树表
CREATE TABLE test_tree
(
tree_code varchar(64) NOT NULL,
parent_code varchar(64) NOT NULL,
parent_codes varchar(1000) NOT NULL,
tree_sort decimal(10) NOT NULL,
tree_sorts varchar(1000) NOT NULL,
tree_leaf char(1) NOT NULL,
tree_level decimal(4) NOT NULL,
tree_names varchar(1000) NOT NULL,
tree_name varchar(200) NOT NULL,
status char(1) DEFAULT '0' NOT NULL,
create_by varchar(64) NOT NULL,
create_date datetime NOT NULL,
update_by varchar(64) NOT NULL,
update_date datetime NOT NULL,
remarks varchar(500),
PRIMARY KEY (tree_code)
);

View File

@@ -0,0 +1,75 @@
/* Create Tables */
-- 测试数据
CREATE TABLE [test_data]
(
[id] varchar(64) NOT NULL,
[test_input] varchar(200),
[test_textarea] nvarchar(200),
[test_select] varchar(10),
[test_select_multiple] varchar(200),
[test_radio] varchar(10),
[test_checkbox] varchar(200),
[test_date] datetime,
[test_datetime] datetime,
[test_user_code] varchar(64),
[test_office_code] varchar(64),
[test_area_code] varchar(64),
[test_area_name] nvarchar(100),
[status] char(1) DEFAULT '0' NOT NULL,
[create_by] varchar(64) NOT NULL,
[create_date] datetime NOT NULL,
[update_by] varchar(64) NOT NULL,
[update_date] datetime NOT NULL,
[remarks] nvarchar(500),
PRIMARY KEY ([id])
);
-- 测试数据子表
CREATE TABLE [test_data_child]
(
[id] varchar(64) NOT NULL,
[test_sort] int,
[test_data_id] varchar(64),
[test_input] varchar(200),
[test_textarea] nvarchar(200),
[test_select] varchar(10),
[test_select_multiple] varchar(200),
[test_radio] varchar(10),
[test_checkbox] varchar(200),
[test_date] datetime,
[test_datetime] datetime,
[test_user_code] varchar(64),
[test_office_code] varchar(64),
[test_area_code] varchar(64),
[test_area_name] nvarchar(100),
PRIMARY KEY ([id])
);
-- 测试树表
CREATE TABLE [test_tree]
(
[tree_code] varchar(64) NOT NULL,
[parent_code] varchar(64) NOT NULL,
[parent_codes] varchar(1000) NOT NULL,
[tree_sort] decimal(10) NOT NULL,
[tree_sorts] varchar(1000) NOT NULL,
[tree_leaf] char(1) NOT NULL,
[tree_level] decimal(4) NOT NULL,
[tree_names] varchar(1000) NOT NULL,
[tree_name] nvarchar(200) NOT NULL,
[status] char(1) DEFAULT '0' NOT NULL,
[create_by] varchar(64) NOT NULL,
[create_date] datetime NOT NULL,
[update_by] varchar(64) NOT NULL,
[update_date] datetime NOT NULL,
[remarks] nvarchar(500),
PRIMARY KEY ([tree_code])
);

View File

@@ -0,0 +1,76 @@
SET SESSION FOREIGN_KEY_CHECKS=0;
/* Create Tables */
-- 测试数据
CREATE TABLE test_data
(
id varchar(64) NOT NULL COMMENT '编号',
test_input varchar(200) COMMENT '单行文本',
test_textarea varchar(200) COMMENT '多行文本',
test_select varchar(10) COMMENT '下拉框',
test_select_multiple varchar(200) COMMENT '下拉多选',
test_radio varchar(10) COMMENT '单选框',
test_checkbox varchar(200) COMMENT '复选框',
test_date datetime COMMENT '日期选择',
test_datetime datetime COMMENT '日期时间',
test_user_code varchar(64) COMMENT '用户选择',
test_office_code varchar(64) COMMENT '机构选择',
test_area_code varchar(64) COMMENT '区域选择',
test_area_name varchar(100) COMMENT '区域名称',
status char(1) DEFAULT '0' NOT NULL COMMENT '状态0正常 1删除 2停用',
create_by varchar(64) NOT NULL COMMENT '创建者',
create_date datetime NOT NULL COMMENT '创建时间',
update_by varchar(64) NOT NULL COMMENT '更新者',
update_date datetime NOT NULL COMMENT '更新时间',
remarks varchar(500) COMMENT '备注信息',
PRIMARY KEY (id)
) COMMENT = '测试数据';
-- 测试数据子表
CREATE TABLE test_data_child
(
id varchar(64) NOT NULL COMMENT '编号',
test_sort int COMMENT '排序号',
test_data_id varchar(64) COMMENT '父表主键',
test_input varchar(200) COMMENT '单行文本',
test_textarea varchar(200) COMMENT '多行文本',
test_select varchar(10) COMMENT '下拉框',
test_select_multiple varchar(200) COMMENT '下拉多选',
test_radio varchar(10) COMMENT '单选框',
test_checkbox varchar(200) COMMENT '复选框',
test_date datetime COMMENT '日期选择',
test_datetime datetime COMMENT '日期时间',
test_user_code varchar(64) COMMENT '用户选择',
test_office_code varchar(64) COMMENT '机构选择',
test_area_code varchar(64) COMMENT '区域选择',
test_area_name varchar(100) COMMENT '区域名称',
PRIMARY KEY (id)
) COMMENT = '测试数据子表';
-- 测试树表
CREATE TABLE test_tree
(
tree_code varchar(64) NOT NULL COMMENT '节点编码',
parent_code varchar(64) NOT NULL COMMENT '父级编号',
parent_codes varchar(1000) NOT NULL COMMENT '所有父级编号',
tree_sort decimal(10) NOT NULL COMMENT '排序号(升序)',
tree_sorts varchar(1000) NOT NULL COMMENT '所有排序号',
tree_leaf char(1) NOT NULL COMMENT '是否最末级',
tree_level decimal(4) NOT NULL COMMENT '层次级别',
tree_names varchar(1000) NOT NULL COMMENT '全节点名',
tree_name varchar(200) NOT NULL COMMENT '节点名称',
status char(1) DEFAULT '0' NOT NULL COMMENT '状态0正常 1删除 2停用',
create_by varchar(64) NOT NULL COMMENT '创建者',
create_date datetime NOT NULL COMMENT '创建时间',
update_by varchar(64) NOT NULL COMMENT '更新者',
update_date datetime NOT NULL COMMENT '更新时间',
remarks varchar(500) COMMENT '备注信息',
PRIMARY KEY (tree_code)
) COMMENT = '测试树表';

View File

@@ -0,0 +1,132 @@
/* Create Tables */
-- 测试数据
CREATE TABLE test_data
(
id varchar2(64) NOT NULL,
test_input varchar2(200),
test_textarea nvarchar2(200),
test_select varchar2(10),
test_select_multiple varchar2(200),
test_radio varchar2(10),
test_checkbox varchar2(200),
test_date timestamp,
test_datetime timestamp,
test_user_code varchar2(64),
test_office_code varchar2(64),
test_area_code varchar2(64),
test_area_name nvarchar2(100),
status char(1) DEFAULT '0' NOT NULL,
create_by varchar2(64) NOT NULL,
create_date timestamp NOT NULL,
update_by varchar2(64) NOT NULL,
update_date timestamp NOT NULL,
remarks nvarchar2(500),
PRIMARY KEY (id)
);
-- 测试数据子表
CREATE TABLE test_data_child
(
id varchar2(64) NOT NULL,
test_sort number(10,0),
test_data_id varchar2(64),
test_input varchar2(200),
test_textarea nvarchar2(200),
test_select varchar2(10),
test_select_multiple varchar2(200),
test_radio varchar2(10),
test_checkbox varchar2(200),
test_date timestamp,
test_datetime timestamp,
test_user_code varchar2(64),
test_office_code varchar2(64),
test_area_code varchar2(64),
test_area_name nvarchar2(100),
PRIMARY KEY (id)
);
-- 测试树表
CREATE TABLE test_tree
(
tree_code varchar2(64) NOT NULL,
parent_code varchar2(64) NOT NULL,
parent_codes varchar2(1000) NOT NULL,
tree_sort number(10) NOT NULL,
tree_sorts varchar2(1000) NOT NULL,
tree_leaf char(1) NOT NULL,
tree_level number(4) NOT NULL,
tree_names varchar2(1000) NOT NULL,
tree_name nvarchar2(200) NOT NULL,
status char(1) DEFAULT '0' NOT NULL,
create_by varchar2(64) NOT NULL,
create_date timestamp NOT NULL,
update_by varchar2(64) NOT NULL,
update_date timestamp NOT NULL,
remarks nvarchar2(500),
PRIMARY KEY (tree_code)
);
/* Comments */
COMMENT ON TABLE test_data IS '测试数据';
COMMENT ON COLUMN test_data.id IS '编号';
COMMENT ON COLUMN test_data.test_input IS '单行文本';
COMMENT ON COLUMN test_data.test_textarea IS '多行文本';
COMMENT ON COLUMN test_data.test_select IS '下拉框';
COMMENT ON COLUMN test_data.test_select_multiple IS '下拉多选';
COMMENT ON COLUMN test_data.test_radio IS '单选框';
COMMENT ON COLUMN test_data.test_checkbox IS '复选框';
COMMENT ON COLUMN test_data.test_date IS '日期选择';
COMMENT ON COLUMN test_data.test_datetime IS '日期时间';
COMMENT ON COLUMN test_data.test_user_code IS '用户选择';
COMMENT ON COLUMN test_data.test_office_code IS '机构选择';
COMMENT ON COLUMN test_data.test_area_code IS '区域选择';
COMMENT ON COLUMN test_data.test_area_name IS '区域名称';
COMMENT ON COLUMN test_data.status IS '状态0正常 1删除 2停用';
COMMENT ON COLUMN test_data.create_by IS '创建者';
COMMENT ON COLUMN test_data.create_date IS '创建时间';
COMMENT ON COLUMN test_data.update_by IS '更新者';
COMMENT ON COLUMN test_data.update_date IS '更新时间';
COMMENT ON COLUMN test_data.remarks IS '备注信息';
COMMENT ON TABLE test_data_child IS '测试数据子表';
COMMENT ON COLUMN test_data_child.id IS '编号';
COMMENT ON COLUMN test_data_child.test_sort IS '排序号';
COMMENT ON COLUMN test_data_child.test_data_id IS '父表主键';
COMMENT ON COLUMN test_data_child.test_input IS '单行文本';
COMMENT ON COLUMN test_data_child.test_textarea IS '多行文本';
COMMENT ON COLUMN test_data_child.test_select IS '下拉框';
COMMENT ON COLUMN test_data_child.test_select_multiple IS '下拉多选';
COMMENT ON COLUMN test_data_child.test_radio IS '单选框';
COMMENT ON COLUMN test_data_child.test_checkbox IS '复选框';
COMMENT ON COLUMN test_data_child.test_date IS '日期选择';
COMMENT ON COLUMN test_data_child.test_datetime IS '日期时间';
COMMENT ON COLUMN test_data_child.test_user_code IS '用户选择';
COMMENT ON COLUMN test_data_child.test_office_code IS '机构选择';
COMMENT ON COLUMN test_data_child.test_area_code IS '区域选择';
COMMENT ON COLUMN test_data_child.test_area_name IS '区域名称';
COMMENT ON TABLE test_tree IS '测试树表';
COMMENT ON COLUMN test_tree.tree_code IS '节点编码';
COMMENT ON COLUMN test_tree.parent_code IS '父级编号';
COMMENT ON COLUMN test_tree.parent_codes IS '所有父级编号';
COMMENT ON COLUMN test_tree.tree_sort IS '排序号(升序)';
COMMENT ON COLUMN test_tree.tree_sorts IS '所有排序号';
COMMENT ON COLUMN test_tree.tree_leaf IS '是否最末级';
COMMENT ON COLUMN test_tree.tree_level IS '层次级别';
COMMENT ON COLUMN test_tree.tree_names IS '全节点名';
COMMENT ON COLUMN test_tree.tree_name IS '节点名称';
COMMENT ON COLUMN test_tree.status IS '状态0正常 1删除 2停用';
COMMENT ON COLUMN test_tree.create_by IS '创建者';
COMMENT ON COLUMN test_tree.create_date IS '创建时间';
COMMENT ON COLUMN test_tree.update_by IS '更新者';
COMMENT ON COLUMN test_tree.update_date IS '更新时间';
COMMENT ON COLUMN test_tree.remarks IS '备注信息';

View File

@@ -0,0 +1,132 @@
/* Create Tables */
-- 测试数据
CREATE TABLE test_data
(
id varchar(64) NOT NULL,
test_input varchar(200),
test_textarea varchar(200),
test_select varchar(10),
test_select_multiple varchar(200),
test_radio varchar(10),
test_checkbox varchar(200),
test_date timestamp,
test_datetime timestamp,
test_user_code varchar(64),
test_office_code varchar(64),
test_area_code varchar(64),
test_area_name varchar(100),
status char(1) DEFAULT '0' NOT NULL,
create_by varchar(64) NOT NULL,
create_date timestamp NOT NULL,
update_by varchar(64) NOT NULL,
update_date timestamp NOT NULL,
remarks varchar(500),
PRIMARY KEY (id)
) WITHOUT OIDS;
-- 测试数据子表
CREATE TABLE test_data_child
(
id varchar(64) NOT NULL,
test_sort int,
test_data_id varchar(64),
test_input varchar(200),
test_textarea varchar(200),
test_select varchar(10),
test_select_multiple varchar(200),
test_radio varchar(10),
test_checkbox varchar(200),
test_date timestamp,
test_datetime timestamp,
test_user_code varchar(64),
test_office_code varchar(64),
test_area_code varchar(64),
test_area_name varchar(100),
PRIMARY KEY (id)
) WITHOUT OIDS;
-- 测试树表
CREATE TABLE test_tree
(
tree_code varchar(64) NOT NULL,
parent_code varchar(64) NOT NULL,
parent_codes varchar(1000) NOT NULL,
tree_sort decimal(10) NOT NULL,
tree_sorts varchar(1000) NOT NULL,
tree_leaf char(1) NOT NULL,
tree_level decimal(4) NOT NULL,
tree_names varchar(1000) NOT NULL,
tree_name varchar(200) NOT NULL,
status char(1) DEFAULT '0' NOT NULL,
create_by varchar(64) NOT NULL,
create_date timestamp NOT NULL,
update_by varchar(64) NOT NULL,
update_date timestamp NOT NULL,
remarks varchar(500),
PRIMARY KEY (tree_code)
) WITHOUT OIDS;
/* Comments */
COMMENT ON TABLE test_data IS '测试数据';
COMMENT ON COLUMN test_data.id IS '编号';
COMMENT ON COLUMN test_data.test_input IS '单行文本';
COMMENT ON COLUMN test_data.test_textarea IS '多行文本';
COMMENT ON COLUMN test_data.test_select IS '下拉框';
COMMENT ON COLUMN test_data.test_select_multiple IS '下拉多选';
COMMENT ON COLUMN test_data.test_radio IS '单选框';
COMMENT ON COLUMN test_data.test_checkbox IS '复选框';
COMMENT ON COLUMN test_data.test_date IS '日期选择';
COMMENT ON COLUMN test_data.test_datetime IS '日期时间';
COMMENT ON COLUMN test_data.test_user_code IS '用户选择';
COMMENT ON COLUMN test_data.test_office_code IS '机构选择';
COMMENT ON COLUMN test_data.test_area_code IS '区域选择';
COMMENT ON COLUMN test_data.test_area_name IS '区域名称';
COMMENT ON COLUMN test_data.status IS '状态0正常 1删除 2停用';
COMMENT ON COLUMN test_data.create_by IS '创建者';
COMMENT ON COLUMN test_data.create_date IS '创建时间';
COMMENT ON COLUMN test_data.update_by IS '更新者';
COMMENT ON COLUMN test_data.update_date IS '更新时间';
COMMENT ON COLUMN test_data.remarks IS '备注信息';
COMMENT ON TABLE test_data_child IS '测试数据子表';
COMMENT ON COLUMN test_data_child.id IS '编号';
COMMENT ON COLUMN test_data_child.test_sort IS '排序号';
COMMENT ON COLUMN test_data_child.test_data_id IS '父表主键';
COMMENT ON COLUMN test_data_child.test_input IS '单行文本';
COMMENT ON COLUMN test_data_child.test_textarea IS '多行文本';
COMMENT ON COLUMN test_data_child.test_select IS '下拉框';
COMMENT ON COLUMN test_data_child.test_select_multiple IS '下拉多选';
COMMENT ON COLUMN test_data_child.test_radio IS '单选框';
COMMENT ON COLUMN test_data_child.test_checkbox IS '复选框';
COMMENT ON COLUMN test_data_child.test_date IS '日期选择';
COMMENT ON COLUMN test_data_child.test_datetime IS '日期时间';
COMMENT ON COLUMN test_data_child.test_user_code IS '用户选择';
COMMENT ON COLUMN test_data_child.test_office_code IS '机构选择';
COMMENT ON COLUMN test_data_child.test_area_code IS '区域选择';
COMMENT ON COLUMN test_data_child.test_area_name IS '区域名称';
COMMENT ON TABLE test_tree IS '测试树表';
COMMENT ON COLUMN test_tree.tree_code IS '节点编码';
COMMENT ON COLUMN test_tree.parent_code IS '父级编号';
COMMENT ON COLUMN test_tree.parent_codes IS '所有父级编号';
COMMENT ON COLUMN test_tree.tree_sort IS '排序号(升序)';
COMMENT ON COLUMN test_tree.tree_sorts IS '所有排序号';
COMMENT ON COLUMN test_tree.tree_leaf IS '是否最末级';
COMMENT ON COLUMN test_tree.tree_level IS '层次级别';
COMMENT ON COLUMN test_tree.tree_names IS '全节点名';
COMMENT ON COLUMN test_tree.tree_name IS '节点名称';
COMMENT ON COLUMN test_tree.status IS '状态0正常 1删除 2停用';
COMMENT ON COLUMN test_tree.create_by IS '创建者';
COMMENT ON COLUMN test_tree.create_date IS '创建时间';
COMMENT ON COLUMN test_tree.update_by IS '更新者';
COMMENT ON COLUMN test_tree.update_date IS '更新时间';
COMMENT ON COLUMN test_tree.remarks IS '备注信息';

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jeesite.modules.test.dao.TestDataChildDao">
<!-- 查询数据
<select id="findList" resultType="TestDataChild">
SELECT ${sqlMap.column.toSql()}
FROM ${sqlMap.table.toSql()}
<where>
${sqlMap.where.toSql()}
</where>
ORDER BY ${sqlMap.order.toSql()}
</select> -->
</mapper>

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jeesite.modules.test.dao.TestDataDao">
<!-- 查询数据
<select id="findList" resultType="TestData">
SELECT ${sqlMap.column.toSql()}
FROM ${sqlMap.table.toSql()}
<where>
${sqlMap.where.toSql()}
</where>
ORDER BY ${sqlMap.order.toSql()}
</select> -->
<!-- 演示Map参数和返回值支持分页 -->
<select id="findListForMap" resultType="map">
SELECT * FROM test_data a
<where>
<if test="testInput != null and testInput != ''">
AND a.test_input = #{testInput}
</if>
</where>
<if test="page != null and page.orderBy != null and page.orderBy != ''">
ORDER BY ${page.orderBy}
</if>
</select>
</mapper>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jeesite.modules.test.dao.TestTreeDao">
<!-- 查询数据
<select id="findList" resultType="TestTree">
SELECT ${sqlMap.column.toSql()}
FROM ${sqlMap.table.toSql()}
<where>
${sqlMap.where.toSql()}
</where>
ORDER BY ${sqlMap.order.toSql()}
</select> -->
</mapper>

View File

@@ -0,0 +1,5 @@
/*!
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
* No deletion without permission, or be held responsible to law.
* 项目自定义的公共CSS可覆盖jeesite.css里的样式
*/

View File

@@ -0,0 +1,5 @@
/*!
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
* No deletion without permission, or be held responsible to law.
* 项目自定义的公共JavaScript可覆盖jeesite.js里的方法
*/

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

@@ -0,0 +1,51 @@
@echo off
rem /**
rem * Copyright (c) 2013-Now http://jeesite.com All rights reserved.
rem * No deletion without permission, or be held responsible to law.
rem *
rem * Author: ThinkGem@163.com
rem */
echo.
echo [<5B><>Ϣ] <20><><EFBFBD><EFBFBD>Web<65><62><EFBFBD>̡<EFBFBD>
echo.
rem pause
rem echo.
%~d0
cd %~dp0
title %cd%
rem <20><><EFBFBD><EFBFBD>JDKĿ¼
rem set "JAVA_HOME=%cd%\jdk1.8.0_x64"
rem <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7>
set "CLASS_PATH=%cd%/../"
rem <20>Ż<EFBFBD>JVM<56><4D><EFBFBD><EFBFBD>
set "JAVA_OPTS=-Xms512m -Xmx1024m"
rem <20><>ʽһ<CABD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
rem set "JAVA_OPTS=%JAVA_OPTS% -Dspring.config.location=%cd%\app.yml"
rem <20><>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD>ز<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
rem set "JAVA_OPTS=%JAVA_OPTS% -Dspring.profiles.active=prod"
if "%JAVA_HOME%" == "" goto noJavaHome
if not "%JAVA_HOME%" == "" goto gotJavaHome
goto end
:noJavaHome
set RUN_JAVA=java
goto runJava
:gotJavaHome
set "RUN_JAVA=%JAVA_HOME%\bin\java"
goto runJava
:runJava
call "%RUN_JAVA%" -cp %CLASS_PATH% %JAVA_OPTS% org.springframework.boot.loader.WarLauncher
goto end
:end
pause

View File

@@ -0,0 +1,33 @@
#!/bin/sh
# /**
# * Copyright (c) 2013-Now http://jeesite.com All rights reserved.
# * No deletion without permission, or be held responsible to law.
# *
# * Author: ThinkGem@163.com
# */
echo ""
echo "[信息] 运行Web工程。"
echo ""
# 设置JDK目录
# JAVA_HOME="$PWD/jdk1.8.0_x64"
# 设置类加载路径
CLASS_PATH="$PWD/../"
# 优化JVM参数
JAVA_OPTS="-Xms512m -Xmx1024m"
# 方式一、配置外部自定义的属性文件(建议)
# JAVA_OPTS="$JAVA_OPTS -Dspring.config.location=$PWD/app.yml"
# 方式二、配置环境名称,加载不同的属性文件
# JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=prod"
if [ -z "$JAVA_HOME" ]; then
RUN_JAVA=java
else
RUN_JAVA="$JAVA_HOME"/bin/java
fi
exec $RUN_JAVA -cp $CLASS_PATH $JAVA_OPTS org.springframework.boot.loader.WarLauncher

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>JeeSite</display-name>
<error-page>
<error-code>500</error-code>
<location>/error/500</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/error/404</location>
</error-page>
</web-app>

View File

@@ -0,0 +1,33 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
* No deletion without permission, or be held responsible to law.
*/
package com.jeesite.test;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import com.jeesite.common.tests.BaseInitDataTests;
import com.jeesite.modules.Application;
/**
* 初始化数据表
* @author ThinkGem
* @version 2020-5-26
*/
@ActiveProfiles("test")
@SpringBootTest(classes=Application.class)
public class InitData extends BaseInitDataTests {
@Test
public void initData01() throws Exception{
logger.info("数据库初始化完成。");
}
@Override
public void initProperty() {
System.setProperty("jeesite.initdata", "true");
}
}

View File

@@ -0,0 +1,51 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
* No deletion without permission, or be held responsible to law.
*/
package com.jeesite.test;
import java.util.List;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import com.jeesite.common.callback.MethodCallback;
import com.jeesite.common.collect.ListUtils;
import com.jeesite.common.tests.BaseSpringContextTests;
import com.jeesite.modules.Application;
import com.jeesite.modules.test.dao.TestDataDao;
import com.jeesite.modules.test.entity.TestData;
/**
* 批量插入测试
* @author ThinkGem
* @version 2019年10月28日
*/
@ActiveProfiles("test")
@SpringBootTest(classes=Application.class)
public class InsertBatchTest extends BaseSpringContextTests {
@Autowired
private TestDataDao testDataDao;
@Test
public void testData() throws Exception{
List<TestData> list = ListUtils.newArrayList();
for(int i=0; i<5000; i++){
TestData testData = new TestData();
testData.setTestInput("test"+i);
list.add(testData);
}
ListUtils.pageList(list, 100, new MethodCallback() {
@SuppressWarnings("unchecked")
public Object execute(Object... objs) {
return testDataDao.insertBatch((List<TestData>)objs[0]);
}
});
list = testDataDao.findList(new TestData());
System.out.println("size: " + list.size());
}
}

View File

@@ -0,0 +1,72 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
* No deletion without permission, or be held responsible to law.
*/
package com.jeesite.test;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import com.jeesite.common.collect.ListUtils;
import com.jeesite.common.idgen.IdGen;
import com.jeesite.common.tests.BaseSpringContextTests;
import com.jeesite.modules.Application;
import com.jeesite.modules.test.entity.TestData;
import com.jeesite.modules.test.entity.TestDataChild;
import com.jeesite.modules.test.service.TestDataService;
/**
* 多数据源并发测试<br>
* 1、将 TestDataChildDao 的数据源设置为 ds2<br>
* 2、将 TestDataChild 的表名设置为 test_data_child2<br>
* 3、配置 ds2 数据源,并创建 test_data_child2 表
* @author ThinkGem
* @version 2019-6-26
*/
@ActiveProfiles("test")
@SpringBootTest(classes=Application.class)
public class MultiDataSourceTest extends BaseSpringContextTests {
@Autowired
private TestDataService testDataService;
@Test
public void testData() throws Exception{
ExecutorService pool = Executors.newCachedThreadPool();
CountDownLatch latch = new CountDownLatch(10);
Runnable runnable = new Runnable() {
@Override
public void run() {
try{
Thread.sleep(IdGen.randomInt(1000, 3000));
TestData testData = new TestData();
testData.setTestDataChildList(ListUtils.newArrayList(
new TestDataChild(), new TestDataChild(), new TestDataChild()));
testDataService.save(testData);
List<TestData> list = testDataService.findList(new TestData());
System.out.println("size: " + list.size());
list.forEach(e -> {
System.out.println("get: " + testDataService.get(e));
});
} catch (Exception e) {
System.err.println(e.getMessage());
} finally {
latch.countDown();
}
}
};
for (int i = 0; i < latch.getCount(); i++) {
pool.execute(runnable);
}
latch.await();
pool.shutdown();
}
}

View File

@@ -0,0 +1,25 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
* No deletion without permission, or be held responsible to law.
*/
package com.jeesite.test;
import org.apache.shiro.crypto.AesCipherService;
/**
* v4.1.8 开始将不为记住我功能,设置默认密钥,即启动系统时生成新密钥。
* 这样会造成一个问题,比如:重启服务后,记住登录的用户因为解密失败,而需要重新登录。
* 为了解决这个问题,您可以通过这个类获取一个新密钥,设置到 shiro.rememberMe.secretKey 中即可。
* 另外,如果你从配置文件里将 shiro.rememberMe.secretKey 设置为空,启动系统时也会自动设置一个新的密钥。
* @author ThinkGem
* @version 2019年11月6日
*/
public class RememberMeKeyGen {
public static void main(String[] args) {
byte[] cipherKey = new AesCipherService().generateNewKey().getEncoded();
String secretKey = org.apache.shiro.codec.Base64.encodeToString(cipherKey);
System.out.println("shiro.rememberMe.secretKey = " + secretKey);
}
}

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="false">
<!-- Framework level setting -->
<include resource="config/logger-core.xml"/>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<!-- Console log output -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} %clr(%-5p) %clr([%-39logger{39}]){cyan} - %m%n%wEx</pattern>
</encoder>
</appender>
<!-- Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 -->
<root level="WARN">
<appender-ref ref="console" />
</root>
</configuration>