From f5ab69a4313ec893e20e06b40e846a4a1146fd0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A0=82=E7=B3=96?= Date: Wed, 20 Aug 2025 13:44:05 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20=E5=A2=9E=E5=8A=A0=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E7=9B=88=E4=BA=8F=E5=92=8C=E9=97=AE=E9=A2=98=E5=8F=8D?= =?UTF-8?q?=E9=A6=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/oa/feedback.js | 61 ++++ api/oa/finance/profit.js | 10 + components/Quill/Quill.vue | 5 +- pages.json | 34 +- pages/workbench/feedback/create.vue | 161 +++++++++ pages/workbench/feedback/detail.vue | 186 ++++++++++ pages/workbench/feedback/feedback.vue | 375 ++++++++++++++++++++ pages/workbench/index/index.vue | 166 +++++++-- pages/workbench/profit/profit.vue | 489 ++++++++++++++++++++++++++ static/images/wenti.png | Bin 0 -> 7097 bytes static/images/yingkui.png | Bin 0 -> 4483 bytes 11 files changed, 1445 insertions(+), 42 deletions(-) create mode 100644 api/oa/feedback.js create mode 100644 api/oa/finance/profit.js create mode 100644 pages/workbench/feedback/create.vue create mode 100644 pages/workbench/feedback/detail.vue create mode 100644 pages/workbench/feedback/feedback.vue create mode 100644 pages/workbench/profit/profit.vue create mode 100644 static/images/wenti.png create mode 100644 static/images/yingkui.png diff --git a/api/oa/feedback.js b/api/oa/feedback.js new file mode 100644 index 0000000..417141f --- /dev/null +++ b/api/oa/feedback.js @@ -0,0 +1,61 @@ +import request from "@/util/oaRequest" + +// 查询问题反馈列表 +export function listFeedback(query) { + return request({ + url: '/oa/feedback/list', + method: 'get', + params: query + }) +} +// 查询问题反馈列表 +export function indexListFeedback(query) { + return request({ + url: '/oa/feedback/index-list', + method: 'get', + params: query + }) +} + +// 查询问题反馈详细 +export function getFeedback(feedbackId) { + return request({ + url: '/oa/feedback/' + feedbackId, + method: 'get' + }) +} + +// 新增问题反馈 +export function addFeedback(data) { + return request({ + url: '/oa/feedback', + method: 'post', + data: data + }) +} + +// 修改问题反馈 +export function updateFeedback(data) { + return request({ + url: '/oa/feedback', + method: 'put', + data: data + }) +} + +// 修改问题反馈 +export function toRead(data) { + return request({ + url: '/oa/feedback/toRead', + method: 'put', + data: data + }) +} + +// 删除问题反馈 +export function delFeedback(feedbackId) { + return request({ + url: '/oa/feedback/remove/' + feedbackId, + method: 'delete' + }) +} diff --git a/api/oa/finance/profit.js b/api/oa/finance/profit.js new file mode 100644 index 0000000..752ad3f --- /dev/null +++ b/api/oa/finance/profit.js @@ -0,0 +1,10 @@ +import request from "@/util/oaRequest" + +// 查询项目盈亏 +export const listProfit = (params) => { + return request({ + url: '/oa/project/projectProfit', + method: 'get', + params + }) +} diff --git a/components/Quill/Quill.vue b/components/Quill/Quill.vue index 22dc366..5952e08 100644 --- a/components/Quill/Quill.vue +++ b/components/Quill/Quill.vue @@ -131,8 +131,9 @@ export default { }, onInput(e) { // 触发v-model - this.$emit('input', e.detail.html); - this.$emit('update:value', e.detail.html); + console.log(e) + this.$emit('input', e.html); + this.$emit('update:value', e.html); }, onAt(e) { addAt({ username: e.name, userid: e.id }, () => { diff --git a/pages.json b/pages.json index eddc4fb..cbe800a 100644 --- a/pages.json +++ b/pages.json @@ -357,7 +357,39 @@ "navigationBarTitleText" : "线上营销", "navigationStyle": "default" } - } + }, + { + "path" : "pages/workbench/feedback/feedback", + "style" : + { + "navigationBarTitleText" : "问题反馈", + "navigationStyle": "default" + } + }, + { + "path" : "pages/workbench/feedback/detail", + "style" : + { + "navigationBarTitleText" : "反馈详情", + "navigationStyle": "default" + } + }, + { + "path" : "pages/workbench/feedback/create", + "style" : + { + "navigationBarTitleText" : "新建反馈", + "navigationStyle": "default" + } + }, + { + "path" : "pages/workbench/profit/profit", + "style" : + { + "navigationBarTitleText" : "项目盈亏", + "navigationStyle": "default" + } + } ], "tabBar": { "color": "#8E9AB0", diff --git a/pages/workbench/feedback/create.vue b/pages/workbench/feedback/create.vue new file mode 100644 index 0000000..fd3c3ff --- /dev/null +++ b/pages/workbench/feedback/create.vue @@ -0,0 +1,161 @@ + + + + + \ No newline at end of file diff --git a/pages/workbench/feedback/detail.vue b/pages/workbench/feedback/detail.vue new file mode 100644 index 0000000..39bdf1b --- /dev/null +++ b/pages/workbench/feedback/detail.vue @@ -0,0 +1,186 @@ + + + + + \ No newline at end of file diff --git a/pages/workbench/feedback/feedback.vue b/pages/workbench/feedback/feedback.vue new file mode 100644 index 0000000..0699e3e --- /dev/null +++ b/pages/workbench/feedback/feedback.vue @@ -0,0 +1,375 @@ + + + + + \ No newline at end of file diff --git a/pages/workbench/index/index.vue b/pages/workbench/index/index.vue index 36eebb1..63b2d6f 100644 --- a/pages/workbench/index/index.vue +++ b/pages/workbench/index/index.vue @@ -5,18 +5,27 @@ 工作台 - - - - {{ item.text }} + + + + + + {{ category || '其他' }} + + + + + + + {{ item.text }} + - @@ -30,67 +39,119 @@ export default { CustomNavBar, }, onShow() { - console.log('页面onLoad被调用'); - // 页面加载时调用getUserProfile + console.log('页面onShow被调用'); this.fetchUserProfile(); }, data() { return { + roleGroup: [], // 存储用户拥有的权限集合 + loading: true, entryList: [ { text: '每日报工', icon: '/static/images/baogong.png', url: '/pages/workbench/reportWork/reportWork', - }, - { - text: '施工进度', - icon: '/static/images/shigong.png', - url: '/pages/workbench/construction/construction', + category: "信息中心" + // 未设置access时默认允许所有用户访问 }, { text: '任务中心', icon: '/static/images/task.png', url: '/pages/workbench/task/task', + category: "信息中心" }, { text: '项目排产', icon: '/static/images/paichan.png', url: '/pages/workbench/reportSchedule/reportSchedule', + category: '车间管理' }, + { + text: '施工进度', + icon: '/static/images/shigong.png', + url: '/pages/workbench/construction/construction', + category: '车间管理' + }, { text: '快递信息', icon: '/static/images/express.svg', url: '/pages/workbench/express/express', + category: '车间管理' }, { text: '项目中心', icon: '/static/images/project.png', url: '/pages/workbench/project/project', + category: "信息中心" }, + { + text: '问题反馈', + icon: '/static/images/wenti.png', + url: '/pages/workbench/feedback/feedback', + category: "信息中心" + }, { text: '库存盘点', icon: '/static/images/stock.png', url: '/pages/workbench/wms/wms', + category: "库房管理" }, { - text: '线上营销', - icon: '/static/images/yingxiao.png', - url: '/pages/workbench/sales/sales', + text: '项目盈亏', + icon: '/static/images/yingkui.png', + url: '/pages/workbench/profit/profit', + category: '财务中心', + access: ['vice', 'baomi', 'ceo'] // 需要特定权限才能访问 }, + { + text: '线上营销', + icon: '/static/images/yingxiao.png', + url: '/pages/workbench/sales/sales', + }, ], }; }, + computed: { + // 按category分组并过滤权限的计算属性 + groupedEntries() { + const groups = {}; + this.entryList.forEach(item => { + // 权限判断逻辑: + // 1. 如果item没有access属性,默认允许访问 + // 2. 如果有access属性,检查用户权限(roleGroup)是否包含其中任意一个 + const hasAccess = !item.access || item.access.some(access => this.roleGroup.includes(access)); + + // 没有权限则跳过当前项 + if (!hasAccess) return; + + // 按分类分组 + const category = item.category || '其他'; + if (!groups[category]) { + groups[category] = []; + } + groups[category].push(item); + }); + return groups; + } + }, methods: { - // 获取用户个人信息 async fetchUserProfile() { console.log('fetchUserProfile方法开始执行'); try { + // this.loading = true; + uni.showLoading() console.log('开始调用getUserProfile API'); const response = await getUserProfile(); console.log('用户个人信息:', response); - // 这里可以根据需要处理返回的用户信息 + // 从接口返回数据中提取用户权限(roleKey) + const roles = response.data.user?.roles?.map(item => item.roleKey) || []; + console.log('用户权限字段', roles); + this.roleGroup = roles; + uni.hideLoading() } catch (error) { console.error('获取用户个人信息失败:', error); + // 错误处理:可以设置默认权限或提示用户 + this.roleGroup = []; } }, handleEntryClick(item) { @@ -105,41 +166,68 @@ export default { + \ No newline at end of file diff --git a/pages/workbench/profit/profit.vue b/pages/workbench/profit/profit.vue new file mode 100644 index 0000000..78a7280 --- /dev/null +++ b/pages/workbench/profit/profit.vue @@ -0,0 +1,489 @@ + + + + + \ No newline at end of file diff --git a/static/images/wenti.png b/static/images/wenti.png new file mode 100644 index 0000000000000000000000000000000000000000..4b0f3d346ac12cd95f7a89ac661d83e4f9e93f66 GIT binary patch literal 7097 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 literal 0 HcmV?d00001 diff --git a/static/images/yingkui.png b/static/images/yingkui.png new file mode 100644 index 0000000000000000000000000000000000000000..3b508e626a7055f259ee1bc4634ac2605962fe36 GIT binary patch literal 4483 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 literal 0 HcmV?d00001