| @@ -0,0 +1,21 @@ | |||
| *.class | |||
| # Mobile Tools for Java (J2ME) | |||
| .mtj.tmp/ | |||
| # Package Files # | |||
| # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml | |||
| hs_err_pid* | |||
| /.idea/ | |||
| *.iml | |||
| target | |||
| */target | |||
| **/rebel.xml | |||
| **/.rebel.xml.bak | |||
| doc | |||
| *.log | |||
| @@ -0,0 +1,57 @@ | |||
| ## 项目结构 | |||
| * fumao-app | |||
| * 对外接口和WEB的配置项 | |||
| * fumao-common | |||
| * 一些常用的工具类 | |||
| * fumao-company | |||
| * 集团端代码 | |||
| * fumao-system | |||
| * 系统端代码 | |||
| * fumao-service | |||
| * controller里面调用, 聚合其他几个模块的代码 | |||
| ## jpa相关 | |||
| ### 快速查询 | |||
| ``` | |||
| @QueryItem(type = QueryType.Eq) 等等 | |||
| 用于快速开发查询接口 | |||
| QueryBuilder.build(条件对象) 返回 Predicate 可交给SpringData 查询 | |||
| ``` | |||
| ### 非外键原则 | |||
| ``` | |||
| @Fetch(FetchMode.JOIN) | |||
| @ManyToOne() | |||
| @JoinColumn(name = "本实体ID", referencedColumnName = "关联ID", insertable = false, updatable = false, foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT)) | |||
| @NotFound(action=NotFoundAction.IGNORE) | |||
| ``` | |||
| ## 权限 | |||
| ``` | |||
| 使用spring security | |||
| ``` | |||
| * 配置项 | |||
| * WebSecurityConfig | |||
| * 过滤器 | |||
| * SecurityFilter | |||
| * 注解 | |||
| * PreAuthorize(AuthRoles.xxxExp) | |||
| * 使用 | |||
| * 实现LoginUser接口 | |||
| * 调用JwtUtils.encode | |||
| * 方法或者类上面加PreAuthorize注解 | |||
| * 动态角色实现 AccessDecisionManager 接口 | |||
| ## 集团实例 | |||
| ``` | |||
| 新建集团的时候会手动跑Flyway方法, 创建一个新实例 | |||
| ``` | |||
| @@ -0,0 +1,62 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <project xmlns="http://maven.apache.org/POM/4.0.0" | |||
| xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||
| xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||
| <parent> | |||
| <artifactId>fumao</artifactId> | |||
| <groupId>com.aki</groupId> | |||
| <version>0.0.1-SNAPSHOT</version> | |||
| </parent> | |||
| <modelVersion>4.0.0</modelVersion> | |||
| <artifactId>fumao-app</artifactId> | |||
| <dependencies> | |||
| <dependency> | |||
| <groupId>org.springframework.boot</groupId> | |||
| <artifactId>spring-boot-starter-web</artifactId> | |||
| <exclusions> | |||
| <exclusion> | |||
| <groupId>org.springframework.boot</groupId> | |||
| <artifactId>spring-boot-starter-tomcat</artifactId> | |||
| </exclusion> | |||
| </exclusions> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>org.springframework.boot</groupId> | |||
| <artifactId>spring-boot-starter-undertow</artifactId> | |||
| </dependency> | |||
| <!--<dependency>--> | |||
| <!--<groupId>org.springframework.boot</groupId>--> | |||
| <!--<artifactId>spring-boot-starter-websocket</artifactId>--> | |||
| <!--</dependency>--> | |||
| <dependency> | |||
| <groupId>com.aki</groupId> | |||
| <artifactId>fumao-service</artifactId> | |||
| <version>${project.version}</version> | |||
| </dependency> | |||
| </dependencies> | |||
| <build> | |||
| <plugins> | |||
| <plugin> | |||
| <groupId>org.springframework.boot</groupId> | |||
| <artifactId>spring-boot-maven-plugin</artifactId> | |||
| <executions> | |||
| <execution> | |||
| <goals> | |||
| <goal>build-info</goal> | |||
| </goals> | |||
| </execution> | |||
| </executions> | |||
| <configuration> | |||
| <fork>true</fork> | |||
| <includeSystemScope>true</includeSystemScope> | |||
| </configuration> | |||
| </plugin> | |||
| </plugins> | |||
| </build> | |||
| </project> | |||
| @@ -0,0 +1,48 @@ | |||
| package com.chilunyc.fumao; | |||
| import com.chilunyc.fumao.common.config.ApplicationProperty; | |||
| import com.chilunyc.fumao.config.bean.MultiBeanNameGenerator; | |||
| import com.alibaba.fastjson.parser.ParserConfig; | |||
| import org.springframework.boot.autoconfigure.SpringBootApplication; | |||
| import org.springframework.boot.builder.SpringApplicationBuilder; | |||
| import org.springframework.boot.context.properties.EnableConfigurationProperties; | |||
| import org.springframework.boot.system.ApplicationPidFileWriter; | |||
| import org.springframework.boot.web.servlet.ServletComponentScan; | |||
| import org.springframework.context.ConfigurableApplicationContext; | |||
| import org.springframework.data.jpa.repository.config.EnableJpaAuditing; | |||
| import org.springframework.data.jpa.repository.config.EnableJpaRepositories; | |||
| import org.springframework.scheduling.annotation.EnableAsync; | |||
| import org.springframework.scheduling.annotation.EnableScheduling; | |||
| import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; | |||
| import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; | |||
| import org.springframework.transaction.annotation.EnableTransactionManagement; | |||
| /** | |||
| * | |||
| */ | |||
| @SpringBootApplication() | |||
| @EnableAsync | |||
| @EnableScheduling | |||
| @EnableJpaRepositories | |||
| @EnableJpaAuditing | |||
| @EnableTransactionManagement | |||
| @EnableWebSecurity | |||
| @EnableGlobalMethodSecurity( | |||
| prePostEnabled = true | |||
| ) | |||
| @ServletComponentScan() | |||
| @EnableConfigurationProperties(ApplicationProperty.class) | |||
| public class Application { | |||
| public static void main(String[] args) { | |||
| // | |||
| ParserConfig.getGlobalInstance().setAutoTypeSupport(true); | |||
| // | |||
| ConfigurableApplicationContext run = new SpringApplicationBuilder(Application.class) | |||
| .addCommandLineProperties(false) | |||
| .listeners(new ApplicationPidFileWriter("./app.pid")) | |||
| .beanNameGenerator(new MultiBeanNameGenerator()) | |||
| .run(args); | |||
| } | |||
| } | |||
| @@ -0,0 +1,104 @@ | |||
| package com.chilunyc.fumao.api.company; | |||
| import com.chilunyc.fumao.common.exception.SystemException; | |||
| import com.chilunyc.fumao.common.request.IdsRequest; | |||
| import com.chilunyc.fumao.common.response.JsonResponse; | |||
| import com.chilunyc.fumao.common.shiro.AuthRoles; | |||
| import com.chilunyc.fumao.company.model.Company; | |||
| import com.chilunyc.fumao.company.model.CompanyAdmin; | |||
| import com.chilunyc.fumao.company.request.companyAdmin.CompanyAdminEditRequest; | |||
| import com.chilunyc.fumao.company.request.companyAdmin.CompanyAdminPageRequest; | |||
| import com.chilunyc.fumao.company.service.CompanyAdminService; | |||
| import io.swagger.annotations.Api; | |||
| import io.swagger.annotations.ApiImplicitParam; | |||
| import io.swagger.annotations.ApiImplicitParams; | |||
| import io.swagger.annotations.ApiOperation; | |||
| import lombok.extern.log4j.Log4j; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.data.domain.Page; | |||
| import org.springframework.security.access.prepost.PreAuthorize; | |||
| import org.springframework.web.bind.annotation.*; | |||
| import javax.validation.Valid; | |||
| import java.util.List; | |||
| /** | |||
| * | |||
| */ | |||
| @Log4j | |||
| @Api(description = "集团管理员") | |||
| @RestController | |||
| @RequestMapping("/company/admin") | |||
| @PreAuthorize(AuthRoles.CompanyAdminExp) | |||
| class CompanyAdminController { | |||
| @Autowired | |||
| CompanyAdminService companyAdminService; | |||
| @ApiOperation(value = "分页") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "PageRequest") | |||
| }) | |||
| @RequestMapping(value = "/find", method = RequestMethod.POST) | |||
| JsonResponse<Page<CompanyAdmin>> page(CompanyAdmin companyAdmin, @RequestBody CompanyAdminPageRequest request) { | |||
| request.setCompanyId(companyAdmin.getCompanyId()); | |||
| Page<CompanyAdmin> page = companyAdminService.page(request); | |||
| return JsonResponse.success(page); | |||
| } | |||
| @ApiOperation(value = "详情") | |||
| @ApiImplicitParams({ | |||
| }) | |||
| @RequestMapping(value = "/find/{id}", method = RequestMethod.GET) | |||
| JsonResponse<CompanyAdmin> info(CompanyAdmin companyAdmin, @PathVariable Long id) { | |||
| CompanyAdmin companyAdminResponse = companyAdminService.findByCompanyId(id, companyAdmin.getCompanyId()); | |||
| return JsonResponse.success(companyAdminResponse); | |||
| } | |||
| @ApiOperation(value = "新增 | 编辑") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "CompanyAdmin") | |||
| }) | |||
| @RequestMapping(value = "/edit", method = RequestMethod.POST) | |||
| JsonResponse edit(CompanyAdmin companyAdmin, @RequestBody @Valid CompanyAdminEditRequest request) { | |||
| request.setCompanyId(companyAdmin.getCompanyId()); | |||
| companyAdminService.edit(request); | |||
| return JsonResponse.success(); | |||
| } | |||
| @ApiOperation(value = "删除") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "IdRequest") | |||
| }) | |||
| @RequestMapping(value = "/delete", method = RequestMethod.POST) | |||
| JsonResponse remove(CompanyAdmin companyAdmin, @RequestBody @Valid IdsRequest<Long> request) { | |||
| if (request.getIds().contains(companyAdmin.getId())){ | |||
| throw new SystemException("100001"); | |||
| } | |||
| companyAdminService.removeByCompanyId(request, companyAdmin.getCompanyId()); | |||
| return JsonResponse.success(); | |||
| } | |||
| @ApiOperation(value = "重置密码") | |||
| @ApiImplicitParams({ | |||
| }) | |||
| @RequestMapping(value = "/reset/password/{id}", method = RequestMethod.GET) | |||
| JsonResponse resetPassword(CompanyAdmin companyAdmin, @PathVariable Long id) { | |||
| companyAdminService.resetPassword(id, companyAdmin.getCompanyId()); | |||
| log.info(String.format("集团管理员[ %s ]重置密码 => [ %s ]", companyAdmin.getId(), id)); | |||
| return JsonResponse.success(); | |||
| } | |||
| @ApiOperation(value = "所有") | |||
| @ApiImplicitParams({ | |||
| }) | |||
| @RequestMapping(value = "/find/all", method = RequestMethod.GET) | |||
| JsonResponse<List<CompanyAdmin>> all(CompanyAdminPageRequest request) { | |||
| List<CompanyAdmin> result = companyAdminService.all(request); | |||
| return JsonResponse.success(result); | |||
| } | |||
| } | |||
| @@ -0,0 +1,54 @@ | |||
| package com.chilunyc.fumao.api.company; | |||
| import com.chilunyc.fumao.common.request.ChangePwdRequest; | |||
| import com.chilunyc.fumao.common.response.JsonResponse; | |||
| import com.chilunyc.fumao.common.sms.model.SmsType; | |||
| import com.chilunyc.fumao.common.sms.request.SmsSendRequest; | |||
| import com.chilunyc.fumao.common.sms.service.SmsService; | |||
| import io.swagger.annotations.Api; | |||
| import io.swagger.annotations.ApiImplicitParam; | |||
| import io.swagger.annotations.ApiImplicitParams; | |||
| import io.swagger.annotations.ApiOperation; | |||
| import lombok.extern.log4j.Log4j; | |||
| import org.apache.commons.lang3.RandomStringUtils; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.web.bind.annotation.RequestBody; | |||
| import org.springframework.web.bind.annotation.RequestMapping; | |||
| import org.springframework.web.bind.annotation.RequestMethod; | |||
| import org.springframework.web.bind.annotation.RestController; | |||
| import javax.validation.Valid; | |||
| /** | |||
| * | |||
| */ | |||
| @Log4j | |||
| @Api(description = "找回密码") | |||
| @RestController | |||
| @RequestMapping("/company/find/pwd") | |||
| class FindPwdController { | |||
| @Autowired | |||
| SmsService smsService; | |||
| @ApiOperation(value = "改密码") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "ChangePwdRequest") | |||
| }) | |||
| @RequestMapping(value = "/", method = RequestMethod.POST) | |||
| JsonResponse login(@RequestBody @Valid ChangePwdRequest request) { | |||
| return JsonResponse.success(); | |||
| } | |||
| @ApiOperation(value = "改密码发短信") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "SmsSendRequest") | |||
| }) | |||
| @RequestMapping(value = "/send", method = RequestMethod.POST) | |||
| JsonResponse login(@RequestBody @Valid SmsSendRequest request) { | |||
| request.setContent(RandomStringUtils.randomNumeric(4)); | |||
| request.setType(SmsType.CustomerFindPwd); | |||
| smsService.send(request); | |||
| return JsonResponse.success(); | |||
| } | |||
| } | |||
| @@ -0,0 +1,54 @@ | |||
| package com.chilunyc.fumao.api.company; | |||
| import com.chilunyc.fumao.common.request.LoginRequest; | |||
| import com.chilunyc.fumao.common.request.LoginRequestWithCaptcha; | |||
| import com.chilunyc.fumao.common.response.JsonResponse; | |||
| import com.chilunyc.fumao.common.util.jwt.JwtUtils; | |||
| import com.chilunyc.fumao.company.model.CompanyAdmin; | |||
| import com.chilunyc.fumao.company.service.CompanyAdminService; | |||
| import com.chilunyc.fumao.company.service.CompanyService; | |||
| import io.swagger.annotations.Api; | |||
| import io.swagger.annotations.ApiImplicitParam; | |||
| import io.swagger.annotations.ApiImplicitParams; | |||
| import io.swagger.annotations.ApiOperation; | |||
| import lombok.extern.log4j.Log4j; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.web.bind.annotation.RequestBody; | |||
| import org.springframework.web.bind.annotation.RequestMapping; | |||
| import org.springframework.web.bind.annotation.RequestMethod; | |||
| import org.springframework.web.bind.annotation.RestController; | |||
| import javax.validation.Valid; | |||
| /** | |||
| * | |||
| */ | |||
| @Log4j | |||
| @Api(description = "登录登出") | |||
| @RestController | |||
| @RequestMapping("/company") | |||
| class LoginLogoutController { | |||
| @Autowired | |||
| CompanyAdminService companyAdminService; | |||
| @ApiOperation(value = "登录") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "LoginRequest") | |||
| }) | |||
| @RequestMapping(value = "/login", method = RequestMethod.POST) | |||
| JsonResponse login(@RequestBody @Valid LoginRequest request) { | |||
| CompanyAdmin companyAdmin = companyAdminService.login(request); | |||
| return JsonResponse.success( | |||
| JwtUtils.encode(JwtUtils.T.Company, companyAdmin) | |||
| ); | |||
| } | |||
| @ApiOperation(value = "登出") | |||
| @ApiImplicitParams({ | |||
| }) | |||
| @RequestMapping(value = "/logout", method = RequestMethod.GET) | |||
| JsonResponse logout() { | |||
| return JsonResponse.success(); | |||
| } | |||
| } | |||
| @@ -0,0 +1,91 @@ | |||
| package com.chilunyc.fumao.api.company; | |||
| import com.chilunyc.fumao.common.request.IdsRequest; | |||
| import com.chilunyc.fumao.common.response.JsonResponse; | |||
| import com.chilunyc.fumao.common.shiro.AuthRoles; | |||
| import com.chilunyc.fumao.company.model.CompanyAdmin; | |||
| import com.chilunyc.fumao.company.model.PlaceAdmin; | |||
| import com.chilunyc.fumao.company.model.enums.PlaceAdminType; | |||
| import com.chilunyc.fumao.company.request.placeAdmin.PlaceAdminEditRequest; | |||
| import com.chilunyc.fumao.company.request.placeAdmin.PlaceAdminPageRequest; | |||
| import com.chilunyc.fumao.company.service.PlaceAdminService; | |||
| import io.swagger.annotations.Api; | |||
| import io.swagger.annotations.ApiImplicitParam; | |||
| import io.swagger.annotations.ApiImplicitParams; | |||
| import io.swagger.annotations.ApiOperation; | |||
| import lombok.extern.log4j.Log4j; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.data.domain.Page; | |||
| import org.springframework.security.access.prepost.PreAuthorize; | |||
| import org.springframework.web.bind.annotation.*; | |||
| import javax.validation.Valid; | |||
| /** | |||
| * | |||
| */ | |||
| @Log4j | |||
| @Api(description = "商场管理员") | |||
| @RestController | |||
| @RequestMapping("/company/place/admin") | |||
| @PreAuthorize(AuthRoles.CompanyAdminExp) | |||
| class PlaceAdminController { | |||
| @Autowired | |||
| PlaceAdminService placeAdminService; | |||
| @ApiOperation(value = "分页") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "PageRequest") | |||
| }) | |||
| @RequestMapping(value = "/find", method = RequestMethod.POST) | |||
| JsonResponse<Page<PlaceAdmin>> page(CompanyAdmin companyAdmin, @RequestBody PlaceAdminPageRequest request) { | |||
| request.setCompanyId(companyAdmin.getCompanyId()); | |||
| Page<PlaceAdmin> page = placeAdminService.page(request); | |||
| return JsonResponse.success(page); | |||
| } | |||
| @ApiOperation(value = "详情") | |||
| @ApiImplicitParams({ | |||
| }) | |||
| @RequestMapping(value = "/find/{id}", method = RequestMethod.GET) | |||
| JsonResponse<PlaceAdmin> info(@PathVariable Long id) { | |||
| PlaceAdmin placeAdminResponse = placeAdminService.find(id); | |||
| return JsonResponse.success(placeAdminResponse); | |||
| } | |||
| @ApiOperation(value = "新增 | 编辑") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "PlaceAdmin") | |||
| }) | |||
| @RequestMapping(value = "/edit", method = RequestMethod.POST) | |||
| JsonResponse edit(CompanyAdmin companyAdmin, @RequestBody @Valid PlaceAdminEditRequest request) { | |||
| request.setPlaceAdminType(PlaceAdminType.Manager); | |||
| request.setCompanyId(companyAdmin.getCompanyId()); | |||
| placeAdminService.edit(request); | |||
| return JsonResponse.success(); | |||
| } | |||
| @ApiOperation(value = "删除") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "IdRequest") | |||
| }) | |||
| @RequestMapping(value = "/delete", method = RequestMethod.POST) | |||
| JsonResponse remove(@RequestBody @Valid IdsRequest<Long> request) { | |||
| placeAdminService.remove(request); | |||
| return JsonResponse.success(); | |||
| } | |||
| @ApiOperation(value = "重置密码") | |||
| @ApiImplicitParams({ | |||
| }) | |||
| @RequestMapping(value = "/reset/password/{id}", method = RequestMethod.GET) | |||
| JsonResponse resetPassword(CompanyAdmin companyAdmin, @PathVariable Long id) { | |||
| placeAdminService.resetPassword(id, companyAdmin.getCompanyId()); | |||
| log.info(String.format("商场管理员[ %s ]重置密码 => [ %s ]", companyAdmin.getId(), id)); | |||
| return JsonResponse.success(); | |||
| } | |||
| } | |||
| @@ -0,0 +1,87 @@ | |||
| package com.chilunyc.fumao.api.company; | |||
| import com.chilunyc.fumao.common.response.JsonResponse; | |||
| import com.chilunyc.fumao.common.shiro.AuthRoles; | |||
| import com.chilunyc.fumao.company.model.Company; | |||
| import com.chilunyc.fumao.company.model.CompanyAdmin; | |||
| import com.chilunyc.fumao.company.model.Place; | |||
| import com.chilunyc.fumao.company.request.place.PlacePageRequest; | |||
| import com.chilunyc.fumao.company.service.PlaceService; | |||
| import io.swagger.annotations.Api; | |||
| import io.swagger.annotations.ApiImplicitParam; | |||
| import io.swagger.annotations.ApiImplicitParams; | |||
| import io.swagger.annotations.ApiOperation; | |||
| import lombok.extern.log4j.Log4j; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.data.domain.Page; | |||
| import org.springframework.security.access.prepost.PreAuthorize; | |||
| import org.springframework.web.bind.annotation.*; | |||
| import java.util.List; | |||
| /** | |||
| * | |||
| */ | |||
| @Log4j | |||
| @Api(description = "商场") | |||
| @RestController | |||
| @RequestMapping("/company/place") | |||
| @PreAuthorize(AuthRoles.CompanyAdminExp) | |||
| class PlaceController { | |||
| @Autowired | |||
| PlaceService placeService; | |||
| @ApiOperation(value = "分页") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "PageRequest") | |||
| }) | |||
| @RequestMapping(value = "/find", method = RequestMethod.POST) | |||
| JsonResponse<Page<Place>> page(CompanyAdmin companyAdmin, @RequestBody PlacePageRequest request) { | |||
| request.setCompanyId(companyAdmin.getCompanyId()); | |||
| Page<Place> page = placeService.page(request); | |||
| return JsonResponse.success(page); | |||
| } | |||
| @ApiOperation(value = "详情") | |||
| @ApiImplicitParams({ | |||
| }) | |||
| @RequestMapping(value = "/find/{id}", method = RequestMethod.GET) | |||
| JsonResponse<Place> info(@PathVariable Long id) { | |||
| Place placeResponse = placeService.find(id); | |||
| return JsonResponse.success(placeResponse); | |||
| } | |||
| // @ApiOperation(value = "新增 | 编辑") | |||
| // @ApiImplicitParams({ | |||
| // @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "Place") | |||
| // }) | |||
| // @RequestMapping(value = "/edit", method = RequestMethod.POST) | |||
| // JsonResponse edit(@RequestBody @Valid PlaceEditRequest request) { | |||
| // marketService.edit(request); | |||
| // return JsonResponse.success(); | |||
| // } | |||
| // | |||
| // @ApiOperation(value = "删除") | |||
| // @ApiImplicitParams({ | |||
| // @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "IdRequest") | |||
| // }) | |||
| // @RequestMapping(value = "/delete", method = RequestMethod.POST) | |||
| // JsonResponse remove(@RequestBody @Valid IdsRequest request) { | |||
| // marketService.remove(request); | |||
| // return JsonResponse.success(); | |||
| // } | |||
| @ApiOperation(value = "所有") | |||
| @ApiImplicitParams({ | |||
| }) | |||
| @RequestMapping(value = "/find/all", method = RequestMethod.GET) | |||
| JsonResponse<List<Place>> all(CompanyAdmin companyAdmin, PlacePageRequest request) { | |||
| request.setCompanyId(companyAdmin.getCompanyId()); | |||
| List<Place> result = placeService.all(request); | |||
| return JsonResponse.success(result); | |||
| } | |||
| } | |||
| @@ -0,0 +1,44 @@ | |||
| package com.chilunyc.fumao.api.company; | |||
| import com.chilunyc.fumao.common.request.IdsRequest; | |||
| import com.chilunyc.fumao.common.response.JsonResponse; | |||
| import com.chilunyc.fumao.company.model.ShopApply; | |||
| import com.chilunyc.fumao.company.request.shopApply.ShopApplyEditRequest; | |||
| import com.chilunyc.fumao.company.request.shopApply.ShopApplyPageRequest; | |||
| import com.chilunyc.fumao.company.service.ShopApplyService; | |||
| import io.swagger.annotations.Api; | |||
| import io.swagger.annotations.ApiImplicitParam; | |||
| import io.swagger.annotations.ApiImplicitParams; | |||
| import io.swagger.annotations.ApiOperation; | |||
| import lombok.extern.log4j.Log4j; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.data.domain.Page; | |||
| import org.springframework.web.bind.annotation.*; | |||
| import javax.validation.Valid; | |||
| /** | |||
| * | |||
| */ | |||
| @Log4j | |||
| @Api(description = "商铺申请") | |||
| @RestController | |||
| @RequestMapping("/company/shop/apply") | |||
| class ShopApplyController { | |||
| @Autowired | |||
| ShopApplyService shopApplyService; | |||
| @ApiOperation(value = "新增 | 编辑") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "ShopApply") | |||
| }) | |||
| @RequestMapping(value = "/edit", method = RequestMethod.POST) | |||
| JsonResponse edit(@RequestBody @Valid ShopApplyEditRequest request) { | |||
| shopApplyService.edit(request); | |||
| return JsonResponse.success(); | |||
| } | |||
| } | |||
| @@ -0,0 +1,81 @@ | |||
| package com.chilunyc.fumao.api.customer; | |||
| import io.swagger.annotations.Api; | |||
| import org.springframework.web.bind.annotation.RequestMapping; | |||
| import org.springframework.web.bind.annotation.RestController; | |||
| /** | |||
| * 80347471@qq.com | |||
| */ | |||
| @Api("小程序接口") | |||
| @RestController | |||
| @RequestMapping("/customer/wx/ma") | |||
| public class WxMaController { | |||
| // @Autowired | |||
| // WxMaService wxMaService; | |||
| // | |||
| // @Autowired | |||
| // StringRedisTemplate redisTemplate; | |||
| // | |||
| // /** | |||
| // * 转换code | |||
| // */ | |||
| // @RequestMapping(value = "/code", method = RequestMethod.GET) | |||
| // public JsonResponse code(String code) throws WxErrorException { | |||
| // if (StringUtils.isBlank(code)) { | |||
| // return JsonResponse.fail("参数错误"); | |||
| // } | |||
| // WxMaJscode2SessionResult session = this.wxMaService.getUserService().getSessionInfo(code); | |||
| // redisTemplate.boundValueOps(String.format("%s_session", session.getOpenid())).set(session.getSessionKey()); | |||
| // return JsonResponse.success( | |||
| // MapBuilder | |||
| // .builder() | |||
| // .put("openId", session.getOpenid()) | |||
| // .getMap() | |||
| // ); | |||
| // } | |||
| // | |||
| // /** | |||
| // * 转换info | |||
| // */ | |||
| // @RequestMapping(value = "/info", method = RequestMethod.POST) | |||
| // public JsonResponse info(@RequestBody @Valid WxMaUserInfoRequest request) throws WxErrorException { | |||
| // String sessionKey = redisTemplate.boundValueOps(String.format("%s_session", request.getOpenId())).get(); | |||
| // if (StringUtils.isBlank(sessionKey)) { | |||
| // throw new SystemException("000008"); | |||
| // } | |||
| // | |||
| // | |||
| // // 用户信息校验 | |||
| // if (!this.wxMaService.getUserService().checkUserInfo(sessionKey, request.getRawData(), request.getSignature())) { | |||
| // return JsonResponse.fail("校验失败"); | |||
| // } | |||
| // | |||
| // // 解密用户信息 | |||
| // WxMaUserInfo userInfo = this.wxMaService.getUserService().getUserInfo(sessionKey, request.getEncryptedData(), request.getIv()); | |||
| // | |||
| // return JsonResponse.success(); | |||
| // } | |||
| // | |||
| // /** | |||
| // * 转换number | |||
| // */ | |||
| // @RequestMapping(value = "/number", method = RequestMethod.POST) | |||
| // public JsonResponse number(@RequestBody @Valid WxMaUserInfoRequest request) throws WxErrorException { | |||
| // String sessionKey = redisTemplate.boundValueOps(String.format("%s_session", request.getOpenId())).get(); | |||
| // if (StringUtils.isBlank(sessionKey)) { | |||
| // throw new SystemException("000008"); | |||
| // } | |||
| // | |||
| // // 用户信息校验 | |||
| // if (!this.wxMaService.getUserService().checkUserInfo(sessionKey, request.getRawData(), request.getSignature())) { | |||
| // return JsonResponse.fail("校验失败"); | |||
| // } | |||
| // | |||
| // // 解密用户信息 | |||
| // WxMaPhoneNumberInfo phoneNoInfo = this.wxMaService.getUserService().getPhoneNoInfo(sessionKey, request.getEncryptedData(), request.getIv()); | |||
| // return JsonResponse.success(); | |||
| // } | |||
| } | |||
| @@ -0,0 +1,49 @@ | |||
| package com.chilunyc.fumao.api.market; | |||
| import com.chilunyc.fumao.common.request.LoginRequest; | |||
| import com.chilunyc.fumao.common.request.LoginRequestWithCaptcha; | |||
| import com.chilunyc.fumao.common.response.JsonResponse; | |||
| import com.chilunyc.fumao.company.service.PlaceAdminService; | |||
| import io.swagger.annotations.Api; | |||
| import io.swagger.annotations.ApiImplicitParam; | |||
| import io.swagger.annotations.ApiImplicitParams; | |||
| import io.swagger.annotations.ApiOperation; | |||
| import lombok.extern.log4j.Log4j; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.web.bind.annotation.RequestBody; | |||
| import org.springframework.web.bind.annotation.RequestMapping; | |||
| import org.springframework.web.bind.annotation.RequestMethod; | |||
| import org.springframework.web.bind.annotation.RestController; | |||
| import javax.validation.Valid; | |||
| /** | |||
| * | |||
| */ | |||
| @Log4j | |||
| @Api(description = "登录登出") | |||
| @RestController | |||
| @RequestMapping("/place") | |||
| class LoginLogoutController { | |||
| @Autowired | |||
| PlaceAdminService placeAdminService; | |||
| @ApiOperation(value = "登录") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "LoginRequest") | |||
| }) | |||
| @RequestMapping(value = "/login", method = RequestMethod.POST) | |||
| JsonResponse login(@RequestBody @Valid LoginRequest request) { | |||
| placeAdminService.login(request); | |||
| return null; | |||
| } | |||
| @ApiOperation(value = "登出") | |||
| @ApiImplicitParams({ | |||
| }) | |||
| @RequestMapping(value = "/logout", method = RequestMethod.GET) | |||
| JsonResponse logout() { | |||
| return JsonResponse.success(); | |||
| } | |||
| } | |||
| @@ -0,0 +1,81 @@ | |||
| package com.chilunyc.fumao.api.merchant; | |||
| import io.swagger.annotations.Api; | |||
| import org.springframework.web.bind.annotation.RequestMapping; | |||
| import org.springframework.web.bind.annotation.RestController; | |||
| /** | |||
| * 80347471@qq.com | |||
| */ | |||
| @Api("小程序接口") | |||
| @RestController | |||
| @RequestMapping("/merchant/wx/ma") | |||
| public class WxMaController { | |||
| // @Autowired | |||
| // WxMaService wxMaService; | |||
| // | |||
| // @Autowired | |||
| // StringRedisTemplate redisTemplate; | |||
| // | |||
| // /** | |||
| // * 转换code | |||
| // */ | |||
| // @RequestMapping(value = "/code", method = RequestMethod.GET) | |||
| // public JsonResponse code(String code) throws WxErrorException { | |||
| // if (StringUtils.isBlank(code)) { | |||
| // return JsonResponse.fail("参数错误"); | |||
| // } | |||
| // WxMaJscode2SessionResult session = this.wxMaService.getUserService().getSessionInfo(code); | |||
| // redisTemplate.boundValueOps(String.format("%s_session", session.getOpenid())).set(session.getSessionKey()); | |||
| // return JsonResponse.success( | |||
| // MapBuilder | |||
| // .builder() | |||
| // .put("openId", session.getOpenid()) | |||
| // .getMap() | |||
| // ); | |||
| // } | |||
| // | |||
| // /** | |||
| // * 转换info | |||
| // */ | |||
| // @RequestMapping(value = "/info", method = RequestMethod.POST) | |||
| // public JsonResponse info(@RequestBody @Valid WxMaUserInfoRequest request) throws WxErrorException { | |||
| // String sessionKey = redisTemplate.boundValueOps(String.format("%s_session", request.getOpenId())).get(); | |||
| // if (StringUtils.isBlank(sessionKey)) { | |||
| // throw new SystemException("000008"); | |||
| // } | |||
| // | |||
| // | |||
| // // 用户信息校验 | |||
| // if (!this.wxMaService.getUserService().checkUserInfo(sessionKey, request.getRawData(), request.getSignature())) { | |||
| // return JsonResponse.fail("校验失败"); | |||
| // } | |||
| // | |||
| // // 解密用户信息 | |||
| // WxMaUserInfo userInfo = this.wxMaService.getUserService().getUserInfo(sessionKey, request.getEncryptedData(), request.getIv()); | |||
| // | |||
| // return JsonResponse.success(); | |||
| // } | |||
| // | |||
| // /** | |||
| // * 转换number | |||
| // */ | |||
| // @RequestMapping(value = "/number", method = RequestMethod.POST) | |||
| // public JsonResponse number(@RequestBody @Valid WxMaUserInfoRequest request) throws WxErrorException { | |||
| // String sessionKey = redisTemplate.boundValueOps(String.format("%s_session", request.getOpenId())).get(); | |||
| // if (StringUtils.isBlank(sessionKey)) { | |||
| // throw new SystemException("000008"); | |||
| // } | |||
| // | |||
| // // 用户信息校验 | |||
| // if (!this.wxMaService.getUserService().checkUserInfo(sessionKey, request.getRawData(), request.getSignature())) { | |||
| // return JsonResponse.fail("校验失败"); | |||
| // } | |||
| // | |||
| // // 解密用户信息 | |||
| // WxMaPhoneNumberInfo phoneNoInfo = this.wxMaService.getUserService().getPhoneNoInfo(sessionKey, request.getEncryptedData(), request.getIv()); | |||
| // return JsonResponse.success(); | |||
| // } | |||
| } | |||
| @@ -0,0 +1,86 @@ | |||
| package com.chilunyc.fumao.api.system; | |||
| import com.chilunyc.fumao.common.request.IdsRequest; | |||
| import com.chilunyc.fumao.common.response.JsonResponse; | |||
| import com.chilunyc.fumao.common.shiro.AuthRoles; | |||
| import com.chilunyc.fumao.company.model.CompanyAdmin; | |||
| import com.chilunyc.fumao.company.request.companyAdmin.CompanyAdminEditRequest; | |||
| import com.chilunyc.fumao.company.request.companyAdmin.CompanyAdminPageRequest; | |||
| import com.chilunyc.fumao.company.service.CompanyAdminService; | |||
| import io.swagger.annotations.Api; | |||
| import io.swagger.annotations.ApiImplicitParam; | |||
| import io.swagger.annotations.ApiImplicitParams; | |||
| import io.swagger.annotations.ApiOperation; | |||
| import lombok.extern.log4j.Log4j; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.data.domain.Page; | |||
| import org.springframework.security.access.prepost.PreAuthorize; | |||
| import org.springframework.web.bind.annotation.*; | |||
| import javax.validation.Valid; | |||
| import java.util.List; | |||
| /** | |||
| * | |||
| */ | |||
| @Log4j | |||
| @Api(description = "集团管理员") | |||
| @RestController | |||
| @RequestMapping("/system/company/admin") | |||
| @PreAuthorize(AuthRoles.SystemAdminExp) | |||
| class CompanyAdminController { | |||
| @Autowired | |||
| CompanyAdminService companyAdminService; | |||
| @ApiOperation(value = "分页") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "PageRequest") | |||
| }) | |||
| @RequestMapping(value = "/find", method = RequestMethod.POST) | |||
| JsonResponse<Page<CompanyAdmin>> page(@RequestBody CompanyAdminPageRequest request) { | |||
| Page<CompanyAdmin> page = companyAdminService.page(request); | |||
| return JsonResponse.success(page); | |||
| } | |||
| @ApiOperation(value = "详情") | |||
| @ApiImplicitParams({ | |||
| }) | |||
| @RequestMapping(value = "/find/{id}", method = RequestMethod.GET) | |||
| JsonResponse<CompanyAdmin> info(@PathVariable Long id) { | |||
| CompanyAdmin companyAdminResponse = companyAdminService.find(id); | |||
| return JsonResponse.success(companyAdminResponse); | |||
| } | |||
| @ApiOperation(value = "新增 | 编辑") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "CompanyAdmin") | |||
| }) | |||
| @RequestMapping(value = "/edit", method = RequestMethod.POST) | |||
| JsonResponse edit(@RequestBody @Valid CompanyAdminEditRequest request) { | |||
| companyAdminService.edit(request); | |||
| return JsonResponse.success(); | |||
| } | |||
| @ApiOperation(value = "删除") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "IdRequest") | |||
| }) | |||
| @RequestMapping(value = "/delete", method = RequestMethod.POST) | |||
| JsonResponse remove(@RequestBody @Valid IdsRequest<Long> request) { | |||
| companyAdminService.remove(request); | |||
| return JsonResponse.success(); | |||
| } | |||
| @ApiOperation(value = "所有") | |||
| @ApiImplicitParams({ | |||
| }) | |||
| @RequestMapping(value = "/find/all", method = RequestMethod.GET) | |||
| JsonResponse<List<CompanyAdmin>> all(CompanyAdminPageRequest request) { | |||
| List<CompanyAdmin> result = companyAdminService.all(request); | |||
| return JsonResponse.success(result); | |||
| } | |||
| } | |||
| @@ -0,0 +1,86 @@ | |||
| package com.chilunyc.fumao.api.system; | |||
| import com.chilunyc.fumao.common.request.IdsRequest; | |||
| import com.chilunyc.fumao.common.response.JsonResponse; | |||
| import com.chilunyc.fumao.common.shiro.AuthRoles; | |||
| import com.chilunyc.fumao.company.model.Company; | |||
| import com.chilunyc.fumao.company.request.company.CompanyEditRequest; | |||
| import com.chilunyc.fumao.company.request.company.CompanyPageRequest; | |||
| import com.chilunyc.fumao.company.service.CompanyService; | |||
| import io.swagger.annotations.Api; | |||
| import io.swagger.annotations.ApiImplicitParam; | |||
| import io.swagger.annotations.ApiImplicitParams; | |||
| import io.swagger.annotations.ApiOperation; | |||
| import lombok.extern.log4j.Log4j; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.data.domain.Page; | |||
| import org.springframework.security.access.prepost.PreAuthorize; | |||
| import org.springframework.web.bind.annotation.*; | |||
| import javax.validation.Valid; | |||
| import java.util.List; | |||
| /** | |||
| * | |||
| */ | |||
| @Log4j | |||
| @Api(description = "集团") | |||
| @RestController | |||
| @RequestMapping("/system/company") | |||
| @PreAuthorize(AuthRoles.SystemAdminExp) | |||
| class CompanyController { | |||
| @Autowired | |||
| CompanyService companyService; | |||
| @ApiOperation(value = "分页") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "PageRequest") | |||
| }) | |||
| @RequestMapping(value = "/find", method = RequestMethod.POST) | |||
| JsonResponse<Page<Company>> page(@RequestBody CompanyPageRequest request) { | |||
| Page<Company> page = companyService.page(request); | |||
| return JsonResponse.success(page); | |||
| } | |||
| @ApiOperation(value = "详情") | |||
| @ApiImplicitParams({ | |||
| }) | |||
| @RequestMapping(value = "/find/{id}", method = RequestMethod.GET) | |||
| JsonResponse<Company> info(@PathVariable Long id) { | |||
| Company companyResponse = companyService.find(id); | |||
| return JsonResponse.success(companyResponse); | |||
| } | |||
| @ApiOperation(value = "新增 | 编辑") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "Company") | |||
| }) | |||
| @RequestMapping(value = "/edit", method = RequestMethod.POST) | |||
| JsonResponse edit(@RequestBody @Valid CompanyEditRequest request) { | |||
| Company edit = companyService.edit(request); | |||
| return JsonResponse.success(edit); | |||
| } | |||
| @ApiOperation(value = "删除") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "IdRequest") | |||
| }) | |||
| @RequestMapping(value = "/delete", method = RequestMethod.POST) | |||
| JsonResponse remove(@RequestBody @Valid IdsRequest<Long> request) { | |||
| companyService.remove(request); | |||
| return JsonResponse.success(); | |||
| } | |||
| @ApiOperation(value = "所有") | |||
| @ApiImplicitParams({ | |||
| }) | |||
| @RequestMapping(value = "/find/all", method = RequestMethod.GET) | |||
| JsonResponse<List<Company>> all(CompanyPageRequest request) { | |||
| List<Company> result = companyService.all(request); | |||
| return JsonResponse.success(result); | |||
| } | |||
| } | |||
| @@ -0,0 +1,54 @@ | |||
| package com.chilunyc.fumao.api.system; | |||
| import com.chilunyc.fumao.common.request.ChangePwdRequest; | |||
| import com.chilunyc.fumao.common.response.JsonResponse; | |||
| import com.chilunyc.fumao.common.sms.model.SmsType; | |||
| import com.chilunyc.fumao.common.sms.request.SmsSendRequest; | |||
| import com.chilunyc.fumao.common.sms.service.SmsService; | |||
| import io.swagger.annotations.Api; | |||
| import io.swagger.annotations.ApiImplicitParam; | |||
| import io.swagger.annotations.ApiImplicitParams; | |||
| import io.swagger.annotations.ApiOperation; | |||
| import lombok.extern.log4j.Log4j; | |||
| import org.apache.commons.lang3.RandomStringUtils; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.web.bind.annotation.RequestBody; | |||
| import org.springframework.web.bind.annotation.RequestMapping; | |||
| import org.springframework.web.bind.annotation.RequestMethod; | |||
| import org.springframework.web.bind.annotation.RestController; | |||
| import javax.validation.Valid; | |||
| /** | |||
| * | |||
| */ | |||
| @Log4j | |||
| @Api(description = "找回密码") | |||
| @RestController | |||
| @RequestMapping("/system/find/pwd") | |||
| class FindPwdController { | |||
| @Autowired | |||
| SmsService smsService; | |||
| @ApiOperation(value = "改密码") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "ChangePwdRequest") | |||
| }) | |||
| @RequestMapping(value = "/", method = RequestMethod.POST) | |||
| JsonResponse login(@RequestBody @Valid ChangePwdRequest request) { | |||
| return JsonResponse.success(); | |||
| } | |||
| @ApiOperation(value = "改密码发短信") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "SmsSendRequest") | |||
| }) | |||
| @RequestMapping(value = "/send", method = RequestMethod.POST) | |||
| JsonResponse login(@RequestBody @Valid SmsSendRequest request) { | |||
| request.setContent(RandomStringUtils.randomNumeric(4)); | |||
| request.setType(SmsType.CustomerFindPwd); | |||
| smsService.send(request); | |||
| return JsonResponse.success(); | |||
| } | |||
| } | |||
| @@ -0,0 +1,42 @@ | |||
| package com.chilunyc.fumao.api.system; | |||
| import com.chilunyc.fumao.common.lbs.request.LBSPoiRequest; | |||
| import com.chilunyc.fumao.common.lbs.service.LBSService; | |||
| import com.chilunyc.fumao.common.response.JsonResponse; | |||
| import com.chilunyc.fumao.common.shiro.AuthRoles; | |||
| import io.swagger.annotations.Api; | |||
| import io.swagger.annotations.ApiImplicitParam; | |||
| import io.swagger.annotations.ApiImplicitParams; | |||
| import io.swagger.annotations.ApiOperation; | |||
| import lombok.extern.log4j.Log4j; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.security.access.prepost.PreAuthorize; | |||
| import org.springframework.web.bind.annotation.RequestBody; | |||
| import org.springframework.web.bind.annotation.RequestMapping; | |||
| import org.springframework.web.bind.annotation.RequestMethod; | |||
| import org.springframework.web.bind.annotation.RestController; | |||
| import javax.validation.Valid; | |||
| /** | |||
| * | |||
| */ | |||
| @Log4j | |||
| @Api(description = "登录登出") | |||
| @RestController | |||
| @RequestMapping("/system/lbs") | |||
| @PreAuthorize(AuthRoles.SystemAdminExp) | |||
| class LBSController { | |||
| @Autowired | |||
| LBSService lbsService; | |||
| @ApiOperation(value = "登录") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "LoginRequest") | |||
| }) | |||
| @RequestMapping(value = "/poi/find", method = RequestMethod.POST) | |||
| JsonResponse login(@RequestBody @Valid LBSPoiRequest request) { | |||
| return JsonResponse.success(lbsService.findPoi(request)); | |||
| } | |||
| } | |||
| @@ -0,0 +1,52 @@ | |||
| package com.chilunyc.fumao.api.system; | |||
| import com.chilunyc.fumao.common.request.LoginRequest; | |||
| import com.chilunyc.fumao.common.response.JsonResponse; | |||
| import com.chilunyc.fumao.common.util.jwt.JwtUtils; | |||
| import com.chilunyc.fumao.system.model.SystemAdmin; | |||
| import com.chilunyc.fumao.system.service.SystemAdminService; | |||
| import io.swagger.annotations.Api; | |||
| import io.swagger.annotations.ApiImplicitParam; | |||
| import io.swagger.annotations.ApiImplicitParams; | |||
| import io.swagger.annotations.ApiOperation; | |||
| import lombok.extern.log4j.Log4j; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.web.bind.annotation.RequestBody; | |||
| import org.springframework.web.bind.annotation.RequestMapping; | |||
| import org.springframework.web.bind.annotation.RequestMethod; | |||
| import org.springframework.web.bind.annotation.RestController; | |||
| import javax.validation.Valid; | |||
| /** | |||
| * | |||
| */ | |||
| @Log4j | |||
| @Api(description = "登录登出") | |||
| @RestController | |||
| @RequestMapping("/system") | |||
| class LoginLogoutController { | |||
| @Autowired | |||
| SystemAdminService systemAdminService; | |||
| @ApiOperation(value = "登录") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "LoginRequest") | |||
| }) | |||
| @RequestMapping(value = "/login", method = RequestMethod.POST) | |||
| JsonResponse login(@RequestBody @Valid LoginRequest request) { | |||
| SystemAdmin systemAdmin = systemAdminService.login(request); | |||
| return JsonResponse.success( | |||
| JwtUtils.encode(JwtUtils.T.System, systemAdmin) | |||
| ); | |||
| } | |||
| @ApiOperation(value = "登出") | |||
| @ApiImplicitParams({ | |||
| }) | |||
| @RequestMapping(value = "/logout", method = RequestMethod.GET) | |||
| JsonResponse logout() { | |||
| return JsonResponse.success(); | |||
| } | |||
| } | |||
| @@ -0,0 +1,79 @@ | |||
| package com.chilunyc.fumao.api.system; | |||
| import com.chilunyc.fumao.common.request.IdsRequest; | |||
| import com.chilunyc.fumao.common.response.JsonResponse; | |||
| import com.chilunyc.fumao.common.shiro.AuthRoles; | |||
| import com.chilunyc.fumao.company.model.PlaceAdmin; | |||
| import com.chilunyc.fumao.company.model.enums.PlaceAdminType; | |||
| import com.chilunyc.fumao.company.request.placeAdmin.PlaceAdminEditRequest; | |||
| import com.chilunyc.fumao.company.request.placeAdmin.PlaceAdminPageRequest; | |||
| import com.chilunyc.fumao.company.service.PlaceAdminService; | |||
| import io.swagger.annotations.Api; | |||
| import io.swagger.annotations.ApiImplicitParam; | |||
| import io.swagger.annotations.ApiImplicitParams; | |||
| import io.swagger.annotations.ApiOperation; | |||
| import lombok.extern.log4j.Log4j; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.data.domain.Page; | |||
| import org.springframework.security.access.prepost.PreAuthorize; | |||
| import org.springframework.web.bind.annotation.*; | |||
| import javax.validation.Valid; | |||
| /** | |||
| * | |||
| */ | |||
| @Log4j | |||
| @Api(description = "商场管理员") | |||
| @RestController | |||
| @RequestMapping("/system/place/admin") | |||
| @PreAuthorize(AuthRoles.SystemAdminExp) | |||
| class PlaceAdminController { | |||
| @Autowired | |||
| PlaceAdminService placeAdminService; | |||
| @ApiOperation(value = "分页") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "PageRequest") | |||
| }) | |||
| @RequestMapping(value = "/find", method = RequestMethod.POST) | |||
| JsonResponse<Page<PlaceAdmin>> page(@RequestBody PlaceAdminPageRequest request) { | |||
| Page<PlaceAdmin> page = placeAdminService.page(request); | |||
| return JsonResponse.success(page); | |||
| } | |||
| @ApiOperation(value = "详情") | |||
| @ApiImplicitParams({ | |||
| }) | |||
| @RequestMapping(value = "/find/{id}", method = RequestMethod.GET) | |||
| JsonResponse<PlaceAdmin> info(@PathVariable Long id) { | |||
| PlaceAdmin placeAdminResponse = placeAdminService.find(id); | |||
| return JsonResponse.success(placeAdminResponse); | |||
| } | |||
| @ApiOperation(value = "新增 | 编辑") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "PlaceAdmin") | |||
| }) | |||
| @RequestMapping(value = "/edit", method = RequestMethod.POST) | |||
| JsonResponse edit(@RequestBody @Valid PlaceAdminEditRequest request) { | |||
| request.setPlaceAdminType(PlaceAdminType.Manager); | |||
| placeAdminService.edit(request); | |||
| return JsonResponse.success(); | |||
| } | |||
| @ApiOperation(value = "删除") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "IdRequest") | |||
| }) | |||
| @RequestMapping(value = "/delete", method = RequestMethod.POST) | |||
| JsonResponse remove(@RequestBody @Valid IdsRequest<Long> request) { | |||
| placeAdminService.remove(request); | |||
| return JsonResponse.success(); | |||
| } | |||
| } | |||
| @@ -0,0 +1,86 @@ | |||
| package com.chilunyc.fumao.api.system; | |||
| import com.chilunyc.fumao.common.request.IdsRequest; | |||
| import com.chilunyc.fumao.common.response.JsonResponse; | |||
| import com.chilunyc.fumao.common.shiro.AuthRoles; | |||
| import com.chilunyc.fumao.company.model.Place; | |||
| import com.chilunyc.fumao.company.request.place.PlaceEditRequest; | |||
| import com.chilunyc.fumao.company.request.place.PlacePageRequest; | |||
| import com.chilunyc.fumao.company.service.PlaceService; | |||
| import io.swagger.annotations.Api; | |||
| import io.swagger.annotations.ApiImplicitParam; | |||
| import io.swagger.annotations.ApiImplicitParams; | |||
| import io.swagger.annotations.ApiOperation; | |||
| import lombok.extern.log4j.Log4j; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.data.domain.Page; | |||
| import org.springframework.security.access.prepost.PreAuthorize; | |||
| import org.springframework.web.bind.annotation.*; | |||
| import javax.validation.Valid; | |||
| import java.util.List; | |||
| /** | |||
| * | |||
| */ | |||
| @Log4j | |||
| @Api(description = "商场") | |||
| @RestController | |||
| @RequestMapping("/system/place") | |||
| @PreAuthorize(AuthRoles.SystemAdminExp) | |||
| class PlaceController { | |||
| @Autowired | |||
| PlaceService placeService; | |||
| @ApiOperation(value = "分页") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "PageRequest") | |||
| }) | |||
| @RequestMapping(value = "/find", method = RequestMethod.POST) | |||
| JsonResponse<Page<Place>> page(@RequestBody PlacePageRequest request) { | |||
| Page<Place> page = placeService.page(request); | |||
| return JsonResponse.success(page); | |||
| } | |||
| @ApiOperation(value = "详情") | |||
| @ApiImplicitParams({ | |||
| }) | |||
| @RequestMapping(value = "/find/{id}", method = RequestMethod.GET) | |||
| JsonResponse<Place> info(@PathVariable Long id) { | |||
| Place placeResponse = placeService.find(id); | |||
| return JsonResponse.success(placeResponse); | |||
| } | |||
| @ApiOperation(value = "新增 | 编辑") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "Place") | |||
| }) | |||
| @RequestMapping(value = "/edit", method = RequestMethod.POST) | |||
| JsonResponse edit(@RequestBody @Valid PlaceEditRequest request) { | |||
| Place edit = placeService.edit(request); | |||
| return JsonResponse.success(edit); | |||
| } | |||
| @ApiOperation(value = "删除") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "IdRequest") | |||
| }) | |||
| @RequestMapping(value = "/delete", method = RequestMethod.POST) | |||
| JsonResponse remove(@RequestBody @Valid IdsRequest<Long> request) { | |||
| placeService.remove(request); | |||
| return JsonResponse.success(); | |||
| } | |||
| @ApiOperation(value = "所有") | |||
| @ApiImplicitParams({ | |||
| }) | |||
| @RequestMapping(value = "/find/all", method = RequestMethod.POST) | |||
| JsonResponse<List<Place>> all(@RequestBody PlacePageRequest request) { | |||
| List<Place> result = placeService.all(request); | |||
| return JsonResponse.success(result); | |||
| } | |||
| } | |||
| @@ -0,0 +1,78 @@ | |||
| package com.chilunyc.fumao.api.system; | |||
| import com.chilunyc.fumao.common.request.IdsRequest; | |||
| import com.chilunyc.fumao.common.response.JsonResponse; | |||
| import com.chilunyc.fumao.common.shiro.AuthRoles; | |||
| import com.chilunyc.fumao.company.model.PlaceFloor; | |||
| import com.chilunyc.fumao.company.request.placeFloor.PlaceFloorEditRequest; | |||
| import com.chilunyc.fumao.company.request.placeFloor.PlaceFloorPageRequest; | |||
| import com.chilunyc.fumao.company.service.PlaceFloorService; | |||
| import io.swagger.annotations.Api; | |||
| import io.swagger.annotations.ApiImplicitParam; | |||
| import io.swagger.annotations.ApiImplicitParams; | |||
| import io.swagger.annotations.ApiOperation; | |||
| import lombok.extern.log4j.Log4j; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.data.domain.Page; | |||
| import org.springframework.security.access.prepost.PreAuthorize; | |||
| import org.springframework.web.bind.annotation.*; | |||
| import javax.validation.Valid; | |||
| import java.util.List; | |||
| /** | |||
| * | |||
| */ | |||
| @Log4j | |||
| @Api(description = "商场楼层") | |||
| @RestController | |||
| @RequestMapping("/system/place/floor") | |||
| @PreAuthorize(AuthRoles.SystemAdminExp) | |||
| class PlaceFloorController { | |||
| @Autowired | |||
| PlaceFloorService placeFloorService; | |||
| @ApiOperation(value = "分页") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "PageRequest") | |||
| }) | |||
| @RequestMapping(value = "/find/all", method = RequestMethod.POST) | |||
| JsonResponse<List<PlaceFloor>> all(@RequestBody PlaceFloorPageRequest request) { | |||
| List<PlaceFloor> page = placeFloorService.all(request); | |||
| return JsonResponse.success(page); | |||
| } | |||
| @ApiOperation(value = "详情") | |||
| @ApiImplicitParams({ | |||
| }) | |||
| @RequestMapping(value = "/find/{id}", method = RequestMethod.GET) | |||
| JsonResponse<PlaceFloor> info(@PathVariable Long id) { | |||
| PlaceFloor placeFloorResponse = placeFloorService.find(id); | |||
| return JsonResponse.success(placeFloorResponse); | |||
| } | |||
| @ApiOperation(value = "新增 | 编辑") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "PlaceFloor") | |||
| }) | |||
| @RequestMapping(value = "/edit", method = RequestMethod.POST) | |||
| JsonResponse edit(@RequestBody @Valid PlaceFloorEditRequest request) { | |||
| placeFloorService.edit(request); | |||
| return JsonResponse.success(); | |||
| } | |||
| @ApiOperation(value = "删除") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "IdRequest") | |||
| }) | |||
| @RequestMapping(value = "/delete", method = RequestMethod.POST) | |||
| JsonResponse remove(@RequestBody @Valid IdsRequest request) { | |||
| placeFloorService.remove(request); | |||
| return JsonResponse.success(); | |||
| } | |||
| } | |||
| @@ -0,0 +1,65 @@ | |||
| package com.chilunyc.fumao.api.system; | |||
| import com.chilunyc.fumao.common.request.IdsRequest; | |||
| import com.chilunyc.fumao.common.response.JsonResponse; | |||
| import com.chilunyc.fumao.common.shiro.AuthRoles; | |||
| import com.chilunyc.fumao.company.model.ShopApply; | |||
| import com.chilunyc.fumao.company.request.shopApply.ShopApplyEditRequest; | |||
| import com.chilunyc.fumao.company.request.shopApply.ShopApplyPageRequest; | |||
| import com.chilunyc.fumao.company.service.ShopApplyService; | |||
| import io.swagger.annotations.Api; | |||
| import io.swagger.annotations.ApiImplicitParam; | |||
| import io.swagger.annotations.ApiImplicitParams; | |||
| import io.swagger.annotations.ApiOperation; | |||
| import lombok.extern.log4j.Log4j; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.data.domain.Page; | |||
| import org.springframework.security.access.prepost.PreAuthorize; | |||
| import org.springframework.web.bind.annotation.*; | |||
| import javax.validation.Valid; | |||
| /** | |||
| * | |||
| */ | |||
| @Log4j | |||
| @Api(description = "商铺申请") | |||
| @RestController | |||
| @RequestMapping("/system/shop/apply") | |||
| @PreAuthorize(AuthRoles.SystemAdminExp) | |||
| class ShopApplyController { | |||
| @Autowired | |||
| ShopApplyService shopApplyService; | |||
| @ApiOperation(value = "分页") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "PageRequest") | |||
| }) | |||
| @RequestMapping(value = "/find", method = RequestMethod.POST) | |||
| JsonResponse<Page<ShopApply>> page(@RequestBody ShopApplyPageRequest request) { | |||
| Page<ShopApply> page = shopApplyService.page(request); | |||
| return JsonResponse.success(page); | |||
| } | |||
| @ApiOperation(value = "详情") | |||
| @ApiImplicitParams({ | |||
| }) | |||
| @RequestMapping(value = "/find/{id}", method = RequestMethod.GET) | |||
| JsonResponse<ShopApply> info(@PathVariable Long id) { | |||
| ShopApply shopApplyResponse = shopApplyService.find(id); | |||
| return JsonResponse.success(shopApplyResponse); | |||
| } | |||
| @ApiOperation(value = "删除") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "IdRequest") | |||
| }) | |||
| @RequestMapping(value = "/delete", method = RequestMethod.POST) | |||
| JsonResponse remove(@RequestBody @Valid IdsRequest request) { | |||
| shopApplyService.remove(request); | |||
| return JsonResponse.success(); | |||
| } | |||
| } | |||
| @@ -0,0 +1,77 @@ | |||
| package com.chilunyc.fumao.api.system; | |||
| import com.chilunyc.fumao.common.request.IdsRequest; | |||
| import com.chilunyc.fumao.common.response.JsonResponse; | |||
| import com.chilunyc.fumao.common.shiro.AuthRoles; | |||
| import com.chilunyc.fumao.system.model.SystemAdmin; | |||
| import com.chilunyc.fumao.system.request.systemAdmin.SystemAdminEditRequest; | |||
| import com.chilunyc.fumao.system.request.systemAdmin.SystemAdminPageRequest; | |||
| import com.chilunyc.fumao.system.service.SystemAdminService; | |||
| import io.swagger.annotations.Api; | |||
| import io.swagger.annotations.ApiImplicitParam; | |||
| import io.swagger.annotations.ApiImplicitParams; | |||
| import io.swagger.annotations.ApiOperation; | |||
| import lombok.extern.log4j.Log4j; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.data.domain.Page; | |||
| import org.springframework.security.access.prepost.PreAuthorize; | |||
| import org.springframework.web.bind.annotation.*; | |||
| import javax.validation.Valid; | |||
| /** | |||
| * | |||
| */ | |||
| @Log4j | |||
| @Api(description = "系统管理员") | |||
| @RestController | |||
| @RequestMapping("/system/admin") | |||
| @PreAuthorize(AuthRoles.SystemAdminExp) | |||
| class SystemAdminController { | |||
| @Autowired | |||
| SystemAdminService systemAdminService; | |||
| @ApiOperation(value = "分页") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "PageRequest") | |||
| }) | |||
| @RequestMapping(value = "/find", method = RequestMethod.POST) | |||
| JsonResponse<Page<SystemAdmin>> page(@RequestBody SystemAdminPageRequest request) { | |||
| Page<SystemAdmin> page = systemAdminService.page(request); | |||
| return JsonResponse.success(page); | |||
| } | |||
| @ApiOperation(value = "详情") | |||
| @ApiImplicitParams({ | |||
| }) | |||
| @RequestMapping(value = "/find/{id}", method = RequestMethod.GET) | |||
| JsonResponse<SystemAdmin> info(@PathVariable Long id) { | |||
| SystemAdmin systemAdminResponse = systemAdminService.find(id); | |||
| return JsonResponse.success(systemAdminResponse); | |||
| } | |||
| @ApiOperation(value = "新增 | 编辑") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "SystemAdmin") | |||
| }) | |||
| @RequestMapping(value = "/edit", method = RequestMethod.POST) | |||
| JsonResponse edit(@RequestBody @Valid SystemAdminEditRequest request) { | |||
| systemAdminService.edit(request); | |||
| return JsonResponse.success(); | |||
| } | |||
| @ApiOperation(value = "删除") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "IdRequest") | |||
| }) | |||
| @RequestMapping(value = "/delete", method = RequestMethod.POST) | |||
| JsonResponse remove(@RequestBody @Valid IdsRequest request) { | |||
| systemAdminService.remove(request); | |||
| return JsonResponse.success(); | |||
| } | |||
| } | |||
| @@ -0,0 +1,21 @@ | |||
| package com.chilunyc.fumao.config.bean; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.springframework.beans.factory.config.BeanDefinition; | |||
| import org.springframework.beans.factory.support.BeanDefinitionRegistry; | |||
| import org.springframework.context.annotation.AnnotationBeanNameGenerator; | |||
| /** | |||
| * | |||
| */ | |||
| public class MultiBeanNameGenerator extends AnnotationBeanNameGenerator { | |||
| @Override | |||
| public String generateBeanName(BeanDefinition beanDefinition, BeanDefinitionRegistry beanDefinitionRegistry) { | |||
| String beanClassName = beanDefinition.getBeanClassName(); | |||
| if (StringUtils.startsWith(beanClassName, "com.chilunyc") && StringUtils.endsWith(beanClassName, "Controller")) { | |||
| return beanClassName; | |||
| } | |||
| return super.generateBeanName(beanDefinition, beanDefinitionRegistry); | |||
| } | |||
| } | |||
| @@ -0,0 +1,32 @@ | |||
| package com.chilunyc.fumao.config.captcha; | |||
| import com.google.code.kaptcha.impl.DefaultKaptcha; | |||
| import com.google.code.kaptcha.util.Config; | |||
| import org.springframework.context.annotation.Bean; | |||
| import org.springframework.context.annotation.Configuration; | |||
| import java.util.Properties; | |||
| /** | |||
| * | |||
| */ | |||
| @Configuration | |||
| public class CaptchaConfig { | |||
| @Bean | |||
| public DefaultKaptcha captchaProducer() { | |||
| DefaultKaptcha captchaProducer = new DefaultKaptcha(); | |||
| Properties properties = new Properties(); | |||
| properties.setProperty("kaptcha.border", "yes"); | |||
| properties.setProperty("kaptcha.border.color", "105,179,90"); | |||
| properties.setProperty("kaptcha.textproducer.font.color", "blue"); | |||
| properties.setProperty("kaptcha.image.width", "150"); | |||
| properties.setProperty("kaptcha.image.height", "60"); | |||
| properties.setProperty("kaptcha.textproducer.font.size", "45"); | |||
| properties.setProperty("kaptcha.session.key", "code"); | |||
| properties.setProperty("kaptcha.textproducer.char.length", "4"); | |||
| Config config = new Config(properties); | |||
| captchaProducer.setConfig(config); | |||
| return captchaProducer; | |||
| } | |||
| } | |||
| @@ -0,0 +1,76 @@ | |||
| package com.chilunyc.fumao.config.swagger; | |||
| import com.chilunyc.fumao.common.response.JsonResponse; | |||
| import com.fasterxml.classmate.TypeResolver; | |||
| import com.google.common.base.Predicate; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; | |||
| import org.springframework.context.annotation.Bean; | |||
| import org.springframework.context.annotation.Configuration; | |||
| import org.springframework.http.ResponseEntity; | |||
| import springfox.documentation.builders.ApiInfoBuilder; | |||
| import springfox.documentation.schema.AlternateTypeRules; | |||
| import springfox.documentation.schema.WildcardType; | |||
| import springfox.documentation.spi.DocumentationType; | |||
| import springfox.documentation.spring.web.plugins.Docket; | |||
| import springfox.documentation.swagger2.annotations.EnableSwagger2; | |||
| /** | |||
| * | |||
| */ | |||
| @Configuration | |||
| @ConditionalOnProperty(value = "app.test", havingValue = "true") | |||
| @EnableSwagger2 | |||
| public class SwaggerConfig { | |||
| @Autowired | |||
| private TypeResolver typeResolver; | |||
| @Bean | |||
| Docket all() { | |||
| return build("所有", "/", "所有接口"); | |||
| } | |||
| /** | |||
| * @param group | |||
| * @param path | |||
| * @param title | |||
| * @return | |||
| */ | |||
| Docket build(String group, String path, String title) { | |||
| return new Docket(DocumentationType.SWAGGER_2) | |||
| .select() | |||
| .paths(includePath(path)) | |||
| .build() | |||
| .groupName(group) | |||
| .ignoredParameterTypes( | |||
| ) | |||
| .apiInfo( | |||
| new ApiInfoBuilder() | |||
| .title(title) | |||
| .version("1.0") | |||
| .build()) | |||
| .genericModelSubstitutes(ResponseEntity.class) | |||
| .alternateTypeRules( | |||
| AlternateTypeRules.newRule( | |||
| typeResolver.resolve(ResponseEntity.class, typeResolver.resolve(JsonResponse.class, WildcardType.class)), | |||
| typeResolver.resolve(WildcardType.class) | |||
| ) | |||
| ) | |||
| .useDefaultResponseMessages(false) | |||
| ; | |||
| } | |||
| /** | |||
| * @param path | |||
| * @return | |||
| */ | |||
| Predicate<String> includePath(final String path) { | |||
| return new Predicate<String>() { | |||
| @Override | |||
| public boolean apply(String input) { | |||
| return input.startsWith(path); | |||
| } | |||
| }; | |||
| } | |||
| } | |||
| @@ -0,0 +1,21 @@ | |||
| package com.chilunyc.fumao.config.web; | |||
| import com.fasterxml.jackson.core.JsonParser; | |||
| import com.fasterxml.jackson.core.JsonToken; | |||
| import com.fasterxml.jackson.databind.DeserializationContext; | |||
| import com.fasterxml.jackson.databind.JsonDeserializer; | |||
| import org.springframework.boot.jackson.JsonComponent; | |||
| import java.io.IOException; | |||
| /** | |||
| * | |||
| */ | |||
| @JsonComponent | |||
| public class JsonConfig extends JsonDeserializer<String> { | |||
| @Override | |||
| public String deserialize(JsonParser parser, DeserializationContext context) throws IOException { | |||
| return parser.hasToken(JsonToken.VALUE_STRING) ? parser.getText().trim() : null; | |||
| } | |||
| } | |||
| @@ -0,0 +1,78 @@ | |||
| package com.chilunyc.fumao.config.web; | |||
| import com.chilunyc.fumao.common.config.ApplicationProperty; | |||
| import com.chilunyc.fumao.config.web.arguments.DateArgumentResolver; | |||
| import com.chilunyc.fumao.config.web.arguments.LoginUserArgumentResolver; | |||
| import com.chilunyc.fumao.config.web.interceptor.AuthInterceptor; | |||
| import com.chilunyc.fumao.config.web.interceptor.CorsInterceptor; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.context.annotation.Configuration; | |||
| import org.springframework.web.method.support.HandlerMethodArgumentResolver; | |||
| import org.springframework.web.servlet.config.annotation.CorsRegistry; | |||
| import org.springframework.web.servlet.config.annotation.InterceptorRegistry; | |||
| import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; | |||
| import java.util.List; | |||
| /** | |||
| * | |||
| */ | |||
| @Configuration | |||
| public class WebConfig extends WebMvcConfigurerAdapter { | |||
| @Autowired | |||
| private AuthInterceptor authInterceptor; | |||
| @Autowired | |||
| private CorsInterceptor corsInterceptor; | |||
| @Autowired | |||
| private LoginUserArgumentResolver jwtValueArgumentResolver; | |||
| @Autowired | |||
| private ApplicationProperty applicationConfig; | |||
| /** | |||
| * 跨域访问 | |||
| * | |||
| * @param registry | |||
| */ | |||
| @Override | |||
| public void addCorsMappings(CorsRegistry registry) { | |||
| registry | |||
| .addMapping("/**/*") | |||
| .allowedOrigins("*") | |||
| .allowedMethods("*") | |||
| .allowedHeaders("*") | |||
| .allowCredentials(true) | |||
| ; | |||
| } | |||
| @Override | |||
| public void addInterceptors(InterceptorRegistry registry) { | |||
| registry.addInterceptor(corsInterceptor); | |||
| // registry.addInterceptor(authInterceptor).excludePathPatterns( | |||
| // "/**/login", | |||
| // "/**/login/**", | |||
| // "/**/logout", | |||
| // "/upload", | |||
| // "/**/register/**", | |||
| // "/**/find/pwd/", | |||
| // "/**/find/pwd/**", | |||
| // "/swagger/**", | |||
| // "/swagger-resources/**", | |||
| // "/webjars/**", | |||
| // "/captcha", | |||
| // "/wx/**", | |||
| // "/error" | |||
| // ); | |||
| } | |||
| @Override | |||
| public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { | |||
| argumentResolvers.add(jwtValueArgumentResolver); | |||
| argumentResolvers.add(new DateArgumentResolver()); | |||
| } | |||
| } | |||
| @@ -0,0 +1,58 @@ | |||
| package com.chilunyc.fumao.config.web; | |||
| import com.chilunyc.fumao.config.web.security.SecurityFilter; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.context.annotation.Configuration; | |||
| import org.springframework.security.config.annotation.web.builders.HttpSecurity; | |||
| import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; | |||
| import org.springframework.security.config.http.SessionCreationPolicy; | |||
| import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; | |||
| /** | |||
| * Created by Tkk on 2018/7/23. | |||
| */ | |||
| @Configuration | |||
| public class WebSecurityConfig extends WebSecurityConfigurerAdapter { | |||
| @Autowired | |||
| SecurityFilter securityFilter; | |||
| @Override | |||
| protected void configure(HttpSecurity http) throws Exception { | |||
| http | |||
| // 开启跨域 | |||
| .cors() | |||
| // 取消session | |||
| .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER) | |||
| // 关闭csrf | |||
| .and().csrf().disable() | |||
| .authorizeRequests() | |||
| // 放行登录 | |||
| .antMatchers( | |||
| "/login", | |||
| "/login/**", | |||
| "/**/login", | |||
| "/**/login/**") | |||
| .permitAll() | |||
| // 放行通用 | |||
| .antMatchers( | |||
| "/common/**") | |||
| .permitAll() | |||
| // 其他全部校验 | |||
| .anyRequest() | |||
| .authenticated() | |||
| // 增加过滤器, 过滤权限 | |||
| .and() | |||
| .addFilterBefore(securityFilter, UsernamePasswordAuthenticationFilter.class); | |||
| } | |||
| } | |||
| @@ -0,0 +1,38 @@ | |||
| package com.chilunyc.fumao.config.web.arguments; | |||
| import org.apache.commons.lang3.ClassUtils; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.apache.commons.lang3.time.DateUtils; | |||
| import org.springframework.core.MethodParameter; | |||
| import org.springframework.web.bind.support.WebDataBinderFactory; | |||
| import org.springframework.web.context.request.NativeWebRequest; | |||
| import org.springframework.web.method.support.HandlerMethodArgumentResolver; | |||
| import org.springframework.web.method.support.ModelAndViewContainer; | |||
| import java.util.Date; | |||
| /** | |||
| * | |||
| */ | |||
| public class DateArgumentResolver implements HandlerMethodArgumentResolver { | |||
| @Override | |||
| public boolean supportsParameter(MethodParameter methodParameter) { | |||
| return ClassUtils.isAssignable(methodParameter.getParameterType(), Date.class); | |||
| } | |||
| @Override | |||
| public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception { | |||
| String parameterName = methodParameter.getParameterName(); | |||
| String value = nativeWebRequest.getParameter(parameterName); | |||
| if (StringUtils.isBlank(value) || StringUtils.equalsIgnoreCase("undefined", value)) { | |||
| return null; | |||
| } else if (value.length() <= 10) { | |||
| return DateUtils.parseDate(value, "yyyy-MM-dd"); | |||
| } else if (value.length() > 16) { | |||
| return DateUtils.parseDate(value, "yyyy-MM-dd HH:mm:ss"); | |||
| } else { | |||
| return null; | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,34 @@ | |||
| package com.chilunyc.fumao.config.web.arguments; | |||
| import com.chilunyc.fumao.common.context.RequestHolder; | |||
| import com.chilunyc.fumao.common.exception.SystemException; | |||
| import com.chilunyc.fumao.common.context.LoginUser; | |||
| import io.jsonwebtoken.Claims; | |||
| import org.apache.commons.lang3.ClassUtils; | |||
| import org.springframework.core.MethodParameter; | |||
| import org.springframework.stereotype.Component; | |||
| import org.springframework.web.bind.support.WebDataBinderFactory; | |||
| import org.springframework.web.context.request.NativeWebRequest; | |||
| import org.springframework.web.method.support.HandlerMethodArgumentResolver; | |||
| import org.springframework.web.method.support.ModelAndViewContainer; | |||
| /** | |||
| * | |||
| */ | |||
| @Component | |||
| public class LoginUserArgumentResolver implements HandlerMethodArgumentResolver { | |||
| @Override | |||
| public boolean supportsParameter(MethodParameter methodParameter) { | |||
| return ClassUtils.isAssignable(methodParameter.getParameterType(), LoginUser.class); | |||
| } | |||
| @Override | |||
| public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception { | |||
| LoginUser o = (LoginUser) methodParameter.getParameterType().newInstance(); | |||
| Claims jwtValue = RequestHolder.get().getJwtValue(); | |||
| o.fromJwt(jwtValue); | |||
| return o; | |||
| } | |||
| } | |||
| @@ -0,0 +1,36 @@ | |||
| package com.chilunyc.fumao.config.web.interceptor; | |||
| import com.chilunyc.fumao.common.config.ApplicationProperty; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.stereotype.Component; | |||
| import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; | |||
| import javax.servlet.http.HttpServletRequest; | |||
| import javax.servlet.http.HttpServletResponse; | |||
| /** | |||
| * | |||
| */ | |||
| @Component | |||
| public class AuthInterceptor extends HandlerInterceptorAdapter { | |||
| @Autowired | |||
| private ApplicationProperty applicationProperty; | |||
| /** | |||
| * 做权限过滤 | |||
| * | |||
| * @param servletRequest | |||
| * @param response | |||
| * @param handler | |||
| * @return | |||
| * @throws Exception | |||
| */ | |||
| @Override | |||
| public boolean preHandle(HttpServletRequest servletRequest, HttpServletResponse response, Object handler) throws Exception { | |||
| return true; | |||
| } | |||
| } | |||
| @@ -0,0 +1,54 @@ | |||
| package com.chilunyc.fumao.config.web.interceptor; | |||
| import com.chilunyc.fumao.common.context.RequestHolder; | |||
| import org.springframework.beans.BeansException; | |||
| import org.springframework.context.ApplicationContext; | |||
| import org.springframework.context.ApplicationContextAware; | |||
| import org.springframework.stereotype.Component; | |||
| import org.springframework.web.cors.CorsConfiguration; | |||
| import org.springframework.web.servlet.handler.AbstractHandlerMapping; | |||
| import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; | |||
| import javax.servlet.http.HttpServletRequest; | |||
| import javax.servlet.http.HttpServletResponse; | |||
| import java.util.ArrayList; | |||
| import java.util.Map; | |||
| /** | |||
| * | |||
| */ | |||
| @Component | |||
| public class CorsInterceptor extends HandlerInterceptorAdapter implements ApplicationContextAware { | |||
| private AbstractHandlerMapping handlerMapping; | |||
| private CorsConfiguration cors; | |||
| private ApplicationContext applicationContext; | |||
| @Override | |||
| public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { | |||
| if (handlerMapping == null) { | |||
| synchronized (applicationContext) { | |||
| if (handlerMapping == null) { | |||
| handlerMapping = applicationContext.getBean(AbstractHandlerMapping.class); | |||
| Map<String, CorsConfiguration> corsConfigurations = handlerMapping.getCorsConfigurations(); | |||
| this.cors = new ArrayList<>(corsConfigurations.values()).get(0); | |||
| } | |||
| } | |||
| } | |||
| // | |||
| handlerMapping.getCorsProcessor().processRequest(cors, request, response); | |||
| return super.preHandle(request, response, handler); | |||
| } | |||
| @Override | |||
| public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { | |||
| this.applicationContext = applicationContext; | |||
| } | |||
| @Override | |||
| public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { | |||
| super.afterCompletion(request, response, handler, ex); | |||
| RequestHolder.clean(); | |||
| } | |||
| } | |||
| @@ -0,0 +1,26 @@ | |||
| package com.chilunyc.fumao.config.web.security; | |||
| import com.chilunyc.fumao.common.response.JsonResponse; | |||
| import lombok.extern.log4j.Log4j; | |||
| import org.springframework.security.core.AuthenticationException; | |||
| import org.springframework.security.web.AuthenticationEntryPoint; | |||
| import org.springframework.stereotype.Component; | |||
| import javax.servlet.ServletException; | |||
| import javax.servlet.http.HttpServletRequest; | |||
| import javax.servlet.http.HttpServletResponse; | |||
| import java.io.IOException; | |||
| /** | |||
| * Created by Tkk on 2018/7/23. | |||
| */ | |||
| @Log4j | |||
| @Component | |||
| public class SecurityEntryPoint implements AuthenticationEntryPoint { | |||
| @Override | |||
| public void commence(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException { | |||
| httpServletResponse.setContentType("application/json"); | |||
| httpServletResponse.getWriter().write(JsonResponse.fail("000002", "尚未登录").toString()); | |||
| } | |||
| } | |||
| @@ -0,0 +1,141 @@ | |||
| package com.chilunyc.fumao.config.web.security; | |||
| import com.chilunyc.fumao.common.context.Request; | |||
| import com.chilunyc.fumao.common.context.RequestHolder; | |||
| import com.chilunyc.fumao.common.exception.SystemException; | |||
| import com.chilunyc.fumao.common.response.JsonResponse; | |||
| import com.chilunyc.fumao.common.shiro.AuthUser; | |||
| import com.chilunyc.fumao.common.util.jwt.JwtUtils; | |||
| import com.chilunyc.fumao.config.web.arguments.LoginUserArgumentResolver; | |||
| import io.jsonwebtoken.Claims; | |||
| import lombok.extern.log4j.Log4j; | |||
| import org.apache.commons.lang.StringUtils; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.context.MessageSource; | |||
| import org.springframework.context.NoSuchMessageException; | |||
| import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; | |||
| import org.springframework.security.core.authority.SimpleGrantedAuthority; | |||
| import org.springframework.security.core.context.SecurityContextHolder; | |||
| import org.springframework.stereotype.Component; | |||
| import org.springframework.web.filter.OncePerRequestFilter; | |||
| import org.springframework.web.util.ContentCachingRequestWrapper; | |||
| import javax.servlet.FilterChain; | |||
| import javax.servlet.ServletException; | |||
| import javax.servlet.http.HttpServletRequest; | |||
| import javax.servlet.http.HttpServletResponse; | |||
| import java.io.IOException; | |||
| import java.util.Collections; | |||
| import java.util.List; | |||
| import java.util.Locale; | |||
| import java.util.stream.Collectors; | |||
| /** | |||
| * 把JWT转换为security的对象 | |||
| * Created by Tkk on 2018/7/23. | |||
| */ | |||
| @Component | |||
| @Log4j | |||
| public class SecurityFilter extends OncePerRequestFilter { | |||
| @Autowired | |||
| MessageSource messageSource; | |||
| @Override | |||
| protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException { | |||
| // 区分什么请求 | |||
| Request build = Request | |||
| .builder() | |||
| .request(httpServletRequest) | |||
| .build(); | |||
| String servletPath = httpServletRequest.getServletPath(); | |||
| String prefix = org.apache.commons.lang3.StringUtils.substringBetween(servletPath, "/", "/"); | |||
| switch (prefix) { | |||
| case "system": | |||
| build.setJwtType(JwtUtils.T.System); | |||
| break; | |||
| case "company": | |||
| build.setJwtType(JwtUtils.T.Company); | |||
| break; | |||
| case "place": | |||
| build.setJwtType(JwtUtils.T.Market); | |||
| break; | |||
| case "customer": | |||
| build.setJwtType(JwtUtils.T.APP_C); | |||
| break; | |||
| case "merchant": | |||
| build.setJwtType(JwtUtils.T.APP_B); | |||
| break; | |||
| } | |||
| try { | |||
| RequestHolder.set(build); | |||
| String token = httpServletRequest.getHeader("token"); | |||
| if (StringUtils.isNotBlank(token)) { | |||
| // | |||
| Claims claims = JwtUtils.decode(build.getJwtType(), httpServletRequest.getHeader("token")); | |||
| AuthUser authUser = toAuthUser(claims); | |||
| // 放入jwt数值, 用于后面转换方法对面 | |||
| build.setJwtValue(claims); | |||
| // 如果能转换成功, 说明登录没问题, 那么转换为security对象, 做权限处理 | |||
| UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = toAuthToken(authUser); | |||
| SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken); | |||
| } | |||
| // 包装request对象, 可以之后做日志处理, 可以反复读取请求体 | |||
| ContentCachingRequestWrapper r = new ContentCachingRequestWrapper(httpServletRequest); | |||
| filterChain.doFilter(r, httpServletResponse); | |||
| } | |||
| // 业务一次 | |||
| catch (SystemException e) { | |||
| log.error(e.getMessage(), e); | |||
| httpServletResponse.setCharacterEncoding("UTF-8"); | |||
| httpServletResponse.getWriter().write( | |||
| JsonResponse.fail(e.getErrorCode(), getMessage(e.getErrorCode(), e.getParams())).toString() | |||
| ); | |||
| } | |||
| // 所有异常 | |||
| catch (Exception e) { | |||
| log.error(e.getMessage(), e); | |||
| httpServletResponse.setCharacterEncoding("UTF-8"); | |||
| httpServletResponse.getWriter().write( | |||
| JsonResponse.fail().toString() | |||
| ); | |||
| } finally { | |||
| RequestHolder.clean(); | |||
| } | |||
| } | |||
| /** | |||
| * @param claims | |||
| * @return | |||
| */ | |||
| private AuthUser toAuthUser(Claims claims) { | |||
| List<String> roles = (List<String>) claims.get("role"); | |||
| if (roles == null) { | |||
| roles = Collections.emptyList(); | |||
| } | |||
| return AuthUser | |||
| .builder() | |||
| .id(Long.parseLong(claims.getSubject())) | |||
| .authorities( | |||
| roles.stream() | |||
| .map(SimpleGrantedAuthority::new) | |||
| .collect(Collectors.toList())) | |||
| .build(); | |||
| } | |||
| private UsernamePasswordAuthenticationToken toAuthToken(AuthUser authUser) { | |||
| return new UsernamePasswordAuthenticationToken(authUser, null, authUser.getAuthorities()); | |||
| } | |||
| protected String getMessage(String code, Object[] params) { | |||
| try { | |||
| return messageSource.getMessage(code, params, Locale.CHINA); | |||
| } catch (NoSuchMessageException e) { | |||
| return code; | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,62 @@ | |||
| package com.chilunyc.fumao.controller; | |||
| import com.chilunyc.fumao.common.request.ChangePwdRequest; | |||
| import com.chilunyc.fumao.common.response.JsonResponse; | |||
| import com.chilunyc.fumao.common.sms.model.SmsType; | |||
| import com.chilunyc.fumao.common.sms.request.SmsSendRequest; | |||
| import com.chilunyc.fumao.common.sms.service.SmsService; | |||
| import io.swagger.annotations.Api; | |||
| import io.swagger.annotations.ApiImplicitParam; | |||
| import io.swagger.annotations.ApiImplicitParams; | |||
| import io.swagger.annotations.ApiOperation; | |||
| import lombok.extern.log4j.Log4j; | |||
| import org.apache.commons.lang3.RandomStringUtils; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.web.bind.annotation.RequestBody; | |||
| import org.springframework.web.bind.annotation.RequestMapping; | |||
| import org.springframework.web.bind.annotation.RequestMethod; | |||
| import org.springframework.web.bind.annotation.RestController; | |||
| import javax.validation.Valid; | |||
| /** | |||
| * | |||
| */ | |||
| @Log4j | |||
| @Api(description = "找回密码") | |||
| @RestController | |||
| @RequestMapping("/find/pwd") | |||
| class FindPwdController { | |||
| @Autowired | |||
| SmsService smsService; | |||
| @ApiOperation(value = "改密码") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "UserChangePwdRequest") | |||
| }) | |||
| @RequestMapping(value = "/", method = RequestMethod.POST) | |||
| JsonResponse login(@RequestBody @Valid ChangePwdRequest request) { | |||
| // | |||
| return JsonResponse.success(); | |||
| } | |||
| @ApiOperation(value = "改密码发短信") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "SmsSendRequest") | |||
| }) | |||
| @RequestMapping(value = "/send", method = RequestMethod.POST) | |||
| JsonResponse login(@RequestBody @Valid SmsSendRequest request) { | |||
| //1. 校验是否存在 | |||
| // if (!userService.isExist(request.getMobile())) { | |||
| // throw new SystemException("000010"); | |||
| // } | |||
| //2. 发送 | |||
| request.setContent(RandomStringUtils.randomNumeric(4)); | |||
| request.setType(SmsType.CustomerFindPwd); | |||
| smsService.send(request); | |||
| return JsonResponse.success(); | |||
| } | |||
| } | |||
| @@ -0,0 +1,58 @@ | |||
| package com.chilunyc.fumao.controller.common; | |||
| import com.google.code.kaptcha.Constants; | |||
| import com.google.code.kaptcha.Producer; | |||
| import io.swagger.annotations.Api; | |||
| import io.swagger.annotations.ApiOperation; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.stereotype.Controller; | |||
| import org.springframework.web.bind.annotation.RequestMapping; | |||
| import org.springframework.web.bind.annotation.RequestMethod; | |||
| import org.springframework.web.servlet.ModelAndView; | |||
| import javax.imageio.ImageIO; | |||
| import javax.servlet.ServletOutputStream; | |||
| import javax.servlet.http.HttpServletResponse; | |||
| import javax.servlet.http.HttpSession; | |||
| import java.awt.image.BufferedImage; | |||
| /** | |||
| * | |||
| */ | |||
| @Api(description = "验证码") | |||
| @Controller | |||
| @RequestMapping("/common/captcha") | |||
| class CaptchaController { | |||
| @Autowired | |||
| Producer captchaProducer; | |||
| /** | |||
| * 验证码 | |||
| * | |||
| * @param response | |||
| * @param session | |||
| * @return | |||
| * @throws Exception | |||
| */ | |||
| @ApiOperation(value = "生成验证码图片") | |||
| @RequestMapping(value = "", method = RequestMethod.GET) | |||
| ModelAndView index(HttpServletResponse response, HttpSession session) throws Exception { | |||
| response.setDateHeader("Expires", 0); | |||
| response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate"); | |||
| response.addHeader("Cache-Control", "post-checkExist=0, pre-checkExist=0"); | |||
| response.setHeader("Pragma", "no-cache"); | |||
| response.setContentType("image/jpeg"); | |||
| String capText = captchaProducer.createText(); | |||
| session.setAttribute(Constants.KAPTCHA_SESSION_KEY, capText); | |||
| BufferedImage bi = captchaProducer.createImage(capText); | |||
| ServletOutputStream out = response.getOutputStream(); | |||
| ImageIO.write(bi, "jpg", out); | |||
| try { | |||
| out.flush(); | |||
| } finally { | |||
| out.close(); | |||
| } | |||
| return null; | |||
| } | |||
| } | |||
| @@ -0,0 +1,43 @@ | |||
| package com.chilunyc.fumao.controller.common; | |||
| import com.chilunyc.fumao.common.log.repository.EventMapper; | |||
| import com.chilunyc.fumao.common.log.request.LogPageRequest; | |||
| import com.chilunyc.fumao.common.log.response.LogResponse; | |||
| import com.chilunyc.fumao.common.response.JsonResponse; | |||
| import com.github.pagehelper.Page; | |||
| import io.swagger.annotations.Api; | |||
| import io.swagger.annotations.ApiImplicitParam; | |||
| import io.swagger.annotations.ApiImplicitParams; | |||
| import io.swagger.annotations.ApiOperation; | |||
| import org.apache.ibatis.session.RowBounds; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.data.domain.PageImpl; | |||
| import org.springframework.web.bind.annotation.RequestBody; | |||
| import org.springframework.web.bind.annotation.RequestMapping; | |||
| import org.springframework.web.bind.annotation.RequestMethod; | |||
| import org.springframework.web.bind.annotation.RestController; | |||
| /** | |||
| * | |||
| */ | |||
| @Api("日志") | |||
| @RestController | |||
| @RequestMapping("/log") | |||
| class LogController { | |||
| @Autowired | |||
| EventMapper eventMapper; | |||
| @ApiOperation(value = "分页") | |||
| @ApiImplicitParams({ | |||
| @ApiImplicitParam(name = "request", required = true, paramType = "body", dataType = "LogPageRequest") | |||
| }) | |||
| @RequestMapping(value = "", method = RequestMethod.POST) | |||
| JsonResponse page(@RequestBody LogPageRequest request) { | |||
| RowBounds rowBounds = new RowBounds(request.getStart(), request.getSize()); | |||
| Page<LogResponse> page = eventMapper.page(request, rowBounds); | |||
| return JsonResponse.success( | |||
| new PageImpl<>(page, request.getPage(), page.getTotal()) | |||
| ); | |||
| } | |||
| } | |||
| @@ -0,0 +1,34 @@ | |||
| package com.chilunyc.fumao.controller.common; | |||
| import com.chilunyc.fumao.common.context.LoginUser; | |||
| import com.chilunyc.fumao.common.response.JsonResponse; | |||
| import com.chilunyc.fumao.common.upload.response.UploadResponse; | |||
| import com.chilunyc.fumao.common.upload.service.UploadService; | |||
| import io.swagger.annotations.Api; | |||
| import io.swagger.annotations.ApiOperation; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.http.ResponseEntity; | |||
| import org.springframework.web.bind.annotation.RequestMapping; | |||
| import org.springframework.web.bind.annotation.RequestMethod; | |||
| import org.springframework.web.bind.annotation.RestController; | |||
| /** | |||
| * | |||
| */ | |||
| @Api(description = "上传服务") | |||
| @RestController | |||
| @RequestMapping("/upload") | |||
| class UploadController { | |||
| @Autowired | |||
| UploadService uploadService; | |||
| /** | |||
| * @return | |||
| */ | |||
| @ApiOperation(value = "获取上传凭证") | |||
| @RequestMapping(value = "", method = RequestMethod.GET) | |||
| ResponseEntity<JsonResponse<UploadResponse>> index(LoginUser loginUser) { | |||
| return ResponseEntity.ok(JsonResponse.success(uploadService.getAuth())); | |||
| } | |||
| } | |||
| @@ -0,0 +1,177 @@ | |||
| package com.chilunyc.fumao.controller.error; | |||
| import com.chilunyc.fumao.common.config.ApplicationProperty; | |||
| import com.chilunyc.fumao.common.exception.SystemException; | |||
| import com.chilunyc.fumao.common.log.model.EventTarget; | |||
| import com.chilunyc.fumao.common.log.model.EventType; | |||
| import com.chilunyc.fumao.common.log.service.EventService; | |||
| import com.chilunyc.fumao.common.context.RequestHolder; | |||
| import com.chilunyc.fumao.common.response.JsonResponse; | |||
| import lombok.extern.log4j.Log4j; | |||
| import org.apache.commons.io.IOUtils; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.context.MessageSource; | |||
| import org.springframework.context.NoSuchMessageException; | |||
| import org.springframework.dao.EmptyResultDataAccessException; | |||
| import org.springframework.http.HttpStatus; | |||
| import org.springframework.validation.BindException; | |||
| import org.springframework.validation.FieldError; | |||
| import org.springframework.web.bind.MethodArgumentNotValidException; | |||
| import org.springframework.web.bind.annotation.ControllerAdvice; | |||
| import org.springframework.web.bind.annotation.ExceptionHandler; | |||
| import org.springframework.web.bind.annotation.ResponseBody; | |||
| import org.springframework.web.bind.annotation.ResponseStatus; | |||
| import org.springframework.web.util.ContentCachingRequestWrapper; | |||
| import java.util.Arrays; | |||
| import java.util.List; | |||
| import java.util.Locale; | |||
| /** | |||
| * | |||
| */ | |||
| @Log4j | |||
| @ControllerAdvice | |||
| class ExceptionController { | |||
| @Autowired | |||
| MessageSource messageSource; | |||
| @Autowired | |||
| EventService eventService; | |||
| @Autowired | |||
| ApplicationProperty applicationProperty; | |||
| /** | |||
| * 业务异常 | |||
| * | |||
| * @param request | |||
| * @param ex | |||
| * @return | |||
| */ | |||
| @ExceptionHandler(SystemException.class) | |||
| @ResponseStatus(HttpStatus.OK) | |||
| @ResponseBody | |||
| JsonResponse systemExceptionHandler(ContentCachingRequestWrapper request, SystemException ex) { | |||
| String errorCode = ex.getErrorCode(); | |||
| if (StringUtils.isEmpty(errorCode)) { | |||
| errorCode = "000001"; | |||
| } | |||
| String msg = this.getMessage(errorCode, ex.getParams()); | |||
| String requestContent = ""; | |||
| try { | |||
| requestContent = IOUtils.toString(request.getContentAsByteArray(), "UTF-8"); | |||
| } catch (Exception e) { | |||
| } | |||
| if (applicationProperty.isTest()) { | |||
| log.error(request.getServletPath() + " => " + errorCode + " => " + requestContent + " ==> " + msg, ex); | |||
| } else { | |||
| String errorMsg = request.getServletPath() + " => " + errorCode + " => " + requestContent + " ==> " + msg + " || " + this.getStackJson(ex); | |||
| eventService.add(RequestHolder.get(), EventTarget.None, EventType.Error, null, errorMsg); | |||
| } | |||
| return JsonResponse.fail(errorCode, msg); | |||
| } | |||
| /** | |||
| * 参数验证 | |||
| * | |||
| * @param ex | |||
| * @return | |||
| */ | |||
| @ExceptionHandler(MethodArgumentNotValidException.class) | |||
| @ResponseStatus(HttpStatus.OK) | |||
| @ResponseBody | |||
| JsonResponse validationHandler(MethodArgumentNotValidException ex) { | |||
| List<FieldError> fieldErrors = ex.getBindingResult().getFieldErrors(); | |||
| FieldError fr = fieldErrors.get(fieldErrors.size() - 1); | |||
| return JsonResponse.fail("000003", fr.getDefaultMessage()); | |||
| } | |||
| /** | |||
| * 参数验证 | |||
| * | |||
| * @param ex | |||
| * @return | |||
| */ | |||
| @ExceptionHandler(BindException.class) | |||
| @ResponseStatus(HttpStatus.OK) | |||
| @ResponseBody | |||
| JsonResponse validationHandler(BindException ex) { | |||
| List<FieldError> fieldErrors = ex.getBindingResult().getFieldErrors(); | |||
| FieldError fr = fieldErrors.get(fieldErrors.size() - 1); | |||
| return JsonResponse.fail("000003", fr.getDefaultMessage()); | |||
| } | |||
| /** | |||
| * 数据不存在 | |||
| * | |||
| * @param ex | |||
| * @return | |||
| */ | |||
| @ExceptionHandler(EmptyResultDataAccessException.class) | |||
| @ResponseStatus(HttpStatus.OK) | |||
| @ResponseBody | |||
| JsonResponse noDataHandler(EmptyResultDataAccessException ex) { | |||
| log.error(ex.getMessage(), ex); | |||
| return JsonResponse.fail("000004", this.getMessage("000004", null)); | |||
| } | |||
| /** | |||
| * 错误统一处理 | |||
| * | |||
| * @param request | |||
| * @param ex | |||
| * @return | |||
| * @throws Exception | |||
| */ | |||
| @ExceptionHandler | |||
| @ResponseBody | |||
| JsonResponse defaultExceptionHandler(ContentCachingRequestWrapper request, Exception ex) throws Exception { | |||
| String requestContent = ""; | |||
| try { | |||
| requestContent = IOUtils.toString(request.getContentAsByteArray(), "UTF-8"); | |||
| } catch (Exception e) { | |||
| } | |||
| if (applicationProperty.isTest()) { | |||
| log.error(request.getServletPath() + " => " + requestContent + " ==> " + ex.getMessage(), ex); | |||
| return JsonResponse.fail(ex.getMessage()); | |||
| } else { | |||
| String errorMsg = request.getServletPath() + " => " + requestContent + " ==> " + ex.getMessage() + " || " + this.getStackJson(ex); | |||
| eventService.add(RequestHolder.get(), EventTarget.None, EventType.Error, null, errorMsg); | |||
| return JsonResponse.fail(); | |||
| } | |||
| } | |||
| protected String getMessage(String code, Object[] params) { | |||
| try { | |||
| return messageSource.getMessage(code, params, Locale.CHINA); | |||
| } catch (NoSuchMessageException e) { | |||
| return code; | |||
| } | |||
| } | |||
| private String getStackJson(Throwable e) { | |||
| String result = ""; | |||
| if (null != e) { | |||
| StackTraceElement[] s = e.getStackTrace(); | |||
| if (null != s) { | |||
| if (s.length > 10) { | |||
| s = Arrays.copyOfRange(s, 0, 9); | |||
| } | |||
| result = "\n"; | |||
| for (StackTraceElement ste : s) { | |||
| result += ("\tat " + ste + "\n"); | |||
| } | |||
| if (null != e.getCause()) { | |||
| result += "Cause By:" + StringUtils.trimToEmpty(e.getCause().getMessage()); | |||
| result += getStackJson(e.getCause()); | |||
| } | |||
| } | |||
| } | |||
| return result; | |||
| } | |||
| } | |||
| @@ -0,0 +1,44 @@ | |||
| package com.chilunyc.fumao.controller.error; | |||
| import com.chilunyc.fumao.common.response.JsonResponse; | |||
| import com.alibaba.fastjson.JSON; | |||
| import lombok.extern.log4j.Log4j; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.boot.autoconfigure.web.ErrorAttributes; | |||
| import org.springframework.boot.autoconfigure.web.ErrorController; | |||
| import org.springframework.web.bind.annotation.RequestMapping; | |||
| import org.springframework.web.bind.annotation.RestController; | |||
| import org.springframework.web.context.request.RequestAttributes; | |||
| import org.springframework.web.context.request.ServletRequestAttributes; | |||
| import javax.servlet.http.HttpServletRequest; | |||
| import java.util.Map; | |||
| /** | |||
| * | |||
| */ | |||
| @Log4j | |||
| @RestController | |||
| @RequestMapping("/error") | |||
| public class PanicController implements ErrorController { | |||
| @Autowired | |||
| ErrorAttributes errorAttributes; | |||
| @Autowired | |||
| ExceptionController exceptionController; | |||
| @Override | |||
| public String getErrorPath() { | |||
| return "/error"; | |||
| } | |||
| @RequestMapping | |||
| public JsonResponse error(HttpServletRequest aRequest) throws Exception { | |||
| RequestAttributes requestAttributes = new ServletRequestAttributes(aRequest); | |||
| Map<String, Object> errorAttributes = this.errorAttributes.getErrorAttributes(requestAttributes, false); | |||
| log.error(String.format("[%s] => [%s]", errorAttributes.get("path"), JSON.toJSONString(errorAttributes))); | |||
| return errorAttributes.get("error") != null ? JsonResponse.fail(errorAttributes.get("error").toString()) : JsonResponse.fail(); | |||
| } | |||
| } | |||
| @@ -0,0 +1,111 @@ | |||
| ###### | |||
| ## | |||
| ###### | |||
| logging.level.root=INFO | |||
| logging.level.com.aki=INFO | |||
| logging.level.org.springframework=INFO | |||
| logging.config=/opt/projects/config/logback.xml | |||
| ###### | |||
| ## | |||
| ###### | |||
| server.address=127.0.0.1 | |||
| server.port=8088 | |||
| spring.data.redis.repositories.enabled=false | |||
| server.undertow.io-threads=100 | |||
| ###### | |||
| ## spring boot admin | |||
| ###### | |||
| #spring.boot.admin.url=http://localhost:18081 | |||
| endpoints.enabled=false | |||
| #endpoints.metrics.endabled=true | |||
| #endpoints.health.endabled=true | |||
| #endpoints.dump.endabled=true | |||
| #management.context-path=/monitor | |||
| #management.security.enabled=false | |||
| ###### | |||
| ## | |||
| ###### | |||
| app.test=false | |||
| app.role=true | |||
| app.save-error=true | |||
| app.config-path=classpath:/config.json | |||
| ###### | |||
| ## \u90AE\u4EF6\u53D1\u9001 | |||
| ###### | |||
| #spring.mail.host= | |||
| #spring.mail.username= | |||
| #spring.mail.password= | |||
| #spring.mail.properties.mail.smtp.auth=true | |||
| #spring.mail.properties.mail.smtp.starttls.enable=true | |||
| #spring.mail.properties.mail.smtp.starttls.required=true | |||
| ###### | |||
| ## redis | |||
| ###### | |||
| spring.redis.host=127.0.0.1 | |||
| spring.redis.port=6379 | |||
| spring.redis.pool.max-idle=50 | |||
| spring.redis.pool.min-idle=50 | |||
| spring.redis.pool.max-active=50 | |||
| spring.redis.pool.max-wait=-1 | |||
| ###### | |||
| ## \u6570\u636E\u6E90 | |||
| ###### | |||
| mybatis.mapper-locations=classpath*:com/aki/**/*Mapper.xml | |||
| mybatis.configuration.default-fetch-size=100 | |||
| mybatis.configuration.default-statement-timeout=30 | |||
| mybatis.configuration.map-underscore-to-camel-case=true | |||
| pagehelper.helperDialect=mysql | |||
| pagehelper.reasonable=true | |||
| pagehelper.row-bounds-with-count=true | |||
| pagehelper.supportMethodsArguments=tru | |||
| spring.jpa.open-in-view=false | |||
| spring.datasource.url= | |||
| spring.datasource.username= | |||
| spring.datasource.password= | |||
| spring.datasource.initial-size=20 | |||
| spring.datasource.min-idle=20 | |||
| spring.datasource.max-idle=100 | |||
| spring.datasource.max-wait=10000 | |||
| spring.datasource.testOnBorrow=true | |||
| spring.datasource.validation-query=SELECT 1 | |||
| ##### | |||
| ## \u963F\u91CC\u4E91 - OSS | |||
| ###### | |||
| aliyun.oss.access-id= | |||
| aliyun.oss.access-key= | |||
| aliyun.oss.end-point= | |||
| aliyun.oss.bucket= | |||
| ###### | |||
| ## \u963F\u91CC\u4E91 - \u77ED\u4FE1 | |||
| ###### | |||
| aliyun.sms.type=sms | |||
| aliyun.sms.access-id= | |||
| aliyun.sms.access-key= | |||
| aliyun.sms.end-point= | |||
| aliyun.sms.sign-name= | |||
| aliyun.sms.param-name=content | |||
| aliyun.sms.topic= | |||
| aliyun.sms.expired-duration=2 | |||
| ###### | |||
| ## \u5FAE\u4FE1 | |||
| ###### | |||
| wechat.mp.app-id= | |||
| wechat.mp.secret= | |||
| wechat.mp.token= | |||
| wechat.mp.aesKey= | |||
| wechat.mp.mch-id= | |||
| wechat.mp.mch-key= | |||
| wechat.mp.key-path= | |||
| wechat.ma.app-id= | |||
| wechat.ma.secret= | |||
| @@ -0,0 +1,99 @@ | |||
| ###### | |||
| ## | |||
| ###### | |||
| logging.level.root=INFO | |||
| logging.level.com.aki=TRACE | |||
| logging.level.org.springframework=INFO | |||
| logging.level.org.hibernate=INFO | |||
| ###### | |||
| ## | |||
| ###### | |||
| server.address=0.0.0.0 | |||
| server.port=8088 | |||
| server.session.timeout=36000000 | |||
| spring.data.redis.repositories.enabled=false | |||
| spring.output.ansi.enabled=ALWAYS | |||
| ###### | |||
| ## spring boot admin | |||
| ###### | |||
| #spring.boot.admin.url=http://localhost:18081 | |||
| #endpoints.enabled=false | |||
| #endpoints.metrics.endabled=true | |||
| #endpoints.health.endabled=true | |||
| #endpoints.dump.endabled=true | |||
| management.context-path=/monitor | |||
| management.security.enabled=false | |||
| ###### | |||
| ## \u7CFB\u7EDF\u914D\u7F6E | |||
| ###### | |||
| app.test=true | |||
| app.role=true | |||
| app.cache-time=3600 | |||
| app.save-error=false | |||
| app.config-path=classpath:config.json | |||
| ###### | |||
| ## \u6570\u636E\u6E90 | |||
| ###### | |||
| mybatis.mapper-locations=classpath*:com/chilunyc/**/*Mapper.xml | |||
| mybatis.configuration.default-fetch-size=100 | |||
| mybatis.configuration.default-statement-timeout=30 | |||
| mybatis.configuration.map-underscore-to-camel-case=true | |||
| pagehelper.helperDialect=mysql | |||
| pagehelper.reasonable=true | |||
| pagehelper.row-bounds-with-count=true | |||
| pagehelper.supportMethodsArguments=true | |||
| spring.jpa.hibernate.ddl-auto=update | |||
| spring.jpa.show-sql=true | |||
| spring.jpa.open-in-view=false | |||
| spring.datasource.testOnBorrow=true | |||
| spring.datasource.url=jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=UTF-8&&zeroDateTimeBehavior=convertToNull&autoReconnect=true&failOverReadOnly=false&connectTimeout=0 | |||
| #spring.datasource.url=jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=UTF-8&&zeroDateTimeBehavior=convertToNull&autoReconnect=true&failOverReadOnly=false&connectTimeout=0&useSSL=true | |||
| spring.datasource.username=root | |||
| spring.datasource.password= | |||
| ###### | |||
| ## redis | |||
| ###### | |||
| spring.redis.host=127.0.0.1 | |||
| #spring.redis.password= | |||
| spring.redis.port=6379 | |||
| spring.redis.pool.max-idle=10 | |||
| spring.redis.pool.min-idle=10 | |||
| spring.redis.pool.max-active=10 | |||
| spring.redis.pool.max-wait=-1 | |||
| ###### | |||
| ## \u963F\u91CC\u4E91 - OSS | |||
| ###### | |||
| aliyun.oss.access-id= | |||
| aliyun.oss.access-key= | |||
| aliyun.oss.end-point= | |||
| aliyun.oss.bucket= | |||
| ###### | |||
| ## \u963F\u91CC\u4E91 - \u77ED\u4FE1 mns | sms | |||
| ###### | |||
| sms.name=\u5BCC\u8302\u79D1\u6280\u6709\u9650\u516C\u53F8 | |||
| sms.bid=46565 | |||
| sms.account=15626593768 | |||
| sms.secret=7305150347587283553aa8898e7dbf20 | |||
| sms.publick-key=classpath://sms.key | |||
| ###### | |||
| ## \u5FAE\u4FE1 | |||
| ###### | |||
| wechat.mp.app-id= | |||
| wechat.mp.secret= | |||
| wechat.mp.token= | |||
| wechat.mp.aesKey= | |||
| wechat.mp.mch-id= | |||
| wechat.mp.mch-key= | |||
| wechat.mp.key-path= | |||
| ###### | |||
| ## \u767E\u5EA6 | |||
| ###### | |||
| baidu.lbs.ak=UU7tWzU6kz4UesVqXnmOSWsFGkUQrRZs | |||
| @@ -0,0 +1,17 @@ | |||
| TTTTTTTTTTTTTTTTTTTTTTT kkkkkkkk kkkkkkkk | |||
| T:::::::::::::::::::::T k::::::k k::::::k | |||
| T:::::::::::::::::::::T k::::::k k::::::k | |||
| T:::::TT:::::::TT:::::T k::::::k k::::::k | |||
| TTTTTT T:::::T TTTTTT k:::::k kkkkkkk k:::::k kkkkkkk | |||
| T:::::T k:::::k k:::::k k:::::k k:::::k | |||
| T:::::T k:::::k k:::::k k:::::k k:::::k | |||
| T:::::T k:::::k k:::::k k:::::k k:::::k | |||
| T:::::T k::::::k:::::k k::::::k:::::k | |||
| T:::::T k:::::::::::k k:::::::::::k | |||
| T:::::T k:::::::::::k k:::::::::::k | |||
| T:::::T k::::::k:::::k k::::::k:::::k | |||
| TT:::::::TT k::::::k k:::::k k::::::k k:::::k | |||
| T:::::::::T k::::::k k:::::k k::::::k k:::::k | |||
| T:::::::::T k::::::k k:::::k k::::::k k:::::k | |||
| TTTTTTTTTTT kkkkkkkk kkkkkkk kkkkkkkk kkkkkkk | |||
| @@ -0,0 +1,3 @@ | |||
| { | |||
| } | |||
| @@ -0,0 +1,13 @@ | |||
| 000000=ok | |||
| 000001=\u7CFB\u7EDF\u9519\u8BEF | |||
| 000002=\u5C1A\u672A\u767B\u5F55 | |||
| 000003=\u53C2\u6570\u9519\u8BEF | |||
| 000004=\u7528\u6237\u540D\u6216\u5BC6\u7801\u9519\u8BEF | |||
| 000005=\u5FAE\u4FE1\u9519\u8BEF | |||
| 000006=\u6CA1\u6709\u6743\u9650\u8BBF\u95EE | |||
| 000007=\u8BBF\u95EE\u9891\u7E41, {0} | |||
| 000008=\u767E\u5EA6\u63A5\u53E3\u8FD4\u56DE\u9519\u8BEF | |||
| 100000=\u5DF2\u5B58\u5728\u76F8\u540C\u7684\u624B\u673A\u53F7 | |||
| 100001=\u4E0D\u80FD\u5220\u9664\u81EA\u5DF1 | |||
| @@ -0,0 +1,8 @@ | |||
| [ | |||
| { | |||
| "name": "", | |||
| "url": "", | |||
| "method": "", | |||
| "order": 0 | |||
| } | |||
| ] | |||
| @@ -0,0 +1,13 @@ | |||
| -----BEGIN PUBLIC KEY----- | |||
| MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvh8j/zagfxQdnSh5OIic | |||
| MzN+MuRuWQJPjgu4Gza4+gX3j5Ln2xNDBOTjpwyuLBjh/JcBd1cGO3lAaKCwcaix | |||
| smhTq56wVXXUMgDiAChu4ud8FSvRc8G8tdZAirKVAIi3NW+/pYgpWBs/0wnF8hz4 | |||
| 8no4pyJHl9Jc1LH3VNIMz8vqzKUPc4ack4pFUXlcNj6C+sBlaurmI4/vwLqNxBGs | |||
| 7/zyM7dv6oy3DSU/Y1qBArM1YPjfL2dNun8rmtPgJvlPwXqA7uoHPwQ2Ym3aUn59 | |||
| pkS7QI6IE8uuqNkfSte8BXLd2nIqPLFxLYLDmdll7eoyRblHcHqAYSj8stK6StC7 | |||
| DNryNKEjTEwbgf9trUI0uvF1pfgTy2gpclnY69FtD/m0+FvLyorMq+nmBqYMjka5 | |||
| K0txDQJPOa7gsi//uXd/cJW2SAXY9MSO1AfMi8Xq/YKRQzN9FW5iapskXFHca7uX | |||
| g5NhH7flr6DW+QInFlpoN6WIEAuDF1aj4O49Ikm3WxwhTqnvEkdSCfivpYQkp9Sh | |||
| 4kQ/SQdxuT7VX+Nz6k+uMx2z4cySk33bHi0KoHbA9QFGg/54Qd0+eU4qZnd4mrgh | |||
| hH7/QQhL7Z9eF1U5UPrsHq2Vq3rEnN+tYQ26AuKeU8vzTxBrC/SxC6C/SMFt3f/Y | |||
| nuFh1UnNJZleZwyQt+ZdGO0CAwEAAQ== | |||
| @@ -0,0 +1,243 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <project xmlns="http://maven.apache.org/POM/4.0.0" | |||
| xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||
| xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||
| <parent> | |||
| <artifactId>fumao</artifactId> | |||
| <groupId>com.aki</groupId> | |||
| <version>0.0.1-SNAPSHOT</version> | |||
| </parent> | |||
| <modelVersion>4.0.0</modelVersion> | |||
| <artifactId>fumao-common</artifactId> | |||
| <dependencies> | |||
| <dependency> | |||
| <groupId>javax.servlet</groupId> | |||
| <artifactId>servlet-api</artifactId> | |||
| <version>2.5</version> | |||
| <scope>provided</scope> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>com.github.penggle</groupId> | |||
| <artifactId>kaptcha</artifactId> | |||
| <version>2.3.2</version> | |||
| </dependency> | |||
| <!-- --> | |||
| <dependency> | |||
| <groupId>com.squareup.okhttp3</groupId> | |||
| <artifactId>okhttp</artifactId> | |||
| <version>3.10.0</version> | |||
| </dependency> | |||
| <!-- aliyun --> | |||
| <dependency> | |||
| <groupId>com.aliyun.mns</groupId> | |||
| <artifactId>aliyun-sdk-mns</artifactId> | |||
| <version>1.1.8.4</version> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>com.aliyun.oss</groupId> | |||
| <artifactId>aliyun-sdk-oss</artifactId> | |||
| <version>2.6.1</version> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>com.aliyun</groupId> | |||
| <artifactId>aliyun-java-sdk-core</artifactId> | |||
| <version>3.2.3</version> | |||
| <scope>system</scope> | |||
| <systemPath>${project.basedir}/src/main/lib/aliyun-java-sdk-core-3.2.2.jar</systemPath> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>com.aliyun</groupId> | |||
| <artifactId>aliyun-java-sdk-dysmsapi</artifactId> | |||
| <version>1.0.0</version> | |||
| <scope>system</scope> | |||
| <systemPath>${project.basedir}/src/main/lib/aliyun-java-sdk-dysmsapi-1.0.0-SANPSHOT.jar</systemPath> | |||
| </dependency> | |||
| <!-- 权限框架 --> | |||
| <dependency> | |||
| <groupId>org.springframework.boot</groupId> | |||
| <artifactId>spring-boot-starter-security</artifactId> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>org.springframework.security</groupId> | |||
| <artifactId>spring-security-jwt</artifactId> | |||
| </dependency> | |||
| <!-- weixin --> | |||
| <dependency> | |||
| <groupId>com.github.binarywang</groupId> | |||
| <artifactId>weixin-java-mp</artifactId> | |||
| <version>${weixin.version}</version> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>com.github.binarywang</groupId> | |||
| <artifactId>weixin-java-pay</artifactId> | |||
| <version>${weixin.version}</version> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>com.github.binarywang</groupId> | |||
| <artifactId>weixin-java-miniapp</artifactId> | |||
| <version>${weixin.version}</version> | |||
| </dependency> | |||
| <!-- Swagger --> | |||
| <dependency> | |||
| <groupId>io.springfox</groupId> | |||
| <artifactId>springfox-swagger-ui</artifactId> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>io.springfox</groupId> | |||
| <artifactId>springfox-swagger2</artifactId> | |||
| </dependency> | |||
| <!-- --> | |||
| <dependency> | |||
| <groupId>org.projectlombok</groupId> | |||
| <artifactId>lombok</artifactId> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>com.alibaba</groupId> | |||
| <artifactId>fastjson</artifactId> | |||
| <version>1.2.33</version> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>org.redisson</groupId> | |||
| <artifactId>redisson</artifactId> | |||
| <version>3.5.7</version> | |||
| </dependency> | |||
| <!-- jwt --> | |||
| <dependency> | |||
| <groupId>io.jsonwebtoken</groupId> | |||
| <artifactId>jjwt</artifactId> | |||
| <version>${jjwt.version}</version> | |||
| </dependency> | |||
| <!-- --> | |||
| <dependency> | |||
| <groupId>org.apache.commons</groupId> | |||
| <artifactId>commons-lang3</artifactId> | |||
| <version>3.4</version> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>commons-codec</groupId> | |||
| <artifactId>commons-codec</artifactId> | |||
| <version>1.10</version> | |||
| </dependency> | |||
| <!-- mybatis --> | |||
| <dependency> | |||
| <groupId>org.mybatis.spring.boot</groupId> | |||
| <artifactId>mybatis-spring-boot-starter</artifactId> | |||
| <version>1.3.0</version> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>com.github.pagehelper</groupId> | |||
| <artifactId>pagehelper-spring-boot-starter</artifactId> | |||
| <version>1.1.2</version> | |||
| </dependency> | |||
| <!-- jpa --> | |||
| <dependency> | |||
| <groupId>org.springframework.boot</groupId> | |||
| <artifactId>spring-boot-starter-data-jpa</artifactId> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>com.zaxxer</groupId> | |||
| <artifactId>HikariCP</artifactId> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>io.dropwizard.metrics</groupId> | |||
| <artifactId>metrics-core</artifactId> | |||
| <optional>true</optional> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>mysql</groupId> | |||
| <artifactId>mysql-connector-java</artifactId> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>com.h2database</groupId> | |||
| <artifactId>h2</artifactId> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>org.hibernate</groupId> | |||
| <artifactId>hibernate-validator</artifactId> | |||
| </dependency> | |||
| <!-- jackson --> | |||
| <dependency> | |||
| <groupId>com.fasterxml.jackson.core</groupId> | |||
| <artifactId>jackson-core</artifactId> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>com.fasterxml.jackson.core</groupId> | |||
| <artifactId>jackson-annotations</artifactId> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>com.fasterxml.jackson.core</groupId> | |||
| <artifactId>jackson-databind</artifactId> | |||
| </dependency> | |||
| <!-- redis --> | |||
| <dependency> | |||
| <groupId>org.springframework.data</groupId> | |||
| <artifactId>spring-data-redis</artifactId> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>org.springframework.boot</groupId> | |||
| <artifactId>spring-boot-starter-redis</artifactId> | |||
| <version>1.4.7.RELEASE</version> | |||
| </dependency> | |||
| <!-- spring boot admin --> | |||
| <!--<dependency>--> | |||
| <!--<groupId>de.codecentric</groupId>--> | |||
| <!--<artifactId>spring-boot-admin-starter-client</artifactId>--> | |||
| <!--<version>1.5.7</version>--> | |||
| <!--</dependency>--> | |||
| <!--<dependency>--> | |||
| <!--<groupId>org.springframework.boot</groupId>--> | |||
| <!--<artifactId>spring-boot-starter-actuator</artifactId>--> | |||
| <!--</dependency>--> | |||
| <!-- excel --> | |||
| <dependency> | |||
| <groupId>org.apache.poi</groupId> | |||
| <artifactId>poi</artifactId> | |||
| <version>3.17</version> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>org.apache.poi</groupId> | |||
| <artifactId>poi-ooxml</artifactId> | |||
| <version>3.17</version> | |||
| </dependency> | |||
| <!-- 扩展时间 --> | |||
| <dependency> | |||
| <groupId>joda-time</groupId> | |||
| <artifactId>joda-time</artifactId> | |||
| <version>2.9.9</version> | |||
| </dependency> | |||
| <!-- word --> | |||
| <dependency> | |||
| <groupId>com.deepoove</groupId> | |||
| <artifactId>poi-tl</artifactId> | |||
| <version>1.2.0</version> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>org.springframework.boot</groupId> | |||
| <artifactId>spring-boot-starter-test</artifactId> | |||
| <scope>test</scope> | |||
| </dependency> | |||
| </dependencies> | |||
| </project> | |||
| @@ -0,0 +1,49 @@ | |||
| package com.chilunyc.fumao.common.aop; | |||
| import javassist.*; | |||
| import org.aspectj.lang.JoinPoint; | |||
| import org.aspectj.lang.reflect.MethodSignature; | |||
| import org.springframework.core.LocalVariableTableParameterNameDiscoverer; | |||
| import java.lang.reflect.Method; | |||
| import java.util.HashMap; | |||
| import java.util.Map; | |||
| /** | |||
| * | |||
| */ | |||
| public abstract class BaseAop { | |||
| /** | |||
| * @param point | |||
| * @param clazz | |||
| * @param <T> | |||
| * @return | |||
| */ | |||
| protected <T> T getAnnotation(JoinPoint point, Class clazz) throws NoSuchMethodException { | |||
| MethodSignature signature = (MethodSignature) point.getSignature(); | |||
| Method method = point.getTarget().getClass().getMethod(signature.getName(), signature.getParameterTypes()); | |||
| return (T) method.getAnnotation(clazz); | |||
| } | |||
| /** | |||
| * @param point | |||
| * @return | |||
| */ | |||
| protected String getMethodName(JoinPoint point) { | |||
| MethodSignature signature = (MethodSignature) point.getSignature(); | |||
| Method method = signature.getMethod(); | |||
| return method.getName(); | |||
| } | |||
| protected Map<String, Object> getArgs(JoinPoint point) throws NotFoundException { | |||
| MethodSignature signature = (MethodSignature) point.getSignature(); | |||
| Map<String, Object> map = new HashMap<>(); | |||
| LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer(); | |||
| String[] parameterNames = u.getParameterNames(signature.getMethod()); | |||
| for (int i = 0; i < parameterNames.length; i++) { | |||
| map.put(parameterNames[i], point.getArgs()[i]);//paramNames即参数名 | |||
| } | |||
| return map; | |||
| } | |||
| } | |||
| @@ -0,0 +1,130 @@ | |||
| package com.chilunyc.fumao.common.aop.cache; | |||
| import com.chilunyc.fumao.common.aop.BaseAop; | |||
| import com.chilunyc.fumao.common.util.SpelHelper; | |||
| import lombok.extern.log4j.Log4j; | |||
| import org.apache.commons.codec.binary.Hex; | |||
| import org.apache.commons.lang.SerializationUtils; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.aspectj.lang.JoinPoint; | |||
| import org.aspectj.lang.ProceedingJoinPoint; | |||
| import org.aspectj.lang.annotation.Around; | |||
| import org.aspectj.lang.annotation.Aspect; | |||
| import org.aspectj.lang.annotation.Before; | |||
| import org.springframework.beans.factory.InitializingBean; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.data.redis.core.BoundValueOperations; | |||
| import org.springframework.data.redis.core.StringRedisTemplate; | |||
| import org.springframework.data.redis.core.script.DefaultRedisScript; | |||
| import org.springframework.stereotype.Component; | |||
| import java.io.Serializable; | |||
| import java.util.Collections; | |||
| import java.util.Map; | |||
| /** | |||
| * | |||
| */ | |||
| @Log4j | |||
| @Component | |||
| @Aspect | |||
| public class CacheAop extends BaseAop implements InitializingBean { | |||
| @Autowired | |||
| private StringRedisTemplate redisTemplate; | |||
| private DefaultRedisScript luaRemoveAllScript; | |||
| /** | |||
| * 缓存cache | |||
| * | |||
| * @param proceedingJoinPoint | |||
| * @throws Throwable | |||
| */ | |||
| @Around("@annotation(com.chilunyc.fumao.common.aop.cache.Cacheable)") | |||
| Object cacheable(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { | |||
| try { | |||
| Cacheable annotation = getAnnotation(proceedingJoinPoint, Cacheable.class); | |||
| Map<String, Object> args = getArgs(proceedingJoinPoint); | |||
| String redisKey = annotation.value() + SpelHelper.exec(annotation.key(), args); | |||
| BoundValueOperations<String, String> value = redisTemplate.boundValueOps(redisKey); | |||
| // 有值 | |||
| String result = value.get(); | |||
| if (StringUtils.isNotBlank(result)) { | |||
| byte[] bytes = Hex.decodeHex(result.toCharArray()); | |||
| return SerializationUtils.deserialize(bytes); | |||
| } | |||
| // 没有值, 调用缓存 | |||
| else { | |||
| Object proceed = proceedingJoinPoint.proceed(proceedingJoinPoint.getArgs()); | |||
| if (proceed == null) { | |||
| return null; | |||
| } | |||
| //判断是否要存 | |||
| if (StringUtils.isNotBlank(annotation.exclude())) { | |||
| args.put("result", proceed); | |||
| Boolean isNotSave = SpelHelper.exec(annotation.exclude(), args); | |||
| if (isNotSave) { | |||
| return proceed; | |||
| } | |||
| } | |||
| //开始存 | |||
| byte[] serialize = SerializationUtils.serialize((Serializable) proceed); | |||
| String s = Hex.encodeHexString(serialize); | |||
| if (annotation.timeout() != -1L) { | |||
| value.set(s, annotation.timeout(), annotation.unit()); | |||
| } else { | |||
| value.set(s); | |||
| } | |||
| // 放入一个list, 后面可以删除 | |||
| if (StringUtils.isNotBlank(annotation.value())) { | |||
| redisTemplate.boundListOps(annotation.value()).leftPush(redisKey); | |||
| } | |||
| return proceed; | |||
| } | |||
| } catch (Exception e) { | |||
| log.error(e); | |||
| return proceedingJoinPoint.proceed(); | |||
| } | |||
| } | |||
| /** | |||
| * 清空cache | |||
| * | |||
| * @param joinPoint | |||
| * @throws Throwable | |||
| */ | |||
| @Before("@annotation(com.chilunyc.fumao.common.aop.cache.CacheEvict)") | |||
| void cacheEvict(JoinPoint joinPoint) throws Throwable { | |||
| CacheEvict annotation = getAnnotation(joinPoint, CacheEvict.class); | |||
| // 清空所有 | |||
| if (annotation.allEntries()) { | |||
| if (annotation.value().length > 0) { | |||
| for (String v : annotation.value()) { | |||
| redisTemplate.execute(luaRemoveAllScript, Collections.singletonList(v)); | |||
| } | |||
| } | |||
| } | |||
| // 清空单个 | |||
| else { | |||
| String v = annotation.value()[0]; | |||
| Map<String, Object> args = getArgs(joinPoint); | |||
| String redisKey = v + SpelHelper.exec(annotation.key(), args); | |||
| redisTemplate.delete(redisKey); | |||
| redisTemplate.boundListOps(v).remove(1, redisKey); | |||
| } | |||
| } | |||
| @Override | |||
| public void afterPropertiesSet() throws Exception { | |||
| this.luaRemoveAllScript = new DefaultRedisScript<>(); | |||
| this.luaRemoveAllScript.setScriptText("local size = redis.call('llen', KEYS[1])\n" + | |||
| "local vs = redis.call('lrange', KEYS[1], 0, size)\n" + | |||
| "for x,y in ipairs(vs) do\n" + | |||
| " redis.call('del', y)\n" + | |||
| "end\n" + | |||
| "redis.call('ltrim', KEYS[1], size, -1)"); | |||
| } | |||
| } | |||
| @@ -0,0 +1,19 @@ | |||
| package com.chilunyc.fumao.common.aop.cache; | |||
| import java.lang.annotation.*; | |||
| /** | |||
| * | |||
| */ | |||
| @Target({ElementType.METHOD, ElementType.TYPE}) | |||
| @Retention(RetentionPolicy.RUNTIME) | |||
| @Inherited | |||
| @Documented | |||
| public @interface CacheEvict { | |||
| String[] value() default ""; | |||
| String key() default ""; | |||
| boolean allEntries() default false; | |||
| } | |||
| @@ -0,0 +1,24 @@ | |||
| package com.chilunyc.fumao.common.aop.cache; | |||
| import java.lang.annotation.*; | |||
| import java.util.concurrent.TimeUnit; | |||
| /** | |||
| * | |||
| */ | |||
| @Target({ElementType.METHOD}) | |||
| @Retention(RetentionPolicy.RUNTIME) | |||
| @Inherited | |||
| @Documented | |||
| public @interface Cacheable { | |||
| String value() default ""; | |||
| String key() default ""; | |||
| long timeout() default -1L; | |||
| String exclude() default ""; | |||
| TimeUnit unit() default TimeUnit.SECONDS; | |||
| } | |||
| @@ -0,0 +1,23 @@ | |||
| package com.chilunyc.fumao.common.aop.limit; | |||
| import java.lang.annotation.ElementType; | |||
| import java.lang.annotation.Retention; | |||
| import java.lang.annotation.RetentionPolicy; | |||
| import java.lang.annotation.Target; | |||
| import java.util.concurrent.TimeUnit; | |||
| /** | |||
| * | |||
| */ | |||
| @Target({ElementType.METHOD}) | |||
| @Retention(RetentionPolicy.RUNTIME) | |||
| public @interface Limit { | |||
| String key() default ""; | |||
| long timeout() default 5l; | |||
| TimeUnit unit() default TimeUnit.SECONDS; | |||
| String message() default "请忽重复提交"; | |||
| } | |||
| @@ -0,0 +1,41 @@ | |||
| package com.chilunyc.fumao.common.aop.limit; | |||
| import com.chilunyc.fumao.common.aop.BaseAop; | |||
| import com.chilunyc.fumao.common.exception.SystemException; | |||
| import com.chilunyc.fumao.common.util.SpelHelper; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.aspectj.lang.JoinPoint; | |||
| import org.aspectj.lang.annotation.Aspect; | |||
| import org.aspectj.lang.annotation.Before; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.data.redis.core.StringRedisTemplate; | |||
| import org.springframework.stereotype.Component; | |||
| import java.util.Map; | |||
| /** | |||
| * | |||
| */ | |||
| @Component | |||
| @Aspect | |||
| public class LimitAop extends BaseAop { | |||
| @Autowired | |||
| private StringRedisTemplate redisTemplate; | |||
| @Before("@annotation(com.chilunyc.fumao.common.aop.limit.Limit)") | |||
| void execute(JoinPoint joinPoint) throws Throwable { | |||
| Limit annotation = getAnnotation(joinPoint, Limit.class); | |||
| Map<String, Object> args = getArgs(joinPoint); | |||
| String redisKey = getMethodName(joinPoint) + (StringUtils.isBlank(annotation.key()) ? "" : SpelHelper.exec(annotation.key(), args)); | |||
| // 没值, 缓存一下 | |||
| if (redisTemplate.opsForValue().setIfAbsent(redisKey, "v")) { | |||
| redisTemplate.expire(redisKey, annotation.timeout(), annotation.unit()); | |||
| } | |||
| // 有值, 所有有人提交过了, 出错 | |||
| else { | |||
| throw new SystemException("000007", new Object[]{annotation.message()}); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,23 @@ | |||
| package com.chilunyc.fumao.common.aop.lock; | |||
| import java.lang.annotation.ElementType; | |||
| import java.lang.annotation.Retention; | |||
| import java.lang.annotation.RetentionPolicy; | |||
| import java.lang.annotation.Target; | |||
| import java.util.concurrent.TimeUnit; | |||
| /** | |||
| * | |||
| */ | |||
| @Target({ElementType.METHOD}) | |||
| @Retention(RetentionPolicy.RUNTIME) | |||
| public @interface Lock { | |||
| String key() default ""; | |||
| long timeout() default -1; | |||
| TimeUnit unit() default TimeUnit.SECONDS; | |||
| String message() default "请稍候重试"; | |||
| } | |||
| @@ -0,0 +1,38 @@ | |||
| package com.chilunyc.fumao.common.aop.lock; | |||
| import com.chilunyc.fumao.common.aop.BaseAop; | |||
| import com.chilunyc.fumao.common.util.SpelHelper; | |||
| import org.aspectj.lang.ProceedingJoinPoint; | |||
| import org.aspectj.lang.annotation.Around; | |||
| import org.aspectj.lang.annotation.Aspect; | |||
| import org.redisson.api.RLock; | |||
| import org.redisson.api.RedissonClient; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.stereotype.Component; | |||
| import java.util.Map; | |||
| /** | |||
| * | |||
| */ | |||
| @Component | |||
| @Aspect | |||
| public class LockAop extends BaseAop { | |||
| @Autowired | |||
| private RedissonClient redissonClient; | |||
| @Around("@annotation(com.chilunyc.fumao.common.aop.lock.Lock)") | |||
| Object execute(ProceedingJoinPoint joinPoint) throws Throwable { | |||
| Lock annotation = getAnnotation(joinPoint, Lock.class); | |||
| Map<String, Object> args = getArgs(joinPoint); | |||
| String redisKey = getMethodName(joinPoint) + "_" + SpelHelper.exec(annotation.key(), args); | |||
| RLock lock = redissonClient.getLock(redisKey); | |||
| try { | |||
| lock.lock(); | |||
| return joinPoint.proceed(); | |||
| } finally { | |||
| lock.unlock(); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,22 @@ | |||
| package com.chilunyc.fumao.common.aop.retry; | |||
| import java.lang.annotation.ElementType; | |||
| import java.lang.annotation.Retention; | |||
| import java.lang.annotation.RetentionPolicy; | |||
| import java.lang.annotation.Target; | |||
| /** | |||
| * | |||
| */ | |||
| @Target({ElementType.METHOD}) | |||
| @Retention(RetentionPolicy.RUNTIME) | |||
| public @interface Retry { | |||
| String scene() default ""; | |||
| /** | |||
| * 最大次数 | |||
| * @return | |||
| */ | |||
| int maxTimes() default 3; | |||
| } | |||
| @@ -0,0 +1,32 @@ | |||
| package com.chilunyc.fumao.common.aop.retry; | |||
| import com.chilunyc.fumao.common.aop.BaseAop; | |||
| import lombok.extern.log4j.Log4j; | |||
| import org.aspectj.lang.ProceedingJoinPoint; | |||
| import org.aspectj.lang.annotation.Around; | |||
| import org.aspectj.lang.annotation.Aspect; | |||
| import org.springframework.stereotype.Component; | |||
| /** | |||
| * | |||
| */ | |||
| @Log4j | |||
| @Component | |||
| @Aspect | |||
| public class RetryAop extends BaseAop { | |||
| @Around("@annotation(com.chilunyc.fumao.common.aop.retry.Retry)") | |||
| Object execute(ProceedingJoinPoint joinPoint) throws Throwable { | |||
| Retry annotation = getAnnotation(joinPoint, Retry.class); | |||
| int times = 0; | |||
| Object result = null; | |||
| while (times++ < annotation.maxTimes()) { | |||
| try { | |||
| result = joinPoint.proceed(); | |||
| } catch (Exception e) { | |||
| log.error(String.format("重试, 场景[%s], 参数[%s], 次数[%s] => 失败[%s]", annotation.scene(), joinPoint.getArgs(), times, e.getMessage())); | |||
| } | |||
| } | |||
| return result; | |||
| } | |||
| } | |||
| @@ -0,0 +1,24 @@ | |||
| package com.chilunyc.fumao.common.config; | |||
| import lombok.Data; | |||
| import org.springframework.boot.context.properties.ConfigurationProperties; | |||
| /** | |||
| * | |||
| */ | |||
| @Data | |||
| @ConfigurationProperties(prefix = "app") | |||
| public class ApplicationProperty { | |||
| private boolean test; | |||
| private boolean role; | |||
| private boolean auth; | |||
| private boolean saveError; | |||
| private String configPath; | |||
| private String aesKey; | |||
| } | |||
| @@ -0,0 +1,9 @@ | |||
| package com.chilunyc.fumao.common.config; | |||
| /** | |||
| * | |||
| */ | |||
| public interface CacheEnums { | |||
| String Permission = "Permission"; | |||
| } | |||
| @@ -0,0 +1,8 @@ | |||
| package com.chilunyc.fumao.common.config; | |||
| /** | |||
| * | |||
| */ | |||
| public enum ConfigEnum { | |||
| } | |||
| @@ -0,0 +1,14 @@ | |||
| package com.chilunyc.fumao.common.config; | |||
| import lombok.Data; | |||
| /** | |||
| * | |||
| */ | |||
| @Data | |||
| public class ConfigRequest { | |||
| private ConfigEnum key; | |||
| private String value; | |||
| } | |||
| @@ -0,0 +1,46 @@ | |||
| package com.chilunyc.fumao.common.config; | |||
| import com.alibaba.fastjson.JSON; | |||
| import lombok.extern.log4j.Log4j; | |||
| import org.apache.commons.io.IOUtils; | |||
| import org.springframework.beans.factory.InitializingBean; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.core.io.DefaultResourceLoader; | |||
| import org.springframework.data.redis.core.BoundHashOperations; | |||
| import org.springframework.data.redis.core.RedisTemplate; | |||
| import org.springframework.stereotype.Service; | |||
| import java.io.InputStream; | |||
| /** | |||
| * | |||
| */ | |||
| @Log4j | |||
| @Service | |||
| public class ConfigService implements InitializingBean { | |||
| @Autowired | |||
| private RedisTemplate<String, String> redisTemplate; | |||
| @Autowired | |||
| private ApplicationProperty applicationProperty; | |||
| private BoundHashOperations<String, Object, Object> ops; | |||
| public void set(ConfigEnum key, Object v) { | |||
| this.ops.put(key.name(), v); | |||
| } | |||
| public <T> T get(ConfigEnum key) { | |||
| return (T) this.ops.get(key.name()); | |||
| } | |||
| @Override | |||
| public void afterPropertiesSet() throws Exception { | |||
| this.ops = redisTemplate.boundHashOps(ConfigService.class.getName()); | |||
| if (this.ops.size() == 0) { | |||
| InputStream inputStream = new DefaultResourceLoader().getResource(applicationProperty.getConfigPath()).getInputStream(); | |||
| String configContent = IOUtils.toString(inputStream, "utf-8"); | |||
| this.ops.putAll(JSON.parseObject(configContent)); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,23 @@ | |||
| package com.chilunyc.fumao.common.config; | |||
| import org.redisson.Redisson; | |||
| import org.redisson.api.RedissonClient; | |||
| import org.redisson.config.Config; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.boot.autoconfigure.data.redis.RedisProperties; | |||
| import org.springframework.context.annotation.Bean; | |||
| import org.springframework.context.annotation.Configuration; | |||
| @Configuration | |||
| public class RedissonConfig { | |||
| @Autowired | |||
| private RedisProperties redisProperties; | |||
| @Bean | |||
| RedissonClient redissonClient() { | |||
| Config config = new Config(); | |||
| config.useSingleServer().setAddress(String.format("redis://%s:%s", redisProperties.getHost(), redisProperties.getPort())); | |||
| return Redisson.create(config); | |||
| } | |||
| } | |||
| @@ -0,0 +1,42 @@ | |||
| package com.chilunyc.fumao.common.context; | |||
| import io.jsonwebtoken.Claims; | |||
| import io.jsonwebtoken.JwtBuilder; | |||
| /** | |||
| * | |||
| */ | |||
| public interface LoginUser<T> { | |||
| /** | |||
| * Id | |||
| * | |||
| * @return | |||
| */ | |||
| T getId(); | |||
| /** | |||
| * 用户名 | |||
| * | |||
| * @return | |||
| */ | |||
| String getName(); | |||
| /** | |||
| * @return | |||
| */ | |||
| String[] toRoles(); | |||
| /** | |||
| * | |||
| * @param claims | |||
| */ | |||
| void fromJwt(Claims claims); | |||
| /** | |||
| * | |||
| * @param claims | |||
| */ | |||
| void toJwt(JwtBuilder claims); | |||
| } | |||
| @@ -0,0 +1,77 @@ | |||
| package com.chilunyc.fumao.common.context; | |||
| import com.chilunyc.fumao.common.util.jwt.JwtUtils; | |||
| import io.jsonwebtoken.Claims; | |||
| import lombok.AllArgsConstructor; | |||
| import lombok.Builder; | |||
| import lombok.Data; | |||
| import lombok.NoArgsConstructor; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import javax.servlet.http.HttpServletRequest; | |||
| import javax.servlet.http.HttpSession; | |||
| /** | |||
| * | |||
| */ | |||
| @Data | |||
| @Builder | |||
| @NoArgsConstructor | |||
| @AllArgsConstructor | |||
| public class Request { | |||
| private JwtUtils.T jwtType; | |||
| private Claims jwtValue; | |||
| public String getIp() { | |||
| String ip = request.getHeader("x-real-ip"); | |||
| if (StringUtils.isBlank(ip)) { | |||
| return request.getRemoteAddr(); | |||
| } | |||
| return ip; | |||
| } | |||
| public String getHost() { | |||
| return request.getServerName(); | |||
| } | |||
| private String getPort() { | |||
| int port = request.getServerPort(); | |||
| return port == 80 ? "" : ":" + String.valueOf(port); | |||
| } | |||
| private HttpServletRequest request; | |||
| private LoginUser loginUser; | |||
| public <T> T getLoginUserId() { | |||
| LoginUser loginUser = getLoginUser(); | |||
| if (loginUser == null) { | |||
| return null; | |||
| } else { | |||
| return (T) loginUser.getId(); | |||
| } | |||
| } | |||
| /** | |||
| * @return | |||
| */ | |||
| public String getSite() { | |||
| return String.format("%s://%s%s", StringUtils.contains(request.getProtocol(), "https") ? "https" : "http", getHost(), getPort()); | |||
| } | |||
| /** | |||
| * @return | |||
| */ | |||
| public HttpSession getSession() { | |||
| return request.getSession(true); | |||
| } | |||
| /** | |||
| * @return | |||
| */ | |||
| public String getJwt() { | |||
| return request.getHeader("token"); | |||
| } | |||
| } | |||
| @@ -0,0 +1,20 @@ | |||
| package com.chilunyc.fumao.common.context; | |||
| /** | |||
| * | |||
| */ | |||
| public class RequestHolder { | |||
| private static final ThreadLocal<Request> r = new ThreadLocal<>(); | |||
| public static Request get() { | |||
| return r.get(); | |||
| } | |||
| public static void set(Request request) { | |||
| r.set(request); | |||
| } | |||
| public static void clean() { | |||
| r.remove(); | |||
| } | |||
| } | |||
| @@ -0,0 +1,10 @@ | |||
| package com.chilunyc.fumao.common.enums; | |||
| /** | |||
| * 80347471@qq.com | |||
| */ | |||
| public enum Comparing { | |||
| Big, | |||
| Equal, | |||
| Small | |||
| } | |||
| @@ -0,0 +1,10 @@ | |||
| package com.chilunyc.fumao.common.enums; | |||
| /** | |||
| * | |||
| */ | |||
| public enum YesOrNo { | |||
| Yes, | |||
| No | |||
| } | |||
| @@ -0,0 +1,48 @@ | |||
| package com.chilunyc.fumao.common.exception; | |||
| import lombok.Data; | |||
| /** | |||
| * | |||
| */ | |||
| @Data | |||
| public class SystemException extends RuntimeException { | |||
| private String errorCode; | |||
| private Object[] params; | |||
| public SystemException() { | |||
| super(); | |||
| this.errorCode = "KK-000001"; | |||
| } | |||
| public SystemException(String errorCode) { | |||
| super(); | |||
| this.errorCode = errorCode; | |||
| } | |||
| public SystemException(String errorCode, Object... params) { | |||
| this.errorCode = errorCode; | |||
| this.params = params; | |||
| } | |||
| public SystemException(String errorCode, Throwable cause) { | |||
| super(cause); | |||
| this.errorCode = errorCode; | |||
| } | |||
| public SystemException(String errorCode, Object[] params, Throwable cause) { | |||
| super(cause); | |||
| this.errorCode = errorCode; | |||
| this.params = params; | |||
| } | |||
| // public KKException(Throwable cause) { | |||
| // super(cause); | |||
| // } | |||
| // public KKException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { | |||
| // super(message, cause, enableSuppression, writableStackTrace); | |||
| // } | |||
| } | |||
| @@ -0,0 +1,12 @@ | |||
| package com.chilunyc.fumao.common.lbs.config; | |||
| import org.springframework.boot.context.properties.EnableConfigurationProperties; | |||
| import org.springframework.context.annotation.Configuration; | |||
| /** | |||
| * | |||
| */ | |||
| @Configuration | |||
| @EnableConfigurationProperties(LBSProperties.class) | |||
| public class LBSConfig { | |||
| } | |||
| @@ -0,0 +1,14 @@ | |||
| package com.chilunyc.fumao.common.lbs.config; | |||
| import lombok.Data; | |||
| import org.springframework.boot.context.properties.ConfigurationProperties; | |||
| /** | |||
| * | |||
| */ | |||
| @Data | |||
| @ConfigurationProperties("baidu.lbs") | |||
| public class LBSProperties { | |||
| private String ak; | |||
| } | |||
| @@ -0,0 +1,20 @@ | |||
| package com.chilunyc.fumao.common.lbs.model; | |||
| import lombok.Data; | |||
| /** | |||
| * | |||
| */ | |||
| @Data | |||
| public class LBSAddress { | |||
| private Double lat; | |||
| private Double lng; | |||
| private String province; | |||
| private String city; | |||
| private String county; | |||
| } | |||
| @@ -0,0 +1,42 @@ | |||
| package com.chilunyc.fumao.common.lbs.model; | |||
| import com.alibaba.fastjson.annotation.JSONField; | |||
| import lombok.AllArgsConstructor; | |||
| import lombok.Builder; | |||
| import lombok.Data; | |||
| import lombok.NoArgsConstructor; | |||
| import java.math.BigDecimal; | |||
| /** | |||
| * Created by Tkk on 2018/7/24. | |||
| */ | |||
| @Data | |||
| @NoArgsConstructor | |||
| @AllArgsConstructor | |||
| @Builder | |||
| public class LBSPoi { | |||
| @Data | |||
| @NoArgsConstructor | |||
| public static class Location { | |||
| @JSONField(name = "lat") | |||
| private String lat; | |||
| @JSONField(name = "lng") | |||
| private String lng; | |||
| } | |||
| private Location location; | |||
| @JSONField(name = "uid") | |||
| private String poi; | |||
| private String province; | |||
| private String city; | |||
| private String address; | |||
| private String name; | |||
| } | |||
| @@ -0,0 +1,15 @@ | |||
| package com.chilunyc.fumao.common.lbs.request; | |||
| import com.chilunyc.fumao.common.request.PageRequest; | |||
| import lombok.Data; | |||
| /** | |||
| * Created by Tkk on 2018/7/24. | |||
| */ | |||
| @Data | |||
| public class LBSPoiRequest extends PageRequest { | |||
| private String query; | |||
| private String city; | |||
| } | |||
| @@ -0,0 +1,78 @@ | |||
| package com.chilunyc.fumao.common.lbs.service; | |||
| import com.chilunyc.fumao.common.exception.SystemException; | |||
| import com.chilunyc.fumao.common.lbs.config.LBSProperties; | |||
| import com.chilunyc.fumao.common.lbs.model.LBSPoi; | |||
| import com.chilunyc.fumao.common.lbs.request.LBSPoiRequest; | |||
| import com.chilunyc.fumao.common.util.http.service.HttpClient; | |||
| import com.chilunyc.fumao.common.util.http.service.HttpParams; | |||
| import com.chilunyc.fumao.common.util.http.service.result.ResultExecute; | |||
| import com.alibaba.fastjson.JSON; | |||
| import com.alibaba.fastjson.JSONArray; | |||
| import com.alibaba.fastjson.JSONObject; | |||
| import com.fasterxml.jackson.databind.ObjectMapper; | |||
| import lombok.extern.log4j.Log4j; | |||
| import okhttp3.Request; | |||
| import okhttp3.Response; | |||
| import org.apache.commons.lang.StringUtils; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.data.domain.Page; | |||
| import org.springframework.data.domain.PageImpl; | |||
| import org.springframework.stereotype.Service; | |||
| import org.springframework.util.StopWatch; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| /** | |||
| * | |||
| */ | |||
| @Log4j | |||
| @Service | |||
| public class LBSService implements ResultExecute<String> { | |||
| @Autowired | |||
| private HttpClient httpClient; | |||
| @Autowired | |||
| private LBSProperties lbsProperties; | |||
| private ObjectMapper objectMapper = new ObjectMapper(); | |||
| /** | |||
| * @param request | |||
| * @return | |||
| */ | |||
| public Page<LBSPoi> findPoi(LBSPoiRequest request) { | |||
| HttpParams httpParams = HttpParams.get("http://api.map.baidu.com/place/v2/search"); | |||
| httpParams | |||
| .put("query", request.getQuery()) | |||
| .put("region", request.getCity()) | |||
| .put("page_size", request.getSize()) | |||
| .put("page_num", request.getPageI()) | |||
| .put("output", "json") | |||
| .put("ak", lbsProperties.getAk()); | |||
| String body = httpClient.execute(httpParams, this); | |||
| JSONObject object = JSON.parseObject(body); | |||
| JSONArray jsonArray = object.getJSONArray("results"); | |||
| int total = object.getIntValue("total"); | |||
| List<LBSPoi> pois = new ArrayList<>(jsonArray.size()); | |||
| for (int i = 0; i < jsonArray.size(); i++) { | |||
| JSONObject jsonObject = jsonArray.getJSONObject(i); | |||
| LBSPoi lbsPoi = jsonObject.toJavaObject(LBSPoi.class); | |||
| lbsPoi.setLocation(jsonObject.getJSONObject("location").toJavaObject(LBSPoi.Location.class)); | |||
| pois.add(lbsPoi); | |||
| } | |||
| return new PageImpl<>(pois, request.getPage(), total); | |||
| } | |||
| @Override | |||
| public String toBody(Response response, Request request, StopWatch stopWatch) throws Exception { | |||
| String string = response.body().string(); | |||
| if (StringUtils.contains(string, "\"status\":0")) { | |||
| return string; | |||
| } | |||
| log.error(string); | |||
| throw new SystemException("000008"); | |||
| } | |||
| } | |||
| @@ -0,0 +1,64 @@ | |||
| package com.chilunyc.fumao.common.log.model; | |||
| import lombok.AllArgsConstructor; | |||
| import lombok.Builder; | |||
| import lombok.Data; | |||
| import lombok.NoArgsConstructor; | |||
| import javax.persistence.*; | |||
| import java.util.Date; | |||
| /** | |||
| * | |||
| */ | |||
| @Data | |||
| @Builder | |||
| @NoArgsConstructor | |||
| @AllArgsConstructor | |||
| @Entity | |||
| @Table(name = "fumao_event_log", indexes = { | |||
| @Index(name = "event_log_operator", columnList = "operator"), | |||
| @Index(name = "event_log_targetId", columnList = "targetId"), | |||
| @Index(name = "event_log_type", columnList = "type"), | |||
| @Index(name = "event_log_target", columnList = "target"), | |||
| }) | |||
| public class Event { | |||
| @Id | |||
| @GeneratedValue | |||
| private Long id; | |||
| @Column(length = 1) | |||
| private EventTarget target; | |||
| @Column(length = 1) | |||
| private EventType type; | |||
| /** | |||
| * 操作人 | |||
| */ | |||
| @Column(length = 32) | |||
| private String operator; | |||
| /** | |||
| * | |||
| */ | |||
| @Column(length = 32) | |||
| private String targetId; | |||
| /** | |||
| * | |||
| */ | |||
| @Lob | |||
| private String content; | |||
| /** | |||
| * | |||
| */ | |||
| private String ip; | |||
| /** | |||
| * | |||
| */ | |||
| private Date createTime; | |||
| } | |||
| @@ -0,0 +1,8 @@ | |||
| package com.chilunyc.fumao.common.log.model; | |||
| /** | |||
| * | |||
| */ | |||
| public enum EventTarget { | |||
| System, Company, None | |||
| } | |||
| @@ -0,0 +1,12 @@ | |||
| package com.chilunyc.fumao.common.log.model; | |||
| /** | |||
| * | |||
| */ | |||
| public enum EventType { | |||
| Error, | |||
| // 权限 | |||
| RoleEdit, RoleDelete, PermissionEdit, PermissionRemove, SendMsg, 编辑系统管理员, 删除系统管理员, 编辑集团, 删除集团, 编辑商场, 删除商场, 编辑商场楼层, 删除商场楼层, 编辑集团申请, 删除集团申请, 编辑商铺申请, 删除商铺申请, 编辑集团管理员, 删除集团管理员, 编辑商场管理员角色, 删除商场管理员角色, 编辑商场管理员, 删除商场管理员, | |||
| } | |||
| @@ -0,0 +1,16 @@ | |||
| package com.chilunyc.fumao.common.log.repository; | |||
| import com.chilunyc.fumao.common.log.request.LogPageRequest; | |||
| import com.chilunyc.fumao.common.log.response.LogResponse; | |||
| import com.github.pagehelper.Page; | |||
| import org.apache.ibatis.annotations.Mapper; | |||
| import org.apache.ibatis.session.RowBounds; | |||
| /** | |||
| * | |||
| */ | |||
| @Mapper | |||
| public interface EventMapper { | |||
| Page<LogResponse> page(LogPageRequest request, RowBounds rowBounds); | |||
| } | |||
| @@ -0,0 +1,12 @@ | |||
| package com.chilunyc.fumao.common.log.repository; | |||
| import com.chilunyc.fumao.common.log.model.Event; | |||
| import org.springframework.data.jpa.repository.JpaRepository; | |||
| import org.springframework.data.jpa.repository.JpaSpecificationExecutor; | |||
| /** | |||
| * | |||
| */ | |||
| public interface EventRepository extends JpaRepository<Event, Long>, JpaSpecificationExecutor<Event> { | |||
| } | |||
| @@ -0,0 +1,21 @@ | |||
| package com.chilunyc.fumao.common.log.request; | |||
| import com.chilunyc.fumao.common.request.PageRequest; | |||
| import lombok.Data; | |||
| import java.util.Date; | |||
| /** | |||
| * | |||
| */ | |||
| @Data | |||
| public class LogPageRequest extends PageRequest { | |||
| private String eventType; | |||
| private String eventTarget; | |||
| private Date startTime; | |||
| private Date endTime; | |||
| } | |||
| @@ -0,0 +1,24 @@ | |||
| package com.chilunyc.fumao.common.log.response; | |||
| import lombok.Data; | |||
| import java.util.Date; | |||
| /** | |||
| * | |||
| */ | |||
| @Data | |||
| public class LogResponse { | |||
| private String name; | |||
| private String eventType; | |||
| private String eventTarget; | |||
| private String content; | |||
| private String ip; | |||
| private Date createTime; | |||
| } | |||
| @@ -0,0 +1,77 @@ | |||
| package com.chilunyc.fumao.common.log.service; | |||
| import com.chilunyc.fumao.common.log.model.Event; | |||
| import com.chilunyc.fumao.common.log.model.EventTarget; | |||
| import com.chilunyc.fumao.common.log.model.EventType; | |||
| import com.chilunyc.fumao.common.log.repository.EventRepository; | |||
| import com.chilunyc.fumao.common.context.Request; | |||
| import com.alibaba.fastjson.JSON; | |||
| import lombok.extern.log4j.Log4j; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.scheduling.annotation.Async; | |||
| import org.springframework.stereotype.Service; | |||
| import org.springframework.transaction.annotation.Transactional; | |||
| import java.io.Serializable; | |||
| import java.util.Date; | |||
| /** | |||
| * | |||
| */ | |||
| @Log4j | |||
| @Service | |||
| @Transactional | |||
| @Async | |||
| public class EventService { | |||
| @Autowired | |||
| private EventRepository eventRepository; | |||
| public void add(Request request, EventTarget target, EventType type, String targetId) { | |||
| add(request, target, type, targetId, null); | |||
| } | |||
| public void add(Request request, EventType type, String targetId, Object content) { | |||
| add(request, EventTarget.None, type, targetId, content); | |||
| } | |||
| public void add(Request request, EventType type, Object content) { | |||
| add(request, EventTarget.None, type, null, content); | |||
| } | |||
| public void add(Request request, EventTarget target, EventType type) { | |||
| add(request, target, type, null, null); | |||
| } | |||
| /** | |||
| * @param request | |||
| * @param target | |||
| * @param type | |||
| * @param targetId | |||
| * @param content | |||
| */ | |||
| public void add(Request request, EventTarget target, EventType type, Serializable targetId, Object content) { | |||
| String contentStr = ""; | |||
| if (content != null && !content.getClass().isAssignableFrom(String.class)) { | |||
| contentStr = JSON.toJSONString(content); | |||
| } else if (content != null) { | |||
| contentStr = content.toString(); | |||
| } | |||
| String operator = ""; | |||
| if (request != null && request.getLoginUser() != null) { | |||
| operator = request.getLoginUser().getId().toString(); | |||
| } | |||
| Event build = Event | |||
| .builder() | |||
| .target(target) | |||
| .ip(request == null ? "" : request.getIp()) | |||
| .type(type) | |||
| .operator(operator) | |||
| .targetId(targetId != null ? target.toString() : null) | |||
| .content(contentStr) | |||
| .createTime(new Date()) | |||
| .build(); | |||
| eventRepository.save(build); | |||
| } | |||
| } | |||
| @@ -0,0 +1,20 @@ | |||
| package com.chilunyc.fumao.common.request; | |||
| import lombok.Data; | |||
| import org.hibernate.validator.constraints.NotBlank; | |||
| import javax.validation.constraints.Size; | |||
| import java.util.List; | |||
| /** | |||
| * | |||
| */ | |||
| @Data | |||
| public class AssignsRequest { | |||
| @Size(min = 0, message = "目标不存在") | |||
| private List<String> id; | |||
| @NotBlank(message = "分配数据为空") | |||
| private String targetId; | |||
| } | |||
| @@ -0,0 +1,15 @@ | |||
| package com.chilunyc.fumao.common.request; | |||
| import com.chilunyc.fumao.common.sms.request.SmsCheckRequest; | |||
| import lombok.Data; | |||
| import org.hibernate.validator.constraints.NotBlank; | |||
| /** | |||
| * | |||
| */ | |||
| @Data | |||
| public class ChangePwdRequest extends SmsCheckRequest { | |||
| @NotBlank(message = "请输入密码") | |||
| private String password; | |||
| } | |||
| @@ -0,0 +1,23 @@ | |||
| package com.chilunyc.fumao.common.request; | |||
| import io.swagger.annotations.ApiModel; | |||
| import io.swagger.annotations.ApiModelProperty; | |||
| import lombok.Data; | |||
| import javax.validation.constraints.NotNull; | |||
| import javax.validation.constraints.Size; | |||
| import java.io.Serializable; | |||
| import java.util.List; | |||
| /** | |||
| * | |||
| */ | |||
| @ApiModel | |||
| @Data | |||
| public class IdsRequest<T extends Serializable> { | |||
| @ApiModelProperty(value = "批量操作") | |||
| @NotNull(message = "编号不能为空") | |||
| @Size(min = 1, message = "编号不能为空") | |||
| private List<T> ids; | |||
| } | |||
| @@ -0,0 +1,24 @@ | |||
| package com.chilunyc.fumao.common.request; | |||
| import io.swagger.annotations.ApiModel; | |||
| import io.swagger.annotations.ApiModelProperty; | |||
| import lombok.Data; | |||
| import org.hibernate.validator.constraints.NotBlank; | |||
| /** | |||
| * | |||
| */ | |||
| @ApiModel | |||
| @Data | |||
| public class LoginRequest { | |||
| @ApiModelProperty(value = "手机号") | |||
| @NotBlank(message = "请输入手机号") | |||
| private String mobile; | |||
| @ApiModelProperty(value = "密码") | |||
| @NotBlank(message = "请输入密码") | |||
| private String password; | |||
| } | |||
| @@ -0,0 +1,21 @@ | |||
| package com.chilunyc.fumao.common.request; | |||
| import com.chilunyc.fumao.common.util.valid.Captcha; | |||
| import io.swagger.annotations.ApiModel; | |||
| import io.swagger.annotations.ApiModelProperty; | |||
| import lombok.Data; | |||
| import org.hibernate.validator.constraints.NotBlank; | |||
| /** | |||
| * | |||
| */ | |||
| @ApiModel | |||
| @Data | |||
| public class LoginRequestWithCaptcha extends LoginRequest { | |||
| @ApiModelProperty(value = "密码") | |||
| @Captcha | |||
| @NotBlank(message = "请输入验证码") | |||
| private String captcha; | |||
| } | |||
| @@ -0,0 +1,19 @@ | |||
| package com.chilunyc.fumao.common.request; | |||
| import io.swagger.annotations.ApiModel; | |||
| import io.swagger.annotations.ApiModelProperty; | |||
| import lombok.Data; | |||
| import org.hibernate.validator.constraints.NotBlank; | |||
| /** | |||
| * | |||
| */ | |||
| @ApiModel | |||
| @Data | |||
| public class LoginRequestWithSMS extends LoginRequest { | |||
| @ApiModelProperty(value = "短信验证码") | |||
| @NotBlank(message = "请输入短信验证码") | |||
| private String code; | |||
| } | |||
| @@ -0,0 +1,45 @@ | |||
| package com.chilunyc.fumao.common.request; | |||
| import lombok.Data; | |||
| import java.util.Date; | |||
| /** | |||
| * | |||
| */ | |||
| @Data | |||
| public class PageRequest { | |||
| private int size; | |||
| private int page; | |||
| private Date[] timeRange; | |||
| public Date getStartTime(){ | |||
| return timeRange != null && timeRange.length == 2 ? timeRange[0] : null; | |||
| } | |||
| public Date getEndTime(){ | |||
| return timeRange != null && timeRange.length == 2 ? timeRange[1] : null; | |||
| } | |||
| /** | |||
| * @return | |||
| */ | |||
| public int getStart() { | |||
| return (page < 0 ? 0 : page) * getSize(); | |||
| } | |||
| public int getPageI() { | |||
| return page < 0 ? 0 : page; | |||
| } | |||
| public int getSize() { | |||
| return size <= 0 || size > 100 ? 10 : size; | |||
| } | |||
| public org.springframework.data.domain.PageRequest getPage() { | |||
| return new org.springframework.data.domain.PageRequest(getPageI(), getSize()); | |||
| } | |||
| } | |||
| @@ -0,0 +1,78 @@ | |||
| package com.chilunyc.fumao.common.response; | |||
| import com.alibaba.fastjson.JSON; | |||
| import io.swagger.annotations.ApiModel; | |||
| import io.swagger.annotations.ApiModelProperty; | |||
| import lombok.AllArgsConstructor; | |||
| import lombok.Builder; | |||
| import lombok.Data; | |||
| import lombok.NoArgsConstructor; | |||
| /** | |||
| * | |||
| */ | |||
| @ApiModel | |||
| @Data | |||
| @Builder | |||
| @NoArgsConstructor | |||
| @AllArgsConstructor | |||
| public class JsonResponse<T> { | |||
| @ApiModelProperty(value = "状态码 000000 正常, 000000 不正常") | |||
| private String result; | |||
| @ApiModelProperty(value = "当result为 000000 获取这个值") | |||
| private T data; | |||
| @ApiModelProperty(value = "当result不为 000000 获取这个值") | |||
| private String error; | |||
| /** | |||
| * @param object | |||
| * @return | |||
| */ | |||
| public static <T> JsonResponse<T> success(T object) { | |||
| JsonResponse<T> o = new JsonResponse<>(); | |||
| o.setData(object); | |||
| o.setResult("000000"); | |||
| return o; | |||
| } | |||
| /** | |||
| * @return | |||
| */ | |||
| public static JsonResponse success() { | |||
| return success(""); | |||
| } | |||
| /** | |||
| * @param message | |||
| * @return | |||
| */ | |||
| public static JsonResponse fail(String errorCode, String message) { | |||
| return JsonResponse | |||
| .builder() | |||
| .result(errorCode) | |||
| .error(message) | |||
| .build(); | |||
| } | |||
| /** | |||
| * @return | |||
| */ | |||
| public static JsonResponse fail() { | |||
| return fail("000001", "系统错误"); | |||
| } | |||
| /** | |||
| * @param message | |||
| * @return | |||
| */ | |||
| public static JsonResponse fail(String message) { | |||
| return fail("000001", message); | |||
| } | |||
| public String toString() { | |||
| return JSON.toJSONString(this); | |||
| } | |||
| } | |||
| @@ -0,0 +1,15 @@ | |||
| package com.chilunyc.fumao.common.response; | |||
| import lombok.AllArgsConstructor; | |||
| import lombok.Builder; | |||
| import lombok.Data; | |||
| import lombok.NoArgsConstructor; | |||
| @Data | |||
| @NoArgsConstructor | |||
| @AllArgsConstructor | |||
| @Builder | |||
| public class KeyValue { | |||
| private String key; | |||
| private Object value; | |||
| } | |||
| @@ -0,0 +1,18 @@ | |||
| package com.chilunyc.fumao.common.response; | |||
| import lombok.AllArgsConstructor; | |||
| import lombok.Builder; | |||
| import lombok.Data; | |||
| import lombok.NoArgsConstructor; | |||
| import java.util.List; | |||
| @Data | |||
| @NoArgsConstructor | |||
| @AllArgsConstructor | |||
| @Builder | |||
| public class KeyValues<T> { | |||
| private String key; | |||
| private List<T> values; | |||
| } | |||
| @@ -0,0 +1,24 @@ | |||
| package com.chilunyc.fumao.common.response; | |||
| import lombok.AllArgsConstructor; | |||
| import lombok.Builder; | |||
| import lombok.Data; | |||
| import lombok.NoArgsConstructor; | |||
| import java.util.List; | |||
| /** | |||
| * | |||
| */ | |||
| @Data | |||
| @Builder | |||
| @NoArgsConstructor | |||
| @AllArgsConstructor | |||
| public class NodeResponse { | |||
| private String label; | |||
| private String value; | |||
| private List<NodeResponse> children; | |||
| } | |||
| @@ -0,0 +1,25 @@ | |||
| package com.chilunyc.fumao.common.shiro; | |||
| /** | |||
| * Created by Tkk on 2018/7/23. | |||
| */ | |||
| public interface AuthRoles { | |||
| /** | |||
| * | |||
| */ | |||
| String SystemAdmin = "SystemAdmin"; | |||
| String SystemAdminExp = "hasAuthority('SystemAdmin')"; | |||
| /** | |||
| * | |||
| */ | |||
| String CompanyAdmin = "CompanyAdmin"; | |||
| String CompanyAdminExp = "hasAuthority('CompanyAdmin')"; | |||
| /** | |||
| * | |||
| */ | |||
| String MarketAdmin = "MarketAdmin"; | |||
| String MarketAdminExp = "hasAuthority('MarketAdmin')"; | |||
| } | |||
| @@ -0,0 +1,72 @@ | |||
| package com.chilunyc.fumao.common.shiro; | |||
| import lombok.AllArgsConstructor; | |||
| import lombok.Builder; | |||
| import lombok.Data; | |||
| import lombok.NoArgsConstructor; | |||
| import org.springframework.security.core.GrantedAuthority; | |||
| import org.springframework.security.core.authority.SimpleGrantedAuthority; | |||
| import org.springframework.security.core.userdetails.UserDetails; | |||
| import java.util.Collection; | |||
| import java.util.List; | |||
| import java.util.stream.Collectors; | |||
| import java.util.stream.Stream; | |||
| /** | |||
| * Created by Tkk on 2018/7/23. | |||
| */ | |||
| @Data | |||
| @AllArgsConstructor | |||
| @NoArgsConstructor | |||
| @Builder | |||
| public class AuthUser implements UserDetails { | |||
| private Long id; | |||
| private String username; | |||
| private String password; | |||
| private List<? extends GrantedAuthority> authorities; | |||
| public AuthUser setRole(String... roles) { | |||
| this.authorities = Stream.of(roles).map(SimpleGrantedAuthority::new).collect(Collectors.toList()); | |||
| return this; | |||
| } | |||
| @Override | |||
| public Collection<? extends GrantedAuthority> getAuthorities() { | |||
| return authorities; | |||
| } | |||
| @Override | |||
| public String getPassword() { | |||
| return password; | |||
| } | |||
| @Override | |||
| public String getUsername() { | |||
| return username; | |||
| } | |||
| @Override | |||
| public boolean isAccountNonExpired() { | |||
| return true; | |||
| } | |||
| @Override | |||
| public boolean isAccountNonLocked() { | |||
| return true; | |||
| } | |||
| @Override | |||
| public boolean isCredentialsNonExpired() { | |||
| return true; | |||
| } | |||
| @Override | |||
| public boolean isEnabled() { | |||
| return true; | |||
| } | |||
| } | |||
| @@ -0,0 +1,17 @@ | |||
| package com.chilunyc.fumao.common.sms.config; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.boot.context.properties.EnableConfigurationProperties; | |||
| import org.springframework.context.annotation.Configuration; | |||
| /** | |||
| * | |||
| */ | |||
| @Configuration | |||
| @EnableConfigurationProperties(SmsProperties.class) | |||
| public class SmsConfig { | |||
| @Autowired | |||
| private SmsProperties smsProperties; | |||
| } | |||
| @@ -0,0 +1,37 @@ | |||
| package com.chilunyc.fumao.common.sms.config; | |||
| import lombok.Data; | |||
| import org.apache.commons.io.IOUtils; | |||
| import org.apache.commons.lang.StringUtils; | |||
| import org.springframework.beans.factory.InitializingBean; | |||
| import org.springframework.boot.context.properties.ConfigurationProperties; | |||
| import org.springframework.core.io.DefaultResourceLoader; | |||
| import java.io.InputStream; | |||
| /** | |||
| * | |||
| */ | |||
| @Data | |||
| @ConfigurationProperties("sms") | |||
| public class SmsProperties implements InitializingBean { | |||
| private String name; | |||
| private String bid; | |||
| private String account; | |||
| private String secret; | |||
| private String publicKey; | |||
| @Override | |||
| public void afterPropertiesSet() throws Exception { | |||
| if (StringUtils.isNotBlank(publicKey)) { | |||
| InputStream inputStream = new DefaultResourceLoader().getResource(publicKey).getInputStream(); | |||
| publicKey = IOUtils.toString(inputStream, "utf-8"); | |||
| IOUtils.closeQuietly(inputStream); | |||
| } | |||
| } | |||
| } | |||