Compare commits

...

5 Commits

Author SHA1 Message Date
panqihua 9f7007896f 1.增加重置密码接口 2 years ago
panqihua a43b6b8ca0 1.调整项目结构 2 years ago
panqihua ac904bd24e 1.增加店家注册接口 2 years ago
panqihua c375ffeb5d 1.增加短信验证码接口 2 years ago
panqihua 466798d1aa 1.增加获取平台设置接口 2 years ago
  1. 2
      pom.xml
  2. 8
      ruoyi-admin/pom.xml
  3. 30
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/platform/PlatformSmsController.java
  4. 30
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/platform/config/PlatformConfigController.java
  5. 116
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/platform/store/account/PlatformStoreAccountController.java
  6. 2
      ruoyi-admin/src/main/resources/application.yml
  7. 42
      ruoyi-admin/src/main/resources/logback.xml
  8. 6
      ruoyi-common/pom.xml
  9. 9
      ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java
  10. 17
      ruoyi-common/src/main/java/com/ruoyi/common/enums/AccountType.java
  11. 23
      ruoyi-common/src/main/java/com/ruoyi/common/enums/PlatformConfig.java
  12. 9
      ruoyi-framework/pom.xml
  13. 20
      ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
  14. 34
      ruoyi-framework/src/main/java/com/ruoyi/framework/security/TypeUsernamePasswordAuthenticationToken.java
  15. 50
      ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java
  16. 35
      ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/StoreLoginService.java
  17. 24
      ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
  18. 82
      ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java
  19. 86
      ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java
  20. 52
      sql/ttsbg.sql
  21. 26
      ttsbg-framework/pom.xml
  22. 76
      ttsbg-framework/src/main/java/com/ruoyi/framework/domain/PlatformLoginUser.java
  23. 124
      ttsbg-framework/src/main/java/com/ruoyi/framework/domain/Sms.java
  24. 62
      ttsbg-framework/src/main/java/com/ruoyi/framework/mapper/SmsMapper.java
  25. 72
      ttsbg-framework/src/main/java/com/ruoyi/framework/service/ISmsService.java
  26. 125
      ttsbg-framework/src/main/java/com/ruoyi/framework/service/impl/SmsServiceImpl.java
  27. 85
      ttsbg-framework/src/main/resources/mapper/PlatformSmsMapper.xml
  28. 6
      ttsbg-platform/pom.xml
  29. 32
      ttsbg-store/pom.xml
  30. 164
      ttsbg-store/src/main/java/com/ruoyi/store/domain/StoreAccount.java
  31. 20
      ttsbg-store/src/main/java/com/ruoyi/store/domain/StoreLoginUser.java
  32. 15
      ttsbg-store/src/main/java/com/ruoyi/store/domain/vo/StoreAccountVo.java
  33. 56
      ttsbg-store/src/main/java/com/ruoyi/store/mapper/StoreAccountMapper.java
  34. 75
      ttsbg-store/src/main/java/com/ruoyi/store/service/IStoreAccountService.java
  35. 150
      ttsbg-store/src/main/java/com/ruoyi/store/service/impl/StoreAccountServiceImpl.java

@ -189,6 +189,8 @@
<module>ruoyi-generator</module> <module>ruoyi-generator</module>
<module>ruoyi-common</module> <module>ruoyi-common</module>
<module>ttsbg-platform</module> <module>ttsbg-platform</module>
<module>ttsbg-store</module>
<module>ttsbg-framework</module>
</modules> </modules>
<packaging>pom</packaging> <packaging>pom</packaging>

@ -66,7 +66,13 @@
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<artifactId>ttsbg-platform</artifactId> <artifactId>ttsbg-platform</artifactId>
<version>3.8.5</version> <version>3.8.5</version>
<scope>compile</scope> </dependency>
<!--店家端-->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ttsbg-store</artifactId>
<version>3.8.5</version>
</dependency> </dependency>
</dependencies> </dependencies>

@ -0,0 +1,30 @@
package com.ruoyi.web.controller.platform;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.PlatformConfig;
import com.ruoyi.framework.domain.Sms;
import com.ruoyi.framework.service.ISmsService;
import com.ruoyi.system.service.ISysConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
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
@RequestMapping("/platform/public/sms")
public class PlatformSmsController extends BaseController {
@Autowired
private ISmsService platformSmsService;
@Autowired
private ISysConfigService sysConfigService;
@PostMapping("send")
public AjaxResult send(@Validated @RequestBody Sms sms) {
return success(platformSmsService.send(sms.getMobile(), Integer.valueOf(sysConfigService.selectConfigById(PlatformConfig.smsTime.getConfigId()).getConfigValue())));
}
}

@ -0,0 +1,30 @@
package com.ruoyi.web.controller.platform.config;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.PlatformConfig;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.service.ISysConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import static com.ruoyi.common.core.domain.AjaxResult.success;
/**
* 平台设置
*/
@RestController
@RequestMapping("/platform/config")
public class PlatformConfigController {
@Autowired
private ISysConfigService configService;
@GetMapping("{config}")
public AjaxResult config(@PathVariable PlatformConfig config) {
SysConfig _config = configService.selectConfigById(config.getConfigId());
return success(StringUtils.format("{}获取成功", _config.getConfigName()), _config.getConfigValue());
}
}

