😎1、调整短线验证码 2、代码优化

This commit is contained in:
zuohuaijun 2024-08-13 00:38:29 +08:00
parent 949b23fb50
commit 78caebebb8
12 changed files with 272 additions and 29 deletions

View File

@ -191,11 +191,8 @@ public class SysAuthService : IDynamicApiController, ITransient
[DisplayName("手机号登录")]
public virtual async Task<LoginOutput> LoginPhone([Required] LoginPhoneInput input)
{
var verifyCode = _sysCacheService.Get<string>($"{CacheConst.KeyPhoneVerCode}{input.Phone}");
if (string.IsNullOrWhiteSpace(verifyCode))
throw Oops.Oh("验证码不存在或已失效,请重新获取!");
if (verifyCode != input.Code)
throw Oops.Oh("验证码错误!");
// 校验短信验证码
App.GetRequiredService<SysSmsService>().VerifyCode(new SmsVerifyCodeInput { Phone = input.Phone, Code = input.Code });
// 账号是否存在
var user = await _sysUserRep.AsQueryable().Includes(u => u.SysOrg).ClearFilter().FirstAsync(u => u.Phone.Equals(input.Phone));

View File

@ -6,7 +6,6 @@
using Aliyun.OSS.Util;
using OnceMi.AspNetCore.OSS;
using System.IO;
namespace Admin.NET.Core.Service;
@ -538,13 +537,13 @@ public class SysFileService : IDynamicApiController, ITransient
".swf" => "application/x-shockwave-flash",
".rss" => "application/rss+xml; charset=ISO-8859-1",
".xml" => "text/xml",
//除了以上类型都允许下载
// 除了以上类型都允许下载
_ => "application/octet-stream",
};
}
}
//为了使用 ControllBase 中的方法,需要继承自 ControllBase 的对象
// 为了使用 ControllBase 中的方法,需要继承自 ControllBase 的对象
internal class FileDownHelper : ControllerBase
{
}

View File

@ -0,0 +1,25 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Core;
public class SmsVerifyCodeInput
{
/// <summary>
/// 手机号码
/// </summary>
/// <example>admin</example>
[Required(ErrorMessage = "手机号码不能为空")]
[DataValidation(ValidationTypes.PhoneNumber, ErrorMessage = "手机号码不正确")]
public string Phone { get; set; }
/// <summary>
/// 验证码
/// </summary>
/// <example>123456</example>
[Required(ErrorMessage = "验证码不能为空"), MinLength(4, ErrorMessage = "验证码不能少于4个字符")]
public string Code { get; set; }
}

View File

@ -43,6 +43,22 @@ public class SysSmsService : IDynamicApiController, ITransient
await TencentSendSms(phoneNumber);
}
/// <summary>
/// 校验短信验证码
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public bool VerifyCode(SmsVerifyCodeInput input)
{
var verifyCode = _sysCacheService.Get<string>($"{CacheConst.KeyPhoneVerCode}{input.Phone}");
if (string.IsNullOrWhiteSpace(verifyCode))
throw Oops.Oh("验证码不存在或已失效,请重新获取!");
if (verifyCode != input.Code)
throw Oops.Oh("验证码错误!");
return true;
}
/// <summary>
/// 阿里云发送短信 📨
/// </summary>

View File

