├── .gitignore ├── LICENSE ├── README.md ├── db └── init.sql ├── pom.xml ├── src ├── main │ ├── java │ │ └── com │ │ │ └── question │ │ │ └── admin │ │ │ ├── AdminApplication.java │ │ │ ├── config │ │ │ ├── CorsConfig.java │ │ │ ├── MybatisPlusConfig.java │ │ │ ├── QnConfig.java │ │ │ ├── RedisCacheConfig.java │ │ │ ├── SchedulerConfig.java │ │ │ ├── ShiroConfig.java │ │ │ ├── SwaggerCofing.java │ │ │ ├── annontation │ │ │ │ ├── QuestionSysLogAspect.java │ │ │ │ └── SysLogAnnotation.java │ │ │ ├── props │ │ │ │ ├── DbBackupProperties.java │ │ │ │ ├── EmailConfig.java │ │ │ │ └── WeatherProperties.java │ │ │ ├── shiro │ │ │ │ ├── LoginUser.java │ │ │ │ ├── ShiroFilterProperties.java │ │ │ │ ├── ShiroKit.java │ │ │ │ ├── ShiroRealm.java │ │ │ │ ├── cache │ │ │ │ │ ├── ShiroCache.java │ │ │ │ │ └── ShiroCacheManager.java │ │ │ │ └── security │ │ │ │ │ ├── JwtFilter.java │ │ │ │ │ ├── JwtProperties.java │ │ │ │ │ ├── JwtToken.java │ │ │ │ │ ├── JwtUtil.java │ │ │ │ │ ├── SystemLogoutFilter.java │ │ │ │ │ └── UserContext.java │ │ │ ├── upload │ │ │ │ ├── annotation │ │ │ │ │ └── FileSlotDisabled.java │ │ │ │ ├── aop │ │ │ │ │ ├── MultipartAspect.java │ │ │ │ │ └── MultipartHandlerInterceptor.java │ │ │ │ ├── conf │ │ │ │ │ └── MultipartUploadConfig.java │ │ │ │ ├── entity │ │ │ │ │ ├── CategorialFileSlot.java │ │ │ │ │ └── FileSlot.java │ │ │ │ └── support │ │ │ │ │ ├── DefaultFileArchiveStrategy.java │ │ │ │ │ ├── DefaultFileResolver.java │ │ │ │ │ ├── FileArchiveStrategy.java │ │ │ │ │ ├── FileResolver.java │ │ │ │ │ ├── MultipartContextHolder.java │ │ │ │ │ └── MultipartRequestWrapper.java │ │ │ └── wx │ │ │ │ ├── SystemConfig.java │ │ │ │ └── WxConfig.java │ │ │ ├── constant │ │ │ ├── Constants.java │ │ │ ├── SecurityConsts.java │ │ │ ├── enumtype │ │ │ │ └── YNFlagStatusEnum.java │ │ │ └── sysmgr │ │ │ │ ├── ScheduleJobConsts.java │ │ │ │ └── UserStatusEnum.java │ │ │ ├── domain │ │ │ ├── QuestionServiceException.java │ │ │ ├── entity │ │ │ │ ├── BaseEntity.java │ │ │ │ ├── baseinfo │ │ │ │ │ └── Dict.java │ │ │ │ ├── exam │ │ │ │ │ ├── Category.java │ │ │ │ │ ├── FeedBack.java │ │ │ │ │ ├── Paper.java │ │ │ │ │ ├── Question.java │ │ │ │ │ ├── Subject.java │ │ │ │ │ ├── SwiperConfig.java │ │ │ │ │ ├── TaskExam.java │ │ │ │ │ ├── enums │ │ │ │ │ │ └── ExamPaperTypeEnum.java │ │ │ │ │ ├── file │ │ │ │ │ │ ├── UeditorConfigVM.java │ │ │ │ │ │ └── UploadResultVM.java │ │ │ │ │ ├── paper │ │ │ │ │ │ ├── ExamPaperQuestionItemObject.java │ │ │ │ │ │ └── ExamPaperTitleItemObject.java │ │ │ │ │ └── question │ │ │ │ │ │ ├── QuestionItemObject.java │ │ │ │ │ │ ├── QuestionObject.java │ │ │ │ │ │ └── TextContent.java │ │ │ │ ├── sysmgr │ │ │ │ │ ├── Att.java │ │ │ │ │ ├── Authority.java │ │ │ │ │ ├── Backup.java │ │ │ │ │ ├── LoginLog.java │ │ │ │ │ ├── Mail.java │ │ │ │ │ ├── Notice.java │ │ │ │ │ ├── Resource.java │ │ │ │ │ ├── Role.java │ │ │ │ │ ├── RoleAuthority.java │ │ │ │ │ ├── ScheduleJob.java │ │ │ │ │ ├── SysLog.java │ │ │ │ │ ├── User.java │ │ │ │ │ └── UserRole.java │ │ │ │ ├── tool │ │ │ │ │ └── Todo.java │ │ │ │ └── wx │ │ │ │ │ ├── ExamPaperAnswerUpdate.java │ │ │ │ │ └── WxAccount.java │ │ │ └── vo │ │ │ │ ├── Result.java │ │ │ │ ├── manager │ │ │ │ ├── exam │ │ │ │ │ ├── BaseVM.java │ │ │ │ │ ├── ExamPaperAnswer.java │ │ │ │ │ ├── ExamPaperQuestionCustomerAnswer.java │ │ │ │ │ ├── pape │ │ │ │ │ │ ├── ExamPaperEditRequestVM.java │ │ │ │ │ │ ├── ExamPaperPageRequestVM.java │ │ │ │ │ │ ├── ExamPaperTitleItemVM.java │ │ │ │ │ │ └── ExamResponseVM.java │ │ │ │ │ └── question │ │ │ │ │ │ ├── QuestionEditItemVM.java │ │ │ │ │ │ ├── QuestionEditRequestVM.java │ │ │ │ │ │ ├── QuestionResponseVM.java │ │ │ │ │ │ ├── QuestionStatusEnum.java │ │ │ │ │ │ └── QuestionTypeEnum.java │ │ │ │ ├── pub │ │ │ │ │ ├── WeatherDetailVo.java │ │ │ │ │ └── WeatherVo.java │ │ │ │ └── sysmgr │ │ │ │ │ ├── AttVo.java │ │ │ │ │ ├── AuthorityNode.java │ │ │ │ │ ├── MailVO.java │ │ │ │ │ ├── NoticeReadVO.java │ │ │ │ │ ├── NoticeVO.java │ │ │ │ │ ├── ResourceNode.java │ │ │ │ │ ├── RoleAuth.java │ │ │ │ │ ├── UserPassword.java │ │ │ │ │ ├── UserRoleVo.java │ │ │ │ │ └── UserVo.java │ │ │ │ ├── student │ │ │ │ ├── exam │ │ │ │ │ ├── ExamPaperReadVM.java │ │ │ │ │ ├── ExamPaperSubmitItemVM.java │ │ │ │ │ └── ExamPaperSubmitVM.java │ │ │ │ ├── paper │ │ │ │ │ ├── ExamPaperAnswerInfo.java │ │ │ │ │ ├── ExamPaperAnswerPageResponseVM.java │ │ │ │ │ ├── ExamPaperAnswerPageVM.java │ │ │ │ │ ├── ExamPaperQuestionCustomerAnswer.java │ │ │ │ │ ├── TaskExamCustomerAnswer.java │ │ │ │ │ └── UserEventLog.java │ │ │ │ ├── question │ │ │ │ │ └── answer │ │ │ │ │ │ └── QuestionPageStudentRequestVM.java │ │ │ │ └── user │ │ │ │ │ ├── UserResponseVM.java │ │ │ │ │ └── UserUpdateVM.java │ │ │ │ └── wx │ │ │ │ ├── Code2SessionResponse.java │ │ │ │ ├── CodeDTO.java │ │ │ │ └── TokenDTO.java │ │ │ ├── mapper │ │ │ ├── baseinfo │ │ │ │ └── DictMapper.java │ │ │ ├── exam │ │ │ │ ├── CategoryMapper.java │ │ │ │ ├── ExamPaperAnswerMapper.java │ │ │ │ ├── ExamPaperQuestionCustomerAnswerMapper.java │ │ │ │ ├── FeedBackMapper.java │ │ │ │ ├── PaperMapper.java │ │ │ │ ├── QuestionMapper.java │ │ │ │ ├── SubjectMapper.java │ │ │ │ ├── SwiperConfigMapper.java │ │ │ │ ├── TaskExamCustomerAnswerMapper.java │ │ │ │ ├── TaskExamMapper.java │ │ │ │ └── TextContentMapper.java │ │ │ ├── sysmgr │ │ │ │ ├── AttMapper.java │ │ │ │ ├── AuthorityMapper.java │ │ │ │ ├── BackupMapper.java │ │ │ │ ├── LoginLogMapper.java │ │ │ │ ├── MailMapper.java │ │ │ │ ├── NoticeMapper.java │ │ │ │ ├── ResourceMapper.java │ │ │ │ ├── RoleAuthorityMapper.java │ │ │ │ ├── RoleMapper.java │ │ │ │ ├── ScheduleJobMapper.java │ │ │ │ ├── SysLogMapper.java │ │ │ │ ├── UserMapper.java │ │ │ │ └── UserRoleMapper.java │ │ │ └── tool │ │ │ │ └── TodoMapper.java │ │ │ ├── scheduler │ │ │ ├── DbBackupJob.java │ │ │ ├── QuestionDemoJob.java │ │ │ ├── base │ │ │ │ ├── BaseJob.java │ │ │ │ └── ScheduleAnnotation.java │ │ │ ├── factory │ │ │ │ └── QuestionJobFactory.java │ │ │ ├── listener │ │ │ │ └── QuestionJobListener.java │ │ │ └── service │ │ │ │ ├── QuestionSchedulerService.java │ │ │ │ └── ScheduleJobStarter.java │ │ │ ├── service │ │ │ ├── baseinfo │ │ │ │ ├── DictService.java │ │ │ │ └── impl │ │ │ │ │ └── DictServiceImpl.java │ │ │ ├── common │ │ │ │ ├── AttendanceSettingService.java │ │ │ │ ├── ISyncCacheService.java │ │ │ │ ├── MailService.java │ │ │ │ ├── StorageService.java │ │ │ │ └── impl │ │ │ │ │ ├── AttendanceSettingServiceImpl.java │ │ │ │ │ ├── MailServiceImpl.java │ │ │ │ │ ├── StorageServiceImpl.java │ │ │ │ │ └── SyncCacheServiceImpl.java │ │ │ ├── event │ │ │ │ └── CalculateExamPaperAnswerCompleteEvent.java │ │ │ ├── exam │ │ │ │ ├── CategoryService.java │ │ │ │ ├── ExamPaperAnswerService.java │ │ │ │ ├── ExamPaperQuestionCustomerAnswerService.java │ │ │ │ ├── FeedBackService.java │ │ │ │ ├── FileUpload.java │ │ │ │ ├── PaperService.java │ │ │ │ ├── QuestionService.java │ │ │ │ ├── SubjectService.java │ │ │ │ ├── SwiperConfigService.java │ │ │ │ ├── TaskExamCustomerAnswerService.java │ │ │ │ ├── TaskExamService.java │ │ │ │ ├── TextContentService.java │ │ │ │ ├── enums │ │ │ │ │ ├── ActionEnum.java │ │ │ │ │ └── ExamPaperAnswerStatusEnum.java │ │ │ │ └── impl │ │ │ │ │ ├── CategoryServiceImpl.java │ │ │ │ │ ├── ExamPaperAnswerServiceImpl.java │ │ │ │ │ ├── ExamPaperQuestionCustomerAnswerServiceImpl.java │ │ │ │ │ ├── FeedBackServiceImpl.java │ │ │ │ │ ├── FileUploadImpl.java │ │ │ │ │ ├── PaperServiceImpl.java │ │ │ │ │ ├── QuestionServiceImpl.java │ │ │ │ │ ├── SubjectServiceImpl.java │ │ │ │ │ ├── SwiperConfigServiceImpl.java │ │ │ │ │ ├── TaskExamCustomerAnswerServiceImpl.java │ │ │ │ │ └── TextContentServiceImpl.java │ │ │ ├── listener │ │ │ │ └── CalculateExamPaperAnswerListener.java │ │ │ ├── sysmgr │ │ │ │ ├── AttService.java │ │ │ │ ├── AuthorityService.java │ │ │ │ ├── BackupService.java │ │ │ │ ├── LoginLogService.java │ │ │ │ ├── NoticeService.java │ │ │ │ ├── ResourceService.java │ │ │ │ ├── RoleAuthorityService.java │ │ │ │ ├── RoleService.java │ │ │ │ ├── ScheduleJobService.java │ │ │ │ ├── SysLogService.java │ │ │ │ ├── UserService.java │ │ │ │ └── impl │ │ │ │ │ ├── AttServiceImpl.java │ │ │ │ │ ├── AuthorityServiceImpl.java │ │ │ │ │ ├── BackupServiceImpl.java │ │ │ │ │ ├── LoginLogServiceImpl.java │ │ │ │ │ ├── NoticeServiceImpl.java │ │ │ │ │ ├── ResourceServiceImpl.java │ │ │ │ │ ├── RoleAuthorityServiceImpl.java │ │ │ │ │ ├── RoleServiceImpl.java │ │ │ │ │ ├── ScheduleJobServiceImpl.java │ │ │ │ │ ├── SysLogServiceImpl.java │ │ │ │ │ └── UserServiceImpl.java │ │ │ └── tool │ │ │ │ ├── TodoService.java │ │ │ │ └── impl │ │ │ │ └── TodoServiceImpl.java │ │ │ ├── support │ │ │ ├── XssSqlFilter.java │ │ │ ├── XssSqlHttpServletRequestWrapper.java │ │ │ └── XssSqlStringJsonSerializer.java │ │ │ ├── utils │ │ │ ├── AnnotationUtils.java │ │ │ ├── CodeGenerator.java │ │ │ ├── CookiesUtil.java │ │ │ ├── DataBaseUtils.java │ │ │ ├── DateExpressionUtil.java │ │ │ ├── DateTimeUtil.java │ │ │ ├── DateUtils.java │ │ │ ├── ErrorUtil.java │ │ │ ├── ExamUtil.java │ │ │ ├── ExceptionUtils.java │ │ │ ├── FileExtendUtils.java │ │ │ ├── HtmlUtil.java │ │ │ ├── HttpClientUtils.java │ │ │ ├── HttpUtil.java │ │ │ ├── IOUtil.java │ │ │ ├── IPUtils.java │ │ │ ├── JSONUtil.java │ │ │ ├── JedisUtils.java │ │ │ ├── ModelMapperSingle.java │ │ │ ├── PageInfoHelper.java │ │ │ ├── SSLContextSecurity.java │ │ │ ├── StringUtils.java │ │ │ ├── WxUtil.java │ │ │ └── XssUtil.java │ │ │ └── web │ │ │ ├── ExceptionController.java │ │ │ ├── IndexController.java │ │ │ ├── LoginController.java │ │ │ ├── PubController.java │ │ │ ├── admin │ │ │ ├── baseinfo │ │ │ │ └── DictController.java │ │ │ ├── exam │ │ │ │ ├── CategoryController.java │ │ │ │ ├── PaperController.java │ │ │ │ ├── QuestionController.java │ │ │ │ ├── SubjectController.java │ │ │ │ ├── SwiperConfigController.java │ │ │ │ └── UploadController.java │ │ │ ├── operation │ │ │ │ └── FeedBackController.java │ │ │ ├── sysmgr │ │ │ │ ├── AttController.java │ │ │ │ ├── AuthorityController.java │ │ │ │ ├── BackupController.java │ │ │ │ ├── LoginLogController.java │ │ │ │ ├── MailController.java │ │ │ │ ├── NoticeController.java │ │ │ │ ├── ResourceController.java │ │ │ │ ├── RoleColtroller.java │ │ │ │ ├── ScheduleJobController.java │ │ │ │ ├── SysLogController.java │ │ │ │ └── UserController.java │ │ │ └── tool │ │ │ │ └── TodoController.java │ │ │ └── wx │ │ │ ├── BaseWXApiController.java │ │ │ ├── DashboardController.java │ │ │ ├── ExamPaperAnswerController.java │ │ │ ├── ExamPaperController.java │ │ │ ├── WxAppletController.java │ │ │ ├── WxCategoryController.java │ │ │ └── WxFeedBackController.java │ └── resources │ │ ├── .reloadtrigger │ │ ├── application-dev.yml │ │ ├── application-pro.yml │ │ ├── application-test.yml │ │ ├── application.yml │ │ ├── log4j2.xml │ │ ├── mail │ │ └── test.ftl │ │ ├── mapper │ │ ├── baseinfo │ │ │ └── DictMapper.xml │ │ ├── exam │ │ │ ├── ExamPaperAnsserMapper.xml │ │ │ └── SubjectMapper.xml │ │ ├── sysmgr │ │ │ ├── AttMapper.xml │ │ │ ├── AuthorityMapper.xml │ │ │ ├── BackupMapper.xml │ │ │ ├── LoginLogMapper.xml │ │ │ ├── MailMapper.xml │ │ │ ├── NoticeMapper.xml │ │ │ ├── ResourceMapper.xml │ │ │ ├── RoleAuthorityMapper.xml │ │ │ ├── RoleMapper.xml │ │ │ ├── ScheduleJobMapper.xml │ │ │ └── UserMapper.xml │ │ └── tool │ │ │ └── TodoMapper.xml │ │ ├── quartz.properties │ │ └── templates │ │ └── welcome.ftl └── test │ └── java │ └── com │ └── question │ └── admin │ ├── QuestionAdminApplicationTests.java │ ├── service │ └── common │ │ └── MailServiceTest.java │ └── utils │ └── DateExpressUtilTest.java └── start.sh /.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | /target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | 5 | ### STS ### 6 | .apt_generated 7 | .classpath 8 | .factorypath 9 | .project 10 | .settings 11 | .springBeans 12 | .sts4-cache 13 | 14 | ### IntelliJ IDEA ### 15 | .idea 16 | *.iws 17 | *.iml 18 | *.ipr 19 | 20 | ### NetBeans ### 21 | /nbproject/private/ 22 | /nbbuild/ 23 | /dist/ 24 | /nbdist/ 25 | /.nb-gradle/ 26 | /build/ 27 | 28 | ### VS Code ### 29 | .vscode/ 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # question-admin 刷题管理平台 2 | 3 | > [gitee地址](https://gitee.com/zvc888/question-admin.git) 4 | 5 | > [github地址](https://github.com/zvc888/question-admin.git) 6 | 7 | 1. [JAVA接口服务](https://github.com/zvc888/question-admin.git) 8 | 2. [后端管理页面](https://github.com/zvc888/question-admin-console.git) 9 | 3. [小程序](https://github.com/zvc888/question-wx.git) 10 | 11 | ## 本项目为前后端分离的Web应用后端程序,采用技术框架如下: 12 | 1. springboot v2.1.2.RELEASE 13 | 2. shiro 14 | 3. jwt 15 | 4. redis 16 | 5. mybatis-plus v3.1.2 17 | 18 | 使用jwt采用token有效期内刷新机制更新Token。 19 | ## 项目已实现功能包括: 20 | 21 | **一、系统管理** 22 | 1. 用户登录 23 | 2. 用户管理 24 | 3. 角色管理 25 | 4. 权限管理 26 | 5. 菜单管理 27 | 6. 登录日志 28 | 7. 系统日志 29 | 30 | **二、运维管理** 31 | 32 | 1. 接口文档 33 | 2. 用户反馈 34 | 35 | **三 、卷题管理** 36 | 37 | 1. 类别管理 38 | 2. 科目管理 39 | 3. 试卷管理 40 | 4. 题目管理 41 | 5. 轮播管理 42 | 43 | 44 | ## 开发环境&安装 45 | 46 | **一、开发环境** 47 | 1. Mysql 48 | 2. Jdk8+ 49 | 3. Redis 50 | 51 | **二、初始化** 52 | 1. db目录下的sql文件执行 53 | 2. 文件系统使用的七牛存储(按照七牛官网文档去申请配置后有bucket,access-key,secret-key) 54 | 3. 微信小程序(appid,secret) 55 | 56 | **三、启动** 57 | 1. 启动redis 58 | 2. 启动mysql 59 | 3. 运行AdminApplication类 60 | 61 | 62 | ![demo](https://images.gitee.com/uploads/images/2020/0224/154238_f4b6c3b9_87856.png) 63 | 64 | ![小程序](https://images.gitee.com/uploads/images/2020/0224/154235_160225d6_87856.png) 65 | 66 | # 喜欢的帮忙star,谢谢啦 67 | 68 | ![打赏](https://images.gitee.com/uploads/images/2020/0224/154238_69516fad_87856.png) 69 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/AdminApplication.java: -------------------------------------------------------------------------------- 1 | package com.question.admin; 2 | 3 | import com.fasterxml.jackson.databind.ObjectMapper; 4 | import com.fasterxml.jackson.databind.module.SimpleModule; 5 | import com.question.admin.config.props.DbBackupProperties; 6 | import com.question.admin.config.shiro.security.JwtProperties; 7 | import com.question.admin.config.wx.SystemConfig; 8 | import com.question.admin.support.XssSqlStringJsonSerializer; 9 | import org.mybatis.spring.annotation.MapperScan; 10 | import org.springframework.boot.SpringApplication; 11 | import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 12 | import org.springframework.boot.autoconfigure.SpringBootApplication; 13 | import org.springframework.boot.builder.SpringApplicationBuilder; 14 | import org.springframework.boot.context.properties.EnableConfigurationProperties; 15 | import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; 16 | import org.springframework.context.annotation.Bean; 17 | import org.springframework.context.annotation.Primary; 18 | import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; 19 | 20 | @SpringBootApplication 21 | //@ImportResource(locations={"classpath:spring/spring-config-*.xml"}) 22 | @MapperScan("com.question.admin.mapper") 23 | @EnableConfigurationProperties({JwtProperties.class, DbBackupProperties.class, SystemConfig.class}) 24 | @EnableAutoConfiguration 25 | public class AdminApplication extends SpringBootServletInitializer { 26 | 27 | @Override 28 | protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { 29 | return builder.sources(this.getClass()); 30 | } 31 | @Bean 32 | @Primary 33 | public ObjectMapper xssObjectMapper(Jackson2ObjectMapperBuilder builder) { 34 | // 解析器 35 | ObjectMapper objectMapper = builder.createXmlMapper(false).build(); 36 | // 注册XSS SQL 解析器 37 | SimpleModule xssModule = new SimpleModule("XssStringJsonSerializer"); 38 | xssModule.addSerializer(new XssSqlStringJsonSerializer()); 39 | objectMapper.registerModule(xssModule); 40 | return objectMapper; 41 | } 42 | public static void main(String[] args) { 43 | SpringApplication.run(AdminApplication.class, args); 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/config/CorsConfig.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.web.cors.CorsConfiguration; 6 | import org.springframework.web.cors.UrlBasedCorsConfigurationSource; 7 | import org.springframework.web.filter.CorsFilter; 8 | 9 | /** 10 | * 跨域访问 11 | */ 12 | @Configuration 13 | public class CorsConfig { 14 | private CorsConfiguration buildConfig() { 15 | CorsConfiguration corsConfiguration = new CorsConfiguration(); 16 | corsConfiguration.addAllowedOrigin("*"); // 1允许任何域名使用 17 | corsConfiguration.addAllowedHeader("*"); // 2允许任何头 18 | corsConfiguration.addAllowedMethod("*"); // 3允许任何方法(post、get等) 19 | corsConfiguration.setAllowCredentials(true); 20 | return corsConfiguration; 21 | } 22 | 23 | @Bean 24 | public CorsFilter corsFilter() { 25 | UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); 26 | source.registerCorsConfiguration("/**", buildConfig()); // 4 27 | return new CorsFilter(source); 28 | } 29 | } -------------------------------------------------------------------------------- /src/main/java/com/question/admin/config/MybatisPlusConfig.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.config; 2 | 3 | import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; 4 | import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | import java.util.Properties; 9 | 10 | @Configuration 11 | public class MybatisPlusConfig { 12 | 13 | @Bean 14 | public PaginationInterceptor paginationInterceptor() { 15 | PaginationInterceptor page = new PaginationInterceptor(); 16 | page.setDialectType("mysql"); 17 | return page; 18 | } 19 | 20 | /** 21 | * 打印 sql 22 | */ 23 | @Bean 24 | public PerformanceInterceptor performanceInterceptor() { 25 | PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor(); 26 | //格式化sql语句 27 | Properties properties = new Properties(); 28 | properties.setProperty("format", "true"); 29 | performanceInterceptor.setProperties(properties); 30 | return performanceInterceptor; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/config/QnConfig.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.config; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class QnConfig { 7 | private String url; 8 | private String bucket; 9 | private String accessKey; 10 | private String secretKey; 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/config/SchedulerConfig.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.config; 2 | 3 | import com.question.admin.scheduler.factory.QuestionJobFactory; 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | import org.springframework.beans.factory.annotation.Qualifier; 6 | import org.springframework.beans.factory.config.PropertiesFactoryBean; 7 | import org.springframework.context.annotation.Bean; 8 | import org.springframework.context.annotation.Configuration; 9 | import org.springframework.core.io.ClassPathResource; 10 | import org.springframework.scheduling.quartz.SchedulerFactoryBean; 11 | 12 | import java.io.IOException; 13 | import java.util.Properties; 14 | 15 | /** 16 | * 定时任务配置 17 | * @author zvc 18 | * 19 | */ 20 | @Configuration 21 | public class SchedulerConfig { 22 | 23 | @Autowired 24 | @Qualifier("questionJobFactory") 25 | private QuestionJobFactory questionJobFactory; 26 | 27 | @Bean(name="questionSchedulerFactory") 28 | public SchedulerFactoryBean schedulerFactoryBean() throws IOException { 29 | SchedulerFactoryBean factory = new SchedulerFactoryBean(); 30 | factory.setQuartzProperties(quartzProperties()); 31 | factory.setOverwriteExistingJobs(true); 32 | factory.setJobFactory(questionJobFactory); 33 | return factory; 34 | } 35 | 36 | @Bean 37 | public Properties quartzProperties() throws IOException { 38 | PropertiesFactoryBean propertiesFactory = new PropertiesFactoryBean(); 39 | propertiesFactory.setLocation(new ClassPathResource("/quartz.properties")); 40 | propertiesFactory.afterPropertiesSet(); // 必须手动触发 41 | return propertiesFactory.getObject(); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/config/annontation/SysLogAnnotation.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.config.annontation; 2 | 3 | import java.lang.annotation.*; 4 | 5 | @Retention(RetentionPolicy.RUNTIME) 6 | @Target({ ElementType.TYPE, ElementType.METHOD }) 7 | @Documented 8 | public @interface SysLogAnnotation { 9 | 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/config/props/DbBackupProperties.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.config.props; 2 | 3 | import org.springframework.boot.context.properties.ConfigurationProperties; 4 | 5 | import lombok.Data; 6 | 7 | /** 8 | * 数据库备份配置 9 | * @author zvc 10 | * 11 | */ 12 | @ConfigurationProperties(prefix = "dbbackup") 13 | @Data 14 | public class DbBackupProperties { 15 | private String servername; 16 | private String dbname; 17 | private String username; 18 | private String password; 19 | private String installPath; 20 | private String backupPath; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/config/props/EmailConfig.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.config.props; 2 | 3 | import org.springframework.stereotype.Component; 4 | 5 | import lombok.Data; 6 | 7 | import org.springframework.beans.factory.annotation.Value; 8 | 9 | @Data 10 | @Component 11 | public class EmailConfig { 12 | /** 13 | * 发件邮箱 14 | */ 15 | @Value("${spring.mail.mailFrom}") 16 | private String emailFrom; 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/config/props/WeatherProperties.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.config.props; 2 | 3 | import lombok.Data; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | import org.springframework.stereotype.Component; 6 | 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | @Data 11 | @Component 12 | @ConfigurationProperties(prefix = "weather-config") 13 | public class WeatherProperties { 14 | String appId; 15 | String appSecret; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/config/shiro/LoginUser.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.config.shiro; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | 7 | /** 8 | * @author zvc 9 | */ 10 | @Data 11 | public class LoginUser implements Serializable { 12 | 13 | private static final long serialVersionUID = 1L; 14 | 15 | private Long userId; // 主键ID 16 | private String account; // 账号 17 | private String name; // 姓名 18 | private Long orgId; // 组织ID 19 | 20 | 21 | public LoginUser() { 22 | } 23 | 24 | public LoginUser(String account, Long userId, String name) { 25 | this.account = account; 26 | this.userId = userId; 27 | this.name = name; 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/config/shiro/ShiroFilterProperties.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.config.shiro; 2 | 3 | import lombok.Data; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | import org.springframework.stereotype.Component; 6 | 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | @Data 11 | @Component 12 | @ConfigurationProperties(prefix = "permission-config") 13 | public class ShiroFilterProperties { 14 | List> perms; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/config/shiro/cache/ShiroCacheManager.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.config.shiro.cache; 2 | 3 | import com.question.admin.config.shiro.security.JwtProperties; 4 | import com.question.admin.utils.JedisUtils; 5 | import org.apache.shiro.cache.Cache; 6 | import org.apache.shiro.cache.CacheException; 7 | import org.apache.shiro.cache.CacheManager; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | @Service 12 | public class ShiroCacheManager implements CacheManager { 13 | 14 | @Autowired 15 | JedisUtils jedisUtils; 16 | 17 | @Autowired 18 | JwtProperties jwtProperties; 19 | 20 | @Override 21 | public Cache getCache(String s) throws CacheException { 22 | return new ShiroCache(jedisUtils,jwtProperties); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/config/shiro/security/JwtProperties.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.config.shiro.security; 2 | 3 | import lombok.Data; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | 6 | @ConfigurationProperties(prefix = "token") 7 | @Data 8 | public class JwtProperties { 9 | 10 | /** 11 | * token过期时间,单位分钟 12 | */ 13 | Integer tokenExpireTime; 14 | 15 | /** 16 | * 更新令牌时间,单位分钟 17 | */ 18 | Integer refreshCheckTime; 19 | 20 | /** 21 | * Shiro缓存有效期,单位分钟 22 | */ 23 | Integer shiroCacheExpireTime; 24 | 25 | /** 26 | * token加密密钥 27 | */ 28 | String secretKey; 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/config/shiro/security/JwtToken.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.config.shiro.security; 2 | 3 | import org.apache.shiro.authc.AuthenticationToken; 4 | import org.apache.shiro.authc.HostAuthenticationToken; 5 | 6 | public class JwtToken implements HostAuthenticationToken { 7 | 8 | /** 9 | * 密钥 10 | */ 11 | private String token; 12 | private String host; 13 | public JwtToken(String token) { 14 | this(token, null); 15 | } 16 | public JwtToken(String token, String host) { 17 | this.token = token; 18 | this.host = host; 19 | } 20 | @Override 21 | public Object getPrincipal() { 22 | return token; 23 | } 24 | 25 | @Override 26 | public Object getCredentials() { 27 | return token; 28 | } 29 | 30 | @Override 31 | public String getHost() { 32 | return host; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/config/shiro/security/UserContext.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.config.shiro.security; 2 | 3 | 4 | import com.question.admin.config.shiro.LoginUser; 5 | 6 | public class UserContext implements AutoCloseable { 7 | 8 | static final ThreadLocal current = new ThreadLocal<>(); 9 | 10 | public UserContext(LoginUser user) { 11 | current.set(user); 12 | } 13 | 14 | public static LoginUser getCurrentUser() { 15 | return current.get(); 16 | } 17 | 18 | public static void setCurrentUser(LoginUser user) { 19 | current.set(user); 20 | } 21 | 22 | public void close() { 23 | current.remove(); 24 | } 25 | } -------------------------------------------------------------------------------- /src/main/java/com/question/admin/config/upload/annotation/FileSlotDisabled.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.config.upload.annotation; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | /** 10 | * 如果方法上加了该注解, 则表示该方法不统一处理multipart 11 | */ 12 | @Target({ ElementType.PARAMETER, ElementType.METHOD }) 13 | @Retention(RetentionPolicy.RUNTIME) 14 | @Documented 15 | public @interface FileSlotDisabled { 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/config/upload/entity/CategorialFileSlot.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.config.upload.entity; 2 | 3 | 4 | /** 5 | * 6 | */ 7 | public interface CategorialFileSlot extends FileSlot { 8 | /** 9 | * 用户自定义的文件类别. 10 | * 当上传文件时, 该方法获取传来的category, 并保存到对应的{@link Att}中。 11 | * @return 12 | */ 13 | String getSlotFileCategoryOnUploading(); 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/config/upload/entity/FileSlot.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.config.upload.entity; 2 | 3 | import java.util.List; 4 | import java.util.UUID; 5 | 6 | import com.question.admin.domain.entity.sysmgr.Att; 7 | 8 | /** 9 | * 文件批次。 10 | * 凡是实现该接口的实体类, 代表这个类有附件或者其它附属文件; 这些文件的增删改均通过切面{@code MultipartAspect}统一处理, 11 | * 数据保存为{@code FileEntity} 。 12 | */ 13 | public interface FileSlot { 14 | 15 | static String newSlotId() { 16 | return UUID.randomUUID().toString(); 17 | } 18 | 19 | /** 20 | * 文件槽的ID, 一个ID关联一个或者多个FileEntity 21 | * @return 22 | */ 23 | String getSlotId(); 24 | 25 | /** 26 | * 设置文件槽的ID, 一个ID关联一个或者多个FileEntity 27 | * @param batchId 28 | */ 29 | void setSlotId(String batchId); 30 | 31 | /** 32 | * 与文件槽关联的文件实体FileEntity 列表。 33 | * @return 34 | */ 35 | List getSlotFiles(); 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/config/upload/support/DefaultFileArchiveStrategy.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.config.upload.support; 2 | 3 | import com.question.admin.utils.DateUtils; 4 | import com.question.admin.utils.StringUtils; 5 | 6 | import java.nio.file.Path; 7 | import java.nio.file.Paths; 8 | 9 | /** 10 | * 生成文件路径默认策略。 11 | */ 12 | public class DefaultFileArchiveStrategy implements FileArchiveStrategy { 13 | 14 | /** 15 | * 16 | */ 17 | @Override 18 | public Path createPath(String sourceUri, String originalFilename) { 19 | if (StringUtils.isEmpty(sourceUri)) { 20 | sourceUri = ""; 21 | } 22 | if (sourceUri.startsWith("/")) { 23 | sourceUri = sourceUri.replaceFirst("/", ""); 24 | } 25 | 26 | if (StringUtils.isNotEmpty(sourceUri) && !sourceUri.endsWith("/")) { 27 | sourceUri += "/"; 28 | } 29 | 30 | // YYYY/mm/YYYYmmDD_originalFilename 31 | String path = sourceUri 32 | + DateUtils.formatDate(DateUtils.currentDate(), DateUtils.TimeFormat.LONG_DATE_PATTERN_WITH_MILSEC_NONE2); 33 | path += "_." + originalFilename.substring(originalFilename.lastIndexOf(".") + 1); 34 | 35 | return Paths.get(path); 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/config/upload/support/FileArchiveStrategy.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.config.upload.support; 2 | 3 | import java.nio.file.Path; 4 | 5 | /** 6 | * 文件路径生成策略 7 | */ 8 | public interface FileArchiveStrategy { 9 | Path createPath(String sourceUri, String originalFilename); 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/config/upload/support/FileResolver.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.config.upload.support; 2 | 3 | import com.question.admin.config.upload.entity.FileSlot; 4 | 5 | public interface FileResolver { 6 | void resolveFile(MultipartRequestWrapper multipartRequestAttributes, FileSlot entity) throws Exception; 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/config/upload/support/MultipartContextHolder.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.config.upload.support; 2 | 3 | import org.springframework.core.NamedThreadLocal; 4 | 5 | public class MultipartContextHolder { 6 | private static final ThreadLocal requestAttributesHolder = new NamedThreadLocal( 7 | "Multipart Special Use"); 8 | 9 | /** 10 | * Reset the MultipartRequestWrapper for the current thread. 11 | */ 12 | public static void resetRequestWrapper() { 13 | requestAttributesHolder.remove(); 14 | } 15 | 16 | /** 17 | * Bind the given MultipartRequestWrapper to the current thread, not exposing 18 | * it as inheritable for child threads. 19 | * @param request the MultipartRequestWrapper to expose 20 | */ 21 | public static void setRequestWrapper(MultipartRequestWrapper request) { 22 | requestAttributesHolder.set(request); 23 | } 24 | 25 | /** 26 | * Return the MultipartRequestWrapper currently bound to the thread. 27 | * @return the MultipartRequestWrapper currently bound to the thread, or {@code null} 28 | * if none bound 29 | */ 30 | public static MultipartRequestWrapper getRequestWrapper() { 31 | MultipartRequestWrapper request = requestAttributesHolder.get(); 32 | return request; 33 | } 34 | 35 | /** 36 | * Return the MultipartRequestWrapper currently bound to the thread. 37 | *

