diff --git a/src/main/java/com/sztzjy/forex/trading_trading/ForeignExchangeTradingApplication.java b/src/main/java/com/sztzjy/forex/trading_trading/ForeignExchangeTradingApplication.java index 729f258..45dce7e 100644 --- a/src/main/java/com/sztzjy/forex/trading_trading/ForeignExchangeTradingApplication.java +++ b/src/main/java/com/sztzjy/forex/trading_trading/ForeignExchangeTradingApplication.java @@ -2,7 +2,9 @@ package com.sztzjy.forex.trading_trading; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; +@EnableScheduling @SpringBootApplication public class ForeignExchangeTradingApplication { diff --git a/src/main/java/com/sztzjy/forex/trading_trading/config/security/WebConfigurerAdapter.java b/src/main/java/com/sztzjy/forex/trading_trading/config/security/WebConfigurerAdapter.java index 9934c9e..3d68fb8 100644 --- a/src/main/java/com/sztzjy/forex/trading_trading/config/security/WebConfigurerAdapter.java +++ b/src/main/java/com/sztzjy/forex/trading_trading/config/security/WebConfigurerAdapter.java @@ -1,5 +1,8 @@ package com.sztzjy.forex.trading_trading.config.security; +import com.sztzjy.forex.trading_trading.util.file.IFileUtil; +import com.sztzjy.forex.trading_trading.util.file.LocalFileUtil; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.support.ReloadableResourceBundleMessageSource; @@ -25,7 +28,10 @@ public class WebConfigurerAdapter implements WebMvcConfigurer { @Resource private StringHttpMessageConverter stringHttpMessageConverter; - + @Value("${file.type}") + private String fileType; + @Value("${file.path}") + private String filePath; @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); @@ -60,4 +66,13 @@ public class WebConfigurerAdapter implements WebMvcConfigurer { } } } + + @Bean + public IFileUtil getFileUtil() { + if (fileType.equals("local")) { + return new LocalFileUtil(filePath); + } else { + throw new IllegalArgumentException("未知文件工具类注入类型"); + } + } } diff --git a/src/main/java/com/sztzjy/forex/trading_trading/controller/MemberController.java b/src/main/java/com/sztzjy/forex/trading_trading/controller/MemberController.java index 370ec91..c9f4520 100644 --- a/src/main/java/com/sztzjy/forex/trading_trading/controller/MemberController.java +++ b/src/main/java/com/sztzjy/forex/trading_trading/controller/MemberController.java @@ -1,13 +1,20 @@ package com.sztzjy.forex.trading_trading.controller; +import com.github.pagehelper.PageInfo; import com.sztzjy.forex.trading_trading.annotation.AnonymousAccess; +import com.sztzjy.forex.trading_trading.annotation.Permission; +import com.sztzjy.forex.trading_trading.annotation.aspect.PermissionType; +import com.sztzjy.forex.trading_trading.dto.MemberVO; import com.sztzjy.forex.trading_trading.entity.Member; import com.sztzjy.forex.trading_trading.service.MemberService; +import com.sztzjy.forex.trading_trading.util.ResultEntity; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileNotFoundException; @RestController @@ -19,8 +26,31 @@ public class MemberController { @AnonymousAccess @PostMapping("getMember") - public Member getMember(@RequestBody String memberId){ + public Member getMember(@RequestBody String memberId) { Member member = memberService.selectByPrimaryKey(memberId); return member; } + + @Permission(codes = PermissionType.TRAINING_MANAGEMENT_SEARCH) + @ApiOperation("教师端----首页用户操作数据展示(分页)") + @GetMapping("pagedListMembers") + public ResultEntity> pagedListMembers(@ApiParam("班级名称") String className, + @ApiParam("实训名称") String trainingName, + @ApiParam("评分状态") Integer markStatus, + @ApiParam("查询关键字:学号或学生名称") String keyword) { + + PageInfo pageInfo = memberService.pagedListMembers(className, trainingName, markStatus, keyword); + return new ResultEntity>(pageInfo); + } + + @Permission(codes = PermissionType.TRAINING_MANAGEMENT_SEARCH) + @ApiOperation("教师端首页排行榜数据导出") + @GetMapping("exportMembers") + public void exportMembers(@ApiParam("班级名称") String className, + @ApiParam("实训名称") String trainingName, + @ApiParam("评分状态") Integer markStatus, + @ApiParam("查询关键字:学号或学生名称") String keyword, + HttpServletResponse response) throws FileNotFoundException { + memberService.exportMembers(className, trainingName, markStatus, keyword, response); + } } diff --git a/src/main/java/com/sztzjy/forex/trading_trading/controller/TrainingController.java b/src/main/java/com/sztzjy/forex/trading_trading/controller/TrainingController.java index 722ab4e..246784d 100644 --- a/src/main/java/com/sztzjy/forex/trading_trading/controller/TrainingController.java +++ b/src/main/java/com/sztzjy/forex/trading_trading/controller/TrainingController.java @@ -64,12 +64,14 @@ public class TrainingController { } + @Permission(codes = PermissionType.TRAINING_MANAGEMENT_DEL) - @ApiOperation("教师端----删除一条实训记录") + @ApiOperation("教师端----删除指定实训记录") @PostMapping("deleteById") public ResultEntity deleteById(@ApiParam("实训记录id") @RequestParam String trainingId) { trainingService.delete(trainingId); //TODO 同步删除member表数据 +// memberService return new ResultEntity(HttpStatus.OK); } @@ -87,7 +89,7 @@ public class TrainingController { @Permission(codes = PermissionType.TRAINING_MANAGEMENT_SEARCH) @ApiOperation("教师端----根据实训记录id查询实训记录") - @GetMapping("training/{id}") + @GetMapping public ResultEntity get(@ApiParam("实训记录id") @PathVariable String id) { //TODO 后续还有根据实训id查看排行榜等需求待实现 @@ -115,7 +117,7 @@ public class TrainingController { @Permission(codes = PermissionType.TRAINING_MANAGEMENT_ADD) @ApiOperation("教师端----添加实训成员时用:获取班级列表") @GetMapping("findClassNameList") - public ResultEntity>> findClassNameList(Integer majorId) { + public ResultEntity>> findClassNameList(@ApiParam("专业Id") Integer majorId) { JwtUser currentUser = TokenProvider.getJWTUser(request); List> mapList; if (majorId == null || majorId == 0) { @@ -219,4 +221,19 @@ public class TrainingController { String username = currentUser.getUsername(); return new ResultEntity>(HttpStatus.OK, trainingService.findTrainingList(index,size,schoolId, username)); } + + +// @Permission(codes = PermissionType.TRAINING_MANAGEMENT_ADD) +// @ApiOperation("设置成绩权重") +// @PostMapping("/setScoreWeight") +// public ResultEntity setScoreWeight(@ApiParam("成绩权重") @RequestParam String scoreWeight) { +// Assert.notNull(trainingId, "实训记录不存在"); +// Assert.notNull(scoreWeight, "成绩权重不能为空"); +// Training training = trainingService.findById(trainingId); +// Assert.notNull(training, "实训记录不存在"); +// training.setScoreWeight(scoreWeight); +// trainingService.updateById(training); +// return new ResultEntity(HttpStatus.OK); +// } + } diff --git a/src/main/java/com/sztzjy/forex/trading_trading/dto/MemberVO.java b/src/main/java/com/sztzjy/forex/trading_trading/dto/MemberVO.java new file mode 100644 index 0000000..b47ff7d --- /dev/null +++ b/src/main/java/com/sztzjy/forex/trading_trading/dto/MemberVO.java @@ -0,0 +1,40 @@ +package com.sztzjy.forex.trading_trading.dto; + + +import com.sztzjy.forex.trading_trading.entity.Member; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.List; + +@ApiModel("教师端用户操作数据出参") +@Getter +@Setter +@Data +public class MemberVO { + + @ApiModelProperty("实训名称") + public String trainingName; + @ApiModelProperty("班级名称") + public String classGrade; + @ApiModelProperty("学生姓名") + public String name; + @ApiModelProperty("学生学号") + public String studentNumber; + @ApiModelProperty("累计收益") + public Double cumulativeProfitLoss; + @ApiModelProperty("收益率") + public Double yield; + @ApiModelProperty("交易实训成绩") + public Double tradeTrainingScore; + @ApiModelProperty("实训报告成绩") + public Double trainingReportScore; + @ApiModelProperty("总成绩") + public Double totalScore; + @ApiModelProperty("排名") + public Integer stuRank; +} diff --git a/src/main/java/com/sztzjy/forex/trading_trading/mappers/MemberMapper.java b/src/main/java/com/sztzjy/forex/trading_trading/mappers/MemberMapper.java index d7f0953..3854dc9 100644 --- a/src/main/java/com/sztzjy/forex/trading_trading/mappers/MemberMapper.java +++ b/src/main/java/com/sztzjy/forex/trading_trading/mappers/MemberMapper.java @@ -1,5 +1,6 @@ package com.sztzjy.forex.trading_trading.mappers; +import com.sztzjy.forex.trading_trading.dto.MemberVO; import com.sztzjy.forex.trading_trading.entity.Member; import com.sztzjy.forex.trading_trading.entity.MemberExample; import java.util.List; @@ -60,6 +61,10 @@ public interface MemberMapper { */ List selectByExample(MemberExample example); + + + List pagedListMembers(MemberExample example); + /** * This method was generated by MyBatis Generator. * This method corresponds to the database table sys_member diff --git a/src/main/java/com/sztzjy/forex/trading_trading/mappers/TrainingMapper.java b/src/main/java/com/sztzjy/forex/trading_trading/mappers/TrainingMapper.java index 0271f58..cb10935 100644 --- a/src/main/java/com/sztzjy/forex/trading_trading/mappers/TrainingMapper.java +++ b/src/main/java/com/sztzjy/forex/trading_trading/mappers/TrainingMapper.java @@ -10,6 +10,7 @@ import java.util.Map; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; @Mapper public interface TrainingMapper { @@ -110,4 +111,23 @@ public interface TrainingMapper { @Select("select training_id,training_name from sys_training where school_id=#{schoolId}") List> selectTrainingNameList(@Param("schoolId") Integer schoolId); + @Update("UPDATE sys_training " + + "SET status = " + + "CASE " + + " WHEN NOW() > end_time AND status <> 'FINISHED' THEN 'FINISHED' " + + " WHEN NOW() < start_time AND status <> 'NOT_STARTED' THEN 'NOT_STARTED' " + + " WHEN NOW() >= start_time AND NOW() <= end_time AND status <> 'ONGOING' THEN 'ONGOING' " + + " ELSE status limit 1" + + " END") + void updateTrainingStatus(); + + @Update("UPDATE sys_training " + + "SET status = 'FINISHED' " + + "WHERE NOW() > end_time AND status <> 'FINISHED'") + void updateTrainingStatusToEnd(); + + @Update("UPDATE sys_training " + + "SET status = 'ONGOING' " + + "WHERE NOW() >= start_time AND NOW() <= end_time AND status <> 'ONGOING'") + void updateTrainingStatusToInProgress(); } \ No newline at end of file diff --git a/src/main/java/com/sztzjy/forex/trading_trading/service/MemberService.java b/src/main/java/com/sztzjy/forex/trading_trading/service/MemberService.java index ae56856..59050d5 100644 --- a/src/main/java/com/sztzjy/forex/trading_trading/service/MemberService.java +++ b/src/main/java/com/sztzjy/forex/trading_trading/service/MemberService.java @@ -1,17 +1,32 @@ package com.sztzjy.forex.trading_trading.service; +import com.github.pagehelper.PageInfo; +import com.sztzjy.forex.trading_trading.dto.MemberVO; import com.sztzjy.forex.trading_trading.entity.Member; import com.sztzjy.forex.trading_trading.entity.MemberExample; import com.sztzjy.forex.trading_trading.mappers.MemberMapper; +import com.sztzjy.forex.trading_trading.util.excel.ExcelData; +import com.sztzjy.forex.trading_trading.util.excel.ExcelProvider; +import com.sztzjy.forex.trading_trading.util.file.IFileUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; @Service public class MemberService { @Autowired MemberMapper memberMapper; + @Autowired + IFileUtil fileUtil; public Member getMemberByMemberIdAndTrainingId(String memberId, String trainingId) { MemberExample example = new MemberExample(); @@ -37,11 +52,84 @@ public class MemberService { } } - public void insert(Member member){ - memberMapper.insert(member); + public void insert(Member member) { + memberMapper.insert(member); } - public void deleteById(String memberId){ + public void deleteById(String memberId) { memberMapper.deleteByPrimaryKey(memberId); } + + public PageInfo pagedListMembers(String className, + String trainingName, + Integer markStatus, + String keyword) { + MemberExample example = new MemberExample(); + MemberExample.Criteria criteria = example.createCriteria(); + if (StringUtils.hasText(className)) { + criteria.andClassGradeEqualTo(className); + } + if (StringUtils.hasText(trainingName)) { + criteria.andTrainingNameEqualTo(trainingName); + } + if (markStatus != null) { + //TODO 待确定评分状态 + } + if (StringUtils.hasText(keyword)) { + criteria.andNameLike("%" + keyword + "%"); + MemberExample.Criteria orCriteria = example.createCriteria(); + orCriteria.andStudentNumberEqualTo("%" + keyword + "%"); + example.or(orCriteria); + } + return new PageInfo<>(memberMapper.pagedListMembers(example)); + } + + + public void exportMembers(String className, + String trainingName, + Integer markStatus, + String keyword, + HttpServletResponse response) throws FileNotFoundException { + MemberExample example = new MemberExample(); + MemberExample.Criteria criteria = example.createCriteria(); + if (StringUtils.hasText(className)) { + criteria.andClassGradeEqualTo(className); + } + if (StringUtils.hasText(trainingName)) { + criteria.andTrainingNameEqualTo(trainingName); + } + if (markStatus != null) { + //TODO 待确定评分状态 + } + if (StringUtils.hasText(keyword)) { + criteria.andNameLike("%" + keyword + "%"); + MemberExample.Criteria orCriteria = example.createCriteria(); + orCriteria.andStudentNumberEqualTo("%" + keyword + "%"); + example.or(orCriteria); + } + List members = memberMapper.pagedListMembers(example); + Assert.notNull(members, "没有可导出数据"); + List titles = Arrays.asList("实训任务名称", "班级", "学号", "姓名", "排名", "累计盈亏", "收益率", "模拟交易实训成绩", "实训报告成绩", "总成绩"); + ExcelData excelData = ExcelData.create(titles); + for (MemberVO member : members) { + List rows = new ArrayList<>(); + rows.add(member.getTrainingName()); + rows.add(member.getClassGrade()); + rows.add(member.getStudentNumber()); + rows.add(member.getName()); + rows.add(member.getStuRank()); + rows.add(member.getCumulativeProfitLoss()); + rows.add(member.getYield()); + rows.add(member.getTradeTrainingScore()); + rows.add(member.getTrainingReportScore()); + rows.add(member.getTotalScore()); + excelData.addRow(rows) ; + } + String fileName = "学生排行榜数据.xlsx"; + String file = fileUtil.getFullPath(fileName); + FileOutputStream fileOut = new FileOutputStream(file); + ExcelProvider.SimpleExcelExport(excelData, fileOut); + fileUtil.download(response, fileName); + fileUtil.remove(file); + } } diff --git a/src/main/java/com/sztzjy/forex/trading_trading/service/ScheduledTask.java b/src/main/java/com/sztzjy/forex/trading_trading/service/ScheduledTask.java new file mode 100644 index 0000000..92fcf95 --- /dev/null +++ b/src/main/java/com/sztzjy/forex/trading_trading/service/ScheduledTask.java @@ -0,0 +1,24 @@ +package com.sztzjy.forex.trading_trading.service; + + +import com.sztzjy.forex.trading_trading.mappers.TrainingMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +/** + * 定时任务 + */ +@Service +public class ScheduledTask { + + @Autowired + TrainingMapper trainingMapper; + + + @Scheduled(cron = "0 * * * * *") // 修改实训状态 每分钟执行一次 + public void updateTrainingStatus() { + trainingMapper.updateTrainingStatusToInProgress(); + trainingMapper.updateTrainingStatusToEnd(); + } +} diff --git a/src/main/java/com/sztzjy/forex/trading_trading/util/excel/ExcelData.java b/src/main/java/com/sztzjy/forex/trading_trading/util/excel/ExcelData.java new file mode 100644 index 0000000..09f3ba2 --- /dev/null +++ b/src/main/java/com/sztzjy/forex/trading_trading/util/excel/ExcelData.java @@ -0,0 +1,45 @@ +package com.sztzjy.forex.trading_trading.util.excel; + +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * Excel通用数据对象封装 若需要复杂表头和更多样式等、需定义导出模板 + * + */ +@Getter +public class ExcelData { + private List> contents; + private ExcelData(){ + this.contents = new ArrayList<>(); + } + public ExcelData addRow(List rowData){ + List dataList = rowData.stream().map(i -> i==null?null:i.toString()).collect(Collectors.toList()); + this.contents.add(dataList); + return this; + } + + /** + * 创建无标题文档 + * + * @return / + */ + public static ExcelData create(){ + return ExcelData.create(null); + } + + /** + * 创建有标题文档 + * @param titleList 内容|标题 + * @return 数据对象 + */ + public static ExcelData create(List titleList){ + ExcelData excelData = new ExcelData(); + if(titleList!=null && !titleList.isEmpty()) + excelData.contents.add(titleList); + return excelData; + } +} \ No newline at end of file diff --git a/src/main/java/com/sztzjy/forex/trading_trading/util/excel/ExcelProvider.java b/src/main/java/com/sztzjy/forex/trading_trading/util/excel/ExcelProvider.java new file mode 100644 index 0000000..61203aa --- /dev/null +++ b/src/main/java/com/sztzjy/forex/trading_trading/util/excel/ExcelProvider.java @@ -0,0 +1,39 @@ +package com.sztzjy.forex.trading_trading.util.excel; + +import cn.hutool.poi.excel.ExcelUtil; +import cn.hutool.poi.excel.ExcelWriter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.Assert; + +import java.io.FileOutputStream; +import java.io.OutputStream; +import java.util.Arrays; + +public class ExcelProvider { + + private static Logger logger = LoggerFactory.getLogger(ExcelProvider.class); + + /** + * 简单通用excel导出 若需要复杂表头和更多样式等、需定义导出模板 + * 输出无样式的excel + * + * @param data 待导出的数据 + */ + public static void SimpleExcelExport(ExcelData data, OutputStream out){ + Assert.notNull(data, "无可导出的数据"); + Assert.notEmpty(data.getContents(), "无可导出的数据"); + ExcelWriter bigWriter = ExcelUtil.getBigWriter(); + bigWriter.write(data.getContents()); + bigWriter.flush(out,true); + } + + public static void main(String[] args) throws Exception { + ExcelData excelData = ExcelData.create(Arrays.asList("t1","t2")) + .addRow(Arrays.asList("11","12")) + .addRow(Arrays.asList("21","22")); + FileOutputStream fileOut = new FileOutputStream("D:/111.xlsx"); + ExcelProvider.SimpleExcelExport(excelData,fileOut); + fileOut.close(); + } +} diff --git a/src/main/java/com/sztzjy/forex/trading_trading/util/file/IFileUtil.java b/src/main/java/com/sztzjy/forex/trading_trading/util/file/IFileUtil.java new file mode 100644 index 0000000..7319d88 --- /dev/null +++ b/src/main/java/com/sztzjy/forex/trading_trading/util/file/IFileUtil.java @@ -0,0 +1,87 @@ +package com.sztzjy.forex.trading_trading.util.file; + + +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.InputStream; + +/** + * 文件上传下载接口定义 + * + * @author 陈沅 + */ +public interface IFileUtil { + + + + /** + * 从http请求上传文件 + * + * @param file form传参http文件对象 + * @return 返回文件在服务器上保存的相对路径 + */ + String upload(MultipartFile file); + + /** + * 根据文件流上传文件 + * + * @param objectName 指定文件名(带扩展名) + * @param fileIn 文件流 + * @return 返回文件在服务器上保存的相对路径 + */ + String upload(String objectName, InputStream fileIn); + + /** + * 删除服务器上的一个文件 + * + * @param path 文件在服务器上保存的相对路径 + * @return 返回true则表示删除成功 + */ + boolean remove(String path); + + /** + * 下载文件流,指定文件名 + * + * @param response + * @param fileName 指定下载文件名称 + * @param filePath 文件保存的相对路径 + */ + void download(HttpServletResponse response, String fileName, String filePath); + + /** + * 下载文件流,不指定文件名 + * + * @param response + * @param filePath 文件保存的相对路径 + */ + void download(HttpServletResponse response, String filePath); + + /** + * 相对路径 + * + * @param relativePath 文件保存的相对路径 + * @return 文件保存的绝对路径 + */ + String getFullPath(String relativePath); + + + /** + * 获取文件后缀名 + * + * @param fileName 文件名称 + * @return suffix + */ + String getSuffix(String fileName); + + + /** + * 获取文件存储至磁盘的相对路径 + * + * @param fileName 文件名 + * @param suffix 动态拼接的文件后缀,若该值为空则不拼接 + * @return 相对路径 + */ + String getDiskRelativePath(String fileName, String suffix); + +} diff --git a/src/main/java/com/sztzjy/forex/trading_trading/util/file/LocalFileUtil.java b/src/main/java/com/sztzjy/forex/trading_trading/util/file/LocalFileUtil.java new file mode 100644 index 0000000..2bab7fa --- /dev/null +++ b/src/main/java/com/sztzjy/forex/trading_trading/util/file/LocalFileUtil.java @@ -0,0 +1,175 @@ +package com.sztzjy.forex.trading_trading.util.file; + +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.IdUtil; +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.nio.file.Files; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +public class LocalFileUtil implements IFileUtil{ + + private final static List excludeSp = Arrays.asList("exe", "bin", "sh"); + + private final String localPath; + + public LocalFileUtil(String localPath) { + this.localPath = localPath; + } + + @Override + public String upload(MultipartFile file) { + return upload(null, file); + } + + @Override + public String upload(String objectName, InputStream fileIn) { + Assert.notNull(fileIn, "文件不能为空"); + Assert.hasText(objectName, "文件名为空"); + Assert.isTrue(objectName.lastIndexOf(".") > 0, "文件名称需携带扩展后缀"); + FileOutputStream out = null; + try { + String relativePath = getDiskRelativePath(objectName, null); + File file = new File(getFullPath(relativePath)); + file.getParentFile().mkdirs(); + out = new FileOutputStream(file); + byte[] buff = new byte[4096]; + int len; + while ((len = fileIn.read(buff)) != -1) { + out.write(buff, 0, len); + } + out.flush(); + return relativePath; + } catch (IOException e) { + e.printStackTrace(); + throw new IllegalArgumentException("上传文件失败,IO错误"); + } finally { + try { + fileIn.close(); + if (out != null) out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + @Override + public boolean remove(String path) { + if (!StringUtils.hasText(path)) return false; + File file = new File(getFullPath(path)); + Assert.isTrue(file.exists(), "文件已被删除或不存在该文件"); + return file.delete(); + } + + @Override + public void download(HttpServletResponse response, String fileName, String relativePath) { + Assert.hasText(relativePath, "路径为空"); + System.out.println("------------------------------------" + getFullPath(relativePath)); + File file = new File(getFullPath(relativePath)); + Assert.isTrue(file.exists(), "附件不存在"); + String sp = relativePath.substring(relativePath.lastIndexOf(".") + 1); + Assert.isTrue(!excludeSp.contains(sp.toLowerCase()), "文件类型错误"); + if (!StringUtils.hasText(fileName)) { + fileName = file.getName().substring(0, file.getName().lastIndexOf(".")); + } + InputStream fis = null; + try { + response.setContentType("application/octet-stream"); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode((fileName + "." + sp), CharsetUtil.UTF_8)); + fis = new BufferedInputStream(Files.newInputStream(file.toPath())); + response.addHeader("Content-Length", String.valueOf(fis.available())); + byte[] buff = new byte[4096]; + int len; + while ((len = fis.read(buff)) != -1) { + response.getOutputStream().write(buff, 0, len); + } + } catch (Exception e) { + throw new IllegalArgumentException("下载文件失败: " + e.getMessage()); + } finally { + try { + if (fis != null) fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + @Override + public void download(HttpServletResponse response, String relativePath) { + download(response, null, relativePath); + } + + @Override + public String getFullPath(String relativePath) { + if (!relativePath.startsWith("/")) { + relativePath = "/" + relativePath; + } + return localPath + relativePath; + } + + @Override + public String getSuffix(String fileName) { + Assert.hasText(fileName, "文件名不存在!"); + if (fileName.lastIndexOf(".") < 0) { + return null; + } + return fileName.substring(fileName.lastIndexOf(".") + 1); + } + + public String upload(String fileName, MultipartFile file) { + return upload(fileName, file, null); + } + + + @Override + public String getDiskRelativePath(String fileName, String suffix) { + Calendar c = Calendar.getInstance(); + Date d = new Date(); + c.setTime(d); + String year = Integer.toString(c.get(Calendar.YEAR)); + String month = Integer.toString(c.get(Calendar.MONTH) + 1); + String day = Integer.toString(c.get(Calendar.DATE)); + StringBuilder path = new StringBuilder(); + path.append("/").append(year) + .append("/").append(month) + .append("/").append(day) + .append("/").append(fileName); + if (StringUtils.hasText(suffix)) path.append(".").append(suffix); + return path.toString(); + } + + private String upload(String fileName, MultipartFile file, String relativePath) { + Assert.isTrue(!file.isEmpty(), "文件不存在"); + String originalFilename = file.getOriginalFilename(); + if (fileName == null) fileName = IdUtil.simpleUUID(); + String sp = getSuffix(originalFilename); + Assert.notNull(sp, "文件类型错误"); + Assert.isTrue(!excludeSp.contains(sp.toLowerCase()), "文件类型错误"); + try { + String filePath; + if (relativePath == null) { + filePath = getDiskRelativePath(fileName, sp); + } else { + relativePath = relativePath.endsWith("/") ? relativePath : relativePath + "/"; + filePath = relativePath + fileName + "." + sp; + } + + File destFile = new File(getFullPath(filePath)); + destFile.getParentFile().mkdirs(); + file.transferTo(destFile); + return filePath; + } catch (FileNotFoundException e) { + throw new IllegalArgumentException("上传文件失败,FileNotFound错误"); + } catch (IOException e) { + throw new IllegalArgumentException("上传文件失败,IO错误"); + } + } +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 7892ab5..48ffb4d 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -5,4 +5,10 @@ spring: url: jdbc:mysql://${DB_HOST:118.31.7.2}:${DB_PORT:3306}/${DB_NAME:foreign_exchange_trading}?useSSL=false&serverTimezone=UTC username: ${DB_USER:root} password: ${DB_PWD:sztzjy2017} - driver-class-name: com.mysql.cj.jdbc.Driver \ No newline at end of file + driver-class-name: com.mysql.cj.jdbc.Driver + + +# 文件存储 +file: + type: local + path: D:/home/planting_inspect/file \ No newline at end of file diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index 6ec8785..8d444ab 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -5,4 +5,10 @@ spring: url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:foreign_exchange_trading}?useSSL=false&serverTimezone=UTC username: ${DB_USER:root} password: ${DB_PWD:sztzjy2017} - driver-class-name: com.mysql.cj.jdbc.Driver \ No newline at end of file + driver-class-name: com.mysql.cj.jdbc.Driver + + +# 文件存储 +file: + type: local + path: /home/foreignExchangeTrading/file \ No newline at end of file diff --git a/src/main/resources/generatorConfig.xml b/src/main/resources/generatorConfig.xml index be07f85..df58856 100644 --- a/src/main/resources/generatorConfig.xml +++ b/src/main/resources/generatorConfig.xml @@ -26,7 +26,8 @@ - + +
diff --git a/src/main/resources/mappers/MemberMapper.xml b/src/main/resources/mappers/MemberMapper.xml index a8b6e28..161afbb 100644 --- a/src/main/resources/mappers/MemberMapper.xml +++ b/src/main/resources/mappers/MemberMapper.xml @@ -127,6 +127,25 @@ order by ${orderByClause} + + + select + + distinct + + + from sys_training + + + + + order by ${orderByClause} + + + + + + delete from sys_training + where training_id = #{trainingId,jdbcType=INTEGER} + + + + delete from sys_training + + + + + + + insert into sys_training (training_id, people_count, start_time, + end_time, status, creator_id, + create_school, training_name, creator_name, + create_time, update_time, school_id + ) + values (#{trainingId,jdbcType=VARCHAR}, #{peopleCount,jdbcType=INTEGER}, #{startTime,jdbcType=VARCHAR}, + #{endTime,jdbcType=TIMESTAMP}, #{status,jdbcType=VARCHAR}, #{creatorId,jdbcType=INTEGER}, + #{createSchool,jdbcType=VARCHAR}, #{trainingName,jdbcType=VARCHAR}, #{creatorName,jdbcType=VARCHAR}, + #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}, #{createSchoolId,jdbcType=INTEGER} + ) + + + + insert into sys_training + + + training_id, + + + people_count, + + + start_time, + + + end_time, + + + status, + + + creator_id, + + + create_school, + + + training_name, + + + creator_name, + + + create_time, + + + update_time, + + + school_id, + + + + + #{trainingId,jdbcType=INTEGER}, + + + #{peopleCount,jdbcType=INTEGER}, + + + #{startTime,jdbcType=VARCHAR}, + + + #{endTime,jdbcType=TIMESTAMP}, + + + #{status,jdbcType=VARCHAR}, + + + #{creatorId,jdbcType=INTEGER}, + + + #{createSchool,jdbcType=VARCHAR}, + + + #{trainingName,jdbcType=VARCHAR}, + + + #{creatorName,jdbcType=VARCHAR}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{updateTime,jdbcType=TIMESTAMP}, + + + #{schoolId,jdbcType=INTEGER}, + + + + - - select - - distinct - - - from sys_training - - - - - order by ${orderByClause} - - - - - - delete from sys_training - where training_id = #{trainingId,jdbcType=INTEGER} - - - - delete from sys_training - - - - - - - insert into sys_training (training_id, people_count, start_time, - end_time, status, creator_id, - create_school, training_name, creator_name, - create_time, update_time, school_id - ) - values (#{trainingId,jdbcType=VARCHAR}, #{peopleCount,jdbcType=INTEGER}, #{startTime,jdbcType=VARCHAR}, - #{endTime,jdbcType=TIMESTAMP}, #{status,jdbcType=VARCHAR}, #{creatorId,jdbcType=INTEGER}, - #{createSchool,jdbcType=VARCHAR}, #{trainingName,jdbcType=VARCHAR}, #{creatorName,jdbcType=VARCHAR}, - #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}, #{createSchoolId,jdbcType=INTEGER} - ) - - - - insert into sys_training - - - training_id, - - - people_count, - - - start_time, - - - end_time, - - - status, - - - creator_id, - - - create_school, - - - training_name, - - - creator_name, - - - create_time, - - - update_time, - - - school_id, - - - - - #{trainingId,jdbcType=INTEGER}, - - - #{peopleCount,jdbcType=INTEGER}, - - - #{startTime,jdbcType=VARCHAR}, - - - #{endTime,jdbcType=TIMESTAMP}, - - - #{status,jdbcType=VARCHAR}, - - - #{creatorId,jdbcType=INTEGER}, - - - #{createSchool,jdbcType=VARCHAR}, - - - #{trainingName,jdbcType=VARCHAR}, - - - #{creatorName,jdbcType=VARCHAR}, - - - #{createTime,jdbcType=TIMESTAMP}, - - - #{updateTime,jdbcType=TIMESTAMP}, - - - #{schoolId,jdbcType=INTEGER}, - - - - - - - update sys_training - - - training_id = #{record.trainingId,jdbcType=VARCHAR}, - - + + + + update sys_training + + + training_id = #{record.trainingId,jdbcType=VARCHAR}, + + + people_count = #{record.peopleCount,jdbcType=INTEGER}, + + + start_time = #{record.startTime,jdbcType=VARCHAR}, + + + end_time = #{record.endTime,jdbcType=TIMESTAMP}, + + + status = #{record.status,jdbcType=VARCHAR}, + + + creator_id = #{record.creatorId,jdbcType=INTEGER}, + + + create_school = #{record.createSchool,jdbcType=VARCHAR}, + + + training_name = #{record.trainingName,jdbcType=VARCHAR}, + + + creator_name = #{record.creatorName,jdbcType=VARCHAR}, + + + create_time = #{record.createTime,jdbcType=TIMESTAMP}, + + + update_time = #{record.updateTime,jdbcType=TIMESTAMP}, + + + school_id = #{record.schoolId,jdbcType=INTEGER}, + + + + + + + + + update sys_training + set training_id = #{record.trainingId,jdbcType=INTEGER}, people_count = #{record.peopleCount,jdbcType=INTEGER}, - - start_time = #{record.startTime,jdbcType=VARCHAR}, - - end_time = #{record.endTime,jdbcType=TIMESTAMP}, - - status = #{record.status,jdbcType=VARCHAR}, - - creator_id = #{record.creatorId,jdbcType=INTEGER}, - - create_school = #{record.createSchool,jdbcType=VARCHAR}, - - training_name = #{record.trainingName,jdbcType=VARCHAR}, - - creator_name = #{record.creatorName,jdbcType=VARCHAR}, - - create_time = #{record.createTime,jdbcType=TIMESTAMP}, - - update_time = #{record.updateTime,jdbcType=TIMESTAMP}, - - - school_id = #{record.schoolId,jdbcType=INTEGER}, - - - - - - - - - update sys_training - set training_id = #{record.trainingId,jdbcType=INTEGER}, - people_count = #{record.peopleCount,jdbcType=INTEGER}, - start_time = #{record.startTime,jdbcType=VARCHAR}, - end_time = #{record.endTime,jdbcType=TIMESTAMP}, - status = #{record.status,jdbcType=VARCHAR}, - creator_id = #{record.creatorId,jdbcType=INTEGER}, - create_school = #{record.createSchool,jdbcType=VARCHAR}, - training_name = #{record.trainingName,jdbcType=VARCHAR}, - creator_name = #{record.creatorName,jdbcType=VARCHAR}, - create_time = #{record.createTime,jdbcType=TIMESTAMP}, - update_time = #{record.updateTime,jdbcType=TIMESTAMP}, - school_id = #{record.schoolId,jdbcType=INTEGER} - - - - - - - update sys_training - - - people_count = #{peopleCount,jdbcType=INTEGER}, - - + school_id = #{record.schoolId,jdbcType=INTEGER} + + + + + + + update sys_training + + + people_count = #{peopleCount,jdbcType=INTEGER}, + + + start_time = #{startTime,jdbcType=VARCHAR}, + + + end_time = #{endTime,jdbcType=TIMESTAMP}, + + + status = #{status,jdbcType=VARCHAR}, + + + creator_id = #{creatorId,jdbcType=INTEGER}, + + + create_school = #{createSchool,jdbcType=VARCHAR}, + + + training_name = #{trainingName,jdbcType=VARCHAR}, + + + creator_name = #{creatorName,jdbcType=VARCHAR}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + update_time = #{updateTime,jdbcType=TIMESTAMP}, + + + school_id = #{schoolId,jdbcType=INTEGER}, + + + where training_id = #{trainingId,jdbcType=INTEGER} + + + + update sys_training + set people_count = #{peopleCount,jdbcType=INTEGER}, start_time = #{startTime,jdbcType=VARCHAR}, - - end_time = #{endTime,jdbcType=TIMESTAMP}, - - status = #{status,jdbcType=VARCHAR}, - - creator_id = #{creatorId,jdbcType=INTEGER}, - - create_school = #{createSchool,jdbcType=VARCHAR}, - - training_name = #{trainingName,jdbcType=VARCHAR}, - - creator_name = #{creatorName,jdbcType=VARCHAR}, - - create_time = #{createTime,jdbcType=TIMESTAMP}, - - update_time = #{updateTime,jdbcType=TIMESTAMP}, - - - school_id = #{schoolId,jdbcType=INTEGER}, - - - where training_id = #{trainingId,jdbcType=INTEGER} - - - - update sys_training - set people_count = #{peopleCount,jdbcType=INTEGER}, - start_time = #{startTime,jdbcType=VARCHAR}, - end_time = #{endTime,jdbcType=TIMESTAMP}, - status = #{status,jdbcType=VARCHAR}, - creator_id = #{creatorId,jdbcType=INTEGER}, - create_school = #{createSchool,jdbcType=VARCHAR}, - training_name = #{trainingName,jdbcType=VARCHAR}, - creator_name = #{creatorName,jdbcType=VARCHAR}, - create_time = #{createTime,jdbcType=TIMESTAMP}, - update_time = #{updateTime,jdbcType=TIMESTAMP}, - school_id = #{schoolId,jdbcType=INTEGER} - where training_id = #{trainingId,jdbcType=INTEGER} - - + select * from training + + + + + + ORDER BY ${safeOrderByClause} + + + limit #{offset}, #{pageSize} + + + + end_time THEN 'FINISHED' + WHEN NOW() < start_time THEN 'NOT_STARTED' + ELSE 'ONGOING' + END + ]]> + - limit #{offset}, #{pageSize} - \ No newline at end of file