From 225e92ed4fd01dd9be529d7f9e5e546e05a0d277 Mon Sep 17 00:00:00 2001
From: wjt <1797368093@qq.com>
Date: 星期一, 22 七月 2024 15:01:16 +0800
Subject: [PATCH] 添加来访信息
---
src/views/main/components/selectColor.vue | 91 +++
src/assets/icon/icon3.png | 0
src/views/infomanger/infoLook/components/export.vue | 63 ++
src/api/system/company/company.ts | 23
src/assets/icon/icon2.png | 0
src/views/infomanger/infoLook/components/exportRecord.vue | 155 ++++++
src/views/main/components/theme.vue | 42 +
src/permission.ts | 2
src/views/main/indexMarge.vue | 552 +++++++++++++++++++++++
src/views/infomanger/infoLook/index.vue | 318 +++++++++++++
.env.development | 5
src/assets/icon/icon1.png | 0
src/views/infomanger/infoLook/components/judge.vue | 67 ++
src/assets/icon/icon4.png | 0
src/views/infomanger/infoLook/components/createQrcode.vue | 105 ++++
index.html | 2
src/router/index.ts | 5
17 files changed, 1,427 insertions(+), 3 deletions(-)
diff --git a/.env.development b/.env.development
index 7b8fc5a..8ce352a 100644
--- a/.env.development
+++ b/.env.development
@@ -1,10 +1,11 @@
# 椤甸潰鏍囬
-VITE_APP_TITLE = 鍏ヤ紒鎵爜
+VITE_APP_TITLE = 鎯犱紒鎵ф硶
# 寮�鍙戠幆澧冮厤缃�
VITE_APP_ENV = 'development'
-VITE_APP_BASE = 'http://172.16.61.34:8089'
+# VITE_APP_BASE = 'http://172.16.61.31:8089'
+VITE_APP_BASE = 'http://172.16.60.184:8089'
# VITE_APP_BASE = 'http://172.16.61.34:8089'
#VITE_APP_BASE = 'http://localhost:8089'
diff --git a/index.html b/index.html
index 7cfb61d..3c2e529 100644
--- a/index.html
+++ b/index.html
@@ -7,6 +7,8 @@
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
<!-- <link rel="icon" href="/logo.ico" /> -->
<title>鎯犱紒鎵ф硶</title>
+ <script src='//webapi.amap.com/maps?v=2.0&key=a3472b04ae282cabb61670b13c7b90ab' type="text/javascript"></script>
+ <script src="//webapi.amap.com/ui/1.1/main.js"></script>
<!--[if lt IE 11
]><script>
window.location.href = "/html/ie.html";
diff --git a/src/api/system/company/company.ts b/src/api/system/company/company.ts
index 6370335..b5f4244 100644
--- a/src/api/system/company/company.ts
+++ b/src/api/system/company/company.ts
@@ -326,4 +326,27 @@
method: 'get',
params: data
})
+}
+// /enforce/company/log/list
+export function listCompanyLog(data) {
+ return request({
+ url: `/enforce/company/log/list`,
+ method: 'get',
+ params: data
+ })
+}
+// /enforce/company/log/upd
+export function updCompanyLog(data) {
+ return request({
+ url: `/enforce/company/log/upd`,
+ method: 'post',
+ data: data
+ })
+}
+// /enforce/company/log/{ids}
+export function delCompanyLog(data) {
+ return request({
+ url: `/enforce/company/log/${data.delId}`,
+ method: 'DELETE',
+ })
}
\ No newline at end of file
diff --git a/src/assets/icon/icon1.png b/src/assets/icon/icon1.png
new file mode 100644
index 0000000..e8721fa
--- /dev/null
+++ b/src/assets/icon/icon1.png
Binary files differ
diff --git a/src/assets/icon/icon2.png b/src/assets/icon/icon2.png
new file mode 100644
index 0000000..76d2091
--- /dev/null
+++ b/src/assets/icon/icon2.png
Binary files differ
diff --git a/src/assets/icon/icon3.png b/src/assets/icon/icon3.png
new file mode 100644
index 0000000..00e102c
--- /dev/null
+++ b/src/assets/icon/icon3.png
Binary files differ
diff --git a/src/assets/icon/icon4.png b/src/assets/icon/icon4.png
new file mode 100644
index 0000000..a3099c5
--- /dev/null
+++ b/src/assets/icon/icon4.png
Binary files differ
diff --git a/src/permission.ts b/src/permission.ts
index 01a2216..54ce5bf 100644
--- a/src/permission.ts
+++ b/src/permission.ts
@@ -11,7 +11,7 @@
NProgress.configure({ showSpinner: false });
-const whiteList = ["/login", "/register"];
+const whiteList = ["/login", "/register", "/main"];
router.beforeEach((to, from, next) => {
NProgress.start();
diff --git a/src/router/index.ts b/src/router/index.ts
index cf80dec..a6769dd 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -1,6 +1,7 @@
import { createWebHistory, createRouter, RouteRecordRaw } from "vue-router";
/* Layout */
import Layout from "@/layout/index.vue";
+import path from "path";
/**
* Note: 璺敱閰嶇疆椤�
@@ -58,6 +59,10 @@
hidden: true,
},
{
+ path: '/main',
+ component: () => import("@/views/main/indexMarge.vue"),
+ },
+ {
path: "",
component: Layout,
redirect: "/home",
diff --git a/src/views/infomanger/infoLook/components/createQrcode.vue b/src/views/infomanger/infoLook/components/createQrcode.vue
new file mode 100644
index 0000000..87aa2da
--- /dev/null
+++ b/src/views/infomanger/infoLook/components/createQrcode.vue
@@ -0,0 +1,105 @@
+<template>
+ <el-dialog title="浜岀淮鐮�" v-model="dialogVisible" width="300px" @close="closeDialog">
+ <div class="text-center">
+ <vueQr ref="query" background="#fff" :text="info.companyCode"></vueQr>
+ <div style="font-weight: bold;margin-bottom: 10px;">娌堜笜鎯犱紒鎵ф硶</div>
+
+ <div>{{ info.companyName }}</div>
+ <div style="margin-top: 10px;">
+ <el-link @click="downImage" type="primary">涓嬭浇浼佷笟鐮�</el-link>
+ </div>
+ </div>
+ <canvas ref="canvasRef" style="position: absolute; left: 0; top: 2210px;background-color: white; display: none;"></canvas>
+ </el-dialog>
+</template>
+
+<script lang="ts" setup>
+import vueQr from 'vue-qr/src/packages/vue-qr.vue'
+let dialogVisible = ref(false)
+const canvasRef = ref()
+const info = ref({})
+const query = ref()
+function openDialog(row) {
+ // console.log(row)
+ info.value = row
+ dialogVisible.value = true
+}
+function closeDialog() {
+ dialogVisible.value = false
+}
+function downImage() {
+ drawText()
+ const imageUrl = canvasRef.value.toDataURL('image/png')
+ // console.log(query.value.imgUrl)
+ let aLink = document.createElement('a')
+ let blob = base64ToBlob(imageUrl)
+ let evt = document.createEvent("HTMLEvents")
+ evt.initEvent("click", true, true) // initEvent 涓嶅姞鍚庝袱涓弬鏁板湪FF涓嬩細鎶ラ敊 浜嬩欢绫诲瀷锛屾槸鍚﹀啋娉★紝鏄惁闃绘娴忚鍣ㄧ殑榛樿琛屼负
+ aLink.download = "浜岀淮鐮�.png"
+ aLink.href = URL.createObjectURL(blob);
+ // aLink.dispatchEvent(evt);
+ aLink.click()
+}
+function drawText() {
+ const canvas = canvasRef.value;
+ canvas.width = 350;
+ canvas.height = 380;
+ canvas.style.width = '350px';
+ canvas.style.height = '380px';
+ const ctx = canvas.getContext('2d');
+ ctx.fillStyle = "#fff"
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
+ let img = new Image();
+ img.src = query.value.imgUrl;
+ const text = info.value.companyName;
+
+ ctx.drawImage(img, 10, 0, 320, 320);
+ // ctx.font = '20px Arial';
+ ctx.textAlign = 'center';
+ ctx.fillStyle = '#000';
+ // ctx.setFontWeight('bold')
+ ctx.font ='bold 20px Arial'
+ wrapText(ctx, "娌堜笜鎯犱紒鎵ф硶", 180, 320, 350, 40)
+ // ctx.setFontWeight('normal')
+ ctx.font ="20px Arial"
+ wrapText(ctx, text, 180, 350, 350, 20)
+ }
+ function wrapText(context, text, x, y, maxWidth, lineHeight) {
+ var words = text.split('');
+ var line = '';
+ for(var n = 0; n < words.length; n++) {
+ var testLine = line + words[n] + ' ';
+ var metrics = context.measureText(testLine);
+ var testWidth = metrics.width;
+ if (testWidth > maxWidth && n > 0) {
+ context.fillText(line, x, y);
+ line = words[n] + ' ';
+ y += lineHeight;
+ }
+ else {
+ line = testLine;
+ }
+ }
+ if(line) {
+ context.fillText(line, x, y);
+ }
+}
+function base64ToBlob(code) {
+ let parts = code.split(';base64,')
+ let contentType = parts[0].split(':')[1]
+ let raw = window.atob(parts[1])
+ let rawLength = raw.length
+ let uInt8Array = new Uint8Array(rawLength)
+ for (let i = 0; i < rawLength; ++i) {
+ uInt8Array[i] = raw.charCodeAt(i)
+ }
+ return new Blob([uInt8Array], {type: contentType})
+ }
+defineExpose({
+ openDialog,
+ closeDialog
+})
+</script>
+
+<style>
+</style>
\ No newline at end of file
diff --git a/src/views/infomanger/infoLook/components/export.vue b/src/views/infomanger/infoLook/components/export.vue
new file mode 100644
index 0000000..10ddd51
--- /dev/null
+++ b/src/views/infomanger/infoLook/components/export.vue
@@ -0,0 +1,63 @@
+<template>
+ <el-dialog title="鐢ㄦ埛瀵煎叆" v-model="dialogVisible" width="900px" append-to-body @close="cloaseDialog"
+ >
+ <el-form label-width="80px">
+ <el-form-item label="涓嬭浇妯℃澘">
+ <el-link type="primary" @click="downLoad">浼佷笟淇℃伅瀵煎叆妯℃澘.xlsx</el-link>
+ </el-form-item>
+ <el-form-item label="閫夊彇鏂囦欢">
+ <FileUpload :limit="1" :fileType="['cvs', 'xlsx']" v-model="form.exportNews.file" @resList="resList"></FileUpload>
+ </el-form-item>
+ </el-form>
+ <template #footer>
+ <div style="text-align: center;">
+ <el-button @click="cloaseDialog" >鍏抽棴</el-button>
+ </div>
+ </template>
+ </el-dialog>
+</template>
+
+<script lang="ts" setup>
+import { ref } from 'vue'
+import { ElMessageBox } from 'element-plus'
+import FileUpload from '@/components/FileUpload/handlerImport.vue'
+import { download as downloadHttp} from '@/utils/request'
+import { downTemplate, importTemplate, doImport, exportTemplate } from '@/api/system/company/company'
+const { proxy } = getCurrentInstance();
+const dialogVisible = ref(false)
+const emit = defineEmits()
+const form = reactive({
+ exportNews: {}
+})
+function openDialog() {
+ dialogVisible.value = true
+}
+
+function cloaseDialog() {
+ dialogVisible.value = false
+}
+function downLoad() {
+ exportTemplate().then(val => {
+ downloadHttp('/tool/file/download', {
+ fileName: val.msg,
+ delete: true
+ }, "浼佷笟淇℃伅妯℃澘.xlsx")
+ })
+}
+function startExport() {
+ uploadFile()
+}
+function resList(row) {
+ cloaseDialog()
+ emit('resList', row)
+}
+defineExpose({
+ openDialog,
+ cloaseDialog
+})
+</script>
+<style scoped>
+.dialog-footer button:first-child {
+ margin-right: 10px;
+}
+</style>
diff --git a/src/views/infomanger/infoLook/components/exportRecord.vue b/src/views/infomanger/infoLook/components/exportRecord.vue
new file mode 100644
index 0000000..6879481
--- /dev/null
+++ b/src/views/infomanger/infoLook/components/exportRecord.vue
@@ -0,0 +1,155 @@
+<template>
+ <el-dialog title="瀵煎叆璁板綍" v-model="dialogVisible" width="1200px" append-to-body @close="closeDialog"
+ >
+ <el-table :data="recordValue" border>
+ <el-table-column label="浼佷笟鍚�(浼佷笟鍏ㄧО)" prop="companyName">
+ <template #default="scope">
+ <div class="flex-box-per">
+ <el-input v-model="scope.row.companyName" @blur="checkImport(scope.row, scope.$index)"></el-input>
+ <el-tooltip v-if="scope.row.errorList.length && scope.row.errorList.find(item => item.index == 0)" :content="scope.row.errorList.find(item => item.index == 0).msg">
+ <div class="ml5">
+ <el-icon size="large" color="red" class="ml5"><CircleCloseFilled /></el-icon>
+ </div>
+ </el-tooltip>
+ </div>
+ </template>
+ </el-table-column>
+ <el-table-column label="缁熶竴绀句細淇$敤浠g爜" prop="companyCode">
+ <template #default="scope">
+ <div class="flex-box-per">
+ <el-input v-model="scope.row.companyCode" @blur="checkImport(scope.row, scope.$index)"></el-input>
+ <el-tooltip v-if="scope.row.errorList.length && scope.row.errorList.find(item => item.index == 1)" :content="scope.row.errorList.find(item => item.index == 1).msg">
+ <div class="ml5">
+ <el-icon size="large" color="red" class="ml5"><CircleCloseFilled /></el-icon>
+ </div>
+ </el-tooltip>
+
+ </div>
+ </template>
+ </el-table-column>
+ <el-table-column label="浼佷笟鑱旂郴浜�" prop="companyUser">
+ <template #default="scope">
+ <div class="flex-box-per">
+ <el-input v-model="scope.row.companyUser" @blur="checkImport(scope.row, scope.$index)"></el-input>
+ <el-tooltip v-if="scope.row.errorList.length && scope.row.errorList.find(item => item.index == 2)" :content="scope.row.errorList.find(item => item.index == 2).msg">
+ <div class="ml5" v-if="scope.row.errorList.length &&scope.row.errorList.find(item => item.index == 2)">
+ <el-icon size="large" color="red" class="ml5"><CircleCloseFilled /></el-icon>
+ </div>
+ </el-tooltip>
+
+ </div>
+
+ </template>
+ </el-table-column>
+ <el-table-column label="鑱旂郴浜虹數璇�" prop="companyPhone">
+ <template #default="scope">
+ <div class="flex-box-per">
+ <el-input type="numer" :maxlength="11" v-model="scope.row.companyPhone" @blur="checkImport(scope.row, scope.$index, 'companyPhone')"></el-input>
+ <el-tooltip v-if="scope.row.errorList.length && scope.row.errorList.find(item => item.index == 3)" :content="scope.row.errorList.find(item => item.index == 3).msg">
+ <div class="ml5">
+ <el-icon size="large" color="red" class="ml5"><CircleCloseFilled /></el-icon>
+ </div>
+ </el-tooltip>
+
+ </div>
+
+ </template>
+ </el-table-column>
+ <el-table-column label="浼佷笟鍦板潃" prop="companyAddress">
+ <template #default="scope">
+ <div class="flex-box-per">
+ <el-input v-model="scope.row.companyAddress" @blur="checkImport(scope.row, scope.$index)"></el-input>
+ <el-tooltip v-if="scope.row.errorList.length && scope.row.errorList.find(item => item.index == 4)" :content="scope.row.errorList.find(item => item.index == 4).msg">
+ <div class="ml5" v-if="scope.row.errorList.length && scope.row.errorList.find(item => item.index == 4)">
+ <el-icon size="large" color="red" class="ml5"><CircleCloseFilled /></el-icon>
+ </div>
+ </el-tooltip>
+ </div>
+
+ </template>
+ </el-table-column>
+ <el-table-column label="澶囨敞" prop="mark">
+ <template #default="scope">
+ <div class="flex-box-per">
+ <el-input v-model="scope.row.mark" @blur="checkImport(scope.row, scope.$index)"></el-input>
+ <el-tooltip v-if="scope.row.errorList.length && scope.row.errorList.find(item => item.index == 5)" :content="scope.row.errorList.find(item => item.index == 5).msg">
+ <div class="ml5">
+ <el-icon size="large" color="red" class="ml5"><CircleCloseFilled /></el-icon>
+ </div>
+ </el-tooltip>
+
+ </div>
+
+ </template>
+ </el-table-column>
+ </el-table>
+ <template #footer>
+ <div class="dialog-footer">
+ <el-button @click="closeDialog">鍙� 娑�</el-button>
+ <el-button type="primary" @click="addCompany">纭� 瀹�</el-button>
+ </div>
+ </template>
+ </el-dialog>
+</template>
+
+<script setup lang="ts">
+import { checkImport as checkImportHttp, saveImport } from '@/api/system/company/company'
+import { ElMessage} from 'element-plus'
+const dialogVisible = ref(false)
+const emits = defineEmits()
+const props = defineProps({
+ recordRow: { type: Array, default: () => [] },
+})
+const recordValue = ref([])
+watch(() => props.recordRow, (newValue) => {
+ // console.log(props.recordRow)
+ recordValue.value = newValue
+})
+function openDialog() {
+ dialogVisible.value = true
+}
+function closeDialog() {
+ dialogVisible.value = false
+}
+function checkImport(row, index, item) {
+ // row.companyPhone
+ if(item && item == 'companyPhone') {
+ if(row.companyPhone) {
+ const reg = /^1[3|4|5|6|7|8|9][0-9]\d{8}$/
+ if(!reg.test(row.companyPhone)){
+ ElMessage.error('璇疯緭鍏ユ纭殑鎵嬫満鍙�')
+ }
+ }
+ }
+ checkImportHttp({voList: [row]}).then(val => {
+ // recordValue.value.splice(index, 1, val.data.voList[0])
+ recordValue.value[index] = val.data.voList[0]
+ // ElMessage.success('淇敼鎴愬姛')
+ })
+}
+function addCompany() {
+ saveImport({voList: recordValue.value}).then(val =>{
+ ElMessage.success('瀵煎叆鎴愬姛')
+ closeDialog()
+ emits('uploadList')
+ })
+}
+defineExpose({
+ openDialog,
+ closeDialog
+})
+</script>
+<style >
+.dialog-footer{
+ text-align: center;
+}
+.flex-box-per{
+ display: flex;
+ justify-content: flex-start;
+ align-items: center;
+}
+.ml5{
+ /* margin-left: 5px; */
+ line-height: 15px;
+}
+</style>
\ No newline at end of file
diff --git a/src/views/infomanger/infoLook/components/judge.vue b/src/views/infomanger/infoLook/components/judge.vue
new file mode 100644
index 0000000..d86aaee
--- /dev/null
+++ b/src/views/infomanger/infoLook/components/judge.vue
@@ -0,0 +1,67 @@
+<template>
+ <el-dialog title="瀹℃牳" v-model="dialogVisible" width="900px" append-to-body @close="cloaseDialog"
+ >
+ <el-form>
+ <!-- <el-form-item label="瀹℃牳绫诲瀷">
+ <el-select style="width: 200px;" v-model="form.checkType">
+ <el-option label="浼佷笟瀹℃壒" value="1"></el-option>
+ <el-option label="浼佷笟瀹℃壒" value="2"></el-option>
+ </el-select>
+ </el-form-item> -->
+ <el-form-item label="瀹℃牳鐘舵��">
+ <el-radio-group v-model="form.checkStatus" class="ml-4">
+ <el-radio value="1" size="large">閫氳繃</el-radio>
+ <el-radio value="-1" size="large">鎷掔粷</el-radio>
+ </el-radio-group>
+ </el-form-item>
+ <el-form-item label="瀹℃牳璇存槑">
+ <el-input type="textarea" v-model="form.checkReason" ></el-input>
+ </el-form-item>
+ </el-form>
+ <template #footer>
+ <div style="text-align: center;">
+ <el-button @click="cloaseDialog" >鍏抽棴</el-button>
+ <el-button @click="checkOrder" type="primary">纭</el-button>
+ </div>
+ </template>
+ </el-dialog>
+</template>
+
+<script setup lang="ts">
+import { checkOrder as httpCheck } from '@/api/system/company/company'
+import { ElMessage } from 'element-plus'
+const dialogVisible = ref(false)
+const info = ref({})
+const emit:any = defineEmits()
+const form: any = reactive({
+ checkStatus: '1'
+})
+const cloaseDialog = () => {
+ dialogVisible.value = false
+}
+const openDialog = (row: { companyId?: any }) => {
+ info.value = row
+ form['ids'] = [row.companyId]
+ form['checkType'] = 1
+ form['checkReason'] = ''
+ dialogVisible.value = true
+}
+function checkOrder() {
+ if(!form['checkStatus']) {
+ ElMessage.error('璇峰~鍐欏鏍哥姸鎬�')
+ return
+ }
+ if(form['checkStatus'] == -1 && !form.checkReason) {
+ ElMessage.error('璇峰~鍐欏鏍歌鏄�')
+ return
+ }
+ httpCheck(form).then(res => {
+ cloaseDialog()
+ emit('upload')
+ })
+}
+defineExpose({
+ openDialog,
+ cloaseDialog
+})
+</script>
\ No newline at end of file
diff --git a/src/views/infomanger/infoLook/index.vue b/src/views/infomanger/infoLook/index.vue
new file mode 100644
index 0000000..4946107
--- /dev/null
+++ b/src/views/infomanger/infoLook/index.vue
@@ -0,0 +1,318 @@
+<template>
+ <div class="app-container">
+ <el-form :model="queryParams" ref="queryRef" class="evenly-distributed-labels" :inline="true" v-show="showSearch" label-width="80px" label-position="left">
+ <el-form-item label="浼佷笟鍚嶇О" prop="companyName">
+ <el-input v-model="queryParams.companyName" placeholder="璇疯緭鍏ヤ紒涓氬悕绉�" clearable style="width: 200px" @keyup.enter="handleQuery" />
+ </el-form-item>
+ <el-form-item label="浼佷笟缂栧彿" prop="companyCode">
+ <el-input v-model="queryParams.companyCode" placeholder="璇疯緭鍏ヤ紒涓氱紪鍙�" clearable style="width: 200px" @keyup.enter="handleQuery" />
+ </el-form-item>
+ <el-form-item label="鑱旂郴浜�" prop="companyUser">
+ <el-input v-model="queryParams.companyUser" placeholder="璇疯緭鍏ヨ仈绯讳汉" clearable style="width: 200px" @keyup.enter="handleQuery" />
+ </el-form-item>
+ <el-form-item label="鎵嬫満鍙�" prop="companyPhone">
+ <el-input v-model="queryParams.companyPhone" type="number" placeholder="璇疯緭鍏ユ墜鏈哄彿" clearable style="width: 200px" @keyup.enter="handleQuery" />
+ </el-form-item>
+ <el-form-item>
+ <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
+ <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
+ </el-form-item>
+ </el-form>
+ <el-table
+ v-if="refreshTable"
+ v-loading="loading"
+ :data="deptList"
+ row-key="deptId"
+ :default-expand-all="isExpandAll"
+ :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
+ >
+ <el-table-column prop="companyName" label="浼佷笟鍚嶇О" minWidth="300"></el-table-column>
+ <!-- <el-table-column prop="companyName" label="浼佷笟绫诲瀷" width="200"></el-table-column> -->
+ <el-table-column prop="companyUser" label="鑱旂郴浜�" width="180"></el-table-column>
+ <el-table-column prop="companyPhone" label="鎵嬫満鍙风爜" width="120"></el-table-column>
+ <el-table-column prop="comeTime" label="鍒涘缓鏃堕棿" width="200"></el-table-column>
+ <el-table-column prop="comeContent" label="鏉ヨ浜嬮」" width="200"></el-table-column>
+ <el-table-column prop="userNum" label="闅忚浜烘暟" width="200"></el-table-column>
+ <el-table-column prop="remark" label="澶囨敞" ></el-table-column>
+ <el-table-column label="鎿嶄綔" align="center" fixed="right" class-name="small-padding fixed-width" width="240">
+ <template #default="scope">
+ <el-link type="success" v-if="scope.row.checkStatus < 2" v-hasPermi="['sys:company:check']" @click="checkJudge(scope.row)">瀹℃牳</el-link>
+ <el-divider direction="vertical" v-hasPermi="['sys:company:check']" v-if="scope.row.checkStatus < 2"/>
+ <el-link type="info" v-if="scope.row.checkStatus == 2" @click="createQrcodeHandler(scope.row)">浜岀淮鐮�</el-link>
+ <el-divider direction="vertical" v-if="scope.row.checkStatus == 2"/>
+ <el-link type="primary" @click="handleAdd(scope.row)">缂栬緫</el-link>
+ <el-divider direction="vertical" />
+ <el-link type="error" @click="handleDelete(scope.row)">鍒犻櫎</el-link>
+ </template>
+ </el-table-column>
+ </el-table>
+ <pagination v-show="queryParams.total > 0" :total="queryParams.total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+
+ <!-- 娣诲姞鎴栦慨鏀瑰璇濇 -->
+ <el-dialog :title="title" v-model="open" width="600px" append-to-body>
+ <el-form ref="deptRef" :model="form" :rules="rules" label-width="140px">
+ <el-form-item label="浼佷笟鍚嶇О" prop="companyName">
+ <el-input placeholder="璇疯緭鍏ヤ紒涓氬悕绉�" v-model="form.companyName"></el-input>
+ </el-form-item>
+ <el-form-item label="鑱旂郴浜�" prop="companyUser">
+ <el-input placeholder="璇疯緭鍏ヨ仈绯讳汉" v-model="form.companyUser"></el-input>
+ </el-form-item>
+ <el-form-item label="鎵嬫満鍙风爜" prop="companyPhone">
+ <el-input placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" v-model="form.companyPhone"></el-input>
+ </el-form-item>
+ <el-form-item label="鏉ヨ浜哄憳" prop="comeUser">
+ <el-input placeholder="璇疯緭鍏�" v-model="form.comeUser"></el-input>
+ </el-form-item>
+ <el-form-item label="鏉ヨ浜嬮」" prop="comeContent">
+ <el-input placeholder="璇疯緭鍏�" v-model="form.comeContent"></el-input>
+ </el-form-item>
+ <el-form-item label="闅忚浜烘暟" prop="userNum">
+ <el-input placeholder="璇疯緭鍏�" v-model="form.userNum"></el-input>
+ </el-form-item>
+ <el-form-item label="澶囨敞">
+ <el-input placeholder="璇疯緭鍏ュ娉�" v-model="form.remark"></el-input>
+ </el-form-item>
+ </el-form>
+ <template #footer>
+ <div class="dialog-footer">
+ <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+ <el-button @click="cancel">鍙� 娑�</el-button>
+ </div>
+ </template>
+ </el-dialog>
+ <exportExcelCom ref="exporttem" @resList="resList"></exportExcelCom>
+ <exportRecord ref="exportRecordCom" :recordRow="recordRow" @uploadList="getList"></exportRecord>
+ <judgeCom ref="judgeComRef" @upload="getList"></judgeCom>
+ <createQrcode ref="createQrcodeRef"></createQrcode>
+ </div>
+</template>
+
+<script setup name="Dept">
+import FileUpload from '@/components/ImageUpload/index'
+import exportRecord from './components/exportRecord'
+import createQrcode from './components/createQrcode'
+import judgeCom from './components/judge'
+import { listCompanyLog,addCompany, updStatus, delCompanyLog, updCompanyLog } from "@/api/system/company/company";
+import exportExcelCom from './components/export'
+import { computed } from "vue";
+import { judgeStatus, companyStatus, scopeList } from '@/utils/mapList/index.ts'
+import useSettingsStore from "@/store/modules/settings";
+const thcolor = computed(() => useSettingsStore().theme);
+const { proxy } = getCurrentInstance();
+const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
+const deptList = ref([]);
+const open = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const title = ref("");
+const deptOptions = ref([]);
+const isExpandAll = ref(false);
+const refreshTable = ref(true);
+const exporttem = ref()
+const exportRecordCom = ref()
+const judgeComRef = ref()
+const createQrcodeRef = ref()
+const options = reactive({
+ // -1鎷掔粷锛�0寰呭鎵癸紝1瀹℃壒涓紝2閫氳繃
+ checkOptions: [
+ {
+ label: '鎷掔粷',
+ value: -1
+ },
+ {
+ label: '寰呭鎵�',
+ value: 0
+ },
+ {
+ label: '瀹℃壒涓�',
+ value: 1
+ },
+ {
+ label: '閫氳繃',
+ value: 2
+ }
+ ],
+ companyStatus: [
+ {
+ label: '姝e父',
+ value: 0
+ },
+ {
+ label: '绂佺敤',
+ value: 1
+ },
+ ],
+ socreList: [
+ {
+ label: '瀵煎叆',
+ value: 1
+ },
+ {
+ label: '娉ㄥ唽',
+ value: 0
+ },
+ ]
+})
+const data = reactive({
+ form: {},
+ queryParams: {
+ deptName: undefined,
+ status: undefined,
+ deptType: undefined,
+ pageNum: 1,
+ pageSize: 10,
+ total: 1
+ },
+ rules: {
+ companyName: [{ required: true, message: "浼佷笟鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }],
+ companyUser: [{ required: true, message: "鑱旂郴浜轰笉鑳戒负绌�", trigger: "blur" }],
+ companyPhone: [{ required: true, message: "鎵嬫満鍙风爜涓嶈兘涓虹┖", trigger: "blur" }, {
+ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜", trigger: "blur"
+ }],
+ companyCode: [{ required: true, message: "缁熶竴绀句細淇$敤浠g爜涓嶈兘涓虹┖", trigger: "blur" }],
+ companyImg: [{ required: true, message: "钀ヤ笟鎵х収涓嶈兘涓虹┖", trigger: "blur" }],
+ companyAddress: [{ required: true, message: "浼佷笟鍦板潃涓嶈兘涓虹┖", trigger: "blur" }],
+
+ // email: [{ type: "email", message: "璇疯緭鍏ユ纭殑閭鍦板潃", trigger: ["blur", "change"] }],
+ // phone: [{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜", trigger: "blur" }],
+ },
+});
+
+const { queryParams, form, rules } = toRefs(data);
+// const dispDeptType = computed(() => (e) => {
+// return dept_type.value.find((f) => f.value == e).label;
+// });
+const recordRow = ref([])
+/** 鏌ヨ浼佷笟鍒楄〃 */
+function getList() {
+ loading.value = true;
+ listCompanyLog(queryParams.value).then((response) => {
+ deptList.value = response.rows
+ data.queryParams.total = response.total
+ loading.value = false;
+ });
+}
+/** 鍙栨秷鎸夐挳 */
+function cancel() {
+ open.value = false;
+ reset();
+ getList();
+}
+/** 琛ㄥ崟閲嶇疆 */
+function reset() {
+ form.value = {
+ deptId: undefined,
+ parentId: undefined,
+ deptName: undefined,
+ orderNum: 0,
+ leader: undefined,
+ phone: undefined,
+ email: undefined,
+ status: "0",
+ deptType: undefined,
+ };
+ proxy.resetForm("deptRef");
+}
+const queryRef = ref()
+/** 鎼滅储鎸夐挳鎿嶄綔 */
+function handleQuery() {
+ getList();
+}
+/** 閲嶇疆鎸夐挳鎿嶄綔 */
+function resetQuery() {
+ queryRef.value.resetFields();
+ handleQuery();
+}
+/** 鏂板鎸夐挳鎿嶄綔 */
+function handleAdd(row) {
+ if(row) {
+ form.value = row
+ title.value = "缂栬緫浼佷笟";
+ } else {
+ form.value = {
+ companyStatus: 0
+ }
+ title.value = "娣诲姞浼佷笟";
+ }
+ open.value = true;
+}
+
+/** 鎻愪氦鎸夐挳 */
+function submitForm() {
+ proxy.$refs["deptRef"].validate((valid) => {
+ if (valid) {
+ if (form.value.companyId != undefined) {
+ updCompanyLog(form.value).then((response) => {
+ proxy.$modal.msgSuccess("淇敼鎴愬姛");
+ open.value = false;
+ getList();
+ });
+ } else {
+ addCompany(form.value).then((response) => {
+ proxy.$modal.msgSuccess("鏂板鎴愬姛");
+ open.value = false;
+ getList();
+ });
+ }
+ }
+ });
+}
+/** 鍒犻櫎鎸夐挳鎿嶄綔 */
+function handleDelete(row) {
+ proxy.$modal
+ .confirm('鏄惁纭鍒犻櫎璇ユ暟鎹�?')
+ .then(function () {
+ return delCompanyLog({delId: row.id});
+ })
+ .then(() => {
+ getList();
+ proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+ })
+ .catch(() => {});
+}
+// 淇敼浼佷笟淇℃伅
+function changeCompanyNews(row, event) {
+ if(loading.value){
+ return
+ }
+ updStatus(row).then(val => {
+ proxy.$modal.msgSuccess("淇敼鎴愬姛");
+ getList();
+ })
+}
+// 瀵煎叆妯℃澘
+function exportExcel() {
+ exporttem.value.openDialog()
+}
+// 瀵煎叆璁板綍
+function exportRecordComOpen() {
+ exportRecordCom.value.openDialog()
+}
+function resList(row) {
+ recordRow.value = row
+ exportRecordCom.value.openDialog()
+}
+function checkJudge(row) {
+ judgeComRef.value.openDialog(row)
+}
+function createQrcodeHandler(row) {
+ createQrcodeRef.value.openDialog(row)
+}
+getList();
+</script>
+
+<style scoped lang="scss">
+.evenly-distributed-labels {
+ :deep(){
+ .el-form-item__label {
+ position: relative; /* 璁剧疆鐩稿瀹氫綅浣滀负鏄熷彿鐨勫畾浣嶅熀鍑� */
+ text-align: justify;
+ text-align-last: justify; /* 纭繚鏈�鍚庝竴琛屼篃涓ょ瀵归綈 */
+ padding-left: 10px; /* 涓烘槦鍙烽鐣欑┖闂� */
+ display: inline-block;
+ }
+ }
+}
+
+
+</style>
diff --git a/src/views/main/components/selectColor.vue b/src/views/main/components/selectColor.vue
new file mode 100644
index 0000000..8df5a7f
--- /dev/null
+++ b/src/views/main/components/selectColor.vue
@@ -0,0 +1,91 @@
+<template>
+ <div class="select-color">
+ <div class="color red" :class="[selectColor === '#FF0000' ? 'active' : '']" @click="selectColorClick('#FF0000')" />
+ <div
+ class="color green"
+ :class="[selectColor === '#008000' ? 'active' : '']"
+ @click="selectColorClick('#008000')"
+ />
+ <div
+ class="color yellow"
+ :class="[selectColor === '#0000FF' ? 'active' : '']"
+ @click="selectColorClick('#0000FF')"
+ />
+ <div
+ class="gradit-color"
+ :style="{ 'background': `linear-gradient(${selectColor}, ${adjustColor(selectColor, 200)})` }"
+ />
+ </div>
+</template>
+<script>
+export default {
+ props: {
+ selectColor: {
+ type: String,
+ default: '#FF0000'
+ }
+ },
+ methods: {
+ selectColorClick(item) {
+ this.$emit('update:selectColor', item)
+ this.$emit('changeRender')
+ },
+ adjustColor(color, range) {
+ let newColor = '#'
+ for (let i = 0; i < 3; i++) {
+ const hxStr = color.substr(i * 2 + 1, 2)
+ let val = parseInt(hxStr, 16)
+ val += range
+ if (val < 0) val = 0
+ else if (val > 255) val = 255
+ newColor += val.toString(16).padStart(2, '0')
+ }
+ this.$emit('minColor', newColor)
+ return newColor
+ }
+ }
+}
+</script>
+<style scoped>
+.select-color {
+ position: fixed;
+ top: 0;
+ z-index: 100000;
+ padding: 20px;
+}
+
+.title {
+ font-size: 26px;
+ font-weight: 700;
+ margin-bottom: 10px;
+}
+
+.color {
+ width: 100px;
+ height: 100px;
+ margin-bottom: 20px;
+}
+
+.red {
+ background-color: red;
+}
+
+.green {
+ background-color: green;
+}
+
+.yellow {
+ background-color: #0000FF;
+}
+
+.active {
+ border: 2px solid #a0a0a0;
+ box-shadow: 0 0 10px #232323;
+}
+
+.gradit-color {
+ width: 10px;
+ height: 200px;
+ border-radius: 10px;
+}
+</style>
diff --git a/src/views/main/components/theme.vue b/src/views/main/components/theme.vue
new file mode 100644
index 0000000..c507320
--- /dev/null
+++ b/src/views/main/components/theme.vue
@@ -0,0 +1,42 @@
+<template>
+ <div class="theme-box">
+ <el-select v-model="style" @change="styleChange" size="large">
+ <el-option v-for="(item, index) in styleOptions" :key="index" :label="item.label" :value="item.value" />
+ </el-select>
+ </div>
+</template>
+<script>
+export default {
+ data() {
+ return {
+ style: 'dark',
+ styleOptions: [
+ { label: '鏍囧噯', value: 'normal' },
+ { label: '骞诲奖榛�', value: 'dark' },
+ { label: '鏈堝厜閾�', value: 'light' },
+ { label: '杩滃北榛�', value: 'whitesmoke' },
+ { label: '鑽夎壊闈�', value: 'fresh' },
+ { label: '闆呭+鐏�', value: 'grey' },
+ { label: '娑傞甫', value: 'graffiti' },
+ { label: '椹崱榫�', value: 'macaron' },
+ { label: '闈涢潚钃�', value: 'blue' },
+ { label: '鏋佸钃�', value: 'darkblue' },
+ { label: '閰辩苯', value: 'wine' }
+ ]
+ }
+ },
+ methods: {
+ styleChange(e) {
+ this.$emit('styleChange', e)
+ }
+ }
+}
+</script>
+<style>
+.theme-box{
+ position: fixed;
+ top: 20px;
+ right: 20px;
+ z-index: 1000;
+}
+</style>
diff --git a/src/views/main/indexMarge.vue b/src/views/main/indexMarge.vue
new file mode 100644
index 0000000..37c6266
--- /dev/null
+++ b/src/views/main/indexMarge.vue
@@ -0,0 +1,552 @@
+<template>
+ <el-container>
+ <selectColor :select-color.sync="selectColor" :min-color="minColor" @changeRender="changeRender" />
+ <themeCom @styleChange="changeStyle" />
+ <el-main style="margin: 0px; padding: 0px">
+ <div id="aMap" :style="{ height: windowHeight - 50 + 'px' }" />
+ </el-main>
+ </el-container>
+</template>
+<script>
+const markerContent = `
+
+<div class="custom-content-marker" onclick="showContent()">
+ <img src="//a.amap.com/jsapi_demos/static/demo-center/icons/dir-via-marker.png">
+ </div>`
+import selectColor from './components/selectColor.vue'
+import themeCom from './components/theme.vue'
+export default {
+ name: 'AMap',
+ components: {
+ selectColor,
+ themeCom
+ },
+ data() {
+ return {
+ circleMarker: [],
+ recordValue: [], // 璁板綍缁樺埗杩囩殑鏂囧瓧
+ adcode: 410000, // 涓績琛屾斂code
+ currentCodeObj: '', // 涓績琛屾斂code
+ map: null, // 鍦板浘瀹炰緥鍖�
+ districtExplorer: null, // 娓叉煋琛屾斂鍖哄煙瀹炰緥鍖�
+ windowHeight: document.documentElement.clientHeight,
+ selectColor: '#FF0000',
+ minColor: '',
+ provinceData: [
+ {
+ 'name': '閮戝窞甯�',
+ 'value': '8.99'
+ },
+ {
+ 'name': '寮�灏佸競',
+ 'value': '22.84'
+ },
+ {
+ 'name': '娲涢槼甯�',
+ 'value': '48.96'
+ },
+ {
+ 'name': '骞抽《灞卞競',
+ 'value': '79.49'
+ },
+ {
+ 'name': '瀹夐槼甯�',
+ 'value': '37.82'
+ },
+ {
+ 'name': '楣ゅ甯�',
+ 'value': '27.55'
+ },
+ {
+ 'name': '鏂颁埂甯�',
+ 'value': '90.76'
+ },
+ {
+ 'name': '鐒︿綔甯�',
+ 'value': '72.26'
+ },
+ {
+ 'name': '婵槼甯�',
+ 'value': '14.03'
+ },
+ {
+ 'name': '璁告槍甯�',
+ 'value': '32.93'
+ },
+ {
+ 'name': '婕渤甯�',
+ 'value': '57.85'
+ },
+ {
+ 'name': '涓夐棬宄″競',
+ 'value': '85.35'
+ },
+ {
+ 'name': '鍗楅槼甯�',
+ 'value': '99.59'
+ },
+ {
+ 'name': '鍟嗕笜甯�',
+ 'value': '45.33'
+ },
+ {
+ 'name': '淇¢槼甯�',
+ 'value': '69.38'
+ },
+ {
+ 'name': '鍛ㄥ彛甯�',
+ 'value': '65.45'
+ },
+ {
+ 'name': '椹婚┈搴楀競',
+ 'value': '90.25'
+ },
+ {
+ 'name': '娴庢簮甯�',
+ 'value': '88.85'
+ }
+ ],
+ style: 'dark',
+ marker: [],
+ infoWindow: [],
+ // marker: [],
+ regionData: {
+ type: 'FeatureCollection',
+ features: [
+ {
+ type: 'Feature',
+ geometry: {
+ type: 'Polygon',
+ coordinates: [
+ [
+ [113.576491, 34.744435],
+ [113.605331, 34.768129],
+ [113.712447, 34.74782],
+ [113.673995, 34.66823],
+ [113.601211, 34.687994],
+ [113.573745, 34.705495],
+ [113.570998, 34.725249]
+ ]
+ ]
+ },
+ properties: {}
+ }
+ ]
+ }
+ }
+ },
+ mounted() {
+ const vm = this
+ vm.loadMap()
+ },
+ methods: {
+ changeStyle(e) {
+ this.style = e
+ this.loadMap()
+ },
+ changeRender() {
+ this.loadMap()
+ },
+ loadMap() {
+ const vm = this
+ vm.map = new AMap.Map('aMap', {
+ viewMode: '2D', // 榛樿浣跨敤 2D 妯″紡锛屽鏋滃笇鏈涗娇鐢ㄥ甫鏈変刊浠拌鐨� 3D 妯″紡锛岃璁剧疆 viewMode: '3D'
+ zoom: 11, // 鍒濆鍖栧湴鍥惧眰绾�
+ center: [113.681999, 34.762029], // 鍒濆鍖栧湴鍥句腑蹇冪偣
+ mapStyle: 'amap://styles/' + this.style
+ })
+ vm.fillCityOrTown()
+ },
+ // 鍔犺浇娌冲崡鐪佸競鍘�
+ fillCityOrTown() {
+ const vm = this
+ AMapUI.loadUI(['geo/DistrictExplorer'], function(DistrictExplorer) {
+ // 鍚姩椤甸潰
+ vm.initPage(DistrictExplorer)
+ })
+ },
+ initPage(DistrictExplorer) {
+ const vm = this
+ // 鍒涘缓涓�涓疄渚�
+ vm.districtExplorer = new DistrictExplorer({
+ eventSupport: true, // 鎵撳紑浜嬩欢鏀寔
+ map: vm.map // 鍏宠仈鐨勫湴鍥惧疄渚�
+ })
+ // 閰嶇疆鐐瑰嚮浜嬩欢
+ vm.districtExplorer.on('featureClick', function(e, feature) {
+ var props = feature.properties
+ // 濡傛灉瀛樺湪瀛愯妭鐐�
+ vm.recordValue.map(item => {
+ item.setMap(null)
+ })
+
+ vm.recordValue = []
+ vm.circleMarker.map(item => {
+ // item.setMap(null)
+ vm.map.remove(item)
+ })
+ vm.circleMarker = []
+ if (feature.properties.level === 'district') {
+ setTimeout(() => {
+ vm.drawMarker(feature.properties.center)
+ }, 500)
+ vm.initData()
+ }
+ // if (props.childrenNum > 0) {
+ // 鍒囨崲鑱氱劍鍖哄煙
+ vm.switch2AreaNode(props.adcode)
+ // }
+ })
+ // 澶栭儴鍖哄煙琚偣鍑�
+ vm.districtExplorer.on('outsideClick', function(e) {
+ vm.districtExplorer.locatePosition(e.originalEvent.lnglat, function(_error, routeFeatures) {
+ vm.recordValue.map(item => {
+ item.setMap(null)
+ })
+ vm.recordValue = []
+ vm.infoWindow.forEach(element => {
+ element.close(vm.map)
+ })
+ vm.marker.forEach(element => {
+ element.setMap(null)
+ })
+ vm.circleMarker.map(item => {
+ // item.setMap(null)
+ vm.map.remove(item)
+ })
+ vm.circleMarker = []
+ if (routeFeatures && routeFeatures.length > 1) {
+ // 鍒囨崲鍒扮渷绾у尯鍩�
+ vm.switch2AreaNode(routeFeatures[1].properties.adcode)
+ } else {
+ // 鍒囨崲鍒板叏鍥�
+ vm.switch2AreaNode(100000)
+ }
+ }, {
+ levelLimit: 2
+ })
+ })
+ var adcode = vm.adcode // 鍏ㄥ浗鐨勫尯鍒掔紪鐮�
+ vm.districtExplorer.loadAreaNode(adcode, function(error, areaNode) {
+ if (error) {
+ console.error(error)
+ return
+ }
+ // 缁樺埗杞藉叆鐨勫尯鍒掕妭鐐�
+ vm.renderAreaNode(areaNode)
+ })
+ },
+ initData(){
+ for (let i = 0; i < this.regionData.features.length; i++) {
+ let item = this.regionData.features[i];
+ if(item.geometry.type=='Polygon'){
+ let arr = item.geometry.coordinates
+ let polygon = new AMap.Polygon({
+ path: arr,
+ fillColor: '#ccebc5',
+ strokeOpacity: 1,
+ fillOpacity: 0.2,//鑳屾櫙閫忔槑搴�
+ strokeColor: '#2b8cbe',
+ strokeWeight: 2,
+ strokeStyle: 'dashed',
+ strokeDasharray: [5, 5],
+ });
+ this.map.add(polygon);
+ }
+ }
+ },
+ getMathRandom() {
+ return (Math.random() * 101).toFixed(2)
+ },
+ adjustColor(color, range) {
+ let newColor = '#'
+ for (let i = 0; i < 3; i++) {
+ const hxStr = color.substr(i * 2 + 1, 2)
+ let val = parseInt(hxStr, 16)
+ val += range
+ if (val < 0) val = 0
+ else if (val > 255) val = 255
+ newColor += val.toString(16).padStart(2, '0')
+ }
+ this.$emit('minColor', newColor)
+ return newColor
+ },
+ renderAreaNode(areaNode) {
+ const vm = this
+ vm.map.setBounds(areaNode.getBounds(), null, null, true)
+ // 娓呴櫎宸叉湁鐨勭粯鍒跺唴瀹�
+ vm.districtExplorer.clearFeaturePolygons()
+ var colors = ['#3366cc', '#dc3912', '#ff9900', '#109618', '#990099', '#0099c6', '#dd4477', '#66aa00']
+ // 缁樺埗瀛愬尯鍩�
+ // const arr = []
+ vm.districtExplorer.renderSubFeatures(areaNode, function(feature, i) {
+ // arr.push({
+ // name: feature.properties.name, value: vm.getMathRandom()
+ // })
+ // console.log(feature.adcode) // 琛屾斂鍖虹殑areacode
+ var fillColor = colors[i % colors.length]
+ var strokeColor = colors[colors.length - 1 - i % colors.length]
+ const value = vm.provinceData.find(item => item.name === feature.properties.name)
+ const color = vm.adjustColor(vm.selectColor, 200)
+ const colorValue = vm.getColorBetween(value.value, 0, 100, color, vm.selectColor)
+ const fontStyle = {
+ 'background-color': 'rgba(0,0,0,0)',
+ 'border-width': 0,
+ 'font-size': '10px',
+ color: '#fff',
+ 'text-align': 'center'
+ }
+ // 瀹氫箟Text绫�
+ const text1 = new AMap.Text({
+ text: feature.properties.name,
+ position: new AMap.LngLat(feature.properties.center[0], feature.properties.center[1]),
+ style: fontStyle
+ })
+ // 鍒涘缓鍦嗗舰鐐规爣璁� CircleMarker 瀹炰緥
+ const circleMarker = new AMap.CircleMarker({
+ center: new AMap.LngLat(feature.properties.center[0], feature.properties.center[1]),
+ radius: 4, // 3D瑙嗗浘涓嬶紝CircleMarker鍗婂緞涓嶈瓒呰繃64px
+ strokeColor: 'white',
+ strokeWeight: 2,
+ strokeOpacity: 1,
+ fillColor: 'green',
+ fillOpacity: 1,
+ zIndex: 100000,
+ bubble: true,
+ cursor: 'pointer',
+ clickable: true
+ })
+ vm.recordValue.push(text1)
+ vm.circleMarker.push(circleMarker)
+ vm.map.add(text1)
+ vm.map.add(circleMarker)
+ return {
+ cursor: 'default',
+ bubble: true,
+ strokeColor: strokeColor, // 绾块鑹�
+ strokeOpacity: 1, // 绾块�忔槑搴�
+ strokeWeight: 1, // 绾垮
+ fillColor: colorValue, // 濉厖鑹�
+ fillOpacity: 1 // 濉厖閫忔槑搴�
+ }
+ })
+ // 缁樺埗鐖跺尯鍩�
+ vm.districtExplorer.renderParentFeature(areaNode, {
+ cursor: 'default',
+ bubble: true,
+ strokeColor: 'black', // 绾块鑹�
+ strokeOpacity: 1, // 绾块�忔槑搴�
+ strokeWeight: 1, // 绾垮
+ fillColor: areaNode.getSubFeatures().length ? null : colors[0], // 濉厖鑹�
+ fillOpacity: 0.35 // 濉厖閫忔槑搴�
+ })
+ // vm.
+
+ vm.map.setFitView(vm.districtExplorer.getAllFeaturePolygons())
+ },
+ // 鍒锋柊椤甸潰
+ switch2AreaNode(adcode, callback) {
+ const vm = this
+ if (vm.currentCodeObj && ('' + vm.currentCodeObj.getAdcode() === '' + adcode)) {
+ return
+ }
+ vm.loadAreaNode(adcode, function(error, areaNode) {
+ if (error) {
+ if (callback) {
+ callback(error)
+ }
+ return
+ }
+ vm.adcode = window.currentAreaNode = areaNode.adcode
+ vm.currentCodeObj = window.currentAreaNode = areaNode
+ // 璁剧疆褰撳墠浣跨敤鐨勫畾浣嶇敤鑺傜偣
+ vm.districtExplorer.setAreaNodesForLocating([vm.currentCodeObj])
+ vm.refreshAreaNode(areaNode)
+ if (callback) {
+ callback(null, areaNode)
+ }
+ })
+ },
+ // 鍒锋柊鍖哄煙杈圭晫
+ loadAreaNode(adcode, callback) {
+ const vm = this
+ vm.districtExplorer.loadAreaNode(adcode, function(error, areaNode) {
+ if (error) {
+ if (callback) {
+ callback(error)
+ }
+ return
+ }
+ if (callback) {
+ callback(null, areaNode)
+ }
+ })
+ },
+ refreshAreaNode(areaNode) {
+ this.districtExplorer.setHoverFeature(null)
+ this.renderAreaPolygons(areaNode)
+ },
+ // 缁樺埗鏌愪釜鍖哄煙鐨勮竟鐣�
+ renderAreaPolygons(areaNode) {
+ const vm = this
+ // 鏇存柊鍦板浘瑙嗛噹
+ vm.map.setBounds(areaNode.getBounds(), null, null, true)
+ // 娓呴櫎宸叉湁鐨勭粯鍒跺唴瀹�
+ vm.districtExplorer.clearFeaturePolygons()
+ var colors = ['#3366cc', '#dc3912', '#ff9900', '#109618', '#990099', '#0099c6', '#dd4477', '#66aa00']
+ // 缁樺埗瀛愬尯鍩�
+ vm.districtExplorer.renderSubFeatures(areaNode, function(feature, i) {
+ var fillColor = colors[i % colors.length]
+ var strokeColor = colors[colors.length - 1 - i % colors.length]
+ const fontStyle = {
+ 'background-color': 'rgba(0,0,0,0)',
+ 'border-width': 0,
+ 'text-align': 'center',
+ 'font-size': '14px',
+ color: '#fff'
+ }
+ const text1 = new AMap.Text({
+ text: feature.properties.name,
+ position: new AMap.LngLat(feature.properties.center[0], feature.properties.center[1]),
+ style: fontStyle
+ })
+ vm.recordValue.push(text1)
+
+ vm.map.add(text1)
+
+ const value = vm.provinceData.find(item => item.name === feature.properties.name)
+ if (value && value.value) {
+ const color = vm.adjustColor(vm.selectColor, 200)
+ fillColor = vm.getColorBetween(value.value, 0, 100, color, vm.selectColor)
+ }
+ // 鍒涘缓鍦嗗舰鐐规爣璁� CircleMarker 瀹炰緥
+ const circleMarker = new AMap.CircleMarker({
+ center: new AMap.LngLat(feature.properties.center[0], feature.properties.center[1]),
+ radius: 4, // 3D瑙嗗浘涓嬶紝CircleMarker鍗婂緞涓嶈瓒呰繃64px
+ strokeColor: 'white',
+ strokeWeight: 2,
+ strokeOpacity: 1,
+ fillColor: 'green',
+ fillOpacity: 1,
+ zIndex: 100000,
+ bubble: true,
+ cursor: 'pointer',
+ clickable: true
+ })
+ vm.circleMarker.push(circleMarker)
+ vm.map.add(circleMarker)
+ return {
+ cursor: 'default',
+ bubble: true,
+ strokeColor: strokeColor, // 绾块鑹�
+ strokeOpacity: 1, // 绾块�忔槑搴�
+ strokeWeight: 1, // 绾垮
+ fillColor: fillColor, // 濉厖鑹�
+ fillOpacity: 1 // 濉厖閫忔槑搴�
+ }
+ })
+
+ // 缁樺埗鐖跺尯鍩�
+ vm.districtExplorer.renderParentFeature(areaNode, {
+ cursor: 'default',
+ bubble: true,
+ strokeColor: 'black', // 绾块鑹�
+ strokeOpacity: 1, // 绾块�忔槑搴�
+ strokeWeight: 1, // 绾垮
+ fillColor: areaNode.getSubFeatures().length ? null : colors[0], // 濉厖鑹�
+ fillOpacity: 0.35 // 濉厖閫忔槑搴�
+ })
+ },
+ // 鏍规嵁鍊艰繑鍥為鑹�
+ getColorBetween(value, minValue, maxValue, minColor, maxColor) {
+ // 灏嗛鑹茶浆鎹负RGB
+ function hexToRgb(hex) {
+ const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex)
+ return result ? {
+ r: parseInt(result[1], 16),
+ g: parseInt(result[2], 16),
+ b: parseInt(result[3], 16)
+ } : null
+ }
+
+ // 灏哛GB杞崲涓哄崄鍏繘鍒堕鑹�
+ function rgbToHex(r, g, b) {
+ return '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)
+ }
+
+ // 灏嗛鑹茬殑姣忎釜鍒嗛噺杩涜鎻掑��
+ function interpolateColor(start, end, factor) {
+ return Math.round(start + (end - start) * factor)
+ }
+
+ // 纭繚鍊煎湪鏈�灏忓�煎拰鏈�澶у�间箣闂�
+ value = Math.max(minValue, Math.min(value, maxValue))
+
+ // 璁$畻鍥犲瓙锛屽皢鍊艰寖鍥存槧灏勫埌0鍒�1涔嬮棿
+ const factor = (value - minValue) / (maxValue - minValue)
+
+ // 鑾峰彇涓ょ棰滆壊鐨凴GB鍊�
+ const minRgb = hexToRgb(minColor)
+ const maxRgb = hexToRgb(maxColor)
+ // 鏍规嵁鍥犲瓙鎻掑�糝GB鍒嗛噺
+ const r = interpolateColor(minRgb.r, maxRgb.r, factor)
+ const g = interpolateColor(minRgb.g, maxRgb.g, factor)
+ const b = interpolateColor(minRgb.b, maxRgb.b, factor)
+
+ // 灏哛GB杞崲涓哄崄鍏繘鍒堕鑹插苟杩斿洖
+ return rgbToHex(r, g, b)
+ },
+ // 缁樺埗鏍囩偣
+ // 缁樺埗鏍囩偣
+ drawMarker(positionArg) {
+ var content = [
+ '<div><b>杩欐槸涓彁绀烘枃瀛�</b>',
+ '鍦板潃锛氶儜宸炲競閲戞按鍖鸿姳鍥矾</div>'
+ ]
+ const position = new AMap.LngLat(positionArg[0], positionArg[1]) // Marker 缁忕含搴�
+ // 鍒涘缓 infoWindow 瀹炰緥
+
+ function getImageUrl(url) {
+ console.log(`../../assets/icon/${url}.png`)
+ const path = new URL(`../../assets/icon/${url}.png`, import.meta.url)
+ return path.href
+ }
+
+ for (let a = 0; a < 4; a++) {
+ const icon = new AMap.Icon({
+ size: new AMap.Size(20, 20), // 鍥炬爣灏哄
+ image: getImageUrl(`icon${a + 1}`), // 鍥炬爣鐨刄RL
+ imageSize: new AMap.Size(20, 20) // 鍥炬爣鎵�鐢ㄥ浘鐗囩殑澶у皬
+ })
+ const position = new AMap.LngLat(positionArg[0] - 0.02 * a, positionArg[1]) // Marker 缁忕含搴�
+ const infoWindow = new AMap.InfoWindow({
+ content: content.join('<br>'), // 浼犲叆瀛楃涓叉嫾鎺ョ殑 DOM 鍏冪礌
+ anchor: 'top-center',
+ position: position
+ // offset: [10, 40]
+ })
+ this.infoWindow.push(infoWindow)
+ const marker = new AMap.Marker({
+ position: position,
+ // content: markerContent, // 灏� html 浼犵粰 content
+ // icon: '',
+ icon: icon,
+ offset: new AMap.Pixel(-10, -30) // 浠� icon 鐨� [center bottom] 涓哄師鐐�
+ })
+ this.map.add(marker)
+ this.marker.push(marker)
+ marker.on('click', () => {
+ infoWindow.open(this.map)
+ })
+ }
+ }
+ }
+}
+</script>
+
+<style scoped>
+.aMap {
+ width: 100vw;
+ height: 100vh;
+}
+</style>
--
Gitblit v1.9.1