mirror of
https://gitee.com/mirrors/AllinSSL.git
synced 2026-03-14 02:20:53 +08:00
【新增】私有证书
This commit is contained in:
11
frontend/apps/domain-management-backend/src/mocks/browser.ts
Normal file
11
frontend/apps/domain-management-backend/src/mocks/browser.ts
Normal file
@@ -0,0 +1,11 @@
|
||||
import { setupWorker } from 'msw/browser'
|
||||
import { rechargeHandlers } from './handlers/recharge'
|
||||
|
||||
export const worker = setupWorker(...rechargeHandlers)
|
||||
|
||||
export const startMock = async () => {
|
||||
if (typeof window === 'undefined') return
|
||||
if ((window as any).__MSW_STARTED__) return
|
||||
await worker.start({ onUnhandledRequest: 'bypass' })
|
||||
;(window as any).__MSW_STARTED__ = true
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
import { nowSec, fen } from '../utils';
|
||||
|
||||
export type PayChangeItem = {
|
||||
create_time: number;
|
||||
credit: number; // 分,可正可负
|
||||
type: 1 | 2 | 3 | 4 | 5;
|
||||
rest_credit: number; // 分
|
||||
remark?: string;
|
||||
};
|
||||
|
||||
export type RechargeItem = {
|
||||
pay_time: number;
|
||||
credit: number; // 分
|
||||
channel: 1 | 2 | 3 | 4;
|
||||
status: 0 | 1 | 2;
|
||||
invoice_status: 0 | 1;
|
||||
};
|
||||
|
||||
// 内存库
|
||||
export const db = {
|
||||
balanceFen: fen(1580.5),
|
||||
payChanges: [] as PayChangeItem[],
|
||||
recharges: [] as RechargeItem[],
|
||||
orders: new Map<string, { times: number; price: number; channel: 1 | 2 }>(),
|
||||
};
|
||||
|
||||
// 初始化一些记录
|
||||
(() => {
|
||||
const base = nowSec();
|
||||
const seed: PayChangeItem[] = [
|
||||
{ create_time: base - 3600 * 24 * 1, credit: -fen(50), type: 3, rest_credit: fen(1580.5), remark: '注册域名 example.com' },
|
||||
{ create_time: base - 3600 * 24 * 2, credit: -fen(30), type: 4, rest_credit: fen(1630.5), remark: '续费域名 test.com' },
|
||||
{ create_time: base - 3600 * 24 * 3, credit: fen(500), type: 1, rest_credit: fen(1660.5), remark: '支付宝充值' },
|
||||
];
|
||||
db.payChanges = seed;
|
||||
db.recharges = [
|
||||
{ pay_time: base - 3600 * 24 * 3, credit: fen(500), channel: 2, status: 1, invoice_status: 0 },
|
||||
{ pay_time: base - 3600 * 24 * 6, credit: fen(1000), channel: 1, status: 1, invoice_status: 1 },
|
||||
{ pay_time: base - 3600 * 24 * 10, credit: fen(200), channel: 3, status: 2, invoice_status: 0 },
|
||||
];
|
||||
})();
|
||||
@@ -0,0 +1,71 @@
|
||||
import { http, HttpResponse } from 'msw'
|
||||
import { db } from '../data/recharge'
|
||||
import { paginate, sleep, fen, nowSec } from '../utils'
|
||||
|
||||
const p = (path: string) => [path, `/proxy/api${path}`] as const
|
||||
|
||||
export const rechargeHandlers = [
|
||||
// 余额账单
|
||||
...p('/credit_sys/credit/get_credit_change_logs').map((path) =>
|
||||
http.post(path, async ({ request }) => {
|
||||
const body = (await request.json()) as { page: number; pageSize: number }
|
||||
const { slice, total } = paginate(db.payChanges.sort((a, b) => b.create_time - a.create_time), body.page, body.pageSize)
|
||||
await sleep(300)
|
||||
return HttpResponse.json({ success: true, res: { list: slice, total } })
|
||||
}),
|
||||
),
|
||||
|
||||
// 充值记录 + 可开票金额
|
||||
...p('/credit_sys/credit/get_credit_add_records').map((path) =>
|
||||
http.post(path, async ({ request }) => {
|
||||
const body = (await request.json()) as { page: number; pageSize: number }
|
||||
const { slice, total } = paginate(db.recharges.sort((a, b) => b.pay_time - a.pay_time), body.page, body.pageSize)
|
||||
const can_invoice_fee = Math.max(0, Math.floor(db.recharges.filter(r => r.status === 1).reduce((s, r) => s + r.credit, 0) * 0.8))
|
||||
await sleep(300)
|
||||
return HttpResponse.json({ success: true, res: { list: slice, total, can_invoice_fee } })
|
||||
}),
|
||||
),
|
||||
|
||||
// 发起充值
|
||||
...p('/credit_sys/credit/add').map((path) =>
|
||||
http.post(path, async ({ request }) => {
|
||||
const body = (await request.json()) as { credit: number }
|
||||
const priceYuan = (body.credit || 0) / 100
|
||||
const ca_id = 'MOCK-' + Math.random().toString(36).slice(2)
|
||||
// 默认先插入一条充值记录(待完成)
|
||||
db.orders.set(ca_id, { times: 0, price: priceYuan, channel: 1 })
|
||||
await sleep(400)
|
||||
return HttpResponse.json({
|
||||
success: true,
|
||||
res: {
|
||||
title: '账户充值',
|
||||
ca_id,
|
||||
wx: 'https://pay.mock/wechat/' + ca_id,
|
||||
ali: 'https://pay.mock/alipay/' + ca_id,
|
||||
price: priceYuan,
|
||||
},
|
||||
})
|
||||
}),
|
||||
),
|
||||
|
||||
// 轮询支付状态
|
||||
...p('/credit_sys/credit/get_pay_status').map((path) =>
|
||||
http.post(path, async ({ request }) => {
|
||||
const body = (await request.json()) as { ca_id: string }
|
||||
const order = db.orders.get(body.ca_id)
|
||||
if (!order) return HttpResponse.json({ success: true, res: {} })
|
||||
order.times += 1
|
||||
await sleep(500)
|
||||
if (order.times >= 3) {
|
||||
// 标记成功,写入充值记录与账单
|
||||
const creditFen = fen(order.price)
|
||||
const now = nowSec()
|
||||
db.recharges.unshift({ pay_time: now, credit: creditFen, channel: order.channel, status: 1, invoice_status: 0 })
|
||||
db.payChanges.unshift({ create_time: now, credit: creditFen, type: 1, rest_credit: (db.payChanges[0]?.rest_credit || 0) + creditFen, remark: '充值入账' })
|
||||
db.orders.delete(body.ca_id)
|
||||
return HttpResponse.json({ success: true, res: { channel: order.channel, status: 1 } })
|
||||
}
|
||||
return HttpResponse.json({ success: true, res: {} })
|
||||
}),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1 @@
|
||||
export * from './browser'
|
||||
13
frontend/apps/domain-management-backend/src/mocks/utils.ts
Normal file
13
frontend/apps/domain-management-backend/src/mocks/utils.ts
Normal file
@@ -0,0 +1,13 @@
|
||||
export const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));
|
||||
|
||||
export const paginate = <T>(list: T[], page: number, pageSize: number) => {
|
||||
const start = (page - 1) * pageSize;
|
||||
const end = start + pageSize;
|
||||
return { slice: list.slice(start, end), total: list.length };
|
||||
};
|
||||
|
||||
export const nowSec = () => Math.floor(Date.now() / 1000);
|
||||
|
||||
export const fen = (yuan: number) => Math.round(yuan * 100);
|
||||
|
||||
export const yuan = (fenVal: number) => Number((fenVal / 100).toFixed(2));
|
||||
Reference in New Issue
Block a user