mirror of
https://github.com/chillzhuang/SpringBlade.git
synced 2024-11-22 02:19:25 +08:00
🎉 2.1.0.RELEASE
This commit is contained in:
parent
c7112fd9d7
commit
3d734c7858
@ -8,7 +8,7 @@
|
||||
<parent>
|
||||
<artifactId>SpringBlade</artifactId>
|
||||
<groupId>org.springblade</groupId>
|
||||
<version>2.0.0</version>
|
||||
<version>2.1.0</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>blade-auth</artifactId>
|
||||
|
@ -19,7 +19,6 @@ import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import io.swagger.annotations.ApiParam;
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.springblade.core.log.annotation.ApiLog;
|
||||
import org.springblade.core.secure.AuthInfo;
|
||||
import org.springblade.core.secure.utils.SecureUtil;
|
||||
import org.springblade.core.tool.api.R;
|
||||
@ -45,24 +44,24 @@ import java.util.Map;
|
||||
@Api(value = "用户授权认证", tags = "授权接口")
|
||||
public class AuthController {
|
||||
|
||||
IUserClient client;
|
||||
private IUserClient client;
|
||||
|
||||
@ApiLog("登录用户验证")
|
||||
@PostMapping("token")
|
||||
@ApiOperation(value = "获取认证token", notes = "传入账号:account,密码:password")
|
||||
public R<AuthInfo> token(@ApiParam(value = "账号", required = true) @RequestParam String account,
|
||||
@ApiOperation(value = "获取认证token", notes = "传入租户编号:tenantCode,账号:account,密码:password")
|
||||
public R<AuthInfo> token(@ApiParam(value = "租户编号", required = true) @RequestParam String tenantCode,
|
||||
@ApiParam(value = "账号", required = true) @RequestParam String account,
|
||||
@ApiParam(value = "密码", required = true) @RequestParam String password) {
|
||||
|
||||
if (Func.hasEmpty(account, password)) {
|
||||
return R.fail("接口调用不合法");
|
||||
}
|
||||
|
||||
R<UserInfo> res = client.userInfo(account, DigestUtil.encrypt(password));
|
||||
R<UserInfo> res = client.userInfo(tenantCode, account, DigestUtil.encrypt(password));
|
||||
|
||||
User user = res.getData().getUser();
|
||||
|
||||
//验证用户
|
||||
if (user == null || Func.isEmpty(user.getId())) {
|
||||
if (Func.isEmpty(user.getId())) {
|
||||
return R.fail("用户名或密码不正确");
|
||||
}
|
||||
|
||||
@ -70,6 +69,7 @@ public class AuthController {
|
||||
Map<String, String> param = new HashMap<>(16);
|
||||
param.put(SecureUtil.USER_ID, Func.toStr(user.getId()));
|
||||
param.put(SecureUtil.ROLE_ID, user.getRoleId());
|
||||
param.put(SecureUtil.TENANT_CODE, user.getTenantCode());
|
||||
param.put(SecureUtil.ACCOUNT, user.getAccount());
|
||||
param.put(SecureUtil.USER_NAME, user.getRealName());
|
||||
param.put(SecureUtil.ROLE_NAME, Func.join(res.getData().getRoles()));
|
||||
|
@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>SpringBlade</artifactId>
|
||||
<groupId>org.springblade</groupId>
|
||||
<version>2.0.0</version>
|
||||
<version>2.1.0</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
@ -27,6 +27,16 @@ public interface CommonConstant {
|
||||
*/
|
||||
String SENTINEL_PROD_ADDR = "192.168.186.129:8858";
|
||||
|
||||
/**
|
||||
* sword 系统名
|
||||
*/
|
||||
String SWORD_NAME = "sword";
|
||||
|
||||
/**
|
||||
* saber 系统名
|
||||
*/
|
||||
String SABER_NAME = "saber";
|
||||
|
||||
/**
|
||||
* 顶级父节点id
|
||||
*/
|
||||
|
@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>SpringBlade</artifactId>
|
||||
<groupId>org.springblade</groupId>
|
||||
<version>2.0.0</version>
|
||||
<version>2.1.0</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>blade-ops</artifactId>
|
||||
<groupId>org.springblade</groupId>
|
||||
<version>2.0.0</version>
|
||||
<version>2.1.0</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>org.springblade</groupId>
|
||||
<artifactId>blade-ops</artifactId>
|
||||
<version>2.0.0</version>
|
||||
<version>2.1.0</version>
|
||||
</parent>
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
@ -25,7 +25,7 @@ import org.springblade.core.tool.api.R;
|
||||
import org.springblade.core.tool.utils.Func;
|
||||
import org.springblade.develop.entity.Code;
|
||||
import org.springblade.develop.service.ICodeService;
|
||||
import org.springblade.develop.support.BladeGenerator;
|
||||
import org.springblade.develop.support.BladeCodeGenerator;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import springfox.documentation.annotations.ApiIgnore;
|
||||
|
||||
@ -37,7 +37,6 @@ import java.util.Map;
|
||||
* 控制器
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-24
|
||||
*/
|
||||
@RestController
|
||||
@AllArgsConstructor
|
||||
@ -86,7 +85,7 @@ public class CodeController extends BladeController {
|
||||
* 删除
|
||||
*/
|
||||
@PostMapping("/remove")
|
||||
@ApiOperation(value = "物理删除", notes = "传入ids", position = 7)
|
||||
@ApiOperation(value = "删除", notes = "传入ids", position = 7)
|
||||
public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
|
||||
return R.status(codeService.removeByIds(Func.toIntList(ids)));
|
||||
}
|
||||
@ -96,11 +95,13 @@ public class CodeController extends BladeController {
|
||||
*/
|
||||
@PostMapping("/gen-code")
|
||||
@ApiOperation(value = "代码生成", notes = "传入ids", position = 8)
|
||||
public R genCode(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
|
||||
public R genCode(@ApiParam(value = "主键集合", required = true) @RequestParam String ids, @RequestParam(defaultValue = "sword") String system) {
|
||||
Collection<Code> codes = codeService.listByIds(Func.toIntList(ids));
|
||||
codes.forEach(code -> {
|
||||
BladeGenerator generator = new BladeGenerator();
|
||||
BladeCodeGenerator generator = new BladeCodeGenerator();
|
||||
generator.setSystemName(system);
|
||||
generator.setServiceName(code.getServiceName());
|
||||
generator.setCodeName(code.getCodeName());
|
||||
generator.setPackageName(code.getPackageName());
|
||||
generator.setPackageDir(code.getApiPath());
|
||||
generator.setPackageWebDir(code.getWebPath());
|
||||
|
@ -27,6 +27,7 @@ import com.baomidou.mybatisplus.generator.config.po.TableInfo;
|
||||
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
|
||||
import lombok.Data;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springblade.common.constant.CommonConstant;
|
||||
import org.springblade.core.tool.utils.Func;
|
||||
import org.springblade.core.tool.utils.StringUtil;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
@ -44,7 +45,15 @@ import java.util.*;
|
||||
*/
|
||||
@Data
|
||||
@Slf4j
|
||||
public class BladeGenerator {
|
||||
public class BladeCodeGenerator {
|
||||
/**
|
||||
* 代码所在系统
|
||||
*/
|
||||
private String systemName = CommonConstant.SWORD_NAME;
|
||||
/**
|
||||
* 代码模块名称
|
||||
*/
|
||||
private String codeName;
|
||||
/**
|
||||
* 代码所在服务名
|
||||
*/
|
||||
@ -81,6 +90,10 @@ public class BladeGenerator {
|
||||
* 基础业务字段
|
||||
*/
|
||||
private String[] superEntityColumns = {"id", "create_time", "create_user", "update_time", "update_user", "status", "is_deleted"};
|
||||
/**
|
||||
* 租户字段
|
||||
*/
|
||||
private String tenantColumn = "tenant_code";
|
||||
/**
|
||||
* 是否启用swagger
|
||||
*/
|
||||
@ -165,16 +178,25 @@ public class BladeGenerator {
|
||||
private InjectionConfig getInjectionConfig() {
|
||||
String servicePackage = serviceName.split("-").length > 1 ? serviceName.split("-")[1] : serviceName;
|
||||
// 自定义配置
|
||||
Map<String, Object> map = new HashMap<>(16);
|
||||
InjectionConfig cfg = new InjectionConfig() {
|
||||
@Override
|
||||
public void initMap() {
|
||||
Map<String, Object> map = new HashMap<>(16);
|
||||
map.put("codeName", codeName);
|
||||
map.put("serviceName", serviceName);
|
||||
map.put("servicePackage", servicePackage);
|
||||
map.put("tenantColumn", tenantColumn);
|
||||
this.setMap(map);
|
||||
}
|
||||
};
|
||||
List<FileOutConfig> focList = new ArrayList<>();
|
||||
focList.add(new FileOutConfig("/templates/sql/menu.sql.vm") {
|
||||
@Override
|
||||
public String outputFile(TableInfo tableInfo) {
|
||||
map.put("entityKey", (tableInfo.getEntityName().toLowerCase()));
|
||||
return getOutputDir() + "/" + "/sql/menu.mysql";
|
||||
}
|
||||
});
|
||||
focList.add(new FileOutConfig("/templates/entityVO.java.vm") {
|
||||
@Override
|
||||
public String outputFile(TableInfo tableInfo) {
|
||||
@ -194,6 +216,7 @@ public class BladeGenerator {
|
||||
}
|
||||
});
|
||||
if (Func.isNotBlank(packageWebDir)) {
|
||||
if (Func.equals(systemName, CommonConstant.SWORD_NAME)) {
|
||||
focList.add(new FileOutConfig("/templates/sword/action.js.vm") {
|
||||
@Override
|
||||
public String outputFile(TableInfo tableInfo) {
|
||||
@ -236,6 +259,20 @@ public class BladeGenerator {
|
||||
return getOutputWebDir() + "/pages" + "/" + StringUtil.upperFirst(servicePackage) + "/" + tableInfo.getEntityName() + "/" + tableInfo.getEntityName() + "View.js";
|
||||
}
|
||||
});
|
||||
} else if (Func.equals(systemName, CommonConstant.SABER_NAME)) {
|
||||
focList.add(new FileOutConfig("/templates/saber/api.js.vm") {
|
||||
@Override
|
||||
public String outputFile(TableInfo tableInfo) {
|
||||
return getOutputWebDir() + "/api" + "/" + servicePackage.toLowerCase() + "/" + tableInfo.getEntityName().toLowerCase() + ".js";
|
||||
}
|
||||
});
|
||||
focList.add(new FileOutConfig("/templates/saber/crud.vue.vm") {
|
||||
@Override
|
||||
public String outputFile(TableInfo tableInfo) {
|
||||
return getOutputWebDir() + "/views" + "/" + servicePackage.toLowerCase() + "/" + tableInfo.getEntityName().toLowerCase() + ".vue";
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
cfg.setFileOutConfigList(focList);
|
||||
return cfg;
|
||||
@ -264,7 +301,7 @@ public class BladeGenerator {
|
||||
* @return outputDir
|
||||
*/
|
||||
public String getOutputDir() {
|
||||
return Func.isBlank(packageDir) ? System.getProperty("user.dir") : packageDir + "/src/main/java";
|
||||
return (Func.isBlank(packageDir) ? System.getProperty("user.dir") + "/blade-ops/blade-develop" : packageDir) + "/src/main/java";
|
||||
}
|
||||
|
||||
/**
|
||||
@ -273,7 +310,7 @@ public class BladeGenerator {
|
||||
* @return outputDir
|
||||
*/
|
||||
public String getOutputWebDir() {
|
||||
return Func.isBlank(packageWebDir) ? System.getProperty("user.dir") : packageWebDir + "/src";
|
||||
return (Func.isBlank(packageWebDir) ? System.getProperty("user.dir") : packageWebDir) + "/src";
|
||||
}
|
||||
|
||||
/**
|
@ -52,7 +52,7 @@ import java.util.List;
|
||||
*/
|
||||
@RestController
|
||||
@AllArgsConstructor
|
||||
@RequestMapping("#if($!{package.ModuleName})/$!{package.ModuleName}#end/$!{table.entityPath}")
|
||||
@RequestMapping("#if($!{package.ModuleName})/$!{package.ModuleName}#end/$!{cfg.entityKey}")
|
||||
@Api(value = "$!{table.comment}", tags = "$!{table.comment}接口")
|
||||
#if($!{superControllerClass})
|
||||
public class $!{table.controllerName} extends $!{superControllerClass} {
|
||||
@ -140,7 +140,7 @@ public class $!{table.controllerName} {
|
||||
* 删除 $!{table.comment}
|
||||
*/
|
||||
@PostMapping("/remove")
|
||||
@ApiOperation(value = "物理删除", notes = "传入ids", position = 7)
|
||||
@ApiOperation(value = "删除", notes = "传入ids", position = 7)
|
||||
public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
|
||||
return R.status($!{table.entityPath}Service.removeByIds(Func.toIntList(ids)));
|
||||
}
|
||||
|
@ -58,6 +58,7 @@ public class $!{entity} implements Serializable {
|
||||
|
||||
## ---------- BEGIN 字段循环遍历 ----------
|
||||
#foreach($field in $!{table.fields})
|
||||
#if($!{field.name}!=$!{cfg.tenantColumn})
|
||||
#if($!{field.keyFlag})
|
||||
#set($keyPropertyName=$!{field.propertyName})
|
||||
#end
|
||||
@ -98,7 +99,7 @@ public class $!{entity} implements Serializable {
|
||||
@TableLogic
|
||||
#end
|
||||
private $!{field.propertyType} $!{field.propertyName};
|
||||
|
||||
#end
|
||||
#end
|
||||
## ---------- END 字段循环遍历 ----------
|
||||
|
||||
|
@ -19,26 +19,16 @@
|
||||
<result column="$!{field.name}" property="$!{field.propertyName}"/>
|
||||
#end
|
||||
#foreach($field in $!{table.fields})
|
||||
#if(!$!{field.keyFlag})##生成普通字段
|
||||
#if(!$!{field.keyFlag} && $!{field.name} != $!{cfg.tenantColumn})##生成普通字段
|
||||
<result column="$!{field.name}" property="$!{field.propertyName}"/>
|
||||
#end
|
||||
#end
|
||||
</resultMap>
|
||||
|
||||
#end
|
||||
#if($!{baseColumnList})
|
||||
<!-- 通用查询结果列 -->
|
||||
<sql id="baseColumnList">
|
||||
select
|
||||
#foreach($field in $!{table.commonFields})
|
||||
#if($!{field.name} == $!{field.propertyName})$!{field.name}#else$!{field.name} AS $!{field.propertyName}#end,
|
||||
#end
|
||||
$!{table.fieldNames}
|
||||
</sql>
|
||||
|
||||
<select id="select$!{entity}Page" resultMap="$!{table.entityPath}ResultMap">
|
||||
select * from $!{table.name} where is_deleted = 0
|
||||
</select>
|
||||
|
||||
#end
|
||||
</mapper>
|
||||
|
@ -1,5 +1,5 @@
|
||||
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
|
||||
spring.datasource.url=jdbc:mysql://localhost:3306/bladex?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false
|
||||
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
|
||||
spring.datasource.url=jdbc:mysql://localhost:3306/blade?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&serverTimezone=GMT%2B8
|
||||
spring.datasource.username=root
|
||||
spring.datasource.password=root
|
||||
author=BladeX
|
||||
author=Blade
|
||||
|
@ -0,0 +1,50 @@
|
||||
import request from '@/router/axios';
|
||||
|
||||
export const getList = (current, size, params) => {
|
||||
return request({
|
||||
url: '/api/$!{cfg.serviceName}/$!{cfg.entityKey}/list',
|
||||
method: 'get',
|
||||
params: {
|
||||
...params,
|
||||
current,
|
||||
size,
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export const getDetail = (id) => {
|
||||
return request({
|
||||
url: '/api/$!{cfg.serviceName}/$!{cfg.entityKey}/detail',
|
||||
method: 'get',
|
||||
params: {
|
||||
id
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export const remove = (ids) => {
|
||||
return request({
|
||||
url: '/api/$!{cfg.serviceName}/$!{cfg.entityKey}/remove',
|
||||
method: 'post',
|
||||
params: {
|
||||
ids,
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export const add = (row) => {
|
||||
return request({
|
||||
url: '/api/$!{cfg.serviceName}/$!{cfg.entityKey}/submit',
|
||||
method: 'post',
|
||||
data: row
|
||||
})
|
||||
}
|
||||
|
||||
export const update = (row) => {
|
||||
return request({
|
||||
url: '/api/$!{cfg.serviceName}/$!{cfg.entityKey}/submit',
|
||||
method: 'post',
|
||||
data: row
|
||||
})
|
||||
}
|
||||
|
@ -0,0 +1,176 @@
|
||||
<template>
|
||||
<basic-container>
|
||||
<avue-crud :option="option"
|
||||
:data="data"
|
||||
:page="page"
|
||||
@row-del="rowDel"
|
||||
v-model="form"
|
||||
:permission="permissionList"
|
||||
@row-update="rowUpdate"
|
||||
@row-save="rowSave"
|
||||
:before-open="beforeOpen"
|
||||
@search-change="searchChange"
|
||||
@search-reset="searchReset"
|
||||
@selection-change="selectionChange"
|
||||
@on-load="onLoad">
|
||||
<template slot="menuLeft">
|
||||
<el-button type="danger"
|
||||
size="small"
|
||||
icon="el-icon-delete"
|
||||
plain
|
||||
v-if="permission.$!{table.entityPath}_delete"
|
||||
@click="handleDelete">删 除
|
||||
</el-button>
|
||||
</template>
|
||||
</avue-crud>
|
||||
</basic-container>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {getList, getDetail, add, update, remove} from "@/api/$!{cfg.servicePackage}/$!{cfg.entityKey}";
|
||||
import {mapGetters} from "vuex";
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
form: {},
|
||||
page: {
|
||||
pageSize: 10,
|
||||
currentPage: 1,
|
||||
total: 0
|
||||
},
|
||||
selectionList: [],
|
||||
option: {
|
||||
tip: false,
|
||||
border: true,
|
||||
index: true,
|
||||
viewBtn: true,
|
||||
selection: true,
|
||||
column: [
|
||||
#foreach($field in $!{table.fields})
|
||||
#if($!{field.name}!=$!{cfg.tenantColumn})
|
||||
{
|
||||
label: "$!{field.comment}",
|
||||
prop: "$!{field.propertyName}",
|
||||
rules: [{
|
||||
required: true,
|
||||
message: "请输入$!{field.comment}",
|
||||
trigger: "blur"
|
||||
}]
|
||||
},
|
||||
#end
|
||||
#end
|
||||
]
|
||||
},
|
||||
data: []
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapGetters(["permission"]),
|
||||
permissionList() {
|
||||
return {
|
||||
addBtn: this.permission.$!{table.entityPath}_add,
|
||||
viewBtn: this.permission.$!{table.entityPath}_view,
|
||||
delBtn: this.permission.$!{table.entityPath}_delete,
|
||||
editBtn: this.permission.$!{table.entityPath}_edit
|
||||
};
|
||||
},
|
||||
ids() {
|
||||
let ids = [];
|
||||
this.selectionList.forEach(ele => {
|
||||
ids.push(ele.id);
|
||||
});
|
||||
return ids.join(",");
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
rowSave(row, loading) {
|
||||
add(row).then(() => {
|
||||
loading();
|
||||
this.onLoad(this.page);
|
||||
this.$message({
|
||||
type: "success",
|
||||
message: "操作成功!"
|
||||
});
|
||||
});
|
||||
},
|
||||
rowUpdate(row, index, loading) {
|
||||
update(row).then(() => {
|
||||
loading();
|
||||
this.onLoad(this.page);
|
||||
this.$message({
|
||||
type: "success",
|
||||
message: "操作成功!"
|
||||
});
|
||||
});
|
||||
},
|
||||
rowDel(row) {
|
||||
this.$confirm("确定将选择数据删除?", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
})
|
||||
.then(() => {
|
||||
return remove(row.id);
|
||||
})
|
||||
.then(() => {
|
||||
this.onLoad(this.page);
|
||||
this.$message({
|
||||
type: "success",
|
||||
message: "操作成功!"
|
||||
});
|
||||
});
|
||||
},
|
||||
searchReset() {
|
||||
this.onLoad(this.page);
|
||||
},
|
||||
searchChange(params) {
|
||||
this.onLoad(this.page, params);
|
||||
},
|
||||
selectionChange(list) {
|
||||
this.selectionList = list;
|
||||
},
|
||||
handleDelete() {
|
||||
if (this.selectionList.length === 0) {
|
||||
this.$message.warning("请选择至少一条数据");
|
||||
return;
|
||||
}
|
||||
this.$confirm("确定将选择数据删除?", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
})
|
||||
.then(() => {
|
||||
return remove(this.ids);
|
||||
})
|
||||
.then(() => {
|
||||
this.onLoad(this.page);
|
||||
this.$message({
|
||||
type: "success",
|
||||
message: "操作成功!"
|
||||
});
|
||||
this.$refs.crud.toggleSelection();
|
||||
});
|
||||
},
|
||||
|
||||
beforeOpen(done, type) {
|
||||
if (["edit", "view"].includes(type)) {
|
||||
getDetail(this.form.id).then(res => {
|
||||
this.form = res.data.data;
|
||||
});
|
||||
}
|
||||
done();
|
||||
},
|
||||
onLoad(page, params = {}) {
|
||||
getList(page.currentPage, page.pageSize, params).then(res => {
|
||||
const data = res.data.data;
|
||||
this.page.total = data.total;
|
||||
this.data = data.records;
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
@ -0,0 +1,11 @@
|
||||
INSERT INTO `blade_menu`(`tenant_code`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
|
||||
VALUES ('000000', 0, '$!{cfg.entityKey}', '$!{cfg.codeName}', 'menu', '/$!{cfg.servicePackage}/$!{cfg.entityKey}', NULL, 1, 1, 0, 1, NULL, 0);
|
||||
set @parentid = (SELECT LAST_INSERT_ID());
|
||||
INSERT INTO `blade_menu`(`tenant_code`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
|
||||
VALUES ('000000', @parentid, '$!{cfg.entityKey}_add', '新增', 'add', '/$!{cfg.servicePackage}/$!{cfg.entityKey}/add', 'plus', 1, 2, 1, 1, NULL, 0);
|
||||
INSERT INTO `blade_menu`(`tenant_code`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
|
||||
VALUES ('000000', @parentid, '$!{cfg.entityKey}_edit', '修改', 'edit', '/$!{cfg.servicePackage}/$!{cfg.entityKey}/edit', 'form', 2, 2, 1, 2, NULL, 0);
|
||||
INSERT INTO `blade_menu`(`tenant_code`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
|
||||
VALUES ('000000', @parentid, '$!{cfg.entityKey}_delete', '删除', 'delete', '/api/$!{cfg.serviceName}/$!{cfg.entityKey}/remove', 'delete', 3, 2, 1, 3, NULL, 0);
|
||||
INSERT INTO `blade_menu`(`tenant_code`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
|
||||
VALUES ('000000', @parentid, '$!{cfg.entityKey}_view', '查看', 'view', '/$!{cfg.servicePackage}/$!{cfg.entityKey}/view', 'file-text', 4, 2, 1, 2, NULL, 0);
|
@ -52,6 +52,7 @@ class $!{entity}Add extends PureComponent {
|
||||
<Form hideRequiredMark style={{ marginTop: 8 }}>
|
||||
<Card className={styles.card} bordered={false}>
|
||||
#foreach($field in $!{table.fields})
|
||||
#if($!{field.name}!=$!{cfg.tenantColumn})
|
||||
<FormItem {...formItemLayout} label="$!{field.comment}">
|
||||
{getFieldDecorator('$!{field.propertyName}', {
|
||||
rules: [
|
||||
@ -62,6 +63,7 @@ class $!{entity}Add extends PureComponent {
|
||||
],
|
||||
})(<Input placeholder="请输入$!{field.comment}" />)}
|
||||
</FormItem>
|
||||
#end
|
||||
#end
|
||||
</Card>
|
||||
</Form>
|
||||
|
@ -10,7 +10,7 @@ const FormItem = Form.Item;
|
||||
|
||||
@connect(({ $!{table.entityPath}, loading }) => ({
|
||||
$!{table.entityPath},
|
||||
submitting: loading.effects['code/submit'],
|
||||
submitting: loading.effects['$!{table.entityPath}/submit'],
|
||||
}))
|
||||
@Form.create()
|
||||
class $!{entity}Edit extends PureComponent {
|
||||
@ -75,6 +75,7 @@ class $!{entity}Edit extends PureComponent {
|
||||
<Form hideRequiredMark style={{ marginTop: 8 }}>
|
||||
<Card className={styles.card} bordered={false}>
|
||||
#foreach($field in $!{table.fields})
|
||||
#if($!{field.name}!=$!{cfg.tenantColumn})
|
||||
<FormItem {...formItemLayout} label="$!{field.comment}">
|
||||
{getFieldDecorator('$!{field.propertyName}', {
|
||||
rules: [
|
||||
@ -86,6 +87,7 @@ class $!{entity}Edit extends PureComponent {
|
||||
initialValue: detail.$!{field.propertyName},
|
||||
})(<Input placeholder="请输入$!{field.comment}" />)}
|
||||
</FormItem>
|
||||
#end
|
||||
#end
|
||||
</Card>
|
||||
</Form>
|
||||
|
@ -10,7 +10,7 @@ const FormItem = Form.Item;
|
||||
|
||||
@connect(({ $!{table.entityPath}, loading }) => ({
|
||||
$!{table.entityPath},
|
||||
loading: loading.models.param,
|
||||
loading: loading.models.$!{table.entityPath},
|
||||
}))
|
||||
@Form.create()
|
||||
class $!{entity} extends PureComponent {
|
||||
@ -57,10 +57,12 @@ class $!{entity} extends PureComponent {
|
||||
|
||||
const columns = [
|
||||
#foreach($field in $!{table.fields})
|
||||
#if($!{field.name}!=$!{cfg.tenantColumn})
|
||||
{
|
||||
title: '$!{field.comment}',
|
||||
dataIndex: '$!{field.propertyName}',
|
||||
},
|
||||
#end
|
||||
#end
|
||||
];
|
||||
|
||||
|
@ -20,8 +20,12 @@ export default {
|
||||
yield put({
|
||||
type: 'saveList',
|
||||
payload: {
|
||||
list: response.data,
|
||||
pagination: false,
|
||||
list: response.data.records,
|
||||
pagination: {
|
||||
total: response.data.total,
|
||||
current: response.data.current,
|
||||
pageSize: response.data.size,
|
||||
},
|
||||
},
|
||||
});
|
||||
}
|
||||
|
@ -4,22 +4,22 @@ import func from '../utils/Func';
|
||||
import request from '../utils/request';
|
||||
|
||||
export async function list(params) {
|
||||
return request(`/api/$!{cfg.serviceName}/$!{table.entityPath}/list?$!{params}`);
|
||||
return request(`/api/$!{cfg.serviceName}/$!{cfg.entityKey}/list?$!{params}`);
|
||||
}
|
||||
|
||||
export async function submit(params) {
|
||||
return request('/api/$!{cfg.serviceName}/$!{table.entityPath}/submit', {
|
||||
return request('/api/$!{cfg.serviceName}/$!{cfg.entityKey}/submit', {
|
||||
method: 'POST',
|
||||
body: params,
|
||||
});
|
||||
}
|
||||
|
||||
export async function detail(params) {
|
||||
return request(`/api/$!{cfg.serviceName}/$!{table.entityPath}/detail?$!{params}`);
|
||||
return request(`/api/$!{cfg.serviceName}/$!{cfg.entityKey}/detail?$!{params}`);
|
||||
}
|
||||
|
||||
export async function remove(params) {
|
||||
return request('/api/$!{cfg.serviceName}/$!{table.entityPath}/remove', {
|
||||
return request('/api/$!{cfg.serviceName}/$!{cfg.entityKey}/remove', {
|
||||
method: 'POST',
|
||||
body: func.toFormData(params),
|
||||
});
|
||||
|
@ -61,9 +61,11 @@ class $!{entity}View extends PureComponent {
|
||||
<Form hideRequiredMark style={{ marginTop: 8 }}>
|
||||
<Card className={styles.card} bordered={false}>
|
||||
#foreach($field in $!{table.fields})
|
||||
#if($!{field.name}!=$!{cfg.tenantColumn})
|
||||
<FormItem {...formItemLayout} label="$!{field.comment}">
|
||||
<span>{detail.$!{field.propertyName}}</span>
|
||||
</FormItem>
|
||||
#end
|
||||
#end
|
||||
</Card>
|
||||
</Form>
|
||||
|
@ -13,9 +13,11 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.springblade.develop.support;
|
||||
package org.springblade.test;
|
||||
|
||||
|
||||
import org.springblade.develop.support.BladeCodeGenerator;
|
||||
|
||||
/**
|
||||
* 代码生成器
|
||||
*
|
||||
@ -23,14 +25,26 @@ package org.springblade.develop.support;
|
||||
*/
|
||||
public class CodeGenerator {
|
||||
|
||||
/**
|
||||
* 代码生成的模块名
|
||||
*/
|
||||
public static String CODE_NAME = "租户管理";
|
||||
/**
|
||||
* 代码所在服务名
|
||||
*/
|
||||
public static String SERVICE_NAME = "blade-system";
|
||||
/**
|
||||
* 代码生成的包名
|
||||
*/
|
||||
public static String PACKAGE_NAME = "org.springblade.demo";
|
||||
public static String PACKAGE_NAME = "org.springblade.system";
|
||||
/**
|
||||
* 代码生成的地址
|
||||
* 前端代码生成所属系统
|
||||
*/
|
||||
public static String PACKAGE_DIR = "/blade-ops/blade-codegen/src/main/java";
|
||||
public static String SYSTEM_NAME = "sword";
|
||||
/**
|
||||
* 前端代码生成地址
|
||||
*/
|
||||
public static String PACKAGE_WEB_DIR = "/Users/chill/Workspaces/product/Sword";
|
||||
/**
|
||||
* 需要去掉的表前缀
|
||||
*/
|
||||
@ -38,7 +52,7 @@ public class CodeGenerator {
|
||||
/**
|
||||
* 需要生成的表名(两者只能取其一)
|
||||
*/
|
||||
public static String[] INCLUDE_TABLES = {"blade_blog"};
|
||||
public static String[] INCLUDE_TABLES = {"blade_tenant"};
|
||||
/**
|
||||
* 需要排除的表名(两者只能取其一)
|
||||
*/
|
||||
@ -46,24 +60,28 @@ public class CodeGenerator {
|
||||
/**
|
||||
* 是否包含基础业务字段
|
||||
*/
|
||||
public static Boolean HAS_SUPER_ENTITY = Boolean.FALSE;
|
||||
public static Boolean HAS_SUPER_ENTITY = Boolean.TRUE;
|
||||
/**
|
||||
* 基础业务字段
|
||||
*/
|
||||
public static String[] SUPER_ENTITY_COLUNMS = {"id", "create_time", "create_user", "update_time", "update_user", "status", "is_deleted"};
|
||||
public static String[] SUPER_ENTITY_COLUMNS = {"id", "create_time", "create_user", "update_time", "update_user", "status", "is_deleted"};
|
||||
|
||||
|
||||
/**
|
||||
* RUN THIS
|
||||
*/
|
||||
public static void generate() {
|
||||
BladeGenerator generator = new BladeGenerator();
|
||||
public static void main(String[] args) {
|
||||
BladeCodeGenerator generator = new BladeCodeGenerator();
|
||||
generator.setCodeName(CODE_NAME);
|
||||
generator.setServiceName(SERVICE_NAME);
|
||||
generator.setSystemName(SYSTEM_NAME);
|
||||
generator.setPackageName(PACKAGE_NAME);
|
||||
generator.setPackageDir(PACKAGE_DIR);
|
||||
generator.setPackageWebDir(PACKAGE_WEB_DIR);
|
||||
generator.setTablePrefix(TABLE_PREFIX);
|
||||
generator.setIncludeTables(INCLUDE_TABLES);
|
||||
generator.setExcludeTables(EXCLUDE_TABLES);
|
||||
generator.setHasSuperEntity(HAS_SUPER_ENTITY);
|
||||
generator.setSuperEntityColumns(SUPER_ENTITY_COLUNMS);
|
||||
generator.setSuperEntityColumns(SUPER_ENTITY_COLUMNS);
|
||||
generator.run();
|
||||
}
|
||||
|
@ -0,0 +1,150 @@
|
||||
/**
|
||||
* Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
|
||||
* <p>
|
||||
* 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
|
||||
* <p>
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* <p>
|
||||
* 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 $!{package.Controller};
|
||||
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import io.swagger.annotations.ApiParam;
|
||||
import lombok.AllArgsConstructor;
|
||||
import javax.validation.Valid;
|
||||
|
||||
import org.springblade.core.mp.support.Condition;
|
||||
import org.springblade.core.mp.support.Query;
|
||||
import org.springblade.system.feign.IDictClient;
|
||||
import org.springblade.core.tool.api.R;
|
||||
import org.springblade.core.tool.utils.Func;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
#if($!{superEntityClass})
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
#end
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import $!{package.Entity}.$!{entity};
|
||||
#set($voPackage=$package.Entity.replace("entity","vo"))
|
||||
import $!{voPackage}.$!{entity}VO;
|
||||
#set($wrapperPackage=$package.Entity.replace("entity","wrapper"))
|
||||
import $!{wrapperPackage}.$!{entity}Wrapper;
|
||||
import $!{package.Service}.$!{table.serviceName};
|
||||
#if($!{superControllerClassPackage})
|
||||
import $!{superControllerClassPackage};
|
||||
#end
|
||||
#if(!$!{superEntityClass})
|
||||
#end
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* $!{table.comment} 控制器
|
||||
*
|
||||
* @author $!{author}
|
||||
* @since $!{date}
|
||||
*/
|
||||
@RestController
|
||||
@AllArgsConstructor
|
||||
@RequestMapping("#if($!{package.ModuleName})/$!{package.ModuleName}#end/$!{cfg.entityKey}")
|
||||
@Api(value = "$!{table.comment}", tags = "$!{table.comment}接口")
|
||||
#if($!{superControllerClass})
|
||||
public class $!{table.controllerName} extends $!{superControllerClass} {
|
||||
#else
|
||||
public class $!{table.controllerName} {
|
||||
#end
|
||||
|
||||
private $!{table.serviceName} $!{table.entityPath}Service;
|
||||
|
||||
private IDictClient dictClient;
|
||||
|
||||
/**
|
||||
* 详情
|
||||
*/
|
||||
@GetMapping("/detail")
|
||||
@ApiOperation(value = "详情", notes = "传入$!{table.entityPath}", position = 1)
|
||||
public R<$!{entity}VO> detail($!{entity} $!{table.entityPath}) {
|
||||
$!{entity} detail = $!{table.entityPath}Service.getOne(Condition.getQueryWrapper($!{table.entityPath}));
|
||||
$!{entity}Wrapper $!{table.entityPath}Wrapper = new $!{entity}Wrapper(dictClient);
|
||||
return R.data($!{table.entityPath}Wrapper.entityVO(detail));
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页 $!{table.comment}
|
||||
*/
|
||||
@GetMapping("/list")
|
||||
@ApiOperation(value = "分页", notes = "传入$!{table.entityPath}", position = 2)
|
||||
public R<IPage<$!{entity}VO>> list($!{entity} $!{table.entityPath}, Query query) {
|
||||
IPage<$!{entity}> pages = $!{table.entityPath}Service.page(Condition.getPage(query), Condition.getQueryWrapper($!{table.entityPath}));
|
||||
$!{entity}Wrapper $!{table.entityPath}Wrapper = new $!{entity}Wrapper(dictClient);
|
||||
return R.data($!{table.entityPath}Wrapper.pageVO(pages));
|
||||
}
|
||||
|
||||
/**
|
||||
* 自定义分页 $!{table.comment}
|
||||
*/
|
||||
@GetMapping("/page")
|
||||
@ApiOperation(value = "分页", notes = "传入$!{table.entityPath}", position = 3)
|
||||
public R<IPage<$!{entity}VO>> page($!{entity}VO $!{table.entityPath}, Query query) {
|
||||
IPage<$!{entity}VO> pages = $!{table.entityPath}Service.select$!{entity}Page(Condition.getPage(query), $!{table.entityPath});
|
||||
return R.data(pages);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增 $!{table.comment}
|
||||
*/
|
||||
@PostMapping("/save")
|
||||
@ApiOperation(value = "新增", notes = "传入$!{table.entityPath}", position = 4)
|
||||
public R save(@Valid @RequestBody $!{entity} $!{table.entityPath}) {
|
||||
return R.status($!{table.entityPath}Service.save($!{table.entityPath}));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改 $!{table.comment}
|
||||
*/
|
||||
@PostMapping("/update")
|
||||
@ApiOperation(value = "修改", notes = "传入$!{table.entityPath}", position = 5)
|
||||
public R update(@Valid @RequestBody $!{entity} $!{table.entityPath}) {
|
||||
return R.status($!{table.entityPath}Service.updateById($!{table.entityPath}));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增或修改 $!{table.comment}
|
||||
*/
|
||||
@PostMapping("/submit")
|
||||
@ApiOperation(value = "新增或修改", notes = "传入$!{table.entityPath}", position = 6)
|
||||
public R submit(@Valid @RequestBody $!{entity} $!{table.entityPath}) {
|
||||
return R.status($!{table.entityPath}Service.saveOrUpdate($!{table.entityPath}));
|
||||
}
|
||||
|
||||
#if($!{superEntityClass})
|
||||
|
||||
/**
|
||||
* 删除 $!{table.comment}
|
||||
*/
|
||||
@PostMapping("/remove")
|
||||
@ApiOperation(value = "逻辑删除", notes = "传入ids", position = 7)
|
||||
public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
|
||||
return R.status($!{table.entityPath}Service.deleteLogic(Func.toIntList(ids)));
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/**
|
||||
* 删除 $!{table.comment}
|
||||
*/
|
||||
@PostMapping("/remove")
|
||||
@ApiOperation(value = "删除", notes = "传入ids", position = 7)
|
||||
public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
|
||||
return R.status($!{table.entityPath}Service.removeByIds(Func.toIntList(ids)));
|
||||
}
|
||||
|
||||
#end
|
||||
|
||||
}
|
@ -0,0 +1,162 @@
|
||||
/**
|
||||
* Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
|
||||
* <p>
|
||||
* 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
|
||||
* <p>
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* <p>
|
||||
* 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 $!{package.Entity};
|
||||
|
||||
#foreach($pkg in $!{table.importPackages})
|
||||
import $!{pkg};
|
||||
#end
|
||||
#if($!{entityLombokModel})
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
#end
|
||||
#if($!{swagger2})
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
#end
|
||||
|
||||
/**
|
||||
* $!{table.comment}实体类
|
||||
*
|
||||
* @author $!{author}
|
||||
* @since $!{date}
|
||||
*/
|
||||
#if($!{entityLombokModel})
|
||||
@Data
|
||||
#end
|
||||
#if($!{table.convert})
|
||||
@TableName("$!{table.name}")
|
||||
#end
|
||||
#if($!{superEntityClass})
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
#end
|
||||
#if($!{swagger2})
|
||||
@ApiModel(value = "$!{entity}对象", description = #if ("$!{table.comment}"=="")"$!{entity}对象"#else"$!{table.comment}"#end)
|
||||
#end
|
||||
#if($!{superEntityClass})
|
||||
public class $!{entity} extends $!{superEntityClass}#if($!{activeRecord})<$!{entity}>#end {
|
||||
#elseif($!{activeRecord})
|
||||
@Accessors(chain = true)
|
||||
public class $!{entity} extends Model<$!{entity}> {
|
||||
#else
|
||||
public class $!{entity} implements Serializable {
|
||||
#end
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
## ---------- BEGIN 字段循环遍历 ----------
|
||||
#foreach($field in $!{table.fields})
|
||||
#if($!{field.name}!=$!{cfg.tenantColumn})
|
||||
#if($!{field.keyFlag})
|
||||
#set($keyPropertyName=$!{field.propertyName})
|
||||
#end
|
||||
#if("$!field.comment" != "")
|
||||
/**
|
||||
* $!{field.comment}
|
||||
*/
|
||||
#if($!{swagger2})
|
||||
@ApiModelProperty(value = "$!{field.comment}")
|
||||
#end
|
||||
#end
|
||||
#if($!{field.keyFlag})
|
||||
## 主键
|
||||
#if($!{field.keyIdentityFlag})
|
||||
@TableId(value = "$!{field.name}", type = IdType.AUTO)
|
||||
#elseif(!$null.isNull($!{idType}) && "$!idType" != "")
|
||||
@TableId(value = "$!{field.name}", type = IdType.$!{idType})
|
||||
#elseif($!{field.convert})
|
||||
@TableId("$!{field.name}")
|
||||
#end
|
||||
## 普通字段
|
||||
#elseif($!{field.fill})
|
||||
## ----- 存在字段填充设置 -----
|
||||
#if($!{field.convert})
|
||||
@TableField(value = "$!{field.name}", fill = FieldFill.$!{field.fill})
|
||||
#else
|
||||
@TableField(fill = FieldFill.$!{field.fill})
|
||||
#end
|
||||
#elseif($!{field.convert})
|
||||
@TableField("$!{field.name}")
|
||||
#end
|
||||
## 乐观锁注解
|
||||
#if($!{versionFieldName}==$!{field.name})
|
||||
@Version
|
||||
#end
|
||||
## 逻辑删除注解
|
||||
#if($!{logicDeleteFieldName}==$!{field.name})
|
||||
@TableLogic
|
||||
#end
|
||||
private $!{field.propertyType} $!{field.propertyName};
|
||||
#end
|
||||
#end
|
||||
## ---------- END 字段循环遍历 ----------
|
||||
|
||||
#if(!$!{entityLombokModel})
|
||||
#foreach($field in $!{table.fields})
|
||||
#if($!{field.propertyType.equals("boolean")})
|
||||
#set($getprefix="is")
|
||||
#else
|
||||
#set($getprefix="get")
|
||||
#end
|
||||
|
||||
public $!{field.propertyType} $!{getprefix}$!{field.capitalName}() {
|
||||
return $!{field.propertyName};
|
||||
}
|
||||
|
||||
#if($!{entityBuilderModel})
|
||||
public $!{entity} set$!{field.capitalName}($!{field.propertyType} $!{field.propertyName}) {
|
||||
#else
|
||||
public void set$!{field.capitalName}($!{field.propertyType} $!{field.propertyName}) {
|
||||
#end
|
||||
this.$!{field.propertyName} = $!{field.propertyName};
|
||||
#if($!{entityBuilderModel})
|
||||
return this;
|
||||
#end
|
||||
}
|
||||
#end
|
||||
#end
|
||||
|
||||
#if($!{entityColumnConstant})
|
||||
#foreach($field in $!{table.fields})
|
||||
public static final String $!{field.name.toUpperCase()} = "$!{field.name}";
|
||||
|
||||
#end
|
||||
#end
|
||||
#if($!{activeRecord})
|
||||
@Override
|
||||
protected Serializable pkVal() {
|
||||
#if($!{keyPropertyName})
|
||||
return this.$!{keyPropertyName};
|
||||
#else
|
||||
return this.id;
|
||||
#end
|
||||
}
|
||||
|
||||
#end
|
||||
#if(!$!{entityLombokModel})
|
||||
@Override
|
||||
public String toString() {
|
||||
return "$!{entity}{" +
|
||||
#foreach($field in $!{table.fields})
|
||||
#if($!{velocityCount}==1)
|
||||
"$!{field.propertyName}=" + $!{field.propertyName} +
|
||||
#else
|
||||
", $!{field.propertyName}=" + $!{field.propertyName} +
|
||||
#end
|
||||
#end
|
||||
"}";
|
||||
}
|
||||
#end
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
/**
|
||||
* Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
|
||||
* <p>
|
||||
* 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
|
||||
* <p>
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* <p>
|
||||
* 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.
|
||||
*/
|
||||
#set($dtoPackage=$package.Entity.replace("entity","dto"))
|
||||
package $!{dtoPackage};
|
||||
|
||||
import $!{package.Entity}.$!{entity};
|
||||
#if($!{entityLombokModel})
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
#end
|
||||
|
||||
/**
|
||||
* $!{table.comment}数据传输对象实体类
|
||||
*
|
||||
* @author $!{author}
|
||||
* @since $!{date}
|
||||
*/
|
||||
#if($!{entityLombokModel})
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
#end
|
||||
public class $!{entity}DTO extends $!{entity} {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
}
|
@ -0,0 +1,44 @@
|
||||
/**
|
||||
* Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
|
||||
* <p>
|
||||
* 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
|
||||
* <p>
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* <p>
|
||||
* 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.
|
||||
*/
|
||||
#set($voPackage=$package.Entity.replace("entity","vo"))
|
||||
package $!{voPackage};
|
||||
|
||||
import $!{package.Entity}.$!{entity};
|
||||
#if($!{entityLombokModel})
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
#end
|
||||
#if($!{swagger2})
|
||||
import io.swagger.annotations.ApiModel;
|
||||
#end
|
||||
|
||||
/**
|
||||
* $!{table.comment}视图实体类
|
||||
*
|
||||
* @author $!{author}
|
||||
* @since $!{date}
|
||||
*/
|
||||
#if($!{entityLombokModel})
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
#end
|
||||
#if($!{swagger2})
|
||||
@ApiModel(value = "$!{entity}VO对象", description = #if ("$!{table.comment}"=="")"$!{entity}VO对象"#else"$!{table.comment}"#end)
|
||||
#end
|
||||
public class $!{entity}VO extends $!{entity} {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
}
|
@ -0,0 +1,46 @@
|
||||
/**
|
||||
* Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
|
||||
* <p>
|
||||
* 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
|
||||
* <p>
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* <p>
|
||||
* 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 $!{package.Mapper};
|
||||
|
||||
import $!{package.Entity}.$!{entity};
|
||||
#set($voPackage=$package.Entity.replace("entity","vo"))
|
||||
import $!{voPackage}.$!{entity}VO;
|
||||
import $!{superMapperClassPackage};
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* $!{table.comment} Mapper 接口
|
||||
*
|
||||
* @author $!{author}
|
||||
* @since $!{date}
|
||||
*/
|
||||
#if($!{kotlin})
|
||||
interface $!{table.mapperName} : $!{superMapperClass}<$!{entity}>
|
||||
#else
|
||||
public interface $!{table.mapperName} extends $!{superMapperClass}<$!{entity}> {
|
||||
|
||||
/**
|
||||
* 自定义分页
|
||||
*
|
||||
* @param page
|
||||
* @param $!{table.entityPath}
|
||||
* @return
|
||||
*/
|
||||
List<$!{entity}VO> select$!{entity}Page(IPage page, $!{entity}VO $!{table.entityPath});
|
||||
|
||||
}
|
||||
#end
|
@ -0,0 +1,34 @@
|
||||
<?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="$!{package.Mapper}.$!{table.mapperName}">
|
||||
|
||||
#if($!{enableCache})
|
||||
<!-- 开启二级缓存 -->
|
||||
<cache type="org.mybatis.caches.ehcache.LoggingEhcache"/>
|
||||
|
||||
#end
|
||||
#if($!{baseResultMap})
|
||||
<!-- 通用查询映射结果 -->
|
||||
<resultMap id="$!{table.entityPath}ResultMap" type="$!{package.Entity}.$!{entity}">
|
||||
#foreach($field in $!{table.fields})
|
||||
#if($!{field.keyFlag})##生成主键排在第一位
|
||||
<id column="$!{field.name}" property="$!{field.propertyName}"/>
|
||||
#end
|
||||
#end
|
||||
#foreach($field in $!{table.commonFields})##生成公共字段
|
||||
<result column="$!{field.name}" property="$!{field.propertyName}"/>
|
||||
#end
|
||||
#foreach($field in $!{table.fields})
|
||||
#if(!$!{field.keyFlag} && $!{field.name} != $!{cfg.tenantColumn})##生成普通字段
|
||||
<result column="$!{field.name}" property="$!{field.propertyName}"/>
|
||||
#end
|
||||
#end
|
||||
</resultMap>
|
||||
|
||||
#end
|
||||
|
||||
<select id="select$!{entity}Page" resultMap="$!{table.entityPath}ResultMap">
|
||||
select * from $!{table.name} where is_deleted = 0
|
||||
</select>
|
||||
|
||||
</mapper>
|
@ -0,0 +1,5 @@
|
||||
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
|
||||
spring.datasource.url=jdbc:mysql://localhost:3306/blade?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&serverTimezone=GMT%2B8
|
||||
spring.datasource.username=root
|
||||
spring.datasource.password=root
|
||||
author=Blade
|
@ -0,0 +1,50 @@
|
||||
import request from '@/router/axios';
|
||||
|
||||
export const getList = (current, size, params) => {
|
||||
return request({
|
||||
url: '/api/$!{cfg.serviceName}/$!{cfg.entityKey}/list',
|
||||
method: 'get',
|
||||
params: {
|
||||
...params,
|
||||
current,
|
||||
size,
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export const getDetail = (id) => {
|
||||
return request({
|
||||
url: '/api/$!{cfg.serviceName}/$!{cfg.entityKey}/detail',
|
||||
method: 'get',
|
||||
params: {
|
||||
id
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export const remove = (ids) => {
|
||||
return request({
|
||||
url: '/api/$!{cfg.serviceName}/$!{cfg.entityKey}/remove',
|
||||
method: 'post',
|
||||
params: {
|
||||
ids,
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export const add = (row) => {
|
||||
return request({
|
||||
url: '/api/$!{cfg.serviceName}/$!{cfg.entityKey}/submit',
|
||||
method: 'post',
|
||||
data: row
|
||||
})
|
||||
}
|
||||
|
||||
export const update = (row) => {
|
||||
return request({
|
||||
url: '/api/$!{cfg.serviceName}/$!{cfg.entityKey}/submit',
|
||||
method: 'post',
|
||||
data: row
|
||||
})
|
||||
}
|
||||
|
@ -0,0 +1,176 @@
|
||||
<template>
|
||||
<basic-container>
|
||||
<avue-crud :option="option"
|
||||
:data="data"
|
||||
:page="page"
|
||||
@row-del="rowDel"
|
||||
v-model="form"
|
||||
:permission="permissionList"
|
||||
@row-update="rowUpdate"
|
||||
@row-save="rowSave"
|
||||
:before-open="beforeOpen"
|
||||
@search-change="searchChange"
|
||||
@search-reset="searchReset"
|
||||
@selection-change="selectionChange"
|
||||
@on-load="onLoad">
|
||||
<template slot="menuLeft">
|
||||
<el-button type="danger"
|
||||
size="small"
|
||||
icon="el-icon-delete"
|
||||
plain
|
||||
v-if="permission.$!{table.entityPath}_delete"
|
||||
@click="handleDelete">删 除
|
||||
</el-button>
|
||||
</template>
|
||||
</avue-crud>
|
||||
</basic-container>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {getList, getDetail, add, update, remove} from "@/api/$!{cfg.servicePackage}/$!{cfg.entityKey}";
|
||||
import {mapGetters} from "vuex";
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
form: {},
|
||||
page: {
|
||||
pageSize: 10,
|
||||
currentPage: 1,
|
||||
total: 0
|
||||
},
|
||||
selectionList: [],
|
||||
option: {
|
||||
tip: false,
|
||||
border: true,
|
||||
index: true,
|
||||
viewBtn: true,
|
||||
selection: true,
|
||||
column: [
|
||||
#foreach($field in $!{table.fields})
|
||||
#if($!{field.name}!=$!{cfg.tenantColumn})
|
||||
{
|
||||
label: "$!{field.comment}",
|
||||
prop: "$!{field.propertyName}",
|
||||
rules: [{
|
||||
required: true,
|
||||
message: "请输入$!{field.comment}",
|
||||
trigger: "blur"
|
||||
}]
|
||||
},
|
||||
#end
|
||||
#end
|
||||
]
|
||||
},
|
||||
data: []
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapGetters(["permission"]),
|
||||
permissionList() {
|
||||
return {
|
||||
addBtn: this.permission.$!{table.entityPath}_add,
|
||||
viewBtn: this.permission.$!{table.entityPath}_view,
|
||||
delBtn: this.permission.$!{table.entityPath}_delete,
|
||||
editBtn: this.permission.$!{table.entityPath}_edit
|
||||
};
|
||||
},
|
||||
ids() {
|
||||
let ids = [];
|
||||
this.selectionList.forEach(ele => {
|
||||
ids.push(ele.id);
|
||||
});
|
||||
return ids.join(",");
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
rowSave(row, loading) {
|
||||
add(row).then(() => {
|
||||
loading();
|
||||
this.onLoad(this.page);
|
||||
this.$message({
|
||||
type: "success",
|
||||
message: "操作成功!"
|
||||
});
|
||||
});
|
||||
},
|
||||
rowUpdate(row, index, loading) {
|
||||
update(row).then(() => {
|
||||
loading();
|
||||
this.onLoad(this.page);
|
||||
this.$message({
|
||||
type: "success",
|
||||
message: "操作成功!"
|
||||
});
|
||||
});
|
||||
},
|
||||
rowDel(row) {
|
||||
this.$confirm("确定将选择数据删除?", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
})
|
||||
.then(() => {
|
||||
return remove(row.id);
|
||||
})
|
||||
.then(() => {
|
||||
this.onLoad(this.page);
|
||||
this.$message({
|
||||
type: "success",
|
||||
message: "操作成功!"
|
||||
});
|
||||
});
|
||||
},
|
||||
searchReset() {
|
||||
this.onLoad(this.page);
|
||||
},
|
||||
searchChange(params) {
|
||||
this.onLoad(this.page, params);
|
||||
},
|
||||
selectionChange(list) {
|
||||
this.selectionList = list;
|
||||
},
|
||||
handleDelete() {
|
||||
if (this.selectionList.length === 0) {
|
||||
this.$message.warning("请选择至少一条数据");
|
||||
return;
|
||||
}
|
||||
this.$confirm("确定将选择数据删除?", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
})
|
||||
.then(() => {
|
||||
return remove(this.ids);
|
||||
})
|
||||
.then(() => {
|
||||
this.onLoad(this.page);
|
||||
this.$message({
|
||||
type: "success",
|
||||
message: "操作成功!"
|
||||
});
|
||||
this.$refs.crud.toggleSelection();
|
||||
});
|
||||
},
|
||||
|
||||
beforeOpen(done, type) {
|
||||
if (["edit", "view"].includes(type)) {
|
||||
getDetail(this.form.id).then(res => {
|
||||
this.form = res.data.data;
|
||||
});
|
||||
}
|
||||
done();
|
||||
},
|
||||
onLoad(page, params = {}) {
|
||||
getList(page.currentPage, page.pageSize, params).then(res => {
|
||||
const data = res.data.data;
|
||||
this.page.total = data.total;
|
||||
this.data = data.records;
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
@ -0,0 +1,45 @@
|
||||
/**
|
||||
* Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
|
||||
* <p>
|
||||
* 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
|
||||
* <p>
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* <p>
|
||||
* 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 $!{package.Service};
|
||||
|
||||
import $!{package.Entity}.$!{entity};
|
||||
#set($voPackage=$package.Entity.replace("entity","vo"))
|
||||
import $!{voPackage}.$!{entity}VO;
|
||||
import $!{superServiceClassPackage};
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
|
||||
/**
|
||||
* $!{table.comment} 服务类
|
||||
*
|
||||
* @author $!{author}
|
||||
* @since $!{date}
|
||||
*/
|
||||
#if($!{kotlin})
|
||||
interface $!{table.serviceName} : $!{superServiceClass}<$!{entity}>
|
||||
#else
|
||||
public interface $!{table.serviceName} extends $!{superServiceClass}<$!{entity}> {
|
||||
|
||||
/**
|
||||
* 自定义分页
|
||||
*
|
||||
* @param page
|
||||
* @param $!{table.entityPath}
|
||||
* @return
|
||||
*/
|
||||
IPage<$!{entity}VO> select$!{entity}Page(IPage<$!{entity}VO> page, $!{entity}VO $!{table.entityPath});
|
||||
|
||||
}
|
||||
#end
|
@ -0,0 +1,47 @@
|
||||
/**
|
||||
* Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
|
||||
* <p>
|
||||
* 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
|
||||
* <p>
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* <p>
|
||||
* 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 $!{package.ServiceImpl};
|
||||
|
||||
import $!{package.Entity}.$!{entity};
|
||||
#set($voPackage=$package.Entity.replace("entity","vo"))
|
||||
import $!{voPackage}.$!{entity}VO;
|
||||
import $!{package.Mapper}.$!{table.mapperName};
|
||||
import $!{package.Service}.$!{table.serviceName};
|
||||
import $!{superServiceImplClassPackage};
|
||||
import org.springframework.stereotype.Service;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
|
||||
/**
|
||||
* $!{table.comment} 服务实现类
|
||||
*
|
||||
* @author $!{author}
|
||||
* @since $!{date}
|
||||
*/
|
||||
@Service
|
||||
#if($!{kotlin})
|
||||
open class $!{table.serviceImplName} : $!{superServiceImplClass}<$!{table.mapperName}, $!{entity}>(), $!{table.serviceName} {
|
||||
|
||||
}
|
||||
#else
|
||||
public class $!{table.serviceImplName} extends $!{superServiceImplClass}<$!{table.mapperName}, $!{entity}> implements $!{table.serviceName} {
|
||||
|
||||
@Override
|
||||
public IPage<$!{entity}VO> select$!{entity}Page(IPage<$!{entity}VO> page, $!{entity}VO $!{table.entityPath}) {
|
||||
return page.setRecords(baseMapper.select$!{entity}Page(page, $!{table.entityPath}));
|
||||
}
|
||||
|
||||
}
|
||||
#end
|
@ -0,0 +1,11 @@
|
||||
INSERT INTO `blade_menu`(`tenant_code`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
|
||||
VALUES ('000000', 0, '$!{cfg.entityKey}', '$!{cfg.codeName}', 'menu', '/$!{cfg.servicePackage}/$!{cfg.entityKey}', NULL, 1, 1, 0, 1, NULL, 0);
|
||||
set @parentid = (SELECT LAST_INSERT_ID());
|
||||
INSERT INTO `blade_menu`(`tenant_code`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
|
||||
VALUES ('000000', @parentid, '$!{cfg.entityKey}_add', '新增', 'add', '/$!{cfg.servicePackage}/$!{cfg.entityKey}/add', 'plus', 1, 2, 1, 1, NULL, 0);
|
||||
INSERT INTO `blade_menu`(`tenant_code`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
|
||||
VALUES ('000000', @parentid, '$!{cfg.entityKey}_edit', '修改', 'edit', '/$!{cfg.servicePackage}/$!{cfg.entityKey}/edit', 'form', 2, 2, 1, 2, NULL, 0);
|
||||
INSERT INTO `blade_menu`(`tenant_code`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
|
||||
VALUES ('000000', @parentid, '$!{cfg.entityKey}_delete', '删除', 'delete', '/api/$!{cfg.serviceName}/$!{cfg.entityKey}/remove', 'delete', 3, 2, 1, 3, NULL, 0);
|
||||
INSERT INTO `blade_menu`(`tenant_code`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
|
||||
VALUES ('000000', @parentid, '$!{cfg.entityKey}_view', '查看', 'view', '/$!{cfg.servicePackage}/$!{cfg.entityKey}/view', 'file-text', 4, 2, 1, 2, NULL, 0);
|
@ -0,0 +1,37 @@
|
||||
#set($upperEntityPath=$table.entityPath.toUpperCase())
|
||||
export const $!{upperEntityPath}_NAMESPACE = '$!{table.entityPath}';
|
||||
|
||||
export function $!{upperEntityPath}_LIST(payload) {
|
||||
return {
|
||||
type: `${$!{upperEntityPath}_NAMESPACE}/fetchList`,
|
||||
payload,
|
||||
};
|
||||
}
|
||||
|
||||
export function $!{upperEntityPath}_DETAIL(id) {
|
||||
return {
|
||||
type: `${$!{upperEntityPath}_NAMESPACE}/fetchDetail`,
|
||||
payload: { id },
|
||||
};
|
||||
}
|
||||
|
||||
export function $!{upperEntityPath}_CLEAR_DETAIL() {
|
||||
return {
|
||||
type: `${$!{upperEntityPath}_NAMESPACE}/clearDetail`,
|
||||
payload: {},
|
||||
};
|
||||
}
|
||||
|
||||
export function $!{upperEntityPath}_SUBMIT(payload) {
|
||||
return {
|
||||
type: `${$!{upperEntityPath}_NAMESPACE}/submit`,
|
||||
payload,
|
||||
};
|
||||
}
|
||||
|
||||
export function $!{upperEntityPath}_REMOVE(payload) {
|
||||
return {
|
||||
type: `${$!{upperEntityPath}_NAMESPACE}/remove`,
|
||||
payload,
|
||||
};
|
||||
}
|
@ -0,0 +1,75 @@
|
||||
#set($upperEntityPath=$table.entityPath.toUpperCase())
|
||||
import React, { PureComponent } from 'react';
|
||||
import { Form, Input, Card, Button } from 'antd';
|
||||
import { connect } from 'dva';
|
||||
import Panel from '../../../components/Panel';
|
||||
import styles from '../../../layouts/Sword.less';
|
||||
import { $!{upperEntityPath}_SUBMIT } from '../../../actions/$!{table.entityPath}';
|
||||
|
||||
const FormItem = Form.Item;
|
||||
|
||||
@connect(({ loading }) => ({
|
||||
submitting: loading.effects['$!{table.entityPath}/submit'],
|
||||
}))
|
||||
@Form.create()
|
||||
class $!{entity}Add extends PureComponent {
|
||||
handleSubmit = e => {
|
||||
e.preventDefault();
|
||||
const { dispatch, form } = this.props;
|
||||
form.validateFieldsAndScroll((err, values) => {
|
||||
if (!err) {
|
||||
dispatch($!{upperEntityPath}_SUBMIT(values));
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
render() {
|
||||
const {
|
||||
form: { getFieldDecorator },
|
||||
submitting,
|
||||
} = this.props;
|
||||
|
||||
const formItemLayout = {
|
||||
labelCol: {
|
||||
xs: { span: 24 },
|
||||
sm: { span: 7 },
|
||||
},
|
||||
wrapperCol: {
|
||||
xs: { span: 24 },
|
||||
sm: { span: 12 },
|
||||
md: { span: 10 },
|
||||
},
|
||||
};
|
||||
|
||||
const action = (
|
||||
<Button type="primary" onClick={this.handleSubmit} loading={submitting}>
|
||||
提交
|
||||
</Button>
|
||||
);
|
||||
|
||||
return (
|
||||
<Panel title="新增" back="/$!{cfg.servicePackage}/$!{table.entityPath}" action={action}>
|
||||
<Form hideRequiredMark style={{ marginTop: 8 }}>
|
||||
<Card className={styles.card} bordered={false}>
|
||||
#foreach($field in $!{table.fields})
|
||||
#if($!{field.name}!=$!{cfg.tenantColumn})
|
||||
<FormItem {...formItemLayout} label="$!{field.comment}">
|
||||
{getFieldDecorator('$!{field.propertyName}', {
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入$!{field.comment}',
|
||||
},
|
||||
],
|
||||
})(<Input placeholder="请输入$!{field.comment}" />)}
|
||||
</FormItem>
|
||||
#end
|
||||
#end
|
||||
</Card>
|
||||
</Form>
|
||||
</Panel>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export default $!{entity}Add;
|
@ -0,0 +1,99 @@
|
||||
#set($upperEntityPath=$table.entityPath.toUpperCase())
|
||||
import React, { PureComponent } from 'react';
|
||||
import { Form, Input, Card, Button } from 'antd';
|
||||
import { connect } from 'dva';
|
||||
import Panel from '../../../components/Panel';
|
||||
import styles from '../../../layouts/Sword.less';
|
||||
import { $!{upperEntityPath}_DETAIL, $!{upperEntityPath}_SUBMIT } from '../../../actions/$!{table.entityPath}';
|
||||
|
||||
const FormItem = Form.Item;
|
||||
|
||||
@connect(({ $!{table.entityPath}, loading }) => ({
|
||||
$!{table.entityPath},
|
||||
submitting: loading.effects['$!{table.entityPath}/submit'],
|
||||
}))
|
||||
@Form.create()
|
||||
class $!{entity}Edit extends PureComponent {
|
||||
componentWillMount() {
|
||||
const {
|
||||
dispatch,
|
||||
match: {
|
||||
params: { id },
|
||||
},
|
||||
} = this.props;
|
||||
dispatch($!{upperEntityPath}_DETAIL(id));
|
||||
}
|
||||
|
||||
handleSubmit = e => {
|
||||
e.preventDefault();
|
||||
const {
|
||||
dispatch,
|
||||
match: {
|
||||
params: { id },
|
||||
},
|
||||
form,
|
||||
} = this.props;
|
||||
form.validateFieldsAndScroll((err, values) => {
|
||||
if (!err) {
|
||||
const params = {
|
||||
id,
|
||||
...values,
|
||||
};
|
||||
console.log(params);
|
||||
dispatch($!{upperEntityPath}_SUBMIT(params));
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
render() {
|
||||
const {
|
||||
form: { getFieldDecorator },
|
||||
$!{table.entityPath}: { detail },
|
||||
submitting,
|
||||
} = this.props;
|
||||
|
||||
const formItemLayout = {
|
||||
labelCol: {
|
||||
xs: { span: 24 },
|
||||
sm: { span: 7 },
|
||||
},
|
||||
wrapperCol: {
|
||||
xs: { span: 24 },
|
||||
sm: { span: 12 },
|
||||
md: { span: 10 },
|
||||
},
|
||||
};
|
||||
|
||||
const action = (
|
||||
<Button type="primary" onClick={this.handleSubmit} loading={submitting}>
|
||||
提交
|
||||
</Button>
|
||||
);
|
||||
|
||||
return (
|
||||
<Panel title="修改" back="/$!{cfg.servicePackage}/$!{table.entityPath}" action={action}>
|
||||
<Form hideRequiredMark style={{ marginTop: 8 }}>
|
||||
<Card className={styles.card} bordered={false}>
|
||||
#foreach($field in $!{table.fields})
|
||||
#if($!{field.name}!=$!{cfg.tenantColumn})
|
||||
<FormItem {...formItemLayout} label="$!{field.comment}">
|
||||
{getFieldDecorator('$!{field.propertyName}', {
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入$!{field.comment}',
|
||||
},
|
||||
],
|
||||
initialValue: detail.$!{field.propertyName},
|
||||
})(<Input placeholder="请输入$!{field.comment}" />)}
|
||||
</FormItem>
|
||||
#end
|
||||
#end
|
||||
</Card>
|
||||
</Form>
|
||||
</Panel>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export default $!{entity}Edit;
|
@ -0,0 +1,84 @@
|
||||
#set($upperEntityPath=$table.entityPath.toUpperCase())
|
||||
import React, { PureComponent } from 'react';
|
||||
import { connect } from 'dva';
|
||||
import { Button, Col, Form, Input, Row } from 'antd';
|
||||
import Panel from '../../../components/Panel';
|
||||
import { $!{upperEntityPath}_LIST } from '../../../actions/$!{table.entityPath}';
|
||||
import Grid from '../../../components/Sword/Grid';
|
||||
|
||||
const FormItem = Form.Item;
|
||||
|
||||
@connect(({ $!{table.entityPath}, loading }) => ({
|
||||
$!{table.entityPath},
|
||||
loading: loading.models.$!{table.entityPath},
|
||||
}))
|
||||
@Form.create()
|
||||
class $!{entity} extends PureComponent {
|
||||
// ============ 查询 ===============
|
||||
handleSearch = params => {
|
||||
const { dispatch } = this.props;
|
||||
dispatch($!{upperEntityPath}_LIST(params));
|
||||
};
|
||||
|
||||
// ============ 查询表单 ===============
|
||||
renderSearchForm = onReset => {
|
||||
const { form } = this.props;
|
||||
const { getFieldDecorator } = form;
|
||||
|
||||
return (
|
||||
<Row gutter={{ md: 8, lg: 24, xl: 48 }}>
|
||||
<Col md={6} sm={24}>
|
||||
<FormItem label="查询名称">
|
||||
{getFieldDecorator('name')(<Input placeholder="查询名称" />)}
|
||||
</FormItem>
|
||||
</Col>
|
||||
<Col>
|
||||
<div style={{ float: 'right' }}>
|
||||
<Button type="primary" htmlType="submit">
|
||||
查询
|
||||
</Button>
|
||||
<Button style={{ marginLeft: 8 }} onClick={onReset}>
|
||||
重置
|
||||
</Button>
|
||||
</div>
|
||||
</Col>
|
||||
</Row>
|
||||
);
|
||||
};
|
||||
|
||||
render() {
|
||||
const code = '$!{table.entityPath}';
|
||||
|
||||
const {
|
||||
form,
|
||||
loading,
|
||||
$!{table.entityPath}: { data },
|
||||
} = this.props;
|
||||
|
||||
const columns = [
|
||||
#foreach($field in $!{table.fields})
|
||||
#if($!{field.name}!=$!{cfg.tenantColumn})
|
||||
{
|
||||
title: '$!{field.comment}',
|
||||
dataIndex: '$!{field.propertyName}',
|
||||
},
|
||||
#end
|
||||
#end
|
||||
];
|
||||
|
||||
return (
|
||||
<Panel>
|
||||
<Grid
|
||||
code={code}
|
||||
form={form}
|
||||
onSearch={this.handleSearch}
|
||||
renderSearchForm={this.renderSearchForm}
|
||||
loading={loading}
|
||||
data={data}
|
||||
columns={columns}
|
||||
/>
|
||||
</Panel>
|
||||
);
|
||||
}
|
||||
}
|
||||
export default $!{entity};
|
@ -0,0 +1,88 @@
|
||||
#set($upperEntityPath=$table.entityPath.toUpperCase())
|
||||
import { message } from 'antd';
|
||||
import router from 'umi/router';
|
||||
import { $!{upperEntityPath}_NAMESPACE } from '../actions/$!{table.entityPath}';
|
||||
import { list, submit, detail, remove } from '../services/$!{table.entityPath}';
|
||||
|
||||
export default {
|
||||
namespace: $!{upperEntityPath}_NAMESPACE,
|
||||
state: {
|
||||
data: {
|
||||
list: [],
|
||||
pagination: false,
|
||||
},
|
||||
detail: {},
|
||||
},
|
||||
effects: {
|
||||
*fetchList({ payload }, { call, put }) {
|
||||
const response = yield call(list, payload);
|
||||
if (response.success) {
|
||||
yield put({
|
||||
type: 'saveList',
|
||||
payload: {
|
||||
list: response.data.records,
|
||||
pagination: {
|
||||
total: response.data.total,
|
||||
current: response.data.current,
|
||||
pageSize: response.data.size,
|
||||
},
|
||||
},
|
||||
});
|
||||
}
|
||||
},
|
||||
*fetchDetail({ payload }, { call, put }) {
|
||||
const response = yield call(detail, payload);
|
||||
if (response.success) {
|
||||
yield put({
|
||||
type: 'saveDetail',
|
||||
payload: {
|
||||
detail: response.data,
|
||||
},
|
||||
});
|
||||
}
|
||||
},
|
||||
*clearDetail({ payload }, { put }) {
|
||||
yield put({
|
||||
type: 'removeDetail',
|
||||
payload: { payload },
|
||||
});
|
||||
},
|
||||
*submit({ payload }, { call }) {
|
||||
const response = yield call(submit, payload);
|
||||
if (response.success) {
|
||||
message.success('提交成功');
|
||||
router.push('/$!{cfg.servicePackage}/$!{table.entityPath}');
|
||||
}
|
||||
},
|
||||
*remove({ payload }, { call }) {
|
||||
const {
|
||||
data: { keys },
|
||||
success,
|
||||
} = payload;
|
||||
const response = yield call(remove, { ids: keys });
|
||||
if (response.success) {
|
||||
success();
|
||||
}
|
||||
},
|
||||
},
|
||||
reducers: {
|
||||
saveList(state, action) {
|
||||
return {
|
||||
...state,
|
||||
data: action.payload,
|
||||
};
|
||||
},
|
||||
saveDetail(state, action) {
|
||||
return {
|
||||
...state,
|
||||
detail: action.payload.detail,
|
||||
};
|
||||
},
|
||||
removeDetail(state) {
|
||||
return {
|
||||
...state,
|
||||
detail: {},
|
||||
};
|
||||
},
|
||||
},
|
||||
};
|
@ -0,0 +1,26 @@
|
||||
#set($params="$" + "{stringify" + "(params)" + "}")
|
||||
import { stringify } from 'qs';
|
||||
import func from '../utils/Func';
|
||||
import request from '../utils/request';
|
||||
|
||||
export async function list(params) {
|
||||
return request(`/api/$!{cfg.serviceName}/$!{cfg.entityKey}/list?$!{params}`);
|
||||
}
|
||||
|
||||
export async function submit(params) {
|
||||
return request('/api/$!{cfg.serviceName}/$!{cfg.entityKey}/submit', {
|
||||
method: 'POST',
|
||||
body: params,
|
||||
});
|
||||
}
|
||||
|
||||
export async function detail(params) {
|
||||
return request(`/api/$!{cfg.serviceName}/$!{cfg.entityKey}/detail?$!{params}`);
|
||||
}
|
||||
|
||||
export async function remove(params) {
|
||||
return request('/api/$!{cfg.serviceName}/$!{cfg.entityKey}/remove', {
|
||||
method: 'POST',
|
||||
body: func.toFormData(params),
|
||||
});
|
||||
}
|
@ -0,0 +1,76 @@
|
||||
#set($upperEntityPath=$table.entityPath.toUpperCase())
|
||||
import React, { PureComponent } from 'react';
|
||||
import router from 'umi/router';
|
||||
import { Form, Card, Button } from 'antd';
|
||||
import { connect } from 'dva';
|
||||
import Panel from '../../../components/Panel';
|
||||
import styles from '../../../layouts/Sword.less';
|
||||
import { $!{upperEntityPath}_DETAIL } from '../../../actions/$!{table.entityPath}';
|
||||
|
||||
const FormItem = Form.Item;
|
||||
|
||||
@connect(({ $!{table.entityPath} }) => ({
|
||||
$!{table.entityPath},
|
||||
}))
|
||||
@Form.create()
|
||||
class $!{entity}View extends PureComponent {
|
||||
componentWillMount() {
|
||||
const {
|
||||
dispatch,
|
||||
match: {
|
||||
params: { id },
|
||||
},
|
||||
} = this.props;
|
||||
dispatch($!{upperEntityPath}_DETAIL(id));
|
||||
}
|
||||
|
||||
handleEdit = () => {
|
||||
const {
|
||||
match: {
|
||||
params: { id },
|
||||
},
|
||||
} = this.props;
|
||||
router.push(`/$!{cfg.servicePackage}/$!{table.entityPath}/edit/$!{id}`);
|
||||
};
|
||||
|
||||
render() {
|
||||
const {
|
||||
$!{table.entityPath}: { detail },
|
||||
} = this.props;
|
||||
|
||||
const formItemLayout = {
|
||||
labelCol: {
|
||||
xs: { span: 24 },
|
||||
sm: { span: 7 },
|
||||
},
|
||||
wrapperCol: {
|
||||
xs: { span: 24 },
|
||||
sm: { span: 12 },
|
||||
md: { span: 10 },
|
||||
},
|
||||
};
|
||||
|
||||
const action = (
|
||||
<Button type="primary" onClick={this.handleEdit}>
|
||||
修改
|
||||
</Button>
|
||||
);
|
||||
|
||||
return (
|
||||
<Panel title="查看" back="/$!{cfg.servicePackage}/$!{table.entityPath}" action={action}>
|
||||
<Form hideRequiredMark style={{ marginTop: 8 }}>
|
||||
<Card className={styles.card} bordered={false}>
|
||||
#foreach($field in $!{table.fields})
|
||||
#if($!{field.name}!=$!{cfg.tenantColumn})
|
||||
<FormItem {...formItemLayout} label="$!{field.comment}">
|
||||
<span>{detail.$!{field.propertyName}}</span>
|
||||
</FormItem>
|
||||
#end
|
||||
#end
|
||||
</Card>
|
||||
</Form>
|
||||
</Panel>
|
||||
);
|
||||
}
|
||||
}
|
||||
export default $!{entity}View;
|
@ -0,0 +1,51 @@
|
||||
/**
|
||||
* Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
|
||||
* <p>
|
||||
* 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
|
||||
* <p>
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* <p>
|
||||
* 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.
|
||||
*/
|
||||
#set($wrapperPackage=$package.Entity.replace("entity","wrapper"))
|
||||
package $!{wrapperPackage};
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.springblade.core.mp.support.BaseEntityWrapper;
|
||||
import org.springblade.core.tool.utils.BeanUtil;
|
||||
import org.springblade.system.feign.IDictClient;
|
||||
import $!{package.Entity}.$!{entity};
|
||||
#set($voPackage=$package.Entity.replace("entity","vo"))
|
||||
import $!{voPackage}.$!{entity}VO;
|
||||
|
||||
/**
|
||||
* $!{table.comment}包装类,返回视图层所需的字段
|
||||
*
|
||||
* @author $!{author}
|
||||
* @since $!{date}
|
||||
*/
|
||||
@AllArgsConstructor
|
||||
public class $!{entity}Wrapper extends BaseEntityWrapper<$!{entity}, $!{entity}VO> {
|
||||
|
||||
private IDictClient dictClient;
|
||||
|
||||
@Override
|
||||
public $!{entity}VO entityVO($!{entity} $!{table.entityPath}) {
|
||||
$!{entity}VO $!{table.entityPath}VO = BeanUtil.copy($!{table.entityPath}, $!{entity}VO.class);
|
||||
|
||||
/*R<String> dict = dictClient.getValue("$!{table.entityPath}" , $!{table.entityPath}VO.getCategory());
|
||||
if (dict.isSuccess()) {
|
||||
String categoryName = dict.getData();
|
||||
$!{table.entityPath}VO.setCategoryName(categoryName);
|
||||
}*/
|
||||
|
||||
return $!{table.entityPath}VO;
|
||||
}
|
||||
|
||||
}
|
@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>SpringBlade</artifactId>
|
||||
<groupId>org.springblade</groupId>
|
||||
<version>2.0.0</version>
|
||||
<version>2.1.0</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>blade-service-api</artifactId>
|
||||
<groupId>org.springblade</groupId>
|
||||
<version>2.0.0</version>
|
||||
<version>2.1.0</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
@ -51,7 +51,7 @@ public class Notice extends BaseEntity {
|
||||
* 发布日期
|
||||
*/
|
||||
@ApiModelProperty(value = "发布日期")
|
||||
private Date date;
|
||||
private Date releaseTime;
|
||||
|
||||
/**
|
||||
* 内容
|
||||
|
@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>blade-service-api</artifactId>
|
||||
<groupId>org.springblade</groupId>
|
||||
<version>2.0.0</version>
|
||||
<version>2.1.0</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
@ -17,6 +17,7 @@ package org.springblade.system.feign;
|
||||
|
||||
import org.springblade.core.tool.api.R;
|
||||
import org.springblade.system.entity.Dict;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@ -25,6 +26,7 @@ import java.util.List;
|
||||
*
|
||||
* @author Chill
|
||||
*/
|
||||
@Component
|
||||
public class IDictClientFallback implements IDictClient {
|
||||
@Override
|
||||
public R<String> getValue(String code, Integer dictKey) {
|
||||
|
@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>blade-service-api</artifactId>
|
||||
<groupId>org.springblade</groupId>
|
||||
<version>2.0.0</version>
|
||||
<version>2.1.0</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
@ -23,7 +23,6 @@ import org.springblade.system.entity.Dept;
|
||||
* 数据传输对象实体类
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-24
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
|
@ -23,7 +23,6 @@ import java.io.Serializable;
|
||||
* 数据传输对象实体类
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-24
|
||||
*/
|
||||
@Data
|
||||
public class MenuDTO implements Serializable {
|
||||
|
@ -23,7 +23,6 @@ import org.springblade.system.entity.Param;
|
||||
* 数据传输对象实体类
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-28
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
|
@ -23,7 +23,6 @@ import org.springblade.system.entity.Role;
|
||||
* 数据传输对象实体类
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-24
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
|
@ -23,7 +23,6 @@ import org.springblade.system.entity.RoleMenu;
|
||||
* 数据传输对象实体类
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-24
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
|
@ -29,7 +29,6 @@ import java.io.Serializable;
|
||||
* 实体类
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-24
|
||||
*/
|
||||
@Data
|
||||
@TableName("blade_dept")
|
||||
@ -45,6 +44,12 @@ public class Dept implements Serializable {
|
||||
@TableId(value = "id", type = IdType.AUTO)
|
||||
private Integer id;
|
||||
|
||||
/**
|
||||
* 租户编号
|
||||
*/
|
||||
@ApiModelProperty(value = "租户编号")
|
||||
private String tenantCode;
|
||||
|
||||
/**
|
||||
* 父主键
|
||||
*/
|
||||
@ -58,9 +63,9 @@ public class Dept implements Serializable {
|
||||
private String deptName;
|
||||
|
||||
/**
|
||||
* 部门全程
|
||||
* 部门全称
|
||||
*/
|
||||
@ApiModelProperty(value = "部门全程")
|
||||
@ApiModelProperty(value = "部门全称")
|
||||
private String fullName;
|
||||
|
||||
/**
|
||||
|
@ -30,7 +30,6 @@ import java.io.Serializable;
|
||||
* 实体类
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-24
|
||||
*/
|
||||
@Data
|
||||
@TableName("blade_menu")
|
||||
|
@ -26,7 +26,6 @@ import org.springblade.core.mp.base.BaseEntity;
|
||||
* 实体类
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-28
|
||||
*/
|
||||
@Data
|
||||
@TableName("blade_param")
|
||||
|
@ -29,7 +29,6 @@ import java.io.Serializable;
|
||||
* 实体类
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-24
|
||||
*/
|
||||
@Data
|
||||
@TableName("blade_role")
|
||||
@ -45,6 +44,12 @@ public class Role implements Serializable {
|
||||
@TableId(value = "id", type = IdType.AUTO)
|
||||
private Integer id;
|
||||
|
||||
/**
|
||||
* 租户编号
|
||||
*/
|
||||
@ApiModelProperty(value = "租户编号")
|
||||
private String tenantCode;
|
||||
|
||||
/**
|
||||
* 父主键
|
||||
*/
|
||||
|
@ -28,7 +28,6 @@ import java.io.Serializable;
|
||||
* 实体类
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-24
|
||||
*/
|
||||
@Data
|
||||
@TableName("blade_role_menu")
|
||||
|
@ -0,0 +1,65 @@
|
||||
/**
|
||||
* Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
|
||||
* <p>
|
||||
* 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
|
||||
* <p>
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* <p>
|
||||
* 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 org.springblade.system.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import org.springblade.core.mp.base.BaseEntity;
|
||||
|
||||
/**
|
||||
* 实体类
|
||||
*
|
||||
* @author Chill
|
||||
*/
|
||||
@Data
|
||||
@TableName("blade_tenant")
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ApiModel(value = "Tenant对象", description = "Tenant对象")
|
||||
public class Tenant extends BaseEntity {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 租户编号
|
||||
*/
|
||||
@ApiModelProperty(value = "租户编号")
|
||||
private String tenantCode;
|
||||
/**
|
||||
* 租户名称
|
||||
*/
|
||||
@ApiModelProperty(value = "租户名称")
|
||||
private String tenantName;
|
||||
/**
|
||||
* 联系人
|
||||
*/
|
||||
@ApiModelProperty(value = "联系人")
|
||||
private String linkman;
|
||||
/**
|
||||
* 联系电话
|
||||
*/
|
||||
@ApiModelProperty(value = "联系电话")
|
||||
private String contactNumber;
|
||||
/**
|
||||
* 联系地址
|
||||
*/
|
||||
@ApiModelProperty(value = "联系地址")
|
||||
private String address;
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,83 @@
|
||||
/**
|
||||
* Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
|
||||
* <p>
|
||||
* 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
|
||||
* <p>
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* <p>
|
||||
* 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 org.springblade.system.feign;
|
||||
|
||||
import org.springblade.core.launch.constant.AppConstant;
|
||||
import org.springblade.system.entity.Dept;
|
||||
import org.springblade.system.entity.Role;
|
||||
import org.springframework.cloud.openfeign.FeignClient;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
|
||||
/**
|
||||
* Feign接口类
|
||||
*
|
||||
* @author Chill
|
||||
*/
|
||||
@FeignClient(
|
||||
value = AppConstant.APPLICATION_SYSTEM_NAME,
|
||||
fallback = ISysClientFallback.class
|
||||
)
|
||||
public interface ISysClient {
|
||||
|
||||
String API_PREFIX = "/sys";
|
||||
|
||||
/**
|
||||
* 获取部门名
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 部门名
|
||||
*/
|
||||
@GetMapping(API_PREFIX + "/getDeptName")
|
||||
String getDeptName(@RequestParam("id") Integer id);
|
||||
|
||||
/**
|
||||
* 获取部门
|
||||
*
|
||||
* @param id 主键
|
||||
* @return Dept
|
||||
*/
|
||||
@GetMapping(API_PREFIX + "/getDept")
|
||||
Dept getDept(@RequestParam("id") Integer id);
|
||||
|
||||
/**
|
||||
* 获取角色名
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 角色名
|
||||
*/
|
||||
@GetMapping(API_PREFIX + "/getRoleName")
|
||||
String getRoleName(@RequestParam("id") Integer id);
|
||||
|
||||
/**
|
||||
* 获取角色别名
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 角色别名
|
||||
*/
|
||||
@GetMapping(API_PREFIX + "/getRoleAlias")
|
||||
String getRoleAlias(@RequestParam("id") Integer id);
|
||||
|
||||
/**
|
||||
* 获取角色
|
||||
*
|
||||
* @param id 主键
|
||||
* @return Role
|
||||
*/
|
||||
@GetMapping(API_PREFIX + "/getRole")
|
||||
Role getRole(@RequestParam("id") Integer id);
|
||||
|
||||
}
|
@ -0,0 +1,53 @@
|
||||
/**
|
||||
* Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
|
||||
* <p>
|
||||
* 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
|
||||
* <p>
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* <p>
|
||||
* 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 org.springblade.system.feign;
|
||||
|
||||
import org.springblade.system.entity.Dept;
|
||||
import org.springblade.system.entity.Role;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* Feign失败配置
|
||||
*
|
||||
* @author Chill
|
||||
*/
|
||||
@Component
|
||||
public class ISysClientFallback implements ISysClient {
|
||||
@Override
|
||||
public String getDeptName(Integer id) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Dept getDept(Integer id) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRoleName(Integer id) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRoleAlias(Integer id) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Role getRole(Integer id) {
|
||||
return null;
|
||||
}
|
||||
}
|
@ -29,7 +29,6 @@ import java.util.List;
|
||||
* 视图实体类
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-24
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
|
@ -29,7 +29,6 @@ import java.util.List;
|
||||
* 视图实体类
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-24
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
|
@ -24,7 +24,6 @@ import org.springblade.system.entity.Param;
|
||||
* 视图实体类
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-28
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
|
@ -24,7 +24,6 @@ import org.springblade.system.entity.RoleMenu;
|
||||
* 视图实体类
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-24
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
|
@ -29,7 +29,6 @@ import java.util.List;
|
||||
* 视图实体类
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-24
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
|
@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>blade-service-api</artifactId>
|
||||
<groupId>org.springblade</groupId>
|
||||
<version>2.0.0</version>
|
||||
<version>2.1.0</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
@ -18,7 +18,7 @@ package org.springblade.system.user.entity;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import org.springblade.core.mp.base.BaseEntity;
|
||||
import org.springblade.core.mp.base.TenantEntity;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@ -30,7 +30,7 @@ import java.time.LocalDateTime;
|
||||
@Data
|
||||
@TableName("blade_user")
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class User extends BaseEntity {
|
||||
public class User extends TenantEntity {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
|
@ -25,6 +25,7 @@ import org.springframework.web.bind.annotation.RequestParam;
|
||||
|
||||
/**
|
||||
* User Feign接口类
|
||||
*
|
||||
* @author Chill
|
||||
*/
|
||||
@FeignClient(
|
||||
@ -37,11 +38,12 @@ public interface IUserClient {
|
||||
/**
|
||||
* 获取用户信息
|
||||
*
|
||||
* @param tenantCode 租户编号
|
||||
* @param account 账号
|
||||
* @param password 密码
|
||||
* @return
|
||||
*/
|
||||
@GetMapping(API_PREFIX + "/userInfo")
|
||||
R<UserInfo> userInfo(@RequestParam("account") String account, @RequestParam("password") String password);
|
||||
@GetMapping(API_PREFIX + "/user-info")
|
||||
R<UserInfo> userInfo(@RequestParam("tenantCode") String tenantCode, @RequestParam("account") String account, @RequestParam("password") String password);
|
||||
|
||||
}
|
||||
|
@ -15,26 +15,20 @@
|
||||
*/
|
||||
package org.springblade.system.user.vo;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import org.springblade.core.tool.node.INode;
|
||||
import org.springblade.system.user.entity.User;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 视图实体类
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-24
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ApiModel(value = "UserVO对象", description = "UserVO对象")
|
||||
public class UserVO extends User implements INode {
|
||||
public class UserVO extends User {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
@ -42,25 +36,6 @@ public class UserVO extends User implements INode {
|
||||
*/
|
||||
private Integer id;
|
||||
|
||||
/**
|
||||
* 父节点ID
|
||||
*/
|
||||
private Integer parentId;
|
||||
|
||||
/**
|
||||
* 子孙节点
|
||||
*/
|
||||
@JsonInclude(JsonInclude.Include.NON_EMPTY)
|
||||
private List<INode> children;
|
||||
|
||||
@Override
|
||||
public List<INode> getChildren() {
|
||||
if (this.children == null) {
|
||||
this.children = new ArrayList<>();
|
||||
}
|
||||
return this.children;
|
||||
}
|
||||
|
||||
/**
|
||||
* 角色名
|
||||
*/
|
||||
|
@ -5,13 +5,13 @@
|
||||
<parent>
|
||||
<artifactId>SpringBlade</artifactId>
|
||||
<groupId>org.springblade</groupId>
|
||||
<version>2.0.0</version>
|
||||
<version>2.1.0</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>blade-service-api</artifactId>
|
||||
<name>${project.artifactId}</name>
|
||||
<version>2.0.0</version>
|
||||
<version>2.1.0</version>
|
||||
<packaging>pom</packaging>
|
||||
<description>SpringBlade 微服务API集合</description>
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>org.springblade</groupId>
|
||||
<artifactId>blade-service</artifactId>
|
||||
<version>2.0.0</version>
|
||||
<version>2.1.0</version>
|
||||
</parent>
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
@ -11,6 +11,7 @@
|
||||
<result column="update_time" property="updateTime"/>
|
||||
<result column="status" property="status"/>
|
||||
<result column="is_deleted" property="isDeleted"/>
|
||||
<result column="release_time" property="releaseTime"/>
|
||||
<result column="title" property="title"/>
|
||||
<result column="content" property="content"/>
|
||||
</resultMap>
|
||||
|
@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>blade-service</artifactId>
|
||||
<groupId>org.springblade</groupId>
|
||||
<version>2.0.0</version>
|
||||
<version>2.1.0</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>blade-service</artifactId>
|
||||
<groupId>org.springblade</groupId>
|
||||
<version>2.0.0</version>
|
||||
<version>2.1.0</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
@ -15,11 +15,14 @@
|
||||
*/
|
||||
package org.springblade.system.controller;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import io.swagger.annotations.*;
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.springblade.core.boot.ctrl.BladeController;
|
||||
import org.springblade.core.mp.support.Condition;
|
||||
import org.springblade.core.secure.BladeUser;
|
||||
import org.springblade.core.tool.api.R;
|
||||
import org.springblade.core.tool.constant.BladeConstant;
|
||||
import org.springblade.core.tool.node.INode;
|
||||
import org.springblade.core.tool.utils.Func;
|
||||
import org.springblade.system.entity.Dept;
|
||||
@ -37,7 +40,6 @@ import java.util.Map;
|
||||
* 控制器
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-24
|
||||
*/
|
||||
@RestController
|
||||
@AllArgsConstructor
|
||||
@ -67,8 +69,9 @@ public class DeptController extends BladeController {
|
||||
@ApiImplicitParam(name = "fullName", value = "部门全称", paramType = "query", dataType = "string")
|
||||
})
|
||||
@ApiOperation(value = "列表", notes = "传入dept", position = 2)
|
||||
public R<List<INode>> list(@ApiIgnore @RequestParam Map<String, Object> dept) {
|
||||
List<Dept> list = deptService.list(Condition.getQueryWrapper(dept, Dept.class));
|
||||
public R<List<INode>> list(@ApiIgnore @RequestParam Map<String, Object> dept, BladeUser bladeUser) {
|
||||
QueryWrapper<Dept> queryWrapper = Condition.getQueryWrapper(dept, Dept.class);
|
||||
List<Dept> list = deptService.list((!bladeUser.getTenantCode().equals(BladeConstant.ADMIN_TENANT_CODE)) ? queryWrapper.lambda().eq(Dept::getTenantCode, bladeUser.getTenantCode()) : queryWrapper);
|
||||
DeptWrapper deptWrapper = new DeptWrapper();
|
||||
return R.data(deptWrapper.listNodeVO(list));
|
||||
}
|
||||
@ -80,8 +83,8 @@ public class DeptController extends BladeController {
|
||||
*/
|
||||
@GetMapping("/tree")
|
||||
@ApiOperation(value = "树形结构", notes = "树形结构", position = 3)
|
||||
public R<List<DeptVO>> tree() {
|
||||
List<DeptVO> tree = deptService.tree();
|
||||
public R<List<DeptVO>> tree(String tenantCode, BladeUser bladeUser) {
|
||||
List<DeptVO> tree = deptService.tree(Func.toStr(tenantCode, bladeUser.getTenantCode()));
|
||||
return R.data(tree);
|
||||
}
|
||||
|
||||
@ -90,16 +93,18 @@ public class DeptController extends BladeController {
|
||||
*/
|
||||
@PostMapping("/submit")
|
||||
@ApiOperation(value = "新增或修改", notes = "传入dept", position = 6)
|
||||
public R submit(@Valid @RequestBody Dept dept) {
|
||||
public R submit(@Valid @RequestBody Dept dept, BladeUser user) {
|
||||
if (Func.isEmpty(dept.getId())) {
|
||||
dept.setTenantCode(user.getTenantCode());
|
||||
}
|
||||
return R.status(deptService.saveOrUpdate(dept));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 删除
|
||||
*/
|
||||
@PostMapping("/remove")
|
||||
@ApiOperation(value = "物理删除", notes = "传入ids", position = 7)
|
||||
@ApiOperation(value = "删除", notes = "传入ids", position = 7)
|
||||
public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
|
||||
return R.status(deptService.removeByIds(Func.toIntList(ids)));
|
||||
}
|
||||
|
@ -26,6 +26,7 @@ import org.springblade.system.entity.Dict;
|
||||
import org.springblade.system.service.IDictService;
|
||||
import org.springblade.system.vo.DictVO;
|
||||
import org.springblade.system.wrapper.DictWrapper;
|
||||
import org.springframework.cache.annotation.CacheEvict;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import springfox.documentation.annotations.ApiIgnore;
|
||||
|
||||
@ -33,11 +34,13 @@ import javax.validation.Valid;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static org.springblade.common.cache.CacheNames.DICT_LIST;
|
||||
import static org.springblade.common.cache.CacheNames.DICT_VALUE;
|
||||
|
||||
/**
|
||||
* 控制器
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-24
|
||||
*/
|
||||
@RestController
|
||||
@AllArgsConstructor
|
||||
@ -92,7 +95,7 @@ public class DictController extends BladeController {
|
||||
@PostMapping("/submit")
|
||||
@ApiOperation(value = "新增或修改", notes = "传入dict", position = 6)
|
||||
public R submit(@Valid @RequestBody Dict dict) {
|
||||
return R.status(dictService.saveOrUpdate(dict));
|
||||
return R.status(dictService.submit(dict));
|
||||
}
|
||||
|
||||
|
||||
@ -100,7 +103,8 @@ public class DictController extends BladeController {
|
||||
* 删除
|
||||
*/
|
||||
@PostMapping("/remove")
|
||||
@ApiOperation(value = "物理删除", notes = "传入ids", position = 7)
|
||||
@CacheEvict(cacheNames = {DICT_LIST, DICT_VALUE})
|
||||
@ApiOperation(value = "删除", notes = "传入ids", position = 7)
|
||||
public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
|
||||
return R.status(dictService.removeByIds(Func.toIntList(ids)));
|
||||
}
|
||||
|
@ -39,7 +39,6 @@ import java.util.Map;
|
||||
* 控制器
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-24
|
||||
*/
|
||||
@RestController
|
||||
@AllArgsConstructor
|
||||
@ -113,8 +112,8 @@ public class MenuController extends BladeController {
|
||||
*/
|
||||
@GetMapping("/grant-tree")
|
||||
@ApiOperation(value = "权限分配树形结构", notes = "权限分配树形结构", position = 6)
|
||||
public R<List<MenuVO>> grantTree() {
|
||||
return R.data(menuService.grantTree());
|
||||
public R<List<MenuVO>> grantTree(BladeUser user) {
|
||||
return R.data(menuService.grantTree(user));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -140,14 +139,13 @@ public class MenuController extends BladeController {
|
||||
* 删除
|
||||
*/
|
||||
@PostMapping("/remove")
|
||||
@ApiOperation(value = "物理删除", notes = "传入ids", position = 9)
|
||||
@ApiOperation(value = "删除", notes = "传入ids", position = 9)
|
||||
public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
|
||||
return R.status(menuService.removeByIds(Func.toIntList(ids)));
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取配置的角色权限
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("auth-routes")
|
||||
@ApiOperation(value = "菜单的角色权限", position = 8)
|
||||
|
@ -38,7 +38,6 @@ import java.util.Map;
|
||||
* 控制器
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-28
|
||||
*/
|
||||
@RestController
|
||||
@AllArgsConstructor
|
||||
|
@ -15,13 +15,15 @@
|
||||
*/
|
||||
package org.springblade.system.controller;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import io.swagger.annotations.*;
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.springblade.core.boot.ctrl.BladeController;
|
||||
import org.springblade.core.mp.support.Condition;
|
||||
import org.springblade.core.secure.BladeUser;
|
||||
import org.springblade.core.tool.api.R;
|
||||
import org.springblade.core.tool.constant.BladeConstant;
|
||||
import org.springblade.core.tool.node.INode;
|
||||
import org.springblade.core.tool.support.Kv;
|
||||
import org.springblade.core.tool.utils.Func;
|
||||
import org.springblade.system.entity.Role;
|
||||
import org.springblade.system.service.IRoleService;
|
||||
@ -38,7 +40,6 @@ import java.util.Map;
|
||||
* 控制器
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-24
|
||||
*/
|
||||
@RestController
|
||||
@AllArgsConstructor
|
||||
@ -68,8 +69,9 @@ public class RoleController extends BladeController {
|
||||
@ApiImplicitParam(name = "roleAlias", value = "角色别名", paramType = "query", dataType = "string")
|
||||
})
|
||||
@ApiOperation(value = "列表", notes = "传入role", position = 2)
|
||||
public R<List<INode>> list(@ApiIgnore @RequestParam Map<String, Object> role) {
|
||||
List<Role> list = roleService.list(Condition.getQueryWrapper(role, Role.class));
|
||||
public R<List<INode>> list(@ApiIgnore @RequestParam Map<String, Object> role, BladeUser bladeUser) {
|
||||
QueryWrapper<Role> queryWrapper = Condition.getQueryWrapper(role, Role.class);
|
||||
List<Role> list = roleService.list((!bladeUser.getTenantCode().equals(BladeConstant.ADMIN_TENANT_CODE)) ? queryWrapper.lambda().eq(Role::getTenantCode, bladeUser.getTenantCode()) : queryWrapper);
|
||||
RoleWrapper roleWrapper = new RoleWrapper(roleService);
|
||||
return R.data(roleWrapper.listNodeVO(list));
|
||||
}
|
||||
@ -79,8 +81,8 @@ public class RoleController extends BladeController {
|
||||
*/
|
||||
@GetMapping("/tree")
|
||||
@ApiOperation(value = "树形结构", notes = "树形结构", position = 3)
|
||||
public R<List<RoleVO>> tree() {
|
||||
List<RoleVO> tree = roleService.tree();
|
||||
public R<List<RoleVO>> tree(String tenantCode, BladeUser bladeUser) {
|
||||
List<RoleVO> tree = roleService.tree(Func.toStr(tenantCode, bladeUser.getTenantCode()));
|
||||
return R.data(tree);
|
||||
}
|
||||
|
||||
@ -89,7 +91,10 @@ public class RoleController extends BladeController {
|
||||
*/
|
||||
@PostMapping("/submit")
|
||||
@ApiOperation(value = "新增或修改", notes = "传入role", position = 6)
|
||||
public R submit(@Valid @RequestBody Role role) {
|
||||
public R submit(@Valid @RequestBody Role role, BladeUser user) {
|
||||
if (Func.isEmpty(role.getId())) {
|
||||
role.setTenantCode(user.getTenantCode());
|
||||
}
|
||||
return R.status(roleService.saveOrUpdate(role));
|
||||
}
|
||||
|
||||
@ -98,7 +103,7 @@ public class RoleController extends BladeController {
|
||||
* 删除
|
||||
*/
|
||||
@PostMapping("/remove")
|
||||
@ApiOperation(value = "物理删除", notes = "传入ids", position = 7)
|
||||
@ApiOperation(value = "删除", notes = "传入ids", position = 7)
|
||||
public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
|
||||
return R.status(roleService.removeByIds(Func.toIntList(ids)));
|
||||
}
|
||||
|
@ -0,0 +1,119 @@
|
||||
/**
|
||||
* Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
|
||||
* <p>
|
||||
* 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
|
||||
* <p>
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* <p>
|
||||
* 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 org.springblade.system.controller;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import io.swagger.annotations.*;
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.springblade.core.boot.ctrl.BladeController;
|
||||
import org.springblade.core.mp.support.Condition;
|
||||
import org.springblade.core.mp.support.Query;
|
||||
import org.springblade.core.secure.BladeUser;
|
||||
import org.springblade.core.tool.api.R;
|
||||
import org.springblade.core.tool.constant.BladeConstant;
|
||||
import org.springblade.core.tool.utils.Func;
|
||||
import org.springblade.system.entity.Tenant;
|
||||
import org.springblade.system.service.ITenantService;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import springfox.documentation.annotations.ApiIgnore;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 控制器
|
||||
*
|
||||
* @author Chill
|
||||
*/
|
||||
@RestController
|
||||
@AllArgsConstructor
|
||||
@RequestMapping("/tenant")
|
||||
@ApiIgnore
|
||||
@Api(value = "租户管理", tags = "接口")
|
||||
public class TenantController extends BladeController {
|
||||
|
||||
private ITenantService tenantService;
|
||||
|
||||
/**
|
||||
* 详情
|
||||
*/
|
||||
@GetMapping("/detail")
|
||||
@ApiOperation(value = "详情", notes = "传入tenant", position = 1)
|
||||
public R<Tenant> detail(Tenant tenant) {
|
||||
Tenant detail = tenantService.getOne(Condition.getQueryWrapper(tenant));
|
||||
return R.data(detail);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页
|
||||
*/
|
||||
@GetMapping("/list")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "tenantCode", value = "参数名称", paramType = "query", dataType = "string"),
|
||||
@ApiImplicitParam(name = "tenantName", value = "角色别名", paramType = "query", dataType = "string"),
|
||||
@ApiImplicitParam(name = "contactNumber", value = "联系电话", paramType = "query", dataType = "string")
|
||||
})
|
||||
@ApiOperation(value = "分页", notes = "传入tenant", position = 2)
|
||||
public R<IPage<Tenant>> list(@ApiIgnore @RequestParam Map<String, Object> tenant, Query query, BladeUser bladeUser) {
|
||||
QueryWrapper<Tenant> queryWrapper = Condition.getQueryWrapper(tenant, Tenant.class);
|
||||
IPage<Tenant> pages = tenantService.page(Condition.getPage(query), (!bladeUser.getTenantCode().equals(BladeConstant.ADMIN_TENANT_CODE)) ? queryWrapper.lambda().eq(Tenant::getTenantCode, bladeUser.getTenantCode()) : queryWrapper);
|
||||
return R.data(pages);
|
||||
}
|
||||
|
||||
/**
|
||||
* 下拉数据源
|
||||
*/
|
||||
@GetMapping("/select")
|
||||
@ApiOperation(value = "下拉数据源", notes = "传入tenant", position = 3)
|
||||
public R<List<Tenant>> select(Tenant tenant, BladeUser bladeUser) {
|
||||
QueryWrapper<Tenant> queryWrapper = Condition.getQueryWrapper(tenant);
|
||||
List<Tenant> list = tenantService.list((!bladeUser.getTenantCode().equals(BladeConstant.ADMIN_TENANT_CODE)) ? queryWrapper.lambda().eq(Tenant::getTenantCode, bladeUser.getTenantCode()) : queryWrapper);
|
||||
return R.data(list);
|
||||
}
|
||||
|
||||
/**
|
||||
* 自定义分页
|
||||
*/
|
||||
@GetMapping("/page")
|
||||
@ApiOperation(value = "分页", notes = "传入tenant", position = 4)
|
||||
public R<IPage<Tenant>> page(Tenant tenant, Query query) {
|
||||
IPage<Tenant> pages = tenantService.selectTenantPage(Condition.getPage(query), tenant);
|
||||
return R.data(pages);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增或修改
|
||||
*/
|
||||
@PostMapping("/submit")
|
||||
@ApiOperation(value = "新增或修改", notes = "传入tenant", position = 7)
|
||||
public R submit(@Valid @RequestBody Tenant tenant) {
|
||||
return R.status(tenantService.saveTenant(tenant));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 删除
|
||||
*/
|
||||
@PostMapping("/remove")
|
||||
@ApiOperation(value = "逻辑删除", notes = "传入ids", position = 8)
|
||||
public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
|
||||
return R.status(tenantService.deleteLogic(Func.toIntList(ids)));
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -1,3 +1,18 @@
|
||||
/**
|
||||
* Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
|
||||
* <p>
|
||||
* 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
|
||||
* <p>
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* <p>
|
||||
* 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 org.springblade.system.feign;
|
||||
|
||||
|
||||
|
@ -0,0 +1,70 @@
|
||||
/**
|
||||
* Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
|
||||
* <p>
|
||||
* 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
|
||||
* <p>
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* <p>
|
||||
* 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 org.springblade.system.feign;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.springblade.system.entity.Dept;
|
||||
import org.springblade.system.entity.Role;
|
||||
import org.springblade.system.service.IDeptService;
|
||||
import org.springblade.system.service.IRoleService;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import springfox.documentation.annotations.ApiIgnore;
|
||||
|
||||
/**
|
||||
* 系统服务Feign实现类
|
||||
*
|
||||
* @author Chill
|
||||
*/
|
||||
@ApiIgnore
|
||||
@RestController
|
||||
@AllArgsConstructor
|
||||
public class SysClient implements ISysClient {
|
||||
|
||||
IDeptService deptService;
|
||||
|
||||
IRoleService roleService;
|
||||
|
||||
@Override
|
||||
@GetMapping(API_PREFIX + "/getDeptName")
|
||||
public String getDeptName(Integer id) {
|
||||
return deptService.getById(id).getDeptName();
|
||||
}
|
||||
|
||||
@Override
|
||||
@GetMapping(API_PREFIX + "/getDept")
|
||||
public Dept getDept(Integer id) {
|
||||
return deptService.getById(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
@GetMapping(API_PREFIX + "/getRoleName")
|
||||
public String getRoleName(Integer id) {
|
||||
return roleService.getById(id).getRoleName();
|
||||
}
|
||||
|
||||
@Override
|
||||
@GetMapping(API_PREFIX + "/getRoleAlias")
|
||||
public String getRoleAlias(Integer id) {
|
||||
return roleService.getById(id).getRoleAlias();
|
||||
}
|
||||
|
||||
@Override
|
||||
@GetMapping(API_PREFIX + "/getRole")
|
||||
public Role getRole(Integer id) {
|
||||
return roleService.getById(id);
|
||||
}
|
||||
}
|
@ -26,7 +26,6 @@ import java.util.List;
|
||||
* Mapper 接口
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-24
|
||||
*/
|
||||
public interface DeptMapper extends BaseMapper<Dept> {
|
||||
|
||||
@ -42,8 +41,9 @@ public interface DeptMapper extends BaseMapper<Dept> {
|
||||
/**
|
||||
* 获取树形节点
|
||||
*
|
||||
* @param tenantCode
|
||||
* @return
|
||||
*/
|
||||
List<DeptVO> tree();
|
||||
List<DeptVO> tree(String tenantCode);
|
||||
|
||||
}
|
||||
|
@ -32,7 +32,10 @@
|
||||
</select>
|
||||
|
||||
<select id="tree" resultMap="treeNodeResultMap">
|
||||
select id, parent_id, dept_name as title, id as `value`, id as `key` from blade_dept where is_deleted = 0
|
||||
select id, parent_id, dept_name as title, id as 'value', id as 'key' from blade_dept where is_deleted = 0
|
||||
<if test="_parameter!=null">
|
||||
and tenant_code = #{_parameter}
|
||||
</if>
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
|
@ -26,7 +26,6 @@ import java.util.List;
|
||||
* Mapper 接口
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-24
|
||||
*/
|
||||
public interface DictMapper extends BaseMapper<Dict> {
|
||||
|
||||
|
@ -38,12 +38,19 @@
|
||||
from blade_dict where code = #{param1} and dict_key = #{param2} limit 1
|
||||
</select>
|
||||
|
||||
<!-- oracle 版本 -->
|
||||
<!--<select id="getValue" resultType="java.lang.String">
|
||||
select
|
||||
dict_value
|
||||
from blade_dict where code = #{param1, jdbcType=VARCHAR} and dict_key = #{param2} rownum 1
|
||||
</select>-->
|
||||
|
||||
<select id="getList" resultMap="dictResultMap">
|
||||
select code, dict_key, dict_value, sort, remark from blade_dict where code = #{param1}
|
||||
</select>
|
||||
|
||||
<select id="tree" resultMap="treeNodeResultMap">
|
||||
select id, parent_id, dict_value as title, id as `value`, id as `key` from blade_dict where is_deleted = 0
|
||||
select id, parent_id, dict_value as title, id as 'value', id as 'key' from blade_dict where is_deleted = 0
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
|
@ -27,7 +27,6 @@ import java.util.List;
|
||||
* Mapper 接口
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-24
|
||||
*/
|
||||
public interface MenuMapper extends BaseMapper<Menu> {
|
||||
|
||||
@ -54,6 +53,13 @@ public interface MenuMapper extends BaseMapper<Menu> {
|
||||
*/
|
||||
List<MenuVO> grantTree();
|
||||
|
||||
/**
|
||||
* 授权树形结构
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
List<MenuVO> grantTreeByRole(List<Integer> roleId);
|
||||
|
||||
/**
|
||||
* 所有菜单
|
||||
*
|
||||
|
@ -38,7 +38,7 @@
|
||||
</select>
|
||||
|
||||
<select id="tree" resultMap="treeNodeResultMap">
|
||||
select id, parent_id, name as title, id as `value`, id as `key` from blade_menu where is_deleted = 0 and category = 1
|
||||
select id, parent_id, name as title, id as 'value', id as 'key' from blade_menu where is_deleted = 0 and category = 1
|
||||
</select>
|
||||
|
||||
<select id="allMenu" resultMap="menuResultMap">
|
||||
@ -109,7 +109,22 @@
|
||||
</select>
|
||||
|
||||
<select id="grantTree" resultMap="treeNodeResultMap">
|
||||
select id, parent_id, name as title, id as `value`, id as `key` from blade_menu where is_deleted = 0
|
||||
select id, parent_id, name as title, id as 'value', id as 'key' from blade_menu where is_deleted = 0
|
||||
</select>
|
||||
|
||||
<select id="grantTreeByRole" resultMap="treeNodeResultMap">
|
||||
select id, parent_id, name as title, id as 'value', id as 'key' from blade_menu where is_deleted = 0
|
||||
and id in ( select menu_id from blade_role_menu where role_id in
|
||||
<foreach collection="list" index="index" item="item" open="(" separator="," close=")">
|
||||
#{item}
|
||||
</foreach> )
|
||||
or id in (
|
||||
select parent_id from blade_menu where is_deleted = 0
|
||||
and id in ( select menu_id from blade_role_menu where role_id in
|
||||
<foreach collection="list" index="index" item="item" open="(" separator="," close=")">
|
||||
#{item}
|
||||
</foreach> )
|
||||
)
|
||||
</select>
|
||||
|
||||
<select id="authRoutes" resultType="org.springblade.system.dto.MenuDTO">
|
||||
|
@ -26,7 +26,6 @@ import java.util.List;
|
||||
* Mapper 接口
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-28
|
||||
*/
|
||||
public interface ParamMapper extends BaseMapper<Param> {
|
||||
|
||||
|
@ -26,7 +26,6 @@ import java.util.List;
|
||||
* Mapper 接口
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-24
|
||||
*/
|
||||
public interface RoleMapper extends BaseMapper<Role> {
|
||||
|
||||
@ -42,8 +41,9 @@ public interface RoleMapper extends BaseMapper<Role> {
|
||||
/**
|
||||
* 获取树形节点
|
||||
*
|
||||
* @param tenantCode
|
||||
* @return
|
||||
*/
|
||||
List<RoleVO> tree();
|
||||
List<RoleVO> tree(String tenantCode);
|
||||
|
||||
}
|
||||
|
@ -31,7 +31,10 @@
|
||||
</select>
|
||||
|
||||
<select id="tree" resultMap="treeNodeResultMap">
|
||||
select id, parent_id, role_name as title, id as `value`, id as `key` from blade_role where is_deleted = 0
|
||||
select id, parent_id, role_name as title, id as 'value', id as 'key' from blade_role where is_deleted = 0
|
||||
<if test="_parameter!=null">
|
||||
and tenant_code = #{_parameter}
|
||||
</if>
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
|
@ -26,7 +26,6 @@ import java.util.List;
|
||||
* Mapper 接口
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-24
|
||||
*/
|
||||
public interface RoleMenuMapper extends BaseMapper<RoleMenu> {
|
||||
|
||||
|
@ -13,23 +13,28 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.springblade.system.config;
|
||||
package org.springblade.system.mapper;
|
||||
|
||||
import org.springblade.system.feign.IDictClientFallback;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import org.springblade.system.entity.Tenant;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 字典feign失败配置
|
||||
* Mapper 接口
|
||||
*
|
||||
* @author Chill
|
||||
*/
|
||||
@Configuration
|
||||
public class DictFeignConfiguration {
|
||||
public interface TenantMapper extends BaseMapper<Tenant> {
|
||||
|
||||
@Bean
|
||||
public IDictClientFallback dictClientFallback() {
|
||||
return new IDictClientFallback();
|
||||
}
|
||||
/**
|
||||
* 自定义分页
|
||||
*
|
||||
* @param page
|
||||
* @param tenant
|
||||
* @return
|
||||
*/
|
||||
List<Tenant> selectTenantPage(IPage page, Tenant tenant);
|
||||
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
<?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="org.springblade.system.mapper.TenantMapper">
|
||||
|
||||
<!-- 通用查询映射结果 -->
|
||||
<resultMap id="tenantResultMap" type="org.springblade.system.entity.Tenant">
|
||||
<result column="id" property="id"/>
|
||||
<result column="create_user" property="createUser"/>
|
||||
<result column="create_time" property="createTime"/>
|
||||
<result column="update_user" property="updateUser"/>
|
||||
<result column="update_time" property="updateTime"/>
|
||||
<result column="status" property="status"/>
|
||||
<result column="is_deleted" property="isDeleted"/>
|
||||
<result column="tenant_name" property="tenantName"/>
|
||||
<result column="linkman" property="linkman"/>
|
||||
<result column="contact_number" property="contactNumber"/>
|
||||
<result column="address" property="address"/>
|
||||
</resultMap>
|
||||
|
||||
|
||||
<select id="selectTenantPage" resultMap="tenantResultMap">
|
||||
select * from blade_tenant where is_deleted = 0
|
||||
</select>
|
||||
|
||||
</mapper>
|
@ -26,7 +26,6 @@ import java.util.List;
|
||||
* 服务类
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-24
|
||||
*/
|
||||
public interface IDeptService extends IService<Dept> {
|
||||
|
||||
@ -42,8 +41,9 @@ public interface IDeptService extends IService<Dept> {
|
||||
/**
|
||||
* 树形结构
|
||||
*
|
||||
* @param tenantCode
|
||||
* @return
|
||||
*/
|
||||
List<DeptVO> tree();
|
||||
List<DeptVO> tree(String tenantCode);
|
||||
|
||||
}
|
||||
|
@ -26,7 +26,6 @@ import java.util.List;
|
||||
* 服务类
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-24
|
||||
*/
|
||||
public interface IDictService extends IService<Dict> {
|
||||
|
||||
@ -63,4 +62,11 @@ public interface IDictService extends IService<Dict> {
|
||||
*/
|
||||
List<Dict> getList(String code);
|
||||
|
||||
/**
|
||||
* 新增或修改
|
||||
* @param dict
|
||||
* @return
|
||||
*/
|
||||
boolean submit(Dict dict);
|
||||
|
||||
}
|
||||
|
@ -28,7 +28,6 @@ import java.util.List;
|
||||
* 服务类
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-24
|
||||
*/
|
||||
public interface IMenuService extends IService<Menu> {
|
||||
|
||||
@ -67,9 +66,10 @@ public interface IMenuService extends IService<Menu> {
|
||||
/**
|
||||
* 授权树形结构
|
||||
*
|
||||
* @param user
|
||||
* @return
|
||||
*/
|
||||
List<MenuVO> grantTree();
|
||||
List<MenuVO> grantTree(BladeUser user);
|
||||
|
||||
/**
|
||||
* 默认选中节点
|
||||
@ -81,6 +81,7 @@ public interface IMenuService extends IService<Menu> {
|
||||
|
||||
/**
|
||||
* 获取配置的角色权限
|
||||
*
|
||||
* @param user
|
||||
* @return
|
||||
*/
|
||||
|
@ -24,7 +24,6 @@ import org.springblade.system.vo.ParamVO;
|
||||
* 服务类
|
||||
*
|
||||
* @author Chill
|
||||
* @since 2018-12-28
|
||||
*/
|
||||
public interface IParamService extends BaseService<Param> {
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user