zs 10 달 전
커밋
7114b3af09
100개의 변경된 파일14956개의 추가작업 그리고 0개의 파일을 삭제
  1. 17 0
      .env.development
  2. 17 0
      .env.production
  3. 288 0
      .eslintrc-auto-import.json
  4. 33 0
      .eslintrc.cjs
  5. 31 0
      .gitignore
  6. 8 0
      .prettierrc.json
  7. 7 0
      .vscode/extensions.json
  8. 35 0
      README.md
  9. 13 0
      index.html
  10. 10 0
      jsconfig.json
  11. 12110 0
      package-lock.json
  12. 52 0
      package.json
  13. BIN
      public/favicon.ico
  14. BIN
      public/images/bg.png
  15. BIN
      public/images/chengguo.png
  16. BIN
      public/images/code.png
  17. BIN
      public/images/home.jpg
  18. BIN
      public/images/homebg.png
  19. BIN
      public/images/icon_2.png
  20. BIN
      public/images/innovation.png
  21. BIN
      public/images/kf.png
  22. BIN
      public/images/loginbg.jpeg
  23. BIN
      public/images/logo.png
  24. BIN
      public/images/map.jpg
  25. BIN
      public/images/new_1.png
  26. BIN
      public/images/new_2.png
  27. BIN
      public/images/new_3.png
  28. BIN
      public/images/new_4.png
  29. BIN
      public/images/new_5.png
  30. BIN
      public/images/news.jpg
  31. BIN
      public/images/news.png
  32. BIN
      public/images/science1.png
  33. BIN
      public/images/science2.png
  34. BIN
      public/images/science3.png
  35. BIN
      public/images/science4.png
  36. BIN
      public/images/science5.png
  37. BIN
      public/images/science6.png
  38. BIN
      public/images/science7.png
  39. BIN
      public/images/science8.png
  40. BIN
      public/images/science9.png
  41. BIN
      public/images/science_1.png
  42. BIN
      public/images/science_2.png
  43. BIN
      public/images/science_3.png
  44. BIN
      public/images/science_4.png
  45. BIN
      public/images/science_5.png
  46. BIN
      public/images/science_6.png
  47. BIN
      public/images/science_7.png
  48. BIN
      public/images/science_8.png
  49. BIN
      public/images/science_9.png
  50. BIN
      public/images/search.jpeg
  51. BIN
      public/images/unit.png
  52. BIN
      public/images/xinxi.png
  53. BIN
      public/images/zj.png
  54. 31 0
      src/App.vue
  55. 0 0
      src/assets/base.css
  56. 95 0
      src/assets/icon/iconfont.css
  57. 1 0
      src/assets/icon/iconfont.js
  58. 149 0
      src/assets/icon/iconfont.json
  59. BIN
      src/assets/icon/iconfont.ttf
  60. BIN
      src/assets/icon/iconfont.woff
  61. BIN
      src/assets/icon/iconfont.woff2
  62. 1 0
      src/assets/logo.svg
  63. 19 0
      src/assets/main.css
  64. 63 0
      src/components/WangEditor/index.vue
  65. 96 0
      src/components/custom/custom-upload.vue
  66. 7 0
      src/components/index.js
  67. 312 0
      src/layout/index.vue
  68. 57 0
      src/layout/site.js
  69. 37 0
      src/main.js
  70. 254 0
      src/router/index.js
  71. 16 0
      src/settings.js
  72. 25 0
      src/store/api/login.js
  73. 54 0
      src/store/api/platform/achievement.js
  74. 55 0
      src/store/api/platform/chat.js
  75. 45 0
      src/store/api/platform/collection.js
  76. 54 0
      src/store/api/platform/demand.js
  77. 40 0
      src/store/api/platform/design.js
  78. 45 0
      src/store/api/platform/match.js
  79. 40 0
      src/store/api/platform/news.js
  80. 54 0
      src/store/api/platform/project.js
  81. 49 0
      src/store/api/platform/sign.js
  82. 54 0
      src/store/api/platform/supply.js
  83. 37 0
      src/store/api/platform/tool.js
  84. 40 0
      src/store/api/system/dictData.js
  85. 40 0
      src/store/api/system/dictType.js
  86. 40 0
      src/store/api/system/menus.js
  87. 40 0
      src/store/api/system/role.js
  88. 40 0
      src/store/api/system/tags.js
  89. 40 0
      src/store/api/user/admin.js
  90. 40 0
      src/store/api/user/association.js
  91. 54 0
      src/store/api/user/company.js
  92. 40 0
      src/store/api/user/competition.js
  93. 54 0
      src/store/api/user/expert.js
  94. 40 0
      src/store/api/user/incubator.js
  95. 40 0
      src/store/api/user/investment.js
  96. 40 0
      src/store/api/user/state.js
  97. 40 0
      src/store/api/user/unit.js
  98. 45 0
      src/store/api/user/user.js
  99. 12 0
      src/store/index.js
  100. 0 0
      src/store/modules/app.js

+ 17 - 0
.env.development

@@ -0,0 +1,17 @@
+## 开发环境
+NODE_ENV='development'
+
+# 应用端口
+VITE_APP_PORT = 3002
+
+# 代理前缀
+VITE_APP_BASE_API = '/cxyy/api'
+
+VITE_APP_BASE_APIWS ='/websocket/api'
+
+VITE_APP_HOST = "http://192.168.1.197"
+
+VITE_APP_HOME = "http://localhost:3000/"
+
+VITE_BASE_URL = "/cxyyWeb"
+VITE_OUT_DIR = "cxyyWeb"

+ 17 - 0
.env.production

@@ -0,0 +1,17 @@
+## 生产环境
+NODE_ENV='production'
+
+# 应用端口
+VITE_APP_PORT = 3002
+
+# 代理前缀
+VITE_APP_BASE_API = '/cxyy/api'
+
+VITE_APP_BASE_APIWS ='/websocket/api'
+
+VITE_APP_HOST = "https://broadcast.waityou24.cn"
+
+VITE_APP_HOME = "https://broadcast.waityou24.cn"
+
+VITE_BASE_URL = "/cxyyWeb"
+VITE_OUT_DIR = "cxyyWeb"

+ 288 - 0
.eslintrc-auto-import.json

