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

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

做一个测试

相关推荐
JSON_L10 小时前
Fastadmin中实现敏感词管理
数据库·php·fastadmin
不是起点的终点11 小时前
【实战】Python 一键生成数据库说明文档(对接阿里云百炼 AI,输出 Word 格式)
数据库·python·阿里云
2301_8135995513 小时前
Go语言怎么做秒杀系统_Go语言秒杀系统实战教程【实用】
jvm·数据库·python
NCIN EXPE17 小时前
redis 使用
数据库·redis·缓存
MongoDB 数据平台17 小时前
为编码代理引入 MongoDB 代理技能和插件
数据库·mongodb
极客on之路17 小时前
mysql explain type 各个字段解释
数据库·mysql
代码雕刻家17 小时前
MySQL与SQL Server的基本指令
数据库·mysql·sqlserver
lThE ANDE17 小时前
开启mysql的binlog日志
数据库·mysql
yejqvow1218 小时前
CSS如何控制placeholder文字的颜色_使用--placeholder伪元素
jvm·数据库·python
oLLI PILO18 小时前
nacos2.3.0 接入pgsql或其他数据库
数据库