RegisterDialog.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. #include "RegisterDialog.h"
  2. #include "UiHelpers.h"
  3. #include "AppConfig.h"
  4. #include "ImClient.h"
  5. #include "Protocol.h"
  6. #include <QJsonObject>
  7. #include <QLabel>
  8. #include <QLineEdit>
  9. #include <QPointer>
  10. #include <QPushButton>
  11. #include <QVBoxLayout>
  12. #include <QHBoxLayout>
  13. RegisterDialog::RegisterDialog(QWidget *parent)
  14. : QWidget(parent)
  15. {
  16. auto *lay = new QVBoxLayout(this);
  17. lay->setContentsMargins(36, 22, 36, 24);
  18. lay->setSpacing(10);
  19. m_nickname = UiHelpers::lineEdit(QStringLiteral("昵称"), this);
  20. m_account = UiHelpers::lineEdit(QStringLiteral("账号"), this);
  21. m_phone = UiHelpers::lineEdit(QStringLiteral("手机号"), this);
  22. auto *codeRow = new QHBoxLayout();
  23. codeRow->setSpacing(8);
  24. m_code = UiHelpers::lineEdit(QStringLiteral("验证码"), this);
  25. m_getCode = UiHelpers::ghostButton(QStringLiteral("获取验证码"), this);
  26. m_getCode->setFixedWidth(108);
  27. m_getCode->setFixedHeight(36);
  28. codeRow->addWidget(m_code, 1);
  29. codeRow->addWidget(m_getCode);
  30. m_password = UiHelpers::passwordEdit(QStringLiteral("密码"), this);
  31. m_confirm = UiHelpers::passwordEdit(QStringLiteral("确认密码"), this);
  32. m_error = UiHelpers::errorLabel(this);
  33. m_submit = UiHelpers::primaryButton(QStringLiteral("注 册"), this);
  34. m_submit->setMinimumWidth(0);
  35. auto *back = UiHelpers::linkButton(QStringLiteral("已有账号,去登录"), this);
  36. lay->addWidget(m_nickname);
  37. lay->addWidget(m_account);
  38. lay->addWidget(m_phone);
  39. lay->addLayout(codeRow);
  40. lay->addWidget(m_password);
  41. lay->addWidget(m_confirm);
  42. lay->addWidget(m_error);
  43. lay->addSpacing(4);
  44. lay->addWidget(m_submit);
  45. lay->addWidget(back, 0, Qt::AlignHCenter);
  46. lay->addStretch();
  47. applyLimits();
  48. connect(m_getCode, &QPushButton::clicked, this, &RegisterDialog::onGetCode);
  49. connect(m_submit, &QPushButton::clicked, this, &RegisterDialog::onSubmit);
  50. connect(back, &QPushButton::clicked, this, &RegisterDialog::backRequested);
  51. }
  52. QString RegisterDialog::account() const
  53. {
  54. return m_account->text().trimmed();
  55. }
  56. QString RegisterDialog::nickname() const
  57. {
  58. return m_nickname->text().trimmed();
  59. }
  60. void RegisterDialog::applyLimits()
  61. {
  62. const auto &cfg = AppConfig::instance();
  63. if (m_nickname)
  64. m_nickname->setMaxLength(cfg.nicknameMax());
  65. if (m_account)
  66. {
  67. m_account->setPlaceholderText(
  68. QStringLiteral("账号(%1-%2 位字母或数字)").arg(cfg.accountMin()).arg(cfg.accountMax()));
  69. m_account->setMaxLength(cfg.accountMax());
  70. }
  71. if (m_phone)
  72. m_phone->setMaxLength(cfg.phoneLen());
  73. if (m_code)
  74. m_code->setMaxLength(cfg.codeLen());
  75. if (m_password)
  76. {
  77. m_password->setPlaceholderText(
  78. QStringLiteral("密码(%1-%2 位)").arg(cfg.passwordMin()).arg(cfg.passwordMax()));
  79. m_password->setMaxLength(cfg.passwordMax());
  80. }
  81. if (m_confirm)
  82. m_confirm->setMaxLength(cfg.passwordMax());
  83. }
  84. void RegisterDialog::resetForm()
  85. {
  86. m_uid = 0;
  87. m_nickname->clear();
  88. m_account->clear();
  89. m_phone->clear();
  90. m_code->clear();
  91. m_password->clear();
  92. m_confirm->clear();
  93. UiHelpers::setError(m_error, QString());
  94. setBusy(false);
  95. m_nickname->setFocus();
  96. }
  97. void RegisterDialog::setBusy(bool on)
  98. {
  99. m_getCode->setEnabled(!on);
  100. m_submit->setEnabled(!on);
  101. }
  102. void RegisterDialog::onGetCode()
  103. {
  104. const auto &cfg = AppConfig::instance();
  105. const QString phone = m_phone->text().trimmed();
  106. if (!cfg.validPhone(phone))
  107. {
  108. UiHelpers::setError(m_error, QStringLiteral("请填写正确的手机号"));
  109. return;
  110. }
  111. UiHelpers::setError(m_error, QString());
  112. setBusy(true);
  113. QPointer<RegisterDialog> self(this);
  114. ImClient::instance().sendCode(phone, QStringLiteral("register"), [self](const QJsonObject &reply) {
  115. if (!self)
  116. return;
  117. self->setBusy(false);
  118. if (!ImClient::ok(reply))
  119. {
  120. UiHelpers::setError(self->m_error, ImClient::messageOf(reply));
  121. return;
  122. }
  123. const QString sms = reply.value(QStringLiteral("sms_code")).toString();
  124. if (!sms.isEmpty())
  125. self->m_code->setText(sms);
  126. UiHelpers::setError(self->m_error, QString());
  127. UiHelpers::showToast(self->window(), QStringLiteral("验证码已发送"));
  128. });
  129. }
  130. void RegisterDialog::onSubmit()
  131. {
  132. const auto &cfg = AppConfig::instance();
  133. const QString nickname = m_nickname->text().trimmed();
  134. const QString account = m_account->text().trimmed();
  135. const QString phone = m_phone->text().trimmed();
  136. const QString code = m_code->text().trimmed();
  137. const QString password = m_password->text();
  138. if (nickname.isEmpty() || account.isEmpty() || phone.isEmpty()
  139. || code.isEmpty() || password.isEmpty())
  140. {
  141. UiHelpers::setError(m_error, QStringLiteral("请完整填写注册信息"));
  142. return;
  143. }
  144. if (!cfg.validNickname(nickname))
  145. {
  146. UiHelpers::setError(m_error, QStringLiteral("昵称过长"));
  147. return;
  148. }
  149. if (!cfg.validAccount(account))
  150. {
  151. UiHelpers::setError(m_error,
  152. QStringLiteral("账号须为 %1-%2 位字母或数字").arg(cfg.accountMin()).arg(cfg.accountMax()));
  153. return;
  154. }
  155. if (!cfg.validPhone(phone))
  156. {
  157. UiHelpers::setError(m_error, QStringLiteral("请填写正确的手机号"));
  158. return;
  159. }
  160. if (!cfg.validPassword(password))
  161. {
  162. UiHelpers::setError(m_error,
  163. QStringLiteral("密码须为 %1-%2 位").arg(cfg.passwordMin()).arg(cfg.passwordMax()));
  164. return;
  165. }
  166. if (password != m_confirm->text())
  167. {
  168. UiHelpers::setError(m_error, QStringLiteral("两次输入的密码不一致"));
  169. return;
  170. }
  171. UiHelpers::setError(m_error, QString());
  172. setBusy(true);
  173. QPointer<RegisterDialog> self(this);
  174. ImClient::instance().registerUser(nickname, account, phone, code, password,
  175. [self](const QJsonObject &reply) {
  176. if (!self)
  177. return;
  178. self->setBusy(false);
  179. if (!ImClient::ok(reply))
  180. {
  181. UiHelpers::setError(self->m_error, ImClient::messageOf(reply));
  182. return;
  183. }
  184. self->m_uid = Proto::jsonI64(reply, QStringLiteral("uid"));
  185. emit self->submitted(self->m_uid);
  186. });
  187. }