Compare commits
2 Commits
f144194734
...
fd87c244b9
| Author | SHA1 | Date | |
|---|---|---|---|
| fd87c244b9 | |||
| 4c9bb58a88 |
@ -34,14 +34,24 @@ struct SDLUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return digest.map { String(format: "%02x", $0) }.joined()
|
return digest.map { String(format: "%02x", $0) }.joined()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static func isValidIdentifyContact(_ input: String) -> Bool {
|
||||||
|
switch identifyContact(input) {
|
||||||
|
case .email, .phone:
|
||||||
|
true
|
||||||
|
default:
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static func identifyContact(_ input: String) -> ContactType {
|
static func identifyContact(_ input: String) -> ContactType {
|
||||||
let trimmed = input.trimmingCharacters(in: .whitespacesAndNewlines)
|
let trimmed = input.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||||
// 手机号正则(中国手机号为例,以 1 开头,11 位数字)
|
// 手机号正则(中国手机号为例,以 1 开头,11 位数字)
|
||||||
let phoneRegex = /^1[3-9][0-9]{9}$/
|
let phoneRegex = /^1[3-9][0-9]{9}$/
|
||||||
// 邮箱正则
|
// 邮箱正则
|
||||||
let emailRegex = /^[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$/
|
let emailRegex = /^[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,64}$/
|
||||||
if trimmed.wholeMatch(of: phoneRegex) != nil {
|
if trimmed.wholeMatch(of: phoneRegex) != nil {
|
||||||
return .phone
|
return .phone
|
||||||
} else if trimmed.wholeMatch(of: emailRegex) != nil {
|
} else if trimmed.wholeMatch(of: emailRegex) != nil {
|
||||||
|
|||||||
@ -47,10 +47,12 @@ class RegisterModel {
|
|||||||
var params: [String: Any] = [
|
var params: [String: Any] = [
|
||||||
"username": username,
|
"username": username,
|
||||||
"password": password,
|
"password": password,
|
||||||
|
"version": SystemConfig.version_name,
|
||||||
|
"system": SystemConfig.systemInfo
|
||||||
]
|
]
|
||||||
params.merge(baseParams) {$1}
|
params.merge(baseParams) {$1}
|
||||||
|
|
||||||
return try await SDLAPIClient.doPost(path: "/auth/resetPassword", params: params, as: String.self)
|
return try await SDLAPIClient.doPost(path: "/auth/register", params: params, as: String.self)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,291 +5,330 @@
|
|||||||
// Created by 安礼成 on 2026/3/9.
|
// Created by 安礼成 on 2026/3/9.
|
||||||
//
|
//
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
import Observation
|
||||||
|
|
||||||
|
// MARK: - 注册根视图
|
||||||
struct RegisterRootView: View {
|
struct RegisterRootView: View {
|
||||||
@State private var registerModel: RegisterModel = RegisterModel()
|
@State private var registerModel = RegisterModel()
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
Group {
|
ZStack {
|
||||||
switch registerModel.stage {
|
// 背景毛玻璃
|
||||||
case .requestVerifyCode:
|
VisualEffectView(material: .underWindowBackground, blendingMode: .behindWindow)
|
||||||
RegisterRequestVerifyCodeView()
|
.ignoresSafeArea()
|
||||||
case .submitVerifyCode(let username):
|
|
||||||
RegisterSubmitVerifyCodeView(username: username)
|
Group {
|
||||||
case .setPassword(username: let username):
|
switch registerModel.stage {
|
||||||
RegisterSetPasswordView(username: username)
|
case .requestVerifyCode:
|
||||||
|
RegisterRequestVerifyCodeView()
|
||||||
|
case .submitVerifyCode(let username):
|
||||||
|
RegisterSubmitVerifyCodeView(username: username)
|
||||||
|
case .setPassword(let username):
|
||||||
|
RegisterSetPasswordView(username: username)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
.transition(.asymmetric(insertion: .move(edge: .trailing).combined(with: .opacity),
|
||||||
|
removal: .move(edge: .leading).combined(with: .opacity)))
|
||||||
}
|
}
|
||||||
.environment(registerModel)
|
.environment(registerModel)
|
||||||
|
.frame(width: 400, height: 450)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取验证码
|
// MARK: - 封装的输入框组件
|
||||||
struct RegisterRequestVerifyCodeView: View {
|
struct PunchTextField: View {
|
||||||
@Environment(RegisterModel.self) var registerModel: RegisterModel
|
let icon: String
|
||||||
|
let placeholder: String
|
||||||
@State private var username: String = ""
|
@Binding var text: String
|
||||||
@State private var showAlert = false
|
var isSecure: Bool = false
|
||||||
@State private var errorMessage = ""
|
var isDisabled: Bool = false
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
VStack(spacing: 30) {
|
HStack(spacing: 12) {
|
||||||
|
Image(systemName: icon)
|
||||||
|
.foregroundColor(.secondary)
|
||||||
|
.frame(width: 20)
|
||||||
|
|
||||||
// 标题
|
if isSecure {
|
||||||
Text("注册 创建个人网络")
|
SecureField(placeholder, text: $text)
|
||||||
.font(.system(size: 18, weight: .medium))
|
|
||||||
|
|
||||||
VStack(alignment: .leading, spacing: 16) {
|
|
||||||
TextField("手机号/邮箱", text: $username)
|
|
||||||
.textFieldStyle(.plain)
|
.textFieldStyle(.plain)
|
||||||
.frame(width: 260, height: 28)
|
} else {
|
||||||
.overlay(
|
TextField(placeholder, text: $text)
|
||||||
Rectangle()
|
.textFieldStyle(.plain)
|
||||||
.frame(height: 1)
|
.disabled(isDisabled)
|
||||||
.foregroundColor(.blue),
|
|
||||||
alignment: .bottom
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
Button {
|
.padding(10)
|
||||||
Task { @MainActor in
|
.background(Color.primary.opacity(isDisabled ? 0.02 : 0.05))
|
||||||
//await self.sendVerifyCode()
|
.cornerRadius(8)
|
||||||
withAnimation {
|
.overlay(
|
||||||
self.registerModel.stage = .submitVerifyCode(username: self.username)
|
RoundedRectangle(cornerRadius: 8)
|
||||||
}
|
.stroke(Color.primary.opacity(0.1), lineWidth: 1)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - 第一步:获取验证码
|
||||||
|
struct RegisterRequestVerifyCodeView: View {
|
||||||
|
@Environment(RegisterModel.self) var registerModel
|
||||||
|
@State private var username: String = ""
|
||||||
|
@State private var isProcessing = false
|
||||||
|
|
||||||
|
// 错误提示
|
||||||
|
@State private var showAlert: Bool = false
|
||||||
|
@State private var errorMessage: String = ""
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
VStack(spacing: 24) {
|
||||||
|
headerSection(title: "创建个人网络", subtitle: "输入手机号或邮箱开始注册")
|
||||||
|
|
||||||
|
VStack(spacing: 16) {
|
||||||
|
PunchTextField(icon: "person.crop.circle", placeholder: "手机号 / 邮箱", text: $username)
|
||||||
|
}
|
||||||
|
.frame(width: 280)
|
||||||
|
|
||||||
|
Button(action: {
|
||||||
|
self.requestVerifyCode()
|
||||||
|
}) {
|
||||||
|
if isProcessing {
|
||||||
|
ProgressView()
|
||||||
|
.controlSize(.small)
|
||||||
|
} else {
|
||||||
|
Text("获取验证码")
|
||||||
|
.fontWeight(.medium)
|
||||||
|
.frame(maxWidth: .infinity)
|
||||||
}
|
}
|
||||||
} label: {
|
|
||||||
Text("获取验证码")
|
|
||||||
.font(.system(size: 14))
|
|
||||||
.foregroundColor(.black)
|
|
||||||
.frame(width: 160, height: 36)
|
|
||||||
.background(Color(red: 74/255, green: 207/255, blue: 154/255))
|
|
||||||
}
|
}
|
||||||
.frame(width: 160, height: 36)
|
.buttonStyle(.borderedProminent)
|
||||||
.cornerRadius(6)
|
.controlSize(.large)
|
||||||
|
.frame(width: 280)
|
||||||
|
.disabled(!SDLUtil.isValidIdentifyContact(username) || isProcessing)
|
||||||
|
|
||||||
Spacer()
|
Spacer()
|
||||||
}
|
}
|
||||||
.padding(.top, 40)
|
.padding(40)
|
||||||
.frame(width: 400, height: 400)
|
|
||||||
.alert(isPresented: $showAlert) {
|
.alert(isPresented: $showAlert) {
|
||||||
Alert(title: Text("提示"), message: Text(self.errorMessage))
|
Alert(title: Text("提示"), message: Text(self.errorMessage))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func sendVerifyCode() async {
|
private func requestVerifyCode() {
|
||||||
if username.isEmpty {
|
self.isProcessing = true
|
||||||
self.showAlert = true
|
Task { @MainActor in
|
||||||
self.errorMessage = "手机号/邮箱为空"
|
if username.isEmpty {
|
||||||
return
|
self.showAlert = true
|
||||||
|
self.errorMessage = "手机号/邮箱为空"
|
||||||
|
self.isProcessing = false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
switch SDLUtil.identifyContact(username) {
|
||||||
|
case .email, .phone:
|
||||||
|
do {
|
||||||
|
let result = try await self.registerModel.requestVerifyCode(username: username)
|
||||||
|
print("send verify code result: \(result)")
|
||||||
|
withAnimation(.spring()) {
|
||||||
|
self.registerModel.stage = .submitVerifyCode(username: username)
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
self.showAlert = true
|
||||||
|
self.errorMessage = error.localizedDescription
|
||||||
|
}
|
||||||
|
case .invalid:
|
||||||
|
self.showAlert = true
|
||||||
|
self.errorMessage = "手机号/邮箱格式错误"
|
||||||
|
}
|
||||||
|
self.isProcessing = false
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
switch SDLUtil.identifyContact(username) {
|
// MARK: - 第二步:验证
|
||||||
case .email, .phone:
|
struct RegisterSubmitVerifyCodeView: View {
|
||||||
|
@Environment(RegisterModel.self) var registerModel
|
||||||
|
let username: String
|
||||||
|
@State private var code: String = ""
|
||||||
|
@State private var isProcessing = false
|
||||||
|
|
||||||
|
// 错误提示
|
||||||
|
@State private var showAlert: Bool = false
|
||||||
|
@State private var errorMessage: String = ""
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
VStack(spacing: 24) {
|
||||||
|
headerSection(title: "身份验证", subtitle: "验证码已发送至 \(username)")
|
||||||
|
|
||||||
|
VStack(spacing: 16) {
|
||||||
|
PunchTextField(icon: "envelope.badge", placeholder: "输入 4 位验证码", text: $code)
|
||||||
|
|
||||||
|
Button("没有收到?重新获取") {
|
||||||
|
// Resend Logic
|
||||||
|
}
|
||||||
|
.buttonStyle(.link)
|
||||||
|
.font(.caption)
|
||||||
|
}
|
||||||
|
.frame(width: 280)
|
||||||
|
|
||||||
|
VStack(spacing: 12) {
|
||||||
|
Button(action: {
|
||||||
|
self.submitVerifyCode()
|
||||||
|
}) {
|
||||||
|
if isProcessing {
|
||||||
|
ProgressView()
|
||||||
|
.controlSize(.small)
|
||||||
|
} else {
|
||||||
|
Text("验证并设置密码")
|
||||||
|
.fontWeight(.medium)
|
||||||
|
.frame(maxWidth: .infinity)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.buttonStyle(.borderedProminent)
|
||||||
|
.controlSize(.large)
|
||||||
|
|
||||||
|
Button("返回上一步") {
|
||||||
|
withAnimation {
|
||||||
|
registerModel.stage = .requestVerifyCode
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.buttonStyle(.plain)
|
||||||
|
.foregroundColor(.secondary)
|
||||||
|
}
|
||||||
|
.frame(width: 280)
|
||||||
|
|
||||||
|
Spacer()
|
||||||
|
}
|
||||||
|
.padding(40)
|
||||||
|
.alert(isPresented: $showAlert) {
|
||||||
|
Alert(title: Text("提示"), message: Text(errorMessage))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func submitVerifyCode() {
|
||||||
|
self.isProcessing = true
|
||||||
|
Task { @MainActor in
|
||||||
|
if self.code.isEmpty {
|
||||||
|
self.showAlert = true
|
||||||
|
self.errorMessage = "请输入验证码"
|
||||||
|
self.isProcessing = false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if self.code.count != 4 {
|
||||||
|
self.showAlert = true
|
||||||
|
self.errorMessage = "验证码错误"
|
||||||
|
self.isProcessing = false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
let result = try await self.registerModel.requestVerifyCode(username: username)
|
let result = try await self.registerModel.submitVerifyCode(username: username, verifyCode: self.code)
|
||||||
|
print("submit verify code result: \(result)")
|
||||||
|
withAnimation(.spring()) {
|
||||||
|
registerModel.stage = .setPassword(username: username)
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
self.showAlert = true
|
||||||
|
self.errorMessage = error.localizedDescription
|
||||||
|
}
|
||||||
|
self.isProcessing = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - 第三步:设置密码
|
||||||
|
struct RegisterSetPasswordView: View {
|
||||||
|
@Environment(RegisterModel.self) var registerModel
|
||||||
|
let username: String
|
||||||
|
@State private var password = ""
|
||||||
|
@State private var confirm = ""
|
||||||
|
@State private var isProcessing = false
|
||||||
|
|
||||||
|
// 错误提示
|
||||||
|
@State private var showAlert: Bool = false
|
||||||
|
@State private var errorMessage: String = ""
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
VStack(spacing: 24) {
|
||||||
|
headerSection(title: "设置安全密码", subtitle: "最后一步,请确保密码足够强大")
|
||||||
|
|
||||||
|
VStack(spacing: 12) {
|
||||||
|
PunchTextField(icon: "lock.shield", placeholder: "新密码", text: $password, isSecure: true)
|
||||||
|
PunchTextField(icon: "lock.shield", placeholder: "确认密码", text: $confirm, isSecure: true)
|
||||||
|
}
|
||||||
|
.frame(width: 280)
|
||||||
|
|
||||||
|
Button(action: {
|
||||||
|
self.handleRegister()
|
||||||
|
}) {
|
||||||
|
if isProcessing {
|
||||||
|
ProgressView()
|
||||||
|
.controlSize(.small)
|
||||||
|
} else {
|
||||||
|
Text("完成注册")
|
||||||
|
.fontWeight(.medium)
|
||||||
|
.frame(maxWidth: .infinity)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.buttonStyle(.borderedProminent)
|
||||||
|
.controlSize(.large)
|
||||||
|
.frame(width: 280)
|
||||||
|
.disabled(password.isEmpty || password != confirm)
|
||||||
|
|
||||||
|
Spacer()
|
||||||
|
}
|
||||||
|
.padding(40)
|
||||||
|
.alert(isPresented: $showAlert) {
|
||||||
|
Alert(title: Text("提示"), message: Text(errorMessage))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func handleRegister() {
|
||||||
|
self.isProcessing = true
|
||||||
|
Task { @MainActor in
|
||||||
|
if password.isEmpty {
|
||||||
|
self.showAlert = true
|
||||||
|
self.errorMessage = "请输入新密码"
|
||||||
|
self.isProcessing = false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if confirm.isEmpty || confirm != password {
|
||||||
|
self.showAlert = true
|
||||||
|
self.errorMessage = "两次输入的密码不一致"
|
||||||
|
self.isProcessing = false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
let result = try await self.registerModel.register(username: username, password: self.password)
|
||||||
print("send verify code result: \(result)")
|
print("send verify code result: \(result)")
|
||||||
} catch {
|
} catch {
|
||||||
self.showAlert = true
|
self.showAlert = true
|
||||||
self.errorMessage = error.localizedDescription
|
self.errorMessage = error.localizedDescription
|
||||||
}
|
}
|
||||||
|
self.isProcessing = false
|
||||||
case .invalid:
|
|
||||||
self.showAlert = true
|
|
||||||
self.errorMessage = "手机号/邮箱格式错误"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 输入验证码
|
|
||||||
struct RegisterSubmitVerifyCodeView: View {
|
|
||||||
@Environment(RegisterModel.self) var registerModel: RegisterModel
|
|
||||||
|
|
||||||
@State var username: String
|
|
||||||
@State private var verifiyCode: String = ""
|
|
||||||
|
|
||||||
@State private var showAlert = false
|
|
||||||
@State private var errorMessage = ""
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
VStack(spacing: 30) {
|
|
||||||
|
|
||||||
// 标题
|
|
||||||
Text("注册 创建个人网络")
|
|
||||||
.font(.system(size: 18, weight: .medium))
|
|
||||||
|
|
||||||
VStack(alignment: .leading, spacing: 16) {
|
|
||||||
TextField("手机号/邮箱", text: $username)
|
|
||||||
.textFieldStyle(.plain)
|
|
||||||
.frame(width: 260, height: 28)
|
|
||||||
.disabled(true)
|
|
||||||
.overlay(
|
|
||||||
Rectangle()
|
|
||||||
.frame(height: 1)
|
|
||||||
.foregroundColor(.blue),
|
|
||||||
alignment: .bottom
|
|
||||||
)
|
|
||||||
|
|
||||||
HStack {
|
|
||||||
TextField("验证码", text: $verifiyCode)
|
|
||||||
.textFieldStyle(.plain)
|
|
||||||
.frame(width: 260, height: 28)
|
|
||||||
.overlay(
|
|
||||||
Rectangle()
|
|
||||||
.frame(height: 1)
|
|
||||||
.foregroundColor(.blue),
|
|
||||||
alignment: .bottom
|
|
||||||
)
|
|
||||||
Spacer()
|
|
||||||
|
|
||||||
Button {
|
|
||||||
Task { @MainActor in
|
|
||||||
//await self.sendVerifyCode()
|
|
||||||
}
|
|
||||||
} label: {
|
|
||||||
Text("再次获取")
|
|
||||||
.font(.system(size: 14))
|
|
||||||
.foregroundColor(.black)
|
|
||||||
.frame(width: 160, height: 36)
|
|
||||||
.background(Color(red: 74/255, green: 207/255, blue: 154/255))
|
|
||||||
}
|
|
||||||
.frame(width: 160, height: 36)
|
|
||||||
.cornerRadius(6)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Button {
|
|
||||||
Task { @MainActor in
|
|
||||||
await self.submitVerifyCode()
|
|
||||||
withAnimation {
|
|
||||||
self.registerModel.stage = .setPassword(username: self.username)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} label: {
|
|
||||||
Text("设置密码")
|
|
||||||
.font(.system(size: 14))
|
|
||||||
.foregroundColor(.black)
|
|
||||||
.frame(width: 160, height: 36)
|
|
||||||
.background(Color(red: 74/255, green: 207/255, blue: 154/255))
|
|
||||||
}
|
|
||||||
.frame(width: 160, height: 36)
|
|
||||||
.cornerRadius(6)
|
|
||||||
|
|
||||||
Spacer()
|
|
||||||
}
|
|
||||||
.padding(.top, 40)
|
|
||||||
.frame(width: 400, height: 400)
|
|
||||||
.alert(isPresented: $showAlert) {
|
|
||||||
Alert(title: Text("提示"), message: Text(self.errorMessage))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private func submitVerifyCode() async {
|
|
||||||
if verifiyCode.isEmpty {
|
|
||||||
self.showAlert = true
|
|
||||||
self.errorMessage = "请输入验证码"
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if verifiyCode.count != 4 {
|
|
||||||
self.showAlert = true
|
|
||||||
self.errorMessage = "验证码错误"
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
do {
|
|
||||||
let result = try await self.registerModel.submitVerifyCode(username: username, verifyCode: verifiyCode)
|
|
||||||
print("submit verify code result: \(result)")
|
|
||||||
} catch {
|
|
||||||
self.showAlert = true
|
|
||||||
self.errorMessage = error.localizedDescription
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 设置密码
|
// MARK: - 辅助视图
|
||||||
struct RegisterSetPasswordView: View {
|
extension View {
|
||||||
@Environment(RegisterModel.self) var registerModel: RegisterModel
|
|
||||||
var username: String
|
|
||||||
|
|
||||||
@State private var password: String = ""
|
func headerSection(title: String, subtitle: String) -> some View {
|
||||||
@State private var confirmPassword: String = ""
|
VStack(spacing: 8) {
|
||||||
|
Image(systemName: "shield.lefthalf.filled")
|
||||||
@State private var showAlert = false
|
.font(.system(size: 42))
|
||||||
@State private var errorMessage = ""
|
.foregroundStyle(.blue.gradient)
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
VStack(spacing: 30) {
|
|
||||||
|
|
||||||
// 标题
|
Text(title)
|
||||||
Text("注册 创建个人网络")
|
.font(.title2.bold())
|
||||||
.font(.system(size: 18, weight: .medium))
|
|
||||||
|
|
||||||
VStack(alignment: .leading, spacing: 16) {
|
Text(subtitle)
|
||||||
SecureField("新密码", text: $password)
|
.font(.subheadline)
|
||||||
.textFieldStyle(.plain)
|
.foregroundColor(.secondary)
|
||||||
.frame(width: 260, height: 28)
|
.multilineTextAlignment(.center)
|
||||||
.overlay(
|
|
||||||
Rectangle()
|
|
||||||
.frame(height: 1)
|
|
||||||
.foregroundColor(.blue),
|
|
||||||
alignment: .bottom
|
|
||||||
)
|
|
||||||
|
|
||||||
SecureField("再次输入密码", text: $confirmPassword)
|
|
||||||
.textFieldStyle(.plain)
|
|
||||||
.frame(width: 260, height: 28)
|
|
||||||
.overlay(
|
|
||||||
Rectangle()
|
|
||||||
.frame(height: 1)
|
|
||||||
.foregroundColor(.blue),
|
|
||||||
alignment: .bottom
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
Button {
|
|
||||||
Task { @MainActor in
|
|
||||||
await self.resetPassword()
|
|
||||||
}
|
|
||||||
} label: {
|
|
||||||
Text("注册")
|
|
||||||
.font(.system(size: 14))
|
|
||||||
.foregroundColor(.black)
|
|
||||||
.frame(width: 160, height: 36)
|
|
||||||
.background(Color(red: 74/255, green: 207/255, blue: 154/255))
|
|
||||||
}
|
|
||||||
.frame(width: 160, height: 36)
|
|
||||||
.cornerRadius(6)
|
|
||||||
|
|
||||||
Spacer()
|
|
||||||
}
|
|
||||||
.padding(.top, 40)
|
|
||||||
.frame(width: 400, height: 400)
|
|
||||||
.alert(isPresented: $showAlert) {
|
|
||||||
Alert(title: Text("提示"), message: Text(self.errorMessage))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private func resetPassword() async {
|
|
||||||
if password.isEmpty {
|
|
||||||
self.showAlert = true
|
|
||||||
self.errorMessage = "请输入新密码"
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if confirmPassword.isEmpty || confirmPassword != password {
|
|
||||||
self.showAlert = true
|
|
||||||
self.errorMessage = "两次输入的密码不一致"
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
do {
|
|
||||||
let result = try await self.registerModel.register(username: username, password: self.password)
|
|
||||||
print("send verify code result: \(result)")
|
|
||||||
} catch {
|
|
||||||
self.showAlert = true
|
|
||||||
self.errorMessage = error.localizedDescription
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -47,27 +47,9 @@ struct punchnetApp: App {
|
|||||||
|
|
||||||
var body: some Scene {
|
var body: some Scene {
|
||||||
WindowGroup(id: "mainWindow") {
|
WindowGroup(id: "mainWindow") {
|
||||||
RootView()
|
// RootView()
|
||||||
|
RegisterRootView()
|
||||||
.frame(width: 800, height: 500)
|
.frame(width: 800, height: 500)
|
||||||
.onAppear {
|
|
||||||
// // 获取主屏幕的尺寸
|
|
||||||
// guard let screenFrame = NSScreen.main?.frame else {
|
|
||||||
// return
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// // 获取当前应用的窗口(假设只有一个窗口)
|
|
||||||
// NSApplication.shared.windows.forEach { window in
|
|
||||||
// // 计算窗口的中心位置
|
|
||||||
// let windowWidth = window.frame.width
|
|
||||||
// let windowHeight = window.frame.height
|
|
||||||
// let centerX = (screenFrame.width - windowWidth) / 2
|
|
||||||
// let centerY = (screenFrame.height - windowHeight) / 2
|
|
||||||
//
|
|
||||||
// // 设置窗口位置
|
|
||||||
// window.setFrameOrigin(NSPoint(x: centerX, y: centerY))
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
//.toolbar(.hidden)
|
|
||||||
.navigationTitle("")
|
.navigationTitle("")
|
||||||
.environment(self.appContext)
|
.environment(self.appContext)
|
||||||
.environment(self.userContext)
|
.environment(self.userContext)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user