基于SSM框架的在线网吧计费管理平台 - 源码深度解析

JavaJavaScriptHTMLCSSSSM框架MavenMySQL
2026-02-0711 浏览

文章摘要

本项目是一款基于SSM(Spring+Spring MVC+MyBatis)框架构建的在线网吧计费管理平台,旨在通过数字化手段彻底革新传统网吧的人工计时与收费模式。其核心业务价值在于解决了网吧运营中普遍存在的计费不精准、财务对账繁琐、人工记录易出错以及会员管理效率低下等核心痛点。平台将计时、收费、上...

在当今数字化运营时代,传统网吧行业面临着计费不精准、财务对账繁琐、人工记录易出错等核心挑战。针对这些痛点,我们设计开发了一套基于SSM框架的智能网吧计费管理平台,通过全流程自动化管理彻底革新传统网吧的运营模式。

系统架构与技术栈

该平台采用经典的SSM(Spring+Spring MVC+MyBatis)三层架构,结合Maven进行项目依赖管理,MySQL作为数据存储解决方案。前端使用jQuery和Bootstrap构建响应式用户界面,确保在不同设备上都能提供良好的用户体验。

技术架构层次解析:

  • 控制层:基于Spring MVC框架,采用注解方式配置RESTful风格的控制器
  • 业务层:Spring框架管理Service Bean的生命周期,提供声明式事务管理
  • 数据层:MyBatis负责对象关系映射,支持动态SQL和复杂查询
  • 视图层:轻量级前端技术栈,通过Ajax与后端进行数据交互

数据库设计亮点

上机记录表的核心设计

CREATE TABLE `shangjijilu` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `jiqi_id` int(11) DEFAULT NULL COMMENT '机器ID',
  `yonghu_id` int(11) DEFAULT NULL COMMENT '用户ID',
  `shangjijilu_uuid_number` varchar(200) DEFAULT NULL COMMENT '上机记录唯一编号',
  `shangji_time` timestamp NULL DEFAULT NULL COMMENT '上机时间',
  `xiaji_time` timestamp NULL DEFAULT NULL COMMENT '下机时间',
  `xiaoshi` int(11) DEFAULT NULL COMMENT '上机小时数',
  `huafeijine` decimal(10,2) DEFAULT NULL COMMENT '花费金额',
  `shangjijilu_zhuangtai_types` int(11) DEFAULT NULL COMMENT '上机记录状态类型',
  `insert_time` timestamp NULL DEFAULT NULL COMMENT '插入时间',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8 COMMENT='上机记录'

设计深度分析:

  1. 时间戳字段优化shangji_timexiaji_time使用timestamp类型精确记录上下机时间,支持时区处理
  2. 金额精度控制huafeijine字段采用decimal(10,2)类型,确保财务计算的精确性
  3. 状态枚举设计shangjijilu_zhuangtai_types通过字典表关联,实现状态管理的灵活性
  4. 索引策略:主键自增ID确保写入性能,同时为频繁查询的jiqi_id和yonghu_id字段建立索引

机器管理表的区域划分设计

CREATE TABLE `jiqi` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `jiqi_uuid_number` varchar(200) DEFAULT NULL COMMENT '机器唯一编号',
  `jiqi_qu_types` int(11) DEFAULT NULL COMMENT '机器区域类型',
  `jiqi_address` varchar(200) DEFAULT NULL COMMENT '机器地址',
  `jiqi_content` text DEFAULT NULL COMMENT '机器内容',
  `jiqi_shiyong_types` int(11) DEFAULT NULL COMMENT '机器使用类型',
  `jiqi_delete` int(11) DEFAULT NULL COMMENT '删除标识',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='机器'

机器管理界面

区域化管理优势:

  • 通过jiqi_qu_types实现分区计费策略,不同区域可设置不同费率
  • jiqi_shiyong_types字段支持机器状态管理(空闲、使用中、维修中)
  • 软删除设计(jiqi_delete)保留历史数据,便于统计分析

核心功能实现

1. 用户登录与身份验证

