From dfb3f27f39d6bdc4d56e0d98523445b7d2621819 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=96=87=E6=B6=9B?= <1909118034@qq.com> Date: Tue, 15 Apr 2025 22:41:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=86=85=E5=AE=B9(home)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/login.ts | 9 +- components/SharePoster.vue | 2 +- .../community-selector/community-selector.vue | 220 ++++ components/examples/permission-button.vue | 29 + components/examples/permission-example.vue | 124 ++ pages/chat/index.vue | 19 +- pages/index/index.vue | 80 +- pages/login/index.vue | 99 +- pages/mine/index.vue | 50 +- pagesA/invite/index.vue | 20 +- pagesA/message/index.vue | 35 +- pagesA/verification/history.vue | 2 + pagesA/verification/historyDetail.vue | 4 +- pagesA/verification/index.vue | 17 +- pagesB/call/index.vue | 1063 ++++++++++------- pagesB/complaint/index.vue | 98 +- pagesB/questionnaire/list.vue | 127 +- pagesB/setting/index.vue | 591 +++++---- unocss/a-hua-unocss/index.scss | 282 ++++- utils/permission.js | 60 + 20 files changed, 1944 insertions(+), 987 deletions(-) create mode 100644 components/community-selector/community-selector.vue create mode 100644 components/examples/permission-button.vue create mode 100644 components/examples/permission-example.vue create mode 100644 utils/permission.js diff --git a/api/login.ts b/api/login.ts index 98423ba..c002ba1 100644 --- a/api/login.ts +++ b/api/login.ts @@ -14,4 +14,11 @@ export const userInfo = (data : any) => get('v1/info', data); export const captcha = (data : any) => get('v1/captcha', data); -export const login = (data : any) => post('v1/login', data); \ No newline at end of file +export const login = (data : any) => post('v1/login', data); + + +export const logout = (data : any) => get('v1/logout', data); + +// 获取权限 +export const menu = (data : any) => get('v1/menu', data); + diff --git a/components/SharePoster.vue b/components/SharePoster.vue index 13e2f7d..2204f4d 100644 --- a/components/SharePoster.vue +++ b/components/SharePoster.vue @@ -83,7 +83,7 @@ immediate: true, deep: true, handler(newVal) { - console.log('SharePoster posterInfo changed:', newVal) + // console.log('SharePoster posterInfo changed:', newVal) }, }, }, diff --git a/components/community-selector/community-selector.vue b/components/community-selector/community-selector.vue new file mode 100644 index 0000000..7676794 --- /dev/null +++ b/components/community-selector/community-selector.vue @@ -0,0 +1,220 @@ + + + + + \ No newline at end of file diff --git a/components/examples/permission-button.vue b/components/examples/permission-button.vue new file mode 100644 index 0000000..30f3695 --- /dev/null +++ b/components/examples/permission-button.vue @@ -0,0 +1,29 @@ + + + + + \ No newline at end of file diff --git a/components/examples/permission-example.vue b/components/examples/permission-example.vue new file mode 100644 index 0000000..32a9fe6 --- /dev/null +++ b/components/examples/permission-example.vue @@ -0,0 +1,124 @@ + + + + + \ No newline at end of file diff --git a/pages/chat/index.vue b/pages/chat/index.vue index 7caf10b..0425cc9 100644 --- a/pages/chat/index.vue +++ b/pages/chat/index.vue @@ -10,16 +10,16 @@ @@ -69,6 +69,8 @@ + + @@ -76,6 +78,8 @@ import { ref } from 'vue' const messageList = ref([]) import { onLoad, onReachBottom, onPullDownRefresh } from '@dcloudio/uni-app' + import { useToast } from '@/uni_modules/wot-design-uni' + const Toast = useToast() onPullDownRefresh(() => { uni.stopPullDownRefresh() @@ -85,6 +89,13 @@ }) + const clearMsg = () => { + Toast.info('暂无消息') + } + const search = () => { + Toast.info('暂无消息') + } + const handleAction = (action : string) => { console.log(action); } diff --git a/pages/index/index.vue b/pages/index/index.vue index 8a749f9..8d814d5 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -40,7 +40,7 @@ - - \ No newline at end of file diff --git a/pagesB/complaint/index.vue b/pagesB/complaint/index.vue index 1b385ca..9a4b44e 100644 --- a/pagesB/complaint/index.vue +++ b/pagesB/complaint/index.vue @@ -153,53 +153,53 @@ // 模拟数据 - 实际项目中应该是通过API获取 const complaintList = ref([ - { - complaint_id: 1, - complaint_no: 'TS20240607001', - content: '楼道灯已经坏了三天,晚上上下楼很不方便,希望物业尽快解决!', - village_name: '阳光花园小区', - user_name: '张三', - user_mobile: '13800138000', - create_time: '2024-06-07 10:23', - status: 0, - urgency: 2, - tags: ['公共设施', '照明'], - images: [ - 'https://img.yzcdn.cn/vant/cat.jpeg', - 'https://img.yzcdn.cn/vant/tree.jpeg' - ] - }, - { - complaint_id: 2, - complaint_no: 'TS20240606001', - content: '小区北门停车场有人乱停车,导致通道被堵,请物业及时处理。', - village_name: '阳光花园小区', - user_name: '李四', - user_mobile: '13900139000', - create_time: '2024-06-06 16:45', - status: 1, - urgency: 1, - tags: ['停车管理', '安全隐患'], - images: [ - 'https://img.yzcdn.cn/vant/cat.jpeg', - 'https://img.yzcdn.cn/vant/cat.jpeg', - 'https://img.yzcdn.cn/vant/cat.jpeg', - 'https://img.yzcdn.cn/vant/tree.jpeg' - ] - }, - { - complaint_id: 3, - complaint_no: 'TS20240605001', - content: '小区垃圾分类做得不到位,希望加强宣传和管理。', - village_name: '阳光花园小区', - user_name: '王五', - user_mobile: '13700137000', - create_time: '2024-06-05 09:12', - status: 2, - urgency: 1, - tags: ['环境卫生', '垃圾分类'], - images: [] - } + // { + // complaint_id: 1, + // complaint_no: 'TS20240607001', + // content: '楼道灯已经坏了三天,晚上上下楼很不方便,希望物业尽快解决!', + // village_name: '阳光花园小区', + // user_name: '张三', + // user_mobile: '13800138000', + // create_time: '2024-06-07 10:23', + // status: 0, + // urgency: 2, + // tags: ['公共设施', '照明'], + // images: [ + // 'https://img.yzcdn.cn/vant/cat.jpeg', + // 'https://img.yzcdn.cn/vant/tree.jpeg' + // ] + // }, + // { + // complaint_id: 2, + // complaint_no: 'TS20240606001', + // content: '小区北门停车场有人乱停车,导致通道被堵,请物业及时处理。', + // village_name: '阳光花园小区', + // user_name: '李四', + // user_mobile: '13900139000', + // create_time: '2024-06-06 16:45', + // status: 1, + // urgency: 1, + // tags: ['停车管理', '安全隐患'], + // images: [ + // 'https://img.yzcdn.cn/vant/cat.jpeg', + // 'https://img.yzcdn.cn/vant/cat.jpeg', + // 'https://img.yzcdn.cn/vant/cat.jpeg', + // 'https://img.yzcdn.cn/vant/tree.jpeg' + // ] + // }, + // { + // complaint_id: 3, + // complaint_no: 'TS20240605001', + // content: '小区垃圾分类做得不到位,希望加强宣传和管理。', + // village_name: '阳光花园小区', + // user_name: '王五', + // user_mobile: '13700137000', + // create_time: '2024-06-05 09:12', + // status: 2, + // urgency: 1, + // tags: ['环境卫生', '垃圾分类'], + // images: [] + // } ]); // 状态颜色配置 @@ -260,7 +260,7 @@ if (loading.value || finished.value) return; try { - loading.value = true; + // loading.value = true; // 这里应该调用实际的API接口获取数据 // const params = { @@ -276,7 +276,7 @@ // 模拟数据加载完成的情况 if (page.value > 1) { - finished.value = true; + // finished.value = true; } else { page.value++; } diff --git a/pagesB/questionnaire/list.vue b/pagesB/questionnaire/list.vue index 06d821a..a0e4f2a 100644 --- a/pagesB/questionnaire/list.vue +++ b/pagesB/questionnaire/list.vue @@ -36,8 +36,7 @@ - - + - + @@ -113,10 +112,8 @@ - - - - 暂无问卷记录 + + @@ -256,61 +253,61 @@ // 模拟问卷列表数据 const questionnaireList = ref([ - { - id: 1, - title: '2024年度物业服务满意度调查', - village_name: '阳光花园小区', - type: '满意度调查', - user_name: '张三', - is_anonymous: false, - submit_time: '2024-06-15 14:23', - question_count: 15, - status: 1 // 已查看 - }, - { - id: 2, - title: '小区环境改造意见征集', - village_name: '翠湖庭院', - type: '意见征集', - user_name: '李四', - is_anonymous: true, - submit_time: '2024-06-12 09:45', - question_count: 8, - status: 0 // 未查看 - }, - { - id: 3, - title: '业主委员会换届选举投票', - village_name: '金色家园', - type: '投票选举', - user_name: '王五', - is_anonymous: false, - submit_time: '2024-06-10 18:30', - question_count: 12, - status: 1 // 已查看 - }, - { - id: 4, - title: '小区健身设施需求调研', - village_name: '阳光花园小区', - type: '需求调研', - user_name: '赵六', - is_anonymous: false, - submit_time: '2024-06-08 11:20', - question_count: 10, - status: 1 // 已查看 - }, - { - id: 5, - title: '端午节活动满意度调查', - village_name: '翠湖庭院', - type: '满意度调查', - user_name: '匿名用户', - is_anonymous: true, - submit_time: '2024-06-05 16:40', - question_count: 6, - status: 0 // 未查看 - } + // { + // id: 1, + // title: '2024年度物业服务满意度调查', + // village_name: '阳光花园小区', + // type: '满意度调查', + // user_name: '张三', + // is_anonymous: false, + // submit_time: '2024-06-15 14:23', + // question_count: 15, + // status: 1 // 已查看 + // }, + // { + // id: 2, + // title: '小区环境改造意见征集', + // village_name: '翠湖庭院', + // type: '意见征集', + // user_name: '李四', + // is_anonymous: true, + // submit_time: '2024-06-12 09:45', + // question_count: 8, + // status: 0 // 未查看 + // }, + // { + // id: 3, + // title: '业主委员会换届选举投票', + // village_name: '金色家园', + // type: '投票选举', + // user_name: '王五', + // is_anonymous: false, + // submit_time: '2024-06-10 18:30', + // question_count: 12, + // status: 1 // 已查看 + // }, + // { + // id: 4, + // title: '小区健身设施需求调研', + // village_name: '阳光花园小区', + // type: '需求调研', + // user_name: '赵六', + // is_anonymous: false, + // submit_time: '2024-06-08 11:20', + // question_count: 10, + // status: 1 // 已查看 + // }, + // { + // id: 5, + // title: '端午节活动满意度调查', + // village_name: '翠湖庭院', + // type: '满意度调查', + // user_name: '匿名用户', + // is_anonymous: true, + // submit_time: '2024-06-05 16:40', + // question_count: 6, + // status: 0 // 未查看 + // } ]); // 状态颜色配置 @@ -406,7 +403,7 @@ // 生命周期钩子 onLoad(() => { checkRouteStack(); - loadQuestionnaireList(); + // loadQuestionnaireList(); }); // 下拉刷新 diff --git a/pagesB/setting/index.vue b/pagesB/setting/index.vue index e00ae4a..fc7070c 100644 --- a/pagesB/setting/index.vue +++ b/pagesB/setting/index.vue @@ -1,9 +1,7 @@ - \ No newline at end of file diff --git a/unocss/a-hua-unocss/index.scss b/unocss/a-hua-unocss/index.scss index 8a9d76f..f7951fd 100644 --- a/unocss/a-hua-unocss/index.scss +++ b/unocss/a-hua-unocss/index.scss @@ -1,32 +1,234 @@ -.li-mt-25{margin-top:25rpx} - -.li-pt-6{padding-top:6rpx} -.li-px-15{padding-left:15rpx;padding-right:15rpx} - +.li-bg-white{background-color:rgb(255,255,255)} +.li-flex{display:flex} +.li-flex-col{flex-direction:column} +.li-font-550{font-weight:550} +.li-h-130{height:130rpx} +.li-h-68{height:68rpx} +.li-items-center{align-items:center} +.li-justify-between{justify-content:space-between} +.li-justify-center{justify-content:center} +.li-mt-100{margin-top:100rpx} +.li-mt-28{margin-top:28rpx} +.li-mt-32{margin-top:32rpx} +.li-mt-90{margin-top:90rpx} +.li-mx-10{margin-left:10rpx;margin-right:10rpx} +.li-mx-auto{margin-left:auto;margin-right:auto} +.li-pt-270{padding-top:270rpx} +.li-rd-40{border-radius:40rpx} +.li-text-000000-color{color:rgb(0,0,0)} +.li-text-24{font-size:24rpx} +.li-text-2EA1EA-color{color:rgb(46,161,234)} +.li-text-38{font-size:38rpx} +.li-text-a5a5a5-color{color:rgb(165,165,165)} +.li-w-130{width:130rpx} +.li-w-150{width:150rpx} +.li-w-420{width:420rpx} +.li-w-full-80{width:80%} +.li-w-full-85{width:85%} +.li-w-full-90{width:90%} +.items-center{align-items:center} +.justify-end{justify-content:end} +.justify-center{justify-content:center} +.justify-between{justify-content:space-between} +.li-flex-center{display:flex;align-items:center;justify-content:center} +.li-h-160{height:160rpx} +.li-h-58{height:58rpx} +.li-justify-around{justify-content:space-around} +.li-ml-22{margin-left:22rpx} +.li-ml-25{margin-left:25rpx} +.li-ml-35{margin-left:35rpx} +.li-mr-5{margin-right:5rpx} +.li-mt-10{margin-top:10rpx} +.li-mt-12{margin-top:12rpx} +.li-mt-14{margin-top:14rpx} +.li-mt-15{margin-top:15rpx} +.li-mt-20{margin-top:20rpx} +.li-mt-30{margin-top:30rpx} +.li-px-25{padding-left:25rpx;padding-right:25rpx} +.li-px-30{padding-left:30rpx;padding-right:30rpx} +.li-px-40{padding-left:40rpx;padding-right:40rpx} +.li-py-25{padding-top:25rpx;padding-bottom:25rpx} +.li-rd-10{border-radius:10rpx} +.li-rd-15{border-radius:15rpx} +.li-text-010B3E-color{color:rgb(1,11,62)} +.li-text-22{font-size:22rpx} +.li-text-26{font-size:26rpx} +.li-text-28{font-size:28rpx} +.li-text-30{font-size:30rpx} +.li-text-343333-color{color:rgb(52,51,51)} +.li-text-AFB2B8-color{color:rgb(175,178,184)} +.li-text-B1B0B0-color{color:rgb(177,176,176)} +.li-w-310{width:310rpx} +.li-w-58{width:58rpx} +.li-w-full-70{width:70%} +.li-w-full-88{width:88%} +.li-h-100{height:100rpx} +.li-ml-20{margin-left:20rpx} +.li-ml-200{margin-left:200rpx} +.li-ml-30{margin-left:30rpx} +.li-mr-10{margin-right:10rpx} +.li-mr-30{margin-right:30rpx} +.li-mt-300-important{margin-top:300rpx !important} +.li-pt-2{padding-top:2rpx} +.li-py-20{padding-top:20rpx;padding-bottom:20rpx} +.li-rd-full-50{border-radius:50%} +.li-text-25{font-size:25rpx} +.li-text-35{font-size:35rpx} +.li-text-42{font-size:42rpx} +.li-text-46{font-size:46rpx} +.li-w-100{width:100rpx} .bg-0070F0{background-color:rgb(0,112,240)} -.li-my-10{margin-top:10rpx;margin-bottom:10rpx} -.li-p-20{padding:20rpx} -.li-px-20{padding-left:20rpx;padding-right:20rpx} -.li-py-10{padding-top:10rpx;padding-bottom:10rpx} -.li-py-60{padding-top:60rpx;padding-bottom:60rpx} -.li-rd-8{border-radius:8rpx} -.li-text-dddddd-color{color:rgb(221,221,221)} -.li-text-ff9900-color{color:rgb(255,153,0)} - +.bg-f9f9f9{background-color:rgb(249,249,249)} +.bg-FFFFFF{background-color:rgb(255,255,255)} +.border-4-white{border-style:solid;border-color:rgb(255,255,255);border-width:4rpx} +.li-font-bold{font-weight:bold} +.li-h-240{height:240rpx} +.li-h-250{height:250rpx} +.li-h-50{height:50rpx} +.li-h-60{height:60rpx} +.li-items-end{align-items:end} +.li-justify-start{justify-content:start} +.li-mb-2{margin-bottom:2rpx} +.li-ml-4{margin-left:4rpx} +.li-ml-50{margin-left:50rpx} +.li-mr-20{margin-right:20rpx} +.li-mr-50{margin-right:50rpx} +.li-mt-26{margin-top:26rpx} +.li-mt-60{margin-top:60rpx} +.li-mx-20{margin-left:20rpx;margin-right:20rpx} +.li-mx-40{margin-left:40rpx;margin-right:40rpx} +.li-pb-10{padding-bottom:10rpx} +.li-pb-14{padding-bottom:14rpx} +.li-pb-20{padding-bottom:20rpx} +.li-pt-20{padding-top:20rpx} +.li-pt-8{padding-top:8rpx} +.li-rd-20{border-radius:20rpx} +.li-rd-tl-30-important{border-top-left-radius:30rpx !important} +.li-rd-tr-30-important{border-top-right-radius:30rpx !important} +.li-text-19171B-color{color:rgb(25,23,27)} +.li-text-20{font-size:20rpx} +.li-text-32{font-size:32rpx} +.li-text-706e70-color{color:rgb(112,110,112)} +.li-text-B2B2B2-color{color:rgb(178,178,178)} +.li-text-BBBDDA-color{color:rgb(187,189,218)} +.li-text-F2F7FD-color{color:rgb(242,247,253)} +.li-text-F8C883-color{color:rgb(248,200,131)} +.li-text-FFFFFF-color{color:rgb(255,255,255)} +.li-text-b1bbc7-color{color:rgb(177,187,199)} +.li-w-240{width:240rpx} +.li-w-50{width:50rpx} +.li-w-60{width:60rpx} +.li-w-full-94{width:94%} +.li-h-110{height:110rpx} +.li-items-start{align-items:start} +.li-mb-12{margin-bottom:12rpx} +.li-mb-20{margin-bottom:20rpx} +.li-mb-8{margin-bottom:8rpx} +.li-ml-15{margin-left:15rpx} +.li-mr-12{margin-right:12rpx} +.li-mr-3{margin-right:3rpx} +.li-mr-6{margin-right:6rpx} +.li-mt-40{margin-top:40rpx} +.li-pb-25{padding-bottom:25rpx} +.li-pb-30{padding-bottom:30rpx} +.li-pl-20{padding-left:20rpx} +.li-pl-30{padding-left:30rpx} +.li-pr-30{padding-right:30rpx} +.li-pt-30{padding-top:30rpx} +.li-py-6{padding-top:6rpx;padding-bottom:6rpx} +.li-text-009aff-color{color:rgb(0,154,255)} +.li-text-40{font-size:40rpx} +.li-text-55{font-size:55rpx} +.li-text-5f5f5f-color{color:rgb(95,95,95)} +.li-text-666-color{color:rgb(102,102,102)} +.li-text-70{font-size:70rpx} +.li-text-9a9a9a-color{color:rgb(154,154,154)} +.li-text-right{text-align:right} +.li-w-110{width:110rpx} +.li-w-400{width:400rpx} +.li-w-full-92{width:92%} +.overflow-hidden{overflow:hidden} +.li-ml-6{margin-left:6rpx} +.li-p-15{padding:15rpx} +.li-pb-15{padding-bottom:15rpx} +.li-pt-25{padding-top:25rpx} +.li-pt-4{padding-top:4rpx} +.li-text-333333-color{color:rgb(51,51,51)} +.li-text-36{font-size:36rpx} +.li-text-ff0000-color{color:rgb(255,0,0)} +.li-w-full-100{width:100%} +.li-font-400{font-weight:400} +.li-m-30{margin:30rpx} +.li-text-595959-color{color:rgb(89,89,89)} +.li-mb-25{margin-bottom:25rpx} +.li-mb-30{margin-bottom:30rpx} +.li-ml-10{margin-left:10rpx} +.li-mr-200{margin-right:200rpx} +.li-mr-4{margin-right:4rpx} +.li-mt-100-important{margin-top:100rpx !important} +.li-mt-4{margin-top:4rpx} +.li-mt-50{margin-top:50rpx} +.li-mt-8{margin-top:8rpx} +.li-py-40{padding-top:40rpx;padding-bottom:40rpx} +.li-text-0070F0-color{color:rgb(0,112,240)} +.li-text-333-color{color:rgb(51,51,51)} +.li-text-34{font-size:34rpx} +.li-text-44{font-size:44rpx} +.li-text-48{font-size:48rpx} +.li-text-90{font-size:90rpx} +.li-text-999-color{color:rgb(153,153,153)} +.li-text-center{text-align:center} +.li-text-white{color:rgb(255,255,255)} +.li-w-500{width:500rpx} +.li-mr-25{margin-right:25rpx} +.li-h-90{height:90rpx} +.li-text-47{font-size:47rpx} +.li-w-90{width:90rpx} +.li-border-b{border-style:solid;border-color:b;border-width:1rpx} +.li-mb-10{margin-bottom:10rpx} +.li-mb-15{margin-bottom:15rpx} +.li-my-20{margin-top:20rpx;margin-bottom:20rpx} +.li-p-30{padding:30rpx} +.li-py-30{padding-top:30rpx;padding-bottom:30rpx} +.li-text-ff6b35-color{color:rgb(255,107,53)} +.li-block{display:block} +.li-items-baseline{align-items:baseline} +.li-mr-15{margin-right:15rpx} +.li-mt-5{margin-top:5rpx} +.li-opacity-100{undefined:1} +.li-rd-12{border-radius:12rpx} +.li-rd-16{border-radius:16rpx} +.li-text-0a4696-color{color:rgb(10,70,150)} +.li-flex-1{flex:1} +.li-flex-wrap{flex-wrap:wrap} +.li-line-clamp-2{overflow:hidden;display:-webkit-box;line-clamp:2;-webkit-box-orient:vertical;-webkit-line-clamp:2} +.li-text-999999-color{color:rgb(153,153,153)} +.li-w-160{width:160rpx} +.li-w-full-96{width:96%} +.li-mt-25{margin-top:25rpx} +.li-mt-200{margin-top:200rpx} +.li-pt-6{padding-top:6rpx} +.li-mr-180{margin-right:180rpx} .li-opacity-80{undefined:0.8} .li-pb-40{padding-bottom:40rpx} +.li-px-20{padding-left:20rpx;padding-right:20rpx} +.li-py-10{padding-top:10rpx;padding-bottom:10rpx} .li-py-100{padding-top:100rpx;padding-bottom:100rpx} -.li-py-15{padding-top:15rpx;padding-bottom:15rpx} +.li-py-60{padding-top:60rpx;padding-bottom:60rpx} .li-rd-30{border-radius:30rpx} .li-text-100{font-size:100rpx} .li-text-3e9bff-color{color:rgb(62,155,255)} .li-text-50{font-size:50rpx} .li-text-52c41a-color{color:rgb(82,196,26)} -.li-text-60{font-size:60rpx} .li-text-ccc-color{color:rgb(204,204,204)} .li-text-ff4d4f-color{color:rgb(255,77,79)} +.li-my-10{margin-top:10rpx;margin-bottom:10rpx} +.li-p-20{padding:20rpx} +.li-rd-8{border-radius:8rpx} +.li-text-dddddd-color{color:rgb(221,221,221)} +.li-text-ff9900-color{color:rgb(255,153,0)} @@ -39,3 +241,51 @@ + + + +.li-ml-20{margin-left:20rpx} +.li-ml-30{margin-left:30rpx} +.li-mr-30{margin-right:30rpx} +.li-mt-300-important{margin-top:300rpx !important} +.li-pt-2{padding-top:2rpx} +.li-text-25{font-size:25rpx} +.li-text-35{font-size:35rpx} +.li-text-46{font-size:46rpx} + +.li-h-90{height:90rpx} +.li-mr-6{margin-right:6rpx} +.li-text-52{font-size:52rpx} +.li-w-90{width:90rpx} + +.li-flex-1{flex:1} +.li-flex-wrap{flex-wrap:wrap} +.li-items-start{align-items:start} +.li-line-clamp-2{overflow:hidden;display:-webkit-box;line-clamp:2;-webkit-box-orient:vertical;-webkit-line-clamp:2} +.li-mb-10{margin-bottom:10rpx} +.li-mb-15{margin-bottom:15rpx} +.li-mb-20{margin-bottom:20rpx} +.li-pb-15{padding-bottom:15rpx} +.li-pb-30{padding-bottom:30rpx} +.li-pl-30{padding-left:30rpx} +.li-text-0070F0-color{color:rgb(0,112,240)} +.li-text-333-color{color:rgb(51,51,51)} +.li-text-34{font-size:34rpx} +.li-text-999-color{color:rgb(153,153,153)} +.li-text-999999-color{color:rgb(153,153,153)} +.li-text-9a9a9a-color{color:rgb(154,154,154)} +.li-text-center{text-align:center} +.li-w-160{width:160rpx} +.li-w-full-92{width:92%} +.li-w-full-96{width:96%} + +.li-mb-30{margin-bottom:30rpx} +.li-mr-15{margin-right:15rpx} +.li-mt-200{margin-top:200rpx} +.li-p-30{padding:30rpx} +.li-pt-6{padding-top:6rpx} +.li-text-36{font-size:36rpx} +.li-text-40{font-size:40rpx} + +.li-mr-4{margin-right:4rpx} +.li-text-666-color{color:rgb(102,102,102)} diff --git a/utils/permission.js b/utils/permission.js new file mode 100644 index 0000000..19cedeb --- /dev/null +++ b/utils/permission.js @@ -0,0 +1,60 @@ +/** + * 权限管理工具 + * 用于处理应用中的权限控制逻辑 + */ +// 权限信息 F1.核销 F2.配送 F3.推广 F4.量房 F5.家政 F6.维修 +// 权限映射对象:将前端菜单/功能类型映射到权限代码 +export const permissionMap = { + // 功能权限映射 + 'verification': 'F1', // 商品核销 - F1.核销 + 'delivery': 'F2', // 配送 - F2.配送 + 'invite': 'F3', // 推广 - F3.推广 + 'measure': 'F4', // 量房 - F4.量房 + 'repair': 'F6', // 维修 - F6.维修 + + // 可以根据需要添加更多菜单与权限的映射关系 +} + +/** + * 判断当前用户是否拥有指定功能的权限 + * @param {String} featureType - 功能/菜单类型 + * @param {Array} userPermissions - 用户拥有的权限数组 + * @returns {Boolean} - 是否拥有权限 + */ +export function hasPermission(featureType, userPermissions) { + // 如果功能类型不在权限映射中,表示不需要权限控制,直接显示 + if (!permissionMap[featureType]) return true; + + // 如果没有权限数组或权限数组为空,则没有权限 + if (!userPermissions || userPermissions.length === 0) return false; + + // 检查权限数组中是否包含该功能所需的权限 + return userPermissions.includes(permissionMap[featureType]); +} + +/** + * 过滤菜单或功能列表,只返回用户有权限访问的项 + * @param {Array} menuList - 菜单或功能列表 + * @param {Array} userPermissions - 用户拥有的权限数组 + * @param {String} typeKey - 菜单项中表示功能类型的键名,默认为'type' + * @returns {Array} - 过滤后的菜单列表 + */ +export function filterByPermission(menuList, userPermissions, typeKey = 'type') { + if (!menuList || !Array.isArray(menuList)) return []; + + return menuList.filter(item => { + const featureType = item[typeKey]; + return hasPermission(featureType, userPermissions); + }); +} + +/** + * 根据权限代码获取对应的功能类型列表 + * @param {String} permissionCode - 权限代码 + * @returns {Array} - 拥有该权限的功能类型列表 + */ +export function getFeaturesByPermission(permissionCode) { + return Object.entries(permissionMap) + .filter(([_, code]) => code === permissionCode) + .map(([featureType]) => featureType); +} \ No newline at end of file