初始提交

This commit is contained in:
彭勇平 2025-02-25 16:24:22 +08:00
commit f3e5078c57
636 changed files with 76723 additions and 0 deletions

3
.gitignore vendored Normal file
View file

@ -0,0 +1,3 @@
/.idea/
/logs/
/target/

39
README.md Normal file
View file

@ -0,0 +1,39 @@
**项目说明**
- sqx-fast是一个轻量级的前后端分离的Java快速开发平台能快速开发项目并交付
- 支持MySQL、PostgreSQL等主流数据库
<br>
**具有如下特点**
- 友好的代码结构及注释,便于阅读及二次开发
- 实现前后端分离通过token进行数据交互前端再也不用关注后端技术
- 灵活的权限控制,可控制到页面或按钮,满足绝大部分的权限需求
- 页面交互使用Vue2.x极大的提高了开发效率
- 引入API模板根据token作为登录令牌极大的方便了APP接口开发
- 引入swagger文档支持方便编写API接口文档
<br>
**技术选型:**
- 核心框架Spring Boot 2.6
- 安全框架Apache Shiro 1.4
- 视图框架Spring MVC 5.0
- 持久层框架MyBatis 3.3
- 数据库连接池Druid 1.0
- 日志管理SLF4J 1.7、Log4j
- 页面交互Vue2.x
<br>
**后端部署**
- 通过git下载源码
- idea、eclipse需安装lombok插件不然会提示找不到entity的get set方法
- 创建数据库sqx_fast数据库编码为UTF-8
- 执行db/mysql.sql文件初始化数据
- 修改application-dev.yml更新MySQL账号和密码
- Eclipse、IDEA运行sqxApplication.java则可启动项目
- Swagger文档路径http://localhost:8964/sqx_fast/swagger/index.html
- Swagger注解路径http://localhost:8964/sqx_fast/swagger-ui.html
<br>

2049
db/songshui.sql Normal file

File diff suppressed because one or more lines are too long

496
pom.xml Normal file
View file