系统采用多角色登录机制,支持管理员和普通用户两种身份。登录流程通过Spring Security进行安全控制,确保系统访问的安全性。

@RestController
public class LoginController {
    
    @Autowired
    private YonghuService yonghuService;
    
    @RequestMapping("/login")
    public R login(@RequestBody Map<String, String> params) {
        String username = params.get("username");
        String password = params.get("password");
        
        // 参数验证
        if(StringUtils.isBlank(username) || StringUtils.isBlank(password)) {
            return R.error("用户名或密码不能为空");
        }
        
        // 查询用户信息
        YonghuEntity yonghu = yonghuService.selectOne(
            new EntityWrapper<YonghuEntity>().eq("username", username));
        
        if(yonghu == null || !yonghu.getPassword().equals(password)) {
            return R.error("用户名或密码错误");
        }
        
        // 生成token并返回用户信息
        String token = JWTUtils.generateToken(yonghu.getId());
        return R.ok().put("token", token).put("yonghu", yonghu);
    }
}

用户登录界面

2. 机器选择与上机流程

用户登录后可以查看可用机器并进行选择,系统实时更新机器状态,确保资源的合理分配。

@RestController
@RequestMapping("/jiqi")
public class JiqiController {
    
    @Autowired
    private JiqiService jiqiService;
    
    @Autowired
    private ShangjijiluService shangjijiluService;
    
    /**
     * 获取可用机器列表
     */
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params) {
        // 查询条件:只显示未删除且空闲的机器
        Wrapper<JiqiEntity> wrapper = new EntityWrapper<JiqiEntity>()
            .eq("jiqi_delete", 0)
            .eq("jiqi_shiyong_types", 1); // 1表示空闲状态
        
        List<JiqiEntity> jiqiList = jiqiService.selectList(wrapper);
        return R.ok().put("data", jiqiList);
    }
    
    /**
     * 用户选择机器上机
     */
    @RequestMapping("/shangji")
    public R shangji(Integer jiqiId, HttpServletRequest request) {
        // 获取当前用户ID
        Integer yonghuId = (Integer) request.getAttribute("yonghuId");
        
        // 验证机器状态
        JiqiEntity jiqi = jiqiService.selectById(jiqiId);
        if(jiqi == null || jiqi.getJiqiDelete() == 1) {
            return R.error("机器不存在或已被删除");
        }
        if(jiqi.getJiqiShiyongTypes() != 1) {
            return R.error("该机器当前不可用");
        }
        
        // 创建上机记录
        ShangjijiluEntity shangjijilu = new ShangjijiluEntity();
        shangjijilu.setJiqiId(jiqiId);
        shangjijilu.setYonghuId(yonghuId);
        shangjijilu.setShangjijiluUuidNumber(UUID.randomUUID().toString());
        shangjijilu.setShangjiTime(new Date());
        shangjijilu.setShangjijiluZhuangtaiTypes(1); // 上机状态
        
        shangjijiluService.insert(shangjijilu);
        
        // 更新机器状态为使用中
        jiqi.setJiqiShiyongTypes(2);
        jiqiService.updateById(jiqi);
        
        return R.ok("上机成功");
    }
}

机器选择界面

3. 计费与下机结算

系统采用实时计费模式,下机时自动计算消费金额并从用户余额中扣除。

