服务器预约系统linux小项目-第四节课

一、数据库设计

本节课在上一节课的 JSON 通信框架上引入数据库,主要实现用户注册数据的存储和查询。

1. 数据库表设计

user_info
字段名 类型 约束与意义
tel_id CHAR(11) 主键、非空、唯一,手机号(用户ID)
name VARCHAR(20) 用户名
passwd VARCHAR(16) 密码
status TINYINT 状态标记(0 = 禁用 / 1 = 启用)

SQL 创建语句:

复制代码

CREATE TABLE user_info(

tel_id CHAR(11) PRIMARY KEY NOT NULL UNIQUE,

name VARCHAR(20),

passwd VARCHAR(16),

status TINYINT

);

query_res
字段名 类型 约束与意义
id 主键
res_id 预约 ID
是否使用过 标记是否使用
ticket_table
字段名 类型 约束与意义
res_id 资源 ID
res_name 资源名称
总数目 总数量
已使用 已使用数量
是否开启预约 是否可预约

二、客户端流程

客户端通过 client.cpp 实现注册、登录、预约等操作。

1. 连接服务器

复制代码

bool Client::ConnectToServer()

{

sockfd = socket(AF_INET,SOCK_STREAM,0);

...

connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));

...

}

  • 成功连接服务器后才能进行后续操作

  • 套接字命名、端口设置和 IP 地址配置

2. 用户交互

  • Print_Info() 根据登录状态显示菜单:

    • 未登录:1 登录 2 注册

    • 已登录:1 预约 2 查看 3 取消预约 4 退出

  • 选项偏移处理:已登录选项编号 +2,避免和未登录冲突

3. 注册操作

Zc_user() 主要流程:

  1. 从键盘读取手机号、用户名、密码

  2. 组装 JSON 请求:

复制代码

{

"type": "ZC",

"user_tel": "13900000001",

"user_name": "小红",

"user_passwd": "111111"

}

  1. 发送给服务器:
复制代码

send(sockfd,val.toStyledString().c_str(),strlen(val.toStyledString().c_str()),0);

  1. 接收服务器返回 JSON:
复制代码

recv(sockfd, res_buff, 127, 0);

  1. 解析 JSON 并判断状态:
复制代码

zc_status = val["status"].asString();

if(zc_status == "OK") cout << "注册成功" << endl;


三、服务端流程

服务端通过 server.cpp + libevent + 回调类 完成 JSON 消息处理和数据库操作。

1. 监听套接字 Lis_Socket

  • 创建、绑定、监听套接字:
复制代码

socket()

bind()

listen()

  • 为客户端连接提供"入口"

2. 事件管理 LibEvent

  • 初始化事件系统:Init()

  • 注册文件描述符和回调:Lib_Add(fd, callback)

  • 启动事件循环:Dispatch()

3. 回调类体系

类名 功能描述
CallBack 抽象回调基类,定义接口 CallBack_Fun()
Accept_CallBack 监听套接字事件,新客户端接入,注册连接套接字
Recv_CallBack 连接套接字事件,处理 JSON 数据收发与业务逻辑

4. JSON 解析与业务处理

  • 使用 jsoncpp
复制代码

Json::Value val;

Json::Reader reader;

reader.parse(buff, val);

  • 消息类型判断:
复制代码

if(val["type"]=="ZC") Zc_User();

else if(val["type"]=="DL") Dl_User();

...

  • 注册用户存数据库:
复制代码

string sql = "insert into user_info values('"+tel+"','"+name+"','"+passwd+"','1')";

mysqlcli.Query_sql(sql);

Send_ok();

  • 登录验证数据库:
复制代码

string sql = "SELECT * FROM user_info WHERE tel_id='"+tel+"' AND passwd='"+passwd+"'";

mysqlClient.Query_sql(sql);


四、客户端 → 服务器 → 数据库 → 客户端 流程图(文字版)

  1. 客户端输入手机号、用户名、密码

  2. 客户端组装 JSON 请求发送服务器

  3. 服务器触发 Recv_CallBack

    • 接收 JSON

    • 解析 type

    • 调用 Zc_User()Dl_User()

  4. 操作数据库:

    • 注册:插入 user_info

    • 登录:查询 user_info

  5. 返回 JSON 状态 { "status": "OK"/"ERROR" }

  6. 客户端解析返回 JSON 并显示结果


五、本节课核心知识点

  1. 数据库接入

    • 数据存储从内存升级到 MySQL

    • 注册和登录操作持久化

  2. JSON 协议通信

    • 客户端按协议发送 JSON

    • 服务器解析 JSON 并返回 JSON

  3. 事件驱动 + 面向对象设计

    • Lis_Socket 封装套接字

    • LibEvent 负责事件调度

    • 回调类处理具体业务

  4. 协议设计意识

    • type 字段区分业务类型(注册/登录/预约)

    • 按协议收发数据,方便扩展

一、创建用户信息表 user_info

1. 执行建表 SQL

复制代码
CREATE TABLE user_info(
    tel_id CHAR(11) PRIMARY KEY NOT NULL UNIQUE,
    name VARCHAR(20),
    passwd VARCHAR(16),
    status TINYINT
);

2. 字段说明

字段名 类型 约束与含义
tel_id CHAR(11) 主键、非空、唯一 → 手机号(用户 ID)
name VARCHAR(20) 用户名
passwd VARCHAR(16) 密码
status TINYINT 状态标记(如 0 = 禁用 / 1 = 启用)

3. 执行结果

复制代码
Query OK, 0 rows affected (0.01 sec)

✅ 表创建成功,当前无数据。

做一个测试

相关推荐
探索宇宙真理.2 小时前
Grafana SQL表达式漏洞 | CVE-2026-27876概念复现&研究
数据库·sql·grafana
Roc-xb2 小时前
Windows MySQL 密码忘记了如何重置密码?
windows·mysql
七七powerful2 小时前
MySQL 8.0 性能优化利器:Percona Toolkit 实战指南
数据库·mysql·性能优化
渣渣盟5 小时前
Flink Table API与SQL流数据处理实战
大数据·sql·flink·scala
成为大佬先秃头11 小时前
数据库连接池:Druid
数据库·mysql·druid
晓华-warm14 小时前
Warm-Flow 1.8.5 正式发布:超时自动审批、暂存功能来了!
数据库
u01368638215 小时前
将Python Web应用部署到服务器(Docker + Nginx)
jvm·数据库·python
light blue bird15 小时前
多页签Razor组支轴业务整顿组件
数据库·.net·ai大数据·多功能图表报表·web mvc + razor
wregjru15 小时前
【mysql】2.数据表操作
数据库·mysql