38 | * @return the MultipartRequestWrapper currently bound to the thread 39 | * @throws IllegalStateException if no MultipartRequestWrapper object is bound to the 40 | * current thread 41 | */ 42 | public static MultipartRequestWrapper currentRequestAttributes() 43 | throws IllegalStateException { 44 | MultipartRequestWrapper request = getRequestWrapper(); 45 | if (request == null) { 46 | // throw new IllegalStateException("No thread-bound request found"); 47 | } 48 | return request; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/config/upload/support/MultipartRequestWrapper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.config.upload.support; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | 5 | import org.springframework.web.multipart.MultipartHttpServletRequest; 6 | import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest; 7 | 8 | public class MultipartRequestWrapper { 9 | 10 | private HttpServletRequest request; 11 | 12 | public MultipartRequestWrapper(HttpServletRequest request) { 13 | this.request = request; 14 | } 15 | 16 | public boolean isMultipartRequest() { 17 | return (this.request != null) 18 | && (this.request instanceof MultipartHttpServletRequest || this.request instanceof StandardMultipartHttpServletRequest); 19 | } 20 | 21 | public MultipartHttpServletRequest getRequest() { 22 | return (MultipartHttpServletRequest) request; 23 | } 24 | 25 | public void setRequest(HttpServletRequest request) { 26 | this.request = request; 27 | } 28 | 29 | /** 30 | * Return the value of the given name, if any. 31 | * @param name the name of the attribute 32 | * @return the current attribute value, or {@code null} if not found 33 | */ 34 | public Object getAttribute(String name) { 35 | return request.getAttribute(name); 36 | } 37 | 38 | /** 39 | * Set the value of the given name, replacing an existing value (if any). 40 | * @param name the name of the attribute 41 | * @param value the value for the attribute 42 | */ 43 | // void setAttribute(String name, Object value) { 44 | // map.put(name, value); 45 | // } 46 | 47 | /** 48 | * Remove the attribute of the given name, if it exists. 49 | *

50 | * Note that an implementation should also remove a registered destruction callback 51 | * for the specified attribute, if any. It does, however, not need to 52 | * execute a registered destruction callback in this case, since the object 53 | * will be destroyed by the caller (if appropriate). 54 | * @param name the name of the attribute 55 | */ 56 | // void removeAttribute(String name) { 57 | // map.remove(name); 58 | // } 59 | 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/config/wx/SystemConfig.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.config.wx; 2 | 3 | import com.question.admin.config.QnConfig; 4 | import lombok.Data; 5 | import org.springframework.boot.context.properties.ConfigurationProperties; 6 | 7 | 8 | 9 | /** 10 | * @author alvis 11 | */ 12 | @ConfigurationProperties(prefix = "system") 13 | @Data 14 | public class SystemConfig { 15 | private WxConfig wx; 16 | private QnConfig qn; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/config/wx/WxConfig.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.config.wx; 2 | 3 | import lombok.Data; 4 | 5 | import java.time.Duration; 6 | 7 | @Data 8 | public class WxConfig { 9 | private String appid; 10 | private String secret; 11 | private Duration tokenToLive; 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/constant/Constants.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.constant; 2 | 3 | /** 4 | * 常量类 5 | */ 6 | public final class Constants { 7 | 8 | /**********************通用代码 start***********************/ 9 | //密码错误 10 | public static final Integer PASSWORD_CHECK_INVALID = 40001; 11 | 12 | //验证成功 13 | public static final Integer TOKEN_CHECK_SUCCESS = 20000; 14 | 15 | //服务端错误 16 | public static final Integer SERVER_ERROR = 50000; 17 | //参数不完整 18 | public static final Integer PARAMETERS_VALID_ERROR = 50001; 19 | //参数不完整 20 | public static final Integer PARAMETERS_MISSING = 50002; 21 | 22 | //非法token 23 | public static final Integer TOKEN_CHECK_ILLEFALITY_ERROR = 50008; 24 | //其他客户端登录 25 | public static final Integer TOKEN_CHECK_OTHER_LOGIN = 50012; 26 | //token 过期 27 | public static final Integer TOKEN_CHECK_STALE_DATED = 50014; 28 | 29 | //获取条线的角色标识 30 | public static final String ERP_ROLE_BL = "jr_scm_bl"; 31 | //获取组织的角色标识 32 | public static final String ERP_ROLE_ORG = "jr_scm_org"; 33 | /**********************通用代码 end***********************/ 34 | 35 | /** 36 | * 过期时间 37 | */ 38 | public static class ExpireTime { 39 | private ExpireTime() { 40 | } 41 | public static final int TEN_SEC = 10;//10s 42 | public static final int THIRTY_SEC = 30;//30s 43 | public static final int ONE_MINUTE = 60;//一分钟 44 | public static final int THIRTY_MINUTES = 60 * 30;//30分钟 45 | public static final int ONE_HOUR = 60 * 60;//一小时 46 | public static final int THREE_HOURS = 60 * 60 * 3;//三小时 47 | public static final int TWELVE_HOURS = 60 * 60 * 12;//十二小时,单位s 48 | public static final int ONE_DAY = 60 * 60 * 24;//二十四小时 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/constant/SecurityConsts.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.constant; 2 | 3 | public class SecurityConsts { 4 | 5 | public static final String LOGIN_SALT = "question-admin"; 6 | 7 | /** 8 | * request请求头属性 9 | */ 10 | public static final String REQUEST_AUTH_HEADER="Authorization"; 11 | 12 | /** 13 | * JWT-account 14 | */ 15 | public static final String ACCOUNT = "account"; 16 | 17 | /** 18 | * 组织ID 19 | */ 20 | public static final String ORG_ID_TOKEN = "orgIdToken"; 21 | 22 | /** 23 | * Shiro redis 前缀 24 | */ 25 | public static final String PREFIX_SHIRO_CACHE = "question-admin:cache:"; 26 | 27 | /** 28 | * redis-key-前缀-shiro:refresh_token 29 | */ 30 | public final static String PREFIX_SHIRO_REFRESH_TOKEN = "question-admin:refresh_token:"; 31 | 32 | /** 33 | * redis-key-前缀-shiro:refresh_check 34 | */ 35 | public final static String PREFIX_SHIRO_REFRESH_CHECK = "question:refresh_check:"; 36 | 37 | /** 38 | * JWT-currentTimeMillis 39 | */ 40 | public final static String CURRENT_TIME_MILLIS = "currentTimeMillis"; 41 | 42 | public final static String HIDDEN_PASSWORD="******"; 43 | 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/constant/enumtype/YNFlagStatusEnum.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.constant.enumtype; 2 | 3 | /** 4 | * @date 2014-10-16 下午02:51:21 5 | */ 6 | public enum YNFlagStatusEnum { 7 | VALID("1","有效"), 8 | FAIL("0","无效"); 9 | 10 | YNFlagStatusEnum(String code, String desc) { 11 | this.code = code; 12 | this.desc = desc; 13 | } 14 | 15 | private String desc; 16 | private String code; 17 | 18 | public String getDesc() { 19 | return desc; 20 | } 21 | 22 | public String getCode() { 23 | return code; 24 | } 25 | 26 | public String toString(){ 27 | return code+","+desc; 28 | } 29 | 30 | /** 31 | * 通过key 查找描述 方法 32 | * @param key 33 | */ 34 | public static String getValueByKey(String key) { 35 | for (YNFlagStatusEnum pm : YNFlagStatusEnum.values()) { 36 | if (pm.getCode().equals(key)) { 37 | return pm.getDesc(); 38 | } 39 | } 40 | return null; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/constant/sysmgr/ScheduleJobConsts.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.constant.sysmgr; 2 | 3 | /** 4 | * 系统定时任务常量 5 | */ 6 | public final class ScheduleJobConsts { 7 | 8 | private ScheduleJobConsts() { 9 | throw new IllegalAccessError("ScheduleJobConsts 常量类,不能实例化!"); 10 | } 11 | 12 | /** 13 | * 定时任务Job所在包 14 | */ 15 | public final static String JOB_PKG = "com.question.admin.scheduler"; 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/constant/sysmgr/UserStatusEnum.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.constant.sysmgr; 2 | 3 | public enum UserStatusEnum { 4 | 5 | NORMAL("0", "正常"), 6 | LOCK("1","禁用"); 7 | 8 | private String code; 9 | private String val; 10 | 11 | UserStatusEnum(String code, String val) { 12 | this.code = code; 13 | this.val = val; 14 | } 15 | 16 | public String code() { 17 | return code; 18 | } 19 | 20 | public String val() { 21 | return val; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/QuestionServiceException.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain; 2 | 3 | /** 4 | * 统一Rest API异常类 5 | * 6 | * @author 7 | * 8 | */ 9 | public class QuestionServiceException extends Exception { 10 | 11 | private static final long serialVersionUID = -7795831940099270963L; 12 | 13 | /** 14 | * 构造函数 15 | */ 16 | public QuestionServiceException() { 17 | super(); 18 | } 19 | 20 | /** 21 | * 构造函数 22 | * 23 | * @param message 24 | * @param cause 25 | * @param enableSuppression 26 | * @param writableStackTrace 27 | */ 28 | public QuestionServiceException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { 29 | super(message, cause, enableSuppression, writableStackTrace); 30 | } 31 | 32 | /** 33 | * 构造函数 34 | * 35 | * @param message 36 | * @param cause 37 | */ 38 | public QuestionServiceException(String message, Throwable cause) { 39 | super(message, cause); 40 | } 41 | 42 | /** 43 | * 构造函数 44 | * 45 | * @param message 46 | */ 47 | public QuestionServiceException(String message) { 48 | super(message); 49 | } 50 | 51 | /** 52 | * 构造函数 53 | * 54 | * @param cause 55 | */ 56 | public QuestionServiceException(Throwable cause) { 57 | super(cause); 58 | } 59 | 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/BaseEntity.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity; 2 | 3 | 4 | 5 | import com.baomidou.mybatisplus.extension.activerecord.Model; 6 | 7 | import java.io.Serializable; 8 | 9 | 10 | public class BaseEntity> extends Model { 11 | 12 | protected Long id; 13 | 14 | public BaseEntity() { 15 | } 16 | 17 | @Override 18 | protected Serializable pkVal() { 19 | return this.id; 20 | } 21 | 22 | public void setId(Long id) { 23 | this.id = id; 24 | } 25 | 26 | public Long getId() { 27 | return this.id; 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/baseinfo/Dict.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.baseinfo; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableName; 4 | 5 | import java.util.Date; 6 | 7 | import com.question.admin.domain.entity.BaseEntity; 8 | import lombok.Data; 9 | import lombok.EqualsAndHashCode; 10 | import lombok.experimental.Accessors; 11 | 12 | /** 13 | *

14 | * 字典表 15 | *

16 | * 17 | * @author zvc 18 | * @since 2019-07-12 19 | */ 20 | @Data 21 | @EqualsAndHashCode(callSuper = true) 22 | @Accessors(chain = true) 23 | @TableName("st_dict") 24 | public class Dict extends BaseEntity { 25 | 26 | private static final long serialVersionUID = 1L; 27 | 28 | /** 29 | * 编码 30 | */ 31 | private String code; 32 | 33 | /** 34 | * 中文名称 35 | */ 36 | private String chnName; 37 | 38 | /** 39 | * 英文名称 40 | */ 41 | private String engName; 42 | 43 | /** 44 | * 排序 45 | */ 46 | private Integer showOrder; 47 | 48 | /** 49 | * 父编码 50 | */ 51 | private String parentCode; 52 | 53 | /** 54 | * 有效标志 55 | */ 56 | private String ynFlag; 57 | 58 | /** 59 | * 创建人 60 | */ 61 | private String creator; 62 | 63 | /** 64 | * 修改人 65 | */ 66 | private String editor; 67 | 68 | /** 69 | * 创建时间 70 | */ 71 | private Date createdTime; 72 | 73 | /** 74 | * 修改时间 75 | */ 76 | private Date modifiedTime; 77 | 78 | 79 | } 80 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/exam/Category.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.exam; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableField; 4 | import com.baomidou.mybatisplus.annotation.TableName; 5 | import com.question.admin.domain.entity.BaseEntity; 6 | import lombok.Data; 7 | import lombok.EqualsAndHashCode; 8 | import lombok.experimental.Accessors; 9 | 10 | import java.io.Serializable; 11 | import java.util.Date; 12 | 13 | @Data 14 | @EqualsAndHashCode(callSuper = true) 15 | @Accessors(chain = true) 16 | @TableName("bt_exam_category") 17 | public class Category extends BaseEntity implements Serializable { 18 | private String name; 19 | private String status; 20 | @TableField("creator_id") 21 | private Long creatorId; 22 | @TableField("creator") 23 | private String creator; 24 | private String editor; 25 | @TableField("created_time") 26 | private Date createdTime; 27 | 28 | /** 29 | * 修改时间 30 | */ 31 | @TableField("modified_time") 32 | private Date modifiedTime; 33 | 34 | 35 | @Override 36 | protected Serializable pkVal() { 37 | return this.id; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/exam/FeedBack.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.exam; 2 | 3 | 4 | import com.baomidou.mybatisplus.annotation.TableField; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import com.question.admin.domain.entity.BaseEntity; 7 | import lombok.Data; 8 | import lombok.EqualsAndHashCode; 9 | import lombok.experimental.Accessors; 10 | 11 | import javax.validation.constraints.*; 12 | import java.io.Serializable; 13 | import java.util.Date; 14 | 15 | @Data 16 | @EqualsAndHashCode(callSuper = true) 17 | @Accessors(chain = true) 18 | @TableName("bt_feedback") 19 | public class FeedBack extends BaseEntity implements Serializable { 20 | private String phone; 21 | @NotBlank 22 | private String wechat; 23 | @NotNull 24 | private String content; 25 | private Integer status; 26 | @TableField("creator_id") 27 | private Long creatorId; 28 | @TableField("editor_id") 29 | private Long editorId; 30 | @TableField("created_time") 31 | private Date createdTime; 32 | 33 | /** 34 | * 修改时间 35 | */ 36 | @TableField("modified_time") 37 | private Date modifiedTime; 38 | 39 | @Override 40 | protected Serializable pkVal() { 41 | return this.id; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/exam/Paper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.exam; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableField; 4 | import com.baomidou.mybatisplus.annotation.TableName; 5 | import com.question.admin.domain.entity.BaseEntity; 6 | import lombok.Data; 7 | import lombok.EqualsAndHashCode; 8 | import lombok.experimental.Accessors; 9 | 10 | import java.io.Serializable; 11 | import java.util.Date; 12 | 13 | @Data 14 | @EqualsAndHashCode(callSuper = true) 15 | @Accessors(chain = true) 16 | @TableName("bt_exam_paper") 17 | public class Paper extends BaseEntity implements Serializable { 18 | 19 | private String name; 20 | private String status; 21 | @TableField("subject_id") 22 | private Long subjectId; 23 | private String creator; 24 | @TableField("creator_id") 25 | private Long creatorId; 26 | private String editor; 27 | @TableField("created_time") 28 | private Date createdTime; 29 | 30 | /** 31 | * 修改时间 32 | */ 33 | @TableField("modified_time") 34 | private Date modifiedTime; 35 | 36 | @TableField("suggest_time") 37 | private Integer suggestTime; 38 | @TableField("paper_type") 39 | private Integer paperType; 40 | @TableField("question_count") 41 | private Integer questionCount; 42 | @TableField("limit_end_time") 43 | private Date limitStartTime; 44 | @TableField("limit_end_time") 45 | private Date limitEndTime; 46 | @TableField("text_content_id") 47 | private Long textContentId; 48 | @TableField("task_exam_id") 49 | private Long taskExamId; 50 | private Integer score; 51 | 52 | @Override 53 | protected Serializable pkVal() { 54 | return this.id; 55 | } 56 | 57 | } 58 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/exam/Question.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.exam; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableField; 4 | import com.baomidou.mybatisplus.annotation.TableName; 5 | import com.question.admin.domain.entity.BaseEntity; 6 | import com.question.admin.domain.vo.manager.exam.question.QuestionTypeEnum; 7 | import com.question.admin.utils.ExamUtil; 8 | import lombok.Data; 9 | import lombok.EqualsAndHashCode; 10 | import lombok.experimental.Accessors; 11 | 12 | import java.io.Serializable; 13 | import java.util.Date; 14 | import java.util.List; 15 | 16 | @Data 17 | @EqualsAndHashCode(callSuper = true) 18 | @Accessors(chain = true) 19 | @TableName("bt_exam_question") 20 | public class Question extends BaseEntity implements Serializable { 21 | 22 | // private String name; 23 | private Integer status; 24 | @TableField("subject_id") 25 | private Long subjectId; 26 | @TableField("question_type") 27 | private Integer questionType; 28 | private Integer difficult; 29 | private String correct; 30 | @TableField("info_text_content_id") 31 | private Long infoTextContentId; 32 | private String creator; 33 | @TableField("creator_id") 34 | private Long creatorId; 35 | 36 | private String editor; 37 | @TableField("created_time") 38 | private Date createdTime; 39 | private Integer score; 40 | /** 41 | * 修改时间 42 | */ 43 | @TableField("modified_time") 44 | private Date modifiedTime; 45 | 46 | public void setCorrectFromVM(String correct, List correctArray) { 47 | int qType = this.getQuestionType(); 48 | if (qType == QuestionTypeEnum.MultipleChoice.getCode()) { 49 | String correctJoin = ExamUtil.contentToString(correctArray); 50 | this.setCorrect(correctJoin); 51 | } else { 52 | this.setCorrect(correct); 53 | } 54 | } 55 | 56 | @Override 57 | protected Serializable pkVal() { 58 | return this.id; 59 | } 60 | 61 | } 62 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/exam/Subject.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.exam; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableField; 4 | import com.baomidou.mybatisplus.annotation.TableName; 5 | import com.question.admin.domain.entity.BaseEntity; 6 | import lombok.Data; 7 | import lombok.EqualsAndHashCode; 8 | import lombok.experimental.Accessors; 9 | 10 | import java.io.Serializable; 11 | import java.util.Date; 12 | 13 | @Data 14 | @EqualsAndHashCode(callSuper = true) 15 | @Accessors(chain = true) 16 | @TableName("bt_exam_subject") 17 | public class Subject extends BaseEntity implements Serializable { 18 | 19 | private String name; 20 | private String status; 21 | @TableField("category_id") 22 | private Long categoryId; 23 | private String creator; 24 | @TableField("creator_id") 25 | private Long creatorId; 26 | private String editor; 27 | @TableField("created_time") 28 | private Date createdTime; 29 | 30 | /** 31 | * 修改时间 32 | */ 33 | @TableField("modified_time") 34 | private Date modifiedTime; 35 | 36 | 37 | @Override 38 | protected Serializable pkVal() { 39 | return this.id; 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/exam/SwiperConfig.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.exam; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableField; 4 | import com.baomidou.mybatisplus.annotation.TableName; 5 | import com.question.admin.domain.entity.BaseEntity; 6 | import lombok.Data; 7 | import lombok.EqualsAndHashCode; 8 | import lombok.experimental.Accessors; 9 | 10 | import javax.validation.constraints.NotNull; 11 | import java.io.Serializable; 12 | import java.util.Date; 13 | 14 | @Data 15 | @EqualsAndHashCode(callSuper = true) 16 | @Accessors(chain = true) 17 | @TableName("bt_swiper_config") 18 | public class SwiperConfig extends BaseEntity implements Serializable { 19 | 20 | @NotNull 21 | private String url; 22 | @TableField("order_item") 23 | private Integer orderItem; 24 | @NotNull 25 | private Integer status; 26 | @TableField("created_time") 27 | private Date createdTime; 28 | 29 | /** 30 | * 修改时间 31 | */ 32 | @TableField("modified_time") 33 | private Date modifiedTime; 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/exam/TaskExam.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.exam; 2 | 3 | import java.io.Serializable; 4 | import java.util.Date; 5 | 6 | public class TaskExam implements Serializable { 7 | 8 | private static final long serialVersionUID = -7014704644631536195L; 9 | 10 | private Integer id; 11 | 12 | private String title; 13 | 14 | private Integer gradeLevel; 15 | 16 | private Integer frameTextContentId; 17 | 18 | private Integer createUser; 19 | 20 | private Date createTime; 21 | 22 | private Boolean deleted; 23 | 24 | private String createUserName; 25 | 26 | public Integer getId() { 27 | return id; 28 | } 29 | 30 | public void setId(Integer id) { 31 | this.id = id; 32 | } 33 | 34 | public String getTitle() { 35 | return title; 36 | } 37 | 38 | public void setTitle(String title) { 39 | this.title = title == null ? null : title.trim(); 40 | } 41 | 42 | public Integer getGradeLevel() { 43 | return gradeLevel; 44 | } 45 | 46 | public void setGradeLevel(Integer gradeLevel) { 47 | this.gradeLevel = gradeLevel; 48 | } 49 | 50 | public Integer getFrameTextContentId() { 51 | return frameTextContentId; 52 | } 53 | 54 | public void setFrameTextContentId(Integer frameTextContentId) { 55 | this.frameTextContentId = frameTextContentId; 56 | } 57 | 58 | public Integer getCreateUser() { 59 | return createUser; 60 | } 61 | 62 | public void setCreateUser(Integer createUser) { 63 | this.createUser = createUser; 64 | } 65 | 66 | public Date getCreateTime() { 67 | return createTime; 68 | } 69 | 70 | public void setCreateTime(Date createTime) { 71 | this.createTime = createTime; 72 | } 73 | 74 | public Boolean getDeleted() { 75 | return deleted; 76 | } 77 | 78 | public void setDeleted(Boolean deleted) { 79 | this.deleted = deleted; 80 | } 81 | 82 | public String getCreateUserName() { 83 | return createUserName; 84 | } 85 | 86 | public void setCreateUserName(String createUserName) { 87 | this.createUserName = createUserName == null ? null : createUserName.trim(); 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/exam/enums/ExamPaperTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.exam.enums; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | public enum ExamPaperTypeEnum { 7 | 8 | Fixed(1, "固定试卷"), 9 | Temp(2, "临时时间"), 10 | Classes(3, "班级试卷"), 11 | TimeLimit(4, "时段试卷"), 12 | Push(5, "推送试卷"), 13 | Task(6, "任务试卷"); 14 | 15 | int code; 16 | String name; 17 | 18 | ExamPaperTypeEnum(int code, String name) { 19 | this.code = code; 20 | this.name = name; 21 | } 22 | 23 | 24 | private static final Map keyMap = new HashMap<>(); 25 | 26 | static { 27 | for (ExamPaperTypeEnum item : ExamPaperTypeEnum.values()) { 28 | keyMap.put(item.getCode(), item); 29 | } 30 | } 31 | 32 | public static ExamPaperTypeEnum fromCode(Integer code) { 33 | return keyMap.get(code); 34 | } 35 | 36 | 37 | public int getCode() { 38 | return code; 39 | } 40 | 41 | public void setCode(int code) { 42 | this.code = code; 43 | } 44 | 45 | public String getName() { 46 | return name; 47 | } 48 | 49 | public void setName(String name) { 50 | this.name = name; 51 | } 52 | 53 | 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/exam/file/UeditorConfigVM.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.exam.file; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.List; 6 | 7 | @Data 8 | public class UeditorConfigVM { 9 | private String imageActionName; 10 | private String imageFieldName; 11 | private Long imageMaxSize; 12 | private List imageAllowFiles; 13 | private boolean imageCompressEnable; 14 | private Integer imageCompressBorder; 15 | private String imageInsertAlign; 16 | private String imageUrlPrefix; 17 | private String imagePathFormat; 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/exam/file/UploadResultVM.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.exam.file; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class UploadResultVM { 7 | private String original; 8 | private String name; 9 | private String url; 10 | private Long size; 11 | private String type; 12 | private String state; 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/exam/paper/ExamPaperQuestionItemObject.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.exam.paper; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class ExamPaperQuestionItemObject { 7 | private Long id; 8 | private Integer itemOrder; 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/exam/paper/ExamPaperTitleItemObject.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.exam.paper; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.List; 6 | 7 | @Data 8 | public class ExamPaperTitleItemObject { 9 | 10 | private String name; 11 | 12 | private List questionItems; 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/exam/question/QuestionItemObject.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.exam.question; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class QuestionItemObject { 7 | 8 | private String prefix; 9 | 10 | private String content; 11 | 12 | private Integer score; 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/exam/question/QuestionObject.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.exam.question; 2 | 3 | 4 | import lombok.Data; 5 | 6 | import java.io.Serializable; 7 | import java.util.List; 8 | 9 | @Data 10 | public class QuestionObject implements Serializable{ 11 | 12 | private String titleContent; 13 | 14 | private String analyze; 15 | 16 | private List questionItemObjects; 17 | 18 | private String correct; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/exam/question/TextContent.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.exam.question; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableField; 4 | import com.baomidou.mybatisplus.annotation.TableName; 5 | import com.question.admin.domain.entity.BaseEntity; 6 | import lombok.Data; 7 | import lombok.EqualsAndHashCode; 8 | import lombok.experimental.Accessors; 9 | 10 | import java.io.Serializable; 11 | import java.util.Date; 12 | 13 | @Data 14 | @EqualsAndHashCode(callSuper = true) 15 | @Accessors(chain = true) 16 | @TableName("bt_exam_text_content") 17 | public class TextContent extends BaseEntity implements Serializable { 18 | 19 | 20 | private String content; 21 | @TableField("created_time") 22 | private Date createdTime; 23 | @TableField("creator_id") 24 | private Long creatorId; 25 | public TextContent(){} 26 | public TextContent(String content, Date createdTime, Long creatorId) { 27 | this.content = content; 28 | this.createdTime = createdTime; 29 | this.creatorId = creatorId; 30 | } 31 | 32 | @Override 33 | protected Serializable pkVal() { 34 | return this.id; 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/sysmgr/Att.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.sysmgr; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableName; 4 | 5 | import java.util.Date; 6 | 7 | import com.question.admin.domain.entity.BaseEntity; 8 | import lombok.Data; 9 | import lombok.EqualsAndHashCode; 10 | import lombok.experimental.Accessors; 11 | 12 | /** 13 | *

14 | * 附件表 15 | *

16 | * 17 | * @author zvc 18 | * @since 2019-07-12 19 | */ 20 | @Data 21 | @EqualsAndHashCode(callSuper = true) 22 | @Accessors(chain = true) 23 | @TableName("st_att") 24 | public class Att extends BaseEntity { 25 | 26 | private static final long serialVersionUID = 1L; 27 | 28 | private String name; 29 | private String slotId; 30 | private String fileCate; 31 | private String type; 32 | private Long fileSize; 33 | private String originName; 34 | private String path; 35 | private String description; 36 | 37 | /** 38 | * 有效标志 39 | */ 40 | private String ynFlag; 41 | 42 | /** 43 | * 创建人 44 | */ 45 | private String creator; 46 | 47 | /** 48 | * 修改人 49 | */ 50 | private String editor; 51 | 52 | /** 53 | * 创建时间 54 | */ 55 | private Date createdTime; 56 | 57 | /** 58 | * 修改时间 59 | */ 60 | private Date modifiedTime; 61 | 62 | } 63 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/sysmgr/Authority.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.sysmgr; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableField; 4 | import com.baomidou.mybatisplus.annotation.TableName; 5 | import com.question.admin.domain.entity.BaseEntity; 6 | import lombok.Data; 7 | import lombok.EqualsAndHashCode; 8 | import lombok.experimental.Accessors; 9 | 10 | import java.io.Serializable; 11 | import java.util.Date; 12 | 13 | /** 14 | *

15 | * 权限表 16 | *

17 | * 18 | * @author zvc 19 | * @since 2018-12-28 20 | */ 21 | @Data 22 | @EqualsAndHashCode(callSuper = true) 23 | @Accessors(chain = true) 24 | @TableName("st_authority") 25 | public class Authority extends BaseEntity { 26 | 27 | private static final long serialVersionUID = 1L; 28 | 29 | private String name; 30 | 31 | private String code; 32 | 33 | @TableField("full_id") 34 | private String fullId; 35 | 36 | @TableField("authority_desc") 37 | private String authorityDesc; 38 | 39 | @TableField("show_order") 40 | private Integer showOrder; 41 | 42 | private Long pid; 43 | 44 | /** 45 | * 有效标志 46 | */ 47 | @TableField("yn_flag") 48 | private String ynFlag; 49 | 50 | /** 51 | * 创建人 52 | */ 53 | private String creator; 54 | 55 | /** 56 | * 修改人 57 | */ 58 | private String editor; 59 | 60 | /** 61 | * 创建时间 62 | */ 63 | @TableField("created_time") 64 | private Date createdTime; 65 | 66 | /** 67 | * 修改时间 68 | */ 69 | @TableField("modified_time") 70 | private Date modifiedTime; 71 | 72 | 73 | @Override 74 | protected Serializable pkVal() { 75 | return this.id; 76 | } 77 | 78 | } 79 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/sysmgr/Backup.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.sysmgr; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableName; 4 | 5 | import java.util.Date; 6 | 7 | import com.question.admin.domain.entity.BaseEntity; 8 | import lombok.Data; 9 | import lombok.EqualsAndHashCode; 10 | import lombok.experimental.Accessors; 11 | 12 | /** 13 | *

14 | * DB备份表 15 | *

16 | * 17 | * @author zvc 18 | * @since 2019-09-10 19 | */ 20 | @Data 21 | @EqualsAndHashCode(callSuper = true) 22 | @Accessors(chain = true) 23 | @TableName("st_backup") 24 | public class Backup extends BaseEntity { 25 | 26 | private static final long serialVersionUID = 1L; 27 | 28 | private Date backupDate; 29 | 30 | private String backupName; 31 | 32 | private String backupPath; 33 | 34 | private String dbName; 35 | 36 | private Long fileSize; 37 | 38 | private String remark; 39 | 40 | private Long runtime; 41 | 42 | private Integer status; 43 | 44 | /** 45 | * 有效标志 46 | */ 47 | private String ynFlag; 48 | 49 | /** 50 | * 创建人 51 | */ 52 | private String creator; 53 | 54 | /** 55 | * 修改人 56 | */ 57 | private String editor; 58 | 59 | /** 60 | * 创建时间 61 | */ 62 | private Date createdTime; 63 | 64 | /** 65 | * 修改时间 66 | */ 67 | private Date modifiedTime; 68 | 69 | 70 | } 71 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/sysmgr/LoginLog.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.sysmgr; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableName; 4 | 5 | import java.util.Date; 6 | 7 | import com.question.admin.domain.entity.BaseEntity; 8 | import lombok.Data; 9 | import lombok.EqualsAndHashCode; 10 | import lombok.experimental.Accessors; 11 | 12 | /** 13 | *

14 | * 登录日志 15 | *

16 | * 17 | * @author zvc 18 | * @since 2019-07-26 19 | */ 20 | @Data 21 | @EqualsAndHashCode(callSuper = true) 22 | @Accessors(chain = true) 23 | @TableName("st_login_log") 24 | public class LoginLog extends BaseEntity { 25 | 26 | private static final long serialVersionUID = 1L; 27 | 28 | /** 29 | * 用户名 30 | */ 31 | private String account; 32 | 33 | /** 34 | * 访问时间 35 | */ 36 | private Date loginTime; 37 | 38 | /** 39 | * 内容 40 | */ 41 | private String content; 42 | 43 | /** 44 | * 有效标志 45 | */ 46 | private String ynFlag; 47 | 48 | /** 49 | * 创建人 50 | */ 51 | private String creator; 52 | 53 | /** 54 | * 修改人 55 | */ 56 | private String editor; 57 | 58 | /** 59 | * 创建时间 60 | */ 61 | private Date createdTime; 62 | 63 | /** 64 | * 修改时间 65 | */ 66 | private Date modifiedTime; 67 | 68 | 69 | } 70 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/sysmgr/Mail.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.sysmgr; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableField; 4 | import com.baomidou.mybatisplus.annotation.TableName; 5 | import com.question.admin.domain.entity.BaseEntity; 6 | import lombok.Data; 7 | import lombok.EqualsAndHashCode; 8 | import lombok.experimental.Accessors; 9 | 10 | import java.io.Serializable; 11 | import java.util.Date; 12 | 13 | @Data 14 | @EqualsAndHashCode(callSuper = true) 15 | @Accessors(chain = true) 16 | @TableName("st_mail") 17 | public class Mail extends BaseEntity { 18 | private Long userId; 19 | private String toUsers; 20 | private String subject; 21 | private String content; 22 | 23 | /** 24 | * 创建时间 25 | */ 26 | @TableField("created_time") 27 | private Date createdTime; 28 | 29 | /** 30 | * 修改时间 31 | */ 32 | @TableField("modified_time") 33 | private Date modifiedTime; 34 | @Override 35 | protected Serializable pkVal() { 36 | return this.id; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/sysmgr/Notice.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.sysmgr; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableField; 4 | import com.baomidou.mybatisplus.annotation.TableName; 5 | import com.question.admin.domain.entity.BaseEntity; 6 | import lombok.Data; 7 | import lombok.EqualsAndHashCode; 8 | import lombok.experimental.Accessors; 9 | 10 | import java.io.Serializable; 11 | import java.util.Date; 12 | 13 | @Data 14 | @EqualsAndHashCode(callSuper = true) 15 | @Accessors(chain = true) 16 | @TableName("st_notice") 17 | public class Notice extends BaseEntity { 18 | 19 | private static final long serialVersionUID = -4401913568806243090L; 20 | private String title; 21 | private String content; 22 | private Integer status; 23 | /** 24 | * 创建时间 25 | */ 26 | @TableField("created_time") 27 | private Date createdTime; 28 | 29 | /** 30 | * 修改时间 31 | */ 32 | @TableField("modified_time") 33 | private Date modifiedTime; 34 | @Override 35 | protected Serializable pkVal() { 36 | return this.id; 37 | } 38 | public interface Status { 39 | int DRAFT = 0; 40 | int PUBLISH = 1; 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/sysmgr/Resource.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.sysmgr; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableField; 4 | import com.baomidou.mybatisplus.annotation.TableName; 5 | import com.question.admin.domain.entity.BaseEntity; 6 | import lombok.Data; 7 | import lombok.EqualsAndHashCode; 8 | import lombok.experimental.Accessors; 9 | 10 | import java.io.Serializable; 11 | import java.util.Date; 12 | 13 | /** 14 | *

15 | * 菜单表 16 | *

17 | * 18 | * @author zvc 19 | * @since 2018-12-28 20 | */ 21 | @Data 22 | @EqualsAndHashCode(callSuper = true) 23 | @Accessors(chain = true) 24 | @TableName("st_resource") 25 | public class Resource extends BaseEntity { 26 | 27 | private static final long serialVersionUID = 1L; 28 | 29 | private String name; 30 | 31 | @TableField("full_id") 32 | private String fullId; 33 | 34 | @TableField("icon_class") 35 | private String iconClass; 36 | 37 | @TableField("show_order") 38 | private Integer showOrder; 39 | 40 | private String url; 41 | 42 | /** 43 | * 页面路径 44 | */ 45 | private String component ; 46 | 47 | @TableField("authority_id") 48 | private Long authorityId; 49 | 50 | private Long pid; 51 | 52 | @TableField("resource_desc") 53 | private String resourceDesc; 54 | 55 | @TableField("hidden_flag") 56 | private boolean hiddenFlag; 57 | 58 | /** 59 | * 有效标志 60 | */ 61 | @TableField("yn_flag") 62 | private String ynFlag; 63 | 64 | /** 65 | * 创建人 66 | */ 67 | private String creator; 68 | 69 | /** 70 | * 修改人 71 | */ 72 | private String editor; 73 | 74 | /** 75 | * 创建时间 76 | */ 77 | @TableField("created_time") 78 | private Date createdTime; 79 | 80 | /** 81 | * 修改时间 82 | */ 83 | @TableField("modified_time") 84 | private Date modifiedTime; 85 | 86 | 87 | @Override 88 | protected Serializable pkVal() { 89 | return this.id; 90 | } 91 | 92 | } 93 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/sysmgr/Role.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.sysmgr; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableField; 4 | import com.baomidou.mybatisplus.annotation.TableName; 5 | import com.question.admin.domain.entity.BaseEntity; 6 | import lombok.Data; 7 | import lombok.EqualsAndHashCode; 8 | import lombok.experimental.Accessors; 9 | 10 | import java.io.Serializable; 11 | import java.util.Date; 12 | 13 | /** 14 | *

15 | * 角色表 16 | *

17 | * 18 | * @author zvc 19 | * @since 2018-12-28 20 | */ 21 | @Data 22 | @EqualsAndHashCode(callSuper = true) 23 | @Accessors(chain = true) 24 | @TableName("st_role") 25 | public class Role extends BaseEntity { 26 | 27 | private static final long serialVersionUID = 1L; 28 | 29 | private String name; 30 | 31 | @TableField("role_desc") 32 | private String roleDesc; 33 | 34 | /** 35 | * 有效标志 36 | */ 37 | @TableField("yn_flag") 38 | private String ynFlag; 39 | 40 | /** 41 | * 创建人 42 | */ 43 | private String creator; 44 | 45 | /** 46 | * 修改人 47 | */ 48 | private String editor; 49 | 50 | /** 51 | * 创建时间 52 | */ 53 | @TableField("created_time") 54 | private Date createdTime; 55 | 56 | /** 57 | * 修改时间 58 | */ 59 | @TableField("modified_time") 60 | private Date modifiedTime; 61 | 62 | 63 | @Override 64 | protected Serializable pkVal() { 65 | return this.id; 66 | } 67 | 68 | } 69 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/sysmgr/RoleAuthority.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.sysmgr; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableField; 4 | import com.baomidou.mybatisplus.annotation.TableName; 5 | import com.question.admin.domain.entity.BaseEntity; 6 | import lombok.Data; 7 | import lombok.EqualsAndHashCode; 8 | import lombok.experimental.Accessors; 9 | 10 | import java.io.Serializable; 11 | import java.util.Date; 12 | 13 | /** 14 | *

15 | * 角色权限关系表 16 | *

17 | * 18 | * @author zvc 19 | * @since 2018-12-28 20 | */ 21 | @Data 22 | @EqualsAndHashCode(callSuper = true) 23 | @Accessors(chain = true) 24 | @TableName("st_role_authority") 25 | public class RoleAuthority extends BaseEntity { 26 | 27 | @TableField("role_id") 28 | private Long roleId; 29 | 30 | @TableField("authority_id") 31 | private Long authorityId; 32 | 33 | /** 34 | * 有效标志 35 | */ 36 | @TableField("yn_flag") 37 | private String ynFlag; 38 | 39 | /** 40 | * 创建人 41 | */ 42 | private String creator; 43 | 44 | /** 45 | * 修改人 46 | */ 47 | private String editor; 48 | 49 | /** 50 | * 创建时间 51 | */ 52 | @TableField("created_time") 53 | private Date createdTime; 54 | 55 | /** 56 | * 修改时间 57 | */ 58 | @TableField("modified_time") 59 | private Date modifiedTime; 60 | 61 | @Override 62 | protected Serializable pkVal() { 63 | return this.id; 64 | } 65 | 66 | public RoleAuthority() { 67 | } 68 | 69 | public RoleAuthority(Long roleId, Long authorityId) { 70 | this.roleId = roleId; 71 | this.authorityId = authorityId; 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/sysmgr/ScheduleJob.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.sysmgr; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableName; 4 | import com.question.admin.domain.entity.BaseEntity; 5 | import lombok.Data; 6 | import lombok.EqualsAndHashCode; 7 | import lombok.experimental.Accessors; 8 | 9 | import java.util.Date; 10 | 11 | /** 12 | *

13 | * 定时任务 14 | *

15 | * 16 | * @author zvc 17 | * @since 2019-08-18 18 | */ 19 | @Data 20 | @EqualsAndHashCode(callSuper = true) 21 | @Accessors(chain = true) 22 | @TableName("st_schedule_job") 23 | public class ScheduleJob extends BaseEntity { 24 | 25 | private static final long serialVersionUID = 1L; 26 | 27 | /** 28 | * JobID 29 | */ 30 | private String jobId; 31 | 32 | /** 33 | * Job名称 34 | */ 35 | private String jobName; 36 | 37 | /** 38 | * cron表达式 39 | */ 40 | private String cron; 41 | 42 | /** 43 | * 启动状态 44 | */ 45 | private Boolean startJob; 46 | 47 | /** 48 | * 方法 49 | */ 50 | private String jobClass; 51 | 52 | /** 53 | * 开始时间 54 | */ 55 | private Date startTime; 56 | 57 | /** 58 | * 触发时间 59 | */ 60 | private Date fireTime; 61 | 62 | /** 63 | * 上次触发时间 64 | */ 65 | private Date lastFireTime; 66 | 67 | /** 68 | * 下次触发时间 69 | */ 70 | private Date nextFireTime; 71 | 72 | /** 73 | * Job描述 74 | */ 75 | private String jobDesc; 76 | 77 | /** 78 | * 失败原因 79 | */ 80 | private String failReason; 81 | 82 | /** 83 | * 有效标志 84 | */ 85 | private String ynFlag; 86 | 87 | /** 88 | * 创建人 89 | */ 90 | private String creator; 91 | 92 | /** 93 | * 修改人 94 | */ 95 | private String editor; 96 | 97 | /** 98 | * 创建时间 99 | */ 100 | private Date createdTime; 101 | 102 | /** 103 | * 修改时间 104 | */ 105 | private Date modifiedTime; 106 | 107 | } 108 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/sysmgr/SysLog.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.sysmgr; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableField; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import com.baomidou.mybatisplus.annotation.TableName; 7 | import lombok.Data; 8 | import lombok.experimental.Accessors; 9 | 10 | import java.util.Date; 11 | 12 | @Data 13 | //@AllArgsConstructor 14 | //@Document(collection="syslog") 15 | //@EqualsAndHashCode(callSuper = true) 16 | @Accessors(chain = true) 17 | @TableName("st_sys_log") 18 | public class SysLog { 19 | @TableId(type=IdType.INPUT) 20 | private String id; 21 | private String account; 22 | private String ip; 23 | // @Field("requestmethod") 24 | private String method; //请求方式 25 | private String url; 26 | private String uri; 27 | private String clazz; 28 | @TableField("method_name") 29 | private String methodName; 30 | @TableField("visit_time") 31 | private Date visitTime; 32 | @TableField("spend_time") 33 | private Long spendTime; 34 | private String params; 35 | 36 | public SysLog() { 37 | } 38 | 39 | public SysLog(String id, String account, String ip, String method, String url, String uri 40 | , String clazz, String methodName, Date visitTime, Long spendTime, String params) { 41 | this.id = id; 42 | this.account = account; 43 | this.ip = ip; 44 | this.method = method; 45 | this.url = url; 46 | this.uri = uri; 47 | this.clazz = clazz; 48 | this.methodName = methodName; 49 | this.visitTime = visitTime; 50 | this.spendTime = spendTime; 51 | this.params = params; 52 | } 53 | 54 | // @DateTimeFormat(pattern = "yyyy-MM-ddHH:mm:ss") 55 | // private Date startDate; 56 | // @DateTimeFormat(pattern = "yyyy-MM-ddHH:mm:ss") 57 | // private Date endDate; 58 | 59 | } -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/sysmgr/User.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.sysmgr; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableField; 4 | import com.baomidou.mybatisplus.annotation.TableName; 5 | import com.question.admin.domain.entity.BaseEntity; 6 | import lombok.Data; 7 | import lombok.EqualsAndHashCode; 8 | import lombok.experimental.Accessors; 9 | 10 | import java.io.Serializable; 11 | import java.util.Date; 12 | 13 | /** 14 | *

15 | * 用户表 16 | *

17 | * 18 | * @author zvc 19 | * @since 2018-12-28 20 | */ 21 | @Data 22 | @EqualsAndHashCode(callSuper = true) 23 | @Accessors(chain = true) 24 | @TableName("st_user") 25 | public class User extends BaseEntity { 26 | 27 | private static final long serialVersionUID = 1L; 28 | 29 | private String account; 30 | 31 | private String name; 32 | 33 | private String password; 34 | @TableField("session_key") 35 | private String sessionKey; 36 | @TableField("wx_open_id") 37 | private String wxOpenId; 38 | private String email; 39 | 40 | @TableField("last_pwd_modified_time") 41 | private Date lastPwdModifiedTime; 42 | 43 | private String status; 44 | private String phone; 45 | 46 | @TableField("erp_flag") 47 | private String erpFlag; 48 | 49 | /** 50 | * 有效标志 51 | */ 52 | @TableField("yn_flag") 53 | private String ynFlag; 54 | 55 | /** 56 | * 创建人 57 | */ 58 | private String creator; 59 | 60 | /** 61 | * 修改人 62 | */ 63 | private String editor; 64 | 65 | /** 66 | * 创建时间 67 | */ 68 | @TableField("created_time") 69 | private Date createdTime; 70 | 71 | /** 72 | * 修改时间 73 | */ 74 | @TableField("modified_time") 75 | private Date modifiedTime; 76 | 77 | 78 | @Override 79 | protected Serializable pkVal() { 80 | return this.id; 81 | } 82 | 83 | } 84 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/sysmgr/UserRole.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.sysmgr; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableField; 4 | import com.baomidou.mybatisplus.annotation.TableName; 5 | import com.question.admin.domain.entity.BaseEntity; 6 | import lombok.Data; 7 | import lombok.EqualsAndHashCode; 8 | import lombok.experimental.Accessors; 9 | 10 | import java.io.Serializable; 11 | import java.util.Date; 12 | 13 | /** 14 | *

15 | * 用户角色关系表 16 | *

17 | * 18 | * @author zvc 19 | * @since 2018-12-28 20 | */ 21 | @Data 22 | @EqualsAndHashCode(callSuper = true) 23 | @Accessors(chain = true) 24 | @TableName("st_user_role") 25 | public class UserRole extends BaseEntity { 26 | 27 | @TableField("user_id") 28 | private Long userId; 29 | 30 | @TableField("role_id") 31 | private Long roleId; 32 | 33 | /** 34 | * 有效标志 35 | */ 36 | @TableField("yn_flag") 37 | private String ynFlag; 38 | 39 | /** 40 | * 创建人 41 | */ 42 | private String creator; 43 | 44 | /** 45 | * 修改人 46 | */ 47 | private String editor; 48 | 49 | /** 50 | * 创建时间 51 | */ 52 | @TableField("created_time") 53 | private Date createdTime; 54 | 55 | /** 56 | * 修改时间 57 | */ 58 | @TableField("modified_time") 59 | private Date modifiedTime; 60 | 61 | @Override 62 | protected Serializable pkVal() { 63 | return this.id; 64 | } 65 | 66 | public UserRole() { 67 | } 68 | 69 | public UserRole(Long userId, Long roleId) { 70 | this.userId = userId; 71 | this.roleId = roleId; 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/tool/Todo.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.tool; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableName; 4 | import com.fasterxml.jackson.annotation.JsonFormat; 5 | import com.question.admin.domain.entity.BaseEntity; 6 | import lombok.Data; 7 | import lombok.EqualsAndHashCode; 8 | import lombok.experimental.Accessors; 9 | import org.springframework.format.annotation.DateTimeFormat; 10 | 11 | import java.util.Date; 12 | 13 | /** 14 | *

15 | * 待办事项 16 | *

17 | * 18 | * @author zvc 19 | * @since 2019-08-14 20 | */ 21 | @Data 22 | @EqualsAndHashCode(callSuper = true) 23 | @Accessors(chain = true) 24 | @TableName("st_todo") 25 | public class Todo extends BaseEntity { 26 | 27 | private static final long serialVersionUID = 1L; 28 | 29 | /** 30 | * 编码 31 | */ 32 | private String title; 33 | 34 | /** 35 | * 开始时间 36 | */ 37 | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 38 | @JsonFormat(pattern="yyyy-MM-dd HH:mm") 39 | private Date start; 40 | 41 | /** 42 | * 结束时间 43 | */ 44 | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 45 | @JsonFormat(pattern="yyyy-MM-dd HH:mm") 46 | private Date end; 47 | 48 | /** 49 | * 天数 50 | */ 51 | private Integer daysCount; 52 | 53 | /** 54 | * 链接 55 | */ 56 | private String url; 57 | 58 | /** 59 | * 内容 60 | */ 61 | private String taskContent; 62 | 63 | /** 64 | * 优先级 65 | */ 66 | private Integer level; 67 | 68 | /** 69 | * 执行人 70 | */ 71 | private String executor; 72 | 73 | /** 74 | * 有效标志 75 | */ 76 | private String ynFlag; 77 | 78 | /** 79 | * 创建人 80 | */ 81 | private String creator; 82 | 83 | /** 84 | * 修改人 85 | */ 86 | private String editor; 87 | 88 | /** 89 | * 创建时间 90 | */ 91 | private Date createdTime; 92 | 93 | /** 94 | * 修改时间 95 | */ 96 | private Date modifiedTime; 97 | 98 | 99 | } 100 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/wx/ExamPaperAnswerUpdate.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.wx; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class ExamPaperAnswerUpdate { 7 | private Integer id; 8 | private Integer customerScore; 9 | private Boolean doRight; 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/entity/wx/WxAccount.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.entity.wx; 2 | 3 | import lombok.Data; 4 | import org.springframework.data.annotation.Id; 5 | import org.springframework.data.annotation.LastModifiedDate; 6 | import org.springframework.format.annotation.DateTimeFormat; 7 | 8 | import java.util.Date; 9 | 10 | /** 11 | * Created by EalenXie on 2018/11/26 10:26. 12 | * 实体 属性描述 这里只是简单示例,你可以自定义相关用户信息 13 | */ 14 | 15 | @Data 16 | public class WxAccount { 17 | 18 | private Integer id; 19 | private String wxOpenid; 20 | private String sessionKey; 21 | private Date lastTime; 22 | 23 | } -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/Result.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 7 | **/ 8 | @Data 9 | public class Result implements java.io.Serializable { 10 | 11 | private static final long serialVersionUID = 752386055477259305L; 12 | 13 | public static final String SUCCESS = "SUCCESS"; 14 | public static final Integer SUCCESS_CODE = 20000; 15 | 16 | private boolean result = true; 17 | private Integer code = SUCCESS_CODE; 18 | private String message; 19 | private T data; 20 | 21 | public Result() { 22 | } 23 | 24 | public Result(boolean result, T data) { 25 | this.result = result; 26 | this.data = data; 27 | } 28 | 29 | public Result(boolean result, String message, T data) { 30 | this.result = result; 31 | this.message = message; 32 | this.data = data; 33 | } 34 | 35 | public Result(boolean result, String message, T data, Integer code) { 36 | this.result = result; 37 | this.message = message; 38 | this.data = data; 39 | this.code = code; 40 | } 41 | 42 | public static Result getSuccess(String message, T data, Integer code) { 43 | return new Result(true, message, data, code); 44 | } 45 | 46 | public static Result getSuccess(String message, T data) { 47 | return getSuccess(message, data, SUCCESS_CODE); 48 | } 49 | 50 | public static Result getSuccess(T data) { 51 | return getSuccess(SUCCESS, data); 52 | } 53 | 54 | public boolean isResult() { 55 | return result; 56 | } 57 | 58 | public void setResult(boolean result) { 59 | this.result = result; 60 | } 61 | 62 | public Integer getCode() { 63 | return code; 64 | } 65 | 66 | public void setCode(Integer code) { 67 | this.code = code; 68 | } 69 | 70 | public String getMessage() { 71 | return message; 72 | } 73 | 74 | public void setMessage(String message) { 75 | this.message = message; 76 | } 77 | 78 | public T getData() { 79 | return data; 80 | } 81 | 82 | public void setData(T data) { 83 | this.data = data; 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/manager/exam/BaseVM.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.manager.exam; 2 | 3 | import com.question.admin.utils.ModelMapperSingle; 4 | import lombok.Data; 5 | import org.modelmapper.ModelMapper; 6 | 7 | 8 | @Data 9 | public class BaseVM { 10 | protected static ModelMapper modelMapper = ModelMapperSingle.Instance(); 11 | 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/manager/exam/ExamPaperAnswer.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.manager.exam; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableField; 4 | import com.baomidou.mybatisplus.annotation.TableName; 5 | import lombok.Data; 6 | 7 | import java.io.Serializable; 8 | import java.util.Date; 9 | 10 | @Data 11 | @TableName("bt_exam_paper_answer") 12 | public class ExamPaperAnswer implements Serializable { 13 | 14 | private static final long serialVersionUID = -2143539181805283910L; 15 | 16 | private Long id; 17 | @TableField("paper_id") 18 | private Long paperId; 19 | @TableField("paper_name") 20 | private String paperName; 21 | @TableField("paper_type") 22 | private Integer paperType; 23 | @TableField("subject_id") 24 | private Long subjectId; 25 | @TableField("system_score") 26 | private Integer systemScore; 27 | @TableField("user_score") 28 | private Integer userScore; 29 | @TableField("paper_score") 30 | private Integer paperScore; 31 | @TableField("question_correct") 32 | private Integer questionCorrect; 33 | @TableField("question_count") 34 | private Integer questionCount; 35 | @TableField("do_time") 36 | private Integer doTime; 37 | 38 | private Integer status; 39 | @TableField("creator_id") 40 | private Long creatorId; 41 | @TableField("created_time") 42 | private Date createdTime; 43 | @TableField("task_exam_id") 44 | private Long taskExamId; 45 | 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/manager/exam/pape/ExamPaperEditRequestVM.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.manager.exam.pape; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.Valid; 6 | import javax.validation.constraints.NotBlank; 7 | import javax.validation.constraints.NotNull; 8 | import javax.validation.constraints.Size; 9 | import java.util.List; 10 | 11 | @Data 12 | public class ExamPaperEditRequestVM { 13 | private Long id; 14 | 15 | @NotNull 16 | private Long subjectId; 17 | @NotNull 18 | private Integer paperType; 19 | @NotBlank 20 | private String name; 21 | @NotNull 22 | private Integer suggestTime; 23 | 24 | private List limitDateTime; 25 | 26 | @Size(min = 1,message = "请添加试卷标题") 27 | @Valid 28 | private List titleItems; 29 | 30 | private String score; 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/manager/exam/pape/ExamPaperPageRequestVM.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.manager.exam.pape; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | 7 | @Data 8 | public class ExamPaperPageRequestVM implements Serializable{ 9 | 10 | private Integer id; 11 | private Integer subjectId; 12 | private Integer level; 13 | private Integer paperType; 14 | private Integer taskExamId; 15 | private Long createUser; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/manager/exam/pape/ExamPaperTitleItemVM.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.manager.exam.pape; 2 | 3 | import com.question.admin.domain.vo.manager.exam.question.QuestionEditRequestVM; 4 | import lombok.Data; 5 | 6 | import javax.validation.Valid; 7 | import javax.validation.constraints.NotBlank; 8 | import javax.validation.constraints.Size; 9 | import java.util.List; 10 | 11 | @Data 12 | public class ExamPaperTitleItemVM { 13 | 14 | @NotBlank(message = "标题内容不能为空") 15 | private String name; 16 | 17 | @Size(min = 1,message = "请添加题目") 18 | @Valid 19 | private List questionItems; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/manager/exam/pape/ExamResponseVM.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.manager.exam.pape; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class ExamResponseVM { 7 | private Integer id; 8 | 9 | private String name; 10 | 11 | private Integer questionCount; 12 | 13 | private Integer score; 14 | 15 | private String createdTime; 16 | 17 | private String modifiedTime; 18 | 19 | private Integer createUser; 20 | 21 | private Integer subjectId; 22 | 23 | private Integer paperType; 24 | 25 | private Integer frameTextContentId; 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/manager/exam/question/QuestionEditItemVM.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.manager.exam.question; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotBlank; 6 | 7 | @Data 8 | public class QuestionEditItemVM { 9 | @NotBlank 10 | private String prefix; 11 | @NotBlank 12 | private String content; 13 | 14 | private String score; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/manager/exam/question/QuestionEditRequestVM.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.manager.exam.question; 2 | 3 | import lombok.Data; 4 | import org.hibernate.validator.constraints.Range; 5 | 6 | import javax.validation.Valid; 7 | import javax.validation.constraints.NotBlank; 8 | import javax.validation.constraints.NotNull; 9 | import java.util.List; 10 | 11 | @Data 12 | public class QuestionEditRequestVM { 13 | 14 | private Integer id; 15 | @NotNull 16 | private Integer questionType; 17 | @NotNull 18 | private Long subjectId; 19 | @NotBlank 20 | private String title; 21 | 22 | private Integer categoryId; 23 | 24 | @Valid 25 | private List items; 26 | @NotBlank 27 | private String analyze; 28 | 29 | private List correctArray; 30 | 31 | private String correct; 32 | @NotBlank 33 | private String score; 34 | 35 | @Range(min = 1, max = 5, message = "请选择题目难度") 36 | private Integer difficult; 37 | 38 | private Integer itemOrder; 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/manager/exam/question/QuestionResponseVM.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.manager.exam.question; 2 | 3 | import com.question.admin.domain.vo.manager.exam.BaseVM; 4 | import lombok.Data; 5 | 6 | import java.util.Date; 7 | 8 | @Data 9 | public class QuestionResponseVM extends BaseVM { 10 | 11 | private Integer id; 12 | 13 | private Integer questionType; 14 | 15 | private Integer textContentId; 16 | 17 | private Date createdTime; 18 | 19 | private Date modifiedTime; 20 | 21 | private Integer subjectId; 22 | 23 | private Long createUserId; 24 | private String createUser; 25 | 26 | private String score; 27 | 28 | private Integer status; 29 | 30 | private String correct; 31 | 32 | private Integer analyzeTextContentId; 33 | 34 | private Integer difficult; 35 | 36 | private String shortTitle; 37 | 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/manager/exam/question/QuestionStatusEnum.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.manager.exam.question; 2 | 3 | public enum QuestionStatusEnum { 4 | 5 | OK(1, "正常"), 6 | Publish(2, "发布"); 7 | 8 | int code; 9 | String name; 10 | 11 | QuestionStatusEnum(int code, String name) { 12 | this.code = code; 13 | this.name = name; 14 | } 15 | 16 | 17 | public int getCode() { 18 | return code; 19 | } 20 | 21 | public void setCode(int code) { 22 | this.code = code; 23 | } 24 | 25 | public String getName() { 26 | return name; 27 | } 28 | 29 | public void setName(String name) { 30 | this.name = name; 31 | } 32 | 33 | 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/manager/exam/question/QuestionTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.manager.exam.question; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | public enum QuestionTypeEnum { 7 | 8 | SingleChoice(1, "单选题"), 9 | MultipleChoice(2, "多选题"), 10 | TrueFalse(3, "判断题"), 11 | GapFilling(4, "填空题"), 12 | ShortAnswer(5, "简答题"); 13 | 14 | int code; 15 | String name; 16 | 17 | QuestionTypeEnum(int code, String name) { 18 | this.code = code; 19 | this.name = name; 20 | } 21 | 22 | 23 | private static final Map keyMap = new HashMap<>(); 24 | 25 | static { 26 | for (QuestionTypeEnum item : QuestionTypeEnum.values()) { 27 | keyMap.put(item.getCode(), item); 28 | } 29 | } 30 | 31 | public static QuestionTypeEnum fromCode(Integer code) { 32 | return keyMap.get(code); 33 | } 34 | 35 | public static boolean needSaveTextContent(Integer code) { 36 | QuestionTypeEnum questionTypeEnum = QuestionTypeEnum.fromCode(code); 37 | switch (questionTypeEnum) { 38 | case GapFilling: 39 | case ShortAnswer: 40 | return true; 41 | default: 42 | return false; 43 | } 44 | } 45 | 46 | public int getCode() { 47 | return code; 48 | } 49 | 50 | public void setCode(int code) { 51 | this.code = code; 52 | } 53 | 54 | public String getName() { 55 | return name; 56 | } 57 | 58 | public void setName(String name) { 59 | this.name = name; 60 | } 61 | 62 | 63 | } 64 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/manager/pub/WeatherDetailVo.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.manager.pub; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | import java.util.Date; 7 | 8 | /** 9 | * 天气明细VO 10 | */ 11 | @Data 12 | public class WeatherDetailVo implements Serializable { 13 | 14 | private static final long serialVersionUID = 1L; 15 | 16 | private Date date; 17 | private String week; 18 | private String wea; 19 | private String weaImg; 20 | private String tem1; 21 | private String tem2; 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/manager/pub/WeatherVo.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.manager.pub; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | import java.util.List; 7 | 8 | /** 9 | * 天气VO 10 | */ 11 | @Data 12 | public class WeatherVo implements Serializable { 13 | 14 | private static final long serialVersionUID = 1L; 15 | 16 | private Long cityId; 17 | private String province; 18 | private String city; 19 | 20 | //天气明细 21 | List dateList; 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/manager/sysmgr/AttVo.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.manager.sysmgr; 2 | 3 | import com.question.admin.config.upload.entity.FileSlot; 4 | import com.question.admin.domain.entity.sysmgr.Att; 5 | import lombok.Data; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | *

11 | * 附件表 12 | *

13 | * 14 | * @author zvc 15 | * @since 2019-07-12 16 | */ 17 | @Data 18 | public class AttVo implements FileSlot { 19 | 20 | private static final long serialVersionUID = 1L; 21 | 22 | private Long id; 23 | private String name; 24 | private String slotId; 25 | private String fileCate; 26 | private String type; 27 | private Long fileSize; 28 | private String originName; 29 | private String path; 30 | private String description; 31 | 32 | @Override 33 | public List getSlotFiles() { 34 | return null; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/manager/sysmgr/AuthorityNode.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.manager.sysmgr; 2 | 3 | import com.google.common.collect.Lists; 4 | import lombok.Data; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | *

10 | *

11 | * 12 | * @author zvc 13 | * @since 2018-12-28 14 | */ 15 | @Data 16 | public class AuthorityNode { 17 | private Long id; 18 | private Long parentId; 19 | private String fullId; 20 | private String label; 21 | private String code; 22 | private Integer showOrder; 23 | private List children; 24 | 25 | public AuthorityNode(){} 26 | 27 | public AuthorityNode(Long id, Long parentId, String label) { 28 | this.id = id; 29 | this.parentId = parentId; 30 | this.label = label; 31 | } 32 | 33 | public List getChildren() { 34 | if (children == null) { 35 | children = Lists.newArrayList(); 36 | } 37 | return children; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/manager/sysmgr/MailVO.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.manager.sysmgr; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class MailVO { 7 | private static final long serialVersionUID = 5613231124043303948L; 8 | private Long id; 9 | 10 | 11 | private Long userId; 12 | private String toUsers; 13 | private String subject; 14 | private String content; 15 | 16 | 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/manager/sysmgr/NoticeReadVO.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.manager.sysmgr; 2 | 3 | 4 | import com.baomidou.mybatisplus.annotation.TableField; 5 | import com.question.admin.domain.entity.sysmgr.Notice; 6 | import lombok.Data; 7 | import org.springframework.format.annotation.DateTimeFormat; 8 | 9 | import java.util.Date; 10 | 11 | @Data 12 | public class NoticeReadVO extends Notice { 13 | 14 | private static final long serialVersionUID = -3842182350180882396L; 15 | 16 | @TableField("user_id") 17 | private Long userId; 18 | @TableField("read_time") 19 | private Date readTime; 20 | private Boolean isRead; 21 | 22 | @DateTimeFormat(pattern = "yyyy-MM-ddHH:mm:ss") 23 | private Date beginTime; 24 | @DateTimeFormat(pattern = "yyyy-MM-ddHH:mm:ss") 25 | private Date endTime; 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/manager/sysmgr/NoticeVO.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.manager.sysmgr; 2 | 3 | import com.question.admin.domain.entity.sysmgr.User; 4 | import com.question.admin.domain.entity.sysmgr.Notice; 5 | import lombok.Data; 6 | 7 | import java.io.Serializable; 8 | import java.util.List; 9 | 10 | @Data 11 | public class NoticeVO implements Serializable { 12 | 13 | private static final long serialVersionUID = 7363353918096951799L; 14 | 15 | private Notice notice; 16 | 17 | private List users; 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/manager/sysmgr/ResourceNode.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.manager.sysmgr; 2 | 3 | import com.google.common.collect.Lists; 4 | import lombok.Data; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | *

10 | *

11 | * 12 | * @author zvc 13 | * @since 2018-12-28 14 | */ 15 | @Data 16 | public class ResourceNode { 17 | private Long id; 18 | private Long parentId; 19 | private String fullId; 20 | private String label; 21 | private String iconClass; 22 | private String url; 23 | private String component; 24 | private Long authorityId; 25 | private Integer showOrder; 26 | private boolean hiddenFlag; 27 | private List children; 28 | 29 | public ResourceNode(){} 30 | 31 | public ResourceNode(Long id, Long parentId, String label) { 32 | this.id = id; 33 | this.parentId = parentId; 34 | this.label = label; 35 | } 36 | 37 | public List getChildren() { 38 | if (children == null) { 39 | children = Lists.newArrayList(); 40 | } 41 | return children; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/manager/sysmgr/RoleAuth.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.manager.sysmgr; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.Set; 6 | 7 | /** 8 | *

9 | *

10 | * 11 | * @author zvc 12 | * @since 2018-12-28 13 | */ 14 | @Data 15 | public class RoleAuth { 16 | private Long roleId; 17 | private Set authorityIds; 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/manager/sysmgr/UserPassword.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.manager.sysmgr; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | 7 | @Data 8 | public class UserPassword implements Serializable { 9 | 10 | private static final long serialVersionUID = 1L; 11 | 12 | private String password; 13 | private String newPassword; 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/manager/sysmgr/UserRoleVo.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.manager.sysmgr; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.Set; 6 | 7 | /** 8 | *

9 | *

10 | * 11 | * @author zvc 12 | * @since 2018-12-28 13 | */ 14 | @Data 15 | public class UserRoleVo { 16 | private Long userId; 17 | private Set roleIds; 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/manager/sysmgr/UserVo.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.manager.sysmgr; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | 7 | @Data 8 | public class UserVo implements Serializable { 9 | 10 | private static final long serialVersionUID = 1L; 11 | 12 | private String username; 13 | private String password; 14 | private String avatar; 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/student/exam/ExamPaperReadVM.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.student.exam; 2 | 3 | import com.question.admin.domain.vo.manager.exam.pape.ExamPaperEditRequestVM; 4 | import lombok.Data; 5 | 6 | @Data 7 | public class ExamPaperReadVM { 8 | private ExamPaperEditRequestVM paper; 9 | private ExamPaperSubmitVM answer; 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/student/exam/ExamPaperSubmitItemVM.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.student.exam; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotNull; 6 | import java.util.List; 7 | 8 | @Data 9 | public class ExamPaperSubmitItemVM { 10 | private Long id; 11 | @NotNull 12 | private Long questionId; 13 | 14 | private Boolean doRight; 15 | 16 | private String content; 17 | 18 | private Integer itemOrder; 19 | 20 | private List contentArray; 21 | 22 | private String score; 23 | 24 | private String questionScore; 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/student/exam/ExamPaperSubmitVM.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.student.exam; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.Valid; 6 | import javax.validation.constraints.NotNull; 7 | import java.util.List; 8 | 9 | 10 | @Data 11 | public class ExamPaperSubmitVM { 12 | 13 | @NotNull 14 | private Long id; 15 | 16 | @NotNull 17 | private Integer doTime; 18 | 19 | private String score; 20 | 21 | @NotNull 22 | @Valid 23 | private List answerItems; 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/student/paper/ExamPaperAnswerInfo.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.student.paper; 2 | 3 | import com.question.admin.domain.entity.exam.Paper; 4 | import com.question.admin.domain.vo.manager.exam.ExamPaperAnswer; 5 | import lombok.Data; 6 | 7 | import java.util.List; 8 | 9 | @Data 10 | public class ExamPaperAnswerInfo { 11 | public Paper paper; 12 | public ExamPaperAnswer examPaperAnswer; 13 | public List examPaperQuestionCustomerAnswers; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/student/paper/ExamPaperAnswerPageResponseVM.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.student.paper; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | 7 | @Data 8 | public class ExamPaperAnswerPageResponseVM implements Serializable{ 9 | private Integer id; 10 | 11 | private String createdTime; 12 | 13 | private String userScore; 14 | 15 | private String subjectName; 16 | 17 | private Integer subjectId; 18 | 19 | private Integer questionCount; 20 | 21 | private Integer questionCorrect; 22 | 23 | private String paperScore; 24 | 25 | private String doTime; 26 | 27 | private Integer paperType; 28 | 29 | private String systemScore; 30 | 31 | private Integer status; 32 | 33 | private String paperName; 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/student/paper/ExamPaperAnswerPageVM.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.student.paper; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class ExamPaperAnswerPageVM { 7 | 8 | private Long subjectId; 9 | 10 | private Long creatorId; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/student/paper/ExamPaperQuestionCustomerAnswer.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.student.paper; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableField; 4 | import com.baomidou.mybatisplus.annotation.TableName; 5 | import com.question.admin.domain.entity.BaseEntity; 6 | import lombok.Data; 7 | import lombok.EqualsAndHashCode; 8 | import lombok.experimental.Accessors; 9 | 10 | import java.io.Serializable; 11 | import java.util.Date; 12 | @Data 13 | @EqualsAndHashCode(callSuper = true) 14 | @Accessors(chain = true) 15 | @TableName("bt_exam_paper_question_customer_answer") 16 | public class ExamPaperQuestionCustomerAnswer extends BaseEntity implements Serializable { 17 | 18 | private static final long serialVersionUID = 3389482731220342366L; 19 | 20 | @TableField("question_id") 21 | private Long questionId; 22 | @TableField("exam_paper_id") 23 | private Long examPaperId; 24 | @TableField("exam_paper_answer_id") 25 | private Long examPaperAnswerId; 26 | @TableField("question_type") 27 | private Integer questionType; 28 | @TableField("subject_id") 29 | private Long subjectId; 30 | @TableField("customer_score") 31 | private Integer customerScore; 32 | @TableField("question_score") 33 | private Integer questionScore; 34 | @TableField("question_text_content_id") 35 | private Long questionTextContentId; 36 | @TableField("answer") 37 | private String answer; 38 | @TableField("text_content_id") 39 | private Long textContentId; 40 | @TableField("do_right") 41 | private Boolean doRight; 42 | @TableField("creator_id") 43 | private Long creatorId; 44 | @TableField("created_time") 45 | private Date createTime; 46 | @TableField("item_order") 47 | private Integer itemOrder; 48 | 49 | @Override 50 | protected Serializable pkVal() { 51 | return this.id; 52 | } 53 | 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/student/paper/TaskExamCustomerAnswer.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.student.paper; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableField; 4 | import com.baomidou.mybatisplus.annotation.TableName; 5 | import com.question.admin.domain.entity.BaseEntity; 6 | import lombok.Data; 7 | 8 | import java.io.Serializable; 9 | import java.util.Date; 10 | 11 | @Data 12 | @TableName("bt_task_exam_customer_answer") 13 | public class TaskExamCustomerAnswer extends BaseEntity implements Serializable { 14 | 15 | private static final long serialVersionUID = -556842372977600137L; 16 | 17 | private Long id; 18 | 19 | @TableField("task_exam_id") 20 | private Long taskExamId; 21 | @TableField("creator_id") 22 | private Long creatorId; 23 | @TableField("created_time") 24 | private Date createdTime; 25 | @TableField("text_content_id") 26 | private Integer textContentId; 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/student/paper/UserEventLog.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.student.paper; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import java.io.Serializable; 8 | import java.util.Date; 9 | 10 | @Data 11 | @NoArgsConstructor 12 | public class UserEventLog implements Serializable { 13 | 14 | private static final long serialVersionUID = -3951198127159024633L; 15 | 16 | public UserEventLog(Long userId, String account, String name, Date createdTime) { 17 | this.userId = userId; 18 | this.account = account; 19 | this.name = name; 20 | this.createdTime = createdTime; 21 | } 22 | 23 | private Integer id; 24 | 25 | private Long userId; 26 | 27 | private String account; 28 | 29 | private String name; 30 | 31 | private String content; 32 | 33 | private Date createdTime; 34 | 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/student/question/answer/QuestionPageStudentRequestVM.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.student.question.answer; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class QuestionPageStudentRequestVM { 7 | private Integer createUser; 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/student/user/UserResponseVM.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.student.user; 2 | 3 | import com.question.admin.domain.entity.sysmgr.User; 4 | import com.question.admin.utils.ModelMapperSingle; 5 | import com.question.admin.utils.DateTimeUtil; 6 | import lombok.Data; 7 | import org.modelmapper.ModelMapper; 8 | 9 | import java.io.Serializable; 10 | 11 | @Data 12 | public class UserResponseVM implements Serializable { 13 | private static ModelMapper modelMapper = ModelMapperSingle.Instance(); 14 | private Integer id; 15 | 16 | private String account; 17 | 18 | private String name; 19 | 20 | 21 | private String email; 22 | 23 | 24 | private String phone; 25 | 26 | 27 | private String createdTime; 28 | 29 | private String modifiedTime; 30 | private String lastPwdModifiedTime; 31 | private Integer status; 32 | 33 | public static UserResponseVM from(User user) { 34 | UserResponseVM vm = modelMapper.map(user, UserResponseVM.class); 35 | vm.setCreatedTime(DateTimeUtil.dateFormat(user.getCreatedTime())); 36 | vm.setModifiedTime(DateTimeUtil.dateFormat(user.getModifiedTime())); 37 | return vm; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/student/user/UserUpdateVM.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.student.user; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.Email; 6 | import javax.validation.constraints.NotBlank; 7 | import javax.validation.constraints.NotNull; 8 | 9 | @Data 10 | public class UserUpdateVM { 11 | 12 | @NotBlank 13 | private String name; 14 | 15 | private String phone; 16 | @Email 17 | private String email; 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/wx/Code2SessionResponse.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.wx; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 微信小程序 Code2Session 接口返回值 对象 7 | * 具体可以参考小程序官方API说明 : https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html 8 | */ 9 | @Data 10 | public class Code2SessionResponse { 11 | private String openid; 12 | private String session_key; 13 | private String unionid; 14 | private String errcode = "0"; 15 | private String errmsg; 16 | private int expires_in; 17 | } -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/wx/CodeDTO.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.wx; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotEmpty; 6 | 7 | /** 8 | * Created by EalenXie on 2019/4/25 15:29. 9 | */ 10 | @Data 11 | public class CodeDTO { 12 | @NotEmpty(message = "缺少参数code或code不合法") 13 | private String code; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/domain/vo/wx/TokenDTO.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.domain.vo.wx; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | 6 | @Data 7 | @AllArgsConstructor 8 | public class TokenDTO { 9 | private String token; 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/mapper/baseinfo/DictMapper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.mapper.baseinfo; 2 | 3 | import com.question.admin.domain.entity.baseinfo.Dict; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | *

8 | * 字典表 Mapper 接口 9 | *

10 | * 11 | * @author zvc 12 | * @since 2019-07-12 13 | */ 14 | public interface DictMapper extends BaseMapper { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/mapper/exam/CategoryMapper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.mapper.exam; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.question.admin.domain.entity.exam.Category; 5 | 6 | 7 | public interface CategoryMapper extends BaseMapper { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/mapper/exam/ExamPaperAnswerMapper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.mapper.exam; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.question.admin.domain.vo.manager.exam.ExamPaperAnswer; 5 | 6 | public interface ExamPaperAnswerMapper extends BaseMapper { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/mapper/exam/ExamPaperQuestionCustomerAnswerMapper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.mapper.exam; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.question.admin.domain.vo.student.paper.ExamPaperQuestionCustomerAnswer; 5 | 6 | public interface ExamPaperQuestionCustomerAnswerMapper extends BaseMapper { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/mapper/exam/FeedBackMapper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.mapper.exam; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.question.admin.domain.entity.exam.FeedBack; 5 | 6 | public interface FeedBackMapper extends BaseMapper { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/mapper/exam/PaperMapper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.mapper.exam; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.question.admin.domain.entity.exam.Paper; 5 | 6 | public interface PaperMapper extends BaseMapper { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/mapper/exam/QuestionMapper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.mapper.exam; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.question.admin.domain.entity.exam.Question; 5 | 6 | public interface QuestionMapper extends BaseMapper { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/mapper/exam/SubjectMapper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.mapper.exam; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.question.admin.domain.entity.exam.Subject; 5 | 6 | 7 | public interface SubjectMapper extends BaseMapper { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/mapper/exam/SwiperConfigMapper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.mapper.exam; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.question.admin.domain.entity.exam.SwiperConfig; 5 | 6 | public interface SwiperConfigMapper extends BaseMapper { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/mapper/exam/TaskExamCustomerAnswerMapper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.mapper.exam; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.question.admin.domain.vo.student.paper.TaskExamCustomerAnswer; 5 | 6 | public interface TaskExamCustomerAnswerMapper extends BaseMapper { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/mapper/exam/TaskExamMapper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.mapper.exam; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.question.admin.domain.entity.exam.TaskExam; 5 | 6 | public interface TaskExamMapper extends BaseMapper { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/mapper/exam/TextContentMapper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.mapper.exam; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.question.admin.domain.entity.exam.question.TextContent; 5 | 6 | public interface TextContentMapper extends BaseMapper { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/mapper/sysmgr/AttMapper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.mapper.sysmgr; 2 | 3 | import com.question.admin.domain.entity.sysmgr.Att; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | *

8 | * 附件表 Mapper 接口 9 | *

10 | * 11 | * @author zvc 12 | * @since 2019-07-12 13 | */ 14 | public interface AttMapper extends BaseMapper { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/mapper/sysmgr/AuthorityMapper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.mapper.sysmgr; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.question.admin.domain.entity.sysmgr.Authority; 5 | 6 | /** 7 | *

8 | * 权限表 Mapper 接口 9 | *

10 | * 11 | * @author zvc 12 | * @since 2018-12-28 13 | */ 14 | public interface AuthorityMapper extends BaseMapper { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/mapper/sysmgr/BackupMapper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.mapper.sysmgr; 2 | 3 | import com.question.admin.domain.entity.sysmgr.Backup; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | *

8 | * DB备份表 Mapper 接口 9 | *

10 | * 11 | * @author zvc 12 | * @since 2019-09-10 13 | */ 14 | public interface BackupMapper extends BaseMapper { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/mapper/sysmgr/LoginLogMapper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.mapper.sysmgr; 2 | 3 | import com.question.admin.domain.entity.sysmgr.LoginLog; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | *

8 | * 登录日志 Mapper 接口 9 | *

10 | * 11 | * @author zvc 12 | * @since 2019-07-26 13 | */ 14 | public interface LoginLogMapper extends BaseMapper { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/mapper/sysmgr/MailMapper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.mapper.sysmgr; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.question.admin.domain.entity.sysmgr.Mail; 5 | 6 | public interface MailMapper extends BaseMapper { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/mapper/sysmgr/NoticeMapper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.mapper.sysmgr; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.baomidou.mybatisplus.core.metadata.IPage; 5 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 6 | import com.question.admin.domain.entity.sysmgr.User; 7 | import com.question.admin.domain.vo.manager.sysmgr.NoticeReadVO; 8 | import com.question.admin.domain.entity.sysmgr.Notice; 9 | import org.apache.ibatis.annotations.Param; 10 | 11 | import java.util.List; 12 | 13 | public interface NoticeMapper extends BaseMapper { 14 | int saveReadRecord(@Param("noticeId") Long noticeId, @Param("userId") Long userId); 15 | 16 | List listReadUsers(Long noticeId); 17 | 18 | int countUnread(Long userId); 19 | IPage selectPage1(Page page, @Param("notice") NoticeReadVO notice); 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/mapper/sysmgr/ResourceMapper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.mapper.sysmgr; 2 | 3 | 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import com.question.admin.domain.entity.sysmgr.Resource; 6 | 7 | /** 8 | *

9 | * 菜单表 Mapper 接口 10 | *

11 | * 12 | * @author zvc 13 | * @since 2018-12-28 14 | */ 15 | public interface ResourceMapper extends BaseMapper { 16 | 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/mapper/sysmgr/RoleAuthorityMapper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.mapper.sysmgr; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.question.admin.domain.entity.sysmgr.RoleAuthority; 5 | import org.apache.ibatis.annotations.Param; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | *

11 | * 权限表 Mapper 接口 12 | *

13 | * 14 | * @author 15 | * @since 2018-12-28 16 | */ 17 | public interface RoleAuthorityMapper extends BaseMapper { 18 | 19 | /** 20 | * 根据角色Id删除 21 | * @param role 22 | * @return 23 | */ 24 | int deleteAuthByRoleId(RoleAuthority role); 25 | 26 | /** 27 | * 批量插入 28 | * @param roleAuthList 29 | */ 30 | void batchInsert(List roleAuthList); 31 | 32 | /** 33 | * 根据角色Id获取权限 34 | * @param roleId 35 | * @return 36 | */ 37 | List selectAuthByRoleId(@Param(value = "roleId") Long roleId); 38 | 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/mapper/sysmgr/RoleMapper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.mapper.sysmgr; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.question.admin.domain.entity.sysmgr.Role; 5 | 6 | /** 7 | *

8 | * 角色表 Mapper 接口 9 | *

10 | * 11 | * @author zvc 12 | * @since 2018-12-28 13 | */ 14 | public interface RoleMapper extends BaseMapper { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/mapper/sysmgr/ScheduleJobMapper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.mapper.sysmgr; 2 | 3 | import com.question.admin.domain.entity.sysmgr.ScheduleJob; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | *

8 | * 定时任务 Mapper 接口 9 | *

10 | * 11 | * @author zvc 12 | * @since 2019-08-18 13 | */ 14 | public interface ScheduleJobMapper extends BaseMapper { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/mapper/sysmgr/SysLogMapper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.mapper.sysmgr; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.question.admin.domain.entity.sysmgr.SysLog; 5 | 6 | public interface SysLogMapper extends BaseMapper { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/mapper/sysmgr/UserMapper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.mapper.sysmgr; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.question.admin.domain.entity.sysmgr.User; 5 | import com.question.admin.domain.entity.sysmgr.UserRole; 6 | import org.apache.ibatis.annotations.Param; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | *

12 | * 用户表 Mapper 接口 13 | *

14 | * 15 | * @author zvc 16 | * @since 2018-12-28 17 | */ 18 | public interface UserMapper extends BaseMapper { 19 | 20 | /** 21 | * 保存用户 22 | * @param user 23 | * @return 24 | */ 25 | int persist(User user); 26 | 27 | 28 | /** 29 | * 根据用户Id删除角色 30 | * @param user 31 | * @return 32 | */ 33 | int deleteRoleByUserId(UserRole user); 34 | 35 | /** 36 | * 批量插入 37 | * @param userRoleList 38 | */ 39 | void batchInsertUserRole(List userRoleList); 40 | 41 | /** 42 | * 根据用户Id获取角色 43 | * @param userId 44 | * @return 45 | */ 46 | List selectRoleByUserId(@Param(value = "userId") Long userId); 47 | 48 | 49 | User selectByOpenId(@Param("openId") String openId); 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/mapper/sysmgr/UserRoleMapper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.mapper.sysmgr; 2 | 3 | 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import com.question.admin.domain.entity.sysmgr.UserRole; 6 | 7 | /** 8 | *

9 | * 用户表 Mapper 接口 10 | *

11 | * 12 | * @author zvc 13 | * @since 2018-12-28 14 | */ 15 | public interface UserRoleMapper extends BaseMapper { 16 | 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/mapper/tool/TodoMapper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.mapper.tool; 2 | 3 | import com.question.admin.domain.entity.tool.Todo; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | *

8 | * 待办事项 Mapper 接口 9 | *

10 | * 11 | * @author zvc 12 | * @since 2019-08-14 13 | */ 14 | public interface TodoMapper extends BaseMapper { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/scheduler/DbBackupJob.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.scheduler; 2 | 3 | import com.question.admin.scheduler.base.ScheduleAnnotation; 4 | import com.question.admin.service.sysmgr.BackupService; 5 | import com.question.admin.scheduler.base.BaseJob; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.quartz.JobExecutionContext; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | 10 | @Slf4j 11 | @ScheduleAnnotation(jobId = "DbBackupJob", jobName = "数据库备份Job") 12 | public class DbBackupJob extends BaseJob { 13 | 14 | @Autowired 15 | private BackupService backupService; 16 | 17 | /** 18 | * 数据备份任务 19 | */ 20 | @Override 21 | public void execute(JobExecutionContext context) { 22 | log.info("DbBackupJob备份任务执行开始:"); 23 | backupService.backup(); 24 | log.info("DbBackupJob备份任务执行完毕!"); 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/scheduler/QuestionDemoJob.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.scheduler; 2 | 3 | import com.question.admin.scheduler.base.ScheduleAnnotation; 4 | import com.question.admin.scheduler.base.BaseJob; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.quartz.JobExecutionContext; 7 | 8 | @Slf4j 9 | @ScheduleAnnotation(jobId = "QuestionDemoJob", jobName = "框架演示Job") 10 | public class QuestionDemoJob extends BaseJob { 11 | 12 | @Override 13 | public void execute(JobExecutionContext context){ 14 | log.info("QUESTION-ADMIN: 你好!"); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/scheduler/base/BaseJob.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.scheduler.base; 2 | 3 | import org.quartz.Job; 4 | 5 | /** 6 | * 定时任务抽象类 7 | * 8 | */ 9 | public abstract class BaseJob implements Job { 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/scheduler/base/ScheduleAnnotation.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.scheduler.base; 2 | 3 | import java.lang.annotation.*; 4 | 5 | @Retention(RetentionPolicy.RUNTIME) 6 | @Target({ ElementType.TYPE, ElementType.METHOD }) 7 | @Documented 8 | public @interface ScheduleAnnotation { 9 | 10 | /** 11 | * 任务编号,全局必须唯一 12 | * @return 13 | */ 14 | String jobId() default ""; 15 | 16 | /** 17 | * 任务名称 18 | * 19 | * @return 20 | */ 21 | String jobName() default ""; 22 | 23 | /** 24 | * 任务是否废弃 25 | * 26 | * @return 27 | */ 28 | boolean discard() default false; 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/scheduler/factory/QuestionJobFactory.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.scheduler.factory; 2 | 3 | import org.quartz.spi.TriggerFiredBundle; 4 | import org.springframework.beans.BeansException; 5 | import org.springframework.beans.factory.config.AutowireCapableBeanFactory; 6 | import org.springframework.context.ApplicationContext; 7 | import org.springframework.context.ApplicationContextAware; 8 | import org.springframework.scheduling.quartz.SpringBeanJobFactory; 9 | import org.springframework.stereotype.Component; 10 | 11 | @Component("questionJobFactory") 12 | public class QuestionJobFactory extends SpringBeanJobFactory implements ApplicationContextAware { 13 | 14 | private transient AutowireCapableBeanFactory beanFactory; 15 | 16 | @Override 17 | public void setApplicationContext(ApplicationContext context) throws BeansException { 18 | beanFactory = context.getAutowireCapableBeanFactory(); 19 | } 20 | 21 | @Override 22 | protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception { 23 | final Object job = super.createJobInstance(bundle); 24 | beanFactory.autowireBean(job); 25 | return job; 26 | } 27 | 28 | } 29 | 30 | /** 31 | public class JobFactory extends AdaptableJobFactory { 32 | @Autowired 33 | private AutowireCapableBeanFactory capableBeanFactory; 34 | 35 | @Override 36 | protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { 37 | //调用父类的方法 38 | Object jobInstance = super.createJobInstance(bundle); 39 | //进行注入 40 | capableBeanFactory.autowireBean(jobInstance); 41 | return jobInstance; 42 | } 43 | } 44 | **/ 45 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/scheduler/listener/QuestionJobListener.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.scheduler.listener; 2 | 3 | import com.question.admin.domain.QuestionServiceException; 4 | import com.question.admin.service.sysmgr.ScheduleJobService; 5 | import com.question.admin.utils.ExceptionUtils; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.quartz.JobExecutionContext; 8 | import org.quartz.JobExecutionException; 9 | import org.quartz.JobListener; 10 | import org.springframework.beans.factory.annotation.Autowired; 11 | import org.springframework.stereotype.Service; 12 | 13 | @Slf4j 14 | @Service 15 | public class QuestionJobListener implements JobListener { 16 | public static final String LISTENER_NAME = "QuestionJobListener"; 17 | 18 | @Autowired 19 | private ScheduleJobService scheduleJobService; 20 | 21 | public QuestionJobListener(){} 22 | 23 | @Override 24 | public String getName() { 25 | return LISTENER_NAME; 26 | } 27 | 28 | /** 29 | * 任务执行前 30 | * @param context 31 | */ 32 | @Override 33 | public void jobToBeExecuted(JobExecutionContext context) { 34 | String jobName = context.getJobDetail().getKey().toString(); 35 | System.out.println("jobToBeExecuted"); 36 | System.out.println("Job : " + jobName + " is going to start..."); 37 | } 38 | 39 | /** 40 | * 任务被否决 41 | * @param context 42 | */ 43 | @Override 44 | public void jobExecutionVetoed(JobExecutionContext context) { 45 | System.out.println("jobExecutionVetoed"); 46 | } 47 | 48 | /** 49 | * 任务被调度后 50 | * @param context 51 | * @param jobException 52 | */ 53 | @Override 54 | public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) { 55 | String jobId = context.getJobDetail().getKey().getName(); 56 | String failReason = null; 57 | if(jobException != null) { 58 | failReason = ExceptionUtils.getStackMsg(jobException); 59 | } 60 | try { 61 | scheduleJobService.updateRuntimeJob(jobId, context.getFireTime(), context.getPreviousFireTime(), context.getNextFireTime(), failReason); 62 | } catch (QuestionServiceException e) { 63 | log.error("updateRuntimeJob {} error", jobId, e); 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/scheduler/service/ScheduleJobStarter.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.scheduler.service; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.question.admin.constant.enumtype.YNFlagStatusEnum; 5 | import com.question.admin.domain.entity.sysmgr.ScheduleJob; 6 | import com.question.admin.service.sysmgr.ScheduleJobService; 7 | import lombok.extern.slf4j.Slf4j; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.boot.ApplicationArguments; 10 | import org.springframework.boot.ApplicationRunner; 11 | import org.springframework.stereotype.Component; 12 | 13 | import java.util.List; 14 | 15 | @Component 16 | @Slf4j 17 | public class ScheduleJobStarter implements ApplicationRunner { 18 | 19 | @Autowired 20 | private QuestionSchedulerService questionSchedulerService; 21 | 22 | @Autowired 23 | private ScheduleJobService scheduleJobService; 24 | 25 | /** 26 | * 会在服务启动完成后立即执行 27 | */ 28 | @Override 29 | public void run(ApplicationArguments args) { 30 | log.info("================= 启动所有定时任务 ================"); 31 | List startJobs; 32 | QueryWrapper query= new QueryWrapper<>(); 33 | query.eq("yn_flag", YNFlagStatusEnum.VALID.getCode()); 34 | query.eq("start_job",true); 35 | query.orderByAsc("start_time"); 36 | startJobs = scheduleJobService.list(query); 37 | startJobs.stream().forEach(j -> { 38 | questionSchedulerService.addJob(j.getJobId(), j.getJobClass(), j.getCron(), j.getStartTime()); 39 | }); 40 | questionSchedulerService.startJobs(); 41 | } 42 | } -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/baseinfo/DictService.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.baseinfo; 2 | 3 | import com.question.admin.domain.entity.baseinfo.Dict; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | *

10 | * 字典表 服务类 11 | *

12 | * 13 | * @author zvc 14 | * @since 2019-07-12 15 | */ 16 | public interface DictService extends IService { 17 | 18 | /** 19 | * 批量保存 20 | * @param dictList 21 | * @return 22 | */ 23 | Boolean batchSave(List dictList); 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/baseinfo/impl/DictServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.baseinfo.impl; 2 | 3 | import com.question.admin.config.shiro.security.UserContext; 4 | import com.question.admin.domain.entity.baseinfo.Dict; 5 | import com.question.admin.mapper.baseinfo.DictMapper; 6 | import com.question.admin.constant.enumtype.YNFlagStatusEnum; 7 | import com.question.admin.service.baseinfo.DictService; 8 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 9 | import org.springframework.stereotype.Service; 10 | import org.springframework.transaction.annotation.Transactional; 11 | 12 | import java.time.Instant; 13 | import java.util.Date; 14 | import java.util.List; 15 | 16 | /** 17 | *

18 | * 字典表 服务实现类 19 | *

20 | * 21 | * @author zvc 22 | * @since 2019-07-12 23 | */ 24 | @Service 25 | public class DictServiceImpl extends ServiceImpl implements DictService { 26 | 27 | @Override 28 | @Transactional 29 | public Boolean batchSave(List dictList) { 30 | for(Dict dict: dictList){ 31 | if(dict.getId()!=null){ 32 | this.updateById(dict); 33 | }else{ 34 | dict.setYnFlag(YNFlagStatusEnum.VALID.getCode()); 35 | dict.setCreatedTime(Date.from(Instant.now())); 36 | dict.setEditor(UserContext.getCurrentUser().getAccount()); 37 | dict.setCreator(UserContext.getCurrentUser().getAccount()); 38 | this.save(dict); 39 | } 40 | } 41 | return true; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/common/AttendanceSettingService.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.common; 2 | 3 | import java.util.Date; 4 | 5 | public interface AttendanceSettingService { 6 | 7 | /** 8 | * 获取指定日期后的第几个交易日 9 | * @param date 10 | * @param days 11 | * @return 12 | */ 13 | Date getNextNumMarketDay(Date date, Integer days); 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/common/ISyncCacheService.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.common; 2 | 3 | public interface ISyncCacheService { 4 | 5 | Boolean getLock(String lockName, int expireTime); 6 | 7 | Boolean releaseLock(String lockName); 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/common/MailService.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.common; 2 | 3 | import com.question.admin.domain.entity.sysmgr.Mail; 4 | 5 | import java.util.List; 6 | import java.util.Map; 7 | 8 | public interface MailService { 9 | /** 10 | * 发送简单邮件 11 | * @param sendTo 收件人 12 | * @param titel 标题 13 | * @param content 内容 14 | */ 15 | void sendSimpleMail(String sendTo, String titel, String content); 16 | /** 17 | * 发送简单带附件邮件 18 | * @param sendTo 收件人 19 | * @param titel 标题 20 | * @param content 内容 21 | * @param attachments 附件路径 22 | */ 23 | void sendAttachmentsMail(String sendTo, String titel, String content, List attachments); 24 | /** 25 | * 发送内嵌静态资源邮件 26 | * @param sendTo 收件人 27 | * @param titel 标题 28 | * @param content 内容 29 | * @param attachments 资源id及路径 30 | */ 31 | void sendInlineMail(String sendTo, String titel, String content, Map attachments); 32 | /** 33 | * 发送模板邮件 34 | * @param sendTo 收件人 35 | * @param titel 标题 36 | * @param context 内容参数 37 | * @param attachments 附件 38 | * @param templateName 模板路径 39 | */ 40 | void sendTemplateMail(String sendTo, String titel, Map context, List attachments, String templateName); 41 | 42 | 43 | int persist(Mail mail); 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/common/StorageService.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright HNA©2017. All rights reserved. 3 | */ 4 | package com.question.admin.service.common; 5 | 6 | import java.io.IOException; 7 | import java.nio.file.Path; 8 | import java.util.stream.Stream; 9 | 10 | import org.springframework.core.io.Resource; 11 | import org.springframework.web.multipart.MultipartFile; 12 | 13 | /** 14 | * 文件存储 15 | */ 16 | public interface StorageService { 17 | 18 | Path store(String sourceUri, MultipartFile multipartFile) 19 | throws IllegalStateException, IOException; 20 | 21 | 22 | Path load(String filename); 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/common/impl/AttendanceSettingServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.common.impl; 2 | 3 | import com.question.admin.service.common.AttendanceSettingService; 4 | import org.springframework.stereotype.Service; 5 | 6 | import java.util.Date; 7 | 8 | @Service 9 | public class AttendanceSettingServiceImpl implements AttendanceSettingService { 10 | @Override 11 | public Date getNextNumMarketDay(Date date, Integer days) { 12 | return null; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/common/impl/StorageServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.common.impl; 2 | 3 | import java.io.IOException; 4 | import java.nio.file.Files; 5 | import java.nio.file.Path; 6 | import java.nio.file.Paths; 7 | 8 | import com.question.admin.service.common.StorageService; 9 | import com.question.admin.utils.StringUtils; 10 | import com.question.admin.config.upload.support.FileArchiveStrategy; 11 | import org.springframework.beans.factory.annotation.Autowired; 12 | import org.springframework.beans.factory.annotation.Value; 13 | import org.springframework.stereotype.Service; 14 | import org.springframework.web.multipart.MultipartFile; 15 | 16 | @Service 17 | public class StorageServiceImpl implements StorageService { 18 | 19 | @Value("${file.multipart.baseDir}") 20 | private String baseDir; 21 | 22 | @Autowired 23 | protected FileArchiveStrategy fileArchiveStrategy; 24 | 25 | /** 26 | * 27 | */ 28 | @Override 29 | public Path store(String sourceUri, MultipartFile multipartFile) throws IllegalStateException, IOException { 30 | String originalFilename = multipartFile.getOriginalFilename(); 31 | Path fileRelativePath = fileArchiveStrategy.createPath(sourceUri, originalFilename); 32 | 33 | Path fileAbsolutePath = this.getBaseDir().resolve(fileRelativePath); 34 | if (!Files.exists(fileAbsolutePath.getParent())) { 35 | Files.createDirectories(fileAbsolutePath.getParent()); 36 | Files.createFile(fileAbsolutePath); 37 | } 38 | 39 | multipartFile.transferTo(fileAbsolutePath.toFile()); 40 | 41 | return fileRelativePath; 42 | } 43 | 44 | /** 45 | * 46 | */ 47 | @Override 48 | public Path load(String filename) { 49 | Path fileAbsolutePath = this.getBaseDir().resolve(filename); 50 | return fileAbsolutePath; 51 | } 52 | 53 | private Path getBaseDir() { 54 | if (StringUtils.isEmpty(this.baseDir)) { 55 | return Paths.get(System.getProperty("user.home")).resolve("e"); 56 | } 57 | 58 | return Paths.get(this.baseDir); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/event/CalculateExamPaperAnswerCompleteEvent.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.event; 2 | 3 | import com.question.admin.domain.vo.student.paper.ExamPaperAnswerInfo; 4 | import org.springframework.context.ApplicationEvent; 5 | 6 | public class CalculateExamPaperAnswerCompleteEvent extends ApplicationEvent { 7 | 8 | 9 | private final ExamPaperAnswerInfo examPaperAnswerInfo; 10 | 11 | public CalculateExamPaperAnswerCompleteEvent(final ExamPaperAnswerInfo examPaperAnswerInfo) { 12 | super(examPaperAnswerInfo); 13 | this.examPaperAnswerInfo = examPaperAnswerInfo; 14 | } 15 | 16 | public ExamPaperAnswerInfo getExamPaperAnswerInfo() { 17 | return examPaperAnswerInfo; 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/exam/CategoryService.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.exam; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.question.admin.domain.entity.exam.Category; 5 | 6 | public interface CategoryService extends IService { 7 | 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/exam/ExamPaperAnswerService.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.exam; 2 | 3 | 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | import com.question.admin.domain.entity.sysmgr.User; 6 | import com.question.admin.domain.vo.manager.exam.ExamPaperAnswer; 7 | import com.question.admin.domain.vo.student.exam.ExamPaperSubmitVM; 8 | import com.question.admin.domain.vo.student.paper.ExamPaperAnswerInfo; 9 | 10 | public interface ExamPaperAnswerService extends IService { 11 | 12 | /** 13 | * 计算试卷提交结果(不入库) 14 | * 15 | * @param examPaperSubmitVM 16 | * @param user 17 | * @return 18 | */ 19 | ExamPaperAnswerInfo calculateExamPaperAnswer(ExamPaperSubmitVM examPaperSubmitVM, User user); 20 | /** 21 | * 试卷答题信息转成ViewModel 传给前台 22 | * 23 | * @param id 试卷id 24 | * @return ExamPaperSubmitVM 25 | */ 26 | ExamPaperSubmitVM examPaperAnswerToVM(Long id); 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/exam/ExamPaperQuestionCustomerAnswerService.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.exam; 2 | 3 | 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | import com.question.admin.domain.vo.student.paper.ExamPaperQuestionCustomerAnswer; 6 | import com.question.admin.domain.vo.student.exam.ExamPaperSubmitItemVM; 7 | 8 | public interface ExamPaperQuestionCustomerAnswerService extends IService { 9 | /** 10 | * 试卷问题答题信息转成ViewModel 传给前台 11 | * 12 | * @param qa ExamPaperQuestionCustomerAnswer 13 | * @return ExamPaperSubmitItemVM 14 | */ 15 | ExamPaperSubmitItemVM examPaperQuestionCustomerAnswerToVM(ExamPaperQuestionCustomerAnswer qa); 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/exam/FeedBackService.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.exam; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.question.admin.domain.entity.exam.FeedBack; 5 | 6 | public interface FeedBackService extends IService { 7 | 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/exam/FileUpload.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.exam; 2 | 3 | 4 | import java.io.InputStream; 5 | 6 | public interface FileUpload { 7 | 8 | String uploadFile(InputStream inputStream, long size, String extName); 9 | String getDownloadUrl(String filePath); 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/exam/PaperService.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.exam; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.question.admin.domain.entity.exam.Paper; 5 | import com.question.admin.domain.vo.manager.exam.pape.ExamPaperEditRequestVM; 6 | 7 | import javax.validation.Valid; 8 | 9 | public interface PaperService extends IService { 10 | ExamPaperEditRequestVM examPaperToVM(Long id); 11 | Paper savePaperFromVM(@Valid ExamPaperEditRequestVM model); 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/exam/QuestionService.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.exam; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.question.admin.domain.entity.exam.Question; 5 | import com.question.admin.domain.vo.manager.exam.question.QuestionEditRequestVM; 6 | 7 | public interface QuestionService extends IService { 8 | Question insertFullQuestion(QuestionEditRequestVM model); 9 | 10 | Question updateFullQuestion(QuestionEditRequestVM model); 11 | 12 | QuestionEditRequestVM getQuestionEditRequestVM(Long questionId); 13 | 14 | QuestionEditRequestVM getQuestionEditRequestVM(Question question); 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/exam/SubjectService.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.exam; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.question.admin.domain.entity.exam.Subject; 5 | 6 | public interface SubjectService extends IService { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/exam/SwiperConfigService.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.exam; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.question.admin.domain.entity.exam.SwiperConfig; 5 | 6 | public interface SwiperConfigService extends IService { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/exam/TaskExamCustomerAnswerService.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.exam; 2 | 3 | 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | import com.question.admin.domain.vo.student.paper.TaskExamCustomerAnswer; 6 | 7 | public interface TaskExamCustomerAnswerService extends IService { 8 | 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/exam/TaskExamService.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.exam; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.question.admin.domain.entity.exam.TaskExam; 5 | 6 | 7 | public interface TaskExamService extends IService { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/exam/TextContentService.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.exam; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.question.admin.domain.entity.exam.question.TextContent; 5 | 6 | public interface TextContentService extends IService { 7 | int insert(TextContent textContent); 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/exam/enums/ActionEnum.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.exam.enums; 2 | 3 | public enum ActionEnum { 4 | 5 | ADD(1, "新增"), 6 | UPDATE(2, "修改"); 7 | 8 | int code; 9 | String Name; 10 | 11 | ActionEnum(int code, String name) { 12 | this.code = code; 13 | Name = name; 14 | } 15 | 16 | 17 | public int getCode() { 18 | return code; 19 | } 20 | 21 | public void setCode(int code) { 22 | this.code = code; 23 | } 24 | 25 | public String getName() { 26 | return Name; 27 | } 28 | 29 | public void setName(String name) { 30 | Name = name; 31 | } 32 | 33 | 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/exam/enums/ExamPaperAnswerStatusEnum.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.exam.enums; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | public enum ExamPaperAnswerStatusEnum { 7 | 8 | WaitJudge(1, "待批改"), 9 | Complete(2, "完成"); 10 | 11 | int code; 12 | String name; 13 | 14 | ExamPaperAnswerStatusEnum(int code, String name) { 15 | this.code = code; 16 | this.name = name; 17 | } 18 | 19 | 20 | public int getCode() { 21 | return code; 22 | } 23 | 24 | public void setCode(int code) { 25 | this.code = code; 26 | } 27 | 28 | public String getName() { 29 | return name; 30 | } 31 | 32 | public void setName(String name) { 33 | this.name = name; 34 | } 35 | 36 | 37 | private static final Map keyMap = new HashMap<>(); 38 | 39 | static { 40 | for (ExamPaperAnswerStatusEnum item : ExamPaperAnswerStatusEnum.values()) { 41 | keyMap.put(item.getCode(), item); 42 | } 43 | } 44 | 45 | public static ExamPaperAnswerStatusEnum fromCode(Integer code) { 46 | return keyMap.get(code); 47 | } 48 | 49 | } 50 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/exam/impl/CategoryServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.exam.impl; 2 | 3 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 4 | import com.question.admin.domain.entity.exam.Category; 5 | import com.question.admin.mapper.exam.CategoryMapper; 6 | import com.question.admin.service.exam.CategoryService; 7 | import org.springframework.stereotype.Service; 8 | 9 | @Service 10 | public class CategoryServiceImpl extends ServiceImpl implements CategoryService { 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/exam/impl/FeedBackServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.exam.impl; 2 | 3 | 4 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 5 | import com.question.admin.domain.entity.exam.FeedBack; 6 | import com.question.admin.mapper.exam.FeedBackMapper; 7 | import com.question.admin.service.exam.FeedBackService; 8 | import org.springframework.stereotype.Service; 9 | 10 | @Service 11 | public class FeedBackServiceImpl extends ServiceImpl implements FeedBackService { 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/exam/impl/FileUploadImpl.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.exam.impl; 2 | 3 | 4 | import com.google.gson.Gson; 5 | import com.qiniu.common.QiniuException; 6 | import com.qiniu.http.Response; 7 | import com.qiniu.storage.Configuration; 8 | import com.qiniu.storage.Region; 9 | import com.qiniu.storage.UploadManager; 10 | import com.qiniu.storage.model.DefaultPutRet; 11 | import com.qiniu.util.Auth; 12 | import com.question.admin.config.QnConfig; 13 | import com.question.admin.config.wx.SystemConfig; 14 | import com.question.admin.service.exam.FileUpload; 15 | import lombok.AllArgsConstructor; 16 | import org.slf4j.Logger; 17 | import org.slf4j.LoggerFactory; 18 | import org.springframework.stereotype.Service; 19 | 20 | import java.io.InputStream; 21 | 22 | @Service 23 | @AllArgsConstructor 24 | public class FileUploadImpl implements FileUpload { 25 | private final Logger logger = LoggerFactory.getLogger(FileUpload.class); 26 | private final SystemConfig systemConfig; 27 | 28 | @Override 29 | public String uploadFile(InputStream inputStream, long size, String extName) { 30 | QnConfig qnConfig = systemConfig.getQn(); 31 | Configuration cfg = new Configuration(Region.region2()); 32 | UploadManager uploadManager = new UploadManager(cfg); 33 | Auth auth = Auth.create(qnConfig.getAccessKey(), qnConfig.getSecretKey()); 34 | String upToken = auth.uploadToken(qnConfig.getBucket()); 35 | try { 36 | Response response = uploadManager.put(inputStream, null, upToken, null, null); 37 | DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class); 38 | return qnConfig.getUrl() + "/" + putRet.key; 39 | } catch (QiniuException ex) { 40 | logger.error(ex.getMessage(), ex); 41 | } 42 | return null; 43 | } 44 | @Override 45 | public String getDownloadUrl(String filePath) { 46 | QnConfig qnConfig = systemConfig.getQn(); 47 | Auth auth = Auth.create(qnConfig.getAccessKey(), qnConfig.getSecretKey()); 48 | return auth.privateDownloadUrl(filePath); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/exam/impl/SubjectServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.exam.impl; 2 | 3 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 4 | import com.question.admin.domain.entity.exam.Subject; 5 | import com.question.admin.mapper.exam.SubjectMapper; 6 | import com.question.admin.service.exam.SubjectService; 7 | import org.springframework.stereotype.Service; 8 | 9 | @Service 10 | public class SubjectServiceImpl extends ServiceImpl implements SubjectService { 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/exam/impl/SwiperConfigServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.exam.impl; 2 | 3 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 4 | import com.question.admin.domain.entity.exam.SwiperConfig; 5 | import com.question.admin.mapper.exam.SwiperConfigMapper; 6 | import com.question.admin.service.exam.SwiperConfigService; 7 | import org.springframework.stereotype.Service; 8 | 9 | @Service 10 | public class SwiperConfigServiceImpl extends ServiceImpl implements SwiperConfigService { 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/exam/impl/TaskExamCustomerAnswerServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.exam.impl; 2 | 3 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 4 | import com.question.admin.domain.vo.student.paper.TaskExamCustomerAnswer; 5 | import com.question.admin.mapper.exam.TaskExamCustomerAnswerMapper; 6 | import com.question.admin.service.exam.TaskExamCustomerAnswerService; 7 | import org.springframework.stereotype.Service; 8 | 9 | @Service 10 | public class TaskExamCustomerAnswerServiceImpl extends ServiceImpl implements TaskExamCustomerAnswerService { 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/exam/impl/TextContentServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.exam.impl; 2 | 3 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 4 | import com.question.admin.domain.entity.exam.question.TextContent; 5 | import com.question.admin.mapper.exam.TextContentMapper; 6 | import com.question.admin.service.exam.TextContentService; 7 | import org.springframework.stereotype.Service; 8 | 9 | @Service 10 | public class TextContentServiceImpl extends ServiceImpl implements TextContentService { 11 | public int insert(TextContent textContent){ 12 | return baseMapper.insert(textContent); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/sysmgr/AttService.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.sysmgr; 2 | 3 | import com.question.admin.config.upload.entity.FileSlot; 4 | import com.question.admin.domain.entity.sysmgr.Att; 5 | import com.baomidou.mybatisplus.extension.service.IService; 6 | import org.springframework.web.multipart.MultipartFile; 7 | 8 | import java.io.IOException; 9 | import java.util.List; 10 | 11 | /** 12 | *

13 | * 附件表 服务类 14 | *

15 | * 16 | * @author zvc 17 | * @since 2019-07-12 18 | */ 19 | public interface AttService extends IService { 20 | 21 | /** 22 | * 保存文件 23 | * @param sourceUri 模块路径。 例如: ocn/staff/student/save,
24 | * 如果是rest接口, 以直接取request.getRequestURI()的值为最好。 25 | * @param multipartFile 文件 26 | * @param fileBatch 实现了FileBatch接口的对象. 27 | * @return 28 | * @throws IllegalStateException 29 | * @throws IOException 30 | */ 31 | Att save(String sourceUri, MultipartFile multipartFile, FileSlot fileBatch) 32 | throws IllegalStateException, IOException; 33 | 34 | /** 35 | * 保存一个新文件。 36 | * @param sourceUri 模块路径。 例如: ocn/staff/student/save,
37 | * 如果是rest接口, 以直接取request.getRequestURI()的值为最好。 38 | * @param multipartFile 文件 39 | * @return 40 | * @throws IllegalStateException 41 | * @throws IOException 42 | */ 43 | Att save(String sourceUri, MultipartFile multipartFile) 44 | throws IllegalStateException, IOException; 45 | 46 | /** 47 | * 在指定batchId下, 添加一个新文件。 48 | * @param sourceUri 模块路径。 例如: ocn/staff/student/save,
49 | * 如果是rest接口, 以直接取request.getRequestURI()的值为最好。 50 | * @param multipartFile 51 | * @param batchId 52 | * @return 53 | * @throws IllegalStateException 54 | * @throws IOException 55 | */ 56 | Att save(String sourceUri, MultipartFile multipartFile, String batchId) 57 | throws IllegalStateException, IOException; 58 | 59 | List findBySlotId(String slotId); 60 | 61 | List findBySlotId(String slotId, String category); 62 | 63 | } 64 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/sysmgr/AuthorityService.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.sysmgr; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.question.admin.domain.entity.sysmgr.Authority; 5 | import com.question.admin.domain.vo.Result; 6 | import com.question.admin.domain.vo.manager.sysmgr.AuthorityNode; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | *

12 | * 权限表 服务类 13 | *

14 | * 15 | * @author zvc 16 | * @since 2018-12-28 17 | */ 18 | public interface AuthorityService extends IService { 19 | 20 | /** 21 | * 查询列表 22 | * @return 23 | */ 24 | List findAll(); 25 | 26 | /** 27 | * 根据用户查询 28 | * @param userId 29 | * @return 30 | */ 31 | List findByUserId(Long userId); 32 | 33 | /** 34 | * 保存 35 | * @param resource 36 | * @return 37 | */ 38 | Result persist(Authority resource); 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/sysmgr/BackupService.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.sysmgr; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.question.admin.domain.entity.sysmgr.Backup; 5 | import com.question.admin.domain.vo.Result; 6 | 7 | /** 8 | *

9 | * DB备份表 服务类 10 | *

11 | * 12 | * @author zvc 13 | * @since 2019-09-10 14 | */ 15 | public interface BackupService extends IService { 16 | 17 | /** 18 | * 备份 19 | */ 20 | Result backup(); 21 | 22 | /** 23 | * 保存 24 | * @param backup 25 | * @return 26 | */ 27 | Result persist(Backup backup); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/sysmgr/LoginLogService.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.sysmgr; 2 | 3 | import com.question.admin.domain.entity.sysmgr.LoginLog; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | 6 | /** 7 | *

8 | * 登录日志 服务类 9 | *

10 | * 11 | * @author zvc 12 | * @since 2019-07-26 13 | */ 14 | public interface LoginLogService extends IService { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/sysmgr/NoticeService.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.sysmgr; 2 | 3 | import com.baomidou.mybatisplus.core.metadata.IPage; 4 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 5 | import com.baomidou.mybatisplus.extension.service.IService; 6 | import com.question.admin.domain.entity.sysmgr.Notice; 7 | import com.question.admin.domain.entity.sysmgr.User; 8 | import com.question.admin.domain.vo.manager.sysmgr.NoticeReadVO; 9 | 10 | import java.util.List; 11 | 12 | public interface NoticeService extends IService { 13 | int saveReadRecord(Long id, Long userId); 14 | 15 | List listReadUsers(Long noticeId); 16 | 17 | Integer countUnread(Long userId); 18 | 19 | IPage selectPage1(Page page, NoticeReadVO noticeReadVO); 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/sysmgr/ResourceService.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.sysmgr; 2 | 3 | 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | import com.question.admin.domain.entity.sysmgr.Resource; 6 | import com.question.admin.domain.vo.Result; 7 | import com.question.admin.domain.vo.manager.sysmgr.ResourceNode; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | *

13 | * 菜单表 服务类 14 | *

15 | * 16 | * @author zvc 17 | * @since 2018-12-28 18 | */ 19 | public interface ResourceService extends IService { 20 | 21 | /** 22 | * 查询列表 23 | * @return 24 | */ 25 | List findAll(); 26 | 27 | /** 28 | * 根据用户查询 29 | * @param userId 30 | * @return 31 | */ 32 | List findByUserId(Long userId); 33 | 34 | 35 | /** 36 | * 保存 37 | * @param resource 38 | * @return 39 | */ 40 | Result persist(Resource resource); 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/sysmgr/RoleAuthorityService.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.sysmgr; 2 | 3 | 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | import com.question.admin.domain.entity.sysmgr.RoleAuthority; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | *

11 | * 角色权限关系表 服务类 12 | *

13 | * 14 | * @author zvc 15 | * @since 2018-12-28 16 | */ 17 | public interface RoleAuthorityService extends IService { 18 | 19 | 20 | /** 21 | * 批量新增 22 | */ 23 | void batchInsert(List list); 24 | 25 | 26 | /** 27 | * 根据角色删除 28 | * @param role 29 | */ 30 | void deleteAuthByRoleId(RoleAuthority role); 31 | 32 | /** 33 | * 根据角色查询 34 | * @param roleId 35 | * @return 36 | */ 37 | List selectAuthByRoleId(Long roleId); 38 | 39 | /** 40 | * 根据用户Id查询 41 | * @return 42 | */ 43 | List findByUserId(Long userId); 44 | 45 | 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/sysmgr/RoleService.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.sysmgr; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.question.admin.domain.vo.manager.sysmgr.RoleAuth; 5 | import com.question.admin.domain.entity.sysmgr.Role; 6 | import com.question.admin.domain.vo.Result; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | *

12 | * 角色表 服务类 13 | *

14 | * 15 | * @author zvc 16 | * @since 2018-12-28 17 | */ 18 | public interface RoleService extends IService { 19 | 20 | /** 21 | * 根据用户ID查询角色 22 | * 23 | * @param userId 24 | * @return 25 | */ 26 | List findRoleByUserId(Long userId); 27 | 28 | /** 29 | * 保存角色 30 | * 31 | * @param role 32 | * @return 33 | */ 34 | Result persist(Role role); 35 | 36 | /** 37 | * 修改权限 38 | * @param roleAuth 39 | * @return 40 | */ 41 | Result saveRoleAuths(RoleAuth roleAuth); 42 | 43 | /** 44 | * 根据角色ID获取权限 45 | * @param roleId 46 | * @return 47 | */ 48 | Result selectAuthByRoleId(Long roleId); 49 | 50 | 51 | } 52 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/sysmgr/ScheduleJobService.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.sysmgr; 2 | 3 | import com.question.admin.domain.QuestionServiceException; 4 | import com.question.admin.domain.entity.sysmgr.ScheduleJob; 5 | import com.baomidou.mybatisplus.extension.service.IService; 6 | 7 | import java.util.Date; 8 | import java.util.List; 9 | 10 | /** 11 | *

12 | * 定时任务 服务类 13 | *

14 | * 15 | * @author zvc 16 | * @since 2019-08-18 17 | */ 18 | public interface ScheduleJobService extends IService { 19 | 20 | /** 21 | * 检查 jobId 是否已经存在 22 | * @param id 23 | * @param jobId 24 | * @return 25 | * @throws QuestionServiceException 26 | */ 27 | boolean checkExistJob(Long id, String jobId) throws QuestionServiceException; 28 | 29 | /** 30 | * 获取系统的Job 31 | * 32 | * @return 33 | */ 34 | List findScheduleJobCombo(); 35 | 36 | /** 37 | * 更新运行时Job信息 38 | * @param jobId 39 | * @param fireTime 40 | * @param previousFireTime 41 | * @param nextFireTime 42 | * @param failReason 43 | * @throws QuestionServiceException 44 | */ 45 | void updateRuntimeJob(String jobId, Date fireTime, Date previousFireTime, Date nextFireTime, String failReason) throws QuestionServiceException; 46 | 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/sysmgr/SysLogService.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.sysmgr; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.question.admin.domain.entity.sysmgr.SysLog; 5 | 6 | public interface SysLogService extends IService { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/sysmgr/UserService.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.sysmgr; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.question.admin.domain.entity.sysmgr.User; 5 | import com.question.admin.domain.vo.Result; 6 | import com.question.admin.domain.vo.manager.sysmgr.UserPassword; 7 | import com.question.admin.domain.vo.manager.sysmgr.UserRoleVo; 8 | import com.question.admin.domain.vo.manager.sysmgr.UserVo; 9 | 10 | import javax.servlet.http.HttpServletResponse; 11 | 12 | /** 13 | *

14 | * 用户表 服务类 15 | *

16 | * 17 | * @author zvc 18 | * @since 2018-12-28 19 | */ 20 | public interface UserService extends IService { 21 | 22 | /** 23 | * 根据用户账号查询用户详情 24 | * @param account 25 | * @return 26 | */ 27 | User findUserByAccount(String account); 28 | 29 | Result wxUserLogin(String code, HttpServletResponse response) ; 30 | 31 | /** 32 | * 用户登录 33 | * @param user 34 | * @return 35 | */ 36 | Result login(UserVo user, HttpServletResponse response); 37 | 38 | /** 39 | * ERP登录 40 | * @return 41 | */ 42 | Result loginErp(HttpServletResponse response); 43 | 44 | /** 45 | * 保存用户 46 | * @param user 47 | * @return 48 | */ 49 | Result persist(User user); 50 | 51 | /** 52 | * 获取用户ID角色 53 | * @param userId 54 | * @return 55 | */ 56 | Result findUserRole(Long userId); 57 | 58 | /** 59 | * 修改用户角色 60 | * @param userRole 61 | * @return 62 | */ 63 | Result saveUserRoles(UserRoleVo userRole); 64 | 65 | /** 66 | * 修改用户密码 67 | * @param userPassword 68 | * @return 69 | */ 70 | Result editPassWord(UserPassword userPassword); 71 | 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/sysmgr/impl/LoginLogServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.sysmgr.impl; 2 | 3 | import com.question.admin.domain.entity.sysmgr.LoginLog; 4 | import com.question.admin.mapper.sysmgr.LoginLogMapper; 5 | import com.question.admin.service.sysmgr.LoginLogService; 6 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 7 | import org.springframework.stereotype.Service; 8 | 9 | /** 10 | *

11 | * 登录日志 服务实现类 12 | *

13 | * 14 | * @author zvc 15 | * @since 2019-07-26 16 | */ 17 | @Service 18 | public class LoginLogServiceImpl extends ServiceImpl implements LoginLogService { 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/sysmgr/impl/NoticeServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.sysmgr.impl; 2 | 3 | import com.baomidou.mybatisplus.core.metadata.IPage; 4 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 5 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 6 | import com.question.admin.domain.entity.sysmgr.User; 7 | import com.question.admin.domain.entity.sysmgr.Notice; 8 | import com.question.admin.domain.vo.manager.sysmgr.NoticeReadVO; 9 | import com.question.admin.mapper.sysmgr.NoticeMapper; 10 | import com.question.admin.service.sysmgr.NoticeService; 11 | import org.springframework.beans.factory.annotation.Autowired; 12 | import org.springframework.stereotype.Service; 13 | 14 | import java.util.List; 15 | 16 | @Service 17 | public class NoticeServiceImpl extends ServiceImpl implements NoticeService { 18 | 19 | @Autowired 20 | private NoticeMapper noticeMapper; 21 | 22 | @Override 23 | public int saveReadRecord(Long id, Long userId) { 24 | return noticeMapper.saveReadRecord(id, userId); 25 | } 26 | 27 | @Override 28 | public List listReadUsers(Long noticeId) { 29 | return noticeMapper.listReadUsers(noticeId); 30 | } 31 | 32 | @Override 33 | public Integer countUnread(Long userId) { 34 | return noticeMapper.countUnread(userId); 35 | } 36 | 37 | @Override 38 | public IPage selectPage1(Page page, NoticeReadVO noticeReadVO) { 39 | return noticeMapper.selectPage1(page, noticeReadVO); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/sysmgr/impl/SysLogServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.sysmgr.impl; 2 | 3 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 4 | import com.question.admin.domain.entity.sysmgr.SysLog; 5 | import com.question.admin.mapper.sysmgr.SysLogMapper; 6 | import com.question.admin.service.sysmgr.SysLogService; 7 | import org.springframework.stereotype.Service; 8 | 9 | @Service 10 | public class SysLogServiceImpl extends ServiceImpl implements SysLogService { 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/tool/TodoService.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.tool; 2 | 3 | import com.question.admin.domain.entity.tool.Todo; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | 6 | /** 7 | *

8 | * 待办事项 服务类 9 | *

10 | * 11 | * @author zvc 12 | * @since 2019-08-14 13 | */ 14 | public interface TodoService extends IService { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/service/tool/impl/TodoServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.service.tool.impl; 2 | 3 | import com.question.admin.service.tool.TodoService; 4 | import com.question.admin.domain.entity.tool.Todo; 5 | import com.question.admin.mapper.tool.TodoMapper; 6 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 7 | import org.springframework.stereotype.Service; 8 | 9 | /** 10 | *

11 | * 待办事项 服务实现类 12 | *

13 | * 14 | * @author zvc 15 | * @since 2019-08-14 16 | */ 17 | @Service 18 | public class TodoServiceImpl extends ServiceImpl implements TodoService { 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/support/XssSqlFilter.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.support; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.core.annotation.Order; 6 | 7 | import javax.servlet.*; 8 | import javax.servlet.annotation.WebFilter; 9 | import javax.servlet.http.HttpServletRequest; 10 | import java.io.IOException; 11 | 12 | /** 13 | * @author tomsun28 14 | * @date 21:24 2018/4/16 15 | */ 16 | @Order(1) 17 | @WebFilter(filterName = "xssFilter", urlPatterns = "/*", asyncSupported = true) 18 | public class XssSqlFilter implements Filter { 19 | 20 | private static final Logger LOGGER = LoggerFactory.getLogger(XssSqlFilter.class); 21 | 22 | @Override 23 | public void init(FilterConfig filterConfig) throws ServletException { 24 | LOGGER.debug("xssFilter initialized"); 25 | } 26 | 27 | @Override 28 | public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 29 | XssSqlHttpServletRequestWrapper xssSqlHttpServletRequestWrapper = new XssSqlHttpServletRequestWrapper((HttpServletRequest) servletRequest); 30 | filterChain.doFilter(xssSqlHttpServletRequestWrapper, servletResponse); 31 | } 32 | 33 | @Override 34 | public void destroy() { 35 | LOGGER.debug("xssFilter destroy"); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/support/XssSqlStringJsonSerializer.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.support; 2 | 3 | import com.fasterxml.jackson.core.JsonGenerator; 4 | import com.fasterxml.jackson.databind.JsonSerializer; 5 | import com.fasterxml.jackson.databind.SerializerProvider; 6 | import com.question.admin.utils.XssUtil; 7 | 8 | import java.io.IOException; 9 | 10 | /** 11 | * @author tomsun28 12 | * @date 21:14 2018/4/16 13 | */ 14 | public class XssSqlStringJsonSerializer extends JsonSerializer { 15 | 16 | @Override 17 | public Class handledType() { 18 | return String.class; 19 | } 20 | 21 | @Override 22 | public void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { 23 | if (s != null) { 24 | String encodedValue = XssUtil.stripSqlXss(s); 25 | jsonGenerator.writeString(encodedValue); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/utils/ErrorUtil.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.utils; 2 | 3 | public class ErrorUtil { 4 | public static String parameterErrorFormat(String field, String msg) { 5 | return "【" + field + " : " + msg + "】"; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/utils/ExamUtil.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.utils; 2 | 3 | import java.util.Arrays; 4 | import java.util.List; 5 | import java.util.stream.Collectors; 6 | 7 | public class ExamUtil { 8 | 9 | public static String scoreToVM(Integer score) { 10 | if (score % 10 == 0) { 11 | return String.valueOf(score / 10); 12 | } else { 13 | return String.format("%.1f", score / 10.0); 14 | } 15 | } 16 | 17 | public static Integer scoreFromVM(String score) { 18 | if (score == null) { 19 | return null; 20 | } else { 21 | return (int) (Float.parseFloat(score) * 10); 22 | } 23 | } 24 | 25 | public static String secondToVM(Integer second) { 26 | String dateTimes; 27 | long days = second / (60 * 60 * 24); 28 | long hours = (second % (60 * 60 * 24)) / (60 * 60); 29 | long minutes = (second % (60 * 60)) / 60; 30 | long seconds = second % 60; 31 | if (days > 0) { 32 | dateTimes = days + "天 " + hours + "时 " + minutes + "分 " + seconds + "秒"; 33 | } else if (hours > 0) { 34 | dateTimes = hours + "时 " + minutes + "分 " + seconds + "秒"; 35 | } else if (minutes > 0) { 36 | dateTimes = minutes + "分 " + seconds + "秒"; 37 | } else { 38 | dateTimes = seconds + " 秒"; 39 | } 40 | return dateTimes; 41 | } 42 | 43 | private static final String ANSWER_SPLIT = ","; 44 | 45 | public static String contentToString(List contentArray) { 46 | return contentArray.stream().sorted().collect(Collectors.joining(ANSWER_SPLIT)); 47 | } 48 | 49 | 50 | public static List contentToArray(String contentArray) { 51 | return Arrays.asList(contentArray.split(ANSWER_SPLIT)); 52 | } 53 | 54 | private static final String FORM_ANSWER_SPLIT = "_"; 55 | 56 | public static Integer lastNum(String str) { 57 | Integer start = str.lastIndexOf(FORM_ANSWER_SPLIT); 58 | return Integer.parseInt(str.substring(start + 1)); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/utils/ExceptionUtils.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.utils; 2 | 3 | /** 4 | * 异常处理工具类 5 | * 6 | */ 7 | public final class ExceptionUtils { 8 | 9 | /** 10 | * 错误堆栈记录长度 11 | */ 12 | private static final int EXCEPTION_STACK_LEN = 8000; 13 | 14 | /** 15 | * 将异常堆栈信息转为字符串 16 | * 17 | * @param e 18 | * @return 19 | */ 20 | public static String getStackMsg(Exception e) { 21 | StringBuffer sb = new StringBuffer(); 22 | StackTraceElement[] stackArray = e.getStackTrace(); 23 | for (int i = 0; i < stackArray.length; i++) { 24 | StackTraceElement element = stackArray[i]; 25 | sb.append(element.toString() + "\n"); 26 | } 27 | return extractStack(sb.toString()); 28 | } 29 | 30 | /** 31 | * 将异常堆栈信息转为字符串 32 | * 33 | * @param e 34 | * @return 35 | */ 36 | public static String getStackMsg(Throwable e) { 37 | StringBuffer sb = new StringBuffer(); 38 | StackTraceElement[] stackArray = e.getStackTrace(); 39 | for (int i = 0; i < stackArray.length; i++) { 40 | StackTraceElement element = stackArray[i]; 41 | sb.append(element.toString() + "\n"); 42 | } 43 | return extractStack(sb.toString()); 44 | } 45 | 46 | private static String extractStack(String stack) { 47 | int len = stack.length() < EXCEPTION_STACK_LEN ? stack.length() : EXCEPTION_STACK_LEN; 48 | return stack.substring(0, len); 49 | } 50 | 51 | } 52 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/utils/HtmlUtil.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.utils; 2 | 3 | import java.util.regex.Matcher; 4 | import java.util.regex.Pattern; 5 | 6 | public class HtmlUtil { 7 | public static String clear(String htmlStr) { 8 | String regEx_script = "]*?>[\\s\\S]*?<\\/script>"; 9 | String regEx_style = "]*?>[\\s\\S]*?<\\/style>"; 10 | String regEx_html = "<[^>]+>"; 11 | Pattern p_script = Pattern.compile(regEx_script, Pattern.CASE_INSENSITIVE); 12 | Matcher m_script = p_script.matcher(htmlStr); 13 | htmlStr = m_script.replaceAll(""); 14 | Pattern p_style = Pattern.compile(regEx_style, Pattern.CASE_INSENSITIVE); 15 | Matcher m_style = p_style.matcher(htmlStr); 16 | htmlStr = m_style.replaceAll(""); 17 | Pattern p_html = Pattern.compile(regEx_html, Pattern.CASE_INSENSITIVE); 18 | Matcher m_html = p_html.matcher(htmlStr); 19 | htmlStr = m_html.replaceAll(""); 20 | return htmlStr.trim(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/utils/HttpUtil.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.utils; 2 | 3 | import org.springframework.util.MultiValueMap; 4 | import org.springframework.web.util.UriComponentsBuilder; 5 | 6 | import javax.servlet.http.HttpServletRequest; 7 | import java.net.InetAddress; 8 | import java.net.URI; 9 | import java.net.UnknownHostException; 10 | 11 | /** 12 | * Created by EalenXie on 2018/11/22 16:37. 13 | */ 14 | public enum HttpUtil { 15 | 16 | ; 17 | 18 | /** 19 | * 根据url和请求参数获取URI 20 | */ 21 | public static URI getURIwithParams(String url, MultiValueMap params) { 22 | UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url).queryParams(params); 23 | return builder.build().encode().toUri(); 24 | } 25 | 26 | /** 27 | * 获取用户IP地址 28 | */ 29 | public static String getIpAddress(HttpServletRequest request) { 30 | String[] ipHeaders = {"x-forwarded-for", "Proxy-Client-IP", "WL-Proxy-Client-IP", "HTTP_CLIENT_IP", "HTTP_X_FORWARDED_FOR"}; 31 | String[] localhostIp = {"127.0.0.1", "0:0:0:0:0:0:0:1"}; 32 | String ip = request.getRemoteAddr(); 33 | for (String header : ipHeaders) { 34 | if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) break; 35 | ip = request.getHeader(header); 36 | } 37 | for (String local : localhostIp) { 38 | if (ip != null && ip.equals(local)) { 39 | try { 40 | ip = InetAddress.getLocalHost().getHostAddress(); 41 | } catch (UnknownHostException ignored) { 42 | 43 | } 44 | break; 45 | } 46 | } 47 | if (ip != null && ip.length() > 15 && ip.contains(",")) { 48 | ip = ip.substring(0, ip.indexOf(',')); 49 | } 50 | return ip; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/utils/IPUtils.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.utils; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | 5 | /** 6 | * 客户端IP地址工具类 7 | * 8 | */ 9 | public final class IPUtils { 10 | 11 | /** 12 | * 获取客户端 IP 地址 13 | * 14 | * @param request 15 | * @return 16 | */ 17 | public static String getIpAddr(HttpServletRequest request) { 18 | String ip = request.getHeader("X-Forwarded-For"); 19 | if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 20 | ip = request.getHeader("Proxy-Client-IP"); 21 | } 22 | if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 23 | ip = request.getHeader("WL-Proxy-Client-IP"); 24 | } 25 | if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 26 | ip = request.getHeader("HTTP_CLIENT_IP"); 27 | } 28 | if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 29 | ip = request.getHeader("HTTP_X_FORWARDED_FOR"); 30 | } 31 | if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 32 | ip = request.getRemoteAddr(); 33 | } 34 | return ip; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/utils/JSONUtil.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.utils; 2 | 3 | import com.alibaba.fastjson.JSONArray; 4 | import com.alibaba.fastjson.JSONObject; 5 | 6 | import java.util.List; 7 | 8 | public enum JSONUtil { 9 | ; 10 | 11 | /** 12 | * 将JSON字符串转为Java对象 13 | */ 14 | public static T toJavaObject(String result, Class clazz) { 15 | return JSONObject.toJavaObject(JSONObject.parseObject(result), clazz); 16 | } 17 | 18 | /** 19 | * JSON字符串对象解析成java List对象 20 | */ 21 | public static List toJavaList(String resultList, Class clazz) { 22 | return JSONArray.parseArray(resultList).toJavaList(clazz); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/utils/ModelMapperSingle.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.utils; 2 | 3 | import org.modelmapper.ModelMapper; 4 | import org.modelmapper.convention.MatchingStrategies; 5 | 6 | public class ModelMapperSingle { 7 | protected final static ModelMapper modelMapper = new ModelMapper(); 8 | private final static ModelMapperSingle modelMapperSingle = new ModelMapperSingle(); 9 | 10 | static { 11 | modelMapper.getConfiguration().setFullTypeMatchingRequired(true); 12 | modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); 13 | } 14 | 15 | public static ModelMapper Instance() { 16 | return modelMapperSingle.modelMapper; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/utils/PageInfoHelper.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.utils; 2 | 3 | import com.baomidou.mybatisplus.core.metadata.IPage; 4 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 5 | 6 | import java.util.function.Function; 7 | import java.util.stream.Collectors; 8 | 9 | public class PageInfoHelper { 10 | 11 | public static IPage copyMap(IPage source, Function mapper) { 12 | IPage newPage = new Page<>(); 13 | newPage.setCurrent(source.getCurrent()); 14 | newPage.setSize(source.getSize()); 15 | newPage.setPages(source.getPages()); 16 | newPage.setTotal(source.getTotal()); 17 | newPage.setRecords(source.getRecords().stream().map(mapper).collect(Collectors.toList())); 18 | 19 | return newPage; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/utils/WxUtil.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.utils; 2 | 3 | 4 | import com.alibaba.fastjson.JSON; 5 | import com.question.admin.config.wx.WxConfig; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.springframework.web.reactive.function.client.WebClient; 8 | 9 | @Slf4j 10 | public class WxUtil { 11 | 12 | /** 13 | * 微信的 code2session 接口 获取微信用户信息 14 | * 官方说明 : https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html 15 | */ 16 | public static String code2Session(WxConfig wxConfig, String jsCode) { 17 | // String code2SessionUrl = "https://api.weixin.qq.com/sns/jscode2session?appid={appid}&secret={secret}&js_code={jsCode}&grant_type=authorization_code"; 18 | // MultiValueMap params = new LinkedMultiValueMap<>(); 19 | // params.add("appid", wxConfig.getAppid()); 20 | // params.add("secret", wxConfig.getSecret()); 21 | // params.add("js_code", jsCode); 22 | // params.add("grant_type", "authorization_code"); 23 | // URI code2Session = HttpUtil.getURIwithParams(code2SessionUrl, params); 24 | log.info("wxConfig: {}; jsCode:{}", JSON.toJSONString(wxConfig), jsCode); 25 | // Mono stringMono = WebClient.create(code2SessionUrl).get(). 26 | // uri(wxConfig.getAppid(), wxConfig.getSecret(), jsCode).retrieve().bodyToMono(String.class); 27 | String jscode2session = WebClient.create().get().uri(uriBuilder -> uriBuilder.scheme("https").host("api.weixin.qq.com").path("/sns/jscode2session").queryParam("appid", wxConfig.getAppid()).queryParam("secret", wxConfig.getSecret()).queryParam("js_code", jsCode).queryParam("grant_type", "authorization_code").build()).retrieve().bodyToMono(String.class).block(); 28 | return jscode2session; 29 | // try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) { 30 | // HttpGet httpGet = new HttpGet(code2Session.toString()); 31 | // HttpEntity responseEntity = httpClient.execute(httpGet).getEntity(); 32 | // if (responseEntity != null) { 33 | // String responseStr = EntityUtils.toString(responseEntity); 34 | // return responseStr; 35 | // } 36 | // } catch (IOException e) { 37 | // logger.error(e.getMessage(), e); 38 | // } 39 | // return null; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/web/IndexController.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.web; 2 | 3 | import org.springframework.stereotype.Controller; 4 | import org.springframework.web.bind.annotation.RequestMapping; 5 | import org.springframework.web.bind.annotation.RequestMethod; 6 | 7 | @Controller 8 | public class IndexController { 9 | 10 | @RequestMapping(value="/",method = {RequestMethod.GET}) 11 | public String welcome(){ 12 | return "welcome"; 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/web/wx/BaseWXApiController.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.web.wx; 2 | 3 | import com.question.admin.utils.ModelMapperSingle; 4 | import org.modelmapper.ModelMapper; 5 | 6 | public class BaseWXApiController { 7 | protected final static ModelMapper modelMapper = ModelMapperSingle.Instance(); 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/web/wx/DashboardController.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.web.wx; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.question.admin.domain.entity.exam.Category; 5 | import com.question.admin.service.exam.FileUpload; 6 | import com.question.admin.domain.entity.exam.SwiperConfig; 7 | import com.question.admin.domain.vo.Result; 8 | import com.question.admin.service.exam.CategoryService; 9 | import com.question.admin.service.exam.PaperService; 10 | import com.question.admin.service.exam.SwiperConfigService; 11 | import lombok.AllArgsConstructor; 12 | import org.springframework.web.bind.annotation.RequestMapping; 13 | import org.springframework.web.bind.annotation.RequestMethod; 14 | import org.springframework.web.bind.annotation.RestController; 15 | 16 | import java.util.List; 17 | import java.util.stream.Collectors; 18 | 19 | 20 | @RestController 21 | @RequestMapping(value = "/api/wx/user/dashboard") 22 | @AllArgsConstructor 23 | public class DashboardController extends BaseWXApiController { 24 | 25 | private final PaperService paperService; 26 | 27 | private final CategoryService categoryService; 28 | private final SwiperConfigService swiperConfigService; 29 | private final FileUpload fileUpload; 30 | 31 | @RequestMapping(value = "/index", method = RequestMethod.GET) 32 | public Result index() { 33 | QueryWrapper categoryBean = new QueryWrapper(); 34 | categoryBean.eq("status", 1); 35 | List result = categoryService.list(categoryBean); 36 | return Result.getSuccess(result); 37 | } 38 | 39 | @RequestMapping(value = "/swiper", method = RequestMethod.GET) 40 | public Result swiper() { 41 | QueryWrapper categoryBean = new QueryWrapper(); 42 | categoryBean.eq("status", 1); 43 | List result = swiperConfigService.list(categoryBean) 44 | .stream().map(s -> { 45 | s.setUrl(fileUpload.getDownloadUrl(s.getUrl())); 46 | return s; 47 | }).collect(Collectors.toList()); 48 | return Result.getSuccess(result); 49 | } 50 | 51 | 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/web/wx/ExamPaperController.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.web.wx; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.question.admin.domain.entity.exam.Paper; 5 | import com.question.admin.domain.entity.exam.Subject; 6 | import com.question.admin.domain.vo.Result; 7 | import com.question.admin.domain.vo.manager.exam.pape.ExamPaperEditRequestVM; 8 | import com.question.admin.service.exam.PaperService; 9 | import com.question.admin.service.exam.SubjectService; 10 | import lombok.AllArgsConstructor; 11 | import org.springframework.web.bind.annotation.*; 12 | 13 | import javax.validation.Valid; 14 | import javax.validation.constraints.NotBlank; 15 | import java.util.List; 16 | 17 | 18 | @RestController 19 | @RequestMapping(value = "/api/wx/student/") 20 | @AllArgsConstructor 21 | @ResponseBody 22 | public class ExamPaperController extends BaseWXApiController { 23 | 24 | private final SubjectService subjectService; 25 | private final PaperService paperService; 26 | 27 | @RequestMapping(value = "/subject", method = RequestMethod.POST) 28 | public Result querySubjectList(@Valid @NotBlank Long categoryId){ 29 | QueryWrapper categoryBean = new QueryWrapper(); 30 | categoryBean.eq("status", 1); 31 | if(null != categoryId) { 32 | categoryBean.eq("category_id", categoryId); 33 | } 34 | List list = subjectService.list(categoryBean); 35 | return Result.getSuccess(list); 36 | } 37 | @RequestMapping(value = "/paper", method = RequestMethod.POST) 38 | public Result queryPaperList(@Valid @NotBlank Long subjectId){ 39 | QueryWrapper categoryBean = new QueryWrapper(); 40 | categoryBean.eq("status", 1); 41 | if(null != subjectId) { 42 | categoryBean.eq("subject_id", subjectId); 43 | } 44 | List list = paperService.list(categoryBean); 45 | return Result.getSuccess(list); 46 | } 47 | @RequestMapping(value = "/select/{id}", method = RequestMethod.POST) 48 | public Result select(@PathVariable Long id) { 49 | ExamPaperEditRequestVM vm = paperService.examPaperToVM(id); 50 | return Result.getSuccess(vm); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/web/wx/WxCategoryController.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.web.wx; 2 | 3 | 4 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 5 | import com.baomidou.mybatisplus.core.metadata.IPage; 6 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 7 | import com.question.admin.domain.entity.exam.Category; 8 | import com.question.admin.domain.vo.Result; 9 | import com.question.admin.service.exam.CategoryService; 10 | import lombok.AllArgsConstructor; 11 | import org.apache.commons.lang3.StringUtils; 12 | import org.springframework.web.bind.annotation.GetMapping; 13 | import org.springframework.web.bind.annotation.RequestMapping; 14 | import org.springframework.web.bind.annotation.RequestParam; 15 | import org.springframework.web.bind.annotation.RestController; 16 | 17 | @RestController 18 | @RequestMapping(value = "/api/wx/category") 19 | @AllArgsConstructor 20 | public class WxCategoryController { 21 | 22 | private final CategoryService categoryService; 23 | 24 | @GetMapping(value = "/list") 25 | public Result list(@RequestParam(required = false) String name, @RequestParam(defaultValue = "1") int pageNo, 26 | @RequestParam(defaultValue = "10") int limit) { 27 | 28 | Page page = new Page(pageNo, limit); 29 | 30 | QueryWrapper eWrapper = new QueryWrapper(); 31 | eWrapper.eq("status", "1"); 32 | if (StringUtils.isNotEmpty(name)) { 33 | eWrapper.like("name", name); 34 | } 35 | eWrapper.orderByDesc("modified_time"); 36 | IPage list = categoryService.page(page, eWrapper); 37 | return Result.getSuccess(list); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/question/admin/web/wx/WxFeedBackController.java: -------------------------------------------------------------------------------- 1 | package com.question.admin.web.wx; 2 | 3 | 4 | import com.question.admin.config.shiro.security.UserContext; 5 | import com.question.admin.domain.entity.exam.FeedBack; 6 | import com.question.admin.domain.vo.Result; 7 | import com.question.admin.service.exam.FeedBackService; 8 | import lombok.AllArgsConstructor; 9 | import org.springframework.web.bind.annotation.RequestBody; 10 | import org.springframework.web.bind.annotation.RequestMapping; 11 | import org.springframework.web.bind.annotation.RequestMethod; 12 | import org.springframework.web.bind.annotation.RestController; 13 | 14 | import javax.validation.Valid; 15 | import java.time.Instant; 16 | import java.util.Date; 17 | 18 | @RestController 19 | @RequestMapping(value = "/api/wx/feedback") 20 | @AllArgsConstructor 21 | public class WxFeedBackController { 22 | 23 | private final FeedBackService feedBackService; 24 | /** 25 | * 保存 26 | * 27 | * @param model 28 | * @return 29 | */ 30 | @RequestMapping(value = "/save", method = {RequestMethod.POST}) 31 | public Result save(@RequestBody @Valid FeedBack model) { 32 | model.setStatus(1); 33 | Date now = Date.from(Instant.now()); 34 | model.setModifiedTime(now); 35 | model.setCreatedTime(now); 36 | Long userId = UserContext.getCurrentUser().getUserId(); 37 | model.setCreatorId(userId); 38 | model.setEditorId(userId); 39 | boolean save = feedBackService.save(model); 40 | return Result.getSuccess(save); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/resources/.reloadtrigger: -------------------------------------------------------------------------------- 1 | ff -------------------------------------------------------------------------------- /src/main/resources/application-dev.yml: -------------------------------------------------------------------------------- 1 | project: 2 | domain: http://localhost:9430 3 | 4 | spring: 5 | devtools: 6 | restart: 7 | enabled: true 8 | additional-paths: src/main/java 9 | trigger-file: .reloadtrigger 10 | datasource: 11 | type: com.alibaba.druid.pool.DruidDataSource 12 | driverClassName: com.mysql.cj.jdbc.Driver 13 | driver-class-name: com.mysql.cj.jdbc.Driver 14 | url: jdbc:mysql://127.0.0.1/question_admin?useSSL=false&allowMultiQueries=true&characterEncoding=utf8&serverTimezone=UTC 15 | username: root 16 | password: 1234 17 | initialSize: 5 18 | minIdle: 5 19 | maxActive: 20 20 | maxWait: 60000 21 | timeBetweenEvictionRunsMillis: 60000 22 | minEvictableIdleTimeMillis: 300000 23 | validationQuery: SELECT 1 FROM DUAL 24 | testWhileIdle: true 25 | testOnBorrow: false 26 | testOnReturn: false 27 | filters: stat,wall,log4j 28 | logSlowSql: true 29 | redis: 30 | database: 0 31 | host: localhost 32 | port: 6379 33 | jedis: 34 | pool: 35 | min-idle: 10 36 | max-idle: 50 37 | max-active: 200 38 | max-wait: 3000 39 | # data: 40 | # mongodb: 41 | # host: localhost 42 | # port: 27017 43 | # database: question_admin_log 44 | mail: 45 | host: smtp.163.com 46 | mailFrom: abcd@163.com 47 | username: abcd 48 | password: abcd 49 | properties: 50 | mail: 51 | smtp: 52 | auth: true 53 | timeout: 25000 54 | 55 | mybatis-plus: 56 | configuration: 57 | #日志打印sql 58 | log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 59 | file: 60 | multipart: 61 | #文件上传 62 | autoSaveEnabled: true 63 | baseDir: D:/upload/ 64 | # 备份 65 | dbbackup: 66 | servername: 127.0.0.1 67 | dbname: question_admin 68 | username: root 69 | password: 1234 70 | installPath: ${file.upload:D:/Development/mysql-8.0.13-winx64} 71 | backupPath: ${file.export:D:/Backup} 72 | -------------------------------------------------------------------------------- /src/main/resources/application-pro.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | datasource: 3 | type: com.alibaba.druid.pool.DruidDataSource 4 | driverClassName: com.mysql.cj.jdbc.Driver 5 | driver-class-name: com.mysql.cj.jdbc.Driver 6 | url: jdbc:mysql://127.0.0.1/question_admin?useSSL=false&allowMultiQueries=true&characterEncoding=utf8&serverTimezone=UTC 7 | username: root 8 | password: 123456 9 | initialSize: 5 10 | minIdle: 5 11 | maxActive: 20 12 | maxWait: 60000 13 | timeBetweenEvictionRunsMillis: 60000 14 | minEvictableIdleTimeMillis: 300000 15 | validationQuery: SELECT 1 FROM DUAL 16 | testWhileIdle: true 17 | testOnBorrow: false 18 | testOnReturn: false 19 | filters: stat,wall,log4j 20 | logSlowSql: true 21 | redis: 22 | database: 0 23 | host: 192.168.99.100 24 | port: 6379 25 | jedis: 26 | pool: 27 | min-idle: 10 28 | max-idle: 50 29 | max-active: 200 30 | max-wait: 3000 31 | # data: 32 | # mongodb: 33 | # host: localhost 34 | # port: 27017 35 | # database: question_admin_log 36 | mail: 37 | host: smtp.163.com 38 | username: aaaa@163.com 39 | password: 111111 40 | properties: 41 | mail: 42 | smtp: 43 | auth: true 44 | timeout: 25000 45 | 46 | file: 47 | multipart: 48 | #文件上传 49 | autoSaveEnabled: true 50 | baseDir: D:/upload/ 51 | # 备份 52 | dbbackup: 53 | servername: 127.0.0.1 54 | dbname: question_admin 55 | username: root 56 | password: 123456 57 | installPath: ${file.upload:D:/Development/mysql-8.0.13-winx64} 58 | backupPath: ${file.export:D:/Backup} -------------------------------------------------------------------------------- /src/main/resources/application-test.yml: -------------------------------------------------------------------------------- 1 | project: 2 | domain: http://localhost:9430 3 | 4 | spring: 5 | datasource: 6 | type: com.alibaba.druid.pool.DruidDataSource 7 | driverClassName: com.mysql.cj.jdbc.Driver 8 | driver-class-name: com.mysql.cj.jdbc.Driver 9 | url: jdbc:mysql://127.0.0.1/question_admin?useSSL=false&allowMultiQueries=true&characterEncoding=utf8&serverTimezone=UTC 10 | username: root 11 | password: 123456 12 | initialSize: 5 13 | minIdle: 5 14 | maxActive: 20 15 | maxWait: 60000 16 | timeBetweenEvictionRunsMillis: 60000 17 | minEvictableIdleTimeMillis: 300000 18 | validationQuery: SELECT 1 FROM DUAL 19 | testWhileIdle: true 20 | testOnBorrow: false 21 | testOnReturn: false 22 | filters: stat,wall,log4j 23 | logSlowSql: true 24 | redis: 25 | database: 0 26 | host: 192.168.99.100 27 | port: 6379 28 | jedis: 29 | pool: 30 | min-idle: 10 31 | max-idle: 50 32 | max-active: 200 33 | max-wait: 3000 34 | # data: 35 | # mongodb: 36 | # host: localhost 37 | # port: 27017 38 | # database: question_admin_log 39 | mail: 40 | host: smtp.163.com 41 | mailFrom: abcd@163.com 42 | username: aaaa@163.com 43 | password: 111111 44 | properties: 45 | mail: 46 | smtp: 47 | auth: true 48 | timeout: 25000 49 | file: 50 | multipart: 51 | #文件上传 52 | autoSaveEnabled: true 53 | baseDir: D:/upload/ 54 | # 备份 55 | dbbackup: 56 | servername: 127.0.0.1 57 | dbname: question_admin 58 | username: root 59 | password: 123456 60 | installPath: ${file.upload:D:/Development/mysql-8.0.13-winx64} 61 | backupPath: ${file.export:D:/Backup} -------------------------------------------------------------------------------- /src/main/resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | %d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{1} %X{ServiceId} - %m%n 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | ${pattern} 24 | 25 | 26 | 27 | 30 | 31 | 32 | ${pattern} 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | ${pattern} 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /src/main/resources/mail/test.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | question-admin 6 | 7 | 8 |

9 | 10 | 您好${username}, 欢迎来到sundayfine.com!
11 | 点击进入 12 | 13 |

14 | 15 | 16 | -------------------------------------------------------------------------------- /src/main/resources/mapper/baseinfo/DictMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/main/resources/mapper/exam/ExamPaperAnsserMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/main/resources/mapper/exam/SubjectMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/main/resources/mapper/sysmgr/AttMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/main/resources/mapper/sysmgr/AuthorityMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/main/resources/mapper/sysmgr/BackupMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/main/resources/mapper/sysmgr/LoginLogMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/main/resources/mapper/sysmgr/MailMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | update st_role_authority set yn_flag='0', 7 | editor=#{editor}, 8 | modified_time=#{modifiedTime} 9 | where role_id= #{roleId} 10 | and yn_flag='1' 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/main/resources/mapper/sysmgr/NoticeMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | insert ignore into t_notice_read(noticeId, userId, createTime) values(#{noticeId}, #{userId}, now()) 7 | 8 | 16 | 19 | 20 | 28 | 29 | 30 | t.status = 1 31 | 32 | and t.title like concat('%', #{notice.title}, '%') 33 | 34 | 35 | 36 | and t.modified_time >= #{notice.beginTime} 37 | 38 | 39 | 40 | and DATE(t.modified_time) <= #{notice.endTime} 41 | 42 | 43 | 44 | and r.created_time is null 45 | 46 | 47 | and r.created_time is not null 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /src/main/resources/mapper/sysmgr/ResourceMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/main/resources/mapper/sysmgr/RoleAuthorityMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 17 | 18 | 19 | 20 | update st_role_authority set yn_flag='0', 21 | editor=#{editor}, 22 | modified_time=#{modifiedTime} 23 | where role_id= #{roleId} 24 | and yn_flag='1' 25 | 26 | 27 | 28 | 29 | 30 | insert into st_role_authority(role_id,authority_id,yn_flag,creator,editor,created_time,modified_time) 31 | values 32 | 33 | ( 34 | #{item.roleId}, 35 | #{item.authorityId}, 36 | #{item.ynFlag}, 37 | #{item.creator}, 38 | #{item.editor}, 39 | #{item.createdTime}, 40 | #{item.modifiedTime} 41 | ) 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /src/main/resources/mapper/sysmgr/RoleMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/main/resources/mapper/sysmgr/ScheduleJobMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/main/resources/mapper/sysmgr/UserMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 16 | 17 | 18 | 19 | update st_user_role set yn_flag='0', 20 | editor=#{editor}, 21 | modified_time=#{modifiedTime} 22 | where user_id= #{userId} 23 | and yn_flag='1' 24 | 25 | 26 | 27 | 28 | insert into st_user_role(user_id,role_id,yn_flag,creator,editor,created_time,modified_time) 29 | values 30 | 31 | ( 32 | #{item.userId}, 33 | #{item.roleId}, 34 | #{item.ynFlag}, 35 | #{item.creator}, 36 | #{item.editor}, 37 | #{item.createdTime}, 38 | #{item.modifiedTime} 39 | ) 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /src/main/resources/mapper/tool/TodoMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/main/resources/quartz.properties: -------------------------------------------------------------------------------- 1 | org.quartz.scheduler.instanceId=QUESTION_ADMIN 2 | org.quartz.scheduler.instanceName=adminQuartzScheduler 3 | org.quartz.threadPool.threadCount=20 -------------------------------------------------------------------------------- /src/main/resources/templates/welcome.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | question-admin 6 | 7 | 8 |

欢迎来到 question-admin

9 | 10 | -------------------------------------------------------------------------------- /src/test/java/com/question/admin/QuestionAdminApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.question.admin; 2 | 3 | import org.junit.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | 7 | @SpringBootTest 8 | class QuestionAdminApplicationTests { 9 | 10 | // @Test 11 | // void contextLoads() { 12 | // } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /start.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/bash 2 | export JAVA_HOME=/usr/local/jdk1.8 3 | export JRE_HOME=/$JAVA_HOME/jre 4 | export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar 5 | export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin 6 | 7 | #这里可替换为你自己的执行程序,其他代码无需更改 8 | 9 | APP_NAME=./question-admin.jar 10 | #使用说明,用来提示输入参数 11 | usage() { 12 | echo "Usage: sh start.sh [start|stop|restart|status]" 13 | exit 1 14 | } 15 | 16 | #检查程序是否在运行 17 | is_exist(){ 18 | pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}'` 19 | #如果不存在返回1,存在返回0 20 | if [ -z "${pid}" ]; then 21 | return 1 22 | else 23 | return 0 24 | fi 25 | } 26 | 27 | #启动方法 28 | start(){ 29 | echo `java -version` 30 | is_exist 31 | if [ $? -eq 0 ]; then 32 | echo "${APP_NAME} is already running. pid=${pid}" 33 | else 34 | nohup java -Xms512M -Xmx512M -jar ${APP_NAME} --spring.profiles.active=pro >question-admin.out 2>&1 & --------------------------------------------------------------------------------