@ -0,0 +1,496 @@
<?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>
<groupId>com.sqx</groupId>
<artifactId>songshui</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<description>送水</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.11</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<mybatisplus.version>3.2.0</mybatisplus.version>
<mysql.version>8.0.17</mysql.version>
<mssql.version>4.0</mssql.version>
<oracle.version>11.2.0.3</oracle.version>
<druid.version>1.1.13</druid.version>
<quartz.version>2.3.0</quartz.version>
<commons.lang.version>2.6</commons.lang.version>
<commons.fileupload.version>1.2.2</commons.fileupload.version>
<commons.io.version>2.5</commons.io.version>
<commons.codec.version>1.10</commons.codec.version>
<commons.configuration.version>1.10</commons.configuration.version>
<shiro.version>1.10.1</shiro.version>
<jwt.version>0.7.0</jwt.version>
<kaptcha.version>0.0.9</kaptcha.version>
<qiniu.version>7.2.23</qiniu.version>
<aliyun.oss.version>3.4.0</aliyun.oss.version>
<qcloud.cos.version>4.4</qcloud.cos.version>
<swagger.version>2.7.0</swagger.version>
<joda.time.version>2.9.9</joda.time.version>
<gson.version>2.8.5</gson.version>
<fastjson.version>1.2.83</fastjson.version>
<hutool.version>4.1.1</hutool.version>
<lombok.version>1.18.4</lombok.version>
<!--wagon plugin 配置-->
<!--<service-path>/work/sz</service-path>
<pack-name>${project.artifactId}-${project.version}.jar</pack-name>
<remote-addr>192.168.1.10:22</remote-addr>
<remote-username>root</remote-username>
<remote-passwd>123456</remote-passwd>-->
</properties>
<dependencies>
<dependency>
<groupId>org</groupId>
<artifactId>jaudiotagger</artifactId>
<version>2.0.3</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-typehandlers-jsr310</artifactId>
<version>1.0.1</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.2.3.Final</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
<version>5.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-spring-boot-starter</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.5.0</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
<version>5.5.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!-- 苹果工具类 -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.8.3</version>
</dependency>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>jwks-rsa</artifactId>
<version>0.12.0</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
<!-- excel工具类 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.1</version>
</dependency>
<!-- excel工具类 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>com.github.qcloudsms</groupId>
<artifactId>qcloudsms</artifactId>
<version>1.0.6</version>
</dependency>
<!--阿里云短信-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.3</version>
</dependency>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.4.0</version>
</dependency>
<!-- 集成支付宝sdk -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.10.29.ALL</version>
</dependency>
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
<dependency>
<groupId>com.github.liyiorg</groupId>
<artifactId>weixin-popular</artifactId>
<version>2.8.25</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!--<dependency>-->
<!--<groupId>org.springframework.boot</groupId>-->
<!--<artifactId>spring-boot-devtools</artifactId>-->
<!--<optional>true</optional>-->
<!--</dependency>-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatisplus.version}</version>
<exclusions>
<exclusion>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!--oracle驱动-->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>${oracle.version}</version>
</dependency>
<!--mssql驱动-->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>sqljdbc4</artifactId>
<version>${mssql.version}</version>
</dependency>
<!--postgresql驱动-->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>${quartz.version}</version>
<exclusions>
<exclusion>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>${commons.lang.version}</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons.fileupload.version}</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons.io.version}</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>${commons.codec.version}</version>
</dependency>
<dependency>
<groupId>commons-configuration</groupId>
<artifactId>commons-configuration</artifactId>
<version>${commons.configuration.version}</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>${shiro.version}</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>${shiro.version}</version>
</dependency>
<dependency>
<groupId>com.github.axet</groupId>
<artifactId>kaptcha</artifactId>
<version>${kaptcha.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>${qiniu.version}</version>
</dependency>
<dependency>
<groupId>com.qcloud</groupId>
<artifactId>cos_api</artifactId>
<version>${qcloud.cos.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>${joda.time.version}</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>${gson.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<!--二维码生成架包引用-->
<!-- https://mvnrepository.com/artifact/com.google.zxing/core -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.zxing/javase -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.3</version>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>3.6.0</version>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-pay</artifactId>
<version>3.6.0</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
<exclusions>
<exclusion>
<artifactId>mybatis-spring</artifactId>
<groupId>org.mybatis</groupId>
</exclusion>
<exclusion>
<artifactId>mybatis</artifactId>
<groupId>org.mybatis</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.dozermapper</groupId>
<artifactId>dozer-core</artifactId>
<version>6.4.1</version>
</dependency>
<dependency>
<groupId>com.getui.push</groupId>
<artifactId>restful-sdk</artifactId>
<version>1.0.0.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.gavaghan</groupId>
<artifactId>geodesy</artifactId>
<version>1.1.3</version>
</dependency>
<!--<dependency>-->
<!--<groupId>com.baidu.aip</groupId>-->
<!--            <artifactId>java-sdk</artifactId>-->
<!--            <version>4.11.3</version>-->
<!--</dependency>-->
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ssh</artifactId>
<version>2.8</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
<!-- 跳过单元测试 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>wagon-maven-plugin</artifactId>
<version>1.0</version>
<!--<configuration>
<fromFile>target/${pack-name}</fromFile>
<url><![CDATA[scp://${remote-username}:${remote-passwd}@${remote-addr}${service-path}]]></url>
<commands>
&lt;!&ndash; Kill Old Process &ndash;&gt;
<command>kill -9 `ps -ef |grep ${project.artifactId}.jar|grep -v "grep" |awk '{print $2}'`</command>
<command><![CDATA[nohup java -jar ${service-path}/${pack-name} &#45;&#45;spring.profiles.active=test > ${service-path}/sz.log 2>&1 & ]]></command>
<command><![CDATA[netstat -nptl]]></command>
<command><![CDATA[ps -ef | grep java | grep -v grep]]></command>
</commands>
&lt;!&ndash; 运行命令 mvn clean package wagon:upload-single wagon:sshexec&ndash;&gt;
<displayCommandOutputs>true</displayCommandOutputs>
</configuration>-->
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.14</version>
<!--<executions>-->
<!--<execution>-->
<!--<phase>package</phase>-->
<!--<goals>-->
<!--<goal>build</goal>-->
<!--</goals>-->
<!--</execution>-->
<!--</executions>-->
<configuration>
<imageName>sqx/fast</imageName>
<dockerDirectory>${project.basedir}</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
<!-- 运行命令 mvn clean package docker:build 打包并生成docker镜像 -->
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>public</id>
<name>aliyun nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>public</id>
<name>aliyun nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>

View file

@ -0,0 +1,29 @@
package com.sqx;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Slf4j
@EnableScheduling
@EnableAsync
@EnableTransactionManagement
@SpringBootApplication
public class SqxApplication {
public static void main(String[] args) {
SpringApplication.run(SqxApplication.class, args);
log.info("(♥◠‿◠)ノ゙ 送水项目启动成功 ლ(´ڡ`ლ)゙ \n"+
" _ \n" +
" | | \n" +
" ___ | | __\n" +
" / _ \\| |/ /\n" +
"| (_) | < \n" +
" \\___/|_|\\_\\");
}
}

View file

@ -0,0 +1,19 @@
package com.sqx.common.annotation;
import java.lang.annotation.Documented;
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)
@Documented
public @interface SysLog {
String value() default "";
}

View file

@ -0,0 +1,37 @@
package com.sqx.common.aspect;
import com.sqx.common.exception.SqxException;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
/**
* Redis切面处理类
*
*/
@Aspect
@Configuration
public class RedisAspect {
private Logger logger = LoggerFactory.getLogger(getClass());
//是否开启redis缓存 true开启 false关闭
@Value("${spring.redis.open: false}")
private boolean open;
@Around("execution(* com.sqx.common.utils.RedisUtils.*(..))")
public Object around(ProceedingJoinPoint point) throws Throwable {
Object result = null;
if(open){
try{
result = point.proceed();
}catch (Exception e){
logger.error("redis error", e);
throw new SqxException("Redis服务异常");
}
}
return result;
}
}

View file

@ -0,0 +1,92 @@
package com.sqx.common.aspect;
import com.google.gson.Gson;
import com.sqx.common.utils.HttpContextUtils;
import com.sqx.common.utils.IPUtils;
import com.sqx.common.annotation.SysLog;
import com.sqx.modules.sys.entity.SysLogEntity;
import com.sqx.modules.sys.entity.SysUserEntity;
import com.sqx.modules.sys.service.SysLogService;
import org.apache.shiro.SecurityUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Date;
/**
* 系统日志切面处理类
*
*/
@Aspect
@Component
public class SysLogAspect {
@Autowired
private SysLogService sysLogService;
@Pointcut("@annotation(com.sqx.common.annotation.SysLog)")
public void logPointCut() {
}
@Around("logPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
long beginTime = System.currentTimeMillis();
//执行方法
Object result = point.proceed();
//执行时长(毫秒)
long time = System.currentTimeMillis() - beginTime;
//保存日志
saveSysLog(point, time);
return result;
}
private void saveSysLog(ProceedingJoinPoint joinPoint, long time) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
SysLogEntity sysLog = new SysLogEntity();
SysLog syslog = method.getAnnotation(SysLog.class);
if(syslog != null){
//注解上的描述
sysLog.setOperation(syslog.value());
}
//请求的方法名
String className = joinPoint.getTarget().getClass().getName();
String methodName = signature.getName();
sysLog.setMethod(className + "." + methodName + "()");
//请求的参数
Object[] args = joinPoint.getArgs();
try{
String params = new Gson().toJson(args);
sysLog.setParams(params);
}catch (Exception e){
}
//获取request
HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
//设置IP地址
sysLog.setIp(IPUtils.getIpAddr(request));
//用户名
String username = ((SysUserEntity) SecurityUtils.getSubject().getPrincipal()).getUsername();
sysLog.setUsername(username);
sysLog.setTime(time);
sysLog.setCreateDate(new Date());
//保存系统日志
sysLogService.save(sysLog);
}
}

View file

@ -0,0 +1,52 @@
package com.sqx.common.exception;
/**
* 自定义异常
*
*/
public class SqxException extends RuntimeException {
private static final long serialVersionUID = 1L;
private String msg;
private int code = 500;
public SqxException(String msg) {
super(msg);
this.msg = msg;
}
public SqxException(String msg, Throwable e) {
super(msg, e);
this.msg = msg;
}
public SqxException(String msg, int code) {
super(msg);
this.msg = msg;
this.code = code;
}
public SqxException(String msg, int code, Throwable e) {
super(msg, e);
this.msg = msg;
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
}

View file

@ -0,0 +1,55 @@
package com.sqx.common.exception;
import com.sqx.common.utils.Result;
import org.apache.shiro.authz.AuthorizationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.NoHandlerFoundException;
/**
* 异常处理器
*
*/
@RestControllerAdvice
public class SqxExceptionHandler {
private Logger logger = LoggerFactory.getLogger(getClass());
/**
* 处理自定义异常
*/
@ExceptionHandler(SqxException.class)
public Result handleException(SqxException e){
Result r = new Result();
r.put("code", e.getCode());
r.put("msg", e.getMessage());
return r;
}
@ExceptionHandler(NoHandlerFoundException.class)
public Result handlerNoFoundException(Exception e) {
logger.error(e.getMessage(), e);
return Result.error(404, "路径不存在,请检查路径是否正确");
}
@ExceptionHandler(DuplicateKeyException.class)
public Result handleDuplicateKeyException(DuplicateKeyException e){
logger.error(e.getMessage(), e);
return Result.error("数据库中已存在该记录");
}
@ExceptionHandler(AuthorizationException.class)
public Result handleAuthorizationException(AuthorizationException e){
logger.error(e.getMessage(), e);
return Result.error("没有权限,请联系管理员授权");
}
@ExceptionHandler(Exception.class)
public Result handleException(Exception e){
logger.error(e.getMessage(), e);
return Result.error();
}
}

View file

@ -0,0 +1,12 @@
package com.sqx.common.utils;
/**
* 系统参数相关Key
*
*/
public class ConfigConstant {
/**
* 云存储配置KEY
*/
public final static String CLOUD_STORAGE_CONFIG_KEY = "CLOUD_STORAGE_CONFIG_KEY";
}

View file

@ -0,0 +1,110 @@
package com.sqx.common.utils;
/**
* 常量
*
*/
public class Constant {
/** 超级管理员ID */
public static final int SUPER_ADMIN = 1;
/**
* 当前页码
*/
public static final String PAGE = "page";
/**
* 每页显示记录数
*/
public static final String LIMIT = "limit";
/**
* 排序字段
*/
public static final String ORDER_FIELD = "sidx";
/**
* 排序方式
*/
public static final String ORDER = "order";
/**
* 升序
*/
public static final String ASC = "asc";
/**
* 菜单类型
*/
public enum MenuType {
/**
* 目录
*/
CATALOG(0),
/**
* 菜单
*/
MENU(1),
/**
* 按钮
*/
BUTTON(2);
private int value;
MenuType(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
/**
* 定时任务状态
*/
public enum ScheduleStatus {
/**
* 正常
*/
NORMAL(0),
/**
* 暂停
*/
PAUSE(1);
private int value;
ScheduleStatus(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
/**
* 云服务商
*/
public enum CloudService {
/**
* 七牛云
*/
QINIU(1),
/**
* 阿里云
*/
ALIYUN(2),
/**
* 腾讯云
*/
QCLOUD(3);
private int value;
CloudService(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
}

View file

@ -0,0 +1,157 @@
package com.sqx.common.utils;
import org.apache.commons.lang.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 日期处理
*
*/
public class DateUtils {
/** 时间格式(yyyy-MM-dd) */
public final static String DATE_PATTERN = "yyyy-MM-dd";
/** 时间格式(yyyy-MM-dd HH:mm:ss) */
public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
/**
* 日期格式化 日期格式为yyyy-MM-dd
* @param date 日期
* @return 返回yyyy-MM-dd格式日期
*/
public static String format(Date date) {
return format(date, DATE_TIME_PATTERN);
}
/**
* 日期格式化 日期格式为yyyy-MM-dd
* @param date 日期
* @param pattern 格式DateUtils.DATE_TIME_PATTERN
* @return 返回yyyy-MM-dd格式日期
*/
public static String format(Date date, String pattern) {
if(date != null){
SimpleDateFormat df = new SimpleDateFormat(pattern);
return df.format(date);
}
return null;
}
/**
* 字符串转换成日期
* @param strDate 日期字符串
* @param pattern 日期的格式DateUtils.DATE_TIME_PATTERN
*/
public static Date stringToDate(String strDate, String pattern) {
if (StringUtils.isBlank(strDate)){
return null;
}
DateTimeFormatter fmt = DateTimeFormat.forPattern(pattern);
return fmt.parseLocalDateTime(strDate).toDate();
}
/**
* 根据周数获取开始日期结束日期
* @param week 周期 0本周-1上周-2上上周1下周2下下周
* @return 返回date[0]开始日期date[1]结束日期
*/
public static Date[] getWeekStartAndEnd(int week) {
DateTime dateTime = new DateTime();
LocalDate date = new LocalDate(dateTime.plusWeeks(week));
date = date.dayOfWeek().withMinimumValue();
Date beginDate = date.toDate();
Date endDate = date.plusDays(6).toDate();
return new Date[]{beginDate, endDate};
}
/**
* 对日期的进行加/
*
* @param date 日期
* @param seconds 秒数负数为减
* @return /减几秒后的日期
*/
public static Date addDateSeconds(Date date, int seconds) {
DateTime dateTime = new DateTime(date);
return dateTime.plusSeconds(seconds).toDate();
}
/**
* 对日期的分钟进行加/
*
* @param date 日期
* @param minutes 分钟数负数为减
* @return /减几分钟后的日期
*/
public static Date addDateMinutes(Date date, int minutes) {
DateTime dateTime = new DateTime(date);
return dateTime.plusMinutes(minutes).toDate();
}
/**
* 对日期的小时进行加/
*
* @param date 日期
* @param hours 小时数负数为减
* @return /减几小时后的日期
*/
public static Date addDateHours(Date date, int hours) {
DateTime dateTime = new DateTime(date);
return dateTime.plusHours(hours).toDate();
}
/**
* 对日期的进行加/
*
* @param date 日期
* @param days 天数负数为减
* @return /减几天后的日期
*/
public static Date addDateDays(Date date, int days) {
DateTime dateTime = new DateTime(date);
return dateTime.plusDays(days).toDate();
}
/**
* 对日期的进行加/
*
* @param date 日期
* @param weeks 周数负数为减
* @return /减几周后的日期
*/
public static Date addDateWeeks(Date date, int weeks) {
DateTime dateTime = new DateTime(date);
return dateTime.plusWeeks(weeks).toDate();
}
/**
* 对日期的进行加/
*
* @param date 日期
* @param months 月数负数为减
* @return /减几月后的日期
*/
public static Date addDateMonths(Date date, int months) {
DateTime dateTime = new DateTime(date);
return dateTime.plusMonths(months).toDate();
}
/**
* 对日期的进行加/
*
* @param date 日期
* @param years 年数负数为减
* @return /减几年后的日期
*/
public static Date addDateYears(Date date, int years) {
DateTime dateTime = new DateTime(date);
return dateTime.plusYears(years).toDate();
}
}

View file

@ -0,0 +1,24 @@
package com.sqx.common.utils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
public class HttpContextUtils {
public static HttpServletRequest getHttpServletRequest() {
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
}
public static String getDomain(){
HttpServletRequest request = getHttpServletRequest();
StringBuffer url = request.getRequestURL();
return url.delete(url.length() - request.getRequestURI().length(), url.length()).toString();
}
public static String getOrigin(){
HttpServletRequest request = getHttpServletRequest();
return request.getHeader("Origin");
}
}

View file

@ -0,0 +1,49 @@
package com.sqx.common.utils;
import com.alibaba.druid.util.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletRequest;
/**
* IP地址
*
*/
public class IPUtils {
private static Logger logger = LoggerFactory.getLogger(IPUtils.class);
/**
* 获取IP地址
*
* 使用Nginx等反向代理软件 则不能通过request.getRemoteAddr()获取IP地址
* 如果使用了多级反向代理的话X-Forwarded-For的值并不止一个而是一串IP地址X-Forwarded-For中第一个非unknown的有效IP字符串则为真实IP地址
*/
public static String getIpAddr(HttpServletRequest request) {
String ip = null;
try {
ip = request.getHeader("x-forwarded-for");
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
} catch (Exception e) {
logger.error("IPUtils ERROR ", e);
}
return ip;
}
}

View file

@ -0,0 +1,17 @@
package com.sqx.common.utils;
import java.util.HashMap;
/**
* Map工具类
*
*/
public class MapUtils extends HashMap<String, Object> {
@Override
public MapUtils put(String key, Object value) {
super.put(key, value);
return this;
}
}

View file

@ -0,0 +1,46 @@
package com.sqx.common.utils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.Objects;
@Component
@Slf4j
public class MetaObjectHandler implements com.baomidou.mybatisplus.core.handlers.MetaObjectHandler {
/**
* 插入操作时自动填充
* createTime updateTime 必须是Date类型的字段
*
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
Object createTime = getFieldValByName("createTime", metaObject);
if (Objects.isNull(createTime)) {
//只有被FieldFill标记的字段才会执行自动填充
setInsertFieldValByName("createTime", new Date(), metaObject);
}
Object updateTime = getFieldValByName("updateTime", metaObject);
if (Objects.isNull(updateTime)) {
setInsertFieldValByName("updateTime", new Date(), metaObject);
}
}
/**
* 更新操作时自动填充
*
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
Object updateTime = getFieldValByName("updateTime", metaObject);
if (Objects.isNull(updateTime)) {
//只有被FieldFill标记的字段才会执行自动填充
setUpdateFieldValByName("updateTime", new Date(), metaObject);
}
}
}

View file

@ -0,0 +1,101 @@
package com.sqx.common.utils;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.io.Serializable;
import java.util.List;
/**
* 分页工具类
*
*/
public class PageUtils implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 总记录数
*/
private int totalCount;
/**
* 每页记录数
*/
private int pageSize;
/**
* 总页数
*/
private int totalPage;
/**
* 当前页数
*/
private int currPage;
/**
* 列表数据
*/
private List<?> list;
/**
* 分页
* @param list 列表数据
* @param totalCount 总记录数
* @param pageSize 每页记录数
* @param currPage 当前页数
*/
public PageUtils(List<?> list, int totalCount, int pageSize, int currPage) {
this.list = list;
this.totalCount = totalCount;
this.pageSize = pageSize;
this.currPage = currPage;
this.totalPage = (int)Math.ceil((double)totalCount/pageSize);
}
/**
* 分页
*/
public PageUtils(IPage<?> page) {
this.list = page.getRecords();
this.totalCount = (int)page.getTotal();
this.pageSize = (int)page.getSize();
this.currPage = (int)page.getCurrent();
this.totalPage = (int)page.getPages();
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getCurrPage() {
return currPage;
}
public void setCurrPage(int currPage) {
this.currPage = currPage;
}
public List<?> getList() {
return list;
}
public void setList(List<?> list) {
this.list = list;
}
}

View file

@ -0,0 +1,175 @@
package com.sqx.common.utils;
import cn.hutool.extra.qrcode.BufferedImageLuminanceSource;
import com.google.zxing.*;
import com.google.zxing.Result;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Hashtable;
/**
* 二维码生成解析工具类
* @date 2020/02/12 09:37
*/
public class QRCodeUtil {
//编码格式,采用utf-8
private static final String UNICODE = "utf-8";
//图片格式
private static final String FORMAT = "JPG";
//二维码宽度,单位像素pixels
private static final int QRCODE_WIDTH = 300;
//二维码高度,单位像素pixels
private static final int QRCODE_HEIGHT = 300;
//LOGO宽度,单位像素pixels
private static final int LOGO_WIDTH = 100;
//LOGO高度,单位像素pixels
private static final int LOGO_HEIGHT = 100;
/**
* 生成二维码图片
* @param content 二维码内容
* @param logoPath 图片地址
* @param needCompress 是否压缩
* @return
* @throws Exception
*/
private static BufferedImage createImage(String content, String logoPath, boolean needCompress) throws Exception {
Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
hints.put(EncodeHintType.CHARACTER_SET, UNICODE);
hints.put(EncodeHintType.MARGIN, 1);
BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_WIDTH, QRCODE_HEIGHT,
hints);
int width = bitMatrix.getWidth();
int height = bitMatrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
}
}
if (logoPath == null || "".equals(logoPath)) {
return image;
}
// 插入图片
QRCodeUtil.insertImage(image, logoPath, needCompress);
return image;
}
/**
* 插入LOGO
* @param source 二维码图片
* @param logoPath LOGO图片地址
* @param needCompress 是否压缩
* @throws Exception
*/
private static void insertImage(BufferedImage source, String logoPath, boolean needCompress) throws Exception {
File file = new File(logoPath);
if (!file.exists()) {
throw new Exception("logo file not found.");
}
Image src = ImageIO.read(new File(logoPath));
int width = src.getWidth(null);
int height = src.getHeight(null);
if (needCompress) { // 压缩LOGO
if (width > LOGO_WIDTH) {
width = LOGO_WIDTH;
}
if (height > LOGO_HEIGHT) {
height = LOGO_HEIGHT;
}
Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH);
BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = tag.getGraphics();
g.drawImage(image, 0, 0, null); // 绘制缩小后的图
g.dispose();
src = image;
}
// 插入LOGO
Graphics2D graph = source.createGraphics();
int x = (QRCODE_WIDTH - width) / 2;
int y = (QRCODE_HEIGHT - height) / 2;
graph.drawImage(src, x, y, width, height, null);
Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);
graph.setStroke(new BasicStroke(3f));
graph.draw(shape);
graph.dispose();
}
/**
* 生成二维码(内嵌LOGO)
* 调用者指定二维码文件名
* @param content 二维码的内容
* @param logoPath 中间图片地址
* @param destPath 存储路径
* @param fileName 文件名称
* @param needCompress 是否压缩
* @return
* @throws Exception
*/
public static String encode(String content, String logoPath, String destPath, String fileName, boolean needCompress) throws Exception {
BufferedImage image = QRCodeUtil.createImage(content, logoPath, needCompress);
mkdirs(destPath);
//文件名称通过传递
fileName = fileName.substring(0, fileName.indexOf(".")>0?fileName.indexOf("."):fileName.length())
+ "." + FORMAT.toLowerCase();
ImageIO.write(image, FORMAT, new File(destPath + "/" + fileName));
return fileName;
}
/**
* 创建文件夹 mkdirs会自动创建多层目录区别于mkdir(mkdir如果父目录不存在则会抛出异常)
* @param destPath
*/
public static void mkdirs(String destPath) {
File file = new File(destPath);
if (!file.exists() && !file.isDirectory()) {
file.mkdirs();
}
}
/**
* 解析二维码
* @param path 二维码图片路径
* @return String 二维码内容
* @throws Exception
*/
public static String decode(String path) throws Exception {
File file = new File(path);
BufferedImage image = ImageIO.read(file);
if (image == null) {
return null;
}
BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
Result result;
Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>();
hints.put(DecodeHintType.CHARACTER_SET, UNICODE);
result = new MultiFormatReader().decode(bitmap, hints);
return result.getText();
}
/**
* 测试
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
String text = "http://47.105.101.72:8088";
//不含Logo
// QRCodeUtil.encode(text, null, "/Users/kyson/Downloads", "qrcode", true);
//含Logo指定二维码图片名
QRCodeUtil.encode(text, "/Users/kyson/Downloads/宋康.jpg", "/Users/kyson/Downloads", "qrcode1", true);
// System.out.println(QRCodeUtil.decode("d:\\cc\\qrcode1.jpg"));
// System.out.println(QRCodeUtil.encode(text, null, "/Users/kyson/Downloads", "qrcode", true));
}
}

View file

@ -0,0 +1,68 @@
package com.sqx.common.utils;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sqx.common.xss.SQLFilter;
import org.apache.commons.lang.StringUtils;
import java.util.Map;
/**
* 查询参数
*
*/
public class Query<T> {
public IPage<T> getPage(Map<String, Object> params) {
return this.getPage(params, null, false);
}
public IPage<T> getPage(Map<String, Object> params, String defaultOrderField, boolean isAsc) {
//分页参数
long curPage = 1;
long limit = 10;
if(params.get(Constant.PAGE) != null){
curPage = Long.parseLong(String.valueOf(params.get(Constant.PAGE)));
}
if(params.get(Constant.LIMIT) != null){
limit = Long.parseLong(String.valueOf(params.get(Constant.LIMIT)));
}
//分页对象
Page<T> page = new Page<>(curPage, limit);
//分页参数
params.put(Constant.PAGE, page);
//排序字段
//防止SQL注入因为sidxorder是通过拼接SQL实现排序的会有SQL注入风险
String orderField = SQLFilter.sqlInject((String)params.get(Constant.ORDER_FIELD));
String order = (String)params.get(Constant.ORDER);
//前端字段排序
if(StringUtils.isNotEmpty(orderField) && StringUtils.isNotEmpty(order)){
if(Constant.ASC.equalsIgnoreCase(order)) {
return page.addOrder(OrderItem.asc(orderField));
}else {
return page.addOrder(OrderItem.desc(orderField));
}
}
//没有排序字段则不排序
if(StringUtils.isBlank(defaultOrderField)){
return page;
}
//默认排序
if(isAsc) {
page.addOrder(OrderItem.asc(defaultOrderField));
}else {
page.addOrder(OrderItem.desc(defaultOrderField));
}
return page;
}
}

View file

@ -0,0 +1,12 @@
package com.sqx.common.utils;
/**
* Redis所有Keys
*
*/
public class RedisKeys {
public static String getSysConfigKey(String key){
return "sys:config:" + key;
}
}

View file

@ -0,0 +1,90 @@
package com.sqx.common.utils;
import com.google.gson.Gson;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.*;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
/**
* Redis工具类
*
*/
@Component
public class RedisUtils {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Autowired
private ValueOperations<String, String> valueOperations;
@Autowired
private HashOperations<String, String, Object> hashOperations;
@Autowired
private ListOperations<String, Object> listOperations;
@Autowired
private SetOperations<String, Object> setOperations;
@Autowired
private ZSetOperations<String, Object> zSetOperations;
/** 默认过期时长,单位:秒 */
public final static long DEFAULT_EXPIRE = 60 * 60 * 24;
/** 不设置过期时长 */
public final static long NOT_EXPIRE = -1;
private final static Gson Gson = new Gson();
public void set(String key, Object value, long expire){
valueOperations.set(key, toJson(value));
if(expire != NOT_EXPIRE){
redisTemplate.expire(key, expire, TimeUnit.SECONDS);
}
}
public void set(String key, Object value){
set(key, value, DEFAULT_EXPIRE);
}
public <T> T get(String key, Class<T> clazz, long expire) {
String value = valueOperations.get(key);
if(expire != NOT_EXPIRE){
redisTemplate.expire(key, expire, TimeUnit.SECONDS);
}
return value == null ? null : fromJson(value, clazz);
}
public <T> T get(String key, Class<T> clazz) {
return get(key, clazz, NOT_EXPIRE);
}
public String get(String key, long expire) {
String value = valueOperations.get(key);
if(expire != NOT_EXPIRE){
redisTemplate.expire(key, expire, TimeUnit.SECONDS);
}
return value;
}
public String get(String key) {
return get(key, NOT_EXPIRE);
}
public void delete(String key) {
redisTemplate.delete(key);
}
/**
* Object转成JSON数据
*/
private String toJson(Object object){
if(object instanceof Integer || object instanceof Long || object instanceof Float ||
object instanceof Double || object instanceof Boolean || object instanceof String){
return String.valueOf(object);
}
return Gson.toJson(object);
}
/**
* JSON数据转成Object
*/
private <T> T fromJson(String json, Class<T> clazz){
return Gson.fromJson(json, clazz);
}
}

View file

@ -0,0 +1,58 @@
package com.sqx.common.utils;
import org.apache.http.HttpStatus;
import java.util.HashMap;
import java.util.Map;
/**
* 返回数据
*
*/
public class Result extends HashMap<String, Object> {
private static final long serialVersionUID = 1L;
public Result () {
put("code", 0);
put("msg", "success");
}
public static Result upStatus(Integer rows) {
return rows > 0 ? success() : error();
}
public static Result error() {
return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, "未知异常,请联系管理员");
}
public static Result error(String msg) {
return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, msg);
}
public static Result error(int code, String msg) {
Result r = new Result();
r.put("code", code);
r.put("msg", msg);
return r;
}
public static Result success(String msg) {
Result r = new Result();
r.put("msg", msg);
return r;
}
public static Result success(Map<String, Object> map) {
Result r = new Result();
r.putAll(map);
return r;
}
public static Result success() {
return new Result();
}
@Override
public Result put(String key, Object value) {
super.put(key, value);
return this;
}
}

View file

@ -0,0 +1,52 @@
package com.sqx.common.utils;
import com.sqx.common.exception.SqxException;
import com.sqx.modules.sys.entity.SysUserEntity;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
/**
* Shiro工具类
*
*/
public class ShiroUtils {
public static Session getSession() {
return SecurityUtils.getSubject().getSession();
}
public static Subject getSubject() {
return SecurityUtils.getSubject();
}
public static SysUserEntity getUserEntity() {
return (SysUserEntity)SecurityUtils.getSubject().getPrincipal();
}
public static Long getUserId() {
return getUserEntity().getUserId();
}
public static void setSessionAttribute(Object key, Object value) {
getSession().setAttribute(key, value);
}
public static Object getSessionAttribute(Object key) {
return getSession().getAttribute(key);
}
public static boolean isLogin() {
return SecurityUtils.getSubject().getPrincipal() != null;
}
public static String getKaptcha(String key) {
Object kaptcha = getSessionAttribute(key);
if(kaptcha == null){
throw new SqxException("验证码已失效");
}
getSession().removeAttribute(key);
return kaptcha.toString();
}
}

View file

@ -0,0 +1,42 @@
package com.sqx.common.utils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* Spring Context 工具类
*
*/
@Component
public class SpringContextUtils implements ApplicationContextAware {
public static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
SpringContextUtils.applicationContext = applicationContext;
}
public static Object getBean(String name) {
return applicationContext.getBean(name);
}
public static <T> T getBean(String name, Class<T> requiredType) {
return applicationContext.getBean(name, requiredType);
}
public static boolean containsBean(String name) {
return applicationContext.containsBean(name);
}
public static boolean isSingleton(String name) {
return applicationContext.isSingleton(name);
}
public static Class<? extends Object> getType(String name) {
return applicationContext.getType(name);
}
}

View file

@ -0,0 +1,23 @@
package com.sqx.common.validator;
import com.sqx.common.exception.SqxException;
import org.apache.commons.lang.StringUtils;
/**
* 数据校验
*
*/
public class Assert {
public static void isBlank(String str, String message) {
if (StringUtils.isBlank(str)) {
throw new SqxException(message);
}
}
public static void isNull(Object object, String message) {
if (object == null) {
throw new SqxException(message);
}
}
}

View file

@ -0,0 +1,40 @@
package com.sqx.common.validator;
import com.sqx.common.exception.SqxException;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.Set;
/**
* hibernate-validator校验工具类
*
* 参考文档http://docs.jboss.org/hibernate/validator/5.4/reference/en-US/html_single/
*
*/
public class ValidatorUtils {
private static Validator validator;
static {
validator = Validation.buildDefaultValidatorFactory().getValidator();
}
/**
* 校验对象
* @param object 待校验对象
* @param groups 待校验的组
* @throws SqxException 校验不通过则报SqxException异常
*/
public static void validateEntity(Object object, Class<?>... groups)
throws SqxException {
Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, groups);
if (!constraintViolations.isEmpty()) {
StringBuilder msg = new StringBuilder();
for(ConstraintViolation<Object> constraint: constraintViolations){
msg.append(constraint.getMessage()).append("<br>");
}
throw new SqxException(msg.toString());
}
}
}

View file

@ -0,0 +1,8 @@
package com.sqx.common.validator.group;
/**
* 新增数据 Group
*
*/
public interface AddGroup {
}

View file

@ -0,0 +1,8 @@
package com.sqx.common.validator.group;
/**
* 阿里云
*
*/
public interface AliyunGroup {
}

View file

@ -0,0 +1,12 @@
package com.sqx.common.validator.group;
import javax.validation.GroupSequence;
/**
* 定义校验顺序如果AddGroup组失败则UpdateGroup组不会再校验
*
*/
@GroupSequence({AddGroup.class, UpdateGroup.class})
public interface Group {
}

View file

@ -0,0 +1,8 @@
package com.sqx.common.validator.group;
/**
* 腾讯云
*
*/
public interface QcloudGroup {
}

View file

@ -0,0 +1,8 @@
package com.sqx.common.validator.group;
/**
* 七牛
*
*/
public interface QiniuGroup {
}

View file

@ -0,0 +1,10 @@
package com.sqx.common.validator.group;
/**
* 更新数据 Group
*
*/
public interface UpdateGroup {
}

View file

@ -0,0 +1,526 @@
package com.sqx.common.xss;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
*
* HTML filtering utility for protecting against XSS (Cross Site Scripting).
*
* This code is licensed LGPLv3
*
* This code is a Java port of the original work in PHP by Cal Hendersen.
* http://code.iamcal.com/php/lib_filter/
*
* The trickiest part of the translation was handling the differences in regex handling
* between PHP and Java. These resources were helpful in the process:
*
* http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html
* http://us2.php.net/manual/en/reference.pcre.pattern.modifiers.php
* http://www.regular-expressions.info/modifiers.html
*
* A note on naming conventions: instance variables are prefixed with a "v"; global
* constants are in all caps.
*
* Sample use:
* String input = ...
* String clean = new HTMLFilter().filter( input );
*
* The class is not thread safe. Create a new instance if in doubt.
*
* If you find bugs or have suggestions on improvement (especially regarding
* performance), please contact us. The latest version of this
* source, and our contact details, can be found at http://xss-html-filter.sf.net
*
* @author Joseph O'Connell
* @author Cal Hendersen
* @author Michael Semb Wever
*/
public final class HTMLFilter {
/** regex flag union representing /si modifiers in php **/
private static final int REGEX_FLAGS_SI = Pattern.CASE_INSENSITIVE | Pattern.DOTALL;
private static final Pattern P_COMMENTS = Pattern.compile("<!--(.*?)-->", Pattern.DOTALL);
private static final Pattern P_COMMENT = Pattern.compile("^!--(.*)--$", REGEX_FLAGS_SI);
private static final Pattern P_TAGS = Pattern.compile("<(.*?)>", Pattern.DOTALL);
private static final Pattern P_END_TAG = Pattern.compile("^/([a-z0-9]+)", REGEX_FLAGS_SI);
private static final Pattern P_START_TAG = Pattern.compile("^([a-z0-9]+)(.*?)(/?)$", REGEX_FLAGS_SI);
private static final Pattern P_QUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)=([\"'])(.*?)\\2", REGEX_FLAGS_SI);
private static final Pattern P_UNQUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)(=)([^\"\\s']+)", REGEX_FLAGS_SI);
private static final Pattern P_PROTOCOL = Pattern.compile("^([^:]+):", REGEX_FLAGS_SI);
private static final Pattern P_ENTITY = Pattern.compile("&#(\\d+);?");
private static final Pattern P_ENTITY_UNICODE = Pattern.compile("&#x([0-9a-f]+);?");
private static final Pattern P_ENCODE = Pattern.compile("%([0-9a-f]{2});?");
private static final Pattern P_VALID_ENTITIES = Pattern.compile("&([^&;]*)(?=(;|&|$))");
private static final Pattern P_VALID_QUOTES = Pattern.compile("(>|^)([^<]+?)(<|$)", Pattern.DOTALL);
private static final Pattern P_END_ARROW = Pattern.compile("^>");
private static final Pattern P_BODY_TO_END = Pattern.compile("<([^>]*?)(?=<|$)");
private static final Pattern P_XML_CONTENT = Pattern.compile("(^|>)([^<]*?)(?=>)");
private static final Pattern P_STRAY_LEFT_ARROW = Pattern.compile("<([^>]*?)(?=<|$)");
private static final Pattern P_STRAY_RIGHT_ARROW = Pattern.compile("(^|>)([^<]*?)(?=>)");
private static final Pattern P_AMP = Pattern.compile("&");
private static final Pattern P_QUOTE = Pattern.compile("<");
private static final Pattern P_LEFT_ARROW = Pattern.compile("<");
private static final Pattern P_RIGHT_ARROW = Pattern.compile(">");
private static final Pattern P_BOTH_ARROWS = Pattern.compile("<>");
// @xxx could grow large... maybe use sesat's ReferenceMap
private static final ConcurrentMap<String,Pattern> P_REMOVE_PAIR_BLANKS = new ConcurrentHashMap<String, Pattern>();
private static final ConcurrentMap<String,Pattern> P_REMOVE_SELF_BLANKS = new ConcurrentHashMap<String, Pattern>();
/** set of allowed html elements, along with allowed attributes for each element **/
private final Map<String, List<String>> vAllowed;
/** counts of open tags for each (allowable) html element **/
private final Map<String, Integer> vTagCounts = new HashMap<String, Integer>();
/** html elements which must always be self-closing (e.g. "<img />") **/
private final String[] vSelfClosingTags;
/** html elements which must always have separate opening and closing tags (e.g. "<b></b>") **/
private final String[] vNeedClosingTags;
/** set of disallowed html elements **/
private final String[] vDisallowed;
/** attributes which should be checked for valid protocols **/
private final String[] vProtocolAtts;
/** allowed protocols **/
private final String[] vAllowedProtocols;
/** tags which should be removed if they contain no content (e.g. "<b></b>" or "<b />") **/
private final String[] vRemoveBlanks;
/** entities allowed within html markup **/
private final String[] vAllowedEntities;
/** flag determining whether comments are allowed in input String. */
private final boolean stripComment;
private final boolean encodeQuotes;
private boolean vDebug = false;
/**
* flag determining whether to try to make tags when presented with "unbalanced"
* angle brackets (e.g. "<b text </b>" becomes "<b> text </b>"). If set to false,
* unbalanced angle brackets will be html escaped.
*/
private final boolean alwaysMakeTags;
/** Default constructor.
*
*/
public HTMLFilter() {
vAllowed = new HashMap<>();
final ArrayList<String> a_atts = new ArrayList<String>();
a_atts.add("href");
a_atts.add("target");
vAllowed.put("a", a_atts);
final ArrayList<String> img_atts = new ArrayList<String>();
img_atts.add("src");
img_atts.add("width");
img_atts.add("height");
img_atts.add("alt");
vAllowed.put("img", img_atts);
final ArrayList<String> no_atts = new ArrayList<String>();
vAllowed.put("b", no_atts);
vAllowed.put("strong", no_atts);
vAllowed.put("i", no_atts);
vAllowed.put("em", no_atts);
vSelfClosingTags = new String[]{"img"};
vNeedClosingTags = new String[]{"a", "b", "strong", "i", "em"};
vDisallowed = new String[]{};
vAllowedProtocols = new String[]{"http", "mailto", "https"}; // no ftp.
vProtocolAtts = new String[]{"src", "href"};
vRemoveBlanks = new String[]{"a", "b", "strong", "i", "em"};
vAllowedEntities = new String[]{"amp", "gt", "lt", "quot"};
stripComment = true;
encodeQuotes = true;
alwaysMakeTags = true;
}
/** Set debug flag to true. Otherwise use default settings. See the default constructor.
*
* @param debug turn debug on with a true argument
*/
public HTMLFilter(final boolean debug) {
this();
vDebug = debug;
}
/** Map-parameter configurable constructor.
*
* @param conf map containing configuration. keys match field names.
*/
public HTMLFilter(final Map<String,Object> conf) {
assert conf.containsKey("vAllowed") : "configuration requires vAllowed";
assert conf.containsKey("vSelfClosingTags") : "configuration requires vSelfClosingTags";
assert conf.containsKey("vNeedClosingTags") : "configuration requires vNeedClosingTags";
assert conf.containsKey("vDisallowed") : "configuration requires vDisallowed";
assert conf.containsKey("vAllowedProtocols") : "configuration requires vAllowedProtocols";
assert conf.containsKey("vProtocolAtts") : "configuration requires vProtocolAtts";
assert conf.containsKey("vRemoveBlanks") : "configuration requires vRemoveBlanks";
assert conf.containsKey("vAllowedEntities") : "configuration requires vAllowedEntities";
vAllowed = Collections.unmodifiableMap((HashMap<String, List<String>>) conf.get("vAllowed"));
vSelfClosingTags = (String[]) conf.get("vSelfClosingTags");
vNeedClosingTags = (String[]) conf.get("vNeedClosingTags");
vDisallowed = (String[]) conf.get("vDisallowed");
vAllowedProtocols = (String[]) conf.get("vAllowedProtocols");
vProtocolAtts = (String[]) conf.get("vProtocolAtts");
vRemoveBlanks = (String[]) conf.get("vRemoveBlanks");
vAllowedEntities = (String[]) conf.get("vAllowedEntities");
stripComment = conf.containsKey("stripComment") ? (Boolean) conf.get("stripComment") : true;
encodeQuotes = conf.containsKey("encodeQuotes") ? (Boolean) conf.get("encodeQuotes") : true;
alwaysMakeTags = conf.containsKey("alwaysMakeTags") ? (Boolean) conf.get("alwaysMakeTags") : true;
}
private void reset() {
vTagCounts.clear();
}
private void debug(final String msg) {
if (vDebug) {
Logger.getAnonymousLogger().info(msg);
}
}
//---------------------------------------------------------------
// my versions of some PHP library functions
public static String chr(final int decimal) {
return String.valueOf((char) decimal);
}
public static String htmlSpecialChars(final String s) {
String result = s;
result = regexReplace(P_AMP, "&amp;", result);
result = regexReplace(P_QUOTE, "&quot;", result);
result = regexReplace(P_LEFT_ARROW, "&lt;", result);
result = regexReplace(P_RIGHT_ARROW, "&gt;", result);
return result;
}
//---------------------------------------------------------------
/**
* given a user submitted input String, filter out any invalid or restricted
* html.
*
* @param input text (i.e. submitted by a user) than may contain html
* @return "clean" version of input, with only valid, whitelisted html elements allowed
*/
public String filter(final String input) {
reset();
String s = input;
debug("************************************************");
debug(" INPUT: " + input);
s = escapeComments(s);
debug(" escapeComments: " + s);
s = balanceHTML(s);
debug(" balanceHTML: " + s);
s = checkTags(s);
debug(" checkTags: " + s);
s = processRemoveBlanks(s);
debug("processRemoveBlanks: " + s);
s = validateEntities(s);
debug(" validateEntites: " + s);
debug("************************************************\n\n");
return s;
}
public boolean isAlwaysMakeTags(){
return alwaysMakeTags;
}
public boolean isStripComments(){
return stripComment;
}
private String escapeComments(final String s) {
final Matcher m = P_COMMENTS.matcher(s);
final StringBuffer buf = new StringBuffer();
if (m.find()) {
final String match = m.group(1); //(.*?)
m.appendReplacement(buf, Matcher.quoteReplacement("<!--" + htmlSpecialChars(match) + "-->"));
}
m.appendTail(buf);
return buf.toString();
}
private String balanceHTML(String s) {
if (alwaysMakeTags) {
//
// try and form html
//
s = regexReplace(P_END_ARROW, "", s);
s = regexReplace(P_BODY_TO_END, "<$1>", s);
s = regexReplace(P_XML_CONTENT, "$1<$2", s);
} else {
//
// escape stray brackets
//
s = regexReplace(P_STRAY_LEFT_ARROW, "&lt;$1", s);
s = regexReplace(P_STRAY_RIGHT_ARROW, "$1$2&gt;<", s);
//
// the last regexp causes '<>' entities to appear
// (we need to do a lookahead assertion so that the last bracket can
// be used in the next pass of the regexp)
//
s = regexReplace(P_BOTH_ARROWS, "", s);
}
return s;
}
private String checkTags(String s) {
Matcher m = P_TAGS.matcher(s);
final StringBuffer buf = new StringBuffer();
while (m.find()) {
String replaceStr = m.group(1);
replaceStr = processTag(replaceStr);
m.appendReplacement(buf, Matcher.quoteReplacement(replaceStr));
}
m.appendTail(buf);
s = buf.toString();
// these get tallied in processTag
// (remember to reset before subsequent calls to filter method)
for (String key : vTagCounts.keySet()) {
for (int ii = 0; ii < vTagCounts.get(key); ii++) {
s += "</" + key + ">";
}
}
return s;
}
private String processRemoveBlanks(final String s) {
String result = s;
for (String tag : vRemoveBlanks) {
if(!P_REMOVE_PAIR_BLANKS.containsKey(tag)){
P_REMOVE_PAIR_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?></" + tag + ">"));
}
result = regexReplace(P_REMOVE_PAIR_BLANKS.get(tag), "", result);
if(!P_REMOVE_SELF_BLANKS.containsKey(tag)){
P_REMOVE_SELF_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?/>"));
}
result = regexReplace(P_REMOVE_SELF_BLANKS.get(tag), "", result);
}
return result;
}
private static String regexReplace(final Pattern regex_pattern, final String replacement, final String s) {
Matcher m = regex_pattern.matcher(s);
return m.replaceAll(replacement);
}
private String processTag(final String s) {
// ending tags
Matcher m = P_END_TAG.matcher(s);
if (m.find()) {
final String name = m.group(1).toLowerCase();
if (allowed(name)) {
if (!inArray(name, vSelfClosingTags)) {
if (vTagCounts.containsKey(name)) {
vTagCounts.put(name, vTagCounts.get(name) - 1);
return "</" + name + ">";
}
}
}
}
// starting tags
m = P_START_TAG.matcher(s);
if (m.find()) {
final String name = m.group(1).toLowerCase();
final String body = m.group(2);
String ending = m.group(3);
//debug( "in a starting tag, name='" + name + "'; body='" + body + "'; ending='" + ending + "'" );
if (allowed(name)) {
String params = "";
final Matcher m2 = P_QUOTED_ATTRIBUTES.matcher(body);
final Matcher m3 = P_UNQUOTED_ATTRIBUTES.matcher(body);
final List<String> paramNames = new ArrayList<String>();
final List<String> paramValues = new ArrayList<String>();
while (m2.find()) {
paramNames.add(m2.group(1)); //([a-z0-9]+)
paramValues.add(m2.group(3)); //(.*?)
}
while (m3.find()) {
paramNames.add(m3.group(1)); //([a-z0-9]+)
paramValues.add(m3.group(3)); //([^\"\\s']+)
}
String paramName, paramValue;
for (int ii = 0; ii < paramNames.size(); ii++) {
paramName = paramNames.get(ii).toLowerCase();
paramValue = paramValues.get(ii);
if (allowedAttribute(name, paramName)) {
if (inArray(paramName, vProtocolAtts)) {
paramValue = processParamProtocol(paramValue);
}
params += " " + paramName + "=\"" + paramValue + "\"";
}
}
if (inArray(name, vSelfClosingTags)) {
ending = " /";
}
if (inArray(name, vNeedClosingTags)) {
ending = "";
}
if (ending == null || ending.length() < 1) {
if (vTagCounts.containsKey(name)) {
vTagCounts.put(name, vTagCounts.get(name) + 1);
} else {
vTagCounts.put(name, 1);
}
} else {
ending = " /";
}
return "<" + name + params + ending + ">";
} else {
return "";
}
}
// comments
m = P_COMMENT.matcher(s);
if (!stripComment && m.find()) {
return "<" + m.group() + ">";
}
return "";
}
private String processParamProtocol(String s) {
s = decodeEntities(s);
final Matcher m = P_PROTOCOL.matcher(s);
if (m.find()) {
final String protocol = m.group(1);
if (!inArray(protocol, vAllowedProtocols)) {
// bad protocol, turn into local anchor link instead
s = "#" + s.substring(protocol.length() + 1, s.length());
if (s.startsWith("#//")) {
s = "#" + s.substring(3, s.length());
}
}
}
return s;
}
private String decodeEntities(String s) {
StringBuffer buf = new StringBuffer();
Matcher m = P_ENTITY.matcher(s);
while (m.find()) {
final String match = m.group(1);
final int decimal = Integer.decode(match).intValue();
m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
}
m.appendTail(buf);
s = buf.toString();
buf = new StringBuffer();
m = P_ENTITY_UNICODE.matcher(s);
while (m.find()) {
final String match = m.group(1);
final int decimal = Integer.valueOf(match, 16).intValue();
m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
}
m.appendTail(buf);
s = buf.toString();
buf = new StringBuffer();
m = P_ENCODE.matcher(s);
while (m.find()) {
final String match = m.group(1);
final int decimal = Integer.valueOf(match, 16).intValue();
m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
}
m.appendTail(buf);
s = buf.toString();
s = validateEntities(s);
return s;
}
private String validateEntities(final String s) {
StringBuffer buf = new StringBuffer();
// validate entities throughout the string
Matcher m = P_VALID_ENTITIES.matcher(s);
while (m.find()) {
final String one = m.group(1); //([^&;]*)
final String two = m.group(2); //(?=(;|&|$))
m.appendReplacement(buf, Matcher.quoteReplacement(checkEntity(one, two)));
}
m.appendTail(buf);
return encodeQuotes(buf.toString());
}
private String encodeQuotes(final String s){
if(encodeQuotes){
StringBuffer buf = new StringBuffer();
Matcher m = P_VALID_QUOTES.matcher(s);
while (m.find()) {
final String one = m.group(1); //(>|^)
final String two = m.group(2); //([^<]+?)
final String three = m.group(3); //(<|$)
m.appendReplacement(buf, Matcher.quoteReplacement(one + regexReplace(P_QUOTE, "&quot;", two) + three));
}
m.appendTail(buf);
return buf.toString();
}else{
return s;
}
}
private String checkEntity(final String preamble, final String term) {
return ";".equals(term) && isValidEntity(preamble)
? '&' + preamble
: "&amp;" + preamble;
}
private boolean isValidEntity(final String entity) {
return inArray(entity, vAllowedEntities);
}
private static boolean inArray(final String s, final String[] array) {
for (String item : array) {
if (item != null && item.equals(s)) {
return true;
}
}
return false;
}
private boolean allowed(final String name) {
return (vAllowed.isEmpty() || vAllowed.containsKey(name)) && !inArray(name, vDisallowed);
}
private boolean allowedAttribute(final String name, final String paramName) {
return allowed(name) && (vAllowed.isEmpty() || vAllowed.get(name).contains(paramName));
}
}

View file

@ -0,0 +1,41 @@
package com.sqx.common.xss;
import com.sqx.common.exception.SqxException;
import org.apache.commons.lang.StringUtils;
/**
* SQL过滤
*
*/
public class SQLFilter {
/**
* SQL注入过滤
* @param str 待验证的字符串
*/
public static String sqlInject(String str){
if(StringUtils.isBlank(str)){
return null;
}
//去掉'|"|;|\字符
str = StringUtils.replace(str, "'", "");
str = StringUtils.replace(str, "\"", "");
str = StringUtils.replace(str, ";", "");
str = StringUtils.replace(str, "\\", "");
//转换成小写
str = str.toLowerCase();
//非法字符
String[] keywords = {"master", "truncate", "insert", "select", "delete", "update", "declare", "alter", "drop"};
//判断是否包含非法字符
for(String keyword : keywords){
if(str.indexOf(keyword) != -1){
throw new SqxException("包含非法字符");
}
}
return str;
}
}

View file

@ -0,0 +1,33 @@
package com.sqx.common.xss;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
* XSS过滤
*
*/
public class XssFilter implements Filter {
@Override
public void init(FilterConfig config) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper(
(HttpServletRequest) request);
chain.doFilter(xssRequest, response);
String requestURI = xssRequest.getRequestURI();
String method = xssRequest.getMethod();
System.err.println("当前请求的方法是:" + method + ",请求地址是:" + requestURI);
}
@Override
public void destroy() {
}
}

View file

@ -0,0 +1,138 @@
package com.sqx.common.xss;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* XSS过滤处理
*
*/
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
//没被包装过的HttpServletRequest特殊场景需要自己过滤
HttpServletRequest orgRequest;
//html过滤
private final static HTMLFilter HtmlFilter = new HTMLFilter();
public XssHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
orgRequest = request;
}
@Override
public ServletInputStream getInputStream() throws IOException {
//非json类型直接返回
if(!MediaType.APPLICATION_JSON_VALUE.equalsIgnoreCase(super.getHeader(HttpHeaders.CONTENT_TYPE))){
return super.getInputStream();
}
//为空直接返回
String json = IOUtils.toString(super.getInputStream(), "utf-8");
if (StringUtils.isBlank(json)) {
return super.getInputStream();
}
//xss过滤
json = xssEncode(json);
final ByteArrayInputStream bis = new ByteArrayInputStream(json.getBytes("utf-8"));
return new ServletInputStream() {
@Override
public boolean isFinished() {
return true;
}
@Override
public boolean isReady() {
return true;
}
@Override
public void setReadListener(ReadListener readListener) {
}
@Override
public int read() throws IOException {
return bis.read();
}
};
}
@Override
public String getParameter(String name) {
String value = super.getParameter(xssEncode(name));
if (StringUtils.isNotBlank(value)) {
value = xssEncode(value);
}
return value;
}
@Override
public String[] getParameterValues(String name) {
String[] parameters = super.getParameterValues(name);
if (parameters == null || parameters.length == 0) {
return null;
}
for (int i = 0; i < parameters.length; i++) {
parameters[i] = xssEncode(parameters[i]);
}
return parameters;
}
@Override
public Map<String,String[]> getParameterMap() {
Map<String,String[]> map = new LinkedHashMap<>();
Map<String,String[]> parameters = super.getParameterMap();
for (String key : parameters.keySet()) {
String[] values = parameters.get(key);
for (int i = 0; i < values.length; i++) {
values[i] = xssEncode(values[i]);
}
map.put(key, values);
}
return map;
}
@Override
public String getHeader(String name) {
String value = super.getHeader(xssEncode(name));
if (StringUtils.isNotBlank(value)) {
value = xssEncode(value);
}
return value;
}
private String xssEncode(String input) {
return HtmlFilter.filter(input);
}
/**
* 获取最原始的request
*/
public HttpServletRequest getOrgRequest() {
return orgRequest;
}
/**
* 获取最原始的request
*/
public static HttpServletRequest getOrgRequest(HttpServletRequest request) {
if (request instanceof XssHttpServletRequestWrapper) {
return ((XssHttpServletRequestWrapper) request).getOrgRequest();
}
return request;
}
}

View file

@ -0,0 +1,47 @@
package com.sqx.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;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 跨域设置
*/
@Configuration
public class CorsConfig implements WebMvcConfigurer {
/*private CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
// 1允许任何域名使用
corsConfiguration.addAllowedOrigin("*");
// 2允许任何头
corsConfiguration.addAllowedHeader("*");
// 3允许任何方法postget等
corsConfiguration.addAllowedMethod("*");
return corsConfiguration;
}
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", buildConfig());
return new CorsFilter(source);
}*/
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.maxAge(3600);
}
}

View file

@ -0,0 +1,40 @@
package com.sqx.config;
import com.sqx.common.xss.XssFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.DelegatingFilterProxy;
import javax.servlet.DispatcherType;
/**
* Filter配置
*
*/
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean shiroFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new DelegatingFilterProxy("shiroFilter"));
//该值缺省为false表示生命周期由SpringApplicationContext管理设置为true则表示由ServletContainer管理
registration.addInitParameter("targetFilterLifecycle", "true");
registration.setEnabled(true);
registration.setOrder(Integer.MAX_VALUE - 1);
registration.addUrlPatterns("/*");
return registration;
}
@Bean
public FilterRegistrationBean xssFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setDispatcherTypes(DispatcherType.REQUEST);
registration.setFilter(new XssFilter());
registration.addUrlPatterns("/*");
registration.setName("xssFilter");
registration.setOrder(Integer.MAX_VALUE);
return registration;
}
}

