Browse Source

考勤管理

master
song 4 years ago
parent
commit
e0e3e11d05
  1. 2
      .env
  2. 12
      .env.development
  3. 12
      .env.production
  4. 175
      package-lock.json
  5. 1
      package.json
  6. BIN
      public/favicon.png
  7. BIN
      public/img/icons/favicon-16x16.png
  8. BIN
      public/img/icons/favicon-32x32.png
  9. 11
      public/index.html
  10. 109
      src/App.vue
  11. 200
      src/common/platform.styl
  12. 34
      src/common/portrait.styl
  13. 66
      src/components/Banner/Banner.vue
  14. 32
      src/components/BreadCrumb/BreadCrumb.vue
  15. 63
      src/components/CoreOrgan/CoreOrgan.vue
  16. 92
      src/components/FooterPage/FooterPage.vue
  17. 85
      src/components/FooterPage/FriendShip.vue
  18. 286
      src/components/HeadNav/HeadNav.vue
  19. 177
      src/components/Index/IndexNewList.vue
  20. 140
      src/components/Introduce/AddShopping.vue
  21. 41
      src/components/Introduce/CompanyProfile.vue
  22. 48
      src/components/Introduce/ContactMap.vue
  23. 115
      src/components/Introduce/ContactUs.vue
  24. 132
      src/components/Introduce/DeriveEnterprise.vue
  25. 321
      src/components/Introduce/IntentionModel.vue
  26. 349
      src/components/Introduce/Model.vue
  27. 77
      src/components/Introduce/PartnerShip.styl
  28. 99
      src/components/Introduce/PartnerShip.vue
  29. 46
      src/components/Introduce/RichText.vue
  30. 442
      src/components/Introduce/SettledModel.vue
  31. 190
      src/components/List/List.vue
  32. 27
      src/components/MemberPicker/MemberPicker.vue
  33. 142
      src/components/PlatformList/Fruit.vue
  34. 272
      src/components/PlatformList/PlatformList.vue
  35. 83
      src/components/Rotation/Rotation.vue
  36. 259
      src/components/SettledEnterprise/SettledEnterprise.vue
  37. 83
      src/components/TimePicker/TimePicker.vue
  38. 218
      src/components/User/MechanismSignUp.vue
  39. 204
      src/components/User/PersonalSignUp.vue
  40. 29
      src/config/api-user.js
  41. 119
      src/config/api.js
  42. 19
      src/config/selComment.js
  43. 14
      src/main.js
  44. 304
      src/router/index.js
  45. 143
      src/store/modules/user/actions.js
  46. 16
      src/views/About/About.vue
  47. 66
      src/views/About/Children/Introduce.vue
  48. 126
      src/views/About/Children/Organ.vue
  49. 41
      src/views/About/Children/Partner.vue
  50. 39
      src/views/About/Children/SpinOffs.vue
  51. 62
      src/views/About/components/HNav.vue
  52. 195
      src/views/Activity/ActDetails.vue
  53. 316
      src/views/Activity/Activity.vue
  54. 321
      src/views/Activity/components/Enroll.vue
  55. 174
      src/views/Cart/Cart.vue
  56. 171
      src/views/Cart/CartModel.vue
  57. 23
      src/views/Challenge/Challenge.vue
  58. 248
      src/views/Challenge/Children/Notice.vue
  59. 257
      src/views/Challenge/Children/Release.vue
  60. 105
      src/views/Challenge/Children/Solicitation.vue
  61. 194
      src/views/Challenge/components/Enroll.vue
  62. 54
      src/views/Challenge/components/HNav.vue
  63. 180
      src/views/Community/ComDetails.vue
  64. 268
      src/views/Community/Community.vue
  65. 135
      src/views/Community/Posting.vue
  66. 44
      src/views/ContactUs/ContactUs.vue
  67. 259
      src/views/FirstPage/FirstPage.vue
  68. 56
      src/views/IncubationPlatform/Children/Incubator.vue
  69. 172
      src/views/IncubationPlatform/Children/MakerSpace.vue
  70. 41
      src/views/IncubationPlatform/Children/Partner.vue
  71. 46
      src/views/IncubationPlatform/Children/PilotBase.vue
  72. 170
      src/views/IncubationPlatform/Children/Products.vue
  73. 46
      src/views/IncubationPlatform/Children/PublicLaboratory.vue
  74. 472
      src/views/IncubationPlatform/Children/Services.vue
  75. 97
      src/views/IncubationPlatform/Children/Tutor.vue
  76. 57
      src/views/IncubationPlatform/Children/components/SenNav.vue
  77. 342
      src/views/IncubationPlatform/Children/place/EntitySpace.vue
  78. 69
      src/views/IncubationPlatform/Children/place/InformationFilling.vue
  79. 258
      src/views/IncubationPlatform/Children/place/VirtualSpace.vue
  80. 14
      src/views/IncubationPlatform/IncubationPlatform.vue
  81. 228
      src/views/IncubationPlatform/components/AddModel.vue
  82. 68
      src/views/IncubationPlatform/components/HNav.vue
  83. 37
      src/views/Industry/Children/Enterprise.vue
  84. 427
      src/views/Industry/Children/Serve.vue
  85. 179
      src/views/Industry/Children/Union.vue
  86. 54
      src/views/Industry/Children/components/HNav.vue
  87. 14
      src/views/Industry/Industry.vue
  88. 129
      src/views/ItInformation/ItDetails.vue
  89. 203
      src/views/ItInformation/ItInformation.vue
  90. 48
      src/views/Knowledge/Knowledge.vue
  91. 170
      src/views/NewPlatform/Children/AchDet.vue
  92. 246
      src/views/NewPlatform/Children/Core.vue
  93. 46
      src/views/NewPlatform/Children/Develop.vue
  94. 131
      src/views/NewPlatform/Children/Platform.vue
  95. 427
      src/views/NewPlatform/Children/Service.vue
  96. 106
      src/views/NewPlatform/Children/ServiceDet.vue
  97. 239
      src/views/NewPlatform/Children/Share.vue
  98. 222
      src/views/NewPlatform/Children/ShareChild/InsDet.vue
  99. 315
      src/views/NewPlatform/Children/ShareChild/Institute.vue
  100. 155
      src/views/NewPlatform/Children/Transfer.vue

2
.env

@ -1,3 +1,3 @@
VUE_APP_MODE=production
VUE_APP_PREVIEW=false
VUE_APP_URL=http://www.sxgreenvalley.com/
VUE_APP_URL=https://test.tall.wiki/checkwork

12
.env.development

@ -1,10 +1,10 @@
VUE_APP_MODE=development
VUE_APP_NODE_ENV=development
VUE_APP_SCENE=greenvalley
VUE_APP_BASE_URL=http://www.sxgreenvalley.com/
VUE_APP_API_URL=http://www.sxgreenvalley.com/gateway
VUE_APP_SCENE=checkwork
VUE_APP_BASE_URL=https://test.tall.wiki/checkwork/
VUE_APP_API_URL=https://test.tall.wiki/checkwork/gateway
VUE_APP_PROXY_URL=/gateway
VUE_APP_PUBLIC_PATH=/
VUE_APP_PUBLIC_PATH=/checkwork
VUE_APP_MSG_URL=wss://test.tall.wiki/websocket/message/v4.0/ws
VUE_APP_TITLE=绿谷在线
VUE_APP_DESCRIPTION=绿谷在线管理后台
VUE_APP_TITLE=考勤管理
VUE_APP_DESCRIPTION=考勤管理

12
.env.production

@ -1,10 +1,10 @@
VUE_APP_MODE=production
VUE_APP_NODE_ENV=production
VUE_APP_SCENE=greenvalley
VUE_APP_BASE_URL=http://www.sxgreenvalley.com/
VUE_APP_API_URL=http://www.sxgreenvalley.com/gateway
VUE_APP_SCENE=checkwork
VUE_APP_BASE_URL=https://test.tall.wiki/checkwork/
VUE_APP_API_URL=https://test.tall.wiki/checkwork/gateway
VUE_APP_PROXY_URL=/gateway
VUE_APP_PUBLIC_PATH=/
VUE_APP_PUBLIC_PATH=/checkwork
VUE_APP_MSG_URL=wss://www.tall.wiki/websocket/message/v4.0/ws
VUE_APP_TITLE=绿谷在线
VUE_APP_DESCRIPTION=绿谷在线管理后台
VUE_APP_TITLE=考勤管理
VUE_APP_DESCRIPTION=考勤管理

175
package-lock.json

@ -1808,6 +1808,16 @@
"integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=",
"dev": true
},
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"optional": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"cacache": {
"version": "13.0.1",
"resolved": "https://registry.npm.taobao.org/cacache/download/cacache-13.0.1.tgz?cache=0&sync_timestamp=1594427999421&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcacache%2Fdownload%2Fcacache-13.0.1.tgz",
@ -1840,6 +1850,34 @@
"integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=",
"dev": true
},
"chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"optional": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true,
"optional": true
},
"css-loader": {
"version": "3.6.0",
"resolved": "https://registry.npm.taobao.org/css-loader/download/css-loader-3.6.0.tgz?cache=0&sync_timestamp=1604507107408&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcss-loader%2Fdownload%2Fcss-loader-3.6.0.tgz",
@ -1893,6 +1931,13 @@
"universalify": "^0.1.0"
}
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"optional": true
},
"icss-utils": {
"version": "4.1.1",
"resolved": "https://registry.npm.taobao.org/icss-utils/download/icss-utils-4.1.1.tgz?cache=0&sync_timestamp=1602527330977&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ficss-utils%2Fdownload%2Ficss-utils-4.1.1.tgz",
@ -2007,6 +2052,16 @@
"minipass": "^3.1.1"
}
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"optional": true,
"requires": {
"has-flag": "^4.0.0"
}
},
"terser-webpack-plugin": {
"version": "2.3.8",
"resolved": "https://registry.npm.taobao.org/terser-webpack-plugin/download/terser-webpack-plugin-2.3.8.tgz?cache=0&sync_timestamp=1603881757308&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fterser-webpack-plugin%2Fdownload%2Fterser-webpack-plugin-2.3.8.tgz",
@ -2023,6 +2078,32 @@
"terser": "^4.6.12",
"webpack-sources": "^1.4.3"
}
},
"vue-loader-v16": {
"version": "npm:vue-loader@16.5.0",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.5.0.tgz",
"integrity": "sha512-WXh+7AgFxGTgb5QAkQtFeUcHNIEq3PGVQ8WskY5ZiFbWBkOwcCPRs4w/2tVyTbh2q6TVRlO3xfvIukUtjsu62A==",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
},
"dependencies": {
"loader-utils": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
"dev": true,
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
}
}
}
}
},
@ -5224,14 +5305,6 @@
"safer-buffer": "^2.1.0"
}
},
"echarts": {
"version": "4.9.0",
"resolved": "https://registry.npmjs.org/echarts/-/echarts-4.9.0.tgz",
"integrity": "sha512-+ugizgtJ+KmsJyyDPxaw2Br5FqzuBnyOWwcxPKO6y0gc5caYcfnEUIlNStx02necw8jmKmTafmpHhGo4XDtEIA==",
"requires": {
"zrender": "4.3.2"
}
},
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz",
@ -12657,87 +12730,6 @@
}
}
},
"vue-loader-v16": {
"version": "npm:vue-loader@16.2.0",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.2.0.tgz",
"integrity": "sha512-TitGhqSQ61RJljMmhIGvfWzJ2zk9m1Qug049Ugml6QP3t0e95o0XJjk29roNEiPKJQBEi8Ord5hFuSuELzSp8Q==",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
},
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"optional": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"chalk": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
"integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
"dev": true,
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"optional": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true,
"optional": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"optional": true
},
"loader-utils": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
"dev": true,
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"optional": true,
"requires": {
"has-flag": "^4.0.0"
}
}
}
},
"vue-quill-editor": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/vue-quill-editor/-/vue-quill-editor-3.0.6.tgz",
@ -13837,11 +13829,6 @@
"dev": true
}
}
},
"zrender": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/zrender/-/zrender-4.3.2.tgz",
"integrity": "sha512-bIusJLS8c4DkIcdiK+s13HiQ/zjQQVgpNohtd8d94Y2DnJqgM1yjh/jpDb8DoL6hd7r8Awagw8e3qK/oLaWr3g=="
}
}
}

1
package.json

@ -11,7 +11,6 @@
"ant-design-vue": "^1.2.4",
"compression-webpack-plugin": "^6.1.1",
"core-js": "^3.6.5",
"echarts": "^4.9.0",
"moment": "^2.29.1",
"quill": "^1.3.7",
"register-service-worker": "^1.7.1",

BIN
public/favicon.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

BIN
public/img/icons/favicon-16x16.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

BIN
public/img/icons/favicon-32x32.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

11
public/index.html

@ -1,19 +1,10 @@
<!--
* @Author: wally
* @email: 18603454788@163.com
* @Date: 2021-01-13 17:21:29
* @LastEditors: wally
* @LastEditTime: 2021-01-20 12:57:03
-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="./favicon.png" type="image/x-icon" >
<title>山西绿谷生物科技有限公司</title>
<script type="text/javascript" src="//api.map.baidu.com/api?v=2.0&ak=KPWvSuCuXmgphVhYM6tVHmlkav3TGpu5"></script>
<title>考勤</title>
</head>
<body>
<noscript>

109
src/App.vue

@ -1,78 +1,22 @@
<template>
<a-config-provider :locale="zh_CN">
<div id="app">
<head-nav class="head-nav" />
<router-view></router-view>
<friend-ship class="friend" />
<footer-page class="footer" />
<div id="components-back-top-demo-custom">
<a-back-top>
<div class="ant-back-top-inner"></div>
</a-back-top>
</div>
</div>
</a-config-provider>
<div id="app" class="px-2">
<head-nav class="head-nav" />
<router-view></router-view>
</div>
</template>
<script>
import { mapState, mapActions, mapMutations } from 'vuex';
import zh_CN from 'ant-design-vue/lib/locale-provider/zh_CN';
import HeadNav from './components/HeadNav/HeadNav.vue';
import FooterPage from './components/FooterPage/FooterPage.vue';
import FriendShip from './components/FooterPage/FriendShip.vue';
export default {
name: 'App',
components: { HeadNav, FooterPage, FriendShip },
components: { HeadNav },
data() {
return { zh_CN };
},
computed: mapState('user', ['anyringToken']),
updated() {
window.scroll(0, 0);
},
created() {
console.log("this._isMobile();")
this._isMobile();
// const userId = '1218763410024566784';
// const params = { userId };
// this.getUserId(params);
// if (sessionStorage.getItem('store')) {
// this.$store.replaceState(Object.assign({}, this.$store.state, JSON.parse(sessionStorage.getItem('store'))));
// }
// window.addEventListener('beforeunload', () => {
// sessionStorage.setItem('store', JSON.stringify(this.$store.state));
// });
},
methods: {
...mapActions('user', ['getUserId']),
_isMobile(){
console.log("是否走到了_isMobile")
let flag = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i)
// localStorage.setItem('isiphone',flag)
// localStorage.setItem('ismobile',flag?1:0)
// return flag;
console.log("======>",flag)
let ismobile = flag ? 1 : 0
//
//
if (ismobile == 1) {
console.log("ismobile2",flag)
// if (to.path == '/') {
// next('/home')
// } else {
// next();
// }
window.location.href = "http://www.sxgreenvalley.com/green-phone"
}
},
},
methods: {},
};
</script>
@ -81,6 +25,7 @@ html,
body,
#app {
min-height: 100%;
width: 100%;
}
#app {
@ -88,45 +33,5 @@ body,
}
body {
background: #f5f5f5 !important;
padding-top: 70px;
}
body::-webkit-scrollbar {
width: 0;
}
.head-nav {
height: 70px;
width: 100%;
top: 0;
background: white;
box-shadow: 0 0 10px #ccc;
position: fixed !important;
z-index: 100;
}
.friend {
height: 64px;
}
.footer {
width: 100%;
background: #0d1f32;
bottom: 0;
}
#components-back-top-demo-custom .ant-back-top {
bottom: 100px;
right: 70px;
}
#components-back-top-demo-custom .ant-back-top-inner {
height: 60px;
width: 60px;
line-height: 60px;
background: url('assets/t-top.png') center no-repeat;
background-size: contain;
}
.BMap_cpyCtrl {
display: none;
}
.anchorBL {
display: none;
}
</style>

200
src/common/platform.styl

@ -1,200 +0,0 @@
.nav-box {
height: 50px;
background: #000000;
line-height: 50px;
padding: 0 9%;
color: #fff;
font-size: 16px;
div {
margin-right: 56px;
cursor: pointer;
}
}
.nav-box-active {
color: #13ACC4 !important;
}
.top-box {
overflow: hidden;
background-image: linear-gradient(to right, #6C63FF , #13ACC4);
position: relative;
}
.top-title {
position: absolute;
top: 70px;
left: 4%;
padding: 0;
font-size: 50px;
color: #fff;
}
@media only screen and (max-width: 1500px) {
.top-title {
font-size: 40px;
}
}
.top-content {
float: right;
margin: 30px 0;
margin-right: 12%;
width: 62%;
padding: 0;
font-size: 16px;
color: #fff;
line-height: 36px;
}
.circular {
height: 20px;
width: 20px;
background: #13ACC4;
border-radius: 50%;
top: 50%;
margin-top: -10px;
position: absolute;
}
.center-box {
overflow: hidden;
background: #fff;
padding: 0 9%;
position: relative;
}
.center-title {
position: absolute;
top: 40%;
font-size: 30px;
color: #000;
}
.center-content {
float: right;
margin: 50px 0;
width: 79%;
line-height: 36px;
font-size: 16px;
}
.bottom-box {
// height: 830px;
overflow: hidden;
position: relative;
padding: 0 9%;
}
.bottom-title {
position: absolute;
top: 20%;
font-size: 30px;
color: #000;
}
.bottom-content {
position: relative;
float: right;
margin: 40px 0;
width: 79%;
}
.partner-box {
// height: 1060px;
overflow: hidden;
position: relative;
padding: 0 9%;
background: #fff;
}
.partner-title {
position: absolute;
top: 15%;
font-size: 30px;
color: #000;
}
.partner-content {
float: right;
margin: 100px 0;
width: 79%;
}
.join-box {
// height: 300px;
overflow: hidden;
position: relative;
padding: 0 9%;
}
.join-title {
position: absolute;
top: 40%;
font-size: 30px;
color: #000;
}
.join-content {
float: right;
margin: 70px 0;
font-size: 16px;
width: 79%;
color: rgba(0,0,0,0.65);
line-height: 36px;
}
.content-box {
position: relative;
padding: 0 9%;
}
.space-box{
height: 150px;
}
// .space-box:hover{
// box-shadow: 0 6px 6px rgba(0,0,0,0.16)
// }
// .space-box:hover .introduce-title{
// margin-top: 10px;
// }
.introduce-box {
width: 60%;
overflow: hidden;
position: relative;
background: #fff;
cursor: pointer;
padding: 0 30px;
}
.introduce-title {
margin: 10px 0;
font-size: 26px;
color: rgba(0,0,0,0.85);
}
.introduce-content {
font-size: 16px;
color: rgba(0,0,0,0.65);
margin-bottom: 0
}
.flow-path {
background: -webkit-linear-gradient(left, #13ACC4 , #fff);
padding: 30px 9%;
position: relative;
}
.flow-title {
position: absolute;
top: 40%;
font-size: 30px;
color: #fff;
}
.flow-content {
margin-left: 20%;
width:80%;
font-size: 16px;
color: #fff;
}
.flow-content1 {
margin-left: 15%;
width:85%;
}
.login-color {
color: #096DD9;
cursor: pointer;
}

34
src/common/portrait.styl

@ -1,6 +1,6 @@
// padding
.pa-0 {
padding: 0px;
padding: 0px!important;
}
.pa-1 {
@ -473,38 +473,6 @@ h2{
background: #F5F5F5
}
.ant-btn {
color: #13acc4 !important;
border-color: #13acc4 !important;
}
.ant-btn-primary{
background-color: #13ACC4
border-color: #13ACC4;
color: #fff!important;
}
.ant-btn-link:hover, .ant-btn-link:focus{
color: #13ACC4;
}
.ant-btn-link{
border-color: transparent!important;
}
.ant-btn-primary-disabled, .ant-btn-primary.disabled, .ant-btn-primary[disabled], .ant-btn-primary-disabled:hover, .ant-btn-primary.disabled:hover, .ant-btn-primary[disabled]:hover, .ant-btn-primary-disabled:focus, .ant-btn-primary.disabled:focus, .ant-btn-primary[disabled]:focus, .ant-btn-primary-disabled:active, .ant-btn-primary.disabled:active, .ant-btn-primary[disabled]:active, .ant-btn-primary-disabled.active, .ant-btn-primary.disabled.active, .ant-btn-primary[disabled].active{
border-color: #d9d9d9!important;
color: rgba(0, 0, 0, 0.25)!important;
}
.ant-btn-disabled, .ant-btn.disabled, .ant-btn[disabled], .ant-btn-disabled:hover, .ant-btn.disabled:hover, .ant-btn[disabled]:hover, .ant-btn-disabled:focus, .ant-btn.disabled:focus, .ant-btn[disabled]:focus, .ant-btn-disabled:active, .ant-btn.disabled:active, .ant-btn[disabled]:active, .ant-btn-disabled.active, .ant-btn.disabled.active, .ant-btn[disabled].active{
color: rgba(0, 0, 0, 0.25)!important;
border-color: #d9d9d9!important;
}
.ant-carousel .slick-list .slick-slide.slick-active div{
display: block !important;
}
.base-bg{
background: #13ACC4

66
src/components/Banner/Banner.vue

@ -1,66 +0,0 @@
<template>
<div class="head">
<a-carousel :autoplay="false">
<div :key="item.id" v-for="item in bannerLists">
<img :src="item.url" alt style="width: 100% !important" />
<div id="banner-box"></div>
</div>
</a-carousel>
</div>
</template>
<script>
import { mapState, mapMutations, mapActions } from 'vuex';
export default {
name: 'RichText',
props: {
showPage: {
type: Number,
default: 11,
},
},
data() {
return {};
},
computed: mapState('home', ['bannerLists']),
// mounted() {
// window.addEventListener('scroll', this.handleScroll);
// setTimeout(() => {
// document.querySelector('#banner-box').scrollIntoView({
// behavior: 'smooth', //
// block: 'start', //
// });
// }, 1000);
// },
async created() {
this.setBannerLists([]);
await this.getQueryRotation(this.showPage);
},
methods: {
...mapMutations('home', ['setBannerLists']),
...mapActions('home', ['getQueryRotation']),
},
};
</script>
<style lang="stylus" scoped>
.head {
background: white;
overflow: hidden;
position: relative;
// height: 170px;
}
#banner-box {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 80px;
opacity: 0;
}
</style>

32
src/components/BreadCrumb/BreadCrumb.vue

@ -1,32 +0,0 @@
<!--
Copyright (c) 2020.
author: song
email: 15235360226@163.com
-->
<template>
<a-breadcrumb>
<a-breadcrumb-item>绿谷生物</a-breadcrumb-item>
<a-breadcrumb-item :key="index" v-for="(item,index) in arr">
<router-link :to="item.url">{{ item.name }}</router-link>
</a-breadcrumb-item>
</a-breadcrumb>
</template>
<script>
import { mapState, mapMutations, mapActions } from 'vuex';
export default {
name: 'RichText',
props: {
arr: {
type: Array,
default: () => [],
},
},
data() {
return {};
},
};
</script>
<style lang="stylus" scoped></style>

63
src/components/CoreOrgan/CoreOrgan.vue

@ -1,63 +0,0 @@
<!--
Copyright (c) 2020.
author: song
email: 15235360226@163.com
-->
<template>
<div>
<div class="words-content">
<span class="font-16 white line-height-36" v-dompurify-html="content"></span>
</div>
</div>
</template>
<script>
import { mapState, mapMutations, mapActions } from 'vuex';
import { getPageDetail } from 'config/api';
export default {
name: 'RichText',
props: {
title: {
type: String,
default: '',
},
},
data() {
return { content: '' };
},
// computed: mapState('home', ['titleCode']),
async created() {
// this.setContent('');
await this.getPageDetail(this.title);
},
methods: {
// ...mapMutations('home', ['setContent']),
// ...mapActions('home', ['getPageDetail']),
async getPageDetail(titleCode) {
try {
const params = { param: { titleCode } };
const res = await getPageDetail(params);
const { code, msg, data } = res.data;
if (code === 200) {
if (data && data.length > 0 && data[0] && data[0].length > 0 && data[0][0].detail) {
this.content = data[0][0].detail.content;
}
} else {
message.error(msg || '查询失败');
throw msg;
}
} catch (error) {
// throw new Error(`SignIn.vue method getCode: ${error}`);
// console.log(error);
}
},
},
};
</script>

92
src/components/FooterPage/FooterPage.vue

@ -1,92 +0,0 @@
<!--
* @Author: wally
* @email: 18603454788@163.com
* @Date: 2021-01-13 17:21:29
* @LastEditors: wally
* @LastEditTime: 2021-01-20 12:40:56
-->
<template>
<div>
<div class="footer">
<div class="d-flex flex-nowrap inner">
<div class="box">
<img class="pic" src="~assets/logo_bottom.png" />
</div>
<div class="box flex-1 d-flex flex-column" style="padding-left: 13%">
<div class="title">发现</div>
<span @click="$router.push('/Challenge/Solicitation')" class="pointer">创新挑战</span>
<span @click="$router.push('/NewPlatform/NewCore')" class="pointer">创新平台</span>
<span @click="$router.push('/IncubationPlatform/MakerSpace')" class="pointer">孵化平台</span>
<span @click="$router.push('/Industry/Union')" class="pointer">产业平台</span>
<span @click="$router.push('/Community')" class="pointer">交流社区</span>
</div>
<div class="box flex-1 d-flex flex-column">
<div class="title">资讯</div>
<span @click="$router.push('/ItInformation')" class="pointer">行业资讯</span>
<span @click="$router.push('/Activity')" class="pointer">活动公告</span>
<span @click="$router.push('/Policy')" class="pointer">创新政策</span>
</div>
<div class="box flex-1 d-flex flex-column">
<div class="title">联系我们</div>
<span @click="$router.push('/ContactUs')" class="pointer">人才招聘</span>
<div class="font-bold-24 mt-3" style="font-style: italic">0351-5223175</div>
</div>
<div class="box">
<img
class="pic"
src="https://www.sxwikionline.com/gateway/greenvalley/uploads/upload/logo/lvgu.jpg"
/>
</div>
</div>
</div>
<div class="xian"></div>
<div class="font-12 align-center text">
Copyright © 2020 The Project by
<span style="color: #2e54ea">CCSENS</span>. All Rights Reserved
</div>
</div>
</template>
<script>
export default {
data() {
return { str: '头部导航栏' };
},
};
</script>
<style lang="stylus" scoped>
.footer {
color: #D7D7D7;
}
.pic {
width: 130px;
}
.box {
margin-top: 58px;
.title {
font-size: 18px;
margin-bottom: 18px;
}
span {
font-size: 12px;
line-height: 24px;
}
}
.xian {
width: 100%;
height: 1px;
background: rgba(204, 204, 204, 0.35);
margin-top: 100px;
}
.text {
text-align: center;
line-height: 90px;
}
</style>

85
src/components/FooterPage/FriendShip.vue

@ -1,85 +0,0 @@
<!--
* @Author: wally
* @email: 18603454788@163.com
* @Date: 2021-01-13 17:21:29
* @LastEditors: wally
* @LastEditTime: 2021-01-21 09:33:25
-->
<template>
<div class="friend">
<div class="inner">
{{ str }}
<span :key="index" class="mx-2 item-friend" v-for="(item, index) in lists" @click="jump(item.url)">{{ item.name }}</span>
</div>
</div>
</template>
<script>
export default {
data() {
return {
str: '友情链接:',
lists: [
{
name: '科技部',
url: 'http://www.most.gov.cn/',
},
{
name: '发改委',
url: 'https://www.ndrc.gov.cn/',
},
{
name: '工信部',
url: 'https://www.miit.gov.cn/',
},
{
name: '山西综改区',
url: 'http://zgq.shanxi.gov.cn/',
},
{
name: '山西省科技厅',
url: 'http://kjt.shanxi.gov.cn/',
},
{
name: '山西省工信厅',
url: 'http://gxt.shanxi.gov.cn/',
},
{
name: '山西省发改委',
url: 'http://fgw.shanxi.gov.cn/',
},
{
name: '太原市科技厅',
url: 'http://kjj.taiyuan.gov.cn/',
},
{
name: '太原市发改委',
url: 'http://fgw.taiyuan.gov.cn/',
},
],
};
},
methods: {
jump(url) {
window.open(url);
},
},
};
</script>
<style lang="stylus" scoped>
.friend {
line-height: 64px;
background: #fff;
font-size: 12px;
color: rgba(0, 0, 0, 0.65);
}
.item-friend {
cursor: pointer;
}
.item-friend:hover {
color: #13ACC4;
}
</style>

286
src/components/HeadNav/HeadNav.vue

@ -1,286 +1,36 @@
<template>
<div class="white d-flex flex-row flex-nowrap px-10 align-center">
<img
@click="jumUrl('/',0)"
alt
class="logo-img"
src="@/assets/logo.png"
style="cursor: pointer"
/>
<div class="flex-1 ml-8">
<a-dropdown
:class="activeItem === a ? 'list-down-active' : ''"
:disabled="item.children.length > 0 ? false : true"
:key="a"
class="list-down"
v-for="(item, a) in list"
>
<a @click="jumUrl(item.url,a)" class="ant-dropdown-link">
{{ item.name }}&nbsp;&nbsp;
<a-icon type="down" v-show="item.children.length > 0" />
</a>
<a-menu slot="overlay">
<a-menu-item
:key="b"
class="px-6 py-3"
style="text-align: center"
v-for="(con, b) in item.children"
>
<a @click="jumUrl(con.url,a)">{{ con.title }}</a>
</a-menu-item>
</a-menu>
</a-dropdown>
</div>
<div class="d-flex flex-nowrap align-center">
<a-icon class="icon-head pointer icon-head-right" type="search" />
<a-tooltip placement="bottom">
<template slot="title">
<span>点击查看购物车</span>
</template>
<a-icon
@click="$router.push('/Cart')"
class="baseColor icon-head icon-head-right pointer"
type="shopping-cart"
/>
</a-tooltip>
<router-link tag="span" to="/login" v-if="!nickName">
<a-icon class="icon-head pointer" style="right: 50px" type="user" />
</router-link>
<div class="icon-head" v-else>{{ nickName }}</div>
</div>
<div class="d-flex align-center justify-center nav">
<a-icon type="left" class="back" />
<div>考勤管理</div>
<a-button type="primary" size="small" class="export"> 导出 </a-button>
</div>
</template>
<script>
import { mapState, mapMutations } from 'vuex';
export default {
data() {
return {
str: '这是头部导航',
activeItem: '',
list: [
{
name: '关于我们',
url: '/About/Introduce',
children: [
{
title: '公司介绍',
url: '/About/Introduce',
},
{
title: '组织机构',
url: '/About/Organ',
},
{
title: '合作伙伴',
url: '/About/Partner',
},
{
title: '衍生企业',
url: '/About/SpinOffs',
},
],
},
{
name: '创新政策',
children: [],
url: '/Policy',
},
{
name: '创新平台',
children: [
{
title: '协同创新中心',
url: '/NewPlatform/NewCore',
},
{
title: '创新资源平台',
url: '/NewPlatform/News',
},
{
title: '创新服务',
url: '/NewPlatform/NewService',
},
],
url: '/NewPlatform/NewCore',
},
{
name: '孵化平台',
url: '/IncubationPlatform/MakerSpace',
children: [
{
title: '众创空间',
url: '/IncubationPlatform/MakerSpace',
},
{
title: '创业服务',
url: '/IncubationPlatform/Services',
},
{
title: '产品展示',
url: '/IncubationPlatform/Products',
},
],
},
{
name: '产业平台',
children: [
{
title: '产业创新联盟',
url: '/Industry/Union',
},
{
title: '产业服务',
url: '/Industry/Serve',
},
{
title: '衍生企业',
url: '/Industry/Enterprise',
},
],
url: '/Industry/Union',
},
{
name: '知识平台',
children: [],
url: '/Knowledge',
},
{
name: '活动公告',
children: [],
url: '/Activity',
},
{
name: '创新挑战',
children: [
{
title: '需求征集',
url: '/Challenge/Solicitation',
},
{
title: '项目发布',
url: '/Challenge/Release',
},
{
title: '结果公告',
url: '/Challenge/Notice',
},
],
url: '/Challenge/Solicitation',
},
{
name: '交流社区',
children: [],
url: '/Community',
},
{
name: '联系我们',
children: [],
url: '/ContactUs',
},
],
};
return {};
},
computed: {
...mapState('user', ['anyringToken', 'user']),
created() {},
nickName() {
const anyringToken = sessionStorage.getItem('anyringToken') || this.anyringToken;
const user = sessionStorage.getItem('user') && JSON.parse(sessionStorage.getItem('user'));
if (anyringToken) {
if (user.wxInfo.nickname) {
return user.wxInfo.nickname;
} else {
const account = this.user.account || user.account;
return account;
}
} else {
return '';
}
},
},
watch: {
$route: {
handler(val) {
const router = val.path.split('/')[1];
const arr = [];
for (let i = 0; i < this.list.length; i++) {
const item = this.list[i];
const url = item.url.split('/')[1];
arr.push(url);
}
const index = arr.indexOf(router);
this.activeItem = index;
},
//
deep: true,
},
},
mounted() {},
methods: {
jumUrl(url, index) {
if (this.$route.path !== url) {
this.$router.push(url);
}
this.activeItem = index;
},
},
methods: {},
};
</script>
<style lang="stylus" scoped>
.head {
height: 80px;
width: 100%;
background: white;
// position: relative;
}
.list-down {
margin-right: 20px;
font-size: 16px;
color: rgba(0, 0, 0, 0.65);
}
.list-down:hover {
color: #13ACC4;
border-bottom: 2px solid #13ACC4;
}
.list-down-active {
color: #13ACC4;
border-bottom: 2px solid #13ACC4;
<style lang="less" scoped>
.nav {
position: relative;
height: 40px;
}
.logo-img {
height: 44px;
.back {
position: absolute;
left: 0;
}
.icon-head {
font-size: 24px;
}
.icon-head-right {
margin-right: 32px;
}
@media only screen and (max-width: 1400px) {
.list-down {
margin-right: 18px;
font-size: 14px;
}
// .logo-img {
// height: 44px;
// }
.icon-head {
font-size: 24px;
}
.icon-head-right {
margin-right: 24px;
}
.export {
position: absolute;
right: 0;
}
</style>

177
src/components/Index/IndexNewList.vue

@ -1,177 +0,0 @@
<!--
Copyright (c) 2020.
author: song
email: 15235360226@163.com
-->
<template>
<div :class="i === 1 ? 'index-wrap' : 'index-wrap1'">
<div class="d-flex flex-column" v-if="i === 0">
<div class="d-flex flex-nowrap align-center baseColor">
<span class="font-bold-24">行业资讯</span>
<img class="bullhorn ml-3" src="@/assets/bullhorn.png" />
<div class="flex-1"></div>
<a-button
@click="$router.push('/ItInformation')"
class="d-flex align-end font-16 baseColor pa-0"
style="display: inline-block;"
type="link"
>
more
<a-icon style="font-size:12px" type="right" />
</a-button>
</div>
<a-divider class="my-3" />
</div>
<div class="d-flex flex-column" v-else>
<div class="d-flex flex-nowrap align-center baseColor">
<span class="font-bold-24">活动公告</span>
<img class="bullhorn ml-4" src="@/assets/bullhorn.png" />
<div class="flex-1"></div>
<a-button
@click="$router.push('/Activity')"
class="d-flex align-end font-16 baseColor pa-0"
style="display: inline-block;"
type="link"
>
more
<a-icon style="font-size:12px" type="right" />
</a-button>
</div>
<a-divider class="my-3" />
</div>
<div class="policy-box" v-if="lists && lists[i].news && lists[i].news.length>0">
<div :key="index" class="div-box mb-2" v-for="(item, index) in lists[i].news">
<div @click="jumpDetails(item,i)" class="d-flex flex-nowrap" style="cursor: pointer">
<div class="d-flex flex-1 flex-column">
<div class="item-title">{{ item.title }}</div>
<div class="original"></div>
<div class="item-content1" v-if="i === 0">
<span v-dompurify-html="item.content"></span>
</div>
<div class="item-content" v-else>
<span v-dompurify-html="item.intro"></span>
</div>
</div>
</div>
</div>
</div>
<div v-else>
<a-skeleton />
</div>
</div>
</template>
<script>
import { mapState, mapMutations } from 'vuex';
export default {
name: 'IndexNewList',
props: {
i: {
type: Number,
default: 0,
},
lists: {
type: Array,
default: () => [],
},
},
data() {
return { monthEnglish: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Spt', 'Oct', 'Nov', 'Dec'] };
},
methods: {
...mapMutations('home', ['setActDetail']),
//
jumpDetails(item, i) {
this.setActDetail(item);
if (i === 0) {
this.$router.push('/ItDetails');
} else {
this.$router.push('/ActDetails');
}
},
},
};
</script>
<style scoped lang="stylus">
.index-wrap {
width: 90%;
margin: 15px auto 15px auto;
overflow: hidden;
opacity: 1;
}
.index-wrap1 {
width: 96%;
margin: 15px auto 15px auto;
overflow: hidden;
opacity: 1;
}
.bullhorn {
width: 24px;
height: 24px;
}
.policy-box {
.div-box {
position: relative;
background: #fff;
.time {
color: rgba(0, 0, 0, 0.25);
.day {
position: relative;
top: -15px;
}
}
}
}
.item-title {
overflow: hidden;
display: -webkit-box;
font-size: 16px;
color: rgba(0, 0, 0, 0.65);
font-family: Microsoft YaHei;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
}
.original {
position: relative;
top: 1px;
left: 0;
width: 30px;
height: 2px;
background: #13ACC4;
}
.item-content {
overflow: hidden;
display: -webkit-box;
margin-top: 8px;
line-height: 25px;
font-size: 12px;
color: rgba(0, 0, 0, 0.45);
font-family: Microsoft YaHei;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.item-content1 {
overflow: hidden;
display: -webkit-box;
margin-top: 8px;
line-height: 28px;
font-size: 12px;
color: rgba(0, 0, 0, 0.45);
font-family: Microsoft YaHei;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
}
</style>

140
src/components/Introduce/AddShopping.vue

@ -1,140 +0,0 @@
<template>
<div>
<a-button type="primary" @click="showModal" class="shopping">
{{ str }}
</a-button>
<a-icon id="ddd" type="shopping-cart" />
<a-modal width="50%" :title="title" :visible="visible" :confirm-loading="confirmLoading" @ok="handleOk" @cancel="handleCancel">
<a-form :form="form">
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="需求描述">
<a-textarea v-model.trim="describe" style="height: 120px" placeholder="请输入需求描述..." />
</a-form-item>
</a-form>
</a-modal>
</div>
</template>
<script>
import { mapState, mapActions } from 'vuex';
import { addCar } from 'config/api';
const formItemLayout = {
labelCol: { span: 5 },
wrapperCol: { span: 18 },
};
const formTailLayout = {
labelCol: { span: 6 },
wrapperCol: { span: 18, offset: 6 },
};
export default {
name: 'NewModel',
props: {
typeData: {
type: Object,
default: null,
},
},
data() {
return {
form: this.$form.createForm(this, { name: 'submit' }),
title: '加入购物车',
str: '加入购物车',
visible: false,
formItemLayout,
formTailLayout,
confirmLoading: false,
pageX: 0,
pageY: 0,
WinWidth: 0,
WinHeight: 0,
describe: '', //
};
},
methods: {
//
showModal(event) {
this.pageX = event.clientX;
this.pageY = event.clientY;
this.visible = true;
},
//
handleCancel(e) {
this.visible = false;
},
//
async handleOk() {
this.confirmLoading = true;
try {
const params = {
param: {
description: this.describe,
serviceId: this.typeData.Id,
type: this.typeData.type,
},
};
const res = await addCar(params);
const { code, msg, data } = res.data;
if (code === 200) {
this.$message.success('加入购物车成功');
this.visible = false;
this.confirmLoading = false;
this.describe = '';
this.anma();
} else {
this.$message.error(msg);
}
} catch (error) {
this.$message.error(error);
}
},
//
anma() {
this.WinWidth = window.innerWidth;
this.WinHeight = window.innerHeight;
var d = document.getElementById('ddd');
d.style.top = this.pageY - d.offsetHeight * 0.5 + 'px';
// console.log(d.offsetWidth);
d.style.right = this.WinWidth - this.pageX - d.offsetWidth * 0.5 + 'px';
d.style.display = 'block';
setTimeout(() => {
d.style.display = 'none';
}, 900);
},
},
};
</script>
<style lang="stylus" scoped>
.must-color {
color: red;
}
.code_img {
height: 32px;
width: 120px;
}
#ddd {
color: #13acc4;
font-size: 50px;
display: none;
z-index: 1000;
animation: animations 1s cubic-bezier(0.5, 0.5, 0.5, 0.5);
position: fixed;
}
@keyframes animations {
0% {
}
99% {
top: 0;
right: -50px;
font-size: 20px;
}
100% {
transform: none;
}
}
</style>

41
src/components/Introduce/CompanyProfile.vue

@ -1,41 +0,0 @@
<template>
<div>
<a-modal
:footer="null"
:title="profile.title"
:visible="showProfile"
@cancel="handleCancel"
@ok="handleCancel"
>
<p v-if="profile.description">
<span class="font-16 white line-height-36" v-dompurify-html="profile.description"></span>
</p>
<p v-else>暂无介绍</p>
</a-modal>
</div>
</template>
<script>
import { mapState, mapMutations, mapActions } from 'vuex';
export default {
props: {
showProfile: {
type: Boolean,
default: false,
},
},
data() {
return { ModalText: 'Content of the modal' };
},
computed: mapState('home', ['profile']),
methods: {
handleCancel(e) {
this.$emit('closeProfile');
},
},
};
</script>

48
src/components/Introduce/ContactMap.vue

@ -1,48 +0,0 @@
<!--
Copyright (c) 2020.
author: song
email: 15235360226@163.com
-->
<template>
<!--百度地图容器-->
<div id="map" style="width:100%;height:392px;"></div>
</template>
<script>
export default {
name: 'ContactMap',
components: {},
data() {
return {};
},
mounted() {
// API
var map = new BMap.Map('map'); // Map
// ,
var point = new BMap.Point(112.549977, 37.794254);
map.centerAndZoom(point, 18);
var marker = new BMap.Marker(point); //
// marker.setTitle('绿');
map.addOverlay(marker); //
var content = '<table>';
content = content + '<tr><td> 山西绿谷生物科技有限公司</td></tr>';
content = content + '<tr><td></td></tr>';
content = content + '<tr><td> 山西省太原市晋阳街202号英语周报大厦八层</td></tr>';
content += '</table>';
var infowindow = new BMap.InfoWindow(content);
marker.openInfoWindow(infowindow);
// nulladdOverlay
marker.setAnimation(Animation);
//
map.addControl(new BMap.MapTypeControl({ mapTypes: [BMAP_NORMAL_MAP, BMAP_HYBRID_MAP] }));
map.setCurrentCity('太原'); //
map.enableScrollWheelZoom(true); //
},
methods: {},
};
</script>
<style lang="stylus" scoped></style>

115
src/components/Introduce/ContactUs.vue

@ -1,115 +0,0 @@
<!--
Copyright (c) 2020.
author: song
email: 15235360226@163.com
-->
<template>
<div>
<div class="contact d-flex flex-nowrap">
<contact-map class="flex-1" />
<div class="contact-right">
<div>
<a-icon class="baseColor icon-size" type="user" />
<p>
高璨
<span class="ml-6">19935658782</span>
</p>
</div>
<div>
<a-icon class="baseColor icon-size" type="phone" />
<p>
0351 5223175
<span class="ml-6">0351 5223179</span>
</p>
</div>
<div>
<a-icon class="baseColor icon-size" type="mail" />
<p>lgzc2020@163.com</p>
</div>
<div>
<i class="iconfont icon-local baseColor"></i>
<p>山西省太原市晋阳街202号英语周报大厦八层</p>
</div>
<div class="code-box">
<a-icon class="baseColor icon-size" type="wechat" />
<img
alt
src="https://www.sxwikionline.com/gateway/greenvalley/uploads/upload/logo/lvgu.jpg"
/>
</div>
</div>
</div>
</div>
</template>
<script>
import ContactMap from './ContactMap.vue';
export default {
name: 'RichText',
components: { ContactMap },
data() {
return {
sort: [
{ id: 1, component: 'title' },
{ id: 2, component: 'content' },
{ id: 3, component: 'picture' },
],
str: '联系我们组件',
img: 'https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=1641353646,126669045&fm=26&gp=0.jpg',
};
},
methods: {},
};
</script>
<style lang="stylus" scoped>
.contact {
height: 394px;
position: relative;
border: 1px solid rgba(112, 112, 112, 0.14901960784313725);
background: #fff;
}
.contact-img {
width: 790px;
height: 100%;
}
.contact-right {
height: 100%;
width: 360px;
padding: 0 24px;
div {
margin-top: 24px;
height: 24px;
line-height: 24px;
position: relative;
p {
position: absolute;
left: 40px;
top: 0;
font-size: 16px;
font-family: Microsoft YaHei;
font-weight: 400;
line-height: 24px;
color: rgba(0, 0, 0, 0.65);
opacity: 1;
}
}
}
.code-box {
margin-top: 44px !important;
img {
position: absolute;
width: 120px;
height: 120px;
left: 40px;
}
}
</style>

132
src/components/Introduce/DeriveEnterprise.vue

@ -1,132 +0,0 @@
<!--
Copyright (c) 2020.
author: song
email: 15235360226@163.com
-->
<template>
<div class="enterprise-bg" v-if="newPartners && newPartners.length > 0">
<div class="d-flex flex-wrap inner py-10">
<div
:class="(index+1)%3===0? 'enterprise-box1' : ''"
:key="index"
@click="openProfile(item.name,item.description)"
class="enterprise-box d-flex flex-column align-center justify-center white mb-8"
v-for="(item,index) in newPartners"
>
<img :src="item.logoUrl" class="enterprise-pic my-2" v-if="list.logoUrl" />
<div class="font-bold-24 title-color my-2">{{ item.name }}</div>
<div
class="font-16 textColor d-flex flex-wrap align-start fill-width enterprise-txt"
>{{ item.description }}</div>
<div class="d-flex flex-nowrap fill-width py-5 enterprise-more">
<div class="flex-1"></div>
<span class="font-16 baseColor">
了解更多
<a-icon type="arrow-right" />
</span>
</div>
</div>
<company-profile :show-profile="showProfile" @closeProfile="closeProfile" v-if="showProfile" />
</div>
<div class="inner d-flex flex-row-reverse pb-10 enterprise-page">
<a-pagination
:default-page-size="6"
:total="newPartners.length"
@change="onChange"
show-less-items
v-model="current"
v-show="newPartners.length > 6"
/>
</div>
</div>
</template>
<script>
import { mapState, mapMutations, mapActions } from 'vuex';
import CompanyProfile from './CompanyProfile.vue';
export default {
name: 'DeriveEnterprise',
components: { CompanyProfile },
props: {
title: {
type: String,
default: '',
},
typeOfPlatform: {
type: String,
default: '',
},
},
data() {
return {
current: 1,
showProfile: false, //
};
},
computed: {
...mapState('home', ['partners', 'profile']),
newPartners() {
let { partners } = this;
let arr = [];
if (partners && partners.length > 0) {
for (let i = 0; i < partners.length; i++) {
const element = partners[i];
for (let j = 0; j < element.backendSearchList.length; j++) {
const item = element.backendSearchList[j];
arr.push(item);
}
}
return arr;
}
return arr;
},
},
async created() {
this.setPartners([]);
const { title, typeOfPlatform } = this;
const params = {
param: {
pageNum: this.current,
pageSize: 6,
type: title === '合作伙伴' ? 1 : 2,
typeOfPlatform: typeOfPlatform === '关于我们' ? 2 : 1,
},
};
await this.getFrontSearchCompany(params);
},
methods: {
...mapMutations('home', ['setPartners', 'setProfile']),
...mapActions('home', ['getFrontSearchCompany']),
//
onChange(current) {
this.current = current;
},
//
openProfile(title, description) {
this.setProfile(null);
const profile = {
title,
description,
};
this.setProfile(profile);
this.showProfile = true;
},
closeProfile() {
this.showProfile = false;
},
},
};
</script>
<style lang="stylus" scoped>
@import './PartnerShip.styl';
</style>

321
src/components/Introduce/IntentionModel.vue

@ -1,321 +0,0 @@
<template>
<div>
<a-button @click="showModal">{{ btnName }}</a-button>
<a-modal
:confirm-loading="confirmLoading"
:title="btnName"
:visible="visible"
@cancel="handleCancel"
@ok="handleOk"
width="50%"
>
<a-form :form="form">
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="公司名称"
>
<a-input placeholder="请输入公司名称..." v-model.trim="platform.companyName" />
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="联系人"
required
>
<a-input placeholder="请输入联系人..." v-model.trim="platform.manName" />
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="联系电话"
required
>
<a-input
@change="changePhone"
placeholder="请输入联系电话.."
type="tel"
v-decorator="['tel', { rules: phoneRules }]"
/>
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="图片验证码"
required
>
<div class="d-flex flex-nowrap">
<a-input placeholder="图片验证码" type="number" v-model="codeNum" />
<img
:src="picCode.imageBase64"
@click="changePicCode"
class="code_img ml-2"
v-if="picCode && picCode.imageBase64"
/>
<a-button @click="changePicCode" class="code_img ml-2" size="small" v-else>获取验证码</a-button>
<!-- <a-input v-decorator="['account', { rules: rules.account }]" /> -->
</div>
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="短信验证码"
required
>
<div class="d-flex flex-nowrap">
<a-input placeholder="请输入验证码" type="number" v-model="platform.code" />
<a-button
class="code_img ml-2"
disabled
type="primary"
v-if="showInterval"
>重新发送 {{ interval }}</a-button>
<a-button
:disabled="platform.isTel === false"
@click="getCode"
class="code_img ml-2"
type="primary"
v-else
>获取验证码</a-button>
</div>
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="需求描述"
>
<a-textarea
placeholder="请输入需求描述..."
style="height: 120px"
v-model.trim="platform.describe"
/>
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="上传附件"
v-show="typeData.type === 0"
>
<a-upload
:action="action"
:before-upload="beforeUpload"
:default-file-list="fileList"
@change="fileChange"
list-type="picture"
name="files"
>
<a-button>
<a-icon type="upload" />点击上传附件
</a-button>
</a-upload>
</a-form-item>
</a-form>
</a-modal>
</div>
</template>
<script>
import { mapState, mapActions } from 'vuex';
import { serviceApply, upload } from 'config/api';
const formItemLayout = {
labelCol: { span: 5 },
wrapperCol: { span: 18 },
};
const formTailLayout = {
labelCol: { span: 6 },
wrapperCol: { span: 18, offset: 6 },
};
export default {
name: 'NewModel',
props: {
typeData: {
type: Object,
default: null,
},
btnName: {
type: String,
default: '',
},
},
data() {
return {
form: this.$form.createForm(this, { name: 'submit' }),
action: upload,
fileList: [],
visible: false,
formItemLayout,
formTailLayout,
confirmLoading: false,
platform: {
companyName: '', //
manName: '', //
tel: '', //
describe: '', //
code: '', //
files: [], // Id
isTel: false,
},
codeRules: [
{ required: true, message: '请输入验证码' },
{ min: 4, max: 4, message: '请输入4位短信验证码' },
],
codeNum: '',
showInterval: false,
codeTimer: null,
interval: 120, //
phoneRules: [
{ required: true, pattern: new RegExp(/^[1][3,4,5,6,7,8,9][0-9]{9}$/), whitespace: true, message: '请输入正确的手机号' },
],
};
},
computed: mapState('user', ['picCode']),
async created() {
this.sendPicCode();
await this.getUserSer();
if (this.userSer) {
if (this.userSer.name) {
this.platform.manName = this.userSer.name;
}
if (this.userSer.phone) {
this.platform.tel = this.userSer.phone;
}
if (this.userSer.companyName) {
this.platform.companyName = this.userSer.companyName;
}
}
},
methods: {
...mapActions('user', ['sendCode', 'sendPicCode']),
...mapActions('home', ['getUserSer']),
//
showModal() {
this.visible = true;
},
//
handleCancel(e) {
this.visible = false;
},
//
changePhone(e) {
this.platform.tel = e.target.value;
this.platform.isTel = /^[1][3,4,5,6,7,8,9][0-9]{9}$/.test(this.platform.tel);
},
//
handleOk() {
if (!this.platform.manName) {
this.$message.error('请输入联系人');
} else if (!this.platform.tel) {
this.$message.error('请输入联系电话');
} else if (!this.platform.code) {
this.$message.error('请输入验证码');
} else {
if (this.platform.isTel) {
for (var i = 0; i < this.fileList.length; i++) {
this.platform.files = this.platform.files.concat(this.fileList[i].response.data[0].id);
}
this.subMitAdd();
// console.log(this.platform.files);
} else {
this.$message.error('请输入正确的联系电话');
}
}
},
//
async subMitAdd() {
this.confirmLoading = true;
try {
const params = {
param: {
code: this.platform.code,
companyName: this.platform.companyName,
contactName: this.platform.manName,
contactPhone: this.platform.tel,
description: this.platform.describe,
filesId: this.platform.files,
serviceId: this.typeData.Id,
type: this.typeData.type,
},
};
const res = await serviceApply(params);
const { code, msg, data } = res.data;
if (code === 200) {
this.$message.success('申请成功');
this.visible = false;
this.confirmLoading = false;
for (let key in this.platform) {
this.platform[key] = '';
}
this.platform.isTel = false;
} else {
throw msg;
this.confirmLoading = false;
}
} catch (error) {
this.$message.error(error);
this.confirmLoading = false;
}
},
//
async getCode() {
// console.log(111);
try {
const params = {
phone: this.platform.tel,
verificationCodeId: this.picCode.verificationCodeId,
verificationCodeValue: this.codeNum,
};
await this.sendCode(params);
this.getCodeInterval();
} catch (error) {
// throw new Error(`SignIn.vue method getCode: ${error}`);
// console.log(error);
}
},
//
getCodeInterval() {
this.showInterval = true;
this.codeTimer = setInterval(() => {
if (this.interval === 0) {
clearInterval(this.codeTimer);
this.codeTimer = null;
this.showInterval = false;
this.interval = 120;
return;
}
this.interval = this.interval - 1;
}, 1000);
},
//
changePicCode() {
this.sendPicCode();
},
beforeUpload(file) {
return new Promise((resolve, reject) => {
const isLt5M = file.size / 1024 / 1024 < 5;
if (!isLt5M) {
this.$message.warning('上传附件大小不能超过5m!');
return reject(false);
}
return resolve(true);
});
},
fileChange(info) {
// console.log(info)
this.fileList = info.fileList;
},
},
};
</script>
<style lang="stylus" scoped>
.must-color {
color: red;
}
.code_img {
height: 32px;
width: 120px;
}
</style>

349
src/components/Introduce/Model.vue

@ -1,349 +0,0 @@
<!--
Copyright (c) 2020.
author: song
email: 15235360226@163.com
-->
<template>
<div>
<a-button @click="showModal" type="primary">立即加入</a-button>
<a-modal :confirm-loading="confirmLoading" :visible="visible" @cancel="handleCancel" @ok="handleOk(type)" title="招聘信息" width="50%">
<a-form :form="form">
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="姓名" required>
<a-input placeholder="请输入姓名" v-model.trim="recruit.name" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="性别">
<!-- 单选 -->
<a-radio-group v-model="recruit.sex">
<a-radio :value="0"></a-radio>
<a-radio :value="1"></a-radio>
</a-radio-group>
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="出生年月" required>
<!-- 时间选择器时间点 -->
<a-date-picker @change="changeBirthday" class="fill-width" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="参加工作时间" required>
<!-- 时间选择器时间点 -->
<a-date-picker @change="changeStartJob" class="fill-width" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="电话" required>
<a-input @change="changePhone" placeholder="请输入联系电话" type="tel" v-decorator="['tel', { rules: phoneRules }]" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="图片验证码" required>
<div class="d-flex flex-nowrap">
<a-input placeholder="图片验证码" type="number" v-model="codeNum" />
<img :src="picCode.imageBase64" @click="changePicCode" class="code_img ml-2" v-if="picCode && picCode.imageBase64" />
<a-button @click="changePicCode" class="code_img ml-2" size="small" v-else>获取验证码</a-button>
<!-- <a-input v-decorator="['account', { rules: rules.account }]" /> -->
</div>
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="短信验证码" required>
<div class="d-flex flex-nowrap">
<a-input placeholder="请输入验证码" type="number" v-model="recruit.code" />
<a-button class="code_img ml-2" disabled type="primary" v-if="showInterval">重新发送 {{ interval }}</a-button>
<a-button :disabled="recruit.isTel === false" @click="getCode" class="code_img ml-2" type="primary" v-else>获取验证码</a-button>
</div>
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="电子邮箱">
<!-- 电子邮箱 -->
<a-input @change="changeEamil" placeholder="请输入电子邮箱..." type="email" v-decorator="['email', { rules: emailRules }]" />
</a-form-item>
<!-- 是否在职 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="是否在职">
<!-- 单选 -->
<a-radio-group v-model="recruit.inWork">
<a-radio :value="1"></a-radio>
<a-radio :value="2"></a-radio>
</a-radio-group>
</a-form-item>
<!-- 现居住地 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="现居住地">
<a-input placeholder="请输入现居住地" v-model.trim="recruit.address" />
</a-form-item>
<!-- 户口所在地 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="户口所在地">
<a-input placeholder="请输入户口所在地" v-model.trim="recruit.birthdayPlace" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="求职意向" required>
<a-textarea placeholder="请输入求职意向..." v-model.trim="recruit.jobWilling" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="工作经历">
<a-textarea placeholder="请输入工作经历..." v-model.trim="recruit.jobExpirence" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="教育经历">
<a-textarea placeholder="请输入教育经历..." v-model.trim="recruit.educationExpirence" />
</a-form-item>
<!-- 语言能力 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="语言能力">
<a-textarea placeholder="请输入语言能力" v-model.trim="recruit.language" />
</a-form-item>
<!-- 专业技能 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="专业技能">
<a-textarea placeholder="请输入专业技能" v-model.trim="recruit.skill" />
</a-form-item>
<!-- 获得证书 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="获得证书">
<a-textarea placeholder="请输入获得证书" v-model.trim="recruit.zhengShu" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="自我评价">
<a-textarea placeholder="请输入自我评价..." v-model.trim="recruit.personalDescription" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="上传附件">
<a-upload :action="action" :default-file-list="fileList" @change="fileChange" list-type="picture" name="files">
<a-button> <a-icon type="upload" />点击上传附件 </a-button>
</a-upload>
</a-form-item>
</a-form>
</a-modal>
</div>
</template>
<script>
import { mapState, mapActions } from 'vuex';
import { JoinPlatform, upload, joinUs } from 'config/api';
const formItemLayout = {
labelCol: { span: 6 },
wrapperCol: { span: 16 },
};
const formTailLayout = { wrapperCol: { span: 16, offset: 6 } };
export default {
name: 'Model',
components: {},
data() {
return {
visible: false,
confirmLoading: false,
type: '',
formItemLayout,
formTailLayout,
form: this.$form.createForm(this, { name: 'submit' }),
value: 0,
inWorkValue: 1,
recruit: {
name: '', //
sex: 0, //
birthday: '', //
startJob: '', //
tel: '', //
code: '',
isTel: false, //
email: '', //
isEmail: false, //
inWork: 1, //
address: '', //
birthdayPlace: '', //
jobWilling: '', //
jobExpirence: '', //
educationExpirence: '', //
personalDescription: '', //
language: '', //
skill: '', //
zhengShu: '', //
files: [], // Id
},
action: upload,
fileList: [],
phoneRules: [
{ required: true, pattern: new RegExp(/^[1][3,4,5,6,7,8,9][0-9]{9}$/), whitespace: true, message: '请输入正确的手机号' },
],
emailRules: [
{
pattern: new RegExp(/^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/),
whitespace: true,
message: '请输入正确的邮箱格式',
},
],
codeRules: [
{ required: true, message: '请输入验证码' },
{ min: 4, max: 4, message: '请输入4位短信验证码' },
],
codeNum: '',
showInterval: false,
codeTimer: null,
interval: 120, //
};
},
computed: mapState('user', ['picCode']),
created() {
this.sendPicCode();
},
methods: {
...mapActions('user', ['sendCode', 'sendPicCode']),
showModal() {
this.visible = true;
},
//
changePhone(e) {
this.recruit.tel = e.target.value;
this.recruit.isTel = /^[1][3,4,5,6,7,8,9][0-9]{9}$/.test(this.recruit.tel);
},
//
changeEamil(e) {
this.recruit.email = e.target.value;
this.recruit.isEmail = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/.test(this.recruit.email);
},
handleOk(type) {
if (!this.recruit.name) {
this.$message.error('姓名为必填项');
} else if (!this.recruit.tel) {
this.$message.error('电话为必填项');
} else if (!this.recruit.jobWilling) {
this.$message.error('求职意向为必填项');
} else if (!this.recruit.birthday) {
this.$message.error('出生日期为必填项');
} else if (!this.recruit.startJob) {
this.$message.error('参加工作时间必填项');
} else if (this.recruit.email && this.recruit.isEmail === false) {
this.$message.error('请输入正确的邮箱格式');
} else {
if (this.recruit.isTel) {
for (var i = 0; i < this.fileList.length; i++) {
this.recruit.files = this.recruit.files.concat(this.fileList[i].response.data[0].id);
}
this.subMitAdd();
} else {
this.$message.error('请输入正确的联系电话');
}
}
},
//
async subMitAdd() {
this.confirmLoading = true;
try {
const {
name,
sex,
birthday,
startJob,
tel,
email,
inWork,
address,
birthdayPlace,
jobWilling,
jobExpirence,
educationExpirence,
language,
skill,
zhengShu,
personalDescription,
files,
} = this.recruit;
let params = {};
let res = {};
params = {
param: {
name, //
gender: sex, //
birthday, //
startJob, //
phone: tel, //
code: this.recruit.code, //
email, //
inWork, //
address, //
birthdayPlace, //
jobWilling, //
jobExpirence, //
educationExpirence, //
language, //
skill, //
zhengShu, //
personalDescription, //
files, // Id
},
};
res = await joinUs(params);
const { data, msg, code } = res.data;
if (code === 200) {
this.$message.success('申请成功');
this.visible = false;
this.confirmLoading = false;
for (let key in this.recruit) {
this.recruit[key] = '';
}
} else {
throw msg;
this.confirmLoading = false;
}
} catch (error) {
this.$message.error(error);
this.confirmLoading = false;
}
},
handleCancel(e) {
this.visible = false;
},
fileChange(info) {
this.fileList = info.fileList;
},
changeBirthday(date, dateString) {
this.recruit.birthday = this.$moment(date).unix();
// console.log(this.$moment(date).unix(), dateString);
},
changeStartJob(date, dateString) {
this.recruit.startJob = this.$moment(date).unix();
// console.log(this.$moment(date).unix(), dateString);
},
//
async getCode() {
try {
const params = {
phone: this.recruit.tel,
verificationCodeId: this.picCode.verificationCodeId,
verificationCodeValue: this.codeNum,
};
await this.sendCode(params);
this.getCodeInterval();
} catch (error) {
throw new Error(`SignIn.vue method getCode: ${error}`);
}
},
//
getCodeInterval() {
this.showInterval = true;
this.codeTimer = setInterval(() => {
if (this.interval === 0) {
clearInterval(this.codeTimer);
this.codeTimer = null;
this.showInterval = false;
this.interval = 120;
return;
}
this.interval = this.interval - 1;
}, 1000);
},
//
changePicCode() {
this.sendPicCode();
},
},
};
</script>
<style lang="stylus" scoped>
.must-color {
color: red;
}
.code_img {
height: 32px;
width: 120px;
}
</style>

77
src/components/Introduce/PartnerShip.styl

@ -1,77 +0,0 @@
//
.logo-box{
width: 18%;
margin-right: 2.5%;
border-radius: 2px;
margin-bottom: 50px;
.logo-pic-box{
height: 90px;
// width: 90px;
text-align: center;
.logo-pic{
height: 90px
}
.logo-text{
height: 100%;
font-size: 12px;
line-height: 20px;
}
}
}
.logo-box1{
margin-right: 0!important;
}
//
.enterprise-bg{
width: 100%;
background: url('../../assets/enterprise-banner.png') right no-repeat;
background-size: 100% 100%;
}
.enterprise-box{
width: 26%;
height: 382px;
margin-right: 11%;
position: relative;
padding: 0 16px;
.enterprise-pic{
height: 166px
}
.enterprise-txt{
display: -webkit-box;
overflow: hidden;
white-space: normal !important;
text-overflow: ellipsis;
word-wrap: break-word;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
text-align: justify;
line-height: 28px;
}
.enterprise-more{
position: absolute;
bottom: 0;
right: 12px;
}
}
.enterprise-box1{
margin-right: 0!important;
}
.enterprise-page >>> .ant-pagination-item-active{
background: #13ACC4;
}
.enterprise-page >>> .ant-pagination-item-active a{
color: #fff;
}

99
src/components/Introduce/PartnerShip.vue

@ -1,99 +0,0 @@
<!--
Copyright (c) 2020.
author: song
email: 15235360226@163.com
-->
<template>
<div class="white pt-5" v-if="partners && partners.length > 0">
<div :key="index" v-for="(item,index) in partners">
<p class="d-flex flex-row justify-center mb-5">
<img src="~assets/hzhb02.png" v-if="item.typeOfTech===0" />
<img src="~assets/hzhb03.png" v-if="item.typeOfTech===1" />
<img src="~assets/hzhb04.png" v-if="item.typeOfTech===2" />
</p>
<div
class="d-flex flex-wrap pointer"
v-if="item.backendSearchList && item.backendSearchList.length > 0"
>
<div
:class="(i+1)%5===0? 'logo-box1' : ''"
:key="i"
@click="openProfile(list.name,list.description)"
class="logo-box d-flex flex-column align-center white"
v-for="(list,i) in item.backendSearchList"
>
<div class="logo-pic-box">
<img :src="list.logoUrl" class="logo-pic pa-2" v-if="list.logoUrl" />
<div class="d-flex flex-column justify-center logo-text" v-else>{{ list.name }}</div>
</div>
<div class="font-12">{{ list.name }}</div>
</div>
</div>
</div>
<company-profile :show-profile="showProfile" @closeProfile="closeProfile" v-if="showProfile" />
</div>
</template>
<script>
import { mapState, mapMutations, mapActions } from 'vuex';
import CompanyProfile from './CompanyProfile.vue';
export default {
name: 'PartnerShip',
components: { CompanyProfile },
props: {
title: {
type: String,
default: '',
},
typeOfPlatform: {
type: String,
default: '',
},
},
data() {
return { showProfile: false };
},
computed: mapState('home', ['partners', 'profile']),
async created() {
this.setPartners([]);
const { title, typeOfPlatform } = this;
const params = {
param: {
pageNum: 1,
// pageSize: -1,
type: title === '合作伙伴' ? 1 : 2,
typeOfPlatform: typeOfPlatform === '关于我们' ? 2 : '孵化平台' ? 3 : 1,
},
};
await this.getFrontSearchCompany(params);
},
methods: {
...mapMutations('home', ['setPartners', 'setProfile']),
...mapActions('home', ['getFrontSearchCompany']),
//
openProfile(title, description) {
this.setProfile(null);
const profile = {
title,
description,
};
this.setProfile(profile);
this.showProfile = true;
},
closeProfile() {
this.showProfile = false;
},
},
};
</script>
<style lang="stylus" scoped>
@import './PartnerShip.styl';
</style>

46
src/components/Introduce/RichText.vue

@ -1,46 +0,0 @@
<!--
Copyright (c) 2020.
author: song
email: 15235360226@163.com
-->
<template>
<div>
<div class="words-content">
<span
class="font-16 textColor line-height-36"
v-dompurify-html="content"
v-if="titleCode === title"
></span>
</div>
</div>
</template>
<script>
import { mapState, mapMutations, mapActions } from 'vuex';
export default {
name: 'RichText',
props: {
title: {
type: String,
default: '',
},
},
data() {
return {};
},
computed: mapState('home', ['content', 'titleCode']),
async created() {
this.setContent('');
await this.getPageDetail(this.title);
},
methods: {
...mapMutations('home', ['setContent']),
...mapActions('home', ['getPageDetail']),
},
};
</script>

442
src/components/Introduce/SettledModel.vue

@ -1,442 +0,0 @@
<template>
<div>
<a-button @click="showModal" type="primary">加入我们</a-button>
<a-modal :confirm-loading="confirmLoading" :title="title" :visible="visible" @cancel="handleCancel" @ok="handleOk" width="50%">
<a-form :form="form" v-if="current === 0">
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="公司名称" required>
<a-input placeholder="请输入公司名称..." v-model.trim="platform.company" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="成立时间" required>
<!-- 时间选择器时间点 -->
<a-date-picker @change="changeBirthday" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="法人代码" required>
<a-input placeholder="请输入法人代码..." v-model.trim="platform.legalPerson" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="现注册地址" required>
<a-input placeholder="请输入现注册地址..." v-model.trim="platform.registerSite" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="注册资金(单位:万)">
<a-input placeholder="请输入注册资金..." type="number" v-model.trim="platform.registerMoney" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="员工人数">
<a-input placeholder="请输入员工人数..." type="number" v-model.trim="platform.staffCount" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="其中研发人数">
<a-input placeholder="请输入研发人数..." type="number" v-model.trim="platform.resarchStaff" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="大专以上人员">
<a-input placeholder="请输入员工人数..." type="number" v-model.trim="platform.juniorCollege" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="主营业务">
<a-input placeholder="请输入主营业务..." v-model.trim="platform.mainBusiness" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="营业收入(单位:万)">
<a-input placeholder="请输入营业收入..." type="number" v-model.trim="platform.businessIncome" />
</a-form-item>
</a-form>
<a-form :form="form" v-if="current === 1">
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="产品/技术阶段" required>
<!-- 单选 -->
<a-radio-group v-model="platform.productTech">
<a-radio :value="0" style="margin-right: 20px">创意阶段</a-radio>
<a-radio :value="1" style="margin-right: 20px">研发阶段</a-radio>
<a-radio :value="2" style="margin-right: 20px">转化阶段</a-radio>
<a-radio :value="3" style="margin-right: 20px">原型样品</a-radio>
<a-radio :value="4">产业化开发</a-radio>
</a-radio-group>
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="申请专利数">
<a-input placeholder="请输入申请专利数..." type="number" v-model.trim="platform.patentApply" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="授权专利数">
<a-input placeholder="请输入授权专利数..." type="number" v-model.trim="platform.patentGrented" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="发明专利数">
<a-input placeholder="请输入发明专利数..." type="number" v-model.trim="platform.patentInvent" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="软件著作权">
<a-input placeholder="请输入软件著作权..." v-model.trim="platform.softwareRegister" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="动植物新品种">
<a-input placeholder="请输入动植物新品种..." v-model.trim="platform.plantKind" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="集成电路布图设计">
<a-input placeholder="请输入集成电路布图设计..." v-model.trim="platform.electricDesign" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="合作单位">
<a-input placeholder="请输入合作单位..." v-model.trim="platform.friendCompany" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="上传附件">
<a-upload
:action="action"
:before-upload="beforeUpload"
:default-file-list="fileList"
@change="fileChange"
list-type="picture"
name="files"
>
<p>1.营业执照复印件尚无注册的无需梯控</p>
<p>2.法定代表或授权代表身份证复印件</p>
<p>3.主导产品或技术简介</p>
<a-button> <a-icon type="upload" />点击上传附件 </a-button>
</a-upload>
</a-form-item>
</a-form>
<a-form :form="form" v-if="current === 2">
<!-- <a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="公司名称">
<a-input v-model.trim="platform.companyName" placeholder="请输入公司名称..." />
</a-form-item>-->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="姓名" required>
<a-input placeholder="请输入申请人姓名..." v-model.trim="platform.manName" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="性别" required>
<!-- 单选 -->
<a-radio-group v-model="platform.sex">
<a-radio :value="1" style="margin-right: 100px"></a-radio>
<a-radio :value="0"></a-radio>
</a-radio-group>
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="职务" required>
<a-input placeholder="请输入申请人职务..." v-model.trim="platform.position" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="联系电话" required>
<a-input @change="changePhone" placeholder="请输入联系电话.." type="tel" v-decorator="['tel', { rules: phoneRules }]" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="图片验证码" required>
<div class="d-flex flex-nowrap">
<a-input placeholder="图片验证码" type="number" v-model="codeNum" />
<img :src="picCode.imageBase64" @click="changePicCode" class="code_img ml-2" v-if="picCode && picCode.imageBase64" />
<a-button @click="changePicCode" class="code_img ml-2" size="small" v-else>获取验证码</a-button>
<!-- <a-input v-decorator="['account', { rules: rules.account }]" /> -->
</div>
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="短信验证码" required>
<div class="d-flex flex-nowrap">
<a-input placeholder="请输入验证码" type="number" v-model="platform.code" />
<a-button class="code_img ml-2" disabled type="primary" v-if="showInterval">重新发送 {{ interval }}</a-button>
<a-button :disabled="platform.isTel === false" @click="getCode" class="code_img ml-2" type="primary" v-else>
获取验证码
</a-button>
</div>
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="电子邮箱">
<!-- 电子邮箱 -->
<a-input @change="changeEamil" placeholder="请输入电子邮箱..." type="email" v-decorator="['email', { rules: emailRules }]" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="身份证号" required>
<!-- 身份证号 -->
<a-input @change="changeIdCard" placeholder="请输入身份证号..." v-decorator="['idCard', { rules: idCardRules }]" />
</a-form-item>
</a-form>
<a-steps :current="current">
<a-step @click="current = 0" style="cursor: pointer">
<template slot="title">
<span v-if="current === 0">Waiting...</span>
<span v-else>完成</span>
</template>
<span slot="description">企业基本信息</span>
</a-step>
<a-step :title="current > 1 ? '完成' : 'Waiting...'" @click="current = 1" description="企业详细信息" style="cursor: pointer" />
<a-step :title="current > 2 ? '完成' : 'Waiting...'" @click="current = 2" description="申请人基本信息" style="cursor: pointer" />
</a-steps>
</a-modal>
</div>
</template>
<script>
import { mapState, mapActions, mapMutations } from 'vuex';
import { Settled, upload } from 'config/api';
const formItemLayout = {
labelCol: { span: 5 },
wrapperCol: { span: 18 },
};
const formTailLayout = {
labelCol: { span: 6 },
wrapperCol: { span: 18, offset: 6 },
};
export default {
name: 'SettledModel',
props: {
typeNum: {
type: Number,
default: 1,
},
},
data() {
return {
form: this.$form.createForm(this, { name: 'submit' }),
visible: false,
current: 0,
action: upload,
fileList: [],
title: '入驻企业注册',
str: '申请加入',
formItemLayout,
formTailLayout,
confirmLoading: false,
platform: {
manName: '', //
sex: 1, // 01
position: '', //
tel: '', //
isTel: false,
email: '', //
isEmail: false,
code: '', //
idCard: '', //
isIdCard: false,
company: '', //
buildTime: 0, //
legalPerson: '', //
registerMoney: 0, //
staffCount: 0, //
resarchStaff: 0, //
juniorCollege: 0, //
mainBusiness: '', //
businessIncome: 0, //
registerSite: '', //
productTech: 0, //
patentApply: 0, //
patentGrented: 0, //
patentInvent: 0, //
softwareRegister: '', //
plantKind: '', //
electricDesign: '', //
friendCompany: '', //
files: [], // id
},
phoneRules: [
{ required: true, pattern: new RegExp(/^[1][3,4,5,6,7,8,9][0-9]{9}$/), whitespace: true, message: '请输入正确的手机号' },
],
codeRules: [
{ required: true, message: '请输入验证码' },
{ min: 4, max: 4, message: '请输入4位短信验证码' },
],
emailRules: [
{
pattern: new RegExp(/^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/),
whitespace: true,
message: '请输入正确的邮箱格式',
},
],
idCardRules: [
{
required: true,
pattern: new RegExp(/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/),
whitespace: true,
message: '请输入身份证号',
},
],
codeNum: '',
showInterval: false,
codeTimer: null,
interval: 120, //
};
},
computed: mapState('user', ['picCode']),
async created() {
this.sendPicCode();
await this.getUserSer();
if (this.userSer) {
if (this.userSer.name) {
this.platform.manName = this.userSer.name;
}
if (this.userSer.phone) {
this.platform.tel = this.userSer.phone;
}
if (this.userSer.companyName) {
this.platform.companyName = this.userSer.companyName;
}
}
},
methods: {
...mapActions('user', ['sendCode', 'sendPicCode']),
...mapActions('home', ['getUserSer']),
...mapMutations('home', ['setPagePath']),
//
showModal() {
const anyringToken = sessionStorage.getItem('anyringToken');
if (!anyringToken) {
this.setPagePath(this.$route.path);
this.$router.push('/login');
this.$message.warning('请先登录');
} else {
this.visible = true;
}
},
//
handleCancel(e) {
this.visible = false;
},
//
changePhone(e) {
this.platform.tel = e.target.value;
this.platform.isTel = /^[1][3,4,5,6,7,8,9][0-9]{9}$/.test(this.platform.tel);
},
//
changeEamil(e) {
this.platform.email = e.target.value;
this.platform.isEmail = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/.test(this.platform.email);
},
//
changeIdCard(e) {
this.platform.idCard = e.target.value;
this.platform.isIdCard = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/.test(this.platform.idCard);
},
//
async getCode() {
// console.log(111);
try {
const params = {
phone: this.platform.tel,
verificationCodeId: this.picCode.verificationCodeId,
verificationCodeValue: this.codeNum,
};
await this.sendCode(params);
this.getCodeInterval();
} catch (error) {
// throw new Error(`SignIn.vue method getCode: ${error}`);
// console.log(error);
}
},
//
getCodeInterval() {
this.showInterval = true;
this.codeTimer = setInterval(() => {
if (this.interval === 0) {
clearInterval(this.codeTimer);
this.codeTimer = null;
this.showInterval = false;
this.interval = 120;
return;
}
this.interval = this.interval - 1;
}, 1000);
},
//
changePicCode() {
this.sendPicCode();
},
//
changeBirthday(date, dateString) {
this.platform.buildTime = this.$moment(date).unix() * 1000;
// console.log(this.$moment(date).unix(), dateString);
},
//
handleOk() {
if (this.current !== 2) {
this.current++;
} else {
if (this.platform.company === '') {
this.$message.error('请输入公司名称');
} else if (this.platform.buildTime === 0) {
this.$message.error('请选择成立时间');
} else if (this.platform.legalPerson === '') {
this.$message.error('请输入法人代码');
} else if (this.platform.registerSite === '') {
this.$message.error('请输入现注册地址');
} else if (this.platform.manName === '') {
this.$message.error('请输入姓名');
} else if (this.platform.position === '') {
this.$message.error('请输入职务');
} else if (this.platform.isTel === false) {
this.$message.error('请输入联系电话');
} else if (this.platform.idCard === '') {
this.$message.error('请输入身份证号');
} else {
for (var i = 0; i < this.fileList.length; i++) {
this.platform.files = this.platform.files.concat(this.fileList[i].response.data[0].id);
}
this.addSettled();
}
}
},
async addSettled() {
this.confirmLoading = true;
try {
const params = {
param: {
buildTime: this.platform.buildTime,
businessIncome: this.platform.businessIncome,
company: this.platform.company,
electricDesign: this.platform.electricDesign,
email: this.platform.email,
fileList: this.platform.files,
friendCompany: this.platform.friendCompany,
gender: this.platform.sex,
code: this.platform.code,
idCard: this.platform.idCard,
juniorCollege: this.platform.juniorCollege,
legalPerson: this.platform.legalPerson,
mainBusiness: this.platform.mainBusiness,
name: this.platform.manName,
patentApply: this.platform.patentApply,
patentGrented: this.platform.patentGrented,
patentInvent: this.platform.patentInvent,
phone: this.platform.tel,
placeType: this.typeNum, // 0:1:
plantKind: this.platform.plantKind,
position: this.platform.position,
productTech: this.platform.productTech,
registerMoney: this.platform.registerMoney,
registerSite: this.platform.registerSite,
resarchStaff: this.platform.resarchStaff,
softwareRegister: this.platform.softwareRegister,
staffCount: this.platform.staffCount,
},
};
// console.log(params);
const res = await Settled(params);
// console.log(res);
const { code, msg, data } = res.data;
if (code === 200) {
this.$message.success('申请成功');
this.visible = false;
this.confirmLoading = false;
for (let key in this.platform) {
this.platform[key] = '';
}
this.platform.isTel = false;
this.platform.isEmail = false;
this.platform.isIdCard = false;
} else {
throw msg;
// console.log('1');
this.confirmLoading = false;
}
} catch (error) {
// console.log('2');
this.$message.error(error);
this.confirmLoading = false;
}
},
beforeUpload(file) {
return new Promise((resolve, reject) => {
const isLt5M = file.size / 1024 / 1024 < 5;
if (!isLt5M) {
this.$message.warning('上传附件大小不能超过5m!');
return reject(false);
}
return resolve(true);
});
},
fileChange(info) {
this.fileList = info.fileList;
},
},
};
</script>
<style lang="stylus" scoped>
.must-color {
color: red;
}
.code_img {
height: 32px;
width: 120px;
}
</style>

190
src/components/List/List.vue

@ -0,0 +1,190 @@
<template>
<div class="mt-5">
<div class="d-flex flex-nowrap table-head">
<div style="width: 10%"></div>
<div class="table-head-item">姓名</div>
<div class="table-head-item"></div>
<div class="table-head-item"></div>
<div class="table-head-item">审核人</div>
</div>
<div v-for="(list, listIndex) in lists" :key="listIndex">
<div class="my-2 table-time px-2">{{ list.dateTime }}</div>
<a-table :pagination="false" :showHeader="false" :columns="columns" :data-source="list.clockList">
<template slot="actions" slot-scope="text, record, index">
<img src="https://www.tall.wiki/staticrec/drag.svg" />
</template>
<template slot="morning" slot-scope="text, record, index">
<div class="clock-in">
<div v-if="record.morningStatus">
{{ $moment(record.morning - 0).format('HH:mm') }}
</div>
<div v-else>
<a-button type="primary" size="small" class="clock-btn"> 打卡 </a-button>
<a-date-picker show-time @change="onChange($event, listIndex, index, 1)" class="clock-select" />
</div>
</div>
</template>
<template slot="night" slot-scope="text, record, index">
<div class="clock-in">
<div v-if="record.nightStatus">
{{ $moment(record.night - 0).format('HH:mm') }}
</div>
<div v-else>
<a-button type="primary" size="small" class="clock-btn"> 打卡 </a-button>
<a-date-picker show-time @change="onChange($event, listIndex, index, 2)" class="clock-select" />
</div>
</div>
</template>
</a-table>
</div>
</div>
</template>
<script>
const columns = [
{ title: ' ', dataIndex: 'actions', key: 'actions', scopedSlots: { customRender: 'actions' }, width: '10%' },
{ title: '姓名', dataIndex: 'memberName', key: 'memberName', align: 'center', width: '22.5%' },
{ title: '早', dataIndex: 'morning', key: 'morning', scopedSlots: { customRender: 'morning' }, align: 'center', width: '22.5%' },
{ title: '晚', dataIndex: 'night', key: 'night', scopedSlots: { customRender: 'night' }, align: 'center', width: '22.5%' },
{
title: '审核人',
dataIndex: 'checkerName',
key: 'checkerName',
scopedSlots: { customRender: 'checkerName' },
align: 'center',
width: '22.5%',
},
];
const lists = [
{
dateTime: '2021-08-27',
clockList: [
{
id: 1,
morning: '1630283371000',
morningStatus: true,
night: '1630319371000',
nightStatus: true,
memberName: '赵同学',
checkerName: '周勇',
},
{
key: 2,
morning: '1630283371000',
morningStatus: true,
night: '1630319371000',
nightStatus: false,
memberName: '张野',
checkerName: '武慧娟',
},
{
key: 3,
morning: '1630283371000',
morningStatus: false,
night: '1630319371000',
nightStatus: true,
memberName: '李亚男',
checkerName: '姚工',
},
],
},
{
dateTime: '2021-08-27',
clockList: [
{
id: 4,
morning: '1630283371000',
morningStatus: true,
night: '1630319371000',
nightStatus: true,
memberName: '赵同学',
checkerName: '周勇',
},
{
key: 5,
morning: '1630283371000',
morningStatus: true,
night: '1630319371000',
nightStatus: false,
memberName: '张野',
checkerName: '武慧娟',
},
{
key: 6,
morning: '1630283371000',
morningStatus: false,
night: '1630319371000',
nightStatus: true,
memberName: '李亚男',
checkerName: '姚工',
},
],
},
];
export default {
data() {
return {
columns,
lists,
};
},
methods: {
onChange(dateString, listIndex, index, type) {
const selectTime = this.$moment(dateString).format('x');
console.log('selectTime: ', selectTime);
if (type === 1) {
this.lists[listIndex].clockList[index].morning = selectTime;
} else {
this.lists[listIndex].clockList[index].night = selectTime;
}
},
},
};
</script>
<style scoped>
.table-head {
border-bottom: 1px solid #e8e8e8;
background: #fafafa;
height: 54px;
line-height: 54px;
font-weight: bold;
}
.table-time {
height: 54px;
line-height: 54px;
border-bottom: 1px solid #e8e8e8;
}
.table-head-item {
width: 22.5%;
text-align: center;
}
img {
width: 22px;
max-width: auto !important;
}
.clock-in {
position: relative;
}
.clock-btn {
position: absolute;
}
.clock-select {
position: relative;
min-width: auto !important;
width: 47px;
height: 20px;
overflow: hidden;
z-index: 9;
opacity: 0;
}
</style>

27
src/components/MemberPicker/MemberPicker.vue

@ -0,0 +1,27 @@
<template>
<div class="mt-3">
<!-- 多选 -->
<a-select mode="multiple" :default-value="defaultValue" style="width: 100%" placeholder="请选择成员" @change="handleChange">
<a-select-option v-for="i in 25" :key="(i + 9).toString(36) + i">
{{ (i + 9).toString(36) + i }}
</a-select-option>
</a-select>
</div>
</template>
<script>
export default {
data() {
return {defaultValue: [],};
},
methods: {
handleChange(value) {
console.log(`selected ${value}`);
},
},
};
</script>
<style lang="less" scoped>
</style>

142
src/components/PlatformList/Fruit.vue

@ -1,142 +0,0 @@
<template>
<div>
<div class="inner d-flex flex-wrap">
<div
:class="(index + 1) % 4 === 0 ? 'margin-0' : ''"
:key="index"
class="item-box"
v-for="(item, index) in list"
>
<p @click="detail(item.id)" class="font-24 my-3" style="cursor: pointer">{{ item.name }}</p>
<p
@click="detail(item.id)"
class="font-16"
style="color: rgba(0, 0, 0, 0.45); cursor: pointer"
>编号{{ item.identifier }}</p>
<p class="font-16 baseColor item-more">
<!-- <a-button type="primary" style="cursor: pointer">转化意向填报</a-button> -->
<intention-model :btn-name="btnName" :type-data="getId(item.id)" style="cursor: pointer" />
</p>
</div>
</div>
<div class="inner">
<a-pagination
:current="achCurrent"
:page-size="pageSize"
:total="total"
@change="onShowSizeChange"
class="pagination"
show-less-items
show-quick-jumper
v-show="total > 12"
/>
</div>
</div>
</template>
<script>
import { mapMutations, mapState } from 'vuex';
import { selRes } from 'config/api';
import IntentionModel from '../Introduce/IntentionModel.vue';
export default {
name: 'PlatformList',
components: { IntentionModel },
data() {
return {
list: [],
pageSize: 12,
total: 0,
typeData: {
type: 2,
Id: '',
},
btnName: '技术需求',
};
},
computed: mapState('home', ['achList', 'achIpt', 'achCurrent']),
watch: {
achList(val) {
this.getData();
},
achIpt(val) {
if (val.isBtn === 1) {
this.getData();
}
},
},
created() {
this.getData();
},
methods: {
...mapMutations('home', ['setAchCurrent', 'setAchId']),
//
onShowSizeChange(current, size) {
this.setAchCurrent(current);
this.getData();
},
//
async getData() {
try {
const params = {
param: {
content: this.achIpt.content,
modelIds: this.achList,
pageNum: this.achCurrent,
pageSize: 12,
},
};
const res = await selRes(params);
const { code, msg, data } = res.data;
if (code === 200) {
this.list = data.list;
this.total = parseInt(data.total);
}
} catch (error) {
// console.log(error);
}
},
//
detail(id) {
this.setAchId(id);
this.$router.push('/NewPlatform/AchDet');
},
getId(Id) {
return (this.typeData = {
type: 2,
Id,
});
},
},
};
</script>
<style lang="stylus" scoped>
.pagination {
margin: 40px 0;
text-align: right;
}
.item-box {
position: relative;
width: 20.5%;
background: #fff;
margin-right: 6%;
border-radius: 4px;
margin-bottom: 40px;
padding: 10px;
padding-bottom: 60px;
}
.margin-0 {
margin-right: 0% !important;
}
.item-more {
position: absolute;
bottom: 10px;
right: 10px;
text-align: right;
margin-bottom: 0 !important;
margin-top: 40px;
}
</style>

272
src/components/PlatformList/PlatformList.vue

@ -1,272 +0,0 @@
<template>
<div>
<div class="inner d-flex flex-wrap">
<div
:class="(index + 1) % 4 === 0 ? 'margin-0' : ''"
:key="index"
@click="jump(item)"
class="item-box mb-8 d-flex flex-column pointer"
v-for="(item, index) in list"
>
<img :src="item.picUrl" :title="item.name" class="con-img" v-if="item.picUrl" />
<img :src="item.visitLocation" :title="item.name" class="con-img" v-else />
<p class="font-24 my-4 title">{{ item.name }}</p>
<p class="font-16 baseColor" style="text-align: right; cursor: pointer">了解更多</p>
</div>
</div>
<div class="inner">
<a-pagination
:current="current"
:page-size="pageSize"
:total="total"
@change="onShowSizeChange"
class="pagination"
show-less-items
show-quick-jumper
v-show="total > 8"
/>
</div>
</div>
</template>
<script>
import { mapMutations, mapState } from 'vuex';
import { selInstrument, searchFront, selProduct } from 'config/api';
export default {
name: 'PlatformList',
data() {
return {
list: [],
pageSize: 8,
total: 20,
current: 1,
};
},
computed: mapState('home', ['listState', 'labList', 'LabIpt', 'insList', 'InsIpt', 'shareCurrent', 'productList', 'productIpt']),
watch: {
shareCurrent(val) {
// console.log(val);
this.monitor(this.listState);
},
labList(val) {
if (this.shareCurrent === 1) {
this.monitor(this.listState);
}
this.current = 1;
this.setShareCurrent(1);
},
LabIpt(val) {
if (this.LabIpt.isBtn === 1) {
if (this.shareCurrent === 1) {
this.monitor(this.listState);
}
this.current = 1;
this.setShareCurrent(1);
}
},
insList(val) {
if (this.shareCurrent === 1) {
this.monitor(this.listState);
}
this.current = 1;
this.setShareCurrent(1);
},
InsIpt(val) {
if (this.InsIpt.isBtn === 1) {
if (this.shareCurrent === 1) {
this.monitor(this.listState);
}
this.current = 1;
this.setShareCurrent(1);
}
},
productList(val) {
if (this.shareCurrent === 1) {
this.monitor(this.listState);
}
this.current = 1;
this.setShareCurrent(1);
},
productIpt(val) {
if (this.productIpt.isBtn === 1) {
if (this.shareCurrent === 1) {
this.monitor(this.listState);
}
this.current = 1;
this.setShareCurrent(1);
}
},
},
created() {
this.current = this.shareCurrent;
// console.log('this.listState: ', this.listState);
if (this.listState === 0) {
this.getSear();
} else if (this.listState === 1) {
this.getSelI();
} else {
this.getProductLists();
}
},
methods: {
...mapMutations('home', ['setShareCurrent']),
//
async getSelI() {
try {
const params = {
param: {
content: this.InsIpt.content, //
modelIds: this.insList, // ID
pageNum: this.shareCurrent,
pageSize: this.pageSize,
},
};
const res = await selInstrument(params);
const { code, msg, data } = res.data;
if (code === 200) {
this.list = data.list;
this.total = parseInt(data.total);
}
} catch (error) {
// console.log(error);
}
},
//
async getSear() {
try {
const params = {
param: {
name: this.LabIpt.content, //
moldIds: this.labList, // ID
pageNum: this.shareCurrent,
pageSize: this.pageSize,
},
};
const res = await searchFront(params);
const { code, msg, data } = res.data;
if (code === 200) {
this.list = data.list;
this.total = parseInt(data.total);
}
} catch (error) {
// console.log(error);
}
},
//
async getProductLists() {
try {
const params = {
param: {
content: this.productIpt.content, //
modelIds: this.productList, // ID
pageNum: this.shareCurrent,
pageSize: this.pageSize,
},
};
const res = await selProduct(params);
const { code, msg, data } = res.data;
if (code === 200) {
this.list = data.list;
this.total = parseInt(data.total);
}
} catch (error) {
// console.log(error);
}
},
//
onShowSizeChange(current, size) {
this.current = current;
this.setShareCurrent(this.current);
},
//
monitor(val) {
if (val === 0) {
this.getSear();
} else if (val === 1) {
this.getSelI();
} else {
this.getProductLists();
}
},
// /
jump(item) {
if (this.listState === 0) {
this.$router.push({
path: '/NewPlatform/Share/Institute',
name: 'Institute',
params: {
id: item.id,
description: item.description,
name: item.name,
direction: item.direction,
experiments: item.experiments,
projectKind: item.projectKind,
vertify: item.vertify,
},
});
} else if (this.listState === 1) {
this.$router.push({
path: '/NewPlatform/Share/InsDet',
name: 'InsDet',
params: { id: item.id },
});
} else if (this.listState === 3) {
this.$router.push({
path: '/NewPlatform/Share/InsDet',
name: 'InsDet',
params: { id: item.id },
});
}
},
},
};
</script>
<style lang="stylus" scoped>
.pagination {
margin: 40px 0;
text-align: right;
}
.item-box {
width: 20.5%;
margin-right: 6%;
border-radius: 4px;
// position: relative;
margin-bottom: 30px;
}
.title {
text-align: center;
// position: absolute;
// bottom: 0;
height: 90px;
width: 100%;
color: rgba(0, 0, 0, 0.85);
font-size: 24px;
}
@media screen and (min-width: 1400px) and (max-width: 1650px) {
.title {
height: 48px;
font-size: 20px;
}
}
@media only screen and (max-width: 1400px) {
.title {
height: 48px;
font-size: 16px;
}
}
.margin-0 {
margin-right: 0 !important;
}
.con-img {
height: 270px;
width: 100%;
border: none;
}
</style>

83
src/components/Rotation/Rotation.vue

@ -1,83 +0,0 @@
<template>
<div class="head">
<img
@click="$router.push('/IncubationPlatform/MakerSpace')"
class="settle-in pointer"
src="~assets/settleIn.png"
/>
<a-carousel :autoplay-speed="time" autoplay>
<div :key="item.id" class="img-box" v-for="item in lists">
<img :src="item.url" alt />
</div>
</a-carousel>
</div>
</template>
<script>
import { queryRotation } from 'config/api';
export default {
data() {
return {
time: 10000,
lists: [],
};
},
created() {
this.getData();
},
methods: {
async getData() {
try {
const params = { param: { showPage: 0 } };
const res = await queryRotation(params);
const { code, data, msg } = res.data;
if (code === 200) {
this.lists = data;
} else {
this.$message.error(error);
}
} catch (error) {
this.$message.error(error);
}
},
},
};
</script>
<style lang="stylus">
.head {
background: white;
overflow: hidden;
position: relative;
}
.settle-in {
position: absolute;
top: 5%;
right: 9%;
z-index: 9;
height: 90%;
}
.img-box {
// height: 380px;
width: 100%;
img {
height: 100%;
width: 100%;
}
}
.ant-carousel >>> .slick-slide {
text-align: center;
height: 160px;
line-height: 160px;
background: #364d79;
overflow: hidden;
}
.ant-carousel >>> .slick-slide h3 {
color: #fff;
}
</style>

259
src/components/SettledEnterprise/SettledEnterprise.vue

@ -1,259 +0,0 @@
<template>
<div class="fast-box">
<div class="d-flex flex-nowrap flex-row-reverse mb-5">
<a-input-search
@search="getBusiness"
enter-button="搜索"
placeholder="请输入..."
style="width: 50%"
v-model="business"
/>
</div>
<div class="con-box" id="bobaodiv">
<div
:key="0 + `${i}`"
@click="openProfile(item.company,item.introduce)"
class="ent-box-div"
v-for="(item, i) in lists"
>
<div class="ent-box pointer">
<p class="ent-index">{{ i + 1 }}</p>
<span class="ent-name" style="margin-left: 50px">{{ item.company }}</span>
<span class="ent-mainBusiness" style="margin-left: 50px">{{ item.mainBusiness }}</span>
</div>
</div>
<!-- <div
:key="0 + `${i}`"
@click="openProfile(item.company,item.introduce)"
class="ent-box-div"
v-for="(item, i) in lists"
>
<div class="ent-box pointer">
<p class="ent-index">{{ i + 1 }}</p>
<span class="ent-name" style="margin-left: 50px">{{ item.company }}</span>
<span class="ent-mainBusiness" style="margin-left: 50px">{{ item.mainBusiness }}</span>
</div>
</div>
<div
:key="j"
@click="openProfile(item.company,item.introduce)"
class="ent-box-div"
v-for="(item, j) in lists"
>
<div class="ent-box pointer">
<p class="ent-index">{{ j + 1 }}</p>
<span class="ent-name" style="margin-left: 50px">{{ item.company }}</span>
<span class="ent-mainBusiness" style="margin-left: 50px">{{ item.mainBusiness }}</span>
</div>
</div>-->
<company-profile :show-profile="showProfile" @closeProfile="closeProfile" v-if="showProfile" />
</div>
</div>
</template>
<script>
import { mapMutations } from 'vuex';
import CompanyProfile from '../Introduce/CompanyProfile.vue';
export default {
name: 'SettledEnterprise',
components: { CompanyProfile },
props: {
lists: {
type: Array,
default: () => [],
},
},
data() {
return {
business: '', //
height: '',
width: '',
liHeight: '',
oMarquee: null, //
BBLineH: null,
BBScrollAmount: 1,
BBLineCount: 0,
rollRestTime: 500,
rollTime: 10,
length: 0,
showProfile: false,
};
},
mounted() {
const length = this.lists.length / 100;
this.BBLineH = 76;
// this.scrollBox();
},
methods: {
...mapMutations('home', ['setProfile']),
//
getBusiness() {
console.log('value: ', this.business);
this.$emit('searchEnt', this.business);
},
scrollBox() {
/*
* 启动播报滚动事件
*/
const that = this;
// window.onload = function() {
// console.log('');
// BBAllTime = 0;
that.oMarquee = document.getElementById('bobaodiv'); //
window.setTimeout(function() {
that.run();
}, that.rollRestTime);
// };
},
/*
* 播报滚动事件主逻辑
*/
run() {
const that = this;
that.BBLineCount = this.lists.length;
if (that.BBScrollAmount == 0) {
//0
window.setTimeout(function() {
that.run();
}, that.rollTime);
return;
}
if (that.oMarquee.scrollTop >= that.BBLineCount * that.BBLineH) {
//
that.oMarquee.scrollTop = 0;
}
that.oMarquee.scrollTop += that.BBScrollAmount;
if (that.oMarquee.scrollTop % that.BBLineH < 1 && that.oMarquee.scrollTop > 0) {
window.setTimeout(function() {
that.run();
}, that.rollRestTime);
} else {
window.setTimeout(function() {
that.run();
}, that.rollTime);
}
},
//
openProfile(title, description) {
if (!description) return;
this.setProfile(null);
const profile = {
title,
description,
};
this.setProfile(profile);
this.showProfile = true;
},
closeProfile() {
this.showProfile = false;
},
},
};
</script>
<style lang="stylus" scoped>
.ent-box-div {
width: 100%;
margin-right: 11%;
position: relative;
height: 76px;
}
.ent-box {
width: 100%;
// margin-right: 11%;
position: relative;
height: 56px;
line-height: 56px;
padding: 0 14px;
background: #FFFFFF;
box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.16);
opacity: 1;
// margin-bottom: 20px;
}
.ent-index {
width: 28px;
position: absolute;
top: 14px;
line-height: 28px;
text-align: center;
font-size: 20px;
font-family: Segoe UI;
color: #FFFFFF;
height: 28px;
border-radius: 50%;
background: #13ACC4;
margin-bottom: 0;
}
.ent-name {
position: absolute;
left: 0;
width: 50%;
height: 24px;
top: 50%;
margin-top: -12px;
font-size: 22px;
font-family: Microsoft YaHei;
font-weight: bold;
line-height: 24px;
color: rgba(0, 0, 0, 0.65);
opacity: 1;
overflow: hidden;
}
.ent-mainBusiness {
position: absolute;
left: 60%;
width: 25%;
height: 24px;
top: 50%;
margin-top: -12px;
font-size: 22px;
font-family: Microsoft YaHei;
font-weight: bold;
line-height: 24px;
color: rgba(0, 0, 0, 0.65);
opacity: 1;
overflow: hidden;
}
// .fast-box {
// position: relative;
// height: 456px;
// }
// .con-box {
// top: 0;
// left: 0;
// position: absolute;
// width: 100%;
// height: 100%;
// overflow: hidden;
// div {
// justify-content: center;
// align-items: center;
// }
// }
.con-box {
width: 100%;
height: 100%;
overflow: hidden;
div {
justify-content: center;
align-items: center;
}
}
</style>

83
src/components/TimePicker/TimePicker.vue

@ -0,0 +1,83 @@
<template>
<div class="d-flex flex-nowrap">
<a-date-picker
v-model="startValue"
:disabled-date="disabledStartDate"
show-time
:format="monthFormat"
placeholder="起始时间"
class="box box1"
@openChange="handleStartOpenChange"
/>
<a-date-picker
v-model="endValue"
:disabled-date="disabledEndDate"
show-time
:format="monthFormat"
class="box box2"
placeholder="截止时间"
:open="endOpen"
@openChange="handleEndOpenChange"
/>
</div>
</template>
<script>
export default {
data() {
return {
monthFormat: 'YYYY-MM-DD',
startValue: null,
endValue: null,
endOpen: false,
};
},
watch: {
startValue(val) {
console.log('startValue', val);
},
endValue(val) {
console.log('endValue', val);
},
},
methods: {
disabledStartDate(startValue) {
const endValue = this.endValue;
if (!startValue || !endValue) {
return false;
}
return startValue.valueOf() > endValue.valueOf();
},
disabledEndDate(endValue) {
const startValue = this.startValue;
if (!endValue || !startValue) {
return false;
}
return startValue.valueOf() >= endValue.valueOf();
},
handleStartOpenChange(open) {
if (!open) {
this.endOpen = true;
}
},
handleEndOpenChange(open) {
this.endOpen = open;
},
},
};
</script>
<style lang="less" scoped>
.box {
min-width: auto !important;
width: 53% !important;
}
.box1 {
margin-right: 2%;
}
.box2 {
margin-left: 2%;
}
</style>

218
src/components/User/MechanismSignUp.vue

@ -1,218 +0,0 @@
<template>
<div>
<!-- 机构注册 -->
<a-row class="d-flex flex-nowrap mt-4 pb-10" type="flex">
<a-col :span="8" class="explain" flex="auto">
<a-form :form="form" @submit="handleSignUp">
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
help="支持中文、字母、数字、“_”的组合且不能为纯数字,4-20位字符"
label="登录用户名"
required
>
<a-input v-decorator="['account']" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="单位性质" required>
<a-select placeholder="请选择单位性质" v-decorator="['nature']">
<a-select-option value="1">高校</a-select-option>
<a-select-option value="2">初中</a-select-option>
</a-select>
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
help="不能超过100个字符"
label="机构全称"
required
>
<a-input v-decorator="['fullName']" />
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
help="统一社会信用代码、组织机构代码由字母和数字组成,分别为18/9位字符"
label="统一社会信用代码或组织机构代码"
required
>
<a-input v-decorator="['code1']" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="登录密码" required>
<a-input-password placeholder="密码由字母和数字混合组成,6-16位字符" v-decorator="['password', { rules: passwordRules }]" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="确认密码">
<a-input-password placeholder="请再次输入您设置的密码" v-decorator="['againCredential', { rules: againPassword }]" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="手机">
<a-input
@change="changePhone"
placeholder="该手机号用于账号激活、登录及找回密码"
type="number"
v-decorator="['phone', { rules: phoneRules }]"
/>
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="图片验证码" required>
<div class="d-flex flex-nowrap">
<a-input placeholder="请输入图片验证码" type="number" v-model="codeNum" />
<img :src="picCode.imageBase64" @click="changePicCode" class="code_img ml-2" v-if="picCode && picCode.imageBase64" />
<a-button @click="changePicCode" class="code_img ml-2" size="small" type="primary" v-else>重新获取</a-button>
</div>
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="短信验证码" required>
<div class="d-flex flex-nowrap">
<a-input placeholder="请输入验证码" type="number" v-decorator="['smsCode', { rules: codeRules }]" />
<a-button class="ml-2" disabled type="primary" v-if="showInterval">重新发送 {{ interval }}</a-button>
<a-button :disabled="phone && phone.length !== 11" @click="getCode" class="ml-2" type="primary" v-else>获取验证码</a-button>
</div>
</a-form-item>
<!-- <a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="来源"
>
<a-select placeholder="请选择来源" v-decorator="['source', {initialValue: source }]">
<a-select-option value="1">绿谷</a-select-option>
</a-select>
</a-form-item> -->
<div class="d-flex flex-row-reverse">
<a-button block class="my-5" html-type="submit" style="width: 75%" type="primary">立即注册</a-button>
</div>
</a-form>
<div class="d-flex flex-row-reverse mt-1">
<div class="d-flex flex-wrap" style="width: 75%">
<div class="flex-1"></div>
<router-link tag="span" to="/login">
<span class="baseColor pointer">已有账号去登录</span>
</router-link>
</div>
</div>
</a-col>
<a-col :span="4" flex="150px">
<div class="d-flex flex-column">
<div>说明</div>
<div>1. 注册后即可登录部分功能需平台人员审核后才能使用</div>
</div>
</a-col>
</a-row>
</div>
</template>
<script>
import { mapActions, mapState } from 'vuex';
import mixin from 'views/User/mixin';
import { saveUserMes } from '@/config/api';
const formItemLayout = {
labelCol: { span: 6 },
wrapperCol: { span: 18 },
};
const formTailLayout = {
labelCol: { span: 6 },
wrapperCol: { span: 18, offset: 6 },
};
export default {
name: 'MechanismSignUp',
mixins: [mixin],
data() {
return {
formItemLayout,
formTailLayout,
form: this.$form.createForm(this, { name: 'mechanismSignUp' }),
phone: '',
codeNum: '',
source: '1',
info: null,
};
},
computed: mapState('user', ['picCode']),
created() {
this.sendPicCode();
},
methods: {
...mapActions('user', ['signUp', 'sendCode', 'sendPicCode']),
changePhone(e) {
this.phone = e.target.value;
},
//
changePicCode() {
this.sendPicCode();
},
//
async getCode() {
try {
const params = {
phone: this.form.getFieldValue('phone'),
verificationCodeId: this.picCode.verificationCodeId,
verificationCodeValue: this.codeNum,
};
await this.sendCode(params);
this.getCodeInterval();
} catch (error) {
throw new Error(`mechanismSignUp.vue method getCode: ${error}`);
}
},
//
async handleSignUp(e) {
e.preventDefault();
this.form.validateFields(async (err, values) => {
if (!err) {
// console.log('Received values of form: ', values);
try {
const { account, nature, fullName, code1, password, phone, smsCode, source } = values;
this.info = values;
const params = { account, password, phone, smsCode, source: 1 };
await this.signUp(params);
this.saveUserMes();
} catch (error) {
// console.log(`mechanismSignUp.vue methods handleSignUp: ${error}`);
}
}
});
return;
},
//
async saveUserMes() {
try {
const { account, nature, fullName, code1, password, phone, smsCode, source } = this.info;
// console.log('this.info: ', this.info);
const params = { param: { code: code1, companyName: fullName, mold: nature, name: account, nickname: '', phone, type: 2 } };
// console.log('params: ', params);
const res = await saveUserMes(params);
const { code, msg, data } = res.data;
if (code === 200) {
// //
const { query } = this.$route;
this.$router.replace({ path: '/', query });
} else {
message.error(msg || '注册失败');
throw msg;
}
} catch (error) {
// console.log(`mechanismSignUp.vue methods saveUserMes: ${error}`);
}
},
},
};
</script>
<style lang="stylus" scoped>
.explain {
padding-right: 28px;
margin-right: 28px;
border-right: 1px solid #EEEEEE;
}
.code_img {
width: 102px !important;
height: 32px !important;
}
</style>

204
src/components/User/PersonalSignUp.vue

@ -1,204 +0,0 @@
<template>
<div>
<!-- 个人注册 -->
<a-row class="d-flex flex-nowrap mt-4 pb-10" type="flex">
<a-col :span="8" class="explain" flex="auto">
<a-form :form="form" @submit="handleSignUp">
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
help="支持中文、字母、数字、“_”的组合且不能为纯数字,4-20位字符"
label="登录用户名"
required
>
<a-input v-decorator="['account']" />
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
help="不能超过20个字符"
label="昵称"
required
>
<a-input maxlength="20" v-decorator="['nickname']" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="登录密码">
<a-input-password placeholder="密码由字母和数字混合组成,6-16位字符" v-decorator="['password', { rules: passwordRules }]" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="确认密码">
<a-input-password placeholder="请再次输入您设置的密码" v-decorator="['againCredential', { rules: againPassword }]" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="手机">
<a-input
@change="changePhone"
placeholder="该手机号用于账号激活、登录及找回密码"
type="number"
v-decorator="['phone', { rules: phoneRules }]"
/>
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="图片验证码" required>
<div class="d-flex flex-nowrap">
<a-input placeholder="请输入图片验证码" type="number" v-model="codeNum" />
<img :src="picCode.imageBase64" @click="changePicCode" class="code_img ml-2" v-if="picCode && picCode.imageBase64" />
<a-button @click="changePicCode" class="code_img ml-2" size="small" type="primary" v-else>重新获取</a-button>
</div>
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="短信验证码" required>
<div class="d-flex flex-nowrap">
<a-input placeholder="请输入验证码" type="number" v-decorator="['smsCode', { rules: codeRules }]" />
<a-button class="ml-2" disabled type="primary" v-if="showInterval">重新发送 {{ interval }}</a-button>
<a-button :disabled="phone && phone.length !== 11" @click="getCode" class="ml-2" type="primary" v-else>获取验证码</a-button>
</div>
</a-form-item>
<!-- <a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="来源"
>
<a-select placeholder="请选择来源" v-decorator="['source', {initialValue: source }]">
<a-select-option value="1">绿谷</a-select-option>
</a-select>
</a-form-item> -->
<div class="d-flex flex-row-reverse">
<a-button block class="my-5" html-type="submit" style="width: 75%" type="primary">立即注册</a-button>
</div>
</a-form>
<div class="d-flex flex-row-reverse mt-1">
<div class="d-flex flex-wrap" style="width: 75%">
<div class="flex-1"></div>
<router-link tag="span" to="/login">
<span class="baseColor pointer">已有账号去登录</span>
</router-link>
</div>
</div>
</a-col>
<a-col :span="4" flex="150px">
<div class="d-flex flex-column">
<div>说明</div>
<div>1. 个人用户无法享受完整服务尽可能使用公司 注册</div>
</div>
</a-col>
</a-row>
</div>
</template>
<script>
import { mapActions, mapState } from 'vuex';
import mixin from 'views/User/mixin';
import { saveUserMes } from '@/config/api';
const formItemLayout = {
labelCol: { span: 6 },
wrapperCol: { span: 18 },
};
const formTailLayout = {
labelCol: { span: 6 },
wrapperCol: { span: 18, offset: 6 },
};
export default {
name: 'PersonalSignUp',
mixins: [mixin],
data() {
return {
formItemLayout,
formTailLayout,
form: this.$form.createForm(this, { name: 'personalSignUp' }),
phone: '',
codeNum: '',
source: '1',
info: null,
};
},
computed: mapState('user', ['picCode']),
created() {
this.sendPicCode();
},
methods: {
...mapActions('user', ['signUp', 'sendCode', 'sendPicCode']),
changePhone(e) {
this.phone = e.target.value;
},
//
changePicCode() {
this.sendPicCode();
},
//
async getCode() {
try {
const params = {
phone: this.form.getFieldValue('phone'),
verificationCodeId: this.picCode.verificationCodeId,
verificationCodeValue: this.codeNum,
};
await this.sendCode(params);
this.getCodeInterval();
} catch (error) {
throw new Error(`personalSignUp.vue method getCode: ${error}`);
}
},
//
async handleSignUp(e) {
e.preventDefault();
this.form.validateFields(async (err, values) => {
if (!err) {
// console.log('Received values of form: ', values);
try {
const { account, nickname, password, phone, smsCode, source } = values;
this.info = values;
const params = { account, password, phone, smsCode, source: 1 };
await this.signUp(params);
this.saveUserMes();
} catch (error) {
// console.log(`personalSignUp.vue methods handleSignUp: ${error}`);
}
}
});
return;
},
//
async saveUserMes() {
try {
const { account, nickname, password, phone, smsCode, source } = this.info;
// console.log('this.info: ', this.info);
const params = { param: { name: account, nickname, phone, type: 1 } };
// console.log('params: ', params);
const res = await saveUserMes(params);
const { code, msg, data } = res.data;
if (code === 200) {
// //
const { query } = this.$route;
this.$router.replace({ path: '/', query });
} else {
message.error(msg || '注册失败');
throw msg;
}
} catch (error) {
// console.log(`personalSignUp.vue methods saveUserMes: ${error}`);
}
},
},
};
</script>
<style lang="stylus" scoped>
.explain {
padding-right: 28px;
margin-right: 28px;
border-right: 1px solid #EEEEEE;
}
.code_img {
width: 102px !important;
height: 32px !important;
}
</style>

29
src/config/api-user.js

@ -1,29 +0,0 @@
/*
* Copyright (c) 2020.
* author: wally
* email: 18603454788@163.com
*/
import axios from 'axios';
let { proxyUrl, msgUrl } = require('@/config/setting');
const tall = `${proxyUrl}/tall/v1.0`;
// console.log('tall: ', tall);
const users = `${tall}/users`;
// 用户登录
export const signIn = params => axios.post(`${users}/signin`, params);
// 注册
export const signUp = params => axios.post(`${users}/signup`, params);
// 图片验证码
export const getPicCode = () => axios.get(`${users}/code`);
// 发送验证码
export const getSmscode = params => axios.get(`${users}/smscode`, params);
// 通过手机号修改密码
export const changePassword = params => axios.post(`${users}/password`, params);
// 通过userId获取token
export const getUserId = params => axios.get(`${users}/userId`, params);

119
src/config/api.js

@ -1,129 +1,10 @@
/*
* Copyright (c) 2019.
* author: wally
* email: 18603454788@163.com
*/
import axios from 'axios';
let { proxyUrl, msgUrl } = require('@/config/setting');
const greenvalley = `${proxyUrl}/greenvalley`;
// const page = `${greenvalley}/page`; // 创新平台相关操作
const policy = `${proxyUrl}/policy/policy`; // 创新政策相关接口
const activity = `${greenvalley}/activity`; // 创新政策相关接口
const Business = `${greenvalley}/business`; // 衍生企业和合作伙伴查询
const carousel = `${greenvalley}/carousel`; // 轮播图相关接口
const page = `${greenvalley}/page`; // 页面详情相关接口
const achInstr = `${greenvalley}/achInstr`; // 轮播图相关接口
const service = `${greenvalley}/service`; // 服务相关接口
const user = `${greenvalley}/user`; // 用户相关接口
const product = `${greenvalley}/product`; // 产品相关接口
const tutorRelated = `${greenvalley}/tutorRelated`; // 导师相关接口
// websocket基础地址
export const WS_BASE_URL = msgUrl;
// 登陆人信息保存
export const saveUserMes = params => axios.post(`${greenvalley}/userMes/saveUserMes`, params);
// 查询政策列表
export const selLikePolicy = params => axios.post(`${policy}/selLikePolicy`, params);
// 查询政策详情
export const selPolicy = params => axios.post(`${policy}/selPolicy`, params);
// 申请加入三大平台
export const JoinPlatform = params => axios.post(`${greenvalley}/platform/JoinPlatform`, params);
// 创新平台申请加入
export const CreatingPlatformAdd = params => axios.post(`${greenvalley}/creatingPlatform/add`, params);
// 上传附件
export const upload = `${greenvalley}/file/upload`;
// 加入我们
export const joinUs = params => axios.post(`${greenvalley}/PersonApply/joinUs`, params);
// 查询轮播图
export const queryRotation = params => axios.post(`${carousel}/query`, params);
// 查询行业政策列表
export const industryInfo = params => axios.post(`${greenvalley}/industryInfo/beforeSearch`, params);
// 查询活动公告列表
export const front = params => axios.post(`${activity}/query/front`, params);
// 查询活动公告详情
export const activeDetail = params => axios.post(`${activity}/query/detail`, params);
// 申请加入活动
export const apply = params => axios.post(`${activity}/apply`, params);
// 查询衍生企业
export const frontSearchFriend = params => axios.post(`${Business}/frontSearchFriend`, params);
// 查询合作伙伴
export const frontSearchCompany = params => axios.post(`${Business}/frontSearchCompany`, params);
// 介绍页面详情查询
export const getPageDetail = params => axios.post(`${page}/detail`, params);
// 分类查询
export const selModel = params => axios.post(`${achInstr}/selModel`, params);
// 仪器列表查询
export const selInstrument = params => axios.post(`${achInstr}/selInstrument`, params);
// 仪器详情查询
export const selInstrumentMes = params => axios.post(`${achInstr}/selInstrumentMes`, params);
// 通过研究院(实验室)Id查询仪器列表
export const selInstrumentByRes = params => axios.post(`${achInstr}/selInstrumentByRes`, params);
// 研究院(实验室)列表查询
export const searchFront = params => axios.post(`${greenvalley}/institute/searchFront`, params);
// 研究院团队详情查询
export const teamSearch = params => axios.post(`${greenvalley}/teamGuide/teamSearch`, params);
// 成果列表查询
export const selRes = params => axios.post(`${achInstr}/selRes`, params);
// 成果详情查询
export const selResMes = params => axios.post(`${achInstr}/selResMes`, params);
// 服务列表查询
export const selService = params => axios.post(`${greenvalley}/serviceProject/selService`, params);
// 服务详情查询
export const selContent = params => axios.post(`${greenvalley}/serviceProject/selContent`, params);
// 查询用户购物车
export const SearchCar = params => axios.post(`${service}/SearchCar`, params);
// 服务/设备/成果直接申请(意向填报)
export const serviceApply = params => axios.post(`${service}/serviceApply`, params);
// 加入购物车
export const addCar = params => axios.post(`${service}/addCar`, params);
// 查询用户购物车
export const searchCar = params => axios.post(`${service}/SearchCar`, params);
// 加入购物车后购买
export const carAndBuy = params => axios.post(`${service}/CarAndBuy`, params);
// 登录人信息
export const getUserSer = params => axios.post(`${user}/userSer`, params);
// 查询 产品列表
export const selProduct = params => axios.post(`${product}/selProduct`, params);
// 查询 产品列表 详情
export const selProductMes = params => axios.post(`${product}/selProductMes`, params);
// 查询 创业导师
export const selTeacher = () => axios.post(`${tutorRelated}/selTeacher`);
// 入驻企业申请
export const Settled = params => axios.post(`${greenvalley}/place/apply`, params);
// 入驻企业名录查询
export const searchEnt = params => axios.post(`${greenvalley}/place/searchFront`, params);

19
src/config/selComment.js

@ -1,19 +0,0 @@
/*
* Copyright (c) 2019.
* author: wally
* email: 18603454788@163.com
*/
import axios from 'axios';
let { proxyUrl, msgUrl } = require('@/config/setting');
const greenvalley = `${proxyUrl}/greenvalley`;
const comment = `${greenvalley}/comment`; // 交流社区
// 发帖
export const addComment = params => axios.post(`${comment}/addComment`, params);
// 发帖查询
export const selComment = params => axios.post(`${comment}/selComment`, params);
// 跟帖发表(评论发表)
export const insComment = params => axios.post(`${comment}/insComment`, params);
// 跟帖查询(评论查询)
export const selCommunity = params => axios.post(`${comment}/selCommunity`, params);

14
src/main.js

@ -7,27 +7,15 @@ import router from './router';
import store from './store';
import './plugins/ant-design-vue.js';
import 'common/portrait.styl';
import 'common/platform.styl';
import './assets/icon/iconfont.css';
import VueDOMPurifyHTML from 'vue-dompurify-html';
import moment from 'moment'; //导入文件
import echarts from 'echarts';
import BaiduMap from 'vue-baidu-map';
Vue.prototype.$moment = moment; //赋值使用
Vue.prototype.$echarts = echarts;
Vue.config.productionTip = false;
Vue.use(VueDOMPurifyHTML);
Vue.use(BaiduMap, {
/* Visit http://lbsyun.baidu.com/apiconsole/key for details about app key. */
ak: 'YOUR_APP_KEY',
});
window.vm = new Vue({
router,
store,
render: h => h(App),
}).$mount('#app');
}).$mount('#app');

304
src/router/index.js

@ -11,310 +11,6 @@ const routes = [
name: 'Home',
component: Home,
},
// 登录界面
{
path: '/login',
name: 'Login',
component: () => import(/* webpackChunkName: "Login" */ 'views/User/Login.vue'),
},
// 注册界面
{
path: '/register',
name: 'Register',
component: () => import(/* webpackChunkName: "register" */ 'views/User/Register.vue'),
},
// 修改密码
{
path: '/forget-password',
name: 'ForgetPassword',
component: () => import(/* webpackChunkName: "forget-password" */ 'views/User/ForgetPassword.vue'),
},
// 关于我们界面
{
path: '/About/Introduce',
name: 'About',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/About/About.vue'),
children: [
{
path: '/About/Introduce',
name: 'Introduce',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/About/Children/Introduce.vue'),
},
{
path: '/About/Organ',
name: 'Organ',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/About/Children/Organ.vue'),
},
{
path: '/About/Partner',
name: 'Partner',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/About/Children/Partner.vue'),
},
{
path: '/About/SpinOffs',
name: 'SpinOffs',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/About/Children/SpinOffs.vue'),
},
],
},
// 政策界面
{
path: '/Policy',
name: 'Policy',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/Policy/Policy.vue'),
},
// 政策详情界面
{
path: '/Policy/PolicyDetails',
name: 'PolicyDetails',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/Policy/PolicyDetails.vue'),
},
// 交流社区界面
{
path: '/Community',
name: 'Community',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/Community/Community.vue'),
},
// 交流社区发帖界面
{
path: '/Posting',
name: 'Posting',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/Community/Posting.vue'),
},
// 交流帖子详情页
{
path: '/ComDetails',
name: 'ComDetails',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/Community/ComDetails.vue'),
},
// 行业资讯界面
{
path: '/ItInformation',
name: 'ItInformation',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/ItInformation/ItInformation.vue'),
},
// 行业资讯详情界面
{
path: '/ItDetails',
name: 'ItDetails',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/ItInformation/ItDetails.vue'),
},
// 活动公告界面
{
path: '/Activity',
name: 'Activity',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/Activity/Activity.vue'),
},
// 活动公告详情界面
{
path: '/ActDetails',
name: 'ActDetails',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/Activity/ActDetails.vue'),
},
// 联系我们界面
{
path: '/ContactUs',
name: 'ContactUs',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/ContactUs/ContactUs.vue'),
},
// 创新平台
{
path: '/NewPlatform/NewCore',
name: 'NewPlatform',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/NewPlatform/NewPlatform.vue'),
children: [
{
path: '/NewPlatform/NewCore',
name: 'Core',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/NewPlatform/Children/Core.vue'),
},
{
path: '/NewPlatform/News',
name: 'News',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/NewPlatform/Children/Platform.vue'),
},
{
path: '/NewPlatform/NewService',
name: 'Service',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/NewPlatform/Children/Service.vue'),
},
{
path: '/NewPlatform/ServiceDet',
name: 'ServiceDet',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/NewPlatform/Children/ServiceDet.vue'),
},
{
// 科技资源开放共享服务平台
path: '/NewPlatform/Share',
name: 'Share',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/NewPlatform/Children/Share.vue'),
},
{
// 科技资源开放共享服务平台 > 研究院(实验室)详情页
path: '/NewPlatform/Share/Institute',
name: 'Institute',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/NewPlatform/Children/ShareChild/Institute.vue'),
},
{
// 科技资源开放共享服务平台 > 仪器详情页
path: '/NewPlatform/Share/InsDet',
name: 'InsDet',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/NewPlatform/Children/ShareChild/InsDet.vue'),
},
{
// 知识产权与技术转移转化服务平台
path: '/NewPlatform/Transfer',
name: 'Transfer',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/NewPlatform/Children/Transfer.vue'),
},
{
// 创新服务
path: '/NewPlatform/Develop',
name: 'Develop',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/NewPlatform/Children/Develop.vue'),
},
{
// 成果详情页
path: '/NewPlatform/AchDet',
name: 'AchDet',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/NewPlatform/Children/AchDet.vue'),
},
],
},
// 孵化平台
{
path: '/IncubationPlatform/MakerSpace',
name: 'IncubationPlatform',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/IncubationPlatform/IncubationPlatform.vue'),
children: [
// 众创空间
{
path: '/IncubationPlatform/MakerSpace',
name: 'MakerSpace',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/IncubationPlatform/Children/MakerSpace.vue'),
},
// 孵化场所
{
path: '/IncubationPlatform/Incubator',
name: 'Incubator',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/IncubationPlatform/Children/Incubator.vue'),
},
// 公共实验室
{
path: '/IncubationPlatform/PublicLaboratory',
name: 'PublicLaboratory',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/IncubationPlatform/Children/PublicLaboratory.vue'),
},
// 中试基地
{
path: '/IncubationPlatform/PilotBase',
name: 'PilotBase',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/IncubationPlatform/Children/PilotBase.vue'),
},
// 创业导师
{
path: '/IncubationPlatform/Tutor',
name: 'Tutor',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/IncubationPlatform/Children/Tutor.vue'),
},
// 合作伙伴
{
path: '/IncubationPlatform/Partner',
name: 'Partner',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/IncubationPlatform/Children/Partner.vue'),
},
// 创业服务
{
path: '/IncubationPlatform/Services',
name: 'Services',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/IncubationPlatform/Children/Services.vue'),
},
// 产品展示
{
path: '/IncubationPlatform/Products',
name: 'Products',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/IncubationPlatform/Children/Products.vue'),
},
// 实体众创空间
{
path: '/IncubationPlatform/MakerSpace/EntitySpace',
name: 'EntitySpace',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/IncubationPlatform/Children/place/EntitySpace.vue'),
},
// 虚拟众创空间
{
path: '/IncubationPlatform/MakerSpace/VirtualSpace',
name: 'VirtualSpace',
component: () =>
import(/* webpackChunkName: "cooperative-enterprise" */ 'views/IncubationPlatform/Children/place/VirtualSpace.vue'),
},
// 统计信息填报
{
path: '/IncubationPlatform/MakerSpace/InformationFilling',
name: 'InformationFilling',
component: () =>
import(/* webpackChunkName: "cooperative-enterprise" */ 'views/IncubationPlatform/Children/place/InformationFilling.vue'),
},
],
},
// 购物车
{
path: '/Cart',
name: 'Cart',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/Cart/Cart.vue'),
},
{
// 创新挑战
path: '/Challenge/Solicitation',
name: 'Challenge',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/Challenge/Challenge.vue'),
children: [
{
path: '/Challenge/Solicitation',
name: 'Solicitation',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/Challenge/Children/Solicitation.vue'),
},
{
path: '/Challenge/Release',
name: 'Release',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/Challenge/Children/Release.vue'),
},
{
path: '/Challenge/Notice',
name: 'Notice',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/Challenge/Children/Notice.vue'),
},
],
},
{
// 产业平台
path: '/Industry/Union',
name: 'Industry',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/Industry/Industry.vue'),
children: [
{
path: '/Industry/Union',
name: 'Union',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/Industry/Children/Union.vue'),
},
{
path: '/Industry/Serve',
name: 'Serve',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/Industry/Children/Serve.vue'),
},
{
path: '/Industry/Enterprise',
name: 'Enterprise',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/Industry/Children/Enterprise.vue'),
},
],
},
// 知识平台界面
{
path: '/Knowledge',
name: 'Knowledge',
component: () => import(/* webpackChunkName: "cooperative-enterprise" */ 'views/Knowledge/Knowledge.vue'),
},
];
const router = new VueRouter({

143
src/store/modules/user/actions.js

@ -1,144 +1,3 @@
import axios from 'axios';
import { message } from 'ant-design-vue';
import { getSmscode, getPicCode, signIn, changePassword, signUp, getUserId } from '@/config/api-user';
const actions = {
/**
* sendCode 发送验证码
* @param {any} commit
* @param {object} params 提交的数据
* @param {string} params.phone 手机号
*/
async sendCode({ commit }, params) {
try {
const res = await getSmscode({ params });
const { code, msg, data } = res.data;
if (code === 200) {
return data;
} else {
message.error(msg || '发送失败');
throw msg;
}
} catch (error) {
throw error || '发送失败';
}
},
/**
* sendPicCode 获取图片验证码
* @param {any} commit
* @param {object} params 提交的数据
*/
async sendPicCode({ commit }) {
try {
const res = await getPicCode();
const { code, msg, data } = res.data;
if (code === 200) {
commit('setPicCode', data);
return data;
} else {
throw msg;
}
} catch (error) {
throw error || '获取失败';
}
},
/**
* signIn 登录
* @param {any} commit
* @param {string} identifier 身份标识 手机号 用户名
* @param {string} credential 身份凭证 验证码 密码
* @return {Promise} result 服务器返回信息
*/
async signIn({ commit }, params) {
const hideLoading = message.loading('登录中', 0);
try {
const res = await signIn(params);
const { code, msg, data } = res.data;
if (code === 200) {
commit('sign', data.token);
commit('setUser', data);
hideLoading();
message.success('登录成功');
return data;
} else {
hideLoading();
throw msg || '登录失败';
}
} catch (error) {
hideLoading();
throw error || '登录失败';
}
},
/**
* 修改密码 忘记密码
* @param {any} commit
* @param {object} params 要提交的参数
*/
async changePassword({ commit }, params) {
try {
const res = await changePassword(params);
const { code, msg, data } = res.data;
if (code === 200) {
message.success('修改密码成功');
return data;
} else {
throw msg || '修改密码失败';
}
} catch (error) {
throw error || '修改密码失败';
}
},
/**
* singUp 注册新用户
* @param {any} commit
* @param {object} params 提交的数据
* @param {string} params.account 用户名
* @param {string} params.password 密码
* @param {string} params.phone 手机号
* @param {string} params.smsCode 验证码
*/
async signUp({ commit }, params) {
try {
const res = await signUp(params);
const { code, msg, data } = res.data;
if (code === 200) {
commit('sign', data.token);
commit('setUser', data);
message.success('注册成功');
return data;
} else {
throw msg || '注册失败';
}
} catch (error) {
throw error || '注册失败';
}
},
/**
* 通过userId获取token
* @param {any} commit
* @param {object} params 提交的参数
*/
async getUserId({ commit }, params) {
console.log("getUserId")
try {
const res = await getUserId({ params });
const { code, msg, data } = res.data;
if (code === 200) {
commit('sign', data.token);
commit('setUser', data);
return data;
} else {
throw msg;
}
} catch (error) {
throw error || '获取个人信息失败';
}
},
};
const actions = {};
export default actions;

16
src/views/About/About.vue

@ -1,16 +0,0 @@
<template>
<div>
<router-view></router-view>
</div>
</template>
<script>
export default {
name: 'About',
data() {
return {};
},
};
</script>
<style lang="stylus" scoped></style>

66
src/views/About/Children/Introduce.vue

@ -1,66 +0,0 @@
<!--
* @Author: wally
* @email: 18603454788@163.com
* @Date: 2021-03-11 21:00:50
* @LastEditors: wally
* @LastEditTime: 2021-04-08 16:21:18
-->
<template>
<div>
<h-nav />
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<banner :show-page="showPage" />
<div class="inner">
<div class="white my-5 d-flex flex-nowrap">
<img src="~assets/gywm01.jpg" />
<div class="d-flex flex-column pa-5">
<img class="mb-3" src="~assets/gywm02.png" style="width: 96px; height: 41px" />
<rich-text :title="title" />
</div>
</div>
</div>
</div>
</template>
<script>
import Banner from 'components/Banner/Banner.vue';
import HNav from './../components/HNav.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
import RichText from 'components/Introduce/RichText.vue';
export default {
name: 'Introduce',
components: { Banner, HNav, BreadCrumb, RichText },
// mounted() {
// window.addEventListener('scroll', this.handleScroll);
// setTimeout(() => {
// document.querySelector('#nav').scrollIntoView({
// behavior: 'smooth', //
// block: 'start', //
// });
// }, 2000);
// },
data() {
return {
title: '关于我们-公司介绍',
showPage: 11,
arr: [
{ name: '关于我们', url: '/About/Introduce' },
{ name: '公司介绍', url: '' },
],
};
},
methods: {},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 40px auto;
}
</style>

126
src/views/About/Children/Organ.vue

@ -1,126 +0,0 @@
<template>
<div>
<h-nav />
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<banner :show-page="showPage" />
<div class="inner">
<div class="white">
<!-- <rich-text :title="title" /> -->
<div :style="{ height: '500px' }" id="treeChart"></div>
</div>
</div>
</div>
</template>
<script>
import Banner from 'components/Banner/Banner.vue';
import HNav from './../components/HNav.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
// import RichText from 'components/Introduce/RichText.vue';
export default {
name: 'Introduce',
components: { Banner, HNav, BreadCrumb },
data() {
return {
title: '关于我们-组织机构',
showPage: 12,
arr: [
{ name: '关于我们', url: '/About/Introduce' },
{ name: '组织机构', url: '' },
],
treedata: [
{
//[]
name: '绿谷公司',
children: [
{ name: '行政事业部' },
{
name: '创新事业部',
children: [
{
name: '协同创新中心',
collapsed: false,
children: [
{ name: '科技资源开放共享服务平台' },
{ name: '知识产权与技术转移转化服务平台' },
{ name: '知识培训服务平台' },
{ name: '科技创新人才服务平台' },
],
},
],
},
{
name: '孵化事业部',
collapsed: false,
children: [
{ name: '虚拟空间' },
{
name: '实体空间',
collapsed: false,
children: [{ name: '办公场所' }, { name: '公共实验室' }, { name: '中试基地' }],
},
],
},
{
name: '产业事业部',
children: [{ name: '产业技术创新联盟' }],
},
],
},
],
};
},
mounted() {
this.showChart();
},
methods: {
showChart() {
// domecharts
var myChart = this.$echarts.init(document.getElementById('treeChart'));
//
var option = {
tooltip: {
trigger: 'item',
triggerOn: 'mousemove',
},
series: [
{
type: 'tree',
data: this.treedata,
top: '-5%',
left: '5%',
bottom: '0%',
right: '25%',
symbolSize: 7,
lineStyle: { width: 1 },
itemStyle: { borderWidth: 3, borderColor: '#AACD06' },
label: { position: 'top', verticalAlign: 'middle', align: 'center', fontSize: 16 },
leaves: {
label: {
position: 'right',
verticalAlign: 'middle',
align: 'left',
},
},
expandAndCollapse: true,
animationDuration: 550,
animationDurationUpdate: 750,
},
],
};
// 使
myChart.setOption(option);
},
},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 20px auto;
}
</style>

41
src/views/About/Children/Partner.vue

@ -1,41 +0,0 @@
<template>
<div>
<h-nav />
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<div class="inner">
<div>
<partner-ship :title="title" :type-of-platform="typeOfPlatform" />
</div>
</div>
</div>
</template>
<script>
import { mapState, mapMutations, mapActions } from 'vuex';
import HNav from './../components/HNav.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
import PartnerShip from 'components/Introduce/PartnerShip.vue';
export default {
name: 'Partner',
components: { HNav, BreadCrumb, PartnerShip },
data() {
return {
title: '合作伙伴',
typeOfPlatform: '关于我们',
arr: [
{ name: '关于我们', url: '/About/Introduce' },
{ name: '合作伙伴', url: '' },
],
};
},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 20px auto;
}
</style>

39
src/views/About/Children/SpinOffs.vue

@ -1,39 +0,0 @@
<template>
<div>
<h-nav />
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<div>
<derive-enterprise :title="title" :type-of-platform="typeOfPlatform" />
</div>
</div>
</template>
<script>
import { mapState, mapMutations, mapActions } from 'vuex';
import HNav from './../components/HNav.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
import DeriveEnterprise from 'components/Introduce/DeriveEnterprise.vue';
export default {
name: 'Partner',
components: { HNav, BreadCrumb, DeriveEnterprise },
data() {
return {
title: '衍生企业',
typeOfPlatform: '关于我们',
arr: [
{ name: '关于我们', url: '/About/Introduce' },
{ name: '衍生企业', url: '' },
],
};
},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 10px auto 15px;
}
</style>

62
src/views/About/components/HNav.vue

@ -1,62 +0,0 @@
<template>
<div class="nav-box d-flex">
<div
:class="activeNum === index ? 'nav-box-active' : ''"
:key="index"
@click="jump(item.url)"
v-for="(item, index) in list"
>{{ item.title }}</div>
</div>
</template>
<script>
export default {
name: 'HNav',
data() {
return {
str: '导航条',
activeNum: 0,
list: [
{
title: '公司介绍',
url: '/About/Introduce',
},
{
title: '组织机构',
url: '/About/Organ',
},
{
title: '合作伙伴',
url: '/About/Partner',
},
{
title: '衍生企业',
url: '/About/SpinOffs',
},
],
};
},
created() {
if (this.$route.fullPath === '/About/Organ') {
this.activeNum = 1;
} else if (this.$route.fullPath === '/About/Partner') {
this.activeNum = 2;
} else if (this.$route.fullPath === '/About/SpinOffs') {
this.activeNum = 3;
} else {
this.activeNum = 0;
}
},
methods: {
jump(url) {
if (this.$route.fullPath === url) {
this.$message.success('已在当前界面');
} else {
this.$router.push(url);
}
},
},
};
</script>
<style lang="stylus" scoped></style>

195
src/views/Activity/ActDetails.vue

@ -1,195 +0,0 @@
<template>
<div class="box">
<div>
<div class="policy-title">
<span>{{ actDetail.title }}</span>
</div>
<!-- && hdDetail.content -->
<div v-if="hdDetail !== null">
<div class="policy-info">
<div>
<span>
<a-icon
class="baseColor"
style="font-size: 14px; margin-right: 10px"
type="clock-circle"
/>
<span>
{{ hdDetail.releaseTime }}
<span v-if="hdDetail.closeTime">- {{ hdDetail.closeTime }}</span>
</span>
</span>
<span style="margin-left: 60px">
<a-icon class="baseColor" style="margin-right: 10px" type="environment" />
<span>{{ hdDetail.address }}</span>
</span>
</div>
<!-- </div> -->
<!-- <div class="policy-info"> -->
</div>
<div class="policy-content" v-dompurify-html="hdDetail.content"></div>
<div class="policy-other">
<div>
<span style="font-size: 14px">会议主题</span>
<span>{{ hdDetail.theme }}</span>
</div>
<div>
<span>{{ hdDetail.organization }}</span>
</div>
<div>
<span style="font-size: 14px">主讲嘉宾</span>
<span>{{ hdDetail.name }}</span>
</div>
<div v-if="hdDetail.other">其他事宜:{{ hdDetail.other }}</div>
</div>
<a-button
disabled
style="margin: 50px 25px"
v-if="hdDetail.releaseTime && Date.parse(hdDetail.releaseTime) < Date.parse(nowData)"
>报名已结束</a-button>
<enroll
:act-name="hdDetail.title"
:activity-id="hdDetail.activityId"
style="margin: 50px 25px"
v-else
/>
</div>
</div>
</div>
</template>
<script>
import { mapState } from 'vuex';
import Enroll from './components/Enroll.vue';
import { activeDetail } from 'config/api';
export default {
name: 'ActDetails',
components: { Enroll },
data() {
return { nowData: '', hdDetail: null };
},
computed: mapState('home', ['actDetail']),
async created() {
await this.getData();
//
var aData = new Date();
// console.log(aData); //Wed Aug 21 2019 10:00:58 GMT+0800 ()
this.nowData =
aData.getFullYear() +
'-' +
(aData.getMonth() + 1) +
'-' +
aData.getDate() +
' ' +
aData.getHours() +
':' +
aData.getMinutes() +
':' +
aData.getSeconds();
// console.log(this.nowData); //2019-8-20
},
methods: {
//
async getData() {
try {
const params = {param: {activityId: this.actDetail.activityId,}, };
const res = await activeDetail(params);
const { data, msg, code } = res.data;
if (code === 200) {
this.hdDetail = data;
}
} catch (error) {
// console.log(error);
}
},
},
};
</script>
<style lang="stylus" scoped>
.box {
width: 1260px;
position: relative;
margin: 80px auto;
background: #fff;
min-height: 1037px;
overflow: hidden;
opacity: 1;
padding-bottom: 480px;
}
.back-btn {
width: 80px;
position: absolute;
right: 0;
}
.policy-title {
height: 120px;
font-size: 24px;
font-family: Microsoft YaHei;
font-weight: 400;
color: rgba(0, 0, 0, 0.85);
opacity: 1;
text-align: center;
display: flex;
align-items: center;
justify-content: center;
padding: 0 150px;
border-bottom: 1px solid #707070;
}
.policy-info {
height: 76px;
line-height: 76px;
text-align: center;
}
.policy-content {
padding: 0 25px;
font-size: 16px;
color: rgba(0, 0, 0, 0.65);
font-weight: 400;
font-family: Microsoft YaHei;
}
.coms-style {
height: 480px;
padding: 25px 0;
border-top: 2px solid #ccc;
position: absolute;
bottom: 0;
width: 100%;
}
.coms-top {
height: 280px;
padding: 0 25px;
overflow: auto;
box-shadow: 0 0 5px #ccc;
}
.coms-btm {
margin-top: 20px;
padding: 0 10px;
}
.coms-content {
background: rgba(19, 172, 196, 0.1);
}
.sub {
position: absolute;
right: 20px;
bottom: 20px;
}
.policy-other {
margin: 50px 25px;
font-size: 16px;
color: rgba(0, 0, 0, 0.65);
font-weight: 400;
font-family: Microsoft YaHei;
}
</style>

316
src/views/Activity/Activity.vue

@ -1,316 +0,0 @@
<!--
Copyright (c) 2020.
author: song
email: 15235360226@163.com
-->
<template>
<div class="inner">
<div class="search-list">
<span>
<a-checkbox :checked="sta.ly === 1" @click="cSta('ly')">路演</a-checkbox>
<a-checkbox :checked="sta.jz === 1" @click="cSta('jz')">讲座</a-checkbox>
<a-checkbox :checked="sta.sl === 1" @click="cSta('sl')">沙龙</a-checkbox>
</span>
<a-input-search
@search="getData"
class="search"
enter-button="搜索"
placeholder="请输入..."
style="width: 381px"
v-model="iptCon"
/>
</div>
<div class="policy-box">
<div
:key="index"
class="list-box d-flex flex-row flex-nowrap align-center"
v-for="(item, index) in lists"
>
<div @click="jumpDetails(item)" class="date-box pointer" v-if="item.releaseTime">
<p class="date-mon">{{ monthEnglish[item.releaseTime.split('-')[1] - 1] }}.</p>
<p class="date-day">{{ item.releaseTime.split(' ')[0].split('-')[2] }}</p>
</div>
<div class="d-flex flex-column flex-1">
<p @click="jumpDetails(item)" class="item-title pointer">{{ item.title }}</p>
<div class="d-flex flex-nowrap justify-space-between">
<p class="source-time">
<span class="source" v-if="item.releaseTime">
时间{{ item.releaseTime }}
<span v-if="item.closeTime">-{{ item.closeTime }}</span>
</span>
<span class="source" v-if="item.address">地点{{ item.address }}</span>
</p>
<p class="original">
<a-button
disabled
v-if="item.releaseTime && Date.parse(item.releaseTime) < Date.parse(nowData)"
>报名已结束</a-button>
<enroll :act-name="item.title" :activity-id="item.activityId" v-else />
</p>
</div>
</div>
</div>
</div>
<a-pagination
:current="actCurrent"
:page-size="pageSize"
:total="total"
@change="onShowSizeChange"
class="pagination"
show-less-items
show-quick-jumper
v-show="total > 5"
/>
</div>
</template>
<script>
import { mapState, mapMutations } from 'vuex';
import { front } from 'config/api';
import Enroll from './components/Enroll.vue';
export default {
name: 'Activity',
components: { Enroll },
data() {
return {
str: '这是活动公告界面',
total: 0,
pageSize: 20,
iptCon: '',
sta: {
ly: 0,
jz: 0,
sl: 0,
},
aList: [],
lists: [],
monthEnglish: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Spt', 'Oct', 'Nov', 'Dec'],
nowData: '',
};
},
computed: mapState('home', ['actList', 'actIpCon', 'actCurrent']),
created() {
this.iptCon = this.actIpCon;
this.aList = this.actList;
for (var i = 0; i < this.aList.length; i++) {
if (this.aList[i] === 0) {
this.sta.ly = 1;
}
if (this.aList[i] === 1) {
this.sta.jz = 1;
}
if (this.aList[i] === 2) {
this.sta.sl = 1;
}
}
this.getData();
//
var aData = new Date();
// console.log(aData); //Wed Aug 21 2019 10:00:58 GMT+0800 ()
this.nowData =
aData.getFullYear() +
'-' +
(aData.getMonth() + 1) +
'-' +
aData.getDate() +
' ' +
aData.getHours() +
':' +
aData.getMinutes() +
':' +
aData.getSeconds();
// console.log(this.nowData); //2019-8-20
},
methods: {
...mapMutations('home', ['setActList', 'setActIpCon', 'setActCurrent', 'setActDetail']),
//
async getData() {
try {
this.setActIpCon(this.iptCon);
const params = {
param: {
activityType: this.actList,
pageNum: this.actCurrent,
pageSize: 20,
titleKey: this.iptCon,
},
};
const res = await front(params);
const { data, msg, code } = res.data;
if (code === 200) {
this.lists = data.list;
this.total = parseInt(data.total);
}
} catch (error) {
// console.log(error);
}
},
//
cSta(index) {
this.aList = [];
if (this.sta[index] === 0) {
this.sta[index] = 1;
// console.log(this.sta);
} else {
this.sta[index] = 0;
// console.log(this.sta);
}
if (this.sta.ly === 1) {
this.aList = this.aList.concat(0);
}
if (this.sta.jz === 1) {
this.aList = this.aList.concat(1);
}
if (this.sta.sl === 1) {
this.aList = this.aList.concat(2);
}
this.setActList(this.aList);
this.getData();
},
//
onShowSizeChange(current, size) {
this.setActCurrent(current);
this.getData();
},
//
jumpDetails(item) {
this.setActDetail(item);
this.$router.push('/ActDetails');
},
//
formatDate() {
var date = new Date('2020-04-07 18:08:58');
//
var time1 = date.getTime();
var time2 = date.valueOf();
var time3 = Date.parse(date);
// console.log(time1); //1586254138000
// console.log(time2); //1586254138000
// console.log(time3); //1586254138000
},
},
};
</script>
<style scoped lang="stylus">
.inner {
margin: 40px auto;
}
.search-list {
height: 72px;
line-height: 72px;
position: relative;
padding-left: 24px;
background: #fff;
}
.search {
position: absolute;
right: 24px;
top: 20px;
}
.policy-box {
.list-box {
width: 100%;
overflow: hidden;
background: #fff;
box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.16);
margin-top: 24px;
padding: 10px 25px;
}
}
.item-title {
margin-bottom: 10px;
font-size: 24px;
color: rgba(0, 0, 0, 0.65);
font-family: Microsoft YaHei;
font-weight: bold;
}
.item-content {
text-indent: 2em;
font-size: 16px;
line-height: 36px;
color: rgba(0, 0, 0, 0.35);
font-family: Microsoft YaHei;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.source {
cursor: pointer;
font-family: Microsoft YaHei;
font-weight: 400;
opacity: 1;
margin-right: 24px;
}
.time {
font-size: 14px;
font-family: Microsoft YaHei;
font-weight: 400;
color: rgba(0, 0, 0, 0.25);
opacity: 1;
}
.original {
font-size: 14px;
font-family: Microsoft YaHei;
font-weight: 400;
line-height: 22px;
opacity: 1;
margin-bottom: 0;
span {
cursor: pointer;
}
}
.date-box {
width: 160px !important;
text-align: center;
box-shadow: none !important;
margin-top: 0 !important;
padding: 0 !important;
p {
margin-bottom: 0 !important;
}
}
.date-mon {
font-size: 26px;
height: 26px;
line-height: 26px;
font-weight: 500;
color: #13ACC4;
}
.date-day {
font-size: 46px;
height: 56px;
line-height: 56px;
font-weight: bold;
color: #13ACC4;
}
.source-time {
margin-bottom: 0;
}
.pagination {
margin-top: 68px;
text-align: right;
}
</style>

321
src/views/Activity/components/Enroll.vue

@ -1,321 +0,0 @@
<template>
<div>
<a-button @click="showModal" type="primary">立即报名</a-button>
<a-modal
:confirm-loading="confirmLoading"
:title="title"
:visible="visible"
@cancel="handleCancel"
@ok="handleOk"
width="50%"
>
<a-form :form="form">
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="活动名称"
>
<a-input :value="actName" disabled />
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="申请单位"
required
>
<a-input placeholder="请输入申请单位..." v-model.trim="platform.companyName" />
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
class="mb-3"
label="参加人员"
required
>
<div :key="index" class="d-flex flex-nowrap mb-3" v-for="(item, index) in people">
<a-input class="flex-1 mr-3" placeholder="姓名" v-model.trim="item.name" />
<a-input class="flex-1 mr-3" placeholder="职称" v-model.trim="item.duties" />
<a-input class="flex-1 mr-3" placeholder="职务" v-model.trim="item.positional" />
<a-button
@click="changePerson(index)"
icon="plus"
type="link"
v-if="index === people.length - 1"
/>
</div>
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="联系人"
required
>
<a-input placeholder="请输入联系人..." v-model.trim="platform.manName" />
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="联系电话"
required
>
<a-input
@change="changePhone"
placeholder="请输入联系电话.."
type="tel"
v-decorator="['tel', { rules: phoneRules }]"
/>
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="图片验证码"
required
>
<div class="d-flex flex-nowrap">
<a-input placeholder="图片验证码" type="number" v-model="codeNum" />
<img
:src="picCode.imageBase64"
@click="changePicCode"
class="code_img ml-2"
v-if="picCode && picCode.imageBase64"
/>
<a-button @click="changePicCode" class="code_img ml-2" size="small" v-else>获取验证码</a-button>
<!-- <a-input v-decorator="['account', { rules: rules.account }]" /> -->
</div>
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="短信验证码"
required
>
<div class="d-flex flex-nowrap">
<a-input placeholder="请输入验证码" type="number" v-model="platform.code" />
<a-button
class="code_img ml-2"
disabled
type="primary"
v-if="showInterval"
>重新发送 {{ interval }}</a-button>
<a-button
:disabled="platform.isTel === false"
@click="getCode"
class="code_img ml-2"
type="primary"
v-else
>获取验证码</a-button>
</div>
</a-form-item>
</a-form>
</a-modal>
</div>
</template>
<script>
import { mapState, mapActions } from 'vuex';
import { apply } from 'config/api';
const formItemLayout = {
labelCol: { span: 5 },
wrapperCol: { span: 18 },
};
const formTailLayout = {
labelCol: { span: 6 },
wrapperCol: { span: 18, offset: 6 },
};
export default {
name: 'Enroll',
props: {
activityId: {
type: Number,
default: 0,
},
actName: {
type: String,
default: '',
},
},
data() {
return {
form: this.$form.createForm(this, { name: 'submit' }),
visible: false,
title: '活动报名',
formItemLayout,
formTailLayout,
confirmLoading: false,
//
people: [
{
name: '',
duties: '',
positional: '',
},
],
platform: {
companyName: '', //
manName: '', //
tel: '', //
code: '', //
isTel: false,
},
codeRules: [
{ required: true, message: '请输入验证码' },
{ min: 4, max: 4, message: '请输入4位短信验证码' },
],
codeNum: '',
showInterval: false,
codeTimer: null,
interval: 120, //
phoneRules: [
{ required: true, pattern: new RegExp(/^[1][3,4,5,6,7,8,9][0-9]{9}$/), whitespace: true, message: '请输入正确的手机号' },
],
};
},
computed: mapState('user', ['picCode']),
async created() {
this.sendPicCode();
await this.getUserSer();
if (this.userSer) {
if (this.userSer.name) {
this.platform.manName = this.userSer.name;
}
if (this.userSer.phone) {
this.platform.tel = this.userSer.phone;
}
if (this.userSer.companyName) {
this.platform.companyName = this.userSer.companyName;
}
}
},
methods: {
...mapActions('user', ['sendCode', 'sendPicCode']),
...mapActions('home', ['getUserSer']),
changePerson(index) {
// if (this.people[index].name && this.people[index].positional && this.people[index].duties) {
const a = { name: '', positional: '', duties: '' };
this.people.push(a);
// }
},
//
showModal() {
this.visible = true;
},
//
handleCancel(e) {
this.visible = false;
},
//
changePhone(e) {
this.platform.tel = e.target.value;
this.platform.isTel = /^[1][3,4,5,6,7,8,9][0-9]{9}$/.test(this.platform.tel);
},
//
handleOk() {
if (!this.platform.companyName) {
this.$message.error('请输入申请单位');
} else if (!this.people[0].name || !this.people[0].positional || !this.people[0].duties) {
this.$message.error('请至少输入一名参加人员');
} else if (!this.platform.tel) {
this.$message.error('请输入联系电话');
} else if (!this.platform.code) {
this.$message.error('请输入验证码');
} else {
if (this.platform.isTel) {
this.subMitAdd();
} else {
this.$message.error('请输入正确的联系电话');
}
}
},
//
async subMitAdd() {
this.confirmLoading = true;
try {
const { activityId, platform, people } = this;
people.forEach(item => {
item.activityId = activityId;
});
const params = {
param: {
activityId,
code: platform.code,
companyName: platform.companyName,
contactName: platform.manName,
contactPhone: platform.tel,
peoples: people,
},
};
// console.log('params: ', params);
const res = await apply(params);
const { code, msg, data } = res.data;
if (code === 200) {
this.$message.success('申请成功');
this.visible = false;
this.confirmLoading = false;
for (let key in this.platform) {
this.platform[key] = '';
}
this.platform.isTel = false;
} else {
throw msg;
this.confirmLoading = false;
}
} catch (error) {
this.$message.error(error);
this.confirmLoading = false;
}
},
//
async getCode() {
// console.log(111);
try {
const params = {
phone: this.platform.tel,
verificationCodeId: this.picCode.verificationCodeId,
verificationCodeValue: this.codeNum,
};
await this.sendCode(params);
this.getCodeInterval();
} catch (error) {
// throw new Error(`SignIn.vue method getCode: ${error}`);
// console.log(error);
}
},
//
getCodeInterval() {
this.showInterval = true;
this.codeTimer = setInterval(() => {
if (this.interval === 0) {
clearInterval(this.codeTimer);
this.codeTimer = null;
this.showInterval = false;
this.interval = 120;
return;
}
this.interval = this.interval - 1;
}, 1000);
},
//
changePicCode() {
this.sendPicCode();
},
},
};
</script>
<style lang="stylus" scoped>
.must-color {
color: red;
}
.code_img {
height: 32px;
width: 120px;
}
</style>

174
src/views/Cart/Cart.vue

@ -1,174 +0,0 @@
<!--
Copyright (c) 2020.
author: song
email: 15235360226@163.com
-->
<template>
<div class="inner">
<bread-crumb :arr="arr" class="my-1" />
<div class="white pa-5 mb-5 d-flex flex-nowrap align-center justify-space-between">
<div>
<span class="font-16 textColor">联系人</span>
<a-input style="width: auto" v-model="name" />
</div>
<div>
<span class="font-16 textColor">联系电话</span>
<a-input @change="onChange" style="width: auto" v-model="phone" />
</div>
<div>
<span class="font-16 textColor">公司名称</span>
<a-input style="width: 200px" v-model="company" />
</div>
</div>
<div class="cart-box" v-if="cart && cart.length > 0">
<div :key="list.id" class="d-flex flex-column pa-5 white div-box mb-8" v-for="list in cart">
<p class="font-bold-20 title-color">{{ list.type === 0 ? '服务' : list.type === 1 ? '设备' : '成果' }}</p>
<div :key="index" class="d-flex flex-nowrap flex-row mb-8" v-for="(item, index) in list.carDetailList">
<img :src="item.picUrl" class="cart-pic mr-8" />
<div class="flex-1 flex-column">
<p class="font-bold-20 title-color">{{ item.name }}</p>
<p class="font-14 textColor">{{ item.description }}</p>
</div>
</div>
</div>
<div class="d-flex flex-row-reverse pb-10">
<a-button @click="handleSubmit" type="primary">提交</a-button>
<cart-model :phone="phone" :show-model="showModel" @handleCancel="handleCancel" @submitCart="submitCart" />
</div>
</div>
</div>
</template>
<script>
import { mapState, mapMutations, mapActions } from 'vuex';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
import CartModel from './CartModel.vue';
import { searchCar, carAndBuy } from 'config/api';
export default {
name: 'Cart',
components: { BreadCrumb, CartModel },
data() {
return {
arr: [{ name: '购物车', url: '' }],
name: '',
phone: '',
company: '',
cart: {},
showModel: false,
phoneRules: [
{ required: true, pattern: new RegExp(/^[1][3,4,5,6,7,8,9][0-9]{9}$/), whitespace: true, message: '请输入正确的手机号' },
],
};
},
computed: mapState('home', ['userSer']),
async created() {
await this.getData();
await this.getUserSer();
if (this.userSer) {
if (this.userSer.name) {
this.name = this.userSer.name;
}
if (this.userSer.phone) {
this.phone = this.userSer.phone;
}
if (this.userSer.companyName) {
this.company = this.userSer.companyName;
}
}
},
methods: {
...mapMutations('home', []),
...mapActions('home', ['getUserSer']),
//
async getData() {
try {
const params = { param: { pageNum: 1, pageSize: 10 } };
const res = await searchCar(params);
const { data, msg, code } = res.data;
if (code === 200) {
this.cart = data;
}
} catch (error) {
// console.log(error);
}
},
//
onChange(e) {
this.phone = e.target.value;
},
handleSubmit() {
if (this.userSer.phone !== this.phone) {
this.openModel();
} else {
this.submitCart();
}
},
//
async submitCart(tel) {
try {
if (tel) {
this.phone = tel;
}
const { name, phone, company, cart } = this;
const ids = cart[0].carId;
const params = {
param: {
contactName: company,
contactPhone: phone,
companyName: name,
ids,
},
};
const res = await carAndBuy(params);
const { data, msg, code } = res.data;
if (code === 200) {
this.$message.success('提交成功');
this.confirmLoading = false;
} else {
throw msg;
this.confirmLoading = false;
}
} catch (error) {
this.$message.error(error);
this.confirmLoading = false;
}
},
//
openModel() {
this.showModel = true;
},
//
handleCancel() {
this.showModel = false;
},
},
};
</script>
<style scoped lang="stylus">
.inner {
margin: 40px auto;
}
.cart-box {
.div-box {
box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.16);
}
.cart-pic {
width: 233px;
height: 128px;
}
}
</style>

171
src/views/Cart/CartModel.vue

@ -1,171 +0,0 @@
<!--
Copyright (c) 2020.
author: song
email: 15235360226@163.com
-->
<template>
<div>
<a-modal :confirm-loading="confirmLoading" :visible="showModel" @cancel="handleCancel" @ok="handleOk()" title="电话验证" width="50%">
<a-form :form="form">
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="联系电话" required>
<a-input placeholder="请输入手机号" type="tel" v-model="tel" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="图片验证码" required>
<div class="d-flex flex-nowrap">
<a-input placeholder="请输入图片验证码" required type="number" v-model="codeNum" />
<img :src="picCode.imageBase64" @click="changePicCode" class="code_img ml-2" v-if="picCode && picCode.imageBase64" />
<a-button @click="changePicCode" class="code_img ml-2" size="small" type="primary" v-else>重新获取</a-button>
</div>
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="短信验证码" required>
<div class="d-flex flex-nowrap">
<a-input placeholder="请输入验证码" type="number" v-model="code" />
<a-button class="ml-2" disabled type="primary" v-if="showInterval">重新发送 {{ interval }}</a-button>
<a-button :disabled="!showCode" @click="getCode" class="ml-2" type="primary" v-else>获取验证码</a-button>
</div>
</a-form-item>
</a-form>
</a-modal>
</div>
</template>
<script>
import { mapState, mapActions } from 'vuex';
import { carAndBuy } from 'config/api';
const formItemLayout = {
labelCol: { span: 6 },
wrapperCol: { span: 18 },
};
const formTailLayout = {
labelCol: { span: 6 },
wrapperCol: { span: 18, offset: 6 },
};
export default {
name: 'CartModel',
components: {},
props: {
showModel: {
type: Boolean,
default: false,
},
phone: {
type: String,
default: '',
},
},
data() {
return {
confirmLoading: false,
formItemLayout,
formTailLayout,
form: this.$form.createForm(this, { name: 'submitPhone' }),
tel: '',
code: '',
codeNum: '',
phoneRules: [
{ required: true, pattern: new RegExp(/^[1][3,4,5,6,7,8,9][0-9]{9}$/), whitespace: true, message: '请输入正确的手机号' },
],
codeRules: [
{ required: true, message: '请输入验证码' },
{ min: 4, max: 4, message: '请输入4位短信验证码' },
],
showInterval: false,
codeTimer: null,
interval: 120, //
};
},
computed: {
...mapState('user', ['picCode']),
showCode() {
return /^[1][3,4,5,6,7,8,9][0-9]{9}$/.test(this.tel);
},
},
watch: {
phone(val) {
this.tel = this.phone;
},
},
created() {
// if (this.phone) this.tel = this.phone;
this.sendPicCode();
},
methods: {
...mapActions('user', ['sendCode', 'sendPicCode']),
handleOk() {
if (!this.tel) {
this.$message.error('电话为必填项');
} else {
if (this.tel) {
const phoneRule = /^[1][3,4,5,6,7,8,9][0-9]{9}$/.test(this.tel);
if (phoneRule) {
this.$emit('submitCart', this.tel);
this.$emit('handleCancel');
} else {
this.$message.error('请输入正确的联系电话');
}
}
}
},
handleCancel() {
this.$emit('handleCancel');
},
//
async getCode() {
try {
const params = {
phone: this.tel,
verificationCodeId: this.picCode.verificationCodeId,
verificationCodeValue: this.codeNum,
};
await this.sendCode(params);
this.getCodeInterval();
} catch (error) {
throw new Error(`SignIn.vue method getCode: ${error}`);
}
},
//
getCodeInterval() {
this.showInterval = true;
this.codeTimer = setInterval(() => {
if (this.interval === 0) {
clearInterval(this.codeTimer);
this.codeTimer = null;
this.showInterval = false;
this.interval = 120;
return;
}
this.interval = this.interval - 1;
}, 1000);
},
//
changePicCode() {
this.sendPicCode();
},
},
};
</script>
<style lang="stylus" scoped>
.must-color {
color: red;
}
.code_img {
height: 32px;
width: 120px;
}
</style>

23
src/views/Challenge/Challenge.vue

@ -1,23 +0,0 @@
<template>
<div>
<!-- <div class="dev-box">
<img src="~assets/build.png" />
</div>-->
<router-view></router-view>
</div>
</template>
<script>
export default {
name: 'Challenge',
data() {
return {
str: '创新挑战',
title: '创新挑战',
typeOfPlatform: '创新挑战',
arr: [{ name: '创新挑战', url: '/Challenge' }],
list: [],
};
},
};
</script>

248
src/views/Challenge/Children/Notice.vue

@ -1,248 +0,0 @@
<template>
<div>
<h-nav />
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<!-- <div class="top-box" style="margin-bottom: 100px; min-height: 200px">
<div class="top-title">结果公告</div>
<div class="top-content">结果公告在建中</div>
</div>-->
<div class="search-background">
<div class="d-flex">
<div class="flex-3 flex-wrap">
<span class="ins-title">技术领域</span>
<span
:class="item.isActive ? 'act-color' : ''"
:key="index"
@click="choose(index)"
class="ins-name"
v-for="(item, index) in list"
>{{ item.name }}</span>
</div>
</div>
</div>
<div class="inner d-flex flex-wrap">
<div
:class="(index + 1) % 4 === 0 ? 'margin-0' : ''"
:key="index"
class="pro-box"
v-for="(item, index) in lists"
>
<p class="pro-title">{{ item.title }}</p>
<p class="pro-content">{{ item.content }}</p>
<p class="pro-time">时间{{ item.time }}</p>
</div>
</div>
<div class="inner">
<a-pagination
:current="current"
:page-size="pageSize"
:total="total"
@change="onShowSizeChange"
class="pagination"
show-less-items
show-quick-jumper
v-show="total > 8"
/>
</div>
</div>
</template>
<script>
import HNav from './../components/HNav.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
export default {
name: 'Release',
components: { HNav, BreadCrumb },
data() {
return {
str: '发布界面',
title: '结果公告',
typeOfPlatform: '创新挑战',
arr: [
{ name: '创新挑战', url: '/Challenge/Solicitation' },
{ name: '结果公告', url: '' },
],
current: 1,
pageSize: 8,
total: 10,
list: [
{
id: 1,
name: '功能食品',
isActive: false,
},
{
id: 2,
name: '生物医药',
isActive: false,
},
{
id: 3,
name: '大健康',
isActive: false,
},
],
lists: [
{
title: '需求标题',
content: 'XXX挑战成功',
time: '2020-11-20',
},
{
title: '需求标题',
content: 'XXX挑战成功',
time: '2020-11-20',
},
{
title: '需求标题',
content: 'XXX挑战成功',
time: '2020-11-20',
},
{
title: '需求标题',
content: 'XXX挑战成功',
time: '2020-11-20',
},
{
title: '需求标题',
content: 'XXX挑战成功',
time: '2020-11-20',
},
{
title: '需求标题',
content: 'XXX挑战成功',
time: '2020-11-20',
},
{
title: '需求标题',
content: 'XXX挑战成功',
time: '2020-11-20',
},
{
title: '需求标题',
content: 'XXX挑战成功',
time: '2020-11-20',
},
],
};
},
methods: {
choose(index) {
const that = this;
// that.achList = [];
const { list } = this;
list[index].isActive = !list[index].isActive;
this.list = [...list];
// for (let i = 0; i < list.length; i++) {
// if (list[i].isActive) {
// this.achList.push(list[i].id);
// }
// }
// this.setAchList(this.achList);
},
//
onShowSizeChange(current, size) {
this.current = current;
},
},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 10px auto 15px;
}
.top-box {
background: -webkit-linear-gradient(left, #13ACC4, #A9C300) !important;
}
.search-background {
background: rgba(0, 0, 0, 0.02);
border: 1px solid rgba(0, 0, 0, 0.06);
height: auto;
padding: 0 20px;
width: 82%;
margin: 40px auto;
line-height: 44px;
}
.pagination {
margin: 40px 0;
text-align: right;
}
.ins-title {
font-size: 16px;
font-weight: bold;
color: rgba(0, 0, 0, 0.65);
}
.ins-name {
font-size: 16px;
color: rgba(0, 0, 0, 0.65);
padding: 0 10px;
cursor: pointer;
}
.act-color {
color: #13ACC4 !important;
}
.margin-0 {
margin-right: 0% !important;
}
.pro-box {
width: 20.5%;
margin-right: 6%;
height: auto;
background: #FFFFFF;
padding: 24px 20px;
box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.16);
position: relative;
margin-bottom: 20px;
opacity: 1;
}
.pro-title {
font-size: 24px;
font-family: Microsoft YaHei;
font-weight: bold;
line-height: 31px;
color: rgba(0, 0, 0, 0.85);
opacity: 1;
}
.pro-content {
font-size: 30px;
overflow: hidden;
font-family: Microsoft YaHei;
font-weight: bold;
color: #13ACC4;
margin-bottom: 60px;
opacity: 1;
display: -webkit-box;
-webkit-line-clamp: 5;
-webkit-box-orient: vertical;
}
.pro-time {
position: absolute;
font-size: 14px;
font-family: Microsoft YaHei;
font-weight: 400;
line-height: 22px;
color: rgba(0, 0, 0, 0.45);
opacity: 1;
bottom: 0;
}
.pro-btn {
position: absolute;
bottom: 24px;
width: 100px;
}
</style>

257
src/views/Challenge/Children/Release.vue

@ -1,257 +0,0 @@
<template>
<div>
<h-nav />
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<!-- <div class="top-box" style="margin-bottom: 100px; min-height: 200px">
<div class="top-title">项目发布</div>
<div class="top-content">项目发布在建中</div>
</div>-->
<div class="search-background">
<div class="d-flex">
<div class="flex-3 flex-wrap">
<span class="ins-title">技术领域</span>
<span
:class="item.isActive ? 'act-color' : ''"
:key="index"
@click="choose(index)"
class="ins-name"
v-for="(item, index) in list"
>{{ item.name }}</span>
</div>
</div>
</div>
<div class="inner d-flex flex-wrap">
<div
:class="(index + 1) % 4 === 0 ? 'margin-0' : ''"
:key="index"
class="pro-box"
v-for="(item, index) in lists"
>
<p class="pro-title">{{ item.title }}</p>
<p class="pro-content">{{ item.content }}</p>
<p class="pro-time">时间{{ item.time }}</p>
<a-button class="pro-btn" type="primary">揭榜</a-button>
</div>
</div>
<div class="inner">
<a-pagination
:current="current"
:page-size="pageSize"
:total="total"
@change="onShowSizeChange"
class="pagination"
show-less-items
show-quick-jumper
v-show="total > 8"
/>
</div>
</div>
</template>
<script>
import HNav from './../components/HNav.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
export default {
name: 'Release',
components: { HNav, BreadCrumb },
data() {
return {
title: '项目发布',
typeOfPlatform: '创新挑战',
arr: [
{ name: '创新挑战', url: '/Challenge/Solicitation' },
{ name: '项目发布', url: '' },
],
str: '发布界面',
current: 1,
pageSize: 8,
total: 10,
list: [
{
id: 1,
name: '功能食品',
isActive: false,
},
{
id: 2,
name: '生物医药',
isActive: false,
},
{
id: 3,
name: '大健康',
isActive: false,
},
],
lists: [
{
title: '需求标题',
content:
'需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容求内容需求内容求内容需求内容',
time: '2020-11-20',
},
{
title: '需求标题',
content:
'需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容求内容需求内容求内容需求内容',
time: '2020-11-20',
},
{
title: '需求标题',
content:
'需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容求内容需求内容求内容需求内容',
time: '2020-11-20',
},
{
title: '需求标题',
content:
'需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容求内容需求内容求内容需求内容',
time: '2020-11-20',
},
{
title: '需求标题',
content:
'需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容求内容需求内容求内容需求内容',
time: '2020-11-20',
},
{
title: '需求标题',
content:
'需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容求内容需求内容求内容需求内容',
time: '2020-11-20',
},
{
title: '需求标题',
content:
'需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容求内容需求内容求内容需求内容',
time: '2020-11-20',
},
{
title: '需求标题',
content:
'需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容需求内容求内容需求内容求内容需求内容',
time: '2020-11-20',
},
],
};
},
methods: {
choose(index) {
const that = this;
// that.achList = [];
const { list } = this;
list[index].isActive = !list[index].isActive;
this.list = [...list];
// for (let i = 0; i < list.length; i++) {
// if (list[i].isActive) {
// this.achList.push(list[i].id);
// }
// }
// this.setAchList(this.achList);
},
//
onShowSizeChange(current, size) {
this.current = current;
},
},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 10px auto 15px;
}
.top-box {
background: -webkit-linear-gradient(left, #13ACC4, #A9C300) !important;
}
.search-background {
background: rgba(0, 0, 0, 0.02);
border: 1px solid rgba(0, 0, 0, 0.06);
height: auto;
padding: 0 20px;
width: 82%;
margin: 40px auto;
line-height: 44px;
}
.pagination {
margin: 40px 0;
text-align: right;
}
.ins-title {
font-size: 16px;
font-weight: bold;
color: rgba(0, 0, 0, 0.65);
}
.ins-name {
font-size: 16px;
color: rgba(0, 0, 0, 0.65);
padding: 0 10px;
cursor: pointer;
}
.act-color {
color: #13ACC4 !important;
}
.margin-0 {
margin-right: 0% !important;
}
.pro-box {
width: 20.5%;
margin-right: 6%;
height: 300px;
background: #FFFFFF;
padding: 24px 20px;
box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.16);
position: relative;
margin-bottom: 20px;
opacity: 1;
}
.pro-title {
font-size: 24px;
font-family: Microsoft YaHei;
font-weight: bold;
line-height: 31px;
color: rgba(0, 0, 0, 0.85);
opacity: 1;
}
.pro-content {
font-size: 16px;
overflow: hidden;
font-family: Microsoft YaHei;
font-weight: 400;
line-height: 24px;
color: rgba(0, 0, 0, 0.65);
opacity: 1;
display: -webkit-box;
-webkit-line-clamp: 5;
-webkit-box-orient: vertical;
}
.pro-time {
position: absolute;
font-size: 14px;
font-family: Microsoft YaHei;
font-weight: 400;
line-height: 22px;
color: rgba(0, 0, 0, 0.45);
opacity: 1;
bottom: 60px;
}
.pro-btn {
position: absolute;
bottom: 24px;
width: 100px;
}
</style>

105
src/views/Challenge/Children/Solicitation.vue

@ -1,105 +0,0 @@
<template>
<div>
<h-nav />
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<div class="top-box" style="height: 110px">
<div class="top-title">创新挑战</div>
<div class="top-txt">针对企业具体技术创新需求通过揭榜+比拼方式面向社会公开征集解决方案的服务</div>
</div>
<div class="center-box">
<div class="center-title">
<div class="circular"></div>
<div style="margin-left: 40px">目的及意义</div>
</div>
<div
class="center-txt"
>创新挑战有助于解决企业发展实际问题有效降低创新成本有助于需求与技术精准对接促进科技成果转移转化有助于解决产业关键共性问题推动区域产业经济发展</div>
</div>
<div class="center-box">
<div class="center-title">
<div class="circular"></div>
<div style="margin-left: 40px">挑战流程</div>
</div>
<div class="center-txt">
<img class="fill-weight" src="../../../assets/solicitation.png" />
</div>
</div>
<div class="center-box" style="margin-bottom: 100px">
<div class="center-title">
<div class="circular"></div>
<div style="margin-left: 40px">有关要求</div>
</div>
<div class="center-txt d-flex flex-column">
<div>1. 重视信息公开各有关地方要按规定对通知文件需求信息现场赛情况赛事结果等及时公开和公布保障信息公开渠道顺畅快捷确保赛事运行公平公开公正</div>
<div>2. 加强技术秘密和知识产权保护参与挑战的需求方挑战者和评审专家均需签订保密协议免责声明法律文本</div>
<div>3. 加强监督确保公平公正严格按照事先确定的流程和规则进行建立投诉和纠纷处理机制</div>
<div class="d-flex flex-row-reverse">
<!-- <a-button class="mt-3" type="primary">需求填报</a-button> -->
<enroll />
</div>
</div>
</div>
</div>
</template>
<script>
import HNav from './../components/HNav.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
import Enroll from '../components/Enroll.vue';
export default {
name: 'Solicitation',
components: { HNav, BreadCrumb, Enroll },
data() {
return {
title: '需求征集',
typeOfPlatform: '创新挑战',
arr: [
{ name: '创新挑战', url: '/Challenge/Solicitation' },
{ name: '需求征集', url: '' },
],
str: '征集界面',
list: [],
};
},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 10px auto 15px;
}
.top-box {
height: 110px;
line-height: 110px;
background: -webkit-linear-gradient(left, #13ACC4, #A9C300) !important;
.top-title {
top: 0 !important;
}
}
.top-txt {
float: right;
margin-right: 12%;
width: 62%;
padding: 0;
font-size: 16px;
color: #fff;
}
.center-txt {
float: right;
margin: 22px 0;
width: 79%;
line-height: 36px;
font-size: 16px;
}
.center-title {
top: 30% !important;
}
</style>

194
src/views/Challenge/components/Enroll.vue

@ -1,194 +0,0 @@
<template>
<div>
<a-button @click="showModal" type="primary">需求征集</a-button>
<a-modal :confirm-loading="confirmLoading" :title="title" :visible="visible" @cancel="handleCancel" @ok="handleOk" width="50%">
<a-form :form="form">
<!-- 需求名称 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" class="mb-3" label="需求名称">
<a-input placeholder="请输入需求名称..." v-model.trim="platform.needName" />
</a-form-item>
<!-- 技术领域 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" class="mb-3" label="技术领域">
<a-input placeholder="请输入技术领域..." v-model.trim="platform.technicalField" />
</a-form-item>
<!-- 需求截止时间 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" class="mb-3" label="需求截止时间">
<a-date-picker @change="changeNeedTime" style="width: 100%" />
</a-form-item>
<!-- 需求类别 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" class="mb-3" label="需求类别">
<a-checkbox-group @change="onChange" class="line-height-30">
<a-checkbox value="1">技术研发关键核心技术</a-checkbox>
<a-checkbox value="2">产品研发产品升级新产品研发</a-checkbox>
<a-checkbox value="3">技术改造设备研发生产条件</a-checkbox>
<a-checkbox value="4">技术配套技术产品等配套合作</a-checkbox>
</a-checkbox-group>
</a-form-item>
<!-- 需求内容 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" class="mb-3" label="需求内容">
<quill-editor
:options="editorOption"
@blur="onEditorBlur($event)"
@change="onEditorChange($event)"
@focus="onEditorFocus($event)"
class="editor-box"
ref="myQuillEditor"
v-model="needContent"
></quill-editor>
</a-form-item>
<!-- 现有基础 -->
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" class="mb-3" label="现有基础">
<a-textarea
placeholder="(已经开展的工作、所处阶段、投入资金和人力、仪器 设备、生产条件等)"
style="min-height: 100px"
v-model.trim="platform.basics"
/>
</a-form-item>
</a-form>
</a-modal>
</div>
</template>
<script>
import { quillEditor } from 'vue-quill-editor'; //
import 'quill/dist/quill.core.css';
import 'quill/dist/quill.snow.css';
import 'quill/dist/quill.bubble.css';
const formItemLayout = {
labelCol: { span: 5 },
wrapperCol: { span: 18 },
};
const formTailLayout = {
labelCol: { span: 6 },
wrapperCol: { span: 18, offset: 6 },
};
export default {
name: 'Enroll',
components: { quillEditor },
data() {
return {
form: this.$form.createForm(this, { name: 'submit' }),
visible: false,
title: '需求征集',
formItemLayout,
formTailLayout,
confirmLoading: false,
needContent: ``,
editorOption: {
placeholder: '请在这里输入',
modules: {
toolbar: [
['bold', 'italic', 'underline', 'strike'], //线线
['blockquote', 'code-block'], //
[{ header: 1 }, { header: 2 }], // 12
[{ list: 'ordered' }, { list: 'bullet' }], //
[{ script: 'sub' }, { script: 'super' }], //
[{ indent: '-1' }, { indent: '+1' }], //
[{ direction: 'rtl' }], //
// [{ size: ['small', false, 'large', 'huge'] }], //
// [{ header: [1, 2, 3, 4, 5, 6, false] }], //
[{ color: [] }, { background: [] }], //
// [{ font: [] }], //
[{ align: [] }], //
['clean'], //
['image', 'video'], //
],
},
},
platform: {
needName: '',
technicalField: '',
basics: '',
},
};
},
methods: {
//
changeNeedTime(date, dateString) {
this.platform.buildTime = this.$moment(date).unix() * 1000;
// console.log(this.$moment(date).unix(), dateString);
},
onEditorReady(editor) {
//
},
onEditorBlur() {}, //
onEditorFocus() {}, //
onEditorChange() {
//
// console.log(this.content);
},
//
fileChange(info) {
console.log(info);
// this.fileList = info.fileList;
// if (info.file.status === 'done') {
// this.files = [];
// this.files = info.fileList[0].response.data[0].id;
// console.log(this.files);
// }
},
//
showModal() {
this.visible = true;
},
//
handleCancel(e) {
this.visible = false;
},
//
handleOk() {
console.log(this.needContent);
// this.subMitAdd();
},
//
async subMitAdd() {
this.confirmLoading = true;
try {
// const params = { param: {} };
// const res = await apply(params);
// const { code, msg, data } = res.data;
// if (code === 200) {
// this.$message.success('');
// this.visible = false;
// this.confirmLoading = false;
// for (let key in this.platform) {
// this.platform[key] = '';
// }
// this.platform.isTel = false;
// } else {
// throw msg;
// this.confirmLoading = false;
// }
} catch (error) {
this.$message.error(error);
this.confirmLoading = false;
}
},
},
};
</script>
<style lang="stylus" scoped>
.must-color {
color: red;
}
.code_img {
height: 32px;
width: 120px;
}
.ql-editor {
min-height: 600px;
max-height: 800px;
}
.editor-box >>> .ql-editor {
min-height: 150px;
}
</style>

54
src/views/Challenge/components/HNav.vue

@ -1,54 +0,0 @@
<template>
<div class="nav-box d-flex">
<div v-for="(item, index) in list" :key="index" :class="activeNum === index ? 'nav-box-active' : ''" @click="jump(item.url)">
{{ item.title }}
</div>
</div>
</template>
<script>
export default {
name: 'HNav',
data() {
return {
str: '导航条',
activeNum: 0,
list: [
{
title: '需求征集',
url: '/Challenge/Solicitation',
},
{
title: '项目发布',
url: '/Challenge/Release',
},
{
title: '结果公告',
url: '/Challenge/Notice',
},
],
};
},
created() {
console.log();
if (this.$route.fullPath === '/Challenge/Release') {
this.activeNum = 1;
} else if (this.$route.fullPath === '/Challenge/Notice') {
this.activeNum = 2;
} else {
this.activeNum = 0;
}
},
methods: {
jump(url) {
if (this.$route.fullPath === url) {
this.$message.success('已在当前界面');
} else {
this.$router.push(url);
}
},
},
};
</script>
<style lang="stylus" scoped></style>

180
src/views/Community/ComDetails.vue

@ -1,180 +0,0 @@
<template>
<div class="box">
<div>
<div class="policy-title">
<span>{{ postDetail.title }}</span>
</div>
<div class="policy-info">
<span>
<a-avatar :size="20" :src="postDetail.avatarUrl" style="margin-top: -4px; margin-right: 10px" />
<span style="margin-right: 60px">{{ postDetail.userName }}</span>
<a-icon class="baseColor" style="font-size: 14px; margin-right: 10px" type="clock-circle" />
<span>{{ postDetail.createdTime }}</span>
</span>
<span style="margin-left: 60px">
<a-icon class="baseColor" style="margin-right: 10px" type="message" />
<span>{{ postDetail.commentNum }}</span>
</span>
</div>
<div class="policy-content" v-dompurify-html="postDetail.content"></div>
</div>
<div class="coms-style">
<div class="coms-top">
<div :key="index" style="margin-top: 1em" v-for="(item, index) in coms">
<p style="color: #999">
<a-avatar :size="20" :src="item.avatarUrl" alt style="margin-top: -4px; margin-right: 4px" />
<span style="margin-right: 10px">{{ item.userName }}</span>
<span>{{ item.creatTime }}</span>
</p>
<span class="coms-content">{{ item.content }}</span>
</div>
</div>
<div class="coms-btm">
<a-textarea style="height: 140px;min-height: 140px;max-height: 140px" v-model="comment" />
<a-button @click="sub" class="sub" type="primary">提交</a-button>
</div>
<!-- <div class="txtara">
<a-textarea placeholder="请输入..." :rows="4" v-model="comment" />
<a-button class="txt-btn" type="primary" @click="sub(index)">提交</a-button>
</div>-->
</div>
</div>
</template>
<script>
import { mapState } from 'vuex';
import { selCommunity, insComment } from 'config/selComment';
export default {
name: 'ComDetails',
data() {
return {
comment: '',
coms: {},
};
},
computed: mapState('home', ['postDetail']),
created() {
this.getData();
},
methods: {
async getData() {
//
try {
const params = { param: { commentId: this.postDetail.id } };
const res = await selCommunity(params);
const { msg, data, code } = res.data;
if (code === 200) {
this.coms = data;
} else {
this.$message.error(msg);
}
} catch (error) {
this.$message.error(error);
}
},
//
async sub(index) {
try {
const params = {
param: {
communityId: this.postDetail.id,
content: this.comment,
},
};
const res = await insComment(params);
const { msg, data, code } = res.data;
if (code === 200) {
this.comment = '';
this.$message.success('评论成功');
this.getData();
} else {
// console.log(msg);
this.$message.error('评论失败');
}
} catch (error) {
// console.log(error);
this.$message.error('评论失败');
}
},
},
};
</script>
<style lang="stylus" scoped>
.box {
width: 1260px;
position: relative;
margin: 80px auto;
background: #fff;
min-height: 1037px;
overflow: hidden;
opacity: 1;
padding-bottom: 480px;
}
.back-btn {
width: 80px;
position: absolute;
right: 0;
}
.policy-title {
height: 120px;
font-size: 24px;
font-family: Microsoft YaHei;
font-weight: 400;
color: rgba(0, 0, 0, 0.85);
opacity: 1;
text-align: center;
display: flex;
align-items: center;
justify-content: center;
padding: 0 150px;
border-bottom: 1px solid #707070;
}
.policy-info {
height: 76px;
line-height: 76px;
text-align: center;
}
.policy-content {
padding: 0 25px;
font-size: 16px;
color: rgba(0, 0, 0, 0.65);
font-weight: 400;
font-family: Microsoft YaHei;
}
.coms-style {
height: 480px;
padding: 25px 0;
border-top: 2px solid #ccc;
position: absolute;
bottom: 0;
width: 100%;
}
.coms-top {
height: 280px;
padding: 0 25px;
overflow: auto;
box-shadow: 0 0 5px #ccc;
}
.coms-btm {
margin-top: 20px;
padding: 0 10px;
}
.coms-content {
background: rgba(19, 172, 196, 0.1);
}
.sub {
position: absolute;
right: 20px;
bottom: 20px;
}
</style>

268
src/views/Community/Community.vue

@ -1,268 +0,0 @@
<!--
Copyright (c) 2020.
author: bin
email: binbin0314@126.com
-->
<template>
<div class="inner">
<div class="search-list">
<a-radio-group v-model="value">
<a-radio :style="radioStyle" :value="1">主题论坛</a-radio>
<a-radio :style="radioStyle" :value="2">创新社区</a-radio>
<a-radio :style="radioStyle" :value="3">孵化社区</a-radio>
<a-radio :style="radioStyle" :value="4">产业社区</a-radio>
</a-radio-group>
<a-input-search
@search="searchData"
class="search"
enter-button="搜索"
placeholder="请输入..."
style="width: 381px"
v-model="iptCon"
/>
<a-button @click="jumpPost()" class="btn" type="primary">发帖</a-button>
</div>
<div :key="index" class="post" v-for="(item, index) in lists">
<p class="post-title">{{ item.title }}</p>
<p style="color: rgba(0, 0, 0, 0.45)">
<span>
<!-- <a-icon type="user" class="baseColor" /> -->
<a-avatar :size="20" :src="item.avatarUrl" style="margin-top: -4px" />
{{ item.userName }}
</span>
<span style="margin-left: 20px">{{ item.createdTime }}</span>
<span class="baseColor" style="margin-left: 20px">
<a-icon type="message" />
{{ item.commentNum }}
</span>
</p>
<div class="d-flex flex-nowrap">
<img :src="item.visitLocation" alt class="post-img" v-if="item.visitLocation" />
<div class="post-content" v-dompurify-html="item.content"></div>
</div>
<p class="look-down baseColor">
<span @click="getDet(item.id, index)">
查看详情
<a-icon type="arrow-right" />
</span>
</p>
<div class="comment">
<div :key="b" v-for="(a, b) in coms">
<p style="padding-left: 20px">
<a-avatar :size="20" :src="a.avatarUrl" style="margin-top: -4px" />
<span>{{ a.userName }}</span>
<span style="margin-left: 20px">{{ a.creatTime }}</span>
</p>
<p class="coms-con">{{ a.content }}</p>
</div>
</div>
</div>
<a-pagination
:current="comCurrent"
:page-size="pageSize"
:total="total"
@change="onShowSizeChange"
class="pagination"
show-less-items
show-quick-jumper
v-show="total > 5"
/>
</div>
</template>
<script>
import { mapMutations, mapState } from 'vuex';
import { selComment } from 'config/selComment';
export default {
name: 'Community',
// components: { SearchList },
data() {
return {
str: '这是交流社区界面',
radioStyle: {
height: '30px',
lineHeight: '30px',
},
comment: '',
total: 0,
pageSize: 5,
value: 1,
iptCon: '',
showType: -1,
coms: [],
lists: [],
};
},
computed: mapState('home', ['comCurrent', 'postVal', 'postIpCon']),
watch: {
value(val) {
this.setPostVal(val - 1);
this.setComCurrent(1);
this.searchData();
},
},
created() {
this.value = this.postVal + 1;
this.iptCon = this.postIpCon;
this.searchData();
},
methods: {
...mapMutations('home', ['setComCurrent', 'setPostDetail', 'setPostVal', 'setPostIpCon']),
//
async getDet(id, index) {
this.setPostDetail(this.lists[index]);
this.$router.push('/ComDetails');
},
// 5
async searchData() {
try {
this.setPostIpCon(this.iptCon);
const params = {
param: {
category: this.value - 1,
pageNum: this.comCurrent,
pageSize: 5,
title: this.iptCon,
},
};
const res = await selComment(params);
const { msg, data, code } = res.data;
if (code === 200) {
// console.log(data);
this.lists = data.list;
this.total = parseInt(data.total);
} else {
// console.log(msg);
}
} catch (error) {
// console.log(error);
}
},
//
onShowSizeChange(current, size) {
this.setComCurrent(current);
this.searchData();
},
//
jumpPost() {
this.$router.push('/Posting');
},
},
};
</script>
<style scoped lang="stylus">
.inner {
margin: 40px auto;
}
.post-title {
// width: 165px;
height: 26px;
font-size: 20px;
font-family: Microsoft YaHei;
font-weight: bold;
line-height: 26px;
color: rgba(0, 0, 0, 0.85);
overflow: hidden;
opacity: 1;
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
}
.search-list {
height: 72px;
line-height: 72px;
padding: 0 24px;
position: relative;
background: #fff;
box-shadow: 0 0 10px #ccc;
}
.search {
position: absolute;
right: 110px;
top: 20px;
}
.btn {
width: 75px;
height: 32px;
position: absolute;
right: 25px;
top: 20px;
}
.post {
margin-top: 24px;
width: 100%;
padding: 25px;
position: relative;
overflow: hidden;
height: 270px;
background: #fff;
box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.16);
transition: all 0.25s;
}
.post-img {
width: 233px;
height: 128px;
}
.post-content {
margin-left: 30px;
overflow: hidden;
height: 110px;
text-indent: 2em;
display: -webkit-box;
-webkit-line-clamp: 5;
-webkit-box-orient: vertical;
}
.look-down {
position: absolute;
right: 25px;
bottom: 10px;
cursor: pointer;
margin-bottom: 0;
}
.pagination {
margin-top: 48px;
text-align: right;
}
.comment {
min-height: 107px;
max-height: 207px;
overflow: auto;
width: 1210px;
opacity: 1;
background: #FAFAFA;
margin-top: 60px;
padding: 16px 0;
}
.txtara {
margin-top: 20px;
position: relative;
}
.txt-btn {
position: absolute;
right: 0;
bottom: 0;
}
.coms-con {
background: rgba(19, 172, 196, 0.1);
line-height: 24px;
text-indent: 2em;
margin: 0 20px;
}
</style>

135
src/views/Community/Posting.vue

@ -1,135 +0,0 @@
<template>
<div class="wrap">
<!-- {{ str }} -->
<h2>标题</h2>
<a-input style="margin-bottom: 20px" v-model.trim="title" />
<h2>封面图片</h2>
<a-upload :action="action" :default-file-list="fileList" @change="fileChange" list-type="picture" name="files">
<a-button v-show="fileList.length === 0"> <a-icon type="upload" />点击上传 </a-button>
</a-upload>
<h2 style="margin-top: 20px">内容</h2>
<div class="edit_container" style="height: auto; margin-bottom: 40px">
<quill-editor
:options="editorOption"
@blur="onEditorBlur($event)"
@change="onEditorChange($event)"
@focus="onEditorFocus($event)"
ref="myQuillEditor"
v-model="content"
></quill-editor>
</div>
<a-button @click="subMit" type="primary">发表</a-button>
<router-link @click="subMit" style="margin-left: 40px" tag="a-button" to="Community">取消</router-link>
</div>
</template>
<script>
import { mapState } from 'vuex';
import { quillEditor } from 'vue-quill-editor'; //
import 'quill/dist/quill.core.css';
import 'quill/dist/quill.snow.css';
import 'quill/dist/quill.bubble.css';
import { upload } from 'config/api';
import { addComment } from 'config/selComment';
export default {
name: 'Posting',
components: { quillEditor },
data() {
return {
str: '发帖界面',
title: '',
content: ``,
editorOption: {
placeholder: '请在这里输入',
modules: {
toolbar: [
['bold', 'italic', 'underline', 'strike'], //线线
['blockquote', 'code-block'], //
[{ header: 1 }, { header: 2 }], // 12
[{ list: 'ordered' }, { list: 'bullet' }], //
[{ script: 'sub' }, { script: 'super' }], //
[{ indent: '-1' }, { indent: '+1' }], //
[{ direction: 'rtl' }], //
[{ size: ['small', false, 'large', 'huge'] }], //
[{ header: [1, 2, 3, 4, 5, 6, false] }], //
[{ color: [] }, { background: [] }], //
[{ font: [] }], //
[{ align: [] }], //
['clean'], //
['image', 'video'], //
],
},
},
action: upload,
fileList: [], //
files: '', // Id
};
},
computed: {
...mapState('home', ['postDetail', 'postVal']),
editor() {
return this.$refs.myQuillEditor.quill;
},
},
methods: {
onEditorReady(editor) {
//
},
onEditorBlur() {}, //
onEditorFocus() {}, //
onEditorChange() {
//
// console.log(this.content);
},
//
fileChange(info) {
console.log(info);
// this.fileList = info.fileList;
// if (info.file.status === 'done') {
// this.files = [];
// this.files = info.fileList[0].response.data[0].id;
// console.log(this.files);
// }
},
//
async subMit() {
try {
const params = {
param: {
content: this.content,
category: this.postVal,
picId: this.files,
title: this.title,
},
};
const res = await addComment(params);
const { msg, data, code } = res.data;
if (code === 200) {
this.$message.success('发表成功');
this.$router.push('/Community');
} else {
this.$message.error('发表失败');
}
} catch (error) {
this.$message.error(error);
}
},
},
};
</script>
<style lang="stylus" >
.wrap {
width: 1260px;
min-height: 1037px;
margin: 80px auto 28px auto;
overflow: hidden;
opacity: 1;
}
.ql-editor {
min-height: 600px;
max-height: 800px;
}
</style>

44
src/views/ContactUs/ContactUs.vue

@ -1,44 +0,0 @@
<template>
<div class="inner">
<bread-crumb :arr="arr" class="my-1" />
<!-- 联系我们 -->
<div>
<p class="font-bold-24 title-color">联系我们</p>
<contact />
</div>
<!-- 加入我们 -->
<div>
<p class="font-bold-24 title-color">加入我们</p>
<rich-text :title="title" />
<model class="mt-8" />
</div>
</div>
</template>
<script>
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
import Contact from 'components/Introduce/ContactUs.vue';
import RichText from 'components/Introduce/RichText.vue';
import Model from 'components/Introduce/Model.vue';
export default {
name: 'ContactUs',
components: { BreadCrumb, Contact, RichText, Model },
data() {
return {
title: '联系我们',
arr: [{ name: '联系我们', url: '' }],
};
},
};
</script>
<style scoped lang="stylus">
.inner {
margin: 40px auto;
}
p {
margin-top: 2rem;
}
</style>

259
src/views/FirstPage/FirstPage.vue

@ -1,263 +1,32 @@
<!--
Copyright (c) 2020.
author: bin
email: binbin0314@126.com
-->
<template>
<div>
<rotation />
<div class="inner">
<a-row>
<a-col :span="18" id="hy-news">
<a-row>
<a-col :key="server.id" :span="8" v-for="server in services">
<div @click="$router.push(server.path)" class="mr-4 d-flex pointer">
<div class="server-box d-flex fill-width">
<img :src="server.url" style="width:100%" />
</div>
</div>
</a-col>
</a-row>
<a-row class="mt-8">
<a-col :span="8" class="fill-width d-flex flex-nowrap flex-row justify-space-between">
<div
:key="platform.id"
@click="$router.push(platform.path)"
class="platform-box"
v-for="platform in platforms"
>
<div class="d-flex flex-column align-center pointer">
<img :src="platform.url" style="width:48%" />
<div class="platform-txt mt-3">{{ platform.firstName }}</div>
<div class="platform-txt">{{ platform.secondName }}</div>
</div>
</div>
</a-col>
</a-row>
<a-row class="mt-8 mr-4 flex-1">
<a-col :span="24">
<div class="white d-flex flex-column justify-center">
<index-new-list :i="0" :lists="lists" />
</div>
</a-col>
</a-row>
</a-col>
<a-col :span="6" :style="{ height: height }" class="hd-news">
<div class="white d-flex flex-column justify-center">
<index-new-list :i="1" :lists="lists" />
</div>
</a-col>
</a-row>
</div>
<!-- 时间选择 -->
<TimePicker />
<!-- 成员选择 -->
<MemberPicker />
<!-- 列表 -->
<List />
</div>
</template>
<script>
import { mapState, mapActions } from 'vuex';
import Rotation from 'components/Rotation/Rotation.vue';
import IndexNewList from 'components/Index/IndexNewList.vue';
import { frontSearchFriend, frontSearchCompany } from 'config/api';
import TimePicker from '@/components/TimePicker/TimePicker.vue';
import MemberPicker from '@/components/MemberPicker/MemberPicker.vue';
import List from '@/components/List/List.vue';
export default {
components: { Rotation, IndexNewList },
components: { TimePicker, MemberPicker, List },
data() {
return {
services: [
{
id: '01',
chinese: '创新服务',
english: 'INNOVATIVE',
path: '/NewPlatform/NewService',
url: 'https://www.sxwikionline.com/gateway/greenvalley/uploads/upload/20210119/index06.png',
},
{
id: '02',
chinese: '孵化服务',
english: 'INCUBATION',
path: '/IncubationPlatform/Services',
url: 'https://www.sxwikionline.com/gateway/greenvalley/uploads/upload/20210119/index07.png',
},
{
id: '03',
chinese: '产业服务',
english: 'INDUSTRIAL',
path: '/Industry/Serve',
url: 'https://www.sxwikionline.com/gateway/greenvalley/uploads/upload/20210119/index08.png',
},
],
platforms: [
{
id: '04',
firstName: '创新挑战',
secondName: '',
path: '/Challenge/Solicitation',
url: 'https://www.sxwikionline.com/gateway/greenvalley/uploads/upload/20210119/index01.png',
},
{
id: '05',
firstName: '科技资源开放共享服务平台',
secondName: '',
path: '/NewPlatform/Share',
url: 'https://www.sxwikionline.com/gateway/greenvalley/uploads/upload/20210119/index02.png',
},
{
id: '06',
firstName: '知识产权与技术转移转化服务平台',
secondName: '',
path: '/NewPlatform/Transfer',
url: 'https://www.sxwikionline.com/gateway/greenvalley/uploads/upload/20210119/index03.png',
},
{
id: '07',
firstName: '知识培训与科技人才服务平台',
secondName: '',
path: '/NewPlatform/Develop',
url: 'https://www.sxwikionline.com/gateway/greenvalley/uploads/upload/20210119/index04.png',
},
// {
// id: '08',
// firstName: '',
// secondName: '',
// path: '/Knowledge',
// url: 'https://www.sxwikionline.com/gateway/greenvalley/uploads/upload/20210119/index05.png',
// },
],
lists: [
{
id: 1,
name: '行业资讯',
news: [],
},
{
id: 2,
name: '活动公告',
news: [],
},
],
height: '',
};
return {};
},
computed: mapState('home', ['actList', 'actIpCon', 'actCurrent']),
created() {
this.getData1();
this.getData2();
this.getIndustryInfoLists();
this.getFrontLists();
},
mounted() {
var oDiv = document.getElementById('hy-news');
this.height = oDiv.offsetHeight + 60 + 'px';
},
methods: {
...mapActions('home', ['getIndustryInfoList', 'getFrontList']),
//
async getData1() {
const params = {
param: {
pageNum: 1,
pageSize: 5,
type: 1,
typeOfPlatform: 1,
},
};
const res = await frontSearchFriend(params);
const { data, code, msg } = res.data;
if (code === 200) {
// console.log(data);
} else {
// console.log(msg);
}
},
//
async getData2() {
const params = {
param: {
pageNum: 1,
pageSize: 5,
type: 2,
typeOfPlatform: 2,
},
};
const res = await frontSearchCompany(params);
const { data, code, msg } = res.data;
if (code === 200) {
// console.log(data);
} else {
// console.log(msg);
}
},
//
async getIndustryInfoLists() {
const params = {
param: {
pageNum: 1,
pageSize: 3,
},
};
const res = await this.getIndustryInfoList(params);
this.lists[0].news = res.list;
},
//
async getFrontLists() {
const params = {
param: {
activityType: [],
pageNum: 1,
pageSize: 6,
title: '',
},
};
const res = await this.getFrontList(params);
this.lists[1].news = res.list;
methods: {
handleChange(value) {
console.log(`selected ${value}`);
},
},
};
</script>
<style lang="less" scoped>
.inner {
margin: 20px auto;
}
.platform-box {
width: 25%;
.platform-txt {
font-size: 14px;
}
@media only screen and (max-width: 1400px) {
.platform-txt {
font-size: 12px;
}
}
}
.platform-box div {
transition: all 0.2s ease 0s;
}
.platform-box:hover div {
transform: translate(0, -3px);
}
.server-box:hover img {
transform: translate(0, -3px);
}
.server-box img {
transition: all 0.2s ease 0s;
}
.hy-news {
height: 746px;
}
.hd-news {
background: white;
}
</style>

56
src/views/IncubationPlatform/Children/Incubator.vue

@ -1,56 +0,0 @@
<!--
* @Author: wally
* @email: 18603454788@163.com
* @Date: 2021-01-13 17:21:29
* @LastEditors: wally
* @LastEditTime: 2021-01-19 13:07:46
-->
<template>
<div>
<h-nav />
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<banner :show-page="showPage" />
<div class="inner">
<div class="white pa-5 my-5">
<!-- <rich-text :title="title" /> -->
<div class="words-content">
<img src="https://www.sxwikionline.com/gateway/greenvalley/uploads/upload/logo/fhcs.png" />
</div>
</div>
</div>
</div>
</template>
<script>
import Banner from 'components/Banner/Banner.vue';
import HNav from './../components/HNav.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
// import RichText from 'components/Introduce/RichText.vue';
export default {
name: 'Incubator',
components: { Banner, HNav, BreadCrumb },
data() {
return {
title: '孵化平台-孵化场所',
showPage: 45,
arr: [
{ name: '孵化平台', url: '/IncubationPlatform/MakerSpace' },
{ name: '众创空间', url: '/IncubationPlatform/MakerSpace' },
{ name: '实体众创空间', url: '/IncubationPlatform/MakerSpace/EntitySpace' },
{ name: '孵化场所', url: '' },
],
};
},
methods: {},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 40px auto;
}
</style>

172
src/views/IncubationPlatform/Children/MakerSpace.vue

@ -1,172 +0,0 @@
<template>
<div>
<h-nav />
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<banner :show-page="showPage" />
<div class="inner">
<div>
<div class="d-flex flex-column white">
<div class="font-bold-32 title-color pt-3 px-2">众创空间介绍</div>
<div class="pa-3 font-16">
<div>
本众创空间分为线下实体众创空间与线上虚拟众创空间重点面向功能食品生物医药和大健康产业
领域科技型中小微企业创客和创新创业团队开展创业孵化培育高新技术企业促进科技成果转化和产业集聚发展
</div>
<div>
本众创空间以建设专业化市场化网络化品牌化双创孵化基地为目标致力打造以公共技术服务平台
为支撑以创新创业服务为主导以创新创业大讲堂为带动以创新创业投融资为拓展线上线下相结合
体虚拟相融合的全要素专业化开放式创新创业孵化平台着力构建众创空间-孵化器-加速器-产业园创新创业
孵化链构筑创新创业生态系统
</div>
<div>
目前空间已引入科创咨询专业服务机构并与多家
<span
@click="$router.push('/IncubationPlatform/Partner')"
class="pointer baseColor"
>第三方专业机构</span>
建立战略合作聘请
<span @click="$router.push('')" class="pointer baseColor">创业导师</span>
30余名服务领域涵盖专业技术企业管理科创咨询财务税务法务咨询等可随时为入孵企业提供针 对性一对一创业辅导服务
</div>
</div>
</div>
<!-- <div :key="index" style="margin-top: 20px" v-for="(item, index) in list">
<div class="d-flex justify-space-between space-box" v-if="index % 2 === 0">
<div class="introduce-box">
<p
@click="item.imgUrl ? jump(item.url) : openModel()"
class="introduce-title pointer"
>
{{ item.title }}
<a-icon class="baseColor ml-3" type="right-circle" />
</p>
<p class="introduce-content" v-if="index === 0">
实体空间由
<span @click="$router.push('')" class="pointer baseColor">孵化场所</span>
<span @click="$router.push('')" class="pointer baseColor">公共实验室</span>
<span @click="$router.push('')" class="pointer baseColor">中试基地</span>部分组成
</p>
<p
@click="item.imgUrl ? jump(item.url) : openModel()"
class="introduce-content pointer"
v-else
>{{ item.content }}</p>
</div>
<img
:src="item.imgUrl"
@click="item.url ? jump(item.url) : ''"
class="pointer"
style="width: 452px"
/>
</div>
<div
@click="item.url ? jump(item.url) : ''"
class="d-flex justify-space-between pointer space-box"
v-else
>
<img :src="item.imgUrl" style="width: 452px" />
<div class="introduce-box">
<p class="introduce-title">
{{ item.title }}
<a-icon class="baseColor ml-3" type="right-circle" />
</p>
<p class="introduce-content">{{ item.content }}</p>
</div>
</div>
<add-model :value="1" ref="child" style="width: 452px" />
</div>-->
<div style="margin-top: 20px">
<div class="d-flex justify-space-between">
<img
class="pointer mr-3"
src="../../../assets/zckj.png"
style="width: 320px;height: 228px;"
/>
<div class="flex-1 d-flex flex-column white">
<div
:key="index"
class="introduce-box d-flex flex-column pb-5"
style="width: 100%"
v-for="(item, index) in list"
>
<p
@click="item.imgUrl ? jump(item.url) : openModel()"
class="introduce-title pointer"
>
{{ item.title }}
<a-icon class="baseColor ml-3" type="right-circle" />
</p>
<p class="introduce-content" v-if="index === 0">
实体空间由
<span @click="$router.push('')" class="pointer baseColor">孵化场所</span>
<span @click="$router.push('')" class="pointer baseColor">公共实验室</span>
<span @click="$router.push('')" class="pointer baseColor">中试基地</span>部分组成
</p>
<p
@click="item.imgUrl ? jump(item.url) : openModel()"
class="introduce-content pointer"
v-else
>{{ item.content }}</p>
</div>
</div>
</div>
<add-model :value="1" ref="child" style="width: 452px" />
</div>
</div>
</div>
</div>
</template>
<script>
import Banner from 'components/Banner/Banner.vue';
import HNav from './../components/HNav.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
import AddModel from '../components/AddModel.vue';
export default {
name: 'MakerSpace',
components: { BreadCrumb, HNav, Banner, AddModel },
data() {
return {
showPage: 41,
arr: [
{ name: '孵化平台', url: '/IncubationPlatform/MakerSpace' },
{ name: '众创空间', url: '' },
],
list: [
{
title: '实体空间',
content: '实体空间由孵化场所、公共实验室、中试基地部分组成。',
imgUrl: 'https://www.sxwikionline.com/gateway/greenvalley/uploads/upload/20210119/xn.png',
url: '/IncubationPlatform/MakerSpace/EntitySpace',
},
{
title: '虚拟空间',
content:
'虚拟众创空间主要面向非入驻实体空间从事功能食品、生物医药和大健康产业相关研发服务和生产的企业。虚拟众创空间依托绿谷数字化平台进行建设,入驻企业可享受实体众创空间的各种创新创业服务,参加相关创新创业活动。',
imgUrl: 'https://www.sxwikionline.com/gateway/greenvalley/uploads/upload/20210119/st.png',
url: '/IncubationPlatform/MakerSpace/VirtualSpace',
},
],
};
},
methods: {
jump(url) {
this.$router.push(url);
},
openModel() {
this.$refs.child[0].showModal();
},
},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 0 auto 40px;
}
</style>

41
src/views/IncubationPlatform/Children/Partner.vue

@ -1,41 +0,0 @@
<template>
<div>
<h-nav />
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<div class="inner">
<div>
<partner-ship :title="title" :type-of-platform="typeOfPlatform" />
</div>
</div>
</div>
</template>
<script>
import { mapState, mapMutations, mapActions } from 'vuex';
import HNav from './../components/HNav.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
import PartnerShip from 'components/Introduce/PartnerShip.vue';
export default {
name: 'Partner',
components: { HNav, BreadCrumb, PartnerShip },
data() {
return {
title: '合作伙伴',
typeOfPlatform: '孵化平台',
arr: [
{ name: '孵化平台', url: '/IncubationPlatform/MakerSpace' },
{ name: '第三方专业机构', url: '' },
],
};
},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 20px auto;
}
</style>

46
src/views/IncubationPlatform/Children/PilotBase.vue

@ -1,46 +0,0 @@
<template>
<div>
<h-nav />
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<banner :show-page="showPage" />
<div class="inner">
<div class="white pa-5 my-5">
<rich-text :title="title" />
</div>
</div>
</div>
</template>
<script>
import Banner from 'components/Banner/Banner.vue';
import HNav from './../components/HNav.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
import RichText from 'components/Introduce/RichText.vue';
export default {
name: 'PilotBase',
components: { Banner, HNav, BreadCrumb, RichText },
data() {
return {
title: '孵化平台-中试基地',
showPage: 43,
arr: [
{ name: '孵化平台', url: '/IncubationPlatform/MakerSpace' },
{ name: '众创空间', url: '/IncubationPlatform/MakerSpace' },
{ name: '实体众创空间', url: '/IncubationPlatform/MakerSpace/EntitySpace' },
{ name: '中试基地', url: '' },
],
};
},
methods: {},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 40px auto;
}
</style>

170
src/views/IncubationPlatform/Children/Products.vue

@ -1,170 +0,0 @@
<template>
<div>
<h-nav />
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<div class="inner">
<div>
<div class="search-background">
<div class="d-flex">
<div class="flex-3 flex-wrap">
<span class="ins-title">产品类目</span>
<span
:class="item.isActive ? 'act-color' : ''"
:key="index"
@click="choose(index)"
class="ins-name"
v-for="(item, index) in productLists"
>{{ item.name }}</span>
</div>
<div class="flex-1 align-center">
<a-input-search
@search="searchProduct"
class="item-search"
enter-button="搜索"
placeholder="请输入"
v-model="productIpt"
/>
</div>
</div>
</div>
</div>
<p class="font-bold-24">产品展示</p>
</div>
<platform-list />
</div>
</template>
<script>
import { mapMutations } from 'vuex';
import { selModel } from 'config/api';
import PlatformList from 'components/PlatformList/PlatformList.vue';
import HNav from './../components/HNav.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
export default {
name: 'Products',
components: { BreadCrumb, HNav, PlatformList },
data() {
return {
arr: [
{ name: '孵化平台', url: '/IncubationPlatform/MakerSpace' },
{ name: '产品展示', url: '' },
],
productIpt: '', //
productLists: [], //
productList: [], //
};
},
watch: {
productIpt(val) {
const obj = {
content: this.productIpt,
isBtn: 0,
};
this.setProductIpt(obj);
},
},
created() {
const obj = {
content: '',
isBtn: 0,
};
this.setListState(3);
this.setProductList([]);
this.setProductIpt(obj);
this.getType(3);
},
methods: {
...mapMutations('home', ['setProductIpt', 'setProductList', 'setListState']),
async getType(num) {
try {
const params = { param: { model: num } };
const res = await selModel(params);
const { code, mst, data } = res.data;
if (code === 200) {
this.productLists = data;
for (let i = 0; i < this.productLists.length; i++) {
this.productLists[i].isActive = false;
}
}
} catch (error) {
// console.log(error);
}
},
//
choose(index) {
this.productList = [];
const { productLists } = this;
for (let i = 0; i < productLists.length; i++) {
productLists[i].isActive = false;
}
this.setListState(3);
productLists[index].isActive = !productLists[index].isActive;
this.productLists = [...productLists];
for (let i = 0; i < productLists.length; i++) {
if (productLists[i].isActive) {
this.productList.push(productLists[i].id);
}
}
this.setProductList(this.productList);
},
//
searchProduct() {
const { productLists } = this;
for (let i = 0; i < productLists.length; i++) {
productLists[i].isActive = false;
}
this.productLists = [...productLists];
this.setListState(3);
this.productIpt = '';
const obj = {
content: this.productIpt,
isBtn: 1,
};
this.setProductList(obj);
},
},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 40px auto;
}
.search-background {
background: rgba(0, 0, 0, 0.02);
border: 1px solid rgba(0, 0, 0, 0.06);
height: auto;
padding: 0 20px;
width: 100%;
margin: 40px auto;
line-height: 44px;
}
.item-search {
width: 100%;
height: 32px;
}
.ins-title {
font-size: 16px;
font-weight: bold;
color: rgba(0, 0, 0, 0.65);
}
.ins-name {
font-size: 16px;
color: rgba(0, 0, 0, 0.65);
padding: 0 10px;
cursor: pointer;
}
.act-color {
color: #13ACC4 !important;
}
</style>

46
src/views/IncubationPlatform/Children/PublicLaboratory.vue

@ -1,46 +0,0 @@
<template>
<div>
<h-nav />
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<banner :show-page="showPage" />
<div class="inner">
<div class="white pa-5 my-5">
<rich-text :title="title" />
</div>
</div>
</div>
</template>
<script>
import Banner from 'components/Banner/Banner.vue';
import HNav from './../components/HNav.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
import RichText from 'components/Introduce/RichText.vue';
export default {
name: 'PublicLaboratory',
components: { Banner, HNav, BreadCrumb, RichText },
data() {
return {
title: '孵化平台-公共实验室',
showPage: 42,
arr: [
{ name: '孵化平台', url: '/IncubationPlatform/MakerSpace' },
{ name: '众创空间', url: '/IncubationPlatform/MakerSpace' },
{ name: '实体众创空间', url: '/IncubationPlatform/MakerSpace/EntitySpace' },
{ name: '公共实验室', url: '' },
],
};
},
methods: {},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 40px auto;
}
</style>

472
src/views/IncubationPlatform/Children/Services.vue

@ -1,472 +0,0 @@
<template>
<div>
<h-nav />
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<banner :show-page="showPage" />
<div class="flow-path" style="padding: 15px 9%;">
<div class="flow-title" style="top: 30%;">服务流程</div>
<div class="flow-content1">
<img src="~assets/image.png" style="width: 100%" />
</div>
</div>
<div class="inner d-flex flex-wrap" style="margin: 20px auto">
<div
:class="(index + 1) % 4 === 0 ? 'margin-0' : ''"
:key="index"
class="item-box pointer d-flex flex-column"
style="position: relative"
v-for="(item, index) in list"
>
<img
:src="item.picUrl"
:title="item.intro"
@click="showModal(item.id)"
style="height: 220px; width: 100%; border: 1px solid #ccc"
/>
<p @click="showModal(item.id)" class="font-24 my-2 text-center">{{ item.name }}</p>
<div v-if="item.intro.length>45" class="font-16 textColor item-intro mb-2">
{{ item.intro.slice(0,45) }}
<a-button
@click="showIntro(index)"
class="font-16 baseColor"
type="link"
style="height:20px;float:right;padding:0px"
>
more
<a-icon style="font-size:12px" type="right" />
</a-button>
</div>
<div v-if="item.intro.length<=45" class="font-16 textColor item-intro">
<p>{{ item.intro }}</p>
</div>
<!-- <p @click="showDiv(index)" class="baseColor d-flex flex-row-reverse">{{ showList[index] }}</p> -->
</div>
</div>
<a-modal v-model="showModelIntro" :footer="null">
<p class="mt-3"> {{ modelIntro }} </p>
</a-modal>
<div class="inner">
<a-pagination
:current="current"
:page-size="pageSize"
:total="total"
@change="onShowSizeChange"
class="pagination"
show-less-items
show-quick-jumper
v-show="total > 8"
/>
</div>
<a-modal
:confirm-loading="confirmLoading"
:visible="visible"
@cancel="handleCancel"
@ok="handleOk"
title="技术需求"
width="50%"
>
<a-form :form="form">
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="公司名称"
>
<a-input placeholder="请输入公司名称..." v-model.trim="platform.companyName" />
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="联系人"
required
>
<a-input placeholder="请输入联系人..." v-model.trim="platform.manName" />
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="联系电话"
required
>
<a-input
@change="changePhone"
placeholder="请输入联系电话.."
type="tel"
v-decorator="['tel', { rules: phoneRules }]"
/>
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="图片验证码"
required
>
<div class="d-flex flex-nowrap">
<a-input placeholder="图片验证码" type="number" v-model="codeNum" />
<img
:src="picCode.imageBase64"
@click="changePicCode"
class="code_img ml-2"
v-if="picCode && picCode.imageBase64"
/>
<a-button @click="changePicCode" class="code_img ml-2" size="small" v-else>获取验证码</a-button>
<!-- <a-input v-decorator="['account', { rules: rules.account }]" /> -->
</div>
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="短信验证码"
required
>
<div class="d-flex flex-nowrap">
<a-input placeholder="请输入验证码" type="number" v-model="platform.code" />
<a-button
class="code_img ml-2"
disabled
type="primary"
v-if="showInterval"
>重新发送 {{ interval }}</a-button>
<a-button
:disabled="platform.isTel === false"
@click="getCode"
class="code_img ml-2"
type="primary"
v-else
>获取验证码</a-button>
</div>
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="需求描述"
>
<a-textarea
placeholder="请输入需求描述..."
style="height: 120px"
v-model.trim="platform.describe"
/>
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="上传附件"
v-show="typeData.type === 0"
>
<a-upload
:action="action"
:before-upload="beforeUpload"
:default-file-list="fileList"
@change="fileChange"
list-type="picture"
name="files"
>
<a-button>
<a-icon type="upload" />点击上传附件
</a-button>
</a-upload>
</a-form-item>
</a-form>
</a-modal>
</div>
</template>
<script>
import { mapMutations, mapState, mapActions } from 'vuex';
import { selService, serviceApply, upload } from 'config/api';
import Banner from 'components/Banner/Banner.vue';
import HNav from './../components/HNav.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
const formItemLayout = {
labelCol: { span: 5 },
wrapperCol: { span: 18 },
};
const formTailLayout = {
labelCol: { span: 6 },
wrapperCol: { span: 18, offset: 6 },
};
export default {
name: 'Services',
components: { Banner, HNav, BreadCrumb },
data() {
return {
title: '创业服务',
showPage: 46,
arr: [
{ name: '孵化平台', url: '/IncubationPlatform/MakerSpace' },
{ name: '创业服务', url: '/IncubationPlatform/Services' },
],
list: [],
current: 1,
pageSize: 8,
total: 0,
intro: '',
form: this.$form.createForm(this, { name: 'submit' }),
action: upload,
fileList: [],
visible: false,
formItemLayout,
formTailLayout,
confirmLoading: false,
platform: {
companyName: '', //
manName: '', //
tel: '', //
describe: '', //
code: '', //
files: [], // Id
isTel: false,
},
codeRules: [
{ required: true, message: '请输入验证码' },
{ min: 4, max: 4, message: '请输入4位短信验证码' },
],
codeNum: '',
showInterval: false,
codeTimer: null,
interval: 120, //
phoneRules: [
{ required: true, pattern: new RegExp(/^[1][3,4,5,6,7,8,9][0-9]{9}$/), whitespace: true, message: '请输入正确的手机号' },
],
showList: ['查看全部', '查看全部', '查看全部', '查看全部', '查看全部', '查看全部', '查看全部', '查看全部'],
typeData: {
type: 0,
id: '',
},
showModelIntro: false,
modelIntro: ''
};
},
computed: mapState('user', ['picCode']),
async created() {
this.getService();
this.sendPicCode();
await this.getUserSer();
if (this.userSer) {
if (this.userSer.name) {
this.platform.manName = this.userSer.name;
}
if (this.userSer.phone) {
this.platform.tel = this.userSer.phone;
}
if (this.userSer.companyName) {
this.platform.companyName = this.userSer.companyName;
}
}
},
methods: {
...mapMutations('home', ['setServiceArr']),
...mapActions('user', ['sendCode', 'sendPicCode']),
...mapActions('home', ['getUserSer']),
//
onShowSizeChange(current, size) {
this.current = current;
},
showIntro(index){
this.showModelIntro = true
this.modelIntro = this.list[index].intro
},
//
async getService() {
try {
const params = { param: { serviceType: 2 } };
const res = await selService(params);
const { code, data, msg } = res.data;
if (code === 200) {
this.list = data;
}
} catch (error) {
// console.log(data);
}
},
//
jump(id) {
// console.log(id);
this.setServiceArr([]);
this.setServiceArr(this.arr);
this.$router.push({
path: '/NewPlatform/ServiceDet',
name: 'ServiceDet',
params: { id },
});
},
//
showModal(id) {
this.typeData.id = id;
this.visible = true;
},
//
handleCancel(e) {
this.visible = false;
},
//
changePhone(e) {
this.platform.tel = e.target.value;
this.platform.isTel = /^[1][3,4,5,6,7,8,9][0-9]{9}$/.test(this.platform.tel);
},
//
handleOk() {
if (!this.platform.manName) {
this.$message.error('请输入联系人');
} else if (!this.platform.tel) {
this.$message.error('请输入联系电话');
} else if (!this.platform.code) {
this.$message.error('请输入验证码');
} else {
if (this.platform.isTel) {
for (var i = 0; i < this.fileList.length; i++) {
this.platform.files = this.platform.files.concat(this.fileList[i].response.data[0].id);
}
this.subMitAdd();
// console.log(this.platform.files);
} else {
this.$message.error('请输入正确的联系电话');
}
}
},
//
async subMitAdd() {
this.confirmLoading = true;
try {
const params = {
param: {
code: this.platform.code,
companyName: this.platform.companyName,
contactName: this.platform.manName,
contactPhone: this.platform.tel,
description: this.platform.describe,
filesId: this.platform.files,
serviceId: this.typeData.id,
type: this.typeData.type,
},
};
const res = await serviceApply(params);
const { code, msg, data } = res.data;
if (code === 200) {
this.$message.success('申请成功');
this.visible = false;
this.confirmLoading = false;
for (let key in this.platform) {
this.platform[key] = '';
}
this.platform.isTel = false;
} else {
throw msg;
this.confirmLoading = false;
}
} catch (error) {
this.$message.error(error);
this.confirmLoading = false;
}
},
//
async getCode() {
// console.log(111);
try {
const params = {
phone: this.platform.tel,
verificationCodeId: this.picCode.verificationCodeId,
verificationCodeValue: this.codeNum,
};
await this.sendCode(params);
this.getCodeInterval();
} catch (error) {
// throw new Error(`SignIn.vue method getCode: ${error}`);
// console.log(error);
}
},
//
getCodeInterval() {
this.showInterval = true;
this.codeTimer = setInterval(() => {
if (this.interval === 0) {
clearInterval(this.codeTimer);
this.codeTimer = null;
this.showInterval = false;
this.interval = 120;
return;
}
this.interval = this.interval - 1;
}, 1000);
},
//
changePicCode() {
this.sendPicCode();
},
beforeUpload(file) {
return new Promise((resolve, reject) => {
const isLt5M = file.size / 1024 / 1024 < 5;
if (!isLt5M) {
this.$message.warning('上传附件大小不能超过5m!');
return reject(false);
}
return resolve(true);
});
},
fileChange(info) {
this.fileList = info.fileList;
},
showDiv(index) {
var divs = document.getElementsByClassName('item-intro');
let list = ['查看全部', '查看全部', '查看全部', '查看全部'];
for (let i = 0; i < divs.length; i++) {
if (index === i) {
if (divs[index].style.height === '90px' || divs[index].style.height === '') {
list[i] = '收起';
divs[i].style.height = 'auto';
} else {
divs[i].style.height = '90px';
list[i] = '查看全部';
}
} else {
divs[i].style.height = '90px';
list[i] = '查看全部';
}
}
this.showList = list;
},
},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 40px auto;
}
.pagination {
text-align: right;
}
.item-box {
width: 22%;
margin-right: 4%;
border-radius: 4px;
// text-align: center;
}
.text-center{
text-align: center;
}
.margin-0 {
margin-right: 0 !important;
}
.item-intro {
// display: -webkit-box;
// -webkit-line-clamp: 3;
// -webkit-box-orient: vertical;
// text-align: left;
// height: 90px;
// overflow: hidden;
}
</style>

97
src/views/IncubationPlatform/Children/Tutor.vue

@ -1,97 +0,0 @@
<template>
<div>
<h-nav />
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<banner :show-page="showPage" />
<div class="inner">
<div class="py-5 my-5" v-if="teachers && teachers.length > 0">
<div :key="teacher.categoryId" class="mb-4" v-for="teacher in teachers">
<p class="font-bold-24 title-color">{{ teacher.categoryName }}</p>
<div class="d-flex flex-wrap mb-10" v-if="teacher.services && teacher.services.length">
<div
:class="(index + 1) % 5 === 0 ? 'teacher-item1' : ''"
:key="index"
class="teacher-item font-24 mb-3"
v-for="(item, index) in teacher.services"
>{{ item.name }}</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import Banner from 'components/Banner/Banner.vue';
import HNav from './../components/HNav.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
import { selTeacher } from 'config/api';
export default {
name: 'Tutor',
components: { Banner, HNav, BreadCrumb },
data() {
return {
title: '孵化平台-创业导师',
showPage: 44,
arr: [
{ name: '孵化平台', url: '/IncubationPlatform/MakerSpace' },
{ name: '创业导师', url: '' },
],
teachers: [],
};
},
created() {
this.handleTeacher();
},
methods: {
//
async handleTeacher() {
try {
const res = await selTeacher();
const { code, msg, data } = res.data;
if (code === 200) {
this.teachers = data;
for (let i = 0; i < this.teachers.length; i++) {
const element = this.teachers[i];
for (let j = 0; j < element.services.length; j++) {
for (let k = 0; k < element.services.length - j; k++) {
if (element.services[k].order > element.services[k + 1].order) {
let a = {};
a = element.services[k + 1].order;
element.services[k + 1].order = element.services[k].order;
element.services[k].order = a;
}
}
}
}
} else {
this.$message.error(msg);
}
} catch (error) {
this.$message.error(error);
}
},
},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 40px auto;
}
.teacher-item {
width: 12%;
margin-right: 10%;
text-indent: 1em;
}
.teacher-item1 {
margin-right: 0;
}
</style>

57
src/views/IncubationPlatform/Children/components/SenNav.vue

@ -1,57 +0,0 @@
<template>
<div class="nav-box d-flex">
<div
:class="activeNum === index ? 'nav-box-active' : ''"
:key="index"
@click="jump(item.url)"
v-for="(item, index) in list"
>{{ item.title }}</div>
</div>
</template>
<script>
export default {
name: 'HNav',
data() {
return {
str: '导航条',
activeNum: 0,
list: [
{
title: '科技资源开放共享服务平台',
url: '/NewPlatform/Share',
},
{
title: '知识产权与技术转移转化服务平台',
url: '/NewPlatform/Transfer',
},
{
title: '创新服务',
url: '/NewPlatform/Develop',
},
],
};
},
created() {
console.log();
if (this.$route.fullPath === '/NewPlatform/Transfer') {
this.activeNum = 1;
} else if (this.$route.fullPath === '/NewPlatform/Develop') {
this.activeNum = 2;
} else {
this.activeNum = 0;
}
},
methods: {
jump(url) {
if (this.$route.fullPath === url) {
this.$message.success('已在当前界面');
} else {
this.$router.push(url);
}
},
},
};
</script>
<style lang="stylus" scoped></style>

342
src/views/IncubationPlatform/Children/place/EntitySpace.vue

@ -1,342 +0,0 @@
<template>
<div>
<h-nav />
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<div class="top-box">
<banner :show-page="49" />
<!-- <add-model :value="2" class="add-mol" style="height: 32px" /> -->
<settled-model :type-num="1" class="add-mol" ref="childModel" style="height: 32px" />
<a-button
@click="$router.push('/IncubationPlatform/MakerSpace/InformationFilling')"
class="set-mol"
type="primary"
>统计信息填报</a-button>
<!-- <div class="top-title">实体众创空间</div>
<div class="top-content">
山西绿谷生物科技股份有限公司立足功能食品生物医药和大健康产业聚焦创新聚力孵化聚合产业
致力建设集创新链孵化链和产业链为一体产学研协同多学科交叉大中小企业融通
线上线下相结合的融合发展机制和开放式创新创业平台培育打造全链条一体化新型社会研发机构和创新创业生态系统
构筑专业化集群化园区化产业发展新模式和新业态公司秉持创新开放协同融合发展理
赋能健康中国筑梦绿色未来为愿景构建创新创业生态发展特色产业集群打造全链条一体化开放
式创新创业高地为使命大力推动建设共融共生共建 共创价值共同体
</div>-->
</div>
<!-- 孵化场所 -->
<div @click="$router.push('')" class="center-box c-box pointer">
<div class="center-title">
<div class="circular"></div>
<div style="margin-left: 40px">孵化场所</div>
</div>
<div class="center-content d-flex flex-nowrap">
孵化场所分为运营办公区公共空间区独立空间区和开放办公区公共空间区包括路演厅
项目路演知识培训产品展示等多项功能会议室洽谈室第三空间创业咖啡
开放空间区按功能食品生物医药数字健康领域进行分区设置
</div>
</div>
<!-- 公共实验室 -->
<div @click="$router.push('')" class="center-box pointer">
<div class="center-title">
<div class="circular"></div>
<div style="margin-left: 40px">公共实验室</div>
</div>
<div class="center-content d-flex flex-column">
<span>
公共实验室位于太原市师范街50号山西省生物研究院有限公司总面积1320平方米
建有医药生物技术山西省重点实验室山西省发酵工程中试基地山西省乳品
发酵中试基地等省级科技创新平台具有检验检测机构资质认定证书CMA实验室
拥有20万以上仪器设备26台套包括AKTA蛋白纯化系统多功能酶标仪原子吸收光谱仪
液相色谱仪万级无菌工作间P2实验室等多种高端大型实验仪器设备可提供生物医药
食品检测食用菌肠道微生物等方面的科学实验检验检测小试中试等技术服务与科研成果转化
</span>
<img
class="center-img"
src="https://www.sxwikionline.com/gateway/greenvalley/uploads/upload/20210120/eb472126971a47438a3227df967ed2cb.png"
/>
</div>
</div>
<!-- 中试基地 -->
<div @click="$router.push('')" class="center-box c-box pointer">
<div class="center-title">
<div class="circular"></div>
<div style="margin-left: 40px">中试基地</div>
</div>
<div class="center-content d-flex flex-column">
<div>发酵工程中试基地位于山西维尔乳制品有限公司基地具有发酵乳制品等生产加工条件可提供微生物发酵实验及相关中试</div>
<div>超高压食品加工中试基地位于太原市小店区正阳街43号的山西力德福科技有限公司基地具有非热杀菌保鲜生产线超高压设备制造生产线及中试车间可提供超高压加工实验及相关中试和产业化服务</div>
<div>
干果精深加工中试基地位于吕梁的交城天娇红农业科技有限公司
拥有300余万元的先进分析检测仪器设备及免洗干枣生产车间浓缩枣汁生产车间等生产加工条件可提供相关中试研究
</div>
<img
class="center-img"
src="https://www.sxwikionline.com/gateway/greenvalley/uploads/upload/20210120/d80b7f22aabc4c7194324b0f93793a41.png"
/>
</div>
</div>
<!-- 加入流程 -->
<!-- <div class="center-box">
<div class="center-title">
<div class="circular"></div>
<div style="margin-left: 40px">加入流程</div>
</div>
<div class="center-content">
<div class="join-us-box">
<img class="fill-width" src="~assets/join-us.png" />
<div class="material-box d-flex flex-row justify-center">
<a-tooltip placement="top">
<template slot="title">
<div>
<p>资料</p>
<p>1.入孵申请表</p>
<p>2.营业执照复印件尚未注册的无须提供未注册提供注册信息登记表</p>
<p>3.法定代表或授权代表身份证复印件</p>
<p>4.主导产品或技术简介</p>
</div>
</template>
<div class="material"></div>
</a-tooltip>
</div>
</div>
</div>
<add-model :value="2" class="center-btn" style="height: 32px" />
</div>-->
<!-- 入驻企业名录 -->
<div class="center-box" style="margin-bottom: 15px">
<div class="center-title" style="top: 105px;">
<div class="circular"></div>
<div style="margin-left: 40px">入驻企业名录</div>
</div>
<div class="center-content">
<settled-enterprise :lists="lists" @searchEnt="searchEnt" />
<!-- <div :key="index" class="ent-box" v-for="(item, index) in lists">
<p class="ent-index">{{ index + 1 }}</p>
<span class="ent-name" style="margin-left: 50px">{{ item.company }}</span>
<span class="ent-mainBusiness" style="margin-left: 50px">{{ item.mainBusiness }}</span>
</div>-->
</div>
</div>
</div>
</template>
<script>
import HNav from '../../components/HNav.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
// import AddModel from './../../components/AddModel.vue';
import SettledModel from 'components/Introduce/SettledModel.vue';
import Banner from 'components/Banner/Banner.vue';
import SettledEnterprise from 'components/SettledEnterprise/SettledEnterprise.vue';
import { searchEnt } from 'config/api';
export default {
name: 'EntitySpace',
components: { HNav, BreadCrumb, SettledModel, Banner, SettledEnterprise },
data() {
return {
title: '实体众创空间',
arr: [
{ name: '孵化平台', url: '/IncubationPlatform/MakerSpace' },
{ name: '众创空间', url: '/IncubationPlatform/MakerSpace' },
{ name: '实体众创空间', url: '' },
],
list: [],
pageSize: 18,
current: 1,
lists: [],
};
},
beforeRouteEnter(to, from, next) {
if (from.path === '/login' || from.path === '/register') {
return next(vm => {
vm.$refs.childModel.showModal();
});
}
next();
},
created() {
console.log(this.$router);
this.searchEnt();
},
methods: {
//
onShowSizeChange(current, size) {
this.current = current;
},
async searchEnt(business) {
try {
const params = { param: { placeType: 1, company: business ? business : '' } };
const res = await searchEnt(params);
const { code, msg, data } = res.data;
if (code === 200) {
this.lists = data;
} else {
this.$message.error('查询失败');
}
} catch (error) {
this.$message.error('查询失败');
}
},
},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 10px auto 15px;
}
.center-btn {
position: absolute;
left: 26.2%;
bottom: 100px;
}
.pagination {
float: right;
}
.c-box {
background: none !important;
}
.big-btn {
width: 213px;
height: 166px;
background: #13ACC4;
opacity: 1;
}
.big-con {
width: 96px;
height: 31px;
font-size: 24px;
font-family: Microsoft YaHei;
font-weight: bold;
line-height: 31px;
color: #FFFFFF;
opacity: 1;
}
.margin-0 {
margin-right: 0 !important;
}
.ent-box {
width: 100%;
margin-right: 11%;
position: relative;
height: 56px;
line-height: 56px;
padding: 0 14px;
background: #FFFFFF;
box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.16);
opacity: 1;
margin-bottom: 20px;
}
.ent-index {
width: 28px;
position: absolute;
top: 14px;
line-height: 28px;
text-align: center;
font-size: 20px;
font-family: Segoe UI;
color: #FFFFFF;
height: 28px;
border-radius: 50%;
background: #13ACC4;
margin-bottom: 0;
}
.ent-name {
position: absolute;
left: 0;
width: 50%;
height: 24px;
top: 50%;
margin-top: -12px;
font-size: 22px;
font-family: Microsoft YaHei;
font-weight: bold;
line-height: 24px;
color: rgba(0, 0, 0, 0.65);
opacity: 1;
overflow: hidden;
}
.ent-mainBusiness {
position: absolute;
left: 60%;
width: 30%;
height: 24px;
top: 50%;
margin-top: -12px;
font-size: 22px;
font-family: Microsoft YaHei;
font-weight: bold;
line-height: 24px;
color: rgba(0, 0, 0, 0.65);
opacity: 1;
overflow: hidden;
}
.reg-box {
position: absolute;
left: 26.2%;
bottom: 100px;
width: 64.8%;
overflow: hidden;
}
.join-us-box {
width: 100%;
position: relative;
.material-box {
width: 100%;
height: 88px;
position: absolute;
top: 0px;
left: 0px;
.material {
width: 10%;
height: 100%;
}
}
}
.add-mol {
position: absolute;
bottom: 7%;
left: 25%;
}
.set-mol {
position: absolute;
bottom: 7%;
left: 33%;
}
@media only screen and (max-width: 1500px) {
.set-mol {
left: 35%;
}
}
@media only screen and (max-width: 950px) {
.set-mol {
left: 40%;
}
}
.center-img {
width: 79%;
}
</style>

69
src/views/IncubationPlatform/Children/place/InformationFilling.vue

@ -1,69 +0,0 @@
<!--
* @Author: wally
* @email: 18603454788@163.com
* @Date: 2021-04-19 14:42:52
* @LastEditors: wally
* @LastEditTime: 2021-04-19 14:58:46
-->
<template>
<div>
<h-nav />
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<div class="inner">
<div style="border: 1px solid #e8e8e8;">
<div class="white" id="custom-mount" style="min-height: 600px"></div>
</div>
</div>
</div>
</template>
<script>
import HNav from '../../components/HNav.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
import WebOfficeSDK from '@/assets/js/web-office-sdk-v1.1.2.es.js';
export default {
name: 'InformationFilling',
components: { HNav, BreadCrumb },
data() {
return {
arr: [
{ name: '孵化平台', url: '/IncubationPlatform/MakerSpace' },
{ name: '众创空间', url: '/IncubationPlatform/MakerSpace' },
{ name: '统计信息填报', url: '' },
],
};
},
mounted() {
this.mountWps();
},
methods: {
/**
* 加载wps页面
* @param {string} url 服务端返回的wps在线文档路径
*/
mountWps() {
console.log('加载wps页面');
const url =
'https://wwo.wps.cn/office/s/1380475802910593024?_w_appid=09d77d2eb919438e8ae4f2a9ec6ec8dd' +
'&_w_signature=J7Yp09rUDuRqql9Gcp5ZKvaH2e4%3D&_w_token=eyJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2MTg' +
'4MTM5NDksInN1YiI6IjEzODE1NDgyNzExNjc3Mzc4NTciLCJhdXRoSWQiOiIxMzgxNTQ4MjcxMTcxOTMyMTYxIiwiZ' +
'XhwIjoxNjUwMzQ5OTQ5fQ.0gL0RM1AmInHeIlku_LYHvReLbR54mAffc46Yqd4gWU';
var demo = WebOfficeSDK.config({
mount: document.getElementById('custom-mount'),
url,
});
},
},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 10px auto 15px;
}
</style>

258
src/views/IncubationPlatform/Children/place/VirtualSpace.vue

@ -1,258 +0,0 @@
<template>
<div>
<h-nav />
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<div class="top-box">
<banner :show-page="48" />
<!-- <add-model :value="3" class="add-mol" style="height: 32px" /> -->
<settled-model :type-num="0" class="add-mol" ref="childModel" style="height: 32px" />
<a-button
@click="$router.push('/IncubationPlatform/MakerSpace/InformationFilling')"
class="set-mol"
type="primary"
>统计信息填报</a-button>
</div>
<div class="center-box c-box" style="margin-bottom: 160px">
<div class="center-title" style="top: 105px;">
<div class="circular"></div>
<div style="margin-left: 40px">入驻企业名录</div>
</div>
<div class="center-content">
<settled-enterprise :lists="lists" @searchEnt="searchEnt" />
</div>
</div>
</div>
</template>
<script>
import HNav from '../../components/HNav.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
// import AddModel from './../../components/AddModel.vue';
import SettledModel from 'components/Introduce/SettledModel.vue';
import Banner from 'components/Banner/Banner.vue';
import { searchEnt } from 'config/api';
import SettledEnterprise from 'components/SettledEnterprise/SettledEnterprise.vue';
export default {
name: 'VirtualSpace',
components: { HNav, BreadCrumb, SettledModel, Banner, SettledEnterprise },
data() {
return {
title: '虚拟众创空间',
arr: [
{ name: '孵化平台', url: '/IncubationPlatform/MakerSpace' },
{ name: '众创空间', url: '/IncubationPlatform/MakerSpace' },
{ name: '虚拟众创空间', url: '' },
],
list: [],
pageSize: 18,
current: 1,
lists: [],
isShowModel: 0,
};
},
beforeRouteEnter(to, from, next) {
if (from.path === '/login' || from.path === '/register') {
return next(vm => {
vm.$refs.childModel.showModal();
});
}
next();
},
created() {
this.searchEnt();
},
methods: {
//
onShowSizeChange(current, size) {
this.current = current;
},
async searchEnt(business) {
try {
const params = { param: { placeType: 0, company: business ? business : '' } };
const res = await searchEnt(params);
const { code, msg, data } = res.data;
if (code === 200) {
this.lists = data;
} else {
this.$message.error('查询失败');
}
} catch (error) {
this.$message.error('查询失败');
}
},
},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 10px auto 15px;
}
.center-btn {
position: absolute;
left: 26.2%;
bottom: 100px;
}
.pagination {
float: right;
}
.c-box {
background: none !important;
}
.big-btn {
width: 213px;
height: 166px;
background: #13ACC4;
opacity: 1;
}
.big-con {
width: 96px;
height: 31px;
font-size: 24px;
font-family: Microsoft YaHei;
font-weight: bold;
line-height: 31px;
color: #FFFFFF;
opacity: 1;
}
.margin-0 {
margin-right: 0 !important;
}
.ent-box {
width: 100%;
margin-right: 11%;
position: relative;
height: 56px;
line-height: 56px;
padding: 0 14px;
background: #FFFFFF;
box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.16);
opacity: 1;
margin-bottom: 20px;
}
.ent-index {
width: 28px;
position: absolute;
top: 14px;
line-height: 28px;
text-align: center;
font-size: 20px;
font-family: Segoe UI;
color: #FFFFFF;
height: 28px;
border-radius: 50%;
background: #13ACC4;
margin-bottom: 0;
}
.ent-name {
font-size: 20px;
font-family: Microsoft YaHei;
font-weight: bold;
line-height: 24px;
color: rgba(0, 0, 0, 0.65);
opacity: 1;
}
.ent-name {
position: absolute;
left: 0;
width: 30%;
height: 24px;
top: 50%;
margin-top: -12px;
font-size: 22px;
font-family: Microsoft YaHei;
font-weight: bold;
line-height: 24px;
color: rgba(0, 0, 0, 0.65);
opacity: 1;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
}
.ent-mainBusiness {
position: absolute;
left: 35%;
width: 20%;
height: 24px;
top: 50%;
margin-top: -12px;
font-size: 22px;
font-family: Microsoft YaHei;
font-weight: bold;
line-height: 24px;
color: rgba(0, 0, 0, 0.65);
opacity: 1;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
}
.reg-box {
position: absolute;
left: 26.2%;
bottom: 100px;
width: 64.8%;
overflow: hidden;
}
.join-us-box {
width: 100%;
position: relative;
.material-box {
width: 100%;
height: 88px;
position: absolute;
top: 0px;
left: 0px;
.material {
width: 10%;
height: 100%;
}
}
}
.add-mol {
position: absolute;
bottom: 7%;
left: 25%;
}
.set-mol {
position: absolute;
bottom: 7%;
left: 33%;
}
@media only screen and (max-width: 1500px) {
.set-mol {
left: 35%;
}
}
@media only screen and (max-width: 950px) {
.set-mol {
left: 40%;
}
}
</style>

14
src/views/IncubationPlatform/IncubationPlatform.vue

@ -1,14 +0,0 @@
<template>
<div>
<router-view></router-view>
</div>
</template>
<script>
export default {
name: 'IncubationPlatform',
data() {
return {};
},
};
</script>

228
src/views/IncubationPlatform/components/AddModel.vue

@ -1,228 +0,0 @@
<template>
<div>
<a-button @click="showModal" style="height: 100%; width: 100%" type="primary" v-if="value !== 1">{{ str }}</a-button>
<a-modal :confirm-loading="confirmLoading" :title="title" :visible="visible" @cancel="handleCancel" @ok="handleOk" width="50%">
<p style="text-align: center" v-show="value === 1">
<a-radio-group style="margin-bottom: 20px !important" v-model="platform.val">
<a-radio :value="2" style="margin-right: 100px">实体空间</a-radio>
<a-radio :value="3">虚拟空间</a-radio>
</a-radio-group>
</p>
<a-form :form="form">
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="公司名称">
<a-input placeholder="请输入公司名称..." v-model.trim="platform.companyName" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="联系人" required>
<a-input placeholder="请输入联系人..." v-model.trim="platform.manName" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="联系电话" required>
<a-input @change="changePhone" placeholder="请输入联系电话.." type="tel" v-decorator="['tel', { rules: phoneRules }]" />
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="图片验证码" required>
<div class="d-flex flex-nowrap">
<a-input placeholder="图片验证码" type="number" v-model="codeNum" />
<img :src="picCode.imageBase64" @click="changePicCode" class="code_img ml-2" v-if="picCode && picCode.imageBase64" />
<a-button @click="changePicCode" class="code_img ml-2" size="small" v-else>获取验证码</a-button>
<!-- <a-input v-decorator="['account', { rules: rules.account }]" /> -->
</div>
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="短信验证码" required>
<div class="d-flex flex-nowrap">
<a-input placeholder="请输入验证码" type="number" v-model="platform.code" />
<a-button class="code_img ml-2" disabled type="primary" v-if="showInterval">重新发送 {{ interval }}</a-button>
<a-button :disabled="platform.isTel === false" @click="getCode" class="code_img ml-2" type="primary" v-else>
获取验证码
</a-button>
</div>
</a-form-item>
<a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="合作信息简述">
<a-textarea placeholder="请输入合作信息简述..." style="height: 120px" v-model.trim="platform.describe" />
</a-form-item>
</a-form>
</a-modal>
</div>
</template>
<script>
import { mapState, mapActions } from 'vuex';
import { JoinPlatform } from 'config/api';
const formItemLayout = {
labelCol: { span: 5 },
wrapperCol: { span: 18 },
};
const formTailLayout = {
labelCol: { span: 6 },
wrapperCol: { span: 18, offset: 6 },
};
export default {
name: 'AddModel',
props: {
value: {
type: Number,
default: 1,
},
},
data() {
return {
form: this.$form.createForm(this, { name: 'submit' }),
visible: false,
title: '申请加入',
str: '加入我们',
formItemLayout,
formTailLayout,
confirmLoading: false,
platform: {
companyName: '', //
manName: '', //
tel: '', //
describe: '', //
code: '', //
val: 0,
isTel: false,
},
codeRules: [
{ required: true, message: '请输入验证码' },
{ min: 4, max: 4, message: '请输入4位短信验证码' },
],
codeNum: '',
showInterval: false,
codeTimer: null,
interval: 120, //
phoneRules: [
{ required: true, pattern: new RegExp(/^[1][3,4,5,6,7,8,9][0-9]{9}$/), whitespace: true, message: '请输入正确的手机号' },
],
};
},
computed: mapState('user', ['picCode']),
async created() {
this.sendPicCode();
await this.getUserSer();
if (this.userSer) {
if (this.userSer.name) {
this.platform.manName = this.userSer.name;
}
if (this.userSer.phone) {
this.platform.tel = this.userSer.phone;
}
if (this.userSer.companyName) {
this.platform.companyName = this.userSer.companyName;
}
}
},
methods: {
...mapActions('user', ['sendCode', 'sendPicCode']),
...mapActions('home', ['getUserSer']),
//
showModal() {
this.visible = true;
},
//
handleCancel(e) {
this.visible = false;
},
//
changePhone(e) {
this.platform.tel = e.target.value;
this.platform.isTel = /^[1][3,4,5,6,7,8,9][0-9]{9}$/.test(this.platform.tel);
},
//
handleOk() {
if (!this.platform.manName) {
this.$message.error('请输入联系人');
} else if (!this.platform.tel) {
this.$message.error('请输入联系电话');
} else if (!this.platform.code) {
this.$message.error('请输入验证码');
} else if (!this.platform.val) {
this.$message.error('请选择孵化器');
} else {
if (this.platform.isTel) {
this.subMitAdd();
} else {
this.$message.error('请输入正确的联系电话');
}
}
},
//
async subMitAdd() {
this.confirmLoading = true;
try {
const params = {
param: {
code: this.platform.code,
companyName: this.platform.companyName,
contactName: this.platform.manName,
contactPhone: this.platform.tel,
description: this.platform.describe,
type: this.platform.val,
},
};
const res = await JoinPlatform(params);
const { code, msg, data } = res.data;
if (code === 200) {
this.$message.success('申请成功');
this.visible = false;
this.confirmLoading = false;
for (let key in this.platform) {
this.platform[key] = '';
}
this.platform.isTel = false;
} else {
throw msg;
this.confirmLoading = false;
}
} catch (error) {
this.$message.error(error);
this.confirmLoading = false;
}
},
//
async getCode() {
// console.log(111);
try {
const params = {
phone: this.platform.tel,
verificationCodeId: this.picCode.verificationCodeId,
verificationCodeValue: this.codeNum,
};
await this.sendCode(params);
this.getCodeInterval();
} catch (error) {
// throw new Error(`SignIn.vue method getCode: ${error}`);
// console.log(error);
}
},
//
getCodeInterval() {
this.showInterval = true;
this.codeTimer = setInterval(() => {
if (this.interval === 0) {
clearInterval(this.codeTimer);
this.codeTimer = null;
this.showInterval = false;
this.interval = 120;
return;
}
this.interval = this.interval - 1;
}, 1000);
},
//
changePicCode() {
this.sendPicCode();
},
},
};
</script>
<style lang="stylus" scoped>
.must-color {
color: red;
}
.code_img {
height: 32px;
width: 120px;
}
</style>

68
src/views/IncubationPlatform/components/HNav.vue

@ -1,68 +0,0 @@
<template>
<div class="nav-box d-flex">
<div
:class="activeNum === index ? 'nav-box-active' : ''"
:key="index"
@click="jump(item.url)"
v-for="(item, index) in list"
>{{ item.title }}</div>
</div>
</template>
<script>
export default {
name: 'HNav',
data() {
return {
activeNum: 0,
list: [
{
title: '众创空间',
url: '/IncubationPlatform/MakerSpace',
},
// {
// title: '',
// url: '/IncubationPlatform/PublicLaboratory',
// },
// {
// title: '',
// url: '/IncubationPlatform/PilotBase',
// },
// {
// title: '',
// url: '/IncubationPlatform/Tutor',
// },
{
title: '创业服务',
url: '/IncubationPlatform/Services',
},
{
title: '产品展示',
url: '/IncubationPlatform/Products',
},
],
};
},
created() {
console.log();
if (this.$route.fullPath === '/IncubationPlatform/Services') {
this.activeNum = 1;
} else if (this.$route.fullPath === '/IncubationPlatform/Products') {
this.activeNum = 2;
} else {
this.activeNum = 0;
}
},
methods: {
jump(url) {
if (this.$route.fullPath === url) {
// this.$message.success('');
} else {
this.$router.push(url);
}
},
},
};
</script>
<style lang="stylus" scoped></style>

37
src/views/Industry/Children/Enterprise.vue

@ -1,37 +0,0 @@
<template>
<div>
<h-nav />
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<div>
<derive-enterprise :title="title" :type-of-platform="typeOfPlatform" />
</div>
</div>
</template>
<script>
import HNav from './components/HNav.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
import DeriveEnterprise from 'components/Introduce/DeriveEnterprise.vue';
export default {
name: 'Enterprise',
components: { HNav, BreadCrumb, DeriveEnterprise },
data() {
return {
title: '衍生企业',
typeOfPlatform: '产业平台',
arr: [
{ name: '产业平台', url: '/Challenge/Union' },
{ name: '衍生企业', url: '' },
],
};
},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 10px auto 15px;
}
</style>

427
src/views/Industry/Children/Serve.vue

@ -1,427 +0,0 @@
<template>
<div>
<h-nav />
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<banner :show-page="showPage" />
<div class="flow-path" style="padding: 15px 9%;">
<div class="flow-title" style="top: 30%;">服务流程</div>
<div class="flow-content">
<img src="~assets/image.png" style="width: 100%" />
</div>
</div>
<div class="inner d-flex flex-wrap" style="margin: 20px auto">
<div
:class="(index + 1) % 3 === 0 ? 'margin-0' : ''"
:key="index"
class="item-box mb-8"
v-for="(item, index) in list"
>
<img
:src="item.picUrl"
@click="showModal(item.id)"
style="height: 220px; width: 100%; border: 1px solid #ccc"
/>
<p @click="showModal(item.id)" class="font-24 my-4" style="text-align: center">
<span>{{ item.name }}</span>
</p>
<div v-if="item.intro.length>45" class="font-16 textColor item-intro mb-2">
{{ item.intro.slice(0,45) }}
<a-button
@click="showIntro(index)"
class="font-16 baseColor"
type="link"
style="height:20px;float:right;padding:0px"
>
more
<a-icon style="font-size:12px" type="right" />
</a-button>
</div>
<div v-if="item.intro.length<=45" class="font-16 textColor item-intro">
<p>{{ item.intro }}</p>
</div>
<!-- <p
@click="jump(item.id)"
class="font-16 baseColor"
style="text-align: right; cursor: pointer"
>了解更多</p>-->
</div>
</div>
<a-modal v-model="showModelIntro" :footer="null">
<p class="mt-3"> {{ modelIntro }} </p>
</a-modal>
<a-modal
:confirm-loading="confirmLoading"
:visible="visible"
@cancel="handleCancel"
@ok="handleOk"
title="技术需求"
width="50%"
>
<a-form :form="form">
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="公司名称"
>
<a-input placeholder="请输入公司名称..." v-model.trim="platform.companyName" />
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="联系人"
required
>
<a-input placeholder="请输入联系人..." v-model.trim="platform.manName" />
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="联系电话"
required
>
<a-input
@change="changePhone"
placeholder="请输入联系电话.."
type="tel"
v-decorator="['tel', { rules: phoneRules }]"
/>
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="图片验证码"
required
>
<div class="d-flex flex-nowrap">
<a-input placeholder="图片验证码" type="number" v-model="codeNum" />
<img
:src="picCode.imageBase64"
@click="changePicCode"
class="code_img ml-2"
v-if="picCode && picCode.imageBase64"
/>
<a-button @click="changePicCode" class="code_img ml-2" size="small" v-else>获取验证码</a-button>
<!-- <a-input v-decorator="['account', { rules: rules.account }]" /> -->
</div>
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="短信验证码"
required
>
<div class="d-flex flex-nowrap">
<a-input placeholder="请输入验证码" type="number" v-model="platform.code" />
<a-button
class="code_img ml-2"
disabled
type="primary"
v-if="showInterval"
>重新发送 {{ interval }}</a-button>
<a-button
:disabled="platform.isTel === false"
@click="getCode"
class="code_img ml-2"
type="primary"
v-else
>获取验证码</a-button>
</div>
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="需求描述"
>
<a-textarea
placeholder="请输入需求描述..."
style="height: 120px"
v-model.trim="platform.describe"
/>
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="上传附件"
v-show="typeData.type === 0"
>
<a-upload
:action="action"
:before-upload="beforeUpload"
:default-file-list="fileList"
@change="fileChange"
list-type="picture"
name="files"
>
<a-button>
<a-icon type="upload" />点击上传附件
</a-button>
</a-upload>
</a-form-item>
</a-form>
</a-modal>
</div>
</template>
<script>
import { mapMutations, mapState, mapActions } from 'vuex';
import { selService, serviceApply, upload } from 'config/api';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
import Banner from 'components/Banner/Banner.vue';
import HNav from './components/HNav.vue';
const formItemLayout = {
labelCol: { span: 5 },
wrapperCol: { span: 18 },
};
const formTailLayout = {
labelCol: { span: 6 },
wrapperCol: { span: 18, offset: 6 },
};
export default {
name: 'Serve',
components: { HNav, Banner, BreadCrumb },
data() {
return {
title: '产业服务',
typeOfPlatform: '产业平台',
arr: [
{ name: '产业平台', url: '/Challenge/Union' },
{ name: '产业服务', url: '/Industry/Serve' },
],
showPage: 52,
list: [],
current: 1,
pageSize: 8,
total: 0,
form: this.$form.createForm(this, { name: 'submit' }),
action: upload,
fileList: [],
visible: false,
formItemLayout,
formTailLayout,
confirmLoading: false,
platform: {
companyName: '', //
manName: '', //
tel: '', //
describe: '', //
code: '', //
files: [], // Id
isTel: false,
},
codeRules: [
{ required: true, message: '请输入验证码' },
{ min: 4, max: 4, message: '请输入4位短信验证码' },
],
codeNum: '',
showInterval: false,
codeTimer: null,
interval: 120, //
phoneRules: [
{ required: true, pattern: new RegExp(/^[1][3,4,5,6,7,8,9][0-9]{9}$/), whitespace: true, message: '请输入正确的手机号' },
],
typeData: {
type: 0,
id: '',
},
showModelIntro: false,
modelIntro: ''
};
},
computed: mapState('user', ['picCode']),
async created() {
this.getService();
this.sendPicCode();
await this.getUserSer();
if (this.userSer) {
if (this.userSer.name) {
this.platform.manName = this.userSer.name;
}
if (this.userSer.phone) {
this.platform.tel = this.userSer.phone;
}
if (this.userSer.companyName) {
this.platform.companyName = this.userSer.companyName;
}
}
},
methods: {
...mapMutations('home', ['setServiceArr']),
...mapActions('user', ['sendCode', 'sendPicCode']),
...mapActions('home', ['getUserSer']),
showIntro(index){
this.showModelIntro = true
this.modelIntro = this.list[index].intro
},
//
async getService() {
try {
const params = { param: { serviceType: 3 } };
const res = await selService(params);
const { code, data, msg } = res.data;
if (code === 200) {
this.list = data;
}
} catch (error) {
console.log(data);
}
},
//
showModal(id) {
this.typeData.id = id;
this.visible = true;
},
//
handleCancel(e) {
this.visible = false;
},
//
changePhone(e) {
this.platform.tel = e.target.value;
this.platform.isTel = /^[1][3,4,5,6,7,8,9][0-9]{9}$/.test(this.platform.tel);
},
//
handleOk() {
if (!this.platform.manName) {
this.$message.error('请输入联系人');
} else if (!this.platform.tel) {
this.$message.error('请输入联系电话');
} else if (!this.platform.code) {
this.$message.error('请输入验证码');
} else {
if (this.platform.isTel) {
for (var i = 0; i < this.fileList.length; i++) {
this.platform.files = this.platform.files.concat(this.fileList[i].response.data[0].id);
}
this.subMitAdd();
// console.log(this.platform.files);
} else {
this.$message.error('请输入正确的联系电话');
}
}
},
//
async subMitAdd() {
this.confirmLoading = true;
try {
const params = {
param: {
code: this.platform.code,
companyName: this.platform.companyName,
contactName: this.platform.manName,
contactPhone: this.platform.tel,
description: this.platform.describe,
filesId: this.platform.files,
serviceId: this.typeData.Id,
type: this.typeData.type,
},
};
const res = await serviceApply(params);
const { code, msg, data } = res.data;
if (code === 200) {
this.$message.success('申请成功');
this.visible = false;
this.confirmLoading = false;
for (let key in this.platform) {
this.platform[key] = '';
}
this.platform.isTel = false;
} else {
throw msg;
this.confirmLoading = false;
}
} catch (error) {
this.$message.error(error);
this.confirmLoading = false;
}
},
//
async getCode() {
// console.log(111);
try {
const params = {
phone: this.platform.tel,
verificationCodeId: this.picCode.verificationCodeId,
verificationCodeValue: this.codeNum,
};
await this.sendCode(params);
this.getCodeInterval();
} catch (error) {
// throw new Error(`SignIn.vue method getCode: ${error}`);
// console.log(error);
}
},
//
getCodeInterval() {
this.showInterval = true;
this.codeTimer = setInterval(() => {
if (this.interval === 0) {
clearInterval(this.codeTimer);
this.codeTimer = null;
this.showInterval = false;
this.interval = 120;
return;
}
this.interval = this.interval - 1;
}, 1000);
},
//
changePicCode() {
this.sendPicCode();
},
beforeUpload(file) {
return new Promise((resolve, reject) => {
const isLt5M = file.size / 1024 / 1024 < 5;
if (!isLt5M) {
this.$message.warning('上传附件大小不能超过5m!');
return reject(false);
}
return resolve(true);
});
},
fileChange(info) {
this.fileList = info.fileList;
},
},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 10px auto 15px;
}
.pagination {
margin: 40px 0;
text-align: right;
}
.item-box {
position: relative;
width: 26%;
margin-right: 11%;
border-radius: 4px;
}
.margin-0 {
margin-right: 0 !important;
}
.item-content {
display: -webkit-box;
overflow: hidden;
white-space: normal !important;
text-overflow: ellipsis;
word-wrap: break-word;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
height: 60px;
}
</style>

179
src/views/Industry/Children/Union.vue

@ -1,179 +0,0 @@
<template>
<div>
<h-nav />
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<div class="top-box" style="margin-bottom: 100px; min-height: 200px">
<div class="top-title">产业创新联盟</div>
<div class="top-content">
<!-- 山西绿谷生物科技股份有限公司立足功能食品生物医药和大健康产业聚焦创新聚力孵化聚合产业
致力建设集创新链孵化链和产业链为一体产学研协同多学科交叉大中小企业融通
线上线下相结合的融合发展机制和开放式创新创业平台培育打造全链条一体化新型社会研发机构和创新创业生态系统
构筑专业化集群化园区化产业发展新模式和新业态公司秉持创新开放协同融合发展理
赋能健康中国筑梦绿色未来为愿景构建创新创业生态发展特色产业集群打造全链条一体化开放
式创新创业高地为使命大力推动建设共融共生共建 共创价值共同体-->
产业技术创新联盟在建中
</div>
</div>
<!-- <div class="center-box">
<div class="center-title">
<div class="circular"></div>
<div style="margin-left: 40px">加入流程</div>
</div>
<div class="center-content">
山西绿谷生物科技股份有限公司立足功能食品生物医药和大健康产业聚焦创新聚力孵化聚合产业
致力建设集创新链孵化链和产业链为一体产学研协同多学科交叉大中小企业融通
线上线下相结合的融合发展机制和开放式创新创业平台培育打造全链条一体化新型社会研发机构和创新创业生态系统
构筑专业化集群化园区化产业发展新模式和新业态公司秉持创新开放协同融合发展理
赋能健康中国筑梦绿色未来为愿景构建创新创业生态发展特色产业集群打造全链条一体化开放
式创新创业高地为使命大力推动建设共融共生共建 共创价值共同体
</div>
<new-model class="center-btn" />
</div>
<div class="center-box c-box" style="margin-bottom: 160px">
<div class="center-title">
<div class="circular"></div>
<div style="margin-left: 40px">联盟名录</div>
</div>
<div class="center-content">
<div class="d-flex flex-wrap">
<div :class="(index + 1) % 3 === 0 ? 'margin-0' : ''" :key="index" class="ent-box" v-for="(item, index) in lists">
<p class="ent-index">{{ index + 1 }}</p>
<span class="ent-name" style="margin-left: 50px">{{ item }}</span>
</div>
</div>
</div>
<div class="reg-box">
<a-button class style="float: left" type="primary">入驻企业注册</a-button>
<a-pagination
:current="current"
:page-size="pageSize"
:total="lists.length"
@change="onShowSizeChange"
class="pagination"
show-less-items
show-quick-jumper
v-show="lists.length > 18"
/>
</div>
</div>-->
</div>
</template>
<script>
import HNav from './components/HNav.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
// import NewModel from '../../NewPlatform/components/NewModel.vue';
export default {
name: 'Union',
components: { HNav, BreadCrumb },
data() {
return {
title: '产业创新联盟',
typeOfPlatform: '产业平台',
arr: [
{ name: '产业平台', url: '/Challenge/Union' },
{ name: '产业创新联盟', url: '' },
],
list: [],
pageSize: 18,
current: 1,
lists: ['XX企业', 'XX企业', 'XX企业', 'XX企业', 'XX企业', 'XX企业', 'XX企业', 'XX企业', 'XX企业'],
};
},
methods: {
//
onShowSizeChange(current, size) {
this.current = current;
},
},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 10px auto 15px;
}
.center-btn {
position: absolute;
left: 26.2%;
bottom: 100px;
}
.pagination {
float: right;
}
.c-box {
background: none !important;
}
.big-btn {
width: 213px;
height: 166px;
background: #13ACC4;
opacity: 1;
}
.big-con {
width: 96px;
height: 31px;
font-size: 24px;
font-family: Microsoft YaHei;
font-weight: bold;
line-height: 31px;
color: #FFFFFF;
opacity: 1;
}
.margin-0 {
margin-right: 0 !important;
}
.ent-box {
width: 26%;
margin-right: 11%;
position: relative;
height: 56px;
line-height: 56px;
padding: 0 14px;
background: #FFFFFF;
box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.16);
opacity: 1;
margin-bottom: 20px;
}
.ent-index {
width: 28px;
position: absolute;
top: 14px;
line-height: 28px;
text-align: center;
font-size: 20px;
font-family: Segoe UI;
color: #FFFFFF;
height: 28px;
border-radius: 50%;
background: #13ACC4;
margin-bottom: 0;
}
.ent-name {
font-size: 20px;
font-family: Microsoft YaHei;
font-weight: bold;
line-height: 24px;
color: rgba(0, 0, 0, 0.65);
opacity: 1;
}
.reg-box {
position: absolute;
left: 26.2%;
bottom: 100px;
width: 64.8%;
overflow: hidden;
}
</style>

54
src/views/Industry/Children/components/HNav.vue

@ -1,54 +0,0 @@
<template>
<div class="nav-box d-flex">
<div v-for="(item, index) in list" :key="index" :class="activeNum === index ? 'nav-box-active' : ''" @click="jump(item.url)">
{{ item.title }}
</div>
</div>
</template>
<script>
export default {
name: 'HNav',
data() {
return {
str: '导航条',
activeNum: 0,
list: [
{
title: '产业创新联盟',
url: '/Industry/Union',
},
{
title: '产业服务',
url: '/Industry/Serve',
},
{
title: '衍生企业',
url: '/Industry/Enterprise',
},
],
};
},
created() {
console.log();
if (this.$route.fullPath === '/Industry/Serve') {
this.activeNum = 1;
} else if (this.$route.fullPath === '/Industry/Enterprise') {
this.activeNum = 2;
} else {
this.activeNum = 0;
}
},
methods: {
jump(url) {
if (this.$route.fullPath === url) {
this.$message.success('已在当前界面');
} else {
this.$router.push(url);
}
},
},
};
</script>
<style lang="stylus" scoped></style>

14
src/views/Industry/Industry.vue

@ -1,14 +0,0 @@
<template>
<div>
<router-view></router-view>
</div>
</template>
<script>
export default {
name: 'Industry',
data() {
return {};
},
};
</script>

129
src/views/ItInformation/ItDetails.vue

@ -1,129 +0,0 @@
<template>
<div class="box">
<div>
<div class="policy-title">
<span>{{ actDetail.title }}</span>
</div>
<div class="policy-info">
<span>
<a-icon class="baseColor" style="font-size: 14px; margin-right: 10px" type="clock-circle" />
<span>{{ actDetail.time }}</span>
</span>
<span style="margin-left: 60px">
<a-icon class="baseColor" style="margin-right: 10px" type="environment" />
<span>{{ actDetail.site }}</span>
</span>
</div>
<div class="policy-content" v-dompurify-html="actDetail.content"></div>
</div>
</div>
</template>
<script>
import { mapState } from 'vuex';
export default {
name: 'ItDetails',
data() {
return { nowData: '' };
},
computed: mapState('home', ['actDetail']),
created() {
//
var aData = new Date();
// console.log(aData); //Wed Aug 21 2019 10:00:58 GMT+0800 ()
this.nowData =
aData.getFullYear() +
'-' +
(aData.getMonth() + 1) +
'-' +
aData.getDate() +
' ' +
aData.getHours() +
':' +
aData.getMinutes() +
':' +
aData.getSeconds();
// console.log(this.nowData); //2019-8-20
},
methods: {},
};
</script>
<style lang="stylus" scoped>
.box {
width: 1260px;
position: relative;
margin: 80px auto;
background: #fff;
min-height: 1037px;
overflow: hidden;
opacity: 1;
padding-bottom: 480px;
}
.back-btn {
width: 80px;
position: absolute;
right: 0;
}
.policy-title {
height: 120px;
font-size: 24px;
font-family: Microsoft YaHei;
font-weight: 400;
color: rgba(0, 0, 0, 0.85);
opacity: 1;
text-align: center;
display: flex;
align-items: center;
justify-content: center;
padding: 0 150px;
border-bottom: 1px solid #707070;
}
.policy-info {
height: 76px;
line-height: 76px;
text-align: center;
}
.policy-content {
padding: 0 25px;
font-size: 16px;
color: rgba(0, 0, 0, 0.65);
font-weight: 400;
font-family: Microsoft YaHei;
}
.coms-style {
height: 480px;
padding: 25px 0;
border-top: 2px solid #ccc;
position: absolute;
bottom: 0;
width: 100%;
}
.coms-top {
height: 280px;
padding: 0 25px;
overflow: auto;
box-shadow: 0 0 5px #ccc;
}
.coms-btm {
margin-top: 20px;
padding: 0 10px;
}
.coms-content {
background: rgba(19, 172, 196, 0.1);
}
.sub {
position: absolute;
right: 20px;
bottom: 20px;
}
</style>

203
src/views/ItInformation/ItInformation.vue

@ -1,203 +0,0 @@
<!--
Copyright (c) 2020.
author: bin
email: binbin0314@126.com
-->
<template>
<div class="inner">
<div class="policy-box">
<div
:key="index"
class="list-box d-flex flex-row flex-nowrap align-center"
v-for="(item, index) in lists"
>
<div
@click="jumpDetails(item)"
class="date-box d-flex flex-column"
v-if="item.time !== null"
>
<p class="date-mon">{{ monthEnglish[item.time.split('-')[1] - 1] }}.</p>
<p class="date-day">{{ item.time.split(' ')[0].split('-')[2] }}</p>
</div>
<div class="d-flex flex-column flex-1">
<p @click="jumpDetails(item)" class="item-title pointer">{{ item.title }}</p>
<div class="d-flex flex-nowrap justify-space-between">
<p class="source-time">
<span class="source" v-if="item.time !== null">时间{{ item.time }}</span>
<span class="source" v-if="item.site">地点{{ item.site }}</span>
</p>
</div>
</div>
</div>
</div>
<a-pagination
:current="current"
:page-size="pageSize"
:total="total"
@change="onShowSizeChange"
class="pagination"
show-less-items
show-quick-jumper
v-show="total > 5"
/>
</div>
</template>
<script>
import { mapState, mapMutations } from 'vuex';
import { industryInfo } from 'config/api';
export default {
name: 'ItInformation',
data() {
return {
str: '这是行业资讯界面',
lists: [],
total: 0,
pageSize: 20,
current: 1,
monthEnglish: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Spt', 'Oct', 'Nov', 'Dec'],
};
},
created() {
this.getData();
},
methods: {
...mapMutations('home', ['setActDetail']),
async getData() {
try {
const params = {
param: {
pageNum: this.current,
pageSize: this.pageSize,
},
};
const res = await industryInfo(params);
const { code, data, msg } = res.data;
if (code === 200) {
this.lists = data.list;
this.total = parseInt(data.total);
} else {
// console.log(msg);
}
} catch (error) {
this.$message.error(error);
}
},
onShowSizeChange(current) {
this.current = current;
this.getData();
},
//
jumpDetails(item) {
this.setActDetail(item);
this.$router.push('/ItDetails');
},
},
};
</script>
<style scoped lang="stylus">
.inner {
margin: 40px auto;
}
.policy-box {
.list-box {
width: 100%;
overflow: hidden;
background: #fff;
box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.16);
margin-top: 24px;
padding: 10px 25px;
}
}
.item-title {
margin-bottom: 10px;
font-size: 24px;
color: rgba(0, 0, 0, 0.65);
font-family: Microsoft YaHei;
font-weight: bold;
}
.item-content {
text-indent: 2em;
font-size: 16px;
line-height: 36px;
color: rgba(0, 0, 0, 0.35);
font-family: Microsoft YaHei;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.source {
cursor: pointer;
font-family: Microsoft YaHei;
font-weight: 400;
opacity: 1;
margin-right: 24px;
}
.time {
font-size: 14px;
font-family: Microsoft YaHei;
font-weight: 400;
color: rgba(0, 0, 0, 0.25);
opacity: 1;
}
.original {
font-size: 14px;
font-family: Microsoft YaHei;
font-weight: 400;
line-height: 22px;
opacity: 1;
margin-bottom: 0;
span {
cursor: pointer;
}
}
.date-box {
width: 160px !important;
text-align: center;
box-shadow: none !important;
margin-top: 0 !important;
padding: 0 !important;
p {
margin-bottom: 0 !important;
}
}
.date-mon {
font-size: 26px;
height: 26px;
line-height: 26px;
font-weight: 500;
color: #13ACC4;
}
.date-day {
font-size: 46px;
height: 56px;
line-height: 56px;
font-weight: bold;
color: #13ACC4;
}
.source-time {
margin-bottom: 0;
}
.pagination {
margin-top: 68px;
text-align: right;
}
</style>

48
src/views/Knowledge/Knowledge.vue

@ -1,48 +0,0 @@
<!--
* @Author: wally
* @email: 18603454788@163.com
* @Date: 2021-01-13 17:21:29
* @LastEditors: wally
* @LastEditTime: 2021-01-20 15:17:25
-->
<template>
<div>
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<div class="dev-box">
<img src="~assets/build.png" />
</div>
</div>
</template>
<script>
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
export default {
name: 'Knowledge',
components: { BreadCrumb },
data() {
return {
str: '知识培训服务平台',
title: '知识平台',
typeOfPlatform: '知识平台',
arr: [{ name: '知识平台', url: '/Knowledge' }],
list: [],
};
},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 20px auto;
}
.dev-box {
width: 100%;
img {
width: 100%;
}
}
</style>

170
src/views/NewPlatform/Children/AchDet.vue

@ -1,170 +0,0 @@
<template>
<div>
<div class="inner" style="margin-top: 40px">
<bread-crumb :arr="arr" />
</div>
<div class="inner equ-box">
<div class="equ-info d-flex">
<img :src="obj.visitLocation" />
<div class="equ-info-box mb-5">
<p class="equ-name">{{ obj.name }}</p>
<div class="d-flex flex-wrap">
<div class="equ-info-left" style="width: 100px">
<p>成果名字</p>
<p>专利类型</p>
<p>专利号</p>
<p>联系人</p>
<p>联系方式</p>
</div>
<div style="width: 500px">
<p>{{ obj.registerName }}</p>
<p>{{ obj.style }}</p>
<p>{{ obj.registerNum }}</p>
<p>
<span :key="index" v-for="(item, index) in obj.selPeoList">
{{ item.contactsName }}
<span v-if="index < obj.selPeoList.length - 1">,</span>
</span>
</p>
<p>
<span :key="index" v-for="(item, index) in obj.selPeoList">
{{ item.contactsPhone }}
<span v-if="index < obj.selPeoList.length - 1">,</span>
</span>
</p>
</div>
</div>
<div class="equ-btn">
<!-- <a-button style="margin-right: 20px">转化意向</a-button> -->
<intention-model
:btn-name="btnName"
:type-data="typeData"
style="margin-right: 20px; float: left"
/>
<!-- <a-button type="primary">加入购物车</a-button> -->
<add-shopping :type-data="typeData" style="margin-right: 20px; float: right" />
</div>
</div>
</div>
<div class="content-box">
<div v-dompurify-html="obj.content"></div>
</div>
</div>
</div>
</template>
<script>
import { mapState } from 'vuex';
import { selResMes } from 'config/api';
import IntentionModel from 'components/Introduce/IntentionModel.vue';
import AddShopping from 'components/Introduce/AddShopping.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
export default {
name: 'AchDet',
components: { IntentionModel, AddShopping, BreadCrumb },
data() {
return {
typeOfPlatform: '成果详情',
arr: [
{ name: '创新平台', url: '/NewPlatform/NewCore' },
{ name: '创新资源平台', url: '/NewPlatform/News' },
{ name: '知识产权与技术转移转化服务平台', url: '/NewPlatform/Transfer' },
{ name: '成果详情', url: '' },
],
obj: {},
typeData: {
type: 2,
Id: '',
},
btnName: '产品购买',
};
},
computed: mapState('home', ['achId']),
created() {
this.typeData.Id = this.achId;
this.getData();
},
methods: {
async getData() {
try {
const params = { param: { id: this.achId } };
const res = await selResMes(params);
const { code, data, msg } = res.data;
if (code === 200) {
// console.log(data);
this.obj = data;
}
} catch (error) {
// console.log(error);
}
},
},
};
</script>
<style lang="stylus" scoped>
.equ-box {
background: #fff;
padding: 20px;
margin: 30px auto;
}
.equ-info {
border-bottom: 1px solid rgba(0, 0, 0, 0.14901960784313725);
position: relative;
img {
width: 300px;
height: 300px;
}
}
.equ-name {
font-size: 24px;
font-family: Microsoft YaHei;
font-weight: bold;
line-height: 31px;
color: rgba(0, 0, 0, 0.85);
opacity: 1;
}
.equ-info-box {
position: relative;
font-size: 16px;
margin-left: 20px;
height: 300px;
font-family: Microsoft YaHei;
font-weight: 400;
color: rgba(0, 0, 0, 0.65);
opacity: 1;
p {
margin-bottom: 6px;
}
}
.equ-info-left {
font-size: 16px;
font-family: Microsoft YaHei;
font-weight: 400;
color: rgba(0, 0, 0, 0.45);
opacity: 1;
p {
margin-bottom: 6px;
}
}
.equ-btn {
position: absolute;
bottom: 0;
}
.content-box {
min-height: 400px;
padding: 20px;
font-size: 16px;
color: rgba(0, 0, 0, 0.65);
}
</style>

246
src/views/NewPlatform/Children/Core.vue

@ -1,246 +0,0 @@
<template>
<div>
<h-nav />
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<div class="top-box">
<div class="top-title">
协同创新中心
<new-model ref="childModel" />
</div>
<div class="top-content">
<!-- <div class="white pa-5 my-5"> -->
<core-organ :title="title" />
<!-- </div> -->
</div>
</div>
<!-- <div class="center-box">
<div class="center-title">
<div class="circular"></div>
<div style="margin-left: 40px">组织机构</div>
</div>
<div class="center-content">
<rich-text :title="title1" />
</div>
</div>-->
<div class="bottom-box white">
<div class="bottom-title">
<div class="circular"></div>
<div style="margin-left: 40px">中心架构</div>
</div>
<div class="bottom-content">
<div :style="{ height: '500px' }" id="treeChart"></div>
<div class="absolute-box" style="top: 2.5%" v-if="showDiv">
<div class="case"></div>
<div class="d-flex flex-column">
<div class="mb-8">科技资源共享服务平台</div>
<div class="mb-8">知识产权与技术转移转化服务平台</div>
<div>知识培训与科技人才服务平台</div>
</div>
</div>
</div>
</div>
<!-- <div class="partner-box">
<div class="partner-title">
<div class="circular"></div>
<div style="margin-left: 40px">合作伙伴</div>
</div>
<div class="partner-content">
<de-ent />
</div>
</div>-->
<!-- <div class="join-box">
<div class="join-title">
<div class="circular"></div>
<div style="margin-left: 40px">申请加入</div>
</div>
<div class="join-content">
申请加入
<div>
<new-model />
</div>
</div>
</div>-->
</div>
</template>
<script>
import '@/common/platform.styl';
import HNav from './../components/HNav.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
// import DeEnt from './components/DeEnt.vue';
import NewModel from './../components/NewModel.vue';
// import RichText from 'components/Introduce/RichText.vue';
import CoreOrgan from 'components/CoreOrgan/CoreOrgan.vue';
export default {
name: 'Core',
components: { HNav, BreadCrumb, NewModel, CoreOrgan },
data() {
return {
str: '这是中心界面',
title: '创新平台-协同创新中心',
title1: '创新平台-组织机构',
typeOfPlatform: '创新平台',
arr: [
{ name: '创新平台', url: '/NewPlatform/NewCore' },
{ name: '协同创新中心', url: '' },
],
showDiv: true,
list: [],
treedata: [
{
//[]
name: '协同创新中心',
children: [
{
name: '功能食品协同创新平台',
collapsed: false,
children: [
{ name: '功能食品资源开发' },
{ name: '营养健康功能因子分再鉴定及作用机制探究' },
{ name: '功能食品关键加工技术研发' },
{ name: '功能食品安全评价与风险监测' },
],
},
{
name: '现代医药协同创新平台',
collapsed: false,
children: [
{ name: '中医药与天然药物资源开发利用' },
{ name: '医药生物先进技术' },
{ name: '创新药物研发' },
{ name: '药理药效研究与安全评价' },
],
},
{
name: '生物医学工程协同创新平台',
collapsed: false,
children: [{ name: '生物信息技术' }, { name: '生物医学工程研发' }, { name: '生物力学和生物材料' }],
},
{
name: '数字健康开发协同创新平台',
collapsed: false,
children: [{ name: '生物医学成像与图像处理' }, { name: '传染病预测预警数字技术' }],
},
],
},
],
};
},
beforeRouteEnter(to, from, next) {
if (from.path === '/login' || from.path === '/register') {
return next(vm => {
vm.$refs.childModel.showModal();
});
}
next();
},
mounted() {
this.showChart();
},
methods: {
showChart() {
// domecharts
var myChart = this.$echarts.init(document.getElementById('treeChart'));
//
// myChart.on('click', this.clickFun);
//
var option = {
tooltip: {
trigger: 'item',
triggerOn: 'mousemove',
},
series: [
{
type: 'tree',
data: this.treedata,
top: '2%',
left: '6%',
bottom: '1%',
right: '40%',
symbolSize: 7,
lineStyle: { width: 1 },
itemStyle: { borderWidth: 3, borderColor: '#AACD06' },
label: {
position: 'top',
verticalAlign: 'middle',
align: 'center',
fontSize: 16,
},
leaves: {
label: {
position: 'right',
verticalAlign: 'middle',
align: 'left',
},
},
expandAndCollapse: true,
animationDuration: 550,
animationDurationUpdate: 750,
},
],
};
// 使
myChart.setOption(option);
},
clickFun(param) {
if (typeof param.seriesIndex == 'undefined') {
return;
}
if (param.type == 'click') {
// console.log(param);
for (let i = 0; i < this.treedata[0].children.length; i++) {
if (param.data.name === this.treedata[0].children[i].name) {
this.treedata[0].children[i].collapsed = !this.treedata[0].children[i].collapsed;
if (this.treedata[0].children[i].collapsed) {
this.showDiv = false;
return;
} else {
this.showDiv = true;
}
}
}
}
},
},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 10px auto 15px;
}
.absolute-box {
position: absolute;
right: 0;
height: 100%;
// border: 1px solid #ccc;
// box-shadow: 0 0 6px rgba(19, 172, 196, 0.6);
width: 70px;
padding: 4px;
align-items: center;
text-align: center;
font-size: 14px;
display: flex;
justify-content: center;
.case {
width: 40px;
height: 100%;
border-radius: 10px;
margin-right: 10px;
box-shadow: 2px 0 0 rgb(170 205 6);
}
}
@media only screen and (max-width: 1400px) {
.absolute-box {
right: -40px;
}
}
</style>

46
src/views/NewPlatform/Children/Develop.vue

@ -1,46 +0,0 @@
<template>
<div>
<sen-nav />
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<div class="dev-box">
<img src="~assets/build.png" />
</div>
</div>
</template>
<script>
import SenNav from './components/SenNav.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
export default {
name: 'Develop',
components: { SenNav, BreadCrumb },
data() {
return {
title: '创新服务',
typeOfPlatform: '创新平台',
arr: [
{ name: '创新平台', url: '/NewPlatform/NewCore' },
{ name: '创新资源平台', url: '/NewPlatform/News' },
{ name: '创新服务', url: '' },
],
list: [],
};
},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 20px auto;
}
.dev-box {
width: 100%;
img {
width: 100%;
}
}
</style>

131
src/views/NewPlatform/Children/Platform.vue

@ -1,131 +0,0 @@
<!--
* @Author: wally
* @email: 18603454788@163.com
* @Date: 2021-01-13 17:21:29
* @LastEditors: wally
* @LastEditTime: 2021-01-20 09:56:56
-->
<template>
<div>
<h-nav />
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<banner :show-page="showPage" />
<div style="padding-bottom: 50px">
<div class="inner d-flex flex-nowrap justify-space-between">
<div :key="index" @click="jump(item.url)" class="content-box" v-for="(item, index) in list">
<img :src="item.imgUrl" />
<div class="con-title">{{ item.title }}</div>
<div class="con-con">{{ item.content }}</div>
<!-- <div class="d-flex justify-space-between" v-if="index % 2 === 0">
<div class="introduce-box">
<p class="introduce-title">{{ item.title }}</p>
<p class="introduce-content">{{ item.content }}</p>
</div>
<img :src="item.imgUrl" style="width: 452px" />
</div>
<div class="d-flex justify-space-between" v-else>
<img :src="item.imgUrl" style="width: 452px" />
<div class="introduce-box">
<p class="introduce-title">{{ item.title }}</p>
<p class="introduce-content">{{ item.content }}</p>
</div>
</div>-->
</div>
</div>
</div>
</div>
</template>
<script>
import Banner from 'components/Banner/Banner.vue';
import HNav from './../components/HNav.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
export default {
name: 'News',
components: { HNav, Banner, BreadCrumb },
data() {
return {
str: '这是政策界面',
title: '创新资源平台',
typeOfPlatform: '创新平台',
arr: [
{ name: '创新平台', url: '/NewPlatform/NewCore' },
{ name: '创新资源平台', url: '' },
],
showPage: 32,
list: [
{
title: '科技资源开放共享服务平台',
content: '研发试验、检验检测、资源共享',
imgUrl: 'https://www.sxwikionline.com/gateway/greenvalley/uploads/upload/20210120/ccf39757579647cd975ddaebfc571d93.png',
url: '/NewPlatform/Share',
},
{
title: '知识产权与技术转移转化服务平台',
content: '知识产权、成果转化、技术转移',
imgUrl: 'https://www.sxwikionline.com/gateway/greenvalley/uploads/upload/20210104/4f9b898da25e48d3b73b47345ed14a9a.jpg',
url: '/NewPlatform/Transfer',
},
{
title: '知识培训与科技人才服务平台',
content: '技术培训、管理培训、知识讲座',
imgUrl: 'https://www.sxwikionline.com/gateway/greenvalley/uploads/upload/20210104/f5fb570cfd7547279138a591818325e0.jpg',
url: '/NewPlatform/Develop',
},
],
};
},
methods: {
jump(url) {
this.$router.push(url);
},
},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 10px auto 15px;
}
.content-box {
padding: 0 !important;
width: 30%;
height: auto !important;
margin: 50px 0;
cursor: pointer;
position: relative;
img {
width: 100%;
}
}
.con-title {
position: absolute;
bottom: 23px;
color: #ffffff;
font-size: 1.6rem;
text-align: center;
width: 100%;
background-image: linear-gradient(rgba(#545454, 0), rgba(0, 0, 0, 0.6));
}
@media only screen and (max-width: 1650px) {
.con-title {
font-size: 1.3rem;
}
}
.con-con {
background: white;
box-shadow: 0 0 6px #ccc;
height: 26%;
display: flex;
justify-content: center;
align-items: center;
font-size: 16px;
}
</style>

427
src/views/NewPlatform/Children/Service.vue

@ -1,427 +0,0 @@
<template>
<div>
<h-nav />
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<banner :show-page="showPage" />
<div class="flow-path" style="padding: 15px 9%;">
<div class="flow-title" style="top: 30%;">服务流程</div>
<div class="flow-content">
<img src="~assets/image.png" style="width: 100%" />
</div>
</div>
<div class="inner d-flex flex-wrap" style="margin: 20px auto">
<div
:class="(index + 1) % 4 === 0 ? 'margin-0' : ''"
:key="index"
class="item-box mb-8 pointer"
v-for="(item, index) in list"
>
<img @click="showModal(item.id)" :src="item.picUrl" style="height: 220px; width: 100%; border: 1px solid #ccc" />
<p class="font-24 my-4" style="text-align: center">
<span>{{ item.name }}</span>
</p>
<!-- <p
class="font-16 my-4 textColor line-height-30 item-content"
v-if="item.intro"
>{{ item.intro }}</p> -->
<div v-if="item.intro === null? false: item.intro.length>45" class="font-16 textColor item-intro mb-2">
{{ item.intro.slice(0,45) }}
<a-button
@click="showIntro(index)"
class="font-16 baseColor"
type="link"
style="height:20px;float:right;padding:0px"
>
more
<a-icon style="font-size:12px" type="right" />
</a-button>
</div>
<div v-if="item.intro === null? false:item.intro.length<=45" class="font-16 textColor item-intro">
<p>{{ item.intro }}</p>
</div>
<!-- <p
@click="jump(item.id)"
class="font-16 baseColor"
style="text-align: right; cursor: pointer"
>了解更多</p>-->
</div>
</div>
<a-modal v-model="showModelIntro" :footer="null">
<p class="mt-3"> {{ modelIntro }} </p>
</a-modal>
<a-modal
:confirm-loading="confirmLoading"
:visible="visible"
@cancel="handleCancel"
@ok="handleOk"
title="服务需求"
width="50%"
>
<a-form :form="form">
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="公司名称"
>
<a-input placeholder="请输入公司名称..." v-model.trim="platform.companyName" />
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="联系人"
required
>
<a-input placeholder="请输入联系人..." v-model.trim="platform.manName" />
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="联系电话"
required
>
<a-input
@change="changePhone"
placeholder="请输入联系电话.."
type="tel"
v-decorator="['tel', { rules: phoneRules }]"
/>
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="图片验证码"
required
>
<div class="d-flex flex-nowrap">
<a-input placeholder="图片验证码" type="number" v-model="codeNum" />
<img
:src="picCode.imageBase64"
@click="changePicCode"
class="code_img ml-2"
v-if="picCode && picCode.imageBase64"
/>
<a-button @click="changePicCode" class="code_img ml-2" size="small" v-else>获取验证码</a-button>
<!-- <a-input v-decorator="['account', { rules: rules.account }]" /> -->
</div>
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="短信验证码"
required
>
<div class="d-flex flex-nowrap">
<a-input placeholder="请输入验证码" type="number" v-model="platform.code" />
<a-button
class="code_img ml-2"
disabled
type="primary"
v-if="showInterval"
>重新发送 {{ interval }}</a-button>
<a-button
:disabled="platform.isTel === false"
@click="getCode"
class="code_img ml-2"
type="primary"
v-else
>获取验证码</a-button>
</div>
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="需求描述"
>
<a-textarea
placeholder="请输入需求描述..."
style="height: 120px"
v-model.trim="platform.describe"
/>
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="上传附件"
>
<a-upload
:action="action"
:before-upload="beforeUpload"
:default-file-list="fileList"
@change="fileChange"
list-type="picture"
name="files"
>
<a-button>
<a-icon type="upload" />点击上传附件
</a-button>
</a-upload>
</a-form-item>
</a-form>
</a-modal>
</div>
</template>
<script>
import { mapMutations, mapState, mapActions } from 'vuex';
import { selService, serviceApply, upload } from 'config/api';
import Banner from 'components/Banner/Banner.vue';
import HNav from './../components/HNav.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
const formItemLayout = {
labelCol: { span: 5 },
wrapperCol: { span: 18 },
};
const formTailLayout = {
labelCol: { span: 6 },
wrapperCol: { span: 18, offset: 6 },
};
export default {
name: 'Service',
components: { HNav, Banner, BreadCrumb },
data() {
return {
str: '这是服务界面',
title: '创新服务',
typeOfPlatform: '创新平台',
arr: [
{ name: '创新平台', url: '/NewPlatform/NewCore' },
{ name: '知识培训与科技人才服务平台', url: '/NewPlatform/NewService' },
],
showPage: 33,
list: [],
current: 1,
pageSize: 8,
total: 0,
form: this.$form.createForm(this, { name: 'submit' }),
action: upload,
fileList: [],
visible: false,
formItemLayout,
formTailLayout,
confirmLoading: false,
platform: {
companyName: '', //
manName: '', //
tel: '', //
describe: '', //
code: '', //
files: [], // Id
isTel: false,
},
codeRules: [
{ required: true, message: '请输入验证码' },
{ min: 4, max: 4, message: '请输入4位短信验证码' },
],
codeNum: '',
showInterval: false,
codeTimer: null,
interval: 120, //
phoneRules: [
{ required: true, pattern: new RegExp(/^[1][3,4,5,6,7,8,9][0-9]{9}$/), whitespace: true, message: '请输入正确的手机号' },
],
typeData: {
type: 0,
Id: '',
},
showModelIntro: false,
modelIntro: ''
};
},
computed: mapState('user', ['picCode']),
created() {
this.getService();
},
methods: {
...mapMutations('home', ['setServiceArr', 'getUserSer']),
...mapActions('user', ['sendCode', 'sendPicCode']),
showIntro(index){
this.showModelIntro = true
this.modelIntro = this.list[index].intro
},
//
async getService() {
try {
const params = { param: { serviceType: 1 } };
const res = await selService(params);
const { code, data, msg } = res.data;
if (code === 200) {
this.list = data;
}
} catch (error) {
// console.log(data);
}
},
//
jump(id) {
this.setServiceArr([]);
this.setServiceArr(this.arr);
this.$router.push({
path: '/NewPlatform/ServiceDet',
name: 'ServiceDet',
params: { id },
});
},
//
showModal(id) {
this.typeData.Id = id;
this.visible = true;
},
//
handleCancel(e) {
this.visible = false;
},
//
changePhone(e) {
this.platform.tel = e.target.value;
this.platform.isTel = /^[1][3,4,5,6,7,8,9][0-9]{9}$/.test(this.platform.tel);
},
//
handleOk() {
if (!this.platform.manName) {
this.$message.error('请输入联系人');
} else if (!this.platform.tel) {
this.$message.error('请输入联系电话');
} else if (!this.platform.code) {
this.$message.error('请输入验证码');
} else {
if (this.platform.isTel) {
for (var i = 0; i < this.fileList.length; i++) {
this.platform.files = this.platform.files.concat(this.fileList[i].response.data[0].id);
}
this.subMitAdd();
// console.log(this.platform.files);
} else {
this.$message.error('请输入正确的联系电话');
}
}
},
//
async subMitAdd() {
this.confirmLoading = true;
try {
const params = {
param: {
code: this.platform.code,
companyName: this.platform.companyName,
contactName: this.platform.manName,
contactPhone: this.platform.tel,
description: this.platform.describe,
filesId: this.platform.files,
serviceId: this.typeData.Id,
type: this.typeData.type,
},
};
const res = await serviceApply(params);
const { code, msg, data } = res.data;
if (code === 200) {
this.$message.success('申请成功');
this.visible = false;
this.confirmLoading = false;
for (let key in this.platform) {
this.platform[key] = '';
}
this.platform.isTel = false;
} else {
throw msg;
this.confirmLoading = false;
}
} catch (error) {
this.$message.error(error);
this.confirmLoading = false;
}
},
//
async getCode() {
// console.log(111);
try {
const params = {
phone: this.platform.tel,
verificationCodeId: this.picCode.verificationCodeId,
verificationCodeValue: this.codeNum,
};
await this.sendCode(params);
this.getCodeInterval();
} catch (error) {
// throw new Error(`SignIn.vue method getCode: ${error}`);
// console.log(error);
}
},
//
getCodeInterval() {
this.showInterval = true;
this.codeTimer = setInterval(() => {
if (this.interval === 0) {
clearInterval(this.codeTimer);
this.codeTimer = null;
this.showInterval = false;
this.interval = 120;
return;
}
this.interval = this.interval - 1;
}, 1000);
},
//
changePicCode() {
this.sendPicCode();
},
beforeUpload(file) {
return new Promise((resolve, reject) => {
const isLt5M = file.size / 1024 / 1024 < 5;
if (!isLt5M) {
this.$message.warning('上传附件大小不能超过5m!');
return reject(false);
}
return resolve(true);
});
},
fileChange(info) {
this.fileList = info.fileList;
},
},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 10px auto 15px;
}
.pagination {
margin: 40px 0;
text-align: right;
}
.item-box {
position: relative;
width: 20.5%;
margin-right: 6%;
border-radius: 4px;
}
.margin-0 {
margin-right: 0 !important;
}
.item-content {
display: -webkit-box;
overflow: hidden;
white-space: normal !important;
text-overflow: ellipsis;
word-wrap: break-word;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
height: 60px;
}
</style>

106
src/views/NewPlatform/Children/ServiceDet.vue

@ -1,106 +0,0 @@
<template>
<div>
<div class="inner my-1">
<a-breadcrumb>
<a-breadcrumb-item>绿谷生物</a-breadcrumb-item>
<a-breadcrumb-item :key="index" v-for="(item, index) in serviceArr">
<router-link :to="item.url">{{ item.name }}</router-link>
</a-breadcrumb-item>
</a-breadcrumb>
</div>
<banner :show-page="showPage" />
<div class="posi-name">
<p class="service-name">{{ obj.name }}</p>
<p class="service-eng">SERVICE</p>
</div>
<div class="inner service-box">
<div style="margin-bottom: 40px" v-dompurify-html="obj.content"></div>
<div>
<!-- <a-button>直接申请</a-button> -->
<intention-model
:btn-name="btnName"
:type-data="typeData"
style="float: left; margin-right: 20px"
/>
<!-- <a-button type="primary">加入购物车</a-button> -->
<add-shopping :type-data="typeData" />
</div>
</div>
</div>
</template>
<script>
import { mapState } from 'vuex';
import { selContent } from 'config/api';
import IntentionModel from 'components/Introduce/IntentionModel.vue';
import Banner from 'components/Banner/Banner.vue';
import AddShopping from 'components/Introduce/AddShopping.vue';
export default {
name: 'ServiceDet',
components: { IntentionModel, Banner, AddShopping },
data() {
return {
showPage: 100,
obj: {
name: '',
id: '',
content: '',
},
typeData: {
type: 0,
Id: '',
},
btnName: '服务申请',
};
},
computed: mapState('home', ['serviceArr']),
async created() {
this.typeData.Id = this.$route.params.id;
await this.getData(this.$route.params.id);
},
methods: {
async getData(id) {
try {
const params = { param: { id } };
const res = await selContent(params);
const { code, msg, data } = res.data;
if (code === 200) {
// console.log(data);
this.obj = data;
}
} catch (error) {
// console.log(error);
}
},
},
};
</script>
<style lang="stylus" scoped>
.service-box {
margin: 60px auto;
min-height: 400px;
padding: 20px;
background: #fff;
}
.posi-name {
position: absolute;
left: 20%;
top: 300px;
color: #fff;
text-align: center;
}
.service-name {
font-size: 40px;
margin-bottom: 0 !important;
}
.service-eng {
font-size: 16px;
}
</style>

239
src/views/NewPlatform/Children/Share.vue

@ -1,239 +0,0 @@
<template>
<div>
<sen-nav />
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<div>
<div class="search-background">
<div class="d-flex">
<div class="flex-3 flex-wrap">
<span class="ins-title">研究开发实验室</span>
<span
:class="item.isActive ? 'act-color' : ''"
:key="index"
@click="choose(index, 0)"
class="ins-name"
v-for="(item, index) in laboratory"
>{{ item.name }}</span>
</div>
<div class="flex-1 align-center">
<a-input-search
@search="searchLab"
class="item-search"
enter-button="搜索"
placeholder="搜索实验室"
v-model="LabIpt"
/>
</div>
</div>
<div class="flex-3 flex-wrap" style="border-top: 1px solid rgba(0, 0, 0, 0.06)">
<div class="flex-3 flex-wrap">
<span class="ins-title">大型科研设施与仪器</span>
<span
:class="item.isActive ? 'act-color' : ''"
:key="index"
@click="choose(index, 1)"
class="ins-name"
v-for="(item, index) in instrument"
>{{ item.name }}</span>
</div>
<div class="flex-1 align-center">
<a-input-search
@search="searchIns"
class="item-search"
enter-button="搜索"
placeholder="搜索仪器"
v-model="InsIpt"
/>
</div>
</div>
</div>
</div>
<platform-list />
</div>
</template>
<script>
import { selModel } from 'config/api';
import PlatformList from 'components/PlatformList/PlatformList.vue';
import SenNav from './components/SenNav.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
import { mapMutations } from 'vuex';
export default {
name: 'Share',
components: { SenNav, PlatformList, BreadCrumb },
data() {
return {
str: '这是科技资源开放共享服务平台',
title: '科技资源开放共享服务平台',
typeOfPlatform: '创新平台',
arr: [
{ name: '创新平台', url: '/NewPlatform/NewCore' },
{ name: '创新资源平台', url: '/NewPlatform/News' },
{ name: '科技资源开放共享服务平台', url: '' },
],
LabIpt: '', //
laboratory: [], //
labList: [], //
InsIpt: '', //
instrument: [], //
insList: [], //
};
},
watch: {
LabIpt(val) {
const obj = {
content: this.LabIpt,
isBtn: 0,
};
this.setLabIpt(obj);
},
InsIpt(val) {
const obj = {
content: this.InsIpt,
isBtn: 0,
};
this.setInsIpt(obj);
},
},
created() {
const obj = {
content: '',
isBtn: 0,
};
this.setLabList([]);
this.setInsList([]);
this.setLabIpt(obj);
this.setInsIpt(obj);
this.getType(1);
this.getType(2);
},
methods: {
...mapMutations('home', ['setLabList', 'setInsList', 'setLabIpt', 'setInsIpt', 'setListState']),
async getType(num) {
try {
const params = { param: { model: num } };
const res = await selModel(params);
const { code, mst, data } = res.data;
if (code === 200) {
if (num === 1) {
this.instrument = data;
for (let i = 0; i < this.instrument.length; i++) {
this.instrument[i].isActive = false;
}
} else if (num === 2) {
this.laboratory = data;
for (let i = 0; i < this.laboratory.length; i++) {
this.laboratory[i].isActive = false;
}
}
}
} catch (error) {
// console.log(error);
}
},
//
choose(index, num) {
const that = this;
if (num === 0) {
this.labList = [];
const { laboratory, instrument } = this;
for (let i = 0; i < instrument.length; i++) {
instrument[i].isActive = false;
}
this.setListState(0);
laboratory[index].isActive = !laboratory[index].isActive;
this.laboratory = [...laboratory];
for (let i = 0; i < laboratory.length; i++) {
if (laboratory[i].isActive) {
this.labList.push(laboratory[i].id);
}
}
this.setLabList(this.labList);
} else if (num === 1) {
this.insList = [];
const { laboratory, instrument } = this;
for (let i = 0; i < laboratory.length; i++) {
laboratory[i].isActive = false;
}
this.setListState(1);
instrument[index].isActive = !instrument[index].isActive;
this.instrument = [...instrument];
for (let i = 0; i < instrument.length; i++) {
if (instrument[i].isActive) {
this.insList.push(instrument[i].id);
}
}
this.setInsList(this.insList);
}
},
searchLab() {
const { instrument } = this;
for (let i = 0; i < instrument.length; i++) {
instrument[i].isActive = false;
}
this.instrument = [...instrument];
this.setListState(0);
this.InsIpt = '';
const obj = {
content: this.LabIpt,
isBtn: 1,
};
this.setLabIpt(obj);
},
searchIns() {
const { laboratory } = this;
for (let i = 0; i < laboratory.length; i++) {
laboratory[i].isActive = false;
}
this.laboratory = [...laboratory];
this.setListState(1);
this.LabIpt = '';
const obj = {
content: this.InsIpt,
isBtn: 1,
};
this.setInsIpt(obj);
},
},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 10px auto 15px;
}
.search-background {
background: rgba(0, 0, 0, 0.02);
border: 1px solid rgba(0, 0, 0, 0.06);
height: auto;
padding: 0 20px;
width: 82%;
margin: 40px auto;
line-height: 44px;
}
.item-search {
width: 100%;
height: 32px;
}
.ins-title {
font-size: 16px;
font-weight: bold;
color: rgba(0, 0, 0, 0.65);
}
.ins-name {
font-size: 16px;
color: rgba(0, 0, 0, 0.65);
padding: 0 10px;
cursor: pointer;
}
.act-color {
color: #13ACC4 !important;
}
</style>

222
src/views/NewPlatform/Children/ShareChild/InsDet.vue

@ -1,222 +0,0 @@
<template>
<div>
<div class="inner" style="margin-top: 40px">
<bread-crumb :arr="arr" />
</div>
<div class="inner equ-box">
<div class="equ-info d-flex">
<img :src="obj.visitLocation" />
<!-- <img :src="obj.visitLocation" alt v-if="listState === 3" /> -->
<div class="equ-info-box">
<p class="equ-name">{{ obj.name }}</p>
<div class="d-flex flex-wrap" style="margin-top: 20px" v-if="listState === 1">
<div class="equ-info-left" style="width: 100px">
<!-- <p>仪器名字</p> -->
<p>制造商</p>
<p>型号</p>
<p>规格</p>
<p>性能指标</p>
<p>联系人</p>
<p>联系方式</p>
</div>
<div>
<!-- <p>{{ obj.name }}</p> -->
<p>{{ obj.manufactor }}</p>
<p>{{ obj.model }}</p>
<p>{{ obj.specifications }}</p>
<p>{{ obj.performance }}</p>
<p>
<span :key="index" v-for="(item, index) in obj.selPeoList">
{{ item.contactsName }}
<span v-if="index !== obj.selPeoList.length - 1"></span>
</span>
</p>
<p>
<span :key="index" v-for="(item, index) in obj.selPeoList">
{{ item.contactsPhone }}
<span v-if="index !== obj.selPeoList.length - 1"></span>
</span>
</p>
</div>
</div>
<div class="d-flex flex-wrap" style="margin-top: 20px" v-if="listState === 3">
<div class="equ-info-left" style="width: 100px">
<p>公司名称</p>
<p>产品编号</p>
<p>联系人</p>
</div>
<div style="width: 500px">
<p>{{ obj.companyname }}</p>
<p>{{ obj.identifier }}</p>
<p>
<span :key="index" v-for="(item, index) in obj.selPeoList">
{{ item.contactsName }}
<span v-if="index !== obj.selPeoList.length - 1"></span>
</span>
</p>
</div>
</div>
<p class="equ-btn">
<intention-model
:btn-name="btnName"
:type-data="listState === 1 ? typeData : typeProductData"
style="margin-right: 20px; float: left"
/>
<!-- <a-button style="margin-right: 20px">转化意向</a-button> -->
<!-- <a-button type="primary">加入购物车</a-button> -->
<add-shopping :type-data="typeData" style="margin-right: 20px; float: right" />
</p>
</div>
</div>
<div class="content-box">
<div v-dompurify-html="obj.purpose" v-if="listState === 1"></div>
<div v-dompurify-html="obj.details" v-if="listState === 3"></div>
</div>
</div>
</div>
</template>
<script>
import { mapState } from 'vuex';
import { selInstrumentMes, selProductMes } from 'config/api';
import IntentionModel from 'components/Introduce/IntentionModel.vue';
import AddShopping from 'components/Introduce/AddShopping.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
export default {
name: 'InsDet',
components: { IntentionModel, AddShopping, BreadCrumb },
data() {
return {
typeOfPlatform: '设备详情',
arr: [
{ name: '创新平台', url: '/NewPlatform/NewCore' },
{ name: '创新资源平台', url: '/NewPlatform/News' },
{ name: '科技资源开放共享服务平台', url: '/NewPlatform/Share' },
{ name: '设备详情', url: '' },
],
obj: {},
typeData: {
type: 1,
Id: '',
},
typeProductData: {
type: 3,
Id: '',
},
id: 0,
btnName: '产品购买',
};
},
computed: mapState('home', ['listState']),
created() {
this.id = this.$route.params.id;
if (this.listState === 1) {
this.typeData.Id = this.$route.params.id;
this.getData();
}
if (this.listState === 3) {
this.typeProductData.Id = this.$route.params.id;
this.getProductData();
}
},
methods: {
async getData() {
try {
const params = { param: { id: this.id } };
const res = await selInstrumentMes(params);
const { code, data, msg } = res.data;
if (code === 200) {
this.obj = data;
}
} catch (error) {
// console.log(error);
}
},
//
async getProductData() {
try {
const params = { param: { id: this.id } };
const res = await selProductMes(params);
const { code, data, msg } = res.data;
if (code === 200) {
// console.log(data);
this.obj = data;
}
} catch (error) {
// console.log(error);
}
},
},
};
</script>
<style lang="stylus" scoped>
.equ-box {
background: #fff;
padding: 20px;
margin: 30px auto;
}
.equ-info {
border-bottom: 1px solid rgba(0, 0, 0, 0.14901960784313725);
position: relative;
padding-bottom: 24px;
img {
width: 300px;
height: 300px;
}
}
.equ-name {
font-size: 24px;
font-family: Microsoft YaHei;
font-weight: bold;
line-height: 31px;
color: rgba(0, 0, 0, 0.85);
opacity: 1;
}
.equ-info-box {
position: relative;
font-size: 16px;
margin-left: 20px;
height: 300px;
font-family: Microsoft YaHei;
font-weight: 400;
color: rgba(0, 0, 0, 0.65);
opacity: 1;
p {
height: 24px;
margin-bottom: 6px;
}
}
.equ-info-left {
font-size: 16px;
font-family: Microsoft YaHei;
font-weight: 400;
color: rgba(0, 0, 0, 0.45);
opacity: 1;
p {
height: 24px;
margin-bottom: 6px;
}
}
.equ-btn {
position: absolute;
bottom: 0;
}
.content-box {
min-height: 400px;
padding: 20px;
font-size: 16px;
color: rgba(0, 0, 0, 0.65);
}
</style>

315
src/views/NewPlatform/Children/ShareChild/Institute.vue

@ -1,315 +0,0 @@
<template>
<div>
<h-nav />
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<!-- <banner :show-page="showPage" /> -->
<div class="inner ins-box">
<p class="font-bold-24 item-title" v-if="description">{{ shareName }}</p>
<div class="font-20" v-if="description">{{ description }}</div>
<!-- <p class="font-bold-24 item-title" v-if="direction">科研条件</p>
<div class="font-20" v-dompurify-html="direction" v-if="direction"></div>-->
<p class="font-bold-24 item-title" v-if="list[0]">设备列表</p>
<div class="d-flex flex-wrap" v-if="list[0]">
<div
:class="(index + 1) % 4 === 0 ? 'margin-0' : ''"
:key="index"
class="item-box mb-8"
v-for="(item, index) in list"
>
<img :src="item.visitLocation" style="height: 220px; width: 100%" />
<p class="font-24 my-4">{{ item.name }}</p>
<p @click="jump(item.id)" class="font-16 baseColor item-more">了解更多</p>
</div>
</div>
<div class="mt-5">
<!-- <a-button>直接申请</a-button> -->
<intention-model
:btn-name="btnName"
:type-data="typeData"
style="float: left; margin-right: 20px"
/>
<!-- <a-button type="primary">加入购物车</a-button> -->
<add-shopping :type-data="typeData" />
</div>
<!-- <p
class="font-bold-24 item-title"
v-if="teamHead.name !== '' || teamHead.name !== null"
>人才团队带头人情况</p>
<div class="d-flex" v-if="teamHead.name !== '' || teamHead.name !== null">
<div class="header-box" style="flex: 1">
<p style="background: #11b7ce; color: #fff">姓名</p>
<p>性别</p>
<p>民族</p>
<p>出生年月</p>
<p>学历</p>
<p>职称</p>
<p>所学专业</p>
<p>从事专业</p>
<p>团队名称</p>
<p>工作单位</p>
<p>研究方向</p>
</div>
<div
class="header-box"
style="flex: 5; background: #fff"
v-if="teamHead.name !== '' || teamHead.name !== null"
>
<p style="border-bottom: 1px solid #eee">{{ teamHead.name }}</p>
<p>
<span v-if="teamHead.gender - 0 === 1"></span>
<span v-else-if="teamHead.gender - 0 === 2"></span>
</p>
<p>{{ teamHead.famousFamily }}</p>
<p>{{ teamHead.birthday }}</p>
<p>{{ teamHead.education }}</p>
<p>{{ teamHead.position }}</p>
<p>{{ teamHead.major }}</p>
<p>{{ teamHead.professional }}</p>
<p>{{ teamHead.teamName }}</p>
<p>{{ teamHead.workUnit }}</p>
<p>{{ teamHead.direction }}</p>
</div>
</div>-->
<p class="font-bold-24 item-title" v-if="obj !== null">团队成员信息</p>
<div style="background: #fff" v-if="obj !== null">
<div class="d-flex">
<div class="h-box" style="flex: 1">姓名</div>
<div class="h-box" style="flex: 1">性别</div>
<div class="h-box" style="flex: 1">出生年月</div>
<div class="h-box" style="flex: 1">学历学位</div>
<div class="h-box" style="flex: 1">职称职务</div>
<div class="h-box" style="flex: 1">研究方向</div>
</div>
<div v-if="obj.teamMemberList && obj.teamMemberList.length > 0">
<div :key="index" class="d-flex" v-for="(item, index) in obj.teamMemberList">
<div class="con-box" style="flex: 1">{{ item.tmName }}</div>
<div class="con-box" style="flex: 1">
<span v-if="item.gender - 0 === 1"></span>
<span v-else-if="item.gender - 0 === 2"></span>
</div>
<div class="con-box" style="flex: 1">{{ item.birthday }}</div>
<div class="con-box" style="flex: 1">{{ item.education }}</div>
<div class="con-box" style="flex: 1">{{ item.position }}</div>
<div class="con-box" style="flex: 1">{{ item.direction }}</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { mapMutations, mapState } from 'vuex';
import { selInstrumentByRes, teamSearch } from 'config/api';
// import Banner from 'components/Banner/Banner.vue';
import HNav from './../../components/HNav.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
import AddShopping from 'components/Introduce/AddShopping.vue';
import IntentionModel from 'components/Introduce/IntentionModel.vue';
export default {
name: 'Institute',
components: { HNav, BreadCrumb, AddShopping, IntentionModel },
data() {
return {
id: 0,
title: '研究院详情',
typeOfPlatform: '创新平台',
showPage: 32,
arr: [
{ name: '创新平台', url: '/NewPlatform/NewCore' },
{ name: '创新资源平台', url: '/NewPlatform/News' },
{ name: '科技资源开放共享服务平台', url: '/NewPlatform/Share' },
{ name: '研究院详情', url: '' },
],
teamHead: {
name: '',
gender: '',
famousFamily: '',
birthday: '',
education: '',
position: '',
major: '',
professional: '',
teamName: '',
workUnit: '',
direction: '',
},
obj: null,
list: [],
description: '',
shareName: '',
direction: '', //
experiments: '', //
projectKind: '', //
vertify: '', //
typeData: {
type: 0,
Id: '',
},
btnName: '服务申请',
};
},
computed: mapState('home', ['LabId']),
created() {
if (this.$route.params.id) {
this.setLabId(this.$route.params.id);
this.id = this.$route.params.id;
} else {
this.id = this.LabId;
}
if (this.$route.params.description) {
this.description = this.$route.params.description;
}
if (this.$route.params.name) {
this.shareName = this.$route.params.name;
}
if (this.$route.params.direction) {
this.direction = this.$route.params.direction;
}
if (this.$route.params.experiments) {
this.experiments = this.$route.params.experiments;
}
if (this.$route.params.projectKind) {
this.projectKind = this.$route.params.projectKind;
}
if (this.$route.params.vertify) {
this.vertify = this.$route.params.vertify;
}
this.getData();
this.getTeam();
},
methods: {
...mapMutations('home', ['setLabId']),
//
async getData() {
try {
const params = {
param: {
id: this.id,
pageNum: 1,
pageSize: 6,
},
};
const res = await selInstrumentByRes(params);
const { code, msg, data } = res.data;
if (code === 200) {
if (data.list && data.list.length > 0) {
this.list = data.list;
this.total = parseInt(data.total);
}
}
} catch (error) {
// console.log(error);
}
},
//
async getTeam() {
try {
const params = { param: { instituteId: this.id } };
const res = await teamSearch(params);
const { code, msg, data } = res.data;
if (code === 200) {
this.teamHead.name = data[0].name;
this.teamHead.gender = data[0].gender;
this.teamHead.famousFamily = data[0].famousFamily;
this.teamHead.birthday = data[0].birthday;
this.teamHead.education = data[0].education;
this.teamHead.position = data[0].position;
this.teamHead.major = data[0].major;
this.teamHead.professional = data[0].professional;
this.teamHead.teamName = data[0].teamName;
this.teamHead.workUnit = data[0].workUnit;
this.teamHead.direction = data[0].direction;
if (data && data[0].teamMemberList.length > 0) {
this.obj = data[0];
}
}
} catch (error) {
// console.log(error);
}
},
// /
jump(id) {
this.$router.push({
path: '/NewPlatform/Share/InsDet',
name: 'InsDet',
params: { id },
});
},
},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 10px auto 15px;
}
.ins-box {
min-height: 500px;
height: auto;
margin: 40px auto;
}
.pagination {
margin: 40px 0;
text-align: right;
}
.item-more {
right: 10px;
bottom: 0px;
cursor: pointer;
position: absolute;
}
.item-box {
position: relative;
width: 20.5%;
margin-right: 6%;
border-radius: 4px;
padding-bottom: 40px;
}
.margin-0 {
margin-right: 0 !important;
}
.item-title {
color: rgba(0, 0, 0, 0.85);
margin-top: 60px;
}
.header-box {
text-align: center;
p {
font-size: 24px;
color: rgba(0, 0, 0, 0.66);
height: 56px;
line-height: 56px;
margin-bottom: 0 !important;
}
}
.h-box {
text-align: center;
font-size: 22px;
color: #096DD9;
height: 56px;
line-height: 56px;
}
.con-box {
text-align: center;
font-size: 18px;
height: 46px;
line-height: 46px;
color: rgba(112, 112, 112, 0.66);
}
</style>

155
src/views/NewPlatform/Children/Transfer.vue

@ -1,155 +0,0 @@
<template>
<div>
<sen-nav />
<div class="inner my-1">
<bread-crumb :arr="arr" />
</div>
<div>
<div class="search-background">
<div class="d-flex">
<div class="flex-3 flex-wrap">
<span class="ins-title">技术领域</span>
<span
:class="item.isActive ? 'act-color' : ''"
:key="index"
@click="choose(index)"
class="ins-name"
v-for="(item, index) in list"
>{{ item.name }}</span>
</div>
<div class="flex-1 align-center">
<a-input-search
@search="searchFruit"
class="item-search"
enter-button="搜索"
placeholder="搜索成果"
v-model="fruitIpt"
/>
</div>
</div>
</div>
</div>
<fruit />
</div>
</template>
<script>
import { mapMutations } from 'vuex';
import { selModel } from 'config/api';
import Fruit from 'components/PlatformList/Fruit.vue';
import SenNav from './components/SenNav.vue';
import BreadCrumb from 'components/BreadCrumb/BreadCrumb.vue';
export default {
name: 'Transfer',
components: { SenNav, Fruit, BreadCrumb },
data() {
return {
str: '这是知识产权与技术转移转化服务平台',
title: '知识产权与技术转移转化服务平台',
typeOfPlatform: '创新平台',
arr: [
{ name: '创新平台', url: '/NewPlatform/NewCore' },
{ name: '创新资源平台', url: '/NewPlatform/News' },
{ name: '知识产权与技术转移转化服务平台', url: '' },
],
list: [],
achList: [],
fruitIpt: '',
};
},
watch: {
fruitIpt(val) {
const obj = {
content: this.fruitIpt,
isBtn: 0,
};
this.setAchIpt(obj);
},
},
created() {
this.getType();
this.setAchList([]);
},
methods: {
...mapMutations('home', ['setAchList', 'setAchIpt']),
//
async getType() {
try {
const params = { param: { model: 0 } };
const res = await selModel(params);
const { code, mst, data } = res.data;
if (code === 200) {
this.list = data;
for (var i = 0; i < this.list.length; i++) {
this.list[i].isActive = false;
}
// console.log(this.list);
}
} catch (error) {
// console.log(error);
}
},
//
searchFruit() {
const obj = {
content: this.fruitIpt,
isBtn: 1,
};
this.setAchIpt(obj);
},
//
choose(index) {
const that = this;
that.achList = [];
const { list } = this;
list[index].isActive = !list[index].isActive;
this.list = [...list];
for (let i = 0; i < list.length; i++) {
if (list[i].isActive) {
this.achList.push(list[i].id);
}
}
this.setAchList(this.achList);
},
},
};
</script>
<style lang="stylus" scoped>
.inner {
margin: 10px auto 15px;
}
.search-background {
background: rgba(0, 0, 0, 0.02);
border: 1px solid rgba(0, 0, 0, 0.06);
height: auto;
padding: 0 20px;
width: 82%;
margin: 40px auto;
line-height: 44px;
}
.item-search {
width: 100%;
height: 32px;
}
.ins-title {
font-size: 16px;
font-weight: bold;
color: rgba(0, 0, 0, 0.65);
}
.ins-name {
font-size: 16px;
color: rgba(0, 0, 0, 0.65);
padding: 0 10px;
cursor: pointer;
}
.act-color {
color: #13ACC4 !important;
}
</style>

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save