bill 3 年之前
父节点
当前提交
f343070f77

+ 1 - 0
package.json

@@ -19,6 +19,7 @@
     "copy-webpack-plugin": "^5.0.5",
     "date-fns": "^2.28.0",
     "history": "^4.10.1",
+    "js-base64": "^3.7.2",
     "ol": "4.3.3",
     "react": "^16.12.0",
     "react-app-rewired": "^2.1.5",

+ 1 - 1
public/index.html

@@ -28,7 +28,7 @@
     <link rel="stylesheet" href="%PUBLIC_URL%/font/css/commit.css">
     <script src="%PUBLIC_URL%/static/Cesium/Cesium.js"></script>
     <script src="%PUBLIC_URL%/static/js/ol.js"></script>
-    <title>文件管理系统</title>
+    <title>数据融合平台</title>
   </head>
   <body>
     <noscript>You need to enable JavaScript to run this app.</noscript>

+ 11 - 5
src/components/Upload/index.tsx

@@ -4,9 +4,11 @@ import List from '../List'
 import Item from './Item'
 import { UPREADY, UPSUCCESS, UPING, UPERR} from './constant'
 import http from '../../http'
+import { useRouteMatch } from 'react-router-dom'
 
 
-async function uploadFile({ url, file, body, cb, check }: { url: string, file: Array<File> | File, body: any, cb: Function, check?: string}) {
+async function uploadFile({ url,sid, file, body, cb, check }: { sid: string, url: string, file: Array<File> | File, body: any, cb: Function, check?: string}) {
+  
   let form = new FormData()
 
   if (file instanceof Array) {
@@ -15,6 +17,7 @@ async function uploadFile({ url, file, body, cb, check }: { url: string, file: A
     form.append('file', file)
   }
 
+  form.append('sceneId', sid)
   Object.keys(body).forEach((k: string) => {
     form.append(k, body[k])
   })
@@ -22,8 +25,8 @@ async function uploadFile({ url, file, body, cb, check }: { url: string, file: A
   try {
     if (check) {
       let res = await http.get(check)
-      if (res.data.status !== 200) {
-        alert(res.data.message)
+      if (res.data.code !== 0) {
+        alert(res.data.msg)
         return cb(0, true)
       }
     }
@@ -41,8 +44,8 @@ async function uploadFile({ url, file, body, cb, check }: { url: string, file: A
         'Content-Type': 'multipart/form-data'
       }
     })
-    if (res.data.status !== 200) {
-      alert(res.data.message)
+    if (res.data.code !== 0) {
+      alert(res.data.msg)
       cb(0, true)  
     } else {
       cb(100)
@@ -62,11 +65,14 @@ interface ItemCtrlProps extends UFile {
 }
 
 function ItemCtrl(props: ItemCtrlProps) : ReactElement {
+  const match = useRouteMatch()
+  const sid = (match?.params as any).sid
   const [status, setStatus] = useState(UPREADY)
   const [percentage, setPercentage] = useState(status === UPREADY ? 0 : 100)
   if (status === UPREADY) {
     setStatus(UPING)
     uploadFile({
+      sid,
       file: props.multiple ? props.file : props.file[0],
       url: props.api,
       body: props.body,

+ 9 - 8
src/http.ts

@@ -5,24 +5,25 @@ const replaceLogin = () => history.replace('/login')
 let token = sessionStorage.getItem('token')
 token || replaceLogin()
 
+export const baseURL = process.env.NODE_ENV === 'development' ? '/api' : '/api'
 
-axios.defaults.baseURL = '/api/'
+axios.defaults.baseURL = baseURL
 axios.interceptors.request.use(request => {
-  if (request.url === '/login' || request.url === '/logout') {
-    request.baseURL = process.env.NODE_ENV === 'development' ? '/test': ''
-  }
+  // if (request.url === '/login' || request.url === '/logout') {
+  //   request.baseURL = process.env.NODE_ENV === 'development' ? '/test': ''
+  // }
 
-  if (!token && request.url !== '/login') {
+  if (!token && request.url !== '/admin/login') {
     replaceLogin()
-    return Promise.reject('1')
+    return Promise.reject('未登录无法请求')
   }
 
-  request.headers.Authorization = token
+  request.headers.token = token
   return request
 })
 
 axios.interceptors.response.use(response => {
-  if (response.data.code === 401 || response.data.status === 5001) {
+  if (response.data.code === 401 || response.data.status === 5001 || response.data.code === 5001) {
     sessionStorage.removeItem('token')
     token = null;
     replaceLogin()

+ 1 - 1
src/layout/Header.tsx

@@ -13,7 +13,7 @@ const style = {
 function Header(props: Props) {
   return (
     <div style={style.title} className={props.className}>
-      <h1>GIS数据管理</h1>
+      <h1>数据融合平台</h1>
     </div>
   )
 }

+ 7 - 7
src/page/List/GeoList.tsx

@@ -18,13 +18,13 @@ export default function GeoList({ className }: any) {
 
   intervals.forEach(interval => clearInterval(interval))
   const { referData, Element, models, referItem, modelDispatch } = GrentReducer({
-    delUrl: '/vector/delete/',
-    getUrl: '/vector/list/',
+    delUrl: '/cesium/vector/remove/',
+    getUrl: '/cesium/vector/list',
     zipUrl: '/vector/unzip/',
-    sectionUrl: '/vector/command/slice/',
-    transferUrl: '/vector/move/',
-    transformUrl: '/vector/command/geojson/',
-    judgeUrl: '/vector/command/judge/coord/',
+    sectionUrl: '/cesium/vector/slice/',
+    transferUrl: '/cesium/vector/publish',
+    transformUrl: '/cesium/vector/toGeoJson/',
+    judgeUrl: '/cesium/vector/coordJudge/',
     ItemFn (model: Model) {
       if (model.status === 6) {
         return <Step step={model.sectStep ? model.sectStep : 0} />
@@ -101,7 +101,7 @@ export default function GeoList({ className }: any) {
         <div className={styles.inputitem}>
           填写目录:<input value={dir} placeholder="输入对应目录" onChange={ev => setDir(ev.target.value)} />
         </div>
-        {dir && <Upload api={'/vector/uploadMult/' + dir + '/'} body={{ coord }} upHandle={referData} multiple className={styles.inputitem} filter={uploadFilter} />}
+        {dir && <Upload api={'/cesium/vector/upload/'} body={{ coord }} upHandle={referData} multiple className={styles.inputitem} filter={uploadFilter} />}
         
       </div>
       {Element}

+ 12 - 11
src/page/List/GrentOper.tsx

@@ -41,8 +41,8 @@ export default function Grent({ setItemStaus, modelDispatch, referData, delHandl
     model = setItemStaus(model, JUDGEING)
     let data = await judgeItemAction(modelDispatch, sid, api.judge + model.id + '/', model)
 
-    if (data.status !== 200) {
-      alert(data.message)
+    if (data.code !== 0) {
+      alert(data.msg)
       setItemStaus(model, JUGEERR)
     } else {
       setItemStaus(model, JUGESUCCESS)
@@ -52,8 +52,8 @@ export default function Grent({ setItemStaus, modelDispatch, referData, delHandl
   const zipHandle = async (model: Model) => {
     model = setItemStaus(model, ZIPING)
     let data = await zipItemAction(modelDispatch, sid, api.zip + model.id + '/', model)
-    if (data.status !== 200) {
-      alert(data.message)
+    if (data.code !== 0) {
+      alert(data.msg)
       setItemStaus(model, ZIPEERR)
     } else {
       setItemStaus(model, ZIPSUCCESS)
@@ -66,9 +66,9 @@ export default function Grent({ setItemStaus, modelDispatch, referData, delHandl
     model = setItemStaus(model, SECTIONING)
     sectionItemAction(modelDispatch, sid, api.section + model.id + '/' + param, model)
       .then(data => {
-        if (data.status !== 200) {
+        if (data.code !== 0) {
           model = setItemStaus(model, SECTIONEERR)
-          alert(data.message)
+          alert(data.msg)
         } else {
           model = setItemStaus(model, SECTIONSUCCESS)
           referData()
@@ -80,9 +80,9 @@ export default function Grent({ setItemStaus, modelDispatch, referData, delHandl
     model = setItemStaus(model, TRANING)
     sectionItemAction(modelDispatch, sid, api.transform + model.id + '/', model)
       .then(data => {
-        if (data.status !== 200) {
+        if (data.code !== 0) {
           model = setItemStaus(model, TRANEERR)
-          alert(data.message)
+          alert(data.msg)
         } else {
           model = setItemStaus(model, TRANSUCCESS)
           referData()
@@ -92,11 +92,12 @@ export default function Grent({ setItemStaus, modelDispatch, referData, delHandl
 
   const transfer = async (model: Model) => {
     model = setItemStaus(model, TRANSFERING)
-    transferItemAction(modelDispatch, sid, api.transfer + model.id + '/', model, { text: text, role: identity })
+    transferItemAction(modelDispatch, sid, api.transfer , model, { id: model.id, text: text, role: identity })
       .then(data => {
-        if (data.status !== 200) {
+        console.log('===>', data)
+        if (data.code !== 0) {
           model = setItemStaus(model, TRANSFEREERR)
-          alert(data.message)
+          alert(data.msg)
         } else {
           model = setItemStaus(model, TRANSFERSUCCESS)
           referData()

+ 4 - 4
src/page/List/ListState/action.ts

@@ -53,8 +53,8 @@ function getStateLocal(item: any) {
 
 export const getListAction = async (dispatch: Function, sid: string, url: string, current: number) => {
   console.log(sid)
-  let res = await http.post(url, { "pageNum": current - 1, "pageSize": 10})
-  let list = res.data?.data?.content || []
+  let res = await http.post(url, { "pageNum": current, sceneId: sid, "pageSize": 10})
+  let list = res.data?.data?.records || []
 
   list = list.map((item: any) => ({
     ...item,
@@ -75,8 +75,8 @@ export const getListAction = async (dispatch: Function, sid: string, url: string
   dispatch({
     type: CHANGE_PAGING,
     plyload: {
-      total: res.data.data.totalPages,
-      number: res.data.data.totalElements,
+      total: res.data.data.pages,
+      number: res.data.data.total,
       current: current
     }
   })

+ 12 - 6
src/page/List/ModelList.tsx

@@ -2,15 +2,19 @@ import React from 'react'
 import GrentReducer from './grent'
 import Upload from '../../components/Upload'
 import styles from './index.module.css'
+import { useRouteMatch } from 'react-router-dom'
 
 
 export default function ModelList({ className }: any) {
+  const match = useRouteMatch()
+  const sid = (match?.params as any).sid
+  
   const { referData, Element, models } = GrentReducer({
-    delUrl: '/fdModel/delete/',
-    getUrl: '/fdModel/list/',
-    zipUrl: '/fdModel/unzip/',
-    sectionUrl: '/fdModel/command/osgb/',
-    transferUrl: '/fdModel/move/'
+    delUrl: '/cesium/model/remove/',
+    getUrl: '/cesium/model/list',
+    zipUrl: '/cesium/model/unzip/',
+    sectionUrl: '/cesium/model/slice/',
+    transferUrl: '/cesium/model/publish'
   })
 
   for (let i = 0; i < models.length; i++) {
@@ -23,7 +27,9 @@ export default function ModelList({ className }: any) {
   return (
     <div className={className}>
       <div className={styles.uplayer} >
-        <Upload api='/fdModel/upload' check='/fdModel/check/' upHandle={referData} className={styles.inputitem} />
+        <Upload api='/cesium/model/upload' 
+          // check='/fdModel/check/' 
+          body={{sceneId: sid}} upHandle={referData} className={styles.inputitem} />
       </div>
       {Element}
     </div>

+ 8 - 6
src/page/List/ResterList.tsx

@@ -15,11 +15,11 @@ export default function ModelList({ className }: any) {
   
   intervals.forEach(interval => clearInterval(interval))
   const { referData, Element, modelDispatch, models, referItem } = GrentReducer({
-    judgeUrl: '/raster/command/judge/coord/',
-    delUrl: '/raster/delete/',
-    getUrl: '/raster/list',
-    sectionUrl: '/raster/command/osgeo/',
-    transferUrl: '/raster/move/',
+    judgeUrl: '/cesium/raster/coordJudge/',
+    delUrl: '/cesium/raster/remove/',
+    getUrl: '/cesium/raster/list',
+    sectionUrl: '/cesium/raster/slice/',
+    transferUrl: '/cesium/raster/publish/',
     ItemFn(model: Model) {
       if (model.status === 6) {
         return <Step step={model.sectStep ? model.sectStep : 0} />
@@ -65,7 +65,9 @@ export default function ModelList({ className }: any) {
     <div className={className}>
       <div className={styles.uplayer + ' ' + styles.inuplayer} >
         <Coor coor={coorstr} onChange={(val: string) => setCoor(val)} />
-        <Upload api='/raster/upload' body={{ coord }} check='/raster/check/' upHandle={referData} className={styles.inputitem} />
+        <Upload api='/cesium/raster/upload' body={{ coord }} 
+          // check='/raster/check/'
+           upHandle={referData} className={styles.inputitem} />
       </div>
       {Element}
     </div>

+ 5 - 5
src/page/List/Terrain.tsx

@@ -6,10 +6,10 @@ import styles from './index.module.css'
 
 export default function TerrainList({ className }: any) {
   const { referData, Element, models } = GrentReducer({
-    delUrl: '/dem/delete/',
-    getUrl: '/dem/list/',
-    sectionUrl: '/dem/command/slice/',
-    transferUrl: '/dem/move/',
+    delUrl: '/cesium/dem/remove/',
+    getUrl: '/cesium/dem/list',
+    sectionUrl: '/cesium/dem/slice/',
+    transferUrl: '/cesium/dem/publish',
   })
 
   for (let i = 0; i < models.length; i++) {
@@ -22,7 +22,7 @@ export default function TerrainList({ className }: any) {
   return (
     <div className={className}>
       <div className={styles.uplayer} >
-        <Upload api='/dem/upload' multiple upHandle={referData} className={styles.inputitem} />
+        <Upload api='/cesium/dem/upload' multiple upHandle={referData} className={styles.inputitem} />
       </div>
       {Element}
     </div>

+ 15 - 4
src/page/Login/index.tsx

@@ -3,20 +3,31 @@ import style from './style.module.css'
 import http from '../../http'
 import {setToken} from '../../http'
 import {history} from '../../router.config'
+import { encodeStr } from "../../util/pass"
+import { Base64 } from "js-base64"
 
 function Login() {
   let [user, setUser] = useState('');
   let [psw, setPsw] = useState('');
 
   const submission = async () => {
-    let {status, data, message} = (await http({ method: 'post', url: '/login', params: {username: user, password: psw} })).data
+    console.log('?????', encodeStr(Base64.encode(psw)))
+    const { data: {code, data, msg} } = await http({ 
+      method: 'POST',
+      url: '/admin/login', 
+      data: {
+        username: user, 
+        password: encodeStr(Base64.encode(psw))
+      }
+    })
+    
     // let {status, data, message} = (await http.post('/login', {params: {username: user, password: psw}})).data
-    if (status === 200) {
-      sessionStorage.setItem('userName', data.name)
+    if (code === 0) {
+      sessionStorage.setItem('userName', data.user.realName)
       setToken(data.token)
       history.replace('/scene')
     } else {
-      alert(message)
+      alert(msg)
     }
   }
 

+ 11 - 7
src/page/StyleEdit/reducer.ts

@@ -92,16 +92,20 @@ export const updateLayerAction: ActionFun = (dispatch, layer, value) => dispatch
 export const delLayerAction: ActionFun = (dispatch, layer) => dispatch({ type: DELLAYER, plyload: { layer } })
 
 export const getLayersAction = async (dispatch: Dispatch, sid: string, id: number) => {
-  let res = await http.get('/vector/style/get/' + id + '/')
+  let res = await http.get('/cesium/vector/style/get/' + id + '/')
   let data = res.data.data
   if (!data) return;
 
-  let layer = data.content ? JSON.parse(data.content) : JSON.parse(data.layer)
+  let layer = {
+    ...JSON.parse(data.style || '{}'),
+    ...data
+  }
+
   let style = {
     ...defaultLayerStyle(),
     ...layer,
-    lat: Number(data.latitude),
-    lng: Number(data.longitude),
+    lat: Number(data.lat),
+    lng: Number(data.lng),
     url: layer.url,
     getUrl: path.join(PREV, layer.url, '/{z}/{x}/{y}.pbf')
   }
@@ -111,11 +115,11 @@ export const getLayersAction = async (dispatch: Dispatch, sid: string, id: numbe
 
 export const saveLayersAction = async (style: Item, sid: string, id: number) => {
   try {
-    let res = await http.post('/vector/style/save/', {
-      outputFileId: id,
+    let res = await http.post('/cesium/vector/style/save/', {
+      id: id,
       content: JSON.stringify(style)
     })
-    return res.data.status === 200
+    return res.data.code === 0
   } catch {
     return false
   }

+ 26 - 4
src/page/scene/component.tsx

@@ -7,6 +7,7 @@ import {
   useState,
   useEffect
 } from 'react'
+import axios, { baseURL } from '../../http'
 import React from 'react'
 import { SceneType } from '../../store/scene'
 import { Button, Form, Input, Space, Upload, UploadFile, Select, message } from 'antd'
@@ -18,7 +19,7 @@ const { Option } = Select
 export const usePostFromArgs = (onSubmitRaw: (post: EditableScene) => void | any, post?: EditableScene) => {
   const initCover = post?.cover || null
   const initTitle = post?.title || ''
-  const initType = Number.isInteger(post?.type) ? post.type : SceneType.GIS
+  const initType = post?.type ? post.type : SceneType.GIS
   const initM = post?.m || ''
 
   const titleState = useState(initTitle)
@@ -76,6 +77,19 @@ type FromScene = {
 }
 type SceneFromProps<T extends FromScene> = T & { onSubmit: () => void }
 
+const uploadHandler = async (file: File): Promise<string> => {
+  console.log('-->', file)
+  const from = new FormData()
+  from.append('file', file)
+  const res = await axios({
+    method: 'POST',
+    url: '/cms/scene/upload',
+    headers: { 'Content-Type': 'multipart/form-data' },
+    data: from
+  })
+  return baseURL + res.data.data.filePath
+}
+
 export const PostFrom = <T extends FromScene>({onSubmit, ...article }: SceneFromProps<T>) => {
   const [title, setTitle] = article.title
   const [cover, setCover] = article.cover
@@ -103,11 +117,14 @@ export const PostFrom = <T extends FromScene>({onSubmit, ...article }: SceneFrom
   const onTitleChanged = (e: ChangeEvent<HTMLInputElement>) => setTitle(e.target.value)
   const onMChanged = (e: ChangeEvent<HTMLInputElement>) => setM(e.target.value)
   const handleChange = (info: {fileList: UploadFile[]}) => {
-    info.fileList[0].status === 'done' &&
-      setCover(info.fileList[0].response.url)
     setFileList(info.fileList)
+
+    if (info.fileList.length && info.fileList[0].status === 'done') {
+      setCover(info.fileList[0].response.url)
+    }
   }
 
+
   const typeOptions = [
     { value: SceneType.GIS, label: 'gis' },
     { value: SceneType.KANKAN, label: '四维看看' },
@@ -123,6 +140,11 @@ export const PostFrom = <T extends FromScene>({onSubmit, ...article }: SceneFrom
         <Input value={m} onChange={onMChanged} />
       </Form.Item>
     )
+
+  const uploadAction = (file: File) => {
+    uploadHandler(file).then(setCover)
+    return null
+  }
   return (
     <Form
       labelCol={{ span: 8 }}
@@ -140,7 +162,7 @@ export const PostFrom = <T extends FromScene>({onSubmit, ...article }: SceneFrom
       <Form.Item label="封面图">
         <Space direction="vertical" style={{ width: '100%' }} size="large">
           <Upload
-            action="https://www.mocky.io/v2/5cc8019d300000980a055e76"
+            action={uploadAction}
             listType="picture"
             fileList={fileList}
             onChange={handleChange}

+ 1 - 0
src/page/scene/edit-scene.tsx

@@ -6,6 +6,7 @@ import { Modal } from 'antd'
 
 
 export const EditScene = ({onClose, ...scene}: {onClose: () => void} & Scene) => {
+  console.log(scene)
   const dispatch = useDispatch()
   const postFromArgs = usePostFromArgs(async nscene => {
     const action = updateScene({

+ 10 - 3
src/page/scene/list.tsx

@@ -1,7 +1,7 @@
 import { Row, Empty, Button } from 'antd'
-import React, { useState } from 'react'
-import { useSelector } from '../../store'
-import { scenesSelector } from '../../store/scene'
+import React, { useState, useEffect } from 'react'
+import { useDispatch, useSelector } from '../../store'
+import { scenesSelector, fetchScenes } from '../../store/scene'
 import { AddScene } from './add-scene'
 import { SignScene } from './sign-scene'
 import style from './style.module.css'
@@ -10,6 +10,12 @@ import style from './style.module.css'
 export const SceneList = () => {
   const [adding, setAdding] = useState(false)
   const scenes = useSelector(scenesSelector)
+  const dispatch = useDispatch()
+
+  useEffect(() => {
+    dispatch(fetchScenes())
+  }, [dispatch])
+  
   const renderScenes = scenes.map(scene => <SignScene {...scene} key={scene.id} />)
   const renderLayer = scenes.length
     ? <Row gutter={16}>{renderScenes}</Row>
@@ -22,6 +28,7 @@ export const SceneList = () => {
         <Button type="primary" onClick={() => setAdding(true)}>创建场景</Button>
       </div>
 
+
   return (
     <>
       { renderHeader }

+ 1 - 1
src/page/scene/sign-scene.tsx

@@ -33,7 +33,7 @@ const useSceneLinks = (scene: Scene) => {
   switch (scene.type) {
     case SceneType.GIS:
       return {
-        gotoScene: goto(`http://map.4dage.com/3dmap?sid=${scene.id}`),
+        gotoScene: goto(`http://data3d.4dage.com?sid=${scene.id}`),
         editScene: () => history.push(`/${scene.id}/grid`)
       }
     case SceneType.LASER:

+ 2 - 2
src/setupProxy.js

@@ -4,7 +4,7 @@ module.exports = app => {
   app.use(
     proxy('/api', {
       // target: 'http://192.168.0.10:8082',
-      target: 'http://47.112.166.173:8082',
+      target: 'http://data3d.4dage.com/',
       changeOrigin: true,
       pathRewrite: {
         "^/api": "/api"
@@ -15,7 +15,7 @@ module.exports = app => {
   app.use(
     proxy('/test', {
       // target: 'http://192.168.0.10:8082',
-      target: 'http://47.112.166.173:8082',
+      target: 'http://data3d.4dage.com/',
       changeOrigin: true,
       pathRewrite: {
         "^/test": "/"

+ 43 - 52
src/store/scene.ts

@@ -1,16 +1,15 @@
 import { 
   createSlice,
   PayloadAction,
-  createAsyncThunk,
-  nanoid
+  createAsyncThunk
 } from '@reduxjs/toolkit'
 import { StoreState } from '.'
 import axios from '../http'
 
 export const enum SceneType {
-  KANKAN,
-  LASER,
-  GIS
+  KANKAN = '4dkk',
+  LASER = 'laser',
+  GIS = 'gis'
 }
 
 export interface Scene {
@@ -25,58 +24,47 @@ export type EditableScene = Omit<Scene, 'id' | 'time'>
 
 export type Scenes = Scene[]
 
-export const addScene = createAsyncThunk('scenes/addScene', async (scene: EditableScene) => {
-  return {
-    id: nanoid(),
-    ...scene,
-    time: new Date().toISOString()
-  }
-  // const response = await axios.post('/scenes/addScene', scene)
-  // return response.data
+export const addScene = createAsyncThunk('scenes/addScene', async (scene: EditableScene, { dispatch }) => {
+  await axios.post('/cms/scene/save', {
+    name: scene.title,
+    sceneCode: scene.m,
+    thumb: scene.cover,
+    type: scene.type
+  })
+  dispatch(fetchScenes())
 })
 export const updateScene = createAsyncThunk('scenes/updateScene', async (scene: Scene) => {
-  console.log(scene)
-  return { ...scene }
-  // const response = await axios.post('/scenes/updateScene', scene)
-  // return response.data
+  await axios.post('/cms/scene/save', {
+    id: scene.id,
+    name: scene.title,
+    sceneCode: scene.m,
+    thumb: scene.cover,
+    type: scene.type
+  })
+  return scene
 })
 export const deleteScene = createAsyncThunk('scenes/delScene', async (sceneId: Scene['id']) => {
-  await axios.post('/scenes/updateScene', sceneId)
+  await axios.get(`/cms/scene/remove/${sceneId}`)
   return sceneId
 })
+export const fetchScenes = createAsyncThunk('scenes/fetchScene', async () => {
+  const res = await axios.post('/cms/scene/list', null, { 
+    params: { pageNum: 1, pageSize: 100000 },
+    headers: { 'Content-type': 'application/json' },
+    data: {}
+  })
+  return res.data.data.records.map(item => ({
+    id: item.id,
+    title: item.name,
+    cover: item.thumb,
+    time: item.createTime,
+    type: item.type,
+    m: item.sceneCode
+  })) as Scene[]
+})
 
-const initialValue: Scenes = [
-  {
-    id: '1',
-    title: '长江街',
-    type: SceneType.GIS,
-    cover: 'https://4dkk.4dage.com/scene_edit_data/t-9ZwSJ5D/user/thumb-1k.jpg?v=0&rnd=0.555535123990389&x-oss-process=image/resize,m_fill,w_80,h_60/quality,q_70&rnd=0.2542055708659596',
-    time: new Date().toISOString()
-  },
-  {
-    id: '2',
-    title: '长江街',
-    type: SceneType.GIS,
-    cover: 'https://4dkk.4dage.com/scene_edit_data/t-9ZwSJ5D/user/thumb-1k.jpg?v=0&rnd=0.555535123990389&x-oss-process=image/resize,m_fill,w_80,h_60/quality,q_70&rnd=0.2542055708659596',
-    time: new Date().toISOString()
-  },
-  {
-    id: '3',
-    title: '看看-长江街',
-    type: SceneType.KANKAN,
-    m: 'KK-fKpK9EJbRU',
-    cover: 'https://4dkk.4dage.com/scene_edit_data/t-9ZwSJ5D/user/thumb-1k.jpg?v=0&rnd=0.555535123990389&x-oss-process=image/resize,m_fill,w_80,h_60/quality,q_70&rnd=0.2542055708659596',
-    time: new Date().toISOString()
-  },
-  {
-    id: '4',
-    title: '激光-长江街',
-    type: SceneType.LASER,
-    m: '3o5II3n9Rs',
-    cover: 'https://4dkk.4dage.com/scene_edit_data/t-9ZwSJ5D/user/thumb-1k.jpg?v=0&rnd=0.555535123990389&x-oss-process=image/resize,m_fill,w_80,h_60/quality,q_70&rnd=0.2542055708659596',
-    time: new Date().toISOString()
-  },
-]
+
+const initialValue: Scenes = []
 
 const sceneSlice = createSlice({
   initialState: {
@@ -87,9 +75,12 @@ const sceneSlice = createSlice({
   },
   extraReducers(builder) {
     builder
-      .addCase(addScene.fulfilled, (state, action: PayloadAction<Scene>) => {
-        state.value.push(action.payload)
+      .addCase(fetchScenes.fulfilled, (state, action: PayloadAction<Scene[]>) => {
+        state.value = action.payload
       })
+      // .addCase(addScene.fulfilled, (state, action: PayloadAction<Scene>) => {
+      //   state.value.push(action.payload)
+      // })
       .addCase(updateScene.fulfilled, (state, action: PayloadAction<Scene>) => {
         const updateScene = state.value.find(post => post.id === action.payload.id)
         Object.assign(updateScene, action.payload)

+ 106 - 0
src/util/pass.js

@@ -0,0 +1,106 @@
+/* eslint-disable */
+function NoToChinese (num) {
+  num = String(num)
+  var chnNumChar = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十']
+  if (num == 0) {
+    return chnNumChar[0]
+  }
+  let tmp = ''
+  for (let i = 0; i < num.length; i++) {
+    const ele = num.charAt(i)
+    tmp += chnNumChar[ele]
+  }
+
+  return tmp
+}
+
+function randomWord (randomFlag, min, max) {
+  let str = ''
+  let range = min
+  const arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
+  // 随机产生
+  if (randomFlag) {
+    range = Math.round(Math.random() * (max - min)) + min
+  }
+  for (var i = 0; i < range; i++) {
+    const pos = Math.round(Math.random() * (arr.length - 1))
+    str += arr[pos]
+  }
+  return str
+}
+
+module.exports = {
+  formatDate: function (time) {
+    var weekArr = ['日', '一', '二', '三', '四', '五', '六']
+    var date = new Date(time)
+    var year = date.getFullYear()
+    var month = date.getMonth() + 1
+    var day = date.getDate()
+    var week = '星期' + weekArr[date.getDay()]
+    if (window.innerWidth < 1700) {
+      return (
+        year +
+        '年' +
+        (String(month).length > 1 ? month : '0' + month) +
+        '月' +
+        (String(day).length > 1 ? day : '0' + day) +
+        '日' +
+        '<br/>' +
+        week
+      )
+    }
+    return (
+      year +
+      '年' +
+      (String(month).length > 1 ? month : '0' + month) +
+      '月' +
+      (String(day).length > 1 ? day : '0' + day) +
+      '日' +
+      ' ' +
+      week
+    )
+  },
+  smoothscrollpos: function (domName) {
+    if (domName == '/') {
+      return window.scrollTo(0, 0)
+    }
+    const smoothscroll = () => {
+      const dom = document.getElementById(domName)
+      // window.scrollTo({
+      //   top:dom.offsetTop - 100,
+      //   left:0,
+      //   behavior: "smooth"
+      // })
+      dom && window.scrollTo(0, dom.offsetTop - 120)
+    }
+    smoothscroll()
+  },
+
+  formatTime: function (time, fan = false) {
+    let t1 = time.split(' ')[0].split('-')
+    if (fan) {
+      t1 = t1.map((item) => {
+        const t = NoToChinese(item)
+        return t
+      })
+    }
+    return t1
+  },
+  encodeStr: function (str, strv = '') {
+    const NUM = 2
+    const front = randomWord(false, 8)
+    const middle = randomWord(false, 8)
+    const end = randomWord(false, 8)
+
+    const str1 = str.substring(0, NUM)
+    const str2 = str.substring(NUM)
+
+    if (strv) {
+      const strv1 = strv.substring(0, NUM)
+      const strv2 = strv.substring(NUM)
+      return [front + str2 + middle + str1 + end, front + strv2 + middle + strv1 + end]
+    }
+
+    return front + str2 + middle + str1 + end
+  }
+}

+ 5 - 0
yarn.lock

@@ -6666,6 +6666,11 @@ jest@24.9.0:
     import-local "^2.0.0"
     jest-cli "^24.9.0"
 
+js-base64@^3.7.2:
+  version "3.7.2"
+  resolved "https://registry.npmmirror.com/js-base64/-/js-base64-3.7.2.tgz#816d11d81a8aff241603d19ce5761e13e41d7745"
+  integrity sha512-NnRs6dsyqUXejqk/yv2aiXlAvOs56sLkX6nUdeaNezI5LFFLlsZjOThmwnrcwh5ZZRwZlCMnVAY3CvhIhoVEKQ==
+
 "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
   version "4.0.0"
   resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"