@ -0,0 +1,116 @@
package com.ruoyi.web.controller.platform.store.account;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.service.StoreLoginService;
import com.ruoyi.store.domain.StoreAccount;
import com.ruoyi.store.domain.vo.StoreAccountVo;
import com.ruoyi.store.service.IStoreAccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
* 店家账号Controller
*
* @author ruoyi
* @date 2023-02-10
*/
@RestController
@RequestMapping("/platform/store/account")
public class PlatformStoreAccountController extends BaseController {
@Autowired
private IStoreAccountService platformStoreAccountService;
@Autowired
private StoreLoginService loginService;
@PostMapping("register")
public AjaxResult register(@RequestBody StoreAccountVo account) {
return success(platformStoreAccountService.register(account));
}
@PostMapping("login")
public AjaxResult login(@RequestBody StoreAccountVo account) {
AjaxResult ajax = AjaxResult.success("登陆成功");
// 生成令牌
String token = loginService.login(account.getMobile(), account.getPassword());
ajax.put(Constants.TOKEN, token);
return ajax;
}
@PostMapping("resetpwd")
public AjaxResult resetpwd(@RequestBody StoreAccountVo account) {
return success(platformStoreAccountService.resetpwd(account));
}
/**
* 查询店家账号列表
*/
@PreAuthorize("@ss.hasPermi('platform:account:list')")
@GetMapping("/list")
public TableDataInfo list(StoreAccount platformStoreAccount) {
startPage();
List<StoreAccount> list = platformStoreAccountService.selectStoreAccountList(platformStoreAccount);
return getDataTable(list);
}
/**
* 导出店家账号列表
*/
@PreAuthorize("@ss.hasPermi('platform:account:export')")
@Log(title = "店家账号", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, StoreAccount platformStoreAccount) {
List<StoreAccount> list = platformStoreAccountService.selectStoreAccountList(platformStoreAccount);
ExcelUtil<StoreAccount> util = new ExcelUtil<StoreAccount>(StoreAccount.class);
util.exportExcel(response, list, "店家账号数据");
}
/**
* 获取店家账号详细信息
*/
@PreAuthorize("@ss.hasPermi('platform:account:query')")
@GetMapping(value = "/{storeid}")
public AjaxResult getInfo(@PathVariable("storeid") Long storeid) {
return success(platformStoreAccountService.selectStoreAccountByStoreid(storeid));
}
/**
* 新增店家账号
*/
@PreAuthorize("@ss.hasPermi('platform:account:add')")
@Log(title = "店家账号", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody StoreAccount platformStoreAccount) {
return toAjax(platformStoreAccountService.insertStoreAccount(platformStoreAccount));
}
/**
* 修改店家账号
*/
@PreAuthorize("@ss.hasPermi('platform:account:edit')")
@Log(title = "店家账号", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody StoreAccount platformStoreAccount) {
return toAjax(platformStoreAccountService.updateStoreAccount(platformStoreAccount));
}
/**
* 删除店家账号
*/
@PreAuthorize("@ss.hasPermi('platform:account:remove')")
@Log(title = "店家账号", businessType = BusinessType.DELETE)
@DeleteMapping("/{storeids}")
public AjaxResult remove(@PathVariable Long[] storeids) {
return toAjax(platformStoreAccountService.deleteStoreAccountByStoreids(storeids));
}
}

@ -126,6 +126,6 @@ xss:
# 过滤开关 # 过滤开关
enabled: true enabled: true
# 排除链接(多个用逗号分隔) # 排除链接(多个用逗号分隔)
excludes: /system/notice excludes: /system/notice,/system/config
# 匹配链接 # 匹配链接
urlPatterns: /system/*,/monitor/*,/tool/* urlPatterns: /system/*,/monitor/*,/tool/*

@ -11,7 +11,7 @@
<pattern>${log.pattern}</pattern> <pattern>${log.pattern}</pattern>
</encoder> </encoder>
</appender> </appender>
<!-- 系统日志输出 --> <!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender"> <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-info.log</file> <file>${log.path}/sys-info.log</file>
@ -34,8 +34,8 @@
<onMismatch>DENY</onMismatch> <onMismatch>DENY</onMismatch>
</filter> </filter>
</appender> </appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender"> <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-error.log</file> <file>${log.path}/sys-error.log</file>
<!-- 循环政策:基于时间创建日志文件 --> <!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
@ -56,8 +56,8 @@
<onMismatch>DENY</onMismatch> <onMismatch>DENY</onMismatch>
</filter> </filter>
</appender> </appender>
<!-- 用户访问日志输出 --> <!-- 用户访问日志输出 -->
<appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender"> <appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-user.log</file> <file>${log.path}/sys-user.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
@ -70,24 +70,26 @@
<pattern>${log.pattern}</pattern> <pattern>${log.pattern}</pattern>
</encoder> </encoder>
</appender> </appender>
<!-- 系统模块日志级别控制 -->
<logger name="com.ruoyi" level="info" />
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn" />
<root level="info"> <!-- 系统模块日志级别控制 -->
<appender-ref ref="console" /> <logger name="com.ruoyi" level="debug"/>
</root> <!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn"/>
<!--系统操作日志--> <!-- mybatisplus-->
<logger name="com.baomidou.mybatisplus" level="debug"/>
<root level="info"> <root level="info">
<appender-ref ref="file_info" /> <appender-ref ref="console"/>
<appender-ref ref="file_error" />
</root> </root>
<!--系统用户操作日志--> <!--系统操作日志-->
<root level="info">
<appender-ref ref="file_info"/>
<appender-ref ref="file_error"/>
</root>
<!--系统用户操作日志-->
<logger name="sys-user" level="info"> <logger name="sys-user" level="info">
<appender-ref ref="sys-user"/> <appender-ref ref="sys-user"/>
</logger> </logger>
</configuration> </configuration>

@ -139,6 +139,12 @@
<version>3.4.2</version> <version>3.4.2</version>
</dependency> </dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

@ -4,7 +4,7 @@ import io.jsonwebtoken.Claims;
/** /**
* 通用常量信息 * 通用常量信息
* *
* @author ruoyi * @author ruoyi
*/ */
public class Constants public class Constants
@ -63,7 +63,7 @@ public class Constants
* 登录失败 * 登录失败
*/ */
public static final String LOGIN_FAIL = "Error"; public static final String LOGIN_FAIL = "Error";
/** /**
* 验证码有效期分钟 * 验证码有效期分钟
*/ */
@ -84,6 +84,11 @@ public class Constants
*/ */
public static final String LOGIN_USER_KEY = "login_user_key"; public static final String LOGIN_USER_KEY = "login_user_key";
/**
* 店家令牌前缀
*/
public static final String STORE_KEY = "store_account_key";
/** /**
* 用户ID * 用户ID
*/ */

@ -0,0 +1,17 @@
package com.ruoyi.common.enums;
public enum AccountType {
backend("后台账号"),
store("店家账号");
private String remark;
AccountType(String remark) {
this.remark = remark;
}
public String getRemark() {
return remark;
}
}

@ -0,0 +1,23 @@
package com.ruoyi.common.enums;
/**
* 平台设置
*/
public enum PlatformConfig {
//用户协议
userAgreement(100L),
//隐私政策
privacyPolicy(101L),
//短信验证码配置
smsTime(102L);
private final Long configId;
PlatformConfig(Long configId) {
this.configId = configId;
}
public Long getConfigId() {
return configId;
}
}

@ -59,6 +59,13 @@
<artifactId>ruoyi-system</artifactId> <artifactId>ruoyi-system</artifactId>
</dependency> </dependency>
<!--店家端-->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ttsbg-store</artifactId>
<version>3.8.5</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