@@ -0,0 +1,288 @@
+{
+  "globals": {
+    "Component": true,
+    "ComponentPublicInstance": true,
+    "ComputedRef": true,
+    "EffectScope": true,
+    "ElMessage": true,
+    "ElMessageBox": true,
+    "ElNotification": true,
+    "InjectionKey": true,
+    "PropType": true,
+    "Ref": true,
+    "VNode": true,
+    "asyncComputed": true,
+    "autoResetRef": true,
+    "computed": true,
+    "computedAsync": true,
+    "computedEager": true,
+    "computedInject": true,
+    "computedWithControl": true,
+    "controlledComputed": true,
+    "controlledRef": true,
+    "createApp": true,
+    "createEventHook": true,
+    "createGlobalState": true,
+    "createInjectionState": true,
+    "createReactiveFn": true,
+    "createReusableTemplate": true,
+    "createSharedComposable": true,
+    "createTemplatePromise": true,
+    "createUnrefFn": true,
+    "customRef": true,
+    "debouncedRef": true,
+    "debouncedWatch": true,
+    "defineAsyncComponent": true,
+    "defineComponent": true,
+    "eagerComputed": true,
+    "effectScope": true,
+    "extendRef": true,
+    "getCurrentInstance": true,
+    "getCurrentScope": true,
+    "h": true,
+    "ignorableWatch": true,
+    "inject": true,
+    "isDefined": true,
+    "isProxy": true,
+    "isReactive": true,
+    "isReadonly": true,
+    "isRef": true,
+    "makeDestructurable": true,
+    "markRaw": true,
+    "nextTick": true,
+    "onActivated": true,
+    "onBeforeMount": true,
+    "onBeforeUnmount": true,
+    "onBeforeUpdate": true,
+    "onClickOutside": true,
+    "onDeactivated": true,
+    "onErrorCaptured": true,
+    "onKeyStroke": true,
+    "onLongPress": true,
+    "onMounted": true,
+    "onRenderTracked": true,
+    "onRenderTriggered": true,
+    "onScopeDispose": true,
+    "onServerPrefetch": true,
+    "onStartTyping": true,
+    "onUnmounted": true,
+    "onUpdated": true,
+    "pausableWatch": true,
+    "provide": true,
+    "reactify": true,
+    "reactifyObject": true,
+    "reactive": true,
+    "reactiveComputed": true,
+    "reactiveOmit": true,
+    "reactivePick": true,
+    "readonly": true,
+    "ref": true,
+    "refAutoReset": true,
+    "refDebounced": true,
+    "refDefault": true,
+    "refThrottled": true,
+    "refWithControl": true,
+    "resolveComponent": true,
+    "resolveRef": true,
+    "resolveUnref": true,
+    "shallowReactive": true,
+    "shallowReadonly": true,
+    "shallowRef": true,
+    "syncRef": true,
+    "syncRefs": true,
+    "templateRef": true,
+    "throttledRef": true,
+    "throttledWatch": true,
+    "toRaw": true,
+    "toReactive": true,
+    "toRef": true,
+    "toRefs": true,
+    "toValue": true,
+    "triggerRef": true,
+    "tryOnBeforeMount": true,
+    "tryOnBeforeUnmount": true,
+    "tryOnMounted": true,
+    "tryOnScopeDispose": true,
+    "tryOnUnmounted": true,
+    "unref": true,
+    "unrefElement": true,
+    "until": true,
+    "useActiveElement": true,
+    "useAnimate": true,
+    "useArrayDifference": true,
+    "useArrayEvery": true,
+    "useArrayFilter": true,
+    "useArrayFind": true,
+    "useArrayFindIndex": true,
+    "useArrayFindLast": true,
+    "useArrayIncludes": true,
+    "useArrayJoin": true,
+    "useArrayMap": true,
+    "useArrayReduce": true,
+    "useArraySome": true,
+    "useArrayUnique": true,
+    "useAsyncQueue": true,
+    "useAsyncState": true,
+    "useAttrs": true,
+    "useBase64": true,
+    "useBattery": true,
+    "useBluetooth": true,
+    "useBreakpoints": true,
+    "useBroadcastChannel": true,
+    "useBrowserLocation": true,
+    "useCached": true,
+    "useClipboard": true,
+    "useCloned": true,
+    "useColorMode": true,
+    "useConfirmDialog": true,
+    "useCounter": true,
+    "useCssModule": true,
+    "useCssVar": true,
+    "useCssVars": true,
+    "useCurrentElement": true,
+    "useCycleList": true,
+    "useDark": true,
+    "useDateFormat": true,
+    "useDebounce": true,
+    "useDebounceFn": true,
+    "useDebouncedRefHistory": true,
+    "useDeviceMotion": true,
+    "useDeviceOrientation": true,
+    "useDevicePixelRatio": true,
+    "useDevicesList": true,
+    "useDisplayMedia": true,
+    "useDocumentVisibility": true,
+    "useDraggable": true,
+    "useDropZone": true,
+    "useElementBounding": true,
+    "useElementByPoint": true,
+    "useElementHover": true,
+    "useElementSize": true,
+    "useElementVisibility": true,
+    "useEventBus": true,
+    "useEventListener": true,
+    "useEventSource": true,
+    "useEyeDropper": true,
+    "useFavicon": true,
+    "useFetch": true,
+    "useFileDialog": true,
+    "useFileSystemAccess": true,
+    "useFocus": true,
+    "useFocusWithin": true,
+    "useFps": true,
+    "useFullscreen": true,
+    "useGamepad": true,
+    "useGeolocation": true,
+    "useIdle": true,
+    "useImage": true,
+    "useInfiniteScroll": true,
+    "useIntersectionObserver": true,
+    "useInterval": true,
+    "useIntervalFn": true,
+    "useKeyModifier": true,
+    "useLastChanged": true,
+    "useLocalStorage": true,
+    "useMagicKeys": true,
+    "useManualRefHistory": true,
+    "useMediaControls": true,
+    "useMediaQuery": true,
+    "useMemoize": true,
+    "useMemory": true,
+    "useMounted": true,
+    "useMouse": true,
+    "useMouseInElement": true,
+    "useMousePressed": true,
+    "useMutationObserver": true,
+    "useNavigatorLanguage": true,
+    "useNetwork": true,
+    "useNow": true,
+    "useObjectUrl": true,
+    "useOffsetPagination": true,
+    "useOnline": true,
+    "usePageLeave": true,
+    "useParallax": true,
+    "useParentElement": true,
+    "usePerformanceObserver": true,
+    "usePermission": true,
+    "usePointer": true,
+    "usePointerLock": true,
+    "usePointerSwipe": true,
+    "usePreferredColorScheme": true,
+    "usePreferredContrast": true,
+    "usePreferredDark": true,
+    "usePreferredLanguages": true,
+    "usePreferredReducedMotion": true,
+    "usePrevious": true,
+    "useRafFn": true,
+    "useRefHistory": true,
+    "useResizeObserver": true,
+    "useScreenOrientation": true,
+    "useScreenSafeArea": true,
+    "useScriptTag": true,
+    "useScroll": true,
+    "useScrollLock": true,
+    "useSessionStorage": true,
+    "useShare": true,
+    "useSlots": true,
+    "useSorted": true,
+    "useSpeechRecognition": true,
+    "useSpeechSynthesis": true,
+    "useStepper": true,
+    "useStorage": true,
+    "useStorageAsync": true,
+    "useStyleTag": true,
+    "useSupported": true,
+    "useSwipe": true,
+    "useTemplateRefsList": true,
+    "useTextDirection": true,
+    "useTextSelection": true,
+    "useTextareaAutosize": true,
+    "useThrottle": true,
+    "useThrottleFn": true,
+    "useThrottledRefHistory": true,
+    "useTimeAgo": true,
+    "useTimeout": true,
+    "useTimeoutFn": true,
+    "useTimeoutPoll": true,
+    "useTimestamp": true,
+    "useTitle": true,
+    "useToNumber": true,
+    "useToString": true,
+    "useToggle": true,
+    "useTransition": true,
+    "useUrlSearchParams": true,
+    "useUserMedia": true,
+    "useVModel": true,
+    "useVModels": true,
+    "useVibrate": true,
+    "useVirtualList": true,
+    "useWakeLock": true,
+    "useWebNotification": true,
+    "useWebSocket": true,
+    "useWebWorker": true,
+    "useWebWorkerFn": true,
+    "useWindowFocus": true,
+    "useWindowScroll": true,
+    "useWindowSize": true,
+    "watch": true,
+    "watchArray": true,
+    "watchAtMost": true,
+    "watchDebounced": true,
+    "watchDeep": true,
+    "watchEffect": true,
+    "watchIgnorable": true,
+    "watchImmediate": true,
+    "watchOnce": true,
+    "watchPausable": true,
+    "watchPostEffect": true,
+    "watchSyncEffect": true,
+    "watchThrottled": true,
+    "watchTriggerable": true,
+    "watchWithFilter": true,
+    "whenever": true,
+    "defineStore": true,
+    "useRoute": true,
+    "useRouter": true,
+    "useI18n": true 
+  }
+}

+ 33 - 0
.eslintrc.cjs

@@ -0,0 +1,33 @@
+/* eslint-env node */
+require('@rushstack/eslint-patch/modern-module-resolution')
+
+module.exports = {
+  root: true,
+  extends: [
+    'plugin:vue/vue3-essential',
+    'eslint:recommended',
+    '@vue/eslint-config-prettier/skip-formatting',
+    './.eslintrc-auto-import.json'
+  ],
+  parserOptions: {
+    ecmaVersion: 'latest'
+  },
+  rules: {
+    'vue/multi-word-component-names': 0,
+    'max-len': [
+      'warn',
+      {
+        code: 200
+      }
+    ],
+    'prettier/prettier': [
+      'warn',
+      {
+        singleQuote: true,
+        bracketSpacing: true,
+        jsxBracketSameLine: true,
+        printWidth: 200
+      }
+    ]
+  }
+}

+ 31 - 0
.gitignore

@@ -0,0 +1,31 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+cxyyWeb/
+
+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

+ 8 - 0
.prettierrc.json

@@ -0,0 +1,8 @@
+{
+  "$schema": "https://json.schemastore.org/prettierrc",
+  "semi": false,
+  "tabWidth": 2,
+  "singleQuote": true,
+  "printWidth": 100,
+  "trailingComma": "none"
+}

+ 7 - 0
.vscode/extensions.json

@@ -0,0 +1,7 @@
+{
+  "recommendations": [
+    "Vue.volar",
+    "dbaeumer.vscode-eslint",
+    "esbenp.prettier-vscode"
+  ]
+}

+ 35 - 0
README.md

@@ -0,0 +1,35 @@
+# web
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vitejs.dev/config/).
+
+## Project Setup
+
+```sh
+npm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+npm run dev
+```
+
+### Compile and Minify for Production
+
+```sh
+npm run build
+```
+
+### Lint with [ESLint](https://eslint.org/)
+
+```sh
+npm run lint
+```

+ 13 - 0
index.html

@@ -0,0 +1,13 @@
+<!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>
+  </head>
+  <body>
+    <div id="app"></div>
+    <script type="module" src="/src/main.js"></script>
+  </body>
+</html>

+ 10 - 0
jsconfig.json

@@ -0,0 +1,10 @@
+{
+  "compilerOptions": {
+    "baseUrl": "./",
+    "paths": {
+      "@/*": ["./src/*"]
+    }
+  },
+  "exclude": ["node_modules", "dist"],
+  "include": ["src/**/*.vue", "**/*.js"]
+}

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 12110 - 0
package-lock.json


+ 52 - 0
package.json

@@ -0,0 +1,52 @@
+{
+  "name": "web",
+  "version": "0.0.0",
+  "private": true,
+  "type": "module",
+  "scripts": {
+    "dev": "vite",
+    "build": "vite build",
+    "preview": "vite preview",
+    "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs --fix --ignore-path .gitignore",
+    "format": "prettier --write src/"
+  },
+  "dependencies": {
+    "@element-plus/icons-vue": "^2.3.1",
+    "@vueuse/core": "^10.7.2",
+    "@vueuse/integrations": "^10.9.0",
+    "@wangeditor/editor": "^5.1.23",
+    "@wangeditor/editor-for-vue": "5.1.10",
+    "ant-design-vue": "^4.0.8",
+    "axios": "^1.6.7",
+    "dayjs": "^1.11.10",
+    "default-passive-events": "^2.0.0",
+    "echarts": "^5.5.0",
+    "element-plus": "^2.5.6",
+    "lodash-es": "^4.17.21",
+    "moment": "^2.30.1",
+    "nprogress": "^0.2.0",
+    "path-browserify": "^1.0.1",
+    "path-to-regexp": "^6.2.1",
+    "pinia": "^2.1.7",
+    "universal-cookie": "^7.1.0",
+    "vue": "^3.4.15",
+    "vue-i18n": "^9.9.1",
+    "vue-router": "^4.2.5",
+    "vue3-seamless-scroll": "^2.0.1"
+  },
+  "devDependencies": {
+    "@rushstack/eslint-patch": "^1.3.3",
+    "@vitejs/plugin-vue": "^5.0.3",
+    "@vue/eslint-config-prettier": "^8.0.0",
+    "eslint": "^8.49.0",
+    "eslint-plugin-vue": "^9.17.0",
+    "prettier": "^3.0.3",
+    "sass": "^1.71.0",
+    "unplugin-auto-import": "^0.17.5",
+    "unplugin-icons": "^0.18.5",
+    "unplugin-vue-components": "^0.26.0",
+    "vite": "^5.0.11",
+    "vite-plugin-inspect": "^0.8.3",
+    "vite-plugin-svg-icons": "^2.0.1"
+  }
+}

BIN
public/favicon.ico


BIN
public/images/bg.png


BIN
public/images/chengguo.png


BIN
public/images/code.png


BIN
public/images/home.jpg


BIN
public/images/homebg.png


BIN
public/images/icon_2.png


BIN
public/images/innovation.png


BIN
public/images/kf.png


BIN
public/images/loginbg.jpeg


BIN
public/images/logo.png


BIN
public/images/map.jpg


BIN
public/images/new_1.png


BIN
public/images/new_2.png


BIN
public/images/new_3.png


BIN
public/images/new_4.png


BIN
public/images/new_5.png


BIN
public/images/news.jpg


BIN
public/images/news.png


BIN
public/images/science1.png


BIN
public/images/science2.png


BIN
public/images/science3.png


BIN
public/images/science4.png


BIN
public/images/science5.png


BIN
public/images/science6.png


BIN
public/images/science7.png


BIN
public/images/science8.png


BIN
public/images/science9.png


BIN
public/images/science_1.png


BIN
public/images/science_2.png


BIN
public/images/science_3.png


BIN
public/images/science_4.png


BIN
public/images/science_5.png


BIN
public/images/science_6.png


BIN
public/images/science_7.png


