checkCode() {
+ ValidateCodeVo vo = loginService.checkCode();
+ return Result.success(vo);
+ }
+}
diff --git a/service/service-web/src/main/java/cn/bunny/service/web/controller/UserController.java b/service/service-web/src/main/java/cn/bunny/service/web/controller/UserController.java
new file mode 100644
index 0000000..1fad15f
--- /dev/null
+++ b/service/service-web/src/main/java/cn/bunny/service/web/controller/UserController.java
@@ -0,0 +1,18 @@
+package cn.bunny.service.web.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ *
+ * 用户信息 前端控制器
+ *
+ *
+ * @author Bunny
+ * @since 2024-05-13
+ */
+@RestController
+@RequestMapping("/user")
+public class UserController {
+
+}
diff --git a/service/service-web/src/main/java/cn/bunny/service/web/controller/UserIntegralRecordController.java b/service/service-web/src/main/java/cn/bunny/service/web/controller/UserIntegralRecordController.java
new file mode 100644
index 0000000..727cf66
--- /dev/null
+++ b/service/service-web/src/main/java/cn/bunny/service/web/controller/UserIntegralRecordController.java
@@ -0,0 +1,18 @@
+package cn.bunny.service.web.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ *
+ * 用户积分记录表 前端控制器
+ *
+ *
+ * @author Bunny
+ * @since 2024-05-13
+ */
+@RestController
+@RequestMapping("/userIntegralRecord")
+public class UserIntegralRecordController {
+
+}
diff --git a/service/service-web/src/main/java/cn/bunny/service/web/controller/UserRoleController.java b/service/service-web/src/main/java/cn/bunny/service/web/controller/UserRoleController.java
new file mode 100644
index 0000000..c222e9f
--- /dev/null
+++ b/service/service-web/src/main/java/cn/bunny/service/web/controller/UserRoleController.java
@@ -0,0 +1,18 @@
+package cn.bunny.service.web.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ *
+ * 前端控制器
+ *
+ *
+ * @author Bunny
+ * @since 2024-05-13
+ */
+@RestController
+@RequestMapping("/userRole")
+public class UserRoleController {
+
+}
diff --git a/service/service-web/src/main/java/cn/bunny/service/web/mapper/UserIntegralRecordMapper.java b/service/service-web/src/main/java/cn/bunny/service/web/mapper/UserIntegralRecordMapper.java
new file mode 100644
index 0000000..257458d
--- /dev/null
+++ b/service/service-web/src/main/java/cn/bunny/service/web/mapper/UserIntegralRecordMapper.java
@@ -0,0 +1,18 @@
+package cn.bunny.service.web.mapper;
+
+import cn.bunny.entity.system.UserIntegralRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ *
+ * 用户积分记录表 Mapper 接口
+ *
+ *
+ * @author Bunny
+ * @since 2024-05-13
+ */
+@Mapper
+public interface UserIntegralRecordMapper extends BaseMapper {
+
+}
diff --git a/service/service-web/src/main/java/cn/bunny/service/web/mapper/UserMapper.java b/service/service-web/src/main/java/cn/bunny/service/web/mapper/UserMapper.java
new file mode 100644
index 0000000..7332cba
--- /dev/null
+++ b/service/service-web/src/main/java/cn/bunny/service/web/mapper/UserMapper.java
@@ -0,0 +1,27 @@
+package cn.bunny.service.web.mapper;
+
+import cn.bunny.entity.system.User;
+import cn.bunny.vo.system.LoginVo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ *
+ * 用户信息 Mapper 接口
+ *
+ *
+ * @author Bunny
+ * @since 2024-05-13
+ */
+@Mapper
+public interface UserMapper extends BaseMapper {
+
+ /**
+ * 前台用户登录接口
+ *
+ * @param username 邮箱/昵称
+ * @param password 吗,Image
+ * @return 登录参数
+ */
+ LoginVo login(String username, String password);
+}
diff --git a/service/service-web/src/main/java/cn/bunny/service/web/mapper/UserRoleMapper.java b/service/service-web/src/main/java/cn/bunny/service/web/mapper/UserRoleMapper.java
new file mode 100644
index 0000000..fd5e6e1
--- /dev/null
+++ b/service/service-web/src/main/java/cn/bunny/service/web/mapper/UserRoleMapper.java
@@ -0,0 +1,18 @@
+package cn.bunny.service.web.mapper;
+
+import cn.bunny.entity.system.UserRole;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author Bunny
+ * @since 2024-05-13
+ */
+@Mapper
+public interface UserRoleMapper extends BaseMapper {
+
+}
diff --git a/service/service-web/src/main/java/cn/bunny/service/web/security/CustomAuthorizationManagerServiceImpl.java b/service/service-web/src/main/java/cn/bunny/service/web/security/CustomAuthorizationManagerServiceImpl.java
new file mode 100644
index 0000000..608bf57
--- /dev/null
+++ b/service/service-web/src/main/java/cn/bunny/service/web/security/CustomAuthorizationManagerServiceImpl.java
@@ -0,0 +1,36 @@
+package cn.bunny.service.web.security;
+
+import cn.bunny.security.service.CustomAuthorizationManagerService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.security.access.AccessDeniedException;
+import org.springframework.security.authorization.AuthorizationDecision;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.web.access.intercept.RequestAuthorizationContext;
+import org.springframework.stereotype.Service;
+
+import java.util.function.Supplier;
+
+
+/**
+ * 自定义权限判断
+ * 判断用户有哪些权限
+ */
+@Service
+@Slf4j
+public class CustomAuthorizationManagerServiceImpl implements CustomAuthorizationManagerService {
+ @Override
+ public void verify(Supplier authentication, RequestAuthorizationContext requestAuthorizationContext) {
+ CustomAuthorizationManagerService.super.verify(authentication, requestAuthorizationContext);
+ }
+
+ @Override
+ public AuthorizationDecision check(Supplier authentication, RequestAuthorizationContext object) {
+ String token = object.getRequest().getHeader("token");
+
+ if (token == null) {
+ throw new AccessDeniedException("");
+ }
+
+ return new AuthorizationDecision(true);
+ }
+}
diff --git a/service/service-web/src/main/java/cn/bunny/service/web/security/CustomUserDetailsService.java b/service/service-web/src/main/java/cn/bunny/service/web/security/CustomUserDetailsService.java
new file mode 100644
index 0000000..61867c8
--- /dev/null
+++ b/service/service-web/src/main/java/cn/bunny/service/web/security/CustomUserDetailsService.java
@@ -0,0 +1,58 @@
+package cn.bunny.service.web.security;
+
+import cn.bunny.dto.LoginDto;
+import cn.bunny.entity.system.User;
+import cn.bunny.entity.system.UserRole;
+import cn.bunny.security.custom.CustomUser;
+import cn.bunny.service.web.mapper.UserMapper;
+import cn.bunny.service.web.mapper.UserRoleMapper;
+import cn.bunny.service.web.service.LoginService;
+import cn.bunny.vo.system.LoginVo;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.core.authority.AuthorityUtils;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+
+import java.util.List;
+
+@Configuration
+public class CustomUserDetailsService implements cn.bunny.security.service.CustomUserDetailsService {
+ @Autowired
+ private UserMapper userMapper;
+ @Autowired
+ private LoginService loginService;
+ @Autowired
+ private UserRoleMapper userRoleMapper;
+
+ @Override
+ public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
+ // 根据邮箱查询用户名
+ User user = userMapper.selectOne(Wrappers.lambdaQuery().eq(User::getEmail, username));
+ List sysRoleList = userRoleMapper.selectList(null);
+ // 如果这次为空,再试下查询昵称
+ if (user == null) {
+ user = userMapper.selectOne(Wrappers.lambdaQuery().eq(User::getNickName, username));
+ }
+ // 都为空抛出异常,用户不存在
+ if (user == null) {
+ throw new UsernameNotFoundException("");
+ }
+
+ // 查询所有的角色
+ List roleAuthoritieList = sysRoleList.stream().map(UserRole::getRoleCode).toList();
+ return new CustomUser(user, AuthorityUtils.createAuthorityList(roleAuthoritieList));
+ }
+
+ /**
+ * 前台用户登录接口
+ *
+ * @param loginDto 登录参数
+ * @return 登录后结果返回
+ */
+ @Override
+ public LoginVo login(LoginDto loginDto) {
+ return loginService.login(loginDto);
+ }
+}
diff --git a/service/service-web/src/main/java/cn/bunny/service/web/service/LoginService.java b/service/service-web/src/main/java/cn/bunny/service/web/service/LoginService.java
new file mode 100644
index 0000000..433c1b0
--- /dev/null
+++ b/service/service-web/src/main/java/cn/bunny/service/web/service/LoginService.java
@@ -0,0 +1,24 @@
+package cn.bunny.service.web.service;
+
+import cn.bunny.dto.LoginDto;
+import cn.bunny.entity.system.User;
+import cn.bunny.vo.system.LoginVo;
+import cn.bunny.vo.system.ValidateCodeVo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+public interface LoginService extends IService {
+ /**
+ * 前台用户登录接口
+ *
+ * @param loginDto 登录参数
+ * @return 登录后结果返回
+ */
+ LoginVo login(LoginDto loginDto);
+
+ /**
+ * 生成验证码
+ *
+ * @return 验证码生成信息
+ */
+ ValidateCodeVo checkCode();
+}
diff --git a/service/service-web/src/main/java/cn/bunny/service/web/service/UserIntegralRecordService.java b/service/service-web/src/main/java/cn/bunny/service/web/service/UserIntegralRecordService.java
new file mode 100644
index 0000000..091d37f
--- /dev/null
+++ b/service/service-web/src/main/java/cn/bunny/service/web/service/UserIntegralRecordService.java
@@ -0,0 +1,16 @@
+package cn.bunny.service.web.service;
+
+import cn.bunny.entity.system.UserIntegralRecord;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ *
+ * 用户积分记录表 服务类
+ *
+ *
+ * @author Bunny
+ * @since 2024-05-13
+ */
+public interface UserIntegralRecordService extends IService {
+
+}
diff --git a/service/service-web/src/main/java/cn/bunny/service/web/service/UserRoleService.java b/service/service-web/src/main/java/cn/bunny/service/web/service/UserRoleService.java
new file mode 100644
index 0000000..f3b6f5a
--- /dev/null
+++ b/service/service-web/src/main/java/cn/bunny/service/web/service/UserRoleService.java
@@ -0,0 +1,16 @@
+package cn.bunny.service.web.service;
+
+import cn.bunny.entity.system.UserRole;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ *
+ * 服务类
+ *
+ *
+ * @author Bunny
+ * @since 2024-05-13
+ */
+public interface UserRoleService extends IService {
+
+}
diff --git a/service/service-web/src/main/java/cn/bunny/service/web/service/UserService.java b/service/service-web/src/main/java/cn/bunny/service/web/service/UserService.java
new file mode 100644
index 0000000..2f5ffd4
--- /dev/null
+++ b/service/service-web/src/main/java/cn/bunny/service/web/service/UserService.java
@@ -0,0 +1,16 @@
+package cn.bunny.service.web.service;
+
+import cn.bunny.entity.system.User;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ *
+ * 用户信息 服务类
+ *
+ *
+ * @author Bunny
+ * @since 2024-05-13
+ */
+public interface UserService extends IService {
+
+}
diff --git a/service/service-web/src/main/java/cn/bunny/service/web/service/impl/LoginServiceImpl.java b/service/service-web/src/main/java/cn/bunny/service/web/service/impl/LoginServiceImpl.java
new file mode 100644
index 0000000..c4c22df
--- /dev/null
+++ b/service/service-web/src/main/java/cn/bunny/service/web/service/impl/LoginServiceImpl.java
@@ -0,0 +1,69 @@
+package cn.bunny.service.web.service.impl;
+
+import cn.bunny.common.result.constant.CommonMessageConstant;
+import cn.bunny.common.service.utils.EmptyUtil;
+import cn.bunny.common.service.utils.JwtHelper;
+import cn.bunny.dto.LoginDto;
+import cn.bunny.entity.system.User;
+import cn.bunny.service.web.mapper.UserMapper;
+import cn.bunny.service.web.service.LoginService;
+import cn.bunny.vo.system.LoginVo;
+import cn.bunny.vo.system.ValidateCodeVo;
+import cn.hutool.captcha.CaptchaUtil;
+import cn.hutool.captcha.CircleCaptcha;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.util.DigestUtils;
+
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+
+@Service
+public class LoginServiceImpl extends ServiceImpl implements LoginService {
+ @Autowired
+ private UserMapper userMapper;
+ @Autowired
+ private RedisTemplate redisTemplate;
+
+ /**
+ * 前台用户登录接口
+ *
+ * @param loginDto 登录参数
+ * @return 登录后结果返回
+ */
+ @Override
+ public LoginVo login(LoginDto loginDto) {
+ // 判断用户和密码是否为空
+ String username = loginDto.getUsername();
+ EmptyUtil.isEmpty(username, CommonMessageConstant.USERNAME_NOT_EMPTY);
+ // 密码不能为空
+ EmptyUtil.isEmpty(loginDto.getPassword(), CommonMessageConstant.PASSWORD_NOT_EMPTY);
+ String password = DigestUtils.md5DigestAsHex(loginDto.getPassword().getBytes());
+
+ // 设置返回类型
+ LoginVo loginVo = userMapper.login(username, password);
+ String token = JwtHelper.createToken(Long.valueOf(loginVo.getUserId()), loginVo.getEmail(), 7);
+ loginVo.setToken(token);
+
+ return loginVo;
+ }
+
+ /**
+ * 生成验证码
+ *
+ * @return 验证码生成信息
+ */
+ @Override
+ public ValidateCodeVo checkCode() {
+ // 生成验证码
+ CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(150, 48, 4, 2);
+ String code = captcha.getCode();
+ String base64Image = "data:image/png;base64," + captcha.getImageBase64();
+ // 存储到Redis中
+ String uuid = UUID.randomUUID().toString().replaceAll("-", "");
+ redisTemplate.opsForValue().set(uuid, code, 10, TimeUnit.MINUTES);
+ return ValidateCodeVo.builder().codeKey(uuid).codeValue(base64Image).build();
+ }
+}
diff --git a/service/service-web/src/main/java/cn/bunny/service/web/service/impl/UserIntegralRecordServiceImpl.java b/service/service-web/src/main/java/cn/bunny/service/web/service/impl/UserIntegralRecordServiceImpl.java
new file mode 100644
index 0000000..072bf9d
--- /dev/null
+++ b/service/service-web/src/main/java/cn/bunny/service/web/service/impl/UserIntegralRecordServiceImpl.java
@@ -0,0 +1,20 @@
+package cn.bunny.service.web.service.impl;
+
+import cn.bunny.entity.system.UserIntegralRecord;
+import cn.bunny.service.web.mapper.UserIntegralRecordMapper;
+import cn.bunny.service.web.service.UserIntegralRecordService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ *
+ * 用户积分记录表 服务实现类
+ *
+ *
+ * @author Bunny
+ * @since 2024-05-13
+ */
+@Service
+public class UserIntegralRecordServiceImpl extends ServiceImpl implements UserIntegralRecordService {
+
+}
diff --git a/service/service-web/src/main/java/cn/bunny/service/web/service/impl/UserRoleServiceImpl.java b/service/service-web/src/main/java/cn/bunny/service/web/service/impl/UserRoleServiceImpl.java
new file mode 100644
index 0000000..1758324
--- /dev/null
+++ b/service/service-web/src/main/java/cn/bunny/service/web/service/impl/UserRoleServiceImpl.java
@@ -0,0 +1,20 @@
+package cn.bunny.service.web.service.impl;
+
+import cn.bunny.entity.system.UserRole;
+import cn.bunny.service.web.mapper.UserRoleMapper;
+import cn.bunny.service.web.service.UserRoleService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ *
+ * 服务实现类
+ *
+ *
+ * @author Bunny
+ * @since 2024-05-13
+ */
+@Service
+public class UserRoleServiceImpl extends ServiceImpl implements UserRoleService {
+
+}
diff --git a/service/service-web/src/main/java/cn/bunny/service/web/service/impl/UserServiceImpl.java b/service/service-web/src/main/java/cn/bunny/service/web/service/impl/UserServiceImpl.java
new file mode 100644
index 0000000..e63451a
--- /dev/null
+++ b/service/service-web/src/main/java/cn/bunny/service/web/service/impl/UserServiceImpl.java
@@ -0,0 +1,20 @@
+package cn.bunny.service.web.service.impl;
+
+import cn.bunny.entity.system.User;
+import cn.bunny.service.web.mapper.UserMapper;
+import cn.bunny.service.web.service.UserService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ *
+ * 用户信息 服务实现类
+ *
+ *
+ * @author Bunny
+ * @since 2024-05-13
+ */
+@Service
+public class UserServiceImpl extends ServiceImpl implements UserService {
+
+}
diff --git a/service/service-web/src/main/resources/application-dev.yml b/service/service-web/src/main/resources/application-dev.yml
new file mode 100644
index 0000000..0209e71
--- /dev/null
+++ b/service/service-web/src/main/resources/application-dev.yml
@@ -0,0 +1,24 @@
+bunny:
+ datasource:
+ host: 106.15.251.123
+ port: 3305
+ sqlData: bunny_docs
+ username: root
+ password: "02120212"
+
+ redis:
+ host: 47.120.65.66
+ port: 6379
+ database: 3
+ password: "02120212"
+
+ minio:
+ endpointUrl: "http://129.211.31.58:9000"
+ bucket-name: ssyx
+ accessKey: bunny
+ secretKey: "02120212"
+
+ nacos:
+ server-addr: z-bunny.cn:8848
+ discovery:
+ namespace: bunnyBBS
\ No newline at end of file
diff --git a/service/service-web/src/main/resources/application.yml b/service/service-web/src/main/resources/application.yml
new file mode 100644
index 0000000..0ec40d1
--- /dev/null
+++ b/service/service-web/src/main/resources/application.yml
@@ -0,0 +1,71 @@
+server:
+ port: 8801
+
+spring:
+ profiles:
+ active: dev
+ application:
+ name: service-web
+ datasource:
+ type: com.zaxxer.hikari.HikariDataSource
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ url: jdbc:mysql://${bunny.datasource.host}:${bunny.datasource.port}/${bunny.datasource.sqlData}?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8&allowPublicKeyRetrieval=true
+ username: ${bunny.datasource.username}
+ password: ${bunny.datasource.password}
+
+ data:
+ redis:
+ host: ${bunny.redis.host}
+ port: ${bunny.redis.port}
+ database: ${bunny.redis.database}
+ password: ${bunny.redis.password}
+ lettuce:
+ pool:
+ max-active: 20 #最大连接数
+ max-wait: -1 #最大阻塞等待时间(负数表示没限制)
+ max-idle: 5 #最大空闲
+ min-idle: 0 #最小空闲
+
+ jackson:
+ date-format: yyyy-MM-dd HH:mm:ss
+ time-zone: GMT+8
+
+ cloud:
+ sentinel:
+ log:
+ dir: logs/${spring.application.name}/sentinel
+ nacos:
+ discovery:
+ namespace: ${bunny.nacos.discovery.namespace}
+ server-addr: ${bunny.nacos.server-addr}
+
+mybatis-plus:
+ mapper-locations: classpath:mapper/*.xml
+ configuration:
+ log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 查看日志
+
+logging:
+ level:
+ cn.bunny.service.mapper: debug
+ cn.bunny.service.controller: info
+ cn.bunny.service.service: info
+ pattern:
+ dateformat: HH:mm:ss:SSS
+ file:
+ path: "logs/${spring.application.name}"
+
+bunny:
+ minio:
+ endpointUrl: ${bunny.minio.endpointUrl}
+ accessKey: ${bunny.minio.accessKey}
+ secretKey: ${bunny.minio.secretKey}
+ bucket-name: ${bunny.minio.bucket-name}
+
+ snowflake:
+ datacenterBits: 5 # 数据中心id位数
+ workerBits: 5 # 机器id位数
+ sequenceBits: 12 # 序列id所占位数
+ datacenterId: 1 # 数据中心id,范围0-2^5-1
+ workerId: 1 # 机器id,范围0-2^5-1
+ twepoch: 1704038400000 # 时间戳起始点(2024-01-01 00::00:00 的毫秒数)
+ maxBatchCount: 100000 #单次批量生成id的最大数量 默认10万
\ No newline at end of file
diff --git a/service/service-web/src/main/resources/banner.txt b/service/service-web/src/main/resources/banner.txt
new file mode 100644
index 0000000..cc77fc2
--- /dev/null
+++ b/service/service-web/src/main/resources/banner.txt
@@ -0,0 +1,16 @@
+-----------------▄██-█▄---------
+-----------------███▄██▄--------
+-----------------███████--------
+-----------------▀███████-------
+-------------------██████▄▄-----
+-------------------█████████▄---
+-------------------██████▄████--
+-------▄███████████████████████-
+-----▄███████████████████████▀--
+---▄██████████████████████------
+---███████████████████████------
+---███████████████████████------
+-▄▄██████████████████████▀------
+-█████████████████▀█████--------
+-▀██████████████▀▀-▀█████▄------
+-------▀▀▀▀▀▀▀▀▀------▀▀▀▀------
\ No newline at end of file
diff --git a/service/service-web/src/main/resources/favicon.ico b/service/service-web/src/main/resources/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..385f8a67127e1978b08387383f5935feaf561d04
GIT binary patch
literal 17014
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
G5Bv)+nYH-<
literal 0
HcmV?d00001
diff --git a/service/service-web/src/main/resources/logback.xml b/service/service-web/src/main/resources/logback.xml
new file mode 100644
index 0000000..04ecbe3
--- /dev/null
+++ b/service/service-web/src/main/resources/logback.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+ %cyan([%thread]) %yellow(%-5level) %green(%logger{100}).%boldRed(%method)-%boldMagenta(%line) - %blue(%msg%n)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/service/service-web/src/main/resources/mapper/UserIntegralRecordMapper.xml b/service/service-web/src/main/resources/mapper/UserIntegralRecordMapper.xml
new file mode 100644
index 0000000..198bd01
--- /dev/null
+++ b/service/service-web/src/main/resources/mapper/UserIntegralRecordMapper.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ user_id, oper_type, integral, create_time
+
+
+
diff --git a/service/service-web/src/main/resources/mapper/UserMapper.xml b/service/service-web/src/main/resources/mapper/UserMapper.xml
new file mode 100644
index 0000000..a45e006
--- /dev/null
+++ b/service/service-web/src/main/resources/mapper/UserMapper.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+ user_id, nick_name, email, password, sex, person_description, join_time, last_login_time, last_login_ip, last_login_ip_address, total_integral, current_integral, status
+
+
+
+
+
+
diff --git a/service/service-web/src/main/resources/mapper/UserRoleMapper.xml b/service/service-web/src/main/resources/mapper/UserRoleMapper.xml
new file mode 100644
index 0000000..332b514
--- /dev/null
+++ b/service/service-web/src/main/resources/mapper/UserRoleMapper.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ id, user_id, role_name, description, role_code, create_time, update_time
+
+
+