在当今数字化运营时代,传统网吧行业面临着计费不精准、财务对账繁琐、人工记录易出错等核心挑战。针对这些痛点,我们设计开发了一套基于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='上机记录'
设计深度分析:
- 时间戳字段优化:
shangji_time和xiaji_time使用timestamp类型精确记录上下机时间,支持时区处理 - 金额精度控制:
huafeijine字段采用decimal(10,2)类型,确保财务计算的精确性 - 状态枚举设计:
shangjijilu_zhuangtai_types通过字典表关联,实现状态管理的灵活性 - 索引策略:主键自增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框架的优雅实现,为网吧行业提供了完整的数字化解决方案。系统在数据库设计上充分考虑了业务需求,采用合理的表结构和索引策略;在功能实现上覆盖了从用户管理、机器分配到计费结算的全流程;在技术架构上保持了良好的扩展性和维护性。
平台的实际运行效果表明,它能够显著提升网吧的运营效率,降低人工成本,提高财务透明度。随着后续的持续优化和功能扩展,该系统有望成为网吧行业数字化转型的标准解决方案。