BIN
public/images/science_8.png


BIN
public/images/science_9.png


BIN
public/images/search.jpeg


BIN
public/images/unit.png


BIN
public/images/xinxi.png


BIN
public/images/zj.png


+ 31 - 0
src/App.vue

@@ -0,0 +1,31 @@
+<script setup>
+import zhCN from 'ant-design-vue/es/locale/zh_CN'
+</script>
+
+<template>
+  <a-config-provider :locale="zhCN">
+    <router-view />
+  </a-config-provider>
+</template>
+
+<style lang="scss">
+body {
+  margin: 0;
+}
+.w_1200 {
+  width: 1200px;
+  margin: 0 auto;
+}
+.textOver {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.textMore {
+  display: -webkit-box;
+  -webkit-line-clamp: 2;
+  -webkit-box-orient: vertical;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+</style>

+ 0 - 0
src/assets/base.css


+ 95 - 0
src/assets/icon/iconfont.css

@@ -0,0 +1,95 @@
+@font-face {
+  font-family: "iconfont"; /* Project id 4079354 */
+  src: url('iconfont.woff2?t=1685509924120') format('woff2'),
+       url('iconfont.woff?t=1685509924120') format('woff'),
+       url('iconfont.ttf?t=1685509924120') format('truetype');
+}
+
+.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-dengji:before {
+  content: "\e610";
+}
+
+.icon-shenhezhong:before {
+  content: "\e682";
+}
+
+.icon-dkw_shenheweitongguo:before {
+  content: "\e604";
+}
+
+.icon-shenhetongguo:before {
+  content: "\e668";
+}
+
+.icon-hearts-fill:before {
+  content: "\e702";
+}
+
+.icon-xiaoyouhui:before {
+  content: "\e601";
+}
+
+.icon-youjiantou-copy:before {
+  content: "\e654";
+}
+
+.icon-6ruxueshijian:before {
+  content: "\e88a";
+}
+
+.icon-zhuanyezhuanyeke:before {
+  content: "\e6a1";
+}
+
+.icon-commpany:before {
+  content: "\e612";
+}
+
+.icon-zhiwuguanli:before {
+  content: "\e60f";
+}
+
+.icon-guanzhu:before {
+  content: "\e611";
+}
+
+.icon-guanzhu1:before {
+  content: "\e600";
+}
+
+.icon-edu-line:before {
+  content: "\e63a";
+}
+
+.icon-gender:before {
+  content: "\e63e";
+}
+
+.icon-xingming:before {
+  content: "\e640";
+}
+
+.icon-jibenxinxi:before {
+  content: "\e67c";
+}
+
+.icon-iocn_be_concern:before {
+  content: "\e607";
+}
+
+.icon-tupianshangchuan:before {
+  content: "\e639";
+}
+
+.icon-wodeguanzhu:before {
+  content: "\e8bc";
+}
+

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1 - 0
src/assets/icon/iconfont.js


+ 149 - 0
src/assets/icon/iconfont.json

@@ -0,0 +1,149 @@
+{
+  "id": "4079354",
+  "name": "校友信息登记",
+  "font_family": "iconfont",
+  "css_prefix_text": "icon-",
+  "description": "",
+  "glyphs": [
+    {
+      "icon_id": "1327399",
+      "name": "登记",
+      "font_class": "dengji",
+      "unicode": "e610",
+      "unicode_decimal": 58896
+    },
+    {
+      "icon_id": "1480896",
+      "name": "审核中",
+      "font_class": "shenhezhong",
+      "unicode": "e682",
+      "unicode_decimal": 59010
+    },
+    {
+      "icon_id": "2078809",
+      "name": "dkw_审核未通过",
+      "font_class": "dkw_shenheweitongguo",
+      "unicode": "e604",
+      "unicode_decimal": 58884
+    },
+    {
+      "icon_id": "10087856",
+      "name": "审核通过",
+      "font_class": "shenhetongguo",
+      "unicode": "e668",
+      "unicode_decimal": 58984
+    },
+    {
+      "icon_id": "35094512",
+      "name": "关心",
+      "font_class": "hearts-fill",
+      "unicode": "e702",
+      "unicode_decimal": 59138
+    },
+    {
+      "icon_id": "2726796",
+      "name": "校友会",
+      "font_class": "xiaoyouhui",
+      "unicode": "e601",
+      "unicode_decimal": 58881
+    },
+    {
+      "icon_id": "10515596",
+      "name": "右箭头",
+      "font_class": "youjiantou-copy",
+      "unicode": "e654",
+      "unicode_decimal": 58964
+    },
+    {
+      "icon_id": "518145",
+      "name": "6 入学时间",
+      "font_class": "6ruxueshijian",
+      "unicode": "e88a",
+      "unicode_decimal": 59530
+    },
+    {
+      "icon_id": "16365912",
+      "name": "专业 专业课",
+      "font_class": "zhuanyezhuanyeke",
+      "unicode": "e6a1",
+      "unicode_decimal": 59041
+    },
+    {
+      "icon_id": "376346",
+      "name": "工作单位",
+      "font_class": "commpany",
+      "unicode": "e612",
+      "unicode_decimal": 58898
+    },
+    {
+      "icon_id": "11672365",
+      "name": "职务管理",
+      "font_class": "zhiwuguanli",
+      "unicode": "e60f",
+      "unicode_decimal": 58895
+    },
+    {
+      "icon_id": "8712978",
+      "name": "关注",
+      "font_class": "guanzhu",
+      "unicode": "e611",
+      "unicode_decimal": 58897
+    },
+    {
+      "icon_id": "9714399",
+      "name": "关注",
+      "font_class": "guanzhu1",
+      "unicode": "e600",
+      "unicode_decimal": 58880
+    },
+    {
+      "icon_id": "6119296",
+      "name": "学历",
+      "font_class": "edu-line",
+      "unicode": "e63a",
+      "unicode_decimal": 58938
+    },
+    {
+      "icon_id": "6183156",
+      "name": "性别",
+      "font_class": "gender",
+      "unicode": "e63e",
+      "unicode_decimal": 58942
+    },
+    {
+      "icon_id": "20764666",
+      "name": "姓名",
+      "font_class": "xingming",
+      "unicode": "e640",
+      "unicode_decimal": 58944
+    },
+    {
+      "icon_id": "6856906",
+      "name": "基本信息",
+      "font_class": "jibenxinxi",
+      "unicode": "e67c",
+      "unicode_decimal": 59004
+    },
+    {
+      "icon_id": "1048854",
+      "name": "被关注",
+      "font_class": "iocn_be_concern",
+      "unicode": "e607",
+      "unicode_decimal": 58887
+    },
+    {
+      "icon_id": "2506206",
+      "name": "图片上传",
+      "font_class": "tupianshangchuan",
+      "unicode": "e639",
+      "unicode_decimal": 58937
+    },
+    {
+      "icon_id": "11372718",
+      "name": "我的关注",
+      "font_class": "wodeguanzhu",
+      "unicode": "e8bc",
+      "unicode_decimal": 59580
+    }
+  ]
+}

BIN
src/assets/icon/iconfont.ttf


BIN
src/assets/icon/iconfont.woff


BIN
src/assets/icon/iconfont.woff2


+ 1 - 0
src/assets/logo.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 261.76 226.69"><path d="M161.096.001l-30.225 52.351L100.647.001H-.005l130.877 226.688L261.749.001z" fill="#41b883"/><path d="M161.096.001l-30.225 52.351L100.647.001H52.346l78.526 136.01L209.398.001z" fill="#34495e"/></svg>

+ 19 - 0
src/assets/main.css

@@ -0,0 +1,19 @@
+body {
+  margin: 0;
+}
+
+.w_1200 {
+  width: 1200px;
+  margin: 0 auto;
+}
+
+p {
+  margin: 0;
+  padding: 0;
+}
+
+.textOver {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}

+ 63 - 0
src/components/WangEditor/index.vue

@@ -0,0 +1,63 @@
+<template>
+  <div class="editor-wrapper">
+    <!-- 工具栏 -->
+    <Toolbar id="toolbar-container" :editor="editorRef" :default-config="toolbarConfig" :mode="mode" />
+    <!-- 编辑器 -->
+    <Editor style="height: 350px" id="editor-container" v-model="modelValue" :default-config="editorConfig" :mode="mode" @on-change="handleChange" @on-created="handleCreated" />
+  </div>
+</template>
+
+<script setup>
+import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
+
+// API 引用
+import { uploadFileApi } from '@/utils/file'
+
+const props = defineProps({
+  modelValue: {
+    type: [String],
+    default: ''
+  }
+})
+
+const emit = defineEmits(['update:modelValue'])
+
+const modelValue = useVModel(props, 'modelValue', emit)
+
+const editorRef = shallowRef() // 编辑器实例,必须用 shallowRef
+const mode = ref('default') // 编辑器模式
+const toolbarConfig = ref({}) // 工具条配置
+// 编辑器配置
+const editorConfig = ref({
+  placeholder: '请输入内容...',
+  MENU_CONF: {
+    uploadImage: {
+      // 自定义图片上传
+      async customUpload(file, insertFn) {
+        uploadFileApi(file).then((response) => {
+          const { errcode, uri } = response.data
+          const url = `${import.meta.env.VITE_APP_HOST}${uri}`
+          if (errcode === 0) insertFn(url)
+        })
+      }
+    }
+  }
+})
+
+const handleCreated = (editor) => {
+  editorRef.value = editor // 记录 editor 实例,重要!
+}
+
+function handleChange(editor) {
+  modelValue.value = editor.getHtml()
+}
+
+// 组件销毁时,也及时销毁编辑器
+onBeforeUnmount(() => {
+  const editor = editorRef.value
+  if (editor == null) return
+  editor.destroy()
+})
+</script>
+
+<style src="@wangeditor/editor/dist/css/style.css"></style>

+ 96 - 0
src/components/custom/custom-upload.vue

@@ -0,0 +1,96 @@
+<template>
+  <div id="c-upload">
+    <el-upload
+      v-if="url"
+      ref="upload"
+      :action="url"
+      :limit="limit"
+      :accept="accept"
+      :file-list="list"
+      :list-type="listType"
+      :on-exceed="outLimit"
+      :on-preview="filePreview"
+      :on-success="onSuccess"
+      :before-remove="onRemove">
+      <el-button type="primary">选择文件</el-button>
+      <template #tip v-if="tip">
+        <p style="color: #ff0000">{{ tip }}</p>
+      </template>
+    </el-upload>
+    <el-dialog v-model="dialog.show" append-to-body>
+      <img width="100%" :src="dialog.url" alt="" />
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import { ElMessage } from 'element-plus'
+import { omit, cloneDeep, isArray } from 'lodash-es'
+
+let dialog = ref({ show: false, url: '' })
+const props = defineProps({
+  url: { type: String, default: () => '' },
+  limit: { type: Number, default: () => 6 },
+  accept: { type: String, default: () => 'image/png, image/jpeg' },
+  listType: { type: String, default: () => 'text' }, //'text' | 'picture' | 'picture-card'
+  tip: { type: String, default: () => undefined },
+  list: { type: Array, default: () => [] },
+  model: { type: String, default: () => '' }
+})
+// 图片上传地址
+const { url } = toRefs(props)
+// 可上传文件数目
+const { limit } = toRefs(props)
+// 接收上传的文件类型
+const { accept } = toRefs(props)
+// 文件列表的类型--picture-card---picture
+const { listType } = toRefs(props)
+// 文件提醒
+const { tip } = toRefs(props)
+// 已有数据,赋值,预览
+const { list } = toRefs(props)
+const { model } = toRefs(props)
+// const list = ref<UploadUserFile[]>([]);
+
+const emit = defineEmits(['change'])
+// 图片预览
+const filePreview = (file) => {
+  // this.dialog = { show: true, url: file.url };
+  window.open(file.url)
+};
+// 只允许上传多少个文件
+const outLimit = () => {
+  ElMessage.error(`只允许上传${limit.value}个文件`)
+};
+// 上传成功,response:成功信息,file:图片信息,fileList:图片列表
+const onSuccess = (response, file) => {
+  if (response.errcode !== 0) {
+    ElMessage({ type: 'error', message: '删除成功' })
+    return
+  }
+  let ponse = omit(response, ['errcode', 'errmsg'])
+  let arr = cloneDeep(list)
+  if (isArray(list.value)) {
+    arr.value.push({ ...ponse, name: file.name, url: `${import.meta.env.VITE_APP_HOST}${response.uri}` })
+  } else {
+    arr.value = [{ ...ponse, name: file.name, url: `${import.meta.env.VITE_APP_HOST}${response.uri}` }]
+  }
+  emit('change', { model: model.value, value: arr.value })
+}
+// 删除图片
+// file: { id: any; uri: string }, fileList: any
+const onRemove = () => {
+  // let arr: Ref<ListItem[]> = _.cloneDeep(list);
+  // let info = arr.value.filter((f) => f.id != file.id);
+  // emit('change', info);
+  return true
+};
+
+// #endregion
+</script>
+
+<style lang="scss" scoped>
+#c-upload {
+  width: 100%;
+}
+</style>

+ 7 - 0
src/components/index.js

@@ -0,0 +1,7 @@
+export default function globalComponents(app) {
+  const components = import.meta.glob('./**/**.{vue,tsx}', { eager: true }) //获取文件夹及其嵌套的多级子文件夹
+  for (let [key, value] of Object.entries(components)) {
+    const name = key.replace('./', '').split('/')[0]
+    app.component(value.default.name || name, value.default)
+  }
+}

+ 312 - 0
src/layout/index.vue

@@ -0,0 +1,312 @@
+<template>
+  <div class="common-layout">
+    <div class="top">
+      <div class="w_1200">
+        <el-row :gutter="20" align="middle">
+          <el-col :span="12" class="top_1">
+            <el-image
+              class="image"
+              v-if="configInfo && configInfo.logoUrl && configInfo.logoUrl.length > 0"
+              :src="configInfo.logoUrl[0].url"
+              fit="fill"
+            />
+            <el-image class="image" v-else :src="siteInfo.logoUrl" fit="fill" />
+            <div class="content">
+              <text class="title">{{ configInfo.zhTitle || siteInfo.zhTitle }}</text>
+              <text class="english">{{ siteInfo.zhBrief }}</text>
+            </div>
+          </el-col>
+          <el-col :span="12" v-if="user && user._id" class="top_2">
+            <el-dropdown>
+              <el-button size="small" :icon="User" type="primary">
+                {{ user.nick_name || '游客' }}
+              </el-button>
+              <template #dropdown>
+                <el-dropdown-menu>
+                  <el-dropdown-item @click="toOpen">管理中心</el-dropdown-item>
+                  <el-dropdown-item @click="toCommon(2)">个人中心</el-dropdown-item>
+                  <el-dropdown-item @click="toLogout">注销</el-dropdown-item>
+                </el-dropdown-menu>
+              </template>
+            </el-dropdown>
+          </el-col>
+          <el-col :span="12" v-else class="top_2">
+            <el-button @click="toLogin(2)" type="primary" size="small">注册</el-button>
+            <el-button @click="toLogin(1)" type="primary" size="small">登录</el-button>
+          </el-col>
+        </el-row>
+      </div>
+      <el-col :span="24" class="top_3">
+        <el-menu :default-active="current" mode="horizontal" @select="selectMenu">
+          <template v-for="item in data" :key="item._id">
+            <template v-if="item.type === '0'">
+              <el-sub-menu :index="item._id" :class="[current == item.href ? 'current' : '']">
+                <template #title>
+                  <span @click="selectMenu(item.href)">{{ item.title }}</span>
+                </template>
+                <el-menu-item v-for="tag in item.children" :key="tag._id" :index="tag.href">
+                  <template v-slot:default>
+                    {{ tag.title }}
+                  </template>
+                </el-menu-item>
+              </el-sub-menu>
+            </template>
+            <template v-else-if="item.type === '1'">
+              <el-menu-item :index="item.href"> {{ item.title }}</el-menu-item>
+            </template>
+          </template>
+        </el-menu>
+      </el-col>
+    </div>
+    <div class="center">
+      <el-col :span="24" class="container">
+        <router-view :style="viewStyle"></router-view>
+      </el-col>
+    </div>
+    <div class="bottom">
+      <div class="w_1200 footflex">
+        <el-image
+          class="image"
+          v-if="foot && foot.Unit && foot.Unit.length > 0"
+          :src="foot.Unit[0].url"
+          fit="fill"
+        />
+        <el-image class="image" v-else :src="footInfo.Unit" fit="fill" />
+        <el-col :span="12" class="foot_1">
+          <div class="footTitle">
+            <span>业务洽谈:{{ foot.Phone || footInfo.Phone }}</span>
+            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+            <span>企业邮箱:{{ foot.Email || footInfo.Email }}</span>
+          </div>
+          <div class="footTitle">地 址:{{ foot.Address || footInfo.Address }}</div>
+          <div class="footTitle">版权所有:{{ foot.Copyright || footInfo.Copyright }}</div>
+          <div class="footTitle">技术支持:{{ foot.Company || footInfo.Company }}</div>
+        </el-col>
+        <el-col :span="3" class="foot_2">
+          <div class="footTop">关于我们</div>
+          <div class="footTitle footflex1">
+            <span class="footSpan" @click="toHelp('1')">关于我们</span>
+            <span class="footSpan" @click="toHelp('3')">联系我们</span>
+            <!-- <span class="footSpan" @click="toHelp('2')">意见反馈</span> -->
+          </div>
+          <!-- <div class="footTitle footflex1">
+            <span class="footSpan" @click="toHelp('3')">联系我们</span>
+            <span class="footSpan" @click="toHelp('4')">法律条款</span>
+          </div> -->
+        </el-col>
+        <el-col :span="4" class="foot_3 footflex">
+          <el-image
+            class="image"
+            v-if="foot && foot.Code && foot.Code.length > 0"
+            :src="foot.Code[0].url"
+            fit="fill"
+          />
+          <el-image class="image" v-else :src="footInfo.Code" fit="fill" />
+          <el-image
+            class="image"
+            v-if="foot && foot.Code && foot.Code.length > 0"
+            :src="foot.Code[0].url"
+            fit="fill"
+          />
+          <el-image class="image" v-else :src="footInfo.Code" fit="fill" />
+        </el-col>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { siteInfo, footInfo, menuList } from '@/layout/site'
+// 接口
+import { TagsStore } from '@/store/api/system/tags'
+const store = TagsStore()
+import { DesignStore } from '@/store/api/platform/design'
+const designStore = DesignStore()
+const router = useRouter()
+const route = useRoute()
+const current = ref(route.name || 'one')
+import { UserStore } from '@/store/user'
+const userStore = UserStore()
+const user = computed(() => userStore.user)
+const data = ref([])
+const configInfo = ref({ logoUrl: [], Unit: [], Code: [] })
+const foot = ref({})
+// 请求
+onMounted(async () => {
+  await search()
+})
+
+const search = async () => {
+  const res = await store.query({ is_use: '0' })
+  // if (res.errcode == '0' && res.total > 0) data.value = res.data
+  // else data.value = menuList
+  data.value = menuList
+  // 基础设置
+  const result = await designStore.query({})
+  if (res.errcode == '0' && res.total > 0) {
+    configInfo.value = result.data[0] || {}
+    foot.value = result.data[0].footInfo || {}
+  }
+}
+const selectMenu = (item, query) => {
+  current.value = item
+  router.push({ path: `/${item}`, query })
+}
+// 登录|注册
+const toLogin = (status) => {
+  if (status === 1) router.push({ path: '/login' })
+  else router.push({ path: '/register' })
+}
+// 帮助中心
+const toHelp = (type) => {
+  router.push({ path: '/help', query: { type } })
+}
+// 打开管理端
+const toOpen = async () => {
+  window.location.href = import.meta.env.VITE_APP_HOME
+}
+// 基础跳转
+const toCommon = (type) => {
+  if (type == '1') router.push('/chat')
+  else if (type == '2') router.push('/center')
+  else if (type == '3') router.push('/sign')
+}
+// 退出登录
+const toLogout = () => {
+  userStore.logOut()
+  router.push('/login')
+}
+watch(
+  route,
+  (newVal) => {
+    if (newVal && newVal.name) {
+      if (newVal.query?.type) selectMenu(newVal.name, newVal.query)
+      else selectMenu(newVal.name)
+    }
+  },
+  {
+    immediate: true //初始化立即执行
+  }
+)
+// provide
+provide('selectMenu', selectMenu)
+</script>
+
+<style scoped lang="scss">
+.common-layout {
+  .top {
+    position: sticky;
+    top: 0;
+    z-index: 100;
+    background: #ffffff;
+
+    .current {
+      border-bottom: 2px solid #409eff;
+      background-color: #ecf5ff;
+      :deep(.el-sub-menu__title) {
+        color: #409eff !important;
+      }
+    }
+
+    .top_1 {
+      display: flex;
+      align-items: center;
+
+      .image {
+        height: 40px;
+        width: 40px;
+        margin: 0 5px 0 0;
+      }
+
+      .content {
+        margin: 0 0 0 5px;
+
+        .title {
+          margin: 0 0 5px 0;
+          font-size: 20px;
+          font-weight: bold;
+        }
+
+        .english {
+          margin: 0 0 0 5px;
+          font-size: 12px;
+          opacity: 0.8;
+          color: #1c66e7;
+        }
+      }
+    }
+
+    :deep(.ant-tabs-nav) {
+      margin: 0 !important;
+    }
+
+    :deep(.ant-tabs-nav::before) {
+      border: 0 !important;
+    }
+
+    :deep(.el-menu) {
+      border: none !important;
+    }
+
+    .top_2 {
+      display: flex;
+      justify-content: flex-end;
+      .example-showcase .el-dropdown-link {
+        cursor: pointer;
+        color: #1c66e7;
+        display: flex;
+        align-items: center;
+      }
+    }
+    .top_3 {
+      margin: 5px 0 0 160px;
+    }
+  }
+  .center {
+    min-height: 77vh;
+  }
+  .bottom {
+    width: 100%;
+    padding: 7px 0;
+    font-size: 14px;
+    background-color: #2e3546;
+    color: #f0f2f5;
+    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial,
+      'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',
+      'Noto Color Emoji';
+    font-variant: tabular-nums;
+    line-height: 1.5715;
+    font-feature-settings: 'tnum', 'tnum';
+
+    .image {
+      width: 78px;
+      height: 78px;
+    }
+
+    .footTitle {
+      margin: 5px 0 0 0;
+
+      .footSpan {
+        margin-bottom: 3px;
+      }
+    }
+
+    .footTop {
+      font-size: 18px;
+      margin-bottom: 12px;
+    }
+  }
+
+  .footflex {
+    display: flex;
+    align-items: center;
+    justify-content: space-evenly;
+  }
+
+  .footflex1 {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+  }
+}
+</style>

+ 57 - 0
src/layout/site.js

@@ -0,0 +1,57 @@
+// 图片引入
+import logo from '/images/logo.png'
+import home from '/images/home.jpg'
+import Code from '/images/code.png'
+import Unit from '/images/unit.png'
+// 网站基本设置
+export const siteInfo = {
+  display: false,
+  zhTitle: '产学研用协同创新平台',
+  zhEnglish: 'Information Technology Incubation Platform',
+  zhBrief: '方寸心间 创新无限',
+  logoUrl: logo,
+  videoUrl: home
+}
+// 网站底部信息
+export const footInfo = {
+  Phone: '0431-81165166',
+  Email: 'jlpstm@126.com',
+  Address: '吉林省长春市硅谷西街156号',
+  Copyright: 'Copyright©2007-2024 吉林省华欣数字科技股份有限公司 │ 吉ICP备14005689号',
+  Company: '吉林省华欣数字科技股份有限公司',
+  Code,
+  Unit
+}
+// 菜单设置
+export const menuList = [
+  { _id: '1', title: '首页', href: 'one', English: 'Home', type: '1' },
+  { _id: '2', title: '信息发布', href: 'two', English: 'Information Release', type: '1' },
+  { _id: '3', title: '创新中心', href: 'thr', English: 'News Information', type: '1' },
+  { _id: '4', title: '信息检索', href: 'four', English: 'Expert Tank', type: '1' },
+  { _id: '5', title: '双创活动', href: 'five', English: 'Authorized Operator', type: '1' },
+  { _id: '6', title: '中试平台', href: 'six', English: 'Project Selection', type: '1' },
+  { _id: '7', title: '服务支撑', href: 'seven', English: 'Innovation Competition', type: '1' },
+  { _id: '8', title: '产业集群', href: 'eight', English: 'Innovation Competition', type: '1' },
+  {
+    _id: '9',
+    title: '成果展示',
+    href: 'nine',
+    English: 'Innovation Competition',
+    type: '1'
+  },
+  {
+    _id: '10',
+    title: '信息库',
+    href: 'ten',
+    English: 'Innovation Competition',
+    type: '1'
+  },
+  { _id: '11', title: '孵化器', href: 'eleven', English: 'Achievement Display', type: '1' },
+  {
+    _id: '12',
+    title: '产业孵化大脑',
+    href: 'twelve',
+    English: 'Achievement Display',
+    type: '1'
+  }
+]

+ 37 - 0
src/main.js

@@ -0,0 +1,37 @@
+import { createApp } from 'vue'
+import { setupStore } from '@/store'
+
+import App from './App.vue'
+import router from './router'
+
+// element
+import ElementPlus from 'element-plus'
+import 'element-plus/dist/index.css'
+import locale from 'element-plus/es/locale/lang/zh-cn'
+import * as ElementPlusIconsVue from '@element-plus/icons-vue'
+
+// 请求检查函数
+import { InitCheckResult } from './utils/checkResult'
+import { InitVariable } from './utils/variable'
+// 组件
+import globalComponents from '@/components'
+// 自动滚动
+import vue3SeamlessScroll from 'vue3-seamless-scroll'
+// Antd
+import Antd from 'ant-design-vue'
+import 'ant-design-vue/dist/reset.css'
+import 'default-passive-events'
+
+const app = createApp(App)
+globalComponents(app)
+setupStore(app)
+for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
+  app.component(key, component)
+}
+app.use(router)
+app.use(Antd)
+app.use(ElementPlus, { locale })
+app.use(vue3SeamlessScroll, { name: 'vue3SeamlessScroll' })
+InitCheckResult(app)
+InitVariable(app)
+app.mount('#app')

