resource.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. <template>
  2. <div id="resource">
  3. <el-row>
  4. <el-col :span="24">
  5. <div id="container">
  6. <!-- 自定义列表 -->
  7. <div style="width:220px" class="menus">
  8. <el-menu @select="typeSelect">
  9. <el-submenu index="1">
  10. <template #title>
  11. <span>科技部门</span>
  12. </template>
  13. <el-menu-item index="1-1">科技部门</el-menu-item>
  14. </el-submenu>
  15. <el-submenu index="2">
  16. <template #title>
  17. <span>科研院所</span>
  18. </template>
  19. <el-menu-item index="2-1">科研院所</el-menu-item>
  20. </el-submenu>
  21. <el-submenu index="3">
  22. <template #title>
  23. <span>大专院校</span>
  24. </template>
  25. <el-menu-item index="3-1">大专院校</el-menu-item>
  26. </el-submenu>
  27. <el-submenu index="4">
  28. <template #title>
  29. <span>科技企业</span>
  30. </template>
  31. <el-menu-item index="4-1">高新技术企业</el-menu-item>
  32. <el-menu-item index="4-2">创新型企业</el-menu-item>
  33. </el-submenu>
  34. <el-submenu index="5">
  35. <template #title>
  36. <span>条件平台</span>
  37. </template>
  38. <el-menu-item index="5-1">重点实验室</el-menu-item>
  39. <el-menu-item index="5-2">工程技术研究中心</el-menu-item>
  40. <el-menu-item index="5-3">大学科技园</el-menu-item>
  41. <el-menu-item index="5-4">科技企业孵化器</el-menu-item>
  42. <el-menu-item index="5-5">产业化基地</el-menu-item>
  43. <el-menu-item index="5-6">技术转移示范机构</el-menu-item>
  44. <el-menu-item index="5-7">科技合作基地</el-menu-item>
  45. <el-menu-item index="5-8">院士工作站</el-menu-item>
  46. <el-menu-item index="5-9">技术创新联盟</el-menu-item>
  47. <el-menu-item index="5-10">科技创新中心</el-menu-item>
  48. <el-menu-item index="5-11">科技成果转化中试中心</el-menu-item>
  49. </el-submenu>
  50. <el-submenu index="6">
  51. <template #title>
  52. <span>服务机构(科技)</span>
  53. </template>
  54. <el-menu-item index="6-1">生产力促进中心</el-menu-item>
  55. <el-menu-item index="6-2">技术合同登记点</el-menu-item>
  56. <el-menu-item index="6-3">技术大市场</el-menu-item>
  57. <el-menu-item index="6-4">科技成功评价试点</el-menu-item>
  58. </el-submenu>
  59. <el-submenu index="7">
  60. <template #title>
  61. <span>重大项目</span>
  62. </template>
  63. <el-menu-item index="7-1">重大项目</el-menu-item>
  64. </el-submenu>
  65. <el-submenu index="8">
  66. <template #title>
  67. <span>科技奖励</span>
  68. </template>
  69. <el-menu-item index="8-1">科技奖励</el-menu-item>
  70. </el-submenu>
  71. </el-menu>
  72. </div>
  73. <!-- 搜索框 -->
  74. <el-amap-search-box class="search-box" :search-option="searchOption" :on-search-result="onSearchResult"></el-amap-search-box>
  75. <el-amap class="amap-box" :vid="'amap-vue'" :zoom="zoom" :center="center" :plugin="plugin">
  76. <!-- mark上方文字 -->
  77. <el-amap-text v-for="(t, index) in marktext" :key="`text${index}`" :text="t.text" :offset="[0, -50]" :position="t.position"></el-amap-text>
  78. <!-- 标记 -->
  79. <el-amap-marker
  80. v-for="(i, index) in markers"
  81. :key="`mark${index}`"
  82. :position="i.position"
  83. :events="i.events"
  84. :title="i.title"
  85. :address="i.address"
  86. :vid="index"
  87. ></el-amap-marker>
  88. <!-- 信息框体 -->
  89. <el-amap-info-window :position="window.position" :visible="window.visible" :events="window.events" :autoMove="true">
  90. <el-row>
  91. <el-col :span="24">
  92. <el-link type="primary">标题:{{ windowInfo.title }}</el-link>
  93. </el-col>
  94. <el-col :span="24">电话:{{ windowInfo.tel }}</el-col>
  95. <el-col :span="24">地址:{{ windowInfo.address }}</el-col>
  96. </el-row>
  97. </el-amap-info-window>
  98. </el-amap>
  99. </div>
  100. </el-col>
  101. </el-row>
  102. </div>
  103. </template>
  104. <script>
  105. import { local } from '@/util/local';
  106. import {
  107. kjbm,
  108. kyys,
  109. dzyx,
  110. gxjsqy,
  111. cxxqy,
  112. zdsys,
  113. gcjsyjzx,
  114. dxkjy,
  115. kjqyfhq,
  116. cyhjd,
  117. jszysfjg,
  118. kjhzjd,
  119. ysgzz,
  120. jscxlm,
  121. kjcxzx,
  122. kjcgzhzszx,
  123. sccjzx,
  124. jshtdjd,
  125. jsdsc,
  126. kjcgpjsd,
  127. zdxm,
  128. kjjl,
  129. } from '@/util/kjbm';
  130. const _ = require('lodash');
  131. import { mapState, createNamespacedHelpers } from 'vuex';
  132. import VueAMap from 'vue-amap';
  133. import Vue from 'vue';
  134. Vue.use(VueAMap);
  135. export default {
  136. metaInfo() {
  137. return { title: this.$route.meta.title };
  138. },
  139. name: 'resource',
  140. props: {},
  141. components: {},
  142. data: function() {
  143. return {
  144. zoom: '17',
  145. center: [125.291162, 43.838597], //初始定位到中心
  146. // 标记点列表
  147. markers: [],
  148. // 标记点提示
  149. marktext: [],
  150. // 窗体信息
  151. window: {
  152. position: [125.291162, 43.838597],
  153. visible: false,
  154. },
  155. windowInfo: {},
  156. // 搜索框
  157. searchOption: {
  158. city: '长春',
  159. citylimit: true,
  160. },
  161. // 插件
  162. plugin: [
  163. {
  164. pName: 'Scale',
  165. events: {
  166. init(instance) {},
  167. },
  168. },
  169. ],
  170. // 1科技部门-kjbm
  171. kjbm: kjbm,
  172. // 2科研院所-kyys
  173. kyys: kyys,
  174. // 3大专院校-dzyx
  175. dzyx: dzyx,
  176. // 科技企业
  177. // 4高新技术企业-gxjsqy
  178. gxjsqy: gxjsqy,
  179. // 5创新型企业-cxxqy
  180. cxxqy: cxxqy,
  181. // 条件平台
  182. // 7重点实验室-zdsys
  183. zdsys: zdsys,
  184. // 8工程技术研究中心-gcjsyjzx
  185. gcjsyjzx: gcjsyjzx,
  186. // 9大学科技园-dxkjy
  187. dxkjy: dxkjy,
  188. // 10科技企业孵化器-,kjqyfhq
  189. kjqyfhq: kjqyfhq,
  190. // 11产品化基地-,cyhjd
  191. cyhjd: cyhjd,
  192. // 12技术转移示范机构-,jszysfjg
  193. jszysfjg: jszysfjg,
  194. // 13科技合作基地-,kjhzjd
  195. kjhzjd: kjhzjd,
  196. // 14院士工作站-,ysgzz
  197. ysgzz: ysgzz,
  198. // 15技术创新联盟-,jscxlm
  199. jscxlm: jscxlm,
  200. // 16科技创新中心-,kjcxzx
  201. kjcxzx: kjcxzx,
  202. // 17科技成果转化中试中心-,kjcgzhzszx
  203. kjcgzhzszx: kjcgzhzszx,
  204. // 服务机构(科技)
  205. // 18生产促进中心-,sccjzx
  206. sccjzx: sccjzx,
  207. // 19技术合同登记点-,jshtdjd
  208. jshtdjd: jshtdjd,
  209. // 20技术大市场-,jsdsc
  210. jsdsc: jsdsc,
  211. // 21科技成功评价试点-,kjcgpjsd
  212. kjcgpjsd: kjcgpjsd,
  213. // 22重大项目-,zdxm
  214. zdxm: zdxm,
  215. // 23科技奖励-,kjjl
  216. kjjl: kjjl,
  217. };
  218. },
  219. created() {
  220. this.handlemyMapFn();
  221. },
  222. methods: {
  223. // 搜索框回调
  224. onSearchResult(pois) {
  225. let latSum = 0;
  226. let lngSum = 0;
  227. if (pois.length > 0) {
  228. // 只处理第一个结果了
  229. const r = this.setMark(_.head(pois));
  230. const { position } = r;
  231. this.center = position;
  232. }
  233. },
  234. // 添加标记
  235. setMark(place) {
  236. let name = _.get(place, 'name');
  237. let tel = _.get(place, 'tel');
  238. let address = _.get(place, 'address');
  239. let lng = _.get(place, 'lng');
  240. let lat = _.get(place, 'lat');
  241. let position = [lng, lat];
  242. let obj = {
  243. position: position,
  244. events: {
  245. click: () => {
  246. this.markClick(position);
  247. },
  248. },
  249. title: `${name}`,
  250. tel: `${tel}`,
  251. address: `${address}`,
  252. label: { content: 'lable', offset: [3, 3] },
  253. desc: 'abc',
  254. };
  255. let text = {
  256. position: position,
  257. text: name,
  258. };
  259. let isDiff = this.markers.find(f => _.isEqual(f.position, position));
  260. if (!isDiff) {
  261. this.markers.push(obj);
  262. this.marktext.push(text);
  263. }
  264. return obj;
  265. },
  266. // 初始化地图
  267. handlemyMapFn() {
  268. VueAMap.initAMapApiLoader({
  269. key: '47947a002b2cddf99df02a1a5b1bc198',
  270. plugin: [
  271. 'AMap.PolyEditor', //编辑 折线多,边形
  272. 'AMap.PlaceSearch', // 查询
  273. 'AMap.Autocomplete',
  274. 'AMap.Scale',
  275. 'AMap.OverView',
  276. 'AMap.ToolBar',
  277. 'AMap.MapType',
  278. 'AMap.PolyEditor',
  279. 'AMap.CircleEditor',
  280. ], // 默认高德 sdk 版本为 1.4.4
  281. v: '1.4.4',
  282. });
  283. },
  284. // 标记点击
  285. markClick(posi) {
  286. console.log(this.markers);
  287. const r = this.markers.find(f => _.isEqual(f.position, posi));
  288. console.log(r);
  289. // 设置窗口信息,自定义.反正在slot里的字段对上
  290. const info = {
  291. title: r.title,
  292. address: r.address,
  293. tel: r.tel,
  294. };
  295. this.$set(this, `windowInfo`, info);
  296. // 设置窗口信息
  297. const obj = {
  298. position: r.position,
  299. visible: true,
  300. events: {
  301. close: () => {
  302. // 初始化
  303. this.$set(this, `window`, { position: [125.291162, 43.838597], visible: false });
  304. },
  305. },
  306. };
  307. this.$set(this, `window`, obj);
  308. },
  309. // 点击导航菜单
  310. typeSelect(index) {
  311. this.$set(this, `markers`, []);
  312. this.$set(this, `marktext`, []);
  313. if (index === '1-1') {
  314. for (const i of this.kjbm) {
  315. this.setMark(i);
  316. }
  317. } else if (index === '2-1') {
  318. for (const i of this.kyys) {
  319. this.setMark(i);
  320. }
  321. } else if (index === '3-1') {
  322. for (const i of this.dzyx) {
  323. this.setMark(i);
  324. }
  325. } else if (index === '4-1') {
  326. let data = this.gxjsqy.filter(i => i.ing != '' && i.lat != '');
  327. for (const i of data) {
  328. this.setMark(i);
  329. }
  330. } else if (index === '4-2') {
  331. let data = this.cxxqy.filter(i => i.ing != '' && i.lat != '');
  332. for (const i of data) {
  333. this.setMark(i);
  334. }
  335. } else if (index === '5-1') {
  336. for (const i of this.zdsys) {
  337. this.setMark(i);
  338. }
  339. } else if (index === '5-2') {
  340. let data = this.gcjsyjzx.filter(i => i.ing != '' && i.lat != '');
  341. for (const i of data) {
  342. this.setMark(i);
  343. }
  344. } else if (index === '5-3') {
  345. for (const i of this.dxkjy) {
  346. this.setMark(i);
  347. }
  348. } else if (index === '5-4') {
  349. let data = this.kjqyfhq.filter(i => i.ing != '' && i.lat != '');
  350. for (const i of data) {
  351. this.setMark(i);
  352. }
  353. } else if (index === '5-5') {
  354. for (const i of this.cyhjd) {
  355. this.setMark(i);
  356. }
  357. } else if (index === '5-6') {
  358. for (const i of this.jszysfjg) {
  359. this.setMark(i);
  360. }
  361. } else if (index === '5-7') {
  362. for (const i of this.kjhzjd) {
  363. this.setMark(i);
  364. }
  365. } else if (index === '5-8') {
  366. let data = this.ysgzz.filter(i => i.ing != '' && i.lat != '');
  367. for (const i of data) {
  368. this.setMark(i);
  369. }
  370. } else if (index === '5-9') {
  371. let data = this.jscxlm.filter(i => i.ing != '' && i.lat != '');
  372. for (const i of data) {
  373. this.setMark(i);
  374. }
  375. } else if (index === '5-10') {
  376. for (const i of this.kjcxzx) {
  377. this.setMark(i);
  378. }
  379. } else if (index === '5-11') {
  380. let data = this.kjcgzhzszx.filter(i => i.ing != '' && i.lat != '');
  381. for (const i of data) {
  382. this.setMark(i);
  383. }
  384. } else if (index === '6-1') {
  385. let data = this.sccjzx.filter(i => i.ing != '' && i.lat != '');
  386. for (const i of data) {
  387. this.setMark(i);
  388. }
  389. } else if (index === '6-2') {
  390. for (const i of this.jshtdjd) {
  391. this.setMark(i);
  392. }
  393. } else if (index === '6-3') {
  394. for (const i of this.jsdsc) {
  395. this.setMark(i);
  396. }
  397. } else if (index === '6-4') {
  398. for (const i of this.kjcgpjsd) {
  399. this.setMark(i);
  400. }
  401. } else if (index === '7-1') {
  402. for (const i of this.zdxm) {
  403. this.setMark(i);
  404. }
  405. } else if (index === '8-1') {
  406. for (const i of this.kjjl) {
  407. this.setMark(i);
  408. }
  409. }
  410. },
  411. },
  412. computed: {
  413. ...mapState(['user']),
  414. },
  415. };
  416. </script>
  417. <style lang="less" scoped>
  418. #container {
  419. width: 100%;
  420. height: 100vh;
  421. }
  422. .search-box {
  423. position: absolute;
  424. top: 25px;
  425. right: 20px;
  426. }
  427. .menus {
  428. position: absolute;
  429. top: 25px;
  430. left: 20px;
  431. z-index: 200;
  432. }
  433. </style>