@Service
public class ShangjijiluServiceImpl extends ServiceImpl<ShangjijiluDao, ShangjijiluEntity> 
    implements ShangjijiluService {
    
    @Autowired
    private YonghuService yonghuService;
    
    @Autowired
    private JiqiService jiqiService;
    
    @Transactional
    public R xiaji(Integer shangjijiluId) {
        ShangjijiluEntity shangjijilu = this.selectById(shangjijiluId);
        if(shangjijilu == null) {
            return R.error("上机记录不存在");
        }
        
        // 计算上机时长和费用
        Date xiajiTime = new Date();
        long duration = (xiajiTime.getTime() - shangjijilu.getShangjiTime().getTime()) / (1000 * 60 * 60);
        double hours = Math.ceil(duration); // 向上取整
        
        // 根据机器区域类型获取费率
        JiqiEntity jiqi = jiqiService.selectById(shangjijilu.getJiqiId());
        double rate = getRateByQuType(jiqi.getJiqiQuTypes());
        double amount = hours * rate;
        
        // 更新上机记录
        shangjijilu.setXiajiTime(xiajiTime);
        shangjijilu.setXiaoshi((int) hours);
        shangjijilu.setHuafeijine(new BigDecimal(amount));
        shangjijilu.setShangjijiluZhuangtaiTypes(2); // 下机状态
        this.updateById(shangjijilu);
        
        // 扣除用户余额
        YonghuEntity yonghu = yonghuService.selectById(shangjijilu.getYonghuId());
        if(yonghu.getNewMoney().compareTo(new BigDecimal(amount)) < 0) {
            return R.error("余额不足,请先充值");
        }
        
        yonghu.setNewMoney(yonghu.getNewMoney().subtract(new BigDecimal(amount)));
        yonghuService.updateById(yonghu);
        
        // 更新机器状态为空闲
        jiqi.setJiqiShiyongTypes(1);
        jiqiService.updateById(jiqi);
        
        return R.ok().put("data", shangjijilu);
    }
    
    private double getRateByQuType(Integer quType) {
        // 从配置表或字典表获取不同区域的费率
        // 简化实现,实际项目中应从数据库读取
        switch(quType) {
            case 1: return 5.0; // 普通区
            case 2: return 8.0; // 竞技区
            case 3: return 12.0; // VIP区
            default: return 5.0;
        }
    }
}

4. 用户管理与充值功能

管理员可以对用户账户进行管理,包括余额查询、充值操作和基本信息维护。

@RestController
@RequestMapping("/yonghu")
public class YonghuController {
    
    @Autowired
    private YonghuService yonghuService;
    
    /**
     * 用户充值
     */
    @RequestMapping("/chongzhi")
    public R chongzhi(Integer yonghuId, BigDecimal amount) {
        if(amount == null || amount.compareTo(BigDecimal.ZERO) <= 0) {
            return R.error("充值金额必须大于0");
        }
        
        YonghuEntity yonghu = yonghuService.selectById(yonghuId);
        if(yonghu == null) {
            return R.error("用户不存在");
        }
        
        yonghu.setNewMoney(yonghu.getNewMoney().add(amount));
        yonghuService.updateById(yonghu);
        
        // 记录充值日志
        // ... 充值日志记录逻辑
        
        return R.ok("充值成功");
    }
    
    /**
     * 查询用户上机记录
     */
    @RequestMapping("/shangjijilu")
    public R getShangjijilu(Integer yonghuId, 
                           @RequestParam(defaultValue = "1") Integer page,
                           @RequestParam(defaultValue = "10") Integer limit) {
        
        Map<String, Object> params = new HashMap<>();
        params.put("page", page.toString());
        params.put("limit", limit.toString());
        params.put("yonghuId", yonghuId.toString());
        
        PageUtils pageUtil = shangjijiluService.queryPage(params);
        return R.ok().put("page", pageUtil);
    }
}

用户管理界面

5. 统计报表功能

系统提供完善的统计功能,支持按日、月、年生成营收报表,帮助管理者分析经营状况。

@Service
public class TongjiServiceImpl implements TongjiService {
    
    @Autowired
    private ShangjijiluService shangjijiluService;
    
    public Map<String, Object> getDailyReport(String date) {
        Map<String, Object> result = new HashMap<>();
        
        // 查询当日上机记录
        Wrapper<ShangjijiluEntity> wrapper = new EntityWrapper<ShangjijiluEntity>()
            .eq("DATE(shangji_time)", date)
            .eq("shangjijilu_zhuangtai_types", 2); // 已完成的下机记录
        
        List<ShangjijiluEntity> records = shangjijiluService.selectList(wrapper);
        
        // 计算总营收
        BigDecimal totalIncome = records.stream()
            .map(ShangjijiluEntity::getHuafeijine)
            .reduce(BigDecimal.ZERO, BigDecimal::add);
        
        // 统计上机人次
        long userCount = records.stream()
            .map(ShangjijiluEntity::getYonghuId)
            .distinct()
            .count();
        
        result.put("totalIncome", totalIncome);
        result.put("userCount", userCount);
        result.put("recordCount", records.size());
        result.put("avgConsumption", totalIncome.divide(new BigDecimal(records.size()), 2, RoundingMode.HALF_UP));
        
        return result;
    }
}