+ 254 - 0
src/router/index.js

@@ -0,0 +1,254 @@
+import { createRouter, createWebHistory } from 'vue-router'
+export const Layout = () => import('@/layout/index.vue')
+import { UserStore } from '@/store/user'
+import axios from 'axios'
+const router = createRouter({
+  history: createWebHistory(import.meta.env.BASE_URL),
+  routes: [
+    {
+      path: '/',
+      redirect: '/index'
+    },
+    {
+      path: '/index',
+      name: 'index',
+      meta: { title: '产学研用协同创新平台' },
+      component: () => import('@/views/index/index.vue')
+    },
+    {
+      path: '/',
+      name: 'Layout',
+      component: Layout,
+      children: [
+        {
+          path: '/one',
+          name: 'one',
+          meta: { title: '产学研用协同创新平台-首页' },
+          component: () => import('@/views/main/one.vue')
+        },
+        {
+          path: '/two',
+          name: 'two',
+          meta: { title: '产学研用协同创新平台-信息发布' },
+          component: () => import('@/views/main/two.vue')
+        },
+        {
+          path: '/thr',
+          name: 'thr',
+          meta: { title: '产学研用协同创新平台-创新中心' },
+          component: () => import('@/views/main/thr.vue')
+        },
+        {
+          path: '/four',
+          name: 'four',
+          meta: { title: '产学研用协同创新平台-信息检索' },
+          component: () => import('@/views/main/four.vue')
+        },
+        {
+          path: '/five',
+          name: 'five',
+          meta: { title: '产学研用协同创新平台-双创活动' },
+          component: () => import('@/views/main/five.vue')
+        },
+        {
+          path: '/six',
+          name: 'six',
+          meta: { title: '产学研用协同创新平台-中试平台' },
+          component: () => import('@/views/main/six.vue')
+        },
+        {
+          path: '/seven',
+          name: 'seven',
+          meta: { title: '产学研用协同创新平台-服务支撑' },
+          component: () => import('@/views/main/seven.vue')
+        },
+        {
+          path: '/eight',
+          name: 'eight',
+          meta: { title: '产学研用协同创新平台-产业集群' },
+          component: () => import('@/views/main/eight.vue')
+        },
+        {
+          path: '/nine',
+          name: 'nine',
+          meta: { title: '产学研用协同创新平台-成果展示' },
+          component: () => import('@/views/main/nine.vue')
+        },
+        {
+          path: '/ten',
+          name: 'ten',
+          meta: { title: '产学研用协同创新平台-信息库' },
+          component: () => import('@/views/main/ten.vue')
+        },
+        {
+          path: '/eleven',
+          name: 'eleven',
+          meta: { title: '产学研用协同创新平台-孵化器' },
+          component: () => import('@/views/main/eleven.vue')
+        },
+        {
+          path: '/twelve',
+          name: 'twelve',
+          meta: { title: '产学研用协同创新平台-产业孵化大脑' },
+          component: () => import('@/views/main/twelve.vue')
+        },
+        {
+          path: '/home',
+          name: 'home',
+          meta: { title: '产学研用协同创新平台-首页' },
+          component: () => import('@/views/home/index.vue')
+        },
+        {
+          path: '/news',
+          name: 'news',
+          meta: { title: '产学研用协同创新平台-政策新闻' },
+          component: () => import('@/views/news/index.vue')
+        },
+        {
+          path: '/demand',
+          name: 'demand',
+          meta: { title: '产学研用协同创新平台-需方中心' },
+          component: () => import('@/views/demand/index.vue')
+        },
+        {
+          path: '/supply',
+          name: 'supply',
+          meta: { title: '产学研用协同创新平台-供方中心' },
+          component: () => import('@/views/supply/index.vue')
+        },
+        {
+          path: '/brain',
+          name: 'brain',
+          meta: { title: '产学研用协同创新平台-新闻资讯' },
+          component: () => import('@/views/brain/index.vue')
+        },
+        {
+          path: '/innovation',
+          name: 'innovation',
+          meta: { title: '产学研用协同创新平台-创新大赛' },
+          component: () => import('@/views/innovation/index.vue')
+        },
+        {
+          path: '/achievement',
+          name: 'achievement',
+          meta: { title: '产学研用协同创新平台-成果展示' },
+          component: () => import('@/views/achievement/index.vue')
+        },
+        {
+          path: '/company',
+          name: 'company',
+          meta: { title: '产学研用协同创新平台-企业' },
+          component: () => import('@/views/company/index.vue')
+        },
+        {
+          path: '/expert',
+          name: 'expert',
+          meta: { title: '产学研用协同创新平台-专家' },
+          component: () => import('@/views/expert/index.vue')
+        },
+        {
+          path: '/project',
+          name: 'project',
+          meta: { title: '产学研用协同创新平台-项目' },
+          component: () => import('@/views/project/index.vue')
+        },
+        {
+          path: '/achievement/detail',
+          meta: { title: '产学研用协同创新平台-详情' },
+          component: () => import('@/views/achievement/detail.vue')
+        },
+        {
+          path: '/demand/detail',
+          meta: { title: '产学研用协同创新平台-详情' },
+          component: () => import('@/views/demand/detail.vue')
+        },
+        {
+          path: '/news/detail',
+          meta: { title: '产学研用协同创新平台-详情' },
+          component: () => import('@/views/news/detail.vue')
+        },
+        {
+          path: '/innovation/detail',
+          meta: { title: '产学研用协同创新平台-详情' },
+          component: () => import('@/views/innovation/detail.vue')
+        },
+        {
+          path: '/project/detail',
+          meta: { title: '产学研用协同创新平台-详情' },
+          component: () => import('@/views/project/detail.vue')
+        },
+        {
+          path: '/expert/detail',
+          meta: { title: '产学研用协同创新平台-专家' },
+          component: () => import('@/views/expert/detail.vue')
+        },
+        {
+          path: '/company/detail',
+          meta: { title: '产学研用协同创新平台-企业' },
+          component: () => import('@/views/company/detail.vue')
+        },
+        {
+          path: '/release',
+          meta: { title: '产学研用协同创新平台-发布' },
+          component: () => import('@/views/release/index.vue')
+        },
+        {
+          path: '/search',
+          meta: { title: '产学研用协同创新平台-搜索' },
+          component: () => import('@/views/search/index.vue')
+        },
+        {
+          path: '/chat',
+          meta: { title: '产学研用协同创新平台-聊天记录' },
+          component: () => import('@/views/chat/index.vue')
+        },
+        {
+          path: '/login',
+          meta: { title: '产学研用协同创新平台-用户登录' },
+          component: () => import('@/views/login/index.vue')
+        },
+        {
+          path: '/register',
+          meta: { title: '产学研用协同创新平台-用户注册' },
+          component: () => import('@/views/register/index.vue')
+        },
+        {
+          path: '/center',
+          meta: { title: '产学研用协同创新平台-个人中心' },
+          component: () => import('@/views/center/index.vue')
+        },
+        {
+          path: '/sign',
+          meta: { title: '产学研用协同创新平台-我的报名' },
+          component: () => import('@/views/sign/index.vue')
+        },
+        {
+          path: '/help',
+          meta: { title: '产学研用协同创新平台-帮助中心' },
+          component: () => import('@/views/help/index.vue')
+        }
+      ]
+    }
+  ]
+})
+router.beforeEach(async (to, from, next) => {
+  const userStore = UserStore()
+  document.title = `${to.meta.title} `
+  const token = localStorage.getItem('token')
+  if (token) {
+    const res = await axios.request({
+      method: 'get',
+      url: `${import.meta.env.VITE_APP_BASE_API}/token/tokenView`,
+      responseType: 'json',
+      headers: {
+        token: token
+      }
+    })
+    if (res.data.errcode == '0') userStore.setUser(res.data.data)
+    next()
+  } else next()
+})
+router.afterEach(() => {
+  window.scrollTo(0, 0)
+})
+export default router