View file

@ -0,0 +1,30 @@
package com.sqx.config;
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 KaptchaConfig {
@Bean
public DefaultKaptcha producer() {
Properties properties = new Properties();
properties.put("kaptcha.border", "no");
properties.put("kaptcha.textproducer.font.color", "black");
properties.put("kaptcha.textproducer.char.space", "5");
properties.put("kaptcha.textproducer.font.names", "Arial,Courier,cmr10,宋体,楷体,微软雅黑");
Config config = new Config(properties);
DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
defaultKaptcha.setConfig(config);
return defaultKaptcha;
}
}

View file

@ -0,0 +1,22 @@
package com.sqx.config;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* mybatis-plus配置
*
*/
@Configuration
public class MybatisPlusConfig {
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}

View file

@ -0,0 +1,54 @@
package com.sqx.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.*;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* Redis配置
*
*/
@Configuration
public class RedisConfig {
@Autowired
private RedisConnectionFactory factory;
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(factory);
return redisTemplate;
}
@Bean
public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForHash();
}
@Bean
public ValueOperations<String, String> valueOperations(RedisTemplate<String, String> redisTemplate) {
return redisTemplate.opsForValue();
}
@Bean
public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForList();
}
@Bean
public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForSet();
}
@Bean
public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForZSet();
}
}

