博主对接管理系统

目录

1、需求分析

1.1 功能需求

1.1.1 资源库管理

1.1.2 项目管理

1.1.3 平台网站管理

1.2 用户需求

2、数据库设计

2.1 管理员和使用者

​编辑

2.2 资源库管理

​编辑

2.3 项目管理

2.4 常用平台链接直达

 3、ER图

4、GUI界面

4.1资源库管理

4.1.1信息查询

4.1.2信息录入

4.1.3信息修改

4.2项目管理

4.2.1项目一览

 4.1.2单项目管理

 4.3平台网站

4.3.1网站点击直连

4.3.2网站账号信息查询

5.1数据爬取

5.1.1赞藏评抓取

5.1.2蒲公英邀约

5.1.3作品下载

5、代码实现

5.1 单例类基类 

5.2 SQLMgr类


1、需求分析

        在博主媒介工作的日常中,经常要面对多软件,多平台跳转的繁杂事宜,这种繁杂大幅降低了媒介日常工作的效率。为此,设计一套对接管理系统来实现集中式办公显得尤为必要。
此套系统主要有以下几个功能:资源库管理、项目管理、平台网站

1.1 功能需求

1.1.1 资源库管理

  • 博主数据管理:系统需要一个资源库来管理所有博主的详细信息,包括博主的基本资料、社交媒体账号、粉丝量、价格信息等。
  • 数据安全:不同角色的用户需要不同的权限,管理员能够完全管理数据,而普通用户只能查看和部分修改数据。

1.1.2 项目管理

  • 项目创建和管理:系统应支持创建和管理多个项目,每个项目包含特定的博主名单和详细的执行情况。
  • 项目附件管理:支持为每个项目上传和管理附件文件。
  • 项目博主数据管理:每个项目需要维护一个独立的博主数据表,记录具体的合作细节和执行结果。

1.1.3 平台网站管理

  • 平台链接管理:提供常用平台的快捷链接,便于媒介人员快速访问。
  • 平台账号管理:存储和管理各个平台的登录账号信息,方便快速切换和登录。

1.2 用户需求

  • 管理员:具备系统管理权限,包括用户管理、数据修改和删除权限。
  • 普通用户:只能查看和部分编辑数据,无法删除重要信息,确保数据安全。

2、数据库设计

2.1 管理员和使用者

我们需要将管理员和使用者做一些区分,避免使用者有意或无意的删除数据操作,因此需要建两张表

使用者表user:
使用者ID——userID INT 主键 NOT NULL 自增
使用者账号——userAccount VARCHAR(20) NOT NULL
使用者密码——userPassword VARCHAR(20) NOT NULL

使用者级别——userLevel VARCHAR(20) NOT NULL

2.2 资源库管理

博主数据表bloggersData:
昵称——name VARCHAR(50) NOT NULL
账号id——id VARCHAR(50) NOT NULL 主键
类型——type VARCHAR(10) NOT NULL
主页链接——link VARCHAR(255) NOT NULL
粉丝量——fans INT NOT NULL
赞藏数——likes INT NOT NULL
图文价格——noteprice INT NOT NULL
视频价格——vedioprice INT NOT NULL
微信号——wechat VARCHAR(50) NOT NULL
备注——remark VARCHAR(255)可为空

2.3 项目管理

项目表project:
项目名编号——projectID INT NOT NULL主键,递增
项目名——project_name VARCHAR(50) NOT NULL 【月份】+项目名
备注信息——add_info VARCHAR(255) 可为空

管理人员——manage_id VARCHAR(255) NOT NULL

 

项目附件projectAttach:
附件编号——attachID INT NOT NULL 主键, 递增
附件名称——attachName VARCHAR NOT NULL
附件地址——attachAddress VARCHAR(255)NOT NULL

 

 在单个项目中,我们需要建立项目对应的博主名单数据表(projectTable+id):(可直接修改)
(从bloggersList导入)

项目数据表(projectTable+id):
账号id——id VARCHAR(50) NOT NULL 主键
返款——repayment INT
备注——VARCHAR(255)
发布链接——VARCHAR(255)
点赞——INT
收藏——INT
评论——INT
(自定义列)(待定)

 

2.4 常用平台链接直达

平台表platform:
序号:platformID——INT 主键 自增
平台昵称:platformName——VARCHAR(255)NOT NULL
平台链接:platformLink——VARCHAR(255) NOT NULL

 

在各个平台中,媒介一般会有很多账号,要存储这些账号的信息,需要建表 

平台信息表platformInfo+ID:
序号:
platformAccountID——INT  主键
平台账号:platformAccount——VARCHAR(255)NOT NULL
平台密码:platformPassword——VARCHAR(255) NOT NULL
备注信息:platformMrak——VARCHAR(255)

 

因为每个用户的平台账号不同,需建立表platform_account

 3、ER图

4、GUI界面

4.1资源库管理

4.1.1信息查询

4.1.2信息录入

4.1.3信息修改

4.2项目管理

4.2.1项目一览

 4.1.2单项目管理

 4.3平台网站

4.3.1网站点击直连

4.3.2网站账号信息查询

5.1数据爬取

5.1.1赞藏评抓取

5.1.2蒲公英邀约

5.1.3作品下载

5、代码实现

5.1 单例类基类 

#ifndef SINGLETON_H
#define SINGLETON_H
#include <global.h>

