87 Комити 341cebaf47 ... 2f17571a2c

Аутор SHA1 Порука Датум
  任一存 2f17571a2c 改改改 пре 1 година
  任一存 5691c40ec0 添加一个tab item:虚拟展厅 пре 1 година
  任一存 c69c2bed47 国之重器详情页 访问量统计埋点 пре 1 година
  shaogen1995 3af1726602 upp-傻逼项目 пре 1 година
  shaogen1995 8b38526ba9 Merge branch 'link-backend' of http://face3d.4dage.com:7005/renyicun/ShangHaiInustrialMuseum into link-backend пре 1 година
  shaogen1995 30d048bcc4 01 пре 1 година
  任一存 18da05eb21 用新版unity代码;带参数id跳转元宇宙界面时focus到对应星球上。 пре 1 година
  任一存 fce4967e8b 概述总览 在离开时隐藏所有企业,而非进入时隐藏所有企业 пре 1 година
  shaogen1995 8ea27ec8eb up-修改样式 пре 1 година
  shaogen1995 6ce0d7e9be fix-修复一波bug пре 1 година
  任一存 f20386bb66 邵根让在元宇宙里补充一句代码 пре 1 година
  shaogen1995 7cd8f8d2f2 upp-初步完工 пре 1 година
  shaogen1995 6e95407df0 概述和历史暂时完成 пре 1 година
  任一存 8235049a44 bug fix: 国之重器页 对点击操作和拖拽操作的鉴别不够完美,导致在有些人的电脑上无法实现点击效果。 пре 1 година
  任一存 2fd3600014 chore пре 1 година
  任一存 9c8c765aae bug fix пре 1 година
  任一存 07f461270a 历史回顾:人物照片可放大查看 пре 1 година
  任一存 38c045c65d 旧文件我留你何用? пре 1 година
  任一存 be801d4138 bug fix: 40196 (上海工业博物馆-PC端)概述总览-点击搜索企业,地图会显示默认企业和被搜索企业 пре 1 година
  任一存 81dc80a745 bug fix: 国之重器详情页没有实现背景音乐功能。 пре 1 година
  任一存 6222b91910 bug fix: 39953 (上海工业博物馆-PC端)概述总览-搜索输入框输入内容没有返回结果 пре 1 година
  任一存 50acaf9425 bug fix: 39958 (上海工业博物馆-PC端)概述总览-管理后台上传多张图片,在企业中详情中只显示首张图片 пре 1 година
  任一存 b9a3c44a2a bug fix: 国之重器 详情标题会遮挡关闭按钮 пре 1 година
  任一存 7889935bd4 bug fix: 39988 (上海工业博物馆-PC端)工业元宇宙-关闭查看宇宙后没回到最初状态 пре 1 година
  任一存 6c9ef54475 bug fix:国之重器详情页模型iframe url拼接错误 пре 1 година
  任一存 4fc4526662 1 пре 1 година
  任一存 c8f6524914 对接网站信息真实数据 пре 1 година
  任一存 a85cf6b4f4 更新unity模型 пре 1 година
  任一存 72c5d62fab 新增背景音乐、网站信息这两个按钮和对应的功能 пре 1 година
  任一存 62385eb984 更新模型;网站信息tooltip,用假数据。 пре 1 година
  任一存 51dc2cf189 因为分享功能的需求,跳转逻辑需要优化 пре 1 година
  任一存 63790d72a7 历史回顾:表盘切图优化;快到到时间尽头时提前禁止前进以避免右侧空白太多;最后一个年代不显示。 пре 1 година
  任一存 3a6b3def75 1 пре 1 година
  任一存 67d3f36b37 继续适配移动端 пре 1 година
  任一存 a5c7334cc4 修复微信里背景视频全屏播放、不自动播放的问题;只在移动端且屏幕方向改变时reload,而不是resize时就reload пре 1 година
  任一存 61e1b965c4 国之重器详情页:分享界面也要有视频背景 пре 1 година
  任一存 22e6be629c bugfix: 历史回顾页 移动端不显示底部栏 пре 1 година
  任一存 441b977a38 傻逼玩意儿 пре 2 година
  任一存 c48ff29af1 适配移动端,妈的不早说 пре 2 година
  任一存 cd7c61b40c 不实时计算时间轴标度的透明度,以减少计算量 пре 2 година
  任一存 d6bfcb6ddc 分享界面改为通过前端路由打开,这样才能真的分享出去。 пре 2 година
  任一存 98b7d2930d 傻逼玩意儿 пре 2 година
  任一存 f89c6ef79b 傻逼玩意儿 пре 2 година
  任一存 b9fcec1cf5 历史回顾 自动滚动 пре 2 година
  任一存 7fadeda12f 历史回顾 对接接口 пре 2 година
  任一存 39a20fb081 gaogaogao пре 2 година
  任一存 bc380bd376 历史回顾-时代标签 пре 2 година
  任一存 82cd32f59a 历史回顾-背景视频 пре 2 година
  任一存 0440736b31 历史回顾-时代名称 пре 2 година
  任一存 0d493d9346 历史回顾-人物卡片 пре 2 година
  任一存 6c70fdf9b7 bug fix:国之重器 多排列几次,看看能不能修复偶发的排列成一列的bug пре 2 година
  任一存 83de8ef8ed 历史回顾:时间刻度和齿轮 пре 2 година
  任一存 185b35701a 历史回顾开始重做 пре 2 година
  任一存 6047470cc0 更新模型 пре 2 година
  任一存 29acf36b3a shabi пре 2 година
  任一存 a748549b55 历史回顾 外观更新 пре 2 година
  任一存 b069febdeb 搬不完的砖 пре 2 година
  任一存 f32ed2aefd 历史回顾 图表加载完毕前显示loading效果 пре 2 година
  任一存 c4709495fd 历史回顾 图表节点 颜色优化(添加渐变) пре 2 година
  任一存 a6a21f3b9c 历史回顾 图表 需求变更 пре 2 година
  任一存 d8770863be 无聊的优化外观 пре 2 година
  任一存 fa83cded0c shabishabi пре 2 година
  任一存 f89f070c7c 国之重器列表页 排版与自动滚动、记忆并恢复滚动位置 пре 2 година
  任一存 e7dee998c0 傻逼玩意儿 пре 2 година
  任一存 c799e7f574 国之重器详情页bug fix пре 2 година
  任一存 1d517b6b32 工业元宇宙 bug修复 пре 2 година
  任一存 ce5c8bc049 概述总览 外观优化 пре 2 година
  任一存 a87ab4a06b 改外观 пре 2 година
  任一存 39ae42bc9f bug fix: 开场动画没有全屏显示 пре 2 година
  任一存 6f55459fdf api bug fix; 概览页显示图片 пре 2 година
  任一存 55d47f8bf7 只可以在宽屏下浏览 пре 2 година
  任一存 3f03f321c0 底部栏改为不与主界面重叠 пре 2 година
  任一存 69603fe46b 琐碎bug和新需求 пре 2 година
  任一存 3c25df848c 更新unity模型,这回切换很快了 пре 2 година
  任一存 f0a72e6be3 【国之重器】分享、录屏功能对接接口 пре 2 година
  任一存 44ca79d3a2 样式优化 пре 2 година
  任一存 492d41719c 【国之重器】显示模型 пре 2 година
  任一存 a7c83068c3 【国之重器】详情页对接借口煞笔煞笔 пре 2 година
  任一存 b1af5e9b42 【概览】用回真实数据 пре 2 година
  任一存 1763ced759 【概览】使用假数据,选中某一项后地图上显示截至那一项的所有项 пре 2 година
  任一存 3df86ccea1 更新unity模型 пре 2 година
  任一存 38c805e2cf 【工业元宇宙】接入宇宙模型 пре 2 година
  任一存 e27cdb7ca6 同上 пре 2 година
  任一存 d7d2515cf6 【国之重器】优化loading效果 пре 2 година
  任一存 0aa9bd36e9 【元宇宙】对接借口 пре 2 година
  任一存 7cfb58ec3a 【历史回顾】对接接口 пре 2 година
  任一存 27b77a2e88 【概述总览】对接接口 пре 2 година
