浏览代码

Merge branch 'xiaohb' into scene_conversion_ms

James 4 年之前
父节点
当前提交
b6f7739e23
共有 8 个文件被更改,包括 456 次插入129 次删除
  1. 11 1
      build/webpack.dev.conf.js
  2. 1 1
      index.html
  3. 9 0
      src/config/data.js
  4. 366 93
      src/pages/list/index.vue
  5. 24 24
      src/pages/login/index.vue
  6. 6 4
      src/router/index.js
  7. 6 6
      src/util/http.js
  8. 33 0
      src/util/index.js

+ 11 - 1
build/webpack.dev.conf.js

@@ -42,7 +42,17 @@ const devWebpackConfig = merge(baseWebpackConfig, {
     quiet: true, // necessary for FriendlyErrorsPlugin
     watchOptions: {
       poll: config.dev.poll,
-    }
+    },
+    proxy: {
+      '/api/sso/user/login': {
+        target: 'https://test.4dkankan.com',
+        changeOrigin: true,
+      },
+      '/manage/scene':{
+        target: 'http://192.168.0.135:8010',
+        changeOrigin: true,
+      }
+    },
   },
   plugins: [
     new webpack.DefinePlugin({

+ 1 - 1
index.html

@@ -4,7 +4,7 @@
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width,initial-scale=1.0">
     <link rel="icon" type="image/png" sizes="32x32" href="static/favicon.png" class="keep">
-    <title>场景列表</title>
+    <title>场景转换列表</title>
   </head>
   <body>
     <div id="app"></div>

+ 9 - 0
src/config/data.js

@@ -0,0 +1,9 @@
+export const MANAGE_SCENE_STATUS = {
+        0:'下载中',
+        1:'下载完成(mp数据转换中)',
+        2:'mp数据转换完成',
+        3:'模型数据转换中',
+        4:'模型数据转换完成',
+        5:'全景图数据转换中',
+        6:'全景图数据转换完成'
+}

+ 366 - 93
src/pages/list/index.vue

@@ -1,143 +1,416 @@
 <template>
   <div class="warpper">
-    <el-row type="flex" justify="space-between"  class="toolbar">
+    <el-row type="flex" justify="space-between" class="toolbar">
       <!--工具条-->
       <el-row type="flex">
         <el-form :inline="true">
           <el-form-item>
-            <el-input @keydown.enter.native='search' v-model="searchKey" placeholder="场景名称"></el-input>
+            <el-input
+              @keydown.enter.native="search"
+              v-model="searchKey"
+              placeholder="场景名称"
+            ></el-input>
           </el-form-item>
           <el-form-item>
             <el-button type="primary" v-on:click="search">查询</el-button>
           </el-form-item>
         </el-form>
-        <router-link :to="{name: 'add'}" class="button">添加场景</router-link>
-      </el-row >
+        <el-button type="primary" @click="downloadSceneData"
+          >下载MP场景数据</el-button
+        >
+      </el-row>
       <!-- 生成大场景someData -->
       <el-row type="flex" class="addScene">
-        <el-button type="warning" style="margin-right:20px;" @click="logout">登出</el-button>
-        <!-- <el-input placeholder="输入编码生成someData" v-model="url">
-          <template slot="append">
-            <a :href="'/getSomeData?url=https://my.matterportvr.cn/api/player/models/'+url+'/?format=json'" target="_block">生成</a>
-          </template>
-        </el-input> -->
+        <el-button type="primary" @click="handModelDownload(mutiTargetObj,'age')"
+          >下载四维看看场景数据</el-button
+        >
+        <el-button type="primary" @click="handModelDownload(mutiTargetObj,'bigScene')" >下载大场景数据</el-button>
+        <el-button type="warning" style="margin-right: 20px" @click="logout"
+          >登出</el-button
+        >
       </el-row>
     </el-row>
     <!-- 表格 -->
-    <el-table :data="scenes" style="width: 100%" >
-      <el-table-column prop="sceneCode"  width="200" label="场景">
+    <el-table
+      :data="scenes"
+      style="width: 100%"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="50"></el-table-column>
+      <el-table-column type="index" width="50" label="序号"></el-table-column>
+      <el-table-column prop="sceneTitle" width="200" label="场景名称">
+      </el-table-column>
+      <el-table-column prop="sceneCode" width="200" label="MP场景码">
+      </el-table-column>
+      <el-table-column label="状态" width="200">
+        <template slot-scope="scope">
+          <span>{{ manage_scene_status[scope.row.status] }}</span>
+        </template>
       </el-table-column>
-      <el-table-column prop="sceneTitle" label="名称">
+      <el-table-column
+        prop="description"
+        width="400"
+        label="备注"
+      ></el-table-column>
+      <el-table-column
+        prop="createTime"
+        width="200"
+        label="创建时间"
+      ></el-table-column>
+      <el-table-column
+        prop="updateTime"
+        width="200"
+        label="更新时间"
+      ></el-table-column>
+      <el-table-column fixed="right" label="操作" width="200">
+        <template slot-scope="scope">
+          <a :href="scope.row.webSite" target="_blank">查看</a>
+          <a @click="handModelDownload(scope.row, 'obj')">模型下载</a>
+          <a @click="handModelUpload(scope.row, 'obj')">模型上传</a>
+          <a @click="handModelDownload(scope.row, 'pano')">全景图下载</a>
+          <a @click="handModelUpload(scope.row, 'pano')">全景图上传</a>
+        </template>
       </el-table-column>
-       <el-table-column fixed="right" label="操作" width="200">
-      <template slot-scope="scope">
-        <a :href="scope.row.webSite" target="_blank">查看</a>
-        <a :href="`${$serverName}/editPage/edit.html?m=${scope.row.sceneCode}`" target="_blank">编辑</a>
-        <a @click="delScene(scope.row.id)" target="_blank">删除</a>
-      </template>
-    </el-table-column>
     </el-table>
 
     <div class="p-con">
-      <el-pagination @current-change="handleCurrentChange" :current-page.sync="currentPage" :page-size="size" layout="prev, pager, next, jumper" :total="total">
+      <el-pagination
+        @current-change="handleCurrentChange"
+        :current-page.sync="currentPage"
+        :page-size="size"
+        layout="prev, pager, next, jumper"
+        :total="total"
+      >
       </el-pagination>
     </div>
+    <!-- 场景码下载 -->
+    <el-dialog title="下载MP场景数据" :visible.sync="dialogFormVisible">
+      <el-form :model="form" ref="ruleForm" :rules="rules">
+        <el-form-item
+          label="场景码"
+          :label-width="formLabelWidth"
+          prop="sceneCode"
+        >
+          <el-input
+            type="sceneCode"
+            v-model="form.sceneCode"
+            autocomplete="off"
+            placeholder="请输入场景码"
+          ></el-input>
+        </el-form-item>
+        <br />
+        <el-form-item
+          label="场景名称"
+          :label-width="formLabelWidth"
+          prop="sceneTitle"
+        >
+          <el-input
+            type="sceneTitle"
+            v-model="form.sceneTitle"
+            autocomplete="off"
+            placeholder="请输入场景名称"
+          ></el-input>
+        </el-form-item>
+        <br />
+        <el-form-item label="备注" :label-width="formLabelWidth">
+          <el-input
+            type="textarea"
+            :rows="2"
+            placeholder="请输入备注"
+            v-model="form.description"
+          >
+          </el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogFormVisible = false">取 消</el-button>
+        <el-button type="primary" @click="sceneCodeSubmit('ruleForm')"
+          >确 定</el-button
+        >
+      </div>
+    </el-dialog>
+
+    <!-- 文件上传 -->
+    <el-dialog title="上传模型" :visible.sync="dialogFilesVisible">
+      <el-form ref="form1" label-width="100px" class="add-frome">
+        <el-form-item label="全景图文件">
+          <el-upload
+            class="upload-demo"
+            :action="uploadUrl"
+            ref="upload"
+            accept=".zip"
+            :on-change="handleChange"
+            :on-remove="handleRemove"
+            :on-success="onSuccess"
+            :on-error="onError"
+            :file-list="fileList"
+            :auto-upload="false"
+          >
+            <el-button slot="trigger" size="small" type="primary"
+              >选取文件</el-button
+            >
+            <div slot="tip" class="el-upload__tip">只能上传zip文件</div>
+          </el-upload>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogFilesVisible = false">取 消</el-button>
+        <el-button
+          type="primary"
+          v-loading.fullscreen.lock="fullscreenLoading"
+          @click="submitUpload"
+          >确 定</el-button
+        >
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { MANAGE_SCENE_STATUS } from "@/config/data";
 export default {
-  name: 'list',
-  data () {
+  name: "list",
+  data() {
     return {
-      searchKey: '',
+      searchKey: "",
       scenes: [],
-      url: '',
+      url: "",
       currentPage: 1,
       total: 0,
-      size: 15
-    }
+      size: 15,
+      fileList: [],
+      uploadUrl: "",
+      fullscreenLoading: false,
+      targetObj: null,
+      mutiTargetObj:[],
+      manage_scene_status: MANAGE_SCENE_STATUS,
+      dialogFormVisible: false,
+      dialogFilesVisible: false,
+      form: {
+        sceneCode: "",
+        sceneTitle: "",
+        description: "",
+      },
+      rules: {
+        sceneCode: [
+          { required: true, message: "场景码不能为空", trigger: "blur" },
+        ],
+        sceneTitle: [
+          { required: true, message: "场景名称不能为空", trigger: "blur" },
+        ],
+        description: [],
+      },
+      formLabelWidth: "120px",
+    };
   },
-  async created () {
-    this.getScenes()
+  async created() {
+    this.getScenes();
   },
   watch: {
-    currentPage () {
-      this.getScenes()
-    }
+    currentPage() {
+      this.getScenes();
+    },
   },
   methods: {
-    search () {
-      this.currentPage === 1 ? this.getScenes() : this.currentPage = 1
+    // 处理勾选
+    handleSelectionChange(val) {
+      console.log("val", val);
+      this.mutiTargetObj = val;
+    },
+    handleRemove(file) {
+      let index = this.fileList.findIndex((item) => {
+        return item.uid === file.uid;
+      });
+      this.fileList.splice(index, 1);
+    },
+    handleChange(file) {
+      this.fileList = this.fileList.length === 0 ? this.fileList : [];
+      this.fileList.push(file["raw"]);
+    },
+    onSuccess(res) {
+      this.$alert("上传成功", "提示", {
+        confirmButtonText: "确定",
+        callback: (action) => {
+          console.log("上传成功");
+          this.dialogFilesVisible = false;
+        },
+      });
+    },
+    onError(res) {
+      this.$alert("上传失败", "提示", {
+        confirmButtonText: "确定",
+        callback: (action) => {
+          console.log("上传失败");
+        },
+      });
+    },
+    async submitUpload() {
+      var that = this;
+      if (this.fileList.length === 0) {
+        this.$alert("请上传附件", "提示", {
+          confirmButtonText: "确定",
+          callback: (action) => {
+            console.log("上传失败");
+          },
+        });
+        return;
+      }
+      let formData = new FormData();
+      this.fileList.forEach((file) => {
+        formData.append("file", file);
+      });
+      this.fullscreenLoading = true;
+      let res = await this.$http.post(
+        `/manage/scene/upload/${this.targetObj.uploadType}/${this.targetObj.sceneCode}`,
+        formData,
+        {
+          "Content-Type": "multipart/form-data",
+        }
+      );
+      this.fullscreenLoading = false;
+      if (res["code"] === 0) {
+        that.onSuccess(res);
+      } else {
+        that.onError(res);
+      }
+    },
+    search() {
+      this.currentPage === 1 ? this.getScenes() : (this.currentPage = 1);
+    },
+    sceneCodeSubmit(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          this.sceneCodeSendHttp();
+        }
+      });
+    },
+    sceneCodeSendHttp() {
+      let { sceneCode, description } = this.form;
+      let body = {
+        description,
+        sceneCode,
+      };
+      this.$http.post("/manage/scene/download", body).then((res) => {
+        this.$message(res["msg"]);
+        if (res["code"] === 0) {
+          console.log("下载成功");
+          this.dialogFormVisible = false;
+        } else {
+        }
+      });
     },
-    handleSizeChange (val) {
-      console.log(`每页 ${val} 条`)
+    downloadSceneData() {
+      this.dialogFormVisible = true;
     },
-    handleCurrentChange (val) {
-      console.log(`当前页: ${val}`)
+    handleSizeChange(val) {
+      console.log(`每页 ${val} 条`);
     },
-    async getScenes () {
+    handleCurrentChange(val) {
+      console.log(`当前页: ${val}`);
+    },
+    async getScenes() {
       let params = {
         pageNum: this.currentPage,
         pageSize: this.size,
-        searchKey: this.searchKey
-      }
-      let res = (await this.$http.post('/manage/scene/list', params))
-      this.scenes = res.data.list
-      this.total = res.data.total
-      this.currentPage = res.data.pageNum
-    },
-    async delScene (name) {
-      if (confirm('删除后将无法恢复!你确定要删除这个场景吗?')) {
-        await this.$http.get(`/manage/scene/removes/${name}`)
-        this.getScenes()
-      }
+        searchKey: this.searchKey,
+      };
+      let res = await this.$http.post("/manage/scene/list", params);
+      this.scenes = res.data.list;
+      this.total = res.data.total;
+      this.currentPage = res.data.pageNum;
     },
-    logout () {
-      this.$http({
-        method: 'get',
-        url: '/admin/logout',
-        headers: {
-          Authorization: window.localStorage.getItem('token')
+    //模型下载 全景下载 下载四维看看数据 下载大场景数据
+    async handModelDownload(item,type) {
+      console.log("item", item,'type',type);
+      if(!Array.isArray(item)){
+          this.fullscreenLoading = true;
+          try{
+              let res = await this.$http.get(`/manage/scene/download/${type}/${item.sceneCode}`,{ params: { code: item.sceneCode } });
+              this.fullscreenLoading = false;
+              if (res && res["code"] === 0) {
+                window.open(`http://${res["data"]}`);
+              } else {}
+          }
+          catch(e){
+            this.fullscreenLoading = false;
+            console.log('e',e)
+          }
+        
+      } 
+      else {
+        let target = item;
+        if(target.length === 0) {
+          this.$message('请勾选选项');
+          return;
         }
-      }).then(res => {
-        if (res.code === 5001 || res.code === 5002) return
-        if (res.code === 0) {
-          window.localStorage.setItem('dcj_token', '')
-          this.$token = ''
-          this.$alert('退出成功', '提示', {
-            confirmButtonText: '确定',
-            callback: action => {
-              window.localStorage.setItem('menu', '')
-              this.$router.push('/login')
-            }
+        target.forEach(item=>{
+          this.$http.get(`/manage/scene/download/${type}/${item.sceneCode}`,{ params: { code: item.sceneCode } }).then(res=>{
+            if (res && res["code"] === 0) {
+              window.open(`http://${res["data"]}`);
+            } else {}
           })
-        }
-      })
-    }
-
-  }
-}
+        })
+      }
+      
+    },
+    handModelUpload(item,type) {
+      this.dialogFilesVisible = true;
+      this.targetObj = {...item,uploadType:type};
+      this.fileList = [];
+    },
+    async delScene(name) {
+      if (confirm("删除后将无法恢复!你确定要删除这个场景吗?")) {
+        await this.$http.get(`/manage/scene/removes/${name}`);
+        this.getScenes();
+      }
+    },
+    logout() {
+      console.log("登出");
+      window.localStorage.setItem("cjt_token", "");
+      this.$router.push("/login");
+      // this.$http({
+      //   method: 'get',
+      //   url: '/admin/logout',
+      //   headers: {
+      //     Authorization: window.localStorage.getItem('token')
+      //   }
+      // }).then(res => {
+      //   if (res.code === 5001 || res.code === 5002) return
+      //   if (res.code === 0) {
+      //     window.localStorage.setItem('cjt_token', '')
+      //     this.$token = ''
+      //     this.$alert('退出成功', '提示', {
+      //       confirmButtonText: '确定',
+      //       callback: action => {
+      //         window.localStorage.setItem('menu', '')
+      //         this.$router.push('/login')
+      //       }
+      //     })
+      //   }
+      // })
+    },
+  },
+};
 </script>
 
 <style scoped>
-  .warpper{
-    border: 1px solid #dfe6ec;
-    max-width: 1680px;
-    margin: 0 auto;
-  }
-  .toolbar{
-    background: #f2f2f2;
-    padding:  10px ;
-  }
-  .el-form-item{
-    margin-bottom: 0;
-  }
-  .addScene{
-    width: 80px;
-  }
-  .p-con{
-    text-align: center;
-    padding: 20px 0;
-  }
+.warpper {
+  border: 1px solid #dfe6ec;
+  max-width: 1680px;
+  margin: 0 auto;
+}
+.toolbar {
+  background: #f2f2f2;
+  padding: 10px;
+}
+.el-form-item {
+  margin-bottom: 0;
+}
+.addScene {
+  width: 450px;
+}
+.p-con {
+  text-align: center;
+  padding: 20px 0;
+}
 </style>

+ 24 - 24
src/pages/login/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="l-con">
     <div class="l-top">
-      <h1>场景列表登录</h1>
+      <h1>场景转换列表登录</h1>
     </div>
     <div class="l_center">
       <vcenter>
@@ -24,11 +24,11 @@
               label-width="100px"
               class="demo-ruleForm"
             >
-              <el-form-item prop="username">
+              <el-form-item prop="phoneNum">
                 <el-input
-                  type="username"
-                  placeholder="账号"
-                  v-model="ruleForm2.username"
+                  type="phoneNum"
+                  placeholder="手机号码"
+                  v-model="ruleForm2.phoneNum"
                   auto-complete="off"
                 ></el-input>
               </el-form-item>
@@ -65,6 +65,8 @@
 
 <script>
 import vcenter from '@/components/vcenter'
+import {encodeStr} from '@/util'
+import { Base64 } from 'js-base64'
 export default {
   name: 'login',
   components: {
@@ -73,9 +75,9 @@ export default {
   data () {
     var validateUser = (rule, value, callback) => {
       if (!value) {
-        return callback(new Error('用户名不能为空'))
+        return callback(new Error('手机号码不能为空'))
       } else if (value.length < 3) {
-        callback(new Error('用户名不合法'))
+        callback(new Error('手机号码不合法'))
       } else {
         callback()
       }
@@ -95,11 +97,11 @@ export default {
       fullscreenLoading: false,
       checked: true,
       ruleForm2: {
-        username: '',
+        phoneNum: '',
         pass: ''
       },
       rules2: {
-        username: [
+        phoneNum: [
           {
             validator: validateUser,
             trigger: 'blur'
@@ -116,34 +118,32 @@ export default {
   },
 
   mounted () {
-    this.ruleForm2.username = window.localStorage.getItem('dcj_username') || ''
-    this.ruleForm2.pass = window.localStorage.getItem('dcj_pass') || ''
+    this.ruleForm2.phoneNum = window.localStorage.getItem('cjt_phoneNum') || ''
+    this.ruleForm2.pass = window.localStorage.getItem('cjt_pass') || ''
   },
   methods: {
     async login () {
-      let {username, pass} = this.ruleForm2
+      let {phoneNum, pass} = this.ruleForm2
       this.fullscreenLoading = true
-
-      let res = await this.$http.post('/admin/login', {
-        username,
-        password: pass
+      let res = await this.$http.post('/api/sso/user/login', {
+        phoneNum,
+        password: encodeStr(Base64.encode(pass)),
       })
       this.fullscreenLoading = false
-
       if (res.code === 0) {
         let data = res.data
-        window.localStorage.setItem('dcj_token', data.token)
+        window.localStorage.setItem('cjt_token', data.token)
         if (this.checked) {
           window.localStorage.setItem(
-            'dcj_username',
-            username
+            'cjt_phoneNum',
+            phoneNum
           )
-          window.localStorage.setItem('dcj_pass', pass)
+          window.localStorage.setItem('cjt_pass', pass)
         } else {
-          window.localStorage.setItem('dcj_username', '')
-          window.localStorage.setItem('dcj_pass', '')
+          window.localStorage.setItem('cjt_phoneNum', '')
+          window.localStorage.setItem('cjt_pass', '')
         }
-        this.$router.push('/')
+        this.$router.push('/list')
       } else {
         this.$notify.error({
           title: '错误',

+ 6 - 4
src/router/index.js

@@ -9,10 +9,12 @@ Vue.use(Router)
 let router = new Router({
   routes: [
     {
-      path: '/',
+      path: '/list',
       name: 'List',
       component: List
-    }, {
+    }, 
+
+    {
       path: '/add',
       name: 'add',
       component: Add
@@ -26,10 +28,10 @@ let router = new Router({
 
 router.beforeEach((to, from, next) => {
   next()
-  let token = window.localStorage.getItem('dcj_token')
+  let token = window.localStorage.getItem('cjt_token')
   if (token) {
     if (to.path === '/login') {
-      next({ path: '/' })
+      next({ path: '/list' })
     } else {
       next()
     }

+ 6 - 6
src/util/http.js

@@ -3,7 +3,7 @@ import Vue from 'vue'
 import router from '../router'
 
 var isProduction = process.env.NODE_ENV === 'production'
-const serverName = isProduction ? '' : 'http://47.107.252.54:8105'
+const serverName = isProduction ? '' : ''
 // const serverName = isProduction ? '' : 'http://192.168.0.135:8105'
 
 const vue = new Vue()
@@ -17,7 +17,7 @@ axios.interceptors.request.use(
     if (config.method === 'post') {
       config.data.rnd = Math.random()
     }
-    config.headers['token'] = window.localStorage.getItem('dcj_token')
+    config.headers['token'] = window.localStorage.getItem('cjt_token')
 
     return config
   }, function (error) {
@@ -43,8 +43,8 @@ axios.interceptors.response.use(
         })
         break
       case 5001:
-        if (window.localStorage.getItem('dcj_token')) {
-          window.localStorage.setItem('dcj_token', '')
+        if (window.localStorage.getItem('cjt_token')) {
+          window.localStorage.setItem('cjt_token', '')
           vue.$alert('登录状态失效,请重新登录', '提示', {
             confirmButtonText: '确定',
             callback: function () {
@@ -54,8 +54,8 @@ axios.interceptors.response.use(
         }
         break
       case 5002:
-        if (window.localStorage.getItem('token')) {
-          window.localStorage.setItem('token', '')
+        if (window.localStorage.getItem('cjt_token')) {
+          window.localStorage.setItem('cjt_token', '')
           vue.$alert('登录状态失效,请重新登录', '提示', {
             confirmButtonText: '确定',
             callback: function () {

+ 33 - 0
src/util/index.js

@@ -0,0 +1,33 @@
+function randomWord (randomFlag, min, max) {
+    let str = ''
+    let range = min
+    let 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++) {
+      let pos = Math.round(Math.random() * (arr.length - 1))
+      str += arr[pos]
+    }
+    return str
+  }
+module.exports = {
+    encodeStr: function (str, strv = '') {
+        const NUM = 2
+        const front = randomWord(false, 8)
+        const middle = randomWord(false, 8)
+        const end = randomWord(false, 8)
+
+        let str1 = str.substring(0, NUM)
+        let str2 = str.substring(NUM)
+
+        if (strv) {
+            let strv1 = strv.substring(0, NUM)
+            let strv2 = strv.substring(NUM)
+            return [front + str2 + middle + str1 + end, front + strv2 + middle + strv1 + end]
+        }
+
+        return front + str2 + middle + str1 + end
+    }
+}