From 0a8570696ee758b51a979e8de69ca110a411952b Mon Sep 17 00:00:00 2001
From: 张含笑 <zhx18749296735@163.com>
Date: Mon, 30 Jun 2025 17:10:28 +0800
Subject: [PATCH] Merge branch 'refs/heads/feature/v3.0.0/帮助中心'
---
src/router/views/index.js | 16 ++
src/assets/images/helpCenter/helpIcon.png | 0
src/page/index/top/top-qna.vue | 182 ++++++++++---------------
src/page/index/top/index.vue | 4
src/views/algorithmRepository/algorithmRepository.vue | 25 ++-
src/api/helpCenter/helpCenter.js | 27 +++
src/views/system/helpCenter.vue | 162 +++++++++++++++++++++++
7 files changed, 297 insertions(+), 119 deletions(-)
diff --git a/src/api/helpCenter/helpCenter.js b/src/api/helpCenter/helpCenter.js
new file mode 100644
index 0000000..f38c23c
--- /dev/null
+++ b/src/api/helpCenter/helpCenter.js
@@ -0,0 +1,27 @@
+import request from '@/axios';
+// 文件上传
+export const uploadFileAPI = (data,params) => {
+ return request({
+ url: `/blade-resource/oss/endpoint/put-file`,
+ method: 'post',
+ data,params
+ })
+ };
+
+// 列表
+export const listDataAPI = () => {
+ return request({
+ url: `/blade-system/helpCenter/list`,
+ method: 'get',
+
+ })
+ };
+
+//更新
+export const updataDataAPI = (data,params) => {
+ return request({
+ url: `/blade-system/helpCenter/update`,
+ method: 'put',
+ data,params
+ })
+ };
diff --git a/src/assets/images/helpCenter/helpIcon.png b/src/assets/images/helpCenter/helpIcon.png
new file mode 100644
index 0000000..18cc524
--- /dev/null
+++ b/src/assets/images/helpCenter/helpIcon.png
Binary files differ
diff --git a/src/page/index/top/index.vue b/src/page/index/top/index.vue
index 2478ef5..dcdcb8d 100644
--- a/src/page/index/top/index.vue
+++ b/src/page/index/top/index.vue
@@ -7,13 +7,13 @@
</div>
</div>
<div class="top-bar__title">
-<!-- <top-menu ref="topMenu" v-if="setting.menu"></top-menu>-->
+<!--<top-menu ref="topMenu" v-if="setting.menu"></top-menu>-->
<top-search class="top-bar__item" v-if="setting.search"></top-search>
</div>
<div class="top-bar__right">
<div class="icon-box">
<top-lock v-if="setting.lock"/>
- <top-qna title="帮助中心"/>
+ <top-qna />
<top-full v-if="setting.fullscreen" title="全屏"/>
<img class="gateway" @click="jumpMH" src="@/assets/images/mh.png" alt="进入门户" title="进入门户" width="20" height="20">
</div>
diff --git a/src/page/index/top/top-qna.vue b/src/page/index/top/top-qna.vue
index 89435d5..9430a53 100644
--- a/src/page/index/top/top-qna.vue
+++ b/src/page/index/top/top-qna.vue
@@ -1,66 +1,82 @@
<template>
- <div class="top-qna" @mouseenter="disableTooltip" @mouseleave="enableTooltip">
- <el-tooltip :disabled="tooltipDisabled" content="帮助中心" placement="bottom">
- <el-icon @click="showHelp" class="help-icon">
- <QuestionFilled />
- </el-icon>
- </el-tooltip>
- <el-dialog v-model="dialogVisible" title="帮助中心" width="30%" @close="closeDialog">
- <div class="dialog-content">
- <div class="qa-item">
- <span class="qa-title">Q1:智飞机场 2 支持哪些无人机?</span>
- <span class="qa-text">
- A1:智飞机场 2 仅支持 DJI Matrice 3D 系列无人机。
- </span>
- </div>
- <div class="qa-item">
- <span class="qa-title">Q2:智飞机场 2 如何应对意外断电?</span>
- <span class="qa-text">
- A2:若发生意外断电,机场仍可借助内置蓄电池独立工作超 5 小时,为飞行器预留充足的返航降落时间。
- 断电后,机场不支持飞行器充电、空调、舱盖加热、风速计加热等功能,请及时排查故障。
- </span>
- </div>
- <div class="qa-item">
- <span class="qa-title">Q3:智飞机场 2 和第一代智飞机场有什么区别?</span>
- <span class="qa-text">
- A3:相对于第一代智飞机场,智飞机场 2 在体积、重量上大幅下降,不仅轻量化、易部署,
- 且具备更强大的作业能力和云端智能功能,大幅降低了无人值守作业门槛,作业效率和质量也上升至全新高度。
- </span>
- </div>
- </div>
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="closeDialog">关闭</el-button>
- </span>
+ <div class="top-qna">
+ <el-dropdown @command="dropdownClick">
+ <img alt="" src="@/assets/images/helpCenter/helpIcon.png" />
+ <template #dropdown>
+ <el-dropdown-menu>
+ <el-dropdown-item command="guide">入门指南</el-dropdown-item>
+ <el-dropdown-item command="systemupdate">系统更新</el-dropdown-item>
+ </el-dropdown-menu>
</template>
- </el-dialog>
+ </el-dropdown>
</div>
</template>
-<script>
-export default {
- name: 'top-qna',
- data() {
- return {
- dialogVisible: false, // 确保初始值为 false
- tooltipDisabled: false, // 控制 tooltip 是否显示
- };
- },
- methods: {
- showHelp() {
- this.dialogVisible = true;
- },
- closeDialog() {
- this.dialogVisible = false;
- },
- disableTooltip() {
- this.tooltipDisabled = true; // 禁用 tooltip
- },
- enableTooltip() {
- this.tooltipDisabled = false; // 启用 tooltip
- },
- },
+<script setup>
+import { listDataAPI } from '@/api/helpCenter/helpCenter';
+import { useRouter } from 'vue-router';
+import { ElMessage } from 'element-plus';
+const router = useRouter();
+const systemupdateFilePath = ref(null);
+const rumenPath = ref(null);
+const fileData = ref([]); // 存储所有文件数据
+const loading = ref(false);
+const getlistDataAPI = async () => {
+ loading.value = true;
+ try {
+ const res = await listDataAPI();
+ if (res.data.code === 200 && res.data.data) {
+ fileData.value = res.data.data;
+
+ // 使用 find 方法查找特定条目
+ const systemUpdateItem = res.data.data.find(item => item.id === 4);
+ const rumenItem = res.data.data.find(item => item.id === 2);
+
+ if (systemUpdateItem) {
+ systemupdateFilePath.value = systemUpdateItem.filePath;
+ } else {
+ console.warn('未找到系统更新条目');
+ }
+
+ if (rumenItem) {
+ rumenPath.value = rumenItem.filePath;
+ } else {
+ console.warn('未找到入门指南条目');
+ }
+ } else {
+ ElMessage.error('获取帮助数据失败');
+ }
+ } catch (error) {
+ console.error('获取数据出错:', error);
+ ElMessage.error('请求失败');
+ } finally {
+ loading.value = false;
+ }
};
+const dropdownClick = val => {
+ // 确保数据已加载
+ if (loading.value) {
+ ElMessage.warning('数据正在加载,请稍后');
+ return;
+ }
+
+ if (val === 'guide') {
+ if (!rumenPath.value) {
+ ElMessage.warning('入门指南文件未找到');
+ return;
+ }
+
+ window.open(rumenPath.value, '_blank');
+ } else if (val === 'systemupdate') {
+ window.open(systemupdateFilePath.value, '_blank');
+
+
+ }
+};
+
+onMounted(() => {
+ getlistDataAPI();
+});
</script>
<style lang="scss" scoped>
@@ -70,57 +86,5 @@
font-size: 18px;
justify-content: center;
cursor: pointer;
-}
-
-/* 优化弹出框样式 */
-:deep(.el-dialog) {
- border-radius: 8px; /* 圆角边框 */
- overflow: visible; /* 防止内容溢出 */
- .el-dialog__header {
- padding: 15px 20px;
- border-bottom: 1px solid #e8e8e8; /* 标题下边框 */
- .el-dialog__title {
- font-size: 16px;
- font-weight: bold;
- color: #333;
- }
- }
- .el-dialog__body {
- padding: 20px;
- max-height: none; /* 取消高度限制 */
- overflow: visible; /* 取消滚动条 */
- word-wrap: break-word; /* 自动换行 */
- word-break: break-word; /* 防止长单词溢出 */
- white-space: normal; /* 确保文字自动换行 */
- }
- .el-dialog__footer {
- padding: 10px 20px;
- border-top: 1px solid #e8e8e8; /* 底部上边框 */
- text-align: right;
- }
-}
-
-/* 优化内容样式 */
-.dialog-content {
- .qa-item {
- margin-bottom: 15px;
- padding: 10px;
- border: 1px solid #e8e8e8; /* 边框 */
- border-radius: 4px; /* 圆角 */
- background-color: #f9f9f9; /* 背景色 */
- .qa-title {
- font-size: 14px;
- font-weight: bold;
- color: #333;
- display: block; /* 确保换行 */
- margin-bottom: 5px;
- }
- .qa-text {
- font-size: 14px;
- color: #666;
- line-height: 1.6; /* 行间距 */
- display: block; /* 确保换行 */
- }
- }
}
</style>
diff --git a/src/router/views/index.js b/src/router/views/index.js
index d2da43f..568b2c8 100644
--- a/src/router/views/index.js
+++ b/src/router/views/index.js
@@ -141,4 +141,20 @@
},
],
},
+
+ {
+ path: '/helpCenter',
+ component: Layout,
+ redirect: '/system/helpCenter',
+ children: [
+ {
+ path: 'system',
+ name: '帮助中心',
+ meta: {
+ i18n: 'info',
+ },
+ component: () => import(/* webpackChunkName: "views" */ '@/views/system/helpCenter.vue'),
+ },
+ ],
+ },
];
diff --git a/src/views/algorithmRepository/algorithmRepository.vue b/src/views/algorithmRepository/algorithmRepository.vue
index d3cbf0f..adadf1a 100644
--- a/src/views/algorithmRepository/algorithmRepository.vue
+++ b/src/views/algorithmRepository/algorithmRepository.vue
@@ -102,9 +102,7 @@
</template>
<script setup>
-defineOptions({
- name: 'algorithmRepository',
-});
+
import { getDictionaryByCode } from '@/api/system/dictbiz';
import { getalgorithmList, selectDeviceList } from '@/api/algorithm';
import { getSmallImg } from '@/utils/util';
@@ -124,7 +122,7 @@
device_name: '',
name: '',
current: 1,
- size: 10,
+ size: 15,
});
// 请求字典字段
@@ -153,7 +151,18 @@
};
// 详情
const getList = () => {
- getalgorithmList(params.value).then(res => {
+const detailParams={
+ ai_type_key: params.value.ai_type_key,
+ start_date:params.value.start_date,
+ end_date: params.value.end_date,
+ device_name: params.value.device_name,
+ name:params.value.name,
+}
+ getalgorithmList(detailParams,{ current: params.value.current,
+ size: params.value.size,}).then(res => {
+
+ console.log('算法仓库',res.data.data);
+
loading.value = true;
detailData.value = res.data.data.records;
total.value = res.data.data.total;
@@ -279,14 +288,14 @@
.pictureitem {
display: grid;
grid-template-columns: repeat(5, 1fr);
- gap: 24px;
+ gap: 14px;
.imgitem {
border-radius: 12px 12px 0 0;
overflow: hidden;
.el-image {
width: 100%;
- height: 200px;
+ height: 170px;
display: block;
margin: 0;
padding: 0;
@@ -295,7 +304,7 @@
display: flex;
justify-content: space-between;
align-items: center;
- height: 42px;
+ height: 35px;
border-radius: 0 0 12px 12px;
overflow: hidden;
background: linear-gradient(180deg, #ffffff 0%, #e5edff 100%);
diff --git a/src/views/system/helpCenter.vue b/src/views/system/helpCenter.vue
new file mode 100644
index 0000000..2fae289
--- /dev/null
+++ b/src/views/system/helpCenter.vue
@@ -0,0 +1,162 @@
+<template>
+ <basic-container>
+ <div class="helpContainer">
+ <el-table
+ class="custom-table"
+ :data="helpData"
+ style="width: 100%"
+ :row-class-name="tableRowClassName"
+ >
+ <el-table-column label="序号" type="index" width="100">
+ <template #default="{ $index }">
+ {{ $index + 1 }}
+ </template>
+ </el-table-column>
+ <el-table-column prop="levelOneType" label="一级类别" />
+ <el-table-column prop="levelTwoType" label="二级类别" />
+ <el-table-column prop="uploadUser" label="上传者" />
+ <el-table-column prop="createTime" label="上传时间" />
+ <el-table-column label="操作" width="150" align="center">
+ <template #default="scope">
+ <span class="look" @click="clickDetail(scope.row)" v-if="permission.helpCenterLook"
+ >查看</span
+ >
+ <el-upload
+ style="display: inline-block"
+ :show-file-list="false"
+ :before-upload="file => onUploadFileBefore(file, scope.row)"
+ :limit="1"
+ accept=".pdf"
+ >
+ <span class="uploads" v-if="permission.helpCenterUpload">上传</span>
+ </el-upload>
+ </template>
+ </el-table-column>
+ </el-table>
+ </div>
+ </basic-container>
+</template>
+
+<script setup>
+import { uploadFileAPI, listDataAPI, updataDataAPI } from '@/api/helpCenter/helpCenter';
+import { ElMessage } from 'element-plus';
+import { computed, onMounted } from 'vue';
+const helpData = ref([]);
+
+import { useStore } from 'vuex';
+const store = useStore();
+const permission = computed(() => store.state.user.permission);
+// 表格隔行变色
+const tableRowClassName = ({ row, rowIndex }) => {
+ if (rowIndex % 2 === 1) {
+ return 'warning-row';
+ } else {
+ return 'success-row';
+ }
+};
+const getlistDataAPI = () => {
+ listDataAPI().then(res => {
+ helpData.value = res.data.data;
+ });
+};
+// 查看
+// const clickDetail = row => {
+// if (!row.filePath) {
+// ElMessage.warning('没有可预览的文件');
+// return;
+// }
+// fetch(row.filePath)
+// .then(response => response.blob())
+// .then(res => {
+// let blob = new Blob([res], { type: 'application/pdf' });
+// // pdfurl即转化后的结果
+// let pdfurl = window.URL.createObjectURL(blob);
+// // 新标签页打开,即可预览并下载
+// window.open(pdfurl);
+// });
+// };
+const clickDetail = val => {
+ const filePath = val.filePath;
+ if (!val.filePath) {
+ ElMessage.warning('没有可预览的文件');
+ return;
+ }
+ window.open(filePath, '_blank');
+};
+// 文件上传
+const onUploadFileBefore = (file, row) => {
+ const fileFormat = file.name?.split('.')[1];
+ if (fileFormat !== 'pdf') return ElMessage.error('请上传pdf格式的文件');
+ const formData = new FormData();
+ formData.append('file', file, file.name);
+
+ uploadFileAPI(formData).then(res => {
+ if (res.data.code === 200) {
+ const params = {
+ id: row.id,
+ filePath: res.data.data.link,
+ };
+ ElMessage.success('上传成功');
+ updataDataAPI(params);
+ } else {
+ ElMessage.error('上传失败');
+ }
+ getlistDataAPI();
+ });
+};
+onMounted(() => {
+ getlistDataAPI();
+});
+</script>
+<style lang="scss">
+.helpContainer {
+ .el-table .success-row {
+ --el-table-tr-bg-color: #fff;
+ }
+ .el-table .warning-row {
+ --el-table-tr-bg-color: #f3f6ff;
+ }
+}
+</style>
+<style scoped lang="scss">
+/* 表头样式 */
+.custom-table :deep(.el-table__header) th {
+ height: 70px;
+ font-family: Source Han Sans CN, Source Han Sans CN;
+ font-weight: bold;
+ font-size: 14px;
+ color: #49556e;
+ background-color: #f3f6ff;
+ text-align: center;
+}
+
+/* 行样式 */
+.custom-table :deep(.el-table__body) tr {
+ height: 70px;
+ font-family: Source Han Sans CN, Source Han Sans CN;
+ font-weight: 400;
+ font-size: 14px;
+ color: #363636;
+ text-align: center;
+}
+.custom-table :deep(.el-table__body) td.el-table__cell {
+ text-align: center;
+}
+.helpContainer {
+ height: 100%;
+ .look {
+ font-family: Source Han Sans CN, Source Han Sans CN;
+ color: #1c5cff;
+ cursor: pointer;
+ margin-right: 15px;
+ font-size: 14px;
+ }
+ .uploads {
+ font-family: Source Han Sans CN, Source Han Sans CN;
+ font-weight: 400;
+ font-size: 14px;
+ color: #19876d;
+ cursor: pointer;
+ }
+}
+</style>
--
Gitblit v1.9.3