feat: 登录验证码
This commit is contained in:
parent
a298594cf8
commit
ca8111dab0
|
@ -1,8 +1,12 @@
|
|||
# 代码中使用 process.env.OSS_SECRET
|
||||
OSS_SECRET=12345
|
||||
|
||||
|
||||
# 腾讯vod
|
||||
SECRET_ID=AKID534tZ7OvYzb2KQMwLYaVEl5FBwUtQWbU
|
||||
SECRET_KEY=q9HD6lQimeLp9IH5h7NRJzUpNjwxmPq5
|
||||
SUBAPPID=1500018521
|
||||
SUBAPPID_OSS=1500018944
|
||||
|
||||
# 阿里sms
|
||||
ACCESSKEY_ID=LTAIlHbKxMELdAM0
|
||||
ACCESSKEY_SECRET=xLG8tBAMdUG8hVITgZEgl6lAgKamzC
|
|
@ -26,7 +26,11 @@
|
|||
"jsonwebtoken": "9.0.0",
|
||||
"tencentcloud-sdk-nodejs": "4.0.552",
|
||||
"vod-node-sdk": "1.1.0",
|
||||
"chinese-random-name": "2.0.0"
|
||||
"@alicloud/dysmsapi20170525": "2.0.23",
|
||||
"@alicloud/openapi-client": "0.4.5",
|
||||
"@alicloud/tea-util": "1.4.5",
|
||||
"@alicloud/tea-typescript": "1.8.0",
|
||||
"object-hash": "3.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@midwayjs/cli": "^2.0.0",
|
||||
|
|
|
@ -4,4 +4,4 @@ export const adminSign = '_sign_admin';
|
|||
export const adminSignExpired = 60 * 1000 * 10; // 10分钟
|
||||
|
||||
export const webSign = '_sign_web';
|
||||
export const webSignExpired = 60 * 1000 * 10; // 10分钟
|
||||
export const webSignExpired = 60 * 1000 * 100; // 10分钟
|
||||
|
|
|
@ -3,5 +3,6 @@ import { globalPrefix } from './base.config';
|
|||
export const whiteApis = [
|
||||
'/user/admin/auth',
|
||||
'/user/web/auth',
|
||||
'/user/web/sms',
|
||||
'/course/select/all',
|
||||
].map(api => globalPrefix + api);
|
||||
|
|
|
@ -10,7 +10,10 @@ import {
|
|||
import { UserAdminAuthDTO, UserWebAuthDTO } from '../dto/user.dto';
|
||||
import { XCodeService } from '../service/xcode.service';
|
||||
import { UserService } from '../service/user.service';
|
||||
import { createToken, decodeToken, md5 } from '../util/encrypt';
|
||||
import { createToken, decodeToken } from '../util/encrypt';
|
||||
import { SmsService } from '../service/sms.service';
|
||||
import { SmsDTO } from '../dto/sms.dto';
|
||||
import { RedisService } from '@midwayjs/redis';
|
||||
|
||||
@Controller('/user')
|
||||
export class UserController {
|
||||
|
@ -23,54 +26,44 @@ export class UserController {
|
|||
@Inject()
|
||||
xcodeService: XCodeService;
|
||||
|
||||
@Inject()
|
||||
smsService: SmsService;
|
||||
|
||||
@Inject()
|
||||
redisService: RedisService;
|
||||
|
||||
/**
|
||||
* 用户前台登录
|
||||
*/
|
||||
@Post('/web/auth')
|
||||
async webAuth(@Body() params: UserWebAuthDTO) {
|
||||
try {
|
||||
const verifyCode = await this.redisService.get('' + params.user_login);
|
||||
if (!verifyCode) return { code: BizCode.ERROR, msg: '验证码无效' };
|
||||
// 查询用户是否存在
|
||||
const userExist = await this.userService.select(params);
|
||||
let payload = {};
|
||||
if (userExist?.id) {
|
||||
const { user_pass, ...rest } = userExist;
|
||||
const passValid = userExist.user_pass === md5(params.user_pass);
|
||||
const token = createToken({ ...rest, hasLogin: true });
|
||||
if (passValid) {
|
||||
this.ctx.cookies.set(webSign, token, {
|
||||
expires: new Date(Date.now() + webSignExpired),
|
||||
httpOnly: false,
|
||||
});
|
||||
return {
|
||||
code: BizCode.OK,
|
||||
msg: '欢迎回来',
|
||||
data: { ...rest },
|
||||
};
|
||||
} else {
|
||||
return { code: BizCode.ERROR, msg: '密码错误' };
|
||||
}
|
||||
payload = rest;
|
||||
} else {
|
||||
// 新用户注册
|
||||
// 1. 验证邀请码
|
||||
const { xcode } = params;
|
||||
const xcodeValid = await this.xcodeService.valid(xcode);
|
||||
if (!xcodeValid)
|
||||
return { code: BizCode.ERROR, msg: '新用户注册,请填写神秘代码哦!~' };
|
||||
// 2. 创建用户
|
||||
const createUser = await this.userService.createUser(params);
|
||||
const { user_pass, ...rest } = createUser;
|
||||
// 3. 邀请码表绑定用户
|
||||
await this.xcodeService.use(xcode, rest.id);
|
||||
|
||||
const token = createToken({ ...rest, hasLogin: true });
|
||||
const { user_pass, ...rest } = await this.userService.createUser(
|
||||
params
|
||||
);
|
||||
payload = rest;
|
||||
}
|
||||
const token = createToken({ ...payload, hasLogin: true });
|
||||
this.ctx.cookies.set(webSign, token, {
|
||||
expires: new Date(Date.now() + webSignExpired),
|
||||
httpOnly: false,
|
||||
});
|
||||
await this.redisService.del('' + params.user_login);
|
||||
return {
|
||||
code: BizCode.OK,
|
||||
data: { ...rest },
|
||||
msg: '欢迎来到 backset.cn,' + rest.display_name,
|
||||
msg: '欢迎来到 backset.cn',
|
||||
data: { ...payload },
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
this.ctx.logger.error(error);
|
||||
return { code: BizCode.ERROR, msg: '[error] web/auth error' };
|
||||
|
@ -96,7 +89,7 @@ export class UserController {
|
|||
}
|
||||
|
||||
@Get('/web/state')
|
||||
async() {
|
||||
async state() {
|
||||
try {
|
||||
const token = this.ctx.cookies.get(webSign);
|
||||
const user = decodeToken(token);
|
||||
|
@ -106,4 +99,21 @@ export class UserController {
|
|||
return { code: BizCode.ERROR, msg: '[error] /web/state error' };
|
||||
}
|
||||
}
|
||||
|
||||
@Post('/web/sms')
|
||||
async verifyCode(@Body() params: SmsDTO) {
|
||||
try {
|
||||
const { phoneNumber: phoneNumbers } = params;
|
||||
const code = Math.floor(Math.random() * 9000 + 1000);
|
||||
await this.redisService.set('' + phoneNumbers, code, 'EX', 60);
|
||||
console.log('redis here');
|
||||
await this.smsService.send({ code, phoneNumbers });
|
||||
console.log('sms here');
|
||||
return { code: BizCode.OK };
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
this.ctx.logger.error(error);
|
||||
return { code: BizCode.ERROR, msg: '[error] /web/sms error' };
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
8
apps/server/src/dto/sms.dto.ts
Normal file
8
apps/server/src/dto/sms.dto.ts
Normal file
|
@ -0,0 +1,8 @@
|
|||
import { Rule, RuleType } from '@midwayjs/validate';
|
||||
|
||||
export class SmsDTO {
|
||||
@Rule(
|
||||
RuleType.string().required().length(11).error(new Error('手机号格式错误'))
|
||||
)
|
||||
phoneNumber?: string | number;
|
||||
}
|
|
@ -7,7 +7,7 @@ export class UserWebAuthDTO {
|
|||
)
|
||||
user_login: string;
|
||||
|
||||
@Rule(RuleType.string().required().min(6).error(new Error('密码长度至少6位')))
|
||||
@Rule(RuleType.string().required().min(4).error(new Error('验证码4位数字')))
|
||||
user_pass: string;
|
||||
|
||||
@Rule(RuleType.string().allow(''))
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
|
||||
const randomName = require('chinese-random-name');
|
||||
|
||||
@Entity('user')
|
||||
export class User {
|
||||
|
@ -21,6 +20,9 @@ export class User {
|
|||
@Column({ default: true })
|
||||
user_status?: boolean;
|
||||
|
||||
@Column({ default: randomName.generate() })
|
||||
@Column({ default: '用户' + Date.now() })
|
||||
display_name?: string;
|
||||
|
||||
@Column({ default: '' })
|
||||
user_avatar?: string;
|
||||
}
|
||||
|
|
47
apps/server/src/service/sms.service.ts
Normal file
47
apps/server/src/service/sms.service.ts
Normal file
|
@ -0,0 +1,47 @@
|
|||
// This file is auto-generated, don't edit it
|
||||
import Dysmsapi20170525, * as $Dysmsapi20170525 from '@alicloud/dysmsapi20170525';
|
||||
// 依赖的模块可通过下载工程中的模块依赖文件或右上角的获取 SDK 依赖信息查看
|
||||
import * as $OpenApi from '@alicloud/openapi-client';
|
||||
import Util, * as $Util from '@alicloud/tea-util';
|
||||
import { Context, Inject, Provide } from '@midwayjs/core';
|
||||
|
||||
@Provide()
|
||||
export class SmsService {
|
||||
@Inject()
|
||||
ctx: Context;
|
||||
|
||||
/**
|
||||
* 使用AK&SK初始化账号Client
|
||||
* @param accessKeyId
|
||||
* @param accessKeySecret
|
||||
* @return Client
|
||||
* @throws Exception
|
||||
*/
|
||||
createClient(accessKeyId: string, accessKeySecret: string): Dysmsapi20170525 {
|
||||
const config = new $OpenApi.Config({ accessKeyId, accessKeySecret });
|
||||
// 访问的域名
|
||||
config.endpoint = `dysmsapi.aliyuncs.com`;
|
||||
return new Dysmsapi20170525(config);
|
||||
}
|
||||
|
||||
async send({ code, phoneNumbers }): Promise<void> {
|
||||
// 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378664.html
|
||||
const client = this.createClient(
|
||||
process.env['ACCESSKEY_ID'],
|
||||
process.env['ACCESSKEY_SECRET']
|
||||
);
|
||||
const sendSmsRequest = new $Dysmsapi20170525.SendSmsRequest({
|
||||
phoneNumbers: phoneNumbers,
|
||||
signName: '寻鹿网',
|
||||
templateCode: 'SMS_186510297',
|
||||
templateParam: `{"code":"${code}"}`,
|
||||
});
|
||||
const runtime = new $Util.RuntimeOptions({});
|
||||
try {
|
||||
// 复制代码运行请自行打印 API 的返回值
|
||||
await client.sendSmsWithOptions(sendSmsRequest, runtime);
|
||||
} catch (error) {
|
||||
throw new Error(Util.assertAsString(error.message));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -3,14 +3,14 @@ import { InjectEntityModel } from '@midwayjs/typeorm';
|
|||
import { Repository } from 'typeorm';
|
||||
import { UserWebAuthDTO } from '../dto/user.dto';
|
||||
import { User } from '../entity/user.entity';
|
||||
import { md5 } from '../util/encrypt';
|
||||
import hash from 'object-hash';
|
||||
|
||||
@Provide()
|
||||
export class UserService {
|
||||
@InjectEntityModel(User)
|
||||
userModel: Repository<User>;
|
||||
|
||||
async select(p: UserWebAuthDTO): Promise<User> {
|
||||
async select(p: UserWebAuthDTO): Promise<any> {
|
||||
const { user_login } = p;
|
||||
const user = await this.userModel.findOne({
|
||||
where: { user_login },
|
||||
|
@ -19,7 +19,9 @@ export class UserService {
|
|||
}
|
||||
|
||||
async createUser(user: User) {
|
||||
user.user_pass = md5(user.user_pass);
|
||||
const h = hash('' + user.user_login);
|
||||
user.display_name = h.substring(0, 8);
|
||||
user.user_avatar = h;
|
||||
const result = await this.userModel.save(user);
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -17,7 +17,8 @@
|
|||
"@ricons/fluent": "0.12.0",
|
||||
"@ricons/utils": "0.1.6",
|
||||
"dplayer": "1.27.1",
|
||||
"highlight.js": "11.7.0"
|
||||
"highlight.js": "11.7.0",
|
||||
"identicon.js": "2.3.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/react": "^18.0.27",
|
||||
|
|
1
apps/web/public/vip1.svg
Normal file
1
apps/web/public/vip1.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1678946653359" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7954" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M849.2 6.3H174.8C81.7 6.3 6.3 81.7 6.3 174.8v674.3c0 93.1 75.4 168.6 168.6 168.6h674.3c93.1 0 168.6-75.4 168.6-168.6V175c0-93.1-75.5-168.7-168.6-168.7z m-81 632.8l7.9-44.9 47.3-30.5h42.2l-52 295h-42.2l44.1-250.3-47.3 30.7z m104.7-385.2v44h-42.7l-536.6 552h-159V297.3l-39.8-0.6v-42.8h158.9v401.2l397.4-401.2h221.8z" p-id="7955"></path></svg>
|
After Width: | Height: | Size: 673 B |
1
apps/web/public/vip2.svg
Normal file
1
apps/web/public/vip2.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1678946665062" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8117" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M849.2 6.3H174.8C81.7 6.3 6.3 81.7 6.3 174.8v674.3c0 93.1 75.4 168.6 168.6 168.6h674.3c93.1 0 168.6-75.4 168.6-168.6V175c0-93.1-75.5-168.7-168.6-168.7z m23.7 247.6v44h-42.7l-536.6 552h-159V297.3l-39.8-0.6v-42.8h158.9v401.2l397.4-401.2h221.8zM711.4 818.8l140.5-144.1c5.4-5.8 9.5-11.2 12-16.2 1.9-4.7 3.2-9.1 4-13.3 2-11.1 0.2-20.7-5.2-28.9-5.7-8.3-15.1-12.5-28.2-12.7-11.6 0-21.9 3.7-30.9 11.1-9.3 7.4-15.8 17.9-19.6 31.4h-42.1c5.4-24.6 17.2-44.8 35.4-60.9 18.3-15.7 38.8-23.6 61.5-23.8 25.3 0.2 44.5 8.4 57.4 24.3 13.2 15.8 17.9 35.8 13.8 60.1-3.5 19.4-12.3 36.7-26.9 51.7L767.3 816.4H880l-7.4 42.2H704.3l7.1-39.8z" p-id="8118"></path></svg>
|
After Width: | Height: | Size: 974 B |
1
apps/web/public/vip3.svg
Normal file
1
apps/web/public/vip3.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1678946668408" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8280" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M849.2 6.3H174.8C81.7 6.3 6.3 81.7 6.3 174.8v674.3c0 93.1 75.4 168.6 168.6 168.6h674.3c93.1 0 168.6-75.4 168.6-168.6V175c0-93.1-75.5-168.7-168.6-168.7z m23.7 247.6v44h-42.7l-536.6 552h-159V297.3l-39.8-0.6v-42.8h158.9v401.2l397.4-401.2h221.8z m-78.9 434h14.6c14.4 0 26.3-4 35.7-12 9.3-7.7 15.1-17.7 17.2-29.9 2-12.3-0.4-22.6-6.9-30.5-6.5-7.7-16.2-11.6-28.6-12-9 0-17.8 3-26.2 8.6-8.9 5.8-15.7 14.8-20.5 26.9h-42.2c6.1-21.9 18.2-40.3 36.3-55.2 17.9-14.8 37.4-22.3 58.7-22.7 26.8 0.2 46.6 8.9 59.4 25.7 12.2 16.4 16.4 35.9 12.8 58.3-2 11.4-5.9 22.2-11.9 32.7-6.5 10.5-16.7 19.9-30.3 28.2 11 8.1 18.3 17.8 21.7 29.1 3.2 11.4 3.8 23.2 1.6 35.6-5.2 27.7-17.5 49.4-37.2 65.3-19.5 16.3-42.2 24.6-68.3 24.9-20.1 0-36.8-6.4-50-19.4-13.2-13-20-31.7-20.3-56.3h42.2c2.1 9.9 5.9 17.8 11.7 23.8 5.9 6.3 14.7 9.5 26.3 9.5 12.3 0 23.6-4.2 33.6-12.7 10-7.9 16.4-19.3 19.4-34 2.3-14.9 0-26.5-7.2-34.8-7-7.9-17.2-12-30.3-12h-17.8l6.5-37.1z" p-id="8281"></path></svg>
|
After Width: | Height: | Size: 1.2 KiB |
|
@ -1,5 +1,5 @@
|
|||
export interface ILoginRequest {
|
||||
user_login: string;
|
||||
user_pass: string;
|
||||
xcode: string;
|
||||
// xcode: string;
|
||||
}
|
||||
|
|
|
@ -10,3 +10,6 @@ export const userLogin = (p: ILoginRequest) =>
|
|||
R.post("/api/user/web/auth", { ...p });
|
||||
|
||||
export const userState = () => R.get("/api/user/web/state");
|
||||
|
||||
export const sms = (phoneNumber: string | number) =>
|
||||
R.post("/api/user/web/sms", { phoneNumber });
|
||||
|
|
|
@ -53,7 +53,7 @@ header {
|
|||
.end {
|
||||
text-align: right;
|
||||
|
||||
span {
|
||||
.btn {
|
||||
cursor: pointer;
|
||||
margin-left: 32px;
|
||||
|
||||
|
@ -61,6 +61,12 @@ header {
|
|||
color: #fff;
|
||||
}
|
||||
}
|
||||
.user {
|
||||
font-size: 12px;
|
||||
> div {
|
||||
line-height: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,14 +1,78 @@
|
|||
import "./index.less";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
import { menuRouters } from "../../router";
|
||||
import { Input } from "@arco-design/web-react";
|
||||
import { useUserStore } from "../../store/user.store";
|
||||
import {
|
||||
Avatar,
|
||||
Button,
|
||||
Dropdown,
|
||||
Link,
|
||||
Menu,
|
||||
Space,
|
||||
Tooltip,
|
||||
} from "@arco-design/web-react";
|
||||
import {
|
||||
IconDown,
|
||||
IconImport,
|
||||
IconSettings,
|
||||
} from "@arco-design/web-react/icon";
|
||||
import Identicon from "identicon.js";
|
||||
|
||||
const vip1 = (
|
||||
<svg viewBox="0 0 1024 1024" width="20" height="20" fill="currentColor">
|
||||
<path d="M849.2 6.3H174.8C81.7 6.3 6.3 81.7 6.3 174.8v674.3c0 93.1 75.4 168.6 168.6 168.6h674.3c93.1 0 168.6-75.4 168.6-168.6V175c0-93.1-75.5-168.7-168.6-168.7z m-81 632.8l7.9-44.9 47.3-30.5h42.2l-52 295h-42.2l44.1-250.3-47.3 30.7z m104.7-385.2v44h-42.7l-536.6 552h-159V297.3l-39.8-0.6v-42.8h158.9v401.2l397.4-401.2h221.8z"></path>
|
||||
</svg>
|
||||
);
|
||||
|
||||
const vip2 = (
|
||||
<svg viewBox="0 0 1024 1024" width="20" height="20" fill="currentColor">
|
||||
<path d="M849.2 6.3H174.8C81.7 6.3 6.3 81.7 6.3 174.8v674.3c0 93.1 75.4 168.6 168.6 168.6h674.3c93.1 0 168.6-75.4 168.6-168.6V175c0-93.1-75.5-168.7-168.6-168.7z m23.7 247.6v44h-42.7l-536.6 552h-159V297.3l-39.8-0.6v-42.8h158.9v401.2l397.4-401.2h221.8zM711.4 818.8l140.5-144.1c5.4-5.8 9.5-11.2 12-16.2 1.9-4.7 3.2-9.1 4-13.3 2-11.1 0.2-20.7-5.2-28.9-5.7-8.3-15.1-12.5-28.2-12.7-11.6 0-21.9 3.7-30.9 11.1-9.3 7.4-15.8 17.9-19.6 31.4h-42.1c5.4-24.6 17.2-44.8 35.4-60.9 18.3-15.7 38.8-23.6 61.5-23.8 25.3 0.2 44.5 8.4 57.4 24.3 13.2 15.8 17.9 35.8 13.8 60.1-3.5 19.4-12.3 36.7-26.9 51.7L767.3 816.4H880l-7.4 42.2H704.3l7.1-39.8z"></path>
|
||||
</svg>
|
||||
);
|
||||
|
||||
const vip3 = (
|
||||
<svg viewBox="0 0 1024 1024" width="20" height="20" fill="currentColor">
|
||||
<path d="M849.2 6.3H174.8C81.7 6.3 6.3 81.7 6.3 174.8v674.3c0 93.1 75.4 168.6 168.6 168.6h674.3c93.1 0 168.6-75.4 168.6-168.6V175c0-93.1-75.5-168.7-168.6-168.7z m23.7 247.6v44h-42.7l-536.6 552h-159V297.3l-39.8-0.6v-42.8h158.9v401.2l397.4-401.2h221.8z m-78.9 434h14.6c14.4 0 26.3-4 35.7-12 9.3-7.7 15.1-17.7 17.2-29.9 2-12.3-0.4-22.6-6.9-30.5-6.5-7.7-16.2-11.6-28.6-12-9 0-17.8 3-26.2 8.6-8.9 5.8-15.7 14.8-20.5 26.9h-42.2c6.1-21.9 18.2-40.3 36.3-55.2 17.9-14.8 37.4-22.3 58.7-22.7 26.8 0.2 46.6 8.9 59.4 25.7 12.2 16.4 16.4 35.9 12.8 58.3-2 11.4-5.9 22.2-11.9 32.7-6.5 10.5-16.7 19.9-30.3 28.2 11 8.1 18.3 17.8 21.7 29.1 3.2 11.4 3.8 23.2 1.6 35.6-5.2 27.7-17.5 49.4-37.2 65.3-19.5 16.3-42.2 24.6-68.3 24.9-20.1 0-36.8-6.4-50-19.4-13.2-13-20-31.7-20.3-56.3h42.2c2.1 9.9 5.9 17.8 11.7 23.8 5.9 6.3 14.7 9.5 26.3 9.5 12.3 0 23.6-4.2 33.6-12.7 10-7.9 16.4-19.3 19.4-34 2.3-14.9 0-26.5-7.2-34.8-7-7.9-17.2-12-30.3-12h-17.8l6.5-37.1z"></path>
|
||||
</svg>
|
||||
);
|
||||
|
||||
const iconStyle = {
|
||||
marginRight: 8,
|
||||
fontSize: 16,
|
||||
transform: "translateY(1px)",
|
||||
};
|
||||
|
||||
function Nav() {
|
||||
const navigate = useNavigate();
|
||||
const user = useUserStore((s: any) => s.user);
|
||||
const exit = useUserStore((s: any) => s.userExit);
|
||||
|
||||
// user.user_avatar = `data:image/png;base64,${new Identicon(h).toString()}`;
|
||||
|
||||
const onClickMenuItem = (key: string) => {
|
||||
switch (key) {
|
||||
case "exit":
|
||||
exit();
|
||||
break;
|
||||
case "setting":
|
||||
console.log("navigate");
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
const dropList = (
|
||||
<Menu onClickMenuItem={(key) => onClickMenuItem(key)}>
|
||||
<Menu.Item key="exit">
|
||||
<IconImport style={iconStyle} />
|
||||
退出
|
||||
</Menu.Item>
|
||||
<Menu.Item key="setting">
|
||||
<IconSettings style={iconStyle} />
|
||||
设置
|
||||
</Menu.Item>
|
||||
</Menu>
|
||||
);
|
||||
|
||||
return (
|
||||
<header>
|
||||
<nav className="container">
|
||||
|
@ -36,12 +100,38 @@ function Nav() {
|
|||
</div>
|
||||
<div className="end">
|
||||
{!user ? (
|
||||
<span onClick={() => navigate("/login")}>登录</span>
|
||||
<span className="btn" onClick={() => navigate("/login")}>
|
||||
登录
|
||||
</span>
|
||||
) : (
|
||||
<div>
|
||||
<span>{user.user_login}</span>
|
||||
<span onClick={() => exit()}>退出</span>
|
||||
<Space>
|
||||
<div className="user">
|
||||
<div
|
||||
style={{
|
||||
color: "rgba(255,255,255,.7)",
|
||||
fontSize: 13,
|
||||
paddingBottom: 4,
|
||||
}}
|
||||
>
|
||||
{user.display_name}
|
||||
</div>
|
||||
<div style={{ color: "rgba(255,255,255,.4)" }}>
|
||||
{user.user_login}
|
||||
</div>
|
||||
</div>
|
||||
<Dropdown droplist={dropList} trigger="hover" position="br">
|
||||
<Space>
|
||||
<Avatar shape="square" size={32}>
|
||||
<img
|
||||
src={`data:image/png;base64,${new Identicon(
|
||||
user.user_avatar
|
||||
).toString()}`}
|
||||
/>
|
||||
</Avatar>
|
||||
<IconDown />
|
||||
</Space>
|
||||
</Dropdown>
|
||||
</Space>
|
||||
)}
|
||||
</div>
|
||||
</nav>
|
||||
|
|
|
@ -55,8 +55,5 @@
|
|||
.sms-group {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
button {
|
||||
height: 48px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,17 +1,15 @@
|
|||
import { useEffect, useRef, useState } from "react";
|
||||
import { userLogin } from "../../api";
|
||||
import { Message, Button } from "@arco-design/web-react";
|
||||
import { sms, userLogin } from "../../api";
|
||||
import { Message, Button, Space } from "@arco-design/web-react";
|
||||
import "./index.less";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
import { useUserStore } from "../../store/user.store";
|
||||
|
||||
const defaultForm = {
|
||||
user_login: "",
|
||||
user_pass: "",
|
||||
xcode: "",
|
||||
};
|
||||
|
||||
const DURATION = 3; // 验证码倒计时
|
||||
const DURATION = 60; // 验证码倒计时
|
||||
|
||||
export function Login() {
|
||||
const [loginForm, setLoginForm] = useState(defaultForm);
|
||||
|
@ -21,10 +19,15 @@ export function Login() {
|
|||
const setUser = useUserStore((s: any) => s.setUser);
|
||||
|
||||
const onClickSmsBtn = () => {
|
||||
if (!/^1[3456789]\d{9}$/.test(loginForm.user_login))
|
||||
return Message.error("手机号格式有误");
|
||||
sms(loginForm.user_login).then((res: any) => {
|
||||
if (res?.code === 10000)
|
||||
setTimeout(() => {
|
||||
Message.success("验证码已发送");
|
||||
timer.current = setInterval(() => setCountdown(countdown--), 1000);
|
||||
}, 500);
|
||||
}, 50);
|
||||
});
|
||||
};
|
||||
|
||||
const onClickLogin = () => {
|
||||
|
@ -62,7 +65,7 @@ export function Login() {
|
|||
<h4>欢迎,Backset!</h4>
|
||||
<div style={{ width: 320 }}>
|
||||
<div className="form">
|
||||
<input
|
||||
{/* <input
|
||||
type="text"
|
||||
className="input"
|
||||
placeholder="神秘代码"
|
||||
|
@ -72,12 +75,12 @@ export function Login() {
|
|||
xcode: e.target.value,
|
||||
}))
|
||||
}
|
||||
/>
|
||||
/> */}
|
||||
<input
|
||||
style={{ marginTop: "1rem" }}
|
||||
type="text"
|
||||
className="input"
|
||||
placeholder="用户名/手机"
|
||||
placeholder="手机"
|
||||
onChange={(e) =>
|
||||
setLoginForm((p) => ({
|
||||
...p,
|
||||
|
@ -85,7 +88,7 @@ export function Login() {
|
|||
}))
|
||||
}
|
||||
/>
|
||||
<input
|
||||
{/* <input
|
||||
style={{ marginTop: "1rem" }}
|
||||
className="input"
|
||||
type="password"
|
||||
|
@ -99,23 +102,30 @@ export function Login() {
|
|||
if (e.key === "Enter") onClickLogin();
|
||||
}}
|
||||
placeholder="密码"
|
||||
/>
|
||||
{/* <div className="sms-group">
|
||||
/> */}
|
||||
<div className="sms-group" style={{ marginTop: "1rem" }}>
|
||||
<input
|
||||
className="input"
|
||||
type="text"
|
||||
onKeyDown={(e) => {
|
||||
if (e.key === "Enter") onClickLogin();
|
||||
}}
|
||||
onChange={(e) =>
|
||||
setSmsLoginForm((p) => ({
|
||||
setLoginForm((p) => ({
|
||||
...p,
|
||||
user_pass: e.target.value,
|
||||
}))
|
||||
}
|
||||
placeholder="验证码"
|
||||
/>
|
||||
<Button type="text" onClick={onClickSmsBtn}>
|
||||
<Button
|
||||
style={{ marginLeft: 12, minWidth: 60 }}
|
||||
type="text"
|
||||
onClick={onClickSmsBtn}
|
||||
>
|
||||
{countdown === DURATION ? "获取" : countdown + "s"}
|
||||
</Button>
|
||||
</div> */}
|
||||
</div>
|
||||
</div>
|
||||
<button className="submit-btn" onClick={onClickLogin}>
|
||||
进入
|
||||
|
|
243
pnpm-lock.yaml
243
pnpm-lock.yaml
|
@ -130,6 +130,10 @@ importers:
|
|||
|
||||
apps/server:
|
||||
specifiers:
|
||||
'@alicloud/dysmsapi20170525': 2.0.23
|
||||
'@alicloud/openapi-client': 0.4.5
|
||||
'@alicloud/tea-typescript': 1.8.0
|
||||
'@alicloud/tea-util': 1.4.5
|
||||
'@backset/ui': workspace:^1.0.0
|
||||
'@backset/util': workspace:^1.0.0
|
||||
'@midwayjs/bootstrap': ^3.0.0
|
||||
|
@ -153,17 +157,21 @@ importers:
|
|||
'@types/node': '14'
|
||||
'@typescript-eslint/eslint-plugin': ^5.0.0
|
||||
'@typescript-eslint/parser': ^5.0.0
|
||||
chinese-random-name: 2.0.0
|
||||
dotenv: 16.0.3
|
||||
jsonwebtoken: 9.0.0
|
||||
mongoose: ^6.0.7
|
||||
mwts: ^1.0.5
|
||||
mysql2: 3.0.1
|
||||
object-hash: 3.0.0
|
||||
tencentcloud-sdk-nodejs: 4.0.552
|
||||
typeorm: ~0.3.0
|
||||
typescript: ~4.8.0
|
||||
vod-node-sdk: 1.1.0
|
||||
dependencies:
|
||||
'@alicloud/dysmsapi20170525': registry.npmmirror.com/@alicloud/dysmsapi20170525/2.0.23
|
||||
'@alicloud/openapi-client': registry.npmmirror.com/@alicloud/openapi-client/0.4.5
|
||||
'@alicloud/tea-typescript': registry.npmmirror.com/@alicloud/tea-typescript/1.8.0
|
||||
'@alicloud/tea-util': registry.npmmirror.com/@alicloud/tea-util/1.4.5
|
||||
'@backset/ui': link:../../packages/ui
|
||||
'@backset/util': link:../../packages/util
|
||||
'@midwayjs/bootstrap': registry.npmmirror.com/@midwayjs/bootstrap/3.10.10
|
||||
|
@ -179,11 +187,11 @@ importers:
|
|||
'@midwayjs/upload': registry.npmmirror.com/@midwayjs/upload/3.10.14
|
||||
'@midwayjs/validate': registry.npmmirror.com/@midwayjs/validate/3.10.10
|
||||
'@typegoose/typegoose': registry.npmmirror.com/@typegoose/typegoose/10.1.1_mongoose@6.9.1
|
||||
chinese-random-name: 2.0.0
|
||||
dotenv: registry.npmmirror.com/dotenv/16.0.3
|
||||
jsonwebtoken: registry.npmmirror.com/jsonwebtoken/9.0.0
|
||||
mongoose: registry.npmmirror.com/mongoose/6.9.1
|
||||
mysql2: registry.npmmirror.com/mysql2/3.0.1
|
||||
object-hash: registry.npmmirror.com/object-hash/3.0.0
|
||||
tencentcloud-sdk-nodejs: 4.0.552
|
||||
typeorm: registry.npmmirror.com/typeorm/0.3.11_mysql2@3.0.1
|
||||
vod-node-sdk: registry.npmmirror.com/vod-node-sdk/1.1.0
|
||||
|
@ -211,6 +219,7 @@ importers:
|
|||
'@vitejs/plugin-react': ^3.1.0
|
||||
dplayer: 1.27.1
|
||||
highlight.js: 11.7.0
|
||||
identicon.js: 2.3.3
|
||||
less: ^4.1.3
|
||||
react: ^18.2.0
|
||||
react-dom: ^18.2.0
|
||||
|
@ -224,6 +233,7 @@ importers:
|
|||
'@ricons/utils': 0.1.6_biqbaboplfbrettd7655fr4n2y
|
||||
dplayer: 1.27.1
|
||||
highlight.js: 11.7.0
|
||||
identicon.js: registry.npmmirror.com/identicon.js/2.3.3
|
||||
less: 4.1.3
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0_react@18.2.0
|
||||
|
@ -1451,11 +1461,6 @@ packages:
|
|||
to-fast-properties: 2.0.0
|
||||
dev: true
|
||||
|
||||
/@crand/mt19937/3.1.1:
|
||||
resolution: {integrity: sha512-WqBOxMN7ckc+nFJT6Bt0B5NjOm/IWoNlpy05enZQF/bmlv41gUdn4kwUmbIgqS8lwEn9kmgM2us2tfB9J7rIAg==}
|
||||
requiresBuild: true
|
||||
dev: false
|
||||
|
||||
/@emotion/hash/0.8.0:
|
||||
resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==}
|
||||
dev: false
|
||||
|
@ -1536,13 +1541,6 @@ packages:
|
|||
resolution: {integrity: sha512-Xe7IImK09HP1sv2M/aI+48a20VX+TdRJucfq4vfRVy6nWN8PYPOEnlMRSgxJAgYQIXJVL8dZ4/ilAM7dWNaOww==}
|
||||
dev: true
|
||||
|
||||
/@types/node/14.14.45:
|
||||
resolution: {integrity: sha512-DssMqTV9UnnoxDWu959sDLZzfvqCF0qDNRjaWeYSui9xkFe61kKo4l1TWNTQONpuXEm+gLMRvdlzvNHBamzmEw==}
|
||||
dev: false
|
||||
|
||||
/@types/node/18.14.1:
|
||||
resolution: {integrity: sha512-QH+37Qds3E0eDlReeboBxfHbX9omAcBCXEzswCu6jySP642jiM3cYSIkU/REqwhCUqXdonHFuBfJDiAJxMNhaQ==}
|
||||
|
||||
/@types/prop-types/15.7.5:
|
||||
resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
|
||||
|
||||
|
@ -1679,14 +1677,6 @@ packages:
|
|||
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
|
||||
dev: true
|
||||
|
||||
/chinese-random-name/2.0.0:
|
||||
resolution: {integrity: sha512-BsNqsxDQMpBn1lusoIipj1A2mo6rz09MqRusfVaPK7AWF0Y6F+HqauuQFBPDN3VxLg6GjabYcZZYDu34y7M2vA==}
|
||||
requiresBuild: true
|
||||
dependencies:
|
||||
'@crand/mt19937': 3.1.1
|
||||
flatten: 1.0.3
|
||||
dev: false
|
||||
|
||||
/color-convert/1.9.3:
|
||||
resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
|
||||
dependencies:
|
||||
|
@ -1752,7 +1742,7 @@ packages:
|
|||
resolution: {integrity: sha512-n3C4ZH59rveBrUlAD7n0Ze9/gUMKa4dlH1C9CWKpGcIHR/xRcIVXzBGy1iw8WWq2ySmn2/ZqOpySQNAK5Pb6sw==}
|
||||
dependencies:
|
||||
'@emotion/hash': 0.8.0
|
||||
'@types/node': 14.14.45
|
||||
'@types/node': registry.npmmirror.com/@types/node/14.14.45
|
||||
csstype: 3.0.11
|
||||
dev: false
|
||||
|
||||
|
@ -1846,11 +1836,6 @@ packages:
|
|||
engines: {node: '>=0.10.0'}
|
||||
dev: true
|
||||
|
||||
/flatten/1.0.3:
|
||||
resolution: {integrity: sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==}
|
||||
deprecated: flatten is deprecated in favor of utility frameworks such as lodash.
|
||||
dev: false
|
||||
|
||||
/focus-lock/0.11.6:
|
||||
resolution: {integrity: sha512-KSuV3ur4gf2KqMNoZx3nXNVhqCkn42GuTYCX4tXPEwf0MjpFQmNMiN6m7dXaUXgIoivL6/65agoUMg4RLS0Vbg==}
|
||||
engines: {node: '>=10'}
|
||||
|
@ -2355,10 +2340,6 @@ packages:
|
|||
fsevents: registry.npmmirror.com/fsevents/2.3.2
|
||||
dev: true
|
||||
|
||||
/sax/1.2.4:
|
||||
resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==}
|
||||
optional: true
|
||||
|
||||
/scheduler/0.23.0:
|
||||
resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
|
||||
dependencies:
|
||||
|
@ -2559,6 +2540,117 @@ packages:
|
|||
fsevents: registry.npmmirror.com/fsevents/2.3.2
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/@alicloud/credentials/2.2.6:
|
||||
resolution: {integrity: sha512-jG+msY77dHmAF3x+8VTy7fEgORyXLHmDci8t92HeipBdCHsPptDegA++GEwKgR7f6G4wvafYt+aqMZ1iligdrQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@alicloud/credentials/-/credentials-2.2.6.tgz}
|
||||
name: '@alicloud/credentials'
|
||||
version: 2.2.6
|
||||
dependencies:
|
||||
'@alicloud/tea-typescript': registry.npmmirror.com/@alicloud/tea-typescript/1.8.0
|
||||
httpx: registry.npmmirror.com/httpx/2.2.7
|
||||
ini: registry.npmmirror.com/ini/1.3.8
|
||||
kitx: registry.npmmirror.com/kitx/2.1.0
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/@alicloud/dysmsapi20170525/2.0.23:
|
||||
resolution: {integrity: sha512-C02xj9S2ZPL13SciChlIY3s5+PiOM13jEGZSn+L92aiWYCBqTlpx9UMwNKBNWImMSOlG71IOSYfsQggaoIY+4Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@alicloud/dysmsapi20170525/-/dysmsapi20170525-2.0.23.tgz}
|
||||
name: '@alicloud/dysmsapi20170525'
|
||||
version: 2.0.23
|
||||
dependencies:
|
||||
'@alicloud/endpoint-util': registry.npmmirror.com/@alicloud/endpoint-util/0.0.1
|
||||
'@alicloud/openapi-client': registry.npmmirror.com/@alicloud/openapi-client/0.4.5
|
||||
'@alicloud/openapi-util': registry.npmmirror.com/@alicloud/openapi-util/0.3.1
|
||||
'@alicloud/tea-typescript': registry.npmmirror.com/@alicloud/tea-typescript/1.8.0
|
||||
'@alicloud/tea-util': registry.npmmirror.com/@alicloud/tea-util/1.4.5
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/@alicloud/endpoint-util/0.0.1:
|
||||
resolution: {integrity: sha512-+pH7/KEXup84cHzIL6UJAaPqETvln4yXlD9JzlrqioyCSaWxbug5FUobsiI6fuUOpw5WwoB3fWAtGbFnJ1K3Yg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@alicloud/endpoint-util/-/endpoint-util-0.0.1.tgz}
|
||||
name: '@alicloud/endpoint-util'
|
||||
version: 0.0.1
|
||||
dependencies:
|
||||
'@alicloud/tea-typescript': registry.npmmirror.com/@alicloud/tea-typescript/1.8.0
|
||||
kitx: registry.npmmirror.com/kitx/2.1.0
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/@alicloud/gateway-spi/0.0.8:
|
||||
resolution: {integrity: sha512-KM7fu5asjxZPmrz9sJGHJeSU+cNQNOxW+SFmgmAIrITui5hXL2LB+KNRuzWmlwPjnuA2X3/keq9h6++S9jcV5g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@alicloud/gateway-spi/-/gateway-spi-0.0.8.tgz}
|
||||
name: '@alicloud/gateway-spi'
|
||||
version: 0.0.8
|
||||
dependencies:
|
||||
'@alicloud/credentials': registry.npmmirror.com/@alicloud/credentials/2.2.6
|
||||
'@alicloud/tea-typescript': registry.npmmirror.com/@alicloud/tea-typescript/1.8.0
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/@alicloud/openapi-client/0.4.5:
|
||||
resolution: {integrity: sha512-x1blwhfPOVkH/JCLWFssFRWDL0C75RToun9AwhNV+84gqJB2/GUipm3quHGLon8JiQ0DQ9YBUho2rukSoAvhJQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@alicloud/openapi-client/-/openapi-client-0.4.5.tgz}
|
||||
name: '@alicloud/openapi-client'
|
||||
version: 0.4.5
|
||||
dependencies:
|
||||
'@alicloud/credentials': registry.npmmirror.com/@alicloud/credentials/2.2.6
|
||||
'@alicloud/gateway-spi': registry.npmmirror.com/@alicloud/gateway-spi/0.0.8
|
||||
'@alicloud/openapi-util': registry.npmmirror.com/@alicloud/openapi-util/0.3.1
|
||||
'@alicloud/tea-typescript': registry.npmmirror.com/@alicloud/tea-typescript/1.8.0
|
||||
'@alicloud/tea-util': registry.npmmirror.com/@alicloud/tea-util/1.4.5
|
||||
'@alicloud/tea-xml': registry.npmmirror.com/@alicloud/tea-xml/0.0.2
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/@alicloud/openapi-util/0.3.1:
|
||||
resolution: {integrity: sha512-6mGT+hs+SXismZi/CEkjPhhbn2U3qTT/Qv/RXAYFA1DC3Jk4/YaX3N7RtpgdzOhdD7uI8XtNkaULKHZY3BrtxQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@alicloud/openapi-util/-/openapi-util-0.3.1.tgz}
|
||||
name: '@alicloud/openapi-util'
|
||||
version: 0.3.1
|
||||
dependencies:
|
||||
'@alicloud/tea-typescript': registry.npmmirror.com/@alicloud/tea-typescript/1.8.0
|
||||
'@alicloud/tea-util': registry.npmmirror.com/@alicloud/tea-util/1.4.5
|
||||
kitx: registry.npmmirror.com/kitx/2.1.0
|
||||
sm3: registry.npmmirror.com/sm3/1.0.3
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/@alicloud/tea-typescript/1.8.0:
|
||||
resolution: {integrity: sha512-CWXWaquauJf0sW30mgJRVu9aaXyBth5uMBCUc+5vKTK1zlgf3hIqRUjJZbjlwHwQ5y9anwcu18r48nOZb7l2QQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@alicloud/tea-typescript/-/tea-typescript-1.8.0.tgz}
|
||||
name: '@alicloud/tea-typescript'
|
||||
version: 1.8.0
|
||||
dependencies:
|
||||
'@types/node': registry.npmmirror.com/@types/node/12.20.55
|
||||
httpx: registry.npmmirror.com/httpx/2.2.7
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/@alicloud/tea-util/1.4.5:
|
||||
resolution: {integrity: sha512-7NuThYUi90/ivT/ORKusm0NVKlc1khPTtlzTR77xEqSBt7d24Ee/Lo70hx9PWP28nHpIZ1gM0NKYBtpq7HUDlg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@alicloud/tea-util/-/tea-util-1.4.5.tgz}
|
||||
name: '@alicloud/tea-util'
|
||||
version: 1.4.5
|
||||
dependencies:
|
||||
'@alicloud/tea-typescript': registry.npmmirror.com/@alicloud/tea-typescript/1.8.0
|
||||
kitx: registry.npmmirror.com/kitx/2.1.0
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/@alicloud/tea-xml/0.0.2:
|
||||
resolution: {integrity: sha512-Xs7v5y7YSNSDDYmiDWAC0/013VWPjS3dQU4KezSLva9VGiTVPaL3S7Nk4NrTmAYCG6MKcrRj/nGEDIWL5KRoPg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@alicloud/tea-xml/-/tea-xml-0.0.2.tgz}
|
||||
name: '@alicloud/tea-xml'
|
||||
version: 0.0.2
|
||||
dependencies:
|
||||
'@alicloud/tea-typescript': registry.npmmirror.com/@alicloud/tea-typescript/1.8.0
|
||||
'@types/xml2js': registry.npmmirror.com/@types/xml2js/0.4.11
|
||||
xml2js: registry.npmmirror.com/xml2js/0.4.23
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/@ampproject/remapping/2.2.0:
|
||||
resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.0.tgz}
|
||||
name: '@ampproject/remapping'
|
||||
|
@ -3788,7 +3880,7 @@ packages:
|
|||
'@babel/helper-split-export-declaration': registry.npmmirror.com/@babel/helper-split-export-declaration/7.18.6
|
||||
'@babel/parser': registry.npmmirror.com/@babel/parser/7.21.2
|
||||
'@babel/types': registry.npmmirror.com/@babel/types/7.21.2
|
||||
debug: 4.3.4
|
||||
debug: registry.npmmirror.com/debug/4.3.4
|
||||
globals: registry.npmmirror.com/globals/11.12.0
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
@ -4935,7 +5027,7 @@ packages:
|
|||
name: '@types/accepts'
|
||||
version: 1.3.5
|
||||
dependencies:
|
||||
'@types/node': registry.npmmirror.com/@types/node/18.13.0
|
||||
'@types/node': registry.npmmirror.com/@types/node/18.14.1
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/@types/body-parser/1.19.2:
|
||||
|
@ -4944,7 +5036,7 @@ packages:
|
|||
version: 1.19.2
|
||||
dependencies:
|
||||
'@types/connect': registry.npmmirror.com/@types/connect/3.4.35
|
||||
'@types/node': registry.npmmirror.com/@types/node/18.13.0
|
||||
'@types/node': registry.npmmirror.com/@types/node/18.14.1
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/@types/connect/3.4.35:
|
||||
|
@ -4952,7 +5044,7 @@ packages:
|
|||
name: '@types/connect'
|
||||
version: 3.4.35
|
||||
dependencies:
|
||||
'@types/node': registry.npmmirror.com/@types/node/18.13.0
|
||||
'@types/node': registry.npmmirror.com/@types/node/18.14.1
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/@types/content-disposition/0.5.5:
|
||||
|
@ -4975,7 +5067,7 @@ packages:
|
|||
'@types/connect': registry.npmmirror.com/@types/connect/3.4.35
|
||||
'@types/express': registry.npmmirror.com/@types/express/4.17.17
|
||||
'@types/keygrip': registry.npmmirror.com/@types/keygrip/1.0.2
|
||||
'@types/node': registry.npmmirror.com/@types/node/18.13.0
|
||||
'@types/node': registry.npmmirror.com/@types/node/18.14.1
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/@types/eslint-scope/3.7.4:
|
||||
|
@ -5013,7 +5105,7 @@ packages:
|
|||
name: '@types/express-serve-static-core'
|
||||
version: 4.17.33
|
||||
dependencies:
|
||||
'@types/node': registry.npmmirror.com/@types/node/18.13.0
|
||||
'@types/node': registry.npmmirror.com/@types/node/18.14.1
|
||||
'@types/qs': registry.npmmirror.com/@types/qs/6.9.7
|
||||
'@types/range-parser': registry.npmmirror.com/@types/range-parser/1.2.4
|
||||
dev: true
|
||||
|
@ -5035,7 +5127,7 @@ packages:
|
|||
version: 7.2.0
|
||||
dependencies:
|
||||
'@types/minimatch': registry.npmmirror.com/@types/minimatch/5.1.2
|
||||
'@types/node': 18.14.1
|
||||
'@types/node': registry.npmmirror.com/@types/node/18.14.1
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/@types/history/4.7.11:
|
||||
|
@ -5087,7 +5179,7 @@ packages:
|
|||
name: '@types/keyv'
|
||||
version: 3.1.4
|
||||
dependencies:
|
||||
'@types/node': 18.14.1
|
||||
'@types/node': registry.npmmirror.com/@types/node/18.14.1
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/@types/koa-compose/3.2.5:
|
||||
|
@ -5143,11 +5235,22 @@ packages:
|
|||
- supports-color
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/@types/node/12.20.55:
|
||||
resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/node/-/node-12.20.55.tgz}
|
||||
name: '@types/node'
|
||||
version: 12.20.55
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/@types/node/14.14.45:
|
||||
resolution: {integrity: sha512-DssMqTV9UnnoxDWu959sDLZzfvqCF0qDNRjaWeYSui9xkFe61kKo4l1TWNTQONpuXEm+gLMRvdlzvNHBamzmEw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/node/-/node-14.14.45.tgz}
|
||||
name: '@types/node'
|
||||
version: 14.14.45
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/@types/node/14.18.36:
|
||||
resolution: {integrity: sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/node/-/node-14.18.36.tgz}
|
||||
name: '@types/node'
|
||||
version: 14.18.36
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/@types/node/18.13.0:
|
||||
resolution: {integrity: sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/node/-/node-18.13.0.tgz}
|
||||
|
@ -5155,6 +5258,11 @@ packages:
|
|||
version: 18.13.0
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/@types/node/18.14.1:
|
||||
resolution: {integrity: sha512-QH+37Qds3E0eDlReeboBxfHbX9omAcBCXEzswCu6jySP642jiM3cYSIkU/REqwhCUqXdonHFuBfJDiAJxMNhaQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/node/-/node-18.14.1.tgz}
|
||||
name: '@types/node'
|
||||
version: 18.14.1
|
||||
|
||||
registry.npmmirror.com/@types/normalize-package-data/2.4.1:
|
||||
resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz}
|
||||
name: '@types/normalize-package-data'
|
||||
|
@ -5233,7 +5341,7 @@ packages:
|
|||
name: '@types/responselike'
|
||||
version: 1.0.0
|
||||
dependencies:
|
||||
'@types/node': 18.14.1
|
||||
'@types/node': registry.npmmirror.com/@types/node/18.14.1
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/@types/scheduler/0.16.2:
|
||||
|
@ -5254,7 +5362,7 @@ packages:
|
|||
version: 1.15.0
|
||||
dependencies:
|
||||
'@types/mime': registry.npmmirror.com/@types/mime/3.0.1
|
||||
'@types/node': registry.npmmirror.com/@types/node/18.13.0
|
||||
'@types/node': registry.npmmirror.com/@types/node/18.14.1
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/@types/superagent/4.1.14:
|
||||
|
@ -5263,7 +5371,7 @@ packages:
|
|||
version: 4.1.14
|
||||
dependencies:
|
||||
'@types/cookiejar': registry.npmmirror.com/@types/cookiejar/2.1.2
|
||||
'@types/node': 18.14.1
|
||||
'@types/node': registry.npmmirror.com/@types/node/18.14.1
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/@types/supertest/2.0.12:
|
||||
|
@ -5290,9 +5398,17 @@ packages:
|
|||
name: '@types/whatwg-url'
|
||||
version: 8.2.2
|
||||
dependencies:
|
||||
'@types/node': 18.14.1
|
||||
'@types/node': registry.npmmirror.com/@types/node/18.14.1
|
||||
'@types/webidl-conversions': registry.npmmirror.com/@types/webidl-conversions/7.0.0
|
||||
|
||||
registry.npmmirror.com/@types/xml2js/0.4.11:
|
||||
resolution: {integrity: sha512-JdigeAKmCyoJUiQljjr7tQG3if9NkqGUgwEUqBvV0N7LM4HyQk7UXCnusRa1lnvXAEYJ8mw8GtZWioagNztOwA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/xml2js/-/xml2js-0.4.11.tgz}
|
||||
name: '@types/xml2js'
|
||||
version: 0.4.11
|
||||
dependencies:
|
||||
'@types/node': registry.npmmirror.com/@types/node/18.14.1
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/@typescript-eslint/eslint-plugin/5.51.0_kgqsfljgdbfvawc75brweh7h74:
|
||||
resolution: {integrity: sha512-wcAwhEWm1RgNd7dxD/o+nnLW8oH+6RK1OGnmbmkj/GGoDPV1WWMVP0FXYQBivKHdwM1pwii3bt//RC62EriIUQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.51.0.tgz}
|
||||
id: registry.npmmirror.com/@typescript-eslint/eslint-plugin/5.51.0
|
||||
|
@ -8645,6 +8761,17 @@ packages:
|
|||
- supports-color
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/httpx/2.2.7:
|
||||
resolution: {integrity: sha512-Wjh2JOAah0pdczfqL8NC5378G7jMt0Zcpn8U+yyxAiejjlagzSTQgJHuVvka2VNPQlKfoGehYRc79WKq9E4gDw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/httpx/-/httpx-2.2.7.tgz}
|
||||
name: httpx
|
||||
version: 2.2.7
|
||||
dependencies:
|
||||
'@types/node': registry.npmmirror.com/@types/node/14.18.36
|
||||
debug: registry.npmmirror.com/debug/4.3.4
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/human-signals/2.1.0:
|
||||
resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz}
|
||||
name: human-signals
|
||||
|
@ -8686,6 +8813,12 @@ packages:
|
|||
postcss: registry.npmmirror.com/postcss/8.4.21
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/identicon.js/2.3.3:
|
||||
resolution: {integrity: sha512-/qgOkXKZ7YbeCYbawJ9uQQ3XJ3uBg9VDpvHjabCAPp6aRMhjLaFAxG90+1TxzrhKaj6AYpVGrx6UXQfQA41UEA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/identicon.js/-/identicon.js-2.3.3.tgz}
|
||||
name: identicon.js
|
||||
version: 2.3.3
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/ieee754/1.2.1:
|
||||
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz}
|
||||
name: ieee754
|
||||
|
@ -8822,7 +8955,6 @@ packages:
|
|||
resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz}
|
||||
name: ini
|
||||
version: 1.3.8
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/ini/2.0.0:
|
||||
resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ini/-/ini-2.0.0.tgz}
|
||||
|
@ -9135,7 +9267,7 @@ packages:
|
|||
version: 27.5.1
|
||||
engines: {node: '>= 10.13.0'}
|
||||
dependencies:
|
||||
'@types/node': 18.14.1
|
||||
'@types/node': registry.npmmirror.com/@types/node/18.14.1
|
||||
merge-stream: registry.npmmirror.com/merge-stream/2.0.0
|
||||
supports-color: registry.npmmirror.com/supports-color/8.1.1
|
||||
dev: true
|
||||
|
@ -9337,6 +9469,14 @@ packages:
|
|||
engines: {node: '>=0.10.0'}
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/kitx/2.1.0:
|
||||
resolution: {integrity: sha512-C/5v9MtIX7aHGOjwn5BmrrbNkJSf7i0R5mRzmh13GSAdRqQ7bYQo/Su2pTYNylFicqKNTVX3HML9k1u8k51+pQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/kitx/-/kitx-2.1.0.tgz}
|
||||
name: kitx
|
||||
version: 2.1.0
|
||||
dependencies:
|
||||
'@types/node': registry.npmmirror.com/@types/node/12.20.55
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/klona/2.0.6:
|
||||
resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/klona/-/klona-2.0.6.tgz}
|
||||
name: klona
|
||||
|
@ -10176,7 +10316,7 @@ packages:
|
|||
dependencies:
|
||||
debug: registry.npmmirror.com/debug/3.2.7
|
||||
iconv-lite: registry.npmmirror.com/iconv-lite/0.6.3
|
||||
sax: 1.2.4
|
||||
sax: registry.npmmirror.com/sax/1.2.4
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
optional: true
|
||||
|
@ -12488,7 +12628,6 @@ packages:
|
|||
resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz}
|
||||
name: sax
|
||||
version: 1.2.4
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/scheduler/0.23.0:
|
||||
resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/scheduler/-/scheduler-0.23.0.tgz}
|
||||
|
@ -12720,6 +12859,12 @@ packages:
|
|||
is-fullwidth-code-point: registry.npmmirror.com/is-fullwidth-code-point/3.0.0
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/sm3/1.0.3:
|
||||
resolution: {integrity: sha512-KyFkIfr8QBlFG3uc3NaljaXdYcsbRy1KrSfc4tsQV8jW68jAktGeOcifu530Vx/5LC+PULHT0Rv8LiI8Gw+c1g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/sm3/-/sm3-1.0.3.tgz}
|
||||
name: sm3
|
||||
version: 1.0.3
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/smart-buffer/4.2.0:
|
||||
resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/smart-buffer/-/smart-buffer-4.2.0.tgz}
|
||||
name: smart-buffer
|
||||
|
|
Loading…
Reference in New Issue
Block a user