Commit 34c9ce81 authored by trumansdo's avatar trumansdo
Browse files

暂存,重新处理结果集映射

parent 404d2016
package com.ibeetl.admin.console.dao; package com.ibeetl.admin.console.dao;
import com.ibeetl.admin.core.service.param.CoreUserParam;
import org.beetl.sql.core.annotatoin.Param; import org.beetl.sql.core.annotatoin.Param;
import org.beetl.sql.core.annotatoin.SqlResource; import org.beetl.sql.core.annotatoin.SqlResource;
import org.beetl.sql.core.engine.PageQuery; import org.beetl.sql.core.engine.PageQuery;
......
package com.ibeetl.admin.console.service;
import com.ibeetl.admin.core.dao.CoreOrgDao;
import com.ibeetl.admin.core.entity.CoreOrg;
import com.ibeetl.admin.core.service.CoreBaseService;
import com.ibeetl.admin.core.service.CorePlatformService;
import com.ibeetl.admin.core.util.enums.DelFlagEnum;
import java.util.List;
import org.beetl.sql.core.query.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class CoreOrgConsoleElService extends CoreBaseService<CoreOrg> {
@Autowired CoreOrgDao coreOrgDao;
@Autowired
CorePlatformService corePlatformService;
/**
* Method getOrgListByParent ...<br>
* 可通过父级机构id获取下一级机构列表<br>
* 如果不传父级机构,会判断是否是admin前缀的超级管理。<br>
* 如果不是超级管理,则通过当前登录人登录时所选的机构id作为根级机构列表
*
* @param parentId of type Long
* @return List<CoreOrg>
*/
public List<CoreOrg> getOrgListByParent(Long parentId) {
if (parentId == null || parentId == 0L) {
if (corePlatformService.isCurrentSupperAdmin()) {
parentId = 0L;
} else {
parentId = corePlatformService.getCurrentOrgId();
}
}
List<CoreOrg> coreOrgList =
coreOrgDao
.createLambdaQuery()
.andEq(CoreOrg::getParentOrgId, parentId)
.andEq(CoreOrg::getDelFlag, DelFlagEnum.NORMAL)
.select();
return coreOrgList;
}
}
package com.ibeetl.admin.console.service; package com.ibeetl.admin.console.service;
import com.ibeetl.admin.core.entity.CoreOrg;
import java.util.List; import java.util.List;
import java.util.Optional;
import org.beetl.sql.core.SQLManager; import org.beetl.sql.core.SQLManager;
import org.beetl.sql.core.engine.PageQuery; import org.beetl.sql.core.engine.PageQuery;
import org.slf4j.Logger; import org.slf4j.Logger;
......
package com.ibeetl.admin.console.service; package com.ibeetl.admin.console.service;
import com.ibeetl.admin.core.entity.DictType;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import org.apache.commons.lang3.StringUtils;
import org.beetl.sql.core.engine.PageQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.ibeetl.admin.console.dao.UserConsoleDao; import com.ibeetl.admin.console.dao.UserConsoleDao;
import com.ibeetl.admin.console.exception.DeletedException; import com.ibeetl.admin.console.exception.DeletedException;
import com.ibeetl.admin.console.exception.NoResourceException; import com.ibeetl.admin.console.exception.NoResourceException;
...@@ -19,6 +7,7 @@ import com.ibeetl.admin.console.web.dto.UserExcelExportData; ...@@ -19,6 +7,7 @@ import com.ibeetl.admin.console.web.dto.UserExcelExportData;
import com.ibeetl.admin.console.web.query.UserRoleQuery; import com.ibeetl.admin.console.web.query.UserRoleQuery;
import com.ibeetl.admin.core.conf.PasswordConfig.PasswordEncryptService; import com.ibeetl.admin.core.conf.PasswordConfig.PasswordEncryptService;
import com.ibeetl.admin.core.entity.CoreDict; import com.ibeetl.admin.core.entity.CoreDict;
import com.ibeetl.admin.core.entity.CoreOrg;
import com.ibeetl.admin.core.entity.CoreUser; import com.ibeetl.admin.core.entity.CoreUser;
import com.ibeetl.admin.core.entity.CoreUserRole; import com.ibeetl.admin.core.entity.CoreUserRole;
import com.ibeetl.admin.core.file.FileService; import com.ibeetl.admin.core.file.FileService;
...@@ -26,10 +15,21 @@ import com.ibeetl.admin.core.rbac.tree.OrgItem; ...@@ -26,10 +15,21 @@ import com.ibeetl.admin.core.rbac.tree.OrgItem;
import com.ibeetl.admin.core.service.CoreBaseService; import com.ibeetl.admin.core.service.CoreBaseService;
import com.ibeetl.admin.core.service.CoreDictService; import com.ibeetl.admin.core.service.CoreDictService;
import com.ibeetl.admin.core.service.CorePlatformService; import com.ibeetl.admin.core.service.CorePlatformService;
import com.ibeetl.admin.core.service.param.CoreUserParam;
import com.ibeetl.admin.core.util.PlatformException; import com.ibeetl.admin.core.util.PlatformException;
import com.ibeetl.admin.core.util.enums.CoreDictType; import com.ibeetl.admin.core.util.enums.CoreDictType;
import com.ibeetl.admin.core.util.enums.DelFlagEnum; import com.ibeetl.admin.core.util.enums.DelFlagEnum;
import com.ibeetl.admin.core.util.enums.GeneralStateEnum; import com.ibeetl.admin.core.util.enums.GeneralStateEnum;
import com.ibeetl.admin.core.util.enums.JobTypeEnum;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import org.apache.commons.lang3.StringUtils;
import org.beetl.sql.core.engine.PageQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service @Service
@Transactional @Transactional
...@@ -53,6 +53,17 @@ public class UserConsoleService extends CoreBaseService<CoreUser> { ...@@ -53,6 +53,17 @@ public class UserConsoleService extends CoreBaseService<CoreUser> {
queryListAfter(ret.getList()); queryListAfter(ret.getList());
} }
/**
* 提供用户管理列表页数据
*
* @param coreUserParam
*/
public PageQuery<CoreUser> getUsersByComplexSelect(CoreUserParam coreUserParam) {
PageQuery<CoreUser> resultList =
userConsoleDao.queryByCondtion(coreUserParam.createPageQuery());
return resultList;
}
/** /**
* 插入一条用户数据 * 插入一条用户数据
* *
...@@ -66,14 +77,12 @@ public class UserConsoleService extends CoreBaseService<CoreUser> { ...@@ -66,14 +77,12 @@ public class UserConsoleService extends CoreBaseService<CoreUser> {
throw new PlatformException("保存用户信息失败,用户已经存在"); throw new PlatformException("保存用户信息失败,用户已经存在");
} }
user.setCreateTime(new Date()); user.setCreateTime(new Date());
user.setState(GeneralStateEnum.ENABLE.getValue());
user.setPassword(passwordEncryptService.password(user.getPassword())); user.setPassword(passwordEncryptService.password(user.getPassword()));
user.setDelFlag(DelFlagEnum.NORMAL.getValue()); user.setDelFlag(DelFlagEnum.NORMAL.getValue());
userConsoleDao.insert(user, true); userConsoleDao.insert(user, true);
if (StringUtils.isNotEmpty(user.getAttachmentId())) { if (StringUtils.isNotEmpty(user.getAttachmentId())) {
// 更新附件详细信息,关联到这个用户 // 更新附件详细信息,关联到这个用户
fileService.updateFile( fileService.updateFile(user.getAttachmentId(), user.getName(), String.valueOf(user.getId()));
user.getAttachmentId(), user.getName(), String.valueOf(user.getId()));
} }
} }
...@@ -185,16 +194,17 @@ public class UserConsoleService extends CoreBaseService<CoreUser> { ...@@ -185,16 +194,17 @@ public class UserConsoleService extends CoreBaseService<CoreUser> {
userItem.setCode(user.getCode()); userItem.setCode(user.getCode());
userItem.setId(user.getId()); userItem.setId(user.getId());
userItem.setName(user.getName()); userItem.setName(user.getName());
CoreDict dict = dictService.findCoreDict(CoreDictType.USER_STATE, user.getState()); CoreDict dict = dictService.findCoreDict(CoreDictType.USER_STATE, user.getState().getValue());
userItem.setStateText(dict.getName()); userItem.setStateText(dict.getName());
String dictValue = Optional.ofNullable(user.getJobType1()).map(DictType::getValue).orElse(null); String dictValue =
Optional.ofNullable(user.getJobType1()).map(JobTypeEnum::getValue).orElse(null);
if (StringUtils.isNotEmpty(dictValue)) { if (StringUtils.isNotEmpty(dictValue)) {
dict = dictService.findCoreDict(CoreDictType.JOB_TYPE, dictValue); dict = dictService.findCoreDict(CoreDictType.JOB_TYPE, dictValue);
userItem.setJobType1Text(dict.getName()); userItem.setJobType1Text(dict.getName());
} }
Long orgId = user.getOrgId();
String orgName = orgRoot.findChild(user.getOrgId()).getName(); String orgName = orgRoot.findChild(orgId).getName();
userItem.setOrgText(orgName); userItem.setOrgText(orgName);
items.add(userItem); items.add(userItem);
} }
......
...@@ -4,6 +4,7 @@ import cn.hutool.core.annotation.AnnotationUtil; ...@@ -4,6 +4,7 @@ import cn.hutool.core.annotation.AnnotationUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapBuilder; import cn.hutool.core.map.MapBuilder;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import com.ibeetl.admin.core.annotation.ElColumn; import com.ibeetl.admin.core.annotation.ElColumn;
import com.ibeetl.admin.core.entity.CoreDict; import com.ibeetl.admin.core.entity.CoreDict;
import com.ibeetl.admin.core.entity.ElCascaderData; import com.ibeetl.admin.core.entity.ElCascaderData;
...@@ -11,15 +12,17 @@ import java.lang.reflect.Field; ...@@ -11,15 +12,17 @@ import java.lang.reflect.Field;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional; import java.util.Optional;
import java.util.Set;
/** /**
* 视图对象工具类 * 视图工具类
* *
* @author 一日看尽长安花 * @author 一日看尽长安花
*/ */
public class VOUtil { public class VOUtil {
static final String JSON_PATH_KEY = "json_path";
/** /**
* Method resolveElColumn ... todo 预计重新定义一个类用来转换,而不是用map * Method resolveElColumn ... todo 预计重新定义一个类用来转换,而不是用map
* *
...@@ -33,11 +36,23 @@ public class VOUtil { ...@@ -33,11 +36,23 @@ public class VOUtil {
for (Field field : declaredFields) { for (Field field : declaredFields) {
Map<String, Object> annotationValueMap = Map<String, Object> annotationValueMap =
AnnotationUtil.getAnnotationValueMap(field, ElColumn.class); AnnotationUtil.getAnnotationValueMap(field, ElColumn.class);
ElColumn elColumn = AnnotationUtil.getAnnotation(field, ElColumn.class); if (MapUtil.isEmpty(annotationValueMap)) continue;
Optional.ofNullable(elColumn) Set<Entry<String, Object>> entrySet = annotationValueMap.entrySet();
.ifPresent(column -> mapBuilder.put(field.getName(), annotationValueMap)); MapBuilder<Object, Object> camelKeyValueMap = MapUtil.builder();
for (Entry<String, Object> entry : entrySet) {
String key = entry.getKey();
Object value = entry.getValue();
camelKeyValueMap.put(StrUtil.toUnderlineCase(key), value);
}
String camelKey = StrUtil.toUnderlineCase(field.getName());
Map<Object, Object> buildMap = camelKeyValueMap.build();
String jsonPath = buildMap.getOrDefault(JSON_PATH_KEY, StrUtil.EMPTY).toString();
if (StrUtil.isBlank(jsonPath)) {
jsonPath = camelKey;
}
buildMap.put(JSON_PATH_KEY, jsonPath);
mapBuilder.put(camelKey, buildMap);
} }
return mapBuilder.build(); return mapBuilder.build();
} }
} }
package com.ibeetl.admin.console.web;
import com.ibeetl.admin.console.util.VOUtil;
import com.ibeetl.admin.console.web.query.CoreUserElQuery;
import com.ibeetl.admin.core.entity.CoreUser;
import com.ibeetl.admin.core.service.CoreUserService;
import com.ibeetl.admin.core.web.JsonResult;
import java.util.Map;
import javax.validation.constraints.NotNull;
import org.beetl.sql.core.engine.PageQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@Validated
@RestController
public class CoreUserElController {
@Autowired private CoreUserService coreUserService;
@GetMapping("/users/metadata")
public JsonResult<Map> usersMetedata() {
return JsonResult.success(VOUtil.resolveElColumn(CoreUserElQuery.class));
}
@GetMapping("/users")
public JsonResult<PageQuery<CoreUser>> users(@NotNull Integer page, @NotNull Integer limit) {
PageQuery<CoreUser> allUsers = coreUserService.getAllUsers(page, limit);
return JsonResult.success(allUsers);
}
}
package com.ibeetl.admin.core.web; package com.ibeetl.admin.console.web;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.ibeetl.admin.core.entity.CoreDict; import com.ibeetl.admin.core.entity.CoreDict;
import com.ibeetl.admin.core.entity.ElCascaderData; import com.ibeetl.admin.core.entity.ElCascaderData;
import com.ibeetl.admin.core.service.CoreDictService; import com.ibeetl.admin.core.service.CoreDictService;
import com.ibeetl.admin.core.web.JsonResult;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -31,7 +32,7 @@ public class DictCascaderElController { ...@@ -31,7 +32,7 @@ public class DictCascaderElController {
* @param type of type String 子级字典列表type * @param type of type String 子级字典列表type
* @return JsonResult<List < ElCascaderData>> * @return JsonResult<List < ElCascaderData>>
*/ */
@GetMapping @GetMapping("/tree")
public JsonResult<List<ElCascaderData>> obtainDcitsByCascader(Long parentId, String type) { public JsonResult<List<ElCascaderData>> obtainDcitsByCascader(Long parentId, String type) {
if (StrUtil.isBlank(type) && parentId == null) { if (StrUtil.isBlank(type) && parentId == null) {
return JsonResult.failMessage("parentId and type should have at least one."); return JsonResult.failMessage("parentId and type should have at least one.");
......
package com.ibeetl.admin.console.web;
import com.ibeetl.admin.core.entity.CoreOrg;
import com.ibeetl.admin.core.entity.ElCascaderData;
import com.ibeetl.admin.console.service.CoreOrgConsoleElService;
import com.ibeetl.admin.core.service.CorePlatformService;
import com.ibeetl.admin.core.web.JsonResult;
import java.util.ArrayList;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 字典数据获取
*
* @author 一日看尽长安花
*/
@Slf4j
@RestController
@RequestMapping(value = "/core/orgs")
public class OrgCascaderElController {
@Autowired CorePlatformService corePlatformService;
@Autowired
CoreOrgConsoleElService coreOrgService;
/**
* Method obtainDcitsByCascader ...<br>
* 获取机构级联。如果是admin超级管理,可以获取所有的机构。<br>
* 如果不是,则根据当前登录人的机构id获取根级机构
*
* @param parentId of type Long 父级id
* @return JsonResult<List < ElCascaderData>>
*/
@GetMapping("/tree")
public JsonResult<List<ElCascaderData>> obtainOrgsByCascader(Long parentId) {
List<CoreOrg> coreOrgList = coreOrgService.getOrgListByParent(parentId);
return JsonResult.success(convertToCascaderData(coreOrgList));
}
private List<ElCascaderData> convertToCascaderData(List<CoreOrg> coreOrgs) {
List<ElCascaderData> cascaderDataArrayList = new ArrayList<ElCascaderData>(coreOrgs.size());
for (CoreOrg org : coreOrgs) {
ElCascaderData data = new ElCascaderData();
data.setId(org.getId());
data.setLabel(org.getName());
data.setValue(org.getId());
cascaderDataArrayList.add(data);
}
return cascaderDataArrayList;
}
}
package com.ibeetl.admin.console.web;
import javax.validation.constraints.NotNull;
import lombok.Builder;
import lombok.Builder.Default;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
public class PageParams {
@NotNull Integer page = 1;
@NotNull Integer limit = 10;
}
package com.ibeetl.admin.console.web;
import com.ibeetl.admin.console.service.UserConsoleService;
import com.ibeetl.admin.console.util.VOUtil;
import com.ibeetl.admin.console.web.query.CoreUserElQuery;
import com.ibeetl.admin.core.annotation.Function;
import com.ibeetl.admin.core.entity.CoreUser;
import com.ibeetl.admin.core.service.CorePlatformService;
import com.ibeetl.admin.core.service.CoreUserService;
import com.ibeetl.admin.core.service.param.CoreUserParam;
import com.ibeetl.admin.core.util.ConvertUtil;
import com.ibeetl.admin.core.util.ValidateConfig;
import com.ibeetl.admin.core.web.JsonResult;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.beetl.sql.core.engine.PageQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Validated
@RequestMapping("/users")
@RestController
public class UserConsoleElController {
@Autowired private UserConsoleService userConsoleService;
@Autowired private CorePlatformService platformService;
@Function("user.query")
@GetMapping("/metadata")
public JsonResult<Map> usersMetedata() {
return JsonResult.success(VOUtil.resolveElColumn(CoreUserElQuery.class));
}
@Function("user.query")
@GetMapping
public JsonResult<PageQuery<CoreUser>> users(CoreUserParam coreUserParam) {
PageQuery<CoreUser> allUsers = userConsoleService.getUsersByComplexSelect(coreUserParam);
return JsonResult.success(allUsers);
}
@Function("user.add")
@PostMapping
public JsonResult<Long> addUser(@Validated(ValidateConfig.ADD.class) CoreUser user) {
if (!platformService.isAllowUserName(user.getCode())) {
return JsonResult.failMessage("不允许的注册名字 " + user.getCode());
}
userConsoleService.saveUser(user);
return JsonResult.success(user.getId());
}
@Function("user.update")
@PutMapping
public JsonResult update(@Validated(ValidateConfig.UPDATE.class) CoreUser user) {
boolean success = userConsoleService.updateTemplate(user);
if (success) {
this.platformService.clearFunctionCache();
return JsonResult.success();
} else {
return JsonResult.failMessage("保存失败!");
}
}
@Function("user.delete")
@DeleteMapping
public JsonResult delete(Long[] ids) {
userConsoleService.batchDelSysUser(Arrays.asList(ids));
return JsonResult.success();
}
}
...@@ -17,19 +17,27 @@ import lombok.Data; ...@@ -17,19 +17,27 @@ import lombok.Data;
@Data @Data
public class CoreUserElQuery { public class CoreUserElQuery {
@ElColumn(name = "ID", type = STRING) @ElColumn(
name = "ID",
type = STRING,
isShowSearchPanel = false,
isShowTablePanel = false,
isShowEditorPanel = false)
protected Long id; protected Long id;
@ElColumn(name = "创建时间", type = DATE) @ElColumn(name = "创建时间", type = DATE)
protected Date createTime; protected Date createTime;
@ElColumn(name = "用户名", type = STRING) @ElColumn(name = "用户名", type = STRING, isShowSearchPanel = false)
private String code; private String code;
@ElColumn(name = "姓名", type = STRING) @ElColumn(name = "姓名", type = STRING)
private String name; private String name;
@ElColumn(name = "状态", type = STRING) @ElColumn(name = "机构", type = STRING)
private Long orgId;
@ElColumn(name = "状态", type = DICT)
private String state; private String state;
@ElColumn(name = "职务", type = DICT) @ElColumn(name = "职务", type = DICT)
......
queryByCondtion queryByCondtion
=== ===
select ```sql
@pageTag(){ select
u.*,o.name org_name @pageTag(){
@} u.*,o.name org_name
from core_user u left join core_org o on u.org_id=o.id where 1=1 and u.del_flag = 0 @}
@//数据权限,该sql语句功能点 from core_user u left join core_org o on u.org_id=o.id where 1=1 and u.del_flag = 0
and #function("user.query")# @//数据权限,该sql语句功能点
@if(!isEmpty(orgId)){ and #function("user.query")#
and u.org_id =#orgId# @if(!isEmpty(orgId)){
@} and u.org_id =#orgId#
@if(!isEmpty(orgId)){ @}
and u.org_id =#orgId# @if(!isEmpty(code)){
@} and u.code like #"%"+code+"%"#
@if(!isEmpty(code)){ @}
and u.code like #"%"+code+"%"# @if(!isEmpty(name)){
@} and u.name like #"%"+name+"%"#
@if(!isEmpty(name)){ @}
and u.name like #"%"+name+"%"# @if(!isEmpty(state)){
@} and u.state = #state#
@if(!isEmpty(state)){ @}
and u.state = #state# @if(!isEmpty(jobType0)){
@} and u.job_type0= #jobType0#
@if(!isEmpty(jobType0)){ @}
and u.job_type0= #jobType0# @if(!isEmpty(createTimeStart)){
@} and u.create_time>= #createTimeStart#
@if(!isEmpty(jobType1)){ @}
and u.job_type1= #jobType1# @if(!isEmpty(createTimeEnd)){
@} and u.create_time< #nextDay(createTimeEnd)#
@if(!isEmpty(createDateMin)){ @}
and u.create_time>= #createDateMin# ```
@}
@if(!isEmpty(createDateMax)){
and u.create_time< #nextDay(createDateMax)#
@}
batchDelUserByIds batchDelUserByIds
=== ===
...@@ -69,3 +62,28 @@ where u.id=#id# ...@@ -69,3 +62,28 @@ where u.id=#id#
and role.id=#roleId# and role.id=#roleId#
@} @}
``` ```
UsersMapping
===
```
var user_mapping_var={
"id": "core_route_map",
"mapping": {
"resultType": "com.ibeetl.admin.core.entity.CoreRoute",
"id": "id",
"createTime": "create_time",
"code": "code",
"name": "name",
"state": "state",
"jobType0": "job_type0",
"jobType1": "job_type1",
"updateTime": "update_time",
"attachmentId": "attachment_id",
"org": {
"resultType": "com.ibeetl.admin.core.entity.CoreOrg",
"id": "org_id",
"name": "org_name"
}
}
};
```
\ No newline at end of file
import cn.hutool.core.util.EnumUtil;
import com.ibeetl.admin.ConsoleApplication; import com.ibeetl.admin.ConsoleApplication;
import com.ibeetl.admin.core.dao.CoreFunctionDao; import com.ibeetl.admin.core.dao.CoreFunctionDao;
import com.ibeetl.admin.core.entity.CoreRoute; import com.ibeetl.admin.core.entity.CoreRoute;
import entity.CmsBlog;
import entity.CmsBlogTypeEnum;
import java.util.List; import java.util.List;
import org.beetl.sql.core.SQLManager;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -21,5 +25,15 @@ public class CustomBeanProcessorTest { ...@@ -21,5 +25,15 @@ public class CustomBeanProcessorTest {
} }
@Test @Test
public void test() {} public void test() {
SQLManager sqlManager = coreFunctionDao.getSQLManager();
List<CmsBlog> cmsBlogList = sqlManager.lambdaQuery(CmsBlog.class).select();
System.out.println(cmsBlogList);
CmsBlog blog = new CmsBlog();
blog.setTitle("test title");
blog.setContent("test content");
blog.setType(CmsBlogTypeEnum.FN1);
blog.setCreateUserId(1L);
sqlManager.lambdaQuery(CmsBlog.class).insert(blog);
}
} }
package entity;
import lombok.Data;
import org.beetl.sql.core.annotatoin.AutoID;
@Data
public class CmsBlog {
@AutoID
private Long id;
private String title;
private String content;
private Long createUserId;
private CmsBlogTypeEnum type;
private Long createTime;
}
package entity;
import org.beetl.sql.core.annotatoin.EnumMapping;
@EnumMapping("value")
public enum CmsBlogTypeEnum {
FN0("FN0", "普通功能", "function_type"),
FN1("FN1", "含数据权限", "function_type"),
FN2("FN2", "菜单功能", "function_type");
private String value;
private String name;
private String type;
CmsBlogTypeEnum(String value, String name, String type) {
this.value = value;
this.name = name;
this.type = type;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
...@@ -54,7 +54,7 @@ ...@@ -54,7 +54,7 @@
<dependency> <dependency>
<groupId>com.ibeetl</groupId> <groupId>com.ibeetl</groupId>
<artifactId>beetl-framework-starter</artifactId> <artifactId>beetl-framework-starter</artifactId>
<version>1.2.13.RELEASE</version> <version>1.2.20.RELEASE</version>
</dependency> </dependency>
<!-- Log4j2 异步支持 --> <!-- Log4j2 异步支持 -->
<dependency> <dependency>
......
package com.ibeetl.admin.core.annotation; package com.ibeetl.admin.core.annotation;
import cn.hutool.core.util.StrUtil;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
...@@ -16,37 +17,57 @@ public @interface ElColumn { ...@@ -16,37 +17,57 @@ public @interface ElColumn {
/** /**
* 数据表格列头显示名称 * 数据表格列头显示名称
* @return *
* */ * @return
*/
String name(); String name();
/** /**
* 该列的类型。查看 {@link com.ibeetl.admin.core.util.enums.ElColumnType} * 该列的类型。查看 {@link com.ibeetl.admin.core.util.enums.ElColumnType}
*
* @return * @return
* */ */
String type(); String type();
/**
* 在数据表格中取json的path。参照json path技术。
*
* @return String
*/
String jsonPath() default StrUtil.EMPTY;
/** /**
* 开启element-ui 中数据表格列的手动排序 * 开启element-ui 中数据表格列的手动排序
* @return *
* */ * @return
*/
boolean sortable() default false; boolean sortable() default false;
/** /**
* 是否在前端页面的查询条件区显示 * 是否在前端页面的查询条件区显示
*
* @return * @return
* */ */
boolean visible() default true; boolean isShowSearchPanel() default true;
/** /**
* 是否在前端页面的数据表格列中显示 * 是否在前端页面的数据表格列中显示
*
* @return
*/
boolean isShowTablePanel() default true;
/**
* 是否在前端页面的编辑窗显示
*
* @return * @return
* */ */
boolean displayable() default true; boolean isShowEditorPanel() default true;
/** /**
* 是否在表单中是必填。暂时没做规则的生成功能,暂定没有 * 是否在表单中是必填。暂时没做规则的生成功能,暂定没有
*
* @return * @return
* */ */
boolean required() default false; boolean required() default false;
} }
package com.ibeetl.admin.core.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value = ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface SnakeCaseParameter {}
package com.ibeetl.admin.core.conf; package com.ibeetl.admin.core.conf;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.EnumUtil;
import cn.hutool.core.util.ReflectUtil;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser.NumberType; import com.fasterxml.jackson.core.JsonParser.NumberType;
import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.core.Version; import com.fasterxml.jackson.core.Version;
import com.fasterxml.jackson.core.type.WritableTypeId; import com.fasterxml.jackson.core.type.WritableTypeId;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.PropertyNamingStrategy.SnakeCaseStrategy;
import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper; import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper;
import com.fasterxml.jackson.databind.jsontype.TypeSerializer; import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.StdSerializer; import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import com.ibeetl.admin.core.util.enums.DictTypeEnum;
import com.ibeetl.admin.core.web.JsonResult; import com.ibeetl.admin.core.web.JsonResult;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Type; import java.lang.reflect.Type;
...@@ -26,9 +34,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean ...@@ -26,9 +34,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
/** /** @author 一日看尽长安花 */
* @author 一日看尽长安花
*/
@Configuration @Configuration
public class JasonConfig { public class JasonConfig {
@Bean @Bean
...@@ -36,13 +42,22 @@ public class JasonConfig { ...@@ -36,13 +42,22 @@ public class JasonConfig {
public ObjectMapper getObjectMapper() { public ObjectMapper getObjectMapper() {
ObjectMapper objectMapper = new ObjectMapper(); ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); /*objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));*/
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
objectMapper.setSerializationInclusion(Include.NON_NULL);
objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true); objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true);
/*将date字段序列化为时间戳*/
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true);
/*map中date的也序列化为时间戳*/
objectMapper.configure(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS, true);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
SimpleModule simpleModule = new SimpleModule("SimpleModule", Version.unknownVersion()); SimpleModule simpleModule = new SimpleModule("SimpleModule", Version.unknownVersion());
simpleModule.addSerializer(JsonResult.class, new CustomJsonResultSerializer()); simpleModule.addSerializer(JsonResult.class, new CustomJsonResultSerializer());
simpleModule.addSerializer(DictTypeEnum.class, new DictTypeEnumSerializer());
CustomLongSerializer longSerializer = new CustomLongSerializer(); CustomLongSerializer longSerializer = new CustomLongSerializer();
simpleModule.addSerializer(Long.class, longSerializer); simpleModule.addSerializer(Long.class, longSerializer);
...@@ -53,6 +68,21 @@ public class JasonConfig { ...@@ -53,6 +68,21 @@ public class JasonConfig {
} }
} }
class DictTypeEnumSerializer extends JsonSerializer<DictTypeEnum> {
@Override
public void serialize(DictTypeEnum value, JsonGenerator gen, SerializerProvider serializers)
throws IOException {
gen.writeStartObject();
if (value instanceof Enum) {
gen.writeObjectField("name", ReflectUtil.getFieldValue(value, "name"));
gen.writeObjectField("value", ReflectUtil.getFieldValue(value, "value"));
gen.writeObjectField("type", ReflectUtil.getFieldValue(value, "type"));
}
gen.writeEndObject();
}
}
/** /**
* 修正jackson转换Long类型的一个bug: jackson的转换Long类型时,如果数值在Integer范围,会变成Integer类型,然后通过强制转换为Long时就会报错。 * 修正jackson转换Long类型的一个bug: jackson的转换Long类型时,如果数值在Integer范围,会变成Integer类型,然后通过强制转换为Long时就会报错。
* 这里采用安全的Long转换避免强制类型转换 * 这里采用安全的Long转换避免强制类型转换
...@@ -100,9 +130,7 @@ class CustomJsonResultSerializer extends JsonSerializer<JsonResult> { ...@@ -100,9 +130,7 @@ class CustomJsonResultSerializer extends JsonSerializer<JsonResult> {
CustomJsonResultSerializer() {} CustomJsonResultSerializer() {}
/** /** 处理 JsonResult 返回结果。自动分离分页信息,不需要手动在controller中分离 */
* 处理 JsonResult 返回结果。自动分离分页信息,不需要手动在controller中分离
*/
@Override @Override
public void serialize(JsonResult value, JsonGenerator gen, SerializerProvider serializers) public void serialize(JsonResult value, JsonGenerator gen, SerializerProvider serializers)
throws IOException { throws IOException {
......
package com.ibeetl.admin.core.conf; package com.ibeetl.admin.core.conf;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ClassUtil; import cn.hutool.core.util.ClassUtil;
import cn.hutool.core.util.EnumUtil;
import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.TypeUtil; import cn.hutool.core.util.TypeUtil;
...@@ -10,22 +13,39 @@ import cn.hutool.json.JSONArray; ...@@ -10,22 +13,39 @@ import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.ibeetl.admin.core.annotation.RequestBodyPlus; import com.ibeetl.admin.core.annotation.RequestBodyPlus;
import com.ibeetl.admin.core.annotation.SnakeCaseParameter;
import com.ibeetl.admin.core.service.CoreUserService; import com.ibeetl.admin.core.service.CoreUserService;
import com.ibeetl.admin.core.util.HttpRequestLocal; import com.ibeetl.admin.core.util.HttpRequestLocal;
import com.ibeetl.admin.core.util.JoseJwtUtil; import com.ibeetl.admin.core.util.JoseJwtUtil;
import com.ibeetl.admin.core.util.enums.DictTypeEnum;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.beetl.core.GroupTemplate; import org.beetl.core.GroupTemplate;
import org.beetl.ext.spring.BeetlGroupUtilConfiguration; import org.beetl.ext.spring.BeetlGroupUtilConfiguration;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyAccessorFactory;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.core.MethodParameter; import org.springframework.core.MethodParameter;
import org.springframework.core.ResolvableType;
import org.springframework.core.convert.TypeDescriptor;
import org.springframework.core.convert.converter.ConditionalGenericConverter;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
import org.springframework.format.FormatterRegistry; import org.springframework.format.FormatterRegistry;
import org.springframework.format.datetime.DateFormatter; import org.springframework.format.datetime.DateFormatter;
...@@ -34,14 +54,12 @@ import org.springframework.http.MediaType; ...@@ -34,14 +54,12 @@ import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.server.ServletServerHttpRequest; import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer; import org.springframework.web.method.support.ModelAndViewContainer;
import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
...@@ -94,6 +112,11 @@ public class SpringWebMvcConfigurer implements WebMvcConfigurer, InitializingBea ...@@ -94,6 +112,11 @@ public class SpringWebMvcConfigurer implements WebMvcConfigurer, InitializingBea
registry.addMapping("/**"); registry.addMapping("/**");
} }
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
// resolvers.add(new UnderlineToCamelArgumentResolver());
}
/** /**
* SpringMVC的请求响应消息的转换格式器 * SpringMVC的请求响应消息的转换格式器
* *
...@@ -103,6 +126,71 @@ public class SpringWebMvcConfigurer implements WebMvcConfigurer, InitializingBea ...@@ -103,6 +126,71 @@ public class SpringWebMvcConfigurer implements WebMvcConfigurer, InitializingBea
public void addFormatters(FormatterRegistry registry) { public void addFormatters(FormatterRegistry registry) {
registry.addFormatter(new DateFormatter("yyyy-MM-dd HH:mm:ss")); registry.addFormatter(new DateFormatter("yyyy-MM-dd HH:mm:ss"));
registry.addFormatter(new DateFormatter("yyyy-MM-dd")); registry.addFormatter(new DateFormatter("yyyy-MM-dd"));
registry.addConverter(
new ConditionalGenericConverter() {
@Override
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
boolean targetTypeMatches =
Optional.ofNullable(targetType.getResolvableType())
.map(ResolvableType::resolve)
.map(resolvableType -> resolvableType.equals(Date.class))
.orElse(false);
return targetTypeMatches;
}
@Override
public Set<ConvertiblePair> getConvertibleTypes() {
return CollUtil.newHashSet(
new ConvertiblePair(String.class, Date.class),
new ConvertiblePair(Long.class, Date.class));
}
@Override
public Object convert(
Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
return DateUtil.date(Convert.toLong(source));
}
});
registry.addConverter(
new ConditionalGenericConverter() {
/**
* 处理从前端传递的字符串到对应的字典枚举,需要字典枚举类实现 {@link DictTypeEnum} 接口
*
* @return boolean
*/
@Override
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
Class targetClass =
Optional.ofNullable(targetType.getResolvableType())
.map(ResolvableType::resolve)
.orElse(null);
return sourceType.getResolvableType().resolve().equals(String.class)
&& Enum.class.isAssignableFrom(targetClass)
&& DictTypeEnum.class.isAssignableFrom(targetClass);
}
@Override
public Set<ConvertiblePair> getConvertibleTypes() {
return CollUtil.newHashSet(new ConvertiblePair(String.class, DictTypeEnum.class));
}
@Override
public Object convert(
Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
Class enumClass = targetType.getResolvableType().resolve();
Map<String, Object> valueFieldMap = EnumUtil.getNameFieldMap(enumClass, "value");
Set<Entry<String, Object>> entrySet = valueFieldMap.entrySet();
String targetEnumName = StrUtil.EMPTY;
for (Entry<String, Object> entry : entrySet) {
if (entry.getValue().equals(source.toString())) {
targetEnumName = entry.getKey();
break;
}
}
return EnumUtil.fromStringQuietly(enumClass, targetEnumName);
}
});
} }
@Override @Override
...@@ -241,3 +329,54 @@ class RequestBodyPlusProcessor extends AbstractMessageConverterMethodProcessor { ...@@ -241,3 +329,54 @@ class RequestBodyPlusProcessor extends AbstractMessageConverterMethodProcessor {
ModelAndViewContainer mavContainer, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest) {} NativeWebRequest webRequest) {}
} }
/**
* Class UnderlineToCamelArgumentResolver : <br>
* 描述:处理请求参数的命名由下划线等转驼峰命名。<br>
* 但是与另一个{@link DictTypeEnum} 枚举处理有冲突,所以交给前端处理命名转换
*
* @author 一日看尽长安花 Created on 2020/2/2
*/
class UnderlineToCamelArgumentResolver implements HandlerMethodArgumentResolver {
/** 匹配下划线的格式 */
private static Pattern pattern = Pattern.compile("_(\\w)");
private static String underLineToCamel(String source) {
Matcher matcher = pattern.matcher(source);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
}
matcher.appendTail(sb);
return sb.toString();
}
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return methodParameter.hasParameterAnnotation(SnakeCaseParameter.class);
}
@Override
public Object resolveArgument(
MethodParameter parameter,
ModelAndViewContainer container,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) {
return handleParameterNames(parameter, webRequest);
}
private Object handleParameterNames(MethodParameter parameter, NativeWebRequest webRequest) {
Object obj = BeanUtils.instantiateClass(parameter.getParameterType());
BeanWrapper wrapper = PropertyAccessorFactory.forBeanPropertyAccess(obj);
Iterator<String> paramNames = webRequest.getParameterNames();
while (paramNames.hasNext()) {
String paramName = paramNames.next();
Object o = webRequest.getParameter(paramName);
try {
wrapper.setPropertyValue(underLineToCamel(paramName), o);
} catch (BeansException e) {
}
}
return obj;
}
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment