| @@ -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); | |||||
| } | |||||
| } | |||||
| } | |||||