commit e231c1b1e095e27d62a5a5252909b2ea9937f6ca Author: chaoneng Date: Mon Jul 23 21:36:56 2018 +0800 初始化代码 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8c78358 --- /dev/null +++ b/.gitignore @@ -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 \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..751fb9c --- /dev/null +++ b/README.md @@ -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方法, 创建一个新实例 +``` \ No newline at end of file diff --git a/fumao-app/pom.xml b/fumao-app/pom.xml new file mode 100644 index 0000000..e715627 --- /dev/null +++ b/fumao-app/pom.xml @@ -0,0 +1,62 @@ + + + + fumao + com.aki + 0.0.1-SNAPSHOT + + 4.0.0 + + fumao-app + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + org.springframework.boot + spring-boot-starter-undertow + + + + + + + + + + com.aki + fumao-service + ${project.version} + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + build-info + + + + + true + true + + + + + \ No newline at end of file diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/Application.java b/fumao-app/src/main/java/com/chilunyc/fumao/Application.java new file mode 100644 index 0000000..8731d5b --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/Application.java @@ -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); + } +} diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/api/company/CompanyAdminController.java b/fumao-app/src/main/java/com/chilunyc/fumao/api/company/CompanyAdminController.java new file mode 100644 index 0000000..8c15681 --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/api/company/CompanyAdminController.java @@ -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 companyAdmin, @RequestBody CompanyAdminPageRequest request) { + request.setCompanyId(companyAdmin.getCompanyId()); + Page page = companyAdminService.page(request); + return JsonResponse.success(page); + } + + @ApiOperation(value = "详情") + @ApiImplicitParams({ + }) + @RequestMapping(value = "/find/{id}", method = RequestMethod.GET) + JsonResponse 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 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> all(CompanyAdminPageRequest request) { + List result = companyAdminService.all(request); + return JsonResponse.success(result); + } + +} \ No newline at end of file diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/api/company/FindPwdController.java b/fumao-app/src/main/java/com/chilunyc/fumao/api/company/FindPwdController.java new file mode 100644 index 0000000..fb606ae --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/api/company/FindPwdController.java @@ -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(); + } +} diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/api/company/LoginLogoutController.java b/fumao-app/src/main/java/com/chilunyc/fumao/api/company/LoginLogoutController.java new file mode 100644 index 0000000..329901f --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/api/company/LoginLogoutController.java @@ -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(); + } +} \ No newline at end of file diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/api/company/PlaceAdminController.java b/fumao-app/src/main/java/com/chilunyc/fumao/api/company/PlaceAdminController.java new file mode 100644 index 0000000..39ab1b4 --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/api/company/PlaceAdminController.java @@ -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(CompanyAdmin companyAdmin, @RequestBody PlaceAdminPageRequest request) { + request.setCompanyId(companyAdmin.getCompanyId()); + Page page = placeAdminService.page(request); + return JsonResponse.success(page); + } + + @ApiOperation(value = "详情") + @ApiImplicitParams({ + }) + @RequestMapping(value = "/find/{id}", method = RequestMethod.GET) + JsonResponse 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 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(); + } +} \ No newline at end of file diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/api/company/PlaceController.java b/fumao-app/src/main/java/com/chilunyc/fumao/api/company/PlaceController.java new file mode 100644 index 0000000..12d02d2 --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/api/company/PlaceController.java @@ -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(CompanyAdmin companyAdmin, @RequestBody PlacePageRequest request) { + request.setCompanyId(companyAdmin.getCompanyId()); + Page page = placeService.page(request); + return JsonResponse.success(page); + } + + @ApiOperation(value = "详情") + @ApiImplicitParams({ + }) + @RequestMapping(value = "/find/{id}", method = RequestMethod.GET) + JsonResponse 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> all(CompanyAdmin companyAdmin, PlacePageRequest request) { + request.setCompanyId(companyAdmin.getCompanyId()); + List result = placeService.all(request); + return JsonResponse.success(result); + } + +} \ No newline at end of file diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/api/company/ShopApplyController.java b/fumao-app/src/main/java/com/chilunyc/fumao/api/company/ShopApplyController.java new file mode 100644 index 0000000..1a42f0b --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/api/company/ShopApplyController.java @@ -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(); + } + + +} \ No newline at end of file diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/api/customer/WxMaController.java b/fumao-app/src/main/java/com/chilunyc/fumao/api/customer/WxMaController.java new file mode 100644 index 0000000..c66f255 --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/api/customer/WxMaController.java @@ -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(); +// } +} diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/api/market/LoginLogoutController.java b/fumao-app/src/main/java/com/chilunyc/fumao/api/market/LoginLogoutController.java new file mode 100644 index 0000000..396d7a7 --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/api/market/LoginLogoutController.java @@ -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(); + } +} \ No newline at end of file diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/api/merchant/WxMaController.java b/fumao-app/src/main/java/com/chilunyc/fumao/api/merchant/WxMaController.java new file mode 100644 index 0000000..dec8235 --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/api/merchant/WxMaController.java @@ -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(); +// } +} diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/api/system/CompanyAdminController.java b/fumao-app/src/main/java/com/chilunyc/fumao/api/system/CompanyAdminController.java new file mode 100644 index 0000000..12b7697 --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/api/system/CompanyAdminController.java @@ -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(@RequestBody CompanyAdminPageRequest request) { + Page page = companyAdminService.page(request); + return JsonResponse.success(page); + } + + @ApiOperation(value = "详情") + @ApiImplicitParams({ + }) + @RequestMapping(value = "/find/{id}", method = RequestMethod.GET) + JsonResponse 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 request) { + companyAdminService.remove(request); + return JsonResponse.success(); + } + + @ApiOperation(value = "所有") + @ApiImplicitParams({ + }) + @RequestMapping(value = "/find/all", method = RequestMethod.GET) + JsonResponse> all(CompanyAdminPageRequest request) { + List result = companyAdminService.all(request); + return JsonResponse.success(result); + } + +} \ No newline at end of file diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/api/system/CompanyController.java b/fumao-app/src/main/java/com/chilunyc/fumao/api/system/CompanyController.java new file mode 100644 index 0000000..eb687f7 --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/api/system/CompanyController.java @@ -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(@RequestBody CompanyPageRequest request) { + Page page = companyService.page(request); + return JsonResponse.success(page); + } + + @ApiOperation(value = "详情") + @ApiImplicitParams({ + }) + @RequestMapping(value = "/find/{id}", method = RequestMethod.GET) + JsonResponse 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 request) { + companyService.remove(request); + return JsonResponse.success(); + } + + @ApiOperation(value = "所有") + @ApiImplicitParams({ + }) + @RequestMapping(value = "/find/all", method = RequestMethod.GET) + JsonResponse> all(CompanyPageRequest request) { + List result = companyService.all(request); + return JsonResponse.success(result); + } + +} \ No newline at end of file diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/api/system/FindPwdController.java b/fumao-app/src/main/java/com/chilunyc/fumao/api/system/FindPwdController.java new file mode 100644 index 0000000..bada19d --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/api/system/FindPwdController.java @@ -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(); + } +} diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/api/system/LBSController.java b/fumao-app/src/main/java/com/chilunyc/fumao/api/system/LBSController.java new file mode 100644 index 0000000..f1c36eb --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/api/system/LBSController.java @@ -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)); + } +} \ No newline at end of file diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/api/system/LoginLogoutController.java b/fumao-app/src/main/java/com/chilunyc/fumao/api/system/LoginLogoutController.java new file mode 100644 index 0000000..d898632 --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/api/system/LoginLogoutController.java @@ -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(); + } +} \ No newline at end of file diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/api/system/PlaceAdminController.java b/fumao-app/src/main/java/com/chilunyc/fumao/api/system/PlaceAdminController.java new file mode 100644 index 0000000..516d06d --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/api/system/PlaceAdminController.java @@ -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(@RequestBody PlaceAdminPageRequest request) { + Page page = placeAdminService.page(request); + return JsonResponse.success(page); + } + + @ApiOperation(value = "详情") + @ApiImplicitParams({ + }) + @RequestMapping(value = "/find/{id}", method = RequestMethod.GET) + JsonResponse 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 request) { + placeAdminService.remove(request); + return JsonResponse.success(); + } + + +} \ No newline at end of file diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/api/system/PlaceController.java b/fumao-app/src/main/java/com/chilunyc/fumao/api/system/PlaceController.java new file mode 100644 index 0000000..48248f5 --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/api/system/PlaceController.java @@ -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(@RequestBody PlacePageRequest request) { + Page page = placeService.page(request); + return JsonResponse.success(page); + } + + @ApiOperation(value = "详情") + @ApiImplicitParams({ + }) + @RequestMapping(value = "/find/{id}", method = RequestMethod.GET) + JsonResponse 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 request) { + placeService.remove(request); + return JsonResponse.success(); + } + + @ApiOperation(value = "所有") + @ApiImplicitParams({ + }) + @RequestMapping(value = "/find/all", method = RequestMethod.POST) + JsonResponse> all(@RequestBody PlacePageRequest request) { + List result = placeService.all(request); + return JsonResponse.success(result); + } + +} \ No newline at end of file diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/api/system/PlaceFloorController.java b/fumao-app/src/main/java/com/chilunyc/fumao/api/system/PlaceFloorController.java new file mode 100644 index 0000000..d65254f --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/api/system/PlaceFloorController.java @@ -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> all(@RequestBody PlaceFloorPageRequest request) { + List page = placeFloorService.all(request); + return JsonResponse.success(page); + } + + @ApiOperation(value = "详情") + @ApiImplicitParams({ + }) + @RequestMapping(value = "/find/{id}", method = RequestMethod.GET) + JsonResponse 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(); + } + + +} \ No newline at end of file diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/api/system/ShopApplyController.java b/fumao-app/src/main/java/com/chilunyc/fumao/api/system/ShopApplyController.java new file mode 100644 index 0000000..2d5de8f --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/api/system/ShopApplyController.java @@ -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(@RequestBody ShopApplyPageRequest request) { + Page page = shopApplyService.page(request); + return JsonResponse.success(page); + } + + @ApiOperation(value = "详情") + @ApiImplicitParams({ + }) + @RequestMapping(value = "/find/{id}", method = RequestMethod.GET) + JsonResponse 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(); + } + +} \ No newline at end of file diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/api/system/SystemAdminController.java b/fumao-app/src/main/java/com/chilunyc/fumao/api/system/SystemAdminController.java new file mode 100644 index 0000000..6cc3804 --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/api/system/SystemAdminController.java @@ -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(@RequestBody SystemAdminPageRequest request) { + Page page = systemAdminService.page(request); + return JsonResponse.success(page); + } + + @ApiOperation(value = "详情") + @ApiImplicitParams({ + }) + @RequestMapping(value = "/find/{id}", method = RequestMethod.GET) + JsonResponse 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(); + } + + +} \ No newline at end of file diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/config/bean/MultiBeanNameGenerator.java b/fumao-app/src/main/java/com/chilunyc/fumao/config/bean/MultiBeanNameGenerator.java new file mode 100644 index 0000000..29a1729 --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/config/bean/MultiBeanNameGenerator.java @@ -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); + } +} diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/config/captcha/CaptchaConfig.java b/fumao-app/src/main/java/com/chilunyc/fumao/config/captcha/CaptchaConfig.java new file mode 100644 index 0000000..10276b6 --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/config/captcha/CaptchaConfig.java @@ -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; + } +} diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/config/swagger/SwaggerConfig.java b/fumao-app/src/main/java/com/chilunyc/fumao/config/swagger/SwaggerConfig.java new file mode 100644 index 0000000..bc4386c --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/config/swagger/SwaggerConfig.java @@ -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 includePath(final String path) { + return new Predicate() { + @Override + public boolean apply(String input) { + return input.startsWith(path); + } + }; + } +} diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/config/web/JsonConfig.java b/fumao-app/src/main/java/com/chilunyc/fumao/config/web/JsonConfig.java new file mode 100644 index 0000000..19add0e --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/config/web/JsonConfig.java @@ -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 { + + @Override + public String deserialize(JsonParser parser, DeserializationContext context) throws IOException { + return parser.hasToken(JsonToken.VALUE_STRING) ? parser.getText().trim() : null; + } +} diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/config/web/WebConfig.java b/fumao-app/src/main/java/com/chilunyc/fumao/config/web/WebConfig.java new file mode 100644 index 0000000..d2173a2 --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/config/web/WebConfig.java @@ -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 argumentResolvers) { + argumentResolvers.add(jwtValueArgumentResolver); + argumentResolvers.add(new DateArgumentResolver()); + } + +} diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/config/web/WebSecurityConfig.java b/fumao-app/src/main/java/com/chilunyc/fumao/config/web/WebSecurityConfig.java new file mode 100644 index 0000000..068cc33 --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/config/web/WebSecurityConfig.java @@ -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); + + } +} diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/config/web/arguments/DateArgumentResolver.java b/fumao-app/src/main/java/com/chilunyc/fumao/config/web/arguments/DateArgumentResolver.java new file mode 100644 index 0000000..330cdb7 --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/config/web/arguments/DateArgumentResolver.java @@ -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; + } + } +} diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/config/web/arguments/LoginUserArgumentResolver.java b/fumao-app/src/main/java/com/chilunyc/fumao/config/web/arguments/LoginUserArgumentResolver.java new file mode 100644 index 0000000..2a867b1 --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/config/web/arguments/LoginUserArgumentResolver.java @@ -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; + } + +} diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/config/web/interceptor/AuthInterceptor.java b/fumao-app/src/main/java/com/chilunyc/fumao/config/web/interceptor/AuthInterceptor.java new file mode 100644 index 0000000..9e72ad9 --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/config/web/interceptor/AuthInterceptor.java @@ -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; + + } + +} diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/config/web/interceptor/CorsInterceptor.java b/fumao-app/src/main/java/com/chilunyc/fumao/config/web/interceptor/CorsInterceptor.java new file mode 100644 index 0000000..8952e8b --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/config/web/interceptor/CorsInterceptor.java @@ -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 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(); + } +} diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/config/web/security/SecurityEntryPoint.java b/fumao-app/src/main/java/com/chilunyc/fumao/config/web/security/SecurityEntryPoint.java new file mode 100644 index 0000000..b25fe4a --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/config/web/security/SecurityEntryPoint.java @@ -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()); + } +} diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/config/web/security/SecurityFilter.java b/fumao-app/src/main/java/com/chilunyc/fumao/config/web/security/SecurityFilter.java new file mode 100644 index 0000000..83856c3 --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/config/web/security/SecurityFilter.java @@ -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 roles = (List) 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; + } + } +} diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/controller/FindPwdController.java b/fumao-app/src/main/java/com/chilunyc/fumao/controller/FindPwdController.java new file mode 100644 index 0000000..cd62499 --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/controller/FindPwdController.java @@ -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(); + } +} diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/controller/common/CaptchaController.java b/fumao-app/src/main/java/com/chilunyc/fumao/controller/common/CaptchaController.java new file mode 100644 index 0000000..33cef47 --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/controller/common/CaptchaController.java @@ -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; + } +} diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/controller/common/LogController.java b/fumao-app/src/main/java/com/chilunyc/fumao/controller/common/LogController.java new file mode 100644 index 0000000..d8b40e9 --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/controller/common/LogController.java @@ -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 page = eventMapper.page(request, rowBounds); + return JsonResponse.success( + new PageImpl<>(page, request.getPage(), page.getTotal()) + ); + } +} diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/controller/common/UploadController.java b/fumao-app/src/main/java/com/chilunyc/fumao/controller/common/UploadController.java new file mode 100644 index 0000000..1213bc5 --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/controller/common/UploadController.java @@ -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> index(LoginUser loginUser) { + return ResponseEntity.ok(JsonResponse.success(uploadService.getAuth())); + } +} diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/controller/error/ExceptionController.java b/fumao-app/src/main/java/com/chilunyc/fumao/controller/error/ExceptionController.java new file mode 100644 index 0000000..63d55be --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/controller/error/ExceptionController.java @@ -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 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 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; + } + + +} diff --git a/fumao-app/src/main/java/com/chilunyc/fumao/controller/error/PanicController.java b/fumao-app/src/main/java/com/chilunyc/fumao/controller/error/PanicController.java new file mode 100644 index 0000000..0ed66db --- /dev/null +++ b/fumao-app/src/main/java/com/chilunyc/fumao/controller/error/PanicController.java @@ -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 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(); + } + +} diff --git a/fumao-app/src/main/resources/application.prod.properties b/fumao-app/src/main/resources/application.prod.properties new file mode 100644 index 0000000..eab43b2 --- /dev/null +++ b/fumao-app/src/main/resources/application.prod.properties @@ -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= \ No newline at end of file diff --git a/fumao-app/src/main/resources/application.properties b/fumao-app/src/main/resources/application.properties new file mode 100644 index 0000000..7c37b51 --- /dev/null +++ b/fumao-app/src/main/resources/application.properties @@ -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 diff --git a/fumao-app/src/main/resources/banner.txt b/fumao-app/src/main/resources/banner.txt new file mode 100644 index 0000000..7fd7ac8 --- /dev/null +++ b/fumao-app/src/main/resources/banner.txt @@ -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 diff --git a/fumao-app/src/main/resources/config.json b/fumao-app/src/main/resources/config.json new file mode 100644 index 0000000..0e0dcd2 --- /dev/null +++ b/fumao-app/src/main/resources/config.json @@ -0,0 +1,3 @@ +{ + +} \ No newline at end of file diff --git a/fumao-app/src/main/resources/messages.properties b/fumao-app/src/main/resources/messages.properties new file mode 100644 index 0000000..e07f113 --- /dev/null +++ b/fumao-app/src/main/resources/messages.properties @@ -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 \ No newline at end of file diff --git a/fumao-app/src/main/resources/permission.json b/fumao-app/src/main/resources/permission.json new file mode 100644 index 0000000..7829aa6 --- /dev/null +++ b/fumao-app/src/main/resources/permission.json @@ -0,0 +1,8 @@ +[ + { + "name": "", + "url": "", + "method": "", + "order": 0 + } +] \ No newline at end of file diff --git a/fumao-app/src/main/resources/sms.key b/fumao-app/src/main/resources/sms.key new file mode 100644 index 0000000..c233012 --- /dev/null +++ b/fumao-app/src/main/resources/sms.key @@ -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== \ No newline at end of file diff --git a/fumao-common/pom.xml b/fumao-common/pom.xml new file mode 100644 index 0000000..ac9e261 --- /dev/null +++ b/fumao-common/pom.xml @@ -0,0 +1,243 @@ + + + + fumao + com.aki + 0.0.1-SNAPSHOT + + 4.0.0 + + fumao-common + + + + + javax.servlet + servlet-api + 2.5 + provided + + + com.github.penggle + kaptcha + 2.3.2 + + + + + com.squareup.okhttp3 + okhttp + 3.10.0 + + + + + + com.aliyun.mns + aliyun-sdk-mns + 1.1.8.4 + + + com.aliyun.oss + aliyun-sdk-oss + 2.6.1 + + + com.aliyun + aliyun-java-sdk-core + 3.2.3 + system + ${project.basedir}/src/main/lib/aliyun-java-sdk-core-3.2.2.jar + + + com.aliyun + aliyun-java-sdk-dysmsapi + 1.0.0 + system + ${project.basedir}/src/main/lib/aliyun-java-sdk-dysmsapi-1.0.0-SANPSHOT.jar + + + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.security + spring-security-jwt + + + + + com.github.binarywang + weixin-java-mp + ${weixin.version} + + + com.github.binarywang + weixin-java-pay + ${weixin.version} + + + com.github.binarywang + weixin-java-miniapp + ${weixin.version} + + + + + io.springfox + springfox-swagger-ui + + + io.springfox + springfox-swagger2 + + + + + org.projectlombok + lombok + + + com.alibaba + fastjson + 1.2.33 + + + org.redisson + redisson + 3.5.7 + + + + + io.jsonwebtoken + jjwt + ${jjwt.version} + + + + + org.apache.commons + commons-lang3 + 3.4 + + + commons-codec + commons-codec + 1.10 + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 1.3.0 + + + com.github.pagehelper + pagehelper-spring-boot-starter + 1.1.2 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.zaxxer + HikariCP + + + io.dropwizard.metrics + metrics-core + true + + + mysql + mysql-connector-java + + + com.h2database + h2 + + + org.hibernate + hibernate-validator + + + + + com.fasterxml.jackson.core + jackson-core + + + + com.fasterxml.jackson.core + jackson-annotations + + + + com.fasterxml.jackson.core + jackson-databind + + + + + org.springframework.data + spring-data-redis + + + org.springframework.boot + spring-boot-starter-redis + 1.4.7.RELEASE + + + + + + + + + + + + + + + + org.apache.poi + poi + 3.17 + + + org.apache.poi + poi-ooxml + 3.17 + + + + + joda-time + joda-time + 2.9.9 + + + + + com.deepoove + poi-tl + 1.2.0 + + + + org.springframework.boot + spring-boot-starter-test + test + + + \ No newline at end of file diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/BaseAop.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/BaseAop.java new file mode 100644 index 0000000..7faa38e --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/BaseAop.java @@ -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 + * @return + */ + protected 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 getArgs(JoinPoint point) throws NotFoundException { + MethodSignature signature = (MethodSignature) point.getSignature(); + Map 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; + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/cache/CacheAop.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/cache/CacheAop.java new file mode 100644 index 0000000..f07c314 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/cache/CacheAop.java @@ -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 args = getArgs(proceedingJoinPoint); + String redisKey = annotation.value() + SpelHelper.exec(annotation.key(), args); + BoundValueOperations 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 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)"); + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/cache/CacheEvict.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/cache/CacheEvict.java new file mode 100644 index 0000000..977ecf0 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/cache/CacheEvict.java @@ -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; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/cache/Cacheable.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/cache/Cacheable.java new file mode 100644 index 0000000..ac4ce69 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/cache/Cacheable.java @@ -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; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/limit/Limit.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/limit/Limit.java new file mode 100644 index 0000000..5ac370f --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/limit/Limit.java @@ -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 "请忽重复提交"; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/limit/LimitAop.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/limit/LimitAop.java new file mode 100644 index 0000000..99a1746 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/limit/LimitAop.java @@ -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 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()}); + } + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/lock/Lock.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/lock/Lock.java new file mode 100644 index 0000000..d7347a3 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/lock/Lock.java @@ -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 "请稍候重试"; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/lock/LockAop.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/lock/LockAop.java new file mode 100644 index 0000000..45a8acc --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/lock/LockAop.java @@ -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 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(); + } + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/retry/Retry.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/retry/Retry.java new file mode 100644 index 0000000..5289099 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/retry/Retry.java @@ -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; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/retry/RetryAop.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/retry/RetryAop.java new file mode 100644 index 0000000..9d15cb6 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/aop/retry/RetryAop.java @@ -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; + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/config/ApplicationProperty.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/config/ApplicationProperty.java new file mode 100644 index 0000000..9bf5503 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/config/ApplicationProperty.java @@ -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; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/config/CacheEnums.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/config/CacheEnums.java new file mode 100644 index 0000000..5aed003 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/config/CacheEnums.java @@ -0,0 +1,9 @@ +package com.chilunyc.fumao.common.config; + +/** + * + */ +public interface CacheEnums { + + String Permission = "Permission"; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/config/ConfigEnum.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/config/ConfigEnum.java new file mode 100644 index 0000000..eb1887a --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/config/ConfigEnum.java @@ -0,0 +1,8 @@ +package com.chilunyc.fumao.common.config; + + +/** + * + */ +public enum ConfigEnum { +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/config/ConfigRequest.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/config/ConfigRequest.java new file mode 100644 index 0000000..db2bbf0 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/config/ConfigRequest.java @@ -0,0 +1,14 @@ +package com.chilunyc.fumao.common.config; + +import lombok.Data; + +/** + * + */ +@Data +public class ConfigRequest { + + private ConfigEnum key; + + private String value; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/config/ConfigService.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/config/ConfigService.java new file mode 100644 index 0000000..3534238 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/config/ConfigService.java @@ -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 redisTemplate; + + @Autowired + private ApplicationProperty applicationProperty; + private BoundHashOperations ops; + + public void set(ConfigEnum key, Object v) { + this.ops.put(key.name(), v); + } + + public 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)); + } + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/config/RedissonConfig.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/config/RedissonConfig.java new file mode 100644 index 0000000..f7ddb0a --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/config/RedissonConfig.java @@ -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); + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/context/LoginUser.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/context/LoginUser.java new file mode 100644 index 0000000..fbf834f --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/context/LoginUser.java @@ -0,0 +1,42 @@ +package com.chilunyc.fumao.common.context; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.JwtBuilder; + +/** + * + */ +public interface LoginUser { + + /** + * Id + * + * @return + */ + T getId(); + + /** + * 用户名 + * + * @return + */ + String getName(); + + + /** + * @return + */ + String[] toRoles(); + + /** + * + * @param claims + */ + void fromJwt(Claims claims); + + /** + * + * @param claims + */ + void toJwt(JwtBuilder claims); +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/context/Request.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/context/Request.java new file mode 100644 index 0000000..7e4f4b5 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/context/Request.java @@ -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 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"); + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/context/RequestHolder.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/context/RequestHolder.java new file mode 100644 index 0000000..8396ede --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/context/RequestHolder.java @@ -0,0 +1,20 @@ +package com.chilunyc.fumao.common.context; + +/** + * + */ +public class RequestHolder { + private static final ThreadLocal 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(); + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/enums/Comparing.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/enums/Comparing.java new file mode 100644 index 0000000..1317f87 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/enums/Comparing.java @@ -0,0 +1,10 @@ +package com.chilunyc.fumao.common.enums; + +/** + * 80347471@qq.com + */ +public enum Comparing { + Big, + Equal, + Small +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/enums/YesOrNo.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/enums/YesOrNo.java new file mode 100644 index 0000000..893a5b9 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/enums/YesOrNo.java @@ -0,0 +1,10 @@ +package com.chilunyc.fumao.common.enums; + +/** + * + */ +public enum YesOrNo { + Yes, + + No +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/exception/SystemException.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/exception/SystemException.java new file mode 100644 index 0000000..e6d9c20 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/exception/SystemException.java @@ -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); +// } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/config/LBSConfig.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/config/LBSConfig.java new file mode 100644 index 0000000..12685ee --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/config/LBSConfig.java @@ -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 { +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/config/LBSProperties.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/config/LBSProperties.java new file mode 100644 index 0000000..e2fd8bd --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/config/LBSProperties.java @@ -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; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/model/LBSAddress.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/model/LBSAddress.java new file mode 100644 index 0000000..ba86806 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/model/LBSAddress.java @@ -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; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/model/LBSPoi.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/model/LBSPoi.java new file mode 100644 index 0000000..fc45752 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/model/LBSPoi.java @@ -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; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/request/LBSPoiRequest.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/request/LBSPoiRequest.java new file mode 100644 index 0000000..6740c0e --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/request/LBSPoiRequest.java @@ -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; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/service/LBSService.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/service/LBSService.java new file mode 100644 index 0000000..8281b9b --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/lbs/service/LBSService.java @@ -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 { + + @Autowired + private HttpClient httpClient; + + @Autowired + private LBSProperties lbsProperties; + + private ObjectMapper objectMapper = new ObjectMapper(); + + /** + * @param request + * @return + */ + public Page 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 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"); + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/log/model/Event.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/log/model/Event.java new file mode 100644 index 0000000..1ea5358 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/log/model/Event.java @@ -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; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/log/model/EventTarget.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/log/model/EventTarget.java new file mode 100644 index 0000000..249b4cc --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/log/model/EventTarget.java @@ -0,0 +1,8 @@ +package com.chilunyc.fumao.common.log.model; + +/** + * + */ +public enum EventTarget { + System, Company, None +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/log/model/EventType.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/log/model/EventType.java new file mode 100644 index 0000000..702261f --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/log/model/EventType.java @@ -0,0 +1,12 @@ +package com.chilunyc.fumao.common.log.model; + +/** + * + */ +public enum EventType { + + Error, + + // 权限 + RoleEdit, RoleDelete, PermissionEdit, PermissionRemove, SendMsg, 编辑系统管理员, 删除系统管理员, 编辑集团, 删除集团, 编辑商场, 删除商场, 编辑商场楼层, 删除商场楼层, 编辑集团申请, 删除集团申请, 编辑商铺申请, 删除商铺申请, 编辑集团管理员, 删除集团管理员, 编辑商场管理员角色, 删除商场管理员角色, 编辑商场管理员, 删除商场管理员, +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/log/repository/EventMapper.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/log/repository/EventMapper.java new file mode 100644 index 0000000..6a06858 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/log/repository/EventMapper.java @@ -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 page(LogPageRequest request, RowBounds rowBounds); +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/log/repository/EventRepository.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/log/repository/EventRepository.java new file mode 100644 index 0000000..8acd662 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/log/repository/EventRepository.java @@ -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, JpaSpecificationExecutor { +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/log/request/LogPageRequest.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/log/request/LogPageRequest.java new file mode 100644 index 0000000..a2fdef2 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/log/request/LogPageRequest.java @@ -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; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/log/response/LogResponse.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/log/response/LogResponse.java new file mode 100644 index 0000000..227fcd2 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/log/response/LogResponse.java @@ -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; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/log/service/EventService.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/log/service/EventService.java new file mode 100644 index 0000000..4cb0068 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/log/service/EventService.java @@ -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); + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/request/AssignsRequest.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/request/AssignsRequest.java new file mode 100644 index 0000000..e9208d2 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/request/AssignsRequest.java @@ -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 id; + + @NotBlank(message = "分配数据为空") + private String targetId; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/request/ChangePwdRequest.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/request/ChangePwdRequest.java new file mode 100644 index 0000000..a5e19c5 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/request/ChangePwdRequest.java @@ -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; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/request/IdsRequest.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/request/IdsRequest.java new file mode 100644 index 0000000..bc7dca1 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/request/IdsRequest.java @@ -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 { + + @ApiModelProperty(value = "批量操作") + @NotNull(message = "编号不能为空") + @Size(min = 1, message = "编号不能为空") + private List ids; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/request/LoginRequest.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/request/LoginRequest.java new file mode 100644 index 0000000..511a232 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/request/LoginRequest.java @@ -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; + + +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/request/LoginRequestWithCaptcha.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/request/LoginRequestWithCaptcha.java new file mode 100644 index 0000000..1f02825 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/request/LoginRequestWithCaptcha.java @@ -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; + +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/request/LoginRequestWithSMS.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/request/LoginRequestWithSMS.java new file mode 100644 index 0000000..c677841 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/request/LoginRequestWithSMS.java @@ -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; + +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/request/PageRequest.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/request/PageRequest.java new file mode 100644 index 0000000..526c9a3 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/request/PageRequest.java @@ -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()); + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/response/JsonResponse.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/response/JsonResponse.java new file mode 100644 index 0000000..f4d1fe4 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/response/JsonResponse.java @@ -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 { + + @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 JsonResponse success(T object) { + JsonResponse 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); + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/response/KeyValue.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/response/KeyValue.java new file mode 100644 index 0000000..76f3b57 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/response/KeyValue.java @@ -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; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/response/KeyValues.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/response/KeyValues.java new file mode 100644 index 0000000..3ebc46b --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/response/KeyValues.java @@ -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 { + private String key; + + private List values; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/response/NodeResponse.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/response/NodeResponse.java new file mode 100644 index 0000000..5df4647 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/response/NodeResponse.java @@ -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 children; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/shiro/AuthRoles.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/shiro/AuthRoles.java new file mode 100644 index 0000000..63de492 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/shiro/AuthRoles.java @@ -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')"; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/shiro/AuthUser.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/shiro/AuthUser.java new file mode 100644 index 0000000..9ba7632 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/shiro/AuthUser.java @@ -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 authorities; + + public AuthUser setRole(String... roles) { + this.authorities = Stream.of(roles).map(SimpleGrantedAuthority::new).collect(Collectors.toList()); + return this; + } + + @Override + public Collection 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; + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/sms/config/SmsConfig.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/sms/config/SmsConfig.java new file mode 100644 index 0000000..75db87c --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/sms/config/SmsConfig.java @@ -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; + +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/sms/config/SmsProperties.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/sms/config/SmsProperties.java new file mode 100644 index 0000000..0627d89 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/sms/config/SmsProperties.java @@ -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); + } + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/sms/model/Sms.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/sms/model/Sms.java new file mode 100644 index 0000000..9ebb259 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/sms/model/Sms.java @@ -0,0 +1,69 @@ +package com.chilunyc.fumao.common.sms.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_sms") +public class Sms { + + @Id + @Column(columnDefinition = "bigint(64)") + private String id; + + /** + * 手机号 + */ + @Column(length = 11) + private String mobile; + + /** + * 发送类型 + */ + @Column(length = 16) + @Enumerated(EnumType.STRING) + private SmsType type; + + /** + * 验证次数 + */ + @Column(length = 2) + private Integer checkCount; + + /** + * 内容 + */ + private String content; + + /** + * 备注 + */ + private String mark; + + /** + * 过期时间 + */ + private Date expiredTime; + + /** + * + */ + private Boolean isCheck; + + /** + * + */ + private Date createTime; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/sms/model/SmsType.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/sms/model/SmsType.java new file mode 100644 index 0000000..c22c2b5 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/sms/model/SmsType.java @@ -0,0 +1,27 @@ +package com.chilunyc.fumao.common.sms.model; + +/** + * + */ +public enum SmsType { + + /** + * 注册 + */ + CustomerRegister(""), + + /** + * 找回密码 + */ + CustomerFindPwd(""); + + private String tpl; + + SmsType(String tpl) { + this.tpl = tpl; + } + + public String getTemplate() { + return tpl; + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/sms/repository/SmsRepository.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/sms/repository/SmsRepository.java new file mode 100644 index 0000000..ea399bf --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/sms/repository/SmsRepository.java @@ -0,0 +1,38 @@ +package com.chilunyc.fumao.common.sms.repository; + +import com.chilunyc.fumao.common.sms.model.Sms; +import com.chilunyc.fumao.common.sms.model.SmsType; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.transaction.annotation.Transactional; + +/** + * + */ +public interface SmsRepository extends JpaRepository, JpaSpecificationExecutor { + + /** + * 最后最后一次发现的短信 + * + * @param mobile + * @return + */ + Sms findFirstByMobileOrderByCreateTimeDesc(String mobile); + + /** + * 设置sms为禁用 + * + * @param mobile + * @param type + * @param mark + * @return + */ + @Transactional + @Modifying + @Query( + "Update Sms s set s.isCheck = true, s.mark = ?3 Where s.mobile = ?1 and s.type = ?2 and s.isCheck = false" + ) + int disabled(String mobile, SmsType type, String mark); +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/sms/request/SmsCheckRequest.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/sms/request/SmsCheckRequest.java new file mode 100644 index 0000000..5f48f54 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/sms/request/SmsCheckRequest.java @@ -0,0 +1,40 @@ +package com.chilunyc.fumao.common.sms.request; + +import com.chilunyc.fumao.common.sms.model.SmsType; +import com.chilunyc.fumao.common.util.jpa.query.QueryItem; +import com.chilunyc.fumao.common.util.jpa.query.QueryType; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.NotBlank; +import org.springframework.data.jpa.domain.Specification; + +import javax.persistence.criteria.Predicate; +import javax.validation.constraints.Pattern; +import java.util.ArrayList; +import java.util.List; + +/** + * + */ +@ApiModel +@Data +public class SmsCheckRequest { + + @ApiModelProperty(value = "手机号") + @NotBlank(message = "请输入手机号") + @Pattern(regexp = "1[\\d]{10}", message = "请输入正确的手机号") + @QueryItem(type = QueryType.equal) + private String mobile; + + @ApiModelProperty(value = "短信验证码") + @NotBlank(message = "请输入短信验证码") + private String code; + + @ApiModelProperty(hidden = true) + @QueryItem(type = QueryType.equal) + private SmsType type; + + @QueryItem(type = QueryType.equal) + private boolean isCheck = false; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/sms/request/SmsSendRequest.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/sms/request/SmsSendRequest.java new file mode 100644 index 0000000..d53ede9 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/sms/request/SmsSendRequest.java @@ -0,0 +1,34 @@ +package com.chilunyc.fumao.common.sms.request; + +import com.chilunyc.fumao.common.sms.model.SmsType; +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; + +import javax.validation.constraints.Pattern; + +/** + * + */ +@ApiModel +@Data +public class SmsSendRequest { + + @ApiModelProperty(value = "手机号") + @NotBlank(message = "请输入手机号") + @Pattern(regexp = "1[34578]\\d{9}", message = "手机号不正确") + private String mobile; + + @ApiModelProperty(value = "图形验证码") + @NotBlank(message = "请输入图形验证码") + @Captcha + private String captcha; + + @ApiModelProperty(hidden = true) + private SmsType type; + + @ApiModelProperty(hidden = true) + private String content; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/sms/service/SmsService.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/sms/service/SmsService.java new file mode 100644 index 0000000..75fa8d9 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/sms/service/SmsService.java @@ -0,0 +1,116 @@ +package com.chilunyc.fumao.common.sms.service; + +import com.chilunyc.fumao.common.context.RequestHolder; +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.sms.config.SmsProperties; +import com.chilunyc.fumao.common.sms.model.Sms; +import com.chilunyc.fumao.common.sms.repository.SmsRepository; +import com.chilunyc.fumao.common.sms.request.SmsCheckRequest; +import com.chilunyc.fumao.common.sms.request.SmsSendRequest; +import com.chilunyc.fumao.common.util.jpa.query.QueryBuilder; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.concurrent.TimeUnit; + +/** + * + */ +@Service +@Transactional +public class SmsService { + + @Autowired + private SmsRepository smsRepository; + + @Autowired + private SmsProperties smsProperties; + + @Autowired + private EventService eventService; + + /** + * @param request + */ + @Transactional + public void send(SmsSendRequest request) { + //1. 取最后一次发送的短信 + Sms last = smsRepository.findFirstByMobileOrderByCreateTimeDesc(request.getMobile()); + if (last != null + && TimeUnit.SECONDS.convert(new Date().getTime() - last.getCreateTime().getTime(), TimeUnit.MILLISECONDS) < 60) { + throw new SystemException("300010"); + } + +// //2. 发送短信 +// Map map = MapBuilder +// .builder() +// .put("code", request.getContent()) +// .put("product", smsProperties.getSignName()) +// .getMap(); +// JsonResponse msgId = aliyunSender.send(request.getType().getTemplate(), request.getMobile(), map); +// if (StringUtils.isNotBlank(msgId.getError())) { +// throw new SystemException("300011", new Object[]{msgId.getError()}); +// } + + //3. 把所有该手机的可用的sms全部设置为不可用 + smsRepository.disabled(request.getMobile(), request.getType(), "再次发送短信"); + + //3. 存储 + Sms sms = Sms + .builder() + .type(request.getType()) + .isCheck(false) + .mobile(request.getMobile()) + .content(request.getContent()) + .build(); +// sms.setId(msgId.getData().toString()); + sms.setCheckCount(0); + sms.setCreateTime(new Date()); + sms.setExpiredTime(new Date(sms.getCreateTime().getTime() + 5 * 1000 * 60)); + smsRepository.save(sms); + eventService.add(RequestHolder.get(), EventTarget.None, EventType.SendMsg, request.getMobile()); + } + + /** + * @param request + */ + @Transactional(noRollbackFor = Exception.class) + public void check(SmsCheckRequest request) { + Sms one = smsRepository.findOne(QueryBuilder.build(request)); + if (one == null || (one != null && one.getIsCheck())) { + throw new SystemException("300012"); + } + // 过期 + else if (one.getExpiredTime().before(new Date())) { + one.setIsCheck(true); + one.setMark("验证时效"); + smsRepository.save(one); + throw new SystemException("300012"); + } + // 验证通过 + else if (StringUtils.equalsIgnoreCase(one.getContent(), request.getCode())) { + one.setIsCheck(true); + one.setMark("校验成功"); + smsRepository.save(one); + } + // 次数过多 + else if (one.getCheckCount() > 2) { + one.setIsCheck(true); + one.setMark("尝试次数过多"); + smsRepository.save(one); + throw new SystemException("300012"); + } + // 验证错误 + else { + one.setCheckCount(one.getCheckCount() + 1); + smsRepository.save(one); + throw new SystemException("300012"); + } + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/upload/config/UploadConfig.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/upload/config/UploadConfig.java new file mode 100644 index 0000000..b72d2f9 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/upload/config/UploadConfig.java @@ -0,0 +1,30 @@ +package com.chilunyc.fumao.common.upload.config; + +import com.aliyun.oss.OSSClient; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * + */ +@Configuration +@ConditionalOnProperty(name = "aliyun.oss.access-id") +@EnableConfigurationProperties(UploadProperties.class) +public class UploadConfig { + + @Autowired + private UploadProperties uploadProperties; + + @Bean + OSSClient ossClient() { + OSSClient client = null; + if (StringUtils.isNotBlank(uploadProperties.getAccessId())) { + client = new OSSClient(uploadProperties.getHost(), uploadProperties.getAccessId(), uploadProperties.getAccessKey()); + } + return client; + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/upload/config/UploadProperties.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/upload/config/UploadProperties.java new file mode 100644 index 0000000..7195a9e --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/upload/config/UploadProperties.java @@ -0,0 +1,25 @@ +package com.chilunyc.fumao.common.upload.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * + */ +@Data +@ConfigurationProperties("aliyun.oss") +public class UploadProperties { + + private String accessId; + + private String accessKey; + + private String endPoint; + + private String bucket; + + + public String getHost() { + return String.format("https://%s.%s", bucket, endPoint); + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/upload/request/UploadRequest.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/upload/request/UploadRequest.java new file mode 100644 index 0000000..cd6aa6a --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/upload/request/UploadRequest.java @@ -0,0 +1,16 @@ +package com.chilunyc.fumao.common.upload.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * + */ +@ApiModel +@Data +public class UploadRequest { + + @ApiModelProperty(hidden = true) + private String dir; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/upload/response/UploadResponse.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/upload/response/UploadResponse.java new file mode 100644 index 0000000..580d0d4 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/upload/response/UploadResponse.java @@ -0,0 +1,30 @@ +package com.chilunyc.fumao.common.upload.response; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class UploadResponse { + + private String OSSAccessKeyId; + + private String policy; + + private String signature; + + private String dir; + + private String host; + + private String expire; + + private String key; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/upload/service/UploadService.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/upload/service/UploadService.java new file mode 100644 index 0000000..7e5c9e0 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/upload/service/UploadService.java @@ -0,0 +1,59 @@ +package com.chilunyc.fumao.common.upload.service; + +import com.chilunyc.fumao.common.exception.SystemException; +import com.chilunyc.fumao.common.upload.config.UploadProperties; +import com.chilunyc.fumao.common.upload.response.UploadResponse; +import com.aliyun.oss.OSSClient; +import com.aliyun.oss.common.utils.BinaryUtil; +import com.aliyun.oss.model.PolicyConditions; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.UUID; + +/** + * + */ +@Service +@Transactional +public class UploadService { + + private Logger logger = LoggerFactory.getLogger(UploadService.class); + + @Autowired + private UploadProperties uploadProperties; + + @Autowired + private OSSClient client; + + public UploadResponse getAuth() { + try { + long expireTime = 30; + long expireEndTime = System.currentTimeMillis() + expireTime * 1000; + Date expiration = new Date(expireEndTime); + PolicyConditions policyConds = new PolicyConditions(); + policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000); + String postPolicy = client.generatePostPolicy(expiration, policyConds); + byte[] binaryData = postPolicy.getBytes("utf-8"); + String encodedPolicy = BinaryUtil.toBase64String(binaryData); + String postSignature = client.calculatePostSignature(postPolicy); + + return UploadResponse + .builder() + .key(UUID.randomUUID().toString().replaceAll("-", "")) + .OSSAccessKeyId(uploadProperties.getAccessId()) + .policy(encodedPolicy) + .signature(postSignature) + .host(uploadProperties.getHost()) + .expire(String.valueOf(expireEndTime / 1000)) + .build(); + } catch (Exception e) { + logger.error(e.getMessage(), e); + throw new SystemException("创建上传凭证失败"); + } + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/BeanHelper.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/BeanHelper.java new file mode 100644 index 0000000..9202c5d --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/BeanHelper.java @@ -0,0 +1,45 @@ +package com.chilunyc.fumao.common.util; + +import org.springframework.beans.BeanUtils; +import org.springframework.beans.BeanWrapper; +import org.springframework.beans.BeanWrapperImpl; + +import java.util.HashSet; +import java.util.Set; + +/** + * + */ +public class BeanHelper { + + /** + * 主要过滤 null 值 + * + * @param src + * @param target + */ + public static void copyProperties(Object src, Object target) { + BeanUtils.copyProperties(target, src, getNullPropertyNames(target)); + } + + /** + * @param source + * @return + */ + public static String[] getNullPropertyNames(Object source) { + final BeanWrapper src = new BeanWrapperImpl(source); + java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors(); + + Set emptyNames = new HashSet(); + for (java.beans.PropertyDescriptor pd : pds) { + if (pd.getWriteMethod() == null) { + continue; + } + Object srcValue = src.getPropertyValue(pd.getName()); + if (srcValue == null) emptyNames.add(pd.getName()); + } + String[] result = new String[emptyNames.size()]; + return emptyNames.toArray(result); + } + +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/CountHelper.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/CountHelper.java new file mode 100644 index 0000000..b158dfa --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/CountHelper.java @@ -0,0 +1,77 @@ +package com.chilunyc.fumao.common.util; + +import com.chilunyc.fumao.common.enums.Comparing; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.BoundValueOperations; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.concurrent.TimeUnit; + +/** + * + */ +@Component +public class CountHelper { + + @Autowired + private StringRedisTemplate redisTemplate; + + /** + * 小于则加1 + * 大于 + * + * @param key + * @param number + * @param expire + * @return + */ + public boolean isLessAndIncreament(String key, int number, int expire) { + if (this.compare(key, number).equals(Comparing.Small)) { + this.increament(key, expire); + return true; + } else { + return false; + } + } + + /** + * @param key + * @param number + * @return + */ + public Comparing compare(String key, int number) { + int count = this.count(key); + if (count == number) { + return Comparing.Equal; + } else if (count > number) { + return Comparing.Big; + } else { + return Comparing.Small; + } + } + + public int count(String key) { + String s = get(key); + if (StringUtils.isBlank(s)) { + return 0; + } else { + return Integer.parseInt(s); + } + } + + public void increament(String key, int expire) { + BoundValueOperations ops = redisTemplate.boundValueOps(key); + ops.increment(1); + ops.expire(expire, TimeUnit.SECONDS); + } + + public void delete(String key) { + redisTemplate.delete(key); + } + + public String get(String key) { + return redisTemplate.boundValueOps(key).get(); + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/CovertHelper.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/CovertHelper.java new file mode 100644 index 0000000..d033639 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/CovertHelper.java @@ -0,0 +1,54 @@ +package com.chilunyc.fumao.common.util; + +import org.apache.commons.lang3.time.DateFormatUtils; +import org.apache.commons.lang3.time.DateUtils; + +import java.math.BigDecimal; +import java.text.ParseException; +import java.util.Date; +import java.util.regex.Pattern; + +/** + * 80347471@qq.com + */ +public class CovertHelper { + + private static String dateTimeRegexp = "\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}"; + private static String dateTimeFormat = "yyyy-MM-dd HH:mm:ss"; + private static String dateRegexp = "\\d{4}-\\d{2}-\\d{2}"; + private static String dateFormat = "yyyy-MM-dd"; + + public static Object stringTo(String src, Class toClass) { + if (toClass.isAssignableFrom(String.class)) { + return src; + } + // + else if (toClass.isAssignableFrom(Integer.class) || toClass.isAssignableFrom(int.class)) { + return Integer.parseInt(src); + } + // + else if (toClass.isAssignableFrom(Float.class) || toClass.isAssignableFrom(float.class)) { + return Float.parseFloat(src); + } + // + else if (toClass.isAssignableFrom(Double.class) || toClass.isAssignableFrom(double.class)) { + return Double.parseDouble(src); + } + // + else if (toClass.isAssignableFrom(BigDecimal.class)) { + return new BigDecimal(src); + } + // + else if (toClass.isAssignableFrom(Date.class)) { + try { + return DateUtils.parseDate(src, dateTimeFormat, dateFormat); + } catch (ParseException e) { + throw new UnsupportedOperationException(String.format("src[%s] can not format to Date", src), e); + } + } + // + else { + throw new UnsupportedOperationException(String.format("src[%s] => class[%s]", src, toClass)); + } + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/CryptoHelper.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/CryptoHelper.java new file mode 100644 index 0000000..8c1998d --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/CryptoHelper.java @@ -0,0 +1,50 @@ +package com.chilunyc.fumao.common.util; + +import org.apache.commons.codec.binary.Base64; + +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; +import java.security.MessageDigest; + +/** + * 80347471@qq.com + */ +public class CryptoHelper { + + // 加密算法 + private static final String ALG = "AES"; + // 字符编码 + private static final String ENC = "UTF-8"; + // 密钥正规化算法 + private static final String SEC_NORMALIZE_ALG = "MD5"; + + // 加密 + public static String aesEncrypt(String secret, String data) throws Exception { + MessageDigest dig = MessageDigest.getInstance(SEC_NORMALIZE_ALG); + byte[] key = dig.digest(secret.getBytes(ENC)); + SecretKeySpec secKey = new SecretKeySpec(key, ALG); + + Cipher aesCipher = Cipher.getInstance(ALG); + byte[] byteText = data.getBytes(ENC); + + aesCipher.init(Cipher.ENCRYPT_MODE, secKey); + byte[] byteCipherText = aesCipher.doFinal(byteText); + + Base64 base64 = new Base64(); + return new String(base64.encode(byteCipherText), ENC); + } + + // 解密 + public static String aesDecrypt(String secret, String ciphertext) throws Exception { + MessageDigest dig = MessageDigest.getInstance(SEC_NORMALIZE_ALG); + byte[] key = dig.digest(secret.getBytes(ENC)); + SecretKeySpec secKey = new SecretKeySpec(key, ALG); + + Cipher aesCipher = Cipher.getInstance(ALG); + aesCipher.init(Cipher.DECRYPT_MODE, secKey); + Base64 base64 = new Base64(); + byte[] cipherbytes = base64.decode(ciphertext.getBytes()); + byte[] bytePlainText = aesCipher.doFinal(cipherbytes); + return new String(bytePlainText, ENC); + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/DateHelper.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/DateHelper.java new file mode 100644 index 0000000..cf7e77c --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/DateHelper.java @@ -0,0 +1,28 @@ +package com.chilunyc.fumao.common.util; + +import java.util.Calendar; +import java.util.Date; + +/** + * + */ +public class DateHelper { + + /** + * + * @param date + * @param date1 + * @param date2 + * @return + */ + public static boolean isSame(Date date, Date date1, int date2) { + if (date == null) { + return true; + } + Calendar c1 = Calendar.getInstance(); + Calendar c2 = Calendar.getInstance(); + c1.setTime(date); + c2.setTime(date1); + return c1.get(date2) == c2.get(date2); + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/DateRangeHelper.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/DateRangeHelper.java new file mode 100644 index 0000000..b5c4ef8 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/DateRangeHelper.java @@ -0,0 +1,116 @@ +package com.chilunyc.fumao.common.util; + +import com.chilunyc.fumao.common.exception.SystemException; +import org.joda.time.DateTime; + +import java.util.Calendar; +import java.util.Date; + +/** + * + */ +public class DateRangeHelper { + + public static void main(String[] args) { + Date[] dates = DateRangeHelper.yearRange(); + System.out.println(dates[0] + " => " + dates[1]); + } + + /** + * 昨天 0 点 - 23:59:59 + * + * @return + */ + public static Date[] yesterdayRange() { + DateTime start = DateTime.now().withTimeAtStartOfDay(); + DateTime end = start.plusDays(1).minusSeconds(1); + return new Date[]{ + start.toDate(), + end.toDate() + }; + } + + /** + * 昨天 0 点 - 23:59:59 + * + * @return + */ + public static Date[] todayRange() { + DateTime start = DateTime.now().withTimeAtStartOfDay(); + return new Date[]{ + start.toDate(), + new Date() + }; + } + + /** + * 近7天 + * + * @return + */ + public static Date[] weekRange() { + DateTime end = DateTime.now(); + DateTime start = end.minusDays(7).withTimeAtStartOfDay(); + return new Date[]{ + start.toDate(), + end.toDate() + }; + } + + /** + * 近30天 + * + * @return + */ + public static Date[] monthRange() { + DateTime end = DateTime.now(); + DateTime start = end.minusDays(31).withTimeAtStartOfDay(); + return new Date[]{ + start.toDate(), + end.toDate() + }; + } + + /** + * 近1年 + * + * @return + */ + public static Date[] yearRange(Date startDate, Date endDate) { + if (startDate == null) { + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.MONTH, 0); + startDate = calendar.getTime(); + } + if (endDate != null && endDate.before(startDate)) { + throw new SystemException("300016"); + } + if (endDate == null) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.YEAR, 1); + endDate = calendar.getTime(); + } + return new Date[]{startDate, endDate}; + } + + + public static Date[] yearRange() { + DateTime end = DateTime.now(); + DateTime start = end.minusYears(1).withTimeAtStartOfDay(); + return new Date[]{ + start.toDate(), + end.toDate() + }; + + } + + public static Date[] yearRange(Integer year) { + DateTime end = DateTime.now(); + DateTime start = end.minusYears(year == null ? 1 : year).withTimeAtStartOfDay(); + return new Date[]{ + start.toDate(), + end.toDate() + }; + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/MapBuilder.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/MapBuilder.java new file mode 100644 index 0000000..9906158 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/MapBuilder.java @@ -0,0 +1,25 @@ +package com.chilunyc.fumao.common.util; + +import java.util.HashMap; +import java.util.Map; + +/** + * + */ +public class MapBuilder { + + private Map r = new HashMap<>(); + + public MapBuilder put(String k, Object v) { + r.put(k, v); + return this; + } + + public Map getMap() { + return this.r; + } + + public static MapBuilder builder() { + return new MapBuilder(); + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/MathHelper.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/MathHelper.java new file mode 100644 index 0000000..10baff4 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/MathHelper.java @@ -0,0 +1,17 @@ +package com.chilunyc.fumao.common.util; + +import java.math.BigDecimal; + +/** + * + */ +public class MathHelper { + + public static double toFixed(Double value, int size) { + return BigDecimal.valueOf(value == null ? 0 : value).setScale(size, BigDecimal.ROUND_HALF_UP).doubleValue(); + } + + public static double toFixed(Double value){ + return toFixed(value, 2); + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/SpelHelper.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/SpelHelper.java new file mode 100644 index 0000000..1c45221 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/SpelHelper.java @@ -0,0 +1,37 @@ +package com.chilunyc.fumao.common.util; + +import org.springframework.expression.Expression; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.expression.spel.support.StandardEvaluationContext; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * + */ +public class SpelHelper { + + private static ConcurrentHashMap m = new ConcurrentHashMap<>(); + + /** + * 动态执行 + * + * @param exp + * @param values + * @param + * @return + */ + public static T exec(String exp, Map values) { + Expression expression; + if (m.contains(exp)) { + expression = m.get(exp); + } else { + expression = new SpelExpressionParser().parseExpression(exp); + m.put(exp, expression); + } + StandardEvaluationContext context = new StandardEvaluationContext(); + context.setVariables(values); + return (T) expression.getValue(context); + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/SpringHelper.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/SpringHelper.java new file mode 100644 index 0000000..7214212 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/SpringHelper.java @@ -0,0 +1,24 @@ +package com.chilunyc.fumao.common.util; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +/** + * + */ +@Component +public class SpringHelper implements ApplicationContextAware { + + private static ApplicationContext applicationContext; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringHelper.applicationContext = applicationContext; + } + + public static T getBean(Class clazz) { + return applicationContext.getBean(clazz); + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/StreamHelper.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/StreamHelper.java new file mode 100644 index 0000000..621b25f --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/StreamHelper.java @@ -0,0 +1,40 @@ +package com.chilunyc.fumao.common.util; + +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.BiConsumer; +import java.util.function.Function; +import java.util.function.Predicate; + +/** + * + */ +public class StreamHelper { + + /** + * 按某个字段去重 + * @param keyExtractor + * @param + * @return + */ + public static Predicate distinctByKey(Function keyExtractor) { + Map seen = new ConcurrentHashMap<>(); + return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null; + } + + /** + * + * @param els + * @param action + * @param + */ + public static void foreach(Iterable els, BiConsumer action) { + Objects.requireNonNull(els); + Objects.requireNonNull(action); + int index = 0; + for (T el : els) { + action.accept(index++, el); + } + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/ExcelEntityDescription.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/ExcelEntityDescription.java new file mode 100644 index 0000000..acd32f5 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/ExcelEntityDescription.java @@ -0,0 +1,106 @@ +package com.chilunyc.fumao.common.util.excel; + +import com.chilunyc.fumao.common.util.excel.column.ExcelColumn; +import com.chilunyc.fumao.common.util.excel.row.ExcelRow; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.xssf.usermodel.XSSFCell; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.springframework.util.ReflectionUtils; + +import java.lang.reflect.Field; +import java.util.Map; +import java.util.TreeMap; + +/** + * 80347471@qq.com + */ +public class ExcelEntityDescription { + + private Class clazz; + + private ExcelRow excelRow; + + private final Map indexColumnMap = new TreeMap<>(); + + public ExcelEntityDescription(Class clazz) { + this.clazz = clazz; + this.analysis(); + } + + public T read(Row row, int rowIndex) throws Exception { + if (rowIndex == 0) { + return null; + } + Object o = this.clazz.newInstance(); + short lastCellNum = row.getLastCellNum(); + for (int cellIndex = 0; cellIndex < lastCellNum; cellIndex++) { + Cell cell = row.getCell(cellIndex); + ExcelEntityFieldDescription fieldDescription = indexColumnMap.get(cellIndex); + if (fieldDescription != null) { + fieldDescription.getReader().read(o, fieldDescription, row, rowIndex, cell, cellIndex); + } + } + return (T) o; + } + + public void writeHead(XSSFSheet sheet) { + XSSFRow row = sheet.createRow(0); + for (Map.Entry entry : indexColumnMap.entrySet()) { + XSSFCell cell = row.createCell(entry.getKey()); + cell.setCellValue(entry.getValue().getExcelColumn().title()); + } + } + + public void writeEntity(XSSFSheet sheet, T o, int dataIndex) throws Exception { + XSSFRow row = sheet.createRow(dataIndex + 1); + for (Map.Entry entry : indexColumnMap.entrySet()) { + XSSFCell cell = row.createCell(entry.getKey()); + ExcelEntityFieldDescription value = entry.getValue(); + value.getWriter().write(o, value, row, dataIndex + 1, cell, entry.getKey(), sheet); + } + } + + public void writeFoot(XSSFSheet sheet) { + for (Map.Entry entry : indexColumnMap.entrySet()) { + sheet.autoSizeColumn(entry.getKey()); + } + } + + /** + * + */ + private void analysis() { + // 解析类型 + ExcelRow annotation = (ExcelRow) this.clazz.getAnnotation(ExcelRow.class); + if (annotation != null) { + this.excelRow = annotation; + } + + // 解析字段 + ReflectionUtils.doWithFields(clazz, new ReflectionUtils.FieldCallback() { + @Override + public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException { + ExcelColumn annotation = field.getAnnotation(ExcelColumn.class); + if (annotation != null) { + try { + field.setAccessible(true); + ExcelEntityFieldDescription fieldDescription = ExcelEntityFieldDescription + .builder() + .excelColumn(annotation) + .field(field) + .reader(annotation.reader().newInstance()) + .writer(annotation.writer().newInstance()) + .build(); + indexColumnMap.put(annotation.order(), fieldDescription); + } catch (InstantiationException e) { + e.printStackTrace(); + } + } + } + }); + } + + +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/ExcelEntityFieldDescription.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/ExcelEntityFieldDescription.java new file mode 100644 index 0000000..7e49024 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/ExcelEntityFieldDescription.java @@ -0,0 +1,30 @@ +package com.chilunyc.fumao.common.util.excel; + +import com.chilunyc.fumao.common.util.excel.column.ExcelColumn; +import com.chilunyc.fumao.common.util.excel.column.ExcelColumnReader; +import com.chilunyc.fumao.common.util.excel.column.ExcelColumnWriter; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.lang.reflect.Field; + +/** + * 80347471@qq.com + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class ExcelEntityFieldDescription { + + private ExcelColumn excelColumn; + + private Field field; + + private ExcelColumnReader reader; + + private ExcelColumnWriter writer; + +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/ExcelHelper.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/ExcelHelper.java new file mode 100644 index 0000000..7a92971 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/ExcelHelper.java @@ -0,0 +1,78 @@ +package com.chilunyc.fumao.common.util.excel; + +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.usermodel.WorkbookFactory; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import java.io.InputStream; +import java.io.OutputStream; +import java.util.*; + +/** + * 80347471@qq.com + */ +public class ExcelHelper { + + + public List read(InputStream inputStream, Class tClass) throws Exception { + return read(inputStream, tClass, 0); + } + + public List read(InputStream inputStream, Class tClass, int sheetIndex) throws Exception { + Workbook workbook = null; + List result = new ArrayList<>(); + try { + workbook = WorkbookFactory.create(inputStream); + Sheet sheet = workbook.getSheetAt(sheetIndex); + ExcelEntityDescription entityDescription = new ExcelEntityDescription(tClass); + int lastRowNum = sheet.getLastRowNum(); + for (int rowIndex = 0; rowIndex <= lastRowNum; rowIndex++) { + T entity = (T) entityDescription.read(sheet.getRow(rowIndex), rowIndex); + if (entity != null) { + result.add(entity); + } + } + } finally { + if (workbook != null) { + workbook.close(); + } + } + return result; + } + + public void write(List dataList, Class dataClass, OutputStream stream) throws Exception { + write( + Collections.singletonMap("sheet0", dataList), + Collections.singletonList(dataClass), + stream + ); + } + + public void write(Map sheetDataListMap, List dataClassList, OutputStream stream) throws Exception { + XSSFWorkbook workbook = new XSSFWorkbook(); + Set sheetNameSet = sheetDataListMap.keySet(); + int sheetIndex = 0; + for (String sheetName : sheetNameSet) { + List sheetDataList = sheetDataListMap.get(sheetName); + Class sheetDataClass = dataClassList.get(sheetIndex); + + // + ExcelEntityDescription entityDescription = new ExcelEntityDescription(sheetDataClass); + XSSFSheet sheet = workbook.createSheet(sheetName); + + // + entityDescription.writeHead(sheet); + for (int i = 0; i < sheetDataList.size(); i++) { + entityDescription.writeEntity(sheet, sheetDataList.get(i), i); + } + entityDescription.writeFoot(sheet); + + // + sheetIndex++; + } + workbook.write(stream); + } + +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/column/ExcelColumn.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/column/ExcelColumn.java new file mode 100644 index 0000000..ae21ced --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/column/ExcelColumn.java @@ -0,0 +1,26 @@ +package com.chilunyc.fumao.common.util.excel.column; + +import com.chilunyc.fumao.common.util.excel.column.impl.DefaultExcelColumnReaderWriter; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 80347471@qq.com + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface ExcelColumn { + + String title() default ""; + + int order(); + + int width() default 0; + + Class reader() default DefaultExcelColumnReaderWriter.class; + + Class writer() default DefaultExcelColumnReaderWriter.class; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/column/ExcelColumnReader.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/column/ExcelColumnReader.java new file mode 100644 index 0000000..b1b64bb --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/column/ExcelColumnReader.java @@ -0,0 +1,21 @@ +package com.chilunyc.fumao.common.util.excel.column; + +import com.chilunyc.fumao.common.util.excel.ExcelEntityFieldDescription; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; + +/** + * 80347471@qq.com + */ +public interface ExcelColumnReader { + + /** + * @param o + * @param fieldDescription + * @param row + * @param rowIndex + * @param cell + * @param cellIndex + */ + void read(Object o, ExcelEntityFieldDescription fieldDescription, Row row, int rowIndex, Cell cell, int cellIndex) throws Exception; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/column/ExcelColumnWriter.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/column/ExcelColumnWriter.java new file mode 100644 index 0000000..e170eb8 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/column/ExcelColumnWriter.java @@ -0,0 +1,14 @@ +package com.chilunyc.fumao.common.util.excel.column; + +import com.chilunyc.fumao.common.util.excel.ExcelEntityFieldDescription; +import org.apache.poi.xssf.usermodel.XSSFCell; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; + +/** + * 80347471@qq.com + */ +public interface ExcelColumnWriter { + + void write(T o, ExcelEntityFieldDescription value, XSSFRow row, int rowIndex, XSSFCell cell, int cellIndex, XSSFSheet sheet) throws Exception; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/column/impl/DefaultExcelColumnReaderWriter.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/column/impl/DefaultExcelColumnReaderWriter.java new file mode 100644 index 0000000..9f4d015 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/column/impl/DefaultExcelColumnReaderWriter.java @@ -0,0 +1,105 @@ +package com.chilunyc.fumao.common.util.excel.column.impl; + +import com.chilunyc.fumao.common.util.CovertHelper; +import com.chilunyc.fumao.common.util.excel.ExcelEntityFieldDescription; +import com.chilunyc.fumao.common.util.excel.column.ExcelColumnReader; +import com.chilunyc.fumao.common.util.excel.column.ExcelColumnWriter; +import org.apache.commons.lang3.time.DateFormatUtils; +import org.apache.poi.hssf.usermodel.HSSFDateUtil; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.xssf.usermodel.XSSFCell; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; + +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 80347471@qq.com + */ +public class DefaultExcelColumnReaderWriter implements ExcelColumnReader, ExcelColumnWriter { + + /** + * @param o + * @param fieldDescription + * @param row + * @param rowIndex + * @param cell + * @param cellIndex + */ + @Override + public void read(Object o, ExcelEntityFieldDescription fieldDescription, Row row, int rowIndex, Cell cell, int cellIndex) throws Exception { + String cellValue = null; + Field field = fieldDescription.getField(); + Class type = field.getType(); + switch (cell.getCellTypeEnum()) { + case NUMERIC: + // 是时间类型 + if (HSSFDateUtil.isCellDateFormatted(cell)) { + if (type.isAssignableFrom(Date.class)) { + field.set(o, cell.getDateCellValue()); + } else { + throw new UnsupportedOperationException(String.format("cell[%s] 是时间类型, class[%s] field[%s] 不是时间类型", cell.getCellTypeEnum(), o.getClass(), field.getName())); + } + } + // 不是时间类型 + else { + cellValue = cell.getNumericCellValue() + ""; + field.set(o, CovertHelper.stringTo(cellValue, type)); + } + break; + case STRING: + cellValue = cell.getStringCellValue(); + field.set(o, CovertHelper.stringTo(cellValue, type)); + break; + default: + throw new UnsupportedOperationException(String.format("cell[%s] class[%s] field[%s]", cell.getCellTypeEnum(), o.getClass(), field.getName())); + } + } + + /** + * @param o + * @param value + * @param row + * @param i + * @param cell + * @param key + * @param sheet + * @throws Exception + */ + @Override + public void write(Object o, ExcelEntityFieldDescription value, XSSFRow row, int rowIndex, XSSFCell cell, int cellIndex, XSSFSheet sheet) throws Exception { + Field field = value.getField(); + Object fieldValue = field.get(o); + Class type = field.getType(); + if (type.isAssignableFrom(String.class)) { + cell.setCellValue((String) fieldValue); + } + // + else if (type.isAssignableFrom(Integer.class) || type.isAssignableFrom(int.class)) { + cell.setCellValue((int) fieldValue); + } + // + else if (type.isAssignableFrom(Float.class) || type.isAssignableFrom(float.class)) { + cell.setCellValue((float) fieldValue); + } + // + else if (type.isAssignableFrom(Double.class) || type.isAssignableFrom(double.class)) { + cell.setCellValue((Double) fieldValue); + } + // + else if (type.isAssignableFrom(BigDecimal.class)) { + cell.setCellValue(((BigDecimal) fieldValue).toString()); + } + // + else if (type.isAssignableFrom(Date.class)) { + cell.setCellValue(DateFormatUtils.format(((Date) fieldValue), "yyyy-MM-dd HH:mm:ss")); + } + // + else { + throw new UnsupportedOperationException(String.format("src[%s] => class[%s]", fieldValue, type)); + } + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/row/ExcelRow.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/row/ExcelRow.java new file mode 100644 index 0000000..140f7b6 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/row/ExcelRow.java @@ -0,0 +1,18 @@ +package com.chilunyc.fumao.common.util.excel.row; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 80347471@qq.com + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface ExcelRow { + + Class reader(); + + Class writer(); +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/row/ExcelRowReader.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/row/ExcelRowReader.java new file mode 100644 index 0000000..cd4183d --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/row/ExcelRowReader.java @@ -0,0 +1,7 @@ +package com.chilunyc.fumao.common.util.excel.row; + +/** + * 80347471@qq.com + */ +public interface ExcelRowReader { +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/row/ExcelRowWriter.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/row/ExcelRowWriter.java new file mode 100644 index 0000000..baf94e5 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/excel/row/ExcelRowWriter.java @@ -0,0 +1,7 @@ +package com.chilunyc.fumao.common.util.excel.row; + +/** + * 80347471@qq.com + */ +public interface ExcelRowWriter { +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/config/HttpConfig.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/config/HttpConfig.java new file mode 100644 index 0000000..beb2d0c --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/config/HttpConfig.java @@ -0,0 +1,34 @@ +package com.chilunyc.fumao.common.util.http.config; + +import okhttp3.ConnectionPool; +import okhttp3.OkHttpClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.concurrent.TimeUnit; + +/** + * + */ +@Configuration +@EnableConfigurationProperties(HttpProperty.class) +public class HttpConfig { + + @Autowired + private HttpProperty sdkProperty; + + @Bean + OkHttpClient okHttpClient() { + return new OkHttpClient.Builder() + .connectTimeout(10, TimeUnit.SECONDS) // + .followRedirects(false) // + .readTimeout(1, TimeUnit.MINUTES) // + .retryOnConnectionFailure(false) // + .writeTimeout(1, TimeUnit.MINUTES) + .connectionPool(new ConnectionPool(sdkProperty.getHttpMaxConnect(), sdkProperty.getHttpKeepAlice(), TimeUnit.MINUTES)) // + .build(); + } + +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/config/HttpProperty.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/config/HttpProperty.java new file mode 100644 index 0000000..b2f20ba --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/config/HttpProperty.java @@ -0,0 +1,18 @@ +package com.chilunyc.fumao.common.util.http.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * + */ +@Data +@ConfigurationProperties(prefix = "api") +public class HttpProperty { + + /** + * http 配置 + */ + private int httpMaxConnect = 10; + private long httpKeepAlice = 1; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/HttpClient.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/HttpClient.java new file mode 100644 index 0000000..c88fe4e --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/HttpClient.java @@ -0,0 +1,36 @@ +package com.chilunyc.fumao.common.util.http.service; + +import com.chilunyc.fumao.common.util.http.service.result.ResultExecute; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.StopWatch; + +/** + * 80347471@qq.com + */ +@Component +public class HttpClient { + + @Autowired + private OkHttpClient client; + + public T execute(HttpParams params, ResultExecute resultExecute) { + Request request = params.toRequest(); + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + double consumeTime = 0; + try { + Response response = client.newCall(request).execute(); + stopWatch.stop(); + consumeTime = stopWatch.getTotalTimeSeconds(); + return (T) resultExecute.toBody(response, request, stopWatch); + } catch (HttpException e) { + throw e; + } catch (Exception e) { + throw HttpException.make(e, request, stopWatch); + } + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/HttpException.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/HttpException.java new file mode 100644 index 0000000..ddc2a52 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/HttpException.java @@ -0,0 +1,51 @@ +package com.chilunyc.fumao.common.util.http.service; + +import lombok.AllArgsConstructor; +import lombok.Data; +import okhttp3.Request; +import org.springframework.util.StopWatch; + +/** + * 80347471@qq.com + */ +@Data +@AllArgsConstructor +public class HttpException extends RuntimeException { + + private Request request; + + private StopWatch stopWatch; + + public HttpException() { + } + + public HttpException(String message) { + super(message); + } + + public HttpException(String message, Throwable cause) { + super(message, cause); + } + + public HttpException(Throwable cause) { + super(cause); + } + + public HttpException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + + public static HttpException make(String msg, Request req, StopWatch s){ + HttpException exception = new HttpException(msg); + exception.setRequest(req); + exception.setStopWatch(s); + return exception; + } + + public static HttpException make(Exception e, Request req, StopWatch s){ + HttpException exception = new HttpException(e); + exception.setRequest(req); + exception.setStopWatch(s); + return exception; + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/HttpMulitiParam.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/HttpMulitiParam.java new file mode 100644 index 0000000..167b304 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/HttpMulitiParam.java @@ -0,0 +1,25 @@ +package com.chilunyc.fumao.common.util.http.service; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import okhttp3.MediaType; + +import java.io.InputStream; + +/** + * 80347471@qq.com + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class HttpMulitiParam { + + private String fileName; + + private InputStream inputStream; + + private MediaType mediaType; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/HttpParams.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/HttpParams.java new file mode 100644 index 0000000..55d8d18 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/HttpParams.java @@ -0,0 +1,255 @@ +package com.chilunyc.fumao.common.util.http.service; + + +import com.alibaba.fastjson.JSON; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import okhttp3.*; +import okio.BufferedSink; +import okio.Okio; +import okio.Source; +import org.apache.commons.lang3.StringUtils; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; +import java.util.TreeMap; + +/** + * 80347471@qq.com + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class HttpParams { + + public static final MediaType MEDIA_TYPE_JSON = MediaType.parse("application/json; charset=utf-8"); + public static final MediaType MEDIA_TYPE_FILE = MediaType.parse("application/oct-stream"); + + private String method; + + private String url; + + private Map params; + + private boolean json; + + private boolean file; + + private String userAgent; + + private Map heads; + + public HttpParams put(String name, Object value) { + if (params == null) { + params = new TreeMap<>(); + } + params.put(name, value); + return this; + } + + public Request toRequest() { + Request.Builder request; + switch (method.toUpperCase()) { + case "GET": + request = this.toGet(); + break; + case "POST": + request = this.toPost(); + break; + default: + throw new RuntimeException("not support => " + method); + } + if (StringUtils.isNotBlank(userAgent)) { + request.addHeader("User-Agent", userAgent); + } + if (heads != null) { + heads.forEach((k, v) -> { + request.addHeader(k, v); + }); + } + return request.build(); + } + + + private Request.Builder toGet() { + HttpUrl.Builder builder = HttpUrl.parse(url).newBuilder(); + if (params != null) { + params.forEach((k, v) -> { + if (v == null) { + return; + } + builder.addEncodedQueryParameter(k, v.toString()); + }); + } + return new Request.Builder().url(builder.build()); + } + + private Request.Builder toPost() { + // json提交 + if (json) { + String jsonString = JSON.toJSONString(params); + RequestBody body = RequestBody.create(MEDIA_TYPE_JSON, jsonString); + return new Request.Builder().url(url).post(body); + } + // 上传文件 + else if (file) { + MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM); + params.forEach((k, v) -> { + if (v == null) { + return; + } + if (v instanceof File) { + File f = (File) v; + builder.addFormDataPart( + k, f.getName(), RequestBody.create(MEDIA_TYPE_FILE, f) + ); + } else if (v instanceof InputStream) { + builder.addFormDataPart( + k, k, create(MEDIA_TYPE_FILE, (InputStream) v) + ); + } else if (v instanceof HttpMulitiParam) { + HttpMulitiParam p = (HttpMulitiParam) v; + builder.addFormDataPart( + k, p.getFileName(), create(p.getMediaType(), p.getInputStream()) + ); + } + // + else { + builder.addFormDataPart(k, v.toString()); + } + }); + return new Request.Builder().url(url).post(builder.build()); + } + // 上传 + else { + FormBody.Builder builder = new FormBody.Builder(); + if (params != null) { + params.forEach((k, v) -> { + if (v == null) { + return; + } + builder.addEncoded(k, v.toString()); + }); + } + return new Request.Builder().url(url).post(builder.build()); + } + } + + /** + * @param mediaType + * @param inputStream + * @return + */ + public static RequestBody create(final MediaType mediaType, final InputStream inputStream) { + return new RequestBody() { + @Override + public MediaType contentType() { + return mediaType; + } + + @Override + public long contentLength() { + try { + return inputStream.available(); + } catch (IOException e) { + return 0; + } + } + + @Override + public void writeTo(BufferedSink sink) throws IOException { + Source source = null; + try { + source = Okio.source(inputStream); + sink.writeAll(source); + } finally { + } + } + }; + } + + /** + * @param url + * @return + */ + public static HttpParams get(String url) { + return HttpParams + .builder() + .url(url) + .method("GET") + .params(new TreeMap<>()) + .build(); + } + + /** + * @param url + * @return + */ + public static HttpParams get(String url, Map params) { + return HttpParams + .builder() + .url(url) + .params(params) + .method("GET") + .build(); + } + + /** + * @param url + * @return + */ + public static HttpParams post(String url, Map params) { + return HttpParams + .builder() + .url(url) + .params(params) + .method("POST") + .build(); + } + + /** + * @param url + * @return + */ + public static HttpParams postFile(String url, Map params) { + return HttpParams + .builder() + .url(url) + .params(params) + .method("POST") + .file(true) + .build(); + } + + /** + * @param url + * @return + */ + public static HttpParams postJson(String url, Map params) { + return HttpParams + .builder() + .url(url) + .params(params) + .method("POST") + .json(true) + .build(); + } + + + public HttpParams putHead(String k, String v) { + if (heads == null){ + heads = new TreeMap<>(); + } + heads.put(k, v); + return this; + } + + +} + + diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/UrlBuilder.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/UrlBuilder.java new file mode 100644 index 0000000..5188d6c --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/UrlBuilder.java @@ -0,0 +1,40 @@ +package com.chilunyc.fumao.common.util.http.service; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.Map; + +/** + * 80347471@qq.com + */ +@Data +@AllArgsConstructor +public class UrlBuilder { + + private String url; + + private Map map; + + public String toString() { + StringBuilder sb = new StringBuilder(200); + sb.append(url); + if (!url.contains("?")) { + sb.append("?"); + } + map.forEach((k, v) -> { + try { + sb + .append(k) + .append("=") + .append(URLEncoder.encode(v.toString(), "utf-8")) + .append("&"); + } catch (UnsupportedEncodingException e) { + } + }); + sb.trimToSize(); + return sb.subSequence(0, sb.length() - 1).toString(); + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/result/ByteResultExecute.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/result/ByteResultExecute.java new file mode 100644 index 0000000..6570a9e --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/result/ByteResultExecute.java @@ -0,0 +1,25 @@ +package com.chilunyc.fumao.common.util.http.service.result; + +import com.chilunyc.fumao.common.util.http.service.HttpException; +import okhttp3.Request; +import okhttp3.Response; +import org.springframework.util.StopWatch; + +import java.io.IOException; + +/** + * 80347471@qq.com + */ +public class ByteResultExecute implements ResultExecute { + + + @Override + public byte[] toBody(Response response, Request request, StopWatch stopWatch) throws IOException { + switch (response.code()) { + case 200: + return response.body().bytes(); + default: + throw HttpException.make(response.code() + " ==> " + response.body().string(), request, stopWatch); + } + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/result/JsonArrayResultExecute.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/result/JsonArrayResultExecute.java new file mode 100644 index 0000000..5bb0727 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/result/JsonArrayResultExecute.java @@ -0,0 +1,28 @@ +package com.chilunyc.fumao.common.util.http.service.result; + +import com.alibaba.fastjson.JSON; +import lombok.Builder; +import lombok.Data; +import okhttp3.Request; +import okhttp3.Response; +import org.springframework.util.StopWatch; + +import java.io.IOException; +import java.util.List; + +/** + * 80347471@qq.com + */ +@Data +@Builder +public class JsonArrayResultExecute { + + private final StringResultExecute stringResultExecute = new StringResultExecute(); + + private Class clazz; + + public List toBody(Response response, Request request, StopWatch stopWatch) throws IOException { + String body = stringResultExecute.toBody(response, request, stopWatch); + return JSON.parseArray(body, (Class) clazz); + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/result/JsonObjectResultExecute.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/result/JsonObjectResultExecute.java new file mode 100644 index 0000000..331f4d8 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/result/JsonObjectResultExecute.java @@ -0,0 +1,27 @@ +package com.chilunyc.fumao.common.util.http.service.result; + +import com.alibaba.fastjson.JSON; +import lombok.Builder; +import lombok.Data; +import okhttp3.Request; +import okhttp3.Response; +import org.springframework.util.StopWatch; + +import java.io.IOException; + +/** + * 80347471@qq.com + */ +@Data +@Builder +public class JsonObjectResultExecute { + + private final StringResultExecute stringResultExecute = new StringResultExecute(); + + private Class clazz; + + public T toBody(Response response, Request request, StopWatch stopWatch) throws IOException { + String body = stringResultExecute.toBody(response, request, stopWatch); + return JSON.parseObject(body, (Class) clazz); + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/result/ResultExecute.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/result/ResultExecute.java new file mode 100644 index 0000000..b33ecdc --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/result/ResultExecute.java @@ -0,0 +1,16 @@ +package com.chilunyc.fumao.common.util.http.service.result; + + +import okhttp3.Request; +import okhttp3.Response; +import org.springframework.util.StopWatch; + +import java.io.IOException; + +/** + * 80347471@qq.com + */ +public interface ResultExecute { + + T toBody(Response response, Request request, StopWatch stopWatch) throws Exception; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/result/StringResultExecute.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/result/StringResultExecute.java new file mode 100644 index 0000000..cfad8f9 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/http/service/result/StringResultExecute.java @@ -0,0 +1,25 @@ +package com.chilunyc.fumao.common.util.http.service.result; + +import com.chilunyc.fumao.common.util.http.service.HttpException; +import okhttp3.Request; +import okhttp3.Response; +import org.springframework.util.StopWatch; + +import java.io.IOException; + +/** + * 80347471@qq.com + */ +public class StringResultExecute implements ResultExecute { + + + @Override + public String toBody(Response response, Request request, StopWatch stopWatch) throws IOException { + switch (response.code()){ + case 200: + return response.body().string(); + default: + throw HttpException.make(response.code() + " ==> " + response.body().string(), request, stopWatch); + } + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jpa/CustomIdentifierGenerator.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jpa/CustomIdentifierGenerator.java new file mode 100644 index 0000000..92c0f72 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jpa/CustomIdentifierGenerator.java @@ -0,0 +1,55 @@ +package com.chilunyc.fumao.common.util.jpa; + +import com.chilunyc.fumao.common.util.jpa.generator.SnowflaskGenerator; +import org.apache.commons.lang.time.DateFormatUtils; +import org.apache.commons.lang3.StringUtils; +import org.hibernate.HibernateException; +import org.hibernate.MappingException; +import org.hibernate.engine.spi.SessionImplementor; +import org.hibernate.id.Configurable; +import org.hibernate.id.IdentifierGenerator; +import org.hibernate.service.ServiceRegistry; +import org.hibernate.type.Type; + +import java.io.Serializable; +import java.util.Date; +import java.util.Properties; +import java.util.UUID; + +/** + * + */ +public class CustomIdentifierGenerator implements IdentifierGenerator, Configurable { + + private String type; + private Properties props; + private String entityName; + + private SnowflaskGenerator snowflaskGenerator = new SnowflaskGenerator(1L); + + @Override + public void configure(Type type, Properties params, ServiceRegistry serviceRegistry) throws MappingException { + this.type = params.get("type").toString().toLowerCase(); + this.props = params; + entityName = params.getProperty(ENTITY_NAME); + } + + @Override + public Serializable generate(SessionImplementor session, Object object) throws HibernateException { + Serializable id = session + .getEntityPersister(entityName, object) + .getIdentifier(object, session); + if (id != null && StringUtils.isNotBlank(id.toString())) { + return id; + } + switch (type) { + case "number": + return snowflaskGenerator.generate(); + case "datetime": + return DateFormatUtils.format(new Date(), "yyyyMMddHHmmss"); + default: + String uuid = UUID.randomUUID().toString().replaceAll("-", ""); + return uuid; + } + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jpa/coverter/AesConverter.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jpa/coverter/AesConverter.java new file mode 100644 index 0000000..6a8c36c --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jpa/coverter/AesConverter.java @@ -0,0 +1,45 @@ +package com.chilunyc.fumao.common.util.jpa.coverter; + +import com.chilunyc.fumao.common.config.ApplicationProperty; +import com.chilunyc.fumao.common.util.CryptoHelper; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; + +import javax.persistence.AttributeConverter; +import javax.persistence.Converter; + +/** + * 80347471@qq.com + */ +@Converter +public class AesConverter implements AttributeConverter, ApplicationContextAware { + + private static ApplicationProperty applicationProperty; + + public AesConverter() { + } + + @Override + public String convertToDatabaseColumn(String attribute) { + try { + return CryptoHelper.aesEncrypt(applicationProperty.getAesKey(), attribute); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public String convertToEntityAttribute(String dbData) { + try { + return CryptoHelper.aesDecrypt(applicationProperty.getAesKey(), dbData); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + applicationProperty = applicationContext.getBean(ApplicationProperty.class); + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jpa/coverter/JsonConverter.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jpa/coverter/JsonConverter.java new file mode 100644 index 0000000..b52a508 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jpa/coverter/JsonConverter.java @@ -0,0 +1,24 @@ +package com.chilunyc.fumao.common.util.jpa.coverter; + +import com.alibaba.fastjson.JSON; +import org.apache.commons.lang3.StringUtils; + +import javax.persistence.AttributeConverter; +import javax.persistence.Converter; + +/** + * 80347471@qq.com + */ +@Converter +public class JsonConverter implements AttributeConverter { + + @Override + public String convertToDatabaseColumn(Object attribute) { + return JSON.toJSONString(attribute == null ? new Object() : attribute); + } + + @Override + public Object convertToEntityAttribute(String dbData) { + return StringUtils.isNotBlank(dbData) ? JSON.parse(dbData) : null; + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jpa/generator/SnowflaskGenerator.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jpa/generator/SnowflaskGenerator.java new file mode 100644 index 0000000..20f4b43 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jpa/generator/SnowflaskGenerator.java @@ -0,0 +1,130 @@ +package com.chilunyc.fumao.common.util.jpa.generator; + +import lombok.extern.log4j.Log4j; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; +import java.util.stream.IntStream; + +/** + * Long类型ID生成器,固定为19位长度 + * 生成ID,采用snowflake算法,64bit整数,1秒可以生成800万个ID + * 0-41bit毫秒时间戳-10bit机器ID-12bit序列化 + * 42bit的毫秒时间戳,2000年算起可以支持该算法使用到2068年,10bit的工作机器id可以支持1024台机器,12序列号支持1毫秒产生4096个自增序列id + */ +@Log4j +public class SnowflaskGenerator { + + private String startTimeString = "2010-01-01 00:00:00"; + + + /** + * 起始的时间戳, 2016-01-01 00:00:00 + */ + private long startStamp = getTimeStamp(startTimeString); + + /** + * 每一部分占用的位数 + */ + private long sequenceBit = 12; //序列号占用的位数 + private long machineBit = 2; //机器标识占用的位数, 不会超过100台机器 + + /** + * 每一部分的最大值 + */ + private long maxSequence = ~(-1L << sequenceBit); + + /** + * 每一部分向左的位移 + */ + private long machineLeft = sequenceBit; + private long timestampLeft = sequenceBit + machineBit; + + private long machineId; //机器标识,采用IP地址的后两段,16bit的工作机器id可以支持65536台机器 + private long sequence = 0L; //序列号,13序列号支持1毫秒产生8192个自增序列id + private long lastStamp = -1L;//上一次时间戳 + + public SnowflaskGenerator(Long machineId) { + this.machineId = machineId; + } + + + /** + * 生成ID,采用snowflake算法,64bit整数,1秒可以生成800万个ID + * 0-41bit毫秒时间戳-10bit机器ID-12bit序列化 + * 42bit的毫秒时间戳,2000年算起可以支持该算法使用到2068年,10bit的工作机器id可以支持1024台机器,12序列号支持1毫秒产生4096个自增序列id + * + * @return 返回Long ID + */ + public synchronized Long generate() { + long curStamp = getCurrentStamp(); + if (curStamp < lastStamp) { + throw new IllegalArgumentException("Clock moved backwards. Refusing to generate id"); + } + + if (curStamp == lastStamp) { + //相同毫秒内,序列号自增 + sequence = (sequence + 1) & maxSequence; + //同一毫秒的序列数已经达到最大 + if (sequence == 0L) { + curStamp = getNextMill(); + } + } else { + //不同毫秒内,序列号置为0 + sequence = 0L; + } + + lastStamp = curStamp; + return (curStamp - startStamp) << timestampLeft //时间戳部分 + | machineId << machineLeft //机器标识部分 + | sequence; //序列号部分 + } + + /** + * 获取下一毫秒 + * + * @return 下一毫秒 + */ + private long getNextMill() { + long mill = getCurrentStamp(); + while (mill <= lastStamp) { + mill = getCurrentStamp(); + } + return mill; + } + + /** + * 获取当前时间戳, 改为秒 + * + * @return 时间戳 + */ + private long getCurrentStamp() { + return System.currentTimeMillis(); + } + + /** + * 获取起始时间戳,因为要兼容java7,使用Date对象 + * + * @param dateStr 时间字符串,格式由startTimeFormatter指定 + * @return 时间戳 + */ + private long getTimeStamp(String dateStr) { + try { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + formatter.setTimeZone(TimeZone.getTimeZone("GMT+0800")); + Date startDate = formatter.parse(dateStr); + return startDate.getTime(); + } catch (Exception e) { + log.error(e.getMessage(), e); + return 1262275200000L; + } + } + + public static void main(String[] args) { + SnowflaskGenerator snowflaskGenerator = new SnowflaskGenerator(1l); + IntStream.range(0, 100).forEach(i -> { + System.out.println(snowflaskGenerator.generate()); + }); + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jpa/query/QueryBuilder.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jpa/query/QueryBuilder.java new file mode 100644 index 0000000..63e1bb2 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jpa/query/QueryBuilder.java @@ -0,0 +1,157 @@ +package com.chilunyc.fumao.common.util.jpa.query; + +import lombok.AllArgsConstructor; +import lombok.Data; +import org.apache.commons.lang.StringUtils; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.util.ReflectionUtils; + +import javax.persistence.criteria.Predicate; +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Created by Tkk on 2018/7/21. + */ +public class QueryBuilder { + + @Data + @AllArgsConstructor + private static class QueryDesc { + Field field; + QueryItem queryItem; + } + + /** + * 查询缓存 + */ + private static Map> classQueryDescMap = new ConcurrentHashMap<>(); + + + /** + * @param object + * @param + * @return + */ + public static Specification build(Object object) { + + + /** + * + */ + return (root, criteriaQuery, cb) -> { + Class clazz = object.getClass(); + List descMap = getQueryDescMap(clazz); + List predicates = new ArrayList<>(descMap.size()); + descMap.forEach(desc -> { + Object value = getValue(desc.field, object); + + // 为null不加入查询 + if (value == null && !desc.queryItem.nullable()) { + return; + } + + // 字符串为""不加入查询 + if (value != null && value instanceof String && !desc.queryItem.blankable() && StringUtils.isBlank(value.toString())) { + return; + } + + // + String path = desc.queryItem.column(); + if (StringUtils.isBlank(path)) { + path = desc.field.getName(); + } + + // + switch (desc.queryItem.type()) { + case equal: + predicates.add(cb.equal(root.get(path), value)); + break; + case like: + predicates.add(cb.like(root.get(path), "%" + value + "%")); + break; + case gt: + predicates.add(cb.gt(root.get(path), (Number) value)); + break; + case lt: + predicates.add(cb.lt(root.get(path), (Number) value)); + break; + case ge: + predicates.add(cb.ge(root.get(path), (Number) value)); + break; + case le: + predicates.add(cb.le(root.get(path), (Number) value)); + break; + case notEqual: + predicates.add(cb.notEqual(root.get(path), value)); + break; + case notLike: + predicates.add(cb.notLike(root.get(path), "%" + value + "%")); + break; + case rightLike: + predicates.add(cb.like(root.get(path), value + "%")); + break; + } + }); + + SortItems sortItems = (SortItems) clazz.getAnnotation(SortItems.class); + if (sortItems != null && sortItems.value() != null) { + for (SortItem sortItem : sortItems.value()) { + if (sortItem.desc()) { + criteriaQuery.orderBy(cb.desc(root.get(sortItem.column()))); + } else { + criteriaQuery.orderBy(cb.asc(root.get(sortItem.column()))); + } + } + } + return cb.and(predicates.toArray(new Predicate[predicates.size()])); + }; + } + + private static Object getValue(Field field, Object src) { + try { + return field.get(src); + } catch (IllegalAccessException e) { + return null; + } + } + + private static List getQueryDescMap(Class clazz) { + List queryDescs = classQueryDescMap.get(clazz); + if (queryDescs != null) { + return queryDescs; + } + synchronized (clazz.getName()) { + queryDescs = classQueryDescMap.get(clazz); + if (queryDescs != null) { + return queryDescs; + } + + // 组装 + List real = new ArrayList<>(); + ReflectionUtils.doWithFields(clazz, (field) -> { + QueryDesc queryDec = getQueryDec(field); + if (queryDec == null) { + return; + } + field.setAccessible(true); + real.add(queryDec); + }); + + // + return real; + } + } + + private static QueryDesc getQueryDec(Field field) { + QueryItem annotation = field.getAnnotation(QueryItem.class); + if (annotation == null) { + return null; + } + return new QueryDesc(field, annotation); + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jpa/query/QueryItem.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jpa/query/QueryItem.java new file mode 100644 index 0000000..51f9276 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jpa/query/QueryItem.java @@ -0,0 +1,42 @@ +package com.chilunyc.fumao.common.util.jpa.query; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Created by Tkk on 2018/7/21. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface QueryItem { + + /** + * 数据库字段 + * + * @return + */ + String column() default ""; + + + /** + * @return + */ + QueryType type() default QueryType.equal; + + + /** + * object是否可以为null + * + * @return + */ + boolean nullable() default false; + + /** + * 字符串是否可为空 + * + * @return + */ + boolean blankable() default false; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jpa/query/QueryType.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jpa/query/QueryType.java new file mode 100644 index 0000000..4aa979a --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jpa/query/QueryType.java @@ -0,0 +1,40 @@ +package com.chilunyc.fumao.common.util.jpa.query; + +/** + * Created by Tkk on 2018/7/21. + */ +public enum QueryType { + + // 等于 + equal, + + // 大于 + gt, + + // 大于等于 + ge, + + // 小于 + lt, + + // 小于等于 + le, + + // 不等于, 少用。。负向查询性能底下 + notEqual, + + // + like, + + // 右% + rightLike, + + // + notLike, + + // + bwtween, + + + ; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jpa/query/SortItem.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jpa/query/SortItem.java new file mode 100644 index 0000000..2436303 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jpa/query/SortItem.java @@ -0,0 +1,27 @@ +package com.chilunyc.fumao.common.util.jpa.query; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Created by Tkk on 2018/7/21. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface SortItem { + + /** + * 数据库字段 + * + * @return + */ + String column() default ""; + + + /** + * @return + */ + boolean desc() default true; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jpa/query/SortItems.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jpa/query/SortItems.java new file mode 100644 index 0000000..7ca9e2b --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jpa/query/SortItems.java @@ -0,0 +1,16 @@ +package com.chilunyc.fumao.common.util.jpa.query; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Created by Tkk on 2018/7/21. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface SortItems { + + SortItem[] value(); +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jwt/JwtUtils.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jwt/JwtUtils.java new file mode 100644 index 0000000..d40c968 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jwt/JwtUtils.java @@ -0,0 +1,85 @@ +package com.chilunyc.fumao.common.util.jwt; + +import com.chilunyc.fumao.common.context.LoginUser; +import com.chilunyc.fumao.common.exception.SystemException; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.JwtBuilder; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; + +/** + * + */ +@Component +public class JwtUtils implements ApplicationContextAware { + + private static SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS512; + + private static StringRedisTemplate redisTemplate; + + public enum T { + System(DigestUtils.md5Hex("System")), + Company(DigestUtils.md5Hex("Company")), + Market(DigestUtils.md5Hex("Market")), + APP_C(DigestUtils.md5Hex("APP_C")), + APP_B(DigestUtils.md5Hex("APP_B")),; + private String key; + + T(String key) { + this.key = key; + } + } + + /** + * @param jwtToken + * @return + */ + public static Claims decode(JwtUtils.T t, String jwtToken) { + try { + if (StringUtils.isBlank(jwtToken)) { + throw new RuntimeException(); + } +// String body = jwtToken.split("\\.")[1]; +// String s = jodd.util.Base64.decodeToString(body); +// Map m = JSON.parseObject(s); +// String key = redisTemplate.boundValueOps(t.name() + m.get("sub")).get(); + Claims claims = Jwts.parser().setSigningKey(t.key).parseClaimsJws(jwtToken).getBody(); + return claims; + } catch (Exception e) { + throw new SystemException("000002"); + } + } + + /** + * @param user + * @return + */ + public static String encode(JwtUtils.T t, LoginUser user) { +// String id = user.getId().toString(); +// String key = RandomStringUtils.randomAlphabetic(16); +// redisTemplate.boundValueOps(t.name() + id).set(key, 24, TimeUnit.HOURS); + JwtBuilder builder = Jwts.builder(); + user.toJwt(builder); + String jwtBuilder = builder.signWith(signatureAlgorithm, t.key) + .claim("role", user.toRoles()) + .compact(); + return jwtBuilder; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + redisTemplate = applicationContext.getBean(StringRedisTemplate.class); + } + + public static void remove(LoginUser manager) { + String id = manager.getId().toString(); + redisTemplate.delete(id); + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jwt/JwtValue.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jwt/JwtValue.java new file mode 100644 index 0000000..330f8f8 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/jwt/JwtValue.java @@ -0,0 +1,24 @@ +package com.chilunyc.fumao.common.util.jwt; + +import io.jsonwebtoken.Claims; + +/** + * + */ +public interface JwtValue { + + /** + * 从JWT内容转换 + * + * @param claims + * @return + */ + T fromJwt(Claims claims); + + /** + * 转换JWT的内容 + * + * @return + */ + String toJwt(); +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/security/SaltHelper.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/security/SaltHelper.java new file mode 100644 index 0000000..9b04daa --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/security/SaltHelper.java @@ -0,0 +1,40 @@ +package com.chilunyc.fumao.common.util.security; + + +import org.apache.commons.codec.digest.DigestUtils; + +import java.util.UUID; + +/** + * + */ +public class SaltHelper { + + /** + * 比较相等 + * + * @param src + * @param give + * @param salt + * @return + */ + public static boolean isEquals(String src, String give, String salt) { + return src.equals(exec(give, salt)); + } + + /** + * @param give + * @param salt + * @return + */ + public static String exec(String give, String salt) { + return DigestUtils.md5Hex(give + DigestUtils.md5Hex(salt)); + } + + /** + * @return + */ + public static String salt() { + return DigestUtils.md5Hex(UUID.randomUUID().toString()); + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/valid/Captcha.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/valid/Captcha.java new file mode 100644 index 0000000..d28af2c --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/valid/Captcha.java @@ -0,0 +1,22 @@ +package com.chilunyc.fumao.common.util.valid; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * + */ +@Target({ElementType.METHOD, ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Constraint(validatedBy = CaptchaValidator.class) +public @interface Captcha { + String message() default "图形验证码错误"; + + Class[] groups() default {}; + + Class[] payload() default {}; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/valid/CaptchaValidator.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/valid/CaptchaValidator.java new file mode 100644 index 0000000..aaee4d4 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/valid/CaptchaValidator.java @@ -0,0 +1,27 @@ +package com.chilunyc.fumao.common.util.valid; + +import com.chilunyc.fumao.common.context.RequestHolder; +import com.google.code.kaptcha.Constants; +import org.apache.commons.lang.StringUtils; + +import javax.servlet.http.HttpSession; +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +/** + * + */ +public class CaptchaValidator implements ConstraintValidator { + + @Override + public void initialize(Captcha captcha) { + } + + @Override + public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { + HttpSession session = RequestHolder.get().getSession(); + String key = (String) session.getAttribute(Constants.KAPTCHA_SESSION_KEY); +// session.removeAttribute(Constants.KAPTCHA_SESSION_KEY); + return StringUtils.equalsIgnoreCase(key, s); + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/valid/Geo.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/valid/Geo.java new file mode 100644 index 0000000..af4eec7 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/valid/Geo.java @@ -0,0 +1,22 @@ +package com.chilunyc.fumao.common.util.valid; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * + */ +@Target({ElementType.METHOD, ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Constraint(validatedBy = GeoValidator.class) +public @interface Geo { + String message() default "经度或者纬度错误"; + + Class[] groups() default {}; + + Class[] payload() default {}; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/util/valid/GeoValidator.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/valid/GeoValidator.java new file mode 100644 index 0000000..d6748cb --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/util/valid/GeoValidator.java @@ -0,0 +1,25 @@ +package com.chilunyc.fumao.common.util.valid; + +import org.apache.commons.lang3.StringUtils; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +/** + * + */ +public class GeoValidator implements ConstraintValidator { + + + @Override + public void initialize(Geo geo) { + } + + @Override + public boolean isValid(Double aDouble, ConstraintValidatorContext constraintValidatorContext) { + if (aDouble == null) { + return false; + } + return StringUtils.contains(aDouble.toString(), "."); + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/weixin/config/WechatConfiguration.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/weixin/config/WechatConfiguration.java new file mode 100644 index 0000000..a513b5b --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/weixin/config/WechatConfiguration.java @@ -0,0 +1,47 @@ +package com.chilunyc.fumao.common.weixin.config; + +import me.chanjar.weixin.mp.api.WxMpConfigStorage; +import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage; +import me.chanjar.weixin.mp.api.WxMpService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * + */ +@Configuration +@ConditionalOnProperty(name = "wechat.mp.app-id") +@EnableConfigurationProperties({ + WechatMpProperties.class, +}) +public class WechatConfiguration { + + @Autowired + private WechatMpProperties properties; + + /** + * 服务号 + * + * @return + */ + @Bean + public WxMpConfigStorage configStorage() { + WxMpInMemoryConfigStorage configStorage = new WxMpInMemoryConfigStorage(); + configStorage.setAppId(this.properties.getAppId()); + configStorage.setSecret(this.properties.getSecret()); + configStorage.setToken(this.properties.getToken()); + configStorage.setAesKey(this.properties.getAesKey()); + return configStorage; + } + + @Bean + public WxMpService wxMpService(WxMpConfigStorage configStorage) { + WxMpService wxMpService = new me.chanjar.weixin.mp.api.impl.WxMpServiceImpl(); + wxMpService.setWxMpConfigStorage(configStorage); + return wxMpService; + } + +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/weixin/config/WechatMaConfiguration.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/weixin/config/WechatMaConfiguration.java new file mode 100644 index 0000000..f3d59fb --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/weixin/config/WechatMaConfiguration.java @@ -0,0 +1,40 @@ +package com.chilunyc.fumao.common.weixin.config; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; +import cn.binarywang.wx.miniapp.config.WxMaConfig; +import cn.binarywang.wx.miniapp.config.WxMaInMemoryConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 80347471@qq.com + */ +@Configuration +@ConditionalOnProperty(name = "wechat.ma.app-id") +@EnableConfigurationProperties({ + WechatMaProperties.class, +}) +public class WechatMaConfiguration { + + @Autowired + private WechatMaProperties wechatMaProperties; + + @Bean + public WxMaConfig maConfig() { + WxMaInMemoryConfig config = new WxMaInMemoryConfig(); + config.setAppid(this.wechatMaProperties.getAppId()); + config.setSecret(this.wechatMaProperties.getSecret()); + return config; + } + + @Bean + public WxMaService wxMaService(WxMaConfig maConfig) { + WxMaService service = new WxMaServiceImpl(); + service.setWxMaConfig(maConfig); + return service; + } +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/weixin/config/WechatMaProperties.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/weixin/config/WechatMaProperties.java new file mode 100644 index 0000000..ddca25c --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/weixin/config/WechatMaProperties.java @@ -0,0 +1,23 @@ +package com.chilunyc.fumao.common.weixin.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * + */ +@Data +@ConfigurationProperties(prefix = "wechat.ma") +public class WechatMaProperties { + /** + * 设置微信公众号的appid + */ + private String appId; + + /** + * 设置微信公众号的app secret + */ + private String secret; + + +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/weixin/config/WechatMpProperties.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/weixin/config/WechatMpProperties.java new file mode 100644 index 0000000..5f48036 --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/weixin/config/WechatMpProperties.java @@ -0,0 +1,46 @@ +package com.chilunyc.fumao.common.weixin.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * + */ +@Data +@ConfigurationProperties(prefix = "wechat.mp") +public class WechatMpProperties { + /** + * 设置微信公众号的appid + */ + private String appId; + + /** + * 设置微信公众号的app secret + */ + private String secret; + + /** + * 设置微信公众号的token + */ + private String token; + + /** + * 设置微信公众号的EncodingAESKey + */ + private String aesKey; + + /** + * 微信支付商户号 + */ + private String mchId; + + /** + * 微信支付商户密钥 + */ + private String mchKey; + + /** + * apiclient_cert.p12的文件的绝对路径 + */ + private String keyPath; +} diff --git a/fumao-common/src/main/java/com/chilunyc/fumao/common/weixin/request/WxMaUserInfoRequest.java b/fumao-common/src/main/java/com/chilunyc/fumao/common/weixin/request/WxMaUserInfoRequest.java new file mode 100644 index 0000000..29f987c --- /dev/null +++ b/fumao-common/src/main/java/com/chilunyc/fumao/common/weixin/request/WxMaUserInfoRequest.java @@ -0,0 +1,20 @@ +package com.chilunyc.fumao.common.weixin.request; + +import lombok.Data; + +/** + * 80347471@qq.com + */ +@Data +public class WxMaUserInfoRequest { + + private String openId; + + private String signature; + + private String rawData; + + private String encryptedData; + + private String iv; +} diff --git a/fumao-common/src/main/lib/aliyun-java-sdk-core-3.2.2.jar b/fumao-common/src/main/lib/aliyun-java-sdk-core-3.2.2.jar new file mode 100644 index 0000000..d0f2e8d Binary files /dev/null and b/fumao-common/src/main/lib/aliyun-java-sdk-core-3.2.2.jar differ diff --git a/fumao-common/src/main/lib/aliyun-java-sdk-dysmsapi-1.0.0-SANPSHOT.jar b/fumao-common/src/main/lib/aliyun-java-sdk-dysmsapi-1.0.0-SANPSHOT.jar new file mode 100644 index 0000000..de67807 Binary files /dev/null and b/fumao-common/src/main/lib/aliyun-java-sdk-dysmsapi-1.0.0-SANPSHOT.jar differ diff --git a/fumao-common/src/main/resources/com/chilunyc/fumao/common/log/repository/LogMapper.xml b/fumao-common/src/main/resources/com/chilunyc/fumao/common/log/repository/LogMapper.xml new file mode 100644 index 0000000..8fa314b --- /dev/null +++ b/fumao-common/src/main/resources/com/chilunyc/fumao/common/log/repository/LogMapper.xml @@ -0,0 +1,36 @@ + + + + + + \ No newline at end of file diff --git a/fumao-company/pom.xml b/fumao-company/pom.xml new file mode 100644 index 0000000..515fa5d --- /dev/null +++ b/fumao-company/pom.xml @@ -0,0 +1,22 @@ + + + + fumao + com.aki + 0.0.1-SNAPSHOT + + 4.0.0 + + fumao-company + + + + + com.aki + fumao-common + 0.0.1-SNAPSHOT + + + \ No newline at end of file diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/model/Company.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/model/Company.java new file mode 100644 index 0000000..36e76b9 --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/model/Company.java @@ -0,0 +1,105 @@ +package com.chilunyc.fumao.company.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.*; +import org.hibernate.annotations.Parameter; +import org.hibernate.validator.constraints.*; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import javax.validation.constraints.*; + +import javax.persistence.*; +import javax.persistence.Entity; +import javax.persistence.Index; +import javax.persistence.Table; +import java.io.Serializable; +import java.lang.Long; +import java.lang.String; +import java.lang.String; +import java.lang.String; +import java.lang.String; +import java.lang.String; +import java.lang.String; +import java.lang.String; +import java.util.Date; + +/** +* +*/ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Entity +@Table(name = "fumao_company", indexes = { +}) +@EntityListeners(AuditingEntityListener.class) +public class Company implements Serializable { + + /** + * 编号 + */ + @Id + @Column(columnDefinition = "bigint(64)") + @GeneratedValue(generator = "custom") + @GenericGenerator(name = "custom", strategy = "com.chilunyc.fumao.common.util.jpa.CustomIdentifierGenerator", parameters = {@Parameter(name = "type", value = "Number")}) + private Long id; + + /** + * 名称 + */ + @Column(columnDefinition = "varchar(64) comment '名称'") + private String name; + + /** + * 省份 + */ + @Column(columnDefinition = "varchar(10) comment '省份'") + private String province; + + /** + * 城市 + */ + @Column(columnDefinition = "varchar(10) comment '城市'") + private String city; + + /** + * 区域 + */ + @Column(columnDefinition = "varchar(10) comment '区域'") + private String area; + + /** + * POI + */ + @Column(columnDefinition = "varchar(64) comment 'POI'") + private String poi; + + /** + * 经度 + */ + @Column(columnDefinition = "varchar(12) comment '经度'") + private String lat; + + /** + * 纬度 + */ + @Column(columnDefinition = "varchar(12) comment '纬度'") + private String lng; + + /** + * 地址 + */ + @Column(columnDefinition = "varchar(64) comment '地址'") + private String address; + + /** + * 创建时间 + */ + @CreatedDate + private Date createTime; +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/model/CompanyAdmin.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/model/CompanyAdmin.java new file mode 100644 index 0000000..b5a0c11 --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/model/CompanyAdmin.java @@ -0,0 +1,119 @@ +package com.chilunyc.fumao.company.model; + +import com.chilunyc.fumao.common.context.LoginUser; +import com.chilunyc.fumao.common.shiro.AuthRoles; +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.JwtBuilder; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.*; +import org.hibernate.annotations.Parameter; + +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import javax.persistence.*; +import javax.persistence.Entity; +import javax.persistence.ForeignKey; +import javax.persistence.Index; +import javax.persistence.Table; +import java.io.Serializable; +import java.util.Date; +import java.lang.Long; +import java.lang.String; + +/** + * + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Entity +@Table(name = "fumao_company_admin", indexes = { + @Index(name = "company_admin_mobile", columnList = "mobile"), +}) +@EntityListeners(AuditingEntityListener.class) +public class CompanyAdmin implements Serializable, LoginUser { + + /** + * 编号 + */ + @Id + @Column(columnDefinition = "bigint(64)") + @GeneratedValue(generator = "custom") + @GenericGenerator(name = "custom", strategy = "com.chilunyc.fumao.common.util.jpa.CustomIdentifierGenerator", parameters = {@Parameter(name = "type", value = "Number")}) + private Long id; + + /** + * 名称 + */ + @Column(columnDefinition = "varchar(64) comment '名称'") + private String name; + + /** + * 密码 + */ + @JsonIgnore + @Column(columnDefinition = "varchar(32) comment '密码'") + private String password; + + /** + * 密码 + */ + @Column(columnDefinition = "varchar(32) comment '初始密码'") + private String originPassword; + + /** + * 盐值 + */ + @JsonIgnore + @Column(columnDefinition = "varchar(32) comment '盐值'") + private String salt; + + /** + * 手机号 + */ + @Column(columnDefinition = "varchar(20) comment '手机号'") + private String mobile; + + /** + * 集团 + */ + @Column(columnDefinition = "varchar(64) comment '集团'") + private Long companyId; + + + /** + * 创建时间 + */ + @CreatedDate + @Column(columnDefinition = "datetime comment '创建时间'") + private Date createTime; + + @Fetch(FetchMode.JOIN) + @ManyToOne() + @JoinColumn(name = "companyId", referencedColumnName = "id", insertable = false, updatable = false, foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT)) + @NotFound(action = NotFoundAction.IGNORE) + private Company company; + + @Override + public String[] toRoles() { + return new String[]{AuthRoles.CompanyAdmin}; + } + + @Override + public void fromJwt(Claims claims) { + this.id = Long.parseLong(claims.getSubject()); + this.companyId = claims.get("cid", Long.class); + } + + @Override + public void toJwt(JwtBuilder claims) { + claims.setSubject(id.toString()); + claims.claim("cid", companyId); + } +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/model/Place.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/model/Place.java new file mode 100644 index 0000000..cb41521 --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/model/Place.java @@ -0,0 +1,157 @@ +package com.chilunyc.fumao.company.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.*; +import org.hibernate.annotations.Parameter; +import org.hibernate.validator.constraints.*; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import javax.persistence.ForeignKey; +import javax.validation.constraints.*; + +import javax.persistence.*; +import javax.persistence.Entity; +import javax.persistence.Index; +import javax.persistence.Table; +import java.io.Serializable; +import java.lang.Long; +import java.lang.String; +import java.lang.String; +import java.lang.String; +import java.lang.String; +import java.lang.String; +import java.lang.String; +import java.lang.String; +import java.lang.Long; +import java.lang.String; +import java.lang.String; +import java.lang.Double; +import java.lang.Double; +import java.lang.Double; +import java.util.Date; + +/** + * + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Entity +@Table(name = "fumao_place", indexes = { + @Index(name = "market_companyId", columnList = "companyId"), +}) +@EntityListeners(AuditingEntityListener.class) +public class Place implements Serializable { + + /** + * 编号 + */ + @Id + @Column(columnDefinition = "bigint(64)") + @GeneratedValue(generator = "custom") + @GenericGenerator(name = "custom", strategy = "com.chilunyc.fumao.common.util.jpa.CustomIdentifierGenerator", parameters = {@Parameter(name = "type", value = "Number")}) + private Long id; + + /** + * 名称 + */ + @Column(columnDefinition = "varchar(64) comment '名称'") + private String name; + + /** + * 省份 + */ + @Column(columnDefinition = "varchar(10) comment '省份'") + private String province; + + /** + * 城市 + */ + @Column(columnDefinition = "varchar(10) comment '城市'") + private String city; + + /** + * 城市 + */ + @Column(columnDefinition = "varchar(10) comment '区域'") + private String area; + + /** + * POI + */ + @Column(columnDefinition = "varchar(64) comment 'POI'") + private String poi; + + /** + * 经度 + */ + @Column(columnDefinition = "varchar(12) comment '经度'") + private String lat; + + /** + * 纬度 + */ + @Column(columnDefinition = "varchar(12) comment '纬度'") + private String lng; + + /** + * 地址 + */ + @Column(columnDefinition = "varchar(64) comment '地址'") + private String address; + + /** + * 集团 + */ + @Column(columnDefinition = "varchar(64) comment '集团'") + private Long companyId; + + /** + * 迈外迪 + */ + @Column(columnDefinition = "varchar(128) comment '迈外迪'") + private String maiwaidiId; + + /** + * ETCP + */ + @Column(columnDefinition = "varchar(128) comment 'ETCP'") + private String etcpId; + + /** + * 总面积 + */ + @Column(columnDefinition = "decimal(9,2) comment '总面积'") + private Double totalArea; + + /** + * 营业面积 + */ + @Column(columnDefinition = "decimal(9,2) comment '营业面积'") + private Double sellingArea; + + /** + * 停车场面积 + */ + @Column(columnDefinition = "decimal(9,2) comment '停车场面积'") + private Double depotArea; + + /** + * 创建时间 + */ + @CreatedDate + @Column(columnDefinition = "datetime comment '创建时间'") + private Date createTime; + + + @ManyToOne() + @Fetch(FetchMode.JOIN) + @JoinColumn(name = "companyId", insertable = false, updatable = false, foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT)) + @NotFound(action=NotFoundAction.IGNORE) + private Company company; +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/model/PlaceAdmin.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/model/PlaceAdmin.java new file mode 100644 index 0000000..e23f770 --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/model/PlaceAdmin.java @@ -0,0 +1,163 @@ +package com.chilunyc.fumao.company.model; + +import com.chilunyc.fumao.common.context.LoginUser; +import com.chilunyc.fumao.common.shiro.AuthRoles; +import com.chilunyc.fumao.company.model.enums.PlaceAdminType; +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.JwtBuilder; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.*; +import org.hibernate.annotations.Parameter; + +import org.redisson.mapreduce.Collector; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import javax.persistence.*; +import javax.persistence.Entity; +import javax.persistence.ForeignKey; +import javax.persistence.Index; +import javax.persistence.Table; +import java.io.Serializable; +import java.util.Date; +import java.lang.Long; +import java.lang.String; +import java.util.List; +import java.util.stream.Collectors; + +/** + * + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Entity +@Table(name = "fumao_place_admin", indexes = { + @Index(name = "market_admin_mobile", columnList = "mobile"), + @Index(name = "market_admin_placeId", columnList = "placeId"), +}) +@EntityListeners(AuditingEntityListener.class) +public class PlaceAdmin implements Serializable, LoginUser { + + /** + * 编号 + */ + @Id + @Column(columnDefinition = "bigint(64)") + @GeneratedValue(generator = "custom") + @GenericGenerator(name = "custom", strategy = "com.chilunyc.fumao.common.util.jpa.CustomIdentifierGenerator", parameters = {@Parameter(name = "type", value = "Number")}) + private Long id; + + /** + * 名称 + */ + @Column(columnDefinition = "varchar(64) comment '名称'") + private String name; + + /** + * 密码 + */ + @JsonIgnore + @Column(columnDefinition = "varchar(32) comment '密码'") + private String password; + + /** + * 密码 + */ + @Column(columnDefinition = "varchar(32) comment '初始密码'") + private String originPassword; + + /** + * 盐值 + */ + @JsonIgnore + @Column(columnDefinition = "varchar(32) comment '盐值'") + private String salt; + + /** + * 手机号 + */ + @Column(columnDefinition = "varchar(20) comment '手机号'") + private String mobile; + + /** + * 集团 + */ + @Column(columnDefinition = "varchar(64) comment '集团'") + private Long companyId; + + /** + * 集团商场 + */ + @Column(columnDefinition = "varchar(64) comment '集团商场'") + private Long placeId; + + /** + * 类型 + */ + @Column(columnDefinition = "int(1) comment '类型'") + @Enumerated(EnumType.ORDINAL) + private PlaceAdminType type; + + /** + * 角色 + */ + @Column(columnDefinition = "varchar(64) comment '角色'") + private Long placeAdminRoleId; + + /** + * 创建时间 + */ + @CreatedDate + @Column(columnDefinition = "datetime comment '创建时间'") + private Date createTime; + + @Fetch(FetchMode.JOIN) + @ManyToOne() + @JoinColumn(name = "companyId", referencedColumnName = "id", insertable = false, updatable = false, foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT)) + @NotFound(action = NotFoundAction.IGNORE) + private Company company; + + @Fetch(FetchMode.JOIN) + @ManyToOne() + @JoinColumn(name = "placeId", referencedColumnName = "id", insertable = false, updatable = false, foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT)) + @NotFound(action = NotFoundAction.IGNORE) + private Place place; + + private List placeAdminPermission; + + @Override + public String[] toRoles() { + switch (type) { + // 业务员获取权限 + case Business: + return placeAdminPermission + .stream() + .map(PlaceAdminPermission::getName) + .collect(Collectors.toList()) + .toArray(new String[placeAdminPermission.size()]); + // 管理员所有权限 + default: + return new String[]{AuthRoles.MarketAdmin}; + } + } + + @Override + public void fromJwt(Claims claims) { + this.id = Long.parseLong(claims.getSubject()); + this.companyId = claims.get("cid", Long.class); + this.placeId = claims.get("pid", Long.class); + } + + @Override + public void toJwt(JwtBuilder claims) { + claims.setSubject(this.id.toString()); + claims.claim("cid", this.companyId); + claims.claim("pid", this.placeId); + } +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/model/PlaceAdminPermission.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/model/PlaceAdminPermission.java new file mode 100644 index 0000000..586ef8f --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/model/PlaceAdminPermission.java @@ -0,0 +1,53 @@ +package com.chilunyc.fumao.company.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.*; +import org.hibernate.annotations.Parameter; +import org.hibernate.validator.constraints.*; +import javax.validation.constraints.*; + +import javax.persistence.*; +import javax.persistence.Entity; +import javax.persistence.Index; +import javax.persistence.Table; +import java.io.Serializable; +import java.lang.Long; +import java.lang.String; +import java.util.Date; + +/** +* +*/ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Entity +@Table(name = "fumao_place_admin_permission", indexes = { +}) +public class PlaceAdminPermission implements Serializable { + + /** + * 编号 + */ + @Id + @Column(columnDefinition = "bigint(64)") + @GeneratedValue(generator = "custom") + @GenericGenerator(name = "custom", strategy = "com.chilunyc.fumao.common.util.jpa.CustomIdentifierGenerator", parameters = {@Parameter(name = "type", value = "Number")}) + private Long id; + + /** + * 名称 + */ + @Column(columnDefinition = "varchar(32) comment '名称'") + private String name; + + /** + * 创建时间 + */ + @Column(columnDefinition = "datetime comment '创建时间'") + private Date createTime; +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/model/PlaceFloor.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/model/PlaceFloor.java new file mode 100644 index 0000000..111cd1a --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/model/PlaceFloor.java @@ -0,0 +1,89 @@ +package com.chilunyc.fumao.company.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.*; +import org.hibernate.annotations.Parameter; +import org.hibernate.validator.constraints.*; + +import javax.validation.constraints.*; + +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import javax.persistence.*; +import javax.persistence.Entity; +import javax.persistence.Index; +import javax.persistence.Table; +import java.io.Serializable; +import java.util.Date; +import java.lang.Long; +import java.lang.Long; +import java.lang.Integer; +import java.lang.Double; +import java.lang.String; +import java.lang.String; +import java.util.Date; + +/** + * + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Entity +@Table(name = "fumao_place_floor", indexes = { +}) +@EntityListeners(AuditingEntityListener.class) +public class PlaceFloor implements Serializable { + + /** + * 编号 + */ + @Id + @Column(columnDefinition = "bigint(64)") + @GeneratedValue(generator = "custom") + @GenericGenerator(name = "custom", strategy = "com.chilunyc.fumao.common.util.jpa.CustomIdentifierGenerator", parameters = {@Parameter(name = "type", value = "Number")}) + private Long id; + + /** + * 商场 + */ + @Column(columnDefinition = "varchar(64) comment '商场'") + private Long placeId; + + /** + * 楼层 + */ + @Column(columnDefinition = "varchar(2) comment '楼层'") + private Integer floor; + + /** + * 面积 + */ + @Column(columnDefinition = "decimal(9,2) comment '面积'") + private Double area; + + /** + * 平面图 + */ + @Column(columnDefinition = "text comment '平面图'") + private String image; + + /** + * 几座 + */ + @Column(columnDefinition = "varchar(2) comment '几座'") + private String tower; + + + /** + * 创建时间 + */ + @CreatedDate + @Column(columnDefinition = "datetime comment '创建时间'") + private Date createTime; +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/model/ShopApply.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/model/ShopApply.java new file mode 100644 index 0000000..202e692 --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/model/ShopApply.java @@ -0,0 +1,80 @@ +package com.chilunyc.fumao.company.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.*; +import org.hibernate.annotations.Parameter; +import org.hibernate.validator.constraints.*; + +import javax.validation.constraints.*; + +import org.springframework.data.jpa.domain.support.AuditingEntityListener; +import org.springframework.data.annotation.CreatedDate; + +import javax.persistence.*; +import javax.persistence.Entity; +import javax.persistence.Index; +import javax.persistence.Table; +import java.io.Serializable; +import java.util.Date; +import java.lang.Long; +import java.lang.String; +import java.lang.String; +import java.lang.String; +import java.lang.String; + +/** + * + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Entity +@Table(name = "fumao_shop_apply", indexes = { +}) +@EntityListeners(AuditingEntityListener.class) +public class ShopApply implements Serializable { + + /** + * 编号 + */ + @Id + @Column(columnDefinition = "bigint(64)") + @GeneratedValue(generator = "custom") + @GenericGenerator(name = "custom", strategy = "com.chilunyc.fumao.common.util.jpa.CustomIdentifierGenerator", parameters = {@Parameter(name = "type", value = "Number")}) + private Long id; + + /** + * 商铺名称 + */ + @Column(columnDefinition = "varchar(64) comment '商铺名称'") + private String name; + + /** + * 申请人 + */ + @Column(columnDefinition = "varchar(64) comment '申请人'") + private String proposer; + + /** + * 手机号 + */ + @Column(columnDefinition = "varchar(20) comment '手机号'") + private String mobile; + + /** + * 备注 + */ + @Column(columnDefinition = "text comment '备注'") + private String market; + + /** + * 创建时间 + */ + @CreatedDate + @Column(columnDefinition = "datetime comment '创建时间'") + private Date createTime; +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/model/enums/PlaceAdminType.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/model/enums/PlaceAdminType.java new file mode 100644 index 0000000..bbd293f --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/model/enums/PlaceAdminType.java @@ -0,0 +1,10 @@ +package com.chilunyc.fumao.company.model.enums; + + +/** +* +*/ +public enum PlaceAdminType { + Manager, + Business, +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/repository/CompanyAdminRepository.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/repository/CompanyAdminRepository.java new file mode 100644 index 0000000..c2e575e --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/repository/CompanyAdminRepository.java @@ -0,0 +1,22 @@ +package com.chilunyc.fumao.company.repository; + +import com.chilunyc.fumao.common.request.IdsRequest; +import com.chilunyc.fumao.company.model.CompanyAdmin; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +import java.util.List; + +/** +* +*/ +public interface CompanyAdminRepository extends JpaRepository, JpaSpecificationExecutor { + + CompanyAdmin findByMobile(String mobile); + + boolean existsByMobile(String mobile); + + CompanyAdmin findByIdAndCompanyId(Long id, Long companyId); + + void deleteByIdAndCompanyId(List request, Long companyId); +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/repository/CompanyRepository.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/repository/CompanyRepository.java new file mode 100644 index 0000000..69e6f88 --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/repository/CompanyRepository.java @@ -0,0 +1,12 @@ +package com.chilunyc.fumao.company.repository; + +import com.chilunyc.fumao.company.model.Company; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +/** +* +*/ +public interface CompanyRepository extends JpaRepository, JpaSpecificationExecutor { + +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/repository/PlaceAdminRepository.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/repository/PlaceAdminRepository.java new file mode 100644 index 0000000..e163261 --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/repository/PlaceAdminRepository.java @@ -0,0 +1,23 @@ +package com.chilunyc.fumao.company.repository; + +import com.chilunyc.fumao.company.model.PlaceAdmin; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +import java.util.List; + +/** +* +*/ +public interface PlaceAdminRepository extends JpaRepository, JpaSpecificationExecutor { + + PlaceAdmin findByMobile(String mobile); + + boolean existsByMobile(String mobile); + + List findByPlaceId(Long marketId); + + boolean existsByPlaceId(Long marketId); + + PlaceAdmin findByIdAndCompanyId(Long id, Long companyId); +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/repository/PlaceAdminRoleRepository.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/repository/PlaceAdminRoleRepository.java new file mode 100644 index 0000000..cebbbc4 --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/repository/PlaceAdminRoleRepository.java @@ -0,0 +1,12 @@ +package com.chilunyc.fumao.company.repository; + +import com.chilunyc.fumao.company.model.PlaceAdminPermission; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +/** +* +*/ +public interface PlaceAdminRoleRepository extends JpaRepository, JpaSpecificationExecutor { + +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/repository/PlaceFloorRepository.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/repository/PlaceFloorRepository.java new file mode 100644 index 0000000..7c5d82f --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/repository/PlaceFloorRepository.java @@ -0,0 +1,18 @@ +package com.chilunyc.fumao.company.repository; + +import com.chilunyc.fumao.company.model.PlaceFloor; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +import java.util.List; + +/** +* +*/ +public interface PlaceFloorRepository extends JpaRepository, JpaSpecificationExecutor { + + List findByPlaceId(Long marketId); + + boolean existsByPlaceId(Long marketId); + +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/repository/PlaceRepository.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/repository/PlaceRepository.java new file mode 100644 index 0000000..30f773b --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/repository/PlaceRepository.java @@ -0,0 +1,17 @@ +package com.chilunyc.fumao.company.repository; + +import com.chilunyc.fumao.company.model.Place; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +import java.util.List; + +/** +* +*/ +public interface PlaceRepository extends JpaRepository, JpaSpecificationExecutor { + + List findByCompanyId(Long companyId); + + boolean existsByCompanyId(Long companyId); +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/repository/ShopApplyRepository.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/repository/ShopApplyRepository.java new file mode 100644 index 0000000..4f7fa59 --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/repository/ShopApplyRepository.java @@ -0,0 +1,12 @@ +package com.chilunyc.fumao.company.repository; + +import com.chilunyc.fumao.company.model.ShopApply; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +/** +* +*/ +public interface ShopApplyRepository extends JpaRepository, JpaSpecificationExecutor { + +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/request/.gitkeep b/fumao-company/src/main/java/com/chilunyc/fumao/company/request/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/request/company/CompanyEditRequest.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/request/company/CompanyEditRequest.java new file mode 100644 index 0000000..755fa48 --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/request/company/CompanyEditRequest.java @@ -0,0 +1,52 @@ +package com.chilunyc.fumao.company.request.company; + +import com.chilunyc.fumao.company.request.place.PlaceEditRequest; +import com.chilunyc.fumao.company.request.placeAdmin.PlaceAdminEditRequest; +import org.hibernate.validator.constraints.*; + +import javax.validation.constraints.*; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import java.lang.String; +import java.util.List; + +/** + * + */ +@ApiModel +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CompanyEditRequest { + + private Long id; + + @NotBlank(message = "请输入名称") + @ApiModelProperty(value = "名称") + private String name; + + @NotNull(message = "请输入省市区") + @Size(min = 3, message = "请选择省市区") + @ApiModelProperty(value = "省份") + private String[] region; + + @NotBlank(message = "请输入POI") + @ApiModelProperty(value = "POI") + private String poi; + + @NotBlank(message = "请输入经度") + @ApiModelProperty(value = "经度") + private String lat; + + @NotBlank(message = "请输入纬度") + @ApiModelProperty(value = "纬度") + private String lng; + + @NotBlank(message = "请输入地址") + @ApiModelProperty(value = "地址") + private String address; +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/request/company/CompanyPageRequest.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/request/company/CompanyPageRequest.java new file mode 100644 index 0000000..001d73e --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/request/company/CompanyPageRequest.java @@ -0,0 +1,14 @@ +package com.chilunyc.fumao.company.request.company; + +import com.chilunyc.fumao.common.request.PageRequest; +import com.chilunyc.fumao.common.util.jpa.query.SortItem; +import com.chilunyc.fumao.common.util.jpa.query.SortItems; +import lombok.Data; + +/** + * + */ +@Data +@SortItems({@SortItem(column = "createTime")}) +public class CompanyPageRequest extends PageRequest { +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/request/companyAdmin/CompanyAdminEditRequest.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/request/companyAdmin/CompanyAdminEditRequest.java new file mode 100644 index 0000000..da8ee48 --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/request/companyAdmin/CompanyAdminEditRequest.java @@ -0,0 +1,45 @@ +package com.chilunyc.fumao.company.request.companyAdmin; + +import org.hibernate.validator.constraints.*; + +import javax.validation.constraints.*; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import java.lang.Long; +import java.lang.String; +import java.lang.String; +import java.lang.String; +import java.lang.String; +import java.lang.Long; +import java.util.Date; + +/** + * + */ +@ApiModel +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CompanyAdminEditRequest { + + private Long id; + + @NotBlank(message = "请输入名称") + @ApiModelProperty(value = "名称") + private String name; + + @Pattern(regexp = "[\\w\\d]{6,18}", message = "请输入6-18位密码") + @ApiModelProperty(value = "密码") + private String password; + + @Pattern(regexp = "1[\\d]{10}", message = "请输入11位手机号") + @ApiModelProperty(value = "手机号") + private String mobile; + + @ApiModelProperty(value = "集团") + private Long companyId; +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/request/companyAdmin/CompanyAdminPageRequest.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/request/companyAdmin/CompanyAdminPageRequest.java new file mode 100644 index 0000000..3f31db4 --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/request/companyAdmin/CompanyAdminPageRequest.java @@ -0,0 +1,22 @@ +package com.chilunyc.fumao.company.request.companyAdmin; + +import com.chilunyc.fumao.common.request.PageRequest; +import com.chilunyc.fumao.common.util.jpa.query.QueryItem; +import com.chilunyc.fumao.common.util.jpa.query.QueryType; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.lang.String; + +/** +* +*/ +@Data +public class CompanyAdminPageRequest extends PageRequest { + + @ApiModelProperty(value = "名称") + private String name; + + @QueryItem(type = QueryType.equal) + private Long companyId; +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/request/place/PlaceEditRequest.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/request/place/PlaceEditRequest.java new file mode 100644 index 0000000..5695540 --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/request/place/PlaceEditRequest.java @@ -0,0 +1,76 @@ +package com.chilunyc.fumao.company.request.place; + +import com.chilunyc.fumao.company.request.placeAdmin.PlaceAdminEditRequest; +import com.chilunyc.fumao.company.request.placeFloor.PlaceFloorEditRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.NotBlank; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.List; + +/** + * + */ +@ApiModel +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class PlaceEditRequest { + + private Long id; + + @NotBlank(message = "请输入名称") + @ApiModelProperty(value = "名称") + private String name; + + @NotNull(message = "请输入省市区") + @Size(min = 3, message = "请选择省市区") + @ApiModelProperty(value = "省份") + private String[] region; + + @NotBlank(message = "请输入POI") + @ApiModelProperty(value = "POI") + private String poi; + + @NotBlank(message = "请输入经度") + @ApiModelProperty(value = "经度") + private String lat; + + @NotBlank(message = "请输入纬度") + @ApiModelProperty(value = "纬度") + private String lng; + + @NotBlank(message = "请输入地址") + @ApiModelProperty(value = "地址") + private String address; + + @NotNull(message = "请输入集团") + @ApiModelProperty(value = "集团") + private Long companyId; + + @ApiModelProperty(value = "迈外迪") + private String maiwaidId; + + @ApiModelProperty(value = "ETCP") + private String etcpId; + + @ApiModelProperty(value = "总面积") + private Double totalArea; + + @ApiModelProperty(value = "营业面积") + private Double sellingArea; + + @ApiModelProperty(value = "停车场面积") + private Double depotArea; + + private List placeFloorList; + + private List placeAdminList; +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/request/place/PlacePageRequest.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/request/place/PlacePageRequest.java new file mode 100644 index 0000000..fc2249a --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/request/place/PlacePageRequest.java @@ -0,0 +1,19 @@ +package com.chilunyc.fumao.company.request.place; + +import com.chilunyc.fumao.common.request.PageRequest; +import com.chilunyc.fumao.common.util.jpa.query.QueryItem; +import com.chilunyc.fumao.common.util.jpa.query.QueryType; +import com.chilunyc.fumao.common.util.jpa.query.SortItem; +import com.chilunyc.fumao.common.util.jpa.query.SortItems; +import lombok.Data; + +/** +* +*/ +@Data +@SortItems({@SortItem(column = "createTime")}) +public class PlacePageRequest extends PageRequest { + + @QueryItem(type = QueryType.equal) + private Long companyId; +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/request/placeAdmin/PlaceAdminEditRequest.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/request/placeAdmin/PlaceAdminEditRequest.java new file mode 100644 index 0000000..becef5b --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/request/placeAdmin/PlaceAdminEditRequest.java @@ -0,0 +1,49 @@ +package com.chilunyc.fumao.company.request.placeAdmin; + +import com.chilunyc.fumao.company.model.enums.PlaceAdminType; +import org.hibernate.validator.constraints.*; + +import javax.validation.constraints.*; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import java.lang.Long; +import java.lang.String; + +/** + * + */ +@ApiModel +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class PlaceAdminEditRequest { + + private Long id; + + @NotBlank(message = "请输入名称") + @ApiModelProperty(value = "名称") + private String name; + + @NotBlank(message = "请输入密码") + @Pattern(regexp = "[\\w\\d]{6,18}", message = "长度6-18位的字母数字") + @ApiModelProperty(value = "密码") + private String password; + + @Pattern(regexp = "1[\\d]{10}", message = "请输入11位手机号") + @ApiModelProperty(value = "手机号") + private String mobile; + + @ApiModelProperty(value = "集团") + private Long companyId; + + @NotNull(message = "请选择商场") + @ApiModelProperty(value = "集团商场") + private Long placeId; + + private PlaceAdminType placeAdminType; + +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/request/placeAdmin/PlaceAdminPageRequest.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/request/placeAdmin/PlaceAdminPageRequest.java new file mode 100644 index 0000000..f574887 --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/request/placeAdmin/PlaceAdminPageRequest.java @@ -0,0 +1,23 @@ +package com.chilunyc.fumao.company.request.placeAdmin; + +import com.chilunyc.fumao.common.request.PageRequest; +import com.chilunyc.fumao.common.util.jpa.query.QueryItem; +import com.chilunyc.fumao.common.util.jpa.query.QueryType; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.lang.Long; +import java.lang.String; + +/** + * + */ +@Data +public class PlaceAdminPageRequest extends PageRequest { + + @QueryItem(type = QueryType.equal) + private Long placeId; + + @QueryItem(type = QueryType.equal) + private Long companyId; +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/request/placeFloor/PlaceFloorEditRequest.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/request/placeFloor/PlaceFloorEditRequest.java new file mode 100644 index 0000000..b8c1401 --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/request/placeFloor/PlaceFloorEditRequest.java @@ -0,0 +1,41 @@ +package com.chilunyc.fumao.company.request.placeFloor; + +import org.hibernate.validator.constraints.*; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import java.lang.Long; +import java.lang.Integer; +import java.lang.Double; +import java.lang.String; + +/** + * + */ +@ApiModel +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class PlaceFloorEditRequest { + + private String id; + + @NotBlank(message = "请输入商场") + @ApiModelProperty(value = "商场") + private Long placeId; + + @ApiModelProperty(value = "楼层") + private Integer floor; + + @ApiModelProperty(value = "面积") + private Double area; + + @ApiModelProperty(value = "平面图") + private String image; + + @ApiModelProperty(value = "几座") + private String tower; +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/request/placeFloor/PlaceFloorPageRequest.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/request/placeFloor/PlaceFloorPageRequest.java new file mode 100644 index 0000000..2a0935b --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/request/placeFloor/PlaceFloorPageRequest.java @@ -0,0 +1,20 @@ +package com.chilunyc.fumao.company.request.placeFloor; + +import com.chilunyc.fumao.common.request.PageRequest; +import com.chilunyc.fumao.common.util.jpa.query.QueryItem; +import com.chilunyc.fumao.common.util.jpa.query.QueryType; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.lang.Long; + +/** +* +*/ +@Data +public class PlaceFloorPageRequest extends PageRequest { + + @ApiModelProperty(value = "商场") + @QueryItem(type = QueryType.equal) + private Long placeId; +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/request/shopApply/ShopApplyEditRequest.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/request/shopApply/ShopApplyEditRequest.java new file mode 100644 index 0000000..5dea45b --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/request/shopApply/ShopApplyEditRequest.java @@ -0,0 +1,44 @@ +package com.chilunyc.fumao.company.request.shopApply; + +import org.hibernate.validator.constraints.*; + +import javax.validation.constraints.*; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import java.lang.Long; +import java.lang.String; +import java.lang.String; +import java.lang.String; +import java.lang.String; + +/** + * + */ +@ApiModel +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ShopApplyEditRequest { + + private String id; + + + @NotBlank(message = "请输入商铺名称") + @ApiModelProperty(value = "商铺名称") + private String name; + + @NotBlank(message = "请输入申请人") + @ApiModelProperty(value = "申请人") + private String proposer; + + @Pattern(regexp = "1[\\d]{10}", message = "请输入11位手机号") + @ApiModelProperty(value = "手机号") + private String mobile; + + @ApiModelProperty(value = "备注") + private String market; +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/request/shopApply/ShopApplyPageRequest.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/request/shopApply/ShopApplyPageRequest.java new file mode 100644 index 0000000..94895e8 --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/request/shopApply/ShopApplyPageRequest.java @@ -0,0 +1,11 @@ +package com.chilunyc.fumao.company.request.shopApply; + +import com.chilunyc.fumao.common.request.PageRequest; +import lombok.Data; + +/** +* +*/ +@Data +public class ShopApplyPageRequest extends PageRequest { +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/response/.gitkeep b/fumao-company/src/main/java/com/chilunyc/fumao/company/response/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/service/CompanyAdminService.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/service/CompanyAdminService.java new file mode 100644 index 0000000..e3264ea --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/service/CompanyAdminService.java @@ -0,0 +1,113 @@ +package com.chilunyc.fumao.company.service; + +import com.chilunyc.fumao.common.context.RequestHolder; +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.request.IdsRequest; +import com.chilunyc.fumao.common.request.LoginRequest; +import com.chilunyc.fumao.common.util.BeanHelper; +import com.chilunyc.fumao.common.util.jpa.query.QueryBuilder; +import com.chilunyc.fumao.common.util.security.SaltHelper; +import com.chilunyc.fumao.company.model.Company; +import com.chilunyc.fumao.company.model.CompanyAdmin; +import com.chilunyc.fumao.company.repository.CompanyAdminRepository; +import com.chilunyc.fumao.company.request.companyAdmin.CompanyAdminEditRequest; +import com.chilunyc.fumao.company.request.companyAdmin.CompanyAdminPageRequest; +import com.chilunyc.fumao.company.request.placeAdmin.PlaceAdminEditRequest; +import lombok.extern.log4j.Log4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * + */ +@Log4j +@Service +@Transactional +public class CompanyAdminService { + + + @Autowired + private CompanyAdminRepository companyAdminRepository; + + @Autowired + private EventService eventService; + + public Page page(CompanyAdminPageRequest request) { + return companyAdminRepository.findAll(QueryBuilder.build(request), request.getPage()); + } + + + public CompanyAdmin find(Long id) { + CompanyAdmin one = companyAdminRepository.findOne(id); + return one; + } + + + public CompanyAdmin edit(CompanyAdminEditRequest request) { + if (request.getId() == null && + companyAdminRepository.existsByMobile(request.getMobile())) { + throw new SystemException("100000"); + } + + CompanyAdmin companyAdmin = new CompanyAdmin(); + BeanHelper.copyProperties(companyAdmin, request); + String salt = SaltHelper.salt(); + companyAdmin.setOriginPassword(request.getPassword()); + companyAdmin.setSalt(salt); + companyAdmin.setPassword(SaltHelper.exec(request.getPassword(), salt)); + companyAdmin = companyAdminRepository.save(companyAdmin); + eventService.add(RequestHolder.get(), EventTarget.System, EventType.编辑集团管理员, companyAdmin.getId(), request); + return companyAdmin; + } + + public void remove(IdsRequest request) { + request + .getIds() + .forEach((id) -> { + companyAdminRepository.delete(id); + }); + eventService.add(RequestHolder.get(), EventTarget.System, EventType.删除集团管理员, null, request.getIds()); + } + + + public List all(CompanyAdminPageRequest request) { + if (request == null) { + request = new CompanyAdminPageRequest(); + } + List all = companyAdminRepository.findAll(QueryBuilder.build(request)); + return all; + } + + + public CompanyAdmin login(LoginRequest request) { + CompanyAdmin companyAdmin = companyAdminRepository.findByMobile(request.getMobile()); + if (companyAdmin != null && + SaltHelper.isEquals(companyAdmin.getPassword(), request.getPassword(), companyAdmin.getSalt())) { + return companyAdmin; + } + throw new SystemException("000004"); + } + + public CompanyAdmin findByCompanyId(Long id, Long companyId) { + return companyAdminRepository.findByIdAndCompanyId(id, companyId); + } + + public void removeByCompanyId(IdsRequest request, Long companyId) { + companyAdminRepository.deleteByIdAndCompanyId(request.getIds(), companyId); + } + + public void resetPassword(Long id, Long companyId) { + CompanyAdmin companyAdmin = companyAdminRepository.findByIdAndCompanyId(id, companyId); + if (companyAdmin != null) { + companyAdmin.setPassword(SaltHelper.exec(companyAdmin.getOriginPassword(), companyAdmin.getSalt())); + companyAdminRepository.save(companyAdmin); + } + } +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/service/CompanyService.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/service/CompanyService.java new file mode 100644 index 0000000..8574306 --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/service/CompanyService.java @@ -0,0 +1,89 @@ +package com.chilunyc.fumao.company.service; + +import com.chilunyc.fumao.common.context.RequestHolder; +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.request.IdsRequest; +import com.chilunyc.fumao.common.util.BeanHelper; +import com.chilunyc.fumao.common.util.jpa.query.QueryBuilder; +import com.chilunyc.fumao.company.model.Company; +import com.chilunyc.fumao.company.repository.CompanyRepository; +import com.chilunyc.fumao.company.request.company.CompanyEditRequest; +import com.chilunyc.fumao.company.request.company.CompanyPageRequest; +import lombok.extern.log4j.Log4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * + */ +@Log4j +@Service +@Transactional +public class CompanyService { + + + @Autowired + private CompanyRepository companyRepository; + + @Autowired + private EventService eventService; + + @Autowired + private PlaceService placeService; + + @Autowired + private CompanyAdminService companyAdminService; + + public Page page(CompanyPageRequest request) { + return companyRepository.findAll(QueryBuilder.build(request), request.getPage()); + } + + + public Company find(Long id) { + Company one = companyRepository.findOne(id); + return one; + } + + + public Company edit(CompanyEditRequest request) { + Company company = new Company(); + BeanHelper.copyProperties(company, request); + String[] region = request.getRegion(); + company.setProvince(region[0]); + company.setCity(region[1]); + company.setArea(region[2]); + company = companyRepository.save(company); + + + // 调用flyway, 创建一个数据库实例 + + eventService.add(RequestHolder.get(), EventTarget.System, EventType.编辑集团, company.getId(), request); + return company; + } + + public void remove(IdsRequest request) { + request + .getIds() + .forEach((id) -> { + companyRepository.delete(id); + }); + eventService.add(RequestHolder.get(), EventTarget.System, EventType.删除集团, null, request.getIds()); + } + + + public List all(CompanyPageRequest request) { + if (request == null) { + request = new CompanyPageRequest(); + } + List all = companyRepository.findAll(QueryBuilder.build(request)); + return all; + } + + +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/service/PlaceAdminRoleService.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/service/PlaceAdminRoleService.java new file mode 100644 index 0000000..8bc60ea --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/service/PlaceAdminRoleService.java @@ -0,0 +1,59 @@ +package com.chilunyc.fumao.company.service; + +import com.chilunyc.fumao.common.context.RequestHolder; +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.request.IdsRequest; +import com.chilunyc.fumao.common.request.PageRequest; +import com.chilunyc.fumao.company.model.PlaceAdminPermission; +import com.chilunyc.fumao.company.repository.PlaceAdminRoleRepository; +import lombok.extern.log4j.Log4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * + */ +@Log4j +@Service +@Transactional +public class PlaceAdminRoleService { + + + @Autowired + private PlaceAdminRoleRepository placeAdminRoleRepository; + + @Autowired + private EventService eventService; + + public Page page(PageRequest request) { + return placeAdminRoleRepository.findAll(request.getPage()); + } + + + public PlaceAdminPermission find(Long id) { + PlaceAdminPermission one = placeAdminRoleRepository.findOne(id); + return one; + } + + + public PlaceAdminPermission edit(PlaceAdminPermission request) { + request = placeAdminRoleRepository.save(request); + eventService.add(RequestHolder.get(), EventTarget.Company, EventType.编辑商场管理员角色, request.getId(), request); + return request; + } + + public void remove(IdsRequest request) { + request + .getIds() + .forEach((id) -> { + placeAdminRoleRepository.delete(id); + }); + eventService.add(RequestHolder.get(), EventTarget.Company, EventType.删除商场管理员角色, null, request.getIds()); + } + + +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/service/PlaceAdminService.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/service/PlaceAdminService.java new file mode 100644 index 0000000..d572776 --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/service/PlaceAdminService.java @@ -0,0 +1,105 @@ +package com.chilunyc.fumao.company.service; + +import com.chilunyc.fumao.common.context.RequestHolder; +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.request.IdsRequest; +import com.chilunyc.fumao.common.request.LoginRequest; +import com.chilunyc.fumao.common.util.BeanHelper; +import com.chilunyc.fumao.common.util.jpa.query.QueryBuilder; +import com.chilunyc.fumao.common.util.security.SaltHelper; +import com.chilunyc.fumao.company.model.Place; +import com.chilunyc.fumao.company.model.PlaceAdmin; +import com.chilunyc.fumao.company.repository.PlaceAdminRepository; +import com.chilunyc.fumao.company.request.placeAdmin.PlaceAdminEditRequest; +import com.chilunyc.fumao.company.request.placeAdmin.PlaceAdminPageRequest; +import lombok.extern.log4j.Log4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * + */ +@Log4j +@Service +@Transactional +public class PlaceAdminService { + + + @Autowired + private PlaceAdminRepository placeAdminRepository; + + @Autowired + private EventService eventService; + + public Page page(PlaceAdminPageRequest request) { + return placeAdminRepository.findAll(QueryBuilder.build(request), request.getPage()); + } + + + public PlaceAdmin find(Long id) { + PlaceAdmin one = placeAdminRepository.findOne(id); + return one; + } + + + public PlaceAdmin edit(PlaceAdminEditRequest request) { + if (request.getId() == null && + placeAdminRepository.existsByMobile(request.getMobile())) { + throw new SystemException("100000"); + } + + PlaceAdmin placeAdmin = new PlaceAdmin(); + String salt = SaltHelper.salt(); + BeanHelper.copyProperties(placeAdmin, request); + placeAdmin.setOriginPassword(request.getPassword()); + placeAdmin.setSalt(salt); + placeAdmin.setPassword(SaltHelper.exec(request.getPassword(), salt)); + placeAdmin.setType(request.getPlaceAdminType()); + placeAdmin = placeAdminRepository.save(placeAdmin); + eventService.add(RequestHolder.get(), EventTarget.System, EventType.编辑商场管理员, placeAdmin.getId(), request); + return placeAdmin; + } + + public void remove(IdsRequest request) { + request + .getIds() + .forEach((id) -> { + placeAdminRepository.delete(id); + }); + eventService.add(RequestHolder.get(), EventTarget.System, EventType.删除商场管理员, null, request.getIds()); + } + + public void edit(Place place, List placeAdminList) { + placeAdminList + .stream() + .peek(placeAdminEditRequest -> { + placeAdminEditRequest.setPlaceId(place.getId()); + placeAdminEditRequest.setCompanyId(place.getCompanyId()); + }) + .forEach(this::edit); + } + + public void resetPassword(Long id, Long companyId) { + PlaceAdmin placeAdmin = placeAdminRepository.findByIdAndCompanyId(id, companyId); + if (placeAdmin != null) { + placeAdmin.setPassword(SaltHelper.exec(placeAdmin.getOriginPassword(), placeAdmin.getSalt())); + placeAdminRepository.save(placeAdmin); + } + } + + public PlaceAdmin login(LoginRequest request) { + PlaceAdmin placeAdmin = placeAdminRepository.findByMobile(request.getMobile()); + if (placeAdmin != null && + SaltHelper.isEquals(placeAdmin.getPassword(), request.getPassword(), placeAdmin.getSalt())) { + return placeAdmin; + } + throw new SystemException("000004"); + } +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/service/PlaceFloorService.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/service/PlaceFloorService.java new file mode 100644 index 0000000..cbdde22 --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/service/PlaceFloorService.java @@ -0,0 +1,76 @@ +package com.chilunyc.fumao.company.service; + +import com.chilunyc.fumao.common.context.RequestHolder; +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.request.IdsRequest; +import com.chilunyc.fumao.common.util.BeanHelper; +import com.chilunyc.fumao.common.util.jpa.query.QueryBuilder; +import com.chilunyc.fumao.company.model.Place; +import com.chilunyc.fumao.company.model.PlaceFloor; +import com.chilunyc.fumao.company.repository.PlaceFloorRepository; +import com.chilunyc.fumao.company.request.placeFloor.PlaceFloorEditRequest; +import com.chilunyc.fumao.company.request.placeFloor.PlaceFloorPageRequest; +import lombok.extern.log4j.Log4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * + */ +@Log4j +@Service +@Transactional +public class PlaceFloorService { + + + @Autowired + private PlaceFloorRepository placeFloorRepository; + + @Autowired + private EventService eventService; + + public Page page(PlaceFloorPageRequest request) { + return placeFloorRepository.findAll(QueryBuilder.build(request), request.getPage()); + } + + + public PlaceFloor find(Long id) { + PlaceFloor one = placeFloorRepository.findOne(id); + return one; + } + + + public PlaceFloor edit(PlaceFloorEditRequest request) { + PlaceFloor placeFloor = new PlaceFloor(); + BeanHelper.copyProperties(placeFloor, request); + placeFloor = placeFloorRepository.save(placeFloor); + eventService.add(RequestHolder.get(), EventTarget.System, EventType.编辑商场楼层, placeFloor.getId(), request); + return placeFloor; + } + + public void remove(IdsRequest request) { + request + .getIds() + .forEach((id) -> { + placeFloorRepository.delete(id); + }); + eventService.add(RequestHolder.get(), EventTarget.System, EventType.删除商场楼层, null, request.getIds()); + } + + + public void edit(Place place, List placeFloorList) { + placeFloorList.stream() + .peek(placeFloor -> placeFloor.setPlaceId(place.getId())) + .forEach(this::edit); + } + + public List all(PlaceFloorPageRequest request) { + return placeFloorRepository.findAll(QueryBuilder.build(request)); + } +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/service/PlaceService.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/service/PlaceService.java new file mode 100644 index 0000000..98f849b --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/service/PlaceService.java @@ -0,0 +1,104 @@ +package com.chilunyc.fumao.company.service; + +import com.chilunyc.fumao.common.context.RequestHolder; +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.request.IdsRequest; +import com.chilunyc.fumao.common.util.BeanHelper; +import com.chilunyc.fumao.common.util.jpa.query.QueryBuilder; +import com.chilunyc.fumao.company.model.Place; +import com.chilunyc.fumao.company.repository.PlaceFloorRepository; +import com.chilunyc.fumao.company.repository.PlaceRepository; +import com.chilunyc.fumao.company.request.place.PlaceEditRequest; +import com.chilunyc.fumao.company.request.place.PlacePageRequest; +import lombok.extern.log4j.Log4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * + */ +@Log4j +@Service +@Transactional +public class PlaceService { + + + @Autowired + private PlaceRepository placeRepository; + + @Autowired + private PlaceFloorRepository placeFloorRepository; + + @Autowired + private EventService eventService; + + @Autowired + private PlaceFloorService placeFloorService; + + @Autowired + private PlaceAdminService placeAdminService; + + public Page page(PlacePageRequest request) { + return placeRepository.findAll(QueryBuilder.build(request), request.getPage()); + } + + + public Place find(Long id) { + Place one = placeRepository.findOne(id); + return one; + } + + + public Place edit(PlaceEditRequest request) { + Place place = new Place(); + BeanHelper.copyProperties(place, request); + String[] region = request.getRegion(); + place.setProvince(region[0]); + place.setCity(region[1]); + place.setArea(region[2]); + place = placeRepository.save(place); + + // 处理楼层, 全部清掉, 冲洗加 + if (request.getPlaceFloorList() != null) { + placeFloorRepository.deleteAllInBatch(); + placeFloorService.edit(place, request.getPlaceFloorList()); + } + + // 处理管理员 + if (request.getPlaceAdminList() != null) { + placeAdminService.edit(place, request.getPlaceAdminList()); + } + + eventService.add(RequestHolder.get(), EventTarget.System, EventType.编辑商场, place.getId(), request); + return place; + } + + public void remove(IdsRequest request) { + request + .getIds() + .forEach((id) -> { + placeRepository.delete(id); + }); + eventService.add(RequestHolder.get(), EventTarget.System, EventType.删除商场, null, request.getIds()); + } + + + public List all(PlacePageRequest request) { + if (request == null) { + request = new PlacePageRequest(); + } + List all = placeRepository.findAll(QueryBuilder.build(request)); + return all; + } + + + public void edit(List marketList) { + marketList.forEach(this::edit); + } +} diff --git a/fumao-company/src/main/java/com/chilunyc/fumao/company/service/ShopApplyService.java b/fumao-company/src/main/java/com/chilunyc/fumao/company/service/ShopApplyService.java new file mode 100644 index 0000000..786e023 --- /dev/null +++ b/fumao-company/src/main/java/com/chilunyc/fumao/company/service/ShopApplyService.java @@ -0,0 +1,62 @@ +package com.chilunyc.fumao.company.service; + +import com.chilunyc.fumao.common.context.RequestHolder; +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.request.IdsRequest; +import com.chilunyc.fumao.common.util.jpa.query.QueryBuilder; +import com.chilunyc.fumao.company.model.ShopApply; +import com.chilunyc.fumao.company.repository.ShopApplyRepository; +import com.chilunyc.fumao.company.request.shopApply.ShopApplyEditRequest; +import com.chilunyc.fumao.company.request.shopApply.ShopApplyPageRequest; +import lombok.extern.log4j.Log4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * + */ +@Log4j +@Service +@Transactional +public class ShopApplyService { + + + @Autowired + private ShopApplyRepository shopApplyRepository; + + @Autowired + private EventService eventService; + + public Page page(ShopApplyPageRequest request) { + return shopApplyRepository.findAll(QueryBuilder.build(request), request.getPage()); + } + + + public ShopApply find(Long id) { + ShopApply one = shopApplyRepository.findOne(id); + return one; + } + + + public ShopApply edit(ShopApplyEditRequest request) { + ShopApply shopApply = new ShopApply(); + shopApply = shopApplyRepository.save(shopApply); + eventService.add(RequestHolder.get(), EventTarget.Company, EventType.编辑商铺申请, shopApply.getId(), request); + return shopApply; + } + + public void remove(IdsRequest request) { + request + .getIds() + .forEach((id) -> { + shopApplyRepository.delete(id); + }); + eventService.add(RequestHolder.get(), EventTarget.Company, EventType.删除商铺申请, null, request.getIds()); + } + + +} diff --git a/fumao-company/src/main/resources/com/chilunyc/fumao/company/repository/.gitkeep b/fumao-company/src/main/resources/com/chilunyc/fumao/company/repository/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/fumao-service/pom.xml b/fumao-service/pom.xml new file mode 100644 index 0000000..bb76861 --- /dev/null +++ b/fumao-service/pom.xml @@ -0,0 +1,32 @@ + + + + fumao + com.aki + 0.0.1-SNAPSHOT + + 4.0.0 + + fumao-service + + + + + com.aki + fumao-common + 0.0.1-SNAPSHOT + + + com.aki + fumao-system + ${project.version} + + + com.aki + fumao-company + ${project.version} + + + \ No newline at end of file diff --git a/fumao-service/src/main/java/com/chilunyc/fumao/service/model/.gitkeep b/fumao-service/src/main/java/com/chilunyc/fumao/service/model/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/fumao-service/src/main/java/com/chilunyc/fumao/service/repository/.gitkeep b/fumao-service/src/main/java/com/chilunyc/fumao/service/repository/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/fumao-service/src/main/java/com/chilunyc/fumao/service/request/.gitkeep b/fumao-service/src/main/java/com/chilunyc/fumao/service/request/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/fumao-service/src/main/java/com/chilunyc/fumao/service/response/.gitkeep b/fumao-service/src/main/java/com/chilunyc/fumao/service/response/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/fumao-service/src/main/java/com/chilunyc/fumao/service/service/.gitkeep b/fumao-service/src/main/java/com/chilunyc/fumao/service/service/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/fumao-service/src/main/resources/com/chilunyc/fumao/service/repository/.gitkeep b/fumao-service/src/main/resources/com/chilunyc/fumao/service/repository/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/fumao-system/pom.xml b/fumao-system/pom.xml new file mode 100644 index 0000000..f58dbcf --- /dev/null +++ b/fumao-system/pom.xml @@ -0,0 +1,22 @@ + + + + fumao + com.aki + 0.0.1-SNAPSHOT + + 4.0.0 + + fumao-system + + + + + com.aki + fumao-common + 0.0.1-SNAPSHOT + + + \ No newline at end of file diff --git a/fumao-system/src/main/java/com/chilunyc/fumao/system/model/SystemAdmin.java b/fumao-system/src/main/java/com/chilunyc/fumao/system/model/SystemAdmin.java new file mode 100644 index 0000000..b786e58 --- /dev/null +++ b/fumao-system/src/main/java/com/chilunyc/fumao/system/model/SystemAdmin.java @@ -0,0 +1,88 @@ +package com.chilunyc.fumao.system.model; + +import com.chilunyc.fumao.common.context.LoginUser; +import com.chilunyc.fumao.common.shiro.AuthRoles; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.JwtBuilder; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.GenericGenerator; +import org.hibernate.annotations.Parameter; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import javax.persistence.*; +import java.io.Serializable; +import java.util.Date; + +/** + * + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Entity +@Table(name = "fumao_system_admin", indexes = { + @Index(name = "system_admin_mobile", columnList = "mobile") +}) +@EntityListeners(AuditingEntityListener.class) +public class SystemAdmin implements Serializable, LoginUser { + + /** + * 编号 + */ + @Id + @Column(length = 64) + @GeneratedValue(generator = "custom") + @GenericGenerator(name = "custom", strategy = "com.chilunyc.fumao.common.util.jpa.CustomIdentifierGenerator", parameters = {@Parameter(name = "type", value = "Number")}) + private Long id; + + /** + * 名称 + */ + @Column(columnDefinition = "varchar(64) comment '名称'") + private String name; + + /** + * 密码 + */ + @Column(columnDefinition = "varchar(32) comment '密码'") + private String password; + + /** + * 盐值 + */ + @Column(columnDefinition = "varchar(32) comment '盐值'") + private String salt; + + /** + * 手机号 + */ + @Column(columnDefinition = "varchar(20) comment '手机号'") + private String mobile; + + /** + * 创建时间 + */ + @CreatedDate + @Column(columnDefinition = "datetime comment '创建时间'") + private Date createTime; + + @Override + public String[] toRoles() { + return new String[]{AuthRoles.SystemAdmin}; + } + + @Override + public void fromJwt(Claims claims) { + this.id = Long.parseLong(claims.getSubject()); + } + + @Override + public void toJwt(JwtBuilder claims) { + claims.setSubject(id.toString()); + } +} diff --git a/fumao-system/src/main/java/com/chilunyc/fumao/system/repository/SystemAdminRepository.java b/fumao-system/src/main/java/com/chilunyc/fumao/system/repository/SystemAdminRepository.java new file mode 100644 index 0000000..e199619 --- /dev/null +++ b/fumao-system/src/main/java/com/chilunyc/fumao/system/repository/SystemAdminRepository.java @@ -0,0 +1,16 @@ +package com.chilunyc.fumao.system.repository; + +import com.chilunyc.fumao.system.model.SystemAdmin; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +/** + * + */ +public interface SystemAdminRepository extends JpaRepository, JpaSpecificationExecutor { + + SystemAdmin findByMobile(String mobile); + + boolean existsByMobile(String mobile); + +} diff --git a/fumao-system/src/main/java/com/chilunyc/fumao/system/request/.gitkeep b/fumao-system/src/main/java/com/chilunyc/fumao/system/request/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/fumao-system/src/main/java/com/chilunyc/fumao/system/request/systemAdmin/SystemAdminEditRequest.java b/fumao-system/src/main/java/com/chilunyc/fumao/system/request/systemAdmin/SystemAdminEditRequest.java new file mode 100644 index 0000000..4534dd6 --- /dev/null +++ b/fumao-system/src/main/java/com/chilunyc/fumao/system/request/systemAdmin/SystemAdminEditRequest.java @@ -0,0 +1,38 @@ +package com.chilunyc.fumao.system.request.systemAdmin; + +import org.hibernate.validator.constraints.*; +import javax.validation.constraints.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; +import java.lang.Long; +import java.lang.String; +import java.lang.String; +import java.lang.String; +import java.lang.String; + +/** +* +*/ +@ApiModel +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class SystemAdminEditRequest { + + private String id; + + + @NotBlank(message = "请输入名称") + @ApiModelProperty(value = "名称") + private String name; + + @Pattern(regexp = "[\\w]{6,18}", message = "请输入6-18位密码") + @ApiModelProperty(value = "密码") + private String password; + + @Pattern(regexp = "1[\\d]{10}", message = "请输入11位手机号") + @ApiModelProperty(value = "手机号") + private String mobile; +} diff --git a/fumao-system/src/main/java/com/chilunyc/fumao/system/request/systemAdmin/SystemAdminPageRequest.java b/fumao-system/src/main/java/com/chilunyc/fumao/system/request/systemAdmin/SystemAdminPageRequest.java new file mode 100644 index 0000000..deecadf --- /dev/null +++ b/fumao-system/src/main/java/com/chilunyc/fumao/system/request/systemAdmin/SystemAdminPageRequest.java @@ -0,0 +1,17 @@ +package com.chilunyc.fumao.system.request.systemAdmin; + +import com.chilunyc.fumao.common.request.PageRequest; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.lang.String; + +/** +* +*/ +@Data +public class SystemAdminPageRequest extends PageRequest { + + @ApiModelProperty(value = "名称") + private String name; +} diff --git a/fumao-system/src/main/java/com/chilunyc/fumao/system/response/.gitkeep b/fumao-system/src/main/java/com/chilunyc/fumao/system/response/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/fumao-system/src/main/java/com/chilunyc/fumao/system/service/SystemAdminService.java b/fumao-system/src/main/java/com/chilunyc/fumao/system/service/SystemAdminService.java new file mode 100644 index 0000000..bf98a55 --- /dev/null +++ b/fumao-system/src/main/java/com/chilunyc/fumao/system/service/SystemAdminService.java @@ -0,0 +1,93 @@ +package com.chilunyc.fumao.system.service; + +import com.chilunyc.fumao.common.context.RequestHolder; +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.request.IdsRequest; +import com.chilunyc.fumao.common.request.LoginRequest; +import com.chilunyc.fumao.common.util.jpa.query.QueryBuilder; +import com.chilunyc.fumao.common.util.security.SaltHelper; +import com.chilunyc.fumao.system.model.SystemAdmin; +import com.chilunyc.fumao.system.repository.SystemAdminRepository; +import com.chilunyc.fumao.system.request.systemAdmin.SystemAdminEditRequest; +import com.chilunyc.fumao.system.request.systemAdmin.SystemAdminPageRequest; +import lombok.extern.log4j.Log4j; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * + */ +@Log4j +@Service +@Transactional +public class SystemAdminService implements InitializingBean { + + + @Autowired + private SystemAdminRepository systemAdminRepository; + + @Autowired + private EventService eventService; + + public Page page(SystemAdminPageRequest request) { + return systemAdminRepository.findAll(QueryBuilder.build(request), request.getPage()); + } + + + public SystemAdmin find(Long id) { + SystemAdmin one = systemAdminRepository.findOne(id); + return one; + } + + + public SystemAdmin edit(SystemAdminEditRequest request) { + SystemAdmin systemAdmin = new SystemAdmin(); + systemAdmin = systemAdminRepository.save(systemAdmin); + eventService.add(RequestHolder.get(), EventTarget.System, EventType.编辑系统管理员, systemAdmin.getId(), request); + return systemAdmin; + } + + public void remove(IdsRequest request) { + request + .getIds() + .forEach((id) -> { + systemAdminRepository.delete(id); + }); + eventService.add(RequestHolder.get(), EventTarget.System, EventType.删除系统管理员, null, request.getIds()); + } + + + @Override + public void afterPropertiesSet() throws Exception { + if (systemAdminRepository.existsByMobile("13888888888")) { + return; + } + String salt = SaltHelper.salt(); + systemAdminRepository.save( + SystemAdmin + .builder() + .mobile("13888888888") + .name("Tkk") + .salt(salt) + .password(SaltHelper.exec("!admin123", salt)) + .build() + ); + } + + public SystemAdmin login(LoginRequest request) { + SystemAdmin systemAdmin = systemAdminRepository.findByMobile(request.getMobile()); + if (systemAdmin == null) { + throw new SystemException("000004"); + } else if (SaltHelper.isEquals(systemAdmin.getPassword(), request.getPassword(), systemAdmin.getSalt())) { + return systemAdmin; + } else { + throw new SystemException("000004"); + } + } +} diff --git a/fumao-system/src/main/resources/com/chilunyc/fumao/system/repository/.gitkeep b/fumao-system/src/main/resources/com/chilunyc/fumao/system/repository/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..f403325 --- /dev/null +++ b/pom.xml @@ -0,0 +1,106 @@ + + + 4.0.0 + + com.aki + fumao + 0.0.1-SNAPSHOT + + fumao-app + fumao-common + fumao-service + fumao-system + fumao-company + + pom + + fumao + + + org.springframework.boot + spring-boot-starter-parent + 1.5.11.RELEASE + + + + 1.8 + 0.6.0 + 2.7.0 + 3.0.0 + UTF-8 + UTF-8 + + + + + + + io.springfox + springfox-swagger2 + ${springfox.version} + + + io.springfox + springfox-swagger-ui + ${springfox.version} + + + + + org.springframework.boot + spring-boot-starter-aop + + + + + com.fasterxml.jackson.core + jackson-core + 2.8.7 + + + com.fasterxml.jackson.core + jackson-annotations + 2.6.7 + + + com.fasterxml.jackson.core + jackson-databind + 2.6.7 + + + + + + + + + + nexus-aliyun + Nexus aliyun + http://maven.aliyun.com/nexus/content/groups/public + + true + + + false + + + + + + + nexus-aliyun + Nexus aliyun + http://maven.aliyun.com/nexus/content/groups/public + + true + + + false + + + + + +