## GitHub 同步说明 | 项 | 内容 | |:---|:---| | 仓库 | https://github.com/fnvtk/cunkebao_v3 | | 分支 | develop | | 方向 | 本地 → GitHub(单向 push) | | 是否拉取远程 | 否(未 fetch / pull / merge) | | 是否改本地源文件 | 否(仅 git add/commit,未编辑业务/文档正文) | | 远程基准 | origin/develop @b5b40e8b| | 本批工作区变更 | 999 files, +47622 / -4007 lines | ## 一并推送的本地已有 commit(此前未 push) 1.3aa7ecf8deploy: 官网 ckb.quwanzhi.com 宝塔上线 DNS+SSL+验收文档 2.16a70045fix(官网): 桌面导航仅保留一个留资 CTA 并重新上线 3.dbe7b7aafix(官网): Hero 改为主 CTA 按钮并去掉重复 1200+ 数据条 4.ac82726echore(部署): 五端上线验收46项并统一留资与缓存版本 ## 本 commit 目录统计 | 目录 | 文件数 | 说明 | |:---|---:|:---| | 开发文档/ | 639 | 10、项目管理、未完成项跨仓汇总、五端需求/部署/接口 | | Server/ | 129 | 后端 API、迁移、部署相关 | | Touchkebao/ | 80 | PC 工作台、获客、算力 | | 官网/ | 61 | ckb.quwanzhi.com 静态站与 CTA 迭代 | | Cunkebao/ | 49 | 移动端场景/设置/流量池 | | SuperAdmin/ | 26 | 超管后台 | | .cursor/ | 11 | 规则与 Skill | | 其他 | 14 | docker-compose、.obsidian、.codegraph 等 | ## 重点文件(本地为准) - 开发文档/1、需求/修改/未完成项与跨仓验收汇总.md - 开发文档/10、项目管理/账号密码与登录环境一览.md - 开发文档/10、项目管理/(新建项目管理目录与截图) - 官网/ 全站 + 宝塔上线文档 - 五端上线验收 46 项(见 ac82726e) ## 刻意未上传 - node_modules/、.DS_Store、.smart-env/ - .开发文档_nested_git_backup/ - **/__pycache__/ ## 验收 - 提交页(含本说明): https://github.com/fnvtk/cunkebao_v3/commit/HEAD - 分支树: https://github.com/fnvtk/cunkebao_v3/tree/develop Co-authored-by: Cursor <cursoragent@cursor.com>
118 lines
3.1 KiB
TypeScript
118 lines
3.1 KiB
TypeScript
import { apiRequest, ApiResponse } from "./api-utils";
|
||
|
||
export interface PowerSettings {
|
||
tokensPerYuan: number;
|
||
range: { min: number; max: number };
|
||
note: string;
|
||
updatedBy?: string;
|
||
updateTime?: string;
|
||
dailyFreeTokens?: number;
|
||
dailyFreeEnabled?: boolean;
|
||
dailyFreeRange?: { min: number; max: number };
|
||
}
|
||
|
||
export interface CatalogItem {
|
||
action: number;
|
||
slug: string;
|
||
displayName: string;
|
||
adminName: string;
|
||
cost: number;
|
||
unit: string;
|
||
unitLabel: string;
|
||
scenePack: string;
|
||
group: string;
|
||
status: number;
|
||
}
|
||
|
||
export interface ScenePackGroup {
|
||
id: string;
|
||
name: string;
|
||
desc: string;
|
||
items: CatalogItem[];
|
||
}
|
||
|
||
export interface CatalogResponse {
|
||
tokensPerYuan: number;
|
||
scenePacks: ScenePackGroup[];
|
||
catalog: CatalogItem[];
|
||
}
|
||
|
||
export interface TokenPackage {
|
||
id: number;
|
||
packageCode: string;
|
||
name: string;
|
||
subtitle: string;
|
||
badge: string;
|
||
price: number;
|
||
originalPrice: number;
|
||
tokens: number;
|
||
sort: number;
|
||
status: number;
|
||
}
|
||
|
||
export interface PowerInsights {
|
||
tokensPerYuan: number;
|
||
todaySpend: number;
|
||
monthSpend: number;
|
||
monthYuan: number;
|
||
scenePackStats: { id: string; name: string; tokens: number }[];
|
||
topProjects: { companyId: number; projectName: string; tokens: number }[];
|
||
}
|
||
|
||
export function getPowerSettings(): Promise<ApiResponse<PowerSettings>> {
|
||
return apiRequest("/power-billing/settings");
|
||
}
|
||
|
||
export function updatePowerSettings(payload: {
|
||
tokensPerYuan?: number;
|
||
dailyFreeTokens?: number;
|
||
dailyFreeEnabled?: boolean;
|
||
}): Promise<ApiResponse<PowerSettings>> {
|
||
return apiRequest("/power-billing/settings", "PUT", payload);
|
||
}
|
||
|
||
export function getPowerCatalog(): Promise<ApiResponse<CatalogResponse>> {
|
||
return apiRequest("/power-billing/catalog");
|
||
}
|
||
|
||
export function updateCatalogItem(
|
||
slug: string,
|
||
patch: Partial<Pick<CatalogItem, "cost" | "displayName" | "adminName" | "status" | "unit">>,
|
||
): Promise<ApiResponse<CatalogItem>> {
|
||
return apiRequest(`/power-billing/catalog/${encodeURIComponent(slug)}`, "PUT", patch);
|
||
}
|
||
|
||
export function resetCatalogItem(slug: string): Promise<ApiResponse<CatalogItem>> {
|
||
return apiRequest(`/power-billing/catalog/reset/${encodeURIComponent(slug)}`, "POST");
|
||
}
|
||
|
||
// 新增自定义收费项(§六 V12)
|
||
export interface NewCatalogPayload {
|
||
slug: string;
|
||
displayName: string;
|
||
scenePack?: string;
|
||
cost?: number;
|
||
unit?: string;
|
||
adminName?: string;
|
||
}
|
||
|
||
export function addCatalogItem(payload: NewCatalogPayload): Promise<ApiResponse<CatalogItem>> {
|
||
return apiRequest("/power-billing/catalog", "POST", payload);
|
||
}
|
||
|
||
export function getPowerPackages(): Promise<ApiResponse<{ tokensPerYuan: number; list: TokenPackage[] }>> {
|
||
return apiRequest("/power-billing/packages");
|
||
}
|
||
|
||
export function savePowerPackage(payload: Partial<TokenPackage>): Promise<ApiResponse<{ id: number }>> {
|
||
return apiRequest("/power-billing/packages", "POST", payload);
|
||
}
|
||
|
||
export function recalcPowerPackages(): Promise<ApiResponse<{ updated: number }>> {
|
||
return apiRequest("/power-billing/packages/recalc", "POST");
|
||
}
|
||
|
||
export function getPowerInsights(): Promise<ApiResponse<PowerInsights>> {
|
||
return apiRequest("/power-billing/insights");
|
||
}
|