@ -20,6 +20,7 @@ import { BASE_PATH, COLLECTION_FORMATS, RequestArgs, BaseAPI, RequiredError } fr
import { AddRoleInput } from '../models';
import { AdminResultInt32 } from '../models';
import { AdminResultListInt64 } from '../models';
import { AdminResultListListString } from '../models';
import { AdminResultListRoleOutput } from '../models';
import { AdminResultListString } from '../models';
import { AdminResultSqlSugarPagedListPageRoleOutput } from '../models';
@ -135,7 +136,7 @@ export const SysRoleApiAxiosParamCreator = function (configuration?: Configurati
},
/**
*
* @summary 🔖
* @summary 🔖
* @param {RoleApiInput} [body]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
@ -484,7 +485,7 @@ export const SysRoleApiAxiosParamCreator = function (configuration?: Configurati
},
/**
*
* @summary 🔖
* @summary 🔖
* @param {number} id Id
* @param {StatusEnum} [status]
* @param {*} [options] Override http request option.
@ -637,7 +638,7 @@ export const SysRoleApiAxiosParamCreator = function (configuration?: Configurati
},
/**
*
* @summary 🔖
* @summary 🔖
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
@ -717,7 +718,7 @@ export const SysRoleApiFp = function(configuration?: Configuration) {
},
/**
*
* @summary 🔖
* @summary 🔖
* @param {RoleApiInput} [body]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
@ -816,7 +817,7 @@ export const SysRoleApiFp = function(configuration?: Configuration) {
},
/**
*
* @summary 🔖
* @summary 🔖
* @param {number} id Id
* @param {StatusEnum} [status]
* @param {*} [options] Override http request option.
@ -859,11 +860,11 @@ export const SysRoleApiFp = function(configuration?: Configuration) {
},
/**
*
* @summary 🔖
* @summary 🔖
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async apiSysRoleUserApiListGet(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultListString>>> {
async apiSysRoleUserApiListGet(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultListListString>>> {
const localVarAxiosArgs = await SysRoleApiAxiosParamCreator(configuration).apiSysRoleUserApiListGet(options);
return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
@ -901,7 +902,7 @@ export const SysRoleApiFactory = function (configuration?: Configuration, basePa
},
/**
*
* @summary 🔖
* @summary 🔖
* @param {RoleApiInput} [body]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
@ -972,7 +973,7 @@ export const SysRoleApiFactory = function (configuration?: Configuration, basePa
},
/**
*
* @summary 🔖
* @summary 🔖
* @param {number} id Id
* @param {StatusEnum} [status]
* @param {*} [options] Override http request option.
@ -1003,11 +1004,11 @@ export const SysRoleApiFactory = function (configuration?: Configuration, basePa
},
/**
*
* @summary 🔖
* @summary 🔖
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async apiSysRoleUserApiListGet(options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultListString>> {
async apiSysRoleUserApiListGet(options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultListListString>> {
return SysRoleApiFp(configuration).apiSysRoleUserApiListGet(options).then((request) => request(axios, basePath));
},
};
@ -1044,7 +1045,7 @@ export class SysRoleApi extends BaseAPI {
}
/**
*
* @summary 🔖
* @summary 🔖
* @param {RoleApiInput} [body]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
@ -1122,7 +1123,7 @@ export class SysRoleApi extends BaseAPI {
}
/**
*
* @summary 🔖
* @summary 🔖
* @param {number} id Id
* @param {StatusEnum} [status]
* @param {*} [options] Override http request option.
@ -1156,12 +1157,12 @@ export class SysRoleApi extends BaseAPI {
}
/**
*
* @summary 🔖
* @summary 🔖
* @param {*} [options] Override http request option.
* @throws {RequiredError}
* @memberof SysRoleApi
*/
public async apiSysRoleUserApiListGet(options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultListString>> {
public async apiSysRoleUserApiListGet(options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultListListString>> {
return SysRoleApiFp(this.configuration).apiSysRoleUserApiListGet(options).then((request) => request(this.axios, this.basePath));
}
}

View File

@ -17,6 +17,8 @@ import { Configuration } from '../configuration';
// Some imports not used depending on template conditions
// @ts-ignore
import { BASE_PATH, COLLECTION_FORMATS, RequestArgs, BaseAPI, RequiredError } from '../base';
import { AdminResultBoolean } from '../models';
import { SmsVerifyCodeInput } from '../models';
/**
* SysSmsApi - axios parameter creator
* @export
@ -223,6 +225,54 @@ export const SysSmsApiAxiosParamCreator = function (configuration?: Configuratio
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
return {
url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
options: localVarRequestOptions,
};
},
/**
*
* @summary
* @param {SmsVerifyCodeInput} [body]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
apiSysSmsVerifyCodePost: async (body?: SmsVerifyCodeInput, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/api/sysSms/verifyCode`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, 'https://example.com');
let baseOptions;
if (configuration) {
baseOptions = configuration.baseOptions;
}
const localVarRequestOptions :AxiosRequestConfig = { method: 'POST', ...baseOptions, ...options};
const localVarHeaderParameter = {} as any;
const localVarQueryParameter = {} as any;
// authentication Bearer required
// http bearer authentication required
if (configuration && configuration.accessToken) {
const accessToken = typeof configuration.accessToken === 'function'
? await configuration.accessToken()
: await configuration.accessToken;
localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
}
localVarHeaderParameter['Content-Type'] = 'application/json-patch+json';
const query = new URLSearchParams(localVarUrlObj.search);
for (const key in localVarQueryParameter) {
query.set(key, localVarQueryParameter[key]);
}
for (const key in options.params) {
query.set(key, options.params[key]);
}
localVarUrlObj.search = (new URLSearchParams(query)).toString();
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json';
localVarRequestOptions.data = needsSerialization ? JSON.stringify(body !== undefined ? body : {}) : (body || "");
return {
url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
options: localVarRequestOptions,
@ -294,6 +344,20 @@ export const SysSmsApiFp = function(configuration?: Configuration) {
return axios.request(axiosRequestArgs);
};
},
/**
*
* @summary
* @param {SmsVerifyCodeInput} [body]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async apiSysSmsVerifyCodePost(body?: SmsVerifyCodeInput, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultBoolean>>> {
const localVarAxiosArgs = await SysSmsApiAxiosParamCreator(configuration).apiSysSmsVerifyCodePost(body, options);
return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
return axios.request(axiosRequestArgs);
};
},
}
};
@ -344,6 +408,16 @@ export const SysSmsApiFactory = function (configuration?: Configuration, basePat
async apiSysSmsTencentSendSmsPhoneNumberPost(phoneNumber: string, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
return SysSmsApiFp(configuration).apiSysSmsTencentSendSmsPhoneNumberPost(phoneNumber, options).then((request) => request(axios, basePath));
},
/**
*
* @summary
* @param {SmsVerifyCodeInput} [body]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async apiSysSmsVerifyCodePost(body?: SmsVerifyCodeInput, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultBoolean>> {
return SysSmsApiFp(configuration).apiSysSmsVerifyCodePost(body, options).then((request) => request(axios, basePath));
},
};
};
@ -399,4 +473,15 @@ export class SysSmsApi extends BaseAPI {
public async apiSysSmsTencentSendSmsPhoneNumberPost(phoneNumber: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
return SysSmsApiFp(this.configuration).apiSysSmsTencentSendSmsPhoneNumberPost(phoneNumber, options).then((request) => request(this.axios, this.basePath));
}
/**
*
* @summary
* @param {SmsVerifyCodeInput} [body]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
* @memberof SysSmsApi
*/
public async apiSysSmsVerifyCodePost(body?: SmsVerifyCodeInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultBoolean>> {
return SysSmsApiFp(this.configuration).apiSysSmsVerifyCodePost(body, options).then((request) => request(this.axios, this.basePath));
}
}

View File

@ -0,0 +1,70 @@
/* tslint:disable */
/* eslint-disable */
/**
* Admin.NET
* .NET <br/><u><b><font color='FF0000'> 👮</font></b></u>
*
* OpenAPI spec version: 1.0.0
*
*
* NOTE: This class is auto generated by the swagger code generator program.
* https://github.com/swagger-api/swagger-codegen.git
* Do not edit the class manually.
*/
/**
*
*
* @export
* @interface AdminResultListListString
*/
export interface AdminResultListListString {
/**
*
*
* @type {number}
* @memberof AdminResultListListString
*/
code?: number;
/**
* successwarningerror
*
* @type {string}
* @memberof AdminResultListListString
*/
type?: string | null;
/**
*
*
* @type {string}
* @memberof AdminResultListListString
*/
message?: string | null;
/**
*
*
* @type {Array<Array<string>>}
* @memberof AdminResultListListString
*/
result?: Array<Array<string>> | null;
/**
*
*
* @type {any}
* @memberof AdminResultListListString
*/
extras?: any | null;
/**
*
*
* @type {Date}
* @memberof AdminResultListListString
*/
time?: Date;
}

View File

@ -41,6 +41,7 @@ export * from './admin-result-list-enum-entity';
export * from './admin-result-list-enum-type-output';
export * from './admin-result-list-file-output';
export * from './admin-result-list-int64';
export * from './admin-result-list-list-string';
export * from './admin-result-list-log-vis-output';
export * from './admin-result-list-menu-output';
export * from './admin-result-list-pos-output';
@ -297,6 +298,7 @@ export * from './send-subscribe-message-input';
export * from './serialization-format';
export * from './signature-input';
export * from './sm-key-pair-output';
export * from './sms-verify-code-input';
export * from './sort-version';
export * from './sql-sugar-paged-list-job-detail-output';
export * from './sql-sugar-paged-list-oauth-user-output';

View File

@ -13,7 +13,7 @@
*/
/**
*
*
*
* @export
* @interface RoleApiInput

View File

@ -0,0 +1,40 @@
/* tslint:disable */
/* eslint-disable */
/**
* Admin.NET
* .NET <br/><u><b><font color='FF0000'> 👮</font></b></u>
*
* OpenAPI spec version: 1.0.0
*
*
* NOTE: This class is auto generated by the swagger code generator program.
* https://github.com/swagger-api/swagger-codegen.git
* Do not edit the class manually.
*/
/**
*
*
* @export
* @interface SmsVerifyCodeInput
*/
export interface SmsVerifyCodeInput {
/**
*
*
* @type {string}
* @memberof SmsVerifyCodeInput
* @example admin
*/
phone: string;
/**
*
*
* @type {string}
* @memberof SmsVerifyCodeInput
* @example 123456
*/
code: string;
}

View File

@ -106,4 +106,12 @@ export interface SysOnlineUser {
* @memberof SysOnlineUser
*/
loginMode?: LoginModeEnum;
/**
*
*
* @type {string}
* @memberof SysOnlineUser
*/
device?: string | null;
}

View File

@ -75,7 +75,7 @@
<!-- <el-dropdown-item command="/dashboard/home">{{ $t('message.user.dropdown1') }}</el-dropdown-item> -->
<el-dropdown-item :icon="Avatar" command="/system/userCenter">{{ $t('message.user.dropdown2') }}</el-dropdown-item>
<el-dropdown-item :icon="Loading" command="clearCache">{{ $t('message.user.dropdown3') }}</el-dropdown-item>
<el-dropdown-item :icon="Guide" divided command="logOut">{{ $t('message.user.dropdown5') }}</el-dropdown-item>
<el-dropdown-item :icon="CircleCloseFilled" divided command="logOut">{{ $t('message.user.dropdown5') }}</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
@ -85,7 +85,7 @@
</template>
<script setup lang="ts" name="layoutBreadcrumbUser">
import { defineAsyncComponent, ref, computed, reactive, onMounted, onUnmounted } from 'vue';
import { defineAsyncComponent, ref, computed, reactive, onMounted } from 'vue';
import { useRouter } from 'vue-router';
import { ElMessageBox, ElMessage, ElNotification } from 'element-plus';
import screenfull from 'screenfull';
@ -98,7 +98,7 @@ import mittBus from '/@/utils/mitt';
import { Local, Session } from '/@/utils/storage';
import Push from 'push.js';
import { signalR } from '/@/views/system/onlineUser/signalR';
import { Avatar, Guide, Loading } from '@element-plus/icons-vue';
import { Avatar, CircleCloseFilled, Loading } from '@element-plus/icons-vue';
import { clearAccessTokens, getAPI } from '/@/utils/axios-utils';
import { SysAuthApi, SysNoticeApi } from '/@/api-services/api';