View file

@ -0,0 +1,83 @@
package com.sqx.config;
import com.sqx.modules.sys.oauth2.OAuth2Filter;
import com.sqx.modules.sys.oauth2.OAuth2Realm;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.Filter;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* Shiro配置
*
*/
@Configuration
public class ShiroConfig {
@Bean("securityManager")
public SecurityManager securityManager(OAuth2Realm oAuth2Realm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(oAuth2Realm);
securityManager.setRememberMeManager(null);
return securityManager;
}
@Bean("shiroFilter")
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
shiroFilter.setSecurityManager(securityManager);
//oauth过滤
Map<String, Filter> filters = new HashMap<>();
filters.put("oauth2", new OAuth2Filter());
shiroFilter.setFilters(filters);
Map<String, String> filterMap = new LinkedHashMap<>();
filterMap.put("/webjars/**", "anon");
filterMap.put("/druid/**", "anon");
filterMap.put("/app/wxPay/notifyJsApi", "anon");
filterMap.put("/app/wxPay/notifyMp", "anon");
filterMap.put("/app/wxPay/notify", "anon");
filterMap.put("/app/aliPay/notifyApp", "anon");
filterMap.put("/app/**", "anon");
filterMap.put("/activity/**", "anon");
filterMap.put("/banner/**", "anon");
filterMap.put("/courseClassification/selectCourseClassification", "anon");
filterMap.put("/sys/login", "anon");
filterMap.put("/swagger/**", "anon");
filterMap.put("/v2/api-docs", "anon");
filterMap.put("/swagger-ui.html", "anon");
filterMap.put("/swagger-ui/*", "anon");
filterMap.put("/swagger-resources/**", "anon");
filterMap.put("/captcha.jpg", "anon");
filterMap.put("/chatSocket/**", "anon");
filterMap.put("/websocket/**", "anon");
filterMap.put("/search/**", "anon");
filterMap.put("/alioss/**","anon");
filterMap.put("/**", "oauth2");
shiroFilter.setFilterChainDefinitionMap(filterMap);
return shiroFilter;
}
@Bean("lifecycleBeanPostProcessor")
public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
}
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
advisor.setSecurityManager(securityManager);
return advisor;
}
}

View file

@ -0,0 +1,53 @@
package com.sqx.config;
import io.swagger.annotations.ApiOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.ApiKey;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.List;
import static com.google.common.collect.Lists.newArrayList;
@Configuration
@EnableSwagger2
public class SwaggerConfig implements WebMvcConfigurer {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
//加了ApiOperation注解的类才生成接口文档
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
//包下的类才生成接口文档
//.apis(RequestHandlerSelectors.basePackage("com.sqx.controller"))
.paths(PathSelectors.any())
.build()
.securitySchemes(security());
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("")
.description("sqx-fast文档")
.termsOfServiceUrl("")
.version("3.0.0")
.build();
}
private List<ApiKey> security() {
return newArrayList(
new ApiKey("token", "token", "header")
);
}
}

View file

@ -0,0 +1,14 @@
package com.sqx.datasource.annotation;
import java.lang.annotation.*;
/**
* 多数据源注解
*/
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface DataSource {
String value() default "";
}

View file

@ -0,0 +1,61 @@
package com.sqx.datasource.aspect;
import com.sqx.datasource.annotation.DataSource;
import com.sqx.datasource.config.DynamicContextHolder;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
/**
* 多数据源切面处理类
*/
@Aspect
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class DataSourceAspect {
protected Logger logger = LoggerFactory.getLogger(getClass());
@Pointcut("@annotation(com.sqx.datasource.annotation.DataSource) " +
"|| @within(com.sqx.datasource.annotation.DataSource)")
public void dataSourcePointCut() {
}
@Around("dataSourcePointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
MethodSignature signature = (MethodSignature) point.getSignature();
Class targetClass = point.getTarget().getClass();
Method method = signature.getMethod();
DataSource targetDataSource = (DataSource)targetClass.getAnnotation(DataSource.class);
DataSource methodDataSource = method.getAnnotation(DataSource.class);
if(targetDataSource != null || methodDataSource != null){
String value;
if(methodDataSource != null){
value = methodDataSource.value();
}else {
value = targetDataSource.value();
}
DynamicContextHolder.push(value);
logger.debug("set datasource is {}", value);
}
try {
return point.proceed();
} finally {
DynamicContextHolder.poll();
logger.debug("clean datasource");
}
}
}

View file

@ -0,0 +1,47 @@
package com.sqx.datasource.config;
import java.util.ArrayDeque;
import java.util.Deque;
/**
* 多数据源上下文
*/
public class DynamicContextHolder {
@SuppressWarnings("unchecked")
private static final ThreadLocal<Deque<String>> CONTEXT_HOLDER = new ThreadLocal() {
@Override
protected Object initialValue() {
return new ArrayDeque();
}
};
/**
* 获得当前线程数据源
*
* @return 数据源名称
*/
public static String peek() {
return CONTEXT_HOLDER.get().peek();
}
/**
* 设置当前线程数据源
*
* @param dataSource 数据源名称
*/
public static void push(String dataSource) {
CONTEXT_HOLDER.get().push(dataSource);
}
/**
* 清空当前线程数据源
*/
public static void poll() {
Deque<String> deque = CONTEXT_HOLDER.get();
deque.poll();
if (deque.isEmpty()) {
CONTEXT_HOLDER.remove();
}
}
}

View file

@ -0,0 +1,15 @@
package com.sqx.datasource.config;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
/**
* 多数据源
*/
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DynamicContextHolder.peek();
}
}

View file

@ -0,0 +1,53 @@
package com.sqx.datasource.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.sqx.datasource.properties.DataSourceProperties;
import com.sqx.datasource.properties.DynamicDataSourceProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
/**
* 配置多数据源
*/
@Configuration
@EnableConfigurationProperties(DynamicDataSourceProperties.class)
public class DynamicDataSourceConfig {
@Autowired
private DynamicDataSourceProperties properties;
@Bean
@ConfigurationProperties(prefix = "spring.datasource.druid")
public DataSourceProperties dataSourceProperties() {
return new DataSourceProperties();
}
@Bean
public DynamicDataSource dynamicDataSource(DataSourceProperties dataSourceProperties) {
DynamicDataSource dynamicDataSource = new DynamicDataSource();
dynamicDataSource.setTargetDataSources(getDynamicDataSource());
//默认数据源
DruidDataSource defaultDataSource = DynamicDataSourceFactory.buildDruidDataSource(dataSourceProperties);
dynamicDataSource.setDefaultTargetDataSource(defaultDataSource);
return dynamicDataSource;
}
private Map<Object, Object> getDynamicDataSource(){
Map<String, DataSourceProperties> dataSourcePropertiesMap = properties.getDatasource();
Map<Object, Object> targetDataSources = new HashMap<>(dataSourcePropertiesMap.size());
dataSourcePropertiesMap.forEach((k, v) -> {
DruidDataSource druidDataSource = DynamicDataSourceFactory.buildDruidDataSource(v);
targetDataSources.put(k, druidDataSource);
});
return targetDataSources;
}
}

View file

@ -0,0 +1,44 @@
package com.sqx.datasource.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.sqx.datasource.properties.DataSourceProperties;
import java.sql.SQLException;
/**
* DruidDataSource
*
*/
public class DynamicDataSourceFactory {
public static DruidDataSource buildDruidDataSource(DataSourceProperties properties) {
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName(properties.getDriverClassName());
druidDataSource.setUrl(properties.getUrl());
druidDataSource.setUsername(properties.getUsername());
druidDataSource.setPassword(properties.getPassword());
druidDataSource.setInitialSize(properties.getInitialSize());
druidDataSource.setMaxActive(properties.getMaxActive());
druidDataSource.setMinIdle(properties.getMinIdle());
druidDataSource.setMaxWait(properties.getMaxWait());
druidDataSource.setTimeBetweenEvictionRunsMillis(properties.getTimeBetweenEvictionRunsMillis());
druidDataSource.setMinEvictableIdleTimeMillis(properties.getMinEvictableIdleTimeMillis());
druidDataSource.setMaxEvictableIdleTimeMillis(properties.getMaxEvictableIdleTimeMillis());
druidDataSource.setValidationQuery(properties.getValidationQuery());
druidDataSource.setValidationQueryTimeout(properties.getValidationQueryTimeout());
druidDataSource.setTestOnBorrow(properties.isTestOnBorrow());
druidDataSource.setTestOnReturn(properties.isTestOnReturn());
druidDataSource.setPoolPreparedStatements(properties.isPoolPreparedStatements());
druidDataSource.setMaxOpenPreparedStatements(properties.getMaxOpenPreparedStatements());
druidDataSource.setSharePreparedStatements(properties.isSharePreparedStatements());
try {
druidDataSource.setFilters(properties.getFilters());
druidDataSource.init();
} catch (SQLException e) {
e.printStackTrace();
}
return druidDataSource;
}
}

View file

@ -0,0 +1,192 @@
package com.sqx.datasource.properties;
/**
* 多数据源属性
*
*/
public class DataSourceProperties {
private String driverClassName;
private String url;
private String username;
private String password;
/**
* Druid默认参数
*/
private int initialSize = 2;
private int maxActive = 10;
private int minIdle = -1;
private long maxWait = 60 * 1000L;
private long timeBetweenEvictionRunsMillis = 60 * 1000L;
private long minEvictableIdleTimeMillis = 1000L * 60L * 30L;
private long maxEvictableIdleTimeMillis = 1000L * 60L * 60L * 7;
private String validationQuery = "select 1";
private int validationQueryTimeout = -1;
private boolean testOnBorrow = false;
private boolean testOnReturn = false;
private boolean testWhileIdle = true;
private boolean poolPreparedStatements = false;
private int maxOpenPreparedStatements = -1;
private boolean sharePreparedStatements = false;
private String filters = "stat,wall";
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getInitialSize() {
return initialSize;
}
public void setInitialSize(int initialSize) {
this.initialSize = initialSize;
}
public int getMaxActive() {
return maxActive;
}
public void setMaxActive(int maxActive) {
this.maxActive = maxActive;
}
public int getMinIdle() {
return minIdle;
}
public void setMinIdle(int minIdle) {
this.minIdle = minIdle;
}
public long getMaxWait() {
return maxWait;
}
public void setMaxWait(long maxWait) {
this.maxWait = maxWait;
}
public long getTimeBetweenEvictionRunsMillis() {
return timeBetweenEvictionRunsMillis;
}
public void setTimeBetweenEvictionRunsMillis(long timeBetweenEvictionRunsMillis) {
this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
}
public long getMinEvictableIdleTimeMillis() {
return minEvictableIdleTimeMillis;
}
public void setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis) {
this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
}
public long getMaxEvictableIdleTimeMillis() {
return maxEvictableIdleTimeMillis;
}
public void setMaxEvictableIdleTimeMillis(long maxEvictableIdleTimeMillis) {
this.maxEvictableIdleTimeMillis = maxEvictableIdleTimeMillis;
}
public String getValidationQuery() {
return validationQuery;
}
public void setValidationQuery(String validationQuery) {
this.validationQuery = validationQuery;
}
public int getValidationQueryTimeout() {
return validationQueryTimeout;
}
public void setValidationQueryTimeout(int validationQueryTimeout) {
this.validationQueryTimeout = validationQueryTimeout;
}
public boolean isTestOnBorrow() {
return testOnBorrow;
}
public void setTestOnBorrow(boolean testOnBorrow) {
this.testOnBorrow = testOnBorrow;
}
public boolean isTestOnReturn() {
return testOnReturn;
}
public void setTestOnReturn(boolean testOnReturn) {
this.testOnReturn = testOnReturn;
}
public boolean isTestWhileIdle() {
return testWhileIdle;
}
public void setTestWhileIdle(boolean testWhileIdle) {
this.testWhileIdle = testWhileIdle;
}
public boolean isPoolPreparedStatements() {
return poolPreparedStatements;
}
public void setPoolPreparedStatements(boolean poolPreparedStatements) {
this.poolPreparedStatements = poolPreparedStatements;
}
public int getMaxOpenPreparedStatements() {
return maxOpenPreparedStatements;
}
public void setMaxOpenPreparedStatements(int maxOpenPreparedStatements) {
this.maxOpenPreparedStatements = maxOpenPreparedStatements;
}
public boolean isSharePreparedStatements() {
return sharePreparedStatements;
}
public void setSharePreparedStatements(boolean sharePreparedStatements) {
this.sharePreparedStatements = sharePreparedStatements;
}
public String getFilters() {
return filters;
}
public void setFilters(String filters) {
this.filters = filters;
}
}

View file

