From c92c80f00dc9c42dac53e8e933ff2d8200a757bf Mon Sep 17 00:00:00 2001 From: super Date: Sat, 28 Oct 2023 00:37:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BE=9B=E6=9F=A5=E8=AF=A2=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/controller/LoginController.java | 150 +++++++-------- .../controller/CetEnglishController.java | 172 ++++++++++++++++++ .../demo/superlilu/entity/CetEnglish.java | 106 +++++++++++ .../superlilu/mapper/CetEnglishMapper.java | 17 ++ .../superlilu/mapper/xml/CetEnglishMapper.xml | 5 + .../superlilu/service/ICetEnglishService.java | 19 ++ .../service/impl/CetEnglishServiceImpl.java | 86 +++++++++ 7 files changed, 480 insertions(+), 75 deletions(-) create mode 100644 jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/demo/superlilu/controller/CetEnglishController.java create mode 100644 jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/demo/superlilu/entity/CetEnglish.java create mode 100644 jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/demo/superlilu/mapper/CetEnglishMapper.java create mode 100644 jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/demo/superlilu/mapper/xml/CetEnglishMapper.xml create mode 100644 jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/demo/superlilu/service/ICetEnglishService.java create mode 100644 jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/demo/superlilu/service/impl/CetEnglishServiceImpl.java diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java index e9a5feb..fb02bc3 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java @@ -56,13 +56,13 @@ public class LoginController { @Autowired private ISysLogService logService; @Autowired - private RedisUtil redisUtil; + private RedisUtil redisUtil; @Autowired - private ISysDepartService sysDepartService; + private ISysDepartService sysDepartService; @Autowired private ISysTenantService sysTenantService; @Autowired - private ISysDictService sysDictService; + private ISysDictService sysDictService; @Resource private BaseCommonService baseCommonService; @@ -88,28 +88,28 @@ public class LoginController { //update-begin--Author:scott Date:20190805 for:暂时注释掉密码加密逻辑,有点问题 //update-begin-author:taoyan date:20190828 for:校验验证码 - String captcha = sysLoginModel.getCaptcha(); - if(captcha==null){ - result.error500("验证码无效"); - return result; - } - String lowerCaseCaptcha = captcha.toLowerCase(); - //update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906 - // 加入密钥作为混淆,避免简单的拼接,被外部利用,用户自定义该密钥即可 - String origin = lowerCaseCaptcha+sysLoginModel.getCheckKey()+jeecgBaseConfig.getSignatureSecret(); - String realKey = Md5Util.md5Encode(origin, "utf-8"); - //update-end-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906 - Object checkCode = redisUtil.get(realKey); - //当进入登录页时,有一定几率出现验证码错误 #1714 - if(checkCode==null || !checkCode.toString().equals(lowerCaseCaptcha)) { - log.warn("验证码错误,key= {} , Ui checkCode= {}, Redis checkCode = {}", sysLoginModel.getCheckKey(), lowerCaseCaptcha, checkCode); - result.error500("验证码错误"); - // 改成特殊的code 便于前端判断 - result.setCode(HttpStatus.PRECONDITION_FAILED.value()); - return result; - } +// String captcha = sysLoginModel.getCaptcha(); +// if(captcha==null){ +// result.error500("验证码无效"); +// return result; +// } +// String lowerCaseCaptcha = captcha.toLowerCase(); +// //update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906 +// // 加入密钥作为混淆,避免简单的拼接,被外部利用,用户自定义该密钥即可 +// String origin = lowerCaseCaptcha+sysLoginModel.getCheckKey()+jeecgBaseConfig.getSignatureSecret(); +// String realKey = Md5Util.md5Encode(origin, "utf-8"); +// //update-end-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906 +// Object checkCode = redisUtil.get(realKey); +// //当进入登录页时,有一定几率出现验证码错误 #1714 +// if(checkCode==null || !checkCode.toString().equals(lowerCaseCaptcha)) { +// log.warn("验证码错误,key= {} , Ui checkCode= {}, Redis checkCode = {}", sysLoginModel.getCheckKey(), lowerCaseCaptcha, checkCode); +// result.error500("验证码错误"); +// // 改成特殊的code 便于前端判断 +// result.setCode(HttpStatus.PRECONDITION_FAILED.value()); +// return result; +// } //update-end-author:taoyan date:20190828 for:校验验证码 - + //1. 校验用户是否有效 //update-begin-author:wangshuai date:20200601 for: 登录代码验证用户是否注销bug,if条件永远为false LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); @@ -131,17 +131,17 @@ public class LoginController { result.error500("用户名或密码错误"); return result; } - + //用户登录信息 userInfo(sysUser, result); //update-begin--Author:liusq Date:20210126 for:登录成功,删除redis中的验证码 - redisUtil.del(realKey); +// redisUtil.del(realKey); //update-begin--Author:liusq Date:20210126 for:登录成功,删除redis中的验证码 redisUtil.del(CommonConstant.LOGIN_FAIL + username); LoginUser loginUser = new LoginUser(); BeanUtils.copyProperties(sysUser, loginUser); baseCommonService.addLog("用户名: " + username + ",登录成功!", CommonConstant.LOG_TYPE_1, null,loginUser); - //update-end--Author:wangshuai Date:20200714 for:登录日志没有记录人员 + //update-end--Author:wangshuai Date:20200714 for:登录日志没有记录人员 return result; } @@ -171,7 +171,7 @@ public class LoginController { } //update-begin---author:liusq ---date:2022-06-29 for:接口返回值修改,同步修改这里的判断逻辑----------- //update-end---author:scott ---date::2022-06-20 for:vue3前端,支持自定义首页-------------- - + obj.put("userInfo",sysUser); obj.put("sysAllDictItems", sysDictService.queryAllDictItems()); result.setResult(obj); @@ -180,7 +180,7 @@ public class LoginController { return result; } - + /** * 退出登录 * @param request @@ -190,31 +190,31 @@ public class LoginController { @RequestMapping(value = "/logout") public Result logout(HttpServletRequest request,HttpServletResponse response) { //用户退出逻辑 - String token = request.getHeader(CommonConstant.X_ACCESS_TOKEN); - if(oConvertUtils.isEmpty(token)) { - return Result.error("退出登录失败!"); - } - String username = JwtUtil.getUsername(token); + String token = request.getHeader(CommonConstant.X_ACCESS_TOKEN); + if(oConvertUtils.isEmpty(token)) { + return Result.error("退出登录失败!"); + } + String username = JwtUtil.getUsername(token); LoginUser sysUser = sysBaseApi.getUserByName(username); - if(sysUser!=null) { + if(sysUser!=null) { //update-begin--Author:wangshuai Date:20200714 for:登出日志没有记录人员 baseCommonService.addLog("用户名: "+sysUser.getRealname()+",退出成功!", CommonConstant.LOG_TYPE_1, null,sysUser); //update-end--Author:wangshuai Date:20200714 for:登出日志没有记录人员 - log.info(" 用户名: "+sysUser.getRealname()+",退出成功! "); - //清空用户登录Token缓存 - redisUtil.del(CommonConstant.PREFIX_USER_TOKEN + token); - //清空用户登录Shiro权限缓存 + log.info(" 用户名: "+sysUser.getRealname()+",退出成功! "); + //清空用户登录Token缓存 + redisUtil.del(CommonConstant.PREFIX_USER_TOKEN + token); + //清空用户登录Shiro权限缓存 redisUtil.del(CommonConstant.PREFIX_USER_SHIRO_CACHE + sysUser.getId()); //清空用户的缓存信息(包括部门信息),例如sys:cache:user:: redisUtil.del(String.format("%s::%s", CacheConstant.SYS_USERS_CACHE, sysUser.getUsername())); //调用shiro的logout SecurityUtils.getSubject().logout(); - return Result.ok("退出登录成功!"); - }else { - return Result.error("Token无效!"); - } + return Result.ok("退出登录成功!"); + }else { + return Result.error("Token无效!"); + } } - + /** * 获取访问量 * @return @@ -245,7 +245,7 @@ public class LoginController { result.success("登录成功"); return result; } - + /** * 获取访问量 * @return @@ -255,19 +255,19 @@ public class LoginController { Result>> result = new Result>>(); Calendar calendar = new GregorianCalendar(); calendar.set(Calendar.HOUR_OF_DAY,0); - calendar.set(Calendar.MINUTE,0); - calendar.set(Calendar.SECOND,0); - calendar.set(Calendar.MILLISECOND,0); - calendar.add(Calendar.DAY_OF_MONTH, 1); - Date dayEnd = calendar.getTime(); - calendar.add(Calendar.DAY_OF_MONTH, -7); - Date dayStart = calendar.getTime(); - List> list = logService.findVisitCount(dayStart, dayEnd); + calendar.set(Calendar.MINUTE,0); + calendar.set(Calendar.SECOND,0); + calendar.set(Calendar.MILLISECOND,0); + calendar.add(Calendar.DAY_OF_MONTH, 1); + Date dayEnd = calendar.getTime(); + calendar.add(Calendar.DAY_OF_MONTH, -7); + Date dayStart = calendar.getTime(); + List> list = logService.findVisitCount(dayStart, dayEnd); result.setResult(oConvertUtils.toLowerCasePageList(list)); return result; } - - + + /** * 登陆成功选择用户当前部门 * @param user @@ -281,7 +281,7 @@ public class LoginController { LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal(); username = sysUser.getUsername(); } - + //获取登录部门 String orgCode= user.getOrgCode(); //获取登录租户 @@ -296,7 +296,7 @@ public class LoginController { /** * 短信登录接口 - * + * * @param jsonObject * @return */ @@ -312,12 +312,12 @@ public class LoginController { result.setSuccess(false); return result; } - + //update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906 String redisKey = CommonConstant.PHONE_REDIS_KEY_PRE+mobile; Object object = redisUtil.get(redisKey); //update-end-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906 - + if (object != null) { result.setMessage("验证码10分钟内,仍然有效!"); result.setSuccess(false); @@ -327,7 +327,7 @@ public class LoginController { //随机数 String captcha = RandomUtil.randomNumbers(6); JSONObject obj = new JSONObject(); - obj.put("code", captcha); + obj.put("code", captcha); try { boolean b = false; //注册模板 @@ -351,7 +351,7 @@ public class LoginController { } return result; } - + /** * smsmode 短信模板方式 0 .登录模板、1.注册模板、2.忘记密码模板 */ @@ -369,12 +369,12 @@ public class LoginController { result.setSuccess(false); return result; } - + //update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906 //验证码10分钟内有效 redisUtil.set(redisKey, captcha, 600); //update-end-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906 - + //update-begin--Author:scott Date:20190812 for:issues#391 //result.setResult(captcha); //update-end--Author:scott Date:20190812 for:issues#391 @@ -387,11 +387,11 @@ public class LoginController { } return result; } - + /** * 手机号登录接口 - * + * * @param jsonObject * @return */ @@ -411,7 +411,7 @@ public class LoginController { if(!result.isSuccess()) { return result; } - + String smscode = jsonObject.getString("captcha"); //update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906 @@ -463,7 +463,7 @@ public class LoginController { //3.设置登录用户信息 obj.put("userInfo", sysUser); - + //4.设置登录部门 List departs = sysDepartService.queryUserDeparts(sysUser.getId()); obj.put("departs", departs); @@ -516,13 +516,13 @@ public class LoginController { String code = RandomUtil.randomString(BASE_CHECK_CODES,4); //存到redis中 String lowerCaseCode = code.toLowerCase(); - + //update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906 // 加入密钥作为混淆,避免简单的拼接,被外部利用,用户自定义该密钥即可 String origin = lowerCaseCode+key+jeecgBaseConfig.getSignatureSecret(); String realKey = Md5Util.md5Encode(origin, "utf-8"); //update-end-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906 - + redisUtil.set(realKey, lowerCaseCode, 60); log.info("获取验证码,Redis key = {},checkCode = {}", realKey, code); //返回前端 @@ -547,7 +547,7 @@ public class LoginController { sysPermissionService.switchVue3Menu(); return res; } - + /** * app登录 * @param sysLoginModel @@ -560,7 +560,7 @@ public class LoginController { String username = sysLoginModel.getUsername(); String password = sysLoginModel.getPassword(); JSONObject obj = new JSONObject(); - + //update-begin-author:taoyan date:2022-11-7 for: issues/4109 平台用户登录失败锁定用户 if(isLoginFailOvertimes(username)){ return result.error500("该用户登录失败次数过多,请于10分钟后再次登录!"); @@ -572,7 +572,7 @@ public class LoginController { if(!result.isSuccess()) { return result; } - + //2. 校验用户名或密码是否正确 String userpassword = PasswordUtil.encrypt(username, password, sysUser.getSalt()); String syspassword = sysUser.getPassword(); @@ -583,7 +583,7 @@ public class LoginController { result.error500("用户名或密码错误"); return result; } - + //3.设置登录部门 String orgCode = sysUser.getOrgCode(); if(oConvertUtils.isEmpty(orgCode)) { @@ -609,7 +609,7 @@ public class LoginController { //5. 设置登录用户信息 obj.put("userInfo", sysUser); - + //6. 生成token String token = JwtUtil.sign(username, syspassword); // 设置超时时间 @@ -731,4 +731,4 @@ public class LoginController { redisUtil.set(key, ++val, 3600); } -} \ No newline at end of file +} diff --git a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/demo/superlilu/controller/CetEnglishController.java b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/demo/superlilu/controller/CetEnglishController.java new file mode 100644 index 0000000..d95c149 --- /dev/null +++ b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/demo/superlilu/controller/CetEnglishController.java @@ -0,0 +1,172 @@ +package org.jeecg.modules.demo.superlilu.controller; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.demo.superlilu.entity.CetEnglish; +import org.jeecg.modules.demo.superlilu.service.ICetEnglishService; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.jeecg.common.system.base.controller.JeecgController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; +import com.alibaba.fastjson.JSON; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.apache.shiro.authz.annotation.RequiresPermissions; + +/** + * @Description: 四六级英语 + * @Author: jeecg-boot + * @Date: 2023-10-27 + * @Version: V1.0 + */ +@Api(tags = "四六级英语") +@RestController +@RequestMapping("/superlilu/cetEnglish") +@Slf4j +public class CetEnglishController extends JeecgController { + @Autowired + private ICetEnglishService cetEnglishService; + + /** + * 分页列表查询 + * + * @return + */ + //@AutoLog(value = "四六级英语-分页列表查询") + @ApiOperation(value = "四六级英语-分页列表查询", notes = "四六级英语-分页列表查询") + @GetMapping(value = "/list") + public Result queryPageList(@RequestBody JSONObject webData) { + System.out.println(webData); + return cetEnglishService.searchCetData(webData); + } + + /** + * 添加 + * + * @param cetEnglish + * @return + */ + @AutoLog(value = "四六级英语-添加") + @ApiOperation(value = "四六级英语-添加", notes = "四六级英语-添加") + @RequiresPermissions("superlilu:cet_english:add") + @PostMapping(value = "/add") + public Result add(@RequestBody CetEnglish cetEnglish) { + cetEnglishService.save(cetEnglish); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param cetEnglish + * @return + */ + @AutoLog(value = "四六级英语-编辑") + @ApiOperation(value = "四六级英语-编辑", notes = "四六级英语-编辑") + @RequiresPermissions("superlilu:cet_english:edit") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST}) + public Result edit(@RequestBody CetEnglish cetEnglish) { + cetEnglishService.updateById(cetEnglish); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "四六级英语-通过id删除") + @ApiOperation(value = "四六级英语-通过id删除", notes = "四六级英语-通过id删除") + @RequiresPermissions("superlilu:cet_english:delete") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name = "id", required = true) String id) { + cetEnglishService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "四六级英语-批量删除") + @ApiOperation(value = "四六级英语-批量删除", notes = "四六级英语-批量删除") + @RequiresPermissions("superlilu:cet_english:deleteBatch") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name = "ids", required = true) String ids) { + this.cetEnglishService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "四六级英语-通过id查询") + @ApiOperation(value = "四六级英语-通过id查询", notes = "四六级英语-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name = "id", required = true) String id) { + CetEnglish cetEnglish = cetEnglishService.getById(id); + if (cetEnglish == null) { + return Result.error("未找到对应数据"); + } + return Result.OK(cetEnglish); + } + + /** + * 导出excel + * + * @param request + * @param cetEnglish + */ + @RequiresPermissions("superlilu:cet_english:exportXls") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, CetEnglish cetEnglish) { + return super.exportXls(request, cetEnglish, CetEnglish.class, "四六级英语"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequiresPermissions("superlilu:cet_english:importExcel") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, CetEnglish.class); + } + +} diff --git a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/demo/superlilu/entity/CetEnglish.java b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/demo/superlilu/entity/CetEnglish.java new file mode 100644 index 0000000..48d1378 --- /dev/null +++ b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/demo/superlilu/entity/CetEnglish.java @@ -0,0 +1,106 @@ +package org.jeecg.modules.demo.superlilu.entity; + +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.Date; +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecg.common.aspect.annotation.Dict; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Description: 四六级英语 + * @Author: jeecg-boot + * @Date: 2023-10-28 + * @Version: V1.0 + */ +@Data +@TableName("cet_english") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="cet_english对象", description="四六级英语") +public class CetEnglish implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "主键") + private java.lang.String id; + /**创建人*/ + @ApiModelProperty(value = "创建人") + private java.lang.String createBy; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "创建日期") + private java.util.Date createTime; + /**更新人*/ + @ApiModelProperty(value = "更新人") + private java.lang.String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "更新日期") + private java.util.Date updateTime; + /**所属部门*/ + @ApiModelProperty(value = "所属部门") + private java.lang.String sysOrgCode; + /**学院*/ + @Excel(name = "学院", width = 15) + @ApiModelProperty(value = "学院") + private java.lang.String college; + /**成绩*/ + @Excel(name = "成绩", width = 15) + @ApiModelProperty(value = "成绩") + private java.lang.String result; + /**是否通过*/ + @Excel(name = "是否通过", width = 15) + @ApiModelProperty(value = "是否通过") + private java.lang.Integer ispassed; + /**不知道*/ + @Excel(name = "不知道", width = 15) + @ApiModelProperty(value = "不知道") + private java.lang.String base; + /**学号*/ + @Excel(name = "学号", width = 15) + @ApiModelProperty(value = "学号") + private java.lang.String studentId; + /**级别*/ + @Excel(name = "级别", width = 15) + @ApiModelProperty(value = "级别") + private java.lang.String level; + /**批次*/ + @Excel(name = "批次", width = 15) + @ApiModelProperty(value = "批次") + private java.lang.String batch; + /**报名日期*/ + @Excel(name = "报名日期", width = 15) + @ApiModelProperty(value = "报名日期") + private java.lang.String entrydate; + /**年级*/ + @Excel(name = "年级", width = 15) + @ApiModelProperty(value = "年级") + private java.lang.String examgrade; + /**性别*/ + @Excel(name = "性别", width = 15) + @ApiModelProperty(value = "性别") + private java.lang.String sex; + /**生源地*/ + @Excel(name = "生源地", width = 15) + @ApiModelProperty(value = "生源地") + private java.lang.String birthplace; + /**考试时年级*/ + @Excel(name = "考试时年级", width = 15) + @ApiModelProperty(value = "考试时年级") + private java.lang.String cultivationlevel; +} diff --git a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/demo/superlilu/mapper/CetEnglishMapper.java b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/demo/superlilu/mapper/CetEnglishMapper.java new file mode 100644 index 0000000..60d5928 --- /dev/null +++ b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/demo/superlilu/mapper/CetEnglishMapper.java @@ -0,0 +1,17 @@ +package org.jeecg.modules.demo.superlilu.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.demo.superlilu.entity.CetEnglish; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 四六级英语 + * @Author: jeecg-boot + * @Date: 2023-10-28 + * @Version: V1.0 + */ +public interface CetEnglishMapper extends BaseMapper { + +} diff --git a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/demo/superlilu/mapper/xml/CetEnglishMapper.xml b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/demo/superlilu/mapper/xml/CetEnglishMapper.xml new file mode 100644 index 0000000..385cad2 --- /dev/null +++ b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/demo/superlilu/mapper/xml/CetEnglishMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/demo/superlilu/service/ICetEnglishService.java b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/demo/superlilu/service/ICetEnglishService.java new file mode 100644 index 0000000..4fa7148 --- /dev/null +++ b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/demo/superlilu/service/ICetEnglishService.java @@ -0,0 +1,19 @@ +package org.jeecg.modules.demo.superlilu.service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.jeecg.common.api.vo.Result; +import org.jeecg.modules.demo.superlilu.entity.CetEnglish; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 四六级英语 + * @Author: jeecg-boot + * @Date: 2023-10-27 + * @Version: V1.0 + */ +public interface ICetEnglishService extends IService { + + Result searchCetData(JSONObject cetEnglish); + +} diff --git a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/demo/superlilu/service/impl/CetEnglishServiceImpl.java b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/demo/superlilu/service/impl/CetEnglishServiceImpl.java new file mode 100644 index 0000000..e45ec6c --- /dev/null +++ b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/demo/superlilu/service/impl/CetEnglishServiceImpl.java @@ -0,0 +1,86 @@ +package org.jeecg.modules.demo.superlilu.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.jeecg.common.api.vo.Result; +import org.jeecg.modules.demo.superlilu.entity.CetEnglish; +import org.jeecg.modules.demo.superlilu.mapper.CetEnglishMapper; +import org.jeecg.modules.demo.superlilu.service.ICetEnglishService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @Description: 四六级英语 + * @Author: jeecg-boot + * @Date: 2023-10-27 + * @Version: V1.0 + */ +@Service +public class CetEnglishServiceImpl extends ServiceImpl implements ICetEnglishService { + + /** + * { + * "college": "xxx",//全部则留空 + * "batch": "2021-06-01",//全部则留空 + * "level": "英语四级",//全部则留空 + * "cultivationlevel": "本科",//全部则留空 + * "examgrade": "大一"//全部则留空 + * } + * + * @param webData webData + * @return Result + */ + + @Override + public Result searchCetData(JSONObject webData) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + // 定义要匹配的字段 + String[] fields = {"college", "batch", "level", "cultivationlevel", "examgrade"}; + + for (String field : fields) { + if (webData.containsKey(field)) { + Object fieldValue = webData.get(field); + if (fieldValue instanceof List) { + // 如果值是列表,则使用in条件 + queryWrapper.in(field, (List) fieldValue); + } else { + queryWrapper.in(field, fieldValue); + } + } + } + // 如果queryWrapper为空,则查询全部 + List list = list(queryWrapper); + //基于学院college分组 + Map> collegeMap = list.stream().collect(Collectors.groupingBy(CetEnglish::getCollege)); + // 基于学院college分组后的map再基于批次batch分组 + Map>> collegeBatchMap = collegeMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().stream().collect(Collectors.groupingBy(CetEnglish::getBatch)))); + //转为JSON,并计算每个学院的每个批次的报名人数和(isPassed=1)通过人数及通过率,存入JSONObject + JSONObject data = new JSONObject(); + for (Map.Entry>> collegeBatchEntry : collegeBatchMap.entrySet()) { + JSONObject collegeBatchData = new JSONObject(); + for (Map.Entry> batchEntry : collegeBatchEntry.getValue().entrySet()) { + JSONObject batchData = new JSONObject(); + double total = batchEntry.getValue().size(); + double passed = 0; + for (CetEnglish cetEnglish : batchEntry.getValue()) { + if (cetEnglish.getIspassed() == 1) { + passed++; + } + } + batchData.put("total", total); + batchData.put("passed", passed); + batchData.put("passRate", Math.round(passed / total * 10000) / 100.0 + "%"); + collegeBatchData.put(batchEntry.getKey(), batchData); + } + data.put(collegeBatchEntry.getKey(), collegeBatchData); + } + //返回结果 + return Result.OK(data); + } +}