diff --git a/server/MiAssessment/src/MiAssessment.Admin/admin-web/package-lock.json b/server/MiAssessment/src/MiAssessment.Admin/admin-web/package-lock.json index 19a8388..a0a491c 100644 --- a/server/MiAssessment/src/MiAssessment.Admin/admin-web/package-lock.json +++ b/server/MiAssessment/src/MiAssessment.Admin/admin-web/package-lock.json @@ -186,6 +186,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -209,6 +210,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -1053,6 +1055,7 @@ "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", "license": "MIT", + "peer": true, "dependencies": { "@types/lodash": "*" } @@ -1078,6 +1081,7 @@ "resolved": "https://registry.npmjs.org/@uppy/core/-/core-2.3.4.tgz", "integrity": "sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==", "license": "MIT", + "peer": true, "dependencies": { "@transloadit/prettier-bytes": "0.0.7", "@uppy/store-default": "^2.1.1", @@ -1109,6 +1113,7 @@ "resolved": "https://registry.npmjs.org/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz", "integrity": "sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==", "license": "MIT", + "peer": true, "dependencies": { "@uppy/companion-client": "^2.2.2", "@uppy/utils": "^4.1.2", @@ -1509,6 +1514,7 @@ "resolved": "https://registry.npmjs.org/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz", "integrity": "sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==", "license": "MIT", + "peer": true, "dependencies": { "is-url": "^1.2.4" }, @@ -1541,6 +1547,7 @@ "resolved": "https://registry.npmjs.org/@wangeditor/core/-/core-1.1.19.tgz", "integrity": "sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==", "license": "MIT", + "peer": true, "dependencies": { "@types/event-emitter": "^0.3.3", "event-emitter": "^0.3.5", @@ -1571,6 +1578,7 @@ "resolved": "https://registry.npmjs.org/@wangeditor/editor/-/editor-5.1.23.tgz", "integrity": "sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==", "license": "MIT", + "peer": true, "dependencies": { "@uppy/core": "^2.1.1", "@uppy/xhr-upload": "^2.0.3", @@ -1938,6 +1946,7 @@ "resolved": "https://registry.npmjs.org/dom7/-/dom7-3.0.0.tgz", "integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==", "license": "MIT", + "peer": true, "dependencies": { "ssr-window": "^3.0.0-alpha.1" } @@ -1961,6 +1970,7 @@ "resolved": "https://registry.npmjs.org/echarts/-/echarts-6.0.0.tgz", "integrity": "sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "2.3.0", "zrender": "6.0.0" @@ -2479,7 +2489,8 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/is-hotkey/-/is-hotkey-0.2.0.tgz", "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/is-plain-object": { "version": "5.0.0", @@ -2521,6 +2532,7 @@ "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cssstyle": "^4.1.0", "data-urls": "^5.0.0", @@ -2560,13 +2572,15 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lodash-es": { "version": "4.17.22", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.22.tgz", "integrity": "sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lodash-unified": { "version": "1.0.3", @@ -2583,44 +2597,51 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lodash.foreach": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lodash.throttle": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lodash.toarray": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", "integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/loupe": { "version": "3.2.1", @@ -2743,6 +2764,7 @@ } ], "license": "MIT", + "peer": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -2837,6 +2859,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -3041,6 +3064,7 @@ "resolved": "https://registry.npmjs.org/slate/-/slate-0.72.8.tgz", "integrity": "sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==", "license": "MIT", + "peer": true, "dependencies": { "immer": "^9.0.6", "is-plain-object": "^5.0.0", @@ -3064,6 +3088,7 @@ "resolved": "https://registry.npmjs.org/snabbdom/-/snabbdom-3.6.3.tgz", "integrity": "sha512-W2lHLLw2qR2Vv0DcMmcxXqcfdBaIcoN+y/86SmHv8fn4DazEQSH6KN3TjZcWvwujW56OHiiirsbHWZb4vx/0fg==", "license": "MIT", + "peer": true, "engines": { "node": ">=12.17.0" } @@ -3256,6 +3281,7 @@ "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -3270,6 +3296,7 @@ "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -4391,6 +4418,7 @@ "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -4457,6 +4485,7 @@ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.26.tgz", "integrity": "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==", "license": "MIT", + "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.26", "@vue/compiler-sfc": "3.5.26", diff --git a/server/MiAssessment/src/MiAssessment.Api/Controllers/AuthController.cs b/server/MiAssessment/src/MiAssessment.Api/Controllers/AuthController.cs index 5c3a6fb..df4e31d 100644 --- a/server/MiAssessment/src/MiAssessment.Api/Controllers/AuthController.cs +++ b/server/MiAssessment/src/MiAssessment.Api/Controllers/AuthController.cs @@ -54,7 +54,8 @@ public class AuthController : ControllerBase var result = await _authService.WechatMiniProgramLoginAsync( request.Code, request.Pid, - request.ClickId); + request.ClickId, + request.PhoneCode); if (result.Success && result.LoginResponse != null) { diff --git a/server/MiAssessment/src/MiAssessment.Core/Interfaces/IAuthService.cs b/server/MiAssessment/src/MiAssessment.Core/Interfaces/IAuthService.cs index 7ac6066..25efec9 100644 --- a/server/MiAssessment/src/MiAssessment.Core/Interfaces/IAuthService.cs +++ b/server/MiAssessment/src/MiAssessment.Core/Interfaces/IAuthService.cs @@ -3,95 +3,95 @@ using MiAssessment.Model.Models.Auth; namespace MiAssessment.Core.Interfaces; /// -/// 认证服务接口 +/// 锟斤拷证锟斤拷锟斤拷涌锟 /// public interface IAuthService { /// - /// 微信小程序登录 + /// 微锟斤拷小锟斤拷锟斤拷锟铰 /// - /// 微信授权code - /// 推荐人ID - /// 点击ID - /// 登录结果 - Task WechatMiniProgramLoginAsync(string code, int? pid, string? clickId); + /// 微锟斤拷锟斤拷权code + /// 锟狡硷拷锟斤拷ID + /// 锟斤拷锟絀D + /// 锟斤拷录锟斤拷锟 + Task WechatMiniProgramLoginAsync(string code, int? pid, string? clickId, string? phoneCode = null); /// - /// 手机号验证码登录 + /// 锟街伙拷锟斤拷锟斤拷证锟斤拷锟铰 /// - /// 手机号 - /// 短信验证码 - /// 推荐人ID - /// 点击ID - /// 登录结果 + /// 锟街伙拷锟斤拷 + /// 锟斤拷锟斤拷锟斤拷证锟斤拷 + /// 锟狡硷拷锟斤拷ID + /// 锟斤拷锟絀D + /// 锟斤拷录锟斤拷锟 Task MobileLoginAsync(string mobile, string code, int? pid, string? clickId); /// - /// 验证码绑定手机号 + /// 锟斤拷证锟斤拷锟斤拷只锟斤拷锟 /// - /// 用户ID - /// 手机号 - /// 短信验证码 - /// 绑定结果 + /// 锟矫伙拷ID + /// 锟街伙拷锟斤拷 + /// 锟斤拷锟斤拷锟斤拷证锟斤拷 + /// 锟襟定斤拷锟 Task BindMobileAsync(long userId, string mobile, string code); /// - /// 微信授权绑定手机号 + /// 微锟斤拷锟斤拷权锟斤拷锟街伙拷锟斤拷 /// - /// 用户ID - /// 微信授权code - /// 绑定结果 + /// 锟矫伙拷ID + /// 微锟斤拷锟斤拷权code + /// 锟襟定斤拷锟 Task WechatBindMobileAsync(long userId, string wechatCode); /// - /// 记录登录信息 + /// 锟斤拷录锟斤拷录锟斤拷息 /// - /// 用户ID - /// 设备类型 - /// 设备信息 - /// 记录登录响应 + /// 锟矫伙拷ID + /// 锟借备锟斤拷锟斤拷 + /// 锟借备锟斤拷息 + /// 锟斤拷录锟斤拷录锟斤拷应 Task RecordLoginAsync(long userId, string? device, string? deviceInfo); /// - /// 账号注销 + /// 锟剿猴拷注锟斤拷 /// - /// 用户ID - /// 类型:0=注销 1=取消注销 - /// 异步任务 + /// 锟矫伙拷ID + /// 锟斤拷锟酵o拷0=注锟斤拷 1=取锟斤拷注锟斤拷 + /// 锟届步锟斤拷锟斤拷 Task LogOffAsync(long userId, int type); /// - /// H5绑定手机号(无需验证码) + /// H5锟斤拷锟街伙拷锟脚o拷锟斤拷锟斤拷锟斤拷证锟诫) /// - /// 用户ID - /// 手机号 - /// 绑定结果 + /// 锟矫伙拷ID + /// 锟街伙拷锟斤拷 + /// 锟襟定斤拷锟 Task BindMobileH5Async(long userId, string mobile); - #region Refresh Token 相关方法 + #region Refresh Token 锟斤拷胤锟斤拷锟 /// - /// 刷新 Token + /// 刷锟斤拷 Token /// /// Refresh Token - /// 客户端 IP 地址 - /// 刷新结果,包含新的 Access Token 和 Refresh Token + /// 锟酵伙拷锟斤拷 IP 锟斤拷址 + /// 刷锟铰斤拷锟斤拷锟斤拷锟斤拷锟斤拷碌锟 Access Token 锟斤拷 Refresh Token Task RefreshTokenAsync(string refreshToken, string? ipAddress); /// - /// 撤销 Token + /// 锟斤拷锟斤拷 Token /// - /// 要撤销的 Refresh Token - /// 客户端 IP 地址 - /// 异步任务 + /// 要锟斤拷锟斤拷锟斤拷 Refresh Token + /// 锟酵伙拷锟斤拷 IP 锟斤拷址 + /// 锟届步锟斤拷锟斤拷 Task RevokeTokenAsync(string refreshToken, string? ipAddress); /// - /// 撤销用户的所有 Token + /// 锟斤拷锟斤拷锟矫伙拷锟斤拷锟斤拷锟斤拷 Token /// - /// 用户ID - /// 客户端 IP 地址 - /// 异步任务 + /// 锟矫伙拷ID + /// 锟酵伙拷锟斤拷 IP 锟斤拷址 + /// 锟届步锟斤拷锟斤拷 Task RevokeAllUserTokensAsync(long userId, string? ipAddress); #endregion diff --git a/server/MiAssessment/src/MiAssessment.Core/Services/AuthService.cs b/server/MiAssessment/src/MiAssessment.Core/Services/AuthService.cs index 74cd846..4123f7e 100644 --- a/server/MiAssessment/src/MiAssessment.Core/Services/AuthService.cs +++ b/server/MiAssessment/src/MiAssessment.Core/Services/AuthService.cs @@ -60,9 +60,9 @@ public class AuthService : IAuthService /// 微锟斤拷小锟斤拷锟斤拷锟铰 /// Requirements: 1.1-1.8 /// - public async Task WechatMiniProgramLoginAsync(string code, int? pid, string? clickId) + public async Task WechatMiniProgramLoginAsync(string code, int? pid, string? clickId, string? phoneCode = null) { - _logger.LogInformation("[AuthService] 微锟脚碉拷录锟斤拷始锟斤拷code={Code}, pid={Pid}", code, pid); + _logger.LogInformation("[AuthService] 微锟脚碉拷录锟斤拷始锟斤拷code={Code}, pid={Pid}, hasPhoneCode={HasPhoneCode}", code, pid, !string.IsNullOrWhiteSpace(phoneCode)); if (string.IsNullOrWhiteSpace(code)) { @@ -132,10 +132,29 @@ public class AuthService : IAuthService { // 1.3 鏂扮敤鎴凤紝鍒涘缓骞剁粦瀹氫笂绾 _logger.LogInformation("[AuthService] 鐢ㄦ埛涓嶅瓨鍦紝寮濮嬪垱寤烘柊鐢ㄦ埛, pid={Pid}", pid); + + // 閫氳繃 phoneCode 鑾峰彇鎵嬫満鍙 + string? mobile = null; + if (!string.IsNullOrWhiteSpace(phoneCode)) + { + _logger.LogInformation("[AuthService] 寮濮嬮氳繃phoneCode鑾峰彇鎵嬫満鍙"); + var mobileResult = await _wechatService.GetMobileAsync(phoneCode); + if (mobileResult.Success && !string.IsNullOrWhiteSpace(mobileResult.Mobile)) + { + mobile = mobileResult.Mobile; + _logger.LogInformation("[AuthService] 鎵嬫満鍙疯幏鍙栨垚鍔"); + } + else + { + _logger.LogWarning("[AuthService] 鎵嬫満鍙疯幏鍙栧け璐: {Error}", mobileResult.ErrorMessage); + } + } + var createDto = new CreateUserDto { OpenId = openId, UnionId = unionId, + Mobile = mobile, Nickname = await GetDefaultNicknameAsync(), Headimg = await GetDefaultAvatarAsync(openId), Pid = pid ?? 0 @@ -155,6 +174,19 @@ public class AuthService : IAuthService await _userService.UpdateUserAsync(user.Id, new UpdateUserDto { UnionId = unionId }); _logger.LogInformation("[AuthService] unionid鏇存柊鎴愬姛"); } + + // 宸叉湁鐢ㄦ埛濡傛灉娌℃湁鎵嬫満鍙凤紝涔熷皾璇曢氳繃 phoneCode 琛ュ厖 + if (string.IsNullOrWhiteSpace(user.Phone) && !string.IsNullOrWhiteSpace(phoneCode)) + { + _logger.LogInformation("[AuthService] 宸叉湁鐢ㄦ埛缂哄皯鎵嬫満鍙凤紝灏濊瘯閫氳繃phoneCode琛ュ厖"); + var mobileResult = await _wechatService.GetMobileAsync(phoneCode); + if (mobileResult.Success && !string.IsNullOrWhiteSpace(mobileResult.Mobile)) + { + await _userService.UpdateUserAsync(user.Id, new UpdateUserDto { Mobile = mobileResult.Mobile }); + user.Phone = mobileResult.Mobile; + _logger.LogInformation("[AuthService] 鎵嬫満鍙疯ˉ鍏呮垚鍔"); + } + } } // 1.5 锟斤拷锟斤拷双 Token锟斤拷Access Token + Refresh Token锟斤拷 diff --git a/server/MiAssessment/src/MiAssessment.Model/Models/Auth/WechatLoginRequest.cs b/server/MiAssessment/src/MiAssessment.Model/Models/Auth/WechatLoginRequest.cs index daa90b2..a8f58e2 100644 --- a/server/MiAssessment/src/MiAssessment.Model/Models/Auth/WechatLoginRequest.cs +++ b/server/MiAssessment/src/MiAssessment.Model/Models/Auth/WechatLoginRequest.cs @@ -13,6 +13,12 @@ public class WechatLoginRequest [JsonPropertyName("code")] public string Code { get; set; } = string.Empty; + /// + /// 寰俊鑾峰彇鎵嬫満鍙风殑鎺堟潈code + /// + [JsonPropertyName("phoneCode")] + public string? PhoneCode { get; set; } + /// /// 鎺ㄨ崘浜篒D锛堝墠绔彲鑳戒紶绌哄瓧绗︿覆锛屾墍浠ョ敤string鎺ユ敹锛 /// diff --git a/uniapp/manifest.json b/uniapp/manifest.json index b56f978..58eb3ae 100644 --- a/uniapp/manifest.json +++ b/uniapp/manifest.json @@ -1,6 +1,6 @@ { "name" : "瀛︿笟閭戣鍒", - "appid" : "__UNI__1BAACAB", + "appid" : "__UNI__A612028", "description" : "", "versionName" : "1.0.0", "versionCode" : "100", diff --git a/uniapp/pages/assessment/info/index.vue b/uniapp/pages/assessment/info/index.vue index 25eb2bc..712dc17 100644 --- a/uniapp/pages/assessment/info/index.vue +++ b/uniapp/pages/assessment/info/index.vue @@ -543,6 +543,7 @@ onLoad((options) => { class="invite-input" type="text" placeholder="璇疯緭鍏5浣嶉個璇风爜" + placeholder-style="letter-spacing: 0rpx;" :value="inviteCode" @input="onInviteCodeInput" maxlength="5" @@ -947,7 +948,7 @@ onLoad((options) => { font-size: $font-size-lg; color: $text-color; text-align: center; - letter-spacing: 8rpx; + letter-spacing: 16rpx; box-sizing: border-box; }