服务器预约系统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)

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

做一个测试

相关推荐
派小汤6 小时前
Harmony2.2.0通过RdbStore实现通用类操作本地SQLite数据库
数据库·sql·sqlite·鸿蒙·鸿蒙系统
程序员-Benothing7 小时前
MySQL 中的事务隔离级别有哪些?默认的事务隔离级别是什么?为什么选择这个级别?
数据库·mysql
lv__pf7 小时前
【TL mysql 3】
数据库
xiaomici8 小时前
Datasphere的数据merge
数据库
小林ixn9 小时前
从零设计一个博客系统的数据库:表结构、索引与约束的实战思考
数据库·后端·mysql
Yang96119 小时前
一台顶三台:鼎讯DLJ-1在不同故障类型中的模式切换数据复盘
服务器·网络·数据库
潘正翔9 小时前
Memcached构建缓存服务器
运维·服务器·数据库·缓存·云原生·memcached
NineData9 小时前
NineData 与平凯数据库(TiDB 企业版)完成产品兼容性互认证
数据库·tidb·ninedata·玖章算术·平凯数据库·产品兼容性认证·tidb企业版
咖啡星人k9 小时前
2026 Text-to-SQL:一句话让 AI 写 SQL,自然语言直接查数据库(MonkeyCode 云端实战)
数据库·机器学习·语言模型·自然语言处理
GreatSQL社区9 小时前
少敲一个字母,GreatSQL 对所有查询“已读不回”
数据库·mysql·greatsql