ssm框架下实现手机营业厅连签送流量

news2024/12/25 13:44:53

功能概述

模拟常见手机营业厅APP登录签到领取流量功能,利用SSM框架完成登录签到领取流量,具体功能如下:

用户登录之后方可签到,点击签到,领取10积分,每天最多签到一次

一个月内只要连续登录签到7天,除每日10积分之外,额外奖励流量30M

如果中间遗漏签到,则之前累积天数清零,重新计算,但签到积分保留

数据库设计

项目结构

实体类

package com.xszx.beans;

import java.sql.Date;


public class Signin {
    private Integer id;
    private User user;
    private Date beginTime;

    public Signin() {
    }

    public Signin(Integer id, User user, Date beginTime) {
        this.id = id;
        this.user = user;
        this.beginTime = beginTime;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Date getBeginTime() {
        return beginTime;
    }

    public void setBeginTime(Date beginTime) {
        this.beginTime = beginTime;
    }

    @Override
    public String toString() {
        return "Signin{" +
                "id=" + id +
                ", user=" + user +
                ", beginTime=" + beginTime +
                '}';
    }
}




package com.xszx.beans;

public class User {
    private Integer id;
    private String name;
    private String phone;
    private int integral;
    private int flow;
    private Integer state;

    public User() {
    }

    public User(Integer id, String name, String phone, int integral, int flow, Integer state) {
        this.id = id;
        this.name = name;
        this.phone = phone;
        this.integral = integral;
        this.flow = flow;
        this.state = state;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public int getIntegral() {
        return integral;
    }

    public void setIntegral(int integral) {
        this.integral = integral;
    }

    public int getFlow() {
        return flow;
    }

    public void setFlow(int flow) {
        this.flow = flow;
    }

    public Integer getState() {
        return state;
    }

    public void setState(Integer state) {
        this.state = state;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", phone='" + phone + '\'' +
                ", integral=" + integral +
                ", flow=" + flow +
                ", state=" + state +
                '}';
    }
}




控制层

package com.xszx.controller;

import com.xszx.beans.User;
import com.xszx.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.sql.Date;
import java.util.List;

@Controller
public class UserController {
    private UserService userService;
@Resource
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
    @RequestMapping("/login")
    public String login(String phone,Model model,HttpSession session) {
        User user1 = userService.getUserByPhone(phone);
        if (user1 != null) {
            model.addAttribute("msg", "登陆成功");
            session.setAttribute("user", user1);
            return "index";
        } else {
            model.addAttribute("msg", "登陆失败");
            return "login";
        }
    }
    @RequestMapping("/signin")
    public String signin(int uid,Model model) {
        boolean b = userService.signToday(uid);
        if (b){
            model.addAttribute("msg", "今天已签到");
            return "index";
        }else{
            //判断今天是否和之前是一个月,若不是则重置连签次数和状态
            boolean a = userService.getLastSignin(uid);
            if(!a){
                //重置连签次数和状态
                userService.setStateAndFlag(uid);
            }
            //签到
            userService.signin(uid);

            //查看连签次数
            int state = userService.selectState(uid);
            int flag = userService.selectFlage(uid);
            if(state==7&&flag==0){
                userService.addFlow(uid);
                model.addAttribute("msg", "签到成功,连签七天恭喜您获得30M流量");
            }else{
                model.addAttribute("msg", "签到成功");
            }
            return "index";
        }

    }

}

数据层

package com.xszx.dao;

import com.xszx.beans.Signin;
import com.xszx.beans.User;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.sql.Date;
import java.util.List;
@Repository
public interface UserDao {

    User getUserByPhone(@Param("phone") String phone);

    List<Signin> signToday(@Param("uid") int uid);

    void addIntegral(@Param("uid") int uid);

    void addState(@Param("uid") int uid);

    void signin(@Param("uid") int uid);

    Signin signinYesterday(@Param("uid") int uid);

