feat: 登录验证码

This commit is contained in:
mozzie 2023-03-16 16:50:22 +08:00
parent a298594cf8
commit ca8111dab0
21 changed files with 460 additions and 127 deletions

View File

@ -1,8 +1,12 @@
# 代码中使用 process.env.OSS_SECRET # 代码中使用 process.env.OSS_SECRET
OSS_SECRET=12345 OSS_SECRET=12345
# 腾讯vod
SECRET_ID=AKID534tZ7OvYzb2KQMwLYaVEl5FBwUtQWbU SECRET_ID=AKID534tZ7OvYzb2KQMwLYaVEl5FBwUtQWbU
SECRET_KEY=q9HD6lQimeLp9IH5h7NRJzUpNjwxmPq5 SECRET_KEY=q9HD6lQimeLp9IH5h7NRJzUpNjwxmPq5
SUBAPPID=1500018521 SUBAPPID=1500018521
SUBAPPID_OSS=1500018944 SUBAPPID_OSS=1500018944
# 阿里sms
ACCESSKEY_ID=LTAIlHbKxMELdAM0
ACCESSKEY_SECRET=xLG8tBAMdUG8hVITgZEgl6lAgKamzC

View File

@ -26,7 +26,11 @@
"jsonwebtoken": "9.0.0", "jsonwebtoken": "9.0.0",
"tencentcloud-sdk-nodejs": "4.0.552", "tencentcloud-sdk-nodejs": "4.0.552",
"vod-node-sdk": "1.1.0", "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": { "devDependencies": {
"@midwayjs/cli": "^2.0.0", "@midwayjs/cli": "^2.0.0",

View File

@ -4,4 +4,4 @@ export const adminSign = '_sign_admin';
export const adminSignExpired = 60 * 1000 * 10; // 10分钟 export const adminSignExpired = 60 * 1000 * 10; // 10分钟
export const webSign = '_sign_web'; export const webSign = '_sign_web';
export const webSignExpired = 60 * 1000 * 10; // 10分钟 export const webSignExpired = 60 * 1000 * 100; // 10分钟

View File

@ -3,5 +3,6 @@ import { globalPrefix } from './base.config';
export const whiteApis = [ export const whiteApis = [
'/user/admin/auth', '/user/admin/auth',
'/user/web/auth', '/user/web/auth',
'/user/web/sms',
'/course/select/all', '/course/select/all',
].map(api => globalPrefix + api); ].map(api => globalPrefix + api);

View File

@ -10,7 +10,10 @@ import {
import { UserAdminAuthDTO, UserWebAuthDTO } from '../dto/user.dto'; import { UserAdminAuthDTO, UserWebAuthDTO } from '../dto/user.dto';
import { XCodeService } from '../service/xcode.service'; import { XCodeService } from '../service/xcode.service';
import { UserService } from '../service/user.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') @Controller('/user')
export class UserController { export class UserController {
@ -23,54 +26,44 @@ export class UserController {
@Inject() @Inject()
xcodeService: XCodeService; xcodeService: XCodeService;
@Inject()
smsService: SmsService;
@Inject()
redisService: RedisService;
/** /**
* *
*/ */
@Post('/web/auth') @Post('/web/auth')
async webAuth(@Body() params: UserWebAuthDTO) { async webAuth(@Body() params: UserWebAuthDTO) {
try { try {
const verifyCode = await this.redisService.get('' + params.user_login);
if (!verifyCode) return { code: BizCode.ERROR, msg: '验证码无效' };
// 查询用户是否存在
const userExist = await this.userService.select(params); const userExist = await this.userService.select(params);
let payload = {};
if (userExist?.id) { if (userExist?.id) {
const { user_pass, ...rest } = userExist; const { user_pass, ...rest } = userExist;
const passValid = userExist.user_pass === md5(params.user_pass); payload = rest;
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: '密码错误' };
}
} else { } else {
// 新用户注册 // 新用户注册
// 1. 验证邀请码 const { user_pass, ...rest } = await this.userService.createUser(
const { xcode } = params; params
const xcodeValid = await this.xcodeService.valid(xcode); );
if (!xcodeValid) payload = rest;
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 });
this.ctx.cookies.set(webSign, token, {
expires: new Date(Date.now() + webSignExpired),
httpOnly: false,
});
return {
code: BizCode.OK,
data: { ...rest },
msg: '欢迎来到 backset.cn,' + rest.display_name,
};
} }
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,
msg: '欢迎来到 backset.cn',
data: { ...payload },
};
} catch (error) { } catch (error) {
this.ctx.logger.error(error); this.ctx.logger.error(error);
return { code: BizCode.ERROR, msg: '[error] web/auth error' }; return { code: BizCode.ERROR, msg: '[error] web/auth error' };
@ -96,7 +89,7 @@ export class UserController {
} }
@Get('/web/state') @Get('/web/state')
async() { async state() {
try { try {
const token = this.ctx.cookies.get(webSign); const token = this.ctx.cookies.get(webSign);
const user = decodeToken(token); const user = decodeToken(token);
@ -106,4 +99,21 @@ export class UserController {
return { code: BizCode.ERROR, msg: '[error] /web/state error' }; 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' };
}
}
} }

View 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;
}

View File

@ -7,7 +7,7 @@ export class UserWebAuthDTO {
) )
user_login: string; 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; user_pass: string;
@Rule(RuleType.string().allow('')) @Rule(RuleType.string().allow(''))

View File

@ -1,5 +1,4 @@
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
const randomName = require('chinese-random-name');
@Entity('user') @Entity('user')
export class User { export class User {
@ -21,6 +20,9 @@ export class User {
@Column({ default: true }) @Column({ default: true })
user_status?: boolean; user_status?: boolean;
@Column({ default: randomName.generate() }) @Column({ default: '用户' + Date.now() })
display_name?: string; display_name?: string;
@Column({ default: '' })
user_avatar?: string;
} }

View 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));
}
}
}