@ -0,0 +1,22 @@
package com.sqx.datasource.properties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 多数据源属性
*/
@ConfigurationProperties(prefix = "dynamic")
public class DynamicDataSourceProperties {
private Map<String, DataSourceProperties> datasource = new LinkedHashMap<>();
public Map<String, DataSourceProperties> getDatasource() {
return datasource;
}
public void setDatasource(Map<String, DataSourceProperties> datasource) {
this.datasource = datasource;
}
}

View file

@ -0,0 +1,12 @@
package com.sqx.modules.app.annotation;
import java.lang.annotation.*;
/**
* app登录效验
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Login {
}

View file

@ -0,0 +1,16 @@
package com.sqx.modules.app.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 登录用户信息
*
*/
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginUser {
}

View file

@ -0,0 +1,38 @@
package com.sqx.modules.app.config;
import com.sqx.modules.app.interceptor.AuthorizationInterceptor;
import com.sqx.modules.app.resolver.LoginUserHandlerMethodArgumentResolver;
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.WebMvcConfigurer;
import java.util.List;
/**
* MVC配置
*
*/
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private AuthorizationInterceptor authorizationInterceptor;
@Autowired
private LoginUserHandlerMethodArgumentResolver loginUserHandlerMethodArgumentResolver;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authorizationInterceptor).addPathPatterns("/app/**");
}
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(loginUserHandlerMethodArgumentResolver);
}
}

View file

@ -0,0 +1,43 @@
package com.sqx.modules.app.controller;
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.sqx.common.utils.PageUtils;
import com.sqx.common.utils.Result;
import com.sqx.modules.app.annotation.Login;
import com.sqx.modules.app.annotation.LoginUser;
import com.sqx.modules.app.entity.Address;
import com.sqx.modules.app.entity.UserEntity;
import com.sqx.modules.app.service.AddressService;
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.text.SimpleDateFormat;
import java.util.Date;
/**
* 地址
*/
@RestController
@RequestMapping("/address")
@Api(value = "用户地址", tags = {"用户地址"})
public class AddressController {
@Autowired
private AddressService addressService;
@GetMapping("/selectAddressListById")
@ApiOperation("获取我的所有地址")
public Result selectAddressListById(Long userId,Integer page,Integer limit){
IPage<Address> addressIPage = addressService.page(new Page<>(page, limit), new QueryWrapper<Address>().eq("user_id", userId));
return Result.success().put("data",new PageUtils(addressIPage));
}
}

View file

@ -0,0 +1,70 @@
package com.sqx.modules.app.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sqx.common.utils.Result;
import com.sqx.modules.app.entity.App;
import com.sqx.modules.app.service.AppService;
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.text.SimpleDateFormat;
import java.util.Date;
/**
* APP登录授权
*
*/
@RestController
@RequestMapping("/appinfo")
@Api(value = "APP升级管理", tags = {"APP升级管理"})
public class AppUpgradeController {
@Autowired
private AppService iAppService;
@RequestMapping(value = "/list", method = RequestMethod.GET)
@ApiOperation("管理平台升级详情")
@ResponseBody
public Result list(Integer page,Integer limit) {
IPage<App> pages =new Page<>(page,limit);
return Result.success().put("data",iAppService.page(pages));
}
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
@ApiOperation("管理平台升级详情")
@ResponseBody
public Result getBanner(@PathVariable Long id) {
return Result.success().put("data",iAppService.selectAppById(id));
}
@RequestMapping(value = "/save", method = RequestMethod.POST)
@ApiOperation("管理平台添加升级信息")
@ResponseBody
public Result addBanner(@RequestBody App app) {
if(app.getId()!=null){
iAppService.updateAppById(app);
}else{
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
app.setCreateAt(sdf.format(new Date()));
iAppService.insertApp(app);
}
return Result.success();
}
@RequestMapping(value = "/delete/{id}", method = RequestMethod.GET)
@ApiOperation("管理平台删除升级信息")
public Result deleteBanner(@PathVariable Long id) {
iAppService.deleteAppById(id);
return Result.success();
}
}

View file

@ -0,0 +1,61 @@
package com.sqx.modules.app.controller;
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.sqx.common.utils.DateUtils;
import com.sqx.common.utils.PageUtils;
import com.sqx.common.utils.Result;
import com.sqx.modules.app.entity.Address;
import com.sqx.modules.app.entity.Car;
import com.sqx.modules.app.service.AddressService;
import com.sqx.modules.app.service.CarService;
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.Date;
/**
* 用户车辆信息
*/
@RestController
@RequestMapping("/car")
@Api(value = "用户车辆信息", tags = {"用户车辆信息"})
public class CarController {
@Autowired
private CarService carService;
@PostMapping("/insertCar")
@ApiOperation("添加车辆信息")
public Result insertCar(@RequestBody Car car){
car.setCreateTime(DateUtils.format(new Date()));
carService.save(car);
return Result.success();
}
@PostMapping("/updateCar")
@ApiOperation("修改车辆信息")
public Result updateCar(@RequestBody Car car){
carService.updateById(car);
return Result.success();
}
@PostMapping("/deleteCar")
@ApiOperation("删除车辆信息")
public Result deleteCar(Long carId){
carService.removeById(carId);
return Result.success();
}
@GetMapping("/selectCarList")
@ApiOperation("查询车辆信息")
public Result selectCarList(Integer page,Integer limit,Long userId,String userName,String phone){
return carService.selectCarList(page, limit, userId, userName, phone);
}
}

View file

@ -0,0 +1,61 @@
package com.sqx.modules.app.controller;
import com.sqx.common.utils.DateUtils;
import com.sqx.common.utils.Result;
import com.sqx.modules.app.entity.CityAgency;
import com.sqx.modules.app.service.CityAgencyService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
/**
* @author fang
* @date 2021/5/19
*/
@Slf4j
@RestController
@Api(value = "代理申请", tags = {"代理申请"})
@RequestMapping(value = "/cityAgency")
public class CityAgencyController {
@Autowired
private CityAgencyService cityAgencyService;
@GetMapping("/selectCityAgencyList")
@ApiOperation("查询城市代理")
public Result selectCityAgencyList(Integer page,Integer limit,String userName,String phone,Integer classify){
return cityAgencyService.selectCityAgencyList(page, limit, userName, phone, classify);
}
@PostMapping("/insertCityAgency")
@ApiOperation("添加城市代理")
public Result insertCityAgency(@RequestBody CityAgency cityAgency){
cityAgency.setCreateTime(DateUtils.format(new Date()));
cityAgencyService.save(cityAgency);
return Result.success();
}
@PostMapping("/updateCityAgency")
@ApiOperation("修改城市代理")
public Result updateCityAgency(@RequestBody CityAgency cityAgency){
cityAgencyService.updateById(cityAgency);
return Result.success();
}
@PostMapping("/deleteCityAgency")
@ApiOperation("删除城市代理")
public Result deleteCityAgency(Long id){
cityAgencyService.removeById(id);
return Result.success();
}
}

View file

@ -0,0 +1,45 @@
package com.sqx.modules.app.controller;
import com.sqx.common.utils.Result;
import com.sqx.modules.app.service.UserBrowseService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@AllArgsConstructor
@RequestMapping("/userBrowse")
@Api(value = "访客|浏览", tags = {"访客|浏览"})
public class UserBrowseController {
private UserBrowseService userBrowseService;
@ApiOperation("查询我的访客")
@RequestMapping(value = "/myVisitor", method = RequestMethod.GET)
public Result selectMyVisitor(@ApiParam("用户id") Long userId, @ApiParam("") Long page, @ApiParam("") Long limit) {
return userBrowseService.selectMyVisitor(userId, page, limit);
}
@RequestMapping(value = "/myBrowse", method = RequestMethod.GET)
@ApiOperation("浏览足迹")
public Result selectMyBrowse(Long userId, Long page, Long limit) {
return userBrowseService.selectMyBrowse(userId, page, limit);
}
@ApiOperation("删除我的访客")
@RequestMapping(value = "/deleteMyVisitor", method = RequestMethod.POST)
public Result deleteMyVisitor(Long id) {
return userBrowseService.deleteMyVisitor(id);
}
@ApiOperation(("删除足迹"))
@RequestMapping(value = "/deleteMyBrowse", method = RequestMethod.POST)
public Result deleteMyBrowse(Long id) {
return userBrowseService.deleteMyBrowse(id);
}
}

View file

@ -0,0 +1,67 @@
package com.sqx.modules.app.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sqx.common.utils.Result;
import com.sqx.modules.app.entity.UserCertification;
import com.sqx.modules.app.service.UserCertificationService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@AllArgsConstructor
@RequestMapping("/userCertification")
@Api("实 名 认 证")
public class UserCertificationController {
private UserCertificationService userCertificationService;
/**
* 实名列表
*/
@RequestMapping("/queryCertification")
@ApiOperation("实名列表")
public Result queryCertification(Long page, Long limit, @ApiParam("状态") String status, @ApiParam("姓名") String name) {
return userCertificationService.queryCertification(page, limit, status, name);
}
/**
* 查询已经进行实名的用户
*/
@RequestMapping("/queryUserCertification")
@ApiOperation("查询已经进行实名的用户")
public Result queryUserCertification(Long page, Long limit, String name,String phone) {
if (page == null || limit == null) {
return Result.error("分页条件为空");
} else {
IPage<UserCertification> iPage = new Page<>(page, limit);
return userCertificationService.queryUserCertification(iPage,name,phone);
}
}
/**
* 审核实名认证
*/
@RequestMapping("/auditorUserCertification")
@ApiOperation("审核实名认证")
public Result auditorUserCertification(Integer status, Long id, String remek) {
return userCertificationService.auditorUserCertification(status, id, remek);
}
@PostMapping("/updateUserCertification")
@ApiOperation("修改实名认证信息")
public Result updateUserCertification(@RequestBody UserCertification userCertification){
userCertificationService.updateById(userCertification);
return Result.success();
}
}

View file

