add button functionality

This commit is contained in:
xyz
2025-07-30 11:38:07 +08:00
parent 01c4baf04d
commit 83f3f4f74e
10 changed files with 623 additions and 26 deletions

View File

@ -1,11 +1,8 @@
#include "selfinfowidget.h" #include "selfinfowidget.h"
#include <QCursor>
#include <QGridLayout>
#include "model/datacenter.h" #include "model/datacenter.h"
using namespace model;
SelfInfoWidget::SelfInfoWidget(QWidget *parent) SelfInfoWidget::SelfInfoWidget(QWidget *parent)
: QDialog(parent) : QDialog(parent)
@ -20,7 +17,7 @@ SelfInfoWidget::SelfInfoWidget(QWidget *parent)
this->move(QCursor::pos()); this->move(QCursor::pos());
//创建布局管理器 //创建布局管理器
QGridLayout* layout = new QGridLayout(); layout = new QGridLayout();
//layout->setSpacing(0); //layout->setSpacing(0);
layout->setHorizontalSpacing(10); layout->setHorizontalSpacing(10);
layout->setVerticalSpacing(3); layout->setVerticalSpacing(3);
@ -32,14 +29,12 @@ SelfInfoWidget::SelfInfoWidget(QWidget *parent)
avatarBtn = new QPushButton(); avatarBtn = new QPushButton();
avatarBtn->setFixedSize(75, 75); avatarBtn->setFixedSize(75, 75);
avatarBtn->setIconSize(QSize(75, 75)); avatarBtn->setIconSize(QSize(75, 75));
//avatarBtn->setIcon(QIcon(":/resource/image/defaultAvatar.png"));
avatarBtn->setIcon(QIcon(":/resource/image/defaultAvatar.png"));
avatarBtn->setStyleSheet("QPushButton { border: none; background-color: transparent; }"); avatarBtn->setStyleSheet("QPushButton { border: none; background-color: transparent; }");
QString labelStyle = "QLabel { font-size: 14px; font-weight: 800; }"; QString labelStyle = "QLabel { font-size: 14px; font-weight: 800; }";
QString btnStyle = "QPushButton {border: none; background-color: transparent; }"; QString btnStyle = "QPushButton {border: none; background-color: transparent; }";
btnStyle += "QPushButton:pressed { background-color: rgb(210, 210, 210); }"; btnStyle += "QPushButton:pressed { background-color: rgb(210, 210, 210); }";
QString editStyle = "QLineEdit { border: none; background-color: rgb(255 ,255, 255); border-radius: 5px; padding-left: 2px; }"; QString editStyle = "QLineEdit { border: none; background-color: rgb(250 ,250, 250); color: rgb(0, 0, 0); border-radius: 5px; padding-left: 2px; }";
int height = 30; int height = 30;
@ -118,12 +113,13 @@ SelfInfoWidget::SelfInfoWidget(QWidget *parent)
phoneTag = new QLabel(); phoneTag = new QLabel();
phoneTag->setFixedSize(50, height); phoneTag->setFixedSize(50, height);
phoneTag->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); phoneTag->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
phoneTag->setText("电话"); phoneTag->setText("邮箱");
phoneTag->setStyleSheet(labelStyle); phoneTag->setStyleSheet(labelStyle);
phoneLabel = new QLabel(); phoneLabel = new QLabel();
phoneLabel->setFixedHeight(height); phoneLabel->setFixedHeight(height);
phoneLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); phoneLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
//phoneLabel->setStyleSheet("QLabel {background-color: rgb(255, 255, 255); }");
phoneModifyBtn = new QPushButton(); phoneModifyBtn = new QPushButton();
phoneModifyBtn->setFixedSize(70, 25); phoneModifyBtn->setFixedSize(70, 25);
@ -134,7 +130,8 @@ SelfInfoWidget::SelfInfoWidget(QWidget *parent)
phoneEdit = new QLineEdit(); phoneEdit = new QLineEdit();
phoneEdit->setFixedHeight(height); phoneEdit->setFixedHeight(height);
phoneEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); phoneEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
phoneEdit->setStyleSheet(btnStyle); phoneEdit->setStyleSheet(editStyle);
//phoneEdit->setStyleSheet("QLineEdit {background-color: rgb(245, 245, 245); }");
phoneEdit->hide(); phoneEdit->hide();
phoneSubmitBtn = new QPushButton(); phoneSubmitBtn = new QPushButton();
@ -196,8 +193,34 @@ SelfInfoWidget::SelfInfoWidget(QWidget *parent)
nameLabel->setText("xyz"); nameLabel->setText("xyz");
descLabel->setText("It didn't matter that i lived another day."); descLabel->setText("It didn't matter that i lived another day.");
phoneLabel->setText("12345678900"); phoneLabel->setText("12345678900");
//此处只做测试,不要让界面显示默认头像
avatarBtn->setIcon(QIcon(":/resource/image/defaultAvatar.png"));
#endif #endif
initSingnalSlots();
//加载数据到界面上
DataCenter* dataCenter = DataCenter::getInstance();
UserInfo* myself = dataCenter->getMyselfsync();
if (myself != nullptr) {
//把个人信息加载到界面上
avatarBtn->setIcon(myself->avatar);
idLabel->setText(myself->userId);
nameLabel->setText(myself->nickname);
descLabel->setText(myself->description);
phoneLabel->setText(myself->phone);
}
/*connect(nameSubmitBtn, &QPushButton::clicked, this, &SelfInfoWidget::clickNameSubmitBtn);
connect(descSubmitBtn, &QPushButton::clicked, this, &SelfInfoWidget::clickDescSubmitBtn);
connect(getVerifyCodeBtn, &QPushButton::clicked, this, &SelfInfoWidget::clickGetVerifyCodeBtn);
connect(phoneSubmitBtn, &QPushButton::clicked, this, &SelfInfoWidget::clickPhoneSubmitBtn);
connect(avatarBtn, &QPushButton::clicked, this, &SelfInfoWidget::clickAvatarBtn);*/
}
void SelfInfoWidget::initSingnalSlots()
{
//添加连接的槽函数 //添加连接的槽函数
connect(nameModifyBtn, &QPushButton::clicked, this, [=]() { connect(nameModifyBtn, &QPushButton::clicked, this, [=]() {
//把当前的nameLabel和nameModifyBtn隐藏起来 //把当前的nameLabel和nameModifyBtn隐藏起来
@ -249,10 +272,209 @@ SelfInfoWidget::SelfInfoWidget(QWidget *parent)
phoneEdit->setText(phoneLabel->text()); phoneEdit->setText(phoneLabel->text());
}); });
/*connect(nameSubmitBtn, &QPushButton::clicked, this, &SelfInfoWidget::clickNameSubmitBtn); connect(nameSubmitBtn, &QPushButton::clicked, this, &SelfInfoWidget::clickNameSubmitBtn);
connect(descSubmitBtn, &QPushButton::clicked, this, &SelfInfoWidget::clickDescSubmitBtn); connect(descSubmitBtn, &QPushButton::clicked, this, &SelfInfoWidget::clickDescSubmitBtn);
connect(getVerifyCodeBtn, &QPushButton::clicked, this, &SelfInfoWidget::clickGetVerifyCodeBtn); connect(getVerifyCodeBtn, &QPushButton::clicked, this, &SelfInfoWidget::clickGetVerifyCodeBtn);
connect(phoneSubmitBtn, &QPushButton::clicked, this, &SelfInfoWidget::clickPhoneSubmitBtn); connect(phoneSubmitBtn, &QPushButton::clicked, this, &SelfInfoWidget::clickPhoneSubmitBtn);
connect(avatarBtn, &QPushButton::clicked, this, &SelfInfoWidget::clickAvatarBtn);*/ connect(avatarBtn, &QPushButton::clicked, this, &SelfInfoWidget::clickAvatarBtn);
}
void SelfInfoWidget::clickNameSubmitBtn()
{
//从输入框中拿到修改后的呢称
const QString& nickName = nameEdit->text();
if (nickName.isEmpty()) {
return;
}
//发送网络请求
DataCenter* dataCenter = DataCenter::getInstance();
connect(dataCenter, &DataCenter::changeNicknameDone, this, &SelfInfoWidget::clickNameSubmitBtnDone, Qt::UniqueConnection);
dataCenter->changeNicknameAsync(nickName);
}
void SelfInfoWidget::clickNameSubmitBtnDone()
{
//对界面控件进行切换, 把输入框切换为label 把提交按钮切换为编辑按钮
//同时要把输入框的内容设置为修改后的呢称
layout->removeWidget(nameEdit);
nameEdit->hide();
layout->addWidget(nameLabel, 1, 2);
nameLabel->show();
nameLabel->setText(nameEdit->text());
layout->removeWidget(nameSubmitBtn);
nameSubmitBtn->hide();
layout->addWidget(nameModifyBtn, 1, 3);
nameModifyBtn->show();
}
void SelfInfoWidget::clickDescSubmitBtn()
{
//从输入框拿到输入的签名内容
const QString& desc = descEdit->text();
if (desc.isEmpty()) {
return;
}
//发送网络请求
DataCenter* dataCenter = DataCenter::getInstance();
connect(dataCenter, &DataCenter::changeDescriptionDone, this, &SelfInfoWidget::clickDescSubmitBtnDone, Qt::UniqueConnection);
dataCenter->changeDescriptionAsync(desc);
}
void SelfInfoWidget::clickDescSubmitBtnDone()
{
//切换界面
//把label替换为输入框把提交按钮替换为编辑按钮
layout->removeWidget(descEdit);
descEdit->hide();
layout->addWidget(descLabel, 2, 2);
descLabel->show();
descLabel->setText(descEdit->text());
layout->removeWidget(descSubmitBtn);
descSubmitBtn->hide();
layout->addWidget(descModifyBtn, 2, 3);
descModifyBtn->show();
}
void SelfInfoWidget::clickGetVerifyCodeBtn()
{
//获取到输入框的邮箱号
const QString& email = phoneEdit->text();
if (email.isEmpty()) {
QTimer* timer = new QTimer(this);
int* leftTime = new int(2);
phoneEdit->setPlaceholderText("请输入邮箱");
phoneEdit->setStyleSheet("QLineEdit { border: 1px solid red; background-color: rgb(255, 220, 220); color: rgb(0, 0, 0); border-radius: 5px; padding-left: 2px; }");
connect(timer, &QTimer::timeout, this, [=]() {
if (*leftTime <= 0) {
phoneEdit->setPlaceholderText("");
phoneEdit->setStyleSheet("QLineEdit { border: none; background-color: rgb(250 ,250, 250); color: rgb(0, 0, 0); border-radius: 5px; padding-left: 2px; }");
timer->stop();
timer->deleteLater();
delete timer;
delete leftTime;
return;
}
(*leftTime)--;
});
timer->start(1000); // 1秒后清除提示
return;
}
//给服务器发送请求
DataCenter* dataCenter = DataCenter::getInstance();
connect(dataCenter, &DataCenter::getVerifyCodeDone, this, [=]() {
//不需要做其他的处理,只需要提示一下,验证码已经发送出去了
Toast::showMessage("验证码已发送,请注意查收");
});
dataCenter->getVerifyCodeAsync(email);
//把刚才发送请求的邮箱号码保存起来
this->emailToChange = email;
//禁用发送验证码的按钮,给出倒计时
this->getVerifyCodeBtn->setEnabled(false);
leftTime = 30; // 倒计时30秒
QTimer* timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, [=]() {
if (leftTime <= 0) {
//倒计时结束
getVerifyCodeBtn->setEnabled(true);
getVerifyCodeBtn->setText("获取验证码");
timer->stop();
timer->deleteLater();
return;
}
(leftTime)--;
getVerifyCodeBtn->setText(QString::number(leftTime) + "s");
});
timer->start(1000); // 每秒更新一次
}
void SelfInfoWidget::clickPhoneSubmitBtn()
{
//判定,当前的验证码是否已经收到
DataCenter* dataCenter = DataCenter::getInstance();
QString verifyCodeId = dataCenter->getVerifyCodeId();
if (verifyCodeId.isEmpty()) {
//服务器还没有返回验证码响应
Toast::showMessage("服务器未返回响应,请稍后重试");
return;
}
//如果当前已经拿到了verifyCodeId就可以清空DataCenter中存储的值了确保下次点击提交按钮的时候不会影响当次的逻辑
dataCenter->resetVerifyCodeId("");
//获取到用户输入的验证码
QString verifyCode = verifyCodeEdit->text();
if (verifyCode.isEmpty()) {
Toast::showMessage("验证码不能为空");
return;
}
verifyCodeEdit->setText("");
//发送请求,把当前验证码信息,发送给服务器
connect(dataCenter, &DataCenter::changePhoneDone, this, &SelfInfoWidget::clickPhoneSubmitBtnDone, Qt::UniqueConnection);
dataCenter->changePhoneAsync(this->emailToChange, verifyCodeId, verifyCode);
leftTime = 1;
} }
void SelfInfoWidget::clickPhoneSubmitBtnDone()
{
layout->removeWidget(verifyCodeTag);
layout->removeWidget(verifyCodeEdit);
layout->removeWidget(getVerifyCodeBtn);
layout->removeWidget(phoneEdit);
layout->removeWidget(phoneSubmitBtn);
verifyCodeTag->hide();
verifyCodeEdit->hide();
getVerifyCodeBtn->hide();
phoneEdit->hide();
phoneSubmitBtn->hide();
layout->addWidget(phoneLabel, 3, 2);
phoneLabel->show();
layout->addWidget(phoneModifyBtn, 3, 3);
phoneModifyBtn->show();
phoneLabel->setText(this->emailToChange);
}
void SelfInfoWidget::clickAvatarBtn()
{
//弹出对话框,选择文件
QString filter = "Image Files (*.png *.jpg *.jpeg)";
QString imagePath = QFileDialog::getOpenFileName(this, "选择头像", QDir::homePath(), filter);
if (imagePath.isEmpty()) {
//用户取消了
LOG() << "用户没有选择任何头像文件";
return;
}
//根据路径,读取到图片的内容
QByteArray imageBytes = loadFileToByteArray(imagePath);
//发送请求,修改头像
DataCenter* dataCenter = DataCenter::getInstance();
connect(dataCenter, &DataCenter::changeAvatarDone, this, &SelfInfoWidget::clickAvatarBtnDone, Qt::UniqueConnection);
dataCenter->changeAvatarAsync(imageBytes);
}
void SelfInfoWidget::clickAvatarBtnDone()
{
//设置头像,更新到界面上
DataCenter* dataCenter = DataCenter::getInstance();
avatarBtn->setIcon(dataCenter->getMyselfsync()->avatar);
}

