初始化提交

This commit is contained in:
2021-01-20 18:26:47 +08:00
commit 2cedd64270
70 changed files with 3423 additions and 0 deletions

18
.gitignore vendored Normal file
View File

@ -0,0 +1,18 @@
target/
**/target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
*.iml
.idea
modules/log
modules/logs
.project
.settings
.classpath
logs

1
README.md Normal file
View File

@ -0,0 +1 @@
协同办公应用端

159
cooperop-app-base/pom.xml Normal file
View File

@ -0,0 +1,159 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>business.chaoran</groupId>
<artifactId>cooperop-app</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>business.chaoran</groupId>
<artifactId>cooperop-app-base</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cooperop-app-base</name>
<description>Demo project for Spring Boot</description>
<dependencies>
<!--app-common-->
<dependency>
<groupId>business.chaoran</groupId>
<artifactId>cooperop-app-common</artifactId>
</dependency>
<dependency>
<groupId>business.chaoran</groupId>
<artifactId>web</artifactId>
</dependency>
<!--base-message-->
<dependency>
<groupId>business.chaoran</groupId>
<artifactId>cooperop-base-message</artifactId>
</dependency>
<!--spring-boot-starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--spring-boot-starter-web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--rabbitmq-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--mysql-connector-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<!--swagger-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
</dependency>
<!--test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<configurationFile>src/main/resources/mybatis-generator/generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<phase>deploy</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<finalName>cooperop-app-base-${project.version}</finalName>
</build>
</project>

View File

@ -0,0 +1,19 @@
package business.cooperop.base;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import springfox.documentation.oas.annotations.EnableOpenApi;
@SpringBootApplication
@EnableOpenApi
@EnableDiscoveryClient
@MapperScan("business.cooperop.base.mapper")
public class CooperopAppBaseApplication {
public static void main(String[] args) {
SpringApplication.run(CooperopAppBaseApplication.class, args);
}
}

View File

@ -0,0 +1,76 @@
package business.cooperop.base.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.support.converter.ContentTypeDelegatingMessageConverter;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 消息设置
* 监听 company_application_popedom表的操作
*/
@Configuration
@Slf4j
public class BusConfig {
public static final String QUEUE_NAME = "event-organization";
public static final String EXCHANGE_NAME = "spring-boot-exchange";
public static final String ROUTING_KEY = "organization-popedom";
/**
* 设置消息队列
*
* @return
*/
@Bean
Queue queue() {
log.info("queue name:{}", QUEUE_NAME);
return new Queue(QUEUE_NAME, false);
}
/**
* 设置主题交换机
*
* @return
*/
@Bean
TopicExchange exchange() {
log.info("exchange:{}", EXCHANGE_NAME);
return new TopicExchange(EXCHANGE_NAME);
}
/**
* 绑定队列到主题交换机,并设置关联键
*
* @param queue
* @param exchange
* @return
*/
@Bean
Binding binding(Queue queue, TopicExchange exchange) {
log.info("binding {} to {} with {}", queue, exchange, ROUTING_KEY);
return BindingBuilder.bind(queue).to(exchange).with(ROUTING_KEY);
}
/**
* 设置消息体用jackson序列化
*
* @return
*/
@Bean
public MessageConverter messageConverter() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
return new ContentTypeDelegatingMessageConverter(new Jackson2JsonMessageConverter(objectMapper));
}
}

View File

@ -0,0 +1,29 @@
package business.cooperop.base.config;
import business.cooperop.base.message.InternalMessage;
import business.cooperop.base.message.InternalMessageImpl;
import business.cooperop.base.message.email.service.EmailService;
import business.cooperop.base.message.email.service.impl.EmailServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 天下风云出我辈, 一入代码岁月催
*
* @Author: deadline
* @Date: 2020-12-22 16:13
*/
@Configuration
public class EmailConfig {
@Bean
public EmailService emailService() {
return new EmailServiceImpl();
}
@Bean
public InternalMessage internalMessage(){
return new InternalMessageImpl();
}
}

View File

@ -0,0 +1,36 @@
package business.cooperop.base.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
/**
* 全局跨域配置
* @Author: deadline
* @Date: 2020-12-30 11:01
*/
@Configuration
public class GlobalCorsConfig {
/**
* 允许跨域调用的过滤器
*/
@Bean
public CorsFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
//允许所有域名进行跨域调用
config.addAllowedOrigin("*");
//允许跨越发送cookie
config.setAllowCredentials(true);
//放行全部原始头信息
config.addAllowedHeader("*");
//允许所有请求方法跨域调用
config.addAllowedMethod("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}

View File

@ -0,0 +1,27 @@
package business.cooperop.base.config;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* mybatis配置类, 指定扫描位置, 并开启事务
*
* @Author: deadline
* @Date: 2020-12-29 14:09
*/
@Configuration
public class MybatisConfig {
// mybatis分页插件
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
//你的最大单页限制数量,默认 500 条,小于 0 如 -1 不受限制
paginationInterceptor.setLimit(10); //设置每次查询10条数据
return paginationInterceptor;
}
}

View File

@ -0,0 +1,43 @@
package business.cooperop.base.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
/**
* swagger配置类
* @Author: deadline
* @Date: 2021-01-04 20:55
*/
@Configuration
public class SwaggerConfig {
Boolean swaggerEnabled = true;
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.OAS_30).apiInfo(apiInfo())
// 是否开启
.enable(swaggerEnabled).select()
// 扫描的路径包
.apis(RequestHandlerSelectors.basePackage("business.cooperop.base"))
// 指定路径处理PathSelectors.any()代表所有的路径
.paths(PathSelectors.any()).build().pathMapping("/");
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("连锁ERP管理端API")
.description("springboot | swagger")
// 作者信息
.contact(new Contact("成都超然祥润科技有电公司", "chaoran.crtech.cn:8848/nacos", "crtech.163.com"))
.version("1.0.0")
.build();
}
}

View File

@ -0,0 +1,145 @@
package business.cooperop.base.controller;
import business.cooperop.base.dto.AuthNodeDto;
import business.cooperop.base.entity.ApplicationGrade;
import business.cooperop.base.entity.ApplicationPopedom;
import business.cooperop.base.entity.base.ResultPage;
import business.cooperop.base.service.IProductService;
import business.cooperop.base.vo.PopedomVo;
import business.cooperop.common.constant.ResultCode;
import business.cooperop.common.result.Result;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @Author: deadline
* @Date: 2020-12-29 12:01
*/
@Api(tags = {"应用管理API"})
@RestController
@RequestMapping("/app_manager")
public class ApplicationController {
@Autowired
IProductService applicationService;
@ApiOperation("获取权限树")
@PostMapping("/getTree")
public Result getTree() {
List<AuthNodeDto> result = applicationService.getTree();
return Result.success(result);
}
@ApiOperation("添加应用或节点, 若添加应用会同时添加该应用的根节点")
@PostMapping("/addAppChildren")
public Result addAppChildren(@RequestBody PopedomVo popedomVo) {
boolean isSuccess = applicationService.addAppChildren(popedomVo);
if (isSuccess) {
return Result.success();
}
return Result.failed();
}
@ApiOperation("更新应用信息或子节点信息")
@PostMapping("/updateAppChildren")
public Result updateAppChildren(@RequestBody PopedomVo popedomVo) {
boolean isSuccess = applicationService.updateAppChildren(popedomVo);
if (isSuccess) {
return Result.success();
}
return Result.failed();
}
@ApiOperation("删除应用, 会删除该应用所有子节点")
@PostMapping("/delApplication")
public Result delApplication(@RequestParam("applicationCode") String applicationCode) {
boolean isSuccess = applicationService.delApplication(applicationCode);
if (isSuccess) {
return Result.success();
}
return Result.failed();
}
@ApiOperation("根据传入节点id, 查询应用或权限节点信息")
@PostMapping("/getAppChildrenInfo")
public Result getAppChildrenInfo(@RequestParam("popedomId") String popedomId) {
ApplicationPopedom popedom = applicationService.getAppChildrenInfo(popedomId);
return Result.success(popedom);
}
@ApiOperation("删除应用子节点")
@PostMapping("/delAppChildren")
public Result delAppChildren(@RequestParam("id") String id) {
boolean isSuccess = applicationService.delAppChildren(null, id);
if (isSuccess) {
return Result.success();
}
return Result.failed();
}
@ApiOperation("添加应用权限节点时, 获取下一个节点的id")
@PostMapping("/getNextNodeId")
public Result getNextNodeId(@RequestParam(name = "parentId", defaultValue = "") String parentId) {
AuthNodeDto nextNode = applicationService.getNextNodeId(parentId);
if (nextNode == null) {
return Result.failed();
}
return Result.success(nextNode);
}
@ApiOperation("添加应用等级")
@PostMapping("/addAppGrade")
public Result addAppGrade(@RequestBody ApplicationGrade applicationGrade) {
int i = applicationService.addAppGrade(applicationGrade);
if (i > 0) {
return Result.success();
}
return Result.failed();
}
@ApiOperation("根据应用code查询应用所有等级")
@GetMapping("/appGradeList")
public Result appGradeList(@RequestParam("applicationCode") String applicationCode,
@RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
@RequestParam(value = "pageSize", defaultValue = "25") int pageSize) {
IPage<ApplicationGrade> pageInfo = applicationService.appGradeList(applicationCode, pageNum, pageSize);
if (pageInfo != null) {
return new ResultPage(ResultCode.SUCCESS, pageInfo, pageInfo.getRecords());
}
return Result.failed();
}
@ApiOperation("根据传入参数获取单个应用等级信息")
@GetMapping("/getAppGrade")
public Result getAppGrade(@RequestParam("applicationCode") String applicationCode,
@RequestParam("grade") int grade) {
ApplicationGrade appGrade = applicationService.getAppGrade(applicationCode, grade);
if (appGrade != null) {
return Result.success(appGrade);
}
return Result.failed();
}
@ApiOperation("更新应用等级信息")
@PutMapping("/updateAppGrade")
public Result updateAppGrade(@RequestBody ApplicationGrade applicationGrade) {
int i = applicationService.updateAppGrade(applicationGrade);
if (i > 0) {
return Result.success();
}
return Result.failed();
}
}