View File

@ -3,14 +3,14 @@ import { InjectEntityModel } from '@midwayjs/typeorm';
import { Repository } from 'typeorm'; import { Repository } from 'typeorm';
import { UserWebAuthDTO } from '../dto/user.dto'; import { UserWebAuthDTO } from '../dto/user.dto';
import { User } from '../entity/user.entity'; import { User } from '../entity/user.entity';
import { md5 } from '../util/encrypt'; import hash from 'object-hash';
@Provide() @Provide()
export class UserService { export class UserService {
@InjectEntityModel(User) @InjectEntityModel(User)
userModel: Repository<User>; userModel: Repository<User>;
async select(p: UserWebAuthDTO): Promise<User> { async select(p: UserWebAuthDTO): Promise<any> {
const { user_login } = p; const { user_login } = p;
const user = await this.userModel.findOne({ const user = await this.userModel.findOne({
where: { user_login }, where: { user_login },
@ -19,7 +19,9 @@ export class UserService {
} }
async createUser(user: User) { 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); const result = await this.userModel.save(user);
return result; return result;
} }

View File

@ -17,7 +17,8 @@
"@ricons/fluent": "0.12.0", "@ricons/fluent": "0.12.0",
"@ricons/utils": "0.1.6", "@ricons/utils": "0.1.6",
"dplayer": "1.27.1", "dplayer": "1.27.1",
"highlight.js": "11.7.0" "highlight.js": "11.7.0",
"identicon.js": "2.3.3"
}, },
"devDependencies": { "devDependencies": {
"@types/react": "^18.0.27", "@types/react": "^18.0.27",

1
apps/web/public/vip1.svg Normal file
View 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
View 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
View 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

View File

@ -1,5 +1,5 @@
export interface ILoginRequest { export interface ILoginRequest {
user_login: string; user_login: string;
user_pass: string; user_pass: string;
xcode: string; // xcode: string;
} }

View File

@ -10,3 +10,6 @@ export const userLogin = (p: ILoginRequest) =>
R.post("/api/user/web/auth", { ...p }); R.post("/api/user/web/auth", { ...p });
export const userState = () => R.get("/api/user/web/state"); export const userState = () => R.get("/api/user/web/state");
export const sms = (phoneNumber: string | number) =>
R.post("/api/user/web/sms", { phoneNumber });

View File

@ -53,7 +53,7 @@ header {
.end { .end {
text-align: right; text-align: right;
span { .btn {
cursor: pointer; cursor: pointer;
margin-left: 32px; margin-left: 32px;
@ -61,6 +61,12 @@ header {
color: #fff; color: #fff;
} }
} }
.user {
font-size: 12px;
> div {
line-height: 1;
}
}
} }
} }
} }

View File

@ -1,14 +1,78 @@
import "./index.less"; import "./index.less";
import { useNavigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
import { menuRouters } from "../../router"; import { menuRouters } from "../../router";
import { Input } from "@arco-design/web-react";
import { useUserStore } from "../../store/user.store"; 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() { function Nav() {
const navigate = useNavigate(); const navigate = useNavigate();
const user = useUserStore((s: any) => s.user); const user = useUserStore((s: any) => s.user);
const exit = useUserStore((s: any) => s.userExit); 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 ( return (
<header> <header>
<nav className="container"> <nav className="container">
@ -36,12 +100,38 @@ function Nav() {
</div> </div>
<div className="end"> <div className="end">
{!user ? ( {!user ? (
<span onClick={() => navigate("/login")}></span> <span className="btn" onClick={() => navigate("/login")}>
</span>
) : ( ) : (
<div> <Space>
<span>{user.user_login}</span> <div className="user">
<span onClick={() => exit()}>退</span> <div
</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> </div>
</nav> </nav>

View File

@ -55,8 +55,5 @@
.sms-group { .sms-group {
display: flex; display: flex;
align-items: center; align-items: center;
button {
height: 48px;
}
} }
} }

View File

@ -1,17 +1,15 @@
import { useEffect, useRef, useState } from "react"; import { useEffect, useRef, useState } from "react";
import { userLogin } from "../../api"; import { sms, userLogin } from "../../api";
import { Message, Button } from "@arco-design/web-react"; import { Message, Button, Space } from "@arco-design/web-react";
import "./index.less"; import "./index.less";
import { useNavigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
import { useUserStore } from "../../store/user.store"; import { useUserStore } from "../../store/user.store";
const defaultForm = { const defaultForm = {
user_login: "", user_login: "",
user_pass: "", user_pass: "",
xcode: "",
}; };
const DURATION = 3; // 验证码倒计时 const DURATION = 60; // 验证码倒计时
export function Login() { export function Login() {
const [loginForm, setLoginForm] = useState(defaultForm); const [loginForm, setLoginForm] = useState(defaultForm);
@ -21,10 +19,15 @@ export function Login() {
const setUser = useUserStore((s: any) => s.setUser); const setUser = useUserStore((s: any) => s.setUser);
const onClickSmsBtn = () => { const onClickSmsBtn = () => {
setTimeout(() => { if (!/^1[3456789]\d{9}$/.test(loginForm.user_login))
Message.success("验证码已发送"); return Message.error("手机号格式有误");
timer.current = setInterval(() => setCountdown(countdown--), 1000); sms(loginForm.user_login).then((res: any) => {
}, 500); if (res?.code === 10000)
setTimeout(() => {
Message.success("验证码已发送");
timer.current = setInterval(() => setCountdown(countdown--), 1000);
}, 50);
});
}; };
const onClickLogin = () => { const onClickLogin = () => {
@ -62,7 +65,7 @@ export function Login() {
<h4>Backset</h4> <h4>Backset</h4>
<div style={{ width: 320 }}> <div style={{ width: 320 }}>
<div className="form"> <div className="form">
<input {/* <input
type="text" type="text"
className="input" className="input"
placeholder="神秘代码" placeholder="神秘代码"
@ -72,12 +75,12 @@ export function Login() {
xcode: e.target.value, xcode: e.target.value,
})) }))
} }
/> /> */}
<input <input
style={{ marginTop: "1rem" }} style={{ marginTop: "1rem" }}
type="text" type="text"
className="input" className="input"
placeholder="用户名/手机" placeholder="手机"
onChange={(e) => onChange={(e) =>
setLoginForm((p) => ({ setLoginForm((p) => ({
...p, ...p,
@ -85,7 +88,7 @@ export function Login() {
})) }))
} }
/> />
<input {/* <input
style={{ marginTop: "1rem" }} style={{ marginTop: "1rem" }}
className="input" className="input"
type="password" type="password"
@ -99,23 +102,30 @@ export function Login() {
if (e.key === "Enter") onClickLogin(); if (e.key === "Enter") onClickLogin();
}} }}
placeholder="密码" placeholder="密码"
/> /> */}
{/* <div className="sms-group"> <div className="sms-group" style={{ marginTop: "1rem" }}>
<input <input
className="input" className="input"
type="text" type="text"
onKeyDown={(e) => {
if (e.key === "Enter") onClickLogin();
}}
onChange={(e) => onChange={(e) =>
setSmsLoginForm((p) => ({ setLoginForm((p) => ({
...p, ...p,
user_pass: e.target.value, user_pass: e.target.value,
})) }))
} }
placeholder="验证码" placeholder="验证码"
/> />
<Button type="text" onClick={onClickSmsBtn}> <Button
style={{ marginLeft: 12, minWidth: 60 }}
type="text"
onClick={onClickSmsBtn}
>
{countdown === DURATION ? "获取" : countdown + "s"} {countdown === DURATION ? "获取" : countdown + "s"}
</Button> </Button>
</div> */} </div>
</div> </div>
<button className="submit-btn" onClick={onClickLogin}> <button className="submit-btn" onClick={onClickLogin}>

View File

@ -130,6 +130,10 @@ importers:
apps/server: apps/server:
specifiers: 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/ui': workspace:^1.0.0
'@backset/util': workspace:^1.0.0 '@backset/util': workspace:^1.0.0
'@midwayjs/bootstrap': ^3.0.0 '@midwayjs/bootstrap': ^3.0.0
@ -153,17 +157,21 @@ importers:
'@types/node': '14' '@types/node': '14'
'@typescript-eslint/eslint-plugin': ^5.0.0 '@typescript-eslint/eslint-plugin': ^5.0.0
'@typescript-eslint/parser': ^5.0.0 '@typescript-eslint/parser': ^5.0.0
chinese-random-name: 2.0.0
dotenv: 16.0.3 dotenv: 16.0.3
jsonwebtoken: 9.0.0 jsonwebtoken: 9.0.0
mongoose: ^6.0.7 mongoose: ^6.0.7
mwts: ^1.0.5 mwts: ^1.0.5
mysql2: 3.0.1 mysql2: 3.0.1
object-hash: 3.0.0
tencentcloud-sdk-nodejs: 4.0.552 tencentcloud-sdk-nodejs: 4.0.552
typeorm: ~0.3.0 typeorm: ~0.3.0
typescript: ~4.8.0 typescript: ~4.8.0
vod-node-sdk: 1.1.0 vod-node-sdk: 1.1.0
dependencies: 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/ui': link:../../packages/ui
'@backset/util': link:../../packages/util '@backset/util': link:../../packages/util
'@midwayjs/bootstrap': registry.npmmirror.com/@midwayjs/bootstrap/3.10.10 '@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/upload': registry.npmmirror.com/@midwayjs/upload/3.10.14
'@midwayjs/validate': registry.npmmirror.com/@midwayjs/validate/3.10.10 '@midwayjs/validate': registry.npmmirror.com/@midwayjs/validate/3.10.10
'@typegoose/typegoose': registry.npmmirror.com/@typegoose/typegoose/10.1.1_mongoose@6.9.1 '@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 dotenv: registry.npmmirror.com/dotenv/16.0.3
jsonwebtoken: registry.npmmirror.com/jsonwebtoken/9.0.0 jsonwebtoken: registry.npmmirror.com/jsonwebtoken/9.0.0
mongoose: registry.npmmirror.com/mongoose/6.9.1 mongoose: registry.npmmirror.com/mongoose/6.9.1
mysql2: registry.npmmirror.com/mysql2/3.0.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 tencentcloud-sdk-nodejs: 4.0.552
typeorm: registry.npmmirror.com/typeorm/0.3.11_mysql2@3.0.1 typeorm: registry.npmmirror.com/typeorm/0.3.11_mysql2@3.0.1
vod-node-sdk: registry.npmmirror.com/vod-node-sdk/1.1.0 vod-node-sdk: registry.npmmirror.com/vod-node-sdk/1.1.0
@ -211,6 +219,7 @@ importers:
'@vitejs/plugin-react': ^3.1.0 '@vitejs/plugin-react': ^3.1.0
dplayer: 1.27.1 dplayer: 1.27.1
highlight.js: 11.7.0 highlight.js: 11.7.0
identicon.js: 2.3.3
less: ^4.1.3 less: ^4.1.3
react: ^18.2.0 react: ^18.2.0
react-dom: ^18.2.0 react-dom: ^18.2.0
@ -224,6 +233,7 @@ importers:
'@ricons/utils': 0.1.6_biqbaboplfbrettd7655fr4n2y '@ricons/utils': 0.1.6_biqbaboplfbrettd7655fr4n2y
dplayer: 1.27.1 dplayer: 1.27.1
highlight.js: 11.7.0 highlight.js: 11.7.0
identicon.js: registry.npmmirror.com/identicon.js/2.3.3
less: 4.1.3 less: 4.1.3
react: 18.2.0 react: 18.2.0
react-dom: 18.2.0_react@18.2.0 react-dom: 18.2.0_react@18.2.0
@ -1451,11 +1461,6 @@ packages:
to-fast-properties: 2.0.0 to-fast-properties: 2.0.0
dev: true dev: true
/@crand/mt19937/3.1.1:
resolution: {integrity: sha512-WqBOxMN7ckc+nFJT6Bt0B5NjOm/IWoNlpy05enZQF/bmlv41gUdn4kwUmbIgqS8lwEn9kmgM2us2tfB9J7rIAg==}
requiresBuild: true
dev: false
/@emotion/hash/0.8.0: /@emotion/hash/0.8.0:
resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==}
dev: false dev: false
@ -1536,13 +1541,6 @@ packages:
resolution: {integrity: sha512-Xe7IImK09HP1sv2M/aI+48a20VX+TdRJucfq4vfRVy6nWN8PYPOEnlMRSgxJAgYQIXJVL8dZ4/ilAM7dWNaOww==} resolution: {integrity: sha512-Xe7IImK09HP1sv2M/aI+48a20VX+TdRJucfq4vfRVy6nWN8PYPOEnlMRSgxJAgYQIXJVL8dZ4/ilAM7dWNaOww==}
dev: true 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: /@types/prop-types/15.7.5:
resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
@ -1679,14 +1677,6 @@ packages:
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
dev: true 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: /color-convert/1.9.3:
resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
dependencies: dependencies:
@ -1752,7 +1742,7 @@ packages:
resolution: {integrity: sha512-n3C4ZH59rveBrUlAD7n0Ze9/gUMKa4dlH1C9CWKpGcIHR/xRcIVXzBGy1iw8WWq2ySmn2/ZqOpySQNAK5Pb6sw==} resolution: {integrity: sha512-n3C4ZH59rveBrUlAD7n0Ze9/gUMKa4dlH1C9CWKpGcIHR/xRcIVXzBGy1iw8WWq2ySmn2/ZqOpySQNAK5Pb6sw==}
dependencies: dependencies:
'@emotion/hash': 0.8.0 '@emotion/hash': 0.8.0
'@types/node': 14.14.45 '@types/node': registry.npmmirror.com/@types/node/14.14.45
csstype: 3.0.11 csstype: 3.0.11
dev: false dev: false
@ -1846,11 +1836,6 @@ packages:
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: true 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: /focus-lock/0.11.6:
resolution: {integrity: sha512-KSuV3ur4gf2KqMNoZx3nXNVhqCkn42GuTYCX4tXPEwf0MjpFQmNMiN6m7dXaUXgIoivL6/65agoUMg4RLS0Vbg==} resolution: {integrity: sha512-KSuV3ur4gf2KqMNoZx3nXNVhqCkn42GuTYCX4tXPEwf0MjpFQmNMiN6m7dXaUXgIoivL6/65agoUMg4RLS0Vbg==}
engines: {node: '>=10'} engines: {node: '>=10'}
@ -2355,10 +2340,6 @@ packages:
fsevents: registry.npmmirror.com/fsevents/2.3.2 fsevents: registry.npmmirror.com/fsevents/2.3.2
dev: true dev: true
/sax/1.2.4:
resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==}
optional: true
/scheduler/0.23.0: /scheduler/0.23.0:
resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
dependencies: dependencies:
@ -2559,6 +2540,117 @@ packages:
fsevents: registry.npmmirror.com/fsevents/2.3.2 fsevents: registry.npmmirror.com/fsevents/2.3.2
dev: true 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: 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} 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' 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/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/parser': registry.npmmirror.com/@babel/parser/7.21.2
'@babel/types': registry.npmmirror.com/@babel/types/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 globals: registry.npmmirror.com/globals/11.12.0
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -4935,7 +5027,7 @@ packages:
name: '@types/accepts' name: '@types/accepts'
version: 1.3.5 version: 1.3.5
dependencies: dependencies:
'@types/node': registry.npmmirror.com/@types/node/18.13.0 '@types/node': registry.npmmirror.com/@types/node/18.14.1
dev: true dev: true
registry.npmmirror.com/@types/body-parser/1.19.2: registry.npmmirror.com/@types/body-parser/1.19.2:
@ -4944,7 +5036,7 @@ packages:
version: 1.19.2 version: 1.19.2
dependencies: dependencies:
'@types/connect': registry.npmmirror.com/@types/connect/3.4.35 '@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 dev: true
registry.npmmirror.com/@types/connect/3.4.35: registry.npmmirror.com/@types/connect/3.4.35:
@ -4952,7 +5044,7 @@ packages:
name: '@types/connect' name: '@types/connect'
version: 3.4.35 version: 3.4.35
dependencies: dependencies:
'@types/node': registry.npmmirror.com/@types/node/18.13.0 '@types/node': registry.npmmirror.com/@types/node/18.14.1
dev: true dev: true
registry.npmmirror.com/@types/content-disposition/0.5.5: 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/connect': registry.npmmirror.com/@types/connect/3.4.35
'@types/express': registry.npmmirror.com/@types/express/4.17.17 '@types/express': registry.npmmirror.com/@types/express/4.17.17
'@types/keygrip': registry.npmmirror.com/@types/keygrip/1.0.2 '@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 dev: true
registry.npmmirror.com/@types/eslint-scope/3.7.4: registry.npmmirror.com/@types/eslint-scope/3.7.4:
@ -5013,7 +5105,7 @@ packages:
name: '@types/express-serve-static-core' name: '@types/express-serve-static-core'
version: 4.17.33 version: 4.17.33
dependencies: 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/qs': registry.npmmirror.com/@types/qs/6.9.7
'@types/range-parser': registry.npmmirror.com/@types/range-parser/1.2.4 '@types/range-parser': registry.npmmirror.com/@types/range-parser/1.2.4
dev: true dev: true
@ -5035,7 +5127,7 @@ packages:
version: 7.2.0 version: 7.2.0
dependencies: dependencies:
'@types/minimatch': registry.npmmirror.com/@types/minimatch/5.1.2 '@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 dev: true
registry.npmmirror.com/@types/history/4.7.11: registry.npmmirror.com/@types/history/4.7.11:
@ -5087,7 +5179,7 @@ packages:
name: '@types/keyv' name: '@types/keyv'
version: 3.1.4 version: 3.1.4
dependencies: dependencies:
'@types/node': 18.14.1 '@types/node': registry.npmmirror.com/@types/node/18.14.1
dev: true dev: true
registry.npmmirror.com/@types/koa-compose/3.2.5: registry.npmmirror.com/@types/koa-compose/3.2.5:
@ -5143,11 +5235,22 @@ packages:
- supports-color - supports-color
dev: true 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: 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} 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' name: '@types/node'
version: 14.18.36 version: 14.18.36
dev: true
registry.npmmirror.com/@types/node/18.13.0: 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} 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 version: 18.13.0
dev: true 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: 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} 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' name: '@types/normalize-package-data'
@ -5233,7 +5341,7 @@ packages:
name: '@types/responselike' name: '@types/responselike'
version: 1.0.0 version: 1.0.0
dependencies: dependencies:
'@types/node': 18.14.1 '@types/node': registry.npmmirror.com/@types/node/18.14.1
dev: true dev: true
registry.npmmirror.com/@types/scheduler/0.16.2: registry.npmmirror.com/@types/scheduler/0.16.2:
@ -5254,7 +5362,7 @@ packages:
version: 1.15.0 version: 1.15.0
dependencies: dependencies:
'@types/mime': registry.npmmirror.com/@types/mime/3.0.1 '@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 dev: true
registry.npmmirror.com/@types/superagent/4.1.14: registry.npmmirror.com/@types/superagent/4.1.14:
@ -5263,7 +5371,7 @@ packages:
version: 4.1.14 version: 4.1.14
dependencies: dependencies:
'@types/cookiejar': registry.npmmirror.com/@types/cookiejar/2.1.2 '@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 dev: true
registry.npmmirror.com/@types/supertest/2.0.12: registry.npmmirror.com/@types/supertest/2.0.12:
@ -5290,9 +5398,17 @@ packages:
name: '@types/whatwg-url' name: '@types/whatwg-url'
version: 8.2.2 version: 8.2.2
dependencies: 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 '@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: 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} 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 id: registry.npmmirror.com/@typescript-eslint/eslint-plugin/5.51.0
@ -8645,6 +8761,17 @@ packages:
- supports-color - supports-color
dev: false 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: 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} 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 name: human-signals
@ -8686,6 +8813,12 @@ packages:
postcss: registry.npmmirror.com/postcss/8.4.21 postcss: registry.npmmirror.com/postcss/8.4.21
dev: true 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: 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} 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 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} 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 name: ini
version: 1.3.8 version: 1.3.8
dev: true
registry.npmmirror.com/ini/2.0.0: 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} 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 version: 27.5.1
engines: {node: '>= 10.13.0'} engines: {node: '>= 10.13.0'}
dependencies: 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 merge-stream: registry.npmmirror.com/merge-stream/2.0.0
supports-color: registry.npmmirror.com/supports-color/8.1.1 supports-color: registry.npmmirror.com/supports-color/8.1.1
dev: true dev: true
@ -9337,6 +9469,14 @@ packages:
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: true 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: 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} 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 name: klona
@ -10176,7 +10316,7 @@ packages:
dependencies: dependencies:
debug: registry.npmmirror.com/debug/3.2.7 debug: registry.npmmirror.com/debug/3.2.7
iconv-lite: registry.npmmirror.com/iconv-lite/0.6.3 iconv-lite: registry.npmmirror.com/iconv-lite/0.6.3
sax: 1.2.4 sax: registry.npmmirror.com/sax/1.2.4
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
optional: true 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} 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 name: sax
version: 1.2.4 version: 1.2.4
dev: false
registry.npmmirror.com/scheduler/0.23.0: 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} 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 is-fullwidth-code-point: registry.npmmirror.com/is-fullwidth-code-point/3.0.0
dev: true 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: 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} 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 name: smart-buffer