+ 16 - 0
src/settings.js

@@ -0,0 +1,16 @@
+const defaultSettings = {
+  title: 'admin-template',
+  version: 'v0.0.1',
+  showSettings: true,
+  tagsView: true,
+  fixedHeader: false,
+  sidebarLogo: true,
+  layout: 'left',
+  theme: 'light',
+  size: 'default',
+  language: 'zh-cn',
+  themeColor: '#409EFF',
+  watermark: { enabled: false, content: '福瑞科技' }
+}
+
+export default defaultSettings

+ 25 - 0
src/store/api/login.js

@@ -0,0 +1,25 @@
+import { defineStore } from 'pinia'
+import { get, omit } from 'lodash-es'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+const axios = new AxiosWrapper()
+export const LoginStore = defineStore('login', () => {
+  const login = async (payload) => {
+    const type = get(payload, 'type')
+    const np = omit(payload, 'type')
+    const res = await axios.$post(`/login/${type}`, np)
+    return res
+  }
+  const rp = async (payload) => {
+    const type = get(payload, 'type')
+    const np = omit(payload, 'type')
+    const res = await axios.$post(`/login/updatePwd/${type}`, np)
+    return res
+  }
+  const rpNoNewPassword = async (payload) => {
+    const type = get(payload, 'type')
+    const np = omit(payload, 'type')
+    const res = await axios.$post(`/login/resetPwd/${type}`, np)
+    return res
+  }
+  return { login, rp, rpNoNewPassword }
+})

