完成结果总览页面前端实现
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
# 结果总览前端实施记录
|
||||
|
||||
## 实施内容
|
||||
- 将 `PreliminaryCheck.vue` 从占位页升级为结果总览页面入口
|
||||
- 新增顶部总览、风险人员、风险模型、风险明细 4 个区块组件
|
||||
- 新增本地 mock 数据文件,覆盖主展示态、空数据态、加载态
|
||||
- 新增静态断言脚本,锁定页面分块结构和页面状态
|
||||
|
||||
## 验证情况
|
||||
- 新增 4 个静态断言脚本,分别覆盖页面骨架、前两块区块、后两块区块和三种页面状态
|
||||
- 所有静态断言脚本已通过
|
||||
- `npm run build:prod` 已通过
|
||||
- 修复了 3 个新组件中深度选择器写法与当前构建链不兼容的问题
|
||||
@@ -0,0 +1,25 @@
|
||||
# 结果总览前端验证记录
|
||||
|
||||
## 验证范围
|
||||
- 结果总览主展示态
|
||||
- 空数据态
|
||||
- 加载态
|
||||
- 页面构建
|
||||
|
||||
## 验证命令
|
||||
- `cd ruoyi-ui && node tests/unit/preliminary-check-layout.test.js`
|
||||
- `cd ruoyi-ui && node tests/unit/preliminary-check-summary-and-people.test.js`
|
||||
- `cd ruoyi-ui && node tests/unit/preliminary-check-model-and-detail.test.js`
|
||||
- `cd ruoyi-ui && node tests/unit/preliminary-check-states.test.js`
|
||||
- `cd ruoyi-ui && npm run build:prod`
|
||||
|
||||
## 验证结果
|
||||
- `node tests/unit/preliminary-check-layout.test.js`:通过
|
||||
- `node tests/unit/preliminary-check-summary-and-people.test.js`:通过
|
||||
- `node tests/unit/preliminary-check-model-and-detail.test.js`:通过
|
||||
- `node tests/unit/preliminary-check-states.test.js`:通过
|
||||
- `npm run build:prod`:通过
|
||||
|
||||
## 备注
|
||||
- 构建过程中存在既有 `asset size limit` 与 `entrypoint size limit` 警告
|
||||
- 本次结果总览页面改动未引入新的编译错误
|
||||
@@ -1,24 +1,28 @@
|
||||
<template>
|
||||
<div class="preliminary-check-container">
|
||||
<div v-if="pageState === 'loading'" class="preliminary-check-state">
|
||||
<p>结果总览加载中...</p>
|
||||
<div class="state-card">
|
||||
<el-skeleton animated :rows="6" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-else-if="pageState === 'empty'" class="preliminary-check-state">
|
||||
<p>暂无结果总览数据</p>
|
||||
<div class="state-card">
|
||||
<el-empty description="暂无结果总览数据" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-else class="preliminary-check-page">
|
||||
<overview-stats :summary="mockData.summary" />
|
||||
<risk-people-section :section-data="mockData.riskPeople" />
|
||||
<risk-model-section :section-data="mockData.riskModels" />
|
||||
<risk-detail-section :section-data="mockData.riskDetails" />
|
||||
<overview-stats :summary="currentData.summary" />
|
||||
<risk-people-section :section-data="currentData.riskPeople" />
|
||||
<risk-model-section :section-data="currentData.riskModels" />
|
||||
<risk-detail-section :section-data="currentData.riskDetails" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mockOverviewData } from "./preliminaryCheck.mock";
|
||||
import { mockOverviewData, mockOverviewStateData } from "./preliminaryCheck.mock";
|
||||
import OverviewStats from "./OverviewStats";
|
||||
import RiskPeopleSection from "./RiskPeopleSection";
|
||||
import RiskModelSection from "./RiskModelSection";
|
||||
@@ -50,21 +54,33 @@ export default {
|
||||
return {
|
||||
pageState: "loaded",
|
||||
mockData: mockOverviewData,
|
||||
stateDataMap: mockOverviewStateData,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
currentData() {
|
||||
return this.stateDataMap[this.pageState] || this.mockData;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.preliminary-check-container {
|
||||
min-height: 400px;
|
||||
padding: 16px 0 24px;
|
||||
background: #f3f6fb;
|
||||
}
|
||||
|
||||
.preliminary-check-state {
|
||||
padding: 40px 20px;
|
||||
min-height: 400px;
|
||||
}
|
||||
|
||||
.state-card {
|
||||
padding: 32px 24px;
|
||||
border-radius: 16px;
|
||||
background: #fff;
|
||||
color: #909399;
|
||||
text-align: center;
|
||||
box-shadow: 0 8px 24px rgba(15, 23, 42, 0.06);
|
||||
}
|
||||
|
||||
.preliminary-check-page {
|
||||
|
||||
@@ -120,7 +120,7 @@ export default {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.detail-table /deep/ th {
|
||||
:deep(.detail-table th) {
|
||||
background: #f8fafc;
|
||||
color: #64748b;
|
||||
}
|
||||
|
||||
@@ -197,7 +197,7 @@ export default {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.model-table /deep/ th {
|
||||
:deep(.model-table th) {
|
||||
background: #f8fafc;
|
||||
color: #64748b;
|
||||
}
|
||||
|
||||
@@ -110,7 +110,7 @@ export default {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.people-table /deep/ th {
|
||||
:deep(.people-table th) {
|
||||
background: #f8fafc;
|
||||
color: #64748b;
|
||||
}
|
||||
|
||||
@@ -142,3 +142,30 @@ export const mockOverviewData = {
|
||||
],
|
||||
},
|
||||
};
|
||||
|
||||
export const mockOverviewStateData = {
|
||||
loaded: mockOverviewData,
|
||||
empty: {
|
||||
summary: {
|
||||
...mockOverviewData.summary,
|
||||
stats: mockOverviewData.summary.stats.map((item) => ({
|
||||
...item,
|
||||
value: 0,
|
||||
})),
|
||||
},
|
||||
riskPeople: {
|
||||
overviewList: [],
|
||||
topRiskList: [],
|
||||
},
|
||||
riskModels: {
|
||||
...mockOverviewData.riskModels,
|
||||
cardList: [],
|
||||
peopleList: [],
|
||||
},
|
||||
riskDetails: {
|
||||
transactionList: [],
|
||||
abnormalAccountList: [],
|
||||
},
|
||||
},
|
||||
loading: mockOverviewData,
|
||||
};
|
||||
|
||||
17
ruoyi-ui/tests/unit/preliminary-check-states.test.js
Normal file
17
ruoyi-ui/tests/unit/preliminary-check-states.test.js
Normal file
@@ -0,0 +1,17 @@
|
||||
const assert = require("assert");
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
|
||||
const source = fs.readFileSync(
|
||||
path.resolve(
|
||||
__dirname,
|
||||
"../../src/views/ccdiProject/components/detail/PreliminaryCheck.vue"
|
||||
),
|
||||
"utf8"
|
||||
);
|
||||
|
||||
["pageState === 'loading'", "pageState === 'empty'", "el-skeleton", "el-empty"].forEach(
|
||||
(token) => {
|
||||
assert(source.includes(token), `缺少页面状态结构: ${token}`);
|
||||
}
|
||||
);
|
||||
Reference in New Issue
Block a user