@ -0,0 +1,500 @@
package com.sqx.modules.app.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sqx.common.utils.PageUtils;
import com.sqx.common.utils.Result;
import com.sqx.modules.app.dao.UserMoneyDao;
import com.sqx.modules.app.entity.UserCertification;
import com.sqx.modules.app.entity.UserEntity;
import com.sqx.modules.app.entity.UserMoney;
import com.sqx.modules.app.entity.UserMoneyDetails;
import com.sqx.modules.app.response.HomeMessageResponse;
import com.sqx.modules.app.response.UserMessageResponse;
import com.sqx.modules.app.service.UserCertificationService;
import com.sqx.modules.app.service.UserMoneyDetailsService;
import com.sqx.modules.app.service.UserMoneyService;
import com.sqx.modules.app.service.UserService;
import com.sqx.modules.laundry.dao.LaundryRepository;
import com.sqx.modules.laundry.model.Laundry;
import com.sqx.modules.orders.dao.OrdersDao;
import com.sqx.modules.orders.service.OrdersService;
import com.sqx.modules.pay.service.PayDetailsService;
import com.sqx.modules.utils.EasyPoi.ExcelUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author fang
* @date 2020/7/30
*/
@Slf4j
@RestController
@Api(value = "用户管理", tags = {"用户管理"})
@RequestMapping(value = "/user")
public class UserController {
@Autowired
private UserService userService;
@Autowired
private UserMoneyDetailsService userMoneyDetailsService;
@Autowired
private UserMoneyService userMoneyService;
@Autowired
private PayDetailsService payDetailsService;
@Autowired
private OrdersService ordersService;
@Autowired
private LaundryRepository laundryRepository;
@Autowired
private UserCertificationService certificationService;
@Autowired
private OrdersDao ordersDao;
@GetMapping("/selectShopList")
@ApiOperation("查询师傅列表")
public Result selectShopList(String userName, String phone, Long laundryId) {
return userService.selectShopList(userName, phone, laundryId);
}
@RequestMapping(value = "/{userId}", method = RequestMethod.GET)
@ApiOperation("获取用户详细信息")
@ResponseBody
public Result selectUserById(@ApiParam("用户id") @PathVariable Long userId) {
Map<String, Object> map = new HashMap<>();
UserEntity userEntity = userService.queryByUserId(userId);
UserMoney userMoney = userMoneyService.selectUserMoneyByUserId(userId);
Double money = 0.0;
BigDecimal safetyMoney = BigDecimal.ZERO;
if (userMoney != null) {
money = userMoney.getMoney().doubleValue();
safetyMoney = userMoney.getSafetyMoney();
}
//查询用户钱包
Double m = money;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = simpleDateFormat.format(new Date());
//查询本月充值
Double consume = payDetailsService.instantselectSumPay(date, userId);
//查询本月提现
Double income = userMoneyDetailsService.monthIncome(date, userId);
//查询邀请人数
int count = userService.queryInviterCount(userEntity.getInvitationCode());
//本月接单
int takeOrdersCount = ordersService.selectTakeOrdersCount(userId, date);
//本月订单
int myOrdersCount = ordersService.selectMyOrdersCount(userId, date);
if (userEntity.getLaundryId() != null) {
Laundry laundry = laundryRepository.findById(userEntity.getLaundryId()).orElse(null);
if (laundry != null) {
userEntity.setLaundryName(laundry.getLaundryName());
}
}
int rideSumBucketCount = ordersDao.sumOrderBucketCount(userId, null, null);
map.put("userEntity", userEntity);
map.put("money", m);
map.put("safetyMoney", safetyMoney);
map.put("consume", consume);
map.put("income", income);
map.put("count", count);
map.put("takeOrdersCount", takeOrdersCount);
map.put("myOrdersCount", myOrdersCount);
map.put("rideSumBucketCount", rideSumBucketCount);
return Result.success().put("data", map);
}
@PostMapping("/updateSafetyMoney")
@ApiOperation("修改")
public Result updateSafetyMoney(Long userId, Integer type, BigDecimal money) {
userMoneyService.updateSafetyMoney(type, userId, money);
UserMoneyDetails userMoneyDetails = new UserMoneyDetails();
userMoneyDetails.setClassify(4);
userMoneyDetails.setUserId(userId);
if (type == 1) {
userMoneyDetails.setTitle("[保证金]增加保证金");
userMoneyDetails.setContent("系统增加保证金");
} else {
userMoneyDetails.setTitle("[保证金]减少保证金");
userMoneyDetails.setContent("系统减少保证金");
}
userMoneyDetails.setType(type);
userMoneyDetails.setMoney(money);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
userMoneyDetails.setCreateTime(sdf.format(new Date()));
userMoneyDetailsService.save(userMoneyDetails);
UserMoney userMoney = userMoneyService.selectUserMoneyByUserId(userId);
if (userMoney.getSafetyMoney().doubleValue() > 0) {
UserEntity userEntity = userService.selectUserById(userId);
userEntity.setIsSafetyMoney(1);
userService.updateById(userEntity);
} else {
UserEntity userEntity = userService.selectUserById(userId);
userEntity.setIsSafetyMoney(2);
userService.updateById(userEntity);
}
return Result.success();
}
@RequestMapping(value = "/addCannotMoney/{userId}/{money}/{type}", method = RequestMethod.POST)
@ApiOperation("修改金额")
@ResponseBody
public Result addCannotMoney(@PathVariable("userId") Long userId, @PathVariable("money") Double money, @PathVariable("type") Integer type) {
if (type == 1) {
userMoneyService.updateMoney(1, userId, BigDecimal.valueOf(money));
UserMoneyDetails userMoneyDetails = new UserMoneyDetails();
userMoneyDetails.setMoney(BigDecimal.valueOf(money));
userMoneyDetails.setUserId(userId);
userMoneyDetails.setContent("管理端充值:" + money);
userMoneyDetails.setTitle("管理端充值金额");
userMoneyDetails.setType(1);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
userMoneyDetails.setCreateTime(simpleDateFormat.format(new Date()));
userMoneyDetailsService.save(userMoneyDetails);
} else {
userMoneyService.updateMoney(2, userId, BigDecimal.valueOf(money));
UserMoneyDetails userMoneyDetails = new UserMoneyDetails();
userMoneyDetails.setMoney(BigDecimal.valueOf(money));
userMoneyDetails.setUserId(userId);
userMoneyDetails.setContent("管理端减少:" + money);
userMoneyDetails.setTitle("管理端减少金额");
userMoneyDetails.setType(2);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
userMoneyDetails.setCreateTime(simpleDateFormat.format(new Date()));
userMoneyDetailsService.save(userMoneyDetails);
}
return Result.success();
}
@RequestMapping(value = "/selectUserList", method = RequestMethod.GET)
@ApiOperation("查询所有用户列表")
@ResponseBody
public Result selectUserList(Integer page, Integer limit,
@ApiParam("用户id 手机号 昵称 模糊搜索") String phone,
@ApiParam("性别 1男 2女") Integer sex,
@ApiParam("来源") String platform,
@ApiParam("手机终端") String sysPhone,
@ApiParam("状态 1正常 2封禁") Integer status,
Integer isAuthentication, Integer isPromotion,
Integer isAgent,
String userName,
Long laundryId,
String isSafetyMoney,
Integer isVip,
String invitationCode,
String inviterCode, Integer hasTicket) {
return Result.success().put("data", userService.selectUserPage(page, limit, phone, sex, platform, sysPhone,
status, isAuthentication, isPromotion, isAgent, userName, laundryId, isSafetyMoney, isVip, invitationCode, inviterCode, hasTicket));
}
@RequestMapping(value = "/deleteUserByUserId/{userId}", method = RequestMethod.POST)
@ApiOperation("删除用户")
@ResponseBody
public Result deleteUserByUserId(@PathVariable("userId") Long userId) {
userService.removeById(userId);
return Result.success();
}
@RequestMapping(value = "/updateUserByUserId", method = RequestMethod.POST)
@ApiOperation("修改用户")
@ResponseBody
public Result updateUserByUserId(@RequestBody UserEntity userEntity) {
if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotEmpty(userEntity.getInvitationCode())) {
UserEntity byId = userService.getById(userEntity.getUserId());
userService.update(null, Wrappers.<UserEntity>lambdaUpdate()
.set(UserEntity::getInviterCode, userEntity.getInvitationCode())
.eq(UserEntity::getInviterCode, byId.getInvitationCode()));
}
if (StringUtils.isNotEmpty(userEntity.getInviterCode())) {
UserEntity userEntity1 = userService.queryByInvitationCode(userEntity.getInviterCode());
if (userEntity1 == null) {
return Result.error("邀请码用户不存在!");
}
}
if (userEntity.getIsAgent() != null && userEntity.getIsAgent() != 1) {
userEntity.setProvince(null);
userEntity.setCity(null);
userEntity.setDistrict(null);
userService.cancelArea(userEntity);
}
userService.updateById(userEntity);
return Result.success();
}
@ResponseBody
@PostMapping(value = "/updateAgent")
@ApiOperation("修改用户代理")
public Result updateAgent(@RequestBody UserEntity userEntity) {
int count = 0;
//代理省级单位
if (StringUtils.isNotBlank(userEntity.getProvince()) && StringUtils.isBlank(userEntity.getCity()) && StringUtils.isBlank(userEntity.getDistrict())) {
count += userService.count(new QueryWrapper<UserEntity>().eq("province", userEntity.getProvince()));
}
//代理市级单位
if (StringUtils.isNotBlank(userEntity.getProvince()) && StringUtils.isNotBlank(userEntity.getCity()) && StringUtils.isBlank(userEntity.getDistrict())) {
count += userService.count(new QueryWrapper<UserEntity>().eq("province", userEntity.getProvince()).eq("city", userEntity.getCity()));
}
//代理区/县级单位
if (StringUtils.isNotBlank(userEntity.getProvince()) && StringUtils.isNotBlank(userEntity.getCity()) && StringUtils.isNotBlank(userEntity.getDistrict())) {
count += userService.count(new QueryWrapper<UserEntity>().eq("province", userEntity.getProvince()).eq("city", userEntity.getCity()).eq("district", userEntity.getDistrict()));
count += userService.count(new QueryWrapper<UserEntity>().eq("province", userEntity.getProvince()).eq("city", userEntity.getCity()).isNull("district"));
count += userService.count(new QueryWrapper<UserEntity>().eq("province", userEntity.getProvince()).isNull("city").isNull("district"));
}
if (count > 0) {
return Result.error("当前区域已有代理");
}
if (StringUtils.isBlank(userEntity.getProvince())) {
userEntity.setProvince(null);
}
if (StringUtils.isBlank(userEntity.getCity())) {
userEntity.setCity(null);
}
if (StringUtils.isBlank(userEntity.getDistrict())) {
userEntity.setDistrict(null);
}
return Result.upStatus(userService.cancelArea(userEntity));
}
@RequestMapping(value = "/updateUserAuthentication", method = RequestMethod.POST)
@ApiOperation("改为师傅或取消师傅")
@ResponseBody
public Result updateUserAuthentication(@RequestBody UserEntity userEntity) {
userService.update(null, Wrappers.<UserEntity>lambdaUpdate()
.set(UserEntity::getIsAuthentication, userEntity.getIsAuthentication())
.eq(UserEntity::getUserId, userEntity.getUserId()));
return Result.success();
}
@RequestMapping(value = "/updateUserStatusByUserId", method = RequestMethod.GET)
@ApiOperation("禁用或启用用户")
@ResponseBody
public Result updateUserByUserId(Long userId) {
UserEntity byId = userService.getById(userId);
if (byId.getStatus().equals(1)) {
byId.setStatus(2);
} else {
byId.setStatus(1);
}
userService.updateById(byId);
return Result.success();
}
/**
* 获取openid
*
* @param code 微信code
* @return openid
*/
@GetMapping("/openId/{code:.+}/{userId}")
@ApiOperation("根据code获取openid")
public Result getOpenid(@PathVariable("code") String code, @PathVariable("userId") Long userId) {
return userService.getOpenId(code, userId);
}
/**
* 信息分析
*
* @return
*/
@GetMapping("/homeMessage")
@ApiOperation("信息分析")
public Result homeMessage() {
HomeMessageResponse homeMessageResponse = new HomeMessageResponse();
// 0查总 1查天 2查月 3查年
//设置总用户人数
homeMessageResponse.setTotalUsers(userService.queryUserCount(0, null, null, null));
//设置今日新增
homeMessageResponse.setNewToday(userService.queryUserCount(1, null, null, null));
//设置本月新增
homeMessageResponse.setNewMonth(userService.queryUserCount(2, null, null, null));
//设置本年新增
homeMessageResponse.setNewYear(userService.queryUserCount(3, null, null, null));
//设置总收入
homeMessageResponse.setTotalRevenue(userService.queryPayMoney(0));
//设置今日收入
homeMessageResponse.setTodayRevenue(userService.queryPayMoney(1));
//设置本月收入
homeMessageResponse.setMonthRevenue(userService.queryPayMoney(2));
//设置本年收入
homeMessageResponse.setYearRevenue(userService.queryPayMoney(3));
return Result.success().put("data", homeMessageResponse);
}
/**
* 接单分析
*
* @return
*/
@GetMapping("/takingOrdersMessage")
@ApiOperation("接单分析")
public Result takingOrdersMessage(Long page, Long limit, String date, Long type) {
Page<Map<String, Object>> iPage = new Page<>(page, limit);
return userService.takingOrdersMessage(iPage, type, date);
}
/**
* 用户分析
*/
@GetMapping("/userMessage")
@ApiOperation("用户分析")
public Result userMessage(String date, Integer flag) {
int sumUserCount = userService.queryUserCount(flag, date, null, null);
int h5Count = userService.queryUserCount(flag, date, "H5", null);
int appCount = userService.queryUserCount(flag, date, "app", null);
int wxCount = userService.queryUserCount(flag, date, "小程序", null);
int memberCount = userService.userMessage(date, flag);
int userCount = sumUserCount - memberCount;
int sumAuthUserCount = userService.queryUserCount(flag, date, null, 1);
int h5AuthCount = userService.queryUserCount(flag, date, "H5", 1);
int appAuthCount = userService.queryUserCount(flag, date, "app", 1);
int wxAuthCount = userService.queryUserCount(flag, date, "小程序", 1);
Map<String, Integer> result = new HashMap<>();
result.put("sumUserCount", sumUserCount);
result.put("h5Count", h5Count);
result.put("appCount", appCount);
result.put("wxCount", wxCount);
result.put("memberCount", memberCount);
result.put("userCount", userCount);
result.put("sumAuthUserCount", sumAuthUserCount);
result.put("h5AuthCount", h5AuthCount);
result.put("appAuthCount", appAuthCount);
result.put("wxAuthCount", wxAuthCount);
return Result.success().put("data", result);
}
@PostMapping(value = "/updateUserBucket")
@ApiOperation("修改用户压桶数")
public Result updateUserBucket(Long updateUserId, Long userId, Integer num, Long ordersId) {
return userService.updateUserBucket(1, updateUserId, userId, num, ordersId);
}
@PostMapping("/updateUserLaundry")
@ApiOperation("修改师傅站点")
public Result updateUserLaundry(Long userId, Long laundryId) {
Laundry laundry = laundryRepository.findById(laundryId).orElse(null);
UserEntity userInfo = userService.getById(userId);
if (userInfo.getLaundryId() != null && !userInfo.getLaundryId().equals(laundry.getLaundryId())) {
Laundry oldLaundry = laundryRepository.findById(userInfo.getLaundryId()).orElse(null);
if (oldLaundry != null) {
StringBuilder stringBuilders = new StringBuilder();
for (String userIds : oldLaundry.getLaundryUserIds().split(",")) {
if (!userIds.equals(String.valueOf(userId))) {
stringBuilders.append(userIds).append(",");
}
}
String str = stringBuilders.toString();
if (StringUtils.isNotEmpty(str) && stringBuilders.charAt(stringBuilders.length() - 1) == ',') {
str = stringBuilders.substring(0, stringBuilders.length() - 1);
}
oldLaundry.setLaundryUserIds(str);
laundryRepository.save(oldLaundry);
}
}
StringBuilder stringBuilders = new StringBuilder();
for (String userIds : laundry.getLaundryUserIds().split(",")) {
stringBuilders.append(userIds).append(",");
}
stringBuilders.append(userId);
laundry.setLaundryUserIds(stringBuilders.toString());
laundryRepository.save(laundry);
userInfo.setLaundryId(laundryId);
userService.updateById(userInfo);
return Result.success();
}
@ApiOperation("赠送用户会员")
@PostMapping("/giveUserVip")
public Result giveUserVip(Long userId, Integer day) {
return userService.giveUserVip(userId, day);
}
@ApiOperation("取消用户会员")
@PostMapping("/cancelUserVip")
public Result cancelUserVip(Long userId) {
return userService.cancelUserVip(userId);
}
@ApiOperation("修改用户实名信息")
@PostMapping("/updateCertification")
public Result updateCertification(@RequestBody UserCertification userCertification) {
return certificationService.updateCertification(userCertification);
}
@ApiOperation("保证金统计")
@GetMapping("/safetyMoneyStatistics")
public Result safetyMoneyStatistics() {
return Result.success().put("data", certificationService.safetyMoneyStatistics());
}
@ApiOperation(value = "用户信息--导入")
@PostMapping(value = "/userExcelIn")
public Result userExcelIn(@ApiParam(name = "file", value = "excel文件") @RequestPart MultipartFile file) throws Exception {
try {
if (file == null) {
return Result.error("文件不能为空!");
}
return userService.userExcelIn(file);
} catch (Exception e) {
log.error("用户息列表--导入异常:", e);
}
// 返回结果
return Result.error("导入失败");
}
@ApiOperation("科室信息列表--导出")
@GetMapping("/departmentExcelOut")
public void departmentExcelOut(String phone,
Integer sex,
String platform,
String sysPhone,
Integer status,
Integer isAuthentication, Integer isPromotion,
Integer isAgent,
String userName,
Long laundryId,
String isSafetyMoney,
Integer isVip,
String invitationCode,
String search,
String inviterCode, Integer hasTicket, HttpServletResponse response) throws IOException {
List<UserEntity> list = userService.userEntityExcelOut(search, phone, sex, platform, sysPhone,
status, isAuthentication, isPromotion, isAgent, userName, laundryId, isSafetyMoney, isVip, invitationCode, inviterCode, hasTicket);
ExcelUtils.exportExcel(list, "用户统计表", "用户统计Sheet", UserEntity.class, "用户统计表", response);
}
@ApiOperation("获取桶数统计")
@GetMapping("/getUserBucket")
public Result getUserBucket(Integer flag, String date) {
return Result.success().put("data", userService.getUserBucket(flag, date));
}
}

View file

@ -0,0 +1,47 @@
package com.sqx.modules.app.controller;
import com.sqx.common.utils.Result;
import com.sqx.modules.app.annotation.Login;
import com.sqx.modules.app.service.UserFollowService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
@RestController
@AllArgsConstructor
@RequestMapping("/userFollow")
@Api(value = "关注|粉丝", tags = {"关注|粉丝"})
public class UserFollowController {
private UserFollowService userFollowService;
/**
* 查看我的关注
*/
@GetMapping("/selectMyFollow")
@ApiOperation("查看我的关注")
public Result selectMyFollow(Long userId, Long page, Long limit) {
return userFollowService.selectMyFollow(userId, page, limit);
}
/**
* 查看我的粉丝
*/
@GetMapping("/selectFans")
@ApiOperation("查看我的粉丝")
public Result selectFans(Long userId, Long page, Long limit) {
return userFollowService.selectFans(userId, page, limit);
}
/**
* 关注 / 取消关注
**/
@PostMapping("/insert")
@ApiOperation("关注/取消关注")
public Result insert(Long userId, Long followUserId) {
return userFollowService.insert(userId, followUserId);
}
}

View file

@ -0,0 +1,22 @@
package com.sqx.modules.app.controller;
import com.sqx.common.utils.Result;
import com.sqx.modules.app.service.UserMoneyDetailsService;
import com.sqx.modules.app.service.UserMoneyService;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/admin/userMoney/")
@Api("app 钱包 ")
public class UserMoneyController {
@Autowired
private UserMoneyDetailsService userMoneyDetailsService;
@Autowired
private UserMoneyService userMoneyService;
}

View file

@ -0,0 +1,57 @@
package com.sqx.modules.app.controller;
import com.sqx.common.utils.Result;
import com.sqx.modules.app.entity.UserEntity;
import com.sqx.modules.app.service.UserMoneyDetailsService;
import com.sqx.modules.app.service.UserService;
import com.sqx.modules.laundry.dao.LaundryRepository;
import com.sqx.modules.laundry.model.Laundry;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/Details")
@Api("钱包明细")
public class UserMoneyDetailsController {
@Autowired
private UserMoneyDetailsService userMoneyDetailsService;
@Autowired
private UserService userService;
@Autowired
private LaundryRepository laundryRepository;
@ApiOperation("钱包明细")
@GetMapping("/queryUserMoneyDetails")
public Result queryUserMoneyDetails(Integer page, Integer limit, Long userId,Integer classify,Integer type,String phone,String ordersNo,String userName) {
return userMoneyDetailsService.queryUserMoneyDetails(page, limit, userId,classify,type,phone,ordersNo, userName);
}
@ApiOperation("站点累计收益")
@GetMapping("/selectLaundrySumMoney")
public Result selectLaundrySumMoney(Long userId){
UserEntity userById = userService.selectUserById(userId);
Laundry laundry = laundryRepository.findById(userById.getLaundryId()).orElse(null);
if(laundry==null){
return Result.success();
}
Double sumMoney = userMoneyDetailsService.selectLaundrySumMoney(laundry.getLaundryUserId());
return Result.success().put("data",sumMoney);
}
@ApiOperation("钱包明细")
@GetMapping("/selectLaundryMoneyDetails")
public Result selectLaundryMoneyDetails(Integer page, Integer limit, Long userId,Integer classify,String phone,String ordersNo,String userName) {
UserEntity userById = userService.selectUserById(userId);
Laundry laundry = laundryRepository.findById(userById.getLaundryId()).orElse(null);
if(laundry==null){
return Result.success();
}
return userMoneyDetailsService.queryUserMoneyDetails(page, limit, laundry.getLaundryUserId(),classify,null,phone,ordersNo,userName);
}
}

View file

@ -0,0 +1,48 @@
package com.sqx.modules.app.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sqx.common.utils.PageUtils;
import com.sqx.common.utils.Result;
import com.sqx.modules.app.entity.VipDetails;
import com.sqx.modules.app.service.VipDetailsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@Api(value = "会员管理", tags = {"会员管理"})
@RequestMapping(value = "/vipDetails")
public class VipDetailsController {
@Autowired
private VipDetailsService vipDetailsService;
@ApiParam("添加会员的详情信息")
@PostMapping("/insertVipDetails")
public Result insertVipDetails(@RequestBody VipDetails vipDetails) {
return vipDetailsService.insertVipDetails(vipDetails);
}
@ApiParam("修改会员的详情信息")
@PostMapping("/updateVipDetails")
public Result updateVipDetails(@RequestBody VipDetails vipDetails) {
vipDetailsService.updateById(vipDetails);
return Result.success();
}
@ApiParam("删除的详情信息")
@PostMapping("/deleteVipDetails")
public Result deleteVipDetails(Long id) {
vipDetailsService.removeById(id);
return Result.success();
}
@ApiParam("查询会员列表")
@GetMapping("/selectVipDetailsList")
public Result selectVipDetailsList(Integer page,Integer limit) {
return Result.success().put("data",new PageUtils(vipDetailsService.page(new Page<>(page,limit))));
}
}

View file

@ -0,0 +1,105 @@
package com.sqx.modules.app.controller.app;
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.sqx.common.utils.PageUtils;
import com.sqx.common.utils.Result;
import com.sqx.modules.app.annotation.Login;
import com.sqx.modules.app.annotation.LoginUser;
import com.sqx.modules.app.entity.Address;
import com.sqx.modules.app.entity.UserEntity;
import com.sqx.modules.app.service.AddressService;
import com.sqx.modules.app.service.AppService;
import com.sqx.modules.app.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 地址
*/
@RestController
@RequestMapping("/app/address")
@Api(value = "用户地址", tags = {"用户地址"})
public class AppAddressController {
@Autowired
private AddressService addressService;
@Login
@PostMapping("/insertAddress")
@ApiOperation("添加地址")
public Result insertAddress(@LoginUser UserEntity user,@RequestBody Address address){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
address.setCreateTime(sdf.format(new Date()));
if(address.getIsDefault()==1){
addressService.updateAddressIsDefault(user.getUserId());
}
address.setUserId(user.getUserId());
addressService.save(address);
return Result.success();
}
@Login
@PostMapping("/updateAddress")
@ApiOperation("修改地址")
public Result updateAddress(@LoginUser UserEntity user,@RequestBody Address address){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
address.setCreateTime(sdf.format(new Date()));
if(address.getIsDefault()==1){
addressService.updateAddressIsDefault(user.getUserId());
}
address.setUserId(user.getUserId());
addressService.updateById(address);
return Result.success();
}
@Login
@PostMapping("/deleteAddress")
@ApiOperation("删除我的地址")
public Result deleteAddress(Long addressId){
addressService.removeById(addressId);
return Result.success();
}
@Login
@GetMapping("/selectAddressListById")
@ApiOperation("获取我的所有地址")
public Result selectAddressListById(@LoginUser UserEntity user,Integer page,Integer limit){
IPage<Address> addressIPage = addressService.page(new Page<>(page, limit), new QueryWrapper<Address>().eq("user_id", user.getUserId()));
return Result.success().put("data",new PageUtils(addressIPage));
}
@Login
@GetMapping("/selectAddressById")
@ApiOperation("获取我的默认地址")
public Result selectAddressById(@LoginUser UserEntity user){
Address one = addressService.getOne(new QueryWrapper<Address>().eq("user_id", user.getUserId()).orderByDesc("is_default").last(" limit 1"));
return Result.success().put("data",one);
}
@Login
@GetMapping("selectAddressByAddressId")
@ApiOperation("根据地址id查询地址详细信息")
public Result selectAddressByAddressId(Long addressId){
return Result.success().put("data",addressService.getById(addressId));
}
}

View file

@ -0,0 +1,66 @@
package com.sqx.modules.app.controller.app;
import com.sqx.common.utils.DateUtils;
import com.sqx.common.utils.Result;
import com.sqx.modules.app.annotation.Login;
import com.sqx.modules.app.entity.CityAgency;
import com.sqx.modules.app.service.CityAgencyService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
/**
* @author fang
* @date 2021/5/19
*/
@Slf4j
@RestController
@Api(value = "代理申请", tags = {"代理申请"})
@RequestMapping(value = "/app/cityAgency")
public class AppCityAgencyController {
@Autowired
private CityAgencyService cityAgencyService;
@Login
@GetMapping("/selectCityAgencyList")
@ApiOperation("查询城市代理")
public Result selectCityAgencyList(Integer page,Integer limit,String userName,String phone,Integer classify){
return cityAgencyService.selectCityAgencyList(page, limit, userName, phone, classify);
}
@Login
@PostMapping("/insertCityAgency")
@ApiOperation("添加城市代理")
public Result insertCityAgency(@RequestBody CityAgency cityAgency,@RequestAttribute Long userId){
cityAgency.setUserId(userId);
cityAgency.setCreateTime(DateUtils.format(new Date()));
cityAgencyService.save(cityAgency);
return Result.success();
}
@Login
@PostMapping("/updateCityAgency")
@ApiOperation("修改城市代理")
public Result updateCityAgency(@RequestBody CityAgency cityAgency){
cityAgencyService.updateById(cityAgency);
return Result.success();
}
@Login
@PostMapping("/deleteCityAgency")
@ApiOperation("删除城市代理")
public Result deleteCityAgency(Long id){
cityAgencyService.removeById(id);
return Result.success();
}
}

