# 使用说明
> 以下内容如未作特殊说明,均为第三版(网络版)的操作说明,对于第三版尚不支持的功能,会在说明中标注。
## 初始配置
C++学习论坛(高级版)的用户数据和帖子数据分别储存在`userdata`和`postdata`文件中,且已在压缩包中给出,需放在程序根目录使用。程序第一次运行且没有发现数据文件时会视为建立全新的论坛系统,程序会默认给定管理员账号和密码,用户可以通过管理员账户登陆后添加用户、添加版块完成论坛的初始化。也可以使用给定的数据覆盖程序自动生成的原文件实现数据的恢复。
C++学习论坛(网络版)分为`服务端`和`客户端`两部分,其中`客户端`无需配置,可以直接双击运行,并支持多用户登陆;`服务端`需要在根目录放入存有用户数据和帖子数据的`userdata`和`postdata`,正确保存后即可双击运行启动。
需要注意的是,网络版系统暂时不支持管理员功能,因此初始化的空论坛无法直接使用(无法管理用户、版块),请先导入两个数据文件后再进行使用。
## 功能说明
### 客户端功能
#### 登陆界面
![login](https://s2.ax1x.com/2020/03/06/3L0ort.jpg)
* 用户通过输入管理员分配的账号即可登陆系统,系统会根据用户的名字自动识别用户的身份,进入到不同的主界面模式。系统初始给定了如下几个用户:
| 身份|用户名|密码|
|:--:|:----:|:---:|
|管理员|admin|123|
|管理员|admin2|1234|
|普通用户|aaa|aaa|
|普通用户|sss|sss|
|普通用户|ddd|ddd|
|匿名用户|anonym|123|
* 在登陆界面的右上角,可以设置自定义服务器。程序默认连接`localhost`本地服务器。
#### 系统主界面
![mianwindow](https://s2.ax1x.com/2020/03/06/3L0IKI.jpg)
* 点击用户头像以查看个人信息(仅第二版支持)
* 点击刷新按钮以更新版块和帖子列表的显示
* 点击 `logout` 按钮注销当前用户
* 点击 `UserManager` 进入管理模式(仅限管理员用户,仅第二版支持)
* 点击 `new Post` 发表帖子(仅限普通用户)
* 点击板块列表选择版块,点击帖子列表显示帖子内容
#### 管理界面(仅第二版支持)
![manager](https://s2.ax1x.com/2020/03/06/3L0TqP.jpg)
管理界面仅限管理员操作,分为三个页面
* `Add User` 页面下新增用户,可以指定用户的身份
* `Set BM` 页面下任命版主,系统规定每个版块最多只有一名版主,同一用户可以担任不同版块版主
* `Add Board` 页面下新增板块
#### 其他功能(仅第二版支持)
* 普通用户可在查看帖子页面下进行评论
* 普通用户可以在查看帖子页面下删除自己发布的、无评论的帖子
* 版主可以在查看帖子页面下删除自己管理版块内的帖子
## 服务端功能
![server](https://s2.ax1x.com/2020/03/06/3L0f8H.jpg)
* 服务器端运行后自动从本地载入数据,无需手动操作。log窗口显示实时请求处理。点击右上角关闭按钮自动保存文件
# 程序结构
![prog](https://s2.ax1x.com/2020/03/06/3L0h2d.png)
*(注:仅代表逻辑组织方式,并非与实际调用关系一一对应)*
在第二版程序中有一个`controller`类负责存储数据、处理用户操作。在第三版中,`controller`被拆分为一个`ClientCtrl`类和一个`ServerCtrl`类,分别用来处理客户端和服务端的数据和操作。
## 客户端
客户端有几种基本的类代表论坛系统中的对象,分别为`post`、`board`、`comment`、`user`,还有Qt designer界面类`LoginWindow`、`MainWindow`、`PostPage`、`ViewPage`、`NetConfigPage`。
`ClientCtrl`是一个单例,仅在程序启动时构造一个实体,用来存储系统内的临时信息、处理用户的操作以及与服务端进行网络通信。
## 服务端
服务端没有复杂的用户操作,因此不需要各种界面类,`ServerWindow`既负责显示服务器运行信息,又承担了与客户端数据通信的任务。`ServerCtrl`是服务端存储数据、处理数据的对象,仅在启动时构造一次。
# 设计说明
## 设计思路
在客户端和服务端,除了给定的用户类、帖子类等类型,我还希望有一个类来专门存储数据、处理数据,而不是用界面类去实现用户操作的功能。因此我在两边都设定了controller类。
为了保证每个运行的程序中的数据都是唯一的,就必须要求程序中的controller对象唯一,因此我定义了静态函数`getInstance()`来返回自己的指针,保证每次调用时都能找啊唯一的对象。
```cpp
clientCtrl* clientCtrl::getInstance()
{
if(ctrlPtr == nullptr)
ctrlPtr = new clientCtrl;
return ctrlPtr;
}
```
有了controller后,就可以在界面获取到用户操作后,调用controller中设计的函数,再用controller处理内存中的数据,以此做到界面与程序功能的独立性。
网络通信方面,为了更好的支持多用户操作,采用了短连接的方式,即每次客户端发出请求都要先与服务器建立连接再发送消息,得到服务器的正确响应后立即释放连接。
这样做的好处是节约了资源,方便多用户的实现,但缺陷在于无法收到服务端的更新消息,只能在客户端手动刷新显示。但考虑到论坛系统并不像实时通信系统一样对实时性有严格的需求,结合实际情况我选择了短连接方式。
## 数据结构与接口
帖子
```cpp
//post.h:
class post
{
public:
post(unsigned int nId, unsigned int nUserId,
unsigned int nBoardId, QString nTitle, QString nContent);
void setTitle(QString t);
QString getTitle();
void setContent(QString c);
QString getContent();
QDateTime getTime();
unsigned int getId();
unsigned int getUserId();
unsigned int getBoardId();
void setTime(QString t);
QVector<comment*> commentList; //评论列表
friend QTextStream &operator << (QTextStream &stream, post &p);
friend QTextStream &operator >> (QTextStream &stream, post* &p);
private:
unsigned int id; //帖子id
unsigned int userId; //发帖用户id
unsigned int boardId; //所属版块id
QString title; //帖子标题
QString content; //帖子内容
QDateTime time; //发帖时间
};
```
版块
```cpp
//board.h:
class board
{
public:
board(unsigned int bid, QString n);
QString getName();
unsigned int getId();
int getModeratorId();
void setModerator(int uid);
friend QTextStream &operator << (QTextStream &stream, board &b);
friend QTextStream &operator >> (QTextStream &stream, board* &b);
private:
unsigned int id; //版块id
QString name; //板块名
int moderatorId; //版主id,无版主 = -1
};
```
评论
```cpp
//comment.h:
class comment
{
public:
comment(unsigned int nUserId, QString nContent);
unsigned int getUserId();
QString getContent();
QDateTime getTime();
void setTime(QString s);
private:
unsigned int userId; //评论用户id
QString content; //评论内容
QDateTime time; //评论时间
};
```
用户
```cpp
//user.h:
class user
{
public:
user();
QString getName();
QString getPswd();
QString profile();
unsigned int getId();
int getStatus();
int login(QString nm, QString pw); //登陆
void logout(); //注销
virtual int deletePost(unsigned int bid,
unsigned int pid) = 0; //删帖
unsigned int getBoards();
void setBoards(unsigned int bds);
unsigned int boards;
妄北y
- 粉丝: 2w+
- 资源: 1万+
最新资源
- CarSim与Simulink联合仿真,实时检测,动态规划路径,实现超车道,基于mpc,模型预测控制实现,距离效果见视频 提供carsim参数配置文件,导入即可运行 提供simulink模型文件 提供
- 三菱FX5U 三菱Q系列程序 三菱FX5U程序,双FX5U80MT主从站控制,普洛菲斯触摸屏程序,搭配三菱伺服,松下变频器控制运动控制数轴运动控制 FX5-485ADP模块通信应用控制,以太网
- 研究考虑CSP电站和ORC的综合能源系统优化规划 程序包含新能源消纳、光热电站、ORC有机郎肯循环、热电联产、燃气锅炉、P2G等综合元素,实现系统总运行成本最小 包括购电、购气成本、弃风光成本、设备运
- 自动驾驶产业链调研之主机厂、软件方案商、硬件方案商 , 超详细的自动驾驶产业链调研,该文件主要整理车企、Tier1主机厂、自动驾驶软件方案商、自动驾驶硬件方案商,在以下维度进行的调研整理,包括
- MATLAB代码:基于储能电站服务的冷热电多微网系统双层优化配置 电网技术文章,《基于储能电站服务的冷热电多微网系统双层优化配置》复现 仿真平台:MATLAB,需要用到cplex求解器
- 基于STM32F103C8Tx的智能温湿度监控助手:打造高效智能家居解决方案
- 约束最优化求解-拉格朗日函数Hesse阵的SQP二次规划方法求解约束最优化问题-梯度法求解无约束最优化问题 源于读研时最优化课程的大作业,具体内容请看图片 提供MATLAB源代码、大作业文档、程序
- 电源艾默生充电桩15kw模块,软件源码加原理图BOM艾默生充电桩15kw模块原版软件源码含核心算法,PFC+DCDC双dsp数字控制,原理图,BOM和PCB(但为PDF版),通信协议文档,带上位机调试
- MATLAB路径规划RRT RRT*算法 RRT 的基本步骤是: 1. 起点作为一颗种子,从它开始生长枝丫; 2. 在机器人的“构型”空间中,生成一个随机点 ; 3. 在树上找到距
- 基于生成对抗网络的可再生能源场景生成方法 风功率场景生成,光伏功率场景生成 可用于随机优化,数据扩充等后续研究 可以实现: 1.深度卷积生成对抗网络(DCGAN) 2.最小二乘生成对抗网络(LSGAN
- 涂布机PLC源代码(三菱PLC+威纶通触摸屏) 触摸屏:MT8102iE PLC:Q03UDE 相关模块:QX41,QY41P,Q68ADV,Q68DAVN,Q68ADV,QJ61BT11 程序:梯形
- RS422-MIL1553B 协议转 支持BC RT BM 1553B逻辑可以原位替BU61580协议芯片 配置寄存器和BU61580一样 存储器范围和BU61580一样4K*16bit 可外接扩展
- Java毕业设计项目:基于Springboot+mysql+maven实现的台球管理系统完整源码分享给需要的同学
- 基于FPGA的Cortex-M3软核基本SOC设计 实现基于FPGA的Cortex-M3软核基本SOC,系统外设包括GPIO和UART串口 开发基于vivado2019.2和vitis,理论上可适用
- Java毕设项目:基于spring+mybatis+maven+mysql实现的高校师生外出请假管理系统【含源码+数据库+任务书+开题报告+毕业论文】
- MATLAB代码:基于两阶段鲁棒优化算法的微网经济调度 关键词:经济调度 微网 两阶段鲁棒规划 仿真平台:MATLAB YALMIP+CPLEX 主要内容:代码主要做的是一个微网中电源容量优化配置
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