application.properties
#阿里巴巴数据连接池
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#初始容量
spring.datasource.druid.initial-size=20
#最小连接数
spring.datasource.druid.min-idle=10
#最大连接数
spring.datasource.druid.max-active=100
#开启mybatisSQL显示
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#数据库url
spring.datasource.url=jdbc:mysql://localhost:3306/xiangmu?serverTimezone=UTC&userUnicode=true&characterEncoding=utf-8
#数据库用户密码
spring.datasource.username=root
spring.datasource.password=root
#开启mybatis二级缓存
mybatis.configuration.cache-enabled=true
#指定mybatis的Mapper文件存放位置
mybatis.mapper-locations=classpath:mapper/*.xml
#数据库驱动
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#单个文件大小
spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=100MB
#驼峰
mybatis.configuration.map-underscore-to-camel-case: true
#
#file.staticAccessPath=/keshe/**
##file.uploadFolder=/root/uploadFiles/
#file.uploadFolder=F://keshe/
#file.url=/keshe/
log4j
### 设置logger###
log4j.rootLogger = debug,stdout,D,E
### 输出信息到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 按天输出DEBUG 级别以上的日志到=D://logs/debug.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File =F://logs/debug.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %l%m%n
### 按天输出ERROR 级别以上的日志到=D://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =F\://logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern =%-d{yyyy-MM-dd HH\:mm\:ss} [ %t\:%r ] - [ %p ] %l%m%n
解决跨域
package com.thethird.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/*
* 跨域请求
*/
@Configuration
public class CorsConfig extends WebMvcConfigurerAdapter {
static final String ORIGINS[] = new String[]{"GET", "POST", "PUT", "DELETE"};
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("*").allowCredentials(true).allowedMethods(ORIGINS)
.maxAge(3600);
}
}
拦截器
package com.thethird.config;
import com.thethird.interceptors.JWTInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new JWTInterceptor())
.addPathPatterns("/test/**")//拦截所有用/**
.excludePathPatterns("/user/**","/keshe/**");//拦截了用户相关比如登录,不能生成token
}
}
图片配置
package com.thethird.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class WebMvcConfigurer extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//和页面有关的静态目录都放在项目的static目录下
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
//上传的图片在D盘下的OTA目录下,访问路径如:http://localhost:8081/OTA/d3cf0281-bb7f-40e0-ab77-406db95ccf2c.jpg
//其中OTA表示访问的前缀。"file:D:/OTA/"是文件真实的存储路径
registry.addResourceHandler("/keshe/**").addResourceLocations("file:F:/keshe/");
}
}
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.thethird</groupId>
<artifactId>coal_project</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>coal_project</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<!-- springboot整合web项目 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- springboot整合mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
<!-- springboot热部署 -->
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-devtools</artifactId>-->
<!-- <scope>runtime</scope>-->
<!-- <optional>true</optional>-->
<!-- </dependency>-->
<!-- java连接数据库 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- springboot读取配置文件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- lombook快速生成getset -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- springboot测试启动类 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- spring发送邮件 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-email</artifactId>
<version>1.5</version>
</dependency>
<!-- 阿里巴巴的fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.74</version>
</dependency>
<!-- 阿里巴巴连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!-- 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
<!-- slf4j日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- 支持下载 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.11.0</version>
</dependency>
</dependencies>
<!-- 打包 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
用户注册
public Result register(User user) {
if (user.getBusinessName()==null||user.getFiles()==null||user.getEmail()==null){
return new Result(500,"前台没传来要注册的用户信息","无法注册");
}
//注册校验,不存在可以注册
User datauser = userDao.selectByBusinessName(user);
if (datauser != null) {
return new Result(500, "失败", "已存在该用户");
}
System.out.println(".....");
System.out.println(user.getUserAccount() + user.getPassword() + user.getFiles());
//获取他的路径/keshe/xxxx.jpg
ArrayList file = user.getFiles();
//新的路径
ArrayList newFilePathArray = new ArrayList();
//新的路径名
String newPathName = new String();
//遍历数据路径
for (Object path : file) {
//测试输出路径
System.out.println(path.toString());
//获得路径
StringBuffer oldPath = new StringBuffer(path.toString());
//获得文件名linux得改----------------------------------------------------------
String fileName = oldPath.substring(7);
//到linux记得改路径-------------------------------------------------------------------------------
newPathName = "F:/keshe/" + user.getBusinessName() + "/" + "认证材料";
//老的文件路径 到linux记得改路径
File oldFile = new File("F:/keshe/" + fileName);
//创建新的文件夹
File newFileDir = new File(newPathName);
if (!newFileDir.exists()) {
newFileDir.mkdirs();
}
File newFile = new File(newPathName + "/" + fileName);
Rename_String.copyFile1(oldFile, newFileDir);
//删除老文件
oldFile.delete();
newFilePathArray.add(newFile.toString());
log.info("新的文件路径");
log.info(newFilePathArray);
}
用户认证(加盐)
@Override
@Transactional
public Result sendAccount(User user) throws EmailException {
User user1 = userDao.selectByBusinessName(user);
if (user1 == null) {
return new Result(500, "不存在该用户", "");
}
if (user1.getEmail() == null) {
return new Result(500, "没有邮箱", "");
}
String email = user1.getEmail();
//加密方式
//获取帐号
String userAccount;
User dataUser = userDao.selectTheLastOne();
//生成账号
if (dataUser.getUserAccount() != null) {
String account = dataUser.getUserAccount();
Integer accountNum = Integer.parseInt(account);
Integer random2 = random.nextInt(10);
Integer acc = accountNum + random2;
userAccount = acc.toString();
} else {
userAccount = "50000";
}
//随机密码(要发给邮箱的)
String password = RandomAccountAndPassword.getCharAndNumr();
user.setUserAccount(userAccount);
user.setPassword(password);
emailService.sendAccount(email, userAccount, password);
//加盐(要插入到数据库的)
String salt = UUID.randomUUID().toString();
user.setSalt(salt);
// System.out.println("盐值"+salt);
String pass = password + salt;
// System.out.println("密码+盐"+pass);
//要放在数据库密码这块的
String datapassword = DigestUtils.md5DigestAsHex(pass.getBytes());
user.setAuthentical(1);
user.setPassword(datapassword);
log.info(user.toString());
Financial financial=new Financial();
financial.setUserAccount(user.getUserAccount());
financial.setBalance(new BigDecimal(0));
financial.setFreeze(new BigDecimal(0));
//生成财物表的帐号
financialDao.insert(financial);
int i = userDao.updateUserAccountByBusinessName(user);
// System.out.println(s);
return new Result(200, "发送成功", i);
}
复制拷贝文件和随机文件名
package com.thethird.utils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.UUID;
import java.util.logging.Logger;
import static jdk.nashorn.internal.runtime.regexp.joni.Config.log;
public class Rename_String {
public static String rename(String origin) {
StringBuffer sb = new StringBuffer(origin);
//反转
String reverseStr = sb.reverse().toString();
System.out.println(reverseStr);
int indexOf = reverseStr.indexOf(".");
String subString = reverseStr.substring(0, indexOf + 1);
//str2是文件的格式如.png
String str2 = new StringBuffer(subString).reverse().toString();
UUID uuid = UUID.randomUUID();
String str = uuid.toString();
System.out.println(str + " =========");
String newStr = str.replace("-", "");
return newStr.concat(str2);
}
public static void removeFile(File oldPath, File newPath) {//复制
if (oldPath.exists()) {
File[] files = oldPath.listFiles();
for (File file : files) {
if (file.isFile()) {
copyFile1(file, newPath);
} else {
File file1 = new File(newPath, file.getName());
file1.mkdirs();
removeFile(file, file1);
}
}
}
}
public static void copyFile1(File file, File newPath) {//复制
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try {
fileInputStream = new FileInputStream(file);
fileOutputStream = new FileOutputStream(new File(newPath, file.getName()));
int len = 0;
byte[] bytes = new byte[1024 * 8];
while ((len = fileInputStream.read(bytes)) != -1) {
fileOutputStream.write(bytes, 0, len);
fileOutputStream.flush();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fileInputStream != null) {
fileInputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (fileOutputStream != null)
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void deleteFile(File oldPath) {//删除源文件
if (oldPath.exists()){
File[] files = oldPath.listFiles();
for (File file : files) {
if(file.isFile()){
file.delete();
}else {
deleteFile(file);
}
}
boolean delete = oldPath.delete();
System.out.println(delete);
}
}
public static void main(String[] args) {
StringBuffer sb=new StringBuffer("F:/keshe/\\50318f456c1447f6a2989903f2fd446b.png");
String substring = sb.substring(10);
System.out.println(substring);
}
}
随机生成密码
public class RandomAccountAndPassword {
public static String getCharAndNumr() {
String val = "";
Random random = new Random();
for (int i = 0; i < 8; i++) {
// 输出字母还是数字
String charOrNum = random.nextInt(2) % 2 == 0 ? "char" : "num";
// 字符串
if ("char".equalsIgnoreCase(charOrNum)) {
// 取得大写字母还是小写字母
int choice = random.nextInt(2) % 2 == 0 ? 65 : 97;
val += (char) (choice + random.nextInt(26));
} else if ("num".equalsIgnoreCase(charOrNum)) { // 数字
val += String.valueOf(random.nextInt(10));
}
}
return val;
}
}
分页
控制层
@RequestMapping("getUserListNoAuthenticalForAndroid")
public PagesList getUserListNoAuthentical1( Map<String, Integer> map) {
Integer pageNum = map.get("pageNum");
Integer pageSize=map.get("pageSize");
Integer maxPage=map.get("pages");
List<User> users= userService.getUserListNoAuthentical(pageNum, pageSize, maxPage);
PageInfo<User> pageInfo =new PageInfo<User>(users);
System.out.println(users);
System.out.println(pageInfo);
return new PagesList(200,"成功", pageInfo) ;
}
服务层
public List<User> getUserListNoAuthentical(Integer pageNum,Integer pageSize,Integer pages) {
//赛选,第几面
if (pageSize<=0||pageSize==null){
return null;
}
if (pageNum<1){
pageNum=1;
}else if(pageNum>=pages){
pageNum = pages;
}
PageHelper.startPage(pageNum, pageSize);
List<User> data = userDao.getUserListNoAuthentical();
if (data != null) {
return data;
} else {
return null;
}
}