View File

@ -0,0 +1,40 @@
package business.cooperop.base.controller;
/*
**********************************************
* DATE PERSON REASON
* 2021-01-13 FXY Created
**********************************************
*/
import business.cooperop.base.entity.Company;
import business.cooperop.base.service.ICompanyService;
import business.cooperop.common.result.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Optional;
@RestController
@RequestMapping("/company")
public class CompanyController{
@Autowired
ICompanyService iCompanyService;
@GetMapping("/getCompanyList")
public Result getCompanyList(){
return Result.success(iCompanyService.getAllCompany());
}
@GetMapping("/getCompanyInfo")
public Result getCompanyInfo(@RequestParam("companyId")String companyId){
return Result.success(iCompanyService.getCompany(companyId));
}
@GetMapping("/saveCompany")
public Result insertCompany(@RequestBody Company company){
Optional.ofNullable(company).orElseThrow()
return Result.success(iCompanyService.saveCompany(company));
}
}

View File

@ -0,0 +1,35 @@
package business.cooperop.base.controller;
/*
**********************************************
* DATE PERSON REASON
* 2021-01-12 FXY Created
**********************************************
*/
import lombok.Getter;
import lombok.Setter;
import javax.servlet.http.HttpServletRequest;
import java.util.Optional;
@Getter
@Setter
public abstract class PageRequest {
private Integer page = null;
private Integer size = null;
private static final String PAGE = "page";
private static final String SIZE = "size";
//计算分页参数和数据库类型
protected void calcRequestParams(HttpServletRequest request) {
this.page = Integer.parseInt(Optional.ofNullable(request.getParameter(PAGE)).orElseGet(() -> "1"));
this.size = Integer.parseInt(Optional.ofNullable(request.getParameter(SIZE)).orElseGet(() -> "10"));
}
}

View File

@ -0,0 +1,44 @@
package business.cooperop.base.controller;
import business.cooperop.base.entity.User;
import business.cooperop.base.service.IUserService;
import business.cooperop.common.constant.ResultCode;
import business.cooperop.common.exception.DefaultException;
import business.cooperop.common.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Optional;
/**
* @Author: deadline
* @Date: 2021-01-05 10:12
*/
@Api(tags = {"用户管理"})
@RestController
@RequestMapping("/user_manager")
public class UserController {
@Autowired
IUserService userService;
@ApiOperation("获取用户信息")
@PostMapping("/getUserInfo")
public Result getUserInfo(@RequestParam(name = "userId") String userId) {
User user = userService.getUserInfo(userId);
if (user == null) {
return Result.failed("用户不存在");
}
return Result.success(user);
}
@ApiOperation("根据账号获取用户信息")
@GetMapping("/getUser")
public Result getUser(@RequestParam(name = "username") String username) {
Optional.ofNullable(username).orElseThrow(() -> DefaultException.simple(ResultCode.PARAM_IS_INVALID));
return Result.success(userService.getUserByUsername(username));
}
}

View File

@ -0,0 +1,25 @@
package business.cooperop.base.controller.advice;
import business.cooperop.common.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* @Author: deadline
* @Date: 2021-01-04 15:39
*/
@Slf4j
@RestControllerAdvice
public class AdviceController {
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler(Exception.class)
public Result exceptionHandler(Exception exception) {
log.error("发生异常: {}", exception);
return Result.failed(exception.getMessage());
}
}

View File

@ -0,0 +1,38 @@
package business.cooperop.base.dto;
import business.cooperop.base.entity.ApplicationPopedom;
import business.cooperop.common.utils.BeanUtilsV2;
import lombok.Data;
import java.util.List;
/**
* 权限节点, 用于构建前端展示应用权限树
*
* @Author: deadline
* @Date: 2020-12-29 15:08
*/
@Data
public class AuthNodeDto {
private String applicationCode;
private String id;
private String name;
private String title;
private String parentId;
private String url;
private String icon;
private Integer isMenu;
private Integer orderNo;
private String description;
public AuthNodeDto(ApplicationPopedom popedom) {
BeanUtilsV2.copyProperties(popedom, this);
}
// 存放节点下的节点
private List<AuthNodeDto> children;
public AuthNodeDto() {
}
}

View File

@ -0,0 +1,23 @@
package business.cooperop.base.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.util.Date;
@Data
public class Application {
@TableId
private String code;
private String name;
private Integer type;
private Date deployedTime;
private Integer orderNo;
private String description;
}

View File

@ -0,0 +1,16 @@
package business.cooperop.base.entity;
import lombok.Data;
@Data
public class ApplicationGrade {
private Boolean isFree;
private String applicationCode;
private Integer grade;
private String description;
private String name;
}

View File

@ -0,0 +1,12 @@
package business.cooperop.base.entity;
import lombok.Data;
@Data
public class ApplicationGradePopedom {
private String applicationCode;
private Short grade;
private String popedomId;
}

View File

@ -0,0 +1,40 @@
package business.cooperop.base.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
@Data
public class ApplicationPopedom {
@TableId
private String id;
private String applicationCode;
private String name;
private String parentId;
private String url;
private String icon;
private Integer isMenu;
private Integer orderNo;
private String path;
private String redirect;
private String component;
private String title;
private Boolean alwaysShow;
private Boolean hidden;
private String description;
}

View File

@ -0,0 +1,76 @@
package business.cooperop.base.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class Company {
@TableId
private String id;
private String name;
private String registerId;
private String ownerId;
private Date registryTime;
private String businessLicense;
private String lastModifier;
private Date lastModifyTime;
private String province;
private String city;
private String county;
private String street;
private BigDecimal longitude;
private BigDecimal latitude;
private Byte state;
private String grade;
private String contacter;
private String mobile;
private String tel;
private String email;
private String weixin;
private Boolean isFranchiser;
private Boolean isIsv;
private String serviceTime;
private String hotlinePhone;
private String logo;
private String logoW;
private String icpNo;
private String shortName;
private String address;
private String description;
private String photo;
}

View File

@ -0,0 +1,22 @@
package business.cooperop.base.entity;
import lombok.Data;
import java.util.Date;
@Data
public class CompanyApplicationLicense{
private String franchiserId;
private Date expireDate;
private Boolean isForever;
private String state;
private String companyId;
private String applicationCode;
private Integer grade;
}

View File

@ -0,0 +1,20 @@
package business.cooperop.base.entity;
import lombok.Data;
@Data
public class CompanyApplicationPopedom {
private String applicationCode;
private String companyId;
private String popedomId;
public CompanyApplicationPopedom(ApplicationPopedom applicationPopedom) {
this.applicationCode=applicationPopedom.getApplicationCode();
this.popedomId=applicationPopedom.getId();
}
public CompanyApplicationPopedom() {
}
}

View File

@ -0,0 +1,21 @@
package business.cooperop.base.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
@Data
public class CompanyRole {
@TableId
private String id;
private String companyId;
private String name;
private String remark;
}

View File

@ -0,0 +1,14 @@
package business.cooperop.base.entity;
import lombok.Data;
@Data
public class CompanyRolePopedom {
private String companyId;
private String roleId;
private String applicationCode;
private String popedomId;
}

View File

@ -0,0 +1,11 @@
package business.cooperop.base.entity;
import lombok.Data;
@Data
public class CompanyRoleUser{
private Boolean isDefault;
private String roleId;
private String userId;
private String companyId;
}

View File

@ -0,0 +1,22 @@
package business.cooperop.base.entity;
import lombok.Data;
@Data
public class CompanyUser {
private String companyId;
private String userId;
private String organizationId;
private String empNo;
private String position;
private Boolean isDefault;
private Boolean state;
private String mobile;
}

View File

@ -0,0 +1,49 @@
package business.cooperop.base.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import java.util.Date;
@Data
public class User {
@TableId
private String id;
private String name;
private String mobile;
private String email;
private String nickName;
private String photo;
@JsonIgnore
private String lastModifier;
@JsonIgnore
private Date lastModifyTime;
@JsonIgnore
private Byte state;
@JsonIgnore
private String identity;
private String avatar;
private String signature;
@JsonIgnore
private String password;
private String username;
private Date registryTime;
private String introduce;
}

View File

