#include "RegisterDialog.h" #include "UiHelpers.h" #include "AppConfig.h" #include "ImClient.h" #include "Protocol.h" #include #include #include #include #include #include #include RegisterDialog::RegisterDialog(QWidget *parent) : QWidget(parent) { auto *lay = new QVBoxLayout(this); lay->setContentsMargins(36, 22, 36, 24); lay->setSpacing(10); m_nickname = UiHelpers::lineEdit(QStringLiteral("昵称"), this); m_account = UiHelpers::lineEdit(QStringLiteral("账号"), this); m_phone = UiHelpers::lineEdit(QStringLiteral("手机号"), this); auto *codeRow = new QHBoxLayout(); codeRow->setSpacing(8); m_code = UiHelpers::lineEdit(QStringLiteral("验证码"), this); m_getCode = UiHelpers::ghostButton(QStringLiteral("获取验证码"), this); m_getCode->setFixedWidth(108); m_getCode->setFixedHeight(36); codeRow->addWidget(m_code, 1); codeRow->addWidget(m_getCode); m_password = UiHelpers::passwordEdit(QStringLiteral("密码"), this); m_confirm = UiHelpers::passwordEdit(QStringLiteral("确认密码"), this); m_error = UiHelpers::errorLabel(this); m_submit = UiHelpers::primaryButton(QStringLiteral("注 册"), this); m_submit->setMinimumWidth(0); auto *back = UiHelpers::linkButton(QStringLiteral("已有账号,去登录"), this); lay->addWidget(m_nickname); lay->addWidget(m_account); lay->addWidget(m_phone); lay->addLayout(codeRow); lay->addWidget(m_password); lay->addWidget(m_confirm); lay->addWidget(m_error); lay->addSpacing(4); lay->addWidget(m_submit); lay->addWidget(back, 0, Qt::AlignHCenter); lay->addStretch(); applyLimits(); connect(m_getCode, &QPushButton::clicked, this, &RegisterDialog::onGetCode); connect(m_submit, &QPushButton::clicked, this, &RegisterDialog::onSubmit); connect(back, &QPushButton::clicked, this, &RegisterDialog::backRequested); } QString RegisterDialog::account() const { return m_account->text().trimmed(); } QString RegisterDialog::nickname() const { return m_nickname->text().trimmed(); } void RegisterDialog::applyLimits() { const auto &cfg = AppConfig::instance(); if (m_nickname) m_nickname->setMaxLength(cfg.nicknameMax()); if (m_account) { m_account->setPlaceholderText( QStringLiteral("账号(%1-%2 位字母或数字)").arg(cfg.accountMin()).arg(cfg.accountMax())); m_account->setMaxLength(cfg.accountMax()); } if (m_phone) m_phone->setMaxLength(cfg.phoneLen()); if (m_code) m_code->setMaxLength(cfg.codeLen()); if (m_password) { m_password->setPlaceholderText( QStringLiteral("密码(%1-%2 位)").arg(cfg.passwordMin()).arg(cfg.passwordMax())); m_password->setMaxLength(cfg.passwordMax()); } if (m_confirm) m_confirm->setMaxLength(cfg.passwordMax()); } void RegisterDialog::resetForm() { m_uid = 0; m_nickname->clear(); m_account->clear(); m_phone->clear(); m_code->clear(); m_password->clear(); m_confirm->clear(); UiHelpers::setError(m_error, QString()); setBusy(false); m_nickname->setFocus(); } void RegisterDialog::setBusy(bool on) { m_getCode->setEnabled(!on); m_submit->setEnabled(!on); } void RegisterDialog::onGetCode() { const auto &cfg = AppConfig::instance(); const QString phone = m_phone->text().trimmed(); if (!cfg.validPhone(phone)) { UiHelpers::setError(m_error, QStringLiteral("请填写正确的手机号")); return; } UiHelpers::setError(m_error, QString()); setBusy(true); QPointer self(this); ImClient::instance().sendCode(phone, QStringLiteral("register"), [self](const QJsonObject &reply) { if (!self) return; self->setBusy(false); if (!ImClient::ok(reply)) { UiHelpers::setError(self->m_error, ImClient::messageOf(reply)); return; } const QString sms = reply.value(QStringLiteral("sms_code")).toString(); if (!sms.isEmpty()) self->m_code->setText(sms); UiHelpers::setError(self->m_error, QString()); UiHelpers::showToast(self->window(), QStringLiteral("验证码已发送")); }); } void RegisterDialog::onSubmit() { const auto &cfg = AppConfig::instance(); const QString nickname = m_nickname->text().trimmed(); const QString account = m_account->text().trimmed(); const QString phone = m_phone->text().trimmed(); const QString code = m_code->text().trimmed(); const QString password = m_password->text(); if (nickname.isEmpty() || account.isEmpty() || phone.isEmpty() || code.isEmpty() || password.isEmpty()) { UiHelpers::setError(m_error, QStringLiteral("请完整填写注册信息")); return; } if (!cfg.validNickname(nickname)) { UiHelpers::setError(m_error, QStringLiteral("昵称过长")); return; } if (!cfg.validAccount(account)) { UiHelpers::setError(m_error, QStringLiteral("账号须为 %1-%2 位字母或数字").arg(cfg.accountMin()).arg(cfg.accountMax())); return; } if (!cfg.validPhone(phone)) { UiHelpers::setError(m_error, QStringLiteral("请填写正确的手机号")); return; } if (!cfg.validPassword(password)) { UiHelpers::setError(m_error, QStringLiteral("密码须为 %1-%2 位").arg(cfg.passwordMin()).arg(cfg.passwordMax())); return; } if (password != m_confirm->text()) { UiHelpers::setError(m_error, QStringLiteral("两次输入的密码不一致")); return; } UiHelpers::setError(m_error, QString()); setBusy(true); QPointer self(this); ImClient::instance().registerUser(nickname, account, phone, code, password, [self](const QJsonObject &reply) { if (!self) return; self->setBusy(false); if (!ImClient::ok(reply)) { UiHelpers::setError(self->m_error, ImClient::messageOf(reply)); return; } self->m_uid = Proto::jsonI64(reply, QStringLiteral("uid")); emit self->submitted(self->m_uid); }); }