100 измењених фајлова са 707 додато и 933 уклоњено
  1. 8 1
      README.md
  2. 7 2
      package.json
  3. 0 238
      public/chart.html
  4. BIN
      public/chart4app-bg.jpg
  5. 0 249
      public/chart4app.html
  6. 0 329
      public/history.js
  7. 0 1
      public/index.html
  8. BIN
      public/unity/Build/SHIndustryMuseum_2.0.framework.js.unityweb
  9. BIN
      public/unity/Build/SHIndustryMuseum_2.0.wasm.unityweb
  10. BIN
      public/unity/Build/SHIndustryMuseum_2.0.data.unityweb
  11. BIN
      public/unity/Build/SHIndustryMuseum_2.12.framework.js.unityweb
  12. 0 0
      public/unity/Build/SHIndustryMuseum_2.12.loader.js
  13. BIN
      public/unity/Build/SHIndustryMuseum_2.12.wasm.unityweb
  14. BIN
      public/unity/Build/SHIndustryMuseum_2.13.data.unityweb
  15. BIN
      public/unity/Build/SHIndustryMuseum_2.13.framework.js.unityweb
  16. 1 0
      public/unity/Build/SHIndustryMuseum_2.13.loader.js
  17. BIN
      public/unity/Build/SHIndustryMuseum_2.13.wasm.unityweb
  18. 4 4
      public/unity/ServiceWorker.js
  19. 0 2
      public/unity/TemplateData/style.css
  20. 520 64
      src/App.vue
  21. 167 43
      src/api.js
  22. BIN
      src/assets/images/bg-bottom-bar.jpg
  23. BIN
      src/assets/images/bg-bottom-bar.png
  24. BIN
      src/assets/images/bg-person-card-fat.png
  25. BIN
      src/assets/images/bg-person-card-tall.png
  26. BIN
      src/assets/images/bidBack.png
  27. BIN
      src/assets/images/for-dev.jpg
  28. BIN
      src/assets/images/gear/表盘1_00000.png
  29. BIN
      src/assets/images/gear/表盘1_00001.png
  30. BIN
      src/assets/images/gear/表盘1_00002.png
  31. BIN
      src/assets/images/gear/表盘1_00003.png
  32. BIN
      src/assets/images/gear/表盘1_00004.png
  33. BIN
      src/assets/images/gear/表盘1_00005.png
  34. BIN
      src/assets/images/gear/表盘1_00006.png
  35. BIN
      src/assets/images/gear/表盘1_00007.png
  36. BIN
      src/assets/images/gear/表盘1_00008.png
  37. BIN
      src/assets/images/gear/表盘1_00009.png
  38. BIN
      src/assets/images/gear/表盘1_00010.png
  39. BIN
      src/assets/images/gear/表盘1_00011.png
  40. BIN
      src/assets/images/gear/表盘1_00012.png
  41. BIN
      src/assets/images/gear/表盘1_00013.png
  42. BIN
      src/assets/images/gear/表盘1_00014.png
  43. BIN
      src/assets/images/gear/表盘1_00015.png
  44. BIN
      src/assets/images/gear/表盘1_00016.png
  45. BIN
      src/assets/images/gear/表盘1_00017.png
  46. BIN
      src/assets/images/gear/表盘1_00018.png
  47. BIN
      src/assets/images/gear/表盘1_00019.png
  48. BIN
      src/assets/images/gear/表盘1_00020.png
  49. BIN
      src/assets/images/gear/表盘1_00021.png
  50. BIN
      src/assets/images/gear/表盘1_00022.png
  51. BIN
      src/assets/images/gear/表盘1_00023.png
  52. BIN
      src/assets/images/general-article-bg.png
  53. BIN
      src/assets/images/icon_info.png
  54. BIN
      src/assets/images/icon_music_2_off.png
  55. BIN
      src/assets/images/icon_music_2_on.png
  56. BIN
      src/assets/images/img-raw/Group@2x.png
  57. BIN
      src/assets/images/img-raw/bg@2x.png
  58. BIN
      src/assets/images/img-raw/bg_history@2x.png
  59. BIN
      src/assets/images/img-raw/btn_left_active@2x.png
  60. BIN
      src/assets/images/img-raw/btn_left_normal@2x.png
  61. BIN
      src/assets/images/img-raw/btn_right_active@2x.png
  62. BIN
      src/assets/images/img-raw/btn_right_normal@2x.png
  63. BIN
      src/assets/images/img-raw/btn_video@2x.png
  64. BIN
      src/assets/images/img-raw/circle_active@2x.png
  65. BIN
      src/assets/images/img-raw/circle_normal@2x.png
  66. BIN
      src/assets/images/img-raw/icon_account@2x.png
  67. BIN
      src/assets/images/img-raw/icon_active@2x.png
  68. BIN
      src/assets/images/img-raw/icon_cancel@2x.png
  69. BIN
      src/assets/images/img-raw/icon_down@2x.png
  70. BIN
      src/assets/images/img-raw/icon_download@2x.png
  71. BIN
      src/assets/images/img-raw/icon_fullscreen@2x.png
  72. BIN
      src/assets/images/img-raw/icon_left@2x.png
  73. BIN
      src/assets/images/img-raw/icon_password@2x.png
  74. BIN
      src/assets/images/img-raw/icon_right@2x.png
  75. BIN
      src/assets/images/img-raw/icon_screen@2x.png
  76. BIN
      src/assets/images/img-raw/icon_search@2x.png
  77. BIN
      src/assets/images/img-raw/icon_see@2x.png
  78. BIN
      src/assets/images/img-raw/icon_up@2x.png
  79. BIN
      src/assets/images/img-raw/labe_right@2x.png
  80. BIN
      src/assets/images/img-raw/label2@2x.png
  81. BIN
      src/assets/images/img-raw/label@2x.png
  82. BIN
      src/assets/images/img-raw/label_left@2x(1).png
  83. BIN
      src/assets/images/img-raw/label_left@2x.png
  84. BIN
      src/assets/images/img-raw/label_next@2x.png
  85. BIN
      src/assets/images/img-raw/label_pre@2x.png
  86. BIN
      src/assets/images/img-raw/label_right@2x.png
  87. BIN
      src/assets/images/img-raw/logo@2x(1).png
  88. BIN
      src/assets/images/img-raw/logo@2x.png
  89. BIN
      src/assets/images/img-raw/menu_active@2x.png
  90. BIN
      src/assets/images/img-raw/menu_img@2x.png
  91. BIN
      src/assets/images/img-raw/pop1@2x.png
  92. BIN
      src/assets/images/img-raw/pop_label@2x.png
  93. BIN
      src/assets/images/img-raw/title@2x.png
  94. BIN
      src/assets/images/img4dev/1.jpg
  95. BIN
      src/assets/images/img4dev/2.jpg
  96. BIN
      src/assets/images/img4dev/3.jpg
  97. BIN
      src/assets/images/img4dev/4.jpg
  98. BIN
      src/assets/images/img4dev/5.jpg
  99. BIN
      src/assets/images/imgErr.png
  100. 0 0
      src/assets/images/line_long.png

+ 8 - 1
README.md

@@ -4,4 +4,11 @@ https://culture.4dage.com/demo/ShangHaiGongYe/index.html#/history
 ## 部署测试环境
 文件存放位置:/Default/阿里云/项目节点/项目测试/阿里云-四维时代-项目测试服务器-8.135.106.227/home/data/museum_shanghai_gongye_data/web
 
-访问url:https://sit-shgybwg.4dage.com/web/index.html#/general
+访问url:https://sit-shgybwg.4dage.com/web/index.html#/general
+
+## 测试环境后台
+https://sit-shgybwg.4dage.com/backstage/index.html#/
+
+帐号:admin
+
+密码:123456

+ 7 - 2
package.json

