Browse Source

feat(权限控制): 增加设计师权限控制并优化相关功能

- 在 permissions.ts 中添加 features 计算属性,用于控制特定功能的显示
- 在 home、messages、mine 页面和 moment-item组件中使用 features 属性来控制功能显示
- 优化消息类型和子类型的处理,将其从字符串改为数字
- 修复未认证设计师访问特定功能时的路由跳转问题
EvilDragon 4 months ago
parent
commit
fd37d709b7

+ 4 - 1
packages/app/src/components/moment-item.vue

@@ -9,6 +9,7 @@ import { useRouter } from '../core/utils/router'
 import { likeActived, likeBlack } from '@designer-hub/assets/src/icons'
 import { NetImages } from '../core/libs/net-images'
 import { currRoute } from '../utils'
+import { usePermissions } from '../composables/permissions'
 
 const props = withDefaults(
   defineProps<{
@@ -41,6 +42,7 @@ const props = withDefaults(
 )
 const emits = defineEmits<{ delete: [id: number]; like: [options: any] }>()
 const router = useRouter()
+const { features } = usePermissions()
 const imgClass = ref('')
 const isVideo = ref(false)
 const toDetail = () => {
@@ -81,7 +83,8 @@ onMounted(async () => {
         <view
           class="overflow-hidden rounded-full mr-2"
           @click.stop="
-            currRoute().path !== '/pages/mine/homepage/index' &&
+            features.toDesignerHomePage &&
+              currRoute().path !== '/pages/mine/homepage/index' &&
               router.push(`/pages/mine/homepage/index?id=${options.stylistId}`)
           "
         >

+ 21 - 4
packages/app/src/composables/permissions.ts

@@ -10,9 +10,14 @@ export const usePermissions = () => {
       path: '/pages/material/mini-class/index',
       meta: { canNotLogin: false, toLogin: true },
     },
-    { path: '/pages/material/recommend/index', meta: { canNotLogin: false, toLogin: true } },
-    { path: '/pages/publish/moment/index', meta: { canNotLogin: false, toLogin: true } },
-    { path: '/pages/publish/moment/index', meta: { canNotLogin: false, toLogin: true } },
+    {
+      path: '/pages/material/recommend/index',
+      meta: { canNotLogin: false, canNotDesigner: false, toLogin: true },
+    },
+    {
+      path: '/pages/publish/moment/index',
+      meta: { canNotLogin: false, canNotDesigner: false, toLogin: true },
+    },
     { path: '/pages/messages/index', meta: { canNotLogin: false, toLogin: true } },
     { path: '/pages/mine/setting/index', meta: { canNotLogin: false, toLogin: true } },
     {
@@ -35,6 +40,18 @@ export const usePermissions = () => {
       path: '/pages/mine/agents/index',
       meta: { canNotLogin: false, toLogin: true },
     },
+    {
+      path: '/pages/mine/invite/index',
+      meta: { canNotLogin: false, canNotDesigner: false, toLogin: true },
+    },
   ]
-  return { isLogined, isDesigner, routes }
+  const features = computed(() => ({
+    /**
+     * 1分钟了解筑巢荟
+     */
+    about: isDesigner.value,
+    toDesignerHomePage: isDesigner.value,
+    checkInAtStoreTask: isDesigner.value,
+  }))
+  return { isLogined, isDesigner, routes, features }
 }

+ 2 - 2
packages/app/src/core/libs/models.ts

@@ -451,11 +451,11 @@ export interface Message {
   /**
    * 消息类型
    */
-  messageType: string
+  messageType: number
   /**
    * 消息子类型
    */
-  messageSubType: string
+  messageSubType: number
   /**
    * 发送会员等级(多个枚举值逗号拼接,选项值包括全部会员等级、普通会员等级、白银会员等级、黄金会员等级、白金会员等级)
    */

+ 4 - 1
packages/app/src/core/utils/router.ts

@@ -4,7 +4,7 @@ export const back = () => {
   uni.navigateBack()
 }
 export const useRouter = () => {
-  const { routes, isLogined } = usePermissions()
+  const { routes, isLogined, isDesigner } = usePermissions()
   const push = async (url: string, switchTab = false) => {
     const path = url.split('?')[0]
     const route = routes.find((it) => it.path === path)
@@ -17,6 +17,9 @@ export const useRouter = () => {
       }
       return false
     }
+    if (route && !route.meta.canNotDesigner && !isDesigner.value) {
+      return push('/pages/mine/authentication/index')
+    }
     if (switchTab) {
       uni.switchTab({ url })
     } else {

+ 2 - 2
packages/app/src/pages/home/index.vue

@@ -31,7 +31,7 @@ defineOptions({
 const instance = getCurrentInstance()
 const userStore = useUserStore()
 const { userInfo } = storeToRefs(userStore)
-const { isLogined, isDesigner } = usePermissions()
+const { isLogined, isDesigner, features } = usePermissions()
 const pageHelperRef = ref<ComponentExposed<typeof PageHelper>>()
 const { data: indexConfigsData, run: setIndexConfigsData } = useRequest(
   () => getSetIndexConfigs(),
@@ -131,7 +131,7 @@ onShareAppMessage(async ({ from, target }) => {
       <!-- <view class="my-6 mx-3.5">
         <HotActivity></HotActivity>
       </view> -->
-      <view v-if="isDesigner" class="my-6 mx-3.5" @click="toAbout()">
+      <view v-if="features.about" class="my-6 mx-3.5" @click="toAbout()">
         <Card>
           <div class="flex items-center gap-2">
             <wd-img width="28" height="28" :src="logo"></wd-img>

+ 5 - 5
packages/app/src/pages/messages/index.vue

@@ -70,7 +70,7 @@ const handleSubmit = async (message: Message) => {
       ref="pageHelperRef"
       :automatic="false"
       :request="getMessages"
-      :query="{ messageType: tabs[tab]?.value.toString() }"
+      :query="{ messageType: tabs[tab]?.value }"
       class="flex-grow flex flex-col"
     >
       <template #default="{ source }">
@@ -108,7 +108,7 @@ const handleSubmit = async (message: Message) => {
                     class="my-3 text-black/40 text-sm font-normal font-['PingFang_SC'] leading-[25px]"
                   >
                     <div
-                      v-if="it.messageType === MessageType.Integral.toString()"
+                      v-if="it.messageType === MessageType.Integral"
                       v-html="it.detailBody"
                     ></div>
                     <!-- {{ it.detailBody }} -->
@@ -125,7 +125,7 @@ const handleSubmit = async (message: Message) => {
                     <template
                       v-if="
                         [MessageType.Integral].includes(Number(it.messageType)) &&
-                        it.messageSubType === '31' &&
+                        it.messageSubType === 31 &&
                         it.isRead !== '1'
                       "
                     >
@@ -145,7 +145,7 @@ const handleSubmit = async (message: Message) => {
                     <template
                       v-else-if="
                         [MessageType.Integral].includes(Number(it.messageType)) &&
-                        it.messageSubType === '22'
+                        it.messageSubType === 22
                       "
                     >
                       如有问题请您联系官方客服!
@@ -162,7 +162,7 @@ const handleSubmit = async (message: Message) => {
                   class="row-start-6 col-start-1 col-end-4 my-1"
                   v-if="
                     [MessageType.Integral].includes(Number(it.messageType)) &&
-                    it.messageSubType === '31' &&
+                    it.messageSubType === 31 &&
                     it.isRead !== '1'
                   "
                 >

+ 17 - 5
packages/app/src/pages/mine/index.vue

@@ -24,10 +24,12 @@ import { useRouter } from '../../core/utils/router'
 import { NetImages } from '../../core/libs/net-images'
 import { qrCodeString2Object, requestToast, toQrCodeString } from '../../core/utils/common'
 import { QrCodeBusinessType } from '../../core/libs/enums'
+import { usePermissions } from '@/composables/permissions'
 
 const router = useRouter()
 const userStore = useUserStore()
 const { isLogined, userInfo } = storeToRefs(userStore)
+const { features } = usePermissions()
 const { setUserInfo } = userStore
 const { data, run } = useRequest(getMemberUserInfo)
 const { data: taskData, run: getTaskData } = useRequest(() => getTasks({}), {
@@ -47,7 +49,10 @@ const { data: taskStatusData, run: setTaskStatus } = useRequest(
       {
         btnProps: {
           content: '去打卡',
-          onClick: () => uni.showToast({ title: '请到店扫码完成', icon: 'none' }),
+          onClick: () =>
+            features.value.checkInAtStoreTask
+              ? uni.showToast({ title: '请到店扫码完成', icon: 'none' })
+              : router.push(`/pages/mine/authentication/index`),
         },
       },
       {
@@ -152,8 +157,8 @@ const nickNameClickHandle = async () => {
   uni.navigateTo({ url: '/pages/login/index' })
 }
 const handleToAuthentication = () => {
-  if (!isLogined.value) return
-  uni.navigateTo({ url: '/pages/mine/authentication/index' })
+  if (!isLogined.value) return router.push('/pages/login/index')
+  router.push('/pages/mine/authentication/index')
 }
 const handleToHomepage = () => {
   uni.navigateTo({ url: '/pages/mine/homepage/index' })
@@ -170,6 +175,7 @@ const handleClickScan = async () => {
   // console.log(qrCodeString2Object(toQrCodeString('到店', { a: 1, orderId: 2222 })))
   const { type, options } = qrCodeString2Object(result)
   if (type === QrCodeBusinessType.InStoreClockIn) {
+    if (!features.value.checkInAtStoreTask) return router.push('/pages/mine/authentication/index')
     try {
       await storeAndPunchIn({ id: options.id })
       router.push(`/pages/mine/scan/result/index?result=${result}`)
@@ -282,8 +288,9 @@ onPageScroll(({ scrollTop }: { scrollTop: number }) => {
 
         <div class="flex items-center">
           <div class="text-white text-base font-normal font-['PingFang_SC'] leading-normal mr-1">
-            0
+            <!-- 0 -->
             <!-- {{designerInfo.c}} -->
+            {{ designerInfo?.winCustomerCount || 0 }}
           </div>
           <div
             class="text-center text-[#e9e7e4] text-xs font-normal font-['PingFang_SC'] leading-normal"
@@ -325,11 +332,16 @@ onPageScroll(({ scrollTop }: { scrollTop: number }) => {
             @click="handleToAuthentication()"
           >
             <div
-              class="text-[#9e5934] text-[13px] font-normal font-['PingFang_SC'] leading-relaxed"
+              class="text-[#9e5934] text-[13px] font-normal font-['PingFang_SC'] leading-relaxed flex items-center gap-1"
             >
               <!-- 去认证 -->
               <!-- {{ !isCertified ? '去认证' : certificationStatusText }} -->
               {{ certificationBtnText }}
+              <div
+                class="w-3.5 h-3.5 bg-gradient-to-tl from-[#773b19] to-[#9e5a34] rounded-full flex items-center justify-center"
+              >
+                <wd-icon name="play" size="12" color="#ffead2"></wd-icon>
+              </div>
             </div>
           </div>
         </div>