| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- #include "RegisterDialog.h"
- #include "UiHelpers.h"
- #include "AppConfig.h"
- #include "ImClient.h"
- #include "Protocol.h"
- #include <QJsonObject>
- #include <QLabel>
- #include <QLineEdit>
- #include <QPointer>
- #include <QPushButton>
- #include <QVBoxLayout>
- #include <QHBoxLayout>
- 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<RegisterDialog> 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<RegisterDialog> 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);
- });
- }
|