@ -0,0 +1,72 @@
package business.cooperop.base.entity.base;
/*
**********************************************
* DATE PERSON REASON
* 2021-01-12 FXY Created
**********************************************
*/
import business.cooperop.common.constant.ResultCode;
import business.cooperop.common.result.Result;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class ResultPage extends Result {
//总的数据条数
private long totalElements;
//总页数
private long totalPages;
//当前页数
private long number;
//每页大小
private long size;
//当前页查询出的数据条数
private long numberOfElements;
//是否是第一页数据
private boolean first;
//是否是最后一页数据
private boolean last;
//是否有上一页数据
private boolean previous;
//是否有下一页数据
private boolean next;
public ResultPage(IPage iPage) {
this.first = iPage.getCurrent() == 1;
this.number = iPage.getCurrent();
this.totalElements = iPage.getTotal();
//每页条数*当前页==总条数,则表示是最后一页
this.last = iPage.getCurrent() == iPage.getPages();
this.previous = iPage.getCurrent() != 1;
this.next = iPage.getCurrent() != iPage.getPages();
this.totalPages = iPage.getPages();
this.numberOfElements = iPage.getRecords().size();
this.size = iPage.getSize();
}
public ResultPage(ResultCode resultCode, IPage iPage) {
this(iPage);
this.setResultCode(resultCode);
}
public ResultPage(ResultCode resultCode, IPage iPage, Object data) {
this(resultCode, iPage);
this.setData(data);
}
}

View File

@ -0,0 +1,31 @@
package business.cooperop.base.events;
import business.cooperop.base.config.BusConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
@Slf4j
public class EventSender {
@Autowired
private RabbitTemplate rabbitTemplate;
@Autowired
private MessageConverter messageConverter;
@PostConstruct
public void init() {
rabbitTemplate.setMessageConverter(messageConverter);
}
public void send(String routingKey, Object object) {
log.info("routingKey:{}=>message:{}", routingKey, object);
rabbitTemplate.convertAndSend(BusConfig.EXCHANGE_NAME, routingKey, object);
}
}

View File

@ -0,0 +1,56 @@
package business.cooperop.base.filter;
/*
**********************************************
* DATE PERSON REASON
* 2020-12-24 FXY Created
**********************************************
*/
import com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.annotation.Configuration;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.Query;
import java.lang.management.ManagementFactory;
import java.util.Set;
//@Configuration
@Slf4j
public class NacosRegisterConfig implements ApplicationRunner {
@Autowired(required = false)
private NacosAutoServiceRegistration registration;
private Integer port;
public NacosRegisterConfig() {
try {
this.port = Integer.parseInt(getTomcatPort());
} catch (Exception e) {
log.error("获取tomcat端口出错了原因{}", e.toString());
}
}
@Override
public void run(ApplicationArguments args) {
if (registration != null && port != null) {
registration.setPort(port);
registration.start();
}
}
//获取tomcat端口
private String getTomcatPort() throws Exception {
MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer();
Set<ObjectName> objectNames = beanServer.queryNames(new ObjectName("*:type=Connector,*"), Query.match(Query.attr("protocol"), Query.value("HTTP/1.1")));
String port = objectNames.iterator().next().getKeyProperty("port");
return port;
}
}

View File

@ -0,0 +1,26 @@
package business.cooperop.base.filter;
import com.springboot.cloud.common.web.interceptor.UserInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 正式环境运行去掉注释
*/
//@Configuration
public class WebServerMvcConfigurerAdapter implements WebMvcConfigurer {
// @Bean
public HandlerInterceptor userInterceptor() {
return new UserInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(userInterceptor());
}
}

View File

@ -0,0 +1,9 @@
package business.cooperop.base.mapper;
import business.cooperop.base.entity.ApplicationGrade;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface ApplicationGradeMapper extends BaseMapper<ApplicationGrade> {
}

View File

@ -0,0 +1,9 @@
package business.cooperop.base.mapper;
import business.cooperop.base.entity.ApplicationGradePopedom;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface ApplicationGradePopedomMapper extends BaseMapper<ApplicationGradePopedom> {
}

View File

@ -0,0 +1,9 @@
package business.cooperop.base.mapper;
import business.cooperop.base.entity.Application;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface ApplicationMapper extends BaseMapper<Application> {
}

View File

@ -0,0 +1,9 @@
package business.cooperop.base.mapper;
import business.cooperop.base.entity.ApplicationPopedom;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface ApplicationPopedomMapper extends BaseMapper<ApplicationPopedom> {
}

View File

@ -0,0 +1,9 @@
package business.cooperop.base.mapper;
import business.cooperop.base.entity.CompanyApplicationLicense;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface CompanyApplicationLicenseMapper extends BaseMapper<CompanyApplicationLicense> {
}

View File

@ -0,0 +1,7 @@
package business.cooperop.base.mapper;
import business.cooperop.base.entity.CompanyApplicationPopedom;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface CompanyApplicationPopedomMapper extends BaseMapper<CompanyApplicationPopedom> {
}

View File

@ -0,0 +1,9 @@
package business.cooperop.base.mapper;
import business.cooperop.base.entity.Company;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface CompanyMapper extends BaseMapper<Company> {
}

View File

@ -0,0 +1,9 @@
package business.cooperop.base.mapper;
import business.cooperop.base.entity.CompanyRole;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface CompanyRoleMapper extends BaseMapper<CompanyRole> {
}

View File

@ -0,0 +1,9 @@
package business.cooperop.base.mapper;
import business.cooperop.base.entity.CompanyRolePopedom;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface CompanyRolePopedomMapper extends BaseMapper<CompanyRolePopedom> {
}

View File

@ -0,0 +1,9 @@
package business.cooperop.base.mapper;
import business.cooperop.base.entity.CompanyRole;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface CompanyRoleUserMapper extends BaseMapper<CompanyRole> {
}

View File

@ -0,0 +1,9 @@
package business.cooperop.base.mapper;
import business.cooperop.base.entity.CompanyUser;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface CompanyUserMapper extends BaseMapper<CompanyUser> {
}

View File

@ -0,0 +1,9 @@
package business.cooperop.base.mapper;
import business.cooperop.base.entity.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper extends BaseMapper<User> {
}

View File

@ -0,0 +1,24 @@
package business.cooperop.base.message;
//import business.cooperop.base.entity.Message;
import org.springframework.context.annotation.Bean;
import java.util.Map;
/**
* 内部消息接口
* @author inaisen
*/
public interface InternalMessage {
/**
* 设置内部消息接口
*/
// void settingInternalMessage(Message message);
/**
* 查询内部消息接口
*/
void queryInternalMessage();
}

View File

@ -0,0 +1,32 @@
package business.cooperop.base.message;
/*import business.cooperop.base.entity.Message;
import business.cooperop.base.mapper.InrernalMessageMapper;*/
import org.springframework.beans.factory.annotation.Autowired;
/**
* 内部消息接口实现
* @author inaisen
*/
public class InternalMessageImpl implements InternalMessage {
@Autowired
// private InrernalMessageMapper inrernalMessageMapper;
/**
* 设置内部消息
*/
/*@Override
public void settingInternalMessage(Message message) {
inrernalMessageMapper.settingInternalMessage(message);
}*/
/**
* 查询内部消息
*/
@Override
public void queryInternalMessage() {
}
}

View File

@ -0,0 +1,46 @@
package business.cooperop.base.service;
/*
**********************************************
* DATE PERSON REASON
* 2021-01-13 FXY Created
**********************************************
*/
import business.cooperop.base.entity.Company;
import java.util.List;
import java.util.Map;
public interface ICompanyService {
/**
* 获取所有公司列表
* @return
*/
List<Company> getAllCompany();
/**
* 获取指定公司信息
* @param companyId
* @return
*/
Company getCompany(String companyId);
/**
* 保存公司信息
* @param company
* @return
*/
boolean saveCompany(Company company);
/**
* 保存公司许可证
* @param params
* @return
*/
boolean addCompanyLicense(Map<String, Object> params);
}

View File

@ -0,0 +1,109 @@
package business.cooperop.base.service;
import business.cooperop.base.dto.AuthNodeDto;
import business.cooperop.base.entity.ApplicationGrade;
import business.cooperop.base.entity.ApplicationPopedom;
import business.cooperop.base.vo.PopedomVo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.util.List;
/**
* 应用管理service
*
* @Author: deadline
* @Date: 2020-12-29 12:02
*/
public interface IProductService {
/**
* 获取应用权限树
*
* @return
*/
List<AuthNodeDto> getTree();
/**
* 新增应用或应用子权限节点
*
* @param popedomVo
* @return
*/
boolean addAppChildren(PopedomVo popedomVo);
/**
* 更新应用或子节点信息
*
* @param popedomVo
* @return
*/
boolean updateAppChildren(PopedomVo popedomVo);
/**
* 删除应用, 会同时删除所有子节点
*
* @param applicationCode
* @return
*/
boolean delApplication(String applicationCode);
/**
* 查询应用权限信息
*
* @param popedomId
* @return
*/
ApplicationPopedom getAppChildrenInfo(String popedomId);
/**
* 删除应用下的子权限
*
* @param applicationCode
* @param id
* @return
*/
boolean delAppChildren(String applicationCode, String id);
/**
* 根据传入父id, 获取下一个子节点id
*
* @param parentId
* @return
*/
AuthNodeDto getNextNodeId(String parentId);
/**
* 添加应用等级
*
* @param applicationGrade
* @return
*/
int addAppGrade(ApplicationGrade applicationGrade);
/**
* 根据应用code查询应用所有等级
*
* @param applicationCode
* @return
*/
IPage<ApplicationGrade> appGradeList(String applicationCode, int pageNum, int pageSize);
/**
* 根据传入参数获取单个应用等级信息
*
* @param applicationCode
* @param grade
* @return
*/
ApplicationGrade getAppGrade(String applicationCode, int grade);
/**
* 更新应用等级信息
*
* @param applicationGrade
* @return
*/
int updateAppGrade(ApplicationGrade applicationGrade);
}