统计报表界面

实体模型设计

系统采用MyBatis-Plus作为ORM框架,实体类设计简洁明了,支持自动CRUD操作。

@Entity
@TableName("yonghu")
public class YonghuEntity implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @TableId(type = IdType.AUTO)
    private Integer id;
    
    /**
     * 用户名
     */
    private String username;
    
    /**
     * 密码
     */
    private String password;
    
    /**
     * 用户姓名
     */
    private String yonghuName;
    
    /**
     * 用户电话
     */
    private String yonghuPhone;
    
    /**
     * 用户身份证号
     */
    private String yonghuIdNumber;
    
    /**
     * 用户照片
     */
    private String yonghuPhoto;
    
    /**
     * 性别类型
     */
    private Integer sexTypes;
    
    /**
     * 账户余额
     */
    private BigDecimal newMoney;
    
    /**
     * 创建时间
     */
    private Date createTime;
    
    // Getter和Setter方法
    public Integer getId() {
        return id;
    }
    
    public void setId(Integer id) {
        this.id = id;
    }
    
    public String getUsername() {
        return username;
    }
    
    public void setUsername(String username) {
        this.username = username;
    }
    
    // ... 其他getter/setter方法
}

功能展望与优化

基于当前系统架构,未来可以从以下几个方面进行优化和功能扩展:

1. 引入Redis缓存提升性能

@Service
public class JiqiServiceWithCache {
    
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    @Autowired
    private JiqiService jiqiService;
    
    private static final String CACHE_KEY = "jiqi:list:available";
    private static final long CACHE_EXPIRE = 300; // 5分钟
    
    public List<JiqiEntity> getAvailableJiqiList() {
        // 先尝试从缓存获取
        List<JiqiEntity> cachedList = (List<JiqiEntity>) 
            redisTemplate.opsForValue().get(CACHE_KEY);
        
        if(cachedList != null) {
            return cachedList;
        }
        
        // 缓存未命中,查询数据库
        List<JiqiEntity> jiqiList = jiqiService.getAvailableJiqiList();
        
        // 写入缓存
        redisTemplate.opsForValue().set(CACHE_KEY, jiqiList, 
            CACHE_EXPIRE, TimeUnit.SECONDS);
        
        return jiqiList;
    }
}

2. 消息队列实现异步处理

对于充值记录、消费记录等非实时性要求高的操作,可以引入RabbitMQ或Kafka进行异步处理,提升系统响应速度。

3. 微服务架构改造

将系统拆分为用户服务、计费服务、机器管理服务等微服务,提高系统的可维护性和扩展性。

4. 移动端适配开发

开发微信小程序或APP版本,方便用户远程查看余额、预约机器等功能。

5. 智能推荐功能

基于用户的上机历史和行为数据,实现机器推荐、套餐推荐等个性化服务。

总结

该智能网吧计费管理平台通过SSM框架的优雅实现,为网吧行业提供了完整的数字化解决方案。系统在数据库设计上充分考虑了业务需求,采用合理的表结构和索引策略;在功能实现上覆盖了从用户管理、机器分配到计费结算的全流程;在技术架构上保持了良好的扩展性和维护性。

平台的实际运行效果表明,它能够显著提升网吧的运营效率,降低人工成本,提高财务透明度。随着后续的持续优化和功能扩展,该系统有望成为网吧行业数字化转型的标准解决方案。

本文关键词
SSM框架网吧计费系统源码解析数据库设计MyBatis

上下篇

上一篇
没有更多文章
下一篇
没有更多文章