diff --git a/README.md b/README.md index 155c4c7a4..0f38300de 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,10 @@ * 查看ruoyi-framework模块的pom.xml文件,根据注释更改依赖 * 查看ruoyi-admin模块中的application.yml文件,根据注释更改配置 +关于如何创建新模块 +* 参考ruoyi-demo模块 +* 需要改动: 父pom 与 admin模块pom + ## 修改RuoYi功能 * ORM框架 使用 Mybatis-Plus 简化CRUD @@ -17,16 +21,19 @@ * 代码生成模板 改为适配 Mybatis-Plus 的代码 * 项目修改为 maven多环境配置 * 重磅更新 升级MybatisPlus 3.4.1 重写配置文件详细注释 更新所有插件 +* 增加demo模块示例(给不会增加模块的小伙伴做参考) * 同步升级 3.3 ## 平台简介 +若依是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。 + * 前端采用Vue、Element UI。 * 后端采用Spring Boot、Spring Security、Redis & Jwt。 * 权限认证使用Jwt,支持多终端认证系统。 * 支持加载动态权限菜单,多方式轻松权限控制。 * 高效率开发,使用代码生成器可以一键生成前后端代码。 -* 提供了一个Oracle版本[RuoYi-Vue-Oracle](https://github.com/yangzongzhuan/RuoYi-Vue-Oracle),保持同步更新。 +* 提供了单应用版本[RuoYi-Vue-fast](https://github.com/yangzongzhuan/RuoYi-Vue-fast),Oracle版本[RuoYi-Vue-Oracle](https://github.com/yangzongzhuan/RuoYi-Vue-Oracle),保持同步更新。 * 不分离版本,请移步[RuoYi](https://gitee.com/y_project/RuoYi),微服务版本,请移步[RuoYi-Cloud](https://gitee.com/y_project/RuoYi-Cloud) ## 内置功能 diff --git a/pom.xml b/pom.xml index ddc83cbdd..7af6e30fe 100644 --- a/pom.xml +++ b/pom.xml @@ -43,7 +43,7 @@ org.springframework.boot spring-boot-dependencies - 2.1.18.RELEASE + 2.2.12.RELEASE pom import @@ -224,6 +224,13 @@ ${ruoyi.version} + + + com.ruoyi + ruoyi-demo + ${ruoyi.version} + + @@ -234,6 +241,7 @@ ruoyi-quartz ruoyi-generator ruoyi-common + ruoyi-demo pom diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index c9a91cf11..172c58892 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -66,6 +66,12 @@ ruoyi-generator + + + com.ruoyi + ruoyi-demo + + diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml index 8c34d9045..f16b4075e 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -61,6 +61,8 @@ spring: host: 127.0.0.1 # 端口,默认为6379 port: 6379 + # 数据库索引 + database: 0 # 密码 password: # 连接超时时间 diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml index 8e2a891ce..3c53578b5 100644 --- a/ruoyi-admin/src/main/resources/application-prod.yml +++ b/ruoyi-admin/src/main/resources/application-prod.yml @@ -61,6 +61,8 @@ spring: host: 127.0.0.1 # 端口,默认为6379 port: 6379 + # 数据库索引 + database: 0 # 密码 password: # 连接超时时间 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java index bfe119e46..50482c572 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java @@ -149,7 +149,7 @@ public @interface Excel public enum ColumnType { - NUMERIC(0), STRING(1); + NUMERIC(0), STRING(1), IMAGE(2); private final int value; ColumnType(int value) diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java index 9cb46cc77..40a4d6379 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java @@ -29,8 +29,10 @@ public class GenConstants public static final String PARENT_MENU_NAME = "parentMenuName"; /** 数据库字符串类型 */ - public static final String[] COLUMNTYPE_STR = { "char", "varchar", "nvarchar", "varchar2", "tinytext", "text", - "mediumtext", "longtext" }; + public static final String[] COLUMNTYPE_STR = { "char", "varchar", "nvarchar", "varchar2" }; + + /** 数据库文本类型 */ + public static final String[] COLUMNTYPE_TEXT = { "tinytext", "text", "mediumtext", "longtext" }; /** 数据库时间类型 */ public static final String[] COLUMNTYPE_TIME = { "datetime", "time", "date", "timestamp" }; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java b/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java index 15a6804f2..3698c75c3 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java @@ -29,8 +29,8 @@ public class RepeatableFilter implements Filter throws IOException, ServletException { ServletRequest requestWrapper = null; - if (request instanceof HttpServletRequest && StringUtils.equalsAnyIgnoreCase(request.getContentType(), - MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_JSON_UTF8_VALUE)) + if (request instanceof HttpServletRequest + && StringUtils.equalsAnyIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE)) { requestWrapper = new RepeatedlyRequestWrapper((HttpServletRequest) request, response); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java b/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java index 17bfec1d2..3c9efb29b 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java @@ -99,7 +99,6 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper public boolean isJsonRequest() { String header = super.getHeader(HttpHeaders.CONTENT_TYPE); - return MediaType.APPLICATION_JSON_VALUE.equalsIgnoreCase(header) - || MediaType.APPLICATION_JSON_UTF8_VALUE.equalsIgnoreCase(header); + return MediaType.APPLICATION_JSON_VALUE.equalsIgnoreCase(header); } } \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java index 65be65b4a..25f530666 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java @@ -44,4 +44,33 @@ public class FileTypeUtils } return fileName.substring(separatorIndex + 1).toLowerCase(); } + + /** + * 获取文件类型 + * + * @param photoByte 文件字节码 + * @return 后缀(不含".") + */ + public static String getFileExtendName(byte[] photoByte) + { + String strFileExtendName = "JPG"; + if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56) + && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) + { + strFileExtendName = "GIF"; + } + else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70)) + { + strFileExtendName = "JPG"; + } + else if ((photoByte[0] == 66) && (photoByte[1] == 77)) + { + strFileExtendName = "BMP"; + } + else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71)) + { + strFileExtendName = "PNG"; + } + return strFileExtendName; + } } \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java new file mode 100644 index 000000000..411ef15e0 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java @@ -0,0 +1,100 @@ +package com.ruoyi.common.utils.file; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.FileInputStream; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.util.Arrays; +import org.apache.poi.util.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.utils.StringUtils; + +/** + * 图片处理工具类 + * + * @author ruoyi + */ +public class ImageUtils +{ + private static final Logger log = LoggerFactory.getLogger(ImageUtils.class); + + public static byte[] getImage(String imagePath) + { + InputStream is = getFile(imagePath); + try + { + return IOUtils.toByteArray(is); + } + catch (Exception e) + { + log.error("图片加载异常 {}", e); + return null; + } + finally + { + IOUtils.closeQuietly(is); + } + } + + public static InputStream getFile(String imagePath) + { + try + { + byte[] result = readFile(imagePath); + result = Arrays.copyOf(result, result.length); + return new ByteArrayInputStream(result); + } + catch (Exception e) + { + log.error("获取图片异常 {}", e); + } + return null; + } + + /** + * 读取文件为字节数据 + * + * @param key 地址 + * @return 字节数据 + */ + public static byte[] readFile(String url) + { + InputStream in = null; + ByteArrayOutputStream baos = null; + try + { + if (url.startsWith("http")) + { + // 网络地址 + URL urlObj = new URL(url); + URLConnection urlConnection = urlObj.openConnection(); + urlConnection.setConnectTimeout(30 * 1000); + urlConnection.setReadTimeout(60 * 1000); + urlConnection.setDoInput(true); + in = urlConnection.getInputStream(); + } + else + { + // 本机地址 + String localPath = RuoYiConfig.getProfile(); + String downloadPath = localPath + StringUtils.substringAfter(url, Constants.RESOURCE_PREFIX); + in = new FileInputStream(downloadPath); + } + return IOUtils.toByteArray(in); + } + catch (Exception e) + { + log.error("获取文件路径异常 {}", e); + return null; + } + finally + { + IOUtils.closeQuietly(baos); + } + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java index 62c0439ae..b1f36afac 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java @@ -22,10 +22,12 @@ import org.apache.poi.ss.usermodel.BorderStyle; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.ClientAnchor; import org.apache.poi.ss.usermodel.DataValidation; import org.apache.poi.ss.usermodel.DataValidationConstraint; import org.apache.poi.ss.usermodel.DataValidationHelper; import org.apache.poi.ss.usermodel.DateUtil; +import org.apache.poi.ss.usermodel.Drawing; import org.apache.poi.ss.usermodel.FillPatternType; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.HorizontalAlignment; @@ -37,6 +39,7 @@ import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.ss.util.CellRangeAddressList; import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.apache.poi.xssf.usermodel.XSSFClientAnchor; import org.apache.poi.xssf.usermodel.XSSFDataValidation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -51,6 +54,8 @@ import com.ruoyi.common.exception.CustomException; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DictUtils; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.file.FileTypeUtils; +import com.ruoyi.common.utils.file.ImageUtils; import com.ruoyi.common.utils.reflect.ReflectUtils; /** @@ -102,16 +107,21 @@ public class ExcelUtil */ private List fields; + /** + * 最大高度 + */ + private short maxHeight; + /** * 统计列表 */ private Map statistics = new HashMap(); - + /** * 数字格式 */ private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00"); - + /** * 实体对象 */ @@ -239,7 +249,15 @@ public class ExcelUtil } else { - val = Convert.toStr(val); + String dateFormat = field.getAnnotation(Excel.class).dateFormat(); + if (StringUtils.isNotEmpty(dateFormat)) + { + val = DateUtils.parseDateToStr(dateFormat, (Date) val); + } + else + { + val = Convert.toStr(val); + } } } else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) @@ -521,6 +539,47 @@ public class ExcelUtil { cell.setCellValue(StringUtils.contains(Convert.toStr(value), ".") ? Convert.toDouble(value) : Convert.toInt(value)); } + else if (ColumnType.IMAGE == attr.cellType()) + { + ClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1), + cell.getRow().getRowNum() + 1); + String imagePath = Convert.toStr(value); + if (StringUtils.isNotEmpty(imagePath)) + { + byte[] data = ImageUtils.getImage(imagePath); + getDrawingPatriarch(cell.getSheet()).createPicture(anchor, + cell.getSheet().getWorkbook().addPicture(data, getImageType(data))); + } + } + } + + /** + * 获取画布 + */ + public static Drawing getDrawingPatriarch(Sheet sheet) + { + if (sheet.getDrawingPatriarch() == null) + { + sheet.createDrawingPatriarch(); + } + return sheet.getDrawingPatriarch(); + } + + /** + * 获取图片类型,设置图片插入类型 + */ + public int getImageType(byte[] value) + { + String type = FileTypeUtils.getFileExtendName(value); + if ("JPG".equalsIgnoreCase(type)) + { + return Workbook.PICTURE_TYPE_JPEG; + } + else if ("PNG".equalsIgnoreCase(type)) + { + return Workbook.PICTURE_TYPE_PNG; + } + return Workbook.PICTURE_TYPE_JPEG; } /** @@ -536,7 +595,6 @@ public class ExcelUtil { // 设置列宽 sheet.setColumnWidth(column, (int) ((attr.width() + 0.72) * 256)); - row.setHeight((short) (attr.height() * 20)); } // 如果设置了提示信息则鼠标放上去提示. if (StringUtils.isNotEmpty(attr.prompt())) @@ -561,7 +619,7 @@ public class ExcelUtil try { // 设置行高 - row.setHeight((short) (attr.height() * 20)); + row.setHeight(maxHeight); // 根据Excel中设置情况决定是否导出,有些情况需要保持为空,希望用户填写这一列. if (attr.isExport()) { @@ -737,7 +795,7 @@ public class ExcelUtil } return StringUtils.stripEnd(propertyString.toString(), separator); } - + /** * 解析字典值 * @@ -763,7 +821,7 @@ public class ExcelUtil { return DictUtils.getDictValue(dictType, dictLabel, separator); } - + /** * 合计统计信息 */ @@ -800,7 +858,7 @@ public class ExcelUtil cell = row.createCell(0); cell.setCellStyle(styles.get("total")); cell.setCellValue("合计"); - + for (Integer key : keys) { cell = row.createCell(key); @@ -916,6 +974,21 @@ public class ExcelUtil } } this.fields = this.fields.stream().sorted(Comparator.comparing(objects -> ((Excel) objects[1]).sort())).collect(Collectors.toList()); + this.maxHeight = getRowHeight(); + } + + /** + * 根据注解获取最大行高 + */ + public short getRowHeight() + { + double maxHeight = 0; + for (Object[] os : this.fields) + { + Excel excel = (Excel) os[1]; + maxHeight = maxHeight > excel.height() ? maxHeight : excel.height(); + } + return (short) (maxHeight * 20); } /** diff --git a/ruoyi-demo/pom.xml b/ruoyi-demo/pom.xml new file mode 100644 index 000000000..77d8efe91 --- /dev/null +++ b/ruoyi-demo/pom.xml @@ -0,0 +1,28 @@ + + + + ruoyi + com.ruoyi + 3.3.0 + + 4.0.0 + + ruoyi-demo + + + demo模块 + + + + + + + com.ruoyi + ruoyi-common + + + + + \ No newline at end of file diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/package-info.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/package-info.java new file mode 100644 index 000000000..4239668a6 --- /dev/null +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/package-info.java @@ -0,0 +1 @@ +package com.ruoyi.demo.controller; \ No newline at end of file diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/package-info.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/package-info.java new file mode 100644 index 000000000..e2da76563 --- /dev/null +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/package-info.java @@ -0,0 +1 @@ +package com.ruoyi.demo.domain; \ No newline at end of file diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/package-info.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/package-info.java new file mode 100644 index 000000000..7243da910 --- /dev/null +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/package-info.java @@ -0,0 +1 @@ +package com.ruoyi.demo.mapper; \ No newline at end of file diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/package-info.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/package-info.java new file mode 100644 index 000000000..6060849c9 --- /dev/null +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/package-info.java @@ -0,0 +1 @@ +package com.ruoyi.demo.service.impl; \ No newline at end of file diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/package-info.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/package-info.java new file mode 100644 index 000000000..d6a44c989 --- /dev/null +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/package-info.java @@ -0,0 +1 @@ +package com.ruoyi.demo.service; \ No newline at end of file diff --git a/ruoyi-demo/src/main/resources/mapper/demo/package-info.md b/ruoyi-demo/src/main/resources/mapper/demo/package-info.md new file mode 100644 index 000000000..e69de29bb diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java index 8eb4fb20d..a65626aaa 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java @@ -8,8 +8,10 @@ import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.StringRedisSerializer; import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; /** * redis配置 @@ -31,7 +33,7 @@ public class RedisConfig extends CachingConfigurerSupport ObjectMapper mapper = new ObjectMapper(); mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); - mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); serializer.setObjectMapper(mapper); template.setValueSerializer(serializer); diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java index dc1abb0fe..07166f869 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java @@ -40,13 +40,14 @@ public class GenUtils column.setCreateBy(table.getCreateBy()); // 设置java字段名 column.setJavaField(StringUtils.toCamelCase(columnName)); + // 设置默认类型 + column.setJavaType(GenConstants.TYPE_STRING); - if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType)) + if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) { - column.setJavaType(GenConstants.TYPE_STRING); // 字符串长度超过500设置为文本域 Integer columnLength = getColumnLength(column.getColumnType()); - String htmlType = columnLength >= 500 ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT; + String htmlType = columnLength >= 500 || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType) ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT; column.setHtmlType(htmlType); } else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType)) diff --git a/ruoyi-generator/src/main/resources/vm/java/controller.java.vm b/ruoyi-generator/src/main/resources/vm/java/controller.java.vm index 4c312c49e..56e1bd764 100644 --- a/ruoyi-generator/src/main/resources/vm/java/controller.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/controller.java.vm @@ -1,12 +1,8 @@ package ${packageName}.controller; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; - import java.util.List; import java.util.Arrays; -import com.ruoyi.common.utils.StringUtils; import lombok.RequiredArgsConstructor; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; @@ -49,98 +45,14 @@ public class ${ClassName}Controller extends BaseController { @PreAuthorize("@ss.hasPermi('${permissionPrefix}:list')") @GetMapping("/list") #if($table.crud) - public TableDataInfo list(${ClassName} ${className}) - { + public TableDataInfo list(${ClassName} ${className}) { startPage(); - LambdaQueryWrapper<${ClassName}> lqw = Wrappers.lambdaQuery(${className}); -#foreach($column in $columns) -#set($queryType=$column.queryType) -#set($javaField=$column.javaField) -#set($javaType=$column.javaType) -#set($columnName=$column.columnName) -#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) -#if($column.query) -#if($column.queryType == "EQ") -#if($javaType == 'String') - if (StringUtils.isNotBlank(${className}.get$AttrName())){ - lqw.eq(${ClassName}::get$AttrName ,${className}.get$AttrName()); - } -#else - if (${className}.get$AttrName() != null){ - lqw.eq(${ClassName}::get$AttrName ,${className}.get$AttrName()); - } -#end -#elseif($queryType == "NE") -#if($javaType == 'String') - if (StringUtils.isNotBlank(${className}.get$AttrName())){ - lqw.ne(${ClassName}::get$AttrName ,${className}.get$AttrName()); - } -#else - if (${className}.get$AttrName() != null){ - lqw.ne(${ClassName}::get$AttrName ,${className}.get$AttrName()); - } -#end -#elseif($queryType == "GT") -#if($javaType == 'String') - if (StringUtils.isNotBlank(${className}.get$AttrName())){ - lqw.gt(${ClassName}::get$AttrName ,${className}.get$AttrName()); - } -#else - if (${className}.get$AttrName() != null){ - lqw.gt(${ClassName}::get$AttrName ,${className}.get$AttrName()); - } -#end -#elseif($queryType == "GTE") -#if($javaType == 'String') - if (StringUtils.isNotBlank(${className}.get$AttrName())){ - lqw.ge(${ClassName}::get$AttrName ,${className}.get$AttrName()); - } -#else - if (${className}.get$AttrName() != null){ - lqw.ge(${ClassName}::get$AttrName ,${className}.get$AttrName()); - } -#end -#elseif($queryType == "LT") -#if($javaType == 'String') - if (StringUtils.isNotBlank(${className}.get$AttrName())){ - lqw.lt(${ClassName}::get$AttrName ,${className}.get$AttrName()); - } -#else - if (${className}.get$AttrName() != null){ - lqw.lt(${ClassName}::get$AttrName ,${className}.get$AttrName()); - } -#end -#elseif($queryType == "LTE") -#if($javaType == 'String') - if (StringUtils.isNotBlank(${className}.get$AttrName())){ - lqw.le(${ClassName}::get$AttrName ,${className}.get$AttrName()); - } -#else - if (${className}.get$AttrName() != null){ - lqw.le(${ClassName}::get$AttrName ,${className}.get$AttrName()); - } -#end -#elseif($queryType == "LIKE") -#if($javaType == 'String') - if (StringUtils.isNotBlank(${className}.get$AttrName())){ - lqw.like(${ClassName}::get$AttrName ,${className}.get$AttrName()); - } -#else - if (${className}.get$AttrName() != null){ - lqw.like(${ClassName}::get$AttrName ,${className}.get$AttrName()); - } -#end -#elseif($queryType == "BETWEEN") -#end -#end -#end - List<${ClassName}> list = i${ClassName}Service.list(lqw); + List<${ClassName}> list = i${ClassName}Service.queryList(${className}); return getDataTable(list); } #elseif($table.tree) public AjaxResult list(${ClassName} ${className}) { - LambdaQueryWrapper<${ClassName}> lqw = Wrappers.lambdaQuery(${className}); - List<${ClassName}> list = i${ClassName}Service.list(lqw); + List<${ClassName}> list = i${ClassName}Service.queryList(${className}); return AjaxResult.success(list); } #end @@ -152,9 +64,8 @@ public class ${ClassName}Controller extends BaseController { @Log(title = "${functionName}" , businessType = BusinessType.EXPORT) @GetMapping("/export" ) public AjaxResult export(${ClassName} ${className}) { - LambdaQueryWrapper<${ClassName}> lqw = new LambdaQueryWrapper<${ClassName}>(${className}); - List<${ClassName}> list = i${ClassName}Service.list(lqw); - ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}. class); + List<${ClassName}> list = i${ClassName}Service.queryList(${className}); + ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class); return util.exportExcel(list, "${businessName}" ); } diff --git a/ruoyi-generator/src/main/resources/vm/java/domain.java.vm b/ruoyi-generator/src/main/resources/vm/java/domain.java.vm index 03f535a97..9e9dd4b50 100644 --- a/ruoyi-generator/src/main/resources/vm/java/domain.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/domain.java.vm @@ -10,14 +10,12 @@ import com.ruoyi.common.annotation.Excel; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import java.io.Serializable; import java.util.Date; +import java.util.Map; +import java.util.HashMap; import java.math.BigDecimal; -#if($table.crud) -import com.ruoyi.common.core.domain.BaseEntity; -#elseif($table.tree) -import com.ruoyi.common.core.domain.TreeEntity; -#end /** * ${functionName}对象 ${tableName} @@ -25,11 +23,6 @@ import com.ruoyi.common.core.domain.TreeEntity; * @author ${author} * @date ${datetime} */ -#if($table.crud) -#set($Entity="BaseEntity") -#elseif($table.tree) -#set($Entity="TreeEntity") -#end @Data @ToString @EqualsAndHashCode @@ -66,4 +59,7 @@ private static final long serialVersionUID=1L; private $column.javaType $column.javaField; #end #end + + @TableField(exist = false) + private Map params = new HashMap<>(); } diff --git a/ruoyi-generator/src/main/resources/vm/java/service.java.vm b/ruoyi-generator/src/main/resources/vm/java/service.java.vm index 91cb68de7..97fe2d5c3 100644 --- a/ruoyi-generator/src/main/resources/vm/java/service.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/service.java.vm @@ -2,6 +2,7 @@ package ${packageName}.service; import ${packageName}.domain.${ClassName}; import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; /** * ${functionName}Service接口 @@ -11,4 +12,8 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface I${ClassName}Service extends IService<${ClassName}> { + /** + * 查询列表 + */ + List<${ClassName}> queryList(${ClassName} ${className}); } diff --git a/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm b/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm index 8fd391499..ecb3436a7 100644 --- a/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm @@ -2,10 +2,16 @@ package ${packageName}.service.impl; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import org.apache.commons.lang3.StringUtils; import ${packageName}.mapper.${ClassName}Mapper; import ${packageName}.domain.${ClassName}; import ${packageName}.service.I${ClassName}Service; +import java.util.List; +import java.util.Map; + /** * ${functionName}Service业务层处理 * @@ -15,4 +21,94 @@ import ${packageName}.service.I${ClassName}Service; @Service public class ${ClassName}ServiceImpl extends ServiceImpl<${ClassName}Mapper, ${ClassName}> implements I${ClassName}Service { + @Override + public List<${ClassName}> queryList(${ClassName} ${className}) { + LambdaQueryWrapper<${ClassName}> lqw = Wrappers.lambdaQuery(); +#foreach($column in $columns) +#set($queryType=$column.queryType) +#set($javaField=$column.javaField) +#set($javaType=$column.javaType) +#set($columnName=$column.columnName) +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#if($column.query) +#if($column.queryType == "EQ") +#if($javaType == 'String') + if (StringUtils.isNotBlank(${className}.get$AttrName())){ + lqw.eq(${ClassName}::get$AttrName ,${className}.get$AttrName()); + } +#else + if (${className}.get$AttrName() != null){ + lqw.eq(${ClassName}::get$AttrName ,${className}.get$AttrName()); + } +#end +#elseif($queryType == "NE") +#if($javaType == 'String') + if (StringUtils.isNotBlank(${className}.get$AttrName())){ + lqw.ne(${ClassName}::get$AttrName ,${className}.get$AttrName()); + } +#else + if (${className}.get$AttrName() != null){ + lqw.ne(${ClassName}::get$AttrName ,${className}.get$AttrName()); + } +#end +#elseif($queryType == "GT") +#if($javaType == 'String') + if (StringUtils.isNotBlank(${className}.get$AttrName())){ + lqw.gt(${ClassName}::get$AttrName ,${className}.get$AttrName()); + } +#else + if (${className}.get$AttrName() != null){ + lqw.gt(${ClassName}::get$AttrName ,${className}.get$AttrName()); + } +#end +#elseif($queryType == "GTE") +#if($javaType == 'String') + if (StringUtils.isNotBlank(${className}.get$AttrName())){ + lqw.ge(${ClassName}::get$AttrName ,${className}.get$AttrName()); + } +#else + if (${className}.get$AttrName() != null){ + lqw.ge(${ClassName}::get$AttrName ,${className}.get$AttrName()); + } +#end +#elseif($queryType == "LT") +#if($javaType == 'String') + if (StringUtils.isNotBlank(${className}.get$AttrName())){ + lqw.lt(${ClassName}::get$AttrName ,${className}.get$AttrName()); + } +#else + if (${className}.get$AttrName() != null){ + lqw.lt(${ClassName}::get$AttrName ,${className}.get$AttrName()); + } +#end +#elseif($queryType == "LTE") +#if($javaType == 'String') + if (StringUtils.isNotBlank(${className}.get$AttrName())){ + lqw.le(${ClassName}::get$AttrName ,${className}.get$AttrName()); + } +#else + if (${className}.get$AttrName() != null){ + lqw.le(${ClassName}::get$AttrName ,${className}.get$AttrName()); + } +#end +#elseif($queryType == "LIKE") +#if($javaType == 'String') + if (StringUtils.isNotBlank(${className}.get$AttrName())){ + lqw.like(${ClassName}::get$AttrName ,${className}.get$AttrName()); + } +#else + if (${className}.get$AttrName() != null){ + lqw.like(${ClassName}::get$AttrName ,${className}.get$AttrName()); + } +#end +#elseif($queryType == "BETWEEN") + Map params = ${className}.getParams(); + if (params.get("begin$AttrName") != null && params.get("end$AttrName") != null) { + lqw.between(${ClassName}::get$AttrName ,params.get("begin$AttrName"),params.get("end$AttrName")); + } +#end +#end +#end + return this.list(lqw); + } } diff --git a/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm b/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm index e43393412..9c31d0d6a 100644 --- a/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm +++ b/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm @@ -38,15 +38,28 @@ -#elseif($column.htmlType == "datetime") +#elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN") - +#elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN") + + + #end #end #end @@ -201,7 +214,7 @@ #elseif($column.htmlType == "datetime") - { this.${businessName}List = this.handleTree(response.data, "${treeCode}", "${treeParentCode}"); this.loading = false; @@ -397,6 +429,12 @@ export default { }, /** 重置按钮操作 */ resetQuery() { +#foreach ($column in $columns) +#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN") +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) + this.daterange${AttrName} = []; +#end +#end this.resetForm("queryForm"); this.handleQuery(); }, diff --git a/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm b/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm index 114f09d09..0c4ddf084 100644 --- a/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm +++ b/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm @@ -38,15 +38,28 @@ -#elseif($column.htmlType == "datetime") +#elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN") - +#elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN") + + + #end #end #end @@ -95,7 +108,7 @@ v-hasPermi="['${moduleName}:${businessName}:export']" >导出 - + @@ -230,7 +243,7 @@ #elseif($column.htmlType == "datetime") - { this.${businessName}List = response.rows; this.total = response.total; @@ -413,6 +445,12 @@ export default { }, /** 重置按钮操作 */ resetQuery() { +#foreach ($column in $columns) +#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN") +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) + this.daterange${AttrName} = []; +#end +#end this.resetForm("queryForm"); this.handleQuery(); }, diff --git a/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml index 5ab5a3b82..22a4cd10d 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml @@ -131,7 +131,7 @@ parent_id = #{parentId}, order_num = #{orderNum}, path = #{path}, - component = #{component}, + component = #{component}, is_frame = #{isFrame}, is_cache = #{isCache}, menu_type = #{menuType}, diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml index ca53fa5c3..296912d2a 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -141,8 +141,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" dept_id = #{deptId}, user_name = #{userName}, nick_name = #{nickName}, - email = #{email}, - phonenumber = #{phonenumber}, + email = #{email}, + phonenumber = #{phonenumber}, sex = #{sex}, avatar = #{avatar}, password = #{password}, diff --git a/ruoyi-ui/package.json b/ruoyi-ui/package.json index f89e8e5b8..96096e223 100644 --- a/ruoyi-ui/package.json +++ b/ruoyi-ui/package.json @@ -49,7 +49,6 @@ "js-cookie": "2.2.1", "jsencrypt": "3.0.0-rc.1", "nprogress": "0.2.0", - "path-to-regexp": "6.2.0", "quill": "1.3.7", "screenfull": "5.0.2", "sortablejs": "1.10.2", diff --git a/ruoyi-ui/src/components/Breadcrumb/index.vue b/ruoyi-ui/src/components/Breadcrumb/index.vue index 97603c4f0..b313fdd67 100644 --- a/ruoyi-ui/src/components/Breadcrumb/index.vue +++ b/ruoyi-ui/src/components/Breadcrumb/index.vue @@ -10,8 +10,6 @@