@@ -1,6 +1,6 @@
 {
   "name": "my-app",
-  "version": "0.0.0",
+  "version": "1.0.2",
   "private": true,
   "scripts": {
     "serve": "vue-cli-service serve --mode dev",
@@ -9,16 +9,21 @@
     "lint": "vue-cli-service lint"
   },
   "dependencies": {
+    "@floating-ui/dom": "^1.0.7",
+    "@vueuse/core": "^10.4.1",
     "axios": "^1.1.3",
     "core-js": "^3.8.3",
     "dayjs": "^1.11.7",
+    "element-plus": "^2.3.8",
     "html2canvas": "^1.4.1",
     "lodash": "^4.17.21",
     "mitt": "^3.0.0",
     "qrcode": "^1.5.3",
     "swiper": "^10.0.4",
-    "vue": "^3.2.13",
+    "v-viewer": "^3.0.11",
+    "viewerjs": "^1.11.6",
     "vue-router": "^4.0.3",
+    "vue": "^3.2.13",
     "vuex": "^4.0.0"
   },
   "devDependencies": {

+ 0 - 238
public/chart.html

@@ -1,238 +0,0 @@
-<!DOCTYPE html>
-<html lang="zh-CN" style="height: 100%">
-<head>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-  <title>chart</title>
-</head>
-
-<style>
-  *{
-    margin: 0;
-    padding: 0;
-    box-sizing: border-box;
-  }
-</style>
-
-<body style="height: 100%; margin: 0">
-  <div id="container" style="height: 100%"></div>
-  <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
-  <script type="text/javascript" src="https://cdn.staticfile.org/echarts/5.4.2/echarts.min.js"></script>
-  <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
-  <script src="./history.js"></script>
-
-  <script type="text/javascript">
-    const timeList = [
-      '开埠通商',
-      '曲折发展',
-      '步履维艰',
-      '筚路蓝缕',
-      '改革开放',
-      '战略负重',
-      '创新驱动',
-      '追梦未来',
-    ]
-    
-    function randomColor() {
-      return '#' + Math.floor(
-          (
-            Math.random() * (1 - 0.3) + 0.3
-          ) * 0xffffff
-        ).toString(16)
-    }
-    
-    const dataForRender = {}
-
-    let myChart = null
-    
-    var dom = document.getElementById('container');
-    myChart = echarts.init(dom, null, {
-      renderer: 'canvas',
-      useDirtyRect: false
-    });
-    
-    async function showChart(timeIdx) {
-      myChart.clear()
-      
-      // const res = await axios({
-      //   method: 'post',
-      //   url: `https://sit-shgybwg.4dage.com/api/show/history/pageList`,
-      //   headers: {
-      //     "Content-Type": "application/json",
-      //   },
-      //   data: {
-      //     stage: timeList[timeIdx]
-      //   },
-      // })
-      // const corpList = res.data.data.records
-      const corpList = historyRawData['阶段任务信息'][timeIdx].children.map((item) => {
-        return {
-          companyName: item['品牌'],
-          description: item['简介'],
-          id: item['序号'],
-          name: item['名称'],
-          story: item['故事'],
-        }
-      })
-
-      dataForRender.nodes = [
-        {
-          name: timeList[timeIdx],
-          id: '-1',
-          symbolSize: 100,
-          itemStyle: {
-            color: randomColor()
-          },
-        },
-      ]
-      dataForRender.edges = []
-
-      for (const iterator of corpList) {
-        const newNode = {
-          name: iterator.name || iterator.companyName,
-          id: iterator.id.toString(),
-          symbolSize: iterator.importance || (100 * Math.random()),
-          itemStyle: {
-            color: randomColor()
-          }
-        }
-        dataForRender.nodes.push(newNode)
-      }
-      // 除了代表时代的那个节点,其他节点的尺寸归一化
-      let vMax = Number.NEGATIVE_INFINITY
-      let vMin = Number.POSITIVE_INFINITY
-      const vMaxNew = 50
-      const vMinNew = 30
-      for (let index = 1; index < dataForRender.nodes.length; index++) {
-        const size = dataForRender.nodes[index].symbolSize
-        if (size > vMax) {
-          vMax = size
-        }
-        if (size < vMin) {
-          vMin = size
-        }
-      }
-      let scale = null
-      if (vMax === vMin) {
-        scale = 1
-        for (const iterator of dataForRender.nodes.slice(1)) {
-          iterator.symbolSize = vMinNew + (vMaxNew - vMinNew) / 2
-        }
-      } else {
-        scale = (vMaxNew - vMinNew) / (vMax - vMin)
-        for (const iterator of dataForRender.nodes.slice(1)) {
-          iterator.symbolSize = vMinNew + (iterator.symbolSize - vMin) * scale
-        }
-      }
-      // 画边
-      for (let i = 0; i < dataForRender.nodes.length; i++) {
-        for (let j = i + 1; j < dataForRender.nodes.length; j++) {
-          const hasCenterNode = (i === 0 || j === 0)
-          if (hasCenterNode) {
-            const newEdge = {
-              source: dataForRender.nodes[i].id,
-              target: dataForRender.nodes[j].id,
-              value: dataForRender.nodes[i].symbolSize * dataForRender.nodes[j].symbolSize * 10, // 值越大,连接的两个节点间斥力越小。
-            }
-            dataForRender.edges.push(newEdge)
-          } else {
-            const newEdge = {
-              source: dataForRender.nodes[i].id,
-              target: dataForRender.nodes[j].id,
-              value: dataForRender.nodes[i].symbolSize * dataForRender.nodes[j].symbolSize * 1, // 值越大,连接的两个节点间斥力越小。
-              lineStyle: {
-                opacity: 0,
-              }
-            }
-            dataForRender.edges.push(newEdge)
-          }
-        }
-      }
-      // console.log(dataForRender);
-      
-      myChart.setOption({
-        animationDurationUpdate: 1500,
-        animationEasingUpdate: 'quinticInOut',
-        series: [
-          {
-            type: 'graph',
-            layout: 'force',
-            draggable: false,
-            // 力引导布局是模拟弹簧电荷模型在每两个节点之间添加一个斥力,每条边的两个节点之间添加一个引力
-            force: {
-              initLayout: 'circular', // 进行力引导布局前的初始化布局,初始化布局会影响到力引导的效果。默认不进行任何布局,使用节点中提供的 x, y 作为节点的位置。如果不存在的话会随机生成一个位置。也可以选择使用环形布局 'circular'。
-              repulsion: 100, // 节点之间的斥力因子。傻逼文档把edgeLength当数组用的用法写到这上边了。
-              gravity: 0.1, // 节点受到的向中心的引力因子。该值越大节点越往中心点靠拢。
-              edgeLength: [50, 400], // 把各个边的两个节点之间的距离归一化到这个范围内。与repulsion共同作用。
-              layoutAnimation: true,
-              friction: 0.1, // 这个参数能减缓节点的移动速度。取值范围 0 到 1。但是仍然是个试验性的参数,参见 #11024。
-            },
-            data: dataForRender.nodes,
-            // 或者叫edges
-            links: dataForRender.edges,
-            selectedMode: 'single',
-            select: {
-              itemStyle: {
-                shadowBlur: 50,
-                shadowColor: 'rgba(255, 255, 125, 0.7)',
-              },
-              label: {
-                position: 'right',
-                show: true,
-              }
-            },
-            // 高亮状态的图形样式
-            emphasis: {
-              scale: false,
-              label: {
-                position: 'right',
-                show: true
-              }
-            },
-            // 图表是否可以移动、缩放
-            roam: true,
-            lineStyle: {
-              width: 0.5,
-              curveness: 0.3,
-              opacity: 0.7,
-            }
-          }
-        ]
-      }, true)
-
-      setTimeout(() => {
-        // 等myChart上注册了select回调后再执行
-        // 一开始自动选中表示时代的那个节点
-        myChart.dispatchAction({
-          type: 'select',
-          seriesIndex: 0,
-          name: timeList[timeIdx],
-        })
-      }, 0);
-    }
-
-    showChart(0)
-
-    // 用户选中节点后,向父窗口post message
-    function onSelect(params) {
-      if (params.dataType === 'node') { // 用户选中节点触发的
-        window.parent.postMessage(`node-selected: ${dataForRender.nodes[params.dataIndexInside].id}`, '*')
-      } else if (params.type === 'select') { // 程序里调用dispatchAction触发的,且type为select
-        window.parent.postMessage(`node-selected: ${dataForRender.nodes[0].id}`, '*')
-      }
-    }
-    myChart.on('select', onSelect)
-
-    window.addEventListener('resize', myChart.resize);
-
-    // 切换时代
-    window.changeTime = function (idx) {
-      if (Number.isInteger(idx) && idx >= 0) {
-        showChart(idx)
-      } else {
-        console.error('[page using echart] changeTime: invalid param!', idx);
-      }
-    }
-  </script>
-</body>
-</html>

BIN
public/chart4app-bg.jpg


+ 0 - 249
public/chart4app.html

@@ -1,249 +0,0 @@
-<!DOCTYPE html>
-<html lang="zh-CN" style="height: 100%">
-<head>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-  <title>chart</title>
-</head>
-
-<style>
-  *{
-    margin: 0;
-    padding: 0;
-    box-sizing: border-box;
-  }
-  body {
-    background-color: #04060a;
-  }
-</style>
-
-<body style="height: 100%; margin: 0">
-  <div id="container" style="height: 100%"></div>
-  <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
-  <script type="text/javascript" src="https://cdn.staticfile.org/echarts/5.4.2/echarts.min.js"></script>
-  <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
-  <script src="./history.js"></script>
-
-  <script type="text/javascript">
-    const timeList = [
-      '开埠通商',
-      '曲折发展',
-      '步履维艰',
-      '筚路蓝缕',
-      '改革开放',
-      '战略负重',
-      '创新驱动',
-      '追梦未来',
-    ]
-
-    function randomColor() {
-      return '#' + Math.floor(
-          (
-            Math.random() * (1 - 0.3) + 0.3
-          ) * 0xffffff
-        ).toString(16)
-    }
-    
-    const dataForRender = {}
-
-    let myChart = null
-    
-    var dom = document.getElementById('container');
-    myChart = echarts.init(dom, null, {
-      renderer: 'canvas',
-      useDirtyRect: false
-    });
-    
-    async function showChart(timeIdx) {
-      myChart.clear()
-      
-      // const res = await axios({
-      //   method: 'post',
-      //   url: `https://sit-shgybwg.4dage.com/api/show/history/pageList`,
-      //   headers: {
-      //     "Content-Type": "application/json",
-      //   },
-      //   data: {
-      //     stage: timeList[timeIdx]
-      //   },
-      // })
-      // const corpList = res.data.data.records
-      const corpList = historyRawData['阶段任务信息'][timeIdx].children.map((item) => {
-        return {
-          companyName: item['品牌'],
-          description: item['简介'],
-          id: item['序号'],
-          name: item['名称'],
-          story: item['故事'],
-        }
-      })
-
-      dataForRender.nodes = [
-        {
-          name: timeList[timeIdx],
-          id: '-1',
-          symbolSize: 100,
-          itemStyle: {
-            color: randomColor()
-          },
-        },
-      ]
-      dataForRender.edges = []
-
-      for (const iterator of corpList) {
-        const newNode = {
-          name: iterator.name || iterator.companyName,
-          id: iterator.id.toString(),
-          symbolSize: iterator.importance || (100 * Math.random()),
-          itemStyle: {
-            color: randomColor()
-          }
-        }
-        dataForRender.nodes.push(newNode)
-      }
-      // 除了代表时代的那个节点,其他节点的尺寸归一化
-      let vMax = Number.NEGATIVE_INFINITY
-      let vMin = Number.POSITIVE_INFINITY
-      const vMaxNew = 50
-      const vMinNew = 30
-      for (let index = 1; index < dataForRender.nodes.length; index++) {
-        const size = dataForRender.nodes[index].symbolSize
-        if (size > vMax) {
-          vMax = size
-        }
-        if (size < vMin) {
-          vMin = size
-        }
-      }
-      let scale = null
-      if (vMax === vMin) {
-        scale = 1
-        for (const iterator of dataForRender.nodes.slice(1)) {
-          iterator.symbolSize = vMinNew + (vMaxNew - vMinNew) / 2
-        }
-      } else {
-        scale = (vMaxNew - vMinNew) / (vMax - vMin)
-        for (const iterator of dataForRender.nodes.slice(1)) {
-          iterator.symbolSize = vMinNew + (iterator.symbolSize - vMin) * scale
-        }
-      }
-      // 画边
-      for (let i = 0; i < dataForRender.nodes.length; i++) {
-        for (let j = i + 1; j < dataForRender.nodes.length; j++) {
-          const hasCenterNode = (i === 0 || j === 0)
-          if (hasCenterNode) {
-            const newEdge = {
-              source: dataForRender.nodes[i].id,
-              target: dataForRender.nodes[j].id,
-              value: dataForRender.nodes[i].symbolSize * dataForRender.nodes[j].symbolSize * 10, // 值越大,连接的两个节点间斥力越小。
-            }
-            dataForRender.edges.push(newEdge)
-          } else {
-            const newEdge = {
-              source: dataForRender.nodes[i].id,
-              target: dataForRender.nodes[j].id,
-              value: dataForRender.nodes[i].symbolSize * dataForRender.nodes[j].symbolSize * 1, // 值越大,连接的两个节点间斥力越小。
-              lineStyle: {
-                opacity: 0,
-              }
-            }
-            dataForRender.edges.push(newEdge)
-          }
-        }
-      }
-      // console.log(dataForRender);
-      
-      myChart.setOption({
-        animationDurationUpdate: 1500,
-        animationEasingUpdate: 'quinticInOut',
-        series: [
-          {
-            type: 'graph',
-            layout: 'force',
-            draggable: false,
-            // 力引导布局是模拟弹簧电荷模型在每两个节点之间添加一个斥力,每条边的两个节点之间添加一个引力
-            force: {
-              initLayout: 'circular', // 进行力引导布局前的初始化布局,初始化布局会影响到力引导的效果。默认不进行任何布局,使用节点中提供的 x, y 作为节点的位置。如果不存在的话会随机生成一个位置。也可以选择使用环形布局 'circular'。
-              repulsion: 100, // 节点之间的斥力因子。傻逼文档把edgeLength当数组用的用法写到这上边了。
-              gravity: 0.1, // 节点受到的向中心的引力因子。该值越大节点越往中心点靠拢。
-              edgeLength: [50, 400], // 把各个边的两个节点之间的距离归一化到这个范围内。与repulsion共同作用。
-              layoutAnimation: true,
-              friction: 0.1, // 这个参数能减缓节点的移动速度。取值范围 0 到 1。但是仍然是个试验性的参数,参见 #11024。
-            },
-            data: dataForRender.nodes,
-            // 或者叫edges
-            links: dataForRender.edges,
-            selectedMode: 'single',
-            select: {
-              itemStyle: {
-                shadowBlur: 50,
-                shadowColor: 'rgba(255, 255, 125, 0.7)',
-              },
-              label: {
-                position: 'right',
-                show: true,
-              }
-            },
-            // 高亮状态的图形样式
-            emphasis: {
-              scale: false,
-              label: {
-                position: 'right',
-                show: true
-              }
-            },
-            // 图表是否可以移动、缩放
-            roam: true,
-            lineStyle: {
-              width: 0.5,
-              curveness: 0.3,
-              opacity: 0.7,
-            }
-          }
-        ]
-      }, true)
-
-      setTimeout(() => {
-        // 等myChart上注册了select回调后再执行
-        // 一开始自动选中表示时代的那个节点
-        myChart.dispatchAction({
-          type: 'select',
-          seriesIndex: 0,
-          name: timeList[timeIdx],
-        })
-      }, 0);
-    }
-
-    showChart(0)
-
-    // 用户选中节点后,向父窗口post message
-    function onSelect(params) {
-      if (params.dataType === 'node') { // 用户选中节点触发的
-        if (window.vuplex) {
-          window.vuplex.postMessage({ type: 'select-id', message: dataForRender.nodes[params.dataIndexInside].id });
-        } else {
-          console.error('不存在window.vuplex!');
-        }
-      } else if (params.type === 'select') { // 程序里调用dispatchAction触发的,且type为select
-        if (window.vuplex) {
-          window.vuplex.postMessage({ type: 'select-id', message: dataForRender.nodes[0].id });
-        } else {
-          console.error('不存在window.vuplex!');
-        }
-      }
-    }
-    myChart.on('select', onSelect)
-
-    window.addEventListener('resize', myChart.resize);
-
-    // 切换时代
-    window.changeTime = function (idx) {
-      if (Number.isInteger(idx) && idx >= 0) {
-        showChart(idx)
-      } else {
-        console.error('[page using echart] changeTime: invalid param!', idx);
-      }
-    }
-  </script>
-</body>
-</html>

Разлика између датотеке није приказан због своје велике величине
+ 0 - 329
public/history.js


+ 0 - 1
public/index.html

@@ -13,7 +13,6 @@
     <script src="./libs/isotope-layout.3.0.6.js"></script>
     <script src="./libs/packery-mode.2.0.1.js"></script>
 
-    
     <!-- <script src="https://cdn.bootcss.com/vConsole/3.2.0/vconsole.min.js"></script> -->
     <noscript>
       <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>

BIN
public/unity/Build/SHIndustryMuseum_2.0.framework.js.unityweb


BIN
public/unity/Build/SHIndustryMuseum_2.0.wasm.unityweb


BIN
public/unity/Build/SHIndustryMuseum_2.0.data.unityweb


BIN
public/unity/Build/SHIndustryMuseum_2.12.framework.js.unityweb


public/unity/Build/SHIndustryMuseum_2.0.loader.js → public/unity/Build/SHIndustryMuseum_2.12.loader.js


BIN
public/unity/Build/SHIndustryMuseum_2.12.wasm.unityweb


BIN
public/unity/Build/SHIndustryMuseum_2.13.data.unityweb


BIN
public/unity/Build/SHIndustryMuseum_2.13.framework.js.unityweb


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
public/unity/Build/SHIndustryMuseum_2.13.loader.js


BIN
public/unity/Build/SHIndustryMuseum_2.13.wasm.unityweb


+ 4 - 4
public/unity/ServiceWorker.js

@@ -1,9 +1,9 @@
 const cacheName = "DefaultCompany-SHIndustryMuseum-0.1";
 const contentToCache = [
-    "Build/SHIndustryMuseum_1.9.loader.js",
-    "Build/SHIndustryMuseum_1.9.framework.js.unityweb",
-    "Build/SHIndustryMuseum_1.9.data.unityweb",
-    "Build/SHIndustryMuseum_1.9.wasm.unityweb",
+    "Build/SHIndustryMuseum_2.1.loader.js",
+    "Build/SHIndustryMuseum_2.1.framework.js.unityweb",
+    "Build/SHIndustryMuseum_2.1.data.unityweb",
+    "Build/SHIndustryMuseum_2.1.wasm.unityweb",
     "TemplateData/style.css"
 
 ];

+ 0 - 2
public/unity/TemplateData/style.css

@@ -1,6 +1,4 @@
 body { padding: 0; margin: 0 }
-#unity-container { position: fixed; width: 100%; height: 100%; }
-#unity-canvas { width: 100%; height: 100%; background: #231F20 }
 #unity-loading-bar { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); display: none }
 #unity-logo { width: 154px; height: 130px; background: url('unity-logo-dark.png') no-repeat center }
 #unity-progress-bar-empty { width: 141px; height: 18px; margin-top: 10px; background: url('progress-bar-empty-dark.png') no-repeat center }

+ 520 - 64
src/App.vue

@@ -1,15 +1,12 @@
 <template>
-  <div id="app">
-    <transition name="fade-out">
-      <HomeFadeIn
-        v-if="isShowFadeInMask"
-        class="fade-in-mask"
-        :progress="progress"
-      />
-    </transition>
-
+  <div
+    class="app-view"
+    :class="{
+      higher: !isShowNavBar,
+    }"
+  >
     <div
-      v-show="$route.meta.isShow3DMap"
+      v-show="$route.meta.isShowUnityModel"
       id="unity-container"
     >
       <canvas
@@ -25,7 +22,7 @@
     <nav
       v-show="!$route.meta.hideNavBar"
       :style="{
-        bottom: isShowNavBar ? '0' : '-112px',
+        bottom: isShowNavBar ? '0' : `-${navBarHeight}`,
       }"
     >
       <button