View file

@ -0,0 +1,170 @@
package com.sqx.modules.app.controller.app;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.sqx.common.utils.Result;
import com.sqx.modules.app.annotation.Login;
import com.sqx.modules.app.annotation.LoginUser;
import com.sqx.modules.app.dao.UserCertificationDao;
import com.sqx.modules.app.entity.UserCertification;
import com.sqx.modules.app.entity.UserEntity;
import com.sqx.modules.app.service.AppService;
import com.sqx.modules.app.service.UserService;
import com.sqx.modules.common.service.CommonInfoService;
import com.sqx.modules.utils.MD5Util;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
/**
* APP登录授权
*/
@RestController
@RequestMapping("/app/user")
@Api(value = "APP管理", tags = {"APP管理"})
public class AppController {
@Autowired
private UserService userService;
@Autowired
private AppService appService;
@Autowired
private CommonInfoService commonInfoService;
@RequestMapping(value = "/selectUserByIds", method = RequestMethod.GET)
@ApiOperation("获取用户详细信息")
@ResponseBody
public Result selectUserByIds(Long userId) {
return Result.success().put("data", userService.selectUserById(userId));
}
@Login
@RequestMapping(value = "/updatePwd", method = RequestMethod.POST)
@ResponseBody
@ApiOperation("用户端修改密码")
public Result updatePwd(@LoginUser UserEntity user, String pwd, String oldPwd) {
if (!user.getPassword().equals(DigestUtils.sha256Hex(oldPwd))) {
return Result.error("原始密码不正确!");
}
if (pwd.equals(oldPwd)) {
return Result.error("新密码不能与旧密码相同!");
}
user.setPassword(DigestUtils.sha256Hex(pwd));
userService.updateById(user);
return Result.success();
}
@Login
@RequestMapping(value = "/updatePhone", method = RequestMethod.POST)
@ApiOperation("用户端换绑手机号")
@ResponseBody
public Result updatePhone(@RequestAttribute("userId") Long userId, @RequestParam String phone, @RequestParam String msg) {
return userService.updatePhone(phone, msg, userId);
}
@Login
@RequestMapping(value = "/updateUser", method = RequestMethod.POST)
@ApiOperation("用户修改个人信息")
@ResponseBody
public Result updateUser(@RequestBody UserEntity userEntity, @RequestAttribute("userId") Long userId) {
userEntity.setUserId(userId);
userService.updateById(userEntity);
return Result.success();
}
@Login
@RequestMapping(value = "/updateUserImageUrl", method = RequestMethod.POST)
@ApiOperation("用户修改头像")
@ResponseBody
public Result updateUserImageUrl(@LoginUser UserEntity user, String avatar) {
user.setAvatar(avatar);
userService.updateById(user);
return Result.success();
}
@Login
@RequestMapping(value = "/updateUserName", method = RequestMethod.POST)
@ApiOperation("用户修改昵称")
@ResponseBody
public Result updateUserName(@LoginUser UserEntity user, String userName) {
user.setUserName(userName);
userService.updateById(user);
return Result.success();
}
@Login
@RequestMapping(value = "/selectUserById", method = RequestMethod.GET)
@ApiOperation("获取用户详细信息")
@ResponseBody
public Result selectUserById(@LoginUser UserEntity user) {
if (user != null) {
if (user.getRate() == null) {
user.setRate(new BigDecimal(commonInfoService.findOne(206).getValue()));
userService.updateById(user);
}
if (user.getZhiRate() == null) {
user.setZhiRate(new BigDecimal(commonInfoService.findOne(207).getValue()));
userService.updateById(user);
}
if (user.getFeiRate() == null) {
user.setFeiRate(new BigDecimal(commonInfoService.findOne(208).getValue()));
userService.updateById(user);
}
}
return Result.success().put("data", user);
}
@RequestMapping(value = "/selectNewApp", method = RequestMethod.GET)
@ApiOperation("升级检测")
@ResponseBody
public Result selectNewApp() {
return Result.success().put("data", appService.selectNewApp());
}
@RequestMapping(value = "/updateClientId", method = RequestMethod.GET)
@ApiOperation("绑定ClientId")
@ResponseBody
public Result updateClientId(String clientId, Long userId) {
UserEntity userEntity = new UserEntity();
userEntity.setUserId(userId);
userEntity.setClientid(clientId);
return Result.success();
}
@Login
@GetMapping(value = "/updateUserBucket")
@ApiOperation("修改用户压桶数")
public Result updateUserBucket(@RequestAttribute("userId") Long updateUserId, Long userId, Integer num,Long ordersId) {
return userService.updateUserBucket(2, updateUserId, userId, num, ordersId);
}
@ApiOperation("获取附近师傅列表")
@GetMapping("getNearbyWorker")
public Result getNearbyWorker(Integer page, Integer limit, Double lng, Double lat) {
return Result.success().put("data", userService.getNearbyWorker(page, limit, lng, lat));
}
@Login
@ApiOperation("购买桶")
@PostMapping("buyBucket")
public Result buyBucket(@RequestAttribute("userId") Long userId, Integer num) {
return userService.buyBucket(userId, num);
}
// @Login
// @ApiOperation("退桶")
// @PostMapping("backBucket")
// public Result backBucket(@RequestAttribute("userId") Long userId, Integer num) {
// return userService.backBucket(userId, num);
// }
}

View file

@ -0,0 +1,243 @@
package com.sqx.modules.app.controller.app;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.sqx.common.utils.Result;
import com.sqx.modules.app.entity.UserEntity;
import com.sqx.modules.app.service.IAppleService;
import com.sqx.modules.app.service.UserService;
import com.sqx.modules.app.utils.UserConstantInterface;
import com.sqx.modules.app.utils.WxPhone;
import com.sqx.modules.common.entity.CommonInfo;
import com.sqx.modules.common.service.CommonInfoService;
import com.sqx.modules.utils.HttpClientUtil;
import com.sqx.modules.utils.MD5Util;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import weixin.popular.api.SnsAPI;
import weixin.popular.bean.sns.SnsToken;
import java.util.HashMap;
import java.util.Map;
/**
* APP登录授权
*
*/
@RestController
@RequestMapping("/app/Login")
@Api("APP登录接口")
@Slf4j
public class AppLoginController {
@Autowired
private UserService userService;
@Autowired
private IAppleService appleService;
@Autowired
private CommonInfoService commonInfoService;
@ApiOperation("微信小程序登陆")
@RequestMapping(value = "/wxLogin", method = RequestMethod.GET)
public Result wxLogin(@ApiParam("小程序code码") String code, Integer type) {
return userService.wxLogin(code, type);
}
@ApiOperation("小程序登录新增或修改个人信息")
@RequestMapping(value = "/insertWxUser", method = RequestMethod.POST)
public Result insertWxUser(@RequestBody UserEntity userInfo) {
return userService.wxRegister(userInfo);
}
@RequestMapping(value = "/appleLogin", method = RequestMethod.GET)
@ApiOperation("苹果登陆获取appleUserId")
public Result loginVerify(@RequestParam("identityToken") String identityToken) {
try {
log.info("苹果token{}", identityToken);
JSONObject jsonObject = JSON.parseObject(identityToken);
JSONObject userInfo = jsonObject.getJSONObject("userInfo");
String identityTokens = userInfo.getString("identityToken");
return appleService.getAppleUserInfo(identityTokens);
} catch (Exception e) {
log.error("苹果token校验失败{}", identityToken, e);
return Result.error("苹果账号验证失败,请退出重试!");
}
}
@ApiOperation("苹果登录")
@RequestMapping(value = "/insertAppleUser", method = RequestMethod.GET)
public Result insertAppleUser(@RequestParam String appleId) {
return userService.iosRegister(appleId);
}
@RequestMapping(value = "/iosBindMobile", method = RequestMethod.POST)
@ApiOperation("苹果登录绑定手机号")
@ResponseBody
public Result iosBindMobile(@RequestParam String phone, @RequestParam String code, @RequestParam String appleId, @RequestParam String platform, @RequestParam Integer sysPhone) {
return userService.iosBindMobile(phone, code, appleId, platform, sysPhone);
}
@RequestMapping(value = "/wxAppLogin", method = RequestMethod.POST)
@ApiOperation("微信APP登录")
@ResponseBody
public Result wxAppLogin(@RequestParam String wxOpenId, @RequestParam String token) {
return userService.wxAppLogin(wxOpenId, token);
}
@RequestMapping(value = "/wxBindMobile", method = RequestMethod.POST)
@ApiOperation("微信登录绑定手机号")
@ResponseBody
public Result wxBindMobile(@RequestParam String phone, @RequestParam String code, @RequestParam String wxOpenId, @RequestParam String token, @RequestParam String platform, @RequestParam Integer sysPhone) {
return userService.wxBindMobile(phone, code, wxOpenId, token, platform, sysPhone);
}
@ApiOperation("用户端openid登录呢")
@RequestMapping(value = "/openid/login", method = RequestMethod.GET)
@ResponseBody
public Result loginByOpenId(@RequestParam String openId) {
return userService.loginByOpenId(openId);
}
@RequestMapping(value = "/registerCode", method = RequestMethod.POST)
@ApiOperation("app或h5注册或登录")
@ResponseBody
public Result registerCode(String phone, String msg, String platform, Integer sysPhone, String openId, String inviterCode, Integer courseType) {
return userService.registerCode(phone, msg, platform, sysPhone, openId, inviterCode, courseType);
}
@ApiOperation("用户端发送验证码")
@RequestMapping(value = "/sendMsg/{phone}/{state}", method = RequestMethod.GET)
@ResponseBody
public Result sendMsg(@PathVariable String phone, @PathVariable String state) {
return userService.sendMsg(phone, state);
}
@ApiOperation("解密手机号")
@RequestMapping(value = "/selectPhone", method = RequestMethod.POST)
public Result getPhoneNumberBeanS5(@RequestBody WxPhone wxPhone) {
return UserConstantInterface.decryptS5(wxPhone.getDecryptData(), wxPhone.getKey(), wxPhone.getIv());
}
@ApiParam("登录app")
@RequestMapping(value = "/loginApp", method = RequestMethod.POST)
public Result loginApp(@RequestParam String phone, @RequestParam String password) {
return userService.loginApp(phone, password);
}
@CrossOrigin
@ApiParam("注册app")
@RequestMapping(value = "/registApp", method = RequestMethod.POST)
public Result registApp(@RequestParam String userName, @RequestParam String phone, @RequestParam String password, String msg, @RequestParam String platform, String invitation, Integer courseType) {
return userService.registApp(userName, phone, password, msg, platform, invitation, courseType);
}
@ApiOperation("用户端忘记密码")
@RequestMapping(value = "/forgetPwd", method = RequestMethod.POST)
@ResponseBody
public Result forgetPwd(String pwd, String phone, String msg) {
return userService.forgetPwd(pwd, phone, msg);
}
@GetMapping("/selectCity")
@ApiOperation("根据经纬度获取城市")
public Result selectCity(String lat, String lng) {
String way = commonInfoService.findOne(414).getValue();
if ("1".equals(way)) {
CommonInfo one = commonInfoService.findOne(217);
String url = "https://apis.map.qq.com/ws/geocoder/v1/";
Map<String, String> maps = new HashMap<>();
maps.put("location", lat + "," + lng);
maps.put("key", one.getValue());
String data = HttpClientUtil.doGet(url, maps);
JSONObject jsonObject = JSON.parseObject(data);
String status = jsonObject.getString("status");
if ("0".equals(status)) {
JSONObject result = jsonObject.getJSONObject("result");
JSONObject adInfo = result.getJSONObject("ad_info");
return Result.success().put("data", adInfo);
} else {
log.error("转换失败!!!原因:" + jsonObject.getString("message"));
}
return Result.error("获取定位失败!");
} else {
String value = commonInfoService.findOne(415).getValue();
String url="http://api.tianditu.gov.cn/geocoder";
Map<String,String> param=new HashMap<>();
JSONObject postStr=new JSONObject();
postStr.put("lon",lng);
postStr.put("lat",lat);
postStr.put("ver","1");
param.put("postStr",postStr.toJSONString());
param.put("type","geocode");
param.put("tk",value);
String s = HttpClientUtil.doGet(url,param);
JSONObject jsonObject = JSONObject.parseObject(s);
String status = jsonObject.getString("status");
if ("0".equals(status)) {
JSONObject result = jsonObject.getJSONObject("result");
JSONObject addressComponent = result.getJSONObject("addressComponent");
String province = addressComponent.getString("province");
String city = addressComponent.getString("city");
String county = addressComponent.getString("county");
if (StringUtils.isEmpty(city)) {
if ("新疆维吾尔自治区".equals(province) || "台湾省".equals(province)) {
city = addressComponent.getString("county");
} else {
city = addressComponent.getString("province");
}
}
JSONObject jsonObject1 = new JSONObject();
jsonObject1.put("province", province);
jsonObject1.put("city", city);
jsonObject1.put("district", county);
return Result.success().put("data", jsonObject1);
}
return Result.error("获取定位失败!");
}
}
@GetMapping("/getOpenId")
@ApiOperation("公众号根据code换取openId")
public Result getOpenId(String code, Long userId) {
try {
//微信appid
CommonInfo one = commonInfoService.findOne(5);
//微信秘钥
CommonInfo two = commonInfoService.findOne(21);
SnsToken snsToken = SnsAPI.oauth2AccessToken(one.getValue(), two.getValue(), code);
String openid = snsToken.getOpenid();
return Result.success().put("data", openid);
} catch (Exception e) {
throw new RuntimeException("GET_OPENID_FAIL");
}
}
@GetMapping("/bindOpenId")
@ApiOperation("用户绑定公众号openId")
public Result bindOpenId(Long userId, String openId) {
UserEntity userEntity = new UserEntity();
userEntity.setUserId(userId);
userEntity.setOpenId(openId);
userService.updateById(userEntity);
return Result.success();
}
}

View file

@ -0,0 +1,55 @@
package com.sqx.modules.app.controller.app;
import com.sqx.common.utils.Result;
import com.sqx.modules.app.annotation.Login;
import com.sqx.modules.app.entity.UserBrowse;
import com.sqx.modules.app.service.UserBrowseService;
import com.sqx.modules.app.service.UserFollowService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
@RestController
@AllArgsConstructor
@RequestMapping("/app/userBrowse")
@Api(value = "app 访问 | 浏览 ", tags = {"app 访问 | 浏览 "})
public class AppUserBrowseController {
private UserBrowseService userBrowseService;
@ApiOperation("查询我的访客")
@Login
@RequestMapping("/myVisitor")
public Result selectMyVisitor(@RequestAttribute Long userId, Long page, Long limit) {
return userBrowseService.selectMyVisitor(userId, page, limit);
}
@Login
@RequestMapping("/myBrowse")
@ApiOperation("浏览足迹")
public Result selectMyBrowse(@RequestAttribute Long userId, Long page, Long limit) {
return userBrowseService.selectMyBrowse(userId, page, limit);
}
@Login
@RequestMapping("/selectAmount")
@ApiOperation("粉丝量 关注量 访客量 足迹量")
public Result selectAmount(@RequestAttribute Long userId) {
return userBrowseService.selectAmount(userId);
}
@ApiOperation("删除我的访客")
@RequestMapping(value = "/deleteMyVisitor", method = RequestMethod.POST)
public Result deleteMyVisitor(Long id) {
return userBrowseService.deleteMyVisitor(id);
}
@ApiOperation(("删除我的足迹"))
@RequestMapping(value = "/deleteMyBrowse", method = RequestMethod.POST)
public Result deleteMyBrowse(Long id) {
return userBrowseService.deleteMyBrowse(id);
}
}

View file

@ -0,0 +1,54 @@
package com.sqx.modules.app.controller.app;
import com.sqx.common.utils.Result;
import com.sqx.modules.app.annotation.Login;
import com.sqx.modules.app.entity.UserCertification;
import com.sqx.modules.app.service.UserCertificationService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@RestController
@AllArgsConstructor
@RequestMapping("/app/userCertification")
@Api("app实 名 认 证")
public class AppUserCertificationController {
private UserCertificationService userCertificationService;
/**
* 实名认证
**/
@RequestMapping("/insert")
@Login
@ApiOperation("实名认证")
public Result insert(@RequestAttribute Long userId, @RequestBody UserCertification userCertification) {
userCertification.setUserId(userId);
return userCertificationService.insert(userCertification);
}
/**
* 是否进行实名
*/
@RequestMapping("/isInsert")
@Login
@ApiOperation("是否进行实名")
public Result isInsert(@RequestAttribute Long userId) {
return userCertificationService.isInsert(userId);
}
/**
* 查询自己的实名信息
*/
@RequestMapping("/queryInsert")
@Login
@ApiOperation("查询自己的实名信息")
public Result queryInsert(@RequestAttribute Long userId) {
return userCertificationService.queryInsert(userId);
}
}

View file

@ -0,0 +1,56 @@
package com.sqx.modules.app.controller.app;
import com.sqx.common.utils.Result;
import com.sqx.modules.app.annotation.Login;
import com.sqx.modules.app.entity.UserFollow;
import com.sqx.modules.app.service.UserFollowService;
import io.swagger.annotations.Api;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.RequestAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@AllArgsConstructor
@RequestMapping("/app/userFollow")
@Api("app 关注")
public class AppUserFollowController {
private UserFollowService userFollowService;
/**
* 关注 / 取消关注
**/
@RequestMapping("/insert")
@Login
public Result insert(@RequestAttribute Long userId, @RequestParam Long followUserId) {
return userFollowService.insert(userId, followUserId);
}
/**
* 查看我的关注
*/
@RequestMapping("/selectMyFollow")
@Login
public Result selectMyFollow(@RequestAttribute Long userId,Long page,Long limit) {
return userFollowService.selectMyFollow(userId,page,limit);
}
/**
* 查看我的粉丝
*/
@RequestMapping("/selectFans")
@Login
public Result selectFans(@RequestAttribute Long userId,Long page,Long limit) {
return userFollowService.selectFans(userId,page,limit);
}
/**
* 查看我是否关注
*/
@RequestMapping("/selectFollowUser")
@Login
public Result selectFollowUser(@RequestAttribute Long userId,@RequestParam Long followUserId) {
return userFollowService.selectFollowUser(userId,followUserId);
}
}