@ -1,5 +1,9 @@
package com.ruoyi.framework.config; package com.ruoyi.framework.config;
import com.ruoyi.framework.config.properties.PermitAllUrlProperties;
import com.ruoyi.framework.security.filter.JwtAuthenticationTokenFilter;
import com.ruoyi.framework.security.handle.AuthenticationEntryPointImpl;
import com.ruoyi.framework.security.handle.LogoutSuccessHandlerImpl;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpMethod; import org.springframework.http.HttpMethod;
@ -15,14 +19,10 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.authentication.logout.LogoutFilter; import org.springframework.security.web.authentication.logout.LogoutFilter;
import org.springframework.web.filter.CorsFilter; import org.springframework.web.filter.CorsFilter;
import com.ruoyi.framework.config.properties.PermitAllUrlProperties;
import com.ruoyi.framework.security.filter.JwtAuthenticationTokenFilter;
import com.ruoyi.framework.security.handle.AuthenticationEntryPointImpl;
import com.ruoyi.framework.security.handle.LogoutSuccessHandlerImpl;
/** /**
* spring security配置 * spring security配置
* *
* @author ruoyi * @author ruoyi
*/ */
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
@ -33,7 +33,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
*/ */
@Autowired @Autowired
private UserDetailsService userDetailsService; private UserDetailsService userDetailsService;
/** /**
* 认证失败处理类 * 认证失败处理类
*/ */
@ -51,7 +51,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
*/ */
@Autowired @Autowired
private JwtAuthenticationTokenFilter authenticationTokenFilter; private JwtAuthenticationTokenFilter authenticationTokenFilter;
/** /**
* 跨域过滤器 * 跨域过滤器
*/ */
@ -115,6 +115,12 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
// 静态资源,可匿名访问 // 静态资源,可匿名访问
.antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
.antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll() .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
//平台设置
.antMatchers("/platform/config/**").permitAll()
//平台短信发送
.antMatchers("/platform/public/sms/send").permitAll()
//店家注册登录
.antMatchers("/platform/store/account/register", "/platform/store/account/login", "/platform/store/account/resetpwd").permitAll()
// 除上面外的所有请求全部需要鉴权认证 // 除上面外的所有请求全部需要鉴权认证
.anyRequest().authenticated() .anyRequest().authenticated()
.and() .and()

@ -0,0 +1,34 @@
package com.ruoyi.framework.security;
import com.ruoyi.common.enums.AccountType;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.GrantedAuthority;
import javax.security.auth.Subject;
import java.util.Collection;
/**
* 带账号类型的Token认证
*/
public class TypeUsernamePasswordAuthenticationToken extends UsernamePasswordAuthenticationToken {
private final AccountType type;
public TypeUsernamePasswordAuthenticationToken(Object principal, Object credentials, AccountType type) {
super(principal, credentials);
this.type = type;
}
public TypeUsernamePasswordAuthenticationToken(Object principal, Object credentials, Collection<? extends GrantedAuthority> authorities, AccountType type) {
super(principal, credentials, authorities);
this.type = type;
}
@Override
public boolean implies(Subject subject) {
return super.implies(subject);
}
public AccountType getType() {
return type;
}
}

@ -1,24 +1,28 @@
package com.ruoyi.framework.security.filter; package com.ruoyi.framework.security.filter;
import java.io.IOException; import com.ruoyi.common.core.domain.model.LoginUser;
import javax.servlet.FilterChain; import com.ruoyi.common.enums.AccountType;
import javax.servlet.ServletException; import com.ruoyi.common.utils.SecurityUtils;
import javax.servlet.http.HttpServletRequest; import com.ruoyi.common.utils.StringUtils;
import javax.servlet.http.HttpServletResponse; import com.ruoyi.framework.security.TypeUsernamePasswordAuthenticationToken;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.store.domain.StoreLoginUser;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.filter.OncePerRequestFilter;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.SecurityUtils; import javax.servlet.FilterChain;
import com.ruoyi.common.utils.StringUtils; import javax.servlet.ServletException;
import com.ruoyi.framework.web.service.TokenService; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/** /**
* token过滤器 验证token有效性 * token过滤器 验证token有效性
* *
* @author ruoyi * @author ruoyi
*/ */
@Component @Component
@ -29,15 +33,23 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter
@Override @Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException throws ServletException, IOException {
{ if (request.getServletPath().startsWith("/platform/store")) {
LoginUser loginUser = tokenService.getLoginUser(request); StoreLoginUser storeLoginUser = tokenService.getStoreLoginUser(request);
if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication())) if (StringUtils.isNotNull(storeLoginUser) && StringUtils.isNull(SecurityUtils.getAuthentication())) {
{ tokenService.verifyToken(storeLoginUser);
tokenService.verifyToken(loginUser); TypeUsernamePasswordAuthenticationToken authenticationToken = new TypeUsernamePasswordAuthenticationToken(storeLoginUser, null, storeLoginUser.getAuthorities(), AccountType.store);
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities()); authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); SecurityContextHolder.getContext().setAuthentication(authenticationToken);
SecurityContextHolder.getContext().setAuthentication(authenticationToken); }
} else {
LoginUser loginUser = tokenService.getLoginUser(request);
if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication())) {
tokenService.verifyToken(loginUser);
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());
authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
}
} }
chain.doFilter(request, response); chain.doFilter(request, response);
} }

@ -0,0 +1,35 @@
package com.ruoyi.framework.web.service;
import com.ruoyi.common.enums.AccountType;
import com.ruoyi.framework.security.TypeUsernamePasswordAuthenticationToken;
import com.ruoyi.framework.security.context.AuthenticationContextHolder;
import com.ruoyi.store.domain.StoreLoginUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 店家登录
*/
@Component
public class StoreLoginService {
@Autowired
private TokenService tokenService;
@Resource
private AuthenticationManager authenticationManager;
public String login(String mobile, String password) {
// 用户验证
Authentication authentication = null;
TypeUsernamePasswordAuthenticationToken authenticationToken = new TypeUsernamePasswordAuthenticationToken(mobile, password, AccountType.store);
AuthenticationContextHolder.setContext(authenticationToken);
// 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
authentication = authenticationManager.authenticate(authenticationToken);
StoreLoginUser loginUser = (StoreLoginUser) authentication.getPrincipal();
return tokenService.createToken(loginUser);
}
}