@@ -88,7 +85,67 @@
           draggable="false"
         >
       </button>
+      <button
+        class="tab-item"
+        :class="{
+          active: $route.meta.belongNavGroup === 4
+        }"
+        @click="$router.push({name: 'VirtualMuseum'})"
+      >
+        虚拟展厅
+        <img
+          class="decorator"
+          src="@/assets/images/nav-item-active-decorator.png"
+          alt=""
+          draggable="false"
+        >
+      </button>
     </nav>
+
+    <Teleport to="body">
+      <audio
+        ref="bgAudio"
+        loop
+        :src="`${$env.VUE_APP_API_ORIGIN}${bgMusicUrl}`"
+      />
+    </Teleport>
+    <button
+      v-show="!$route.meta.hideNavBar && bgMusicUrl"
+      class="music-switch"
+      :style="{
+        backgroundImage: bgMusicStatus ? `url(${require(`@/assets/images/icon_music_2_on.png`)})` : `url(${require(`@/assets/images/icon_music_2_off.png`)})`,
+      }"
+      @click="onClickBgMusicBtn"
+    />
+    <Teleport
+      to="body"
+    >
+      <div
+        v-show="isShowInfoTooltip"
+        ref="infoTooltip"
+        class="info-tooltip"
+      >
+        <p v-show="contactMethod">
+          <span class="key">联系方式:</span><span class="value">{{ contactMethod }}</span>
+        </p>
+        <p v-show="email">
+          <span class="key">电子邮箱:</span><span class="value">{{ email }}</span>
+        </p>
+        <div
+          ref="tooltipArrow"
+          class="arrow"
+        />
+      </div>
+    </Teleport>
+    <button
+      v-show="!$route.meta.hideNavBar && (contactMethod || email)"
+      ref="infoButton"
+      class="info"
+      :style="{
+        backgroundImage: `url(${require(`@/assets/images/icon_info.png`)})`,
+      }"
+      @click="onClickInfoButton"
+    />
     <button
       v-show="!$route.meta.hideNavBar"
       class="show-hide"