View file

@ -0,0 +1,127 @@
package com.sqx.modules.app.controller.app;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sqx.common.utils.Result;
import com.sqx.modules.app.annotation.Login;
import com.sqx.modules.app.entity.UserEntity;
import com.sqx.modules.app.entity.UserMoneyDetails;
import com.sqx.modules.app.service.UserMoneyDetailsService;
import com.sqx.modules.app.service.UserMoneyService;
import com.sqx.modules.app.service.UserService;
import com.sqx.modules.laundry.dao.LaundryRepository;
import com.sqx.modules.laundry.model.Laundry;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/app/userMoney")
@Api("app 钱包 ")
public class AppUserMoneyController {
@Autowired
private UserMoneyService userMoneyService;
@Autowired
private UserMoneyDetailsService userMoneyDetailsService;
@Autowired
private UserService userService;
@Autowired
private LaundryRepository laundryRepository;
@Login
@ApiOperation("站点累计收益")
@GetMapping("/selectLaundrySumMoney")
public Result selectLaundrySumMoney(@RequestAttribute Long userId) {
UserEntity userById = userService.selectUserById(userId);
Laundry laundry = laundryRepository.findById(userById.getLaundryId()).orElse(null);
if (laundry == null) {
return Result.success();
}
Double sumMoney = userMoneyDetailsService.selectLaundrySumMoney(laundry.getLaundryUserId());
return Result.success().put("data", sumMoney);
}
@Login
@ApiOperation("钱包明细")
@GetMapping("/queryUserMoneyDetails")
public Result queryUserMoneyDetails(Integer page, Integer limit,@RequestAttribute Long userId,Integer classify,Integer type,String phone,String ordersNo,String userName) {
return userMoneyDetailsService.queryUserMoneyDetails(page, limit, userId,classify,type,phone,ordersNo, userName);
}
@GetMapping("/selectMyMoney")
@Login
@ApiOperation("我的钱包余额")
public Result selectMyMoney(@RequestAttribute Long userId) {
return Result.success().put("data", userMoneyService.selectUserMoneyByUserId(userId));
}
/**
* 我的收益
*/
@GetMapping("/selectMyProfit")
@Login
@ApiOperation("我的收益")
public Result selectMyProfit(@RequestAttribute Long userId) {
return Result.success().put("data", userMoneyService.selectMyProfit(userId));
}
/**
* 付款接单
*/
@GetMapping("/payTakingOrder")
@Login
@ApiOperation("付款接单或会员")
public Result payTakingOrder(@RequestAttribute Long userId, Long orderId) {
return Result.success().put("data", userMoneyService.payTakingOrder(userId, orderId));
}
/**
* 余额明细
*/
@GetMapping("/balanceDetailed")
@Login
@ApiOperation("余额明细")
public Result balanceDetailed(@RequestAttribute Long userId, Long page, Long limit) {
Page<UserMoneyDetails> pages = new Page<>(page, limit);
return Result.success().put("data", userMoneyService.balanceDetailed(userId, pages));
}
/**
* 收益明细
*/
@GetMapping("/profitDetailed")
@Login
@ApiOperation("收益明细")
public Result profitDetailed(@RequestAttribute Long userId, Long page, Long limit) {
if (page != null || limit != null) {
return Result.error("分页条件为空");
} else {
IPage ipage = new Page(page, limit);
return Result.success().put("data", userMoneyService.profitDetailed(userId, ipage));
}
}
@Login
@PostMapping("/paySafetyMoney")
@ApiOperation("缴纳保证金")
public Result paySafetyMoney(@RequestAttribute Long userId){
return userMoneyService.paySafetyMoney(userId);
}
@Login
@PostMapping("/refundSafetMoney")
@ApiOperation("退款保证金")
public Result refundSafetMoney(@RequestAttribute Long userId){
return userMoneyService.refundSafetMoney(userId);
}
}

View file

@ -0,0 +1,37 @@
package com.sqx.modules.app.controller.app;
import com.sqx.common.utils.Result;
import com.sqx.modules.app.annotation.Login;
import com.sqx.modules.app.service.UserVipService;
import com.sqx.modules.sys.controller.AbstractController;
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.RequestAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Api(value = "app 用户会员信息", tags = {"app 用户会员信息"})
@RequestMapping(value = "/app/UserVip")
public class AppUserVipController extends AbstractController {
@Autowired
private UserVipService userVipService;
@Login
@GetMapping("/selectUserVip")
@ApiOperation("查询用户会员信息")
public Result selectUserVip(@RequestAttribute Long userId) {
return Result.success().put("data", userVipService.selectUserVipByUserId(userId));
}
@Login
@GetMapping("/isUserVip")
@ApiOperation("查询用户是否是会员")
public Result isUserVip(@RequestAttribute Long userId) {
return userVipService.isUserVip(userId);
}
}

View file

@ -0,0 +1,46 @@
package com.sqx.modules.app.controller.app;
import com.sqx.common.utils.Result;
import com.sqx.modules.app.annotation.Login;
import com.sqx.modules.app.entity.VipDetails;
import com.sqx.modules.app.service.VipDetailsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiParam;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/app/VipDetails")
@AllArgsConstructor
@Api("app 会员详情信息")
public class AppVipDetailsController {
private VipDetailsService appVipDetailsService;
/**
* 查询会员的详情信息
*
* @return
*/
@Login
@ApiParam("查询会员的详情信息")
@GetMapping("/selectVipDetails")
public Result selectVipDetails() {
return appVipDetailsService.selectVipDetails();
}
/**
* 添加会员的详情信息
*
* @return
*/
@Login
@ApiParam("添加会员的详情信息")
@GetMapping("/insertVipDetails")
public Result insertVipDetails(VipDetails vipDetails) {
return appVipDetailsService.insertVipDetails(vipDetails);
}
}

View file

@ -0,0 +1,20 @@
package com.sqx.modules.app.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sqx.modules.app.entity.Address;
import com.sqx.modules.app.entity.App;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 地址
*
*/
@Mapper
public interface AddressDao extends BaseMapper<Address> {
int updateAddressIsDefault(@Param("userId") Long userId);
}

View file

@ -0,0 +1,20 @@
package com.sqx.modules.app.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sqx.modules.app.entity.App;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* 用户升级
*
*/
@Mapper
public interface AppDao extends BaseMapper<App> {
List<App> selectNewApp();
}

View file

@ -0,0 +1,17 @@
package com.sqx.modules.app.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sqx.modules.app.entity.Car;
import com.sqx.modules.app.entity.Msg;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface CarDao extends BaseMapper<Car> {
IPage<Car> selectCarList(Page<Car> page, Long userId, String userName, String phone);
}

View file

@ -0,0 +1,20 @@
package com.sqx.modules.app.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sqx.modules.app.entity.CityAgency;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* @author fang
* @date 2021/7/19
*/
@Mapper
public interface CityAgencyDao extends BaseMapper<CityAgency> {
IPage<CityAgency> selectCityAgencyList(Page<CityAgency> page,@Param("userName") String userName,@Param("phone") String phone,@Param("classify") Integer classify);
}

View file

@ -0,0 +1,20 @@
package com.sqx.modules.app.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sqx.modules.app.entity.Msg;
import org.apache.ibatis.annotations.Mapper;
/**
* 用户
*
*/
@Mapper
public interface MsgDao extends BaseMapper<Msg> {
Msg findByPhone(String phone);
Msg findByPhoneAndCode(String phone, String msg);
}

View file

@ -0,0 +1,23 @@
package com.sqx.modules.app.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.sqx.modules.app.entity.UserBrowse;
import com.sqx.modules.app.response.UserFollowResponse;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import java.util.Map;
@Mapper
public interface UserBrowseDao extends BaseMapper<UserBrowse> {
IPage<Map<String, Object>> selectMyBrowse(IPage iPage, Long userId);
List<UserFollowResponse> selectMyVisitor1(Long userId);
List<UserFollowResponse> selectMyBrowse1(Long userId);
Integer selectUserBrowseCountByUserId(Long userId,String startTime,String endTime);
}

View file

@ -0,0 +1,20 @@
package com.sqx.modules.app.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.sqx.common.utils.Result;
import com.sqx.modules.app.entity.UserCertification;
import com.sqx.modules.app.entity.UserEntity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
@Mapper
public interface UserCertificationDao extends BaseMapper<UserCertification> {
IPage<Map<String, Object>> queryCertification(IPage iPage, @Param("status") String status, @Param("name") String name);
IPage<Map<String, Object>> queryUserCertification(IPage iPage, @Param("name") String name,@Param("phone")String phone);
}

View file

@ -0,0 +1,57 @@
package com.sqx.modules.app.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sqx.modules.app.entity.UserEntity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
/**
* 用户
*/
@Mapper
public interface UserDao extends BaseMapper<UserEntity> {
IPage<UserEntity> selectUserPage(Page<UserEntity> page, String search, Integer sex, String platform,
String sysPhone, Integer status, Integer isAuthentication, Integer isPromotion,
Integer isAgent, String userName, Long laundryId, String isSafetyMoney, Integer isVip, String invitationCode, String inviterCode, Integer hasTicket);
int queryInviterCount(@Param("inviterCode") String inviterCode);
int queryUserCount(@Param("type") int type, @Param("date") String date,String platform,Integer isAuthentication);
Double queryPayMoney(@Param("type") int type, @Param("date") String date);
IPage<Map<String, Object>> queryCourseOrder(Page iPage, @Param("type") int type, @Param("date") String date);
int userMessage(String date, int type);
int insertUser(UserEntity userEntity);
IPage<Map<String, Object>> takingOrdersMessage(Page<Map<String, Object>> iPage, @Param("type") Long type, @Param("date") String date);
UserEntity queryAgentUser(String province,String city,String district);
Integer getAllBucket();
int updateUserInfoLaundryIdIsNull(Long laundryId);
List<UserEntity> selectShopUserByDistance(Long laundryId);
List<UserEntity> selectShopList(String userName,String phone,Long laundryId);
IPage<Map<String,Object>> selectUserOrdersList(Page<Map<String,Object>> page,Long laundryId,String userName,String phone,String time,Integer flag);
IPage<UserEntity> getNearbyWorker(@Param("pages") Page<UserEntity> pages, @Param("lng") double lng, @Param("lat") double lat,String distance);
int cancelArea(@Param("userEntity") UserEntity userEntity);
int setUserLaundry(Long userId);
}

View file

@ -0,0 +1,26 @@
package com.sqx.modules.app.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.sqx.common.utils.Result;
import com.sqx.modules.app.entity.UserFollow;
import com.sqx.modules.app.response.UserFollowResponse;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
@Mapper
public interface UserFollowDao extends BaseMapper<UserFollow> {
IPage<Map<String, Object>> selectMyFollow(IPage iPage, Long userId);
IPage<Map<String, Object>> selectFans(IPage iPage, Long userId);
List<UserFollowResponse> selectMyFollow1(Long userId);
List<UserFollowResponse> selectFans1(Long userId);
}

View file

@ -0,0 +1,22 @@
package com.sqx.modules.app.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.sqx.modules.app.entity.UserMoney;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.data.domain.Page;
import java.math.BigDecimal;
import java.util.HashMap;
@Mapper
public interface UserMoneyDao extends BaseMapper<UserMoney> {
void updateMayMoney(@Param("type") Integer type, @Param("userId") Long userId, @Param("money") BigDecimal money);
void updateSafetyMoney(@Param("type") Integer type, @Param("userId") Long userId, @Param("money") BigDecimal money);
BigDecimal sumHasSafetyMoney();
}

View file

@ -0,0 +1,25 @@
package com.sqx.modules.app.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sqx.modules.app.entity.UserMoneyDetails;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
@Mapper
public interface UserMoneyDetailsDao extends BaseMapper<UserMoneyDetails> {
Double monthIncome(@Param("date") String date,@Param("userId") Long userId);
Double selectMyProfit(Long userId);
Double selectLaundrySumMoney(Long userId);
Double selectCardSumMoney(String time, Integer flag,Integer classify);
IPage<UserMoneyDetails> queryUserMoneyDetails(@Param("pages") Page<UserMoneyDetails> pages, @Param("userId") Long userId, @Param("classify") Integer classify, @Param("type") Integer type, @Param("phone") String phone, @Param("ordersNo") String ordersNo, String userName);
BigDecimal safetyMoneyStatistics();
}

View file

@ -0,0 +1,9 @@
package com.sqx.modules.app.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sqx.modules.app.entity.UserVip;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserVipDao extends BaseMapper<UserVip> {
}

View file

@ -0,0 +1,17 @@
package com.sqx.modules.app.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.sqx.modules.app.entity.UserVisitor;
import com.sqx.modules.app.response.UserFollowResponse;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import java.util.Map;
@Mapper
public interface UserVisitorDao extends BaseMapper<UserVisitor> {
IPage<Map<String, Object>> selectMyVisitor(IPage iPage, Long userId);
List<UserFollowResponse> selectMyVisitor1(Long userId);
}

View file

@ -0,0 +1,9 @@
package com.sqx.modules.app.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sqx.modules.app.entity.VipDetails;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface VipDetailsDao extends BaseMapper<VipDetails> {
}

View file

@ -0,0 +1,11 @@
package com.sqx.modules.app.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sqx.modules.app.entity.VipDiscount;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface VipDiscountDao extends BaseMapper<VipDiscount> {
}

View file

@ -0,0 +1,74 @@
package com.sqx.modules.app.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
/**
* @description address
* @author fang
* @date 2021-11-10
*/
@Data
@TableName("address")
public class Address implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
/**
* 地址id
*/
private Integer addressId;
/**
* 姓名
*/
private String name;
/**
* 电话
*/
private String phone;
/**
*
*/
private String province;
/**
*
*/
private String city;
/**
*
*/
private String district;
/**
* 详细地址
*/
private String detailsAddress;
/**
* 是否是默认地址
*/
private Integer isDefault;
/**
* 时间
*/
private String createTime;
private Long userId;
private String longitude;
private String latitude;
public Address() {}
}

View file

@ -0,0 +1,35 @@
package com.sqx.modules.app.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
/**
* 广告位
*/
@Data
@TableName("app")
public class App implements Serializable {
@TableId
private Long id;
private String createAt;
private String androidWgtUrl;
private String iosWgtUrl;
private String wgtUrl;
private String version;
private String iosVersion;
private String method;
private String des;
}

View file

@ -0,0 +1,23 @@
package com.sqx.modules.app.entity;
import lombok.Data;
import java.util.List;
@Data
public class AppUserInfo {
private String openid;
private String nickname;
private int sex;
private String province;
private String city;
private String country;
private String headimgurl;
private String unionid;
private List<String> privilege;
}

View file

@ -0,0 +1,75 @@
package com.sqx.modules.app.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
/**
* @description car
* @author fang
* @date 2022-07-25
*/
@Data
public class Car implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 车辆id
*/
@TableId(type = IdType.AUTO)
private Long carId;
/**
* 车辆型号
*/
private String carType;
/**
* 车辆类型
*/
private String carClassify;
/**
* 车辆号码
*/
private String carNo;
/**
* 车辆颜色
*/
private String carColor;
/**
* 车主名称
*/
private String carName;
/**
* 车主电话
*/
private String carPhone;
/**
* 用户id
*/
private Long userId;
/**
* 创建时间
*/
private String createTime;
private String carLogo;
@TableField(exist = false)
private String userName;
@TableField(exist = false)
private String phone;
public Car() {}
}

View file

@ -0,0 +1,58 @@
package com.sqx.modules.app.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
/**
* @description city_agency
* @author fang
* @date 2021-07-19
*/
@Data
public class CityAgency implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 代理id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 用户id
*/
private Long userId;
/**
* 意向代理城市
*/
private String city;
/**
* 姓名
*/
private String userName;
/**
* 电话
*/
private String phone;
/**
* 1 职位招聘 2招商加盟
*/
private Integer classify;
/**
* 创建时间
*/
private String createTime;
public CityAgency() {}
}

View file

@ -0,0 +1,27 @@
package com.sqx.modules.app.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
/**
* @author fang
* @date 2020/7/10
*/
@Data
@TableName("msg")
public class Msg implements Serializable {
private static final long serialVersionUID = 1L;
@TableId
private Long id;
private String code;
private String phone;
}

View file

@ -0,0 +1,54 @@
package com.sqx.modules.app.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* @description user_browse
* @author liyuan
* @date 2021-08-12
*/
@Data
@ApiModel("user_browse")
public class UserBrowse implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
/**
* 浏览访客id
*/
@ApiModelProperty("浏览访客id")
private Long id;
/**
* 用户id
*/
@ApiModelProperty("用户id")
private Long userId;
/**
* 被浏览id
*/
@ApiModelProperty("被浏览id")
private Long byBrowseId;
/**
* 接单id
*/
@ApiModelProperty("接单id")
private Long takingId;
/**
* 更新时间
*/
@ApiModelProperty("更新时间")
private String updateTime;
public UserBrowse() {}
}

View file

@ -0,0 +1,91 @@
package com.sqx.modules.app.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* @author liyuan
* @description user_certification
* @date 2021-08-13
*/
@Data
@ApiModel("user_certification")
public class UserCertification implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
/**
* 用户实名认证id
*/
@ApiModelProperty("用户实名认证id")
private Long id;
/**
* 真实姓名
*/
@ApiModelProperty("真实姓名")
private String name;
/**
* 身份证号码
*/
@ApiModelProperty("身份证号码")
private String idNumber;
/**
* 用户id
*/
@ApiModelProperty("用户id")
private Long userId;
@TableField(exist = false)
private UserEntity userEntity;
/**
* 创建时间
*/
@ApiModelProperty("创建时间")
private String createTime;
/**
* 正面
*/
private String front;
/**
* 反面
*/
private String back;
/**
* 状态
*/
private Integer status;
/**
* 说明
*/
private String remek;
/**
* 修改时间
*/
private String updateTime;
private String phone;
private String birth;
private String sex;
public UserCertification() {
}
}

View file

@ -0,0 +1,27 @@
package com.sqx.modules.app.entity;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class UserDetails {
/**
* 本月订单数量
*/
private int monthlyOrderNum;
/**
* 本月充值金额
*/
private BigDecimal monthlyRechargeMoney;
/**
*本月提现数量
*/
private int monthWithdrawalNum;
/**
* 本月提现金额
*/
private BigDecimal monthlyWithdrawalMoney;
}

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