作者主页:夜未央5788
简介:Java领域优质创作者、Java项目、学习资料、技术互助
文末获取源码
智慧水产养殖系统
相关技术
> SpringBoot 及其相关技术栈的入门实践
- SpringBoot 2.0
- SpringSecurity
- MyBatis-Plus 2
- ActiveMQ
- 腾讯云短信和对象存储服务
起步
1. 执行 `sql/breed.sql` 文件初始化数据库
2. 修改 `application.properties` 配置信息:
1. `spring.datasource.username` 数据库用户名
2. `spring.datasource.password` 数据库密码
3. `logging.file` 日志输出路径,检查是否存在
4. `tencent.sms` 腾讯云短信相关配置
5. `cos` 腾讯云对象存储相关配置
6. `spring.activemq.broker-url` activemq 访问地址
3. 搭建 ActiveMQ 环境,[参考文章](https://blog.csdn.net/yuanlaijike/article/details/79950330)。
支持功能
1. 支持`用户名密码`和`短信验证码`两种登录逻辑
2. 支持头像上传,采用腾讯云对象存储。
3. 配合` SpringSecurity` 实现鉴权和角色控制。
4. 对于供应商用户,支持:
1. 对商品进行添加、上架、下架操作,商品描述支持富文本编辑。
2. 对买家订单进行查看。
3. 记录所有的买家客户信息,并统计总消费额。
5. 对于普通用户,支持:
1. 管理自己所有的塘口信息。
2. 将自己所有的设备动态添加到某一塘口上。
3. 设置支持远程开关操作。(使用 `ActiveMQ` 模拟实现)
默认账户
导入SQL后,默认提供以下账户:
- 用户名:wxs,密码:123,角色:供应商 验证码无需填写
- 用户名:jitwxs, 密码:123 角色:普通用户 验证码无需填写
运行截图 ![](https://i-blog.csdnimg.cn/blog_migrate/7a7c06ee4c2c46f9fdc833efbf14a414.jpeg)
代码相关
登录管理控制器
@RestController
public class LoginController {
@Autowired
private SysUserService userService;
@Autowired
private SysUserRoleService userRoleService;
@Value("${session.key.verify.tel}")
private String SESSION_KEY_VERIFY_TEL;
@Value("${session.key.verify.code}")
private String SESSION_KEY_VERIFY_CODE;
@Value("${session.key.verify.date}")
private String SESSION_KEY_VERIFY_DATE;
@Value("${verify.wait-time}")
private Long VERITY_WAIT_TIME;
/* ------------------------以下是登陆相关------------------------ */
/**
* 登陆错误处理
* @author jitwxs
*/
@RequestMapping("/login/error")
public Msg loginError(HttpServletRequest request) {
AuthenticationException exception = (AuthenticationException) request.getSession().getAttribute("SPRING_SECURITY_LAST_EXCEPTION");
return Msg.error(exception.getMessage(), exception.toString());
}
/**
* 发送验证码
* @author jitwxs
*/
@GetMapping("/sendSms")
public Msg sendSms(String tel, HttpServletRequest request) throws Exception {
if (StringUtils.isBlank(tel)) {
return Msg.error("号码错误");
}
HttpSession session = request.getSession();
// 如果Session中验证信息非空,判断是否超过间隔时间
Date lastDate = (Date) session.getAttribute(SESSION_KEY_VERIFY_DATE);
if (lastDate != null) {
long waitTime = (System.currentTimeMillis() - lastDate.getTime()) / 1000;
if (waitTime < VERITY_WAIT_TIME) {
return Msg.error("间隔时间过短");
}
}
// 如果Session中验证信息为空,或符合间隔时间,则发送验证码
String verifyCode = RandomUtils.number(6);
Msg msg = SmsUtils.send(tel, verifyCode, (VERITY_WAIT_TIME / 60) + "");
// 如果发送成功,将相关信息存入Session
if (msg.getStatus()) {
session.setAttribute(SESSION_KEY_VERIFY_TEL, tel);
session.setAttribute(SESSION_KEY_VERIFY_CODE, verifyCode);
session.setAttribute(SESSION_KEY_VERIFY_DATE, new Date());
}
return msg;
}
/**
* 登陆验证
* @author jitwxs
*/
@PostMapping("/loginCheck")
public Msg login(HttpServletRequest request, String loginName, String password, String code) {
if (StringUtils.isBlank(loginName) || (StringUtils.isBlank(password) && StringUtils.isBlank(code))) {
return Msg.error("参数错误");
}
// 规定loginName全数字且11位为手机登陆,否则为用户名登陆
Msg msg = null;
if (StringUtils.isNumeric(loginName) && loginName.length() == 11) {
if (StringUtils.isNotBlank(password)) {
msg = loginByTelAndPassword(loginName, password);
} else if (StringUtils.isNotBlank(code)) {
msg = loginByTelAndCode(loginName, code, request);
}
} else {
msg = loginByUsernameAndPassword(loginName, password);
}
return msg;
}
/**
* 手机+验证码登陆
* @author jitwxs
*/
private Msg loginByTelAndCode(String tel, String code, HttpServletRequest request) {
HttpSession session = request.getSession();
String sessionTel = (String) session.getAttribute(SESSION_KEY_VERIFY_TEL);
String sessionCode = (String) session.getAttribute(SESSION_KEY_VERIFY_CODE);
// 验证码登陆无需验证用户是否存在
return SmsUtils.check(sessionTel, sessionCode,tel,code);
}
/**
* 手机+密码登陆
* @author jitwxs
*/
private Msg loginByTelAndPassword(String tel, String password) {
boolean b = userService.checkByTelAndPassword(tel, password);
return b ? Msg.ok() : Msg.error("账户不存在或密码错误");
}
/**
* 用户名+密码登陆
* @author jitwxs
* @since 2018/4/25 15:09
*/
private Msg loginByUsernameAndPassword(String username, String password) {
boolean b = userService.checkByUserAndPassword(username, password);
return b ? Msg.ok() : Msg.error("账户不存在或密码错误");
}
/* ------------------------以下是注册相关------------------------ */
/**
* 注册验证
* @author jitwxs
*/
@PostMapping("/registerCheck")
public Msg registerCheck(String regName, String verifyCode, HttpServletRequest request) {
if(StringUtils.isBlank(regName) || StringUtils.isBlank(verifyCode)) {
return Msg.error("参数错误");
}
HttpSession session = request.getSession();
String code = (String) session.getAttribute("validateCode");
// 忽略大小写
code = code.toLowerCase();
verifyCode = verifyCode.toLowerCase();
if(StringUtils.isBlank(code) || !code.equals(verifyCode)) {
return Msg.error("验证码错误");
}
if(userService.hasExistByUserName(regName)) {
return Msg.error("用户名已被注册");
}
return Msg.ok();
}
/**
* 注册
* @author jitwxs
*/
@PostMapping("/register")
public Msg register(String username, String password) {
if(StringUtils.isBlank(username) || StringUtils.isBlank(password)) {
return Msg.error("参数错误");
}
// 再次验证,此处可省略
if(userService.hasExistByUserName(username)) {
return Msg.error("用户名已被注册");
}
SysUser user = new SysUser();
user.setUsername(username);
user.setPassword(PasswordUtils.encryptPassword(password));
user.setCreateDate(new Date());
userService.insert(user);
// 新用户默认权限为普通用户
SysUserRole userRole = new SysUserRole();
userRole.setRoleId("ROLE_USER");
userRole.setUserId(user.getId());
userRoleService.insert(userRole);
return Msg.ok();
}
/**
* 判断用户名是否被注册
* @author jitwxs
*/
@PostMapping("/checkUsername")
public Msg checkUsername(String username) {
boolean b = userService.hasExistByUserName(username);
return b ? Msg.error("用户名已经被注册") : Msg.ok();
}
/**
* 判断手机号是否被注册
* @author jitwxs
* @since 2018/4/25 15:14
*/
@PostMapping("/checkTel")
public Msg checkTel(String tel) {
boolean b = userService.hasExistByTel(tel);
return b ? Msg.error("手机号已经被注册") : Msg.ok();
}
}
设备管理控制器
@RestController
@RequestMapping("/device")
public class DeviceController {
@Autowired
private DeviceService deviceService;
@Autowired
private DeviceTypeService deviceTypeService;
/**
* 获取单一设备详细信息
* @author jitwxs
*/
@GetMapping("/{id}")
public Msg getById(@PathVariable String id) {
Device device = deviceService.selectById(id);
if(device != null) {
return Msg.ok(null,device);
} else {
return Msg.error("获取设备信息失败");
}
}
/**
* 获取设备一级类别
* @author jitwxs
*/
@GetMapping("/type/tree")
public Msg listDeviceRootType() {
List<DeviceType> rootTree = deviceTypeService.selectList(new EntityWrapper<DeviceType>()
.isNull("parent_id"));
return Msg.ok(null,rootTree);
}
/**
* 获取设备二级类别
* @author jitwxs
*/
@GetMapping("/type/tree/{id}")
public Msg listDeviceRootType(@PathVariable Integer id) {
List<DeviceType> rootTree = deviceTypeService.selectList(new EntityWrapper<DeviceType>()
.eq("parent_id", id));
return Msg.ok(null,rootTree);
}
/**
* 根据类别查询设备
* @author jitwxs
*/
@GetMapping("/type/{type}")
public Msg listByType(@PathVariable Integer type) {
List<Device> devices = deviceService.selectList(new EntityWrapper<Device>()
.eq("type", type));
return Msg.ok(null,devices);
}
}
如果也想学习本系统,下面领取。回复:025springboot