fix
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -228,4 +228,5 @@ secrets/
|
|||||||
*.pem
|
*.pem
|
||||||
*.key
|
*.key
|
||||||
*.cert
|
*.cert
|
||||||
|
*.md
|
||||||
|
!README.md
|
||||||
|
|||||||
217
README.md
217
README.md
@@ -1,137 +1,88 @@
|
|||||||
# 报告查看器 - 独立 Vue3 项目
|
## 报告查看器(report-viewer)
|
||||||
|
|
||||||
这是一个独立的 Vue3 项目,用于展示报告组件。项目使用本地 JSON 文件(`example.json`)作为数据源,不依赖网络请求。
|
一个基于 **Vue 3 + Vite + Tailwind CSS + Vant** 的移动端报告查看器,用于展示各类风控 / 报告数据(如司法涉诉、消费交易特征等),支持图表可视化和多页报告浏览。
|
||||||
|
|
||||||
## 📋 已包含的组件
|
|
||||||
|
|
||||||
1. **DWBG6A2C** - 司南报告(包含所有子模块)
|
|
||||||
2. **FLXG0V4B** - 司法涉诉
|
|
||||||
3. **QYGL3F8E** - 人企关系加强版(包含所有子模块)
|
|
||||||
4. **JRZQ4B6C** - 信贷表现
|
|
||||||
5. **JRZQ09J8** - 收入评估
|
|
||||||
6. **QCXG9P1C** - 名下车辆
|
|
||||||
7. **DWBG8B4D** - 谛听多维报告(包含所有子模块)
|
|
||||||
|
|
||||||
## 🚀 快速开始
|
|
||||||
|
|
||||||
### 1. 安装依赖
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd report-viewer
|
|
||||||
npm install
|
|
||||||
# 或
|
|
||||||
pnpm install
|
|
||||||
# 或
|
|
||||||
yarn install
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. 启动开发服务器
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm run dev
|
|
||||||
```
|
|
||||||
|
|
||||||
访问:`http://localhost:3000`
|
|
||||||
|
|
||||||
### 3. 构建生产版本
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm run build
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📁 项目结构
|
|
||||||
|
|
||||||
```
|
|
||||||
report-viewer/
|
|
||||||
├── public/
|
|
||||||
│ └── example.json # 示例数据文件
|
|
||||||
├── src/
|
|
||||||
│ ├── components/ # 基础组件
|
|
||||||
│ │ ├── BaseReport.vue # ⭐ 核心组件
|
|
||||||
│ │ ├── GaugeChart.vue
|
|
||||||
│ │ ├── ShareReportButton.vue
|
|
||||||
│ │ └── ...
|
|
||||||
│ ├── views/
|
|
||||||
│ │ └── Report.vue # ⭐ 报告页面
|
|
||||||
│ ├── ui/ # ⭐ 业务组件
|
|
||||||
│ │ ├── DWBG6A2C/ # 司南报告
|
|
||||||
│ │ ├── CFLXG0V4B/ # 司法涉诉
|
|
||||||
│ │ ├── CQYGL3F8E/ # 人企关系加强版
|
|
||||||
│ │ ├── JRZQ4B6C/ # 信贷表现
|
|
||||||
│ │ ├── JRZQ09J8/ # 收入评估
|
|
||||||
│ │ ├── CQCXG9P1C.vue # 名下车辆
|
|
||||||
│ │ └── CDWBG8B4D/ # 谛听多维报告
|
|
||||||
│ ├── assets/ # 样式和图片
|
|
||||||
│ └── composables/ # 工具函数(已移除网络请求)
|
|
||||||
├── package.json
|
|
||||||
├── vite.config.js
|
|
||||||
└── tailwind.config.js
|
|
||||||
```
|
|
||||||
|
|
||||||
## ⚙️ 配置说明
|
|
||||||
|
|
||||||
### 数据源
|
|
||||||
|
|
||||||
项目从 `public/example.json` 加载示例数据。可以直接修改该文件来更新显示的内容。
|
|
||||||
|
|
||||||
### 已移除的功能
|
|
||||||
|
|
||||||
- ✅ 产品背景图片(已移除背景图显示)
|
|
||||||
- ✅ 网络请求(改为从本地 JSON 文件加载)
|
|
||||||
- ✅ API 调用(ShareReportButton 在示例模式下不进行网络请求)
|
|
||||||
|
|
||||||
## 📝 使用说明
|
|
||||||
|
|
||||||
1. 启动项目后,会自动加载 `public/example.json` 中的数据
|
|
||||||
2. 数据会自动排序并显示在报告页面中
|
|
||||||
3. 所有组件都会根据数据进行渲染
|
|
||||||
|
|
||||||
## 🔧 注意事项
|
|
||||||
|
|
||||||
1. **图片资源**:确保所有必要的图片文件已复制到 `src/assets/images/` 目录
|
|
||||||
2. **样式依赖**:项目依赖 Tailwind CSS 和 Vant UI,确保正确引入
|
|
||||||
3. **浏览器兼容**:需要现代浏览器支持(ES2015+)
|
|
||||||
4. **数据格式**:`example.json` 必须符合组件期望的数据结构
|
|
||||||
|
|
||||||
## 📦 依赖说明
|
|
||||||
|
|
||||||
### 核心依赖
|
|
||||||
|
|
||||||
- **vue** ^3.5.12 - Vue 框架
|
|
||||||
- **vue-router** ^4.4.5 - 路由管理
|
|
||||||
- **vant** ^4.9.9 - UI 组件库
|
|
||||||
- **echarts** ^5.5.1 - 图表库
|
|
||||||
- **vue-echarts** ^7.0.3 - Vue ECharts 封装
|
|
||||||
- **@vueuse/core** ^11.3.0 - Vue 工具库
|
|
||||||
- **lodash** ^4.17.21 - 工具函数库
|
|
||||||
|
|
||||||
### 开发依赖
|
|
||||||
|
|
||||||
- **vite** ^5.4.10 - 构建工具
|
|
||||||
- **tailwindcss** ^3.4.15 - CSS 框架
|
|
||||||
- **@vitejs/plugin-vue** - Vite Vue 插件
|
|
||||||
- **unplugin-auto-import** - 自动导入插件
|
|
||||||
- **unplugin-vue-components** - 自动组件导入插件
|
|
||||||
|
|
||||||
## 🐛 常见问题
|
|
||||||
|
|
||||||
### Q: 图片加载失败?
|
|
||||||
A: 确保图片文件已复制到 `src/assets/images/report/` 目录
|
|
||||||
|
|
||||||
### Q: 样式不生效?
|
|
||||||
A: 确保 `tailwind.config.js` 中包含了正确的 content 路径
|
|
||||||
|
|
||||||
### Q: 数据不显示?
|
|
||||||
A: 检查 `public/example.json` 文件格式是否正确,确保数据符合组件期望的结构
|
|
||||||
|
|
||||||
## 📞 技术支持
|
|
||||||
|
|
||||||
如有问题,请检查:
|
|
||||||
1. 控制台错误信息
|
|
||||||
2. `public/example.json` 文件是否存在且格式正确
|
|
||||||
3. 依赖是否正确安装
|
|
||||||
4. 文件路径是否正确
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**提示**:这是一个独立的 Vue3 项目,使用本地 JSON 文件作为数据源,无需后端 API 支持。
|
## 功能概览
|
||||||
|
|
||||||
|
- **报告展示**:按模块展示多种报告内容与字段说明
|
||||||
|
- **图表可视化**:基于 `ECharts` 和 `vue-echarts` 渲染图表
|
||||||
|
- **移动端 UI**:使用 `Vant 4` 组件库,适配手机端浏览体验
|
||||||
|
- **组合式 API**:使用 Vue 3 组合式写法封装业务逻辑(如风险提示 hook 等)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 技术栈
|
||||||
|
|
||||||
|
- **框架**:Vue 3
|
||||||
|
- **构建工具**:Vite
|
||||||
|
- **UI 组件库**:Vant 4
|
||||||
|
- **样式**:Tailwind CSS、Sass
|
||||||
|
- **数据请求**:Axios
|
||||||
|
- **图表**:ECharts、vue-echarts
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 环境要求
|
||||||
|
|
||||||
|
- **Node.js**:建议 >= 18
|
||||||
|
- **包管理器**:推荐使用 `pnpm`(项目中已指定 `pnpm` 版本)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 安装与运行
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 安装依赖(推荐)
|
||||||
|
pnpm install
|
||||||
|
|
||||||
|
# 如果使用 npm / yarn,也可以:
|
||||||
|
# npm install
|
||||||
|
# 或
|
||||||
|
# yarn install
|
||||||
|
```
|
||||||
|
|
||||||
|
### 本地开发
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm dev
|
||||||
|
```
|
||||||
|
|
||||||
|
启动后,按终端提示在浏览器中访问对应地址(通常为 `http://localhost:5173`)。
|
||||||
|
|
||||||
|
### 打包构建
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm build
|
||||||
|
```
|
||||||
|
|
||||||
|
构建产物会输出到 `dist` 目录,可部署到任意静态资源服务器。
|
||||||
|
|
||||||
|
### 预览构建结果
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm preview
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 目录结构(简要)
|
||||||
|
|
||||||
|
以下仅列出与前端页面关系最紧密的部分:
|
||||||
|
|
||||||
|
- `src/main.js`:应用入口文件,挂载 Vue 应用
|
||||||
|
- `src/views/Report.vue`:报告主页面
|
||||||
|
- `src/ui/`:报告相关的 UI 组件(如 `CIVYZ9A2B.vue` 等)
|
||||||
|
- `src/composables/`:组合式函数(如 `useRiskNotifier` 等)
|
||||||
|
- `tailwind.config.js`:Tailwind CSS 配置
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 开发说明
|
||||||
|
|
||||||
|
- 若需新增报告模块,建议:
|
||||||
|
- 在 `src/ui/` 下新增对应的 Vue 组件
|
||||||
|
- 在 `Report.vue` 中注册或路由中引用新组件
|
||||||
|
- 如需共享逻辑,可在 `src/composables/` 中抽离成 hook
|
||||||
|
- 图表相关逻辑优先封装在单独组件或 composable 中,避免在视图中直接写大量配置。
|
||||||
|
|||||||
32
d.md
32
d.md
@@ -1,32 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
## 请求参数
|
|
||||||
|
|
||||||
| 参数code | 参数名称 | 描述&备注 |
|
|
||||||
| --------- | -------- | --------- |
|
|
||||||
| name | 姓名 | **必填** |
|
|
||||||
| bank_card | 银行卡号 | **必填** |
|
|
||||||
| id_card | 身份证号 | **必填** |
|
|
||||||
| mobile_no | 手机号 | 选填 |
|
|
||||||
|
|
||||||
## 返回参数
|
|
||||||
|
|
||||||
| 参数code | 参数名称 | 描述&备注 |
|
|
||||||
| ------------ | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
||||||
| name | 姓名 | - |
|
|
||||||
| cardNo | 身份证号 | - |
|
|
||||||
| cardId | 卡号 | - |
|
|
||||||
| phone | 手机号 | - |
|
|
||||||
| respCode | 验证结果代码 | 详见响应码说明 |
|
|
||||||
| respDesc | 验证结果信息 | 详见响应码说明 |
|
|
||||||
| respDetail | 验证结果详情 | 验证不通过时的详细说明<br>• 卡状态异常,请换卡重试或联系发卡行<br>• 无效卡号或卡状态异常,请换卡重试或联系发卡行 |
|
|
||||||
| cardType | 卡类型 | 可能值:<br>• 贷记卡<br>• 准贷记卡<br>• 预付卡<br>• 借记卡 |
|
|
||||||
| cardCategory | 卡等级 | 可能值:<br>• 银联支付标记<br>• 无限卡<br>• 准贷记卡<br>• 社保卡<br>• 电子现金卡<br>• 公务卡<br>• 预付卡<br>• 普卡<br>• 白金卡<br>• 钻石卡<br>• 借记卡<br>• 金卡<br>• 小额贷款卡<br>• 信用卡 |
|
|
||||||
| cardName | 银行名称 | - |
|
|
||||||
|
|
||||||
## 响应码说明 (respCode & respDesc)
|
|
||||||
|
|
||||||
| respCode | respDesc |
|
|
||||||
| -------- | ---------- |
|
|
||||||
| 2000 | 认证一致 |
|
|
||||||
| 2001 | 认证不一致 |
|
|
||||||
206
demo.html
206
demo.html
@@ -1,206 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="zh">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<title>系统流 卡牌对战 Demo</title>
|
|
||||||
<style>
|
|
||||||
body {
|
|
||||||
background: #111;
|
|
||||||
color: #eee;
|
|
||||||
font-family: sans-serif;
|
|
||||||
padding: 20px;
|
|
||||||
}
|
|
||||||
#log {
|
|
||||||
background: #222;
|
|
||||||
padding: 10px;
|
|
||||||
height: 250px;
|
|
||||||
overflow-y: auto;
|
|
||||||
border: 1px solid #444;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
white-space: pre-line;
|
|
||||||
}
|
|
||||||
.card {
|
|
||||||
display: inline-block;
|
|
||||||
background: #333;
|
|
||||||
border: 1px solid #666;
|
|
||||||
padding: 10px;
|
|
||||||
margin: 5px;
|
|
||||||
cursor: pointer;
|
|
||||||
width: 160px;
|
|
||||||
}
|
|
||||||
.card:hover {
|
|
||||||
background: #444;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h2>《系统流:校园日常攻略》卡牌演示 Demo</h2>
|
|
||||||
|
|
||||||
<div id="stats"></div>
|
|
||||||
<div id="log"></div>
|
|
||||||
<h3>我的手牌</h3>
|
|
||||||
<div id="cards"></div>
|
|
||||||
<button onclick="nextTurn()" style="margin-top: 10px">重新抽卡</button>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
/////////////////////////////////////////////////////
|
|
||||||
// 游戏初始配置
|
|
||||||
/////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
let player = {
|
|
||||||
favor: 0, // 女生对玩家好感
|
|
||||||
energy: 100,
|
|
||||||
};
|
|
||||||
|
|
||||||
let npc = {
|
|
||||||
favor: 30, // 初始好感
|
|
||||||
};
|
|
||||||
|
|
||||||
let systemTask = {
|
|
||||||
desc: "让对方情绪波动 +10",
|
|
||||||
target: 10,
|
|
||||||
progress: 0,
|
|
||||||
};
|
|
||||||
|
|
||||||
// 卡牌池 —— 演示可後续扩展
|
|
||||||
const cardPool = [
|
|
||||||
{
|
|
||||||
name: "夸赞(行动卡)",
|
|
||||||
type: "action",
|
|
||||||
effect: () => changeFavor(3),
|
|
||||||
desc: "+3 好感",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "冷幽默(行动卡)",
|
|
||||||
type: "action",
|
|
||||||
effect: () => changeFavor(5),
|
|
||||||
desc: "+5 好感",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "装酷(行动卡)",
|
|
||||||
type: "action",
|
|
||||||
effect: () => changeFavor(1),
|
|
||||||
desc: "+1 好感",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "系统加持(系统卡)",
|
|
||||||
type: "system",
|
|
||||||
effect: () =>
|
|
||||||
changeFavor(Math.floor(Math.random() * 6) + 2),
|
|
||||||
desc: "随机 +2~7 好感",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "语言暴击(系统卡)",
|
|
||||||
type: "system",
|
|
||||||
effect: () => changeFavor(8),
|
|
||||||
desc: "+8 好感",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "冷场(情绪负面)",
|
|
||||||
type: "bad",
|
|
||||||
effect: () => changeFavor(-4),
|
|
||||||
desc: "-4 好感",
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
// 当前手牌
|
|
||||||
let hand = [];
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
|
||||||
// 功能函数
|
|
||||||
/////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
// 抽牌
|
|
||||||
function drawCards(num = 3) {
|
|
||||||
hand = [];
|
|
||||||
for (let i = 0; i < num; i++) {
|
|
||||||
let c =
|
|
||||||
cardPool[Math.floor(Math.random() * cardPool.length)];
|
|
||||||
hand.push(c);
|
|
||||||
}
|
|
||||||
render();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 使用卡牌
|
|
||||||
function playCard(index) {
|
|
||||||
let card = hand[index];
|
|
||||||
writeLog(`你使用了【${card.name}】 → ${card.desc}`);
|
|
||||||
card.effect();
|
|
||||||
systemCheck();
|
|
||||||
npcAction();
|
|
||||||
drawCards();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 修改好感 / 数值
|
|
||||||
function changeFavor(v) {
|
|
||||||
npc.favor += v;
|
|
||||||
systemTask.progress += v;
|
|
||||||
if (npc.favor < 0) npc.favor = 0;
|
|
||||||
render();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 系统任务检测
|
|
||||||
function systemCheck() {
|
|
||||||
if (systemTask.progress >= systemTask.target) {
|
|
||||||
writeLog(`📢 系统任务达成:${systemTask.desc}`);
|
|
||||||
writeLog(`奖励:获得 500万软妹币(精神上的)`);
|
|
||||||
systemTask = {
|
|
||||||
desc: "让女生惊讶一次(好感一次增长≥6)",
|
|
||||||
target: 6,
|
|
||||||
progress: 0,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NPC 回合逻辑(简单演示)
|
|
||||||
function npcAction() {
|
|
||||||
let r = Math.random();
|
|
||||||
if (r < 0.5) {
|
|
||||||
writeLog("女生回应:嗯……还不错。");
|
|
||||||
} else if (r < 0.8) {
|
|
||||||
writeLog("女生:你怎么突然这样?(情绪波动+3)");
|
|
||||||
changeFavor(3);
|
|
||||||
} else {
|
|
||||||
writeLog("女生:无语……你是系统选中的人吗?(好感-2)");
|
|
||||||
changeFavor(-2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 日志输出
|
|
||||||
function writeLog(t) {
|
|
||||||
let log = document.getElementById("log");
|
|
||||||
log.innerHTML += t + "\n";
|
|
||||||
log.scrollTop = log.scrollHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
// UI 渲染
|
|
||||||
function render() {
|
|
||||||
document.getElementById("stats").innerHTML =
|
|
||||||
`女生好感:${npc.favor} ` +
|
|
||||||
`任务:${systemTask.desc}(当前进度 ${systemTask.progress}/${systemTask.target})`;
|
|
||||||
|
|
||||||
let cardDiv = document.getElementById("cards");
|
|
||||||
cardDiv.innerHTML = "";
|
|
||||||
hand.forEach((c, i) => {
|
|
||||||
let div = document.createElement("div");
|
|
||||||
div.className = "card";
|
|
||||||
div.innerHTML = `<b>${c.name}</b><br>${c.desc}`;
|
|
||||||
div.onclick = () => playCard(i);
|
|
||||||
cardDiv.appendChild(div);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// 下一回合(抽新卡)
|
|
||||||
function nextTurn() {
|
|
||||||
drawCards();
|
|
||||||
}
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
|
||||||
// 开始
|
|
||||||
/////////////////////////////////////////////////////
|
|
||||||
writeLog("系统启动:新手引导中……");
|
|
||||||
writeLog("任务:让对方情绪波动 +10");
|
|
||||||
drawCards();
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
695
demo2.html
695
demo2.html
@@ -1,695 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="zh-CN">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<title>天选打工人 - 系统对战Demo</title>
|
|
||||||
<style>
|
|
||||||
:root {
|
|
||||||
--primary: #00ff9d; /* 赛博绿 */
|
|
||||||
--danger: #ff0055; /* 故障红 */
|
|
||||||
--bg: #0a0a0a;
|
|
||||||
--card-bg: #1a1a1a;
|
|
||||||
--text: #e0e0e0;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
font-family: "Consolas", "Courier New", monospace;
|
|
||||||
background-color: var(--bg);
|
|
||||||
color: var(--text);
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
height: 100vh;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --- 顶部:敌人区域 --- */
|
|
||||||
#enemy-area {
|
|
||||||
flex: 2;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
border-bottom: 1px solid #333;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.avatar {
|
|
||||||
width: 100px;
|
|
||||||
height: 100px;
|
|
||||||
background: #333;
|
|
||||||
border: 2px solid var(--danger);
|
|
||||||
border-radius: 50%;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
font-size: 40px;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
transition: transform 0.1s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hp-bar-container {
|
|
||||||
width: 200px;
|
|
||||||
height: 20px;
|
|
||||||
background: #333;
|
|
||||||
border: 1px solid #555;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hp-bar-fill {
|
|
||||||
height: 100%;
|
|
||||||
background: var(--danger);
|
|
||||||
width: 100%;
|
|
||||||
transition: width 0.3s ease-out;
|
|
||||||
}
|
|
||||||
|
|
||||||
.intent-bubble {
|
|
||||||
margin-top: 10px;
|
|
||||||
background: #222;
|
|
||||||
padding: 5px 10px;
|
|
||||||
border-radius: 10px;
|
|
||||||
border: 1px solid var(--danger);
|
|
||||||
color: var(--danger);
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --- 中间:战斗日志 (LLM文字流) --- */
|
|
||||||
#battle-log {
|
|
||||||
flex: 3;
|
|
||||||
overflow-y: auto;
|
|
||||||
padding: 20px;
|
|
||||||
background: rgba(0, 20, 10, 0.5);
|
|
||||||
border-bottom: 1px solid #333;
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 1.6;
|
|
||||||
}
|
|
||||||
|
|
||||||
.log-entry {
|
|
||||||
margin-bottom: 8px;
|
|
||||||
opacity: 0.8;
|
|
||||||
}
|
|
||||||
.log-system {
|
|
||||||
color: var(--primary);
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
.log-player {
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
.log-enemy {
|
|
||||||
color: var(--danger);
|
|
||||||
}
|
|
||||||
.log-desc {
|
|
||||||
color: #888;
|
|
||||||
font-style: italic;
|
|
||||||
font-size: 0.9em;
|
|
||||||
margin-left: 10px;
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --- 底部:玩家区域 --- */
|
|
||||||
#player-area {
|
|
||||||
flex: 3;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
background: #111;
|
|
||||||
padding: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#stats-bar {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-around;
|
|
||||||
padding: 10px;
|
|
||||||
background: #000;
|
|
||||||
border: 1px solid #333;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.stat-item {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 5px;
|
|
||||||
}
|
|
||||||
.icon {
|
|
||||||
font-size: 1.2em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --- 卡牌区域 --- */
|
|
||||||
#hand-container {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
gap: 10px;
|
|
||||||
flex-grow: 1;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card {
|
|
||||||
width: 120px;
|
|
||||||
height: 160px;
|
|
||||||
background: var(--card-bg);
|
|
||||||
border: 1px solid var(--primary);
|
|
||||||
border-radius: 8px;
|
|
||||||
padding: 10px;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: space-between;
|
|
||||||
cursor: pointer;
|
|
||||||
transition: transform 0.2s, box-shadow 0.2s;
|
|
||||||
user-select: none;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card:hover {
|
|
||||||
transform: translateY(-20px) scale(1.05);
|
|
||||||
box-shadow: 0 0 15px rgba(0, 255, 157, 0.3);
|
|
||||||
z-index: 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-cost {
|
|
||||||
background: var(--primary);
|
|
||||||
color: #000;
|
|
||||||
width: 25px;
|
|
||||||
height: 25px;
|
|
||||||
border-radius: 50%;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
font-weight: bold;
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-name {
|
|
||||||
font-weight: bold;
|
|
||||||
color: var(--primary);
|
|
||||||
font-size: 14px;
|
|
||||||
text-align: center;
|
|
||||||
margin-top: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-desc {
|
|
||||||
font-size: 11px;
|
|
||||||
color: #aaa;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-type-attack {
|
|
||||||
border-color: #ff4444;
|
|
||||||
}
|
|
||||||
.card-type-skill {
|
|
||||||
border-color: #4488ff;
|
|
||||||
}
|
|
||||||
.card-type-money {
|
|
||||||
border-color: #ffd700;
|
|
||||||
box-shadow: 0 0 5px rgba(255, 215, 0, 0.2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 按钮 */
|
|
||||||
#end-turn-btn {
|
|
||||||
position: absolute;
|
|
||||||
right: 20px;
|
|
||||||
bottom: 100px;
|
|
||||||
padding: 15px 30px;
|
|
||||||
background: #333;
|
|
||||||
color: white;
|
|
||||||
border: 1px solid #666;
|
|
||||||
cursor: pointer;
|
|
||||||
font-family: inherit;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
#end-turn-btn:hover {
|
|
||||||
background: #444;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 动画特效 */
|
|
||||||
@keyframes shake {
|
|
||||||
0% {
|
|
||||||
transform: translate(1px, 1px) rotate(0deg);
|
|
||||||
}
|
|
||||||
10% {
|
|
||||||
transform: translate(-1px, -2px) rotate(-1deg);
|
|
||||||
}
|
|
||||||
20% {
|
|
||||||
transform: translate(-3px, 0px) rotate(1deg);
|
|
||||||
}
|
|
||||||
30% {
|
|
||||||
transform: translate(3px, 2px) rotate(0deg);
|
|
||||||
}
|
|
||||||
40% {
|
|
||||||
transform: translate(1px, -1px) rotate(1deg);
|
|
||||||
}
|
|
||||||
50% {
|
|
||||||
transform: translate(-1px, 2px) rotate(-1deg);
|
|
||||||
}
|
|
||||||
60% {
|
|
||||||
transform: translate(-3px, 1px) rotate(0deg);
|
|
||||||
}
|
|
||||||
70% {
|
|
||||||
transform: translate(3px, 1px) rotate(-1deg);
|
|
||||||
}
|
|
||||||
80% {
|
|
||||||
transform: translate(-1px, -1px) rotate(1deg);
|
|
||||||
}
|
|
||||||
90% {
|
|
||||||
transform: translate(1px, 2px) rotate(0deg);
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
transform: translate(1px, -2px) rotate(-1deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.shake-anim {
|
|
||||||
animation: shake 0.5s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.damage-text {
|
|
||||||
position: absolute;
|
|
||||||
color: red;
|
|
||||||
font-size: 30px;
|
|
||||||
font-weight: bold;
|
|
||||||
animation: floatUp 1s forwards;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes floatUp {
|
|
||||||
0% {
|
|
||||||
transform: translateY(0);
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
transform: translateY(-50px);
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 状态提示 */
|
|
||||||
#game-over {
|
|
||||||
position: fixed;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
background: rgba(0, 0, 0, 0.9);
|
|
||||||
display: none;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
z-index: 100;
|
|
||||||
}
|
|
||||||
#game-over h1 {
|
|
||||||
color: var(--primary);
|
|
||||||
font-size: 40px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="enemy-area">
|
|
||||||
<div class="avatar" id="enemy-avatar">🤡</div>
|
|
||||||
<h3 id="enemy-name">势利眼班长</h3>
|
|
||||||
<div class="hp-bar-container">
|
|
||||||
<div class="hp-bar-fill" id="enemy-hp-bar"></div>
|
|
||||||
</div>
|
|
||||||
<div style="margin-top: 5px; font-size: 12px">
|
|
||||||
面子 (HP): <span id="enemy-hp-text">80</span>/80
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="intent-bubble" id="enemy-intent">
|
|
||||||
💬 正在酝酿一句很难听的话 (10点伤害)
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="battle-log">
|
|
||||||
<div class="log-entry log-system">> 系统初始化完成...</div>
|
|
||||||
<div class="log-entry log-system">> 目标锁定:[势利眼班长]</div>
|
|
||||||
<div class="log-entry log-system">> 任务:让他当众出丑。</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="player-area">
|
|
||||||
<div id="stats-bar">
|
|
||||||
<div class="stat-item" style="color: #ff4444">
|
|
||||||
<span class="icon">❤️</span> 面子:
|
|
||||||
<span id="player-hp">100</span>
|
|
||||||
</div>
|
|
||||||
<div class="stat-item" style="color: #4488ff">
|
|
||||||
<span class="icon">🛡️</span> 厚脸皮:
|
|
||||||
<span id="player-block">0</span>
|
|
||||||
</div>
|
|
||||||
<div class="stat-item" style="color: #00ff9d">
|
|
||||||
<span class="icon">⚡</span> 精力:
|
|
||||||
<span id="player-energy">3</span>/3
|
|
||||||
</div>
|
|
||||||
<div class="stat-item" style="color: #ffd700">
|
|
||||||
<span class="icon">💰</span> 余额: ¥<span id="player-money"
|
|
||||||
>5000</span
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="hand-container"></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<button id="end-turn-btn" onclick="endTurn()">结束回合</button>
|
|
||||||
|
|
||||||
<div id="game-over">
|
|
||||||
<h1 id="game-result">任务完成</h1>
|
|
||||||
<button
|
|
||||||
onclick="location.reload()"
|
|
||||||
style="padding: 10px 20px; cursor: pointer"
|
|
||||||
>
|
|
||||||
重新开始
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
/* --- 1. 游戏数据设定 (配置表) --- */
|
|
||||||
|
|
||||||
const GAME_STATE = {
|
|
||||||
player: {
|
|
||||||
hp: 100,
|
|
||||||
maxHp: 100,
|
|
||||||
block: 0,
|
|
||||||
energy: 3,
|
|
||||||
maxEnergy: 3,
|
|
||||||
money: 5000,
|
|
||||||
},
|
|
||||||
enemy: {
|
|
||||||
name: "势利眼班长",
|
|
||||||
hp: 80,
|
|
||||||
maxHp: 80,
|
|
||||||
nextDmg: 10,
|
|
||||||
avatar: "🤡",
|
|
||||||
},
|
|
||||||
hand: [],
|
|
||||||
deck: [],
|
|
||||||
turn: 1,
|
|
||||||
isGameOver: false,
|
|
||||||
};
|
|
||||||
|
|
||||||
// 模拟 LLM 的文案库 (实际开发中这里接 API)
|
|
||||||
const LLM_TEXTS = {
|
|
||||||
start: [
|
|
||||||
"班长看了看你的衣服,露出了鄙夷的眼神。",
|
|
||||||
"系统检测到装逼场力波动,请宿主做好准备。",
|
|
||||||
],
|
|
||||||
atk_normal: [
|
|
||||||
"你冷冷一笑:'这就是你的实力?'",
|
|
||||||
"你指出了他话里的逻辑漏洞,全场鸦雀无声。",
|
|
||||||
"你说:'去年你借我的五百块还没还呢。'",
|
|
||||||
],
|
|
||||||
atk_money: [
|
|
||||||
"你打开手机银行,语音播报:'到账一百万元'。",
|
|
||||||
"你随手掏出一把车钥匙扔在桌上:'挪下车。'",
|
|
||||||
"你用钱扇了扇风:'这屋里穷酸气太重。'",
|
|
||||||
],
|
|
||||||
defend: [
|
|
||||||
"你假装在回消息,完全无视了他的废话。",
|
|
||||||
"你使用了【左耳进右耳出】,他的嘲讽无效。",
|
|
||||||
"你微笑着看着他,就像看着一只猴子。",
|
|
||||||
],
|
|
||||||
enemy_atk: [
|
|
||||||
"班长嘲笑道:'听说你还在租房住?'",
|
|
||||||
"班长向大家展示他的劳力士绿水鬼。",
|
|
||||||
"班长说:'服务员,给这位加把椅子,别让他站着。'",
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
// 卡牌数据库 (原型)
|
|
||||||
const CARD_DATABASE = [
|
|
||||||
{
|
|
||||||
id: "atk_1",
|
|
||||||
name: "阴阳怪气",
|
|
||||||
type: "attack",
|
|
||||||
cost: 1,
|
|
||||||
val: 8,
|
|
||||||
desc: "造成 8 点面子伤害",
|
|
||||||
flavorType: "atk_normal",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: "atk_2",
|
|
||||||
name: "揭露黑历史",
|
|
||||||
type: "attack",
|
|
||||||
cost: 2,
|
|
||||||
val: 18,
|
|
||||||
desc: "造成 18 点面子伤害",
|
|
||||||
flavorType: "atk_normal",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: "def_1",
|
|
||||||
name: "装聋作哑",
|
|
||||||
type: "skill",
|
|
||||||
cost: 1,
|
|
||||||
val: 8,
|
|
||||||
desc: "获得 8 点厚脸皮(护盾)",
|
|
||||||
flavorType: "defend",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: "money_1",
|
|
||||||
name: "钞能力打击",
|
|
||||||
type: "money",
|
|
||||||
cost: 1,
|
|
||||||
val: 25,
|
|
||||||
moneyCost: 500,
|
|
||||||
desc: "消耗¥500,造成 25 点伤害",
|
|
||||||
flavorType: "atk_money",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: "def_2",
|
|
||||||
name: "战术喝水",
|
|
||||||
type: "skill",
|
|
||||||
cost: 0,
|
|
||||||
val: 4,
|
|
||||||
desc: "获得 4 点厚脸皮(0费)",
|
|
||||||
flavorType: "defend",
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
/* --- 2. 核心逻辑函数 --- */
|
|
||||||
|
|
||||||
function initGame() {
|
|
||||||
updateUI();
|
|
||||||
startPlayerTurn();
|
|
||||||
log(getRandomText(LLM_TEXTS.start), "system");
|
|
||||||
}
|
|
||||||
|
|
||||||
function startPlayerTurn() {
|
|
||||||
GAME_STATE.player.energy = GAME_STATE.player.maxEnergy;
|
|
||||||
GAME_STATE.player.block = 0; // 回合开始护盾清零(简化规则)
|
|
||||||
|
|
||||||
// 简单的抽牌逻辑:随机抽 4 张
|
|
||||||
GAME_STATE.hand = [];
|
|
||||||
for (let i = 0; i < 4; i++) {
|
|
||||||
const randomCard =
|
|
||||||
CARD_DATABASE[
|
|
||||||
Math.floor(Math.random() * CARD_DATABASE.length)
|
|
||||||
];
|
|
||||||
// 深拷贝以防止修改原数据
|
|
||||||
GAME_STATE.hand.push({
|
|
||||||
...randomCard,
|
|
||||||
uid: Date.now() + i,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
updateUI();
|
|
||||||
log(`=== 第 ${GAME_STATE.turn} 回合 ===`, "system");
|
|
||||||
}
|
|
||||||
|
|
||||||
function playCard(index) {
|
|
||||||
if (GAME_STATE.isGameOver) return;
|
|
||||||
|
|
||||||
const card = GAME_STATE.hand[index];
|
|
||||||
const player = GAME_STATE.player;
|
|
||||||
|
|
||||||
// 1. 检查资源
|
|
||||||
if (player.energy < card.cost) {
|
|
||||||
log("精力不足!", "system");
|
|
||||||
shakeScreen("stats-bar");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (card.type === "money" && player.money < card.moneyCost) {
|
|
||||||
log("余额不足!无法使用钞能力!", "system");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2. 扣除资源
|
|
||||||
player.energy -= card.cost;
|
|
||||||
if (card.type === "money") player.money -= card.moneyCost;
|
|
||||||
|
|
||||||
// 3. 执行效果
|
|
||||||
let logMsg = "";
|
|
||||||
if (card.type === "attack" || card.type === "money") {
|
|
||||||
dealDamage(card.val);
|
|
||||||
logMsg = getRandomText(LLM_TEXTS[card.flavorType]);
|
|
||||||
} else if (card.type === "skill") {
|
|
||||||
player.block += card.val;
|
|
||||||
logMsg = getRandomText(LLM_TEXTS[card.flavorType]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 4. 移除手牌 & 更新UI
|
|
||||||
GAME_STATE.hand.splice(index, 1);
|
|
||||||
log(`你使用了【${card.name}】`, "player");
|
|
||||||
log(logMsg, "desc");
|
|
||||||
|
|
||||||
updateUI();
|
|
||||||
checkWin();
|
|
||||||
}
|
|
||||||
|
|
||||||
function dealDamage(amount) {
|
|
||||||
GAME_STATE.enemy.hp -= amount;
|
|
||||||
if (GAME_STATE.enemy.hp < 0) GAME_STATE.enemy.hp = 0;
|
|
||||||
|
|
||||||
// 视觉特效
|
|
||||||
const enemyEl = document.getElementById("enemy-avatar");
|
|
||||||
enemyEl.classList.add("shake-anim");
|
|
||||||
setTimeout(() => enemyEl.classList.remove("shake-anim"), 500);
|
|
||||||
|
|
||||||
// 飘字
|
|
||||||
showFloatingText(`-${amount}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
function endTurn() {
|
|
||||||
if (GAME_STATE.isGameOver) return;
|
|
||||||
|
|
||||||
// 敌人行动
|
|
||||||
setTimeout(() => {
|
|
||||||
enemyAction();
|
|
||||||
}, 500);
|
|
||||||
}
|
|
||||||
|
|
||||||
function enemyAction() {
|
|
||||||
const dmg = GAME_STATE.enemy.nextDmg;
|
|
||||||
const player = GAME_STATE.player;
|
|
||||||
|
|
||||||
// 扣除护盾逻辑
|
|
||||||
let actualDmg = dmg;
|
|
||||||
if (player.block >= actualDmg) {
|
|
||||||
player.block -= actualDmg;
|
|
||||||
actualDmg = 0;
|
|
||||||
} else {
|
|
||||||
actualDmg -= player.block;
|
|
||||||
player.block = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
player.hp -= actualDmg;
|
|
||||||
|
|
||||||
log(getRandomText(LLM_TEXTS.enemy_atk), "enemy");
|
|
||||||
if (actualDmg > 0) {
|
|
||||||
log(`> 受到 ${actualDmg} 点精神伤害!`, "enemy");
|
|
||||||
document.body.classList.add("shake-anim"); // 全屏震动
|
|
||||||
setTimeout(
|
|
||||||
() => document.body.classList.remove("shake-anim"),
|
|
||||||
500
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
log(`> 你的厚脸皮完全抵挡了伤害!`, "system");
|
|
||||||
}
|
|
||||||
|
|
||||||
// 随机生成下回合意图
|
|
||||||
GAME_STATE.enemy.nextDmg = Math.floor(Math.random() * 10) + 5;
|
|
||||||
|
|
||||||
GAME_STATE.turn++;
|
|
||||||
updateUI();
|
|
||||||
checkLoss();
|
|
||||||
|
|
||||||
if (!GAME_STATE.isGameOver) {
|
|
||||||
setTimeout(startPlayerTurn, 1000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --- 3. 辅助函数 --- */
|
|
||||||
|
|
||||||
function checkWin() {
|
|
||||||
if (GAME_STATE.enemy.hp <= 0) {
|
|
||||||
GAME_STATE.isGameOver = true;
|
|
||||||
document.getElementById("game-result").innerText =
|
|
||||||
"打脸成功!奖励 ¥10000";
|
|
||||||
document.getElementById("game-result").style.color =
|
|
||||||
"#00ff9d";
|
|
||||||
document.getElementById("game-over").style.display = "flex";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function checkLoss() {
|
|
||||||
if (GAME_STATE.player.hp <= 0) {
|
|
||||||
GAME_STATE.isGameOver = true;
|
|
||||||
document.getElementById("game-result").innerText =
|
|
||||||
"任务失败:你社死了";
|
|
||||||
document.getElementById("game-result").style.color =
|
|
||||||
"#ff0055";
|
|
||||||
document.getElementById("game-over").style.display = "flex";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateUI() {
|
|
||||||
// 敌人 UI
|
|
||||||
const hpPercent =
|
|
||||||
(GAME_STATE.enemy.hp / GAME_STATE.enemy.maxHp) * 100;
|
|
||||||
document.getElementById(
|
|
||||||
"enemy-hp-bar"
|
|
||||||
).style.width = `${hpPercent}%`;
|
|
||||||
document.getElementById("enemy-hp-text").innerText =
|
|
||||||
GAME_STATE.enemy.hp;
|
|
||||||
document.getElementById(
|
|
||||||
"enemy-intent"
|
|
||||||
).innerText = `💬 准备造成 ${GAME_STATE.enemy.nextDmg} 点伤害`;
|
|
||||||
|
|
||||||
// 玩家 UI
|
|
||||||
document.getElementById("player-hp").innerText =
|
|
||||||
GAME_STATE.player.hp;
|
|
||||||
document.getElementById("player-block").innerText =
|
|
||||||
GAME_STATE.player.block;
|
|
||||||
document.getElementById("player-energy").innerText =
|
|
||||||
GAME_STATE.player.energy;
|
|
||||||
document.getElementById("player-money").innerText =
|
|
||||||
GAME_STATE.player.money;
|
|
||||||
|
|
||||||
// 渲染手牌
|
|
||||||
const handContainer = document.getElementById("hand-container");
|
|
||||||
handContainer.innerHTML = "";
|
|
||||||
GAME_STATE.hand.forEach((card, index) => {
|
|
||||||
const cardEl = document.createElement("div");
|
|
||||||
cardEl.className = `card card-type-${card.type}`;
|
|
||||||
cardEl.onclick = () => playCard(index);
|
|
||||||
|
|
||||||
cardEl.innerHTML = `
|
|
||||||
<div class="card-cost">${card.cost}</div>
|
|
||||||
<div class="card-name">${card.name}</div>
|
|
||||||
<div class="card-desc">${card.desc}</div>
|
|
||||||
`;
|
|
||||||
handContainer.appendChild(cardEl);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function log(text, type) {
|
|
||||||
const logArea = document.getElementById("battle-log");
|
|
||||||
const entry = document.createElement("div");
|
|
||||||
entry.className = `log-entry log-${type}`;
|
|
||||||
entry.innerText = text;
|
|
||||||
logArea.appendChild(entry);
|
|
||||||
logArea.scrollTop = logArea.scrollHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getRandomText(array) {
|
|
||||||
return array[Math.floor(Math.random() * array.length)];
|
|
||||||
}
|
|
||||||
|
|
||||||
function showFloatingText(text) {
|
|
||||||
const enemyArea = document.getElementById("enemy-area");
|
|
||||||
const el = document.createElement("div");
|
|
||||||
el.className = "damage-text";
|
|
||||||
el.innerText = text;
|
|
||||||
el.style.left = "50%";
|
|
||||||
el.style.top = "50%";
|
|
||||||
enemyArea.appendChild(el);
|
|
||||||
setTimeout(() => el.remove(), 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
function shakeScreen(elementId) {
|
|
||||||
const el = document.getElementById(elementId);
|
|
||||||
el.classList.add("shake-anim");
|
|
||||||
setTimeout(() => el.classList.remove("shake-anim"), 500);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 启动游戏
|
|
||||||
initGame();
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
<script setup>
|
|
||||||
// 接收 props
|
|
||||||
const props = defineProps({
|
|
||||||
title: String,
|
|
||||||
})
|
|
||||||
|
|
||||||
const titleClass = computed(() => {
|
|
||||||
// 统一使用主题色
|
|
||||||
return 'bg-primary'
|
|
||||||
})
|
|
||||||
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="relative">
|
|
||||||
<!-- 标题部分 -->
|
|
||||||
<div :class="titleClass" class="inline-block rounded-lg px-2 py-1 text-white font-bold shadow-md">
|
|
||||||
{{ title }}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- 左上角修饰 -->
|
|
||||||
<div
|
|
||||||
class="absolute left-0 top-0 h-4 w-4 transform rounded-full bg-white shadow-md -translate-x-2 -translate-y-2" />
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style scoped></style>
|
|
||||||
9745
src/example.json
9745
src/example.json
File diff suppressed because it is too large
Load Diff
35
src/main.js
35
src/main.js
@@ -1,31 +1,20 @@
|
|||||||
import './assets/main.css'
|
import "./assets/main.css";
|
||||||
import { createApp } from 'vue'
|
import { createApp } from "vue";
|
||||||
import { createRouter, createWebHistory } from 'vue-router'
|
import { createRouter, createWebHistory } from "vue-router";
|
||||||
import App from './App.vue'
|
import App from "./App.vue";
|
||||||
|
|
||||||
const router = createRouter({
|
const router = createRouter({
|
||||||
history: createWebHistory(),
|
history: createWebHistory(),
|
||||||
routes: [
|
routes: [
|
||||||
{
|
{
|
||||||
path: '/',
|
path: "/",
|
||||||
name: 'Report',
|
name: "Report",
|
||||||
component: () => import('./views/Report.vue')
|
component: () => import("./views/Report.vue"),
|
||||||
},
|
},
|
||||||
{
|
],
|
||||||
path: '/report',
|
});
|
||||||
name: 'ReportView',
|
|
||||||
component: () => import('./views/Report.vue')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/report-pdf',
|
|
||||||
name: 'ReportPDF',
|
|
||||||
component: () => import('./views/ReportPDF.vue')
|
|
||||||
}
|
|
||||||
]
|
|
||||||
})
|
|
||||||
|
|
||||||
const app = createApp(App)
|
const app = createApp(App);
|
||||||
app.use(router)
|
app.use(router);
|
||||||
|
|
||||||
app.mount('#app')
|
|
||||||
|
|
||||||
|
app.mount("#app");
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,129 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="pdf-page">
|
|
||||||
<div v-if="isLoading" class="loading-container">
|
|
||||||
<div class="loading-spinner"></div>
|
|
||||||
<p>加载中,请稍候...</p>
|
|
||||||
</div>
|
|
||||||
<div v-else-if="reportData" class="pdf-content">
|
|
||||||
<CDWBG8B4DPDF :data="reportData" />
|
|
||||||
</div>
|
|
||||||
<div v-else class="error-container">
|
|
||||||
<p>未找到报告数据</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup>
|
|
||||||
import { ref, onMounted } from 'vue'
|
|
||||||
import CDWBG8B4DPDF from '@/ui/CDWBG8B4D/CDWBG8B4D-PDF.vue'
|
|
||||||
|
|
||||||
const isLoading = ref(true)
|
|
||||||
const reportData = ref(null)
|
|
||||||
|
|
||||||
onMounted(async () => {
|
|
||||||
await loadReportData()
|
|
||||||
})
|
|
||||||
|
|
||||||
const loadReportData = async () => {
|
|
||||||
try {
|
|
||||||
// 从 public 目录加载示例数据
|
|
||||||
const response = await fetch('/example.json')
|
|
||||||
const data = await response.json()
|
|
||||||
|
|
||||||
if (Array.isArray(data) && data.length > 0) {
|
|
||||||
// 查找 DWBG8B4D 的数据
|
|
||||||
const cdwbg8b4dItem = data.find(item =>
|
|
||||||
item.data?.apiID === 'DWBG8B4D' || item.data?.apiID === 'CDWBG8B4D'
|
|
||||||
)
|
|
||||||
|
|
||||||
if (cdwbg8b4dItem && cdwbg8b4dItem.data?.data) {
|
|
||||||
reportData.value = cdwbg8b4dItem.data.data
|
|
||||||
} else {
|
|
||||||
console.warn('未找到 DWBG8B4D 数据')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.error('加载报告数据失败:', error)
|
|
||||||
} finally {
|
|
||||||
isLoading.value = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
.pdf-page {
|
|
||||||
min-height: 100vh;
|
|
||||||
background: linear-gradient(135deg, #f5f7fa 0%, #e8ecf0 100%);
|
|
||||||
padding: 32px 20px;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pdf-content {
|
|
||||||
width: 100%;
|
|
||||||
max-width: 794px;
|
|
||||||
background-color: #ffffff;
|
|
||||||
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08), 0 2px 8px rgba(0, 0, 0, 0.04);
|
|
||||||
border-radius: 8px;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.loading-container {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
height: 100vh;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.loading-spinner {
|
|
||||||
width: 50px;
|
|
||||||
height: 50px;
|
|
||||||
border: 4px solid #f3f3f3;
|
|
||||||
border-top: 4px solid #3498db;
|
|
||||||
border-radius: 50%;
|
|
||||||
animation: spin 1s linear infinite;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.loading-container p {
|
|
||||||
color: #666;
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.error-container {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
height: 100vh;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.error-container p {
|
|
||||||
color: #e74c3c;
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes spin {
|
|
||||||
0% {
|
|
||||||
transform: rotate(0deg);
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
transform: rotate(360deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 打印样式 */
|
|
||||||
@media print {
|
|
||||||
.pdf-page {
|
|
||||||
padding: 0;
|
|
||||||
background-color: #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pdf-content {
|
|
||||||
box-shadow: none;
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
26
t.json
26
t.json
@@ -1,26 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"api_code": "DWBG8B4D"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"api_code": "QCXG9P1C"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"api_code": "JRZQ09J8"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"api_code": "JRZQ4AA8"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"api_code": "JRZQ5E9F"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"api_code": "FLXG7E8F"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"api_code": "IVYZ81NC"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"api_code": "IVYZ3P9M"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
542
tt.json
542
tt.json
@@ -1,542 +0,0 @@
|
|||||||
{
|
|
||||||
"responses": {
|
|
||||||
"DWBG8B4D": {
|
|
||||||
"api_code": "DWBG8B4D",
|
|
||||||
"data": {
|
|
||||||
"baseInfo": {
|
|
||||||
"age": 25,
|
|
||||||
"channel": "中国移动",
|
|
||||||
"idCard": "4521**200008***23X",
|
|
||||||
"location": "广西壮族自治区南宁地区横县",
|
|
||||||
"name": "张*宏",
|
|
||||||
"phone": "182****1590",
|
|
||||||
"phoneArea": "广西壮族自治区-南宁",
|
|
||||||
"sex": "男",
|
|
||||||
"status": 1
|
|
||||||
},
|
|
||||||
"checkSuggest": "建议审核",
|
|
||||||
"creditScore": 599,
|
|
||||||
"elementVerificationDetail": {
|
|
||||||
"antiFraudInfo": {
|
|
||||||
"gamblerPlayer": "A",
|
|
||||||
"moneyLaundering": "A"
|
|
||||||
},
|
|
||||||
"belongRiskFlag": 2,
|
|
||||||
"belongRisks": {
|
|
||||||
"num": "1",
|
|
||||||
"personCity": "南宁地区",
|
|
||||||
"personProvence": "广西壮族自治区",
|
|
||||||
"phoneCardType": "移动",
|
|
||||||
"phoneCity": "南宁",
|
|
||||||
"phoneProvence": "广西壮族自治区"
|
|
||||||
},
|
|
||||||
"highRiskFlag": 2,
|
|
||||||
"keyPersonCheckList": {
|
|
||||||
"fangAiFlag": 0,
|
|
||||||
"fontFlag": 0,
|
|
||||||
"jingJiFontFlag": 0,
|
|
||||||
"num": "1",
|
|
||||||
"sheJiaoTongFlag": 0,
|
|
||||||
"zhongDianFlag": 0
|
|
||||||
},
|
|
||||||
"onlineRiskFlag": 2,
|
|
||||||
"onlineRiskList": {
|
|
||||||
"lineType": "移动",
|
|
||||||
"num": "1",
|
|
||||||
"onLineTimes": "24,+(个月)"
|
|
||||||
},
|
|
||||||
"personCheckDetails": {
|
|
||||||
"ele": "身份证号、姓名",
|
|
||||||
"num": "1",
|
|
||||||
"result": "一致"
|
|
||||||
},
|
|
||||||
"phoneCheckDetails": {
|
|
||||||
"ele": "身份证号、手机号、姓名",
|
|
||||||
"num": "1",
|
|
||||||
"phoneCompany": "中国移动",
|
|
||||||
"result": "一致"
|
|
||||||
},
|
|
||||||
"phoneVailRiskFlag": 2,
|
|
||||||
"phoneVailRisks": {
|
|
||||||
"num": "1",
|
|
||||||
"phoneCompany": "移动",
|
|
||||||
"phoneStatus": "实号",
|
|
||||||
"phoneTimes": "24(单位:月)"
|
|
||||||
},
|
|
||||||
"sfzeysFlag": 2,
|
|
||||||
"sjsysFlag": 2
|
|
||||||
},
|
|
||||||
"fraudRule": "低风险",
|
|
||||||
"fraudScore": -1,
|
|
||||||
"leasingRiskAssessment": {
|
|
||||||
"riskFlag": 2,
|
|
||||||
"threeCInstitutionApplicationCountLast12Months": "6/6",
|
|
||||||
"threeCInstitutionApplicationCountLast12MonthsNight": "0/0",
|
|
||||||
"threeCInstitutionApplicationCountLast12MonthsWeekend": "1/0",
|
|
||||||
"threeCInstitutionApplicationCountLast14Days": "0/0",
|
|
||||||
"threeCInstitutionApplicationCountLast14DaysNight": "0/0",
|
|
||||||
"threeCInstitutionApplicationCountLast14DaysWeekend": "0/0",
|
|
||||||
"threeCInstitutionApplicationCountLast3Days": "0/0",
|
|
||||||
"threeCInstitutionApplicationCountLast3DaysNight": "0/0",
|
|
||||||
"threeCInstitutionApplicationCountLast3DaysWeekend": "0/0",
|
|
||||||
"threeCInstitutionApplicationCountLast3Months": "4/4",
|
|
||||||
"threeCInstitutionApplicationCountLast3MonthsNight": "0/0",
|
|
||||||
"threeCInstitutionApplicationCountLast3MonthsWeekend": "1/0",
|
|
||||||
"threeCInstitutionApplicationCountLast6Months": "6/6",
|
|
||||||
"threeCInstitutionApplicationCountLast6MonthsNight": "0/0",
|
|
||||||
"threeCInstitutionApplicationCountLast6MonthsWeekend": "1/0",
|
|
||||||
"threeCInstitutionApplicationCountLast7Days": "0/0",
|
|
||||||
"threeCInstitutionApplicationCountLast7DaysNight": "0/0",
|
|
||||||
"threeCInstitutionApplicationCountLast7DaysWeekend": "0/0",
|
|
||||||
"threeCInstitutionApplicationCountLastMonth": "1/1",
|
|
||||||
"threeCInstitutionApplicationCountLastMonthNight": "0/0",
|
|
||||||
"threeCInstitutionApplicationCountLastMonthWeekend": "0/0",
|
|
||||||
"threeCPlatformApplicationCountLast12Months": "3/3",
|
|
||||||
"threeCPlatformApplicationCountLast12MonthsNight": "0/0",
|
|
||||||
"threeCPlatformApplicationCountLast12MonthsWeekend": "1/0",
|
|
||||||
"threeCPlatformApplicationCountLast14Days": "0/0",
|
|
||||||
"threeCPlatformApplicationCountLast14DaysNight": "0/0",
|
|
||||||
"threeCPlatformApplicationCountLast14DaysWeekend": "0/0",
|
|
||||||
"threeCPlatformApplicationCountLast3Days": "0/0",
|
|
||||||
"threeCPlatformApplicationCountLast3DaysNight": "0/0",
|
|
||||||
"threeCPlatformApplicationCountLast3DaysWeekend": "0/0",
|
|
||||||
"threeCPlatformApplicationCountLast3Months": "3/3",
|
|
||||||
"threeCPlatformApplicationCountLast3MonthsNight": "0/0",
|
|
||||||
"threeCPlatformApplicationCountLast3MonthsWeekend": "1/0",
|
|
||||||
"threeCPlatformApplicationCountLast6Months": "3/3",
|
|
||||||
"threeCPlatformApplicationCountLast6MonthsNight": "0/0",
|
|
||||||
"threeCPlatformApplicationCountLast6MonthsWeekend": "1/0",
|
|
||||||
"threeCPlatformApplicationCountLast7Days": "0/0",
|
|
||||||
"threeCPlatformApplicationCountLast7DaysNight": "0/0",
|
|
||||||
"threeCPlatformApplicationCountLast7DaysWeekend": "0/0",
|
|
||||||
"threeCPlatformApplicationCountLastMonth": "1/1",
|
|
||||||
"threeCPlatformApplicationCountLastMonthNight": "0/0",
|
|
||||||
"threeCPlatformApplicationCountLastMonthWeekend": "0/0"
|
|
||||||
},
|
|
||||||
"loanEvaluationVerificationDetail": {
|
|
||||||
"businessLoanPerformances": [
|
|
||||||
{
|
|
||||||
"last12Month": "2/2",
|
|
||||||
"last12MonthCount": "8/8",
|
|
||||||
"last15Day": "0/0",
|
|
||||||
"last15DayCount": "0/0",
|
|
||||||
"last1Month": "0/0",
|
|
||||||
"last1MonthCount": "0/0",
|
|
||||||
"last3Month": "0/0",
|
|
||||||
"last3MonthCount": "0/0",
|
|
||||||
"last6Month": "2/2",
|
|
||||||
"last6MonthCount": "3/3",
|
|
||||||
"last7Day": "0/0",
|
|
||||||
"last7DayCount": "0/0",
|
|
||||||
"type": "信用卡(类信用卡)"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"last12Month": "2/2",
|
|
||||||
"last12MonthCount": "2/2",
|
|
||||||
"last15Day": "0/0",
|
|
||||||
"last15DayCount": "0/0",
|
|
||||||
"last1Month": "0/0",
|
|
||||||
"last1MonthCount": "0/0",
|
|
||||||
"last3Month": "0/0",
|
|
||||||
"last3MonthCount": "0/0",
|
|
||||||
"last6Month": "0/0",
|
|
||||||
"last6MonthCount": "0/0",
|
|
||||||
"last7Day": "0/0",
|
|
||||||
"last7DayCount": "0/0",
|
|
||||||
"type": "线上小额现金贷"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"last12Month": "0/0",
|
|
||||||
"last12MonthCount": "0/0",
|
|
||||||
"last15Day": "0/0",
|
|
||||||
"last15DayCount": "0/0",
|
|
||||||
"last1Month": "0/0",
|
|
||||||
"last1MonthCount": "0/0",
|
|
||||||
"last3Month": "0/0",
|
|
||||||
"last3MonthCount": "0/0",
|
|
||||||
"last6Month": "0/0",
|
|
||||||
"last6MonthCount": "0/0",
|
|
||||||
"last7Day": "0/0",
|
|
||||||
"last7DayCount": "0/0",
|
|
||||||
"type": "汽车金融"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"last12Month": "2/2",
|
|
||||||
"last12MonthCount": "4/5",
|
|
||||||
"last15Day": "1/1",
|
|
||||||
"last15DayCount": "1/1",
|
|
||||||
"last1Month": "1/1",
|
|
||||||
"last1MonthCount": "1/2",
|
|
||||||
"last3Month": "1/1",
|
|
||||||
"last3MonthCount": "3/4",
|
|
||||||
"last6Month": "2/2",
|
|
||||||
"last6MonthCount": "4/5",
|
|
||||||
"last7Day": "0/0",
|
|
||||||
"last7DayCount": "0/0",
|
|
||||||
"type": "线上消费分期"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"last12Month": "1/1",
|
|
||||||
"last12MonthCount": "4/4",
|
|
||||||
"last15Day": "0/0",
|
|
||||||
"last15DayCount": "0/0",
|
|
||||||
"last1Month": "0/0",
|
|
||||||
"last1MonthCount": "0/0",
|
|
||||||
"last3Month": "0/0",
|
|
||||||
"last3MonthCount": "0/0",
|
|
||||||
"last6Month": "0/0",
|
|
||||||
"last6MonthCount": "0/0",
|
|
||||||
"last7Day": "0/0",
|
|
||||||
"last7DayCount": "0/0",
|
|
||||||
"type": "线下消费分期"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"last12Month": "6/6",
|
|
||||||
"last12MonthCount": "10/10",
|
|
||||||
"last15Day": "1/1",
|
|
||||||
"last15DayCount": "1/1",
|
|
||||||
"last1Month": "1/1",
|
|
||||||
"last1MonthCount": "1/1",
|
|
||||||
"last3Month": "1/1",
|
|
||||||
"last3MonthCount": "2/2",
|
|
||||||
"last6Month": "2/2",
|
|
||||||
"last6MonthCount": "3/3",
|
|
||||||
"last7Day": "0/0",
|
|
||||||
"last7DayCount": "0/0",
|
|
||||||
"type": "其他"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"customerLoanPerformances": [
|
|
||||||
{
|
|
||||||
"last12Month": "2/2",
|
|
||||||
"last12MonthCount": "2/2",
|
|
||||||
"last15Day": "0/0",
|
|
||||||
"last15DayCount": "0/0",
|
|
||||||
"last1Month": "0/0",
|
|
||||||
"last1MonthCount": "0/0",
|
|
||||||
"last3Month": "0/0",
|
|
||||||
"last3MonthCount": "0/0",
|
|
||||||
"last6Month": "1/1",
|
|
||||||
"last6MonthCount": "1/1",
|
|
||||||
"last7Day": "0/0",
|
|
||||||
"last7DayCount": "0/0",
|
|
||||||
"type": "银行汇总"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"last12Month": "2/2",
|
|
||||||
"last12MonthCount": "2/2",
|
|
||||||
"last15Day": "0/0",
|
|
||||||
"last15DayCount": "0/0",
|
|
||||||
"last1Month": "0/0",
|
|
||||||
"last1MonthCount": "0/0",
|
|
||||||
"last3Month": "0/0",
|
|
||||||
"last3MonthCount": "0/0",
|
|
||||||
"last6Month": "1/1",
|
|
||||||
"last6MonthCount": "1/1",
|
|
||||||
"last7Day": "0/0",
|
|
||||||
"last7DayCount": "0/0",
|
|
||||||
"type": "传统银行"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"last12Month": "0/0",
|
|
||||||
"last12MonthCount": "0/0",
|
|
||||||
"last15Day": "0/0",
|
|
||||||
"last15DayCount": "0/0",
|
|
||||||
"last1Month": "0/0",
|
|
||||||
"last1MonthCount": "0/0",
|
|
||||||
"last3Month": "0/0",
|
|
||||||
"last3MonthCount": "0/0",
|
|
||||||
"last6Month": "0/0",
|
|
||||||
"last6MonthCount": "0/0",
|
|
||||||
"last7Day": "0/0",
|
|
||||||
"last7DayCount": "0/0",
|
|
||||||
"type": "网络零售银行"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"last12Month": "8/8",
|
|
||||||
"last12MonthCount": "19/19",
|
|
||||||
"last15Day": "1/1",
|
|
||||||
"last15DayCount": "1/1",
|
|
||||||
"last1Month": "1/1",
|
|
||||||
"last1MonthCount": "1/1",
|
|
||||||
"last3Month": "1/1",
|
|
||||||
"last3MonthCount": "2/2",
|
|
||||||
"last6Month": "4/4",
|
|
||||||
"last6MonthCount": "6/6",
|
|
||||||
"last7Day": "0/0",
|
|
||||||
"last7DayCount": "0/0",
|
|
||||||
"type": "非银汇总"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"last12Month": "1/1",
|
|
||||||
"last12MonthCount": "1/1",
|
|
||||||
"last15Day": "0/0",
|
|
||||||
"last15DayCount": "0/0",
|
|
||||||
"last1Month": "0/0",
|
|
||||||
"last1MonthCount": "0/0",
|
|
||||||
"last3Month": "0/0",
|
|
||||||
"last3MonthCount": "0/0",
|
|
||||||
"last6Month": "0/0",
|
|
||||||
"last6MonthCount": "0/0",
|
|
||||||
"last7Day": "0/0",
|
|
||||||
"last7DayCount": "0/0",
|
|
||||||
"type": "持牌网络小贷"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"last12Month": "4/4",
|
|
||||||
"last12MonthCount": "8/8",
|
|
||||||
"last15Day": "0/0",
|
|
||||||
"last15DayCount": "0/0",
|
|
||||||
"last1Month": "0/0",
|
|
||||||
"last1MonthCount": "0/0",
|
|
||||||
"last3Month": "0/0",
|
|
||||||
"last3MonthCount": "0/0",
|
|
||||||
"last6Month": "1/1",
|
|
||||||
"last6MonthCount": "1/1",
|
|
||||||
"last7Day": "0/0",
|
|
||||||
"last7DayCount": "0/0",
|
|
||||||
"type": "持牌消费金融"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"last12Month": "0/0",
|
|
||||||
"last12MonthCount": "0/0",
|
|
||||||
"last15Day": "0/0",
|
|
||||||
"last15DayCount": "0/0",
|
|
||||||
"last1Month": "0/0",
|
|
||||||
"last1MonthCount": "0/0",
|
|
||||||
"last3Month": "0/0",
|
|
||||||
"last3MonthCount": "0/0",
|
|
||||||
"last6Month": "0/0",
|
|
||||||
"last6MonthCount": "0/0",
|
|
||||||
"last7Day": "0/0",
|
|
||||||
"last7DayCount": "0/0",
|
|
||||||
"type": "持牌融资租赁机构"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"last12Month": "0/0",
|
|
||||||
"last12MonthCount": "0/0",
|
|
||||||
"last15Day": "0/0",
|
|
||||||
"last15DayCount": "0/0",
|
|
||||||
"last1Month": "0/0",
|
|
||||||
"last1MonthCount": "0/0",
|
|
||||||
"last3Month": "0/0",
|
|
||||||
"last3MonthCount": "0/0",
|
|
||||||
"last6Month": "0/0",
|
|
||||||
"last6MonthCount": "0/0",
|
|
||||||
"last7Day": "0/0",
|
|
||||||
"last7DayCount": "0/0",
|
|
||||||
"type": "持牌汽车金融"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"last12Month": "4/4",
|
|
||||||
"last12MonthCount": "6/7",
|
|
||||||
"last15Day": "1/1",
|
|
||||||
"last15DayCount": "1/1",
|
|
||||||
"last1Month": "1/1",
|
|
||||||
"last1MonthCount": "1/2",
|
|
||||||
"last3Month": "1/1",
|
|
||||||
"last3MonthCount": "3/4",
|
|
||||||
"last6Month": "2/2",
|
|
||||||
"last6MonthCount": "4/5",
|
|
||||||
"last7Day": "0/0",
|
|
||||||
"last7DayCount": "0/0",
|
|
||||||
"type": "其他"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"organLoanPerformances": [
|
|
||||||
{
|
|
||||||
"applyCount": "银行",
|
|
||||||
"last12Month": "0/0",
|
|
||||||
"last15Day": "0/0",
|
|
||||||
"last1Month": "0/0",
|
|
||||||
"last3Month": "0/0",
|
|
||||||
"last6Month": "0/0",
|
|
||||||
"last7Day": "0/0"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"applyCount": "非银",
|
|
||||||
"last12Month": "0/0",
|
|
||||||
"last15Day": "0/0",
|
|
||||||
"last1Month": "0/0",
|
|
||||||
"last3Month": "0/0",
|
|
||||||
"last6Month": "0/0",
|
|
||||||
"last7Day": "0/0"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"riskFlag": 2,
|
|
||||||
"timeLoanPerformances": [
|
|
||||||
{
|
|
||||||
"last12Month": "1/1",
|
|
||||||
"last12MonthCount": "1/1",
|
|
||||||
"last15Day": "0/0",
|
|
||||||
"last15DayCount": "0/0",
|
|
||||||
"last1Month": "0/0",
|
|
||||||
"last1MonthCount": "0/0",
|
|
||||||
"last3Month": "0/0",
|
|
||||||
"last3MonthCount": "0/0",
|
|
||||||
"last6Month": "0/0",
|
|
||||||
"last6MonthCount": "0/0",
|
|
||||||
"last7Day": "0/0",
|
|
||||||
"last7DayCount": "0/0",
|
|
||||||
"type": "夜间-银行"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"last12Month": "4/4",
|
|
||||||
"last12MonthCount": "4/4",
|
|
||||||
"last15Day": "0/0",
|
|
||||||
"last15DayCount": "0/0",
|
|
||||||
"last1Month": "0/0",
|
|
||||||
"last1MonthCount": "0/0",
|
|
||||||
"last3Month": "0/0",
|
|
||||||
"last3MonthCount": "0/0",
|
|
||||||
"last6Month": "0/0",
|
|
||||||
"last6MonthCount": "0/0",
|
|
||||||
"last7Day": "0/0",
|
|
||||||
"last7DayCount": "0/0",
|
|
||||||
"type": "夜间-非银"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"last12Month": "0/0",
|
|
||||||
"last12MonthCount": "0/0",
|
|
||||||
"last15Day": "0/0",
|
|
||||||
"last15DayCount": "0/0",
|
|
||||||
"last1Month": "0/0",
|
|
||||||
"last1MonthCount": "0/0",
|
|
||||||
"last3Month": "0/0",
|
|
||||||
"last3MonthCount": "0/0",
|
|
||||||
"last6Month": "0/0",
|
|
||||||
"last6MonthCount": "0/0",
|
|
||||||
"last7Day": "0/0",
|
|
||||||
"last7DayCount": "0/0",
|
|
||||||
"type": "周末-银行"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"last12Month": "5/5",
|
|
||||||
"last12MonthCount": "7/7",
|
|
||||||
"last15Day": "0/0",
|
|
||||||
"last15DayCount": "0/0",
|
|
||||||
"last1Month": "0/0",
|
|
||||||
"last1MonthCount": "0/0",
|
|
||||||
"last3Month": "0/0",
|
|
||||||
"last3MonthCount": "0/0",
|
|
||||||
"last6Month": "0/0",
|
|
||||||
"last6MonthCount": "0/0",
|
|
||||||
"last7Day": "0/0",
|
|
||||||
"last7DayCount": "0/0",
|
|
||||||
"type": "周末-非银"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"overdueRiskProduct": {
|
|
||||||
"currentOverdueAmount": "-",
|
|
||||||
"currentOverdueInstitutionCount": "-",
|
|
||||||
"daysSinceLastSuccessfulRepayment": "-",
|
|
||||||
"dkzhktjFlag": 2,
|
|
||||||
"hasUnsettledOverdue": "-",
|
|
||||||
"lyjlhyFlag": 0,
|
|
||||||
"overdueLast14Days": "-",
|
|
||||||
"overdueLast1Day": "-",
|
|
||||||
"overdueLast30Days": "-",
|
|
||||||
"overdueLast7Days": "-",
|
|
||||||
"repaymentFailureAmountLast14Days": "-",
|
|
||||||
"repaymentFailureAmountLast3Months": "-",
|
|
||||||
"repaymentFailureAmountLast6Months": "-",
|
|
||||||
"repaymentFailureAmountLast7Days": "-",
|
|
||||||
"repaymentFailureAmountLastMonth": "-",
|
|
||||||
"repaymentFailureCountLast14Days": "-",
|
|
||||||
"repaymentFailureCountLast3Months": "-",
|
|
||||||
"repaymentFailureCountLast6Months": "-",
|
|
||||||
"repaymentFailureCountLast7Days": "-",
|
|
||||||
"repaymentFailureCountLastMonth": "-",
|
|
||||||
"repaymentSuccessAmountLast14Days": "-",
|
|
||||||
"repaymentSuccessAmountLast3Months": "-",
|
|
||||||
"repaymentSuccessAmountLast6Months": "-",
|
|
||||||
"repaymentSuccessAmountLast7Days": "-",
|
|
||||||
"repaymentSuccessAmountLastMonth": "-",
|
|
||||||
"repaymentSuccessCountLast14Days": "-",
|
|
||||||
"repaymentSuccessCountLast3Months": "-",
|
|
||||||
"repaymentSuccessCountLast6Months": "-",
|
|
||||||
"repaymentSuccessCountLast7Days": "-",
|
|
||||||
"repaymentSuccessCountLastMonth": "-",
|
|
||||||
"settledInstitutionCount": "-",
|
|
||||||
"specialListVerification": [],
|
|
||||||
"totalLoanInstitutions": "-",
|
|
||||||
"totalLoanRepaymentAmount": "-",
|
|
||||||
"tsmdyzFlag": 0
|
|
||||||
},
|
|
||||||
"riskSupervision": {
|
|
||||||
"details": "无",
|
|
||||||
"leastApplicationTime": "2025-09-11",
|
|
||||||
"rentalRiskListIdCardRelationsPhones": 0,
|
|
||||||
"rentalRiskListPhoneRelationsIdCards": 0
|
|
||||||
},
|
|
||||||
"riskWarning": {
|
|
||||||
"frequentApplicationRecent": 0,
|
|
||||||
"frequentBankApplications": 0,
|
|
||||||
"frequentNonBankApplications": 0,
|
|
||||||
"frequentRentalApplications": 0,
|
|
||||||
"hasCriminalRecord": 0,
|
|
||||||
"highDebtPressure": 0,
|
|
||||||
"highFraudGangLevel": 0,
|
|
||||||
"hitAdministrativeCase": 0,
|
|
||||||
"hitBankruptcyAndLiquidation": 0,
|
|
||||||
"hitCivilCase": 0,
|
|
||||||
"hitCompensationCase": 0,
|
|
||||||
"hitCriminalRisk": 0,
|
|
||||||
"hitCurrentOverdue": 0,
|
|
||||||
"hitDirectlyUnderCase": 0,
|
|
||||||
"hitExecutionCase": 0,
|
|
||||||
"hitHighRiskBankLastTwoYears": 0,
|
|
||||||
"hitHighRiskNonBankLastTwoYears": 0,
|
|
||||||
"hitPreservationReview": 0,
|
|
||||||
"idCardPhoneProvinceMismatch": 0,
|
|
||||||
"idCardTwoElementMismatch": 0,
|
|
||||||
"isAntiFraudInfo": 1,
|
|
||||||
"isDisrupSocial": 0,
|
|
||||||
"isEconomyFront": 0,
|
|
||||||
"isKeyPerson": 0,
|
|
||||||
"isTrafficRelated": 0,
|
|
||||||
"level": "0",
|
|
||||||
"moreFrequentBankApplications": 0,
|
|
||||||
"moreFrequentNonBankApplications": 0,
|
|
||||||
"noPhoneDuration": 0,
|
|
||||||
"phoneThreeElementMismatch": 0,
|
|
||||||
"shortPhoneDuration": 0,
|
|
||||||
"shortPhoneDurationSlight": 0,
|
|
||||||
"totalRiskCounts": 1,
|
|
||||||
"veryFrequentRentalApplications": 0
|
|
||||||
},
|
|
||||||
"standLiveInfo": {
|
|
||||||
"finalAuthResult": "0",
|
|
||||||
"inTime": "24",
|
|
||||||
"verification": "0"
|
|
||||||
},
|
|
||||||
"verifyRule": "低风险"
|
|
||||||
},
|
|
||||||
"error": null,
|
|
||||||
"success": true
|
|
||||||
},
|
|
||||||
"FLXG0V4B": {
|
|
||||||
"api_code": "FLXG0V4B",
|
|
||||||
"data": {
|
|
||||||
"entout": {
|
|
||||||
"msg": "没有找到"
|
|
||||||
},
|
|
||||||
"sxbzxr": {
|
|
||||||
"msg": "没有找到"
|
|
||||||
},
|
|
||||||
"xgbzxr": {
|
|
||||||
"msg": "没有找到"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"error": null,
|
|
||||||
"success": true
|
|
||||||
},
|
|
||||||
"QYGLB4C0": {
|
|
||||||
"api_code": "QYGLB4C0",
|
|
||||||
"data": null,
|
|
||||||
"error": "查询为空\n查询为空\n库中无此记录",
|
|
||||||
"success": false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user