【新增】私有证书

This commit is contained in:
cai
2025-09-03 15:15:59 +08:00
parent efd052a297
commit 954cd1638d
442 changed files with 76787 additions and 7483 deletions

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

View File

@@ -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 },
];
})();

View File

@@ -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: {} })
}),
),
]

View File

@@ -0,0 +1 @@
export * from './browser'

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