Java项目:springBoot+html智慧水产养殖系统

作者主页:夜未央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 角色:普通用户 验证码无需填写

运行截图 

 

 

 

 

 

代码相关

登录管理控制器

@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

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜未央5788

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值