/**
 * @brief The Singleton class
 * 单例类作为基类去使用
 * 利用的是 C++ 的 CRTP 奇异递归模板
 */
template <typename T>
class Singleton {

protected:
    /**
     * @brief Singleton构造函数
     * @note 设置成protected是为了子类继承的时候可以构造Singleton
     */
    Singleton() = default;

    /**
     * @brief 单例模式中删除拷贝构造
     */
    Singleton(const Singleton<T>&) = delete;

    /**
     * @brief 单例模式中删除赋值拷贝构造
     */
    Singleton& operator=(const Singleton<T>& st) = delete;

    /**
     * @brief _instance 智能指针来管理实例
     * @note
     * 使用智能指针来管理就不需要拷贝构造了
     */
    static std::shared_ptr<T> _instance;

public:
    /**
     * @brief 得到单例模式类的实例
     * @return std::shared_ptr<T>
     * @details
     * 利用 once_flag 和 call_once 这个组合
     * 当第一次调用函数的时候 once_flag 就会被初始化内部标记为 false
     * 当调用了call_once, once_flag 内部标记就会变成 true
     * 再次调用函数, call_once 发现 s_flag 内部标记为 true, 则不调用函数
     * 确保函数只被调用一次
     */
    static std::shared_ptr<T> getInstance() {
        static std::once_flag s_flag;
        std::call_once(s_flag, [&](){
            _instance = std::shared_ptr<T>(new T);
        });

        return _instance;
    }

    /**
     * @brief 打印 _instance 的地址
     */
    void printAddress() {
        std::cout << _instance.get() << std::endl;
    }

    ~Singleton() {
        std::cout << "this is singleton destruct" << std::endl;
    }
};

//_instance 初始化为 nullptr
//在 getInstance 方法中, 当第一次调用时, 如果 _instance 是 nullptr
//那么它将被初始化为一个新的 T 类型对象的 shared_ptr。
template <typename T>
std::shared_ptr<T> Singleton<T>::_instance = nullptr;

#endif // SINGLETON_H

5.2 SQLMgr类

///sqlmgr.h
#ifndef SQLMGR_H
#define SQLMGR_H
#include "singleton.h"
#include "global.h"
#include <QObject>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QSqlQueryModel>

class SQLMgr : public QObject, public Singleton<SQLMgr>
{
    Q_OBJECT
public:
    ~SQLMgr();

    /**
     * @brief queryBloggersInfo
     * 查询博主信息,并以 QSqlQueryModel 方式返回
     * @return QSqlQueryModel
     */
    QSqlQueryModel* queryBloggersInfo();


private:
    /**
     * 为了能让基类 Singleton<SQLMgr> 访问构造函数
     * 声明基类为这个类的友元
     */
    friend class Singleton<SQLMgr>;
    SQLMgr();
    /**
     * @brief connectToDB
     * 连接数据库函数
     * @return SQLConnState
     * 枚举值
     * SQL_CONN_SUCCESS
     * SQL_CONN_FAILURE
     */
    SQLConnState connectToDB();

    /**
     * @brief disconnectFromDB
     * 断开数据库连接
     * @return SQLConnState
     * 枚举值
     * SQL_CONN_SUCCESS
     * SQL_CONN_FAILURE
     */
    SQLDisconnState disconnectFromDB();

private:
    /**
     * @brief 数据库连接对象
     */
    QSqlDatabase _db;
};

#endif // SQLMGR_H

///sqlmgr.cpp

#include "sqlmgr.h"

SQLMgr::~SQLMgr() {
    disconnectFromDB();
}

SQLMgr::SQLMgr() {
    connectToDB();
}

SQLConnState SQLMgr::connectToDB() {
    SQLConnState res = SQL_CONN_SUCCESS;
    _db = QSqlDatabase::addDatabase("QMYSQL");
    _db.setHostName("*");
    _db.setPort(3306);
    _db.setDatabaseName("bloggersprojectmanagement");
    _db.setUserName("root");
    _db.setPassword("******");

    bool ok = _db.open();
    if(ok) {
        qDebug() << "SQL_CONN_SUCCESS";
    } else {
        qDebug() << "SQL_CONN_FAILURE: " << _db.lastError();
        res = SQL_CONN_FAILURE;
    }

    return res;
}

SQLDisconnState SQLMgr::disconnectFromDB() {
    SQLDisconnState res = SQL_DISCONN_SUCCESS;

    if (_db.isOpen()) {
        _db.close();
        if (_db.isOpen()) {
            // 如果数据库仍然打开,表示断开连接失败
            qDebug() << "SQL_DISCONN_FAILURE";
            res = SQL_DISCONN_FAILURE;
        } else {
            qDebug() << "SQL_DISCONN_SUCCESS";
            res = SQL_DISCONN_SUCCESS;
        }
    } else {
        // 数据库本来就没有打开,也算成功
        qDebug() << "SQL_DISCONN_SUCCESS";
        res = SQL_DISCONN_SUCCESS;
    }

    return res;
}

QSqlQueryModel* SQLMgr::queryBloggersInfo() {
    QSqlQueryModel *model = new QSqlQueryModel();
    model->setQuery("SELECT * FROM bloggers_info");

    // 检查是否查询成功
    if (model->lastError().isValid()) {
        qDebug() << "Failed to execute query:" << model->lastError().text();
        delete model;
        return nullptr;
    }

    return model;
}

  • 16
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值