View File

@ -0,0 +1,28 @@
package business.cooperop.base.service;
import business.cooperop.base.entity.User;
/**
* 用户管理service
* @Author: deadline
* @Date: 2021-01-05 10:14
*/
public interface IUserService {
/**
* 获取用户信息
*
* @param userId
* @return
*/
User getUserInfo(String userId);
/**
* 根据账号获取用户信息
* @param username
* @return
*/
User getUserByUsername(String username);
}

View File

@ -0,0 +1,102 @@
package business.cooperop.base.service.impl;
/*
**********************************************
* DATE PERSON REASON
* 2021-01-13 FXY Created
**********************************************
*/
import business.cooperop.base.config.BusConfig;
import business.cooperop.base.entity.*;
import business.cooperop.base.events.EventSender;
import business.cooperop.base.mapper.*;
import business.cooperop.base.service.ICompanyService;
import business.cooperop.common.constant.ResultCode;
import business.cooperop.common.exception.DefaultException;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
@Service
public class CompanyServiceImpl extends ServiceImpl<CompanyMapper, Company> implements ICompanyService {
@Autowired
CompanyApplicationPopedomMapper companyApplicationPopedomMapper;
@Autowired
ApplicationPopedomMapper applicationPopedomMapper;
@Autowired
ApplicationGradePopedomMapper applicationGradePopedomMapper;
@Autowired
CompanyApplicationLicenseMapper companyApplicationLicenseMapper;
@Autowired
EventSender eventSender;
@Override
public List<Company> getAllCompany() {
return list();
}
@Override
public Company getCompany(String companyId) {
QueryWrapper<Company> wrapper = new QueryWrapper<>();
wrapper.eq("id", companyId);
return getOne(wrapper);
}
@Override
@Transactional
public boolean saveCompany(Company company) {
return saveOrUpdate(company);
}
@Override
@Transactional
public boolean addCompanyLicense(Map<String, Object> params) {
Optional.ofNullable(params).orElseThrow(() -> DefaultException.simple(ResultCode.PARAM_NOT_COMPLETE));
String companyId = (String) Optional.ofNullable(params.get("companyId")).orElseGet(String::new);
String applicationCode = (String) Optional.ofNullable(params.get("applicationCode")).orElseGet(String::new);
Integer grade = (Integer) Optional.ofNullable(params.get("grade")).orElseGet(() -> -Integer.MAX_VALUE);
Date expireDate = (Date) Optional.ofNullable(params.get("expireDate")).orElseGet(Date::new);
List<String> selectedPopedomIds = (List<String>) Optional.ofNullable(params.get("selectedPopedomId")).orElseGet(ArrayList<String>::new);
//添加许可证信息
CompanyApplicationLicense companyApplicationLicense = new CompanyApplicationLicense();
companyApplicationLicense.setApplicationCode(applicationCode);
companyApplicationLicense.setCompanyId(companyId);
companyApplicationLicense.setExpireDate(expireDate);
companyApplicationLicense.setIsForever(false);
companyApplicationLicense.setState("1");
companyApplicationLicense.setGrade(grade);
companyApplicationLicenseMapper.insert(companyApplicationLicense);
//-1表示自定义功能
if (grade == -1) {
List<ApplicationPopedom> applicationPopedoms = applicationPopedomMapper.selectBatchIds(selectedPopedomIds);
List<CompanyApplicationPopedom> companyApplicationPopedoms = applicationPopedoms.stream().map(a -> new CompanyApplicationPopedom(a)).collect(Collectors.toList());
companyApplicationPopedoms.stream().forEach(a -> companyApplicationPopedomMapper.insert(a));
eventSender.send(BusConfig.ROUTING_KEY,companyApplicationPopedoms);
} else {
QueryWrapper<ApplicationGradePopedom> wrapper = new QueryWrapper<>();
wrapper.eq("grade", grade).eq("application_code", applicationCode);
List<ApplicationGradePopedom> applicationGradePopedoms = applicationGradePopedomMapper.selectList(wrapper);
List<ApplicationPopedom> applicationPopedoms = applicationPopedomMapper.selectBatchIds(applicationGradePopedoms.stream().map(a -> a.getPopedomId()).collect(Collectors.toList()));
List<CompanyApplicationPopedom> companyApplicationPopedoms = applicationPopedoms.stream().map(a -> new CompanyApplicationPopedom(a)).collect(Collectors.toList());
companyApplicationPopedoms.stream().forEach(a -> companyApplicationPopedomMapper.insert(a));
//发送消息
eventSender.send(BusConfig.ROUTING_KEY,companyApplicationPopedoms);
}
return false;
}
}

View File

