不行,这个数据传输太慢了,传了半天0%,这个量级太大了我还是只用其中的1000条记录意思一下就好了
算是简单处理好了数据库吧,后续如果遇到问题那么再对这个数据库进行调整,接下来打算去把注册登录功能完善
接下来优化注册登录功能,准备用mybatis进行数据库交互+swagger2自动生成api接口文档并测试
贴一些关键代码
application.yaml
全局配置文件
server:
port: 8443
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/wz_traffic?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
username: root
password: admin
mybatis:
type-aliases-package: com.zzzxlz.pojo
mapper-locations: classpath:mybatis/mapper/*.xml
config-location: classpath:mybatis/mybatis-config.xml
@Mapper
@Repository
public interface UserMapper {
List<User> queryUserList();
User queryUserById(int id);
User queryUserByName(String name);
User queryUserByEmail(String email);
User queryUserByPhone(String phone);
int addUser(User user);
int updateUser(User user);
int deleteUser(int id);
}
package com.zzzxlz.service;
import com.zzzxlz.mapper.UserMapper;
import com.zzzxlz.pojo.User;
import com.zzzxlz.utils.Myutils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
UserMapper userMapper;
public List<User> getUserList(){
return userMapper.queryUserList();
}
public User getUserById(int id){
return userMapper.queryUserById(id);
}
public User getUserByName(String name){
return userMapper.queryUserByName(name);
}
public User getUserByEmail(String email){
return userMapper.queryUserByEmail(email);
}
public User getUserByPhone(String phone){
return userMapper.queryUserByPhone(phone);
}
public User getUserByPwd(String password){
return userMapper.queryUserByPwd(password);
}
public int addUser(User user){
return userMapper.addUser(user);
}
public int updateUser(User user){
return userMapper.updateUser(user);
}
public int deleteUser(int id){
return userMapper.deleteUser(id);
}
//判断用户是否已经存在
public boolean isExist(String username) {
User user = userMapper.queryUserByName(username);
return null != user;
}
//注册
public int register(User user){
String username = user.getUsername();
String password = user.getPassword();
String email = user.getEmail();
String phone = user.getPhone();
String question = user.getQuestion();
//判断一些错误情况
if (username.equals("") || password.equals("")) {
return 0;
}
//判断用户名是否已经存在
if (isExist(username)) {
return 2;
}
//邮箱格式错误
if (!Myutils.isEmail(email)){
return 3;
}
//手机号码格式错误
if (!Myutils.isPhoneNumber(phone)){
return 4;
}
//注册成功返回
return 1;
}
//登录
public int login(User user){
User userInDB = null;
String password = user.getPassword();
String username = user.getUsername();
String email = user.getUsername();
String phone = user.getUsername();
if (username != null){
userInDB = userMapper.queryUserByName(username);
if (password == userInDB.getPassword()){
return 1;
} else {
return 2;
}
}
if (phone != null){
userInDB = userMapper.queryUserByName(email);
if (password == userInDB.getPassword()){
return 1;
} else {
return 3;
}
}
if (email != null){
userInDB = userMapper.queryUserByName(phone);
if (password == userInDB.getPassword()){
return 1;
} else {
return 4;
}
}
return 0;
}
//忘记密码回答密保问题重设密码
public int resetPassword(User user){
User userInDB = userMapper.queryUserByName(user.getUsername());
if (userInDB.getQuestion() == user.getQuestion()){
userInDB.setPassword(user.getPassword());
userMapper.updateUser(userInDB);
return 1;
}
return 0;
}
}
package com.zzzxlz.controller;
import com.zzzxlz.pojo.User;
import com.zzzxlz.result.Result;
import com.zzzxlz.result.ResultFactory;
import com.zzzxlz.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
/**
* @author shkstart
* @create 2021-02-03 12:55
*/
@Controller
public class LoginController {
@Autowired
UserService userService;
//响应注册的post方法
@PostMapping("/api/register")
public Result register(@RequestBody User user){
int status = userService.register(user);
switch (status){
case 0:
return ResultFactory.buildFailResult("用户名和密码不能为空");
case 1:
return ResultFactory.buildSuccessResult("注册成功");
case 2:
return ResultFactory.buildFailResult("用户已存在");
case 3:
return ResultFactory.buildFailResult("邮箱格式不正确");
case 4:
return ResultFactory.buildFailResult("手机格式不正确");
}
return ResultFactory.buildFailResult("未知错误");
}
//响应登录的post方法
@PostMapping("/api/login")
public Result login(@RequestBody User requestUser){
int status = userService.login(requestUser);
switch (status){
case 0:
return ResultFactory.buildFailResult("未知错误");
case 1:
return ResultFactory.buildSuccessResult("登录成功");
case 2:
return ResultFactory.buildFailResult("用户名或者密码输入错误");
case 3:
return ResultFactory.buildFailResult("手机号或者密码输入错误");
case 4:
return ResultFactory.buildFailResult("邮箱或者密码输入错误");
}
return ResultFactory.buildFailResult("未知错误");
}
//响应忘记密码的post方法
@PostMapping("/api/resetPwd")
public Result resetPwd(@RequestBody User requestUser){
int status = userService.resetPassword(requestUser);
switch (status){
case 0:
return ResultFactory.buildFailResult("密保问题回答错误");
case 1:
return ResultFactory.buildSuccessResult("密码重置成功");
}
return ResultFactory.buildFailResult("未知错误");
}
}
package com.zzzxlz.result;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Result {
//响应码
private int code;
//信息
private String message;
//结果
private Object result;
}
package com.zzzxlz.result;
public enum ResultCode {
SUCCESS(200),
FAIL(400),
//UNAUTHORIZED(401),
NOT_FOUND(404),
INTERNAL_SERVER_ERROR(500);
public int code;
ResultCode(int code){
this.code = code;
}
}
package com.zzzxlz.result;
public class ResultFactory {
public static Result buildSuccessResult(Object data){
return buildResult(ResultCode.SUCCESS, "成功", data);
}
public static Result buildFailResult(String message){
return buildResult(ResultCode.FAIL, message, null);
}
public static Result buildResult(ResultCode resultCode, String message, Object data) {
return buildResult(resultCode.code, message, data);
}
public static Result buildResult(int resultCode, String message, Object data){
return new Result(resultCode, message, data);
}
}
package com.zzzxlz.utils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static org.apache.logging.log4j.util.Strings.isEmpty;
public class Myutils {
/**
* 验证手机号码是否正确,正确返回true,否则返回false
* @param phoneNumber
* @return
*/
public static boolean isPhoneNumber(String phoneNumber) {
if (isEmpty(phoneNumber)) {
return false;
}
String regex = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(16[5,6])|(17[0-8])|(18[0-9])|(19[1、5、8、9]))\\d{8}$";
if (phoneNumber.length() != 11) {
return false;
} else {
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(phoneNumber);
return m.matches();
}
}
/**
* 验证邮箱格式是否正确,正确返回true,否则返回false
* @param email
* @return
*/
public static boolean isEmail(String email) {
if (email == null)
return false;
String regEx1 = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
Pattern p;
Matcher m;
p = Pattern.compile(regEx1);
m = p.matcher(email);
if (m.matches())
return true;
else
return false;
}
}
稍微了解一下部署项目到服务器,一般有两种选择
选择方法一, 首先下载 nginx,官方网址如下:
http://nginx.org/en/download.html
现在有了自己的一台服务器了,我要把我的简单的springboot项目打包部署试试
安装了jdk1.8
打包部署了自己的springboot程序
那么接下来就是在服务器安装mysql,然后把数据库放上去,这样就是一个后端可调用的api程序在服务器上跑着了
上网查攻略,然后在服务器下载了宝塔
在下载宝塔之前需要把服务器的端口给开了
使用putty通过ssh连接远程服务器,然后通过以下命令去安装宝塔面板
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh
mysql -uroot -padmin
mysql> use mysql;
mysql> select host,user from user;
mysql> set password for 'root'@'%' =password('数据库英文密码'); #设置mysql数据库密码
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '数据库密码' WITH GRANT OPTION;
# 修改授权,赋予任何主机访问数据库的权限
mysql> FLUSH PRIVILEGES; # 刷新权限,授权修改生效
mysql> exit; # 退出MySQL服务器
# 当再用Navicat连接时,密码输入上面修改的密码
请确保在 Linux 服务器的参数「AllowTcpForwarding」设置值为「yes」,否则,会禁用 SSH port forwarding。要查找路径:/etc/ssh/sshd_config。在默认情况下,SSH port forwarding 应该已启用。请仔细检查该值的设置。 即使服务器支持 SSH 通道,然而,如果 port forwarding 被禁用,Navicat 就无法通过 SSH 端口 22 连接。
#用连接 Linux 的工具先切换到项目 jar 包所在命令, nohup command & (其中 command 是你运行项目输入的命令)
nohup java -jar onlile-1.0.0-SNAPSHOT.jar > log.txt &
ps -ef | grep java :查看java 运行的几个端口号
kill -9 端口号 :杀死端口号,关闭程序。
cat info.log :查看文件
nohup java -jar huida-claimcloud-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev > clmcloud-start.log &
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
//.allowCredentials(true)
//.maxAge(3600)
.allowedHeaders("*");
}
}
nginx-1.19.6/html
文件夹下nginx.exe
Windows:
注意不要直接双击nginx.exe,这样会导致修改配置后重启、停止nginx无效,需要手动关闭任务管理器内的所有nginx进程
在nginx.exe目录,打开命令行工具,用命令 启动/关闭/重启nginx
start nginx #启动nginx
nginx -s reload #修改配置后重新加载生效
nginx -s reopen #重新打开日志文件
nginx -t -c /path/to/nginx.conf #测试nginx配置文件是否正确
关闭nginx:
nginx -s stop #快速停止nginx
nginx -s quit #完整有序的停止nginx
如果遇到报错:
bash: nginx: command not found
有可能是你再linux命令行环境下运行了windows命令,
如果你之前是允许 nginx -s reload报错, 试下 ./nginx -s reload
或者 用windows系统自带命令行工具运行
Linux:
nginx #打开 nginx
nginx -t #测试配置文件是否有语法错误
nginx -s reopen #重启Nginx
nginx -s reload #重新加载Nginx配置文件,然后以优雅的方式重启Nginx
nginx -s stop #强制停止Nginx服务
nginx -s quit #优雅地停止Nginx服务(即处理完所有请求后再停止服务)
nginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives]
-?,-h : 打开帮助信息
-v : 显示版本信息并退出
-V : 显示版本和配置选项信息,然后退出
-t : 检测配置文件是否有语法错误,然后退出
-q : 在检测配置文件期间屏蔽非错误信息
-s signal : 给一个 nginx 主进程发送信号:stop(强制停止), quit(优雅退出), reopen(重启), reload(重新加载配置文件)
-p prefix : 设置前缀路径(默认是:/usr/share/nginx/)
-c filename : 设置配置文件(默认是:/etc/nginx/nginx.conf)
-g directives : 设置配置文件外的全局指令
nginx启动服务提示98: Address already in use错误的解决
->sudo nginx -s stop
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-loggingartifactId>
exclusion>
exclusions>
dependency>
log4j2.xml
的配置文件
<configuration status="WARN" monitorInterval="30">
<appenders>
<console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
console>
<File name="log" fileName="log/test.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
File>
<RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log"
filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
Policies>
RollingFile>
<RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log"
filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
Policies>
<DefaultRolloverStrategy max="20"/>
RollingFile>
<RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/error.log"
filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
Policies>
RollingFile>
appenders>
<loggers>
<logger name="org.springframework" level="INFO">logger>
<logger name="org.mybatis" level="INFO">logger>
<root level="all">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
root>
loggers>
configuration>
resources.application.yaml
logging:
config: classpath:log4j2.xml
controller.TestController
@Log4j2
@RestController
public class TestController {
@RequestMapping("/test")
public String test(){
log.trace("I atestm trace log.");
log.debug("I am debug log.");
log.warn("I am warn log.");
log.error("I am error log.");
return "/test";
}
}
功能模块分析
功能模块分析
高德api可以帮我做到很多事情,路径规划什么什么的都可以,包括天气信息,我可以通过springboot给这个高德api进行再封装,因为高德api返回的信息有点多,我们项目比较简单我就可以通过springboot去调用高德api然后对信息进行处理,然后给前端返回一个比较简洁的json数据.
温州市区街道列表
温州市区各个街道的经纬度
天气预测的数据
路况数据
现在比较头疼的一点是我如何去获取这些数据,然后再把这些数据放到数据库去