MyController.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. package com.qxgmat.controller.api;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.github.pagehelper.Page;
  4. import com.nuliji.tools.*;
  5. import com.nuliji.tools.exception.ParameterException;
  6. import com.nuliji.tools.exception.SystemException;
  7. import com.qxgmat.data.constants.enums.QuestionType;
  8. import com.qxgmat.data.constants.enums.SettingKey;
  9. import com.qxgmat.data.constants.enums.module.PaperModule;
  10. import com.qxgmat.data.constants.enums.module.QuestionModule;
  11. import com.qxgmat.data.constants.enums.status.DirectionStatus;
  12. import com.qxgmat.data.dao.entity.*;
  13. import com.qxgmat.data.relation.entity.UserCollectQuestionRelation;
  14. import com.qxgmat.data.relation.entity.UserNoteQuestionRelation;
  15. import com.qxgmat.dto.extend.UserReportExtendDto;
  16. import com.qxgmat.dto.request.*;
  17. import com.qxgmat.dto.request.UserNoteDto;
  18. import com.qxgmat.dto.response.*;
  19. import com.qxgmat.help.ShiroHelp;
  20. import com.qxgmat.service.*;
  21. import com.qxgmat.service.inline.*;
  22. import io.swagger.annotations.Api;
  23. import io.swagger.annotations.ApiOperation;
  24. import org.springframework.beans.factory.annotation.Autowired;
  25. import org.springframework.beans.factory.annotation.Value;
  26. import org.springframework.http.MediaType;
  27. import org.springframework.validation.annotation.Validated;
  28. import org.springframework.web.bind.annotation.*;
  29. import org.springframework.web.multipart.MultipartFile;
  30. import javax.servlet.http.HttpServletRequest;
  31. import javax.servlet.http.HttpSession;
  32. import javax.validation.Validator;
  33. import java.io.File;
  34. import java.io.IOException;
  35. import java.text.DateFormat;
  36. import java.text.ParseException;
  37. import java.util.*;
  38. /**
  39. * Created by GaoJie on 2017/10/31.
  40. */
  41. @RestController
  42. @RequestMapping("/api/my")
  43. @Api(tags = "用户接口", description = "获取与操作当前用户信息", produces = MediaType.APPLICATION_JSON_VALUE)
  44. public class MyController {
  45. @Value("${upload.local_path}")
  46. private String localPath;
  47. @Value("${upload.web_url}")
  48. private String webUrl;
  49. @Autowired
  50. private Validator validator;
  51. @Autowired
  52. private ShiroHelp shiroHelp;
  53. @Autowired
  54. private UsersService usersService;
  55. @Autowired
  56. private UserMessageService userMessageService;
  57. @Autowired
  58. private SettingService settingService;
  59. @Autowired
  60. private StatDayService statDayService;
  61. @Autowired
  62. private UserServiceService userServiceService;
  63. @Autowired
  64. private UserCollectQuestionService userCollectQuestionService;
  65. @Autowired
  66. private UserNoteQuestionService userNoteQuestionService;
  67. @Autowired
  68. private UserQuestionService userQuestionService;
  69. @Autowired
  70. private UserReportService userReportService;
  71. @Autowired
  72. private UserPaperService userPaperService;
  73. @RequestMapping(value = "/email", method = RequestMethod.POST)
  74. @ApiOperation(value = "绑定邮箱", httpMethod = "POST")
  75. public Response<Boolean> email(@RequestBody @Validated UserEmailDto dto, HttpSession session, HttpServletRequest request) {
  76. User user = (User) shiroHelp.getLoginUser();
  77. usersService.edit(User.builder()
  78. .id(user.getId())
  79. .email(dto.getEmail())
  80. .build());
  81. return ResponseHelp.success(true);
  82. }
  83. @RequestMapping(value = "/info", method = RequestMethod.POST)
  84. @ApiOperation(value = "修改用户信息", httpMethod = "POST")
  85. public Response<Boolean> info(@RequestBody @Validated UserInfoDto dto){
  86. User user = (User) shiroHelp.getLoginUser();
  87. usersService.edit(User.builder()
  88. .id(user.getId())
  89. .nickname(dto.getNickname())
  90. .avatar(dto.getAvatar())
  91. .build());
  92. return ResponseHelp.success(true);
  93. }
  94. @RequestMapping(value = "/real", produces = MediaType.IMAGE_JPEG_VALUE, method = RequestMethod.POST)
  95. @ApiOperation(value = "实名认证", notes = "保存用户实名信息", httpMethod = "POST")
  96. public Response<UserRealDto> real(@RequestParam("file") MultipartFile multipartFile) {
  97. if (multipartFile.isEmpty()) {
  98. throw new ParameterException("上传文件为空");
  99. }
  100. String contentType = multipartFile.getContentType();
  101. if (!contentType.contains("")) {
  102. throw new ParameterException("文件类型错误");
  103. }
  104. User user = (User) shiroHelp.getLoginUser();
  105. UserRealDto dto = new UserRealDto();
  106. // todo 第三方验证
  107. String file = UUID.randomUUID().toString();
  108. try {
  109. File dest = new File(localPath + File.separator+file);
  110. multipartFile.transferTo(dest);
  111. dto.setPhoto(webUrl+file);
  112. usersService.edit(User.builder()
  113. .id(user.getId())
  114. .realAddress(dto.getAddress())
  115. .realName(dto.getName())
  116. .realIdentity(dto.getIdentity())
  117. .realPhoto(dto.getPhoto())
  118. .build());
  119. return ResponseHelp.success(dto);
  120. } catch (IOException e) {
  121. e.printStackTrace();
  122. return ResponseHelp.exception(new SystemException("图片上传失败"));
  123. }
  124. }
  125. @RequestMapping(value = "/message", method = RequestMethod.GET)
  126. @ApiOperation(value = "用户站内信", notes = "用户消息列表", httpMethod = "GET")
  127. public Response<PageMessage<UserMessage>> message(
  128. @RequestParam(required = false, defaultValue = "1") int page,
  129. @RequestParam(required = false, defaultValue = "100") int size,
  130. @RequestParam(required = false) String type,
  131. @RequestParam(required = false) Integer read
  132. ) {
  133. User user = (User) shiroHelp.getLoginUser();
  134. Page<UserMessage> p = userMessageService.select(page, size, user.getId(), type, read);
  135. return ResponseHelp.success(p, page, size, p.getTotal());
  136. }
  137. @RequestMapping(value = "/message/read", method = RequestMethod.PUT)
  138. @ApiOperation(value = "读取消息", notes = "读取用户消息/全部", httpMethod = "PUT")
  139. public Response<Boolean> readMessage(@RequestBody @Validated MessageReadDto dto) {
  140. User user = (User) shiroHelp.getLoginUser();
  141. if (dto.getAll()){
  142. userMessageService.clearAll(user.getId());
  143. }else{
  144. userMessageService.clear(user.getId(), dto.getId());
  145. }
  146. return ResponseHelp.success(true);
  147. }
  148. @RequestMapping(value = "/prepare", method = RequestMethod.PUT)
  149. @ApiOperation(value = "修改备考信息", notes = "修改用户备考信息", httpMethod = "PUT")
  150. public Response<Boolean> editPrepare(@RequestBody @Validated UserPrepareDto dto) {
  151. User entity = Transform.dtoToEntity(dto);
  152. User user = (User) shiroHelp.getLoginUser();
  153. entity.setId(user.getId());
  154. usersService.edit(entity);
  155. return ResponseHelp.success(true);
  156. }
  157. @RequestMapping(value = "/prepare", method = RequestMethod.GET)
  158. @ApiOperation(value = "获取备考信息", notes = "获取备考信息及分布", httpMethod = "GET")
  159. public Response<UserPrepareDetailDto> getPrepare() {
  160. User user = (User) shiroHelp.getLoginUser();
  161. User entity = usersService.get(user.getId());
  162. UserPrepareDetailDto dto = Transform.convert(entity, UserPrepareDetailDto.class);
  163. // todo 获取备考统计
  164. Setting setting = settingService.getByKey(SettingKey.PREPARE_INFO);
  165. JSONObject value = setting.getValue();
  166. return ResponseHelp.success(dto);
  167. }
  168. @RequestMapping(value = "/study", method = RequestMethod.GET)
  169. @ApiOperation(value = "获取学习记录", notes = "获取选择那天的做题信息", httpMethod = "GET")
  170. public Response<UserStudyDetailDto> studyTime(
  171. @RequestParam(required = false) String date
  172. ) {
  173. User user = (User) shiroHelp.getLoginUser();
  174. try {
  175. Date day = DateFormat.getDateInstance().parse(date);
  176. } catch (ParseException e) {
  177. throw new ParameterException("日期格式错误");
  178. }
  179. UserStudyDetailDto dto = new UserStudyDetailDto();
  180. // todo 获取学习统计
  181. return ResponseHelp.success(dto);
  182. }
  183. @RequestMapping(value = "/collect", method = RequestMethod.PUT)
  184. @ApiOperation(value = "添加收藏", notes = "添加收藏", httpMethod = "PUT")
  185. public Response<Boolean> addCollect(@RequestBody @Validated UserCollectDto dto) {
  186. UserCollectQuestion entity = Transform.dtoToEntity(dto);
  187. User user = (User) shiroHelp.getLoginUser();
  188. userCollectQuestionService.addQuestion(user.getId(), QuestionModule.ValueOf(entity.getModule()), entity.getQuestionNoId());
  189. return ResponseHelp.success(true);
  190. }
  191. @RequestMapping(value = "/collect", method = RequestMethod.DELETE)
  192. @ApiOperation(value = "移除收藏", notes = "移除收藏", httpMethod = "DELETE")
  193. public Response<Boolean> deleteCollect(String module, int id) {
  194. User user = (User) shiroHelp.getLoginUser();
  195. Boolean result = userCollectQuestionService.deleteQuestion(user.getId(), QuestionModule.ValueOf(module), id);
  196. return ResponseHelp.success(result);
  197. }
  198. @RequestMapping(value = "/collect/bind", method = RequestMethod.POST)
  199. @ApiOperation(value = "收藏组卷", notes = "收藏组卷", httpMethod = "POST")
  200. public Response<Boolean> bindCollect(@RequestBody @Validated UserCollectBindDto dto) {
  201. User user = (User) shiroHelp.getLoginUser();
  202. return ResponseHelp.success(true);
  203. }
  204. @RequestMapping(value = "/collect/question", method = RequestMethod.GET)
  205. @ApiOperation(value = "获取收藏题目列表", notes = "获取收藏题目列表", httpMethod = "GET")
  206. public Response<PageMessage<UserCollectQuestionDto>> listCollect(
  207. @RequestParam(required = false, defaultValue = "1") int page,
  208. @RequestParam(required = false, defaultValue = "100") int size,
  209. @RequestParam(required = true) String module,
  210. @RequestParam(required = false) String type,
  211. @RequestParam(required = false, name="start_time") String startTime,
  212. @RequestParam(required = false, name="end_time") String endTime,
  213. @RequestParam(required = false, defaultValue = "id") String order,
  214. @RequestParam(required = false, defaultValue = "desc") String direction,
  215. HttpSession session) {
  216. User user = (User) shiroHelp.getLoginUser();
  217. PageResult<UserCollectQuestionRelation> p = userCollectQuestionService.listQuestion(page, size, user.getId(), QuestionModule.ValueOf(module), QuestionType.ValueOf(type), startTime, endTime, order, DirectionStatus.ValueOf(direction));
  218. List<UserCollectQuestionDto> pr = Transform.convert(p, UserCollectQuestionDto.class);
  219. // todo 绑定做题数据
  220. return ResponseHelp.success(pr, page, size, p.getTotal());
  221. }
  222. @RequestMapping(value = "/error/list", method = RequestMethod.GET)
  223. @ApiOperation(value = "获取错题列表", notes = "获取错题列表", httpMethod = "GET")
  224. public Response<PageMessage<UserQuestionListDto>> listError(
  225. @RequestParam(required = false, defaultValue = "1") int page,
  226. @RequestParam(required = false, defaultValue = "100") int size,
  227. @RequestParam(required = true) String module,
  228. @RequestParam(required = false) Number category
  229. ) {
  230. User user = (User) shiroHelp.getLoginUser();
  231. PageResult<UserQuestion> p = userQuestionService.listError(page, size, user.getId());
  232. List<UserQuestionListDto> pr = Transform.convert(p, UserQuestionListDto.class);
  233. // todo 绑定数据
  234. return ResponseHelp.success(pr, page, size, p.getTotal());
  235. }
  236. @RequestMapping(value = "/error/bind", method = RequestMethod.POST)
  237. @ApiOperation(value = "错题组卷", notes = "错题组卷", httpMethod = "POST")
  238. public Response<Boolean> bindError(@RequestBody @Validated UserErrorBindDto dto) {
  239. User user = (User) shiroHelp.getLoginUser();
  240. return ResponseHelp.success(true);
  241. }
  242. @RequestMapping(value = "/error/clear", method = RequestMethod.POST)
  243. @ApiOperation(value = "错题移除", notes = "错题移除", httpMethod = "POST")
  244. public Response<Boolean> clearError(@RequestBody @Validated UserCollectBindDto dto) {
  245. User user = (User) shiroHelp.getLoginUser();
  246. return ResponseHelp.success(true);
  247. }
  248. @RequestMapping(value = "/note", method = RequestMethod.PUT)
  249. @ApiOperation(value = "更新笔记", notes = "更新笔记", httpMethod = "PUT")
  250. public Response<Boolean> updateNote(@RequestBody @Validated UserNoteDto dto) {
  251. UserNoteQuestion entity = Transform.dtoToEntity(dto);
  252. User user = (User) shiroHelp.getLoginUser();
  253. entity.setUserId(user.getId());
  254. userNoteQuestionService.update(entity);
  255. return ResponseHelp.success(true);
  256. }
  257. @RequestMapping(value = "/note/list", method = RequestMethod.GET)
  258. @ApiOperation(value = "获取笔记列表", notes = "获取笔记列表", httpMethod = "GET")
  259. public Response<PageMessage<UserNoteDetailDto>> listNote(
  260. @RequestParam(required = false, defaultValue = "1") int page,
  261. @RequestParam(required = false, defaultValue = "100") int size,
  262. @RequestParam(required = true) String module,
  263. @RequestParam(required = false) String type,
  264. @RequestParam(required = false, name="start_time") String startTime,
  265. @RequestParam(required = false, name="end_time") String endTime,
  266. @RequestParam(required = false, defaultValue = "id") String order,
  267. @RequestParam(required = false, defaultValue = "desc") String direction,
  268. HttpSession session) {
  269. User user = (User) shiroHelp.getLoginUser();
  270. PageResult<UserNoteQuestionRelation> p = userNoteQuestionService.list(page, size, user.getId(), QuestionModule.ValueOf(module), QuestionType.ValueOf(type), startTime, endTime, order, DirectionStatus.ValueOf(direction));
  271. List<UserNoteDetailDto> pr = Transform.convert(p, UserNoteDetailDto.class);
  272. // todo 绑定数据
  273. return ResponseHelp.success(pr, page, size, p.getTotal());
  274. }
  275. @RequestMapping(value = "/report/list", method = RequestMethod.GET)
  276. @ApiOperation(value = "获取报告列表", notes = "获取报告列表", httpMethod = "GET")
  277. public Response<PageMessage<UserPaperDto>> reportList(
  278. @RequestParam(required = false, defaultValue = "1") int page,
  279. @RequestParam(required = false, defaultValue = "100") int size,
  280. @RequestParam(required = true) String module,
  281. @RequestParam(required = false) String type,
  282. @RequestParam(required = false, name="start_time") String startTime,
  283. @RequestParam(required = false, name="end_time") String endTime,
  284. @RequestParam(required = false, defaultValue = "id") String order,
  285. @RequestParam(required = false, defaultValue = "desc") String direction,
  286. HttpSession session) {
  287. User user = (User) shiroHelp.getLoginUser();
  288. PageResult<UserPaper> p = userPaperService.list(page, size, user.getId(), PaperModule.ValueOf(module), QuestionType.ValueOf(type), startTime, endTime, order, DirectionStatus.ValueOf(direction));
  289. List<UserPaperDto> pr = Transform.convert(p, UserPaperDto.class);
  290. Collection paperIds = Transform.getIds(p, UserPaper.class, "id");
  291. // 绑定用户报告
  292. Map<Object, Collection<UserReport>> reportByPaper = userReportService.mapByPaper(paperIds);
  293. Transform.combine(pr, reportByPaper, UserPaperDto.class, "id", "reports", UserReportExtendDto.class);
  294. // 错题 -> 题型
  295. // 模考 -> 分数
  296. return ResponseHelp.success(pr, page, size, p.getTotal());
  297. }
  298. }