    void setState(@Param("uid") int uid);

    int selectState(@Param("uid") int uid);

    void addFlow(@Param("uid") int uid);

    void updateFlag(@Param("uid")int uid);

    int selectFlage(@Param("uid") int uid);

    List<Signin> getLastSignin(@Param("uid")int uid);

    void setStateAndFlag(@Param("uid")int uid);
}

业务层

package com.xszx.service;

import com.xszx.beans.User;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.beans.Transient;
import java.io.IOException;
import java.sql.Date;
import java.util.List;

public interface UserService {

    User getUserByPhone(String phone);

    boolean signToday(int uid);

    void signin(int uid);

    int selectState(int uid);

    void addFlow(int uid);

    int selectFlage(int uid);


    boolean getLastSignin(int uid);

    void setStateAndFlag(int uid);
}

业务实现层

package com.xszx.service.impl;

import com.xszx.beans.Signin;
import com.xszx.beans.User;
import com.xszx.dao.UserDao;
import com.xszx.service.UserService;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.sql.Date;
import java.util.Collections;
import java.util.List;

@Service
public class UserServiceImpl implements UserService {
    private SqlSessionTemplate sqlSessionTemplate;
@Autowired
    public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
        this.sqlSessionTemplate = sqlSessionTemplate;
    }
    @Override
    public User getUserByPhone(String phone) {
    UserDao userDao = sqlSessionTemplate.getMapper(UserDao.class);
    return userDao.getUserByPhone(phone);
    }

    @Override
    public boolean signToday(int uid) {
        UserDao userDao = sqlSessionTemplate.getMapper(UserDao.class);
        List<Signin> list = userDao.signToday(uid);
        if(list.size()>0){
            return true;
        }else{
            return false;
        }
    }

    @Override
    public void signin(int uid) {
        UserDao userDao = sqlSessionTemplate.getMapper(UserDao.class);
        //加积分
        userDao.addIntegral(uid);
        //查看前一天是否签到,若没签到断签
        Signin Signin  =  userDao.signinYesterday(uid);
        System.out.println(Signin);
        if(Signin==null){
            //断签,重置天数
            userDao.setState(uid);
        }else{
            //连签,增加天数
            userDao.addState(uid);
        }
        //签到
        userDao.signin(uid);
    }

    @Override
    public int selectState(int uid) {
        UserDao userDao = sqlSessionTemplate.getMapper(UserDao.class);
        return userDao.selectState(uid);
    }

    @Override
    public void addFlow(int uid) {
        UserDao userDao = sqlSessionTemplate.getMapper(UserDao.class);
        userDao.addFlow(uid);
        userDao.updateFlag(uid);
    }

    @Override
    public int selectFlage(int uid) {
        UserDao userDao = sqlSessionTemplate.getMapper(UserDao.class);
        return userDao.selectFlage(uid);
    }

    @Override
    public boolean getLastSignin(int uid) {
        UserDao userDao = sqlSessionTemplate.getMapper(UserDao.class);
        List<Signin> list = userDao.getLastSignin(uid);
        if (list.size()>0){
            return true;
        }else{
            return false;
        }

    }

