Bladeren bron

feat: 添加游客二维码

bill 2 jaren geleden
bovenliggende
commit
061f4a934f

+ 1 - 1
index.html

@@ -4,7 +4,7 @@
     <meta charset="UTF-8" />
     <link rel="icon" type="image/svg+xml" href="//4dkk.4dage.com/FDKKIMG/icon/kankan_icon.ico" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <title>四维全景VR</title>
+    <title>四维带看</title>
   </head>
   <body>
     <div id="app"></div>

+ 2 - 1
src/api/constant.ts

@@ -16,5 +16,6 @@ export const GET_ROOM_LIST = '/takelook/roomList'
 export const GET_ROOM = '/takelook/roomInfo'
 export const SET_ROOM = '/takelook/roomAddOrUpdate'
 export const DEL_ROOM = '/takelook/roomDelete'
-export const GET_ROOM_MINI_CODE = '/takelook/roomGetHostCode'
+export const GET_ROOM_LEADER_MINI_CODE = '/takelook/roomGetHostCode'
+export const GET_ROOM_MINI_CODE = '/takelook/roomGetShareCode'
 // /takelook/roomGetHostCode

+ 8 - 1
src/api/room.ts

@@ -2,7 +2,8 @@ import {
   GET_ROOM_LIST,
   GET_ROOM_MINI_CODE,
   DEL_ROOM,
-  SET_ROOM
+  SET_ROOM,
+  GET_ROOM_LEADER_MINI_CODE
 } from './constant'
 import axios from './instance'
 import type { PageResult, Scene } from './'