View File

@ -5,7 +5,12 @@
#include <QLabel> #include <QLabel>
#include <qlineedit.h> #include <qlineedit.h>
#include <QPushButton> #include <QPushButton>
#include <QCursor>
#include <QGridLayout>
#include <QTimer>
#include <QFileDialog>
#include "debug.h" #include "debug.h"
#include "toast.h"
class SelfInfoWidget : public QDialog class SelfInfoWidget : public QDialog
{ {
@ -15,7 +20,22 @@ public:
SelfInfoWidget(QWidget *parent); SelfInfoWidget(QWidget *parent);
//~SelfInfoWidget(); //~SelfInfoWidget();
void initSingnalSlots();
void clickNameSubmitBtn();
void clickNameSubmitBtnDone();
void clickDescSubmitBtn();
void clickDescSubmitBtnDone();
void clickGetVerifyCodeBtn();
void clickPhoneSubmitBtn();
void clickPhoneSubmitBtnDone();
void clickAvatarBtn();
void clickAvatarBtnDone();
private: private:
QGridLayout* layout;
QPushButton* avatarBtn; QPushButton* avatarBtn;
QLabel* idTag; //序号标签 QLabel* idTag; //序号标签
QLabel* idLabel; //序号 QLabel* idLabel; //序号
@ -41,4 +61,8 @@ private:
QLabel* verifyCodeTag;//显示验证码 QLabel* verifyCodeTag;//显示验证码
QLineEdit* verifyCodeEdit;//输入验证码 QLineEdit* verifyCodeEdit;//输入验证码
QPushButton* getVerifyCodeBtn;//获取验证码按钮 QPushButton* getVerifyCodeBtn;//获取验证码按钮
//要修改新的手机号码
QString emailToChange;
int leftTime = 30;
}; };