@ -1,12 +1,5 @@
package com.ruoyi.framework.web.service; package com.ruoyi.framework.web.service;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component;
import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.entity.SysUser;
@ -26,10 +19,18 @@ import com.ruoyi.framework.manager.factory.AsyncFactory;
import com.ruoyi.framework.security.context.AuthenticationContextHolder; import com.ruoyi.framework.security.context.AuthenticationContextHolder;
import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/** /**
* 登录校验方法 * 登录校验方法
* *
* @author ruoyi * @author ruoyi
*/ */
@Component @Component
@ -43,7 +44,7 @@ public class SysLoginService
@Autowired @Autowired
private RedisCache redisCache; private RedisCache redisCache;
@Autowired @Autowired
private ISysUserService userService; private ISysUserService userService;
@ -52,7 +53,7 @@ public class SysLoginService
/** /**
* 登录验证 * 登录验证
* *
* @param username 用户名 * @param username 用户名
* @param password 密码 * @param password 密码
* @param code 验证码 * @param code 验证码
@ -73,6 +74,7 @@ public class SysLoginService
{ {
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password); UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password);
AuthenticationContextHolder.setContext(authenticationToken); AuthenticationContextHolder.setContext(authenticationToken);
// 该方法会去调用UserDetailsServiceImpl.loadUserByUsername // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
authentication = authenticationManager.authenticate(authenticationToken); authentication = authenticationManager.authenticate(authenticationToken);
} }
@ -102,7 +104,7 @@ public class SysLoginService
/** /**
* 校验验证码 * 校验验证码
* *
* @param username 用户名 * @param username 用户名
* @param code 验证码 * @param code 验证码
* @param uuid 唯一标识 * @param uuid 唯一标识

@ -1,12 +1,5 @@
package com.ruoyi.framework.web.service; package com.ruoyi.framework.web.service;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.domain.model.LoginUser;
@ -16,10 +9,19 @@ import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.ip.AddressUtils; import com.ruoyi.common.utils.ip.AddressUtils;
import com.ruoyi.common.utils.ip.IpUtils; import com.ruoyi.common.utils.ip.IpUtils;
import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.store.domain.StoreLoginUser;
import eu.bitwalker.useragentutils.UserAgent; import eu.bitwalker.useragentutils.UserAgent;
import io.jsonwebtoken.Claims; import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts; import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/** /**
* token验证处理 * token验证处理
@ -69,21 +71,35 @@ public class TokenService
String userKey = getTokenKey(uuid); String userKey = getTokenKey(uuid);
LoginUser user = redisCache.getCacheObject(userKey); LoginUser user = redisCache.getCacheObject(userKey);
return user; return user;
} catch (Exception e) {
} }
catch (Exception e) }
{ return null;
}
public StoreLoginUser getStoreLoginUser(HttpServletRequest request) {
// 获取请求携带的令牌
String token = getToken(request);
if (StringUtils.isNotEmpty(token)) {
try {
Claims claims = parseToken(token);
// 解析对应的权限以及用户信息
String uuid = (String) claims.get(Constants.STORE_KEY);
String userKey = getTokenKey(uuid);
StoreLoginUser user = redisCache.getCacheObject(userKey);
return user;
} catch (Exception e) {
} }
} }
return null; return null;
} }
/** /**
* 设置用户身份信息 * 设置用户身份信息
*/ */
public void setLoginUser(LoginUser loginUser) public void setLoginUser(LoginUser loginUser) {
{ if (StringUtils.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken())) {
if (StringUtils.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken()))
{
refreshToken(loginUser); refreshToken(loginUser);
} }
} }
@ -118,29 +134,46 @@ public class TokenService
return createToken(claims); return createToken(claims);
} }
public String createToken(StoreLoginUser loginUser) {
String token = IdUtils.fastUUID();
loginUser.setToken(token);
refreshToken(loginUser);
Map<String, Object> claims = new HashMap<>();
claims.put(Constants.STORE_KEY, token);
return createToken(claims);
}
/** /**
* 验证令牌有效期相差不足20分钟自动刷新缓存 * 验证令牌有效期相差不足20分钟自动刷新缓存
* *
* @param loginUser * @param loginUser
* @return 令牌 * @return 令牌
*/ */
public void verifyToken(LoginUser loginUser) public void verifyToken(LoginUser loginUser) {
{
long expireTime = loginUser.getExpireTime(); long expireTime = loginUser.getExpireTime();
long currentTime = System.currentTimeMillis(); long currentTime = System.currentTimeMillis();
if (expireTime - currentTime <= MILLIS_MINUTE_TEN) if (expireTime - currentTime <= MILLIS_MINUTE_TEN) {
{
refreshToken(loginUser); refreshToken(loginUser);
} }
} }
/**
* TODO:验证店家账号令牌有效期
*
* @param storeLoginUser
*/
public void verifyToken(StoreLoginUser storeLoginUser) {
}
/** /**
* 刷新令牌有效期 * 刷新令牌有效期
* *
* @param loginUser 登录信息 * @param loginUser 登录信息
*/ */
public void refreshToken(LoginUser loginUser) public void refreshToken(LoginUser loginUser) {
{
loginUser.setLoginTime(System.currentTimeMillis()); loginUser.setLoginTime(System.currentTimeMillis());
loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE); loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE);
// 根据uuid将loginUser缓存 // 根据uuid将loginUser缓存
@ -148,13 +181,18 @@ public class TokenService
redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES); redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
} }
public void refreshToken(StoreLoginUser loginUser) {
// 根据uuid将loginUser缓存
String userKey = getTokenKey(loginUser.getToken());
redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
}
/** /**
* 设置用户代理信息 * 设置用户代理信息
* *
* @param loginUser 登录信息 * @param loginUser 登录信息
*/ */
public void setUserAgent(LoginUser loginUser) public void setUserAgent(LoginUser loginUser) {
{
UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent")); UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent"));
String ip = IpUtils.getIpAddr(ServletUtils.getRequest()); String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
loginUser.setIpaddr(ip); loginUser.setIpaddr(ip);
@ -223,4 +261,6 @@ public class TokenService
{ {
return CacheConstants.LOGIN_TOKEN_KEY + uuid; return CacheConstants.LOGIN_TOKEN_KEY + uuid;
} }
} }