@ -0,0 +1,296 @@
package business.cooperop.base.service.impl;
import business.cooperop.base.dto.AuthNodeDto;
import business.cooperop.base.entity.Application;
import business.cooperop.base.entity.ApplicationGrade;
import business.cooperop.base.entity.ApplicationPopedom;
import business.cooperop.base.mapper.ApplicationGradeMapper;
import business.cooperop.base.mapper.ApplicationMapper;
import business.cooperop.base.mapper.ApplicationPopedomMapper;
import business.cooperop.base.service.IProductService;
import business.cooperop.base.vo.PopedomVo;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* @Author: deadline
* @Date: 2020-12-29 14:08
*/
@Service
@Transactional
public class ProductServiceImpl extends ServiceImpl<ApplicationPopedomMapper, ApplicationPopedom> implements IProductService {
@Autowired
ApplicationMapper applicationMapper;
@Autowired
ApplicationGradeMapper applicationGradeMapper;
/**
* 获取应用权限树
*
* @return
*/
@Override
public List<AuthNodeDto> getTree() {
// 取得所有权限列表
List<AuthNodeDto> nodeAll = list().stream().map(a -> new AuthNodeDto(a)).collect(Collectors.toList());
// 存放去除顶级节点之后的所有节点
List<AuthNodeDto> newNodesAll = new ArrayList<>();
// 找出所有父节点
List<AuthNodeDto> topNodes = new ArrayList<>();
nodeAll.stream().forEach(node -> {
if (StringUtils.isEmpty(node.getParentId())) {
topNodes.add(node);
} else {
newNodesAll.add(node);
}
});
// 循环递归找出所有子节点
for (AuthNodeDto node : topNodes) {
List<AuthNodeDto> child = findChildrenNode(newNodesAll, node.getId());
node.setChildren(child);
}
// 节点排序
nodeSort(topNodes);
return topNodes;
}
/**
* 根据传入参数, 找到父节点的所有子节点
*
* @param resource 全量节点
* @param parent_id 父节点id
* @return
*/
private List<AuthNodeDto> findChildrenNode(List<AuthNodeDto> resource, String parent_id) {
// 子节点
List<AuthNodeDto> childList = new ArrayList<>();
// 找出传入parent_id的所有子节点
resource.stream().forEach(node -> {
if (parent_id.equals(node.getParentId())) {
childList.add(node);
}
});
// 没有子节点直接返回
if (childList.isEmpty()) {
return childList;
}
// 子节点排序
nodeSort(childList);
// 循环递归找出子节点中所有的子节点
for (AuthNodeDto node : childList) {
List<AuthNodeDto> child = findChildrenNode(resource, node.getId());
node.setChildren(child);
}
return childList;
}
/**
* 节点排序, 根据order_no
*
* @param nodes
*/
private void nodeSort(List<AuthNodeDto> nodes) {
nodes.sort((n1, n2) -> {
Integer orderN1 = n1.getOrderNo();
Integer orderN2 = n2.getOrderNo();
if (orderN1 == null || orderN2 == null) {
return 0;
}
return orderN1.compareTo(orderN2);
});
}
/**
* 新增应用或应用子权限节点
*
* @param popedomVo
* @return
*/
@Override
public boolean addAppChildren(PopedomVo popedomVo) {
ApplicationPopedom applicationPopedom = popedomVo.convertApplicationPopedom();
// 添加节点
if (popedomVo.getType() == null) {
return save(applicationPopedom);
}
// 添加应用
Application application = popedomVo.convertApplication();
applicationMapper.insert(application);
// 同时添加应用根节点
return save(applicationPopedom);
}
/**
* 修改应用或子权限节点信息
*
* @param popedomVo
* @return
*/
@Override
public boolean updateAppChildren(PopedomVo popedomVo) {
ApplicationPopedom applicationPopedom = popedomVo.convertApplicationPopedom();
// 更新节点
if (popedomVo.getType() == null) {
return updateById(applicationPopedom);
}
// 更新应用信息
Application application = popedomVo.convertApplication();
applicationMapper.updateById(application);
return updateById(applicationPopedom);
}
/**
* 删除应用, 会同时删除所有子节点
*
* @param applicationCode
* @return
*/
@Override
public boolean delApplication(String applicationCode) {
// 删除应用
applicationMapper.deleteById(applicationCode);
// 删除子节点
return delAppChildren(applicationCode, null);
}
/**
* 查询应用权限信息
*
* @param popedomId
* @return
*/
@Override
public ApplicationPopedom getAppChildrenInfo(String popedomId) {
QueryWrapper<ApplicationPopedom> wrapper = new QueryWrapper<>();
wrapper.eq("id", popedomId);
return getOne(wrapper);
}
/**
* 删除应用下的子权限
*
* @param applicationCode
* @param id
* @return
*/
@Override
public boolean delAppChildren(String applicationCode, String id) {
QueryWrapper<ApplicationPopedom> wrapper = new QueryWrapper<>();
if (StringUtils.isEmpty(id)) {
wrapper.eq("application_code", applicationCode);
} else {
wrapper.eq("application_code", applicationCode).eq("id", id);
}
return remove(wrapper);
}
/**
* 根据传入父id, 获取下一个子节点id
*
* @param parentId
* @return
*/
@Override
public AuthNodeDto getNextNodeId(String parentId) {
QueryWrapper<ApplicationPopedom> wrapper = new QueryWrapper<>();
if (StringUtils.isEmpty(parentId)) {
wrapper.eq("parent_id", null).or().eq("parent_id", "");
} else {
wrapper.eq("parent_id", parentId);
}
wrapper.orderByDesc("id");
AuthNodeDto authNodeDto = new AuthNodeDto(getOne(wrapper));
// 如果获取到的最大id节点为空, 说名下一个添加的节点为第一个节点
if (authNodeDto == null || StringUtils.isEmpty(authNodeDto.getId())) {
authNodeDto = new AuthNodeDto();
authNodeDto.setId(parentId + "01");
authNodeDto.setOrderNo(1);
return authNodeDto;
}
Integer id = Integer.valueOf(authNodeDto.getId()) + 1;
authNodeDto.setId("0" + id);
return authNodeDto;
}
/**
* 添加应用等级
*
* @param applicationGrade
* @return
*/
@Override
public int addAppGrade(ApplicationGrade applicationGrade) {
return applicationGradeMapper.insert(applicationGrade);
}
/**
* 根据应用code查询应用所有等级
*
* @param applicationCode
* @return
*/
@Override
public IPage<ApplicationGrade> appGradeList(String applicationCode, int pageNum, int pageSize) {
IPage<ApplicationGrade> page = new Page<>(pageNum, pageSize);
QueryWrapper<ApplicationGrade> wrapper = new QueryWrapper<>();
wrapper.eq("application_code", applicationCode);
IPage<ApplicationGrade> pageInfo = applicationGradeMapper.selectPage(page, wrapper);
return pageInfo;
}
/**
* 根据传入参数获取单个应用等级信息
*
* @param applicationCode
* @param grade
* @return
*/
@Override
public ApplicationGrade getAppGrade(String applicationCode, int grade) {
QueryWrapper<ApplicationGrade> wrapper = new QueryWrapper<>();
wrapper.eq("application_code", applicationCode).eq("grade", grade);
return applicationGradeMapper.selectOne(wrapper);
}
/**
* 更新应用等级信息
*
* @param applicationGrade
* @return
*/
@Override
public int updateAppGrade(ApplicationGrade applicationGrade) {
QueryWrapper<ApplicationGrade> wrapper = new QueryWrapper<>();
wrapper.eq("application_code", applicationGrade.getApplicationCode()).eq("grade", applicationGrade.getGrade());
return applicationGradeMapper.update(applicationGrade, wrapper);
}
}

View File

@ -0,0 +1,39 @@
package business.cooperop.base.service.impl;
import business.cooperop.base.entity.User;
import business.cooperop.base.mapper.UserMapper;
import business.cooperop.base.service.IUserService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* 用户管理service实现类
*
* @Author: deadline
* @Date: 2021-01-05 10:14
*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
/**
* 获取用户信息
*
* @param userId
* @return
*/
@Override
public User getUserInfo(String userId) {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("id", userId);
return getOne(wrapper);
}
@Override
public User getUserByUsername(String username) {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("username", username);
return getOne(wrapper);
}
}

View File

@ -0,0 +1,19 @@
package business.cooperop.base.vo;
import lombok.Data;
/**
* @author china
*/
@Data
public class CompanyVO {
private int limit;
private int start;
private String name;
private String businessLicense;
private String address;
private String mobile;
private String tel;
private String icpNo;
}

View File

@ -0,0 +1,72 @@
package business.cooperop.base.vo;
import business.cooperop.base.entity.Application;
import business.cooperop.base.entity.ApplicationPopedom;
import lombok.Data;
import java.util.Date;
/**
* 节点实体类, 用于接收传入参数
* @Author: deadline
* @Date: 2021-01-04 20:04
*/
@Data
public class PopedomVo {
private String applicationCode;
private String id;
private String name;
private String parentId;
private Integer type;
private String url;
private String icon;
private Integer isMenu;
private Integer orderNo;
private String description;
private String path;
private String redirect;
private String component;
private String title;
private Boolean alwaysShow;
private Boolean hidden;
/**
* 将popedom vo转换为application po
* @return
*/
public Application convertApplication() {
Application application = new Application();
application.setCode(this.applicationCode);
application.setName(this.name);
application.setType(this.type);
application.setDescription(this.description);
application.setDeployedTime(new Date());
application.setOrderNo(this.orderNo);
return application;
}
/**
* 将popedom vo转换为applicationPopedom po
* @return
*/
public ApplicationPopedom convertApplicationPopedom() {
ApplicationPopedom applicationPopedom = new ApplicationPopedom();
applicationPopedom.setApplicationCode(this.applicationCode);
applicationPopedom.setId(this.id);
applicationPopedom.setName(this.name);
applicationPopedom.setParentId(this.parentId);
applicationPopedom.setUrl(this.url);
applicationPopedom.setIcon(this.icon);
applicationPopedom.setIsMenu(this.isMenu);
applicationPopedom.setOrderNo(this.orderNo);
applicationPopedom.setDescription(this.description);
applicationPopedom.setPath(this.path);
applicationPopedom.setRedirect(this.redirect);
applicationPopedom.setComponent(this.component);
applicationPopedom.setTitle(this.title);
applicationPopedom.setAlwaysShow(this.alwaysShow);
applicationPopedom.setHidden(this.hidden);
return applicationPopedom;
}
}

View File

@ -0,0 +1,88 @@
server:
port: 8088
# QQ邮箱
spring:
mail:
host: smtp.qq.com #发送邮件服务器
username: 943359729@qq.com #发送邮件的邮箱地址
password: gemhokyelabnbfdb #客户端授权码不是邮箱密码这个在qq邮箱设置里面自动生成的
properties.mail.smtp.port: 465 #端口号465或587
from: 943359729@qq.com # 发送邮件的地址和上面username一致
properties.mail.smtp.starttls.enable: true
properties.mail.smtp.starttls.required: true
properties.mail.smtp.ssl.enable: true
default-encoding: utf-8
# 网易邮箱
#spring:
# mail:
# host: smtp.163.com #发送邮件服务器
# username: imayfly1997@163.com #发送邮件的邮箱地址
# password: GLMMWPUOLRFOWYBU #客户端授权码,不是邮箱密码,网易的是自己设置的
# properties.mail.smtp.port: 994 #465或者994
# from: imayfly1997@163.com # 发送邮件的地址和上面username一致
# properties.mail.smtp.starttls.enable: true
# properties.mail.smtp.starttls.required: true
# properties.mail.smtp.ssl.enable: true
# default-encoding: utf-8
# 连接池
datasource:
# 填写你数据库的url、登录名、密码和数据库名
url: jdbc:mysql://chaoran.crtech.cn:3506/xin_cloudauth?useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=CTT&allowPublicKeyRetrieval=true
username: root
password: www.Crtech2018.cn
druid:
# 连接池的配置信息
# 初始化大小,最小,最大
initial-size: 5
min-idle: 5
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 打开PSCache并且指定每个连接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置监控统计拦截的filters去掉后监控界面sql无法统计'wall'用于防火墙
filters: stat,wall,slf4j
# 通过connectProperties属性来打开mergeSql功能慢SQL记录
connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
# 配置DruidStatFilter
web-stat-filter:
enabled: true
url-pattern: "/*"
exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
# 配置DruidStatViewServlet
stat-view-servlet:
enabled: true
url-pattern: "/druid/*"
# IP白名单(没有配置或者为空,则允许所有访问)
allow: 127.0.0.1
# IP黑名单 (存在共同时deny优先于allow)
deny: all
# 禁用HTML页面上的“Reset All”功能
reset-enable: false
# 登录名
login-username: crtech
# 登录密码
login-password: Crtech@2020
driver-class-name: com.mysql.cj.jdbc.Driver
# pagehelper
#pagehelper:
# helperDialect: mysql
# reasonable: true
# supportMethodsArguments: true
# params: count=countSql
logging:
level:
bussiness.cooperop.base.mapper: debug

