Selaa lähdekoodia

初始化代码

public
chaoneng 6 vuotta sitten
committed by chaoneng
commit
e231c1b1e0
100 muutettua tiedostoa jossa 4678 lisäystä ja 0 poistoa
  1. +21
    -0
      .gitignore
  2. +57
    -0
      README.md
  3. +62
    -0
      fumao-app/pom.xml
  4. +48
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/Application.java
  5. +104
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/api/company/CompanyAdminController.java
  6. +54
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/api/company/FindPwdController.java
  7. +54
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/api/company/LoginLogoutController.java
  8. +91
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/api/company/PlaceAdminController.java
  9. +87
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/api/company/PlaceController.java
  10. +44
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/api/company/ShopApplyController.java
  11. +81
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/api/customer/WxMaController.java
  12. +49
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/api/market/LoginLogoutController.java
  13. +81
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/api/merchant/WxMaController.java
  14. +86
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/api/system/CompanyAdminController.java
  15. +86
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/api/system/CompanyController.java
  16. +54
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/api/system/FindPwdController.java
  17. +42
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/api/system/LBSController.java
  18. +52
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/api/system/LoginLogoutController.java
  19. +79
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/api/system/PlaceAdminController.java
  20. +86
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/api/system/PlaceController.java
  21. +78
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/api/system/PlaceFloorController.java
  22. +65
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/api/system/ShopApplyController.java
  23. +77
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/api/system/SystemAdminController.java
  24. +21
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/config/bean/MultiBeanNameGenerator.java
  25. +32
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/config/captcha/CaptchaConfig.java
  26. +76
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/config/swagger/SwaggerConfig.java
  27. +21
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/config/web/JsonConfig.java
  28. +78
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/config/web/WebConfig.java
  29. +58
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/config/web/WebSecurityConfig.java
  30. +38
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/config/web/arguments/DateArgumentResolver.java
  31. +34
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/config/web/arguments/LoginUserArgumentResolver.java
  32. +36
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/config/web/interceptor/AuthInterceptor.java
  33. +54
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/config/web/interceptor/CorsInterceptor.java
  34. +26
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/config/web/security/SecurityEntryPoint.java
  35. +141
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/config/web/security/SecurityFilter.java
  36. +62
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/controller/FindPwdController.java
  37. +58
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/controller/common/CaptchaController.java
  38. +43
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/controller/common/LogController.java
  39. +34
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/controller/common/UploadController.java
  40. +177
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/controller/error/ExceptionController.java
  41. +44
    -0
      fumao-app/src/main/java/com/chilunyc/fumao/controller/error/PanicController.java
  42. +111
    -0
      fumao-app/src/main/resources/application.prod.properties
  43. +99
    -0
      fumao-app/src/main/resources/application.properties
  44. +17
    -0
      fumao-app/src/main/resources/banner.txt
  45. +3
    -0
      fumao-app/src/main/resources/config.json
  46. +13
    -0
      fumao-app/src/main/resources/messages.properties
  47. +8
    -0
      fumao-app/src/main/resources/permission.json
  48. +13
    -0
      fumao-app/src/main/resources/sms.key
  49. +243
    -0
      fumao-common/pom.xml
  50. +49
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/aop/BaseAop.java
  51. +130
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/aop/cache/CacheAop.java
  52. +19
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/aop/cache/CacheEvict.java
  53. +24
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/aop/cache/Cacheable.java
  54. +23
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/aop/limit/Limit.java
  55. +41
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/aop/limit/LimitAop.java
  56. +23
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/aop/lock/Lock.java
  57. +38
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/aop/lock/LockAop.java
  58. +22
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/aop/retry/Retry.java
  59. +32
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/aop/retry/RetryAop.java
  60. +24
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/config/ApplicationProperty.java
  61. +9
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/config/CacheEnums.java
  62. +8
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/config/ConfigEnum.java
  63. +14
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/config/ConfigRequest.java
  64. +46
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/config/ConfigService.java
  65. +23
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/config/RedissonConfig.java
  66. +42
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/context/LoginUser.java
  67. +77
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/context/Request.java
  68. +20
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/context/RequestHolder.java
  69. +10
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/enums/Comparing.java
  70. +10
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/enums/YesOrNo.java
  71. +48
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/exception/SystemException.java
  72. +12
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/config/LBSConfig.java
  73. +14
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/config/LBSProperties.java
  74. +20
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/model/LBSAddress.java
  75. +42
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/model/LBSPoi.java
  76. +15
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/request/LBSPoiRequest.java
  77. +78
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/service/LBSService.java
  78. +64
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/log/model/Event.java
  79. +8
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/log/model/EventTarget.java
  80. +12
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/log/model/EventType.java
  81. +16
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/log/repository/EventMapper.java
  82. +12
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/log/repository/EventRepository.java
  83. +21
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/log/request/LogPageRequest.java
  84. +24
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/log/response/LogResponse.java
  85. +77
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/log/service/EventService.java
  86. +20
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/request/AssignsRequest.java
  87. +15
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/request/ChangePwdRequest.java
  88. +23
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/request/IdsRequest.java
  89. +24
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/request/LoginRequest.java
  90. +21
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/request/LoginRequestWithCaptcha.java
  91. +19
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/request/LoginRequestWithSMS.java
  92. +45
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/request/PageRequest.java
  93. +78
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/response/JsonResponse.java
  94. +15
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/response/KeyValue.java
  95. +18
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/response/KeyValues.java
  96. +24
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/response/NodeResponse.java
  97. +25
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/shiro/AuthRoles.java
  98. +72
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/shiro/AuthUser.java
  99. +17
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/sms/config/SmsConfig.java
  100. +37
    -0
      fumao-common/src/main/java/com/chilunyc/fumao/common/sms/config/SmsProperties.java

