This commit is contained in:
anlicheng 2026-04-17 16:47:57 +08:00
parent 4af8993c8f
commit 9cde9f1f38
5 changed files with 40 additions and 39 deletions

View File

@ -53,9 +53,9 @@ struct AuthService {
return try await SDLAPIClient.doPost(path: "/auth/token", params: params, as: NetworkSession.self) return try await SDLAPIClient.doPost(path: "/auth/token", params: params, as: NetworkSession.self)
} }
static func requestRegisterVerifyCode(username: String) async throws -> RegisterSession { static func requestRegisterVerifyCode(phoneNumber: String) async throws -> RegisterSession {
var params: [String: Any] = [ var params: [String: Any] = [
"username": username "username": phoneNumber
] ]
params.merge(baseParams) {$1} params.merge(baseParams) {$1}
@ -82,9 +82,9 @@ struct AuthService {
return try await SDLAPIClient.doPost(path: "/register/submit", params: params, as: String.self) return try await SDLAPIClient.doPost(path: "/register/submit", params: params, as: String.self)
} }
static func requestResetPasswordVerifyCode(username: String) async throws -> ResetPasswordSession { static func requestResetPasswordVerifyCode(phoneNumber: String) async throws -> ResetPasswordSession {
var params: [String: Any] = [ var params: [String: Any] = [
"username": username "username": phoneNumber
] ]
params.merge(baseParams) {$1} params.merge(baseParams) {$1}

View File

@ -20,14 +20,14 @@ class RegisterModel {
} }
// //
var username: String = "" var phoneNumber: String = ""
var sessionId: Int = 0 var sessionId: Int = 0
var stage: Stage = .requestVerifyCode var stage: Stage = .requestVerifyCode
var transitionEdge: Edge = .trailing // var transitionEdge: Edge = .trailing //
func requestVerifyCode(username: String) async throws -> AuthService.RegisterSession { func requestVerifyCode(phoneNumber: String) async throws -> AuthService.RegisterSession {
return try await AuthService.requestRegisterVerifyCode(username: username) return try await AuthService.requestRegisterVerifyCode(phoneNumber: phoneNumber)
} }
func submitVerifyCode(sessionId: Int, verifyCode: String) async throws -> String { func submitVerifyCode(sessionId: Int, verifyCode: String) async throws -> String {

View File

@ -23,11 +23,11 @@ class ResetPasswordModel {
var transitionEdge: Edge = .trailing // var transitionEdge: Edge = .trailing //
// //
var username: String = "" var phoneNumber: String = ""
var sessionId: Int = 0 var sessionId: Int = 0
func requestVerifyCode(username: String) async throws -> AuthService.ResetPasswordSession { func requestVerifyCode(phoneNumber: String) async throws -> AuthService.ResetPasswordSession {
return try await AuthService.requestResetPasswordVerifyCode(username: username) return try await AuthService.requestResetPasswordVerifyCode(phoneNumber: phoneNumber)
} }
func submitVerifyCode(sessionId: Int, verifyCode: String) async throws -> String { func submitVerifyCode(sessionId: Int, verifyCode: String) async throws -> String {

View File

@ -111,16 +111,16 @@ struct RegisterRequestVerifyCodeView: View {
@Bindable var model = registerModel @Bindable var model = registerModel
VStack(spacing: 24) { VStack(spacing: 24) {
headerSection(title: "创建个人网络", subtitle: "输入邮箱开始注册") headerSection(title: "创建个人网络", subtitle: "输入手机号开始注册")
VStack(spacing: 16) { VStack(spacing: 16) {
PunchTextField(icon: "person.crop.circle", placeholder: "邮箱", text: $model.username) PunchTextField(icon: "phone.fill", placeholder: "手机号", text: $model.phoneNumber)
} }
.frame(width: 280) .frame(width: 280)
Button(action: { Button(action: {
Task { @MainActor in Task { @MainActor in
await self.requestVerifyCode(username: model.username) await self.requestVerifyCode(phoneNumber: model.phoneNumber)
} }
}) { }) {
Text("获取验证码") Text("获取验证码")
@ -130,7 +130,7 @@ struct RegisterRequestVerifyCodeView: View {
.buttonStyle(.borderedProminent) .buttonStyle(.borderedProminent)
.controlSize(.large) .controlSize(.large)
.frame(width: 280) .frame(width: 280)
.disabled(!SDLUtil.isValidIdentifyContact(model.username) || isProcessing) .disabled(SDLUtil.identifyContact(model.phoneNumber) != .phone || isProcessing)
} }
.padding(40) .padding(40)
.alert(isPresented: $showAlert) { .alert(isPresented: $showAlert) {
@ -138,25 +138,25 @@ struct RegisterRequestVerifyCodeView: View {
} }
} }
private func requestVerifyCode(username: String) async { private func requestVerifyCode(phoneNumber: String) async {
self.isProcessing = true self.isProcessing = true
defer { defer {
self.isProcessing = false self.isProcessing = false
} }
if username.isEmpty { if phoneNumber.isEmpty {
self.showAlert = true self.showAlert = true
self.errorMessage = "邮箱为空" self.errorMessage = "手机号为空"
return return
} }
switch SDLUtil.identifyContact(username) { switch SDLUtil.identifyContact(phoneNumber) {
case .email: case .phone:
do { do {
let registerSession = try await self.registerModel.requestVerifyCode(username: username) let registerSession = try await self.registerModel.requestVerifyCode(phoneNumber: phoneNumber)
withAnimation(.spring(duration: 0.6, bounce: 0.2)) { withAnimation(.spring(duration: 0.6, bounce: 0.2)) {
self.registerModel.stage = .submitVerifyCode self.registerModel.stage = .submitVerifyCode
self.registerModel.username = username self.registerModel.phoneNumber = phoneNumber
self.registerModel.sessionId = registerSession.sessionId self.registerModel.sessionId = registerSession.sessionId
self.registerModel.transitionEdge = .trailing self.registerModel.transitionEdge = .trailing
@ -170,7 +170,7 @@ struct RegisterRequestVerifyCodeView: View {
} }
default: default:
self.showAlert = true self.showAlert = true
self.errorMessage = "邮箱格式错误" self.errorMessage = "手机号格式错误"
} }
} }
@ -199,14 +199,14 @@ struct RegisterSubmitVerifyCodeView: View {
var body: some View { var body: some View {
VStack(spacing: 24) { VStack(spacing: 24) {
headerSection(title: "身份验证", subtitle: "验证码已发送至 \(registerModel.username)") headerSection(title: "身份验证", subtitle: "验证码已发送至 \(registerModel.phoneNumber)")
VStack(alignment: .trailing, spacing: 16) { VStack(alignment: .trailing, spacing: 16) {
PunchTextField(icon: "envelope.badge", placeholder: "输入 6 位验证码", text: $code) PunchTextField(icon: "envelope.badge", placeholder: "输入 6 位验证码", text: $code)
Button { Button {
Task { @MainActor in Task { @MainActor in
await self.resendVerifyCodeAction(username: registerModel.username) await self.resendVerifyCodeAction(phoneNumber: registerModel.phoneNumber)
} }
} label: { } label: {
if isEnabled { if isEnabled {
@ -257,9 +257,9 @@ struct RegisterSubmitVerifyCodeView: View {
} }
// //
private func resendVerifyCodeAction(username: String) async { private func resendVerifyCodeAction(phoneNumber: String) async {
do { do {
let result = try await self.registerModel.requestVerifyCode(username: username) let result = try await self.registerModel.requestVerifyCode(phoneNumber: phoneNumber)
print("send verify code result: \(result)") print("send verify code result: \(result)")
} catch let err { } catch let err {
print("resend verify get error: \(err)") print("resend verify get error: \(err)")
@ -439,7 +439,7 @@ struct RegisterSuccessView: View {
Button(action: { Button(action: {
// //
withAnimation(.spring(duration: 0.6, bounce: 0.2)) { withAnimation(.spring(duration: 0.6, bounce: 0.2)) {
self.appContext.appScene = .login(username: registerModel.username) self.appContext.appScene = .login(username: registerModel.phoneNumber)
} }
}) { }) {
Text("立即开始使用") Text("立即开始使用")

View File

@ -72,14 +72,14 @@ struct GetVerifyCodeView: View {
@Bindable var model = resetPasswordModel @Bindable var model = resetPasswordModel
VStack(spacing: 24) { VStack(spacing: 24) {
headerSection(title: "重置密码", subtitle: "请输入关联的邮箱来验证身份") headerSection(title: "重置密码", subtitle: "请输入关联的手机号来验证身份")
PunchTextField(icon: "person.crop.circle", placeholder: "邮箱", text: $model.username) PunchTextField(icon: "phone.fill", placeholder: "手机号", text: $model.phoneNumber)
.frame(width: 280) .frame(width: 280)
Button { Button {
Task { @MainActor in Task { @MainActor in
await self.sendVerifyCode(username: model.username) await self.sendVerifyCode(phoneNumber: model.phoneNumber)
} }
} label: { } label: {
Text("获取验证码") Text("获取验证码")
@ -89,7 +89,7 @@ struct GetVerifyCodeView: View {
.buttonStyle(.borderedProminent) .buttonStyle(.borderedProminent)
.controlSize(.large) .controlSize(.large)
.frame(width: 280) .frame(width: 280)
.disabled(!SDLUtil.isValidIdentifyContact(model.username) || isProcessing) .disabled(SDLUtil.identifyContact(model.phoneNumber) != .phone || isProcessing)
} }
.padding(40) .padding(40)
.alert(isPresented: $showAlert) { .alert(isPresented: $showAlert) {
@ -98,16 +98,17 @@ struct GetVerifyCodeView: View {
} }
// //
private func sendVerifyCode(username: String) async { private func sendVerifyCode(phoneNumber: String) async {
self.isProcessing = true self.isProcessing = true
defer { defer {
self.isProcessing = false self.isProcessing = false
} }
do { do {
let resetSession = try await resetPasswordModel.requestVerifyCode(username: username) let resetSession = try await resetPasswordModel.requestVerifyCode(phoneNumber: phoneNumber)
withAnimation(.spring(duration: 0.6, bounce: 0.2)) { withAnimation(.spring(duration: 0.6, bounce: 0.2)) {
self.resetPasswordModel.stage = .submitVerifyCode self.resetPasswordModel.stage = .submitVerifyCode
self.resetPasswordModel.phoneNumber = phoneNumber
self.resetPasswordModel.sessionId = resetSession.sessionId self.resetPasswordModel.sessionId = resetSession.sessionId
self.resetPasswordModel.transitionEdge = .trailing self.resetPasswordModel.transitionEdge = .trailing
@ -141,14 +142,14 @@ struct SubmitVerifyCodeView: View {
var body: some View { var body: some View {
VStack(spacing: 24) { VStack(spacing: 24) {
headerSection(title: "身份验证", subtitle: "验证码已发送至 \(self.resetPasswordModel.username)") headerSection(title: "身份验证", subtitle: "验证码已发送至 \(self.resetPasswordModel.phoneNumber)")
VStack(alignment: .trailing, spacing: 16) { VStack(alignment: .trailing, spacing: 16) {
PunchTextField(icon: "envelope.badge", placeholder: "输入 6 位验证码", text: $code) PunchTextField(icon: "envelope.badge", placeholder: "输入 6 位验证码", text: $code)
Button(isResendEnabled ? "重新获取" : "重新获取 (\(remainingSeconds)s)") { Button(isResendEnabled ? "重新获取" : "重新获取 (\(remainingSeconds)s)") {
Task { @MainActor in Task { @MainActor in
await self.resendAction(username: self.resetPasswordModel.username) await self.resendAction(phoneNumber: self.resetPasswordModel.phoneNumber)
} }
} }
.buttonStyle(.link) .buttonStyle(.link)
@ -191,8 +192,8 @@ struct SubmitVerifyCodeView: View {
} }
} }
private func resendAction(username: String) async { private func resendAction(phoneNumber: String) async {
_ = try? await resetPasswordModel.requestVerifyCode(username: username) _ = try? await resetPasswordModel.requestVerifyCode(phoneNumber: phoneNumber)
await startCountdown() await startCountdown()
} }
@ -266,7 +267,7 @@ struct ResetPasswordView: View {
var body: some View { var body: some View {
VStack(spacing: 24) { VStack(spacing: 24) {
headerSection(title: "设置新密码", subtitle: "请为账号 \(self.resetPasswordModel.username) 设置一个强密码") headerSection(title: "设置新密码", subtitle: "请为手机号 \(self.resetPasswordModel.phoneNumber) 设置一个强密码")
VStack(spacing: 12) { VStack(spacing: 12) {
PunchTextField(icon: "lock.shield", placeholder: "新密码 (至少8位)", text: $password, isSecure: true) PunchTextField(icon: "lock.shield", placeholder: "新密码 (至少8位)", text: $password, isSecure: true)
@ -362,7 +363,7 @@ struct ResetPasswordSuccessView: View {
Button(action: { Button(action: {
withAnimation(.spring(duration: 0.6, bounce: 0.2)) { withAnimation(.spring(duration: 0.6, bounce: 0.2)) {
self.appContext.appScene = .login(username: self.resetPasswordModel.username) self.appContext.appScene = .login(username: self.resetPasswordModel.phoneNumber)
} }
}) { }) {
Text("返回登录") Text("返回登录")