View File

@ -308,6 +308,14 @@ void MainWidget::initSignalSlot()
// 获取好友申请的列表 // 获取好友申请的列表
///////////////////////////////////// /////////////////////////////////////
loadApplyList(); loadApplyList();
/////////////////////////////////////
// 处理修改头像
/////////////////////////////////////
connect(dataCenter, &DataCenter::changeAvatarDone, this, [=]() {
UserInfo* myself = dataCenter->getMyselfsync();
userAvatar->setIcon(myself->avatar);
});
} }
void MainWidget::switchTabToSession() void MainWidget::switchTabToSession()

View File

@ -3,6 +3,7 @@
#include "mainwidget.h" #include "mainwidget.h"
#include "userinfowidget.h" #include "userinfowidget.h"
#include <qtimer.h> #include <qtimer.h>
#include "model/datacenter.h"
MessageShowArea::MessageShowArea() { MessageShowArea::MessageShowArea() {
//初始化基本属性 //初始化基本属性
@ -175,6 +176,18 @@ MessageItem *MessageItem::makeMessageItem(bool isLeft, const Message &message)
userInfoWidget->exec(); userInfoWidget->exec();
}); });
//当用户修改了昵称的时候,更新名字的显示
if (!isLeft) {
DataCenter* dataCenter = DataCenter::getInstance();
connect(dataCenter, &DataCenter::changeNicknameDone, messageItem, [=]() {
nameLabel->setText(dataCenter->getMyselfsync()->nickname + " " + message.time);
});
connect(dataCenter, &DataCenter::changeAvatarDone, messageItem, [=]() {
UserInfo* myself = dataCenter->getMyselfsync();
avatarBtn->setIcon(myself->avatar);
});
}
return messageItem; return messageItem;
} }