@ -1,5 +1,17 @@
package com.ruoyi.framework.web.service; package com.ruoyi.framework.web.service;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.enums.UserStatus;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.security.TypeUsernamePasswordAuthenticationToken;
import com.ruoyi.framework.security.context.AuthenticationContextHolder;
import com.ruoyi.store.domain.StoreAccount;
import com.ruoyi.store.domain.StoreLoginUser;
import com.ruoyi.store.service.IStoreAccountService;
import com.ruoyi.system.service.ISysUserService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -7,12 +19,6 @@ import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.enums.UserStatus;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.service.ISysUserService;
/** /**
* 用户验证处理 * 用户验证处理
@ -26,40 +32,62 @@ public class UserDetailsServiceImpl implements UserDetailsService
@Autowired @Autowired
private ISysUserService userService; private ISysUserService userService;
@Autowired @Autowired
private SysPasswordService passwordService; private SysPasswordService passwordService;
@Autowired @Autowired
private SysPermissionService permissionService; private SysPermissionService permissionService;
@Autowired
private IStoreAccountService storeAccountService;
@Override @Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
{
SysUser user = userService.selectUserByUserName(username);
if (StringUtils.isNull(user))
{
log.info("登录用户:{} 不存在.", username);
throw new ServiceException("登录用户:" + username + " 不存在");
}
else if (UserStatus.DELETED.getCode().equals(user.getDelFlag()))
{
log.info("登录用户:{} 已被删除.", username);
throw new ServiceException("对不起,您的账号:" + username + " 已被删除");
}
else if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
{
log.info("登录用户:{} 已被停用.", username);
throw new ServiceException("对不起,您的账号:" + username + " 已停用");
}
passwordService.validate(user); if (AuthenticationContextHolder.getContext() instanceof TypeUsernamePasswordAuthenticationToken) {
TypeUsernamePasswordAuthenticationToken token = (TypeUsernamePasswordAuthenticationToken) AuthenticationContextHolder.getContext();
String rawPassword = token.getCredentials().toString();
switch (token.getType()) {
case store: {
StoreAccount storeAccount = storeAccountService.selectAccountByMobile(username);
if (StringUtils.isNull(storeAccount)) {
log.info(StringUtils.format("{}不存在{}", token.getType().getRemark(), username));
throw new ServiceException(token.getType().getRemark() + "或密码错误");
}
if (!SecurityUtils.matchesPassword(rawPassword, storeAccount.getPassword())) {
throw new ServiceException(token.getType().getRemark() + "或密码错误");
}
return createLoginUser(storeAccount);
}
}
log.error("无法识别认证类型:" + AuthenticationContextHolder.getContext().getClass());
throw new ServiceException("系统异常");
} else {
SysUser user = userService.selectUserByUserName(username);
if (StringUtils.isNull(user)) {
log.info("登录用户:{} 不存在.", username);
throw new ServiceException("登录用户:" + username + " 不存在");
} else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) {
log.info("登录用户:{} 已被删除.", username);
throw new ServiceException("对不起,您的账号:" + username + " 已被删除");
} else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
log.info("登录用户:{} 已被停用.", username);
throw new ServiceException("对不起,您的账号:" + username + " 已停用");
}
passwordService.validate(user);
return createLoginUser(user);
}
}
return createLoginUser(user); private UserDetails createLoginUser(StoreAccount storeAccount) {
return new StoreLoginUser(storeAccount);
} }
public UserDetails createLoginUser(SysUser user) public UserDetails createLoginUser(SysUser user) {
{
return new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user)); return new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user));
} }
} }

@ -1,16 +1,35 @@
alter table sys_user CREATE TABLE IF NOT EXISTS `platform_sms`
add wechat_nick_name varchar(30) null comment '微信昵称'; (
alter table sys_user `id` INTEGER NOT NULL auto_increment COMMENT '主键',
add balance float null comment '账户余额'; `mobile` VARCHAR(255) NOT NULL COMMENT '中国大陆手机号',
alter table sys_user `code` VARCHAR(255) NOT NULL COMMENT '6位数字',
add referrer_id bigint null comment '推荐人ID'; `sendTime` datetime COMMENT '未发送或发送失败为空',
alter table sys_user `deadTime` datetime COMMENT '未发送或发送失败为空',
add constraint sys_user_sys_user_user_id_fk `error` VARCHAR(255),
foreign key (referrer_id) references sys_user (user_id); `remark` VARCHAR(255) COMMENT '注册|修改手机号',
alter table sys_user PRIMARY KEY (`id`)
modify user_name varchar(30) null comment '用户账号'; ) ENGINE = InnoDB COMMENT '短信验证码表';
# 收货地址表
create table ttsbg.platform_address CREATE TABLE IF NOT EXISTS `platform_store_account`
(
storeId int auto_increment
primary key,
mobile varchar(255) not null comment '中国大陆手机号',
password varchar(255) not null comment 'HS512 加密',
status int not null comment '枚举值、详看数据字典编码',
registerDate datetime not null comment 'yyyy-MM-dd',
nickname varchar(255) not null comment '待确定格式',
sex int not null comment '枚举值、详看数据字典编码',
avatar varchar(255) null comment '待确定存储格式',
loginDate datetime null comment 'yyyy-MM-dd',
constraint platform_store_account_mobile_uindex
unique (mobile)
)
comment '店家账号表';
# TODO:熟悉框架建立的表,后面可能要再调整
create table platform_address
( (
id bigint auto_increment id bigint auto_increment
primary key, primary key,
@ -28,12 +47,12 @@ create table ttsbg.platform_address
update_time datetime null, update_time datetime null,
user_id bigint null comment '关联用户', user_id bigint null comment '关联用户',
constraint platform_address_sys_user_user_id_fk constraint platform_address_sys_user_user_id_fk
foreign key (user_id) references ttsbg.sys_user (user_id) foreign key (user_id) references sys_user (user_id)
) )
comment '收货地址表'; comment '收货地址表';
# TODO:熟悉框架建立的表,后面可能要再调整
create table platform_follower create table platform_follower
( (
id bigint auto_increment id bigint auto_increment
@ -49,4 +68,5 @@ create table platform_follower
comment '粉丝表'; comment '粉丝表';
select max(deadTime)
from platform_sms;

@ -0,0 +1,26 @@
<?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>
<parent>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi</artifactId>
<version>3.8.5</version>
</parent>
<artifactId>ttsbg-framework</artifactId>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common</artifactId>
</dependency>
</dependencies>
</project>

@ -0,0 +1,76 @@
package com.ruoyi.framework.domain;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Collection;
public abstract class PlatformLoginUser<T> implements UserDetails {
private String token;
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
private T t;
public PlatformLoginUser(T t) {
this.t = t;
}
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return null;
}
/**
* 账户是否未过期,过期无法验证
*/
@Override
public boolean isAccountNonExpired() {
return true;
}
/**
* 指定用户是否解锁,锁定的用户无法进行身份验证
*
* @return
*/
@Override
public boolean isAccountNonLocked() {
return true;
}
/**
* 指示是否已过期的用户的凭据(密码),过期的凭据防止认证
*
* @return
*/
@Override
public boolean isCredentialsNonExpired() {
return true;
}
/**
* 是否可用 ,禁用的用户不能身份验证
*
* @return
*/
@Override
public boolean isEnabled() {
return true;
}
}

