diff --git a/bookMarkService/business/pom.xml b/bookMarkService/business/pom.xml index a380d16..b9e123a 100644 --- a/bookMarkService/business/pom.xml +++ b/bookMarkService/business/pom.xml @@ -9,7 +9,7 @@ 4.0.0 - business + bookmark-business pom user @@ -18,7 +18,7 @@ com.fanxb - common + bookmark-common 1.0-SNAPSHOT diff --git a/bookMarkService/business/user/pom.xml b/bookMarkService/business/user/pom.xml index c067757..d2360e3 100644 --- a/bookMarkService/business/user/pom.xml +++ b/bookMarkService/business/user/pom.xml @@ -3,13 +3,13 @@ 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"> - business + bookmark-business com.fanxb 1.0-SNAPSHOT 4.0.0 - user + bookmark-business-user \ No newline at end of file diff --git a/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/controller/UserController.java b/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/controller/UserController.java index de3af9e..468be45 100644 --- a/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/controller/UserController.java +++ b/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/controller/UserController.java @@ -1,8 +1,13 @@ package com.fanxb.bookmark.business.user.controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import com.fanxb.bookmark.business.user.entity.LoginBody; +import com.fanxb.bookmark.business.user.entity.RegisterBody; +import com.fanxb.bookmark.business.user.service.UserService; +import com.fanxb.bookmark.common.entity.Result; +import com.fanxb.bookmark.common.entity.User; +import org.apache.ibatis.annotations.Param; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; /** * 类功能简述: @@ -15,8 +20,48 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/user") public class UserController { - @GetMapping("/test") - public String test() { - return "abce"; + @Autowired + private UserService userService; + + /** + * Description: 注册用户 + * + * @param body 注册表单 + * @return com.fanxb.bookmark.common.entity.Result + * @author fanxb + * @date 2019/7/6 16:34 + */ + @PutMapping("") + public Result register(@RequestBody RegisterBody body) { + userService.register(body); + return Result.success(null); + } + + /** + * Description: 用户登录 + * + * @param user 登录表单 + * @return com.fanxb.bookmark.common.entity.Result + * @author fanxb + * @date 2019/7/6 16:35 + */ + @PostMapping("/login") + public Result login(@RequestBody LoginBody body) { + return Result.success(userService.login(body)); + } + + + /** + * Description: 获取验证码 + * + * @param email 邮箱 + * @return com.fanxb.bookmark.common.entity.Result + * @author fanxb + * @date 2019/7/5 17:37 + */ + @GetMapping("/authCode") + public Result getAuthCode(@Param("email") String email) { + userService.sendAuthCode(email); + return Result.success(null); } } diff --git a/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/dao/UserDao.java b/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/dao/UserDao.java index 3764eeb..c070ba9 100644 --- a/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/dao/UserDao.java +++ b/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/dao/UserDao.java @@ -1,5 +1,9 @@ package com.fanxb.bookmark.business.user.dao; +import com.fanxb.bookmark.common.entity.User; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Component; + /** * 类功能简述: * 类功能详述: @@ -7,5 +11,35 @@ package com.fanxb.bookmark.business.user.dao; * @author fanxb * @date 2019/7/6 11:36 */ -public class UserDao { +@Component +public interface UserDao { + + /** + * Description: 新增一个用户 + * + * @param user user + * @author fanxb + * @date 2019/7/6 11:37 + */ + void addOne(User user); + + /** + * Description: 通过用户名或者email获取用户信息 + * + * @param str username/email + * @return com.fanxb.bookmark.common.entity.User + * @author fanxb + * @date 2019/7/6 16:45 + */ + User selectByUsernameOrEmail(String str); + + /** + * Description: 更新用户上次登录时间 + * + * @param time 时间 + * @param userId 用户id + * @author fanxb + * @date 2019/7/6 16:46 + */ + void updateLastLoginTime(@Param("time") long time, @Param("userId") int userId); } diff --git a/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/entity/LoginBody.java b/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/entity/LoginBody.java index fe62b12..bec0f33 100644 --- a/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/entity/LoginBody.java +++ b/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/entity/LoginBody.java @@ -1,11 +1,20 @@ package com.fanxb.bookmark.business.user.entity; +import lombok.Data; + /** - * 类功能简述: + * 类功能简述:登录表单 * 类功能详述: * * @author fanxb * @date 2019/7/6 17:25 */ +@Data public class LoginBody { + /** + * 用户名或邮箱 + */ + private String str; + private String password; + private boolean rememberMe; } diff --git a/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/entity/LoginRes.java b/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/entity/LoginRes.java index 63adb04..87f5ea1 100644 --- a/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/entity/LoginRes.java +++ b/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/entity/LoginRes.java @@ -1,11 +1,20 @@ package com.fanxb.bookmark.business.user.entity; +import lombok.Data; + /** - * 类功能简述: + * 类功能简述:登录返回数据 * 类功能详述: * * @author fanxb * @date 2019/7/6 16:52 */ +@Data public class LoginRes { + private String token; + private int userId; + private String username; + private String email; + private String lastLoginTime; + private String icon; } diff --git a/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/entity/RegisterBody.java b/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/entity/RegisterBody.java index 4d075eb..4e64a4f 100644 --- a/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/entity/RegisterBody.java +++ b/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/entity/RegisterBody.java @@ -1,11 +1,18 @@ package com.fanxb.bookmark.business.user.entity; +import lombok.Data; + /** - * 类功能简述: + * 类功能简述: 注册表单 * 类功能详述: * * @author fanxb * @date 2019/7/6 11:23 */ +@Data public class RegisterBody { + private String username; + private String password; + private String email; + private String authCode; } diff --git a/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/service/UserService.java b/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/service/UserService.java new file mode 100644 index 0000000..cefe98c --- /dev/null +++ b/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/service/UserService.java @@ -0,0 +1,116 @@ +package com.fanxb.bookmark.business.user.service; + +import com.fanxb.bookmark.business.user.dao.UserDao; +import com.fanxb.bookmark.business.user.entity.LoginBody; +import com.fanxb.bookmark.business.user.entity.LoginRes; +import com.fanxb.bookmark.business.user.entity.RegisterBody; +import com.fanxb.bookmark.common.Constant; +import com.fanxb.bookmark.common.entity.MailInfo; +import com.fanxb.bookmark.common.entity.User; +import com.fanxb.bookmark.common.exception.CustomException; +import com.fanxb.bookmark.common.exception.FormDataException; +import com.fanxb.bookmark.common.util.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; + +/** + * 类功能简述: + * 类功能详述: + * + * @author fanxb + * @date 2019/7/5 17:39 + */ +@Service +public class UserService { + + private static final String DEFAULT_ICON = "defaultIcon.png"; + /** + * 短期jwt失效时间 + */ + private static final long SHORT_EXPIRE_TIME = 2 * 60 * 60 * 1000; + /** + * 长期jwt失效时间 + */ + private static final long LONG_EXPIRE_TIME = 30 * TimeUtil.DAY_MS; + + @Autowired + private UserDao userDao; + + /** + * Description: 向目标发送验证码 + * + * @param email 目标 + * @author fanxb + * @date 2019/7/5 17:48 + */ + public void sendAuthCode(String email) { + MailInfo info = new MailInfo(); + info.setSubject("签签世界注册验证码"); + int code = StringUtil.getRandomNumber(6, 6); + info.setContent("欢迎注册 签签世界 ,本次验证码"); + info.setContent(code + " 是您的验证码,注意验证码有效期为15分钟哦!"); + info.setReceiver(email); + if (Constant.isDev) { + code = 123456; + } else { + MailUtil.sendTextMail(info); + } + RedisUtil.set(Constant.authCodeKey(email), String.valueOf(code), Constant.AUTH_CODE_EXPIRE); + } + + /** + * Description: 用户注册 + * + * @param body 注册表单 + * @author fanxb + * @date 2019/7/6 11:30 + */ + public void register(RegisterBody body) { + String codeKey = Constant.authCodeKey(body.getEmail()); + String realCode = RedisUtil.get(codeKey, String.class); + if ((!StringUtil.isEmpty(realCode)) && (!realCode.equals(body.getAuthCode()))) { + throw new CustomException("验证码错误"); + } + RedisUtil.delete(codeKey); + User user = new User(); + user.setUsername(body.getUsername()); + user.setEmail(body.getEmail()); + user.setIcon(DEFAULT_ICON); + user.setPassword(HashUtil.sha1(HashUtil.md5(body.getPassword()))); + user.setCreateTime(System.currentTimeMillis()); + user.setLastLoginTime(0); + userDao.addOne(user); + } + + /** + * Description: 登录 + * + * @param body 登录表单 + * @return LoginRes + * @author fanxb + * @date 2019/7/6 16:37 + */ + public LoginRes login(LoginBody body) { + User userInfo = userDao.selectByUsernameOrEmail(body.getStr()); + if (userInfo == null) { + throw new FormDataException("账号/密码错误"); + } + if (!HashUtil.sha1(HashUtil.md5(body.getPassword())).equals(userInfo.getPassword())) { + throw new FormDataException("账号/密码错误"); + } + Map data = new HashMap<>(1); + data.put("userId", String.valueOf(userInfo.getUserId())); + String token = JwtUtil.encode(data, Constant.jwtSecret, body.isRememberMe() ? LONG_EXPIRE_TIME : SHORT_EXPIRE_TIME); + LoginRes res = new LoginRes(); + res.setToken(token); + res.setUserId(userInfo.getUserId()); + res.setUsername(userInfo.getUsername()); + res.setEmail(userInfo.getEmail()); + res.setIcon(userInfo.getIcon()); + userDao.updateLastLoginTime(System.currentTimeMillis(), userInfo.getUserId()); + return res; + } +} diff --git a/bookMarkService/business/user/src/main/resources/mapper/user-userMapper.xml b/bookMarkService/business/user/src/main/resources/mapper/user-userMapper.xml index e69de29..3dac61a 100644 --- a/bookMarkService/business/user/src/main/resources/mapper/user-userMapper.xml +++ b/bookMarkService/business/user/src/main/resources/mapper/user-userMapper.xml @@ -0,0 +1,31 @@ + + + + + + + insert into user (username, email, icon, password, createTime, lastLoginTime) + value + (#{username}, #{email}, #{icon}, #{password}, #{createTime}, #{lastLoginTime}) + + + + + + update user + set lastLoginTime = #{time} + where userId= #{userId} + + + + \ No newline at end of file diff --git a/bookMarkService/web/pom.xml b/bookMarkService/web/pom.xml index 6d44237..cca60a3 100644 --- a/bookMarkService/web/pom.xml +++ b/bookMarkService/web/pom.xml @@ -9,7 +9,7 @@ 4.0.0 - web + bookmark-web @@ -18,7 +18,7 @@ com.fanxb - user + bookmark-business-user 1.0-SNAPSHOT diff --git a/bookMarkService/web/src/main/java/com/fanxb/bookmark/web/Application.java b/bookMarkService/web/src/main/java/com/fanxb/bookmark/web/Application.java index 941c7d0..43c90f5 100644 --- a/bookMarkService/web/src/main/java/com/fanxb/bookmark/web/Application.java +++ b/bookMarkService/web/src/main/java/com/fanxb/bookmark/web/Application.java @@ -1,6 +1,7 @@ package com.fanxb.bookmark.web; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -12,6 +13,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; * @date 2019/7/4 19:38 */ @SpringBootApplication(scanBasePackages = "com.fanxb.bookmark") +@MapperScan(basePackages = "com.fanxb.bookmark.**.dao") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); diff --git a/bookMarkService/web/src/main/resources/application-dev.yml b/bookMarkService/web/src/main/resources/application-dev.yml new file mode 100644 index 0000000..736fe11 --- /dev/null +++ b/bookMarkService/web/src/main/resources/application-dev.yml @@ -0,0 +1,12 @@ +spring: + redis: + host: 192.168.64.129 + port: 6380 + datasource: + druid: + url: jdbc:mysql://192.168.64.129:3307/bookmark?useUnicode=true&characterEncoding=utf-8&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC + mail: + host: heiout.tapme.top + username: bookmark@mail.tapme.top + password: abcdefg123456 + port: 587 diff --git a/bookMarkService/web/src/main/resources/application.yml b/bookMarkService/web/src/main/resources/application.yml index 48aadf6..6754271 100644 --- a/bookMarkService/web/src/main/resources/application.yml +++ b/bookMarkService/web/src/main/resources/application.yml @@ -1,9 +1,43 @@ - +isDev: true +jwtSecret: abcdefgh +server: + port: 8088 + servlet: + context-path: /bookmark/api/ spring: + profiles: + active: dev + application: + name: bookmark + flyway: + baseline-on-migrate: true + cache: + type: redis + redis: + database: 0 + host: localhost + password: + timeout: 500ms + lettuce: + pool: + max-active: 20 + max-wait: 1000ms + max-idle: 20 + min-idle: 2 + datasource: + name: mysql + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + druid: + url: jdbc:mysql://localhost:3306/bookmark?useUnicode=true&characterEncoding=utf-8&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC + username: root + password: 123456 + # 其他连接池参数使用默认值 mail: host: username: password: + port: 465 properties: mail: smtp: @@ -11,6 +45,8 @@ spring: starttls: enable: true required: true - port: 465 -server: - port: 8088 + +mybatis: + configuration: + log-impl: org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl + mapper-locations: classpath:mapper/*.xml diff --git a/bookMarkService/web/src/main/resources/db/migration/V1__创建用户表.sql b/bookMarkService/web/src/main/resources/db/migration/V1__创建用户表.sql new file mode 100644 index 0000000..1efca52 --- /dev/null +++ b/bookMarkService/web/src/main/resources/db/migration/V1__创建用户表.sql @@ -0,0 +1,13 @@ +CREATE TABLE `user` ( + `userId` int UNSIGNED NOT NULL AUTO_INCREMENT, + `username` varchar(20) NOT NULL + COMMENT '用户名20位以内数字,字母组合', + `email` varchar(40) NOT NULL, + `icon` varchar(50) NOT NULL, + `password` char(40) NOT NULL + COMMENT '明文(6-20位数字密码组合)+userId 进行sha1签名', + `createTime` bigint NOT NULL DEFAULT 0, + `lastLoginTime` bigint NOT NULL DEFAULT 0, + PRIMARY KEY (`userId`) +) + ENGINE = InnoDB; \ No newline at end of file