View File

@ -294,6 +294,75 @@ namespace model
netClient.sendMessage(loginSessionId, chatSessionId, MessageType::TEXT_TYPE, content.toUtf8(), ""); netClient.sendMessage(loginSessionId, chatSessionId, MessageType::TEXT_TYPE, content.toUtf8(), "");
} }
void DataCenter::changeNicknameAsync(const QString& nickname)
{
netClient.changeNickname(loginSessionId, nickname);
}
void DataCenter::resetNickname(const QString& nickname)
{
if (myself == nullptr) {
return;
}
myself->nickname = nickname;
}
void DataCenter::changeDescriptionAsync(const QString& desc)
{
netClient.changeDescription(loginSessionId, desc);
}
void DataCenter::resetDescription(const QString& desc)
{
if (myself == nullptr) {
return;
}
myself->description = desc;
}
void DataCenter::getVerifyCodeAsync(const QString& email)
{
//这个操作不需要loginSessionId
//
netClient.getVerifyCode(email);
}
void DataCenter::resetVerifyCodeId(const QString& verifyCodeId)
{
this->currentVerifyCodeId = verifyCodeId;
}
const QString& DataCenter::getVerifyCodeId() const
{
return currentVerifyCodeId;
}
void DataCenter::changePhoneAsync(const QString& email, const QString& verifyCodeId, const QString& verifyCode)
{
netClient.changeEmail(loginSessionId, email, verifyCodeId, verifyCode);
}
void DataCenter::resetPhone(const QString& email)
{
if (myself == nullptr) {
return;
}
myself->phone = email;
}
void DataCenter::changeAvatarAsync(const QByteArray& imageBytes)
{
netClient.changeAvatar(loginSessionId, imageBytes);
}
void DataCenter::resetAvatar(const QByteArray& avatar)
{
if (myself == nullptr) {
return;
}
myself->avatar = makeIcon(avatar);
}
ChatSessionInfo* DataCenter::findChatSessionById(const QString& chatSessionId) ChatSessionInfo* DataCenter::findChatSessionById(const QString& chatSessionId)
{ {
if (chatSessionList == nullptr) { if (chatSessionList == nullptr) {
@ -347,6 +416,19 @@ namespace model
chatSessionList->push_front(backup); chatSessionList->push_front(backup);
} }
UserInfo* DataCenter::findFriendById(const QString& userId)
{
if (this->friendList == nullptr) {
return nullptr;
}
for (auto& f : *friendList) {
if (f.userId == userId) {
return &f;
}
}
return nullptr;
}
void DataCenter::setCurrentChatSessionId(const QString& chatSessionId) void DataCenter::setCurrentChatSessionId(const QString& chatSessionId)
{ {
this->currentChatSessionId = chatSessionId; this->currentChatSessionId = chatSessionId;

View File

@ -134,6 +134,29 @@ namespace model
//发送消息给服务器 //发送消息给服务器
void sendTextMessageAsync(const QString& chatSessionId, const QString& content); void sendTextMessageAsync(const QString& chatSessionId, const QString& content);
//修改用户昵称
void changeNicknameAsync(const QString& nickname);
void resetNickname(const QString& nickname);
//修改用户签名
void changeDescriptionAsync(const QString& desc);
void resetDescription(const QString& desc);
//获取邮箱验证码
void getVerifyCodeAsync(const QString& email);
void resetVerifyCodeId(const QString& verifyCodeId);
//获取verifyCodeId
const QString& getVerifyCodeId() const;
//修改邮箱号码
void changePhoneAsync(const QString& email, const QString& verifyCodeId, const QString& verifyCode);
void resetPhone(const QString& email);
//修改头像
void changeAvatarAsync(const QByteArray& imageBytes);
void resetAvatar(const QByteArray& avatar);
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
///辅助函数 ///辅助函数
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@ -144,6 +167,8 @@ namespace model
ChatSessionInfo* findChatSessionByUserId(const QString& userId); ChatSessionInfo* findChatSessionByUserId(const QString& userId);
//把指定的会话信息,放到列表头部 //把指定的会话信息,放到列表头部
void topCurrentChatSessionId(const ChatSessionInfo& chatSessionInfo); void topCurrentChatSessionId(const ChatSessionInfo& chatSessionInfo);
//根据用户id查询好友信息
UserInfo* findFriendById(const QString& userId);
//设置/获取当前选中的会话 //设置/获取当前选中的会话
void setCurrentChatSessionId(const QString& chatSessionId); void setCurrentChatSessionId(const QString& chatSessionId);
@ -162,5 +187,10 @@ namespace model
void sendMessageDone(MessageType messageType, const QByteArray& content, const QString& extraInfo); void sendMessageDone(MessageType messageType, const QByteArray& content, const QString& extraInfo);
void updateLastMessage(const QString& chatSessionId); void updateLastMessage(const QString& chatSessionId);
void receiveMessageDone(const Message& lastMessage); void receiveMessageDone(const Message& lastMessage);
void changeNicknameDone();
void changeDescriptionDone();
void getVerifyCodeDone();
void changePhoneDone();
void changeAvatarDone();
}; };
} //end namespace model } //end namespace model

View File

@ -433,4 +433,190 @@ namespace network {
//统一更新会话列表的消息预览 //统一更新会话列表的消息预览
emit dataCenter->updateLastMessage(chatSessionId); emit dataCenter->updateLastMessage(chatSessionId);
} }
void NetClient::changeNickname(const QString& loginSessionId, const QString& nickname)
{
//通过 protobuf 构造请求body
bite_im::SetUserNicknameReq pbReq;
pbReq.setRequestId(makeRequestId());;
pbReq.setSessionId(loginSessionId);
pbReq.setNickname(nickname);
QByteArray body = pbReq.serialize(&serializer);
LOG() << "修改用户昵称->发送请求 requestId= " << pbReq.requestId() << ", loginSessionId= " << pbReq.sessionId()
<< ", nickname= " << pbReq.nickname();
//发送HTTP请求
QNetworkReply* resp = this->sendHttpRequest("/service/user/set_nickname", body);
//处理HTTP响应
connect(resp, & QNetworkReply::finished, this, [=]() {
//解析响应
bool ok = false;
QString reason;
auto pbResp = this->handleHttpResponse<bite_im::SetUserNicknameRsp>(resp, &ok, &reason);
//判定响应是否正确
if (!ok) {
LOG() << "修改用户昵称->处理出错 reason= " << reason;
return;
}
//把结果写入到DataCenter中
dataCenter->resetNickname(nickname);
//通知调用者,响应已经处理完毕
emit dataCenter->changeNicknameDone();
LOG() << "修改用户昵称->响应处理完毕 requestId= " << pbResp->requestId();
});
}
void NetClient::changeDescription(const QString& loginSessionId, const QString& desc)
{
//通过 protobuf 构造请求body
bite_im::SetUserDescriptionReq pbReq;
pbReq.setRequestId(makeRequestId());
pbReq.setSessionId(loginSessionId);
pbReq.setDescription(desc);
QByteArray body = pbReq.serialize(&serializer);
LOG() << "修改用户描述->发送请求 requestId= " << pbReq.requestId() << ", loginSessionId= " << pbReq.sessionId()
<< ", description= " << pbReq.description();
//发送HTTP请求
QNetworkReply* resp = this->sendHttpRequest("/service/user/set_description", body);
//处理HTTP响应
connect(resp, &QNetworkReply::finished, this, [=]() {
//解析响应
bool ok = false;
QString reason;
auto pbResp = this->handleHttpResponse<bite_im::SetUserDescriptionRsp>(resp, &ok, &reason);
//判定响应是否正确
if (!ok) {
LOG() << "修改用户描述->处理出错 reason= " << reason;
return;
}
//把得到的结果写入到DataCenter中
dataCenter->resetDescription(desc);
//发送信号,通知修改完成
emit dataCenter->changeDescriptionDone();
//打印日志
LOG() << "修改用户描述->响应处理完毕 requestId= " << pbResp->requestId();
});
}
void NetClient::getVerifyCode(const QString& email)
{
//构造请求body
bite_im::PhoneVerifyCodeReq pbReq;
pbReq.setRequestId(makeRequestId());
pbReq.setPhoneNumber(email);
QByteArray body = pbReq.serialize(&serializer);
LOG() << "获取验证码->发送请求 requestId= " << pbReq.requestId() << ", email= " << pbReq.phoneNumber();
//发送HTTP请求
QNetworkReply* resp = this->sendHttpRequest("/service/user/get_phone_verify_code", body);
//处理HTTP响应
connect(resp, &QNetworkReply::finished, this, [=]() {
//解析响应
bool ok = false;
QString reason;
auto pbResp = this->handleHttpResponse<bite_im::PhoneVerifyCodeRsp>(resp, &ok, &reason);
//判定响应是否正确
if (!ok) {
LOG() << "获取验证码->处理出错 reason= " << reason;
return;
}
//把得到的结果写入到DataCenter中
dataCenter->resetVerifyCodeId(pbResp->verifyCodeId());
//发送信号给调用者
emit dataCenter->getVerifyCodeDone();
//打印日志
LOG() << "获取验证码->响应处理完毕 requestId= " << pbResp->requestId() << "Id= " << dataCenter->getVerifyCodeId();
});
}
void NetClient::changeEmail(const QString& loginSessionId, const QString& email, const QString& verifyCodeId, const QString& verifyCode)
{
//构造请求body
bite_im::SetUserPhoneNumberReq pbReq;
pbReq.setRequestId(makeRequestId());
pbReq.setSessionId(loginSessionId);
pbReq.setPhoneNumber(email);
pbReq.setPhoneVerifyCodeId(verifyCodeId);
pbReq.setPhoneVerifyCode(verifyCode);
QByteArray body = pbReq.serialize(&serializer);
LOG() << "修改用户邮箱->发送请求 requestId= " << pbReq.requestId() << ", loginSessionId= " << pbReq.sessionId()
<< ", email= " << pbReq.phoneNumber() << ", verifyCodeId= " << pbReq.phoneVerifyCodeId()
<< ", verifyCode= " << pbReq.phoneVerifyCode();
//发送HTTP请求
QNetworkReply* resp = this->sendHttpRequest("/service/user/set_phone", body);
//处理HTTP响应
connect(resp, &QNetworkReply::finished, this, [=]() {
bool ok = false;
QString reason;
auto pbResp = this->handleHttpResponse<bite_im::SetUserPhoneNumberRsp>(resp, &ok, &reason);
//判定响应是否正确
if (!ok) {
LOG() << "修改用户邮箱->处理出错 reason= " << reason;
return;
}
//把结果记录到DataCenter中
dataCenter->resetPhone(email);
//打印日志
LOG() << "修改用户邮箱->响应处理完毕 requestId= " << pbResp->requestId();
});
//发送信号,通知调用者完成
emit dataCenter->changePhoneDone();
}
void NetClient::changeAvatar(const QString& loginSessionId, const QByteArray& avatar)
{
//构造请求body
bite_im::SetUserAvatarReq pbReq;
pbReq.setRequestId(makeRequestId());
pbReq.setSessionId(loginSessionId);
pbReq.setAvatar(avatar);
QByteArray body = pbReq.serialize(&serializer);
LOG() << "修改用户头像->发送请求 requestId= " << pbReq.requestId() << ", loginSessionId= " << pbReq.sessionId()
<< ", avatar size= " << pbReq.avatar().size();
//发送HTTP请求
QNetworkReply* resp = this->sendHttpRequest("/service/user/set_avatar", body);
//处理HTTP响应
connect(resp, &QNetworkReply::finished, this, [=]() {
//解析响应
bool ok = false;
QString reason;
auto pbResp = this->handleHttpResponse<bite_im::SetUserAvatarRsp>(resp, &ok, &reason);
//判定响应是否正确
if (!ok) {
LOG() << "修改用户头像->处理出错 reason= " << reason;
return;
}
//把数据写入到DataCenter
dataCenter->resetAvatar(avatar);
//发送信号
emit dataCenter->changeAvatarDone();
//打印日志
LOG() << "修改用户头像->响应处理完成 requestId= " << pbResp->requestId();
});
}
} //end namespace network } //end namespace network

