Jelajahi Sumber

fix: 对接服务端

bill 3 tahun lalu
induk
melakukan
fb17201ac1

+ 7 - 5
src/api/constant.ts

@@ -1,6 +1,8 @@
+import { params } from '@/env'
+
 export enum ResCode {
   TOKEN_INVALID = 4008,
-  SUCCESS = 0
+  SUCCESS = 200
 }
 
 export const ResCodeDesc: { [key in ResCode]: string } = {
@@ -14,10 +16,10 @@ export const UPLOAD_HEADS = {
 
 
 // 模型列表
-export const MODEL_LIST = ''
-export const INSERT_MODEL = ''
-export const UPDATE_MODEL = ''
-export const DELETE_MODEL = ''
+export const MODEL_LIST = `/laser/sceneFusion/${params.m}/list/${params.id}`
+export const INSERT_MODEL = `/laser/sceneFusion/${params.m}/uploadFile/${params.id}`
+export const UPDATE_MODEL = `/laser/sceneFusion/${params.m}/updateModel`
+export const DELETE_MODEL = `/laser/sceneFusion/${params.m}/del`
 
 // 标注列表
 export const TAGGING_LIST = ''

File diff ditekan karena terlalu besar
+ 2 - 2
src/api/guide.ts


+ 8 - 3
src/api/instance.ts

@@ -1,6 +1,6 @@
 import { axiosFactory } from './setup'
 import { Message } from 'bill/index'
-import { ResCodeDesc } from './constant'
+import { ResCodeDesc, MODEL_LIST, UPDATE_MODEL, INSERT_MODEL, DELETE_MODEL } from './constant'
 import { showLoad, hideLoad } from '@/utils'
 
 const instance = axiosFactory()
@@ -30,7 +30,7 @@ addResErrorHandler(
     if (response.status !== 200) {
       Message.error(response.statusText)
     } else if (data) {
-      const msg = data.code && ResCodeDesc[data.code] ? ResCodeDesc[data.code] : data?.message
+      const msg = data.code && ResCodeDesc[data.code] ? ResCodeDesc[data.code] : (data?.message || data?.msg)
       Message.error(msg)
     }
   }
@@ -38,7 +38,12 @@ addResErrorHandler(
 
 addHook({ before: showLoad, after: hideLoad })
 
-// addUnsetTokenURLS(LOGIN)
+addUnsetTokenURLS(
+  MODEL_LIST,
+  UPDATE_MODEL,
+  INSERT_MODEL,
+  DELETE_MODEL
+)
 setDefaultURI('/api')
 
 export default axios

+ 75 - 12
src/api/model.ts

@@ -3,12 +3,13 @@ import {
   MODEL_LIST,
   INSERT_MODEL,
   UPDATE_MODEL,
-  DELETE_MODEL
+  DELETE_MODEL,
+  UPLOAD_HEADS
 } from './constant'
 
 export enum ModelType {
-  SWKK,
-  SWKJ,
+  SWKK = 'swkk',
+  SWKJ = 'swkj',
   SWMX = 'glb',
   SWSS = 'laser',
 }
@@ -25,22 +26,76 @@ export interface ModelAttrs {
   scale: number,
   opacity: number,
   bottom: number,
-  position: { x: number, y: number, z: number },
-  rotation: { x: number, y: number, z: number }
+  position: SceneLocalPos,
+  rotation: SceneLocalPos
 }
 export interface Model extends ModelAttrs {
   id: string
   url: string
   title: string
+  fusionId?: number,
   type: ModelType
   size: number,
   time: string
 }
 
+interface ServiceModel {
+  createTime: string,
+  id: number,
+  hide: number,
+  modelDateType: string
+  modelGlbUrl: string
+  fusionId?: number,
+  modelSize: number
+  modelTitle: string
+  opacity: number
+  bottom: number
+  transform: {
+    position: SceneLocalPos, 
+    rotation: SceneLocalPos, 
+    scale: [number, number, number]
+  }
+}
+
+const serviceToLocal = (serviceModel: ServiceModel): Model => ({
+  show: !serviceModel.hide,
+  scale: serviceModel.transform.scale[0],
+  opacity: serviceModel.opacity,
+  bottom: serviceModel.bottom,
+  position: serviceModel.transform.position,
+  rotation: serviceModel.transform.rotation,
+  id: serviceModel.id.toString(),
+  url: serviceModel.modelGlbUrl,
+  title: serviceModel.modelTitle,
+  fusionId: serviceModel.fusionId,
+  type: ModelType.SWMX,
+  size: serviceModel.modelSize,
+  time: serviceModel.createTime
+})
+
+const localToService = (model: Model): ServiceModel => ({
+  createTime: model.time,
+  id: Number(model.id),
+  hide: Number(!model.show),
+  fusionId: model.fusionId,
+  modelDateType: model.type,
+  modelGlbUrl: model.url,
+  modelSize: model.size,
+  modelTitle: model.title,
+  opacity: model.opacity,
+  bottom: model.bottom,
+  transform: {
+    position: model.position, 
+    rotation: model.rotation, 
+    scale: [model.scale, model.scale, model.scale]
+  }
+})
+
 export type Models = Model[]
 
 export const fetchModels = async () => {
-  // axios.post<Models>(MODEL_LIST)
+  const serviceModels = await axios.post<ServiceModel[]>(MODEL_LIST)
+  return serviceModels.map(serviceToLocal)
   return [
     {
       id: '123',
@@ -49,10 +104,10 @@ export const fetchModels = async () => {
       title: 'SS-t-7DUfWAUZ3V',
       size: 1000,
       time: '2012-02-05',
-      scale: 1,
       rotation: { x: 1, y: 1, z: 1},
       position: { x: 1, y: 1, z: 1},
       opacity: 0.1,
+      scale: 1,
       bottom: 1,
       show: false
     },
@@ -73,14 +128,22 @@ export const fetchModels = async () => {
   ]
 } 
 
-export const postAddModel = (model: Model) => {
-  console.log('add')
-  return axios.post<Model>(INSERT_MODEL, model)
+export const postAddModel = async (file: File) => {
+  const form = new FormData()
+  form.append('file', file)
+
+  const serviceModel = await axios<ServiceModel>({
+    url: INSERT_MODEL,
+    method: 'POST',
+    headers: { ...UPLOAD_HEADS },
+    data: form
+  })
+  return serviceToLocal(serviceModel)
 }
 
 export const postUpdateModels = (model: Model) => {
-  console.log('update')
-  return axios.post<undefined>(UPDATE_MODEL, model)
+  console.log('update', model)
+  return axios.post<undefined>(UPDATE_MODEL, localToService(model))
 }
   
 

+ 1 - 1
src/api/setup.ts

@@ -5,7 +5,7 @@ import type { AxiosResponse, AxiosRequestConfig } from 'axios'
 
 export type ResErrorHandler = <D, T extends ResData<D>>(response: AxiosResponse<T>, data?: T) => void
 export type ReqErrorHandler = <T>(err: Error, response: AxiosRequestConfig<T>) => void
-export type ResData<T> = { code: ResCode, message: string, data: T }
+export type ResData<T> = { code: ResCode, message: string, data: T, msg: string }
 export type Hook = {
   before: (config: AxiosRequestConfig) => void
   after: (config: AxiosRequestConfig) => void

+ 8 - 1
src/env/index.ts

@@ -1,4 +1,4 @@
-import { stackFactory, flatStacksValue } from '@/utils'
+import { stackFactory, flatStacksValue, strToParams } from '@/utils'
 import { ref } from 'vue'
 
 import type { Model, TaggingPosition } from '@/store'
@@ -30,3 +30,10 @@ export const custom = flatStacksValue({
   showTaggingPositions: showTaggingPositionsStack
 })
 
+
+export const params = strToParams(location.search) as Params
+export type Params = { 
+  m: string,
+  id: string,
+  token?: string
+}

+ 15 - 2
src/layout/model-list/index.vue

@@ -7,7 +7,20 @@
       @change-select="item => modelChangeSelect(item.raw)"
     >
       <template #action>
-        <ui-icon type="add" ctrl/>
+        <ui-input
+          type="file"
+          width="20px"
+          placeholder="上传模型"
+          othPlaceholder="支持RAR,ZIP压缩包格式"
+          accept=".rar, .zip"
+          :disable="true"
+          :multiple="false"
+          @update:modelValue="addModel"
+        >
+          <template v-slot:replace>
+            <ui-icon type="add" ctrl/>
+          </template>
+      </ui-input>
       </template>
       <template #atom="{ item }">
         <ModelSign :model="item.raw" @delete="modelDelete(item.raw)" />
@@ -19,7 +32,7 @@
 <script lang="ts" setup>
 import { computed, watchEffect } from 'vue'
 import { LeftPano } from '@/layout'
-import { models, getModelShowVariable } from '@/store'
+import { models, getModelShowVariable, addModel } from '@/store'
 import { custom } from '@/env'
 import { getSceneModel } from '@/sdk'
 import List from '@/components/list/index.vue'

+ 11 - 7
src/store/model.ts

@@ -53,8 +53,17 @@ export const backupModels = () => {
   }))
 }
 
+const serviceToLocal = (model: SModel): Model => ({
+  ...model, 
+  loaded: false, 
+  progress: 0,
+})
+
 export const recoverModels = recoverStoreItems(models, getBackupModels)
-export const addModel = addStoreItem(models, postAddModel)
+export const addModel = async (file: File) => {
+  const model = await postAddModel(file)
+  models.value.push(serviceToLocal(model))
+}
 export const updateModel = updateStoreItem(models, postUpdateModels)
 export const deleteModel = deleteStoreItem(models, model => postDeleteModel(model.id))
 export const initialModels = fetchStoreItems(
@@ -68,17 +77,12 @@ export const initialModels = fetchStoreItems(
     showModelsMapStack.push(ref(showModelsMap))
     backupModels()
   }, 
-  smodels => smodels.map(model => ({ 
-    ...model, 
-    loaded: false, 
-    progress: 0,
-  })),
+  smodels => smodels.map(serviceToLocal),
 )
 export const saveModels = saveStoreItems(
   models,
   getBackupModels,
   {
-    add: addModel,
     update: updateModel,
     delete: deleteModel,
   }

+ 2 - 1
src/utils/index.ts

@@ -52,4 +52,5 @@ export * from "./route";
 export * from "./asyncBus";
 export * from './mount'
 export * from './watch'
-export * from './diff'
+export * from './diff'
+export * from './params'

+ 18 - 0
src/utils/params.ts

@@ -0,0 +1,18 @@
+
+// 字符串转params对象
+export const strToParams = (str: string) => {
+  if (str[0] === '?') {
+      str = str.substr(1)
+  }
+
+  const result: { [key: string]: string } = {}
+  const splitRG = /([^=&]+)(?:=([^&]*))?&?/
+
+  let rgRet
+  while ((rgRet = str.match(splitRG))) {
+    result[rgRet[1]] = rgRet[2] === undefined ? '' : rgRet[2]
+    str = str.substr(rgRet[0].length)
+  }
+
+  return result
+}

+ 15 - 9
src/utils/store-help.ts

@@ -136,9 +136,9 @@ export const saveStoreItems = <T extends {id: any}>(
   newItems: Ref<T[]>,
   getOldItem: () => T[],
   actions: {
-    add: ReturnType<typeof addStoreItem<T>>,
-    update: ReturnType<typeof updateStoreItem<T>>,
-    delete: ReturnType<typeof deleteStoreItem<T>>,
+    add?: ReturnType<typeof addStoreItem<T>>,
+    update?: ReturnType<typeof updateStoreItem<T>>,
+    delete?: ReturnType<typeof deleteStoreItem<T>>,
   }
 ) => () => {
   const oldItems = getOldItem()
@@ -150,14 +150,20 @@ export const saveStoreItems = <T extends {id: any}>(
 
   const promiseAll: Promise<any>[] = []
   
-  for (const delItem of deleted) {
-    promiseAll.push(actions.delete(delItem))
+  if (actions.delete) {
+    for (const delItem of deleted) {
+      promiseAll.push(actions.delete(delItem))
+    }
   }
-  for (const [newItem, oldItem] of updated) {
-    promiseAll.push(actions.update(newItem, oldItem))
+  if (actions.update) {
+    for (const [newItem, oldItem] of updated) {
+      promiseAll.push(actions.update(newItem, oldItem))
+    }
   }
-  for (const addItem of added) {
-    promiseAll.push(actions.add(addItem))
+  if (actions.add) {
+    for (const addItem of added) {
+      promiseAll.push(actions.add(addItem))
+    }
   }
   return Promise.all(promiseAll)
 }

+ 8 - 3
src/views/guide/edit-paths.vue

@@ -54,7 +54,7 @@
 </template>
 
 <script setup lang="ts">
-import { loadPack, togetherCallback, getFileUrl } from '@/utils'
+import { loadPack, togetherCallback, getFileUrl, asyncTimeout } from '@/utils'
 import { sdk, playSceneGuide, pauseSceneGuide, isScenePlayIng } from '@/sdk'
 import { createGuidePath, isTemploraryID, useAutoSetMode, guides, enterOld } from '@/store'
 import { Dialog } from 'bill/index'
@@ -133,11 +133,16 @@ const changeCurrent = (path: GuidePath) => {
   current.value = path
 }
 
-const play = () => {
+const play = async () => {
   if (isScenePlayIng.value) {
     pauseSceneGuide()
   } else {
-    playSceneGuide(toRaw(paths.value), (index) => current.value = paths.value[index])
+    changeCurrent(paths.value[0])
+    await asyncTimeout(400)
+    playSceneGuide(toRaw(paths.value), (index) => {
+      console.log('guide', index)
+      current.value = paths.value[index]
+    })
   }
 }
 

+ 12 - 0
vite.config.ts

@@ -19,5 +19,17 @@ export default defineConfig({
         replacement: resolve(__dirname, './src/components/bill-ui')
       }
     ]
+  },
+  server: {
+    host: '0.0.0.0',
+    port: 5173,
+    open: true,
+    proxy: {
+      '/api': {
+        target: 'http://192.168.0.152:8088/',
+        changeOrigin: true,
+        rewrite: path => path.replace(/^\/api/, '')
+      }
+    }
   }
 })