+ 54 - 0
src/store/api/platform/achievement.js

@@ -0,0 +1,54 @@
+import { defineStore } from 'pinia'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+import { get } from 'lodash-es'
+const url = '/achievement'
+const axios = new AxiosWrapper()
+
+export const AchievementStore = defineStore('achievement', () => {
+  const query = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}`, cond)
+    return res
+  }
+  const list = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}/list`, cond)
+    return res
+  }
+  const fetch = async (payload) => {
+    const res = await axios.$get(`${url}/${payload}`)
+    return res
+  }
+  const detail = async (payload) => {
+    const res = await axios.$get(`${url}/detail/${payload}`)
+    return res
+  }
+  const create = async (payload) => {
+    const res = await axios.$post(`${url}`, payload)
+    return res
+  }
+  const update = async (payload) => {
+    const id = get(payload, 'id', get(payload, '_id'))
+    const res = await axios.$post(`${url}/${id}`, payload)
+    return res
+  }
+  const del = async (payload) => {
+    const res = await axios.$delete(`${url}/${payload}`)
+    return res
+  }
+  return {
+    query,
+    list,
+    fetch,
+    detail,
+    create,
+    update,
+    del
+  }
+})

+ 55 - 0
src/store/api/platform/chat.js

@@ -0,0 +1,55 @@
+import { defineStore } from 'pinia'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+import { get } from 'lodash-es'
+const url = '/chat'
+const axios = new AxiosWrapper()
+
+export const ChatStore = defineStore('chat', () => {
+  const query = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}`, cond)
+    return res
+  }
+  const chat = async (cond) => {
+    const res = await axios.$get(`${url}/chat`, cond)
+    return res
+  }
+  const read = async (cond) => {
+    const res = await axios.$get(`${url}/read`, cond)
+    return res
+  }
+  const fetch = async (payload) => {
+    const res = await axios.$get(`${url}/${payload}`)
+    return res
+  }
+  const create = async (payload) => {
+    const res = await axios.$post(`${url}`, payload)
+    return res
+  }
+  const cancel = async (payload) => {
+    const res = await axios.$post(`${url}/cancel`, payload)
+    return res
+  }
+  const update = async (payload) => {
+    const id = get(payload, 'id', get(payload, '_id'))
+    const res = await axios.$post(`${url}/${id}`, payload)
+    return res
+  }
+  const del = async (payload) => {
+    const res = await axios.$delete(`${url}/${payload}`)
+    return res
+  }
+  return {
+    query,
+    chat,
+    read,
+    fetch,
+    create,
+    update,
+    cancel,
+    del
+  }
+})

+ 45 - 0
src/store/api/platform/collection.js

@@ -0,0 +1,45 @@
+import { defineStore } from 'pinia'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+import { get } from 'lodash-es'
+const url = '/collection'
+const axios = new AxiosWrapper()
+
+export const CollectionStore = defineStore('collection', () => {
+  const query = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}`, cond)
+    return res
+  }
+  const fetch = async (payload) => {
+    const res = await axios.$get(`${url}/${payload}`)
+    return res
+  }
+  const create = async (payload) => {
+    const res = await axios.$post(`${url}`, payload)
+    return res
+  }
+  const cancel = async (payload) => {
+    const res = await axios.$post(`${url}/cancel`, payload)
+    return res
+  }
+  const update = async (payload) => {
+    const id = get(payload, 'id', get(payload, '_id'))
+    const res = await axios.$post(`${url}/${id}`, payload)
+    return res
+  }
+  const del = async (payload) => {
+    const res = await axios.$delete(`${url}/${payload}`)
+    return res
+  }
+  return {
+    query,
+    fetch,
+    create,
+    update,
+    cancel,
+    del
+  }
+})

+ 54 - 0
src/store/api/platform/demand.js

@@ -0,0 +1,54 @@
+import { defineStore } from 'pinia'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+import { get } from 'lodash-es'
+const url = '/demand'
+const axios = new AxiosWrapper()
+
+export const DemandStore = defineStore('demand', () => {
+  const query = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}`, cond)
+    return res
+  }
+  const list = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}/list`, cond)
+    return res
+  }
+  const fetch = async (payload) => {
+    const res = await axios.$get(`${url}/${payload}`)
+    return res
+  }
+  const detail = async (payload) => {
+    const res = await axios.$get(`${url}/detail/${payload}`)
+    return res
+  }
+  const create = async (payload) => {
+    const res = await axios.$post(`${url}`, payload)
+    return res
+  }
+  const update = async (payload) => {
+    const id = get(payload, 'id', get(payload, '_id'))
+    const res = await axios.$post(`${url}/${id}`, payload)
+    return res
+  }
+  const del = async (payload) => {
+    const res = await axios.$delete(`${url}/${payload}`)
+    return res
+  }
+  return {
+    query,
+    list,
+    fetch,
+    create,
+    detail,
+    update,
+    del
+  }
+})

+ 40 - 0
src/store/api/platform/design.js

@@ -0,0 +1,40 @@
+import { defineStore } from 'pinia'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+import { get } from 'lodash-es'
+const url = '/design'
+const axios = new AxiosWrapper()
+
+export const DesignStore = defineStore('design', () => {
+  const query = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}`, cond)
+    return res
+  }
+  const fetch = async (payload) => {
+    const res = await axios.$get(`${url}/${payload}`)
+    return res
+  }
+  const create = async (payload) => {
+    const res = await axios.$post(`${url}`, payload)
+    return res
+  }
+  const update = async (payload) => {
+    const id = get(payload, 'id', get(payload, '_id'))
+    const res = await axios.$post(`${url}/${id}`, payload)
+    return res
+  }
+  const del = async (payload) => {
+    const res = await axios.$delete(`${url}/${payload}`)
+    return res
+  }
+  return {
+    query,
+    fetch,
+    create,
+    update,
+    del
+  }
+})

+ 45 - 0
src/store/api/platform/match.js

@@ -0,0 +1,45 @@
+import { defineStore } from 'pinia'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+import { get } from 'lodash-es'
+const url = '/match'
+const axios = new AxiosWrapper()
+
+export const MatchStore = defineStore('match', () => {
+  const query = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}`, cond)
+    return res
+  }
+  const fetch = async (payload) => {
+    const res = await axios.$get(`${url}/${payload}`)
+    return res
+  }
+  const detail = async (payload) => {
+    const res = await axios.$get(`${url}/detail/${payload}`)
+    return res
+  }
+  const create = async (payload) => {
+    const res = await axios.$post(`${url}`, payload)
+    return res
+  }
+  const update = async (payload) => {
+    const id = get(payload, 'id', get(payload, '_id'))
+    const res = await axios.$post(`${url}/${id}`, payload)
+    return res
+  }
+  const del = async (payload) => {
+    const res = await axios.$delete(`${url}/${payload}`)
+    return res
+  }
+  return {
+    query,
+    fetch,
+    detail,
+    create,
+    update,
+    del
+  }
+})