View File

@ -89,8 +89,13 @@ namespace network {
void getRecentMessageList(const QString& loginSessionId, const QString& chatSessionId, bool updateUI); void getRecentMessageList(const QString& loginSessionId, const QString& chatSessionId, bool updateUI);
void sendMessage(const QString& loginSessionId, const QString& chatSessionId, model::MessageType messageType, void sendMessage(const QString& loginSessionId, const QString& chatSessionId, model::MessageType messageType,
const QByteArray& content, const QString& extraInfo); const QByteArray& content, const QString& extraInfo);
void receiveMessage(const QString& chatSessionId); void receiveMessage(const QString& chatSessionId);
void changeNickname(const QString& loginSessionId, const QString& nickname);
void changeDescription(const QString& loginSessionId, const QString& desc);
void getVerifyCode(const QString& email);
void changeEmail(const QString& loginSessionId, const QString& email, const QString& verifyCodeId, const QString& verifyCode);
void changeAvatar(const QString& loginSessionId, const QByteArray& avatar);
private: private:
model::DataCenter* dataCenter; model::DataCenter* dataCenter;

View File

@ -26,9 +26,11 @@ UserInfoWidget::UserInfoWidget(const UserInfo& userInfo, QWidget *parent)
avatarBtn->setFixedSize(75, 75); avatarBtn->setFixedSize(75, 75);
avatarBtn->setIconSize(QSize(75, 75)); avatarBtn->setIconSize(QSize(75, 75));
avatarBtn->setIcon(userInfo.avatar); avatarBtn->setIcon(userInfo.avatar);
avatarBtn->setStyleSheet("QPushButton { border: none; background-color: transparent; }");
QString labelStyle = "QLabel { font-weight: 800; padding-left: 20px;}"; QString labelStyle = "QLabel { font-weight: 800; padding-left: 20px;}";
QString btnStyle = "QPushButton { border: 1px solid rgb(100, 100, 100); border-radius: 5px; background-color: rgb(240, 240, 240); color: rgb(0, 0, 0);}"; QString btnStyle = "QPushButton { border: 1px solid rgb(100, 100, 100); border-radius: 5px; background-color: rgb(240, 240, 240); color: rgb(0, 0, 0);}";
//QString btnStyle = "";
btnStyle += "QPushButton:pressed { background-color: rgb(205, 205, 205); }"; btnStyle += "QPushButton:pressed { background-color: rgb(205, 205, 205); }";
int width = 80; int width = 80;
@ -107,16 +109,39 @@ UserInfoWidget::UserInfoWidget(const UserInfo& userInfo, QWidget *parent)
// 9. 初始化按钮的禁用关系 // 9. 初始化按钮的禁用关系
// 判定依据就是拿着当前用户的 userId, 在 DataCenter 的好友列表中, 查询即可. // 判定依据就是拿着当前用户的 userId, 在 DataCenter 的好友列表中, 查询即可.
//DataCenter* dataCenter = DataCenter::getInstance(); DataCenter* dataCenter = DataCenter::getInstance();
//auto* myFriend = dataCenter->findFriendById(this->userInfo.userId); auto* myFriend = dataCenter->findFriendById(this->userInfo.userId);
//if (myFriend == nullptr) { if (myFriend == nullptr) {
// // 不是好友 // 不是好友
// sendMessageBtn->setEnabled(false); sendMessageBtn->setEnabled(false);
// deleteFriendBtn->setEnabled(false); deleteFriendBtn->setEnabled(false);
//}
//else { /*sendMessageBtn->setObjectName("sendMessageBtn");
// // 是好友 deleteFriendBtn->setObjectName("deleteFriendBtn");*/
// applyBtn->setEnabled(false);
//} sendMessageBtn->setStyleSheet("QPushButton { border: 1px solid rgb(200, 200, 200); border-radius: 5px; background-color: rgb(240, 240, 240); color: rgb(150, 150, 150); }");
deleteFriendBtn->setStyleSheet("QPushButton { border: 1px solid rgb(200, 200, 200); border-radius: 5px; background-color: rgb(240, 240, 240); color: rgb(150, 150, 150); }");
} }
else {
// 是好友
applyBtn->setEnabled(false);
applyBtn->setStyleSheet("QPushButton { border: 1px solid rgb(200, 200, 200); border-radius: 5px; background-color: rgb(240, 240, 240); color: rgb(150, 150, 150); }");
}
//初始化信号槽
initSingleSlot();
}
void UserInfoWidget::initSingleSlot()
{
connect(sendMessageBtn, &QPushButton::clicked, this, [=]() {
//拿到主窗口的指针,通过主窗口,前面实现的切换到会话这样的功能,直接调用即可
MainWidget* mainWidget = MainWidget::getInstance();
mainWidget->switchSession(userInfo.userId);
//把当前模态窗口关闭
this->close();
});
}

View File

@ -9,6 +9,7 @@
#include "mainwidget.h" #include "mainwidget.h"
#include "model/data.h" #include "model/data.h"
#include "model/datacenter.h"
//using model::Message; //using model::Message;
using namespace model; using namespace model;
@ -19,6 +20,7 @@ class UserInfoWidget : public QDialog
public: public:
UserInfoWidget(const UserInfo& userInfo, QWidget *parent); UserInfoWidget(const UserInfo& userInfo, QWidget *parent);
void initSingleSlot();
private: private:
////保存对应的Message对象暂时先放在这里 ////保存对应的Message对象暂时先放在这里