@ -0,0 +1,124 @@
package com.ruoyi.framework.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import java.util.Date;
/**
* 短信验证码对象 platform_sms
*
* @author ruoyi
* @date 2023-02-09
*/
@TableName("platform_sms")
public class Sms extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 中国大陆手机号
*/
@Excel(name = "中国大陆手机号")
@NotBlank(message = "手机号不能为空")
@Pattern(message = "手机号不合法", regexp = "^1(3\\d|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8\\d|9[0-35-9])\\d{8}$")
private String mobile;
/**
* 6位数字
*/
@Excel(name = "6位数字")
private String code;
/**
* 未发送或发送失败为空
*/
@Excel(name = "未发送或发送失败为空")
private Date sendtime;
/**
* 未发送或发送失败为空
*/
@Excel(name = "未发送或发送失败为空")
private Date deadtime;
/**
* $column.columnComment
*/
@Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
private String error;
public void setId(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getMobile() {
return mobile;
}
public void setCode(String code) {
this.code = code;
}
public String getCode() {
return code;
}
public void setSendtime(Date sendtime) {
this.sendtime = sendtime;
}
public Date getSendtime() {
return sendtime;
}
public void setDeadtime(Date deadtime) {
this.deadtime = deadtime;
}
public Date getDeadtime() {
return deadtime;
}
public void setError(String error) {
this.error = error;
}
public String getError() {
return error;
}
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("mobile", getMobile())
.append("code", getCode())
.append("sendtime", getSendtime())
.append("deadtime", getDeadtime())
.append("error", getError())
.append("remark", getRemark())
.toString();
}
}