+ 40 - 0
src/store/api/platform/news.js

@@ -0,0 +1,40 @@
+import { defineStore } from 'pinia'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+import { get } from 'lodash-es'
+const url = '/news'
+const axios = new AxiosWrapper()
+
+export const NewsStore = defineStore('news', () => {
+  const query = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}`, cond)
+    return res
+  }
+  const fetch = async (payload) => {
+    const res = await axios.$get(`${url}/${payload}`)
+    return res
+  }
+  const create = async (payload) => {
+    const res = await axios.$post(`${url}`, payload)
+    return res
+  }
+  const update = async (payload) => {
+    const id = get(payload, 'id', get(payload, '_id'))
+    const res = await axios.$post(`${url}/${id}`, payload)
+    return res
+  }
+  const del = async (payload) => {
+    const res = await axios.$delete(`${url}/${payload}`)
+    return res
+  }
+  return {
+    query,
+    fetch,
+    create,
+    update,
+    del
+  }
+})

+ 54 - 0
src/store/api/platform/project.js

@@ -0,0 +1,54 @@
+import { defineStore } from 'pinia'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+import { get } from 'lodash-es'
+const url = '/project'
+const axios = new AxiosWrapper()
+
+export const ProjectStore = defineStore('project', () => {
+  const query = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}`, cond)
+    return res
+  }
+  const list = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}/list`, cond)
+    return res
+  }
+  const fetch = async (payload) => {
+    const res = await axios.$get(`${url}/${payload}`)
+    return res
+  }
+  const detail = async (payload) => {
+    const res = await axios.$get(`${url}/detail/${payload}`)
+    return res
+  }
+  const create = async (payload) => {
+    const res = await axios.$post(`${url}`, payload)
+    return res
+  }
+  const update = async (payload) => {
+    const id = get(payload, 'id', get(payload, '_id'))
+    const res = await axios.$post(`${url}/${id}`, payload)
+    return res
+  }
+  const del = async (payload) => {
+    const res = await axios.$delete(`${url}/${payload}`)
+    return res
+  }
+  return {
+    query,
+    list,
+    fetch,
+    detail,
+    create,
+    update,
+    del
+  }
+})

+ 49 - 0
src/store/api/platform/sign.js

@@ -0,0 +1,49 @@
+import { defineStore } from 'pinia'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+import { get } from 'lodash-es'
+const url = '/sign'
+const axios = new AxiosWrapper()
+
+export const SignStore = defineStore('sign', () => {
+  const query = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}`, cond)
+    return res
+  }
+  const sign = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}/sign`, cond)
+    return res
+  }
+  const fetch = async (payload) => {
+    const res = await axios.$get(`${url}/${payload}`)
+    return res
+  }
+  const create = async (payload) => {
+    const res = await axios.$post(`${url}`, payload)
+    return res
+  }
+  const update = async (payload) => {
+    const id = get(payload, 'id', get(payload, '_id'))
+    const res = await axios.$post(`${url}/${id}`, payload)
+    return res
+  }
+  const del = async (payload) => {
+    const res = await axios.$delete(`${url}/${payload}`)
+    return res
+  }
+  return {
+    query,
+    sign,
+    fetch,
+    create,
+    update,
+    del
+  }
+})

+ 54 - 0
src/store/api/platform/supply.js

@@ -0,0 +1,54 @@
+import { defineStore } from 'pinia'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+import { get } from 'lodash-es'
+const url = '/supply'
+const axios = new AxiosWrapper()
+
+export const SupplyStore = defineStore('supply', () => {
+  const query = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}`, cond)
+    return res
+  }
+  const list = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}/list`, cond)
+    return res
+  }
+  const fetch = async (payload) => {
+    const res = await axios.$get(`${url}/${payload}`)
+    return res
+  }
+  const detail = async (payload) => {
+    const res = await axios.$get(`${url}/detail/${payload}`)
+    return res
+  }
+  const create = async (payload) => {
+    const res = await axios.$post(`${url}`, payload)
+    return res
+  }
+  const update = async (payload) => {
+    const id = get(payload, 'id', get(payload, '_id'))
+    const res = await axios.$post(`${url}/${id}`, payload)
+    return res
+  }
+  const del = async (payload) => {
+    const res = await axios.$delete(`${url}/${payload}`)
+    return res
+  }
+  return {
+    query,
+    list,
+    fetch,
+    create,
+    detail,
+    update,
+    del
+  }
+})

+ 37 - 0
src/store/api/platform/tool.js

@@ -0,0 +1,37 @@
+import { defineStore } from 'pinia'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+const url = '/tool'
+const axios = new AxiosWrapper()
+
+export const ToolStore = defineStore('tool', () => {
+  const query = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}/query`, cond)
+    return res
+  }
+  const getCollection = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}/MyCollection`, cond)
+    return res
+  }
+  const total = async (info) => {
+    const res = await axios.$get(`${url}/getTotal`, info)
+    return res
+  }
+  const getTotal = async () => {
+    const res = await axios.$get(`${url}/CollectionTotal`)
+    return res
+  }
+  return {
+    query,
+    total,
+    getCollection,
+    getTotal
+  }
+})

+ 40 - 0
src/store/api/system/dictData.js

@@ -0,0 +1,40 @@
+import { defineStore } from 'pinia'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+import { get } from 'lodash-es'
+const url = '/dictData'
+const axios = new AxiosWrapper()
+
+export const DictDataStore = defineStore('dictData', () => {
+  const query = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}`, cond)
+    return res
+  }
+  const fetch = async (payload) => {
+    const res = await axios.$get(`${url}/${payload}`)
+    return res
+  }
+  const create = async (payload) => {
+    const res = await axios.$post(`${url}`, payload)
+    return res
+  }
+  const update = async (payload) => {
+    const id = get(payload, 'id', get(payload, '_id'))
+    const res = await axios.$post(`${url}/${id}`, payload)
+    return res
+  }
+  const del = async (payload) => {
+    const res = await axios.$delete(`${url}/${payload}`)
+    return res
+  }
+  return {
+    query,
+    fetch,
+    create,
+    update,
+    del
+  }
+})

+ 40 - 0
src/store/api/system/dictType.js

@@ -0,0 +1,40 @@
+import { defineStore } from 'pinia'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+import { get } from 'lodash-es'
+const url = '/dictType'
+const axios = new AxiosWrapper()
+
+export const DictTypeStore = defineStore('dictType', () => {
+  const query = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}`, cond)
+    return res
+  }
+  const fetch = async (payload) => {
+    const res = await axios.$get(`${url}/${payload}`)
+    return res
+  }
+  const create = async (payload) => {
+    const res = await axios.$post(`${url}`, payload)
+    return res
+  }
+  const update = async (payload) => {
+    const id = get(payload, 'id', get(payload, '_id'))
+    const res = await axios.$post(`${url}/${id}`, payload)
+    return res
+  }
+  const del = async (payload) => {
+    const res = await axios.$delete(`${url}/${payload}`)
+    return res
+  }
+  return {
+    query,
+    fetch,
+    create,
+    update,
+    del
+  }
+})

+ 40 - 0
src/store/api/system/menus.js

@@ -0,0 +1,40 @@
+import { defineStore } from 'pinia'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+import { get } from 'lodash-es'
+const url = '/menus'
+const axios = new AxiosWrapper()
+
+export const MenusStore = defineStore('menus', () => {
+  const query = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}`, cond)
+    return res
+  }
+  const fetch = async (payload) => {
+    const res = await axios.$get(`${url}/${payload}`)
+    return res
+  }
+  const create = async (payload) => {
+    const res = await axios.$post(`${url}`, payload)
+    return res
+  }
+  const update = async (payload) => {
+    const id = get(payload, 'id', get(payload, '_id'))
+    const res = await axios.$post(`${url}/${id}`, payload)
+    return res
+  }
+  const del = async (payload) => {
+    const res = await axios.$delete(`${url}/${payload}`)
+    return res
+  }
+  return {
+    query,
+    fetch,
+    create,
+    update,
+    del
+  }
+})

+ 40 - 0
src/store/api/system/role.js

@@ -0,0 +1,40 @@
+import { defineStore } from 'pinia'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+import { get } from 'lodash-es'
+const url = '/role'
+const axios = new AxiosWrapper()
+
+export const RoleStore = defineStore('role', () => {
+  const query = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}`, cond)
+    return res
+  }
+  const fetch = async (payload) => {
+    const res = await axios.$get(`${url}/${payload}`)
+    return res
+  }
+  const create = async (payload) => {
+    const res = await axios.$post(`${url}`, payload)
+    return res
+  }
+  const update = async (payload) => {
+    const id = get(payload, 'id', get(payload, '_id'))
+    const res = await axios.$post(`${url}/${id}`, payload)
+    return res
+  }
+  const del = async (payload) => {
+    const res = await axios.$delete(`${url}/${payload}`)
+    return res
+  }
+  return {
+    query,
+    fetch,
+    create,
+    update,
+    del
+  }
+})

+ 40 - 0
src/store/api/system/tags.js

@@ -0,0 +1,40 @@
+import { defineStore } from 'pinia'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+import { get } from 'lodash-es'
+const url = '/tags'
+const axios = new AxiosWrapper()
+
+export const TagsStore = defineStore('tags', () => {
+  const query = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}`, cond)
+    return res
+  }
+  const fetch = async (payload) => {
+    const res = await axios.$get(`${url}/${payload}`)
+    return res
+  }
+  const create = async (payload) => {
+    const res = await axios.$post(`${url}`, payload)
+    return res
+  }
+  const update = async (payload) => {
+    const id = get(payload, 'id', get(payload, '_id'))
+    const res = await axios.$post(`${url}/${id}`, payload)
+    return res
+  }
+  const del = async (payload) => {
+    const res = await axios.$delete(`${url}/${payload}`)
+    return res
+  }
+  return {
+    query,
+    fetch,
+    create,
+    update,
+    del
+  }
+})