+ 21
- 0
.gitignore Näytä tiedosto

@@ -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

+ 57
- 0
README.md Näytä tiedosto

@@ -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方法, 创建一个新实例
```

+ 62
- 0
fumao-app/pom.xml Näytä tiedosto

@@ -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>

+ 48
- 0
fumao-app/src/main/java/com/chilunyc/fumao/Application.java Näytä tiedosto

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

+ 104
- 0
fumao-app/src/main/java/com/chilunyc/fumao/api/company/CompanyAdminController.java Näytä tiedosto

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

}

+ 54
- 0
fumao-app/src/main/java/com/chilunyc/fumao/api/company/FindPwdController.java Näytä tiedosto

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

+ 54
- 0
fumao-app/src/main/java/com/chilunyc/fumao/api/company/LoginLogoutController.java Näytä tiedosto

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

+ 91
- 0
fumao-app/src/main/java/com/chilunyc/fumao/api/company/PlaceAdminController.java Näytä tiedosto

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

+ 87
- 0
fumao-app/src/main/java/com/chilunyc/fumao/api/company/PlaceController.java Näytä tiedosto

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

}

+ 44
- 0
fumao-app/src/main/java/com/chilunyc/fumao/api/company/ShopApplyController.java Näytä tiedosto

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


}

+ 81
- 0
fumao-app/src/main/java/com/chilunyc/fumao/api/customer/WxMaController.java Näytä tiedosto

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

+ 49
- 0
fumao-app/src/main/java/com/chilunyc/fumao/api/market/LoginLogoutController.java Näytä tiedosto

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

+ 81
- 0
fumao-app/src/main/java/com/chilunyc/fumao/api/merchant/WxMaController.java Näytä tiedosto

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

+ 86
- 0
fumao-app/src/main/java/com/chilunyc/fumao/api/system/CompanyAdminController.java Näytä tiedosto

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

}

+ 86
- 0
fumao-app/src/main/java/com/chilunyc/fumao/api/system/CompanyController.java Näytä tiedosto

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

}

+ 54
- 0
fumao-app/src/main/java/com/chilunyc/fumao/api/system/FindPwdController.java Näytä tiedosto

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

+ 42
- 0
fumao-app/src/main/java/com/chilunyc/fumao/api/system/LBSController.java Näytä tiedosto

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

+ 52
- 0
fumao-app/src/main/java/com/chilunyc/fumao/api/system/LoginLogoutController.java Näytä tiedosto

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

+ 79
- 0
fumao-app/src/main/java/com/chilunyc/fumao/api/system/PlaceAdminController.java Näytä tiedosto

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


}

+ 86
- 0
fumao-app/src/main/java/com/chilunyc/fumao/api/system/PlaceController.java Näytä tiedosto

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

}

+ 78
- 0
fumao-app/src/main/java/com/chilunyc/fumao/api/system/PlaceFloorController.java Näytä tiedosto

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


}

+ 65
- 0
fumao-app/src/main/java/com/chilunyc/fumao/api/system/ShopApplyController.java Näytä tiedosto

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

}

+ 77
- 0
fumao-app/src/main/java/com/chilunyc/fumao/api/system/SystemAdminController.java Näytä tiedosto

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


}

+ 21
- 0
fumao-app/src/main/java/com/chilunyc/fumao/config/bean/MultiBeanNameGenerator.java Näytä tiedosto

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

+ 32
- 0
fumao-app/src/main/java/com/chilunyc/fumao/config/captcha/CaptchaConfig.java Näytä tiedosto

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

+ 76
- 0
fumao-app/src/main/java/com/chilunyc/fumao/config/swagger/SwaggerConfig.java Näytä tiedosto

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

+ 21
- 0
fumao-app/src/main/java/com/chilunyc/fumao/config/web/JsonConfig.java Näytä tiedosto

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

+ 78
- 0
fumao-app/src/main/java/com/chilunyc/fumao/config/web/WebConfig.java Näytä tiedosto

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

}

+ 58
- 0
fumao-app/src/main/java/com/chilunyc/fumao/config/web/WebSecurityConfig.java Näytä tiedosto

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

}
}

+ 38
- 0
fumao-app/src/main/java/com/chilunyc/fumao/config/web/arguments/DateArgumentResolver.java Näytä tiedosto

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

+ 34
- 0
fumao-app/src/main/java/com/chilunyc/fumao/config/web/arguments/LoginUserArgumentResolver.java Näytä tiedosto

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

}

+ 36
- 0
fumao-app/src/main/java/com/chilunyc/fumao/config/web/interceptor/AuthInterceptor.java Näytä tiedosto

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

}

}

+ 54
- 0
fumao-app/src/main/java/com/chilunyc/fumao/config/web/interceptor/CorsInterceptor.java Näytä tiedosto

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

+ 26
- 0
fumao-app/src/main/java/com/chilunyc/fumao/config/web/security/SecurityEntryPoint.java Näytä tiedosto

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

+ 141
- 0
fumao-app/src/main/java/com/chilunyc/fumao/config/web/security/SecurityFilter.java Näytä tiedosto

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

+ 62
- 0
fumao-app/src/main/java/com/chilunyc/fumao/controller/FindPwdController.java Näytä tiedosto

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

+ 58
- 0
fumao-app/src/main/java/com/chilunyc/fumao/controller/common/CaptchaController.java Näytä tiedosto

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

+ 43
- 0
fumao-app/src/main/java/com/chilunyc/fumao/controller/common/LogController.java Näytä tiedosto

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

+ 34
- 0
fumao-app/src/main/java/com/chilunyc/fumao/controller/common/UploadController.java Näytä tiedosto

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

+ 177
- 0
fumao-app/src/main/java/com/chilunyc/fumao/controller/error/ExceptionController.java Näytä tiedosto

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


}

+ 44
- 0
fumao-app/src/main/java/com/chilunyc/fumao/controller/error/PanicController.java Näytä tiedosto

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

}

+ 111
- 0
fumao-app/src/main/resources/application.prod.properties Näytä tiedosto

@@ -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=

+ 99
- 0
fumao-app/src/main/resources/application.properties Näytä tiedosto

@@ -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

+ 17
- 0
fumao-app/src/main/resources/banner.txt Näytä tiedosto

@@ -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

+ 3
- 0
fumao-app/src/main/resources/config.json Näytä tiedosto

@@ -0,0 +1,3 @@
{

}

+ 13
- 0
fumao-app/src/main/resources/messages.properties Näytä tiedosto

@@ -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

+ 8
- 0
fumao-app/src/main/resources/permission.json Näytä tiedosto

@@ -0,0 +1,8 @@
[
{
"name": "",
"url": "",
"method": "",
"order": 0
}
]

+ 13
- 0
fumao-app/src/main/resources/sms.key Näytä tiedosto

@@ -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==

+ 243
- 0
fumao-common/pom.xml Näytä tiedosto

@@ -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>

+ 49
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/aop/BaseAop.java Näytä tiedosto

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

+ 130
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/aop/cache/CacheAop.java Näytä tiedosto

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

+ 19
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/aop/cache/CacheEvict.java Näytä tiedosto

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

+ 24
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/aop/cache/Cacheable.java Näytä tiedosto

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

+ 23
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/aop/limit/Limit.java Näytä tiedosto

@@ -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 "请忽重复提交";
}

+ 41
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/aop/limit/LimitAop.java Näytä tiedosto

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

+ 23
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/aop/lock/Lock.java Näytä tiedosto

@@ -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 "请稍候重试";
}

+ 38
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/aop/lock/LockAop.java Näytä tiedosto

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

+ 22
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/aop/retry/Retry.java Näytä tiedosto

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

+ 32
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/aop/retry/RetryAop.java Näytä tiedosto

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

+ 24
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/config/ApplicationProperty.java Näytä tiedosto

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

+ 9
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/config/CacheEnums.java Näytä tiedosto

@@ -0,0 +1,9 @@
package com.chilunyc.fumao.common.config;

/**
*
*/
public interface CacheEnums {

String Permission = "Permission";
}

+ 8
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/config/ConfigEnum.java Näytä tiedosto

@@ -0,0 +1,8 @@
package com.chilunyc.fumao.common.config;


/**
*
*/
public enum ConfigEnum {
}

+ 14
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/config/ConfigRequest.java Näytä tiedosto

@@ -0,0 +1,14 @@
package com.chilunyc.fumao.common.config;

import lombok.Data;

/**
*
*/
@Data
public class ConfigRequest {

private ConfigEnum key;

private String value;
}

+ 46
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/config/ConfigService.java Näytä tiedosto

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

+ 23
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/config/RedissonConfig.java Näytä tiedosto

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

+ 42
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/context/LoginUser.java Näytä tiedosto

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

+ 77
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/context/Request.java Näytä tiedosto

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

+ 20
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/context/RequestHolder.java Näytä tiedosto

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

+ 10
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/enums/Comparing.java Näytä tiedosto

@@ -0,0 +1,10 @@
package com.chilunyc.fumao.common.enums;

/**
* 80347471@qq.com
*/
public enum Comparing {
Big,
Equal,
Small
}

+ 10
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/enums/YesOrNo.java Näytä tiedosto

@@ -0,0 +1,10 @@
package com.chilunyc.fumao.common.enums;

/**
*
*/
public enum YesOrNo {
Yes,

No
}

+ 48
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/exception/SystemException.java Näytä tiedosto

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

+ 12
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/config/LBSConfig.java Näytä tiedosto

@@ -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 {
}

+ 14
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/config/LBSProperties.java Näytä tiedosto

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

+ 20
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/model/LBSAddress.java Näytä tiedosto

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

+ 42
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/model/LBSPoi.java Näytä tiedosto

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

+ 15
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/request/LBSPoiRequest.java Näytä tiedosto

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

+ 78
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/service/LBSService.java Näytä tiedosto

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

+ 64
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/log/model/Event.java Näytä tiedosto

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

+ 8
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/log/model/EventTarget.java Näytä tiedosto

@@ -0,0 +1,8 @@
package com.chilunyc.fumao.common.log.model;

/**
*
*/
public enum EventTarget {
System, Company, None
}

+ 12
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/log/model/EventType.java Näytä tiedosto

@@ -0,0 +1,12 @@
package com.chilunyc.fumao.common.log.model;

/**
*
*/
public enum EventType {

Error,

// 权限
RoleEdit, RoleDelete, PermissionEdit, PermissionRemove, SendMsg, 编辑系统管理员, 删除系统管理员, 编辑集团, 删除集团, 编辑商场, 删除商场, 编辑商场楼层, 删除商场楼层, 编辑集团申请, 删除集团申请, 编辑商铺申请, 删除商铺申请, 编辑集团管理员, 删除集团管理员, 编辑商场管理员角色, 删除商场管理员角色, 编辑商场管理员, 删除商场管理员,
}

+ 16
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/log/repository/EventMapper.java Näytä tiedosto

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

+ 12
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/log/repository/EventRepository.java Näytä tiedosto

@@ -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> {
}

+ 21
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/log/request/LogPageRequest.java Näytä tiedosto

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

+ 24
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/log/response/LogResponse.java Näytä tiedosto

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

+ 77
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/log/service/EventService.java Näytä tiedosto

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

+ 20
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/request/AssignsRequest.java Näytä tiedosto

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

+ 15
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/request/ChangePwdRequest.java Näytä tiedosto

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

+ 23
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/request/IdsRequest.java Näytä tiedosto

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

+ 24
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/request/LoginRequest.java Näytä tiedosto

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


}

+ 21
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/request/LoginRequestWithCaptcha.java Näytä tiedosto

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

}

+ 19
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/request/LoginRequestWithSMS.java Näytä tiedosto

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

}

+ 45
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/request/PageRequest.java Näytä tiedosto

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

+ 78
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/response/JsonResponse.java Näytä tiedosto

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

+ 15
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/response/KeyValue.java Näytä tiedosto

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

+ 18
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/response/KeyValues.java Näytä tiedosto

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

+ 24
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/response/NodeResponse.java Näytä tiedosto

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

+ 25
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/shiro/AuthRoles.java Näytä tiedosto

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

+ 72
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/shiro/AuthUser.java Näytä tiedosto

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

+ 17
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/sms/config/SmsConfig.java Näytä tiedosto

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

}

+ 37
- 0
fumao-common/src/main/java/com/chilunyc/fumao/common/sms/config/SmsProperties.java Näytä tiedosto

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

Some files were not shown because too many files changed in this diff

Ladataan…
Peruuta
Tallenna