完成结果总览页面前端实现
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>
|
<template>
|
||||||
<div class="preliminary-check-container">
|
<div class="preliminary-check-container">
|
||||||
<div v-if="pageState === 'loading'" class="preliminary-check-state">
|
<div v-if="pageState === 'loading'" class="preliminary-check-state">
|
||||||
<p>结果总览加载中...</p>
|
<div class="state-card">
|
||||||
|
<el-skeleton animated :rows="6" />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-else-if="pageState === 'empty'" class="preliminary-check-state">
|
<div v-else-if="pageState === 'empty'" class="preliminary-check-state">
|
||||||
<p>暂无结果总览数据</p>
|
<div class="state-card">
|
||||||
|
<el-empty description="暂无结果总览数据" />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-else class="preliminary-check-page">
|
<div v-else class="preliminary-check-page">
|
||||||
<overview-stats :summary="mockData.summary" />
|
<overview-stats :summary="currentData.summary" />
|
||||||
<risk-people-section :section-data="mockData.riskPeople" />
|
<risk-people-section :section-data="currentData.riskPeople" />
|
||||||
<risk-model-section :section-data="mockData.riskModels" />
|
<risk-model-section :section-data="currentData.riskModels" />
|
||||||
<risk-detail-section :section-data="mockData.riskDetails" />
|
<risk-detail-section :section-data="currentData.riskDetails" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mockOverviewData } from "./preliminaryCheck.mock";
|
import { mockOverviewData, mockOverviewStateData } from "./preliminaryCheck.mock";
|
||||||
import OverviewStats from "./OverviewStats";
|
import OverviewStats from "./OverviewStats";
|
||||||
import RiskPeopleSection from "./RiskPeopleSection";
|
import RiskPeopleSection from "./RiskPeopleSection";
|
||||||
import RiskModelSection from "./RiskModelSection";
|
import RiskModelSection from "./RiskModelSection";
|
||||||
@@ -50,21 +54,33 @@ export default {
|
|||||||
return {
|
return {
|
||||||
pageState: "loaded",
|
pageState: "loaded",
|
||||||
mockData: mockOverviewData,
|
mockData: mockOverviewData,
|
||||||
|
stateDataMap: mockOverviewStateData,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
currentData() {
|
||||||
|
return this.stateDataMap[this.pageState] || this.mockData;
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.preliminary-check-container {
|
.preliminary-check-container {
|
||||||
min-height: 400px;
|
min-height: 400px;
|
||||||
|
padding: 16px 0 24px;
|
||||||
|
background: #f3f6fb;
|
||||||
}
|
}
|
||||||
|
|
||||||
.preliminary-check-state {
|
.preliminary-check-state {
|
||||||
padding: 40px 20px;
|
min-height: 400px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.state-card {
|
||||||
|
padding: 32px 24px;
|
||||||
|
border-radius: 16px;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
color: #909399;
|
box-shadow: 0 8px 24px rgba(15, 23, 42, 0.06);
|
||||||
text-align: center;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.preliminary-check-page {
|
.preliminary-check-page {
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ export default {
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.detail-table /deep/ th {
|
:deep(.detail-table th) {
|
||||||
background: #f8fafc;
|
background: #f8fafc;
|
||||||
color: #64748b;
|
color: #64748b;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -197,7 +197,7 @@ export default {
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.model-table /deep/ th {
|
:deep(.model-table th) {
|
||||||
background: #f8fafc;
|
background: #f8fafc;
|
||||||
color: #64748b;
|
color: #64748b;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ export default {
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.people-table /deep/ th {
|
:deep(.people-table th) {
|
||||||
background: #f8fafc;
|
background: #f8fafc;
|
||||||
color: #64748b;
|
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