    @Override
    public void setStateAndFlag(int uid) {
        UserDao userDao = sqlSessionTemplate.getMapper(UserDao.class);
        userDao.setStateAndFlag(uid);
    }


}

前端代码

前端只实现功能,无任何美化

<%--
  Created by IntelliJ IDEA.
  User: 51475
  Date: 2024/9/10
  Time: 19:12
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>签到</title>
    <script>
        var msg = "${msg}";
        if (msg != null && msg != "") {
            alert(msg);
        }
    </script>
</head>
<body>
<button onclick="window.location.href='/signin?uid=${user.id}'">签到</button>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2124175.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

西圣find、蜂鸟t15、善尼体可视挖耳勺值得买吗?全方面测评实力王者品牌

可视挖耳勺作为一种新兴的掏耳神器&#xff0c;在市场上受到了广泛欢迎&#xff0c;各大品牌纷纷推出新品。然而&#xff0c;近期网络上关于可视挖耳勺的负面声音也在增多。不少消费者反映在使用过程中出现画质低清、画面卡顿等现象。作为一名居家物品测评博主&#xff0c;我对…

移动瑜伽馆:随时随地,开启身心之旅—轻空间

在快节奏的现代生活中&#xff0c;人们对健康与平衡的追求愈发强烈&#xff0c;瑜伽作为一种身心结合的运动&#xff0c;正受到越来越多人的青睐。然而&#xff0c;传统瑜伽场馆的固定场地、长时间建设与高昂的成本&#xff0c;常常限制了其普及和发展。如今&#xff0c;一种全…

大模型研发全揭秘:AI模型设计的五大关键步骤

模型设计是大模型项目研发的核心环节&#xff0c;它决定了模型的性能、效果以及在实际场景中的适用性。设计一个高效的模型不仅要求对算法的精通&#xff0c;还需要全面理解问题背景、合理调整模型架构和参数&#xff0c;并构建科学的评估体系。本文将深入探讨大模型项目研发流…

一文读懂数字化生态平台的多元功能!

在这个数字化飞速发展的时代&#xff0c;有个话题不得不提 —— 数字化生态平台的多元功能。 ​ 资源整合&#xff1a;凝聚各方力量 在当下&#xff0c;数字化生态平台就像一个大管家&#xff0c;能把分散在不同地方、不同主体的各类资源高效整合起来。商业领域里&#xff0c;…

教你五句在酒桌上和领导说的话语

1、今天很荣幸能和领导一起吃饭&#xff0c;我敬领导一杯希望领导工作顺利身体健康!生意兴隆!2、我敬领导一杯感谢领导平时对我的关照先干为敬!3、谢谢领导这次给我这个机会我一定会好好把握的请领导放心我一定会好好工作绝对不辜负领导对我的期望4.领导能来这里我们感到非常骄…

Java面试题精选:分布式(一)

一、分布性幂等性如何设计&#xff1f; 重要性&#xff1a;   幂等性在高并发的场景架构中是必须要保证的。比如支付功能&#xff0c;用户发起支付请求&#xff0c;如果后台没有做幂等校验&#xff0c;用户不小心多点了几点&#xff0c;于是后台就会受到同一个订单的多次请求…

新能源汽车BMS 学习笔记篇—AFE 菊花链通信中电容隔离 电感隔离的使用

在汽车高压BMS系统中&#xff0c;通常采用 CAN 总线或菊花链&#xff08;&#xff08;Daisy Chain&#xff09;架构。菊花链架构通过串行连接每个节点&#xff0c;通常只需要两条信号线穿过所有节点。相比之下&#xff0c;CAN总线通常需要多个并行连接到总线上&#xff0c;布线…

LabVIEW开发FPGA方法与FIFO数据丢失处理

开发基于NI 7975R FPGA的系统涉及一系列流程&#xff0c;包括驱动安装、LabVIEW项目设置、开发调试、编译和与Windows系统的通信。重点在于FIFO的正确配置&#xff0c;避免数据丢失是关键环节之一&#xff0c;尤其是在使用高速数据流传输时。以下将详细介绍这些过程&#xff0c…

电脑在开机时出现了Boot Menu菜单如何做U盘启动

电脑在开机时出现了Boot Menu菜单如何进系统? 在开机的时候按DEL键&#xff0c;进入bios设置。在关于启动项目第一启动项修改成HDD&#xff0c;然后保存就可以了。如果下次启动还出现&#xff0c;那么就是你的CMOS不能保存信息&#xff0c;换电池一般就解决问题了。 可能性的…

Sentinel 安装

一、下载jar包 下载地址&#xff1a;Releases alibaba/Sentinel GitHub 二、运行 将jar包放在任意非中文、不包含特殊字符的目录下&#xff0c;启动 启动命令&#xff1a;运行cmd 使用一下命令 java -Dserver.port8090 -Dcsp.sentinel.dashboard.serverlocalhost:8090 -D…

92. 反转链表 II【 力扣(LeetCode) 】

一、题目描述 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 进阶&#xff1a; 你可以使用一趟扫描完成反转吗&#xff1f; 二、测试用例 示例 1&a…

第三部分:2---进程理解/Linux下进程初识

目录 操作系统如何管理进程&#xff1f; 进程的结构体&#xff1a; 操作系统如何加载进程&#xff1f; CPU如何调度进程&#xff1f; 进程如何在多个队列排队&#xff1a; offsetof宏&#xff1a; 进程标识符&#xff1a; 程序打印自己的pid和ppid&#xff1a; 杀死进程…

Java重修笔记 第五十三天 坦克大战(一)绘图入门

绘制简单的图形 1. 创建画板 定义一个画板类&#xff0c;通过继承 JPanel 类来创建画板 2. 创建画笔 在画板类中调用 paint 方法&#xff0c;并传入一个 Graphics g 对象&#xff0c;通过对 g 对象的操作来实现画画的过程 3. 开始作画 调用 Graphics g 对象的方法在 paint …

驰域货车四路监控ts视频格式化恢复方法

不少大货车都使用了驰域货车监控&#xff0c;一般是至少装四路&#xff0c;前后左右&#xff0c;有的还会车顶加一路。驰域货车记录仪特殊的地方在于&#xff1a;其采用了一种上古时期的视频格式----TS视频流。 故障存储: 128G卡/fat32 故障现象: 客户提供的信息是格式化后…

193页WORD省级智慧高速公路投标技术方案

关注智慧方案文库&#xff0c;学习9000多份智慧城市&#xff0c;智慧医院&#xff0c;智能制造&#xff0c;数字化转型&#xff0c;新质生产力&#xff0c;算力&#xff0c;大模型&#xff0c;AIGC&#xff0c;工业互联网&#xff0c;数字孪生......持续更新热点行业解决方案。…

云曦2024秋季开学考

ezezssrf 第一关&#xff1a;md5弱比较 yunxi%5B%5D1&wlgf%5B%5D2 第二关&#xff1a; md5强比较 需要在bp中传参&#xff0c;在hackbar里不行 yunxiiM%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DC V%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_B…

机器学习(西瓜书)第 6 章 支持向量机

6.1 算法原理 感知机要求就随便找一个超平面&#xff0c;只要能把正负样本分开就行 但是支持向量机不一样&#xff0c;它认为你不仅得把它分开&#xff0c;而且这个超平面还得尽可能的离正负样本远 6.2 间隔与支持向量 其中w (wi&#xff1b;w2;…;wd)为法向量&#xff0c;决…

基于51单片机的打点滴监控系统proteus仿真

地址&#xff1a;https://pan.baidu.com/s/1l3OxHLBwOzsChKHCJsAySQ 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectron…

深入探索:自适应中值滤波器在图像去噪中的应用

在数字图像处理领域&#xff0c;噪声是影响图像质量的重要因素之一。椒盐噪声&#xff0c;作为常见的一种噪声&#xff0c;会在图像中随机产生过度黑或过度白的像素&#xff0c;严重影响图像的视觉质量。为了有效去除这类噪声&#xff0c;自适应中值滤波器&#xff08;AMF&…

《论应用服务器基础软件》写作框架,软考高级系统架构设计师

论文真题 应用服务器是在当今基于互联网的企业级应用迅速发展,电子商务应用出现并快速膨胀的需求下产生的一种新技术。在分布式、多层结构及基于组件和服务器端程序设计的企业级应用开发中,应用服务器提供的是一个开发、部署、运行和管理、维护的平台,提供软件“集群”功能…