@ -0,0 +1,62 @@
package com.ruoyi.framework.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.framework.domain.Sms;
import java.util.List;
/**
* 短信验证码Mapper接口
*
* @author ruoyi
* @date 2023-02-09
*/
public interface SmsMapper extends BaseMapper<Sms> {
/**
* 查询短信验证码
*
* @param id 短信验证码主键
* @return 短信验证码
*/
public Sms selectSmsById(Long id);
/**
* 查询短信验证码列表
*
* @param Sms 短信验证码
* @return 短信验证码集合
*/
public List<Sms> selectSmsList(Sms Sms);
/**
* 新增短信验证码
*
* @param Sms 短信验证码
* @return 结果
*/
public int insertSms(Sms Sms);
/**
* 修改短信验证码
*
* @param Sms 短信验证码
* @return 结果
*/
public int updateSms(Sms Sms);
/**
* 删除短信验证码
*
* @param id 短信验证码主键
* @return 结果
*/
public int deleteSmsById(Long id);
/**
* 批量删除短信验证码
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteSmsByIds(Long[] ids);
}

@ -0,0 +1,72 @@
package com.ruoyi.framework.service;
import com.ruoyi.framework.domain.Sms;
import java.util.List;
/**
* 短信验证码Service接口
*
* @author ruoyi
* @date 2023-02-09
*/
public interface ISmsService {
/**
* 查询短信验证码
*
* @param id 短信验证码主键
* @return 短信验证码
*/
public Sms selectSmsById(Long id);
/**
* 查询短信验证码列表
*
* @param Sms 短信验证码
* @return 短信验证码集合
*/
public List<Sms> selectSmsList(Sms Sms);
/**
* 新增短信验证码
*
* @param Sms 短信验证码
* @return 结果
*/
public int insertSms(Sms Sms);
/**
* 修改短信验证码
*
* @param Sms 短信验证码
* @return 结果
*/
public int updateSms(Sms Sms);
/**
* 批量删除短信验证码
*
* @param ids 需要删除的短信验证码主键集合
* @return 结果
*/
public int deleteSmsByIds(Long[] ids);
/**
* 删除短信验证码信息
*
* @param id 短信验证码主键
* @return 结果
*/
public int deleteSmsById(Long id);
/**
* 发送短信验证码
*
* @param mobile 手机号
* @param integer
* @return 结果
*/
public String send(String mobile, Integer integer);
public Sms querySms(String mobile, String code);
}

@ -0,0 +1,125 @@
package com.ruoyi.framework.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.framework.domain.Sms;
import com.ruoyi.framework.mapper.SmsMapper;
import com.ruoyi.framework.service.ISmsService;
import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
* 短信验证码Service业务层处理
*
* @author ruoyi
* @date 2023-02-09
*/
@Service
public class SmsServiceImpl implements ISmsService {
@Autowired
private SmsMapper smsMapper;
/**
* 查询短信验证码
*
* @param id 短信验证码主键
* @return 短信验证码
*/
@Override
public Sms selectSmsById(Long id) {
return smsMapper.selectSmsById(id);
}
/**
* 查询短信验证码列表
*
* @param Sms 短信验证码
* @return 短信验证码
*/
@Override
public List<Sms> selectSmsList(Sms Sms) {
return smsMapper.selectSmsList(Sms);
}
/**
* 新增短信验证码
*
* @param Sms 短信验证码
* @return 结果
*/
@Override
public int insertSms(Sms Sms) {
return smsMapper.insertSms(Sms);
}
/**
* 修改短信验证码
*
* @param Sms 短信验证码
* @return 结果
*/
@Override
public int updateSms(Sms Sms) {
return smsMapper.updateSms(Sms);
}
/**
* 批量删除短信验证码
*
* @param ids 需要删除的短信验证码主键
* @return 结果
*/
@Override
public int deleteSmsByIds(Long[] ids) {
return smsMapper.deleteSmsByIds(ids);
}
/**
* 删除短信验证码信息
*
* @param id 短信验证码主键
* @return 结果
*/
@Override
public int deleteSmsById(Long id) {
return smsMapper.deleteSmsById(id);
}
/**
* 检查手机号是否存在有效短信验证码
*
* @return
*/
@Override
public Sms querySms(String mobile, String code) {
LambdaQueryWrapper<Sms> wrapper = new LambdaQueryWrapper<>();
Date d = new Date();
wrapper.select(Sms::getId).eq(Sms::getMobile, mobile).le(Sms::getSendtime, d).ge(Sms::getDeadtime, d);
if (code != null) {
wrapper.eq(Sms::getCode, code);
}
return smsMapper.selectOne(wrapper);
}
@Override
public String send(String mobile, Integer smsTime) {
if (querySms(mobile, null) != null) {
return "短信发送过于频繁";
} else {
String code = RandomStringUtils.randomNumeric(6);
Sms newSms = new Sms();
newSms.setMobile(mobile);
newSms.setCode(code);
//TODO 发送验证码成功
newSms.setSendtime(new Date());
newSms.setDeadtime(DateUtils.addSeconds(newSms.getSendtime(), smsTime));
smsMapper.insert(newSms);
return "短信验证码发送成功";
}
}
}

@ -0,0 +1,85 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.framework.mapper.SmsMapper">
<resultMap type="Sms" id="PlatformSmsResult">
<result property="id" column="id"/>
<result property="mobile" column="mobile"/>
<result property="code" column="code"/>
<result property="sendtime" column="sendTime"/>
<result property="deadtime" column="deadTime"/>
<result property="error" column="error"/>
<result property="remark" column="remark"/>
</resultMap>
<sql id="selectPlatformSmsVo">
select id, mobile, code, sendTime, deadTime, error, remark
from platform_sms
</sql>
<select id="selectSmsList" parameterType="Sms" resultMap="PlatformSmsResult">
<include refid="selectPlatformSmsVo"/>
<where>
<if test="mobile != null and mobile != ''">and mobile = #{mobile}</if>
<if test="code != null and code != ''">and code = #{code}</if>
<if test="sendtime != null ">and sendTime = #{sendtime}</if>
<if test="deadtime != null ">and deadTime = #{deadtime}</if>
<if test="error != null and error != ''">and error = #{error}</if>
</where>
</select>
<select id="selectSmsById" parameterType="Long" resultMap="PlatformSmsResult">
<include refid="selectPlatformSmsVo"/>
where id = #{id}
</select>
<insert id="insertSms" parameterType="Sms">
insert into platform_sms
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">id,</if>
<if test="mobile != null and mobile != ''">mobile,</if>
<if test="code != null and code != ''">code,</if>
<if test="sendtime != null">sendTime,</if>
<if test="deadtime != null">deadTime,</if>
<if test="error != null and error != ''">error,</if>
<if test="remark != null and remark != ''">remark,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">#{id},</if>
<if test="mobile != null and mobile != ''">#{mobile},</if>
<if test="code != null and code != ''">#{code},</if>
<if test="sendtime != null">#{sendtime},</if>
<if test="deadtime != null">#{deadtime},</if>
<if test="error != null and error != ''">#{error},</if>
<if test="remark != null and remark != ''">#{remark},</if>
</trim>
</insert>
<update id="updateSms" parameterType="Sms">
update platform_sms
<trim prefix="SET" suffixOverrides=",">
<if test="mobile != null and mobile != ''">mobile = #{mobile},</if>
<if test="code != null and code != ''">code = #{code},</if>
<if test="sendtime != null">sendTime = #{sendtime},</if>
<if test="deadtime != null">deadTime = #{deadtime},</if>
<if test="error != null and error != ''">error = #{error},</if>
<if test="remark != null and remark != ''">remark = #{remark},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteSmsById" parameterType="Long">
delete
from platform_sms
where id = #{id}
</delete>
<delete id="deleteSmsByIds" parameterType="String">
delete from platform_sms where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

@ -30,5 +30,11 @@
<artifactId>ruoyi-common</artifactId> <artifactId>ruoyi-common</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ttsbg-framework</artifactId>
<version>3.8.5</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

@ -0,0 +1,32 @@
<?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>
<parent>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi</artifactId>
<version>3.8.5</version>
</parent>
<artifactId>ttsbg-store</artifactId>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common</artifactId>
</dependency>
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ttsbg-framework</artifactId>
<version>3.8.5</version>
</dependency>
</dependencies>
</project>

@ -0,0 +1,164 @@
package com.ruoyi.store.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import java.util.Date;
/**
* 店家账号对象 platform_store_account
*
* @author ruoyi
* @date 2023-02-10
*/
@TableName("platform_store_account")
public class StoreAccount extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* $column.columnComment
*/
@TableId(type = IdType.AUTO)
private Long storeid;
/**
* 中国大陆手机号
*/
@Excel(name = "中国大陆手机号")
private String mobile;
/**
* HS512 加密
*/
@Excel(name = "HS512 加密")
private String password;
/**
* 枚举值详看数据字典编码
*/
@Excel(name = "枚举值、详看数据字典编码")
private Long status;
/**
* yyyy-MM-dd
*/
@Excel(name = "yyyy-MM-dd")
private Date registerdate;
/**
* 待确定格式
*/
@Excel(name = "待确定格式")
private String nickname;
/**
* 枚举值详看数据字典编码
*/
@Excel(name = "枚举值、详看数据字典编码")
private Long sex;
/**
* 待确定存储格式
*/
@Excel(name = "待确定存储格式")
private String avatar;
/**
* yyyy-MM-dd
*/
@Excel(name = "yyyy-MM-dd")
private Date logindate;
public void setStoreid(Long storeid) {
this.storeid = storeid;
}
public Long getStoreid() {
return storeid;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getMobile() {
return mobile;
}
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return password;
}
public void setStatus(Long status) {
this.status = status;
}
public Long getStatus() {
return status;
}
public void setRegisterdate(Date registerdate) {
this.registerdate = registerdate;
}
public Date getRegisterdate() {
return registerdate;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getNickname() {
return nickname;
}
public void setSex(Long sex) {
this.sex = sex;
}
public Long getSex() {
return sex;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
public String getAvatar() {
return avatar;
}
public void setLogindate(Date logindate) {
this.logindate = logindate;
}
public Date getLogindate() {
return logindate;
}
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("storeid", getStoreid())
.append("mobile", getMobile())
.append("password", getPassword())
.append("status", getStatus())
.append("registerdate", getRegisterdate())
.append("nickname", getNickname())
.append("sex", getSex())
.append("avatar", getAvatar())
.append("logindate", getLogindate())
.toString();
}
}

@ -0,0 +1,20 @@
package com.ruoyi.store.domain;
import com.ruoyi.framework.domain.PlatformLoginUser;
public class StoreLoginUser extends PlatformLoginUser<StoreAccount> {
public StoreLoginUser(StoreAccount storeAccount) {
super(storeAccount);
}
@Override
public String getPassword() {
return getT().getPassword();
}
@Override
public String getUsername() {
return getT().getMobile();
}
}

@ -0,0 +1,15 @@
package com.ruoyi.store.domain.vo;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class StoreAccountVo {
@NotBlank
private String mobile;
@NotBlank
private String password;
@NotBlank
private String verificationCode;
}

@ -0,0 +1,56 @@
package com.ruoyi.store.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.store.domain.StoreAccount;
import java.util.List;
public interface StoreAccountMapper extends BaseMapper<StoreAccount> {
/**
* 查询店家账号
*
* @param storeid 店家账号主键
* @return 店家账号
*/
public StoreAccount selectStoreAccountByStoreid(Long storeid);
/**
* 查询店家账号列表
*
* @param StoreAccount 店家账号
* @return 店家账号集合
*/
public List<StoreAccount> selectStoreAccountList(StoreAccount StoreAccount);
/**
* 新增店家账号
*
* @param StoreAccount 店家账号
* @return 结果
*/
public int insertStoreAccount(StoreAccount StoreAccount);
/**
* 修改店家账号
*
* @param StoreAccount 店家账号
* @return 结果
*/
public int updateStoreAccount(StoreAccount StoreAccount);
/**
* 删除店家账号
*
* @param storeid 店家账号主键
* @return 结果
*/
public int deleteStoreAccountByStoreid(Long storeid);
/**
* 批量删除店家账号
*
* @param storeids 需要删除的数据主键集合
* @return 结果
*/
public int deleteStoreAccountByStoreids(Long[] storeids);
}

@ -0,0 +1,75 @@
package com.ruoyi.store.service;
import com.ruoyi.store.domain.StoreAccount;
import com.ruoyi.store.domain.vo.StoreAccountVo;
import java.util.List;
/**
* 店家账号Service接口
*
* @author ruoyi
* @date 2023-02-10
*/
public interface IStoreAccountService {
/**
* 查询店家账号
*
* @param storeid 店家账号主键
* @return 店家账号
*/
public StoreAccount selectStoreAccountByStoreid(Long storeid);
/**
* 查询店家账号列表
*
* @param StoreAccount 店家账号
* @return 店家账号集合
*/
public List<StoreAccount> selectStoreAccountList(StoreAccount StoreAccount);
/**
* 新增店家账号
*
* @param StoreAccount 店家账号
* @return 结果
*/
public int insertStoreAccount(StoreAccount StoreAccount);
/**
* 修改店家账号
*
* @param StoreAccount 店家账号
* @return 结果
*/
public int updateStoreAccount(StoreAccount StoreAccount);
/**
* 批量删除店家账号
*
* @param storeids 需要删除的店家账号主键集合
* @return 结果
*/
public int deleteStoreAccountByStoreids(Long[] storeids);
/**
* 删除店家账号信息
*
* @param storeid 店家账号主键
* @return 结果
*/
public int deleteStoreAccountByStoreid(Long storeid);
public String register(StoreAccountVo account);
/**
* 手机号查询店家账号
*
* @param mobile
* @return
*/
public StoreAccount selectAccountByMobile(String mobile);
String resetpwd(StoreAccountVo account);
}

@ -0,0 +1,150 @@
package com.ruoyi.store.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.domain.Sms;
import com.ruoyi.framework.service.ISmsService;
import com.ruoyi.store.domain.StoreAccount;
import com.ruoyi.store.domain.vo.StoreAccountVo;
import com.ruoyi.store.mapper.StoreAccountMapper;
import com.ruoyi.store.service.IStoreAccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
* 店家账号Service业务层处理
*
* @author ruoyi
* @date 2023-02-10
*/
@Service
public class StoreAccountServiceImpl implements IStoreAccountService {
@Autowired
private StoreAccountMapper storeAccountMapper;
@Autowired
private ISmsService smsService;
/**
* 查询店家账号
*
* @param storeid 店家账号主键
* @return 店家账号
*/
@Override
public StoreAccount selectStoreAccountByStoreid(Long storeid) {
return storeAccountMapper.selectStoreAccountByStoreid(storeid);
}
/**
* 查询店家账号列表
*
* @param StoreAccount 店家账号
* @return 店家账号
*/
@Override
public List<StoreAccount> selectStoreAccountList(StoreAccount StoreAccount) {
return storeAccountMapper.selectStoreAccountList(StoreAccount);
}
/**
* 新增店家账号
*
* @param StoreAccount 店家账号
* @return 结果
*/
@Override
public int insertStoreAccount(StoreAccount StoreAccount) {
return storeAccountMapper.insertStoreAccount(StoreAccount);
}
/**
* 修改店家账号
*
* @param StoreAccount 店家账号
* @return 结果
*/
@Override
public int updateStoreAccount(StoreAccount StoreAccount) {
return storeAccountMapper.updateStoreAccount(StoreAccount);
}
/**
* 批量删除店家账号
*
* @param storeids 需要删除的店家账号主键
* @return 结果
*/
@Override
public int deleteStoreAccountByStoreids(Long[] storeids) {
return storeAccountMapper.deleteStoreAccountByStoreids(storeids);
}
/**
* 删除店家账号信息
*
* @param storeid 店家账号主键
* @return 结果
*/
@Override
public int deleteStoreAccountByStoreid(Long storeid) {
return storeAccountMapper.deleteStoreAccountByStoreid(storeid);
}
@Override
public StoreAccount selectAccountByMobile(String mobile) {
LambdaQueryWrapper<StoreAccount> wrapper = new LambdaQueryWrapper<>();
wrapper.select(StoreAccount::getStoreid, StoreAccount::getMobile, StoreAccount::getPassword).eq(StoreAccount::getMobile, mobile);
return storeAccountMapper.selectOne(wrapper);
}
@Override
public String register(StoreAccountVo account) {
//检查验证码是否有效
Sms sms = smsService.querySms(account.getMobile(), account.getVerificationCode());
if (sms != null) {
sms.setDeadtime(new Date());
smsService.updateSms(sms);
if (selectAccountByMobile(account.getMobile()) != null) {
return "手机号已注册";
} else {
StoreAccount newAccount = new StoreAccount();
newAccount.setMobile(account.getMobile());
newAccount.setPassword(SecurityUtils.encryptPassword(account.getPassword()));
newAccount.setStatus(1L);
newAccount.setRegisterdate(new Date());
newAccount.setNickname(newAccount.getMobile());
newAccount.setSex(0L);
if (storeAccountMapper.insert(newAccount) > 0) {
return "注册成功";
} else {
return "注册失败";
}
}
} else {
return "手机号或验证码错误";
}
}
@Override
public String resetpwd(StoreAccountVo account) {
//检查验证码是否有效
Sms sms = smsService.querySms(account.getMobile(), account.getVerificationCode());
if (sms != null) {
sms.setDeadtime(new Date());
smsService.updateSms(sms);
StoreAccount storeAccount = selectAccountByMobile(account.getMobile());
storeAccount.setPassword(SecurityUtils.encryptPassword(account.getPassword()));
if (storeAccountMapper.updateById(storeAccount) > 0) {
return "密码重置成功";
} else {
return "密码重置失败";
}
} else {
return "手机号或验证码错误";
}
}
}
Loading…
Cancel
Save