View File

@ -0,0 +1,10 @@
spring:
application:
name: app-base
cloud:
nacos:
discovery:
server-addr: ${REGISTER_HOST:localhost}:${REGISTER_PORT:8848}
config:
server-addr: ${REGISTER_HOST:localhost}:${REGISTER_PORT:8848}
file-extension: yml

View File

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<contextName>logback-spring</contextName>
<!--输出格式-->
<property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n"/>
<property name="pattern-color" value="%yellow(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %green(%logger{50}) - %highlight(%msg) %n"/>
<!--日志文件夹及路径-->
<property name="LOG_HOME" value="logs"/>
<!-- 控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!-- 控制台输出-带颜色 -->
<appender name="CONSOLE-WITH-COLOR" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern-color}</pattern>
</encoder>
</appender>
<!-- 文件输出 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/all.%d.%i.log</fileNamePattern>
<!--文件最大容量-->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--文件保存时间-->
<maxHistory>1</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${pattern}</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE-WITH-COLOR"/>
<appender-ref ref="FILE"/>
</root>
<logger name="com.example.logbackdemo.IndexAction" level="info" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
</configuration>

View File

@ -0,0 +1,116 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!--mysql 连接数据库jar 这里选择自己本地位置;
如果不知道maven本地仓库地址可以使用EveryThing工具全局搜索mysql-connector-java找到jar包位置
也可以手动下载一个jar放在指定位置进行引用。
-->
<!--
<classPathEntry location="E:/mvnRespo/mysql/mysql-connector-java/5.1.47/mysql-connector-java-5.1.47.jar"/>
-->
<context id="xin_cloudauth" targetRuntime="MyBatis3">
<property name="autoDelimitKeywords" value="true"/>
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<commentGenerator>
<property name="suppressDate" value="true"/>
<property name="javaFileEncoding" value="UTF-8"/>
<!-- 是否去除自动生成的注释,true是,false:否 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://chaoran.crtech.cn:3506/xin_cloudauth?characterEncoding=utf8" userId="root"
password="www.Crtech2018.cn">
<!--如果链接里边的其他数据库有同名字的表名,必须加此参数-->
<property name="nullCatalogMeansCurrent" value="true"/>
</jdbcConnection>
<!-- 默认false把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer为 true时把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 指定javaBean生成的位置
targetPackage生成的类要放的包真实的包受enableSubPackages属性控制
targetProject目标项目指定一个存在的目录下生成的内容会放到指定目录中如果目录不存在MBG不会自动建目录
-->
<javaModelGenerator targetPackage="business.cooperop.base.entity" targetProject="src/main/java">
<!-- 在targetPackage的基础上根据数据库的schema再生成一层package最终生成的类放在这个package下默认为false如果多个数据库改为true分目录 -->
<property name="enableSubPackages" value="false"/>
<!-- 设置是否在getter方法中对String类型字段调用trim()方法 -->
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 指定mapper映射文件生成的位置
targetPackage、targetProject同javaModelGenerator中作用一样-->
<sqlMapGenerator targetPackage="mapper1" targetProject="src/main/resources">
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<!-- 指定mapper接口生成的位置
targetPackage、targetProject同javaModelGenerator中作用一样
-->
<javaClientGenerator type="XMLMAPPER" targetPackage="business.cooperop.base.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
<!-- 指定数据库表
domainObjectName生成的domain类的名字,当表名和domain类的名字有差异时一定要设置如果不设置直接使用表名作为domain类的名字
可以设置为somepck.domainName那么会自动把domainName类再放到somepck包里面
<table tableName="tb_user" domainObjectName="Company" ></table>
不生成Example类
enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" selectByExampleQueryId="false" domainObjectName="Company"
-->
<!-- <table tableName="application" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"-->
<!-- enableSelectByExample="false" selectByExampleQueryId="false">-->
<!-- </table>-->
<!-- <table tableName="application_grade" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"-->
<!-- enableSelectByExample="false" selectByExampleQueryId="false">-->
<!-- </table>-->
<!-- <table tableName="application_grade_popedom" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"-->
<!-- enableSelectByExample="false" selectByExampleQueryId="false">-->
<!-- </table>-->
<!-- <table tableName="application_popedom" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"-->
<!-- enableSelectByExample="false" selectByExampleQueryId="false">-->
<!-- </table>-->
<!-- <table tableName="company" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"-->
<!-- enableSelectByExample="false" selectByExampleQueryId="false">-->
<!-- </table>-->
<!-- <table tableName="company_application_license" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"-->
<!-- enableSelectByExample="false" selectByExampleQueryId="false">-->
<!-- </table>-->
<!-- <table tableName="company_application_popedom" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"-->
<!-- enableSelectByExample="false" selectByExampleQueryId="false">-->
<!-- </table>-->
<!-- <table tableName="company_role" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"-->
<!-- enableSelectByExample="false" selectByExampleQueryId="false">-->
<!-- </table>-->
<!-- <table tableName="company_role_popedom" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"-->
<!-- enableSelectByExample="false" selectByExampleQueryId="false">-->
<!-- </table>-->
<!-- <table tableName="company_role_user" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"-->
<!-- enableSelectByExample="false" selectByExampleQueryId="false">-->
<!-- </table>-->
<!-- <table tableName="company_user" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"-->
<!-- enableSelectByExample="false" selectByExampleQueryId="false">-->
<!-- </table>-->
<!-- <table tableName="user" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"-->
<!-- enableSelectByExample="false" selectByExampleQueryId="false">-->
<!-- </table>-->
<table tableName="organization" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" selectByExampleQueryId="false">
</table>
</context>
</generatorConfiguration>

View File

@ -0,0 +1,31 @@
package business.cooperop.base;
import business.cooperop.base.controller.ApplicationController;
import business.cooperop.base.service.IUserService;
import business.cooperop.common.result.Result;
import com.alibaba.fastjson.JSONArray;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
/**
* @Author: deadline
* @Date: 2020-12-29 17:00
*/
@SpringBootTest
public class AuthTests {
@Autowired
ApplicationController authController;
@Autowired
IUserService iUserService;
@Test
public void getTreeTest() {
Result result = authController.getTree();
String json = JSONArray.toJSONString(result);
System.out.println(json);
}
}

View File

@ -0,0 +1,59 @@
package business.cooperop.base;
//import business.cooperop.base.entity.Message;
import business.cooperop.base.message.InternalMessage;
import business.cooperop.base.message.InternalMessageImpl;
import business.cooperop.base.message.email.service.EmailService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.lang.reflect.Array;
import java.util.*;
//@RunWith(SpringRunner.class)
@SpringBootTest
class CooperopAppBaseApplicationTests {
@Autowired
private EmailService emailService;
@Autowired
private InternalMessage InternalMessage;
private static String to = "943359729@qq.com";
@Test
public void sendSimpleEmail(){
String content = "你好,恭喜你...";
emailService.sendSimpleMail(new String[]{to},"祝福邮件",content);
}
@Test
public void sendMimeEmail(){
String content = "<a href='https://blog.csdn.net/'>你好,欢迎注册网站,请点击链接激活</a>";
emailService.sendHtmlMail(new String[]{to},"激活邮件",content);
}
@Test
public void sendAttachment(){
emailService.sendAttachmentsMail(new String[]{to},"关于java体系图","你好, 这是Java体系图","G:\\测试图片\\01.jpg", "G:\\测试图片\\02.jpg");
}
@Test
public void sendInternalMessage(){
/*Message message = new Message();
message.setTitle("系统通知");
message.setType("T");
message.setTarget("A");
message.setContent("系统通知");
message.setState(1);
message.setCreate_time(new Date());
message.setCreate_user("admin");
message.setStart_time(new Date());
Calendar curr = Calendar.getInstance();
curr.set(Calendar.MONTH,curr.get(Calendar.MONTH)+1); //增加一月
Date date=curr.getTime();
message.setEnd_time(date);
InternalMessage.settingInternalMessage(message);*/
}
}

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>business.chaoran</groupId>
<artifactId>cooperop-app</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>business.chaoran</groupId>
<artifactId>cooperop-app-common</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--ASM使用-->
<dependency>
<groupId>com.esotericsoftware</groupId>
<artifactId>reflectasm</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,17 @@
package business.cooperop.common.constant;
/**
* 系统基础常量
*
* @author FXY
* <p/>
* 2018年1月23日
*/
public class Base {
public static final String ROLE_ADMIN = "admin";
public static final String CURRENT_USER = "current_user";
public static final String CURRENT_COMPANY = "current_company";
}

View File

