seeseele преди 1 седмица
ревизия
42312f4376
променени са 100 файла, в които са добавени 7448 реда и са изтрити 0 реда
  1. 30 0
      .gitignore
  2. 36 0
      README.en.md
  3. 37 0
      README.md
  4. 27 0
      index.html
  5. 8 0
      jsconfig.json
  6. 3120 0
      package-lock.json
  7. 24 0
      package.json
  8. BIN
      public/favicon.ico
  9. 10 0
      src/App.vue
  10. BIN
      src/assets/cover/NYYC201602.jpg
  11. 167 0
      src/assets/css/catalogue.css
  12. 27 0
      src/assets/css/global.css
  13. 168 0
      src/assets/css/organization.css
  14. 470 0
      src/assets/css/searchFunction.css
  15. BIN
      src/assets/img/archivesUnbound.png
  16. BIN
      src/assets/img/cloud.png
  17. BIN
      src/assets/img/directory.png
  18. BIN
      src/assets/img/directory_1.jpg
  19. BIN
      src/assets/img/directory_bg.jpg
  20. BIN
      src/assets/img/directory_bg_1.jpg
  21. BIN
      src/assets/img/directory_bg_horizontal.jpg
  22. BIN
      src/assets/img/directory_return_button.png
  23. BIN
      src/assets/img/forth_background.jpg
  24. BIN
      src/assets/img/information_1.jpg
  25. BIN
      src/assets/img/information_2.jpg
  26. BIN
      src/assets/img/information_3.jpg
  27. BIN
      src/assets/img/information_4.jpg
  28. BIN
      src/assets/img/library_1.jpg
  29. BIN
      src/assets/img/library_2.jpg
  30. BIN
      src/assets/img/library_3.jpg
  31. BIN
      src/assets/img/library_4.jpg
  32. BIN
      src/assets/img/library_5.jpg
  33. BIN
      src/assets/img/library_6.jpg
  34. BIN
      src/assets/img/library_7.jpg
  35. BIN
      src/assets/img/library_8.png
  36. BIN
      src/assets/img/list.png
  37. BIN
      src/assets/img/list_1.png
  38. BIN
      src/assets/img/list_return_button.png
  39. BIN
      src/assets/img/nan_yang_information.jpg
  40. BIN
      src/assets/img/nan_yang_question_research.jpg
  41. BIN
      src/assets/img/notice_button.png
  42. BIN
      src/assets/img/periodicals.png
  43. BIN
      src/assets/img/question_5.jpg
  44. BIN
      src/assets/img/question_6.jpg
  45. BIN
      src/assets/img/question_7.jpg
  46. BIN
      src/assets/img/question_8.jpg
  47. BIN
      src/assets/img/reading.jpg
  48. BIN
      src/assets/img/reading_1.jpg
  49. BIN
      src/assets/img/reading_2.jpg
  50. BIN
      src/assets/img/reading_button.png
  51. BIN
      src/assets/img/retrieval_bj.png
  52. BIN
      src/assets/img/review_button.png
  53. BIN
      src/assets/img/salon_button.png
  54. BIN
      src/assets/img/search_button.png
  55. BIN
      src/assets/img/selected.png
  56. BIN
      src/assets/img/study.png
  57. BIN
      src/assets/img/thesis.png
  58. BIN
      src/assets/img/东南亚大型特藏.png
  59. BIN
      src/assets/img/东南亚研究机构.png
  60. BIN
      src/assets/img/东南亚经济统计.png
  61. BIN
      src/assets/img/东南亚连续出版物.png
  62. BIN
      src/assets/img/东南亚重要参考文献汇编.png
  63. BIN
      src/assets/img/书目中的东南亚与华侨华人.png
  64. BIN
      src/assets/img/南洋真人馆沙龙.png
  65. BIN
      src/assets/img/未标题-2-33.png
  66. 150 0
      src/components/ExpansionField.vue
  67. 7 0
      src/http/config/index.js
  68. 65 0
      src/http/index.js
  69. 9 0
      src/http/pages/archivesUnbound.js
  70. 9 0
      src/http/pages/consultation.js
  71. 9 0
      src/http/pages/economy.js
  72. 10 0
      src/http/pages/information.js
  73. 10 0
      src/http/pages/institution.js
  74. 19 0
      src/http/pages/library.js
  75. 10 0
      src/http/pages/literature.js
  76. 9 0
      src/http/pages/publication.js
  77. 19 0
      src/http/pages/question.js
  78. 19 0
      src/http/pages/reading.js
  79. 11 0
      src/http/pages/regionDevelop.js
  80. 11 0
      src/http/pages/searchFunction.js
  81. 10 0
      src/http/pages/specialCollection.js
  82. 26 0
      src/main.js
  83. 272 0
      src/pages/archivesUnbound/index.vue
  84. 121 0
      src/pages/consultation/index.vue
  85. 120 0
      src/pages/consultation/subpages/organization.vue
  86. 123 0
      src/pages/consultation/subpages/placeOwnership.vue
  87. 121 0
      src/pages/economy/index.vue
  88. 120 0
      src/pages/economy/subpages/organization.vue
  89. 121 0
      src/pages/economy/subpages/placeOwnership.vue
  90. 215 0
      src/pages/home/index.vue
  91. 294 0
      src/pages/information/index.vue
  92. 125 0
      src/pages/information/subpages/show_articles.vue
  93. 118 0
      src/pages/institution/index.vue
  94. 120 0
      src/pages/institution/subpages/organization.vue
  95. 126 0
      src/pages/institution/subpages/placeOwnership.vue
  96. 358 0
      src/pages/library/index.vue
  97. 189 0
      src/pages/library/subpages/book_giveaway.vue
  98. 189 0
      src/pages/library/subpages/book_promote.vue
  99. 189 0
      src/pages/library/subpages/collection.vue
  100. 0 0
      src/pages/library/subpages/first.vue

+ 30 - 0
.gitignore

@@ -0,0 +1,30 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+coverage
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+*.tsbuildinfo

+ 36 - 0
README.en.md