@@ -90,3 +91,9 @@ export const updateRoom = async (room: Room, numList: Scene['num'][]) => {
 export const fetchRoomMiniCode = async (room: Room) => {
   return axios.get<string>(GET_ROOM_MINI_CODE, { params: { roomId: room.id } })
 }
+
+export const fetchLeaderRoomMiniCode = async (room: Room) => {
+  return axios.get<string>(GET_ROOM_LEADER_MINI_CODE, {
+    params: { roomId: room.id }
+  })
+}

BIN
src/assets/images/logo.png


+ 5 - 1
src/layout/header.vue

@@ -1,7 +1,7 @@
 <template>
   <a-layout-header class="header-layout">
     <div class="content-layout">
-      <h2>四维看看</h2>
+      <h2><img :src="logoPng" /></h2>
 
       <a-dropdown placement="bottomRight">
         <template #overlay>
@@ -31,6 +31,7 @@
 import { MenuProps } from 'ant-design-vue'
 import { useUserStore } from '@/store'
 import { gotoLogin } from '@/api'
+import logoPng from '@/assets/images/logo.png'
 
 defineOptions({ name: 'LayoutHeader' })
 
@@ -53,6 +54,9 @@ const handlerMenuClick: MenuProps['onClick'] = e => {
 
   h2 {
     margin: 0;
+    img {
+      width: 130px;
+    }
   }
 }
 

+ 10 - 1
src/store/room.ts

@@ -4,6 +4,7 @@ import { useUserStore } from './user'
 import {
   fetchRomms,
   fetchRoomMiniCode,
+  fetchLeaderRoomMiniCode,
   insertRoom,
   updateRoom,
   deleteRoom,
@@ -14,7 +15,11 @@ import { Room as SRoom, Scenes } from '@/api'
 
 export type { RoomScene } from '@/api'
 export type Rooms = Room[]
-export type Room = SRoom & { miniCode?: string; scenes: Scenes }
+export type Room = SRoom & {
+  miniCode?: string
+  leaderMiniCode?: string
+  scenes: Scenes
+}
 
 export const createRoom = (room: Partial<Room>): Room => {
   const user = useUserStore().current
@@ -77,6 +82,10 @@ export const useRoomStore = defineStore('room', {
     async setRoomMiniCode(room: Room) {
       const code = room.miniCode || (await fetchRoomMiniCode(room))
       room.miniCode = code
+    },
+    async setLeaderRoomMiniCode(room: Room) {
+      const code = room.leaderMiniCode || (await fetchLeaderRoomMiniCode(room))
+      room.leaderMiniCode = code
     }
   }
 })

+ 2 - 2
src/views/room/edit-room/index.vue

@@ -32,7 +32,7 @@
       <div class="scene">
         <iframe
           v-if="current.scenes.length"
-          :src="`https://test.4dkankan.com/spg.html?m=${current.scenes[0].num}`"
+          :src="`https://test.4dkankan.com/smg.html?m=${current.scenes[0].num}&mobile=1`"
           frameborder="0"
         />
         <img v-else :src="unScenePng" />
@@ -150,7 +150,7 @@ export default defineComponent({
   align-items: center;
 
   iframe {
-    width: 100%;
+    width: 320px;
     height: 100%;
   }
 

+ 1 - 0
src/views/room/edit-room/scene-list.vue

@@ -58,6 +58,7 @@ const selectScenes = () => {
 
   renderModal(SceneList, {
     selectNums: existsNums,
+    maxSelect: 7,
     onSave(selectNums) {
       const { added, deleted } = diffArrayChange(
         sceneStore.getScenesByNums(selectNums),

+ 12 - 4
src/views/room/list.vue

@@ -33,7 +33,7 @@
             @web-sync="webSyncRoom(item)"
             @delete="deleteRoom(item)"
             @share="miniSyncRoom(item)"
-            @mini-sync="miniSyncRoom(item)"
+            @mini-sync="miniSyncRoom(item, 'leader')"
             @edit="editRoom(item)"
           />
           <a-card v-else class="add-room" hoverable @click="editRoom()">
@@ -112,10 +112,18 @@ const shareRoom = async (room: Room) => {
     }
   })
 }
-const miniSyncRoom = async (room: Room) => {
-  await roomStore.setRoomMiniCode(room)
+const miniSyncRoom = async (room: Room, key?: 'leader') => {
+  let miniCode: string
+  if (key === 'leader') {
+    await roomStore.setLeaderRoomMiniCode(room)
+    miniCode = room.leaderMiniCode!
+  } else {
+    await roomStore.setRoomMiniCode(room)
+    miniCode = room.miniCode!
+  }
+
   Modal.info({
-    content: createVNode(MiniSync, { room }),
+    content: createVNode(MiniSync, { miniCode }),
     title: '小程序带看',
     width: '500px',
     icon: null,

+ 2 - 4
src/views/room/modal/mini-sync.vue

@@ -1,16 +1,14 @@
 <template>
   <div class="mini-code">
-    <img :src="room.miniCode" />
+    <img :src="miniCode" />
     <p>打开微信“扫一扫”</p>
     <p>进入微信小程序开始带看</p>
   </div>
 </template>
 
 <script lang="ts" setup>
-import { Room } from '@/store'
-
 defineOptions<{ name: 'MiniSync' }>()
-defineProps<{ room: Room }>()
+defineProps<{ miniCode: string }>()
 </script>
 
 <style lang="scss" scoped>

+ 1 - 1
src/views/room/modal/share.vue

@@ -8,7 +8,7 @@
       <a-input disabled :value="roomStore.getShareUrl(room)" />
     </a-form-item>
     <a-form-item label="作品葵花码">
-      <img :src="room.miniCode" class="mini-code" />
+      <img :src="room.leaderMiniCode" class="mini-code" />
     </a-form-item>
   </a-form>
 </template>

+ 18 - 1
src/views/scene/list.vue

@@ -23,8 +23,9 @@
               :data-source="filterScenes"
               :pagination="false"
               :row-selection="{
+                getCheckboxProps: getCheckboxProps,
                 selectedRowKeys: selectedSceneKeys,
-                onChange: keys => (selectedSceneKeys = keys as SceneKey[])
+                onChange: changRowKeys
               }"
             >
               <template #bodyCell="{ column, record }">
@@ -51,6 +52,7 @@ defineOptions<{ name: 'SceneList' }>()
 type SceneKey = Scene['num']
 
 const props = defineProps<{
+  maxSelect?: number
   selectNums: SceneKey[]
   onSave?: (selectIds: SceneKey[]) => void
   onCancel: () => void
@@ -82,7 +84,22 @@ const sceneColumns = [
     key: 'time'
   }
 ]
+
+const isOverflow = (keys: SceneKey[]) =>
+  props.maxSelect && keys.length >= props.maxSelect
+
 const selectedSceneKeys = ref<SceneKey[]>(props.selectNums)
+const keysOverflow = computed(() => isOverflow(selectedSceneKeys.value))
+const changRowKeys = (keys: any[]) => {
+  if (isOverflow(keys)) {
+    keys = keys.slice(0, props.maxSelect)
+  }
+  selectedSceneKeys.value = keys as SceneKey[]
+}
+const getCheckboxProps = (record: Scene) => ({
+  disabled: keysOverflow.value && !selectedSceneKeys.value.includes(record.num),
+  name: record.num
+})
 const saveHandler = () => {
   props.onSave && props.onSave(selectedSceneKeys.value)
   visible.value = false