+ 40 - 0
src/store/api/user/admin.js

@@ -0,0 +1,40 @@
+import { defineStore } from 'pinia'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+import { get } from 'lodash-es'
+const url = '/admin'
+const axios = new AxiosWrapper()
+
+export const AdminStore = defineStore('admin', () => {
+  const query = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}`, cond)
+    return res
+  }
+  const fetch = async (payload) => {
+    const res = await axios.$get(`${url}/${payload}`)
+    return res
+  }
+  const create = async (payload) => {
+    const res = await axios.$post(`${url}`, payload)
+    return res
+  }
+  const update = async (payload) => {
+    const id = get(payload, 'id', get(payload, '_id'))
+    const res = await axios.$post(`${url}/${id}`, payload)
+    return res
+  }
+  const del = async (payload) => {
+    const res = await axios.$delete(`${url}/${payload}`)
+    return res
+  }
+  return {
+    query,
+    fetch,
+    create,
+    update,
+    del
+  }
+})

+ 40 - 0
src/store/api/user/association.js

@@ -0,0 +1,40 @@
+import { defineStore } from 'pinia'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+import { get } from 'lodash-es'
+const url = '/association'
+const axios = new AxiosWrapper()
+
+export const AssociationStore = defineStore('association', () => {
+  const query = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}`, cond)
+    return res
+  }
+  const fetch = async (payload) => {
+    const res = await axios.$get(`${url}/${payload}`)
+    return res
+  }
+  const create = async (payload) => {
+    const res = await axios.$post(`${url}`, payload)
+    return res
+  }
+  const update = async (payload) => {
+    const id = get(payload, 'id', get(payload, '_id'))
+    const res = await axios.$post(`${url}/${id}`, payload)
+    return res
+  }
+  const del = async (payload) => {
+    const res = await axios.$delete(`${url}/${payload}`)
+    return res
+  }
+  return {
+    query,
+    fetch,
+    create,
+    update,
+    del
+  }
+})

+ 54 - 0
src/store/api/user/company.js

@@ -0,0 +1,54 @@
+import { defineStore } from 'pinia'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+import { get } from 'lodash-es'
+const url = '/company'
+const axios = new AxiosWrapper()
+
+export const CompanyStore = defineStore('company', () => {
+  const query = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}`, cond)
+    return res
+  }
+  const list = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}/list`, cond)
+    return res
+  }
+  const fetch = async (payload) => {
+    const res = await axios.$get(`${url}/${payload}`)
+    return res
+  }
+  const detail = async (payload) => {
+    const res = await axios.$get(`${url}/detail/${payload}`)
+    return res
+  }
+  const create = async (payload) => {
+    const res = await axios.$post(`${url}`, payload)
+    return res
+  }
+  const update = async (payload) => {
+    const id = get(payload, 'id', get(payload, '_id'))
+    const res = await axios.$post(`${url}/${id}`, payload)
+    return res
+  }
+  const del = async (payload) => {
+    const res = await axios.$delete(`${url}/${payload}`)
+    return res
+  }
+  return {
+    query,
+    list,
+    fetch,
+    detail,
+    create,
+    update,
+    del
+  }
+})

+ 40 - 0
src/store/api/user/competition.js

@@ -0,0 +1,40 @@
+import { defineStore } from 'pinia'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+import { get } from 'lodash-es'
+const url = '/competition'
+const axios = new AxiosWrapper()
+
+export const CompetitionStore = defineStore('competition', () => {
+  const query = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}`, cond)
+    return res
+  }
+  const fetch = async (payload) => {
+    const res = await axios.$get(`${url}/${payload}`)
+    return res
+  }
+  const create = async (payload) => {
+    const res = await axios.$post(`${url}`, payload)
+    return res
+  }
+  const update = async (payload) => {
+    const id = get(payload, 'id', get(payload, '_id'))
+    const res = await axios.$post(`${url}/${id}`, payload)
+    return res
+  }
+  const del = async (payload) => {
+    const res = await axios.$delete(`${url}/${payload}`)
+    return res
+  }
+  return {
+    query,
+    fetch,
+    create,
+    update,
+    del
+  }
+})

+ 54 - 0
src/store/api/user/expert.js

@@ -0,0 +1,54 @@
+import { defineStore } from 'pinia'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+import { get } from 'lodash-es'
+const url = '/expert'
+const axios = new AxiosWrapper()
+
+export const ExpertStore = defineStore('expert', () => {
+  const query = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}`, cond)
+    return res
+  }
+  const list = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}/list`, cond)
+    return res
+  }
+  const fetch = async (payload) => {
+    const res = await axios.$get(`${url}/${payload}`)
+    return res
+  }
+  const detail = async (payload) => {
+    const res = await axios.$get(`${url}/detail/${payload}`)
+    return res
+  }
+  const create = async (payload) => {
+    const res = await axios.$post(`${url}`, payload)
+    return res
+  }
+  const update = async (payload) => {
+    const id = get(payload, 'id', get(payload, '_id'))
+    const res = await axios.$post(`${url}/${id}`, payload)
+    return res
+  }
+  const del = async (payload) => {
+    const res = await axios.$delete(`${url}/${payload}`)
+    return res
+  }
+  return {
+    query,
+    list,
+    fetch,
+    detail,
+    create,
+    update,
+    del
+  }
+})

+ 40 - 0
src/store/api/user/incubator.js

@@ -0,0 +1,40 @@
+import { defineStore } from 'pinia'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+import { get } from 'lodash-es'
+const url = '/incubator'
+const axios = new AxiosWrapper()
+
+export const IncubatorStore = defineStore('incubator', () => {
+  const query = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}`, cond)
+    return res
+  }
+  const fetch = async (payload) => {
+    const res = await axios.$get(`${url}/${payload}`)
+    return res
+  }
+  const create = async (payload) => {
+    const res = await axios.$post(`${url}`, payload)
+    return res
+  }
+  const update = async (payload) => {
+    const id = get(payload, 'id', get(payload, '_id'))
+    const res = await axios.$post(`${url}/${id}`, payload)
+    return res
+  }
+  const del = async (payload) => {
+    const res = await axios.$delete(`${url}/${payload}`)
+    return res
+  }
+  return {
+    query,
+    fetch,
+    create,
+    update,
+    del
+  }
+})

+ 40 - 0
src/store/api/user/investment.js

@@ -0,0 +1,40 @@
+import { defineStore } from 'pinia'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+import { get } from 'lodash-es'
+const url = '/investment'
+const axios = new AxiosWrapper()
+
+export const InvestmentStore = defineStore('investment', () => {
+  const query = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}`, cond)
+    return res
+  }
+  const fetch = async (payload) => {
+    const res = await axios.$get(`${url}/${payload}`)
+    return res
+  }
+  const create = async (payload) => {
+    const res = await axios.$post(`${url}`, payload)
+    return res
+  }
+  const update = async (payload) => {
+    const id = get(payload, 'id', get(payload, '_id'))
+    const res = await axios.$post(`${url}/${id}`, payload)
+    return res
+  }
+  const del = async (payload) => {
+    const res = await axios.$delete(`${url}/${payload}`)
+    return res
+  }
+  return {
+    query,
+    fetch,
+    create,
+    update,
+    del
+  }
+})

+ 40 - 0
src/store/api/user/state.js

@@ -0,0 +1,40 @@
+import { defineStore } from 'pinia'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+import { get } from 'lodash-es'
+const url = '/state'
+const axios = new AxiosWrapper()
+
+export const StateStore = defineStore('state', () => {
+  const query = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}`, cond)
+    return res
+  }
+  const fetch = async (payload) => {
+    const res = await axios.$get(`${url}/${payload}`)
+    return res
+  }
+  const create = async (payload) => {
+    const res = await axios.$post(`${url}`, payload)
+    return res
+  }
+  const update = async (payload) => {
+    const id = get(payload, 'id', get(payload, '_id'))
+    const res = await axios.$post(`${url}/${id}`, payload)
+    return res
+  }
+  const del = async (payload) => {
+    const res = await axios.$delete(`${url}/${payload}`)
+    return res
+  }
+  return {
+    query,
+    fetch,
+    create,
+    update,
+    del
+  }
+})

+ 40 - 0
src/store/api/user/unit.js

@@ -0,0 +1,40 @@
+import { defineStore } from 'pinia'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+import { get } from 'lodash-es'
+const url = '/unit'
+const axios = new AxiosWrapper()
+
+export const UnitStore = defineStore('unit', () => {
+  const query = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}`, cond)
+    return res
+  }
+  const fetch = async (payload) => {
+    const res = await axios.$get(`${url}/${payload}`)
+    return res
+  }
+  const create = async (payload) => {
+    const res = await axios.$post(`${url}`, payload)
+    return res
+  }
+  const update = async (payload) => {
+    const id = get(payload, 'id', get(payload, '_id'))
+    const res = await axios.$post(`${url}/${id}`, payload)
+    return res
+  }
+  const del = async (payload) => {
+    const res = await axios.$delete(`${url}/${payload}`)
+    return res
+  }
+  return {
+    query,
+    fetch,
+    create,
+    update,
+    del
+  }
+})

+ 45 - 0
src/store/api/user/user.js

@@ -0,0 +1,45 @@
+import { defineStore } from 'pinia'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+import { get } from 'lodash-es'
+const url = '/user'
+const axios = new AxiosWrapper()
+
+export const UsersStore = defineStore('users', () => {
+  const query = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}`, cond)
+    return res
+  }
+  const fetch = async (payload) => {
+    const res = await axios.$get(`${url}/${payload}`)
+    return res
+  }
+  const detail = async (payload) => {
+    const res = await axios.$get(`${url}/detail/${payload}`)
+    return res
+  }
+  const create = async (payload) => {
+    const res = await axios.$post(`${url}`, payload)
+    return res
+  }
+  const update = async (payload) => {
+    const id = get(payload, 'id', get(payload, '_id'))
+    const res = await axios.$post(`${url}/${id}`, payload)
+    return res
+  }
+  const del = async (payload) => {
+    const res = await axios.$delete(`${url}/${payload}`)
+    return res
+  }
+  return {
+    query,
+    fetch,
+    detail,
+    create,
+    update,
+    del
+  }
+})

+ 12 - 0
src/store/index.js

@@ -0,0 +1,12 @@
+import { createPinia } from 'pinia'
+
+const store = createPinia()
+
+// 全局注册 store
+export function setupStore(app) {
+  app.use(store)
+}
+
+export * from './modules/app'
+export * from './modules/tagsView'
+export { store }

+ 0 - 0
src/store/modules/app.js


이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.