@ -0,0 +1,106 @@
package business.cooperop.common.constant;
/**
* api接口返回 code和message
*
* @author FXY
* <p>
* 2018年1月23日
*/
public enum ResultCode {
/* 成功状态码 */
SUCCESS(0, "成功"),
ERROR(1, "失败"),
/* 参数错误10001-19999 */
PARAM_IS_INVALID(10001, "参数无效"),
PARAM_IS_BLANK(10002, "参数为空"),
PARAM_TYPE_BIND_ERROR(10003, "参数类型错误"),
PARAM_NOT_COMPLETE(10004, "参数缺失"),
/* 用户错误20001-29999*/
USER_NOT_LOGGED_IN(20001, "用户未登录"),
USER_LOGIN_ERROR(20002, "账号或密码错误"),
USER_ACCOUNT_FORBIDDEN(20003, "账号已被禁用"),
USER_NOT_EXIST(20004, "用户不存在"),
USER_HAS_EXISTED(20005, "用户已存在"),
USER_Register_ERROR(20006, "用户注册错误"),
/* 业务错误30001-39999 */
SPECIFIED_QUESTIONED_USER_NOT_EXIST(30001, "某业务出现问题"),
//菜单
MENU_ROOT_ELEMENT_NUM_MAX(30002, "一级菜单数量达到最大"),
MENU_TERMINAL_ELEMENT_NUM_MAX(30003, "二级菜单数量达到最大"),
MENU_LEVEL_PROMOTION(30004, "微信规定一级菜单最多3个二级菜单最多7个。最高二级层次菜单"),
MENU_ROOT_ELEMENT_CLOSED(30005, "对应的一级菜单未打开"),
//模板消息
TEMPLATE_MESSAGE_ACTIVE_NUM_MAX(30006, "模板消息激活数量已达最大"),
/* 系统错误40001-49999 */
SYSTEM_INNER_ERROR(40001, "系统繁忙,请稍后重试"),
/* 数据错误50001-599999 */
RESULE_DATA_NONE(50001, "数据未找到"),
DATA_IS_WRONG(50002, "数据有误"),
DATA_ALREADY_EXISTED(50003, "数据已存在"),
/* 接口错误60001-69999 */
INTERFACE_INNER_INVOKE_ERROR(60001, "内部系统接口调用异常"),
INTERFACE_OUTTER_INVOKE_ERROR(60002, "外部系统接口调用异常"),
INTERFACE_FORBID_VISIT(60003, "该接口禁止访问"),
INTERFACE_ADDRESS_INVALID(60004, "接口地址无效"),
INTERFACE_REQUEST_TIMEOUT(60005, "接口请求超时"),
INTERFACE_EXCEED_LOAD(60006, "接口负载过高"),
/* 权限错误70001-79999 */
PERMISSION_NO_ACCESS(70001, "无访问权限"),
/* 文件上传 */
UPLOAD_ERROR(80001, "上传失败"),
SESSION_TIME_OUT(90001, "Session超时");
private Integer code;
private String message;
ResultCode(Integer code, String message) {
this.code = code;
this.message = message;
}
public Integer code() {
return this.code;
}
public String message() {
return this.message;
}
public static String getMessage(String name) {
for (ResultCode item : ResultCode.values()) {
if (item.name().equals(name)) {
return item.message;
}
}
return name;
}
public static Integer getCode(String name) {
for (ResultCode item : ResultCode.values()) {
if (item.name().equals(name)) {
return item.code;
}
}
return null;
}
@Override
public String toString() {
return this.name();
}
}

View File

@ -0,0 +1,45 @@
package business.cooperop.common.exception;
import business.cooperop.common.constant.ResultCode;
/**
* 自定义异常
*
* @author FXY
* <p>
* 2018年1月23日
*/
public abstract class BaseException extends RuntimeException {
private static final long serialVersionUID = 3506744187536228284L;
private Integer errCode;
private String errMsg;
public Integer getErrCode() {
return errCode;
}
public void setErrCode(Integer errCode) {
this.errCode = errCode;
}
public String getErrMsg() {
return errMsg;
}
public void setErrMsg(String errMsg) {
this.errMsg = errMsg;
}
public BaseException(Integer errCode, String errMsg) {
this.errCode = errCode;
this.errMsg = errMsg;
}
public BaseException(ResultCode resultCode){
this.errCode=resultCode.code();
this.errMsg=resultCode.message();
}
}

View File

@ -0,0 +1,27 @@
package business.cooperop.common.exception;
/*
**********************************************
* DATE PERSON REASON
* 2020/10/23 FXY Created
**********************************************
*/
import business.cooperop.common.constant.ResultCode;
/**
* 默认异常实现
*/
public class DefaultException extends BaseException {
public DefaultException(Integer errCode, String errMsg) {
super(errCode, errMsg);
}
//根据枚举建立异常
public static DefaultException simple(ResultCode resultCode) {
return new DefaultException(resultCode.code(), resultCode.message());
}
}

View File