@@ -0,0 +1,36 @@
+# new_xmg
+
+#### Description
+vue3版本厦门南洋数字图书馆
+
+#### Software Architecture
+Software architecture description
+
+#### Installation
+
+1.  xxxx
+2.  xxxx
+3.  xxxx
+
+#### Instructions
+
+1.  xxxx
+2.  xxxx
+3.  xxxx
+
+#### Contribution
+
+1.  Fork the repository
+2.  Create Feat_xxx branch
+3.  Commit your code
+4.  Create Pull Request
+
+
+#### Gitee Feature
+
+1.  You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
+2.  Gitee blog [blog.gitee.com](https://blog.gitee.com)
+3.  Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
+4.  The most valuable open source project [GVP](https://gitee.com/gvp)
+5.  The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
+6.  The most popular members  [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

+ 37 - 0
README.md

@@ -0,0 +1,37 @@
+# new_xmg
+
+#### 介绍
+vue3版本厦门南洋数字图书馆
+
+#### 软件架构
+软件架构说明
+
+
+#### 安装教程
+
+1.  xxxx
+2.  xxxx
+3.  xxxx
+
+#### 使用说明
+
+1.  xxxx
+2.  xxxx
+3.  xxxx
+
+#### 参与贡献
+
+1.  Fork 本仓库
+2.  新建 Feat_xxx 分支
+3.  提交代码
+4.  新建 Pull Request
+
+
+#### 特技
+
+1.  使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
+2.  Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
+3.  你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
+4.  [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
+5.  Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
+6.  Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

+ 27 - 0
index.html

@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+  <meta charset="UTF-8">
+  <link rel="icon" href="/favicon.ico">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <title>厦门大学南洋数字图书馆</title>
+  <style>
+    * {
+      padding: 0;
+      margin: 0;
+    }
+
+    #app {
+      width: 100%;
+      height: 100vh;
+    }
+  </style>
+</head>
+
+<body>
+  <div id="app"></div>
+  <script type="module" src="/src/main.js"></script>
+</body>
+
+</html>

+ 8 - 0
jsconfig.json

@@ -0,0 +1,8 @@
+{
+  "compilerOptions": {
+    "paths": {
+      "@/*": ["./src/*"]
+    }
+  },
+  "exclude": ["node_modules", "dist"]
+}

Файловите разлики са ограничени, защото са твърде много
+ 3120 - 0
package-lock.json


+ 24 - 0
package.json

@@ -0,0 +1,24 @@
+{
+  "name": "front-xmgff",
+  "version": "0.0.0",
+  "private": true,
+  "type": "module",
+  "scripts": {
+    "dev": "vite",
+    "build": "vite build",
+    "preview": "vite preview"
+  },
+  "dependencies": {
+    "axios": "^1.7.7",
+    "element-plus": "^2.8.4",
+    "pinia": "^2.2.4",
+    "pinia-plugin-persistedstate": "^4.1.1",
+    "vue": "^3.4.29",
+    "vue-router": "^4.3.3"
+  },
+  "devDependencies": {
+    "@vitejs/plugin-vue": "^5.0.5",
+    "fs-extra": "^11.3.0",
+    "vite": "^5.3.1"
+  }
+}

BIN
public/favicon.ico


+ 10 - 0
src/App.vue

@@ -0,0 +1,10 @@
+<script setup>
+import { RouterLink, RouterView } from 'vue-router'
+
+</script>
+
+<template>
+  <RouterView />
+</template>
+
+<style scoped></style>

BIN
src/assets/cover/NYYC201602.jpg


+ 167 - 0
src/assets/css/catalogue.css

@@ -0,0 +1,167 @@
+.box {
+    position: relative;
+    background-image: url("@/assets/img/retrieval_bj.png");
+    background-repeat: no-repeat;
+    background-size: cover;
+    background-position: center;
+    width: 100%;
+    height: 100%;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+
+.directory-container {
+    min-width: 300px;
+    width: calc(100% - 64px);
+    max-width: 500px;
+    height: 60%;
+    padding: 16px;
+    margin: 16px;
+    background-color: rgb(226, 210, 194, 0.7);
+    display: flex;
+    flex-direction: column;
+    border: 3px solid #7c4631;
+    border-radius: 24px;
+}
+
+.directory-container-top {
+    width: calc(100% - 16px);
+    margin: 16px 0 8px 0;
+    padding: 0 8px;
+    display: flex;
+    align-items: center;
+    justify-content: space-around;
+}
+
+.directory-container-top p {
+    color: rgb(69, 20, 3);
+    font-size: calc(1vw + 1vh + 2vmin);
+    font-weight: bolder;
+    white-space: nowrap;
+}
+
+.content-box {
+    flex: 1;
+    display: flex;
+    flex-direction: column;
+    /* display: grid;
+    grid-template-columns: repeat(3, 1fr);
+    align-content: flex-start;
+    column-gap: 4vw; */
+    row-gap: 1.5vh;
+    padding: 0 3vw;
+    overflow: auto;
+}
+
+.content-box-item {
+    padding: 8px 15px;
+    color: #f6e6d7;
+    background-color: #7a3e2a;
+    text-align: center;
+    font-size: calc(0.8vw + 0.8vh + 0.8vmin);
+    font-weight: bolder;
+    border-radius: 3vh;
+    cursor: pointer;
+}
+
+/* 滚动条样式 */
+.content-box::-webkit-scrollbar {
+    width: 6px;
+    height: 6px;
+    background-color: rgba(83, 83, 83, 0);
+}
+
+.content-box:hover::-webkit-scrollbar {
+    width: 6px;
+    height: 6px;
+    background-color: rgb(0, 0, 0, 0);
+}
+
+.content-box:hover::-webkit-scrollbar-thumb {
+    background-color: rgb(144, 147, 153, 0.3);
+    border-radius: 8px;
+}
+
+.content-box:hover::-webkit-scrollbar-thumb:hover {
+    background-color: rgb(144, 147, 153, 0.5);
+    border-radius: 8px;
+}
+
+.introduction-title {
+    margin-left: 2vw;
+}
+
+.introduction-paragraph {
+    text-indent: 2em;
+    margin-left: 2vw;
+    margin-right: 2vw;
+    line-height: 2em;
+}
+
+.introduction-image {
+    text-align: center;
+}
+
+.item-row {
+    margin-top: 2vh;
+}
+
+.options-content {
+    position: relative;
+    top: 35vh;
+    height: 40vh;
+}
+
+p.article-title {
+    position: relative;
+    top: 4vh;
+    height: 1vh;
+    font-size: 1.25rem;
+    color: #f6e6d7;
+    font-weight: bolder;
+}
+
+.return-button {
+    position: absolute;
+    top: 0;
+    right: 0;
+    width: 118px;
+    height: 50px;
+    background-image: url('@/assets/img/list_return_button.png');
+    background-repeat: no-repeat;
+    background-size: cover;
+    background-position: center;
+    z-index: 100;
+    cursor: pointer;
+}
+
+@media screen and (max-width: 1000px) {
+    .content-box-item {
+        font-size: calc(1vw + 1vh + 1.5vmin);
+    }
+
+    .introductionVisible {
+        width: 100%;
+    }
+}
+
+@media screen and (orientation: landscape) {
+    .el-col-8 {
+        left: 40%;
+        max-width: 10%;
+    }
+}
+
+::v-deep .dialogHistoryVisible {
+    height: 80%;
+    max-height: 500px;
+    max-width: 900px;
+    display: flex;
+    flex-direction: column;
+}
+
+::v-deep .dialogHistoryVisible .el-dialog__body {
+    flex: 1;
+    overflow: auto;
+}

+ 27 - 0
src/assets/css/global.css

@@ -0,0 +1,27 @@
+html, body {
+    margin: 0px;
+    padding: 0px;
+    height: 100%;
+    width: 100%;
+}
+
+
+.introduction-title {
+    margin-left: 2vw;
+}
+
+.introduction-l2-title {
+    margin-left: 2vw;
+    margin-top: 3vh;
+}
+
+.introduction-paragraph {
+    text-indent: 2em;
+    margin-left: 2vw;
+    margin-right: 2vw;
+    line-height: 2em;
+}
+
+.introduction-image {
+    text-align: center;
+}

+ 168 - 0
src/assets/css/organization.css

@@ -0,0 +1,168 @@
+.box {
+    position: relative;
+    background-image: url("@/assets/img/retrieval_bj.png");
+    /* background-image: url("@/assets/img/list.png"); */
+    background-repeat: no-repeat;
+    background-size: cover;
+    background-position: center;
+    width: 100%;
+    height: 100%;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+}
+
+.directory-container {
+    width: calc(100% - 32px);
+    max-width: 1350px;
+    height: calc(100% - 128px);
+    max-height: 720px;
+    padding: 16px 16px;
+    margin: 0 16px;
+    background-color: rgb(226, 210, 194, 0.7);
+    display: flex;
+    flex-direction: column;
+    border: 3px solid #7c4631;
+    border-radius: 24px;
+}
+
+.box-content {
+    overflow: auto;
+}
+
+@media screen and (max-width: 500px) {
+    .box-content {
+        padding: 0 16px 0 0;
+    }
+}
+
+@media screen and (min-width: 1200px) {
+    .box-content {
+        padding: 0 48px;
+    }
+}
+
+.box-content::-webkit-scrollbar {
+    width: 6px;
+    height: 6px;
+    background-color: rgba(83, 83, 83, 0);
+}
+
+.box-content:hover::-webkit-scrollbar-thumb {
+    background-color: rgba(109, 111, 116, 0.3);
+    border-radius: 8px;
+}
+
+.box-content:hover::-webkit-scrollbar-thumb:hover {
+    background-color: rgb(144, 147, 153, 0.5);
+    border-radius: 8px;
+}
+
+.box-content-item {
+    position: relative;
+    padding: 8px 0px 0px 50px;
+    border-radius: 3px;
+    cursor: pointer;
+    overflow: hidden;
+    transition: ease 0.5s;
+}
+
+.box-content-item:hover {
+    background-color: #4212051a;
+    transition: ease 0.5s;
+}
+
+.box-content-item::before {
+    content: '';
+    position: absolute;
+    top: 50%;
+    left: -100%;
+    transform: translateY(-50%);
+    width: 50px;
+    height: 50px;
+    background-image: url("@/assets/img/selected.png");
+    background-repeat: no-repeat;
+    background-size: cover;
+    background-position: center;
+    transition: ease .5s;
+}
+
+.box-content-item:hover::before {
+    left: 0;
+    transition: ease 0.5s;
+}
+
+.title {
+    font-size: 2rem;
+    line-height: 4.5rem;
+    font-weight: bold;
+    color: #421205;
+    margin-left: 30px;
+    border-bottom: 2px solid rgba(66, 18, 5, 0.5);
+    letter-spacing: 0.25rem;
+}
+
+.title-subtitle {
+    font-size: 1rem;
+    line-height: 2rem;
+    font-weight: bold;
+    color: #421205;
+    margin-left: 30px;
+    border-bottom: 2px solid rgba(66, 18, 5, 0.5);
+    letter-spacing: 0.25rem;
+}
+
+.return-button {
+    position: absolute;
+    top: 0;
+    right: 0;
+    width: 118px;
+    height: 50px;
+    background-image: url('@/assets/img/list_return_button.png');
+    background-repeat: no-repeat;
+    background-size: cover;
+    background-position: center;
+    z-index: 100;
+    cursor: pointer;
+}
+
+::v-deep .dialogHistoryVisible {
+    height: 80%;
+    max-height: 500px;
+    max-width: 900px;
+    display: flex;
+    flex-direction: column;
+}
+
+::v-deep .dialogHistoryVisible .el-dialog__body {
+    flex: 1;
+    overflow: auto;
+}
+
+.introduction-title,
+.introduction-subtitle,
+.introduction-paragraph {
+    text-align: justify;
+}
+
+.introduction-subtitle {
+    font-size: 12px;
+    border-bottom: 1px solid rgba(66, 18, 5, 0.5);
+}
+
+.introduction-paragraph {
+    margin: 16px 0;
+    font-size: 15px;
+}
+
+@media screen and (max-width: 1200px) {
+    .title {
+        font-size: 1rem;
+        line-height: 2.5rem;
+    }
+
+    .title-subtitle {
+        font-size: 0.7rem;
+        line-height: 1rem;
+    }
+}

+ 470 - 0
src/assets/css/searchFunction.css

@@ -0,0 +1,470 @@
+/*** ***********************
+*
+* 检索功能PC端页面样式 
+*
+********************** ***/
+
+.box {
+    width: 100%;
+    height: 100vh;
+    background-image: url("@/assets/img/retrieval_bj.png");
+    background-repeat: no-repeat;
+    background-size: cover;
+    background-position: center;
+    display: flex;
+    flex-direction: column;
+    overflow: auto;
+}
+
+.box-top {
+    padding: 0px 25px 16px 25px;
+    width: 100%;
+    max-width: 1200px;
+    height: auto;
+    margin: 16px auto;
+    display: flex;
+    flex-direction: row;
+    transition: height 0.5s ease-in-out;
+}
+
+.input_box {
+    position: relative;
+    flex: 1;
+    min-width: 710px;
+    width: 100%;
+    height: auto;
+    display: flex;
+    flex-direction: column;
+    border-radius: 3px;
+}
+
+/* 移动端 */
+@media screen and (max-width: 760px) {
+    .input-box-content {
+        flex: 1;
+        padding: 0px 0px 48px 0px;
+        overflow: hidden;
+        display: flex;
+        flex-direction: column;
+        justify-content: center;
+        border: none;
+        /* box-shadow: 0px 0px 0px #cdcdcd; */
+        transition: all 0.5s ease-in-out;
+    }
+
+    .Displays-earch-box {
+        height: 100%;
+        margin: 0 auto;
+        max-width: 1200px;
+        padding: 0px;
+        overflow: hidden;
+        display: flex;
+        flex-direction: row;
+        justify-content: space-between;
+        transition: all 0.5s ease-in-out;
+    }
+}
+
+/* PC端 */
+@media screen and (min-width: 760px) {
+    .input-box-content {
+        flex: 1;
+        padding: 48px;
+        overflow: hidden;
+        display: flex;
+        flex-direction: column;
+        justify-content: center;
+        /* border: 1px solid #e4e4e4; */
+        /* box-shadow: 0 5px 5px #cdcdcd; */
+        transition: all 0.5s ease-in-out;
+    }
+
+    .Displays-earch-box {
+        height: 100%;
+        margin: 8px auto;
+        max-width: 1200px;
+        padding: 4px;
+        overflow: hidden;
+        display: flex;
+        flex-direction: row;
+        justify-content: space-between;
+        transition: all 0.5s ease-in-out;
+    }
+}
+
+.folded-state-input-item {
+    min-width: 710px;
+    width: 100%;
+    max-width: 1168px;
+    height: 32px;
+    margin: 0px 4px;
+    padding: 16px 12px;
+    display: flex;
+    box-shadow: 0px 0px 6px rgb(147 147 147);
+}
+
+.input-item,
+.inpout-AddOrDel {
+    width: 100%;
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+}
+
+.input-item {
+    width: 100%;
+    max-width: 860px;
+    margin: 8px 0px;
+}
+
+.input-item-query_concat {
+    width: 115px;
+    margin-right: 8px;
+}
+
+.input-box-content .input-item-select {
+    max-width: 700px;
+    background-color: #7a3e2a;
+}
+
+.inpout-AddOrDel {
+    width: 57px;
+    display: flex;
+    margin-left: 8px;
+}
+
+.inpout-AddOrDel span {
+    flex: 1;
+}
+
+.inpout-btn {
+    margin: 0px 3px;
+}
+
+.text-hint-box {
+    transition: all 0.5s ease-in-out;
+}
+
+/* 移动端 */
+@media screen and (max-width: 760px) {
+    .search-condition {
+        width: 80px;
+        background-color: rgb(0, 0, 0, 0);
+    }
+
+    .text-hint-box {
+        width: 0px;
+        max-width: 278px;
+        padding: 0px;
+        margin-left: 0px;
+        display: flex;
+        flex-direction: column;
+        border-radius: 3px;
+        border: none;
+        /* box-shadow: 0px 0px 0px #cdcdcd; */
+        overflow: hidden;
+    }
+}
+
+/* PC端 */
+@media screen and (min-width: 760px) {
+    .search-condition {
+        width: 110px;
+        background-color: rgb(0, 0, 0, 0);
+    }
+
+    .text-hint-box {
+        width: 100%;
+        max-width: 278px;
+        padding: 16px 0px 16px 16px;
+        margin-left: 16px;
+        display: flex;
+        flex-direction: column;
+        border-radius: 3px;
+        /* border: 1px solid #e4e4e4;
+        box-shadow: 0 5px 5px #cdcdcd; */
+    }
+}
+
+.text-hint-box-content {
+    flex: 1 1 1px;
+    max-width: 270px;
+    overflow: auto;
+    padding-right: 12px;
+}
+
+.text-hint-box-content::-webkit-scrollbar {
+    width: 6px;
+    height: 6px;
+    background-color: rgba(83, 83, 83, 0);
+}
+
+.text-hint-box-content:hover::-webkit-scrollbar-thumb {
+    background-color: rgb(144, 147, 153, 0.3);
+    border-radius: 8px;
+}
+
+.text-hint-box-content:hover::-webkit-scrollbar-thumb:hover {
+    background-color: rgb(144, 147, 153, 0.5);
+    border-radius: 8px;
+}
+
+.text-hint-box-content-title {
+    position: sticky;
+    top: 0;
+    padding: 8px 8px 8px 0;
+    font-size: 15px;
+    font-weight: 600;
+    color: #f6c5ad;
+    background-color: #7a3e2a;
+    /* border-bottom: 2px solid #7a3e2a; */
+}
+
+.text-hint-box-content p {
+    margin: 8px 0px;
+    color: #efdfcf;
+    font-size: 12px;
+    line-height: 24px;
+}
+
+.time-horizon-box {
+    margin-top: 10px;
+    margin-right: 8px;
+    display: flex;
+    align-items: center;
+}
+
+.time-horizon-box-title {
+    width: 100px;
+    color: #f6c5ad;
+    font-size: 12px;
+    font-weight: 600;
+    text-align: right;
+}
+
+.up-time-title {
+    max-width: 200px;
+    margin: 5px;
+    margin-left: 20px
+}
+
+.input-item-btn-box {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+
+.input-item-field-box {
+    position: absolute;
+    left: 50%;
+    bottom: 0;
+    transform: translate3d(-50%, 0, 0px);
+    display: flex;
+    justify-content: center;
+    align-items: center;
+}
+
+.input-item-field-box-item {
+    width: 30px;
+    height: 30px;
+    border-radius: 50%
+}
+
+.box-center,
+.language-base {
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+    background-color: #0f5de5;
+}
+
+.box-center {
+    flex: 1;
+    width: 100%;
+    max-width: 1200px;
+    margin: 16px auto;
+    display: flex;
+    flex-direction: column;
+}
+
+.box-center-table {
+    flex: 1;
+    width: 100%;
+    display: flex;
+    flex-direction: column;
+}
+
+.language-base {
+    color: rgb(255, 255, 255);
+    margin: 0px 32px;
+}
+
+.box-center-language {
+    margin-left: 64px;
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    align-items: center;
+}
+
+.box-center-language a {
+    margin: 6px
+}
+
+.demo-pagination-block {
+    margin: 6px 0px;
+    display: flex;
+    justify-content: center;
+}
+
+.box-center-wrap {
+    flex: 1;
+    width: 100%;
+    max-width: 1200px;
+    margin: 16px auto;
+    display: flex;
+    flex-direction: column;
+}
+
+.box-footer {
+    display: flex;
+    flex-direction: row;
+    justify-content: center;
+}
+
+/* 组件内部样式 */
+::v-deep .el-collapse {
+    position: relative;
+}
+
+::v-deep .hideContent {
+    border: none;
+    box-shadow: none;
+}
+
+::v-deep .el-select__selection {
+    text-align: center;
+}
+
+::v-deep .el-table th .cell {
+    text-align: center;
+}
+
+::v-deep .el-table__inner-wrapper {
+    flex: 1;
+    display: flex;
+    flex-direction: column;
+}
+
+::v-deep .el-table__body-wrapper {
+    flex: 1 1 1px;
+    overflow: auto;
+}
+
+::v-deep .box-center thead .el-table__cell {
+    background-color: #f2f2f2;
+}
+
+::v-deep .el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell {
+    background-color: #f6f8fa;
+}
+
+::v-deep .el-select__placeholder {
+    color: #f6c5ad;
+    text-overflow: clip;
+}
+
+::v-deep .el-pagination {
+    overflow: auto;
+}
+
+::v-deep .el-collapse {
+    border-bottom: none;
+}
+
+::v-deep .el-collapse-item__wrap {
+    border-bottom: none;
+    background-color: rgb(0, 0, 0, 0);
+}
+
+::v-deep .el-select__wrapper {
+    box-shadow: none;
+    background-color: #7a3e2a;
+}
+
+::v-deep .el-input-group__prepend {
+    background-color: rgb(0, 0, 0, 0);
+}
+
+::v-deep .el-collapse-item__header {
+    background-color: #7a3e2a;
+    box-shadow: none;
+}
+
+::v-deep .el-button {
+    color: #f6c5ad;
+    background-color: #7a3e2a;
+    border: none;
+}
+
+::v-deep .el-input-group--append .el-input-group__append .el-select .el-select__wrapper,
+::v-deep .el-input-group--prepend .el-input-group__prepend .el-select .el-select__wrapper {
+    background-color: #7a3e2a;
+    border-radius: 0;
+    box-shadow: none;
+}
+
+::v-deep svg {
+    cursor: pointer;
+}
+
+::v-deep svg path {
+    fill: #f6c5ad;
+}
+
+::v-deep .el-input__inner::placeholder,
+::v-deep .el-input__inner {
+    color: #efdfcf;
+}
+
+::v-deep .el-input__wrapper {
+    background-color: #ab7356;
+    box-shadow: none;
+}
+
+::v-deep .el-input__wrapper.is-focus {
+    box-shadow: 0 0 0 1px #7a3e2a;
+}
+
+::v-deep .box-center thead .el-table__cell {
+    background-color: #7a3e2a;
+    border: none;
+}
+
+::v-deep .el-pagination .btn-prev,
+::v-deep .el-pagination .btn-next,
+::v-deep .el-pagination__editor .el-input__wrapper {
+    background-color: #7a3e2a;
+}
+
+::v-deep .el-table thead,
+::v-deep .el-pagination__goto,
+::v-deep .el-pagination__classifier,
+::v-deep .el-pagination .el-input__inner {
+    color: #f6c5ad !important;
+}
+
+::v-deep .el-pagination__sizes,
+::v-deep .el-pagination__total {
+    color: #f6c5ad !important;
+}
+
+/* 移动端 */
+@media screen and (max-width: 760px) {
+    ::v-deep .el-table__body-wrapper {
+        min-height: 500px;
+    }
+}
+
+/* PC端 */
+@media screen and (min-width: 760px) {}

BIN
src/assets/img/archivesUnbound.png


BIN
src/assets/img/cloud.png


BIN
src/assets/img/directory.png


BIN
src/assets/img/directory_1.jpg


BIN
src/assets/img/directory_bg.jpg


BIN
src/assets/img/directory_bg_1.jpg


BIN
src/assets/img/directory_bg_horizontal.jpg


BIN
src/assets/img/directory_return_button.png


BIN
src/assets/img/forth_background.jpg


BIN
src/assets/img/information_1.jpg


BIN
src/assets/img/information_2.jpg


BIN
src/assets/img/information_3.jpg


BIN
src/assets/img/information_4.jpg


BIN
src/assets/img/library_1.jpg


BIN
src/assets/img/library_2.jpg


BIN
src/assets/img/library_3.jpg


BIN
src/assets/img/library_4.jpg


BIN
src/assets/img/library_5.jpg


BIN
src/assets/img/library_6.jpg


BIN
src/assets/img/library_7.jpg


BIN
src/assets/img/library_8.png


BIN
src/assets/img/list.png


BIN
src/assets/img/list_1.png


BIN
src/assets/img/list_return_button.png


BIN
src/assets/img/nan_yang_information.jpg


BIN
src/assets/img/nan_yang_question_research.jpg


BIN
src/assets/img/notice_button.png


BIN
src/assets/img/periodicals.png


BIN
src/assets/img/question_5.jpg


BIN
src/assets/img/question_6.jpg


BIN
src/assets/img/question_7.jpg


BIN
src/assets/img/question_8.jpg


BIN
src/assets/img/reading.jpg


BIN
src/assets/img/reading_1.jpg


BIN
src/assets/img/reading_2.jpg


BIN
src/assets/img/reading_button.png


BIN
src/assets/img/retrieval_bj.png


BIN
src/assets/img/review_button.png


BIN
src/assets/img/salon_button.png


BIN
src/assets/img/search_button.png


BIN
src/assets/img/selected.png


BIN
src/assets/img/study.png


BIN
src/assets/img/thesis.png


BIN
src/assets/img/东南亚大型特藏.png


BIN
src/assets/img/东南亚研究机构.png


BIN
src/assets/img/东南亚经济统计.png


BIN
src/assets/img/东南亚连续出版物.png


BIN
src/assets/img/东南亚重要参考文献汇编.png


BIN
src/assets/img/书目中的东南亚与华侨华人.png


BIN
src/assets/img/南洋真人馆沙龙.png


BIN
src/assets/img/未标题-2-33.png


+ 150 - 0
src/components/ExpansionField.vue

@@ -0,0 +1,150 @@
+<!-- 头部缩栏组件 -->
+
+<template>
+    <el-collapse class="box-collapse" v-model="g_activeNames" @change="act_handleChange">
+        <el-collapse-item style="min-height: 150px;" name="SearchBox">
+            <!-- 显示时显示 -->
+            <slot name="ShowContent"></slot>
+        </el-collapse-item>
+
+        <!-- 隐藏时显示 -->
+        <div v-if="!g_state" class="hideContent">
+            <slot name="hideContent"></slot>
+        </div>
+    </el-collapse>
+</template>
+
+<script setup>
+/************************************************
+*                   引入文件                   *
+************************************************/
+import { ref, defineProps } from 'vue'
+
+
+
+
+/************************************************
+* 全局变量
+* 
+* 格式: g_ + 事件名     例如: getAppDataList
+************************************************/
+// 激活项
+const g_activeNames = ref(['SearchBox'])
+
+// 接收父组件传过来的值
+const g_props = defineProps({
+    handleChange: Function
+})
+
+// 状态
+const g_state = ref(true)
+
+
+/************************************************
+* 事件处理
+* 
+* 格式: act_ + 事件名     例如: act_addInputBox
+************************************************/
+
+// 面板切换
+const act_handleChange = (val) => {
+    setTimeout(() => {
+        g_state.value = !g_state.value;
+        g_activeNames.value = g_state.value ? ['SearchBox'] : [];
+    }, 100);
+}
+
+// 关闭面板
+const act_close = () => {
+    g_state.value = false;
+    g_activeNames.value = [];
+}
+
+// 暴露方法供父组件调用
+defineExpose({
+    act_close
+});
+
+
+</script>
+
+<style scoped>
+/* 移动端 */
+@media screen and (max-width: 760px),
+(max-height: 450px) {
+    .hideContent {
+        position: absolute;
+        top: 50%;
+        left: 50%;
+        transform: translate3d(-50%, -48%, 0);
+        width: 100%;
+        max-width: 1080px;
+        padding: 32px 0px 48px 0px;
+        display: flex;
+        flex-direction: column;
+        border: none;
+        box-shadow: 0px 0px 0px #cdcdcd;
+    }
+
+    ::v-deep .input-item-btn-box {
+        margin-top: 8px;
+    }
+}
+
+/* PC端 */
+@media screen and (min-width: 760px) and (min-height: 450px) {
+    .hideContent {
+        position: absolute;
+        top: 50%;
+        left: 50%;
+        transform: translate3d(-50%, -48%, 0);
+        width: 100%;
+        max-width: 1080px;
+        padding: 32px 60px 48px 60px;
+        display: flex;
+        flex-direction: row;
+        align-items: center;
+        border: 1px solid #e4e4e4;
+        box-shadow: 0 5px 5px #cdcdcd;
+    }
+}
+
+::v-deep .el-collapse-item,
+::v-deep .is-active,
+::v-deep .el-collapse {
+    position: relative;
+}
+
+::v-deep .el-collapse-item__wrap {
+    border-bottom: none;
+}
+
+::v-deep .el-collapse-item__content {
+    padding-bottom: 0px;
+}
+
+::v-deep .el-collapse-item__header {
+    position: absolute;
+    left: 50%;
+    bottom: 0;
+    transform: translate3d(-50%, 0, 0);
+    width: 30px;
+    height: 30px;
+    background-color: #f9f9f9;
+    border-radius: 50%;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    z-index: 99;
+    box-shadow: 0px 0px 15px rgb(163 163 163);
+}
+
+::v-deep .el-collapse-item__header .el-collapse-item__arrow {
+    margin: 0px;
+    transform: rotate(90deg);
+}
+
+::v-deep .el-collapse-item__header .el-collapse-item__arrow.is-active {
+    transform: rotate(-90deg);
+}
+</style>

+ 7 - 0
src/http/config/index.js

@@ -0,0 +1,7 @@
+const serverConfig = {
+    baseURL: "https://seaelibrary.xmu.edu.cn/prod-api", // 后端地址
+    useTokenAuthorization: false, // 是否开启 token 认证
+    nginxURL: "http://106.55.102.172:40", // nginx 地址
+};
+
+export default serverConfig;

+ 65 - 0
src/http/index.js

@@ -0,0 +1,65 @@
+import axios from "axios";
+import serverConfig from "./config";
+
+
+// 创建axios请求实例
+const serviceAxios = axios.create({
+    baseURL: serverConfig.baseURL, // 基础请求地址
+    timeout: 10000, // 请求超时设置
+    withCredentials: false, // 跨域请求是否需要携带 cookie
+});
+
+// 创建请求拦截
+serviceAxios.interceptors.request.use(
+    (config) => {
+        // 如果开启 token 认证
+        if (serverConfig.useTokenAuthorization) {
+            config.headers["Authorization"] = ""; // 请求头携带 token
+        }
+        // 设置请求头
+        if (!config.headers["content-type"]) {
+            // 如果没有设置请求头
+            if (config.method == "post") {
+                config.headers["content-type"] = "application/json"; // post 请求
+                config.data = JSON.stringify(config.data);
+            } else {
+                config.headers["content-type"] = "application/json"; // 默认类型
+            }
+        }
+        // console.log("请求配置", config);
+        return config;
+    },
+    (error) => {
+        return Promise.reject(error);
+    }
+);
+
+// 创建响应拦截
+serviceAxios.interceptors.response.use(
+    (res) => {
+        let data = res.data;
+
+        // token 是否过期
+        // if (data.code == 401 && serverConfig.useTokenAuthorization) {
+        //   // 清除token
+        //   // 跳转到登录页
+        //   const memUserStore = useUserStore();
+        //   memUserStore.clearProfile();
+        //   window.location.href = "/login";
+        // } else if (data.code == 500) {
+        //   // 错误提示
+        //   alert(data.msg);
+        //   return Promise.reject(data);
+        // }
+
+        // 代码块
+        return data;
+    },
+    (error) => {
+        // 错误抛出
+        return Promise.reject(error);
+        // 这边可以做一些全局的错误处理,比如提示错误等等
+    }
+);
+
+export default serviceAxios;

+ 9 - 0
src/http/pages/archivesUnbound.js

@@ -0,0 +1,9 @@
+import serviceAxios from "@/http/index";
+
+// Archives Unbound(Gale)
+export const getArchivesUnboundData = () => {
+    return serviceAxios({
+        url: `/vr/archivesUnbound/list`,
+        method: "get",
+    });
+};

+ 9 - 0
src/http/pages/consultation.js

@@ -0,0 +1,9 @@
+import serviceAxios from "@/http/index";
+
+//南洋资讯检索
+export const getConsultationData = () => {
+    return serviceAxios({
+        url: `/vr/consultation/list`,
+        method: "get",
+    });
+};

+ 9 - 0
src/http/pages/economy.js

@@ -0,0 +1,9 @@
+import serviceAxios from "@/http/index";
+
+//东南亚经济统计
+export const getEconomyData = () => {
+    return serviceAxios({
+        url: `/vr/economy/list`,
+        method: "get",
+    });
+};

+ 10 - 0
src/http/pages/information.js

@@ -0,0 +1,10 @@
+import serviceAxios from "@/http/index";
+
+// 南洋资料译丛
+export const getInformationData = (data) => {
+    return serviceAxios({
+        url: `/system/studyNation/studyWithNation`,
+        method: "post",
+        data: data,
+    });
+};

+ 10 - 0
src/http/pages/institution.js

@@ -0,0 +1,10 @@
+import serviceAxios from "@/http/index";
+
+//东南亚研究机构
+export const getInstitutionData = (data) => {
+    return serviceAxios({
+        url: `/vr/institution/list`,
+        method: "get",
+        data: data,
+    });
+};

+ 19 - 0
src/http/pages/library.js

@@ -0,0 +1,19 @@
+import serviceAxios from "@/http/index";
+
+// 书目中的东南亚与华侨华人
+export const getInformationData = (data) => {
+    return serviceAxios({
+        url: `/system/studyNation/studyWithNation`,
+        method: "post",
+        data: data,
+    });
+};
+
+// book_promote、book_giveaway、new_bibliography页面获取数据
+export const getBooksDataList = (data) => {
+    return serviceAxios({
+        url: `/system/noteNation/reading`,
+        method: "post",
+        data: data,
+    });
+};

+ 10 - 0
src/http/pages/literature.js

@@ -0,0 +1,10 @@
+import serviceAxios from "@/http/index";
+
+//东南亚重要参考文献汇编
+export const getLiteratureData = (data) => {
+    return serviceAxios({
+        url: `/vr/literature/list`,
+        method: "get",
+        data: data,
+    });
+};

+ 9 - 0
src/http/pages/publication.js

@@ -0,0 +1,9 @@
+import serviceAxios from "@/http/index";
+
+// 东南亚连续出版物
+export const getPublicationData = () => {
+    return serviceAxios({
+        url: `/vr/publication/list`,
+        method: "get",
+    });
+};

+ 19 - 0
src/http/pages/question.js

@@ -0,0 +1,19 @@
+import serviceAxios from "@/http/index";
+
+// 南洋问题研究
+export const getInformationData = (data) => {
+    return serviceAxios({
+        url: `/system/study/getCatalog`,
+        method: "post",
+        data: data,
+    });
+};
+
+// show_articles页面数据
+export const getShowArticles = (data) => {
+    return serviceAxios({
+        url: `/system/study/studyWithoutNation`,
+        method: "post",
+        data: data,
+    });
+};

+ 19 - 0
src/http/pages/reading.js

@@ -0,0 +1,19 @@
+import serviceAxios from "@/http/index";
+
+// 南洋真人馆沙龙
+export const getInformationData = (data) => {
+    return serviceAxios({
+        url: `/system/noticeData/notice`,
+        method: "post",
+        data: data,
+    });
+};
+
+// 获取notice、review页面数据
+export const getPagesData = (data) => {
+    return serviceAxios({
+        url: `/system/data/reading`,
+        method: "post",
+        data: data,
+    });
+};

+ 11 - 0
src/http/pages/regionDevelop.js

@@ -0,0 +1,11 @@
+import serviceAxios from "@/http/index";
+
+
+// 东南亚地区发展报告
+export const getRegionDevelopData = (data) => {
+    return serviceAxios({
+        url: `/vr/regionDevelop/list`,
+        method: "get",
+        data: data,
+    });
+};

+ 11 - 0
src/http/pages/searchFunction.js

@@ -0,0 +1,11 @@
+import serviceAxios from "@/http/index";
+
+// 检索功能
+export const getAppDataList = (dataList) => {
+    return serviceAxios({
+      url: `/vr/search/SearchDatabases`,
+      method: "post",
+      data: dataList,
+    });
+  };
+  

+ 10 - 0
src/http/pages/specialCollection.js

@@ -0,0 +1,10 @@
+import serviceAxios from "@/http/index";
+
+//东南亚大型特藏
+export const getSpecialCollectionData = (data) => {
+    return serviceAxios({
+        url: `/vr/specialCollection/list`,
+        method: "get",
+        data: data,
+    });
+};

+ 26 - 0
src/main.js

@@ -0,0 +1,26 @@
+// 导入必要的模块和库
+import { createApp } from "vue";
+
+// 导入 Pinia 状态管理库
+import pinia from "./store/index";
+
+// 导入 ElementPlus 及其 CSS
+import ElementPlus from "element-plus";
+import "element-plus/dist/index.css";
+
+// 导入 ElementPlus 的中文语言包
+import zhCn from "element-plus/es/locale/lang/zh-cn";
+
+// 导入主应用组件和路由配置
+import App from "./App.vue";
+import router from "./router";
+
+// 创建一个新的 Vue 应用实例
+const app = createApp(App);
+
+app.use(ElementPlus, { locale: zhCn }); // 使用 ElementPlus
+app.use(router); // 使用路由
+app.use(pinia); // 使用 Pinia 状态管理
+
+// 挂载应用到具有 id 'app' 的 HTML 元素上
+app.mount("#app");

Файловите разлики са ограничени, защото са твърде много
+ 272 - 0
src/pages/archivesUnbound/index.vue


Файловите разлики са ограничени, защото са твърде много
+ 121 - 0
src/pages/consultation/index.vue


Файловите разлики са ограничени, защото са твърде много
+ 120 - 0
src/pages/consultation/subpages/organization.vue


Файловите разлики са ограничени, защото са твърде много
+ 123 - 0
src/pages/consultation/subpages/placeOwnership.vue


Файловите разлики са ограничени, защото са твърде много
+ 121 - 0
src/pages/economy/index.vue


Файловите разлики са ограничени, защото са твърде много
+ 120 - 0
src/pages/economy/subpages/organization.vue


Файловите разлики са ограничени, защото са твърде много
+ 121 - 0
src/pages/economy/subpages/placeOwnership.vue


+ 215 - 0
src/pages/home/index.vue

@@ -0,0 +1,215 @@
+<template>
+    <div class="box" :style="g_imgUrl">
+        <el-button color="#7a3e2a" @click="act_backToGround" class="return-button">返回展厅</el-button>
+        <img class="start-button" src="@/assets/img/reading_button.png" @click="act_redirectTo">
+    </div>
+</template>
+
+<script setup>
+/************************************************
+ *                   引入文件                   *
+ ************************************************/
+import { ref, onMounted } from "vue";
+import { useRouter, useRoute } from "vue-router";
+import { require_ } from "@/utils/require";
+
+
+/************************************************
+ * 全局变量
+ *
+ * 格式: g_ + 事件名     例如: g_route
+ ************************************************/
+const g_route = useRoute();
+const g_useRouter = useRouter();
+// 首页标识
+const g_homePage = ref("");
+// 背景图地址
+const g_imgUrl = ref('');
+// 返回展厅地址
+const g_exhibitionHallAddress = ref('');
+// 首页标识映射
+const g_homePageMap = {
+    // 南洋资料译丛
+    information: {
+        bgImgUrl: require_("@/assets/img/nan_yang_information.jpg"),
+        path: "/information",
+        exhibitionHallAddress: "https://www.720yun.com/vr/faej5peuOw2?s=18065722"
+    },
+    // 书目中的东南亚与华侨华人
+    library: {
+        bgImgUrl: require_("@/assets/img/forth_background.jpg"),
+        path: "/library",
+        exhibitionHallAddress: "https://www.720yun.com/vr/faej5peuOw2?s=18065722"
+    },
+    // 南洋问题研究
+    question: {
+        bgImgUrl: require_("@/assets/img/nan_yang_question_research.jpg"),
+        path: "/question",
+        exhibitionHallAddress: "https://www.720yun.com/vr/faej5peuOw2?s=18065722"
+    },
+    // 南洋真人馆沙龙
+    reading: {
+        bgImgUrl: require_("@/assets/img/reading.jpg"),
+        path: "/reading",
+        exhibitionHallAddress: "https://www.720yun.com/vr/faej5peuOw2?s=18065722"
+    },
+    // archivesUnbound
+    archivesUnbound: {
+        bgImgUrl: require_("@/assets/img/archivesUnbound.png"),
+        path: "/archivesUnbound",
+        exhibitionHallAddress: "https://www.720yun.com/vr/faej5peuOw2?s=18065729"
+    },
+    // 博雅集3-1东南亚重要参考文献汇编
+    literature: {
+        bgImgUrl: require_("@/assets/img/东南亚重要参考文献汇编.png"),
+        path: "/literature",
+        exhibitionHallAddress: "https://www.720yun.com/vr/faej5peuOw2?s=18065729"
+    },
+    // 博雅集3-3.1南洋资讯检索
+    consultation: {
+        bgImgUrl: require_("@/assets/img/南洋真人馆沙龙.png"),
+        path: "/consultation",
+        exhibitionHallAddress: "https://www.720yun.com/vr/faej5peuOw2?s=18065728"
+    },
+    // 博雅集3-3.2东南亚经济统计
+    economy: {
+        bgImgUrl: require_("@/assets/img/东南亚经济统计.png"),
+        path: "/economy",
+        exhibitionHallAddress: "https://www.720yun.com/vr/faej5peuOw2?s=18065728"
+    },
+    // 博雅集2-1东南亚大型特藏
+    specialCollection: {
+        bgImgUrl: require_("@/assets/img/东南亚大型特藏.png"),
+        path: "/specialCollection",
+        exhibitionHallAddress: "https://www.720yun.com/vr/faej5peuOw2?s=18065726"
+    },
+    // 博雅集2-2东南亚连续出版物
+    publication: {
+        bgImgUrl: require_("@/assets/img/东南亚连续出版物.png"),
+        path: "/publication",
+        exhibitionHallAddress: "https://www.720yun.com/vr/faej5peuOw2?s=18065726"
+    },
+    // 博雅集1 东南亚研究机构
+    institution: {
+        bgImgUrl: require_("@/assets/img/东南亚研究机构.png"),
+        path: "/institution",
+        exhibitionHallAddress: "https://www.720yun.com/vr/faej5peuOw2?s=18065726"
+    },
+    // 东南亚地区发展报告
+    regionDevelop: {
+        bgImgUrl: require_("@/assets/img/东南亚研究机构.png"),
+        path: "/regionDevelop",
+        exhibitionHallAddress: "https://www.720yun.com/vr/faej5peuOw2?s=18065726"
+    },
+    // 期刊检索功能
+    periodicals: {
+        bgImgUrl: require_("@/assets/img/study.png"),
+        path: "/periodicals",
+        exhibitionHallAddress: "https://www.720yun.com/vr/faej5peuOw2?s=18065722"
+    },
+    // 研究检索功能
+    study: {
+        bgImgUrl: require_("@/assets/img/书目中的东南亚与华侨华人.png"),
+        path: "/study",
+        exhibitionHallAddress: "https://www.720yun.com/vr/faej5peuOw2?s=18065722"
+    },
+    // 论文检索功能
+    thesis: {
+        bgImgUrl: require_("@/assets/img/thesis.png"),
+        path: "/thesis",
+        exhibitionHallAddress: "https://www.720yun.com/vr/faej5peuOw2?s=18065722"
+    },
+}
+
+
+/************************************************
+ * 生命周期函数
+ ************************************************/
+// 挂载完成
+onMounted(() => {
+    act_resolvingIdentity();
+    act_upBgImg();
+    act_upExhibitionHallAddress();
+});
+
+
+/************************************************
+ * 事件处理
+ *
+ * 格式: act_ + 事件名     例如: act_resolvingIdentity
+ ************************************************/
+// 解析首页标识
+const act_resolvingIdentity = () => {
+    g_homePage.value = g_route.query.type;
+    if (!g_homePage.value) {
+        g_homePage.value = "information";
+        g_useRouter.push({ path: "/home", query: { type: "information" } })
+    }
+}
+
+// 修改背景图
+const act_upBgImg = () => {
+    const imgUrl = g_homePageMap[g_homePage.value].bgImgUrl;
+    if (imgUrl) {
+        g_imgUrl.value = `background-image:url('${imgUrl}')`;
+    }
+}
+
+// 修改展厅地址
+const act_upExhibitionHallAddress = () => {
+    const exhibitionHallAddress = g_homePageMap[g_homePage.value].exhibitionHallAddress;
+    if (exhibitionHallAddress) {
+        g_exhibitionHallAddress.value = exhibitionHallAddress;
+    }
+}
+
+
+// 返回展厅
+const act_backToGround = () => {
+    window.location.href = g_exhibitionHallAddress.value;
+}
+
+// 点击进入内容页面
+const act_redirectTo = () => {
+    const path = g_homePageMap[g_homePage.value].path;
+    if (path) {
+        g_useRouter.push({ path });
+    }
+}
+</script>
+
+<style scoped>
+.box {
+    background-repeat: no-repeat;
+    background-size: cover;
+    background-position: center;
+    width: 100%;
+    height: 100%;
+}
+
+.return-button {
+    visibility: visible;
+    position: absolute;
+    top: 1%;
+    right: 1%;
+    z-index: 100;
+}
+
+.start-button {
+    position: absolute;
+    top: 55%;
+    left: 50%;
+    transform: translate(-50%, -50%) scale(1);
+    min-width: 300px;
+    width: calc(8vw + 8vh + 20vmin);
+    background-repeat: no-repeat;
+    background-size: cover;
+    background-position: center;
+    cursor: pointer;
+}
+
+.start-button:hover {
+    transform: translate(-50%, -50%) scale(0.9);
+    transition: cubic-bezier(0.175, 0.885, 0.32, 1.275) 0.3s;
+}
+</style>

Файловите разлики са ограничени, защото са твърде много
+ 294 - 0
src/pages/information/index.vue


+ 125 - 0
src/pages/information/subpages/show_articles.vue

@@ -0,0 +1,125 @@
+<style src="@/assets/css/organization.css" scoped></style>
+
+<template>
+    <div class="box">
+        <div class="return-button" @click="act_return"></div>
+
+        <div class="directory-container">
+            <div class="box-content">
+                <div class="box-content-item" v-for="item in g_dataList" :key="item.id" @click="act_showArticle(item)">
+                    <el-image :src="'https://seaelibrary.xmu.edu.cn/prod-api' + item.coverPath"
+                        style="width: 100%;"></el-image>
+                    <span v-if="item.title" class="title">
+                        {{ item.title }}
+                    </span>
+                    <br>
+                </div>
+            </div>
+        </div>
+
+        <el-dialog v-model="g_dialogTableVisible" width="80%" style="background-color: #e6e6e6;">
+            <el-image style="width: 100%; height: auto; padding-bottom: 1vh;" v-for="(article, aindex) in g_articlePath"
+                :key="aindex" :src="article" fit="contain" />
+        </el-dialog>
+    </div>
+</template>
+
+<script setup>
+/************************************************
+ *                   引入文件                   *
+ ************************************************/
+import { ref, onMounted } from "vue";
+import { useRouter, useRoute } from "vue-router";
+import { getInformationData } from "@/http/pages/information";
+
+
+/************************************************
+ * 全局变量
+ *
+ * 格式: g_ + 事件名     例如: g_route
+ ************************************************/
+const g_route = useRoute();
+const g_useRouter = useRouter();
+// 数据
+const g_dataList = ref([]);
+// 文章数据
+const g_articlePath = ref('');
+// 文章框
+const g_dialogTableVisible = ref(false);
+// 文章框高度
+const g_dialogTableHeight = ref(`${window.innerHeight * 0.7}px`);
+
+
+/************************************************
+ * 生命周期函数
+ ************************************************/
+// 挂载完成
+onMounted(() => {
+    get_dataList()
+});
+
+
+/************************************************
+ * 事件处理
+ *
+ * 格式: act_ + 事件名     例如: act_resolvingIdentity
+ ************************************************/
+// 返回
+const act_return = () => {
+    g_useRouter.go(-1);
+}
+
+// 显示文章
+const act_showArticle = (item) => {
+    g_articlePath.value = item.filePath;
+    g_dialogTableVisible.value = true;
+}
+
+/************************************************
+ * 获取数据
+ *
+ * 格式: get_ + 事件名     例如: get_dataList
+ ************************************************/
+const get_dataList = async () => {
+    const dataList = await getInformationData({
+        company_app_id: "3",
+        search_type: "2",
+        key: g_route.query.countryName
+    })
+
+    if (dataList.code == 200) {
+        dataList.data.forEach((item, index) => {
+            const tempFilePath = `https://seaelibrary.xmu.edu.cn/prod-api${item.filePath}`;
+            const filePathArray = [tempFilePath];
+            if (item.count > 1) {
+                let temp = tempFilePath.substring(0, tempFilePath.length - 6);
+                for (let j = 1; j < item.count; j++) {
+                    if (j < 10) {
+                        filePathArray.push(temp + '0' + j + '.png');
+                    } else {
+                        filePathArray.push(temp + j + '.png');
+                    }
+                }
+            }
+            item.filePath = [...new Set(filePathArray)];
+        })
+        g_dataList.value = dataList.data
+    }
+}
+</script>
+
+<style scoped>
+.box-content {
+    display: flex;
+    justify-content: center;
+    flex-wrap: wrap;
+    column-gap: 4vw;
+    row-gap: 1.5vh;
+}
+
+.box-content-item {
+    min-width: 200px;
+    width: 100%;
+    max-width: 20%;
+}
+</style>

Файловите разлики са ограничени, защото са твърде много
+ 118 - 0
src/pages/institution/index.vue


Файловите разлики са ограничени, защото са твърде много
+ 120 - 0
src/pages/institution/subpages/organization.vue


Файловите разлики са ограничени, защото са твърде много
+ 126 - 0
src/pages/institution/subpages/placeOwnership.vue


Файловите разлики са ограничени, защото са твърде много
+ 358 - 0
src/pages/library/index.vue


+ 189 - 0
src/pages/library/subpages/book_giveaway.vue

@@ -0,0 +1,189 @@
+<template>
+    <div class="box">
+        <el-image class="return-button" :src="require_('@/assets/img/list_return_button.png')" fit="cover"
+            @click="act_return"></el-image>
+
+        <el-row class="box-content">
+            <el-col :span="18" :offset="3" style="height: 100%;">
+                <el-scrollbar>
+                    <el-row v-for="item in bookPromoteDataList" :key="item.id">
+                        <el-col :span="23">
+                            <span class="title" @click="act_showArticle(item)">
+                                {{ item.title }}
+                            </span>
+                        </el-col>
+                    </el-row>
+                </el-scrollbar>
+            </el-col>
+        </el-row>
+
+        <el-dialog v-model="g_dialogTableVisible" width="80%" style="background-color: #e6e6e6;">
+            <el-image style="width: 100%; height: auto; padding-bottom: 1vh;" v-for="(article, aindex) in g_articlePath"
+                :key="aindex" :src="article" fit="contain" />
+        </el-dialog>
+    </div>
+</template>
+
+<script setup>
+/************************************************
+ *                   引入文件                   *
+ ************************************************/
+import { ref, onMounted } from "vue";
+import { useRouter, useRoute } from "vue-router";
+import { require_ } from "@/utils/require";
+import { getBooksDataList } from "@/http/pages/library";
+
+
+/************************************************
+ * 全局变量
+ *
+ * 格式: g_ + 事件名     例如: g_route
+ ************************************************/
+const g_useRouter = useRouter();
+// 介绍框
+const g_dialogTableVisible = ref(false);
+// 介绍框高度
+const g_introductionHeight = ref(`${window.innerHeight * 0.6}px`);
+// 书本数据
+const bookPromoteDataList = ref([]);
+// 文章路径
+const g_articlePath = ref([]);
+
+
+/************************************************
+ * 生命周期函数
+ ************************************************/
+onMounted(() => {
+    get_dataList();
+})
+
+/************************************************
+ * 事件处理
+ *
+ * 格式: act_ + 事件名     例如: act_resolvingIdentity
+ ************************************************/
+// 返回
+const act_return = () => {
+    g_useRouter.go(-1);
+}
+
+/**
+ * 显示文章
+ */
+const act_showArticle = (item) => {
+    g_introductionHeight.value = window.innerHeight * 0.7 + 'px';
+    g_articlePath.value = item.path;
+    g_dialogTableVisible.value = true;
+}
+
+
+/************************************************
+ * 获取数据
+ *
+ * 格式: get_ + 事件名     例如: get_dataList
+ ************************************************/
+// 获取数据
+const get_dataList = async () => {
+    const params = {
+        company_app_id: "3",
+        data_type: "6"
+    };
+    const dataList = await getBooksDataList(params);
+
+    if (dataList.code == 200) {
+        dataList.data.forEach((item, index) => {
+            const tempFilePath = `https://seaelibrary.xmu.edu.cn/prod-api${item.path}`;
+            const filePathArray = [tempFilePath];
+            if (item.count > 1) {
+                let temp = tempFilePath.substring(0, tempFilePath.length - 6);
+                for (let j = 1; j < item.count; j++) {
+                    if (j < 10) {
+                        filePathArray.push(temp + '0' + j + '.png');
+                    } else {
+                        filePathArray.push(temp + j + '.png');
+                    }
+                }
+            }
+            item.path = [...new Set(filePathArray)];
+        })
+        bookPromoteDataList.value = dataList.data
+    }
+}
+</script>
+
+<style scoped>
+.box {
+    background-image: url("@/assets/img/list.png");
+    background-repeat: no-repeat;
+    background-size: cover;
+    background-position: center;
+    width: 100%;
+    height: 100%;
+}
+
+
+.box-content {
+    height: 100%;
+    padding: 11vh 0;
+}
+
+.title {
+    font-size: 2rem;
+    line-height: 4.5rem;
+    font-weight: bold;
+    color: #421205;
+    margin-left: 30px;
+    border-bottom: 2px solid rgba(66, 18, 5, 0.5);
+    letter-spacing: 0.25rem;
+    cursor: pointer;
+}
+
+.title::before {
+    content: '';
+    position: absolute;
+    top: 50%;
+    left: -20px;
+    transform: translateY(-50%);
+    visibility: hidden;
+    width: 50px;
+    height: 50px;
+    background-image: url("@/assets/img/selected.png");
+    background-repeat: no-repeat;
+    background-size: cover;
+    background-position: center;
+    opacity: 0;
+    transition: all .3s;
+}
+
+.title:hover::before {
+    visibility: visible;
+    opacity: 1;
+    transition: all 0.3s;
+}
+
+.return-button {
+    visibility: visible;
+    position: absolute;
+    top: 8px;
+    right: 0;
+    background-repeat: no-repeat;
+    background-size: cover;
+    background-position: center;
+    min-width: 80px;
+    width: 8vw;
+    z-index: 100;
+}
+
+@media screen and (max-width: 1200px) {
+    .title {
+        font-size: 1rem;
+        line-height: 2.5rem;
+    }
+}
+
+@media screen and (orientation: portrait) {
+    .return-button {
+        width: 16vw;
+    }
+}
+</style>

+ 189 - 0
src/pages/library/subpages/book_promote.vue

@@ -0,0 +1,189 @@
+<template>
+    <div class="box">
+        <el-image class="return-button" :src="require_('@/assets/img/list_return_button.png')" fit="cover"
+            @click="act_return"></el-image>
+
+        <el-row class="box-content">
+            <el-col :span="18" :offset="3" style="height: 100%;">
+                <el-scrollbar>
+                    <el-row v-for="item in bookPromoteDataList" :key="item.id">
+                        <el-col :span="23">
+                            <span class="title" @click="act_showArticle(item)">
+                                {{ item.title }}
+                            </span>
+                        </el-col>
+                    </el-row>
+                </el-scrollbar>
+            </el-col>
+        </el-row>
+
+        <el-dialog v-model="g_dialogTableVisible" width="80%" style="background-color: #e6e6e6;">
+            <el-image style="width: 100%; height: auto; padding-bottom: 1vh;" v-for="(article, aindex) in g_articlePath"
+                :key="aindex" :src="article" fit="contain" />
+        </el-dialog>
+    </div>
+</template>
+
+<script setup>
+/************************************************
+ *                   引入文件                   *
+ ************************************************/
+import { ref, onMounted } from "vue";
+import { useRouter, useRoute } from "vue-router";
+import { require_ } from "@/utils/require";
+import { getBooksDataList } from "@/http/pages/library";
+
+
+/************************************************
+ * 全局变量
+ *
+ * 格式: g_ + 事件名     例如: g_route
+ ************************************************/
+const g_useRouter = useRouter();
+// 介绍框
+const g_dialogTableVisible = ref(false);
+// 介绍框高度
+const g_introductionHeight = ref(`${window.innerHeight * 0.6}px`);
+// 书本数据
+const bookPromoteDataList = ref([]);
+// 文章路径
+const g_articlePath = ref([]);
+
+
+/************************************************
+ * 生命周期函数
+ ************************************************/
+onMounted(() => {
+    get_dataList();
+})
+
+/************************************************
+ * 事件处理
+ *
+ * 格式: act_ + 事件名     例如: act_resolvingIdentity
+ ************************************************/
+// 返回
+const act_return = () => {
+    g_useRouter.go(-1);
+}
+
+/**
+ * 显示文章
+ */
+const act_showArticle = (item) => {
+    g_introductionHeight.value = window.innerHeight * 0.7 + 'px';
+    g_articlePath.value = item.path;
+    g_dialogTableVisible.value = true;
+}
+
+
+/************************************************
+ * 获取数据
+ *
+ * 格式: get_ + 事件名     例如: get_dataList
+ ************************************************/
+// 获取数据
+const get_dataList = async () => {
+    const params = {
+        company_app_id: "3",
+        data_type: "2"
+    };
+    const dataList = await getBooksDataList(params);
+
+    if (dataList.code == 200) {
+        dataList.data.forEach((item, index) => {
+            const tempFilePath = `https://seaelibrary.xmu.edu.cn/prod-api${item.path}`;
+            const filePathArray = [tempFilePath];
+            if (item.count > 1) {
+                let temp = tempFilePath.substring(0, tempFilePath.length - 6);
+                for (let j = 1; j < item.count; j++) {
+                    if (j < 10) {
+                        filePathArray.push(temp + '0' + j + '.png');
+                    } else {
+                        filePathArray.push(temp + j + '.png');
+                    }
+                }
+            }
+            item.path = [...new Set(filePathArray)];
+        })
+        bookPromoteDataList.value = dataList.data
+    }
+}
+</script>
+
+<style scoped>
+.box {
+    background-image: url("@/assets/img/list.png");
+    background-repeat: no-repeat;
+    background-size: cover;
+    background-position: center;
+    width: 100%;
+    height: 100%;
+}
+
+
+.box-content {
+    height: 100%;
+    padding: 11vh 0;
+}
+
+.title {
+    font-size: 2rem;
+    line-height: 4.5rem;
+    font-weight: bold;
+    color: #421205;
+    margin-left: 30px;
+    border-bottom: 2px solid rgba(66, 18, 5, 0.5);
+    letter-spacing: 0.25rem;
+    cursor: pointer;
+}
+
+.title::before {
+    content: '';
+    position: absolute;
+    top: 50%;
+    left: -20px;
+    transform: translateY(-50%);
+    visibility: hidden;
+    width: 50px;
+    height: 50px;
+    background-image: url("@/assets/img/selected.png");
+    background-repeat: no-repeat;
+    background-size: cover;
+    background-position: center;
+    opacity: 0;
+    transition: all .3s;
+}
+
+.title:hover::before {
+    visibility: visible;
+    opacity: 1;
+    transition: all 0.3s;
+}
+
+.return-button {
+    visibility: visible;
+    position: absolute;
+    top: 8px;
+    right: 0;
+    background-repeat: no-repeat;
+    background-size: cover;
+    background-position: center;
+    min-width: 80px;
+    width: 8vw;
+    z-index: 100;
+}
+
+@media screen and (max-width: 1200px) {
+    .title {
+        font-size: 1rem;
+        line-height: 2.5rem;
+    }
+}
+
+@media screen and (orientation: portrait) {
+    .return-button {
+        width: 16vw;
+    }
+}
+</style>

+ 189 - 0
src/pages/library/subpages/collection.vue

@@ -0,0 +1,189 @@
+<template>
+    <div class="box">
+        <el-image class="return-button" :src="require_('@/assets/img/list_return_button.png')" fit="cover"
+            @click="act_return"></el-image>
+
+        <el-row class="box-content">
+            <el-col :span="18" :offset="3" style="height: 100%;">
+                <el-scrollbar>
+                    <el-row v-for="item in bookPromoteDataList" :key="item.id">
+                        <el-col :span="23">
+                            <span class="title" @click="act_showArticle(item)">
+                                {{ item.title }}
+                            </span>
+                        </el-col>
+                    </el-row>
+                </el-scrollbar>
+            </el-col>
+        </el-row>
+
+        <el-dialog v-model="g_dialogTableVisible" width="80%" style="background-color: #e6e6e6;">
+            <el-image style="width: 100%; height: auto; padding-bottom: 1vh;" v-for="(article, aindex) in g_articlePath"
+                :key="aindex" :src="article" fit="contain" />
+        </el-dialog>
+    </div>
+</template>
+
+<script setup>
+/************************************************
+ *                   引入文件                   *
+ ************************************************/
+import { ref, onMounted } from "vue";
+import { useRouter, useRoute } from "vue-router";
+import { require_ } from "@/utils/require";
+import { getBooksDataList } from "@/http/pages/library";
+
+
+/************************************************
+ * 全局变量
+ *
+ * 格式: g_ + 事件名     例如: g_route
+ ************************************************/
+const g_useRouter = useRouter();
+// 介绍框
+const g_dialogTableVisible = ref(false);
+// 介绍框高度
+const g_introductionHeight = ref(`${window.innerHeight * 0.6}px`);
+// 书本数据
+const bookPromoteDataList = ref([]);
+// 文章路径
+const g_articlePath = ref([]);
+
+
+/************************************************
+ * 生命周期函数
+ ************************************************/
+onMounted(() => {
+    get_dataList();
+})
+
+/************************************************
+ * 事件处理
+ *
+ * 格式: act_ + 事件名     例如: act_resolvingIdentity
+ ************************************************/
+// 返回
+const act_return = () => {
+    g_useRouter.go(-1);
+}
+
+/**
+ * 显示文章
+ */
+const act_showArticle = (item) => {
+    g_introductionHeight.value = window.innerHeight * 0.7 + 'px';
+    g_articlePath.value = item.path;
+    g_dialogTableVisible.value = true;
+}
+
+
+/************************************************
+ * 获取数据
+ *
+ * 格式: get_ + 事件名     例如: get_dataList
+ ************************************************/
+// 获取数据
+const get_dataList = async () => {
+    const params = {
+        company_app_id: "3",
+        data_type: "5"
+    };
+    const dataList = await getBooksDataList(params);
+
+    if (dataList.code == 200) {
+        dataList.data.forEach((item, index) => {
+            const tempFilePath = `https://seaelibrary.xmu.edu.cn/prod-api${item.path}`;
+            const filePathArray = [tempFilePath];
+            if (item.count > 1) {
+                let temp = tempFilePath.substring(0, tempFilePath.length - 6);
+                for (let j = 1; j < item.count; j++) {
+                    if (j < 10) {
+                        filePathArray.push(temp + '0' + j + '.png');
+                    } else {
+                        filePathArray.push(temp + j + '.png');
+                    }
+                }
+            }
+            item.path = [...new Set(filePathArray)];
+        })
+        bookPromoteDataList.value = dataList.data
+    }
+}
+</script>
+
+<style scoped>
+.box {
+    background-image: url("@/assets/img/list.png");
+    background-repeat: no-repeat;
+    background-size: cover;
+    background-position: center;
+    width: 100%;
+    height: 100%;
+}
+
+
+.box-content {
+    height: 100%;
+    padding: 11vh 0;
+}
+
+.title {
+    font-size: 2rem;
+    line-height: 4.5rem;
+    font-weight: bold;
+    color: #421205;
+    margin-left: 30px;
+    border-bottom: 2px solid rgba(66, 18, 5, 0.5);
+    letter-spacing: 0.25rem;
+    cursor: pointer;
+}
+
+.title::before {
+    content: '';
+    position: absolute;
+    top: 50%;
+    left: -20px;
+    transform: translateY(-50%);
+    visibility: hidden;
+    width: 50px;
+    height: 50px;
+    background-image: url("@/assets/img/selected.png");
+    background-repeat: no-repeat;
+    background-size: cover;
+    background-position: center;
+    opacity: 0;
+    transition: all .3s;
+}
+
+.title:hover::before {
+    visibility: visible;
+    opacity: 1;
+    transition: all 0.3s;
+}
+
+.return-button {
+    visibility: visible;
+    position: absolute;
+    top: 8px;
+    right: 0;
+    background-repeat: no-repeat;
+    background-size: cover;
+    background-position: center;
+    min-width: 80px;
+    width: 8vw;
+    z-index: 100;
+}
+
+@media screen and (max-width: 1200px) {
+    .title {
+        font-size: 1rem;
+        line-height: 2.5rem;
+    }
+}
+
+@media screen and (orientation: portrait) {
+    .return-button {
+        width: 16vw;
+    }
+}
+</style>

+ 0 - 0
src/pages/library/subpages/first.vue


Някои файлове не бяха показани, защото твърде много файлове са промени