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)
}
static func requestRegisterVerifyCode(username: String) async throws -> RegisterSession {
static func requestRegisterVerifyCode(phoneNumber: String) async throws -> RegisterSession {
var params: [String: Any] = [
"username": username
"username": phoneNumber
]
params.merge(baseParams) {$1}
@ -82,9 +82,9 @@ struct AuthService {
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] = [
"username": username
"username": phoneNumber
]
params.merge(baseParams) {$1}

View File

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

View File

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

View File

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

View File

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