@ -0,0 +1,32 @@
package business.cooperop.common.result;
/**
* Controller参数校验 错误返回封装
*
* @author FXY
* <p>
* 2018年1月23日
*/
public class ParameterInvalidItem {
private String fieldName;
private String message;
public String getFieldName() {
return fieldName;
}
public void setFieldName(String fieldName) {
this.fieldName = fieldName;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}

View File

@ -0,0 +1,114 @@
package business.cooperop.common.result;
import business.cooperop.common.constant.ResultCode;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* api接口数据返回封装
*
* @author FXY
* <p>
* 2018年1月23日
*/
public class Result implements Serializable {
private static final long serialVersionUID = -4762928619495260423L;
private Integer code;
private String msg;
private Object data;
public Result() {
}
public Result(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public static Result success() {
Result result = new Result();
result.setResultCode(ResultCode.SUCCESS);
return result;
}
public static Result success(Object data) {
Result result = new Result();
result.setResultCode(ResultCode.SUCCESS);
result.setData(data);
return result;
}
public static Result failed() {
Result result = new Result();
result.setResultCode(ResultCode.SYSTEM_INNER_ERROR);
return result;
}
// 带消息的失败返回结果
public static Result failed(String msg) {
Result result = new Result();
result.setResultCode(ResultCode.SYSTEM_INNER_ERROR);
result.setMsg(msg);
return result;
}
public static Result error(ResultCode resultCode) {
Result result = new Result();
result.setResultCode(resultCode);
return result;
}
public static Result error(ResultCode resultCode, Object data) {
Result result = new Result();
result.setResultCode(resultCode);
result.setData(data);
return result;
}
public void setResultCode(ResultCode code) {
this.code = code.code();
this.msg = code.message();
}
public Map<String, Object> simple() {
Map<String, Object> simple = new HashMap<String, Object>();
this.data = simple;
return simple;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}

View File

@ -0,0 +1,258 @@
package business.cooperop.common.utils;
/*
**********************************************
* DATE PERSON REASON
* 2020/9/4 FXY Created
**********************************************
*/
import com.esotericsoftware.reflectasm.MethodAccess;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 待重写
*/
public class BeanUtilsV2 {
/**
* 通过 ASM反射 速度比 Spring BeanUtils.copyProperties(source,target) 快一倍
* 类型不同可以转换
* 大小写可以忽略
* 下划线 _ 被忽略
* fxy备注需要操纵字节码服务器没有性能瓶颈的情况下慎用
*
* @param source 数据源
* @param target 目标是数据
* @param <T>
* @return
*/
public static <T> T copyPropertiesASM(Object source, Object target) {
MethodAccess sourceMethodAccess = CacheMethodAccess.getMethodAccess(source.getClass());
MethodAccess targetMethodAccess = CacheMethodAccess.getMethodAccess(target.getClass());
Map<String, String> sourceGet = CacheAsmFiledMethod.getMethod("get", source.getClass());
Map<String, String> targetSet = CacheAsmFiledMethod.getMethod("set", target.getClass());
CacheFieldMap.getFieldMap(target.getClass()).keySet().forEach((it) -> {
String sourceIndex = sourceGet.get(it);
if (sourceIndex != null) {
Object value = sourceMethodAccess.invoke(source, sourceIndex);
String setIndex = targetSet.get(it);
targetMethodAccess.invoke(target, setIndex, value);
}
});
return (T) target;
}
/**
* 模仿Spring中 BeanUtils.copyProperties(source,target)
* 目前仅支持整形到布尔类型的单向转换
* 但是
* 大小写可以忽略
* 下划线 _ 被忽略
*
* @param source
* @param target
* @param <T>
* @return
*/
public static <T> T copyProperties(Object source, Object target) {
Map<String, Field> sourceMap = CacheFieldMap.getFieldMap(source.getClass());
CacheFieldMap.getFieldMap(target.getClass()).values().forEach((it) -> {
Field field = sourceMap.get(it.getName().toLowerCase().replace("_", ""));
if (field != null) {
it.setAccessible(true);
field.setAccessible(true);
try {
if (field.getType() == Integer.class && it.getType() == Boolean.class) {
it.set(target, (Integer) field.get(source) == 1 ? true : false);
} else {
it.set(target, field.get(source));
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} finally {
//及时关闭访问权限
field.setAccessible(false);
it.setAccessible(false);
}
}
});
return (T) target;
}
/**
* @param source 源对象
* @param target 目标对象
* @param ignores 需要忽略的字段数组元素
* @param <T> 返回赋了值的目标对象
* 目前不同类型之间的转换,仅支持整形向布尔类型的单向转换
* @return
*/
public static <T> T copyProperties(Object source, Object target, String... ignores) {
Map<String, Field> sourceMap = CacheFieldMap.getFieldMap(source.getClass(), ignores);
CacheFieldMap.getFieldMap(target.getClass()).values().forEach((it) -> {
Field field = sourceMap.get(it.getName().toLowerCase().replace("_", ""));
if (field != null) {
it.setAccessible(true);
field.setAccessible(true);
try {
if (field.getType() == Integer.class && it.getType() == Boolean.class) {
it.set(target, (Integer) field.get(source) == 1 ? true : false);
} else {
it.set(target, field.get(source));
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} finally {
field.setAccessible(false);
it.setAccessible(false);
}
}
});
return (T) target;
}
/**
* Asm方式缓存变量域到map中待优化
* 可以将加锁操作换做无阻塞的并发容器
*/
private static class CacheAsmFiledMethod {
private static Map<String, Map<String, String>> cacheGetMethod = new HashMap<>();
private static Map<String, Map<String, String>> cacheSetMethod = new HashMap<>();
private static Map<String, String> getMethod(String type, Class clazz) {
MethodAccess methodAccess = CacheMethodAccess.getMethodAccess(clazz);
Map<String, Field> allFields = CacheFieldMap.getFieldMap(clazz);
Map<String, String> result = null;
if (type.equals("get")) {
result = cacheGetMethod.get(clazz.getName());
} else if (type.equals("set")) {
result = cacheSetMethod.get(clazz.getName());
}
if (result == null) {
synchronized (CacheAsmFiledMethod.class) {
if (result == null) {
Map<String, String> set = new HashMap<>();
Map<String, String> get = new HashMap<>();
allFields.values().forEach((it) -> {
//判断是否是静态
if (!Modifier.isStatic(it.getModifiers())) {
//首字母大写
char[] f = it.getName().toCharArray();
f[0] -= 32;
String fieldName = new String(f);
get.put(fieldName.toLowerCase().replace("_", ""), "get" + fieldName);
set.put(fieldName.toLowerCase().replace("_", ""), "set" + fieldName);
}
});
cacheGetMethod.put(clazz.getName(), get);
cacheSetMethod.put(clazz.getName(), set);
if (type.equals("get")) {
result = cacheGetMethod.get(clazz.getName());
} else if (type.equals("set")) {
result = cacheSetMethod.get(clazz.getName());
}
}
}
}
return result;
}
}
/**
* 缓存方法访问权限容器,加锁操作待优化
*/
private static class CacheMethodAccess {
private CacheMethodAccess() {
}
private static Map<String, MethodAccess> cache = new HashMap<>();
private static MethodAccess getMethodAccess(Class clazz) {
MethodAccess result = cache.get(clazz.getName());
if (result == null) {
synchronized (CacheMethodAccess.class) {
if (result == null) {
cache.put(clazz.getName(), MethodAccess.get(clazz));
result = cache.get(clazz.getName());
}
}
}
return result;
}
}
/**
* 缓存所有域到map中加锁操作待优化
*/
private static class CacheFieldMap {
private static Map<String, Map<String, Field>> cacheMap = new HashMap<>();
private static Map<String, Field> getFieldMap(Class clazz) {
Map<String, Field> result = cacheMap.get(clazz.getName());
if (result == null) {
synchronized (CacheFieldMap.class) {
if (result == null) {
List<Field> allFields = getAllFields(clazz);
Map<String, Field> fieldMap = allFields.stream().collect(Collectors.toMap(field -> field.getName().toLowerCase().replace("_", ""), Function.<Field>identity()));
cacheMap.put(clazz.getName(), fieldMap);
result = cacheMap.get(clazz.getName());
}
}
}
return result;
}
/**
* 每次反射完成后将数据存放在内存中
*
* @param clazz
* @param ignores
* @return
*/
private static Map<String, Field> getFieldMap(Class clazz, String... ignores) {
Map<String, Field> result = cacheMap.get(clazz.getName());
List<String> list = Arrays.asList(ignores);
if (result == null) {
synchronized (CacheFieldMap.class) {
if (result == null) {
List<Field> allFields = getAllFields(clazz);
Map<String, Field> fieldMap = allFields.stream().filter(a -> !(list.contains(a.getName()))).collect(Collectors.toMap(field -> field.getName().toLowerCase().replace("_", ""), Function.<Field>identity()));
cacheMap.put(clazz.getName(), fieldMap);
result = cacheMap.get(clazz.getName());
}
}
}
return result;
}
}
/**
* 得到包括继承而来的所有域
*
* @param clazz
* @return
*/
private static List<Field> getAllFields(Class clazz) {
List<Field> fieldList = new ArrayList<>();
while (clazz != null && !clazz.getName().toLowerCase().equals("java.lang.object")) {
fieldList.addAll(Arrays.asList(clazz.getDeclaredFields()));
clazz = clazz.getSuperclass();
}
return fieldList;
}
}

101
cooperop-app-ioc/pom.xml Normal file
View File

@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>cooperop-app</artifactId>
<groupId>business.chaoran</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>business.chaoran</groupId>
<artifactId>cooperop-app-ioc</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!-- springboot 配置助手 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>business.chaoran</groupId>
<artifactId>cooperop-app-common</artifactId>
</dependency>
<dependency>
<groupId>business.chaoran</groupId>
<artifactId>cooperop-base-cache</artifactId>
</dependency>
</dependencies>
<profiles>
<profile>
<id>internal</id>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!--排除springboot默认日志框架-->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<activation>
<!--默认激活的环境-->
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>external</id>
<!-- RESTful服务 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
</dependencies>
</profile>
</profiles>
</project>

View File

@ -0,0 +1,76 @@
package business.cooperop.ioc.config;
/*
**********************************************
* DATE PERSON REASON
* 2020/9/14 FXY Created
**********************************************
*/
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import com.alibaba.fastjson.support.spring.FastJsonViewResponseBodyAdvice;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.client.RestTemplate;
import java.util.ArrayList;
import java.util.List;
@Configuration
public class BeanFactory {
@Bean
public RestTemplate generateTemplate() {
return new RestTemplate();
}
//json过滤配置
/**
* @see com.fasterxml.jackson.annotation.JsonView
* @return
*/
@Bean
public FastJsonViewResponseBodyAdvice FastJsonViewResponseBodyAdvice() {
FastJsonViewResponseBodyAdvice advice = new FastJsonViewResponseBodyAdvice();
return advice;
}
//springboot webmvc自动注入converters
/**
* @see com.fasterxml.jackson.annotation.JsonView
* @return
*/
@Bean
public HttpMessageConverters configureMessageConverters() {
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(
SerializerFeature.PrettyFormat, SerializerFeature.WriteNullStringAsEmpty,
SerializerFeature.DisableCircularReferenceDetect
);
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastConverter.setFastJsonConfig(fastJsonConfig);
fastConverter.setSupportedMediaTypes(fastMediaTypes);
return new HttpMessageConverters(fastConverter);
}
}

146
pom.xml Normal file
View File

@ -0,0 +1,146 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>
<!--微服务是否限制住使用springboot-->
<parent>
<groupId>business.chaoran</groupId>
<artifactId>cooperop-demo-base</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>business.chaoran</groupId>
<artifactId>cooperop-app</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>cooperop-app-common</module>
<module>cooperop-app-ioc</module>
<module>cooperop-app-base</module>
</modules>
<properties>
<app-common.version>1.0-SNAPSHOT</app-common.version>
<base-cache.version>1.0-SNAPSHOT</base-cache.version>
<base-message.version>1.0-SNAPSHOT</base-message.version>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.3.RELEASE</spring-cloud-alibaba.version>
<mybatis-plus.version>3.4.0</mybatis-plus.version>
<pagehelper.version>1.3.0</pagehelper.version>
<druid.version>1.2.4</druid.version>
<asm.version>1.11.7</asm.version>
<gson.version>2.8.6</gson.version>
<fastjson.version>1.2.73</fastjson.version>
<shiro.version>1.4.0</shiro.version>
<swagger.version>3.0.0</swagger.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<xin.cloud>0.0.1-SNAPSHOT</xin.cloud>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>business.chaoran</groupId>
<artifactId>web</artifactId>
<version>${xin.cloud}</version>
</dependency>
<!--app-common-->
<dependency>
<groupId>business.chaoran</groupId>
<artifactId>cooperop-app-common</artifactId>
<version>${app-common.version}</version>
</dependency>
<!--base-cache-->
<dependency>
<groupId>business.chaoran</groupId>
<artifactId>cooperop-base-cache</artifactId>
<version>${base-cache.version}</version>
</dependency>
<!--base-message-->
<dependency>
<groupId>business.chaoran</groupId>
<artifactId>cooperop-base-message</artifactId>
<version>${base-message.version}</version>
</dependency>
<!--spring-cloud-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring-cloud-alibaba-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<!--pagehelper-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pagehelper.version}</version>
</dependency>
<!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<!--ASM使用-->
<dependency>
<groupId>com.esotericsoftware</groupId>
<artifactId>reflectasm</artifactId>
<version>${asm.version}</version>
</dependency>
<!--gson依赖-->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>${gson.version}</version>
</dependency>
<!--redis序列化用fastjson业务返回Json还是用gson更加灵活-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!--swagger-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>${swagger.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>