!35 功能优化与部分Bug修复

Merge pull request !35 from 大熊/master
This commit is contained in:
1024创新实验室
2024-09-02 13:57:34 +00:00
committed by Gitee
78 changed files with 1010 additions and 721 deletions

View File

@@ -1,9 +1,11 @@
package net.lab1024.sa.admin.module.business.goods.domain.form;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import net.lab1024.sa.admin.module.business.goods.constant.GoodsStatusEnum;
import net.lab1024.sa.base.common.domain.PageParam;
import net.lab1024.sa.base.common.json.deserializer.DictValueVoDeserializer;
import net.lab1024.sa.base.common.swagger.SchemaEnum;
import net.lab1024.sa.base.common.validator.enumeration.CheckEnum;
import org.hibernate.validator.constraints.Length;
@@ -32,6 +34,7 @@ public class GoodsQueryForm extends PageParam {
private Integer goodsStatus;
@Schema(description = "产地")
@JsonDeserialize(using = DictValueVoDeserializer.class)
private String place;
@Schema(description = "上架状态")

View File

@@ -199,7 +199,7 @@ public class GoodsService {
GoodsExcelVO.builder()
.goodsStatus(SmartEnumUtil.getEnumDescByValue(e.getGoodsStatus(), GoodsStatusEnum.class))
.categoryName(categoryQueryService.queryCategoryName(e.getCategoryId()))
.place(dictCacheService.selectValueNameByValueCode(e.getPlace()))
.place(Arrays.stream(e.getPlace().split(",")).map(code -> dictCacheService.selectValueNameByValueCode(code)).collect(Collectors.joining(",")))
.price(e.getPrice())
.goodsName(e.getGoodsName())
.remark(e.getRemark())

View File

@@ -114,4 +114,14 @@ public interface NoticeDao extends BaseMapper<NoticeEntity> {
*/
void updateViewRecord(@Param("noticeId")Long noticeId, @Param("employeeId")Long requestEmployeeId,@Param("ip") String ip, @Param("userAgent")String userAgent);
/**
* 更新 浏览量
*
* @param noticeId 通知 id
* @param pageViewCountIncrement 页面浏览量的增量
* @param userViewCountIncrement 用户浏览量的增量
*/
void updateViewCount(@Param("noticeId")Long noticeId,@Param("pageViewCountIncrement") Integer pageViewCountIncrement, @Param("userViewCountIncrement")Integer userViewCountIncrement);
}

View File

@@ -52,10 +52,10 @@ public class NoticeEmployeeService {
public ResponseDTO<PageResult<NoticeEmployeeVO>> queryList(Long requestEmployeeId, NoticeEmployeeQueryForm noticeEmployeeQueryForm) {
Page<?> page = SmartPageUtil.convert2PageQuery(noticeEmployeeQueryForm);
//获取请求人的 部门及其子部门
List<Long> employeeDepartmentIdList = Lists.newArrayList();
EmployeeEntity employeeEntity = employeeService.getById(requestEmployeeId);
if (employeeEntity.getDepartmentId() != null) {
// 如果不是管理员 则获取请求人的 部门及其子部门
if (!employeeEntity.getAdministratorFlag() && employeeEntity.getDepartmentId() != null) {
employeeDepartmentIdList = departmentService.selfAndChildrenIdList(employeeEntity.getDepartmentId());
}
@@ -106,8 +106,15 @@ public class NoticeEmployeeService {
long viewCount = noticeDao.viewRecordCount(noticeId, requestEmployeeId);
if (viewCount == 0) {
noticeDao.insertViewRecord(noticeId, requestEmployeeId, ip, userAgent, 1);
// 该员工对于这个通知是第一次查看 页面浏览量+1 用户浏览量+1
noticeDao.updateViewCount(noticeId, 1, 1);
noticeDetailVO.setPageViewCount(noticeDetailVO.getPageViewCount() + 1);
noticeDetailVO.setUserViewCount(noticeDetailVO.getUserViewCount() + 1);
} else {
noticeDao.updateViewRecord(noticeId, requestEmployeeId, ip, userAgent);
// 该员工对于这个通知不是第一次查看 页面浏览量+1 用户浏览量+0
noticeDao.updateViewCount(noticeId, 1, 0);
noticeDetailVO.setPageViewCount(noticeDetailVO.getPageViewCount() + 1);
}
return ResponseDTO.ok(noticeDetailVO);

View File

@@ -60,8 +60,11 @@ public class EmployeeManager extends ServiceImpl<EmployeeDao, EmployeeEntity> {
// 保存员工 获得id
employeeDao.updateById(employee);
if (CollectionUtils.isNotEmpty(roleIdList)) {
List<RoleEmployeeEntity> roleEmployeeList = roleIdList.stream().map(e -> new RoleEmployeeEntity(e, employee.getEmployeeId())).collect(Collectors.toList());
if (CollectionUtils.isEmpty(roleIdList)) {
// 删除员工角色
this.updateEmployeeRole(employee.getEmployeeId(), null);
} else {
List<RoleEmployeeEntity> roleEmployeeList = roleIdList.stream().map(roleId -> new RoleEmployeeEntity(roleId, employee.getEmployeeId())).collect(Collectors.toList());
this.updateEmployeeRole(employee.getEmployeeId(), roleEmployeeList);
}
}

View File

@@ -12,6 +12,7 @@ import net.lab1024.sa.admin.module.system.role.domain.form.RoleEmployeeQueryForm
import net.lab1024.sa.admin.module.system.role.domain.vo.RoleEmployeeVO;
import java.util.List;
import java.util.Set;
/**
@@ -50,7 +51,7 @@ public interface RoleEmployeeDao extends BaseMapper<RoleEmployeeEntity> {
/**
* 查询角色下的人员id
*/
List<Long> selectEmployeeIdByRoleIdList(@Param("roleIdList") List<Long> roleIdList);
Set<Long> selectEmployeeIdByRoleIdList(@Param("roleIdList") List<Long> roleIdList);
/**
*
@@ -79,5 +80,10 @@ public interface RoleEmployeeDao extends BaseMapper<RoleEmployeeEntity> {
/**
* 批量删除某个角色下的某批用户的关联关系
*/
void batchDeleteEmployeeRole(@Param("roleId") Long roleId,@Param("employeeIds")List<Long> employeeIds);
void batchDeleteEmployeeRole(@Param("roleId") Long roleId, @Param("employeeIds") Set<Long> employeeIds);
/**
* 判断某个角色下是否存在用户
*/
Integer existsByRoleId(@Param("roleId") Long roleId);
}

View File

@@ -5,7 +5,7 @@ import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Set;
/**
* 角色的员工更新
@@ -25,6 +25,6 @@ public class RoleEmployeeUpdateForm {
@Schema(description = "员工id集合")
@NotEmpty(message = "员工id不能为空")
protected List<Long> employeeIdList;
protected Set<Long> employeeIdList;
}

View File

@@ -3,11 +3,7 @@ package net.lab1024.sa.admin.module.system.role.manager;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import net.lab1024.sa.admin.module.system.role.dao.RoleEmployeeDao;
import net.lab1024.sa.admin.module.system.role.domain.entity.RoleEmployeeEntity;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* 角色员工 manager
@@ -16,20 +12,9 @@ import java.util.List;
* @Date 2022-04-08 21:53:04
* @Wechat zhuoda1024
* @Email lab1024@163.com
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
*/
@Service
public class RoleEmployeeManager extends ServiceImpl<RoleEmployeeDao, RoleEmployeeEntity> {
/**
* 保存 角色员工
*
*/
@Transactional(rollbackFor = Throwable.class)
public void saveRoleEmployee(Long roleId, List<RoleEmployeeEntity> roleEmployeeList) {
this.getBaseMapper().deleteByRoleId(roleId);
if (CollectionUtils.isNotEmpty(roleEmployeeList)) {
this.saveBatch(roleEmployeeList);
}
}
}

View File

@@ -1,6 +1,7 @@
package net.lab1024.sa.admin.module.system.role.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Lists;
import net.lab1024.sa.admin.module.system.department.dao.DepartmentDao;
import net.lab1024.sa.admin.module.system.department.domain.entity.DepartmentEntity;
import net.lab1024.sa.admin.module.system.employee.domain.vo.EmployeeVO;
@@ -20,12 +21,12 @@ import net.lab1024.sa.base.common.util.SmartBeanUtil;
import net.lab1024.sa.base.common.util.SmartPageUtil;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
/**
@@ -88,7 +89,6 @@ public class RoleEmployeeService {
* 移除员工角色
*
*/
@Transactional(rollbackFor = Exception.class)
public ResponseDTO<String> removeRoleEmployee(Long employeeId, Long roleId) {
if (null == employeeId || null == roleId) {
return ResponseDTO.userErrorParam();
@@ -112,16 +112,21 @@ public class RoleEmployeeService {
*/
public ResponseDTO<String> batchAddRoleEmployee(RoleEmployeeUpdateForm roleEmployeeUpdateForm) {
Long roleId = roleEmployeeUpdateForm.getRoleId();
List<Long> employeeIdList = roleEmployeeUpdateForm.getEmployeeIdList();
// 保存新的角色员工
List<RoleEmployeeEntity> roleEmployeeList = null;
if (CollectionUtils.isNotEmpty(employeeIdList)) {
roleEmployeeList = employeeIdList.stream()
// 已选择的员工id列表
Set<Long> selectedEmployeeIdList = roleEmployeeUpdateForm.getEmployeeIdList();
// 数据库里已有的员工id列表
Set<Long> dbEmployeeIdList = roleEmployeeDao.selectEmployeeIdByRoleIdList(Lists.newArrayList(roleId));
// 从已选择的员工id列表里 过滤数据库里不存在的 即需要添加的员工 id
Set<Long> addEmployeeIdList = selectedEmployeeIdList.stream().filter(id -> !dbEmployeeIdList.contains(id)).collect(Collectors.toSet());
// 添加角色员工
if (CollectionUtils.isNotEmpty(addEmployeeIdList)) {
List<RoleEmployeeEntity> roleEmployeeList = addEmployeeIdList.stream()
.map(employeeId -> new RoleEmployeeEntity(roleId, employeeId))
.collect(Collectors.toList());
roleEmployeeManager.saveBatch(roleEmployeeList);
}
// 保存数据
roleEmployeeManager.saveRoleEmployee(roleId, roleEmployeeList);
return ResponseDTO.ok();
}

View File

@@ -65,6 +65,11 @@ public class RoleService {
if (null == roleEntity) {
return ResponseDTO.error(UserErrorCode.DATA_NOT_EXIST);
}
// 当没有员工绑定这个角色时才可以删除
Integer exists = roleEmployeeDao.existsByRoleId(roleId);
if (exists != null) {
return ResponseDTO.error(UserErrorCode.ALREADY_EXIST, "该角色下存在员工,无法删除");
}
roleDao.deleteById(roleId);
roleMenuDao.deleteByRoleId(roleId);
roleEmployeeDao.deleteByRoleId(roleId);
@@ -86,7 +91,7 @@ public class RoleService {
}
existRoleEntity = roleDao.getByRoleCode(roleUpdateForm.getRoleCode());
if (null != existRoleEntity) {
if (null != existRoleEntity && !existRoleEntity.getRoleId().equals(roleUpdateForm.getRoleId())) {
return ResponseDTO.userErrorParam("角色编码重复,重复的角色为:" + existRoleEntity.getRoleName());
}

View File

@@ -18,7 +18,7 @@
INSTR(goods_name,#{query.searchWord})
</if>
<if test="query.place != null">
AND place = #{query.place}
AND INSTR(place,#{query.place})
</if>
<if test="query.goodsStatus != null">
AND goods_status = #{query.goodsStatus}

View File

@@ -1,69 +0,0 @@
<?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="net.lab1024.sa.admin.module.business.notice.NoticeDao">
<update id="updateWatchAmount">
UPDATE t_notice
SET watch_amount = watch_amount + 1
WHERE notice_id = #{noticeId}
</update>
<update id="batchDeleteNotice">
UPDATE t_notice
SET deleted_flag = #{deletedFlag}
WHERE notice_id IN
<foreach collection="noticeIdList" open="(" close=")" separator="," item="item">
#{item}
</foreach>
</update>
<update id="updateNotice">
UPDATE t_notice
SET notice_type = #{noticeType},
notice_belong_type = #{noticeBelongType},
notice_title = #{noticeTitle},
notice_content = #{noticeContent},
link_address = #{linkAddress},
cover_file_key = #{coverFileKey},
accessory_file_keys = #{accessoryFileKeys},
top_flag = #{topFlag},
publish_time = #{publishTime},
disabled_flag = #{disabledFlag}
WHERE notice_id = #{noticeId}
</update>
<select id="queryPage" resultType="net.lab1024.sa.admin.module.business.oa.notice.domain.vo.NoticeVO">
SELECT t_notice.*,
t_employee.actual_name AS createUserName
FROM t_notice
LEFT JOIN t_employee ON t_notice.create_user_id = t_employee.employee_id
<where>
t_notice.deleted_flag = #{queryForm.deletedFlag}
<if test="queryForm.keywords != null and queryForm.keywords != ''">
AND (INSTR(t_notice.notice_title,#{queryForm.keywords}) OR INSTR(t_employee.actual_name,#{queryForm.keywords}))
</if>
<if test="queryForm.noticeType != null">
AND t_notice.notice_type = #{queryForm.noticeType}
</if>
<if test="queryForm.noticeBelongType != null">
AND t_notice.notice_belong_type = #{queryForm.noticeBelongType}
</if>
<if test="queryForm.startTime != null">
AND DATE_FORMAT(t_notice.publish_time, '%Y-%m-%d') &gt;= #{queryForm.startTime}
</if>
<if test="queryForm.endTime != null">
AND DATE_FORMAT(t_notice.publish_time, '%Y-%m-%d') &lt;= #{queryForm.endTime}
</if>
<if test="queryForm.disabledFlag != null">
AND t_notice.disabled_flag = #{queryForm.disabledFlag}
</if>
</where>
<if test="queryForm.sortItemList == null or queryForm.sortItemList.size == 0">
ORDER BY t_notice.top_flag DESC,t_notice.publish_time DESC
</if>
</select>
<select id="getDetail" resultType="net.lab1024.sa.admin.module.business.oa.notice.domain.vo.NoticeVO">
SELECT tn.*,
e.actual_name AS createUserName
FROM t_notice tn
LEFT JOIN t_employee e ON tn.create_user_id = e.employee_id
WHERE tn.notice_id = #{noticeId}
AND tn.deleted_flag = #{deletedFlag}
</select>
</mapper>

View File

@@ -242,5 +242,11 @@
where notice_id = #{noticeId}
and employee_id = #{employeeId}
</update>
<update id="updateViewCount">
update t_notice
set page_view_count = page_view_count + #{pageViewCountIncrement},
user_view_count = user_view_count + #{userViewCountIncrement}
where notice_id = #{noticeId}
</update>
</mapper>

View File

@@ -138,4 +138,12 @@
#{item}
</foreach>
</delete>
<select id="existsByRoleId" resultType="java.lang.Integer">
SELECT 1
FROM t_role_employee er
WHERE er.role_id = #{roleId}
LIMIT 1
</select>
</mapper>

View File

@@ -28,19 +28,19 @@ public class DictValueVoDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
List<DictValueVO> list = new ArrayList<>();
List<String> list = new ArrayList<>();
ObjectCodec objectCodec = jsonParser.getCodec();
JsonNode listOrObjectNode = objectCodec.readTree(jsonParser);
String deserialize = "";
try {
if (listOrObjectNode.isArray()) {
for (JsonNode node : listOrObjectNode) {
list.add(objectCodec.treeToValue(node, DictValueVO.class));
list.add(node.asText());
}
} else {
list.add(objectCodec.treeToValue(listOrObjectNode, DictValueVO.class));
list.add(listOrObjectNode.asText());
}
deserialize = list.stream().map(DictValueVO::getValueCode).collect(Collectors.joining(","));
deserialize = String.join(",", list);
} catch (Exception e) {
log.error(e.getMessage(), e);
deserialize = listOrObjectNode.asText();

View File

@@ -12,7 +12,6 @@ import org.apache.commons.collections4.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* 分页工具类
@@ -32,6 +31,10 @@ public class SmartPageUtil {
public static Page<?> convert2PageQuery(PageParam pageParam) {
Page<?> page = new Page<>(pageParam.getPageNum(), pageParam.getPageSize());
if (pageParam.getSearchCount() != null) {
page.setSearchCount(pageParam.getSearchCount());
}
List<PageParam.SortItem> sortItemList = pageParam.getSortItemList();
if (CollectionUtils.isEmpty(sortItemList)) {
return page;

View File

@@ -7,10 +7,12 @@ import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import com.alibaba.druid.support.spring.stat.DruidStatInterceptor;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import lombok.extern.slf4j.Slf4j;
import net.lab1024.sa.base.common.domain.DataScopePlugin;
import net.lab1024.sa.base.handler.MybatisPlusFillHandler;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.aop.support.DefaultPointcutAdvisor;
@@ -144,6 +146,8 @@ public class DataSourceConfig {
pluginsList.add(dataScopePlugin);
}
factoryBean.setPlugins(pluginsList.toArray(new Interceptor[pluginsList.size()]));
// 添加字段自动填充处理
factoryBean.setGlobalConfig(new GlobalConfig().setBanner(false).setMetaObjectHandler(new MybatisPlusFillHandler()));
return factoryBean.getObject();
}

View File

@@ -6,6 +6,7 @@ import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -43,7 +44,8 @@ public class RedisConfig {
.setSerializationInclusion(JsonInclude.Include.NON_NULL);
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
// enableDefaultTyping 官方已弃用 所以改为 activateDefaultTyping
om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);

View File

@@ -0,0 +1,40 @@
package net.lab1024.sa.base.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
/**
* Mybatis Plus 插入或者更新时指定字段设置值
*
* @author zhoumingfa
*/
@Component
@Slf4j
public class MybatisPlusFillHandler implements MetaObjectHandler {
public static final String CREATE_TIME = "createTime";
public static final String UPDATE_TIME = "updateTime";
@Override
public void insertFill(MetaObject metaObject) {
if (metaObject.hasSetter(CREATE_TIME)) {
this.fillStrategy(metaObject, CREATE_TIME, LocalDateTime.now());
}
if (metaObject.hasSetter(UPDATE_TIME)) {
this.fillStrategy(metaObject, UPDATE_TIME, LocalDateTime.now());
}
}
@Override
public void updateFill(MetaObject metaObject) {
if (metaObject.hasSetter(UPDATE_TIME)) {
this.fillStrategy(metaObject, UPDATE_TIME, LocalDateTime.now());
}
}
}

View File

@@ -41,7 +41,7 @@ public enum CodeFrontComponentEnum implements BaseEnum {
}
@Override
public Object getValue() {
public String getValue() {
return value;
}

View File

@@ -32,7 +32,6 @@ public class CodeGeneratorConfigForm {
@Schema(description = "表名")
private String tableName;
@Valid
@NotNull(message = "基础信息不能为空")
@Schema(description = "基础信息")

View File

@@ -39,8 +39,8 @@ public class CodeInsertAndUpdateField {
@Schema(description = "更新标识")
private Boolean updateFlag;
@SchemaEnum(value = CodeGeneratorPageTypeEnum.class)
@CheckEnum(value = CodeFrontComponentEnum.class, message = "3.增加、修改 增加、修改 组件类型 枚举值错误", required = true)
@SchemaEnum(value = CodeFrontComponentEnum.class)
@CheckEnum(value = CodeFrontComponentEnum.class, message = "3.增加、修改 组件类型 枚举值错误", required = true)
private String frontComponent;
}

View File

@@ -13,16 +13,13 @@ import net.lab1024.sa.base.common.util.SmartStringUtil;
import net.lab1024.sa.base.module.support.codegenerator.domain.entity.CodeGeneratorConfigEntity;
import net.lab1024.sa.base.module.support.codegenerator.domain.form.CodeGeneratorConfigForm;
import net.lab1024.sa.base.module.support.codegenerator.domain.model.*;
import net.lab1024.sa.base.module.support.codegenerator.service.variable.backend.ControllerVariableService;
import net.lab1024.sa.base.module.support.codegenerator.service.variable.backend.DaoVariableService;
import net.lab1024.sa.base.module.support.codegenerator.service.variable.backend.ManagerVariableService;
import net.lab1024.sa.base.module.support.codegenerator.service.variable.backend.ServiceVariableService;
import net.lab1024.sa.base.module.support.codegenerator.service.variable.CodeGenerateBaseVariableService;
import net.lab1024.sa.base.module.support.codegenerator.service.variable.backend.*;
import net.lab1024.sa.base.module.support.codegenerator.service.variable.backend.domain.*;
import net.lab1024.sa.base.module.support.codegenerator.service.variable.front.ApiVariableService;
import net.lab1024.sa.base.module.support.codegenerator.service.variable.front.ConstVariableService;
import net.lab1024.sa.base.module.support.codegenerator.service.variable.front.FormVariableService;
import net.lab1024.sa.base.module.support.codegenerator.service.variable.front.ListVariableService;
import net.lab1024.sa.base.module.support.codegenerator.service.variable.CodeGenerateBaseVariableService;
import net.lab1024.sa.base.module.support.codegenerator.util.CodeGeneratorTool;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.velocity.Template;
@@ -36,7 +33,7 @@ import javax.annotation.PostConstruct;
import java.io.File;
import java.io.OutputStream;
import java.io.StringWriter;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;
@@ -47,7 +44,7 @@ import java.util.stream.Collectors;
* @Date 2022-06-30 22:15:38
* @Wechat zhuoda1024
* @Email lab1024@163.com
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
*/
@Service
@@ -70,6 +67,8 @@ public class CodeGeneratorTemplateService {
map.put("java/manager/Manager.java", new ManagerVariableService());
map.put("java/dao/Dao.java", new DaoVariableService());
map.put("java/mapper/Mapper.xml", new MapperVariableService());
// 菜单 SQL
map.put("java/sql/Menu.sql", new MenuVariableService());
// 前端
map.put("js/api.js", new ApiVariableService());
map.put("js/const.js", new ConstVariableService());
@@ -94,6 +93,7 @@ public class CodeGeneratorTemplateService {
String fileName = templateFile.startsWith("java") ? upperCamel + templateSplit[templateSplit.length - 1] : lowerHyphen + "-" + templateSplit[templateSplit.length - 1];
String fullPathFileName = templateFile.replaceAll(templateSplit[templateSplit.length - 1], fileName);
fullPathFileName = fullPathFileName.replaceAll("java/", "java/" + basic.getModuleName().toLowerCase() + "/");
fullPathFileName = fullPathFileName.replaceAll("js/", "js/" + lowerHyphen + "/");
String fileContent = generate(tableName, templateFile, codeGeneratorConfigEntity);
File file = new File(uuid + "/" + fullPathFileName);
@@ -129,7 +129,7 @@ public class CodeGeneratorTemplateService {
}
ZipUtil.zip(outputStream, Charset.forName("utf-8"), false, null, dir);
ZipUtil.zip(outputStream, StandardCharsets.UTF_8, false, null, dir);
FileUtil.del(dir);

View File

@@ -2,6 +2,7 @@ package net.lab1024.sa.base.module.support.codegenerator.service.variable;
import com.google.common.base.CaseFormat;
import net.lab1024.sa.base.common.util.SmartStringUtil;
import net.lab1024.sa.base.module.support.codegenerator.constant.CodeFrontComponentEnum;
import net.lab1024.sa.base.module.support.codegenerator.domain.form.CodeGeneratorConfigForm;
import net.lab1024.sa.base.module.support.codegenerator.domain.model.CodeField;
import net.lab1024.sa.base.module.support.codegenerator.domain.model.CodeInsertAndUpdate;
@@ -17,7 +18,7 @@ import java.util.stream.Collectors;
* @Date 2022/9/29 17:20:41
* @Wechat zhuoda1024
* @Email lab1024@163.com
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
*/
public abstract class CodeGenerateBaseVariableService {
@@ -43,13 +44,13 @@ public abstract class CodeGenerateBaseVariableService {
String upperCamelName = CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_CAMEL, form.getBasic().getModuleName());
ArrayList<String> list = new ArrayList<>();
list.add("import " + form.getBasic().getJavaPackageName() + ".domain.entity." + upperCamelName + "Entity;" );
list.add("import " + form.getBasic().getJavaPackageName() + ".domain.entity." + upperCamelName + "Entity;");
list.add("import " + form.getBasic().getJavaPackageName() + ".domain.form." + upperCamelName + "AddForm;" );
list.add("import " + form.getBasic().getJavaPackageName() + ".domain.form." + upperCamelName + "UpdateForm;" );
list.add("import " + form.getBasic().getJavaPackageName() + ".domain.form." + upperCamelName + "QueryForm;" );
list.add("import " + form.getBasic().getJavaPackageName() + ".domain.form." + upperCamelName + "AddForm;");
list.add("import " + form.getBasic().getJavaPackageName() + ".domain.form." + upperCamelName + "UpdateForm;");
list.add("import " + form.getBasic().getJavaPackageName() + ".domain.form." + upperCamelName + "QueryForm;");
list.add("import " + form.getBasic().getJavaPackageName() + ".domain.vo." + upperCamelName + "VO;" );
list.add("import " + form.getBasic().getJavaPackageName() + ".domain.vo." + upperCamelName + "VO;");
return list;
}
@@ -88,43 +89,33 @@ public abstract class CodeGenerateBaseVariableService {
}
CodeInsertAndUpdateField field = first.get();
return SmartStringUtil.contains(field.getFrontComponent(), "Upload" );
return SmartStringUtil.equals(field.getFrontComponent(), CodeFrontComponentEnum.FILE_UPLOAD.getValue());
}
/**
* 是否为 枚举
* 是否为 字典
*/
protected boolean isDict(String columnName, CodeGeneratorConfigForm form) {
List<CodeField> fields = form.getFields();
if (CollectionUtils.isEmpty(fields)) {
return false;
}
Optional<CodeField> first = fields.stream().filter(e -> columnName.equals(e.getColumnName())).findFirst();
if (first.isPresent()) {
return false;
}
CodeField codeField = first.get();
return codeField.getDict() != null;
CodeField codeField = getCodeField(columnName, form);
return codeField != null && codeField.getDict() != null;
}
/**
* 是否为 枚举
*/
protected boolean isEnum(String columnName, CodeGeneratorConfigForm form) {
CodeField codeField = getCodeField(columnName, form);
return codeField != null && codeField.getEnumName() != null;
}
private CodeField getCodeField(String columnName, CodeGeneratorConfigForm form) {
List<CodeField> fields = form.getFields();
if (CollectionUtils.isEmpty(fields)) {
return false;
return null;
}
Optional<CodeField> first = fields.stream().filter(e -> columnName.equals(e.getColumnName())).findFirst();
if (first.isPresent()) {
return false;
}
CodeField codeField = first.get();
return codeField.getEnumName() != null;
return first.orElse(null);
}
/**

View File

@@ -0,0 +1,27 @@
package net.lab1024.sa.base.module.support.codegenerator.service.variable.backend;
import net.lab1024.sa.base.module.support.codegenerator.domain.form.CodeGeneratorConfigForm;
import net.lab1024.sa.base.module.support.codegenerator.service.variable.CodeGenerateBaseVariableService;
import java.util.HashMap;
import java.util.Map;
/**
* 目前暂时没用到 这是一个空实现
*
* @author zhoumingfa
* @date 2024/8/13
*/
public class MenuVariableService extends CodeGenerateBaseVariableService {
@Override
public boolean isSupport(CodeGeneratorConfigForm form) {
return true;
}
@Override
public Map<String, Object> getInjectVariablesMap(CodeGeneratorConfigForm form) {
return new HashMap<>(2);
}
}

View File

@@ -2,6 +2,7 @@ package net.lab1024.sa.base.module.support.codegenerator.service.variable.backen
import cn.hutool.core.bean.BeanUtil;
import net.lab1024.sa.base.common.util.SmartStringUtil;
import net.lab1024.sa.base.module.support.codegenerator.constant.CodeFrontComponentEnum;
import net.lab1024.sa.base.module.support.codegenerator.domain.form.CodeGeneratorConfigForm;
import net.lab1024.sa.base.module.support.codegenerator.domain.model.CodeField;
import net.lab1024.sa.base.module.support.codegenerator.domain.model.CodeInsertAndUpdate;
@@ -100,7 +101,6 @@ public class AddFormVariableService extends CodeGenerateBaseVariableService {
}
}
//字典
if (SmartStringUtil.isNotEmpty(codeField.getDict())) {
finalFieldMap.put("dict", "\n @JsonDeserialize(using = DictValueVoDeserializer.class)");
@@ -109,7 +109,7 @@ public class AddFormVariableService extends CodeGenerateBaseVariableService {
}
//文件上传
if (SmartStringUtil.contains(field.getFrontComponent(), "Upload")) {
if (CodeFrontComponentEnum.FILE_UPLOAD.equalsValue(field.getFrontComponent())) {
finalFieldMap.put("file", "\n @JsonDeserialize(using = FileKeyVoDeserializer.class)");
packageList.add("import com.fasterxml.jackson.databind.annotation.JsonDeserialize;");
packageList.add("import net.lab1024.sa.base.common.json.deserializer.FileKeyVoDeserializer;");

View File

@@ -14,7 +14,7 @@ import java.util.stream.Collectors;
* @Date 2022/9/29 17:20:41
* @Wechat zhuoda1024
* @Email lab1024@163.com
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
*/
public class EntityVariableService extends CodeGenerateBaseVariableService {
@@ -54,14 +54,21 @@ public class EntityVariableService extends CodeGenerateBaseVariableService {
// mybatis plus
result.add("import com.baomidou.mybatisplus.annotation.TableName;");
// 自动填充注解
boolean existCreateAndUpdate = fields.stream().anyMatch(e -> "create_time".equals(e.getColumnName()) || "update_time".equals(e.getColumnName()));
if (existCreateAndUpdate) {
result.add("import com.baomidou.mybatisplus.annotation.FieldFill;");
result.add("import com.baomidou.mybatisplus.annotation.TableField;");
}
//主键
boolean isExistPrimaryKey = fields.stream().filter(e -> e.getPrimaryKeyFlag() != null && e.getPrimaryKeyFlag()).findFirst().isPresent();
boolean isExistPrimaryKey = fields.stream().anyMatch(e -> e.getPrimaryKeyFlag() != null && e.getPrimaryKeyFlag());
if (isExistPrimaryKey) {
result.add("import com.baomidou.mybatisplus.annotation.TableId;");
}
//自增
boolean isExistAutoIncrease = fields.stream().filter(e -> e.getAutoIncreaseFlag() != null && e.getAutoIncreaseFlag()).findFirst().isPresent();
boolean isExistAutoIncrease = fields.stream().anyMatch(e -> e.getAutoIncreaseFlag() != null && e.getAutoIncreaseFlag());
if (isExistAutoIncrease) {
result.add("import com.baomidou.mybatisplus.annotation.IdType;");
}

View File

@@ -3,19 +3,20 @@ package net.lab1024.sa.base.module.support.codegenerator.service.variable.backen
import cn.hutool.core.bean.BeanUtil;
import net.lab1024.sa.base.module.support.codegenerator.constant.CodeQueryFieldQueryTypeEnum;
import net.lab1024.sa.base.module.support.codegenerator.domain.form.CodeGeneratorConfigForm;
import net.lab1024.sa.base.module.support.codegenerator.domain.model.CodeInsertAndUpdateField;
import net.lab1024.sa.base.module.support.codegenerator.domain.model.CodeQueryField;
import net.lab1024.sa.base.module.support.codegenerator.service.variable.CodeGenerateBaseVariableService;
import org.apache.commons.collections4.CollectionUtils;
import java.util.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Author 1024创新实验室-主任:卓大
* @Date 2022/9/29 17:20:41
* @Wechat zhuoda1024
* @Email lab1024@163.com
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
*/
public class MapperVariableService extends CodeGenerateBaseVariableService {
@@ -39,55 +40,47 @@ public class MapperVariableService extends CodeGenerateBaseVariableService {
List<String> columnNameList = queryField.getColumnNameList();
if (columnNameList.size() == 1) {
// AND INSTR(t_notice.title,#{query.keywords})
stringBuilder.append(" AND INSTR(" )
.append(form.getTableName()).append("." ).append(queryField.getColumnNameList().get(0))
.append(",#{queryForm." )
stringBuilder.append(" AND INSTR(")
.append(form.getTableName()).append(".").append(queryField.getColumnNameList().get(0))
.append(",#{queryForm.")
.append(queryField.getFieldName())
.append("})" );
.append("})");
} else {
for (int i = 0; i < columnNameList.size(); i++) {
if (i == 0) {
stringBuilder.append("AND ( INSTR(" )
.append(form.getTableName()).append("." ).append(queryField.getColumnNameList().get(i))
.append(",#{queryForm." )
stringBuilder.append("AND ( INSTR(")
.append(form.getTableName()).append(".").append(queryField.getColumnNameList().get(i))
.append(",#{queryForm.")
.append(queryField.getFieldName())
.append("})" );
.append("})");
} else {
// OR INSTR(t_notice.author,#{query.keywords})
stringBuilder.append("\n OR INSTR(" )
.append(form.getTableName()).append("." ).append(queryField.getColumnNameList().get(i))
.append(",#{queryForm." )
stringBuilder.append("\n OR INSTR(")
.append(form.getTableName()).append(".").append(queryField.getColumnNameList().get(i))
.append(",#{queryForm.")
.append(queryField.getFieldName())
.append("})" );
.append("})");
}
}
stringBuilder.append("\n )" );
stringBuilder.append("\n )");
}
fieldMap.put("likeStr", stringBuilder.toString());
}else{
fieldMap.put("columnName",queryField.getColumnNameList().get(0));
} else if (CodeQueryFieldQueryTypeEnum.DICT.equalsValue(queryField.getQueryTypeEnum())) {
String stringBuilder = "AND INSTR(" +
form.getTableName() + "." + queryField.getColumnNameList().get(0) +
",#{queryForm." +
queryField.getFieldName() +
"})";
fieldMap.put("likeStr", stringBuilder);
}
else {
fieldMap.put("columnName", queryField.getColumnNameList().get(0));
}
}
variablesMap.put("queryFields", finalQueryFiledList);
variablesMap.put("daoClassName", form.getBasic().getJavaPackageName() + ".dao." + form.getBasic().getModuleName() + "Dao" );
variablesMap.put("daoClassName", form.getBasic().getJavaPackageName() + ".dao." + form.getBasic().getModuleName() + "Dao");
return variablesMap;
}
public List<String> getPackageList(List<CodeInsertAndUpdateField> fields, CodeGeneratorConfigForm form) {
if (CollectionUtils.isEmpty(fields)) {
return new ArrayList<>();
}
HashSet<String> packageList = new HashSet<>();
//1、javabean相关的包
packageList.addAll(getJavaBeanImportClass(form));
//2、dao
packageList.add("import " + form.getBasic().getJavaPackageName() + ".dao." + form.getBasic().getModuleName() + "Dao;" );
return new ArrayList<>(packageList);
}
}

View File

@@ -2,6 +2,7 @@ package net.lab1024.sa.base.module.support.codegenerator.service.variable.backen
import cn.hutool.core.bean.BeanUtil;
import net.lab1024.sa.base.common.util.SmartEnumUtil;
import net.lab1024.sa.base.common.util.SmartStringUtil;
import net.lab1024.sa.base.module.support.codegenerator.constant.CodeQueryFieldQueryTypeEnum;
import net.lab1024.sa.base.module.support.codegenerator.domain.form.CodeGeneratorConfigForm;
import net.lab1024.sa.base.module.support.codegenerator.domain.model.CodeField;
@@ -18,7 +19,7 @@ import java.util.stream.Collectors;
* @Date 2022/9/29 17:20:41
* @Wechat zhuoda1024
* @Email lab1024@163.com
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
*/
public class QueryFormVariableService extends CodeGenerateBaseVariableService {
@@ -41,14 +42,11 @@ public class QueryFormVariableService extends CodeGenerateBaseVariableService {
public ImmutablePair<List<String>, List<Map<String, Object>>> getPackageListAndFields(CodeGeneratorConfigForm form) {
List<CodeQueryField> fields = form.getQueryFields();
if (CollectionUtils.isEmpty(fields)) {
return ImmutablePair.of(new ArrayList<>(), new ArrayList<>());
}
HashSet<String> packageList = new HashSet<>();
/**
* 1、LocalDate、LocalDateTime、BigDecimal 类型的包名
* 2、排序
@@ -75,9 +73,6 @@ public class QueryFormVariableService extends CodeGenerateBaseVariableService {
CodeField codeField = null;
switch (queryTypeEnum) {
case LIKE:
finalFieldMap.put("javaType", "String");
break;
case EQUAL:
codeField = getCodeFieldByColumnName(field.getColumnNameList().get(0), form);
if (codeField == null) {
@@ -109,6 +104,14 @@ public class QueryFormVariableService extends CodeGenerateBaseVariableService {
finalFieldMap.put("javaType", codeField.getJavaType());
break;
case DICT:
codeField = getCodeFieldByColumnName(field.getColumnNameList().get(0), form);
if (SmartStringUtil.isNotEmpty(codeField.getDict())) {
finalFieldMap.put("dict", "\n @JsonDeserialize(using = DictValueVoDeserializer.class)");
packageList.add("import com.fasterxml.jackson.databind.annotation.JsonDeserialize;");
packageList.add("import net.lab1024.sa.base.common.json.deserializer.DictValueVoDeserializer;");
}
finalFieldMap.put("javaType", "String");
default:
finalFieldMap.put("javaType", "String");
}
@@ -116,12 +119,11 @@ public class QueryFormVariableService extends CodeGenerateBaseVariableService {
finalFieldList.add(finalFieldMap);
}
// lombok
packageList.add("import lombok.Data;");
packageList.add("import lombok.EqualsAndHashCode;");
List<String> packageNameList = packageList.stream().filter(Objects::nonNull).collect(Collectors.toList());
Collections.sort(packageNameList);
List<String> packageNameList = packageList.stream().filter(Objects::nonNull).sorted().collect(Collectors.toList());
return ImmutablePair.of(packageNameList, finalFieldList);
}

View File

@@ -2,6 +2,7 @@ package net.lab1024.sa.base.module.support.codegenerator.service.variable.backen
import cn.hutool.core.bean.BeanUtil;
import net.lab1024.sa.base.common.util.SmartStringUtil;
import net.lab1024.sa.base.module.support.codegenerator.constant.CodeFrontComponentEnum;
import net.lab1024.sa.base.module.support.codegenerator.domain.form.CodeGeneratorConfigForm;
import net.lab1024.sa.base.module.support.codegenerator.domain.model.CodeField;
import net.lab1024.sa.base.module.support.codegenerator.domain.model.CodeInsertAndUpdate;
@@ -18,7 +19,7 @@ import java.util.stream.Collectors;
* @Date 2022/9/29 17:20:41
* @Wechat zhuoda1024
* @Email lab1024@163.com
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
*/
public class UpdateFormVariableService extends CodeGenerateBaseVariableService {
@@ -42,7 +43,7 @@ public class UpdateFormVariableService extends CodeGenerateBaseVariableService {
return false;
}
if(Boolean.TRUE.equals(codeField.getPrimaryKeyFlag())){
if (Boolean.TRUE.equals(codeField.getPrimaryKeyFlag())) {
e.setRequiredFlag(true);
}
@@ -123,7 +124,7 @@ public class UpdateFormVariableService extends CodeGenerateBaseVariableService {
}
//文件上传
if (SmartStringUtil.contains(field.getFrontComponent(), "Upload")) {
if (CodeFrontComponentEnum.FILE_UPLOAD.equalsValue(field.getFrontComponent())) {
finalFieldMap.put("file", "\n @JsonDeserialize(using = FileKeyVoDeserializer.class)");
packageList.add("import com.fasterxml.jackson.databind.annotation.JsonDeserialize;");
packageList.add("import net.lab1024.sa.base.common.json.deserializer.FileKeyVoDeserializer;");

View File

@@ -17,7 +17,7 @@ import java.util.stream.Collectors;
* @Date 2022/9/29 17:20:41
* @Wechat zhuoda1024
* @Email lab1024@163.com
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
*/
public class VOVariableService extends CodeGenerateBaseVariableService {
@@ -87,16 +87,16 @@ public class VOVariableService extends CodeGenerateBaseVariableService {
//字典
if (isDict(field.getColumnName(), form)) {
finalFieldMap.put("dict", "\n @JsonDeserialize(using = DictValueVoDeserializer.class)");
packageList.add("import com.fasterxml.jackson.databind.annotation.JsonDeserialize;");
packageList.add("import net.lab1024.sa.base.common.json.deserializer.DictValueVoDeserializer;");
finalFieldMap.put("dict", "\n @JsonSerialize(using = DictValueVoSerializer.class)");
packageList.add("import com.fasterxml.jackson.databind.annotation.JsonSerialize;");
packageList.add("import net.lab1024.sa.base.common.json.serializer.DictValueVoSerializer;");
}
//文件上传
if (isFile(field.getColumnName(), form)) {
finalFieldMap.put("file", "\n @JsonDeserialize(using = FileKeyVoDeserializer.class)");
packageList.add("import com.fasterxml.jackson.databind.annotation.JsonDeserialize;");
packageList.add("import net.lab1024.sa.base.common.json.deserializer.FileKeyVoDeserializer;");
finalFieldMap.put("file", "\n @JsonSerialize(using = FileKeyVoSerializer.class)");
packageList.add("import com.fasterxml.jackson.databind.annotation.JsonSerialize;");
packageList.add("import net.lab1024.sa.base.common.json.serializer.FileKeyVoSerializer;");
}
packageList.add(getJavaPackageName(codeField.getJavaType()));

View File

@@ -57,19 +57,20 @@ public class FormVariableService extends CodeGenerateBaseVariableService {
fieldsVariableList.add(objectMap);
if (CodeFrontComponentEnum.ENUM_SELECT.getValue().equals(field.getFrontComponent())) {
if (CodeFrontComponentEnum.ENUM_SELECT.equalsValue(field.getFrontComponent())) {
frontImportSet.add("import SmartEnumSelect from '/@/components/framework/smart-enum-select/index.vue';");
}
if (CodeFrontComponentEnum.BOOLEAN_SELECT.getValue().equals(field.getFrontComponent())) {
if (CodeFrontComponentEnum.BOOLEAN_SELECT.equalsValue(field.getFrontComponent())) {
frontImportSet.add("import BooleanSelect from '/@/components/framework/boolean-select/index.vue';");
}
if (CodeFrontComponentEnum.DICT_SELECT.getValue().equals(field.getFrontComponent())) {
if (CodeFrontComponentEnum.DICT_SELECT.equalsValue(field.getFrontComponent())) {
frontImportSet.add("import DictSelect from '/@/components/support/dict-select/index.vue';");
}
if (CodeFrontComponentEnum.FILE_UPLOAD.getValue().equals(field.getFrontComponent())) {
if (CodeFrontComponentEnum.FILE_UPLOAD.equalsValue(field.getFrontComponent())) {
frontImportSet.add("import { FILE_FOLDER_TYPE_ENUM } from '/@/constants/support/file-const';");
frontImportSet.add("import FileUpload from '/@/components/support/file-upload/index.vue';");
}
}

View File

@@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
import com.google.common.base.CaseFormat;
import net.lab1024.sa.base.module.support.codegenerator.constant.CodeQueryFieldQueryTypeEnum;
import net.lab1024.sa.base.module.support.codegenerator.domain.form.CodeGeneratorConfigForm;
import net.lab1024.sa.base.module.support.codegenerator.domain.model.CodeField;
import net.lab1024.sa.base.module.support.codegenerator.domain.model.CodeQueryField;
import net.lab1024.sa.base.module.support.codegenerator.service.variable.CodeGenerateBaseVariableService;
@@ -35,19 +36,23 @@ public class ListVariableService extends CodeGenerateBaseVariableService {
for (CodeQueryField queryField : queryFields) {
Map<String, Object> objectMap = BeanUtil.beanToMap(queryField);
variableList.add(objectMap);
if("Enum".equals(queryField.getQueryTypeEnum())){
CodeField codeField = getCodeFieldByColumnName(queryField.getColumnNameList().get(0), form);
objectMap.put("frontEnumName", codeField.getEnumName());
objectMap.put("dict", codeField.getDict());
if(CodeQueryFieldQueryTypeEnum.ENUM.equalsValue(queryField.getQueryTypeEnum())){
frontImportSet.add("import SmartEnumSelect from '/@/components/framework/smart-enum-select/index.vue';");
}
if("Dict".equals(queryField.getQueryTypeEnum())){
if(CodeQueryFieldQueryTypeEnum.DICT.equalsValue(queryField.getQueryTypeEnum())){
frontImportSet.add("import DictSelect from '/@/components/support/dict-select/index.vue';");
}
if(CodeQueryFieldQueryTypeEnum.DATE_RANGE.getValue().equals(queryField.getQueryTypeEnum())){
if(CodeQueryFieldQueryTypeEnum.DATE_RANGE.equalsValue(queryField.getQueryTypeEnum())){
frontImportSet.add("import { defaultTimeRanges } from '/@/lib/default-time-ranges';");
}
variableList.add(objectMap);
}
variablesMap.put("queryFields",variableList);

View File

@@ -142,6 +142,8 @@ public class SmartJobExecutor implements Runnable {
logEntity.setSuccessFlag(true);
// 执行开始时间
logEntity.setExecuteStartTime(executeTime);
logEntity.setExecuteEndTime(executeTime);
logEntity.setExecuteTimeMillis(0L);
logEntity.setCreateName(executorName);
logEntity.setIp(SmartIpUtil.getLocalFirstIp());
logEntity.setProcessId(SmartJobUtil.getProcessId());

View File

@@ -2,6 +2,7 @@ package ${packageName};
import lombok.AllArgsConstructor;
import lombok.Getter;
import net.lab1024.sa.base.common.enumeration.BaseEnum;
/**
* ${enumDesc}

View File

@@ -3,6 +3,7 @@ package ${packageName};
#foreach ($importClass in $importPackageList)
$importClass
#end
import cn.dev33.satoken.annotation.SaCheckPermission;
import net.lab1024.sa.base.common.domain.ResponseDTO;
import net.lab1024.sa.base.common.domain.PageResult;
import org.springframework.web.bind.annotation.PostMapping;
@@ -23,7 +24,7 @@ import javax.validation.Valid;
*/
@RestController
@Tag(name = "")
@Tag(name = "${basic.description}")
public class ${name.upperCamel}Controller {
@Resource
@@ -31,6 +32,7 @@ public class ${name.upperCamel}Controller {
@Operation(summary = "分页查询 @author ${basic.backendAuthor}")
@PostMapping("/${name.lowerCamel}/queryPage")
@SaCheckPermission("${name.lowerCamel}:query")
public ResponseDTO<PageResult<${name.upperCamel}VO>> queryPage(@RequestBody @Valid ${name.upperCamel}QueryForm queryForm) {
return ResponseDTO.ok(${name.lowerCamel}Service.queryPage(queryForm));
}
@@ -38,12 +40,14 @@ public class ${name.upperCamel}Controller {
#if($insertAndUpdate.isSupportInsertAndUpdate)
@Operation(summary = "添加 @author ${basic.backendAuthor}")
@PostMapping("/${name.lowerCamel}/add")
@SaCheckPermission("${name.lowerCamel}:add")
public ResponseDTO<String> add(@RequestBody @Valid ${name.upperCamel}AddForm addForm) {
return ${name.lowerCamel}Service.add(addForm);
}
@Operation(summary = "更新 @author ${basic.backendAuthor}")
@PostMapping("/${name.lowerCamel}/update")
@SaCheckPermission("${name.lowerCamel}:update")
public ResponseDTO<String> update(@RequestBody @Valid ${name.upperCamel}UpdateForm updateForm) {
return ${name.lowerCamel}Service.update(updateForm);
}
@@ -53,6 +57,7 @@ public class ${name.upperCamel}Controller {
#if($deleteInfo.deleteEnum == "Batch" || $deleteInfo.deleteEnum == "SingleAndBatch")
@Operation(summary = "批量删除 @author ${basic.backendAuthor}")
@PostMapping("/${name.lowerCamel}/batchDelete")
@SaCheckPermission("${name.lowerCamel}:delete")
public ResponseDTO<String> batchDelete(@RequestBody ValidateList<${primaryKeyJavaType}> idList) {
return ${name.lowerCamel}Service.batchDelete(idList);
}
@@ -61,6 +66,7 @@ public class ${name.upperCamel}Controller {
#if($deleteInfo.deleteEnum == "Single" || $deleteInfo.deleteEnum == "SingleAndBatch")
@Operation(summary = "单个删除 @author ${basic.backendAuthor}")
@GetMapping("/${name.lowerCamel}/delete/{${primaryKeyFieldName}}")
@SaCheckPermission("${name.lowerCamel}:delete")
public ResponseDTO<String> batchDelete(@PathVariable ${primaryKeyJavaType} ${primaryKeyFieldName}) {
return ${name.lowerCamel}Service.delete(${primaryKeyFieldName});
}

View File

@@ -38,14 +38,15 @@ public interface ${name.upperCamel}Dao extends BaseMapper<${name.upperCamel}Enti
* 更新删除状态
*/
long updateDeleted(@Param("${primaryKeyFieldName}")${primaryKeyJavaType} ${primaryKeyFieldName},@Param("${deletedFlag}")boolean deletedFlag);
#end
#if($deleteInfo.deleteEnum == "Batch" || $deleteInfo.deleteEnum == "SingleAndBatch")
/**
* 批量更新删除状态
*/
void batchUpdateDeleted(@Param("idList")List<${primaryKeyJavaType}> idList,@Param("${deletedFlag}")boolean deletedFlag);
#end
#end
#end
#end
#end
#end
}

View File

@@ -20,13 +20,19 @@ public class ${name.upperCamel}Entity {
/**
* $field.label
*/
#if($field.primaryKeyFlag && $field.autoIncreaseFlag)
#if($field.primaryKeyFlag && $field.autoIncreaseFlag)
@TableId(type = IdType.AUTO)
#end
#if($field.primaryKeyFlag && !$field.autoIncreaseFlag)
#end
#if($field.primaryKeyFlag && !$field.autoIncreaseFlag)
@TableId
#end
#end
#if($field.columnName == "create_time")
@TableField(fill = FieldFill.INSERT)
#end
#if($field.columnName == "update_time")
@TableField(fill = FieldFill.INSERT_UPDATE)
#end
private $field.javaType $field.fieldName;
#end
}
}

View File

@@ -14,7 +14,8 @@ $importClass
*/
@Data
public class ${name.upperCamel}QueryForm extends PageParam{
@EqualsAndHashCode(callSuper = false)
public class ${name.upperCamel}QueryForm extends PageParam {
#foreach ($field in $fields)
#if($field.isEnum)
@@ -35,4 +36,4 @@ public class ${name.upperCamel}QueryForm extends PageParam{
#end
#end
}
}

View File

@@ -17,14 +17,8 @@ public class ${name.upperCamel}VO {
#foreach ($field in $fields)
#if($field.isEnum)
${field.apiModelProperty}
${field.apiModelProperty}$!{field.notEmpty}$!{field.dict}$!{field.file}
private $field.javaType $field.fieldName;
#end
#if(!$field.isEnum)
${field.apiModelProperty}$!{field.dict}$!{field.file}
private $field.javaType $field.fieldName;
#end
#end
}
}

View File

@@ -2,10 +2,17 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="${daoClassName}">
<!-- 查询结果列 -->
<sql id="base_columns">
#foreach ($field in $fields)
${tableName}.${field.columnName}#if($foreach.hasNext),#end
#end
</sql>
<!-- 分页查询 -->
<select id="queryPage" resultType="${basic.javaPackageName}.domain.vo.${name.upperCamel}VO">
SELECT
*
<include refid="base_columns"/>
FROM ${tableName}
#if($queryFields.size() > 0)
<where>
@@ -16,22 +23,27 @@
${queryField.likeStr}
</if>
#end
#if(${queryField.queryTypeEnum} == "Equal" || ${queryField.queryTypeEnum} == "Enum" || ${queryField.queryTypeEnum} == "Dict")
#if(${queryField.queryTypeEnum} == "Dict")
<if test="queryForm.${queryField.fieldName} != null and queryForm.${queryField.fieldName} != ''">
${queryField.likeStr}
</if>
#end
#if(${queryField.queryTypeEnum} == "Equal" || ${queryField.queryTypeEnum} == "Enum")
<if test="queryForm.${queryField.fieldName} != null">
AND ${tableName}.${queryField.columnName} = #{queryForm.${queryField.fieldName}}
</if>
#end
#if(${queryField.queryTypeEnum} == "Date")
<if test="queryForm.${queryField.fieldName} != null">
AND DATE_FORMAT(${tableName}.${queryField.columnName}, '%Y-%m-%d') = #{queryForm.${queryField.fieldName}}
AND ${tableName}.${queryField.columnName} = #{queryForm.${queryField.fieldName}}
</if>
#end
#if(${queryField.queryTypeEnum} == "DateRange")
<if test="queryForm.${queryField.fieldName}Begin != null">
AND DATE_FORMAT(${tableName}.${queryField.columnName}, '%Y-%m-%d') &gt;= #{queryForm.${queryField.fieldName}Begin}
AND ${tableName}.${queryField.columnName} &gt;= #{queryForm.${queryField.fieldName}Begin}
</if>
<if test="queryForm.${queryField.fieldName}End != null">
AND DATE_FORMAT(${tableName}.${queryField.columnName}, '%Y-%m-%d') &lt;= #{queryForm.${queryField.fieldName}End}
AND ${tableName}.${queryField.columnName} &lt;= #{queryForm.${queryField.fieldName}End}
</if>
#end
#end
@@ -39,21 +51,10 @@
#end
</select>
#if($dao.deletedFieldUpperName != $null)
<update id="batchUpdate${dao.deletedFieldUpperName}">
update ${mapper.tableName} set ${mapper.deletedColumnName} = #{deletedFlag}
where ${mapper.mainKeyColumnName} in
<foreach collection="idList" open="(" close=")" separator="," item="item">
#{item}
</foreach>
</update>
#end
#if($deleteInfo.isSupportDelete)
### 假删除
#if(!${deleteInfo.isPhysicallyDeleted})
#if($deleteInfo.deleteEnum == "Batch" || $deleteInfo.deleteEnum == "SingleAndBatch")
<update id="batchUpdateDeleted">
update ${tableName} set deleted_flag = #{deletedFlag}
where ${primaryKeyColumnName} in
@@ -71,4 +72,5 @@
#end
#end
#end
</mapper>
</mapper>

View File

@@ -64,7 +64,7 @@ public class ${name.upperCamel}Service {
#end
#if($deleteInfo.isSupportDelete)
#if($deleteInfo.deleteEnum == "BATCH" || $deleteInfo.deleteEnum == "SingleAndBatch")
#if($deleteInfo.deleteEnum == "Batch" || $deleteInfo.deleteEnum == "SingleAndBatch")
/**
* 批量删除
*
@@ -97,7 +97,7 @@ public class ${name.upperCamel}Service {
### 真删除 or 假删除
#if(!${deleteInfo.isPhysicallyDeleted})
${name.lowerCamel}Dao.updateDeleted(${primaryKeyFieldName},true);
${name.lowerCamel}Dao.updateDeleted(${primaryKeyFieldName}, true);
#end
#if(${deleteInfo.isPhysicallyDeleted})
${name.lowerCamel}Dao.deleteById(${primaryKeyFieldName});

View File

@@ -0,0 +1,22 @@
# 默认是按前端工程文件的 /views/business 文件夹的路径作为前端组件路径,如果你没把生成的 .vue 前端代码放在 /views/business 下,
# 那就根据自己实际情况修改下面 SQL 的 path,component 字段值,避免执行 SQL 后菜单无法访问。
# 如果你一切都是按照默认,那么下面的 SQL 基本不用改
INSERT INTO t_menu ( menu_name, menu_type, parent_id, path, component, frame_flag, cache_flag, visible_flag, disabled_flag, perms_type, create_user_id )
VALUES ( '${basic.description}', 2, 0, '/${name.lowerHyphenCamel}/list', '/business/${name.lowerHyphenCamel}/${name.lowerHyphenCamel}-list.vue', false, false, true, false, 1, 1 );
# 按菜单名称查询该菜单的 menu_id 作为按钮权限的 父菜单ID 与 功能点关联菜单ID
SET @parent_id = NULL;
SELECT t_menu.menu_id INTO @parent_id FROM t_menu WHERE t_menu.menu_name = '${basic.description}';
INSERT INTO t_menu ( menu_name, menu_type, parent_id, frame_flag, cache_flag, visible_flag, disabled_flag, api_perms, perms_type, context_menu_id, create_user_id )
VALUES ( '查询', 3, @parent_id, false, true, true, false, '${name.lowerCamel}:query', 1, @parent_id, 1 );
INSERT INTO t_menu ( menu_name, menu_type, parent_id, frame_flag, cache_flag, visible_flag, disabled_flag, api_perms, perms_type, context_menu_id, create_user_id )
VALUES ( '添加', 3, @parent_id, false, true, true, false, '${name.lowerCamel}:add', 1, @parent_id, 1 );
INSERT INTO t_menu ( menu_name, menu_type, parent_id, frame_flag, cache_flag, visible_flag, disabled_flag, api_perms, perms_type, context_menu_id, create_user_id )
VALUES ( '更新', 3, @parent_id, false, true, true, false, '${name.lowerCamel}:update', 1, @parent_id, 1 );
INSERT INTO t_menu ( menu_name, menu_type, parent_id, frame_flag, cache_flag, visible_flag, disabled_flag, api_perms, perms_type, context_menu_id, create_user_id )
VALUES ( '删除', 3, @parent_id, false, true, true, false, '${name.lowerCamel}:delete', 1, @parent_id, 1 );

View File

@@ -8,7 +8,7 @@
<template>
<a-$!{insertAndUpdate.pageType}
:title="form.$!{primaryKeyFieldName} ? '编辑' : '添加'"
width="$!{insertAndUpdate.width}"
:width="$!{insertAndUpdate.width}"
:open="visibleFlag"
#if($!{insertAndUpdate.pageType} == 'drawer')
@close="onClose"
@@ -19,124 +19,121 @@
:destroyOnClose="true"
>
<a-form ref="formRef" :model="form" :rules="rules" :label-col="{ span: 5 }" >
#if($insertAndUpdate.countPerLine == 1)
<a-row>
#foreach ($field in $formFields)
#if($field.frontComponent == "Input")
<a-form-item label="$!{field.label}" name="${field.fieldName}">
<a-input style="width: 100%" v-model:value="form.${field.fieldName}" placeholder="$!{field.label}" />
</a-form-item>
#end
#if($field.frontComponent == "InputNumber")
<a-form-item label="$!{field.label}" name="${field.fieldName}">
<a-input-number style="width: 100%" v-model:value="form.${field.fieldName}" placeholder="$!{field.label}" />
</a-form-item>
#end
#if($field.frontComponent == "Textarea")
<a-form-item label="$!{field.label}" name="${field.fieldName}">
<a-textarea style="width: 100%" v-model:value="form.${field.fieldName}" placeholder="$!{field.label}" />
</a-form-item>
#end
#if($field.frontComponent == "BooleanSelect")
<a-form-item label="$!{field.label}" name="${field.fieldName}">
<BooleanSelect v-model:value="form.${field.fieldName}" style="width: 100%" />
</a-form-item>
#end
#if($field.frontComponent == "SmartEnumSelect")
<a-form-item label="$codeGeneratorTool.removeEnumDesc($!{field.label})" name="${field.fieldName}">
<SmartEnumSelect width="100%" v-model:value="form.${field.fieldName}" enumName="$!{field.upperUnderscoreEnum}" placeholder="$codeGeneratorTool.removeEnumDesc($!{field.label})"/>
</a-form-item>
#end
#if($field.frontComponent == "DictSelect")
<a-form-item label="$codeGeneratorTool.removeEnumDesc($!{field.label})" name="${field.fieldName}">
<DictSelect width="100%" v-model:value="form.${field.fieldName}" keyCode="$!{field.dict}" placeholder="$!{field.label}"/>
</a-form-item>
#end
#if($field.frontComponent == "Date")
<a-form-item label="$!{field.label}" name="${field.fieldName}">
<a-date-picker valueFormat="YYYY-MM-DD" v-model:value="form.$!{field.fieldName}" style="width: 100%" placeholder="$!{field.label}"/>
</a-form-item>
#end
#if($field.frontComponent == "DateTime")
<a-form-item label="$!{field.label}" name="${field.fieldName}">
<a-date-picker show-time valueFormat="YYYY-MM-DD HH:mm:ss" v-model:value="form.$!{field.fieldName}" style="width: 100%" placeholder="$!{field.label}" />
</a-form-item>
#end
#if($field.frontComponent == "Upload")
<a-form-item label="$!{field.label}" name="${field.fieldName}">
<FileUpload
:defaultFileList="form.$!{field.fieldName}"
:folder="FILE_FOLDER_TYPE_ENUM.COMMON.value"
buttonText="上传 $!{field.label}"
listType="text"
@change="e => form.$!{field.fieldName} = e"
/>
</a-form-item>
#end
#end
</a-row>
#if($insertAndUpdate.countPerLine == 1)
#foreach ($field in $formFields)
#if($field.frontComponent == "Input")
<a-form-item label="$!{field.label}" name="${field.fieldName}">
<a-input style="width: 100%" v-model:value="form.${field.fieldName}" placeholder="$!{field.label}" />
</a-form-item>
#end
#if($field.frontComponent == "InputNumber")
<a-form-item label="$!{field.label}" name="${field.fieldName}">
<a-input-number style="width: 100%" v-model:value="form.${field.fieldName}" placeholder="$!{field.label}" />
</a-form-item>
#end
#if($field.frontComponent == "Textarea")
<a-form-item label="$!{field.label}" name="${field.fieldName}">
<a-textarea style="width: 100%" v-model:value="form.${field.fieldName}" placeholder="$!{field.label}" />
</a-form-item>
#end
#if($field.frontComponent == "BooleanSelect")
<a-form-item label="$!{field.label}" name="${field.fieldName}">
<BooleanSelect v-model:value="form.${field.fieldName}" style="width: 100%" />
</a-form-item>
#end
#if($field.frontComponent == "SmartEnumSelect")
<a-form-item label="$codeGeneratorTool.removeEnumDesc($!{field.label})" name="${field.fieldName}">
<SmartEnumSelect width="100%" v-model:value="form.${field.fieldName}" enumName="$!{field.upperUnderscoreEnum}" placeholder="$codeGeneratorTool.removeEnumDesc($!{field.label})"/>
</a-form-item>
#end
#if($field.frontComponent == "DictSelect")
<a-form-item label="$codeGeneratorTool.removeEnumDesc($!{field.label})" name="${field.fieldName}">
<DictSelect width="100%" v-model:value="form.${field.fieldName}" keyCode="$!{field.dict}" placeholder="$!{field.label}"/>
</a-form-item>
#end
#if($field.frontComponent == "Date")
<a-form-item label="$!{field.label}" name="${field.fieldName}">
<a-date-picker valueFormat="YYYY-MM-DD" v-model:value="form.$!{field.fieldName}" style="width: 100%" placeholder="$!{field.label}"/>
</a-form-item>
#end
#if($field.frontComponent == "DateTime")
<a-form-item label="$!{field.label}" name="${field.fieldName}">
<a-date-picker show-time valueFormat="YYYY-MM-DD HH:mm:ss" v-model:value="form.$!{field.fieldName}" style="width: 100%" placeholder="$!{field.label}" />
</a-form-item>
#end
#if($field.frontComponent == "FileUpload")
<a-form-item label="$!{field.label}" name="${field.fieldName}">
<FileUpload
:defaultFileList="form.$!{field.fieldName}"
:folder="FILE_FOLDER_TYPE_ENUM.COMMON.value"
buttonText="上传 $!{field.label}"
listType="text"
@change="e => form.$!{field.fieldName} = e"
/>
</a-form-item>
#end
#end
#end
#if($insertAndUpdate.countPerLine > 1)
<a-row>
#set($span=24 / $!insertAndUpdate.countPerLine )
#foreach ($field in $formFields)
<a-col :span="$!{span}">
#if($field.frontComponent == "Input")
<a-form-item label="$!{field.label}" name="${field.fieldName}">
<a-input style="width: 100%" v-model:value="form.${field.fieldName}" placeholder="$!{field.label}" />
</a-form-item>
#end
#if($insertAndUpdate.countPerLine > 1)
<a-row>
#set($span=24 / $!insertAndUpdate.countPerLine )
#foreach ($field in $formFields)
<a-col :span="$!{span}">
#if($field.frontComponent == "Input")
<a-form-item label="$!{field.label}" name="${field.fieldName}">
<a-input style="width: 100%" v-model:value="form.${field.fieldName}" placeholder="$!{field.label}" />
</a-form-item>
#end
#if($field.frontComponent == "InputNumber")
<a-form-item label="$!{field.label}" name="${field.fieldName}">
<a-input-number style="width: 100%" v-model:value="form.${field.fieldName}" placeholder="$!{field.label}" />
</a-form-item>
#end
#if($field.frontComponent == "Textarea")
<a-form-item label="$!{field.label}" name="${field.fieldName}">
<a-textarea style="width: 100%" v-model:value="form.${field.fieldName}" placeholder="$!{field.label}" />
</a-form-item>
#end
#if($field.frontComponent == "BooleanSelect")
<a-form-item label="$!{field.label}" name="${field.fieldName}">
<BooleanSelect v-model:value="form.${field.fieldName}" style="width: 100%" />
</a-form-item>
#end
#if($field.frontComponent == "SmartEnumSelect")
<a-form-item label="$codeGeneratorTool.removeEnumDesc($!{field.label})" name="${field.fieldName}">
<SmartEnumSelect width="100%" v-model:value="form.${field.fieldName}" enumName="$!{field.upperUnderscoreEnum}" placeholder="$codeGeneratorTool.removeEnumDesc($!{field.label})"/>
</a-form-item>
#end
#if($field.frontComponent == "DictSelect")
<a-form-item label="$codeGeneratorTool.removeEnumDesc($!{field.label})" name="${field.fieldName}">
<DictSelect width="100%" v-model:value="form.${field.fieldName}" keyCode="$!{field.dict}" placeholder="$!{field.label}"/>
</a-form-item>
#end
#if($field.frontComponent == "Date")
<a-form-item label="$!{field.label}" name="${field.fieldName}">
<a-date-picker valueFormat="YYYY-MM-DD" v-model:value="form.$!{field.fieldName}" style="width: 100%" placeholder="$!{field.label}"/>
</a-form-item>
#end
#if($field.frontComponent == "DateTime")
<a-form-item label="$!{field.label}" name="${field.fieldName}">
<a-date-picker show-time valueFormat="YYYY-MM-DD HH:mm:ss" v-model:value="form.$!{field.fieldName}" style="width: 100%" placeholder="$!{field.label}" />
</a-form-item>
#end
#if($field.frontComponent == "Upload")
<a-form-item label="$!{field.label}" name="${field.fieldName}">
<FileUpload
:defaultFileList="form.$!{field.fieldName}"
:folder="FILE_FOLDER_TYPE_ENUM.COMMON.value"
buttonText="上传 $!{field.label}"
listType="text"
@change="e => form.$!{field.fieldName} = e"
/>
</a-form-item>
#end
</a-col>
#end
</a-row>
#if($field.frontComponent == "InputNumber")
<a-form-item label="$!{field.label}" name="${field.fieldName}">
<a-input-number style="width: 100%" v-model:value="form.${field.fieldName}" placeholder="$!{field.label}" />
</a-form-item>
#end
#if($field.frontComponent == "Textarea")
<a-form-item label="$!{field.label}" name="${field.fieldName}">
<a-textarea style="width: 100%" v-model:value="form.${field.fieldName}" placeholder="$!{field.label}" />
</a-form-item>
#end
#if($field.frontComponent == "BooleanSelect")
<a-form-item label="$!{field.label}" name="${field.fieldName}">
<BooleanSelect v-model:value="form.${field.fieldName}" style="width: 100%" />
</a-form-item>
#end
#if($field.frontComponent == "SmartEnumSelect")
<a-form-item label="$codeGeneratorTool.removeEnumDesc($!{field.label})" name="${field.fieldName}">
<SmartEnumSelect width="100%" v-model:value="form.${field.fieldName}" enumName="$!{field.upperUnderscoreEnum}" placeholder="$codeGeneratorTool.removeEnumDesc($!{field.label})"/>
</a-form-item>
#end
#if($field.frontComponent == "DictSelect")
<a-form-item label="$codeGeneratorTool.removeEnumDesc($!{field.label})" name="${field.fieldName}">
<DictSelect width="100%" v-model:value="form.${field.fieldName}" keyCode="$!{field.dict}" placeholder="$!{field.label}"/>
</a-form-item>
#end
#if($field.frontComponent == "Date")
<a-form-item label="$!{field.label}" name="${field.fieldName}">
<a-date-picker valueFormat="YYYY-MM-DD" v-model:value="form.$!{field.fieldName}" style="width: 100%" placeholder="$!{field.label}"/>
</a-form-item>
#end
#if($field.frontComponent == "DateTime")
<a-form-item label="$!{field.label}" name="${field.fieldName}">
<a-date-picker show-time valueFormat="YYYY-MM-DD HH:mm:ss" v-model:value="form.$!{field.fieldName}" style="width: 100%" placeholder="$!{field.label}" />
</a-form-item>
#end
#if($field.frontComponent == "FileUpload")
<a-form-item label="$!{field.label}" name="${field.fieldName}">
<FileUpload
:defaultFileList="form.$!{field.fieldName}"
:folder="FILE_FOLDER_TYPE_ENUM.COMMON.value"
buttonText="上传 $!{field.label}"
listType="text"
@change="e => form.$!{field.fieldName} = e"
/>
</a-form-item>
#end
</a-col>
#end
</a-row>
#end
</a-form>
<template #footer>
@@ -154,9 +151,9 @@
import { SmartLoading } from '/@/components/framework/smart-loading';
import { $!{name.lowerCamel}Api } from '/@/api/business/$!{name.lowerHyphenCamel}/$!{name.lowerHyphenCamel}-api';
import { smartSentry } from '/@/lib/smart-sentry';
#foreach ($import in $frontImportList)
$!{import}
#end
#foreach ($import in $frontImportList)
$!{import}
#end
// ------------------------ 事件 ------------------------
@@ -171,6 +168,10 @@
if (rowData && !_.isEmpty(rowData)) {
Object.assign(form, rowData);
}
// 使用字典时把下面这注释修改成自己的字典字段 有多个字典字段就复制多份同理修改 不然打开表单时不显示字典初始值
// if (form.status && form.status.length > 0) {
// form.status = form.status.map((e) => e.valueCode);
// }
visibleFlag.value = true;
nextTick(() => {
formRef.value.clearValidate();
@@ -188,9 +189,8 @@
const formRef = ref();
const formDefault = {
$!{primaryKeyFieldName}: undefined,
#foreach ($field in $formFields)
$!{field.fieldName}: undefined, //$!{field.label}
$!{field.fieldName}: undefined, //$!{field.label}
#end
};
@@ -198,9 +198,9 @@
const rules = {
#foreach ($field in $formFields)
#if($field.requiredFlag)
$!{field.fieldName}: [{ required: true, message: '$!{field.label} 必填' }],
#end
#if($field.requiredFlag)
$!{field.fieldName}: [{ required: true, message: '$!{field.label} 必填' }],
#end
#end
};

View File

@@ -72,7 +72,7 @@
</a-button>
#end
#if($deleteInfo.isSupportDelete && ($deleteInfo.deleteEnum == "Batch"||$deleteInfo.deleteEnum == "SingleAndBatch"))
<a-button @click="confirmBatchDelete" type="danger" size="small" :disabled="selectedRowKeyList.length == 0">
<a-button @click="confirmBatchDelete" type="primary" danger size="small" :disabled="selectedRowKeyList.length == 0">
<template #icon>
<DeleteOutlined />
</template>
@@ -88,18 +88,32 @@
<!---------- 表格 begin ----------->
<a-table
size="small"
:dataSource="tableData"
:columns="columns"
rowKey="$!{primaryKeyFieldName}"
bordered
:loading="tableLoading"
:pagination="false"
size="small"
:dataSource="tableData"
:columns="columns"
rowKey="$!{primaryKeyFieldName}"
bordered
:loading="tableLoading"
:pagination="false"
#if($deleteInfo.isSupportDelete && ($deleteInfo.deleteEnum == "Batch"||$deleteInfo.deleteEnum == "SingleAndBatch"))
:row-selection="{ selectedRowKeys: selectedRowKeyList, onChange: onSelectChange }"
:row-selection="{ selectedRowKeys: selectedRowKeyList, onChange: onSelectChange }"
#end
>
<template #bodyCell="{ text, record, column }">
<!-- 有图片预览时 注释解开并把下面的'picture'修改成自己的图片字段名即可 -->
<!-- <template v-if="column.dataIndex === 'picture'">
<FilePreview :fileList="text" type="picture" />
</template> -->
<!-- 使用字典时 注释解开并把下面的'dict'修改成自己的字典字段名即可 有多个字典字段就复制多份同理修改 不然不显示字典 -->
<!-- 方便修改tag的颜色 orange green purple success processing error default warning -->
<!-- <template v-if="column.dataIndex === 'dict'">
<a-tag color="cyan">
{{ text && text.length > 0 ? text.map((e) => e.valueName).join(',') : '暂无' }}
</a-tag>
</template> -->
<template v-if="column.dataIndex === 'action'">
<div class="smart-table-operate">
#if($insertAndUpdate.isSupportInsertAndUpdate)
@@ -116,17 +130,17 @@
<div class="smart-query-table-page">
<a-pagination
showSizeChanger
showQuickJumper
show-less-items
:pageSizeOptions="PAGE_SIZE_OPTIONS"
:defaultPageSize="queryForm.pageSize"
v-model:current="queryForm.pageNum"
v-model:pageSize="queryForm.pageSize"
:total="total"
@change="queryData"
@showSizeChange="queryData"
:show-total="(total) => `共${total}条`"
showSizeChanger
showQuickJumper
show-less-items
:pageSizeOptions="PAGE_SIZE_OPTIONS"
:defaultPageSize="queryForm.pageSize"
v-model:current="queryForm.pageNum"
v-model:pageSize="queryForm.pageSize"
:total="total"
@change="queryData"
@showSizeChange="queryData"
:show-total="(total) => `共${total}条`"
/>
</div>
@@ -145,6 +159,8 @@
#foreach ($import in $frontImportList)
$!{import}
#end
//import FilePreview from '/@/components/support/file-preview/index.vue'; // 图片预览组件
// ---------------------------- 表格列 ----------------------------
const columns = ref([