exam-system/pom.xml
对比新文件 @@ -0,0 +1,30 @@ <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <artifactId>ruoyi</artifactId> <groupId>com.ruoyi</groupId> <version>3.8.6</version> </parent> <artifactId>exam-system</artifactId> <name>exam-system</name> <description>考试系统</description> <properties> <java.version>8</java.version> </properties> <dependencies> <!-- 通用工具--> <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-common</artifactId> </dependency> <!--附件依赖--> <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-file</artifactId> </dependency> </dependencies> </project> exam-system/src/main/java/com/gkhy/exam/noncoalmine/controller/TestDemoController.java
对比新文件 @@ -0,0 +1,20 @@ package com.gkhy.exam.noncoalmine.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @email 1603559716@qq.com * @author: zf * @date: 2023/9/6 * @time: 17:24 */ @RestController @RequestMapping("/demo") public class TestDemoController { @GetMapping("/test") public String test(){ return "testController"; } } pom.xml
@@ -30,6 +30,9 @@ <poi.version>4.1.2</poi.version> <velocity.version>2.3</velocity.version> <jwt.version>0.9.1</jwt.version> <mybatis-plus.version>3.5.2</mybatis-plus.version> <hutool.version>5.5.7</hutool.version> </properties> <!-- 依赖声明 --> @@ -169,6 +172,30 @@ <artifactId>ruoyi-common</artifactId> <version>${ruoyi.version}</version> </dependency> <!--文件模块--> <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-file</artifactId> <version>${ruoyi.version}</version> </dependency> <!--考试系统--> <dependency> <groupId>com.ruoyi</groupId> <artifactId>exam-system</artifactId> <version>${ruoyi.version}</version> </dependency> <!--mybatis-plus--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis-plus.version}</version> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>${hutool.version}</version> </dependency> </dependencies> </dependencyManagement> @@ -180,6 +207,8 @@ <module>ruoyi-quartz</module> <module>ruoyi-generator</module> <module>ruoyi-common</module> <module>ruoyi-file</module> <module>exam-system</module> </modules> <packaging>pom</packaging> ruoyi-admin/pom.xml
@@ -60,7 +60,16 @@ <groupId>com.ruoyi</groupId> <artifactId>ruoyi-generator</artifactId> </dependency> <!--文件--> <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-file</artifactId> </dependency> <!--考试系统--> <dependency> <groupId>com.ruoyi</groupId> <artifactId>exam-system</artifactId> </dependency> </dependencies> <build> ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
@@ -9,7 +9,7 @@ * * @author ruoyi */ @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class },scanBasePackages = {"com.gkhy","com.ruoyi"}) public class RuoYiApplication { public static void main(String[] args) ruoyi-admin/src/main/resources/application-dev.yml
对比新文件 @@ -0,0 +1,112 @@ # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8085 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 数据源配置 spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver druid: # 主库数据源 master: url: jdbc:mysql://192.168.0.52:3306/swspkmas?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: gkhymysql # 从库数据源 slave: # 从数据源开关/默认关闭 enabled: false url: username: password: # 初始连接数 initialSize: 5 # 最小连接池数量 minIdle: 10 # 最大连接池数量 maxActive: 20 # 配置获取连接等待超时的时间 maxWait: 60000 # 配置连接超时时间 connectTimeout: 30000 # 配置网络超时时间 socketTimeout: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis: 300000 # 配置一个连接在池中最大生存的时间,单位是毫秒 maxEvictableIdleTimeMillis: 900000 # 配置检测连接是否有效 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false webStatFilter: enabled: true statViewServlet: enabled: true # 设置白名单,不填则允许所有访问 allow: url-pattern: /druid/* # 控制台管理用户名和密码 login-username: ruoyi login-password: 123456 filter: stat: enabled: true # 慢SQL记录 log-slow-sql: true slow-sql-millis: 1000 merge-sql: true wall: config: multi-statement-allow: true # redis 配置 redis: # 地址 host: 127.0.0.1 # 端口,默认为6379 port: 6379 # 数据库索引 database: 5 # 密码 password: root # 连接超时时间 timeout: 10s lettuce: pool: # 连接池中的最小空闲连接 min-idle: 0 # 连接池中的最大空闲连接 max-idle: 8 # 连接池的最大数据库连接数 max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms #windous测试 file: path: #基础路径 dcPath: E:\file\gkhy\test\ urlRootPath: /uploadfile/ module: #用户模块 accountPath: /account/ ruoyi-admin/src/main/resources/application-druid.yml
文件已删除 ruoyi-admin/src/main/resources/application.yml
@@ -15,24 +15,6 @@ # 验证码类型 math 数字计算 char 字符验证 captchaType: math # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8080 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: @@ -54,42 +36,19 @@ # 国际化资源文件路径 basename: i18n/messages profiles: active: druid active: dev # 文件上传 servlet: multipart: # 单个文件大小 max-file-size: 10MB max-file-size: 100MB # 设置总上传的文件大小 max-request-size: 20MB max-request-size: 200MB # 服务模块 devtools: restart: # 热部署开关 enabled: true # redis 配置 redis: # 地址 host: localhost # 端口,默认为6379 port: 6379 # 数据库索引 database: 0 # 密码 password: # 连接超时时间 timeout: 10s lettuce: pool: # 连接池中的最小空闲连接 min-idle: 0 # 连接池中的最大空闲连接 max-idle: 8 # 连接池的最大数据库连接数 max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms # token配置 token: # 令牌自定义标识 @@ -99,14 +58,16 @@ # 令牌有效期(默认30分钟) expireTime: 30 # MyBatis配置 mybatis: # 搜索指定包别名 typeAliasesPackage: com.ruoyi.**.domain # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 configLocation: classpath:mybatis/mybatis-config.xml # MyBatis-plus配置 mybatis-plus: mapper-locations: classpath*:mapper/**/*Mapper.xml # config-location: classpath:mybatis/mybatis-config.xml #实体扫描,多个package用逗号或者分号分隔 typeAliasesPackage: com.ruoyi.**.domain,com.gkhy.**.entity configuration: #在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射 map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # PageHelper分页插件 pagehelper: @@ -128,4 +89,4 @@ # 排除链接(多个用逗号分隔) excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* urlPatterns: /system/*,/monitor/*,/tool/*,/test/* ruoyi-common/pom.xml
@@ -125,7 +125,20 @@ <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </dependency> <!--mybatis-plus--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> </dependency> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies> </project> ruoyi-file/pom.xml
对比新文件 @@ -0,0 +1,24 @@ <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <artifactId>ruoyi</artifactId> <groupId>com.ruoyi</groupId> <version>3.8.6</version> </parent> <artifactId>ruoyi-file</artifactId> <name>ruoyi-file</name> <description>ruoyi-file</description> <properties> <java.version>8</java.version> </properties> <dependencies> <!-- 通用工具--> <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-common</artifactId> </dependency> </dependencies> </project> ruoyi-file/src/main/java/com/ruoyi/file/constants/FileProjectConstants.java
对比新文件 @@ -0,0 +1,18 @@ package com.ruoyi.file.constants; /** * @email 1603559716@qq.com * @author: zf * @date: 2023/8/29 * @time: 11:04 */ public interface FileProjectConstants { interface ReturnType { int DETAIL = 1; int KEY = 2; int URL = 3; } enum FileError{ } } ruoyi-file/src/main/java/com/ruoyi/file/controller/AttachmentController.java
对比新文件 @@ -0,0 +1,141 @@ package com.ruoyi.file.controller; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.file.constants.FileProjectConstants; import com.ruoyi.file.service.AttachmentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * @email 1603559716@qq.com * @author: zf * @date: 2023/8/29 * @time: 10:53 */ @RestController @RequestMapping("attachment") public class AttachmentController extends BaseController { @Autowired private AttachmentService attachmentService; /** * 根据标识查询文件具体信息 * @param key * @return */ @GetMapping("/get/key/{key}") public AjaxResult findByKey(@PathVariable String key) { return success(attachmentService.findByKey(key)); } /** * 根据id获取文件 * @param id * @return */ @GetMapping("/get/id/{id}") public AjaxResult get(@PathVariable Long id) { return success(attachmentService.findById(id)); } /** * 删除文件数据 * @param id * @return */ @GetMapping("/delete/{id}") public AjaxResult delete(@PathVariable Long id) { attachmentService.delete(id); return success(); } /** * 单个文件上传 * @Description 上传文件(返回文件标识) * @Param [file, module] **/ @PostMapping("/upload/key") public AjaxResult uploadReturnKey(@RequestParam("file") MultipartFile file, @RequestParam("module") String module) { return success(attachmentService.saveFileToPath(file, module, FileProjectConstants.ReturnType.KEY)); } /** * 单个文件 * @Description 上传文件(返回文件信息) * @Param [file, module] **/ @PostMapping("/upload/detail") public AjaxResult uploadReturnDetail(@RequestParam("file") MultipartFile file, @RequestParam("module") String module) { return success(attachmentService.saveFileToPath(file, module, FileProjectConstants.ReturnType.DETAIL)); } /** * 单个文件 * @Description 上传文件(返回访问路径) * @Date 2021/4/20 19:28 * @Param [file, module] **/ @PostMapping("/upload/url") public AjaxResult uploadReturnUrl(@RequestParam("file") MultipartFile file, @RequestParam("module") String module) { return success(attachmentService.saveFileToPath(file, module, FileProjectConstants.ReturnType.URL)); } /** * 批量文件 * @Description 上传文件(返回文件信息) * @Param [file, module] **/ @PostMapping("/upload/batch/detail") public AjaxResult uploadBatchReturnDetail(@RequestParam("file") MultipartFile[] file, @RequestParam("module") String module) { return success(attachmentService.saveBatchFileToPath(file, module)); } /** * @return org.springframework.http.ResponseEntity<byte [ ]> * @Description 获取下载文件流 * @Param [key] **/ @GetMapping("/downloadFile/{key}") public void download(@PathVariable String key, HttpServletResponse response) { attachmentService.downloadForStream(response, key); } /** * @return void * @Description 文件下载 * @Param [key, response, request] **/ @RequestMapping(value = "/downloadFileById/{id}", method = {RequestMethod.POST, RequestMethod.GET}) public void downloadFileByKey(@PathVariable Long id, HttpServletResponse response, HttpServletRequest request) { attachmentService.downloadById(response, request, id); } /** * @Description 获取下载文件路径 * @Param [key] **/ @GetMapping("/downloadUrl/{key}") public AjaxResult downLoad( @PathVariable String key) { return success(attachmentService.findByKey(key)); } } ruoyi-file/src/main/java/com/ruoyi/file/entity/AttachmentInfo.java
对比新文件 @@ -0,0 +1,45 @@ package com.ruoyi.file.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.ruoyi.common.core.domain.BaseEntity; import lombok.Data; import org.springframework.data.annotation.Id; /** * @email 1603559716@qq.com * @author: zf * @date: 2023/5/6 * @time: 14:54 */ @Data @TableName("attachment") public class AttachmentInfo extends BaseEntity { @Id @TableId(type = IdType.AUTO) private Long id; //文件标识 private String fileKey; //文件本地址 private String filePath; //文件访问路径 private String fileUrl; //文件名称 private String fileName; //文件后缀 private String fileSuffix; //文件描述 private String fileDesc; //文件大小 private Long fileSize; //文件类型 private String fileType; //模块 private String module; //删除标识 0-未删除,1-删除 private Integer delFlag; //业务id private Long businessId; } ruoyi-file/src/main/java/com/ruoyi/file/mapper/AttachmentInfoMapper.java
对比新文件 @@ -0,0 +1,23 @@ package com.ruoyi.file.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.file.entity.AttachmentInfo; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; import java.util.List; /** * @email 1603559716@qq.com * @author: zf * @date: 2023/7/24 * @time: 13:49 */ @Repository public interface AttachmentInfoMapper extends BaseMapper<AttachmentInfo> { void saveBatch(@Param("attachmentList") List<AttachmentInfo> attachmentList); void updateBusinessIdBatch(@Param("attachmentList")List<AttachmentInfo> attachmentList); void deleteByBusinessId(@Param("businessId")Long businessId); } ruoyi-file/src/main/java/com/ruoyi/file/properties/FilePathProperties.java
对比新文件 @@ -0,0 +1,31 @@ package com.ruoyi.file.properties; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.Map; /** * @email 1603559716@qq.com * @author: zf * @date: 2023/7/24 * @time: 10:06 */ @Component @Data @ConfigurationProperties(prefix = "file.path") public class FilePathProperties { /** * 文件保存根路径 */ private String dcPath; /** * 访问跟路径 */ private String urlRootPath; /** * 模块路径 */ private Map<String,String> module; } ruoyi-file/src/main/java/com/ruoyi/file/service/AttachmentInfoService.java
对比新文件 @@ -0,0 +1,33 @@ package com.ruoyi.file.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.file.entity.AttachmentInfo; import java.util.List; /** * @email 1603559716@qq.com * @author: zf * @date: 2023/7/24 * @time: 13:51 */ public interface AttachmentInfoService extends IService<AttachmentInfo> { AttachmentInfo findByKey(String key); AttachmentInfo findById(Long id); List<AttachmentInfo> findByBusinessId(Long businessId); List<AttachmentInfo> findByIds(List<Long> ids); void delete(Long id); AttachmentInfo saveOne(AttachmentInfo attachmentInfo); List<AttachmentInfo> saveBatchAttachment(List<AttachmentInfo> attachmentInfoList); void updateBusinessIdBatch(List<AttachmentInfo> attachmentList); void deleteByBusinessId(Long businessId); } ruoyi-file/src/main/java/com/ruoyi/file/service/AttachmentService.java
对比新文件 @@ -0,0 +1,32 @@ package com.ruoyi.file.service; import com.ruoyi.file.entity.AttachmentInfo; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.List; /** * @email 1603559716@qq.com * @author: zf * @date: 2023/7/24 * @time: 13:53 */ public interface AttachmentService { AttachmentInfo findByKey(String key); AttachmentInfo findById(Long id); List<AttachmentInfo> findByIds(List<Long> ids); List<AttachmentInfo> findByBusinessId(Long businessId); void delete(Long id); Object saveFileToPath(MultipartFile file, String module, int type); Object saveBatchFileToPath(MultipartFile[] file, String module); void downloadForStream(HttpServletResponse response, String key); void downloadById(HttpServletResponse response, HttpServletRequest request, Long id); } ruoyi-file/src/main/java/com/ruoyi/file/service/impl/AttachmentInfoServiceImpl.java
对比新文件 @@ -0,0 +1,88 @@ package com.ruoyi.file.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.file.entity.AttachmentInfo; import com.ruoyi.file.mapper.AttachmentInfoMapper; import com.ruoyi.file.service.AttachmentInfoService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Date; import java.util.List; /** * @email 1603559716@qq.com * @author: zf * @date: 2023/7/24 * @time: 13:48 */ @Service public class AttachmentInfoServiceImpl extends ServiceImpl<AttachmentInfoMapper, AttachmentInfo> implements AttachmentInfoService { @Autowired private AttachmentInfoMapper attachmentInfoMapper; @Override public AttachmentInfo findByKey(String key) { AttachmentInfo attachmentInfo = attachmentInfoMapper.selectOne(new LambdaQueryWrapper<AttachmentInfo>() .eq(AttachmentInfo::getDelFlag,0) .eq(AttachmentInfo::getFileKey,key)); return attachmentInfo; } @Override public AttachmentInfo findById(Long id) { AttachmentInfo attachmentInfo = attachmentInfoMapper.selectOne(new LambdaQueryWrapper<AttachmentInfo>() .eq(AttachmentInfo::getDelFlag,0) .eq(AttachmentInfo::getId,id)); return attachmentInfo; } @Override public List<AttachmentInfo> findByBusinessId(Long businessId) { List<AttachmentInfo> attachmentInfoList = attachmentInfoMapper.selectList(new LambdaQueryWrapper<AttachmentInfo>() .eq(AttachmentInfo::getDelFlag,0) .eq(AttachmentInfo::getBusinessId,businessId)); return attachmentInfoList; } @Override public List<AttachmentInfo> findByIds(List<Long> ids) { return attachmentInfoMapper.selectList(new LambdaQueryWrapper<AttachmentInfo>() .in(AttachmentInfo::getId,ids) .eq(AttachmentInfo::getDelFlag,0)); } @Override public void delete(Long id) { AttachmentInfo attachmentInfo = new AttachmentInfo(); attachmentInfo.setId(id); attachmentInfo.setUpdateTime(new Date()); //attachmentInfo.setUpdateBy(SecurityUtils.getUsername()); attachmentInfo.setDelFlag(1); attachmentInfoMapper.updateById(attachmentInfo); } @Override public AttachmentInfo saveOne(AttachmentInfo attachmentInfo) { attachmentInfoMapper.insert(attachmentInfo); return attachmentInfoMapper.selectById(attachmentInfo.getId()); } @Override public List<AttachmentInfo> saveBatchAttachment(List<AttachmentInfo> attachmentInfoList) { attachmentInfoMapper.saveBatch(attachmentInfoList); return attachmentInfoList; } @Override public void updateBusinessIdBatch(List<AttachmentInfo> attachmentList) { attachmentInfoMapper.updateBusinessIdBatch(attachmentList); } @Override public void deleteByBusinessId(Long businessId) { attachmentInfoMapper.deleteByBusinessId(businessId); } } ruoyi-file/src/main/java/com/ruoyi/file/service/impl/AttachmentServiceImpl.java
对比新文件 @@ -0,0 +1,322 @@ package com.ruoyi.file.service.impl; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.extra.servlet.ServletUtil; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.ruoyi.common.constant.HttpStatus; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.file.constants.FileProjectConstants; import com.ruoyi.file.entity.AttachmentInfo; import com.ruoyi.file.properties.FilePathProperties; import com.ruoyi.file.service.AttachmentInfoService; import com.ruoyi.file.service.AttachmentService; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.stereotype.Service; import org.springframework.util.Assert; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.UUID; import static cn.hutool.core.io.FileTypeUtil.getType; /** * @email 1603559716@qq.com * @author: zf * @date: 2023/7/24 * @time: 13:54 */ @Service public class AttachmentServiceImpl implements AttachmentService { @Autowired private AttachmentInfoService attachmentInfoService; private final Logger logger = LoggerFactory.getLogger(this.getClass()); /** * 错误信息格式 */ private static final String ERROR_FORMATTER = "{}:{}"; @Resource private FilePathProperties filePathProperties; @Override public AttachmentInfo findByKey(String key) { if (StringUtils.isBlank(key)){ throw new ServiceException("文件标识为空", HttpStatus.ERROR); } return attachmentInfoService.findByKey(key); } @Override public AttachmentInfo findById(Long id) { if (id == null){ throw new ServiceException("文件主键为空"); } return attachmentInfoService.findById(id); } @Override public List<AttachmentInfo> findByIds(List<Long> ids) { if (CollectionUtils.isEmpty(ids)){ throw new ServiceException("文件主键为空"); } return attachmentInfoService.findByIds(ids); } @Override public List<AttachmentInfo> findByBusinessId(Long businessId) { if (businessId == null){ throw new ServiceException("业务主键为空"); } return attachmentInfoService.findByBusinessId(businessId); } @Override public void delete(Long id) { if (id == null){ throw new ServiceException("文件主键为空"); } attachmentInfoService.delete(id); } @Override public Object saveFileToPath(MultipartFile file, String module, int type) { //获取对应模块路径 String path; //获取对应模块根路径 String dcPath; path = filePathProperties.getModule().get(module); dcPath = filePathProperties.getDcPath(); String originalFilename = file.getOriginalFilename(); if (StringUtils.isEmpty(originalFilename)) { logger.error(ERROR_FORMATTER,module, "文件不存在"); throw new ServiceException("文件不存在"); } if (StringUtils.isEmpty(path)) { logger.error(ERROR_FORMATTER, module, "文件路径不存在"); throw new ServiceException("文件路径不存在"); } assert originalFilename != null; LocalDateTime now = LocalDateTime.now(); File newFile = null; try { //文件标识 UUID 如4d6873609b144945935ae84442711fd6 String key = ""; String suffix = ""; if (originalFilename.contains(".mp3")) { key = originalFilename; suffix = ""; } else { key = UUID.randomUUID().toString().replace("-", ""); //文件后缀 包含. suffix = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase(); } path = path.replace("/", File.separator); //文件模块路径 如 2021/base/build/0421 String modulePath = now.getYear() + path + now.format(DateTimeFormatter.ofPattern("MMdd")); //文件路径 如 2021/base/build/0421/4d6873609b144945935ae84442711fd6.后缀 String newFilePath = modulePath + File.separator + key + suffix; //文件绝对路径 如 /home/img/2021/base/build/0421/4d6873609b144945935ae84442711fd6.后缀 String localPath = dcPath + newFilePath; //文件访问路径 如 /upload/2021/base/build/0421/4d6873609b144945935ae84442711fd6.后缀 String url = filePathProperties.getUrlRootPath() + newFilePath.replace(File.separator, "/"); newFile = new File(localPath); if (!newFile.exists() && !newFile.mkdirs()) { logger.error(ERROR_FORMATTER, newFilePath, "文件上传失败"); throw new ServiceException("文件上传失败"); } file.transferTo(newFile); //创建文件信息 AttachmentInfo attachmentInfo = new AttachmentInfo(); attachmentInfo.setDelFlag(0); attachmentInfo.setFileKey(key); attachmentInfo.setFileSuffix(suffix); attachmentInfo.setFilePath(localPath); attachmentInfo.setFileUrl(url); attachmentInfo.setFileName(file.getOriginalFilename()); attachmentInfo.setFileSize(file.getSize()); attachmentInfo.setModule(module); attachmentInfo.setFileType(getType(suffix)); attachmentInfo.setCreateBy(SecurityUtils.getUsername()); attachmentInfo.setUpdateBy(SecurityUtils.getUsername()); attachmentInfo.setUpdateTime(new Date()); attachmentInfo.setCreateTime(new Date()); AttachmentInfo attachment = attachmentInfoService.saveOne(attachmentInfo); switch (type) { case FileProjectConstants.ReturnType.URL: return url; case FileProjectConstants.ReturnType.KEY: return key; case FileProjectConstants.ReturnType.DETAIL: return attachment; default: return null; } } catch (IOException e) { if (newFile != null && newFile.exists()) { newFile.delete(); } logger.error(ERROR_FORMATTER, "文件上传失败"); throw new ServiceException("文件上传失败"); } } @Override public Object saveBatchFileToPath(MultipartFile[] fileList, String module) { //获取对应模块路径 String path; //获取对应模块根路径 String dcPath; path = filePathProperties.getModule().get(module); dcPath = filePathProperties.getDcPath(); List<AttachmentInfo> attachmentInfoList = new ArrayList<>(); for (MultipartFile file : fileList) { String originalFilename = file.getOriginalFilename(); if (StringUtils.isEmpty(originalFilename)) { logger.error(ERROR_FORMATTER,module, "文件不存在"); throw new ServiceException("文件不存在"); } if (StringUtils.isEmpty(path)) { logger.error(ERROR_FORMATTER, module, "文件路径不存在"); throw new ServiceException("文件路径不存在"); } assert originalFilename != null; LocalDateTime now = LocalDateTime.now(); File newFile = null; try { //文件标识 UUID 如4d6873609b144945935ae84442711fd6 String key = ""; String suffix = ""; if (originalFilename.contains(".mp3")) { key = originalFilename; suffix = ""; } else { key = UUID.randomUUID().toString().replace("-", ""); //文件后缀 包含. suffix = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase(); } path = path.replace("/", File.separator); //文件模块路径 如 2021/base/build/0421 String modulePath = now.getYear() + path + now.format(DateTimeFormatter.ofPattern("MMdd")); //文件路径 如 2021/base/build/0421/4d6873609b144945935ae84442711fd6.后缀 String newFilePath = modulePath + File.separator + key + suffix; //文件绝对路径 如 /home/img/2021/base/build/0421/4d6873609b144945935ae84442711fd6.后缀 String localPath = dcPath + newFilePath; //文件访问路径 如 /upload/2021/base/build/0421/4d6873609b144945935ae84442711fd6.后缀 String url = filePathProperties.getUrlRootPath() + newFilePath.replace(File.separator, "/"); newFile = new File(localPath); if (!newFile.exists() && !newFile.mkdirs()) { logger.error(ERROR_FORMATTER, newFilePath, "文件上传失败"); throw new ServiceException("文件上传失败"); } //上传文件 file.transferTo(newFile); //创建文件信息 AttachmentInfo attachmentInfo = new AttachmentInfo(); attachmentInfo.setDelFlag(0); attachmentInfo.setFileKey(key); attachmentInfo.setFileSuffix(suffix); attachmentInfo.setFilePath(localPath); attachmentInfo.setFileUrl(url); attachmentInfo.setFileName(file.getOriginalFilename()); attachmentInfo.setFileSize(file.getSize()); attachmentInfo.setModule(module); attachmentInfo.setFileType(getType(suffix)); /* attachmentInfo.setCreateBy(SecurityUtils.getUsername()); attachmentInfo.setUpdateBy(SecurityUtils.getUsername());*/ attachmentInfo.setUpdateTime(new Date()); attachmentInfo.setCreateTime(new Date()); attachmentInfoList.add(attachmentInfo); } catch (IOException e) { if (newFile != null && newFile.exists()) { newFile.delete(); } logger.error(ERROR_FORMATTER, "文件上传失败", e.getMessage()); throw new ServiceException("文件上传失败"); } } List<AttachmentInfo> detailList = attachmentInfoService.saveBatchAttachment(attachmentInfoList); return detailList; } @Override public void downloadForStream(HttpServletResponse response, String key) { AttachmentInfo byKey = findByKey(key); File file; try { response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode(byKey.getFileName(), StandardCharsets.UTF_8.name())); response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); file = new File(byKey.getFilePath()); if (!file.exists()) { logger.error(ERROR_FORMATTER, key, "文件不存在"); throw new ServiceException("文件不存在"); } OutputStream outputStream = response.getOutputStream(); FileInputStream inputStream = new FileInputStream(file); IoUtil.copy(inputStream, outputStream); outputStream.close(); } catch (IOException e) { logger.error(e.getMessage()); throw new ServiceException("文件下载异常"); } } @Override public void downloadById(HttpServletResponse response, HttpServletRequest request, Long id) { Assert.isTrue(id == null, "文件key未知异常"); AttachmentInfo byId = findById(id); downloadByEntity(response, request, byId); } public void downloadByEntity(HttpServletResponse response, HttpServletRequest request, AttachmentInfo attachmentInfo) { if (ObjectUtils.isNotNull(attachmentInfo)) { String type = attachmentInfo.getFileType(); if (StringUtils.isBlank(type)) { type = "application/octet-stream"; } type = type + ";charset=utf-8"; String fileName = attachmentInfo.getFileName(); response.setContentType("multipart/form-data;charset=utf-8"); ServletUtil.setHeader(response, "Access-Control-Expose-Headers", "Content-Disposition"); //本地文件下载 File file = FileUtil.file(attachmentInfo.getFilePath()); if (!FileUtil.exist(file)) { throw new ServiceException(attachmentInfo.getFileKey() + "文件不存在"); } InputStream is = null; try { is = IoUtil.toStream(file); ServletUtil.write(response, is, type, fileName); } catch (Exception e) { throw new ServiceException("文件下载异常"); } finally { IoUtil.close(is); } } else { throw new ServiceException("文件不存在"); } } } ruoyi-file/src/main/resources/mapper/AttachmentInfoMapper.xml
对比新文件 @@ -0,0 +1,27 @@ <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="com.ruoyi.file.mapper.AttachmentInfoMapper" > <insert id="saveBatch" useGeneratedKeys="true" keyProperty="id" > insert into attachment (file_key,file_path,file_url,file_name,file_suffix,file_desc,file_size,file_type,module,del_flag ,create_by,create_time,update_by,update_time)values <foreach collection="attachmentList" item="attachment" separator=","> (#{attachment.fileKey},#{attachment.filePath},#{attachment.fileUrl},#{attachment.fileName},#{attachment.fileSuffix},#{attachment.fileDesc}, #{attachment.fileSize},#{attachment.fileType},#{attachment.module},#{attachment.delFlag},#{attachment.createBy}, #{attachment.createTime},#{attachment.updateBy},#{attachment.updateTime}) </foreach> </insert> <update id="updateBusinessIdBatch"> <foreach collection="attachmentList" item="attachment" separator=";"> update attachment set business_id = #{attachment.businessId} where id = #{attachment.id} </foreach> </update> <update id="deleteByBusinessId"> update attachment set del_flag = 1 where business_id = #{businessId} </update> </mapper> ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java
@@ -29,7 +29,7 @@ * * @author ruoyi */ @Configuration /*@Configuration*/ public class MyBatisConfig { @Autowired ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java
@@ -2,6 +2,7 @@ import java.util.concurrent.TimeUnit; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.CacheControl; @@ -23,6 +24,9 @@ @Configuration public class ResourcesConfig implements WebMvcConfigurer { @Value("${file.path.dcPath}") private String dcPath; @Autowired private RepeatSubmitInterceptor repeatSubmitInterceptor; @@ -33,10 +37,14 @@ registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**") .addResourceLocations("file:" + RuoYiConfig.getProfile() + "/"); /** swagger配置 */ registry.addResourceHandler("/swagger-ui/**") .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/") .setCacheControl(CacheControl.maxAge(5, TimeUnit.HOURS).cachePublic());; .setCacheControl(CacheControl.maxAge(5, TimeUnit.HOURS).cachePublic()); //文件访问路径 registry.addResourceHandler("/uploadfile/**") .addResourceLocations("file:" + dcPath); } /** ruoyi-ui/.editorconfig
文件已删除 ruoyi-ui/.env.development
文件已删除 ruoyi-ui/.env.production
文件已删除 ruoyi-ui/.env.staging
文件已删除 ruoyi-ui/.eslintignore
文件已删除 ruoyi-ui/.eslintrc.js
文件已删除 ruoyi-ui/.gitignore
文件已删除 ruoyi-ui/README.md
文件已删除 ruoyi-ui/babel.config.js
文件已删除 ruoyi-ui/bin/build.bat
文件已删除 ruoyi-ui/bin/package.bat
文件已删除 ruoyi-ui/bin/run-web.bat
文件已删除 ruoyi-ui/build/index.js
文件已删除 ruoyi-ui/package.json
文件已删除 ruoyi-ui/public/favicon.icoBinary files differ
ruoyi-ui/public/html/ie.html
文件已删除 ruoyi-ui/public/index.html
文件已删除 ruoyi-ui/public/robots.txt
文件已删除 ruoyi-ui/src/App.vue
文件已删除 ruoyi-ui/src/api/login.js
文件已删除 ruoyi-ui/src/api/menu.js
文件已删除 ruoyi-ui/src/api/monitor/cache.js
文件已删除 ruoyi-ui/src/api/monitor/job.js
文件已删除 ruoyi-ui/src/api/monitor/jobLog.js
文件已删除 ruoyi-ui/src/api/monitor/logininfor.js
文件已删除 ruoyi-ui/src/api/monitor/online.js
文件已删除 ruoyi-ui/src/api/monitor/operlog.js
文件已删除 ruoyi-ui/src/api/monitor/server.js
文件已删除 ruoyi-ui/src/api/system/config.js
文件已删除 ruoyi-ui/src/api/system/dept.js
文件已删除 ruoyi-ui/src/api/system/dict/data.js
文件已删除 ruoyi-ui/src/api/system/dict/type.js
文件已删除 ruoyi-ui/src/api/system/menu.js
文件已删除 ruoyi-ui/src/api/system/notice.js
文件已删除 ruoyi-ui/src/api/system/post.js
文件已删除 ruoyi-ui/src/api/system/role.js
文件已删除 ruoyi-ui/src/api/system/user.js
文件已删除 ruoyi-ui/src/api/tool/gen.js
文件已删除 ruoyi-ui/src/assets/401_images/401.gifBinary files differ
ruoyi-ui/src/assets/404_images/404.pngBinary files differ
ruoyi-ui/src/assets/404_images/404_cloud.pngBinary files differ
ruoyi-ui/src/assets/icons/index.js
文件已删除 ruoyi-ui/src/assets/icons/svg/404.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/bug.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/build.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/button.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/cascader.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/chart.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/checkbox.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/clipboard.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/code.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/color.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/component.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/dashboard.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/date-range.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/date.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/dict.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/documentation.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/download.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/drag.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/druid.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/edit.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/education.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/email.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/example.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/excel.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/exit-fullscreen.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/eye-open.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/eye.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/form.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/fullscreen.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/github.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/guide.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/icon.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/input.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/international.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/job.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/language.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/link.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/list.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/lock.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/log.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/logininfor.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/message.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/money.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/monitor.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/nested.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/number.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/online.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/password.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/pdf.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/people.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/peoples.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/phone.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/post.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/qq.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/question.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/radio.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/rate.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/redis-list.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/redis.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/row.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/search.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/select.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/server.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/shopping.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/size.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/skill.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/slider.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/star.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/swagger.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/switch.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/system.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/tab.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/table.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/textarea.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/theme.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/time-range.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/time.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/tool.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/tree-table.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/tree.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/upload.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/user.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/validCode.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/wechat.svg
文件已删除 ruoyi-ui/src/assets/icons/svg/zip.svg
文件已删除 ruoyi-ui/src/assets/icons/svgo.yml
文件已删除 ruoyi-ui/src/assets/images/dark.svg
文件已删除 ruoyi-ui/src/assets/images/light.svg
文件已删除 ruoyi-ui/src/assets/images/login-background.jpgBinary files differ
ruoyi-ui/src/assets/images/pay.pngBinary files differ
ruoyi-ui/src/assets/images/profile.jpgBinary files differ
ruoyi-ui/src/assets/logo/logo.pngBinary files differ
ruoyi-ui/src/assets/styles/btn.scss
文件已删除 ruoyi-ui/src/assets/styles/element-ui.scss
文件已删除 ruoyi-ui/src/assets/styles/element-variables.scss
文件已删除 ruoyi-ui/src/assets/styles/index.scss
文件已删除 ruoyi-ui/src/assets/styles/mixin.scss
文件已删除 ruoyi-ui/src/assets/styles/ruoyi.scss
文件已删除 ruoyi-ui/src/assets/styles/sidebar.scss
文件已删除 ruoyi-ui/src/assets/styles/transition.scss
文件已删除 ruoyi-ui/src/assets/styles/variables.scss
文件已删除 ruoyi-ui/src/components/Breadcrumb/index.vue
文件已删除 ruoyi-ui/src/components/Crontab/day.vue
文件已删除 ruoyi-ui/src/components/Crontab/hour.vue
文件已删除 ruoyi-ui/src/components/Crontab/index.vue
文件已删除 ruoyi-ui/src/components/Crontab/min.vue
文件已删除 ruoyi-ui/src/components/Crontab/month.vue
文件已删除 ruoyi-ui/src/components/Crontab/result.vue
文件已删除 ruoyi-ui/src/components/Crontab/second.vue
文件已删除 ruoyi-ui/src/components/Crontab/week.vue
文件已删除 ruoyi-ui/src/components/Crontab/year.vue
文件已删除 ruoyi-ui/src/components/DictData/index.js
文件已删除 ruoyi-ui/src/components/DictTag/index.vue
文件已删除 ruoyi-ui/src/components/Editor/index.vue
文件已删除 ruoyi-ui/src/components/FileUpload/index.vue
文件已删除 ruoyi-ui/src/components/Hamburger/index.vue
文件已删除 ruoyi-ui/src/components/HeaderSearch/index.vue
文件已删除 ruoyi-ui/src/components/IconSelect/index.vue
文件已删除 ruoyi-ui/src/components/IconSelect/requireIcons.js
文件已删除 ruoyi-ui/src/components/ImagePreview/index.vue
文件已删除 ruoyi-ui/src/components/ImageUpload/index.vue
文件已删除 ruoyi-ui/src/components/Pagination/index.vue
文件已删除 ruoyi-ui/src/components/PanThumb/index.vue
文件已删除 ruoyi-ui/src/components/ParentView/index.vue
文件已删除 ruoyi-ui/src/components/RightPanel/index.vue
文件已删除 ruoyi-ui/src/components/RightToolbar/index.vue
文件已删除 ruoyi-ui/src/components/RuoYi/Doc/index.vue
文件已删除 ruoyi-ui/src/components/RuoYi/Git/index.vue
文件已删除 ruoyi-ui/src/components/Screenfull/index.vue
文件已删除 ruoyi-ui/src/components/SizeSelect/index.vue
文件已删除 ruoyi-ui/src/components/SvgIcon/index.vue
文件已删除 ruoyi-ui/src/components/ThemePicker/index.vue
文件已删除 ruoyi-ui/src/components/TopNav/index.vue
文件已删除 ruoyi-ui/src/components/iFrame/index.vue
文件已删除 ruoyi-ui/src/directive/dialog/drag.js
文件已删除 ruoyi-ui/src/directive/dialog/dragHeight.js
文件已删除 ruoyi-ui/src/directive/dialog/dragWidth.js
文件已删除 ruoyi-ui/src/directive/index.js
文件已删除 ruoyi-ui/src/directive/module/clipboard.js
文件已删除 ruoyi-ui/src/directive/permission/hasPermi.js
文件已删除 ruoyi-ui/src/directive/permission/hasRole.js
文件已删除 ruoyi-ui/src/layout/components/AppMain.vue
文件已删除 ruoyi-ui/src/layout/components/IframeToggle/index.vue
文件已删除 ruoyi-ui/src/layout/components/InnerLink/index.vue
文件已删除 ruoyi-ui/src/layout/components/Navbar.vue
文件已删除 ruoyi-ui/src/layout/components/Settings/index.vue
文件已删除 ruoyi-ui/src/layout/components/Sidebar/FixiOSBug.js
文件已删除 ruoyi-ui/src/layout/components/Sidebar/Item.vue
文件已删除 ruoyi-ui/src/layout/components/Sidebar/Link.vue
文件已删除 ruoyi-ui/src/layout/components/Sidebar/Logo.vue
文件已删除 ruoyi-ui/src/layout/components/Sidebar/SidebarItem.vue
文件已删除 ruoyi-ui/src/layout/components/Sidebar/index.vue
文件已删除 ruoyi-ui/src/layout/components/TagsView/ScrollPane.vue
文件已删除 ruoyi-ui/src/layout/components/TagsView/index.vue
文件已删除 ruoyi-ui/src/layout/components/index.js
文件已删除 ruoyi-ui/src/layout/index.vue
文件已删除 ruoyi-ui/src/layout/mixin/ResizeHandler.js
文件已删除 ruoyi-ui/src/main.js
文件已删除 ruoyi-ui/src/permission.js
文件已删除 ruoyi-ui/src/plugins/auth.js
文件已删除 ruoyi-ui/src/plugins/cache.js
文件已删除 ruoyi-ui/src/plugins/download.js
文件已删除 ruoyi-ui/src/plugins/index.js
文件已删除 ruoyi-ui/src/plugins/modal.js
文件已删除 ruoyi-ui/src/plugins/tab.js
文件已删除 ruoyi-ui/src/router/index.js
文件已删除 ruoyi-ui/src/settings.js
文件已删除 ruoyi-ui/src/store/getters.js
文件已删除 ruoyi-ui/src/store/index.js
文件已删除 ruoyi-ui/src/store/modules/app.js
文件已删除 ruoyi-ui/src/store/modules/dict.js
文件已删除 ruoyi-ui/src/store/modules/permission.js
文件已删除 ruoyi-ui/src/store/modules/settings.js
文件已删除 ruoyi-ui/src/store/modules/tagsView.js
文件已删除 ruoyi-ui/src/store/modules/user.js
文件已删除 ruoyi-ui/src/utils/auth.js
文件已删除 ruoyi-ui/src/utils/dict/Dict.js
文件已删除 ruoyi-ui/src/utils/dict/DictConverter.js
文件已删除 ruoyi-ui/src/utils/dict/DictData.js
文件已删除 ruoyi-ui/src/utils/dict/DictMeta.js
文件已删除 ruoyi-ui/src/utils/dict/DictOptions.js
文件已删除 ruoyi-ui/src/utils/dict/index.js
文件已删除 ruoyi-ui/src/utils/errorCode.js
文件已删除 ruoyi-ui/src/utils/generator/config.js
文件已删除 ruoyi-ui/src/utils/generator/css.js
文件已删除 ruoyi-ui/src/utils/generator/drawingDefault.js
文件已删除 ruoyi-ui/src/utils/generator/html.js
文件已删除 ruoyi-ui/src/utils/generator/icon.json
文件已删除 ruoyi-ui/src/utils/generator/js.js
文件已删除 ruoyi-ui/src/utils/generator/render.js
文件已删除 ruoyi-ui/src/utils/index.js
文件已删除 ruoyi-ui/src/utils/jsencrypt.js
文件已删除 ruoyi-ui/src/utils/permission.js
文件已删除 ruoyi-ui/src/utils/request.js
文件已删除 ruoyi-ui/src/utils/ruoyi.js
文件已删除 ruoyi-ui/src/utils/scroll-to.js
文件已删除 ruoyi-ui/src/utils/validate.js
文件已删除 ruoyi-ui/src/views/components/icons/element-icons.js
文件已删除 ruoyi-ui/src/views/components/icons/index.vue
文件已删除 ruoyi-ui/src/views/components/icons/svg-icons.js
文件已删除 ruoyi-ui/src/views/dashboard/BarChart.vue
文件已删除 ruoyi-ui/src/views/dashboard/LineChart.vue
文件已删除 ruoyi-ui/src/views/dashboard/PanelGroup.vue
文件已删除 ruoyi-ui/src/views/dashboard/PieChart.vue
文件已删除 ruoyi-ui/src/views/dashboard/RaddarChart.vue
文件已删除 ruoyi-ui/src/views/dashboard/mixins/resize.js
文件已删除 ruoyi-ui/src/views/error/401.vue
文件已删除 ruoyi-ui/src/views/error/404.vue
文件已删除 ruoyi-ui/src/views/index.vue
文件已删除 ruoyi-ui/src/views/index_v1.vue
文件已删除 ruoyi-ui/src/views/login.vue
文件已删除 ruoyi-ui/src/views/monitor/cache/index.vue
文件已删除 ruoyi-ui/src/views/monitor/cache/list.vue
文件已删除 ruoyi-ui/src/views/monitor/druid/index.vue
文件已删除 ruoyi-ui/src/views/monitor/job/index.vue
文件已删除 ruoyi-ui/src/views/monitor/job/log.vue
文件已删除 ruoyi-ui/src/views/monitor/logininfor/index.vue
文件已删除 ruoyi-ui/src/views/monitor/online/index.vue
文件已删除 ruoyi-ui/src/views/monitor/operlog/index.vue
文件已删除 ruoyi-ui/src/views/monitor/server/index.vue
文件已删除 ruoyi-ui/src/views/redirect.vue
文件已删除 ruoyi-ui/src/views/register.vue
文件已删除 ruoyi-ui/src/views/system/config/index.vue
文件已删除 ruoyi-ui/src/views/system/dept/index.vue
文件已删除 ruoyi-ui/src/views/system/dict/data.vue
文件已删除 ruoyi-ui/src/views/system/dict/index.vue
文件已删除 ruoyi-ui/src/views/system/menu/index.vue
文件已删除 ruoyi-ui/src/views/system/notice/index.vue
文件已删除 ruoyi-ui/src/views/system/post/index.vue
文件已删除 ruoyi-ui/src/views/system/role/authUser.vue
文件已删除 ruoyi-ui/src/views/system/role/index.vue
文件已删除 ruoyi-ui/src/views/system/role/selectUser.vue
文件已删除 ruoyi-ui/src/views/system/user/authRole.vue
文件已删除 ruoyi-ui/src/views/system/user/index.vue
文件已删除 ruoyi-ui/src/views/system/user/profile/index.vue
文件已删除 ruoyi-ui/src/views/system/user/profile/resetPwd.vue
文件已删除 ruoyi-ui/src/views/system/user/profile/userAvatar.vue
文件已删除 ruoyi-ui/src/views/system/user/profile/userInfo.vue
文件已删除 ruoyi-ui/src/views/tool/build/CodeTypeDialog.vue
文件已删除 ruoyi-ui/src/views/tool/build/DraggableItem.vue
文件已删除 ruoyi-ui/src/views/tool/build/IconsDialog.vue
文件已删除 ruoyi-ui/src/views/tool/build/RightPanel.vue
文件已删除 ruoyi-ui/src/views/tool/build/TreeNodeDialog.vue
文件已删除 ruoyi-ui/src/views/tool/build/index.vue
文件已删除 ruoyi-ui/src/views/tool/gen/basicInfoForm.vue
文件已删除 ruoyi-ui/src/views/tool/gen/editTable.vue
文件已删除 ruoyi-ui/src/views/tool/gen/genInfoForm.vue
文件已删除 ruoyi-ui/src/views/tool/gen/importTable.vue
文件已删除 ruoyi-ui/src/views/tool/gen/index.vue
文件已删除 ruoyi-ui/src/views/tool/swagger/index.vue
文件已删除 ruoyi-ui/vue.config.js
文件已删除