@@ -97,6 +154,30 @@
       }"
       @click="isShowNavBar = !isShowNavBar"
     />
+
+    <Teleport to="body">
+      <transition name="fade-out">
+        <HomeFadeIn
+          v-if="isShowFadeInMask"
+          class="fade-in-mask"
+          :progress="progress"
+        />
+      </transition>
+    </Teleport>
+
+    <Teleport to="body">
+      <div class="screen-rotate-tip">
+        <div class="inner-wrapper">
+          <img
+            class=""
+            src="@/assets/images/tip-screen-rotate.png"
+            alt=""
+            draggable="false"
+          >
+          <span>请横屏浏览</span>
+        </div>
+      </div>
+    </Teleport>
   </div>
 </template>
 
@@ -104,23 +185,34 @@
 import HomeFadeIn from "@/components/HomeFadeIn.vue"
 import {
   computed,
+  getCurrentInstance,
+  nextTick,
   onMounted,
   reactive,
   ref,
+  watch,
 } from 'vue'
+import { useStore } from "vuex"
+import { computePosition, offset, shift, arrow } from '@floating-ui/dom'
+import { onClickOutside } from '@vueuse/core'
 
 export default {
   components: {
     HomeFadeIn,
   },
   setup () {
-    const isShowFadeInMask = ref(process.env.VUE_APP_CLI_MODE === 'dev' ? false : true)
+    const internalInstance = getCurrentInstance()
+    const store = useStore()
+
+    const isShowFadeInMask = ref(true)
     const progress = ref(0)
-    onMounted(() => {
-      // this.$mitt.on('test', e => {
-      //   console.log('test', e)
-      // })
 
+    onMounted(async () => {
+      window.G4AllList = await api.getMetaverseList()
+    })
+
+
+    onMounted(() => {
       /**
      * 加载unity
      */
@@ -133,11 +225,11 @@ export default {
       var canvas = document.querySelector("#unity-canvas")
 
       var buildUrl = "unity/Build"
-      var loaderUrl = buildUrl + "/SHIndustryMuseum_2.0.loader.js"
+      var loaderUrl = buildUrl + "/SHIndustryMuseum_2.13.loader.js"
       var config = {
-        dataUrl: buildUrl + "/SHIndustryMuseum_2.0.data.unityweb",
-        frameworkUrl: buildUrl + "/SHIndustryMuseum_2.0.framework.js.unityweb",
-        codeUrl: buildUrl + "/SHIndustryMuseum_2.0.wasm.unityweb",
+        dataUrl: buildUrl + "/SHIndustryMuseum_2.13.data.unityweb",
+        frameworkUrl: buildUrl + "/SHIndustryMuseum_2.13.framework.js.unityweb",
+        codeUrl: buildUrl + "/SHIndustryMuseum_2.13.wasm.unityweb",
         streamingAssetsUrl: "StreamingAssets",
         companyName: "DefaultCompany",
         productName: "SHIndustryMuseum",
@@ -170,19 +262,24 @@ export default {
           }
         }).then((unityInstance) => {
           window.gUnityInst = unityInstance
-
-          for (let index = 1; index <= 36; index++) {
-            unityInstance.SendMessage('Panel1', 'ShowEnterprise', index) //显示id为index的企业
-          // unityInstance.SendMessage('Panel1', 'HideEnterprise', index); //隐藏id为index的企业
-          }
-
+          utils.loadUnitySceneGeneral()
         }).catch((message) => {
-          alert(message)
+          console.error('shabi', message)
         })
       }
       window.onClickEnterprise = function (id) {
-        if (window.onCorpOnMapClicked) {
-          window.onCorpOnMapClicked(id)
+        if (window.handleClickEnterprise) {
+          window.handleClickEnterprise(id)
+        }
+      }
+      window.onClickPlanet = function (id) {
+        if (window.handleClickPlanet) {
+          window.handleClickPlanet(id)
+        }
+      }
+      window.onMovedPlanet = function (id) {
+        if (window.handleMovedPlanet) {
+          window.handleMovedPlanet(id)
         }
       }
       document.body.appendChild(script)
@@ -191,16 +288,137 @@ export default {
        */
     })
 
-
     const isShowNavBar = ref(true)
     const activeNavItemIdx = ref(0)
+    const navBarHeight = internalInstance.appContext.config.globalProperties.$isMobile ? `${90 / 1080 * window.innerHeight}px` : '90px'
+
+    /**
+     * 背景音乐按钮相关
+     */
+    function onClickBgMusicBtn() {
+      store.commit('switchBgMusic')
+    }
+    const bgMusicStatus = computed(() => {
+      return store.state.bgMusicStatus
+    })
+    const bgAudio = ref(null)
+    const bgMusicUrl = computed(() => {
+      return store.state.bgMusicUrl
+    })
+    watch(bgMusicStatus, (v) => {
+      if (v) {
+        bgAudio.value.play()
+      } else {
+        bgAudio.value.pause()
+      }
+    })
+    watch(bgMusicUrl, (v) => {
+      if (v && bgMusicStatus.value) {
+        console.log('sdkfjlsfllsflsfljsdfl')
+        nextTick(() => {
+          bgAudio.value.play()
+        })
+      }
+    })
+
+    document.addEventListener('click', function onFirstClick() {
+      if (bgMusicUrl.value) {
+        bgAudio.value.play()
+        store.commit('switchBgMusic')
+        document.removeEventListener('click', onFirstClick)
+      }
+    })
+
+    /**
+     *  信息展示弹框tooltip相关
+     */
+    const infoButton = ref(null)
+    const infoTooltip = ref(null)
+    const tooltipArrow = ref(null)
+    const isShowInfoTooltip = ref(false)
+    const contactMethod = ref('')
+    const email = ref('')
+
+    onMounted(() => {
+      api.getSiteInfo().then((res) => {
+        contactMethod.value = res.phone
+        email.value = res.email
+        store.commit('initBgMusicUrl', res.filePath)
+      })
+    })
+
+    function onClickInfoButton() {
+      isShowInfoTooltip.value = true
+      nextTick(() => {
+        computePosition(infoButton.value, infoTooltip.value, {
+          placement: 'top',
+          middleware: [
+            offset(10),
+            shift({
+              padding: 10,
+            }),
+            arrow({
+              element: tooltipArrow.value,
+              padding: 3,
+            }),
+          ],
+        }).then(({ x, y, placement, middlewareData }) => {
+          Object.assign(infoTooltip.value.style, {
+            left: `${x}px`,
+            top: `${y}px`,
+          })
+
+          const { x: arrowX, y: arrowY } = middlewareData.arrow
+          const arrowPlacement = {
+            top: 'bottom',
+            right: 'left',
+            bottom: 'top',
+            left: 'right',
+          }[placement.split('-')[0]]
+          const dialogPlacement2arrowRotate = {
+            top: '-135deg',
+            right: '-45deg',
+            bottom: '45deg',
+            left: '135deg',
+          }
+          Object.assign(tooltipArrow.value.style, {
+            top: 'initial',
+            bottom: 'initial',
+            left: 'initial',
+            right: 'initial',
+          })
+          Object.assign(tooltipArrow.value.style, {
+            left: arrowX != null ? `${arrowX}px` : '',
+            [arrowPlacement]: '0',
+            transform: ` translateY(50%) rotate(${dialogPlacement2arrowRotate[placement]})`,
+          })
+        })
+      })
+    }
+
+    onClickOutside(infoTooltip, (event) => {
+      if (isShowInfoTooltip.value) {
+        isShowInfoTooltip.value = false
+      }
+    })
 
     return {
+      activeNavItemIdx,
+      bgAudio,
+      bgMusicUrl,
+      bgMusicStatus,
+      contactMethod,
+      email,
+      infoButton,
+      infoTooltip,
       isShowFadeInMask,
-      progress,
-
+      isShowInfoTooltip,
       isShowNavBar,
-      activeNavItemIdx,
+      navBarHeight,
+      onClickBgMusicBtn,
+      onClickInfoButton,
+      progress,
+      tooltipArrow,
     }
   },
 }
@@ -216,7 +434,6 @@ html, body {
 #app {
   height: 100%;
   width: 100%;
-  height: 100%;
   background-image: url(@/assets/images/main-bg.jpg);
   background-size: cover;
   background-repeat: no-repeat;
@@ -235,11 +452,19 @@ html, body {
 
 // 字体
 @font-face {
-  font-family: 'Source Han Serif CN-Regular';
+  font-family: 'Source Han Sans CN-Light';
+  src: url('@/assets/style/SOURCEHANSANSCN-LIGHT.OTF');
+}
+@font-face {
+  font-family: 'Source Han Sans CN-Regular';
+  src: url('@/assets/style/SOURCEHANSANSCN-REGULAR.OTF');
+}
+@font-face {
+  font-family: 'Source Han Sans CN';
   src: url('@/assets/style/SOURCEHANSANSCN-REGULAR.OTF');
 }
 @font-face {
-  font-family: 'Source Han Serif CN-Bold';
+  font-family: 'Source Han Sans CN-Bold';
   src: url('@/assets/style/SOURCEHANSANSCN-BOLD.OTF');
 }
 // i {
@@ -259,21 +484,21 @@ html, body {
   opacity: 0;
 }
 
-// // 不断渐变显隐 animation
-// .animation-show-hide {
-//   animation: show-hide 1.8s infinite;
-// }
-// @keyframes show-hide {
-//   0% {
-//     opacity: 0;
-//   }
-//   50% {
-//     opacity: 1;
-//   }
-//   100% {
-//     opacity: 0;
-//   }
-// }
+// 不断渐变显隐 animation
+.animation-show-hide {
+  animation: show-hide 1.8s infinite;
+}
+@keyframes show-hide {
+  0% {
+    opacity: 0;
+  }
+  50% {
+    opacity: 1;
+  }
+  100% {
+    opacity: 0;
+  }
+}
 
 // // vue-viewer
 // .viewer-container {
@@ -283,31 +508,122 @@ html, body {
 // .viewer-backdrop {
 //   background-color: rgba(0, 0, 0, 90%) !important;
 // }
+
+.info-tooltip {
+  position: absolute;
+  padding: 8px;
+  z-index: 50;
+  background: rgba(32,52,75,0.3);
+  box-shadow: inset 1px 0px 1px 0px rgba(255,236,188,0.5);
+  backdrop-filter: blur(10px);
+  padding: 8px;
+  font-size: 11px;
+  font-family: Source Han Sans CN-Regular, Source Han Sans CN;
+  font-weight: 400;
+  color: #FFFFFF;
+  line-height: 1.5;
+  white-space: pre;
+  opacity: 0.8;
+  >p{
+    >.key{
+
+    }
+    >.value{
+
+    }
+  }
+  >.arrow {
+    position: absolute;
+    background-color: inherit;
+    width: 10px;
+    height: 10px;
+    border: 1px solid transparent;
+    border-left: inherit;
+    border-top: inherit;
+  }
+}
+
+.screen-rotate-tip {
+  position: fixed;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: 100%;
+  background: rgba(0, 0, 0, 0.8);
+  display: none;
+  z-index: 100;
+  @media (max-aspect-ratio: 1/1) {
+    display: initial;
+  }
+  >.inner-wrapper {
+    position: absolute;
+    left: 50%;
+    top: 50%;
+    transform: translate(-50%, -50%);
+    width: 126px;
+    height: 126px;
+    >img {
+      width: 100%;
+      height: 100%;
+    }
+    >span {
+      position: absolute;
+      left: 50%;
+      bottom: -8px;
+      transform: translate(-50%, 100%);
+      font-size: 16px;
+      font-family: Source Han Sans-Regular, Source Han Sans;
+      font-weight: 400;
+      color: #FFFFFF;
+      white-space: pre;
+    }
+  }
+}
 </style>
+
 <style scoped lang="less">
-#app {
-  >.fade-in-mask {
-    z-index: 5;
+.app-view {
+  width: 100%;
+  height: calc(100% - v-bind('navBarHeight'));
+  position: relative;
+  &.higher {
+    height: 100%;
   }
-  >nav {
+  >#unity-container {
     position: absolute;
+    width: 100%;
+    height: 100%;
+    >#unity-canvas {
+      height: 100%;
+      width: 100%;
+      background: #231F20;
+    }
+  }
+
+  >nav {
+    position: fixed;
     left: 0;
     width: 100%;
-    height: 112px;
+    height: v-bind('navBarHeight');
     border-radius: 5px 5px 0 0;
-    border-top: solid 1px #D2BD84;
+    border-top: rgba(210, 189, 132, 0.7);
     box-shadow: inset 0px 2px 2px 0px rgba(210,189,132,0.45), 0px -9px 24px 0px rgba(183,162,109,0.25);
     display: flex;
     justify-content: center;
     align-items: center;
     transition: all 0.5s;
-    backdrop-filter: blur(5px);
+    // backdrop-filter: blur(10px);
+    background-image: url(@/assets/images/bg-bottom-bar.jpg);
+    background-size: cover;
+    background-repeat: no-repeat;
+    background-position: center center;
+    // background-color: #0c0d12;
     >button.tab-item {
       font-size: 30px;
       font-family: Source Han Sans CN-Regular, Source Han Sans CN;
       font-weight: 400;
       color: #FFFFFF;
-      margin-left: 200px;
+      margin-left: 150px;
       opacity: 0.5;
       position: relative;
       user-select: none;
@@ -319,6 +635,7 @@ html, body {
       }
       &.active {
         opacity: initial;
+        font-weight: bold;
         >img.decorator {
           display: initial;
           position: absolute;
@@ -329,26 +646,165 @@ html, body {
         }
       }
     }
-    @media only screen and (max-width: 1400px) {
+    @media only screen and (max-width: 1468px) {
       >button.tab-item {
-        margin-left: 100px;
+        margin-left: 50px;
       }
     }
+    @media only screen and (max-width: 1075px) {
+      >button.tab-item {
+        margin-left: 10px;
+      }
+    }
+  }
+
+  >button.music-switch {
+    position: fixed;
+    right: calc(82px + (36px + 30px) * 2);
+    bottom: 28px;
+    width: 36px;
+    height: 36px;
+    background-size: cover;
+    background-repeat: no-repeat;
+    background-position: center center;
+  }
+  @media only screen and (max-width: 1670px) {
+    >button.music-switch {
+      right: calc(10px + (36px + 10px) * 2);
+    }
+  }
+  >button.info {
+    position: fixed;
+    right: calc(82px + (36px + 30px) * 1);
+    bottom: 28px;
+    width: 36px;
+    height: 36px;
+    background-size: cover;
+    background-repeat: no-repeat;
+    background-position: center center;
+  }
+  @media only screen and (max-width: 1670px) {
+    >button.info {
+      right: calc(10px + (36px + 10px) * 1);
+    }
   }
   >button.show-hide {
-    position: absolute;
+    position: fixed;
     right: 82px;
-    bottom: 34px;
+    bottom: 28px;
     width: 36px;
     height: 36px;
     background-size: cover;
     background-repeat: no-repeat;
     background-position: center center;
   }
-  @media only screen and (max-width: 1400px) {
+  @media only screen and (max-width: 1670px) {
     >button.show-hide {
       right: 10px;
     }
   }
 }
+
+.mobile {
+  .app-view {
+    width: 100%;
+    height: calc(100% - v-bind('navBarHeight'));
+    position: relative;
+    &.higher {
+      height: 100%;
+    }
+    >.fade-in-mask {
+      z-index: 2005;
+    }
+    >#unity-container {
+      position: absolute;
+      width: 100%;
+      height: 100%;
+      >#unity-canvas {
+        height: 100%;
+        width: 100%;
+        background: #231F20;
+      }
+    }
+
+    >nav {
+      position: fixed;
+      left: 0;
+      width: 100%;
+      height: v-bind('navBarHeight');
+      border-radius: 5px 5px 0 0;
+      border-top: rgba(210, 189, 132, 0.7);
+      box-shadow: inset 0px 2px 2px 0px rgba(210,189,132,0.45), 0px -9px 24px 0px rgba(183,162,109,0.25);
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      transition: all 0.5s;
+      // backdrop-filter: blur(10px);
+      background-image: url(@/assets/images/bg-bottom-bar.jpg);
+      background-size: cover;
+      background-repeat: no-repeat;
+      background-position: center center;
+      // background-color: #0c0d12;
+      >button.tab-item {
+        font-size: calc(30 / 1080 * 83vh);
+        font-family: Source Han Sans CN-Regular, Source Han Sans CN;
+        font-weight: 400;
+        color: #FFFFFF;
+        margin-left: calc(200 / 1080 * 83vh);
+        opacity: 0.5;
+        position: relative;
+        user-select: none;
+        >img.decorator {
+          display: none;
+        }
+        &:first-of-type {
+          margin-left: initial;
+        }
+        &.active {
+          opacity: initial;
+          font-weight: bold;
+          >img.decorator {
+            display: none;
+            // display: initial;
+            // position: absolute;
+            // left: 50%;
+            // bottom: -calc(15 / 1080 * 83vh);
+            // transform: translateX(-50%);
+            // width: 150%;
+          }
+        }
+      }
+    }
+    >button.music-switch {
+      position: fixed;
+      right: calc((82 + (36 + 80) * 2) / 1080 * 83vh);
+      bottom: calc(28 / 1080 * 83vh);
+      width: calc(36 / 1080 * 83vh);
+      height: calc(36 / 1080 * 83vh);
+      background-size: cover;
+      background-repeat: no-repeat;
+      background-position: center center;
+    }
+    >button.info {
+      position: fixed;
+      right: calc((82 + (36 + 80) * 1) / 1080 * 83vh);
+      bottom: calc(28 / 1080 * 83vh);
+      width: calc(36 / 1080 * 83vh);
+      height: calc(36 / 1080 * 83vh);
+      background-size: cover;
+      background-repeat: no-repeat;
+      background-position: center center;
+    }
+    >button.show-hide {
+      position: fixed;
+      right: calc(82 / 1080 * 83vh);
+      bottom: calc(28 / 1080 * 83vh);
+      width: calc(36 / 1080 * 83vh);
+      height: calc(36 / 1080 * 83vh);
+      background-size: cover;
+      background-repeat: no-repeat;
+      background-position: center center;
+    }
+  }
+}
 </style>

+ 167 - 43
src/api.js

@@ -1,5 +1,5 @@
 import axios from "axios"
-import historyRawData from "@/assets/mock/history.json"
+import generalData from "@/assets/mock/general.json"
 
 // axios({
 //   method: 'post',
@@ -15,57 +15,181 @@ import historyRawData from "@/assets/mock/history.json"
 // })
 
 export default {
-  // getHistoryList({
-  //   pageNum = 0,
-  //   pageSize = 0,
-  //   searchKey = '',
-  //   stage = '',
-  // } = {}) {
-  //   return axios({
-  //     method: 'post',
-  //     url: `${process.env.VUE_APP_API_ORIGIN}/api/show/history/pageList`,
-  //     headers: {
-  //       "Content-Type": "application/json",
-  //     },
-  //     data: {
-  //       pageNum,
-  //       pageSize,
-  //       searchKey,
-  //       stage,
-  //     },
-  //   }).then((res) => {
-  //     return res.data.data.records
+  // getGeneralList() {
+  //   const listKeyNameCorrected = generalData.data.map((item) => {
+  //     const ret = {
+  //       id: item.id,
+  //       name: item.name,
+  //       createDay: item.createTime,
+  //       description: item.content,
+  //     }
+  //     return ret
   //   })
+  //   listKeyNameCorrected.sort((a, b) => {
+  //     return Date.parse(a.createDay.substring(0, 4)) - Date.parse(b.createDay.substring(0, 4))
+  //   })
+  //   return Promise.resolve(listKeyNameCorrected)
   // },
+  getSiteInfo() {
+    return axios({
+      method: 'get',
+      url: `${process.env.VUE_APP_API_ORIGIN}/api/show/site/getInfo`,
+      headers: {
+        "Content-Type": "application/json",
+      },
+    }).then((res) => {
+      return JSON.parse(res.data.data)
+    })
+  },
+  getGeneralList({
+    endTime = '',
+    pageNum = 0,
+    pageSize = 10000,
+    searchKey = '',
+    startTime = '',
+  } = {}) {
+    return axios({
+      method: 'post',
+      url: `${process.env.VUE_APP_API_ORIGIN}/api/show/company/pageList`,
+      headers: {
+        "Content-Type": "application/json",
+      },
+      data: {
+        endTime,
+        pageNum,
+        pageSize,
+        searchKey,
+        startTime,
+      },
+    }).then((res) => {
+      return res.data.data.records
+    })
+  },
+  getGeneralDetail(id) {
+    return axios({
+      method: 'get',
+      url: `${process.env.VUE_APP_API_ORIGIN}/api/show/company/detail/${id}`,
+      headers: {
+        "Content-Type": "application/json",
+      },
+    }).then((res) => {
+      return res.data.data
+    })
+  },
   getHistoryList({
     pageNum = 0,
-    pageSize = 0,
+    pageSize = 10000,
+    searchKey = '',
+    stage = '',
+  } = {}) {
+    return axios({
+      method: 'post',
+      url: `${process.env.VUE_APP_API_ORIGIN}/api/show/history/pageList`,
+      headers: {
+        "Content-Type": "application/json",
+      },
+      data: {
+        pageNum,
+        pageSize,
+        searchKey,
+        stage,
+      },
+    }).then((res) => {
+      return res.data.data.records
+    })
+  },
+  getHistoryDetail(id) {
+    return axios({
+      method: 'get',
+      url: `${process.env.VUE_APP_API_ORIGIN}/api/show/history/detail/${id}`,
+      headers: {
+        "Content-Type": "application/json",
+      },
+    }).then((res) => {
+      return res.data.data
+    })
+  },
+  getTreasureList({
+    pageNum = 0,
+    pageSize = 10000,
     searchKey = '',
     stage = '',
   } = {}) {
-    const ret = historyRawData['阶段任务信息'].find((item) => {
-      return item['所属阶段'] === stage
-    }).children.map((item) => {
-      return {
-        companyName: item['品牌'],
-        description: item['简介'],
-        id: item['序号'],
-        name: item['名称'],
+    return axios({
+      method: 'post',
+      url: `${process.env.VUE_APP_API_ORIGIN}/api/show/goods/pageList`,
+      headers: {
+        "Content-Type": "application/json",
+      },
+      data: {
+        pageNum,
+        pageSize,
+        searchKey,
         stage,
-        story: item['故事'],
       }
+    }).then((res) => {
+      return res.data.data.records
+    })
+  },
+  getTreasureDetail(id) {
+    return axios({
+      method: 'get',
+      url: `${process.env.VUE_APP_API_ORIGIN}/api/show/goods/detail/${id}`,
+      headers: {
+        "Content-Type": "application/json",
+      },
+      data: {}
+    }).then((res) => {
+      return res.data.data
+    })
+  },
+  reportTreasureVisit(id) {
+    return axios({
+      method: 'get',
+      url: `${process.env.VUE_APP_API_ORIGIN}/api/show/goods/addVisit/${id}`,
+      headers: {
+        "Content-Type": "application/json",
+      },
+      data: {}
+    }).then((res) => {
+    })
+  },
+  getMetaverseList({
+    endTime = "",
+    pageNum = 0,
+    pageSize = 10000,
+    searchKey = "",
+    startTime = "",
+  } = {}) {
+    return axios({
+      method: 'post',
+      url: `${process.env.VUE_APP_API_ORIGIN}/api/show/meta/pageList`,
+      headers: {
+        "Content-Type": "application/json",
+      },
+      data: {
+        endTime,
+        pageNum,
+        pageSize,
+        searchKey,
+        startTime,
+      }
+    }).then((res) => {
+      return res.data.data.records
+    })
+  },
+
+  // 获取元宇宙详情
+  getG4InfoApi(id) {
+    return axios({
+      method: 'get',
+      url: `${process.env.VUE_APP_API_ORIGIN}/api/show/meta/detail/${id}`,
+      headers: {
+        "Content-Type": "application/json",
+      },
+      data: {}
+    }).then((res) => {
+      return res.data.data
     })
-    return Promise.resolve(ret)
   },
-  // getHistoryDetail(id) {
-  //   return axios({
-  //     method: 'get',
-  //     url: `${process.env.VUE_APP_API_ORIGIN}/api/show/history/detail/${id}`,
-  //     headers: {
-  //       "Content-Type": "application/json",
-  //     },
-  //   }).then((res) => {
-  //     return res.data.data
-  //   })
-  // }
 }

BIN
src/assets/images/bg-bottom-bar.jpg


BIN
src/assets/images/bg-bottom-bar.png


BIN
src/assets/images/bg-person-card-fat.png


BIN
src/assets/images/bg-person-card-tall.png


BIN
src/assets/images/bidBack.png


BIN
src/assets/images/for-dev.jpg


BIN
src/assets/images/gear/表盘1_00000.png


BIN
src/assets/images/gear/表盘1_00001.png


BIN
src/assets/images/gear/表盘1_00002.png


BIN
src/assets/images/gear/表盘1_00003.png


BIN
src/assets/images/gear/表盘1_00004.png


BIN
src/assets/images/gear/表盘1_00005.png


BIN
src/assets/images/gear/表盘1_00006.png


BIN
src/assets/images/gear/表盘1_00007.png


BIN
src/assets/images/gear/表盘1_00008.png


BIN
src/assets/images/gear/表盘1_00009.png


BIN
src/assets/images/gear/表盘1_00010.png


BIN
src/assets/images/gear/表盘1_00011.png


BIN
src/assets/images/gear/表盘1_00012.png


BIN
src/assets/images/gear/表盘1_00013.png


BIN
src/assets/images/gear/表盘1_00014.png


BIN
src/assets/images/gear/表盘1_00015.png


BIN
src/assets/images/gear/表盘1_00016.png


BIN
src/assets/images/gear/表盘1_00017.png


BIN
src/assets/images/gear/表盘1_00018.png


BIN
src/assets/images/gear/表盘1_00019.png


BIN
src/assets/images/gear/表盘1_00020.png


BIN
src/assets/images/gear/表盘1_00021.png


BIN
src/assets/images/gear/表盘1_00022.png


BIN
src/assets/images/gear/表盘1_00023.png


BIN
src/assets/images/general-article-bg.png


BIN
src/assets/images/icon_info.png


BIN
src/assets/images/icon_music_2_off.png


BIN
src/assets/images/icon_music_2_on.png


BIN
src/assets/images/img-raw/Group@2x.png


BIN
src/assets/images/img-raw/bg@2x.png


BIN
src/assets/images/img-raw/bg_history@2x.png


BIN
src/assets/images/img-raw/btn_left_active@2x.png


BIN
src/assets/images/img-raw/btn_left_normal@2x.png


BIN
src/assets/images/img-raw/btn_right_active@2x.png


BIN
src/assets/images/img-raw/btn_right_normal@2x.png


BIN
src/assets/images/img-raw/btn_video@2x.png


BIN
src/assets/images/img-raw/circle_active@2x.png


BIN
src/assets/images/img-raw/circle_normal@2x.png


BIN
src/assets/images/img-raw/icon_account@2x.png


BIN
src/assets/images/img-raw/icon_active@2x.png


BIN
src/assets/images/img-raw/icon_cancel@2x.png


BIN
src/assets/images/img-raw/icon_down@2x.png


BIN
src/assets/images/img-raw/icon_download@2x.png


BIN
src/assets/images/img-raw/icon_fullscreen@2x.png


BIN
src/assets/images/img-raw/icon_left@2x.png


BIN
src/assets/images/img-raw/icon_password@2x.png


BIN
src/assets/images/img-raw/icon_right@2x.png


BIN
src/assets/images/img-raw/icon_screen@2x.png


BIN
src/assets/images/img-raw/icon_search@2x.png


BIN
src/assets/images/img-raw/icon_see@2x.png


BIN
src/assets/images/img-raw/icon_up@2x.png


BIN
src/assets/images/img-raw/labe_right@2x.png


BIN
src/assets/images/img-raw/label2@2x.png


BIN
src/assets/images/img-raw/label@2x.png


BIN
src/assets/images/img-raw/label_left@2x(1).png


BIN
src/assets/images/img-raw/label_left@2x.png


BIN
src/assets/images/img-raw/label_next@2x.png


BIN
src/assets/images/img-raw/label_pre@2x.png


BIN
src/assets/images/img-raw/label_right@2x.png


BIN
src/assets/images/img-raw/logo@2x(1).png


BIN
src/assets/images/img-raw/logo@2x.png


BIN
src/assets/images/img-raw/menu_active@2x.png


BIN
src/assets/images/img-raw/menu_img@2x.png


BIN
src/assets/images/img-raw/pop1@2x.png


BIN
src/assets/images/img-raw/pop_label@2x.png


BIN
src/assets/images/img-raw/title@2x.png


BIN
src/assets/images/img4dev/1.jpg


BIN
src/assets/images/img4dev/2.jpg


BIN
src/assets/images/img4dev/3.jpg


BIN
src/assets/images/img4dev/4.jpg


BIN
src/assets/images/img4dev/5.jpg


BIN
src/assets/images/imgErr.png


+ 0 - 0
src/assets/images/line_long.png


Неке датотеке нису приказане због велике количине промена