| @@ -44,6 +44,7 @@ | |||||
| "splitpanes": "2.4.1", | "splitpanes": "2.4.1", | ||||
| "vant": "^2.13.9", | "vant": "^2.13.9", | ||||
| "vue": "2.6.12", | "vue": "2.6.12", | ||||
| "vue-clipboard2": "^0.3.3", | |||||
| "vue-count-to": "1.0.13", | "vue-count-to": "1.0.13", | ||||
| "vue-cropper": "0.5.5", | "vue-cropper": "0.5.5", | ||||
| "vue-router": "3.4.9", | "vue-router": "3.4.9", | ||||
| @@ -60,3 +60,38 @@ export function printExport(query) { | |||||
| params: query | params: query | ||||
| }) | }) | ||||
| } | } | ||||
| // 开始导出任务 | |||||
| export function startExport(id) { | |||||
| return request({ | |||||
| url: '/business/export/start/' + id, | |||||
| method: 'post', | |||||
| }) | |||||
| } | |||||
| // 导出任务日志 | |||||
| export function exportLog(id, offset) { | |||||
| return request({ | |||||
| url: '/business/export/log/' + id, | |||||
| method: 'get', | |||||
| params: {offset} | |||||
| }) | |||||
| } | |||||
| // 下载导出任务日志 | |||||
| export function downloadLog(id) { | |||||
| return request({ | |||||
| url: '/business/export/downloadLog/' + id, | |||||
| method: 'get', | |||||
| responseType: 'blob', | |||||
| }) | |||||
| } | |||||
| // 下载导出任务文件 | |||||
| export function downloadFile(id) { | |||||
| return request({ | |||||
| url: '/business/export/downloadFile/' + id, | |||||
| method: 'get', | |||||
| responseType: 'blob', | |||||
| }) | |||||
| } | |||||
| @@ -59,6 +59,14 @@ export function refreshCache() { | |||||
| }) | }) | ||||
| } | } | ||||
| // 附件地址前缀 | |||||
| export function getSystemAttachmentUrl() { | |||||
| return request({ | |||||
| url: '/open/typz/configKey/system.attachment.url', | |||||
| method: 'get' | |||||
| }) | |||||
| } | |||||
| // 根据参数键名查询参数值 | // 根据参数键名查询参数值 | ||||
| // export function getConfigKey(configKey) { | // export function getConfigKey(configKey) { | ||||
| // return request({ | // return request({ | ||||
| @@ -0,0 +1,160 @@ | |||||
| <!-- 通用上传组件 zhao --> | |||||
| <template> | |||||
| <van-uploader | |||||
| v-model="fileList" | |||||
| :multiple="multiple" | |||||
| :after-read="afterRead" | |||||
| :show-upload="showUpload" | |||||
| :deletable="deletable" | |||||
| @delete="deleteFile" | |||||
| :accept="accept || null" | |||||
| /> | |||||
| </template> | |||||
| <script> | |||||
| import {commonUpload} from "@/api/sunVillage_info/fixedAssets"; | |||||
| export default { | |||||
| name: "commonUpload", | |||||
| props: { | |||||
| name: String, | |||||
| value: { // 绑定值 字符串 ,分隔 可监听 | |||||
| type: String, | |||||
| default: null, | |||||
| }, | |||||
| accept: { // 上传类型限制: 默认图片, * = 任意类型 | |||||
| type: String, | |||||
| }, | |||||
| multiple: { // 多文件上传 | |||||
| type: Boolean, | |||||
| default: false, | |||||
| }, | |||||
| deletable: { // 允许删除 | |||||
| type: Boolean, | |||||
| default: true, | |||||
| }, | |||||
| showUpload: { // 显示上传按钮 | |||||
| type: Boolean, | |||||
| default: true, | |||||
| }, | |||||
| formData: { // 额外请求参数 | |||||
| type: Object, | |||||
| default: function() { | |||||
| return {}; | |||||
| }, | |||||
| }, | |||||
| file: { // 上传文件字段名 | |||||
| type: String, | |||||
| default: 'file', | |||||
| }, | |||||
| host: { | |||||
| type: String, // 文件地址前缀 | |||||
| default: '/api', | |||||
| }, | |||||
| }, | |||||
| watch: { | |||||
| value: function (newVal, oldVal) { | |||||
| if(newVal != this.internalValue) | |||||
| this.setInternalValue(newVal); | |||||
| }, | |||||
| }, | |||||
| created() { | |||||
| this.parseValue(this.value); | |||||
| }, | |||||
| data() { | |||||
| return { | |||||
| internalValue: this.value, | |||||
| fileList: [], | |||||
| pathList: [], | |||||
| }; | |||||
| }, | |||||
| methods: { | |||||
| setInternalValue(newVal) { | |||||
| this.parseValue(newVal); | |||||
| this.internalValue = newVal; | |||||
| }, | |||||
| parseValue(data) { | |||||
| if(data) | |||||
| { | |||||
| this.pathList = data.split(','); | |||||
| } | |||||
| else | |||||
| { | |||||
| this.pathList = []; | |||||
| } | |||||
| this.fileList = this.pathList.map((x) => { | |||||
| return { | |||||
| url: this.host + x, | |||||
| }; | |||||
| }); | |||||
| }, | |||||
| makeFormData() { | |||||
| let fd = new FormData(); | |||||
| if(this.formData) | |||||
| { | |||||
| for(let k of Object.keys(this.formData)) | |||||
| { | |||||
| fd.set(k, this.formData[k]); | |||||
| } | |||||
| } | |||||
| return fd; | |||||
| }, | |||||
| upload(file) { | |||||
| let params1 = this.makeFormData(); | |||||
| params1.append(this.file, file.file); | |||||
| return commonUpload(params1).then((resp) => { | |||||
| this.pathList.push(resp.fileName); | |||||
| this.updateInternalValue(); | |||||
| this.$emit('upload', resp.fileName); | |||||
| }); | |||||
| }, | |||||
| afterRead(file) { | |||||
| this.$toast.loading({ | |||||
| message: "上传中...", | |||||
| forbidClick: true, | |||||
| duration: 0, | |||||
| }); | |||||
| // 此时可以自行将文件上传至服务器 | |||||
| if (file instanceof Array) {//判断是否为数组,单张图片为array,多张为数组,数组返回true否则为false | |||||
| if(file.length > 0) | |||||
| { | |||||
| let index = 0; | |||||
| const f = () => { | |||||
| if(index >= file.length) | |||||
| return; | |||||
| let up = file[index]; | |||||
| //console.log(up); | |||||
| console.log(`上传文件: ${index} -> ${up.file.name}`); | |||||
| this.upload(up).then(() => { | |||||
| index++; | |||||
| if(index < file.length) | |||||
| f(); | |||||
| }); | |||||
| }; | |||||
| f(); | |||||
| } | |||||
| } else { | |||||
| this.upload(file); | |||||
| } | |||||
| }, | |||||
| deleteFile(detail){ | |||||
| this.pathList.splice(detail.index,1); | |||||
| this.updateInternalValue(); | |||||
| this.$emit('remove', detail.index); | |||||
| }, | |||||
| updateInternalValue() { | |||||
| let files = this.pathList.join(','); | |||||
| console.log(files); | |||||
| this.internalValue = files; | |||||
| if(this.internalValue != this.value) | |||||
| this.$emit('input', this.internalValue); | |||||
| }, | |||||
| }, | |||||
| } | |||||
| </script> | |||||
| <style scoped> | |||||
| </style> | |||||
| @@ -0,0 +1,107 @@ | |||||
| <!-- 日历表单组件 zhao --> | |||||
| <template> | |||||
| <!-- !!!注: 不支持逝去的日子, 以`FieldDatePicker`代替 !!! --> | |||||
| <div> | |||||
| <van-field | |||||
| :readonly="true" | |||||
| :clickable="!readonly" | |||||
| :name="name" | |||||
| :value="visibleValue" | |||||
| :label="label" | |||||
| :placeholder="placeholder" | |||||
| @click="openPopup" | |||||
| input-align="right" | |||||
| right-icon="arrow-down" | |||||
| :rules="rules" | |||||
| :required="required" | |||||
| :label-width="labelWidth || 'auto'" | |||||
| > | |||||
| <!-- <template #button> | |||||
| <van-icon name="notes-o" size="20"/> | |||||
| </template>--> | |||||
| </van-field> | |||||
| <van-calendar | |||||
| ref="calender" | |||||
| v-model="popupVisible" | |||||
| :title="label" | |||||
| :default-date="internalValue" | |||||
| :readonly="readonly" | |||||
| @confirm="onConfirm" /> | |||||
| </div> | |||||
| </template> | |||||
| <script> | |||||
| import { formatDate } from "element-ui/src/utils/date-util.js" | |||||
| export default { | |||||
| name: "FieldCalender", | |||||
| props: [ | |||||
| 'name', 'readonly', 'value', 'label', 'placeholder', 'required', 'rules', 'labelWidth', | |||||
| 'formatter', // value的格式化 String|Function|undefined 字符串为格式字符串, 函数则必须有返回 undefined则不转换 | |||||
| ], | |||||
| watch: { | |||||
| value: function (newVal, oldVal) { | |||||
| this.visibleValue = newVal; | |||||
| this.internalValue = new Date(newVal); | |||||
| }, | |||||
| }, | |||||
| created() { | |||||
| if(this.value) | |||||
| { | |||||
| this.visibleValue = this.value; | |||||
| this.internalValue = new Date(this.value); | |||||
| } | |||||
| }, | |||||
| data() { | |||||
| return { | |||||
| popupVisible: false, | |||||
| internalValue: new Date(this.value || Date.now()), | |||||
| visibleValue: this.value, | |||||
| loading: false, | |||||
| }; | |||||
| }, | |||||
| methods: { | |||||
| openPopup() { | |||||
| if(!this.readonly) | |||||
| { | |||||
| this.popupVisible = true; | |||||
| this.$nextTick(() => { | |||||
| this.$refs.calender.scrollToDate(this.internalValue); | |||||
| }) | |||||
| } | |||||
| }, | |||||
| closePopup() { | |||||
| this.popupVisible = false; | |||||
| }, | |||||
| onConfirm(data) { | |||||
| this.syncValue(data); | |||||
| this.$emit('input', this.visibleValue); | |||||
| this.$emit('confirm', this.visibleValue, this.internalValue); | |||||
| this.closePopup(); | |||||
| }, | |||||
| onCancel() { | |||||
| this.closePopup(); | |||||
| this.$emit('cancel'); | |||||
| }, | |||||
| getValue(data) { | |||||
| let type = typeof(this.formatter); | |||||
| if(type === 'function') | |||||
| return this.formatter(data); | |||||
| else if(type === 'string') | |||||
| return formatDate(data, this.formatter); | |||||
| else | |||||
| return data; | |||||
| }, | |||||
| syncValue(data) { | |||||
| this.internalValue = data; | |||||
| this.visibleValue = this.getValue(data); | |||||
| console.log(this.internalValue, this.visibleValue); | |||||
| }, | |||||
| }, | |||||
| } | |||||
| </script> | |||||
| <style scoped> | |||||
| </style> | |||||
| @@ -0,0 +1,216 @@ | |||||
| <!-- 下拉列表表单组件 zhao --> | |||||
| <template> | |||||
| <div> | |||||
| <van-field | |||||
| :readonly="true" | |||||
| :clickable="!readonly" | |||||
| :name="name" | |||||
| :value="visibleValue" | |||||
| :label="label" | |||||
| :placeholder="placeholder" | |||||
| @click="openPopup" | |||||
| input-align="right" | |||||
| right-icon="arrow-down" | |||||
| :rules="rules" | |||||
| :required="required" | |||||
| :label-width="labelWidth || 'auto'" | |||||
| > | |||||
| </van-field> | |||||
| <van-popup v-model="popupVisible" position="bottom"> | |||||
| <van-picker | |||||
| ref="picker" | |||||
| :title="label" | |||||
| show-toolbar | |||||
| :columns="columns ? columns : remoteColumns" | |||||
| :readonly="readonly" | |||||
| :value-key="valueKey" | |||||
| :loading="loading" | |||||
| @confirm="onConfirm" | |||||
| @cancel="onCancel" | |||||
| @change="onChanged" | |||||
| /> | |||||
| </van-popup> | |||||
| </div> | |||||
| </template> | |||||
| <script> | |||||
| import request from "@/utils/request"; | |||||
| export default { | |||||
| name: "fieldCascadeSelect", | |||||
| props: [ | |||||
| 'name', 'readonly', 'value', 'label', 'placeholder', 'required', 'rules', 'labelWidth', | |||||
| 'columns', // 列表数据 Array | |||||
| 'valueKey', // 名称键名 String | |||||
| 'dataKey', // 值键名 String | |||||
| 'remoteUrl', // 远程列表加载地址 String | |||||
| 'onRemoteResponse', // 远程获取到结果的处理回调 String|Function 如果是函数需返回数组, 如果是字符串支持.分割 | |||||
| 'clearable', // 点击取消时清空绑定值 | |||||
| ], | |||||
| watch: { | |||||
| value: function (newVal, oldVal) { | |||||
| this.internalValue = newVal; | |||||
| this.visibleValue = newVal ? newVal.join(' / ') : ''; | |||||
| this.syncIndex(); | |||||
| }, | |||||
| columns: function (newVal, oldVal) { | |||||
| this.syncIndex(); | |||||
| }, | |||||
| remoteUrl: function (newVal, oldVal) { | |||||
| this.requestRemote(); | |||||
| }, | |||||
| onRemoteResponse: function (newVal, oldVal) { | |||||
| this.parseRemote(); | |||||
| } | |||||
| }, | |||||
| created() { | |||||
| if(this.remoteUrl) | |||||
| this.requestRemote(); | |||||
| }, | |||||
| data() { | |||||
| return { | |||||
| popupVisible: false, | |||||
| internalValue: this.value, | |||||
| visibleValue: '', | |||||
| defaultIndex: [], | |||||
| remoteColumns: null, | |||||
| loading: false, | |||||
| remoteResponse: null, | |||||
| }; | |||||
| }, | |||||
| methods: { | |||||
| openPopup() { | |||||
| if(!this.readonly) | |||||
| { | |||||
| this.popupVisible = true; | |||||
| this.$nextTick(() => { | |||||
| this.$refs.picker.setIndexes(this.defaultIndex); | |||||
| }) | |||||
| } | |||||
| }, | |||||
| closePopup() { | |||||
| this.popupVisible = false; | |||||
| }, | |||||
| onChanged(data) { | |||||
| this.$emit('change', data); | |||||
| }, | |||||
| onConfirm(data) { | |||||
| this.syncValue(data); | |||||
| this.$emit('input', this.internalValue); | |||||
| this.$emit('confirm', this.internalValue); | |||||
| this.closePopup(); | |||||
| }, | |||||
| onCancel() { | |||||
| this.closePopup(); | |||||
| this.$emit('cancel'); | |||||
| if(this.clearable) | |||||
| { | |||||
| this.visibleValue = ''; | |||||
| this.internalValue = []; | |||||
| this.$emit('input', this.internalValue); | |||||
| } | |||||
| }, | |||||
| getValue(data) { | |||||
| return typeof(data) === 'object' && this.dataKey ? data[this.dataKey] : data; | |||||
| }, | |||||
| getLabel(data) { | |||||
| return typeof(data) === 'object' && this.valueKey ? data[this.valueKey] : data; | |||||
| }, | |||||
| syncValue(data) { | |||||
| let res = []; | |||||
| for(let a of data) | |||||
| { | |||||
| res.push(this.getValue(a)); | |||||
| } | |||||
| this.internalValue = res; | |||||
| res = []; | |||||
| for(let a of data) | |||||
| { | |||||
| res.push(this.getLabel(a)); | |||||
| } | |||||
| this.visibleValue = res.join(' / '); | |||||
| }, | |||||
| syncIndex() { | |||||
| let columns = this.getColumns(); | |||||
| if(!columns) | |||||
| return -1; | |||||
| let arr = []; | |||||
| let dataArr = []; | |||||
| let ptr = columns; | |||||
| for(let i = 0; i < this.internalValue.length; i++) | |||||
| { | |||||
| if(!ptr) | |||||
| break; | |||||
| let p = null; | |||||
| for(let m = 0; m < ptr.length; m++) | |||||
| { | |||||
| if(this.getValue(ptr[m]) == this.internalValue[i]) { | |||||
| arr.push(m); | |||||
| dataArr.push(ptr[m]); | |||||
| p = ptr[m]; | |||||
| break; | |||||
| } | |||||
| } | |||||
| if(p) | |||||
| ptr = p.children; | |||||
| } | |||||
| if(arr.length) | |||||
| { | |||||
| this.defaultIndex = arr; | |||||
| this.visibleValue = dataArr.map((x) => this.getLabel(x)).join(' / '); | |||||
| this.onChanged(dataArr); | |||||
| return dataArr; | |||||
| } | |||||
| if(1) // 不存在 | |||||
| { | |||||
| this.defaultIndex = []; | |||||
| this.visibleValue = (this.internalValue || []).join(' / '); | |||||
| this.onChanged([]); | |||||
| } | |||||
| return -1; | |||||
| }, | |||||
| getColumns() { | |||||
| return this.columns ? this.columns : this.remoteColumns; | |||||
| }, | |||||
| requestRemote() { | |||||
| if(!this.remoteUrl) | |||||
| return; | |||||
| this.loading = true; | |||||
| this.remoteColumns = []; | |||||
| let promise = typeof(this.remoteUrl) === 'function' ? this.remoteUrl() : (this.remoteUrl instanceof Promise ? this.remoteUrl : request(this.remoteUrl)); | |||||
| promise.then((resp) => { | |||||
| this.remoteResponse = resp; | |||||
| this.parseRemote(); | |||||
| this.syncIndex(); | |||||
| }).catch((e) => { | |||||
| console.error(e); | |||||
| }).finally(() => { | |||||
| this.loading = false; | |||||
| }) | |||||
| }, | |||||
| parseRemote() { | |||||
| if(!this.remoteResponse) | |||||
| return; | |||||
| let type = typeof(this.onRemoteResponse); | |||||
| if(type === 'function') | |||||
| this.remoteColumns = this.onRemoteResponse(this.remoteResponse); | |||||
| else if(type === 'string') | |||||
| { | |||||
| let arr = this.onRemoteResponse.split('.'); | |||||
| let ptr = this.remoteResponse; | |||||
| for(let i in arr) | |||||
| { | |||||
| ptr = this.remoteResponse[arr[i]]; | |||||
| } | |||||
| this.remoteColumns = ptr; | |||||
| } | |||||
| else | |||||
| this.remoteColumns = this.remoteResponse; | |||||
| }, | |||||
| }, | |||||
| } | |||||
| </script> | |||||
| <style scoped> | |||||
| </style> | |||||
| @@ -0,0 +1,262 @@ | |||||
| <!-- 级联树选择器表单组件 zhao --> | |||||
| <template> | |||||
| <div> | |||||
| <van-field | |||||
| :readonly="true" | |||||
| :clickable="!readonly" | |||||
| :name="name" | |||||
| :value="visibleValue" | |||||
| :label="label" | |||||
| :placeholder="placeholder" | |||||
| @click="openPopup" | |||||
| input-align="right" | |||||
| right-icon="arrow-down" | |||||
| :rules="rules" | |||||
| :required="required" | |||||
| :label-width="labelWidth || 'auto'" | |||||
| > | |||||
| </van-field> | |||||
| <van-popup v-model="popupVisible" position="bottom"> | |||||
| <van-cascader | |||||
| ref="picker" | |||||
| :title="label" | |||||
| v-model="internalValue" | |||||
| :placeholder="placeholder || '请选择'" | |||||
| :options="internalOptions" | |||||
| :readonly="readonly" | |||||
| :loading="loading" | |||||
| :field-names="{ | |||||
| text: textName || 'text', | |||||
| value: valueName || 'value', | |||||
| children: childrenName || 'children', | |||||
| }" | |||||
| @finish="onConfirm" | |||||
| @close="onCancel" | |||||
| @change="onChanged" | |||||
| /> | |||||
| </van-popup> | |||||
| </div> | |||||
| </template> | |||||
| <script> | |||||
| import request from "@/utils/request"; | |||||
| export default { | |||||
| name: "fieldCascader", | |||||
| props: [ | |||||
| 'name', 'readonly', 'value', 'label', 'placeholder', 'required', 'rules', 'labelWidth', | |||||
| 'options', // 树结构数组/普通数组 | |||||
| 'textName', // 名称键名 String 默认text | |||||
| 'valueName', // 值键名 String 默认value | |||||
| 'remoteUrl', // 远程列表加载地址 String | |||||
| 'onRemoteResponse', // 远程获取到结果的处理回调 String|Function 如果是函数需返回数组, 如果是字符串支持.分割 | |||||
| 'childrenName', // 子级数组键名 String 默认children | |||||
| 'parentName', // 父的值键名 String 如果不为空 则自动转数组为树树结构数组 String | |||||
| 'showTextAndValue', // 是否显示值和键 Bool|String 字符串为分隔符, true为空字符串 | |||||
| 'showHasChildren', // 是否显示存在子级的标识 Bool|String 字符串为标识符, true为` >` | |||||
| 'clearable', // 点击取消时清空绑定值 | |||||
| ], | |||||
| watch: { | |||||
| value: function (newVal, oldVal) { | |||||
| if(newVal != this.internalValue) | |||||
| { | |||||
| this.internalValue = newVal; | |||||
| this.syncIndex(); | |||||
| } | |||||
| }, | |||||
| options: function (newVal, oldVal) { | |||||
| this.internalOptions = this.makeTree(JSON.parse(JSON.stringify(newVal))); | |||||
| this.handleTree(this.internalOptions); | |||||
| this.syncIndex(); | |||||
| }, | |||||
| remoteUrl: function (newVal, oldVal) { | |||||
| this.requestRemote(); | |||||
| }, | |||||
| onRemoteResponse: function (newVal, oldVal) { | |||||
| this.parseRemote(); | |||||
| } | |||||
| }, | |||||
| created() { | |||||
| if(this.options && Array.isArray(this.options) && this.options.length > 0) | |||||
| { | |||||
| this.internalOptions = this.makeTree(JSON.parse(JSON.stringify(this.options))); | |||||
| this.handleTree(this.internalOptions); | |||||
| this.syncIndex(); | |||||
| } | |||||
| else if(this.remoteUrl) | |||||
| this.requestRemote(); | |||||
| }, | |||||
| data() { | |||||
| return { | |||||
| popupVisible: false, | |||||
| internalValue: this.value, | |||||
| visibleValue: '', | |||||
| defaultIndex: 0, | |||||
| internalOptions: [], | |||||
| loading: false, | |||||
| remoteResponse: null, | |||||
| }; | |||||
| }, | |||||
| methods: { | |||||
| openPopup() { | |||||
| if(!this.readonly) | |||||
| { | |||||
| this.popupVisible = true; | |||||
| this.$nextTick(() => { | |||||
| //this.$refs.picker.setIndexes([this.defaultIndex]); | |||||
| }) | |||||
| } | |||||
| }, | |||||
| closePopup() { | |||||
| this.popupVisible = false; | |||||
| }, | |||||
| onChanged({ value, selectedOptions, tabIndex }) { | |||||
| this.$emit('change', { value, selectedOptions, }); | |||||
| }, | |||||
| onConfirm({ value, selectedOptions, tabIndex }) { | |||||
| this.syncValue(value, selectedOptions[selectedOptions.length - 1]); | |||||
| this.$emit('input', this.internalValue); | |||||
| this.$emit('confirm', this.internalValue); | |||||
| this.closePopup(); | |||||
| }, | |||||
| onCancel() { | |||||
| this.closePopup(); | |||||
| this.$emit('cancel'); | |||||
| if(this.clearable) | |||||
| { | |||||
| this.visibleValue = ''; | |||||
| this.internalValue = null; | |||||
| this.$emit('input', this.internalValue); | |||||
| } | |||||
| }, | |||||
| getValue(data) { | |||||
| return typeof(data) === 'object' && this.valueName ? data[this.valueName] : data; | |||||
| }, | |||||
| getLabel(data) { | |||||
| return typeof(data) === 'object' && this.textName ? data[this.textName] : data; | |||||
| }, | |||||
| syncValue(value, data) { | |||||
| this.internalValue = value; | |||||
| this.visibleValue = this.getLabel(data); | |||||
| }, | |||||
| requestRemote() { | |||||
| if(!this.remoteUrl) | |||||
| return; | |||||
| this.loading = true; | |||||
| this.internalOptions = []; | |||||
| let promise = typeof(this.remoteUrl) === 'function' ? this.remoteUrl() : (this.remoteUrl instanceof Promise ? this.remoteUrl : request(this.remoteUrl)); | |||||
| promise.then((resp) => { | |||||
| this.remoteResponse = resp; | |||||
| this.parseRemote(); | |||||
| }).catch((e) => { | |||||
| console.error(e); | |||||
| }).finally(() => { | |||||
| this.loading = false; | |||||
| }) | |||||
| }, | |||||
| parseRemote() { | |||||
| if(!this.remoteResponse) | |||||
| return; | |||||
| let type = typeof(this.onRemoteResponse); | |||||
| if(type === 'function') | |||||
| this.internalOptions = this.makeTree(this.onRemoteResponse(this.remoteResponse)); | |||||
| else if(type === 'string') | |||||
| { | |||||
| let arr = this.onRemoteResponse.split('.'); | |||||
| let ptr = this.remoteResponse; | |||||
| for(let i in arr) | |||||
| { | |||||
| ptr = this.remoteResponse[arr[i]]; | |||||
| } | |||||
| this.internalOptions = this.makeTree(ptr); | |||||
| } | |||||
| else | |||||
| this.internalOptions = this.makeTree(this.remoteResponse); | |||||
| this.handleTree(this.internalOptions); | |||||
| this.syncIndex(); | |||||
| }, | |||||
| makeTree(list) { | |||||
| let parentName = this.parentName; | |||||
| let valueName = this.valueName || 'value'; | |||||
| let childrenName = this.childrenName || 'children'; | |||||
| function isnull(p) { | |||||
| return p === null || p === undefined || p === ''; | |||||
| } | |||||
| function makeTree_r(l, p) { | |||||
| const isRoot = isnull(p); | |||||
| let res = []; | |||||
| for(let v of l) | |||||
| { | |||||
| const parentValue = v[parentName]; | |||||
| const value = v[valueName]; | |||||
| if((isRoot && isnull(parentValue)) || (!isRoot && parentValue == p)) | |||||
| { | |||||
| let arr = makeTree_r(l, value); | |||||
| if(arr && arr.length > 0) | |||||
| v[childrenName] = arr; | |||||
| else | |||||
| delete v[childrenName]; | |||||
| res.push(v); | |||||
| } | |||||
| } | |||||
| return res; | |||||
| } | |||||
| if(this.parentName) | |||||
| return makeTree_r(list); | |||||
| else | |||||
| return list; | |||||
| }, | |||||
| handleTree(tree) { | |||||
| if(!this.showTextAndValue && !this.showHasChildren) | |||||
| return; | |||||
| let split = this.showTextAndValue === false || this.showTextAndValue === undefined || this.showTextAndValue === null ? false : (typeof(this.showTextAndValue) === 'boolean' ? "" : this.showTextAndValue); | |||||
| let hasChildren = this.showHasChildren === false || this.showHasChildren === undefined || this.showHasChildren === null ? false : (typeof(this.showHasChildren) === 'boolean' ? " >" : this.showHasChildren); | |||||
| let textName = this.textName || 'text'; | |||||
| let valueName = this.valueName || 'value'; | |||||
| let childrenName = this.childrenName || 'children'; | |||||
| function handleTree_r(l) { | |||||
| for(let v of l) | |||||
| { | |||||
| if(split !== false) | |||||
| v[textName] = v[valueName] + split + v[textName]; | |||||
| if(v[childrenName] && Array.isArray(v[childrenName]) && v[childrenName].length > 0) | |||||
| { | |||||
| if(hasChildren !== false) | |||||
| v[textName] = v[textName] + hasChildren; | |||||
| handleTree_r(v[childrenName]); | |||||
| } | |||||
| } | |||||
| } | |||||
| handleTree_r(tree); | |||||
| }, | |||||
| findTree(tree, value) { | |||||
| let valueName = this.valueName || 'value'; | |||||
| let childrenName = this.childrenName || 'children'; | |||||
| function findTree_r(l) { | |||||
| for(let v of l) | |||||
| { | |||||
| if(value == v[valueName]) | |||||
| return v; | |||||
| if(v[childrenName] && Array.isArray(v[childrenName]) && v[childrenName].length > 0) | |||||
| { | |||||
| let res = findTree_r(v[childrenName]); | |||||
| if(res !== undefined) | |||||
| return res; | |||||
| } | |||||
| } | |||||
| return; | |||||
| } | |||||
| return findTree_r(tree); | |||||
| }, | |||||
| syncIndex() { | |||||
| let item = this.findTree(this.internalOptions, this.internalValue); | |||||
| if(item) | |||||
| this.visibleValue = item[this.textName || 'text']; | |||||
| } | |||||
| }, | |||||
| } | |||||
| </script> | |||||
| <style scoped> | |||||
| </style> | |||||
| @@ -0,0 +1,91 @@ | |||||
| <!-- 状态单选框表单组件 zhao --> | |||||
| <template> | |||||
| <div> | |||||
| <van-field | |||||
| :readonly="true" | |||||
| :clickable="!readonly" | |||||
| :name="name" | |||||
| :label="label" | |||||
| :placeholder="placeholder" | |||||
| input-align="right" | |||||
| :required="required" | |||||
| :label-width="labelWidth || 'auto'" | |||||
| @click="toggle" | |||||
| > | |||||
| <template #right-icon> | |||||
| <van-checkbox v-model="checked" | |||||
| :disabled="readonly" | |||||
| shape="square" | |||||
| ></van-checkbox> | |||||
| </template> | |||||
| </van-field> | |||||
| </div> | |||||
| </template> | |||||
| <script> | |||||
| export default { | |||||
| name: "fieldCheckbox", | |||||
| props: [ | |||||
| 'name', 'readonly', 'value', 'label', 'placeholder', 'required', 'rules', | |||||
| 'labelWidth', | |||||
| 'trueLabel', // 选中的值 | |||||
| 'falseLabel', // 未选中的值 | |||||
| ], | |||||
| watch: { | |||||
| value: function (newVal, oldVal) { | |||||
| this.parseValue(newVal); | |||||
| }, | |||||
| checked: function (newVal, oldVal) { | |||||
| if(newVal !== undefined) | |||||
| this.onChanged(newVal); | |||||
| }, | |||||
| }, | |||||
| created() { | |||||
| this.parseValue(this.value); | |||||
| }, | |||||
| data() { | |||||
| return { | |||||
| internalValue: this.value, | |||||
| remoteColumns: null, | |||||
| remoteResponse: null, | |||||
| checked: false, | |||||
| }; | |||||
| }, | |||||
| methods: { | |||||
| onChanged(data) { | |||||
| let trueLabel = this.getTrueLabel(); | |||||
| let falseLabel = this.getFalseLabel(); | |||||
| let res = data ? trueLabel : falseLabel; | |||||
| if(res != this.internalValue) | |||||
| { | |||||
| this.internalValue = res; | |||||
| this.$emit('change', this.internalValue); | |||||
| this.$emit("input", this.internalValue); | |||||
| } | |||||
| }, | |||||
| getFalseLabel() { | |||||
| return this.falseLabel !== undefined ? this.falseLabel : false; | |||||
| }, | |||||
| getTrueLabel() { | |||||
| return this.trueLabel !== undefined ? this.trueLabel : true; | |||||
| }, | |||||
| parseValue(data) { | |||||
| let trueLabel = this.getTrueLabel(); | |||||
| let falseLabel = this.getFalseLabel(); | |||||
| let res = data == trueLabel; | |||||
| this.internalValue = res ? trueLabel : falseLabel; | |||||
| this.checked = res; | |||||
| }, | |||||
| toggle() { | |||||
| console.log(123); | |||||
| if(!this.readonly) | |||||
| this.checked = !this.checked; | |||||
| }, | |||||
| }, | |||||
| } | |||||
| </script> | |||||
| <style scoped> | |||||
| </style> | |||||
| @@ -0,0 +1,196 @@ | |||||
| <!-- 日期选择表单组件 zhao --> | |||||
| <template> | |||||
| <div> | |||||
| <van-field | |||||
| :readonly="true" | |||||
| :clickable="!readonly" | |||||
| :name="name" | |||||
| :value="visibleValue" | |||||
| :label="label" | |||||
| :placeholder="placeholder" | |||||
| @click="openPopup" | |||||
| input-align="right" | |||||
| right-icon="arrow-down" | |||||
| :rules="rules" | |||||
| :required="required" | |||||
| :label-width="labelWidth || 'auto'" | |||||
| :input-align="inputAlign || 'left'" | |||||
| :size="size || ''" | |||||
| > | |||||
| <!-- <template #button> | |||||
| <van-icon name="notes-o" size="20"/> | |||||
| </template>--> | |||||
| </van-field> | |||||
| <van-popup v-model="popupVisible" position="bottom" v-if="type === 'year'"> | |||||
| <van-picker | |||||
| ref="picker" | |||||
| :title="label" | |||||
| show-toolbar | |||||
| :columns="yearColumns" | |||||
| :readonly="readonly" | |||||
| v-model="internalValue" | |||||
| @confirm="onConfirm" | |||||
| @cancel="onCancel" | |||||
| @change="onChanged" | |||||
| /> | |||||
| </van-popup> | |||||
| <van-popup v-model="popupVisible" position="bottom" v-else> | |||||
| <van-datetime-picker | |||||
| ref="picker" | |||||
| v-model="internalValue" | |||||
| :type="type || 'date'" | |||||
| :readonly="readonly" | |||||
| :title="label || ''" | |||||
| :min-date="minDate" | |||||
| :max-date="maxDate" | |||||
| @confirm="onConfirm" | |||||
| @cancel="onCancel" | |||||
| @change="onChanged" | |||||
| /> | |||||
| </van-popup> | |||||
| </div> | |||||
| </template> | |||||
| <script> | |||||
| import { formatDate } from "element-ui/src/utils/date-util.js" | |||||
| import {strtotime} from "@/utils"; | |||||
| export default { | |||||
| name: "fieldDatePicker", | |||||
| props: [ | |||||
| 'name', 'readonly', 'value', 'label', 'placeholder', 'required', 'rules', 'labelWidth', 'inputAlign', | |||||
| 'type', // 类型, 仅支持 datetime date time year-month month-day datehour, 额外支持year(但formatter必须为yyyy, 可以提供yearRangeLength=<Number>指定年范围) | |||||
| 'formatter', // value的格式化 String|Function|undefined 字符串为格式字符串, 函数则必须有返回 undefined则不转换 | |||||
| 'clearable', // 点击取消时清空绑定值 | |||||
| 'yearRangeLength', // type === 'year' 时生成的年份数量范围 [YEAR - yearRangeLength, YEAR + yearRangeLength] | |||||
| 'minDate', 'maxDate', | |||||
| 'size', | |||||
| ], | |||||
| watch: { | |||||
| value: function (newVal, oldVal) { | |||||
| this.visibleValue = newVal; | |||||
| this.internalValue = new Date(newVal); | |||||
| }, | |||||
| }, | |||||
| created() { | |||||
| if(this.value) | |||||
| { | |||||
| this.visibleValue = this.value; | |||||
| this.internalValue = new Date(this.value); | |||||
| } | |||||
| // 默认当前 | |||||
| /* else { | |||||
| this.syncValue(new Date); | |||||
| }*/ | |||||
| }, | |||||
| data() { | |||||
| return { | |||||
| popupVisible: false, | |||||
| internalValue: new Date(this.value || Date.now()), | |||||
| visibleValue: this.value, | |||||
| loading: false, | |||||
| }; | |||||
| }, | |||||
| methods: { | |||||
| openPopup() { | |||||
| if(!this.readonly) | |||||
| { | |||||
| //console.log(this.internalValue); | |||||
| this.popupVisible = true; | |||||
| this.$nextTick(() => { | |||||
| try | |||||
| { | |||||
| if(1) | |||||
| { | |||||
| let values = (this.visibleValue || this.getValue(new Date)).split(/\D+/); //TODO: 按非数字符号粗略分割解析初始值, 仅对于类似yyyy-MM-dd | |||||
| //console.log(values); | |||||
| let picker = this.$refs.picker.getPicker ? this.$refs.picker.getPicker() : this.$refs.picker; | |||||
| picker.setValues(values); | |||||
| } | |||||
| else { | |||||
| //TODO: 打开时保存初始值, 取消或点击遮罩未确定的时候恢复该初始值到v-model | |||||
| } | |||||
| } | |||||
| catch (e) | |||||
| { | |||||
| console.error(e); | |||||
| } | |||||
| }) | |||||
| } | |||||
| }, | |||||
| closePopup() { | |||||
| this.popupVisible = false; | |||||
| }, | |||||
| onConfirm(data) { | |||||
| this.syncValue(data); | |||||
| this.$emit('input', this.visibleValue); | |||||
| this.$emit('confirm', this.visibleValue, this.internalValue); | |||||
| this.closePopup(); | |||||
| }, | |||||
| onCancel() { | |||||
| this.closePopup(); | |||||
| this.$emit('cancel'); | |||||
| if(this.clearable) | |||||
| { | |||||
| this.visibleValue = ''; | |||||
| this.internalValue = null; | |||||
| this.$emit('input', this.internalValue); | |||||
| } | |||||
| }, | |||||
| onChanged(data) { | |||||
| this.$emit('change', this.getValue(data), data); | |||||
| }, | |||||
| getValue(data) { | |||||
| let type = typeof(this.formatter); | |||||
| if(type === 'function') | |||||
| return this.formatter(data); | |||||
| else if(type === 'string') | |||||
| return formatDate(data, this.formatter); | |||||
| else | |||||
| return data; | |||||
| }, | |||||
| syncValue(data) { | |||||
| this.internalValue = data; | |||||
| this.visibleValue = this.getValue(data); | |||||
| }, | |||||
| genYearColumns(num) { | |||||
| let d; | |||||
| try | |||||
| { | |||||
| if(this.value) | |||||
| { | |||||
| d = strtotime(this.value, 'yyyy'); | |||||
| } | |||||
| else | |||||
| d = new Date; | |||||
| } | |||||
| catch(e) | |||||
| { | |||||
| d = new Date; | |||||
| } | |||||
| let y = d.getFullYear(); | |||||
| let arr = ['' + y]; | |||||
| for(let i = 1; i <= num; i++) | |||||
| { | |||||
| arr.push('' + (y + i)); | |||||
| arr.splice(0, 0, '' + (y - i)); | |||||
| } | |||||
| return arr; | |||||
| }, | |||||
| strtotime, | |||||
| }, | |||||
| computed: { | |||||
| yearColumns() { | |||||
| if(this.type !== 'year') | |||||
| return []; | |||||
| return this.genYearColumns(this.yearRangeLength || 100); | |||||
| }, | |||||
| } | |||||
| } | |||||
| </script> | |||||
| <style scoped> | |||||
| </style> | |||||
| @@ -0,0 +1,111 @@ | |||||
| <!-- 单选框组表单组件 zhao --> | |||||
| <template> | |||||
| <div> | |||||
| <van-field | |||||
| :readonly="true" | |||||
| :name="name" | |||||
| :label="label" | |||||
| :placeholder="placeholder" | |||||
| input-align="right" | |||||
| :required="required" | |||||
| :label-width="labelWidth || 'auto'" | |||||
| > | |||||
| <template #right-icon> | |||||
| <van-radio-group :disabled="readonly" @change="onChanged" v-model="internalValue" direction="horizontal" :rules="rules"> | |||||
| <van-radio v-for="(item, index) in (columns ? columns : remoteColumns)" :name="getValue(item)" :key="index">{{getLabel(item)}}</van-radio> | |||||
| </van-radio-group> | |||||
| </template> | |||||
| </van-field> | |||||
| </div> | |||||
| </template> | |||||
| <script> | |||||
| import request from "@/utils/request"; | |||||
| export default { | |||||
| name: "fieldRadio", | |||||
| props: [ | |||||
| 'name', 'readonly', 'value', 'label', 'placeholder', 'required', 'rules', 'labelWidth', | |||||
| 'columns', // 列表数据 Array | |||||
| 'valueKey', // 名称键名 String | |||||
| 'dataKey', // 值键名 String | |||||
| 'remoteUrl', // 远程列表加载地址 String | |||||
| 'onRemoteResponse', // 远程获取到结果的处理回调 String|Function 如果是函数需返回数组, 如果是字符串支持.分割 | |||||
| ], | |||||
| watch: { | |||||
| value: function (newVal, oldVal) { | |||||
| this.internalValue = newVal; | |||||
| }, | |||||
| columns: function (newVal, oldVal) { | |||||
| }, | |||||
| remoteUrl: function (newVal, oldVal) { | |||||
| this.requestRemote(); | |||||
| }, | |||||
| onRemoteResponse: function (newVal, oldVal) { | |||||
| this.parseRemote(); | |||||
| } | |||||
| }, | |||||
| created() { | |||||
| if(this.remoteUrl) | |||||
| this.requestRemote(); | |||||
| }, | |||||
| data() { | |||||
| return { | |||||
| internalValue: this.value, | |||||
| remoteColumns: null, | |||||
| remoteResponse: null, | |||||
| }; | |||||
| }, | |||||
| methods: { | |||||
| onChanged(data) { | |||||
| this.$emit("input", this.internalValue); | |||||
| this.$emit('change', this.internalValue); | |||||
| }, | |||||
| getValue(data) { | |||||
| return typeof(data) === 'object' && this.dataKey ? data[this.dataKey] : data; | |||||
| }, | |||||
| getLabel(data) { | |||||
| return typeof(data) === 'object' && this.valueKey ? data[this.valueKey] : data; | |||||
| }, | |||||
| getColumns() { | |||||
| return this.columns ? this.columns : this.remoteColumns; | |||||
| }, | |||||
| requestRemote() { | |||||
| if(!this.remoteUrl) | |||||
| return; | |||||
| this.remoteColumns = []; | |||||
| let promise = typeof(this.remoteUrl) === 'function' ? this.remoteUrl() : (this.remoteUrl instanceof Promise ? this.remoteUrl : request(this.remoteUrl)); | |||||
| promise.then((resp) => { | |||||
| this.remoteResponse = resp; | |||||
| this.parseRemote(); | |||||
| }).catch((e) => { | |||||
| console.error(e); | |||||
| }).finally(() => { | |||||
| }) | |||||
| }, | |||||
| parseRemote() { | |||||
| if(!this.remoteResponse) | |||||
| return; | |||||
| let type = typeof(this.onRemoteResponse); | |||||
| if(type === 'function') | |||||
| this.remoteColumns = this.onRemoteResponse(this.remoteResponse); | |||||
| else if(type === 'string') | |||||
| { | |||||
| let arr = this.onRemoteResponse.split('.'); | |||||
| let ptr = this.remoteResponse; | |||||
| for(let i in arr) | |||||
| { | |||||
| ptr = this.remoteResponse[arr[i]]; | |||||
| } | |||||
| this.remoteColumns = ptr; | |||||
| } | |||||
| else | |||||
| this.remoteColumns = this.remoteResponse; | |||||
| }, | |||||
| }, | |||||
| } | |||||
| </script> | |||||
| <style scoped> | |||||
| </style> | |||||
| @@ -0,0 +1,190 @@ | |||||
| <!-- 下拉列表表单组件 zhao --> | |||||
| <template> | |||||
| <div> | |||||
| <van-field | |||||
| :readonly="true" | |||||
| :clickable="!readonly" | |||||
| :name="name" | |||||
| :value="visibleValue" | |||||
| :label="label" | |||||
| :placeholder="placeholder" | |||||
| @click="openPopup" | |||||
| input-align="right" | |||||
| right-icon="arrow-down" | |||||
| :rules="rules" | |||||
| :required="required" | |||||
| :label-width="labelWidth || 'auto'" | |||||
| :size="size || ''" | |||||
| > | |||||
| </van-field> | |||||
| <van-popup v-model="popupVisible" position="bottom"> | |||||
| <van-picker | |||||
| ref="picker" | |||||
| :title="label" | |||||
| show-toolbar | |||||
| :columns="columns ? columns : remoteColumns" | |||||
| :readonly="readonly" | |||||
| :value-key="valueKey" | |||||
| :loading="loading" | |||||
| @confirm="onConfirm" | |||||
| @cancel="onCancel" | |||||
| @change="onChanged" | |||||
| /> | |||||
| </van-popup> | |||||
| </div> | |||||
| </template> | |||||
| <script> | |||||
| import request from "@/utils/request"; | |||||
| export default { | |||||
| name: "fieldSelect", | |||||
| props: [ | |||||
| 'name', 'readonly', 'value', 'label', 'placeholder', 'required', 'rules', 'labelWidth', | |||||
| 'columns', // 列表数据 Array | |||||
| 'valueKey', // 名称键名 String | |||||
| 'dataKey', // 值键名 String | |||||
| 'remoteUrl', // 远程列表加载地址 String | |||||
| 'onRemoteResponse', // 远程获取到结果的处理回调 String|Function 如果是函数需返回数组, 如果是字符串支持.分割 | |||||
| 'clearable', // 点击取消时清空绑定值 | |||||
| 'size', | |||||
| ], | |||||
| watch: { | |||||
| value: function (newVal, oldVal) { | |||||
| this.internalValue = newVal; | |||||
| this.visibleValue = newVal; | |||||
| this.syncIndex(); | |||||
| }, | |||||
| columns: function (newVal, oldVal) { | |||||
| this.syncIndex(); | |||||
| }, | |||||
| remoteUrl: function (newVal, oldVal) { | |||||
| this.requestRemote(); | |||||
| }, | |||||
| onRemoteResponse: function (newVal, oldVal) { | |||||
| this.parseRemote(); | |||||
| } | |||||
| }, | |||||
| created() { | |||||
| if(this.remoteUrl) | |||||
| this.requestRemote(); | |||||
| }, | |||||
| data() { | |||||
| return { | |||||
| popupVisible: false, | |||||
| internalValue: this.value, | |||||
| visibleValue: '', | |||||
| defaultIndex: 0, | |||||
| remoteColumns: null, | |||||
| loading: false, | |||||
| remoteResponse: null, | |||||
| }; | |||||
| }, | |||||
| methods: { | |||||
| openPopup() { | |||||
| if(!this.readonly) | |||||
| { | |||||
| this.popupVisible = true; | |||||
| this.$nextTick(() => { | |||||
| this.$refs.picker.setIndexes([this.defaultIndex]); | |||||
| }) | |||||
| } | |||||
| }, | |||||
| closePopup() { | |||||
| this.popupVisible = false; | |||||
| }, | |||||
| onChanged(data) { | |||||
| this.$emit('change', data); | |||||
| }, | |||||
| onConfirm(data) { | |||||
| this.syncValue(data); | |||||
| this.$emit('input', this.internalValue); | |||||
| this.$emit('confirm', this.internalValue); | |||||
| this.closePopup(); | |||||
| }, | |||||
| onCancel() { | |||||
| this.closePopup(); | |||||
| this.$emit('cancel'); | |||||
| if(this.clearable) | |||||
| { | |||||
| this.visibleValue = ''; | |||||
| this.internalValue = null; | |||||
| this.$emit('input', this.internalValue); | |||||
| } | |||||
| }, | |||||
| getValue(data) { | |||||
| return typeof(data) === 'object' && this.dataKey ? data[this.dataKey] : data; | |||||
| }, | |||||
| getLabel(data) { | |||||
| return typeof(data) === 'object' && this.valueKey ? data[this.valueKey] : data; | |||||
| }, | |||||
| syncValue(data) { | |||||
| this.internalValue = this.getValue(data); | |||||
| this.visibleValue = this.getLabel(data); | |||||
| }, | |||||
| syncIndex() { | |||||
| let columns = this.getColumns(); | |||||
| if(!columns) | |||||
| return -1; | |||||
| for(let i in columns) | |||||
| { | |||||
| if(this.getValue(columns[i]) == this.internalValue) { | |||||
| this.defaultIndex = i; | |||||
| this.visibleValue = this.getLabel(columns[i]); | |||||
| this.onChanged(columns[i]); | |||||
| return i; | |||||
| } | |||||
| } | |||||
| if(1) // 不存在 | |||||
| { | |||||
| this.defaultIndex = -1; | |||||
| this.visibleValue = this.internalValue; | |||||
| this.onChanged(null); | |||||
| } | |||||
| return -1; | |||||
| }, | |||||
| getColumns() { | |||||
| return this.columns ? this.columns : this.remoteColumns; | |||||
| }, | |||||
| requestRemote() { | |||||
| if(!this.remoteUrl) | |||||
| return; | |||||
| this.loading = true; | |||||
| this.remoteColumns = []; | |||||
| let promise = typeof(this.remoteUrl) === 'function' ? this.remoteUrl() : (this.remoteUrl instanceof Promise ? this.remoteUrl : request(this.remoteUrl)); | |||||
| promise.then((resp) => { | |||||
| this.remoteResponse = resp; | |||||
| this.parseRemote(); | |||||
| this.syncIndex(); | |||||
| }).catch((e) => { | |||||
| console.error(e); | |||||
| }).finally(() => { | |||||
| this.loading = false; | |||||
| }) | |||||
| }, | |||||
| parseRemote() { | |||||
| if(!this.remoteResponse) | |||||
| return; | |||||
| let type = typeof(this.onRemoteResponse); | |||||
| if(type === 'function') | |||||
| this.remoteColumns = this.onRemoteResponse(this.remoteResponse); | |||||
| else if(type === 'string') | |||||
| { | |||||
| let arr = this.onRemoteResponse.split('.'); | |||||
| let ptr = this.remoteResponse; | |||||
| for(let i in arr) | |||||
| { | |||||
| ptr = this.remoteResponse[arr[i]]; | |||||
| } | |||||
| this.remoteColumns = ptr; | |||||
| } | |||||
| else | |||||
| this.remoteColumns = this.remoteResponse; | |||||
| }, | |||||
| }, | |||||
| } | |||||
| </script> | |||||
| <style scoped> | |||||
| </style> | |||||
| @@ -36,6 +36,7 @@ import ImagePreview from "@/components/ImagePreview" | |||||
| import DictTag from '@/components/DictTag' | import DictTag from '@/components/DictTag' | ||||
| // 字典数据组件 | // 字典数据组件 | ||||
| import DictData from '@/components/DictData' | import DictData from '@/components/DictData' | ||||
| import VueClipboard from 'vue-clipboard2' | |||||
| // Vant 引用 | // Vant 引用 | ||||
| import Vant from 'vant'; | import Vant from 'vant'; | ||||
| import 'vant/lib/index.css'; | import 'vant/lib/index.css'; | ||||
| @@ -65,6 +66,7 @@ Vue.component('ImagePreview', ImagePreview) | |||||
| Vue.use(Vant) | Vue.use(Vant) | ||||
| Vue.use(directive) | Vue.use(directive) | ||||
| Vue.use(plugins) | Vue.use(plugins) | ||||
| Vue.use(VueClipboard) | |||||
| DictData.install() | DictData.install() | ||||
| /** | /** | ||||
| @@ -111,9 +111,27 @@ export const constantRoutes = [ | |||||
| name: 'appUser', | name: 'appUser', | ||||
| hidden: true, | hidden: true, | ||||
| meta: { | meta: { | ||||
| title: '首页', | |||||
| title: '用户', | |||||
| }, | |||||
| component: (resolve) => require(['@/views/app/user/user'], resolve) | |||||
| }, | |||||
| { //用户页 | |||||
| path: '/app/user/info', | |||||
| name: 'appUserInfo', | |||||
| hidden: true, | |||||
| meta: { | |||||
| title: '用户信息', | |||||
| }, | |||||
| component: (resolve) => require(['@/views/app/user/info'], resolve) | |||||
| }, | |||||
| { //用户页 | |||||
| path: '/app/user/passWord', | |||||
| name: 'appUserPassWord', | |||||
| hidden: true, | |||||
| meta: { | |||||
| title: '修改密码', | |||||
| }, | }, | ||||
| component: (resolve) => require(['@/views/app/user'], resolve) | |||||
| component: (resolve) => require(['@/views/app/user/passWord'], resolve) | |||||
| }, | }, | ||||
| { //列表 | { //列表 | ||||
| path: '/app/list', | path: '/app/list', | ||||
| @@ -122,7 +140,7 @@ export const constantRoutes = [ | |||||
| meta: { | meta: { | ||||
| title: '列表', | title: '列表', | ||||
| }, | }, | ||||
| component: (resolve) => require(['@/views/app/list'], resolve) | |||||
| component: (resolve) => require(['@/views/app/project/list'], resolve) | |||||
| }, | }, | ||||
| { //属性修改 | { //属性修改 | ||||
| path: '/app/attribute_edit', | path: '/app/attribute_edit', | ||||
| @@ -131,7 +149,7 @@ export const constantRoutes = [ | |||||
| meta: { | meta: { | ||||
| title: '修改', | title: '修改', | ||||
| }, | }, | ||||
| component: (resolve) => require(['@/views/app/attribute_edit'], resolve) | |||||
| component: (resolve) => require(['@/views/app/project/attribute_edit'], resolve) | |||||
| }, | }, | ||||
| { //经营修改 | { //经营修改 | ||||
| path: '/app/operate_edit', | path: '/app/operate_edit', | ||||
| @@ -140,7 +158,7 @@ export const constantRoutes = [ | |||||
| meta: { | meta: { | ||||
| title: '修改', | title: '修改', | ||||
| }, | }, | ||||
| component: (resolve) => require(['@/views/app/operate_edit'], resolve) | |||||
| component: (resolve) => require(['@/views/app/project/operate_edit'], resolve) | |||||
| }, | }, | ||||
| { //地图 | { //地图 | ||||
| path: '/app/map', | path: '/app/map', | ||||
| @@ -158,7 +176,7 @@ export const constantRoutes = [ | |||||
| meta: { | meta: { | ||||
| title: '详情', | title: '详情', | ||||
| }, | }, | ||||
| component: (resolve) => require(['@/views/app/detail'], resolve) | |||||
| component: (resolve) => require(['@/views/app/project/detail'], resolve) | |||||
| }, | }, | ||||
| ] | ] | ||||
| @@ -11,6 +11,7 @@ const getters = { | |||||
| name: state => state.user.name, | name: state => state.user.name, | ||||
| nickName: state => state.user.nickName, | nickName: state => state.user.nickName, | ||||
| user: state => state.user, | user: state => state.user, | ||||
| userDept: state => state.user.userDept, | |||||
| introduction: state => state.user.introduction, | introduction: state => state.user.introduction, | ||||
| roles: state => state.user.roles, | roles: state => state.user.roles, | ||||
| permissions: state => state.user.permissions, | permissions: state => state.user.permissions, | ||||
| @@ -4,6 +4,7 @@ import { login, logout, getInfo, systemConfig } from '@/api/login' | |||||
| import { getToken, setToken, removeToken } from '@/utils/auth' | import { getToken, setToken, removeToken } from '@/utils/auth' | ||||
| import { isHttp, isEmpty } from "@/utils/validate" | import { isHttp, isEmpty } from "@/utils/validate" | ||||
| import defAva from '@/assets/images/profile.jpg' | import defAva from '@/assets/images/profile.jpg' | ||||
| import Cookies from "js-cookie"; | |||||
| const user = { | const user = { | ||||
| state: { | state: { | ||||
| @@ -13,6 +14,7 @@ const user = { | |||||
| nickName: '', | nickName: '', | ||||
| avatar: '', | avatar: '', | ||||
| user: {}, | user: {}, | ||||
| userDept:null, | |||||
| roles: [], | roles: [], | ||||
| permissions: [], | permissions: [], | ||||
| //获取登录页相关标题 | //获取登录页相关标题 | ||||
| @@ -46,6 +48,9 @@ const user = { | |||||
| SET_USER: (state, user) => { | SET_USER: (state, user) => { | ||||
| state.user = user | state.user = user | ||||
| }, | }, | ||||
| SET_USERDEPT: (state, dept) => { | |||||
| state.userDept = dept | |||||
| }, | |||||
| SET_ROLES: (state, roles) => { | SET_ROLES: (state, roles) => { | ||||
| state.roles = roles | state.roles = roles | ||||
| }, | }, | ||||
| @@ -107,6 +112,9 @@ const user = { | |||||
| commit('SET_NICK_NAME', user.nickName) | commit('SET_NICK_NAME', user.nickName) | ||||
| commit('SET_AVATAR', avatar) | commit('SET_AVATAR', avatar) | ||||
| commit('SET_USER', user) | commit('SET_USER', user) | ||||
| commit('SET_USERDEPT', user.dept.deptId) | |||||
| Cookies.set('userDept',user.dept.deptId) | |||||
| Cookies.set('importCode',user.dept.importCode) | |||||
| /* 初始密码提示 */ | /* 初始密码提示 */ | ||||
| if(res.isDefaultModifyPwd) { | if(res.isDefaultModifyPwd) { | ||||
| MessageBox.confirm('您的密码还是初始密码,请修改密码!', '安全提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { | MessageBox.confirm('您的密码还是初始密码,请修改密码!', '安全提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { | ||||
| @@ -5,8 +5,8 @@ | |||||
| <div class="left"> | <div class="left"> | ||||
| <div class="avatar"><img src="../../assets/images/app/user_header.png" alt=""></div> | <div class="avatar"><img src="../../assets/images/app/user_header.png" alt=""></div> | ||||
| <div class="info"> | <div class="info"> | ||||
| <p>{{ nickName }}</p> | |||||
| <p>{{ deptName }}</p> | |||||
| <p>{{$store.getters.user.user.nickName}}</p> | |||||
| <p>{{$store.getters.user.user.dept.deptName}}</p> | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| <van-icon name="setting" size="25" @click="$router.push({ path: '/app/user' })" /> | <van-icon name="setting" size="25" @click="$router.push({ path: '/app/user' })" /> | ||||
| @@ -38,13 +38,16 @@ | |||||
| name: "appIndex", | name: "appIndex", | ||||
| data() { | data() { | ||||
| return { | return { | ||||
| menuList:[] | |||||
| menuList:[], | |||||
| user:{}, | |||||
| avatar:'' | |||||
| }; | }; | ||||
| }, | }, | ||||
| created() { | created() { | ||||
| this.getMenuApp(); | this.getMenuApp(); | ||||
| this.nickName = this.$store.getters.user.user.nickName; | |||||
| this.deptName = this.$store.getters.user.user.dept.deptName; | |||||
| }, | |||||
| mounted() { | |||||
| console.log(this.$store.getters.userDept) | |||||
| }, | }, | ||||
| methods: { | methods: { | ||||
| getMenuApp(){ | getMenuApp(){ | ||||
| @@ -9,12 +9,12 @@ | |||||
| /> | /> | ||||
| <div class="search_box"> | <div class="search_box"> | ||||
| <div class="left"> | <div class="left"> | ||||
| <van-field v-model="value" left-icon="search" placeholder="请输入用户名" /> | |||||
| <van-field v-model="keyword" left-icon="search" placeholder="请输入用户名" /> | |||||
| </div> | </div> | ||||
| <van-button type="primary" round >搜索</van-button> | |||||
| <van-button type="primary" round @click="searchMap" >搜索</van-button> | |||||
| </div> | </div> | ||||
| <div class="location"> | |||||
| <div class="location" :id="locationMap"> | |||||
| <img src="../../assets/images/app/location.png" alt=""> | <img src="../../assets/images/app/location.png" alt=""> | ||||
| </div> | </div> | ||||
| @@ -32,164 +32,69 @@ | |||||
| <!-- <van-popup v-model="open" position="bottom" round >--> | |||||
| <!-- <div class="landPopup">--> | |||||
| <!-- <p class="landPopup_title">属性数据 <img src="../../assets/images/app/edit.png" width="25" alt=""></p>--> | |||||
| <!-- <van-form ref="landForm">--> | |||||
| <!-- <van-field v-model="form.dkbm" label="地块代码:" placeholder="<自动生成>" :border="false" input-align="right" label-width="auto" maxlength="19" :disabled="true" >--> | |||||
| <!-- <!– <template #button v-if="!isDisabled">--> | |||||
| <!-- <van-button size="mini" type="primary" native-type="button" @click="generateCode">生成代码</van-button>--> | |||||
| <!-- </template> –>--> | |||||
| <!-- </van-field>--> | |||||
| <!-- <van-field v-model="form.dkmc" label="地块名称:" placeholder="请输入地块名称" required :rules="[{ required: true }]" :border="false" input-align="right" maxlength="50" />--> | |||||
| <!-- <van-field v-model="syqxzText" label="所有权性质:"--> | |||||
| <!-- placeholder="请选择所有权性质"--> | |||||
| <!-- required--> | |||||
| <!-- :rules="[{ required: true }]"--> | |||||
| <!-- :border="false"--> | |||||
| <!-- input-align="right"--> | |||||
| <!-- right-icon="arrow-down"--> | |||||
| <!-- readonly--> | |||||
| <!-- clickable--> | |||||
| <!-- @click="showOwnership = true"--> | |||||
| <!-- />--> | |||||
| <!-- <van-popup v-model="showOwnership" position="bottom" get-container=".app-container">--> | |||||
| <!-- <van-picker--> | |||||
| <!-- show-toolbar--> | |||||
| <!-- :columns="syqxzOptions"--> | |||||
| <!-- value-key="dictLabel"--> | |||||
| <!-- @confirm="onConfirmOwnershipOptions"--> | |||||
| <!-- @cancel="showOwnership = false"--> | |||||
| <!-- />--> | |||||
| <!-- </van-popup>--> | |||||
| <!-- <van-field v-model="dklbText" label="地块类别:"--> | |||||
| <!-- placeholder="请选择地块类别"--> | |||||
| <!-- required--> | |||||
| <!-- :rules="[{ required: true }]"--> | |||||
| <!-- :border="false"--> | |||||
| <!-- input-align="right"--> | |||||
| <!-- right-icon="arrow-down"--> | |||||
| <!-- readonly--> | |||||
| <!-- clickable--> | |||||
| <!-- @click="openLandCategoryPopup"--> | |||||
| <!-- />--> | |||||
| <!-- <van-popup v-model="showLandCategory" position="bottom" get-container=".app-container">--> | |||||
| <!-- <van-picker--> | |||||
| <!-- show-toolbar--> | |||||
| <!-- :columns="dklbOptions"--> | |||||
| <!-- value-key="dictLabel"--> | |||||
| <!-- @confirm="onConfirmLandCategoryOptions"--> | |||||
| <!-- @cancel="showLandCategory = false"--> | |||||
| <!-- />--> | |||||
| <!-- </van-popup>--> | |||||
| <!-- <van-field v-model="tdlylxText" label="土地利用类型:"--> | |||||
| <!-- placeholder="请选择土地利用类型"--> | |||||
| <!-- required--> | |||||
| <!-- :rules="[{ required: true }]"--> | |||||
| <!-- :border="false"--> | |||||
| <!-- input-align="right"--> | |||||
| <!-- right-icon="arrow-down"--> | |||||
| <!-- readonly--> | |||||
| <!-- clickable--> | |||||
| <!-- @click="showLandType = true"--> | |||||
| <!-- />--> | |||||
| <!-- <van-popup v-model="showLandType" position="bottom" get-container=".app-container">--> | |||||
| <!-- <van-picker--> | |||||
| <!-- show-toolbar--> | |||||
| <!-- :columns="tdlylxOptions"--> | |||||
| <!-- value-key="dictLabel"--> | |||||
| <!-- @confirm="onConfirmLandTypeOptions"--> | |||||
| <!-- @cancel="showLandType = false"--> | |||||
| <!-- />--> | |||||
| <!-- </van-popup>--> | |||||
| <!-- <van-field v-model="dldjText" label="地力等级:"--> | |||||
| <!-- placeholder="请选择地力等级"--> | |||||
| <!-- required--> | |||||
| <!-- :rules="[{ required: true }]"--> | |||||
| <!-- :border="false"--> | |||||
| <!-- input-align="right"--> | |||||
| <!-- right-icon="arrow-down"--> | |||||
| <!-- readonly--> | |||||
| <!-- clickable--> | |||||
| <!-- @click="showLandGrade = true"--> | |||||
| <!-- />--> | |||||
| <!-- <van-popup v-model="showLandGrade" position="bottom" get-container=".app-container">--> | |||||
| <!-- <van-picker--> | |||||
| <!-- show-toolbar--> | |||||
| <!-- :columns="dldjOptions"--> | |||||
| <!-- value-key="dictLabel"--> | |||||
| <!-- @confirm="onConfirmLandGradeOptions"--> | |||||
| <!-- @cancel="showLandGrade = false"--> | |||||
| <!-- />--> | |||||
| <!-- </van-popup>--> | |||||
| <!-- <van-field v-model="tdytText" label="土地用途:"--> | |||||
| <!-- placeholder="请选择土地用途"--> | |||||
| <!-- required--> | |||||
| <!-- :rules="[{ required: true }]"--> | |||||
| <!-- :border="false"--> | |||||
| <!-- input-align="right"--> | |||||
| <!-- right-icon="arrow-down"--> | |||||
| <!-- readonly--> | |||||
| <!-- clickable--> | |||||
| <!-- @click="showLandPurpose = true"--> | |||||
| <!-- />--> | |||||
| <!-- <van-popup v-model="showLandPurpose" position="bottom" get-container=".app-container">--> | |||||
| <!-- <van-picker--> | |||||
| <!-- show-toolbar--> | |||||
| <!-- :columns="tdytOptions"--> | |||||
| <!-- value-key="dictLabel"--> | |||||
| <!-- @confirm="onConfirmLandPurposeOptions"--> | |||||
| <!-- @cancel="showLandPurpose = false"--> | |||||
| <!-- />--> | |||||
| <!-- </van-popup>--> | |||||
| <!-- <van-field v-model="form.sfjbnt" label="基本农田:" required :rules="[{ required: true }]" :border="false" input-align="right" >--> | |||||
| <!-- <template #input>--> | |||||
| <!-- <van-radio-group v-model="form.sfjbnt" direction="horizontal">--> | |||||
| <!-- <!– <van-radio name="1">是</van-radio>--> | |||||
| <!-- <van-radio name="2">否</van-radio> –>--> | |||||
| <!-- <van-radio v-for="dict in sfjbntOptions" :ke="dict.dictValue" :name="dict.dictValue">{{ dict.dictLabel }}</van-radio>--> | |||||
| <!-- </van-radio-group>--> | |||||
| <!-- </template>--> | |||||
| <!-- </van-field>--> | |||||
| <!-- <van-field v-model="form.scmjm" type="number" label="实测面积(亩):" placeholder="请输入实测面积(亩)" required :rules="[{ required: true }]" :border="false" input-align="right" />--> | |||||
| <!-- <van-field v-model="form.zjrxm" label="指界人姓名:" placeholder="请输入指界人姓名" required :rules="[{ required: true }]" :border="false" input-align="right" maxlength="100" />--> | |||||
| <!-- <van-field v-model="form.dkdz" label="地块东至:" placeholder="请输入地块东至" required :rules="[{ required: true }]" :border="false" input-align="right" maxlength="50" />--> | |||||
| <!-- <van-field v-model="form.dkxz" label="地块西至:" placeholder="请输入地块西至" required :rules="[{ required: true }]" :border="false" input-align="right" maxlength="50" />--> | |||||
| <!-- <van-field v-model="form.dknz" label="地块南至:" placeholder="请输入地块南至" required :rules="[{ required: true }]" :border="false" input-align="right" maxlength="50" />--> | |||||
| <!-- <van-field v-model="form.dkbz" label="地块北至:" placeholder="请输入地块北至" required :rules="[{ required: true }]" :border="false" input-align="right" maxlength="50" />--> | |||||
| <!-- <van-field v-model="form.dkbzxx" label="地块备注信息:" placeholder="请输入地块备注信息" type="textarea" rows="3" :border="false" input-align="right" maxlength="250" />--> | |||||
| <!-- </van-form>--> | |||||
| <!-- <div class="footer_main">--> | |||||
| <!-- <van-button type="default" hairline size="large">关闭弹窗</van-button>--> | |||||
| <!-- <van-button type="danger" hairline size="large">删除地块</van-button>--> | |||||
| <!-- <van-button type="info" hairline size="large">保存信息</van-button>--> | |||||
| <!-- </div>--> | |||||
| <!-- </div>--> | |||||
| <!-- </van-popup>--> | |||||
| <van-popup v-model="open" position="bottom" round > | |||||
| <div class="landPopup"> | |||||
| <p class="landPopup_title">属性数据 <img @click="$router.push({name:'appAttributeEdit',query:{fid:form.fid}})" src="../../assets/images/app/edit.png" width="25" alt=""></p> | |||||
| <van-field readonly v-model="form.deptName" label="区域位置名称" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly v-model="form.bsm" label="标识码" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly v-model="form.ysdm" label="要素代码" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly v-model="form.dkbm" label="地块代码" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly v-model="form.dkmc" label="地块名称" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly v-model="form.syqxz" label="所有权性质" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly v-model="form.dklb" label="地块类别" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly v-model="form.tdlylx" label="土地利用类型" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly v-model="form.dldj" label="地力等级" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly v-model="form.tdyt" label="土地用途" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly v-model="form.sfjbnt" label="是否基本农田" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly v-model="form.dkdz" label="地块东至" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly v-model="form.dkxz" label="地块西至" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly v-model="form.dknz" label="地块南至" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly v-model="form.dkbz" label="地块北至" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly v-model="form.dkbzxx" label="备注信息" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly v-model="form.zjrxm" label="指界人姓名" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly v-model="form.txmj" label="图显面积" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly v-model="form.scmjm" label="实测面积" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly v-model="form.sfzwd" label="是否账外地" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <p class="landPopup_title">经营数据 <img @click="$router.push({name:'appOperateEdit',query:{dkbm:form.dkbm}})" src="../../assets/images/app/edit.png" width="25" alt=""></p> | |||||
| <van-field readonly v-model="form.jymj" label="经营面积(亩)" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly v-model="form.jyfs" label="经营方式" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly v-model="form.jydxmc" label="经营对象名称" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly v-model="form.jykssj" label="经营开始时间" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly v-model="form.jyjssj" label="经营结束时间" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly v-model="form.cbje" label="承包金额(元)" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly v-model="form.surveyStatus" label="调查状态" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly v-model="form.bzxx" label="备注信息" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly label="实物图" placeholder="" input-align="right" label-width="auto" /> | |||||
| <div v-if="!!form.dkImg"> | |||||
| <el-tooltip effect="light" :content="item" placement="bottom" v-for="(item, index) in form.dkImg.split(',')" :key="index"> | |||||
| <el-image style="height: 64px; width: 64px; margin: 2px; display: inline-block;" fit="scale-down" :src="baseRoutingUrll + item" :preview-src-list="form.dkImg.split(',').map((x) => baseRoutingUrll + x)"/> | |||||
| </el-tooltip> | |||||
| </div> | |||||
| <div class="footer_main"> | |||||
| <van-button type="danger" @click="open = false" hairline size="large">关闭弹窗</van-button> | |||||
| </div> | |||||
| </div> | |||||
| </van-popup> | |||||
| </div> | </div> | ||||
| </template> | </template> | ||||
| <script> | <script> | ||||
| import { listLand, listLandQuery,getLand, getLandDetail, getLandDetailByDkbm, delLand, addLand, updateLand, printLand } from "@/api/resource/land" | |||||
| import { areaSavePri, cleanSavePri } from "@/api/gis/map" | |||||
| import { getToken } from "@/utils/auth" | |||||
| import Treeselect from "@riophae/vue-treeselect"; | |||||
| import { Splitpanes, Pane } from "splitpanes" | |||||
| import "@riophae/vue-treeselect/dist/vue-treeselect.css" | |||||
| import "splitpanes/dist/splitpanes.css" | |||||
| import { deptTreeSelect } from "@/api/system/user" | |||||
| import { listLandQuery, getLandDetailByDkbm } from "@/api/resource/land" | |||||
| import {getConfigKey} from "@/api/system/config"; | import {getConfigKey} from "@/api/system/config"; | ||||
| import {getDept,getInfoByImportCode} from "@/api/system/dept"; | |||||
| import {getDept} from "@/api/system/dept"; | |||||
| import {Toast} from "vant"; | |||||
| import $ from "jquery"; | import $ from "jquery"; | ||||
| import Cookies from "js-cookie"; | |||||
| export default { | export default { | ||||
| name: "contractedVillageContractor", | |||||
| components: { Treeselect, Splitpanes, Pane }, | |||||
| name: "appMap", | |||||
| components: { }, | |||||
| data() { | data() { | ||||
| return { | return { | ||||
| fform: {}, // 地块信息表单参数 | |||||
| baseRoutingUrll:'/api', | |||||
| form: {}, // 地块信息表单参数 | |||||
| map: "", // 地图 | map: "", // 地图 | ||||
| mapGeoServerUrl: "", // geoserver地址 | mapGeoServerUrl: "", // geoserver地址 | ||||
| mapCenterLocation: [], // 地图中心坐标 | mapCenterLocation: [], // 地图中心坐标 | ||||
| @@ -227,13 +132,29 @@ | |||||
| value:'', | value:'', | ||||
| deptId:100, | deptId:100, | ||||
| importCode:'', | importCode:'', | ||||
| keyword:'', | |||||
| locationMap: this.guidProduct(), | |||||
| selectedHomesteadLayer: "", | |||||
| }; | }; | ||||
| }, | }, | ||||
| computed: { | |||||
| isAndroid() { | |||||
| return !!window._Native_object; | |||||
| }, | |||||
| hasSelectLocationMode() { | |||||
| return this.isAndroid && typeof(window._Native_object.SelectLocationMode) === 'function'; | |||||
| }, | |||||
| hasGetLocationTimeout() { | |||||
| return this.isAndroid && typeof(window._Native_object.GetLocationTimeout) === 'function'; | |||||
| }, | |||||
| hasGetLocationMode() { | |||||
| return this.isAndroid && typeof(window._Native_object.GetLocationMode) === 'function'; | |||||
| }, | |||||
| }, | |||||
| created() { | created() { | ||||
| console.log(this.$store.getters.user.user.dept.deptId) | |||||
| this.deptId = this.$store.getters.user.user.dept.deptId; | |||||
| this.importCode = this.$store.getters.user.user.dept.importCode; | |||||
| this.deptId = Cookies.get('userDept'); | |||||
| this.importCode = Cookies.get('importCode'); | |||||
| // 获取geoserver的地址 | // 获取geoserver的地址 | ||||
| this.getGeoServerUrl(); | this.getGeoServerUrl(); | ||||
| // 获取地块图层名称 | // 获取地块图层名称 | ||||
| @@ -243,9 +164,11 @@ | |||||
| }, | }, | ||||
| mounted() { | mounted() { | ||||
| // 初始化地图 | // 初始化地图 | ||||
| setTimeout(() => { | |||||
| this.initMap(); | |||||
| }, 500); | |||||
| listLandQuery().then(response => { | |||||
| setTimeout(() => { | |||||
| this.initMap(response.rows); | |||||
| }, 500); | |||||
| }); | |||||
| }, | }, | ||||
| methods: { | methods: { | ||||
| onClickLeft(){ | onClickLeft(){ | ||||
| @@ -269,8 +192,15 @@ | |||||
| this.villageBorderLayerName = response.msg; | this.villageBorderLayerName = response.msg; | ||||
| }); | }); | ||||
| }, | }, | ||||
| guidProduct(){ | |||||
| return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { | |||||
| var r = Math.random() * 16 | 0, | |||||
| v = c == 'x' ? r : (r & 0x3 | 0x8); | |||||
| return v.toString(16); | |||||
| }); | |||||
| }, | |||||
| // 初始化地图 | // 初始化地图 | ||||
| initMap() { | |||||
| initMap(resourceList) { | |||||
| getDept(this.deptId).then(response => { | getDept(this.deptId).then(response => { | ||||
| let dept = response.data; | let dept = response.data; | ||||
| if (dept.longitude && dept.latitude) { | if (dept.longitude && dept.latitude) { | ||||
| @@ -310,7 +240,7 @@ | |||||
| target: "landMapBox", | target: "landMapBox", | ||||
| view: new ol.View({ | view: new ol.View({ | ||||
| center: ol.proj.fromLonLat(this.mapCenterLocation), // 地图中心坐标 | center: ol.proj.fromLonLat(this.mapCenterLocation), // 地图中心坐标 | ||||
| zoom: 15.5, | |||||
| zoom: 14, | |||||
| minZoom: 1, //地图缩小限制 | minZoom: 1, //地图缩小限制 | ||||
| maxZoom: 18, //地图放大限制 | maxZoom: 18, //地图放大限制 | ||||
| // extent: [13481224.75161,5667110.83528,13811063.06278,5880284.11416] | // extent: [13481224.75161,5667110.83528,13811063.06278,5880284.11416] | ||||
| @@ -355,42 +285,89 @@ | |||||
| }); | }); | ||||
| }); | }); | ||||
| var mark_layer = null; | |||||
| function addMark(lng, lat) { | |||||
| if(!mark_layer) | |||||
| { | |||||
| mark_layer = new ol.layer.Vector({ | |||||
| source: new ol.source.Vector(), | |||||
| }); | |||||
| that.map.addLayer(mark_layer); | |||||
| } | |||||
| else | |||||
| mark_layer.getSource().clear(); | |||||
| let newFeature = new ol.Feature({ | |||||
| geometry: new ol.geom.Point(ol.proj.fromLonLat([lng, lat])), //几何信息 | |||||
| //name: "标注点", | |||||
| }); | |||||
| newFeature.setStyle(new ol.style.Style({ | |||||
| image: new ol.style.Icon({ | |||||
| //设置图标偏移 | |||||
| anchor: [0.5, 0.5], | |||||
| //标注样式的起点位置 | |||||
| anchorOrigin: "top-right", | |||||
| //X方向单位:分数 | |||||
| anchorXUnits: "fraction", | |||||
| //Y方向单位:像素 | |||||
| anchorYUnits: "fraction", | |||||
| //偏移起点位置的方向 | |||||
| offsetOrigin: "top-right", | |||||
| //透明度 | |||||
| opacity: 0.9, | |||||
| //图片路径 | |||||
| src: require('../../assets/images/app/mark.png'), | |||||
| }), | |||||
| zIndex: 9999, | |||||
| })); | |||||
| mark_layer.getSource().addFeature(newFeature); | |||||
| } | |||||
| var that = this; | |||||
| var Zb; | |||||
| $("#" + this.locationMap).click(function () { | |||||
| that.getCurrentLocation(res => { | |||||
| if (res.code == 200) { | |||||
| let lat = res.data.lat; | |||||
| let lng = res.data.lng; | |||||
| if(lat && lng){ | |||||
| Zb = [lng,lat]; | |||||
| }else { | |||||
| Zb =[115.452752, 31.789033]; | |||||
| } | |||||
| addMark(lng,lat); | |||||
| that.map.getView().animate({ | |||||
| // 只设置需要的属性即可 | |||||
| center: ol.proj.fromLonLat(Zb), // 中心点 | |||||
| zoom: 18, // 缩放级别 | |||||
| rotation: undefined, // 缩放完成view视图旋转弧度 | |||||
| duration: 1000, // 缩放持续时间,默认不需要设置 | |||||
| }); | |||||
| } | |||||
| }); | |||||
| }); | |||||
| // 地图点击事件 | // 地图点击事件 | ||||
| this.map.on("click", (evt) => { | this.map.on("click", (evt) => { | ||||
| // 点击宅基地查看详情 | // 点击宅基地查看详情 | ||||
| console.log(this.landLayer) | |||||
| if (this.landLayer) { | if (this.landLayer) { | ||||
| const viewResolution = this.map.getView().getResolution(); | const viewResolution = this.map.getView().getResolution(); | ||||
| const url = this.landLayer.getSource() | const url = this.landLayer.getSource() | ||||
| .getFeatureInfoUrl(evt.coordinate, viewResolution, 'EPSG:3857', {'INFO_FORMAT': 'application/json'}); | .getFeatureInfoUrl(evt.coordinate, viewResolution, 'EPSG:3857', {'INFO_FORMAT': 'application/json'}); | ||||
| console.log(url) | |||||
| if (url) { | if (url) { | ||||
| fetch(url) | fetch(url) | ||||
| .then(response => response.json()) | .then(response => response.json()) | ||||
| .then(data => { | .then(data => { | ||||
| if (data.features.length > 0) { | if (data.features.length > 0) { | ||||
| let id = data.features[0].id.split(".")[1]; | |||||
| getDk(id).then(response => { | |||||
| const data = response.data; | |||||
| this.reset(); | |||||
| this.form = data; | |||||
| this.syqxzText = this.selectDictLabel(this.syqxzOptions, data.syqxz); | |||||
| if (data.dklb === '10') { | |||||
| this.dklbText = '承包地块'; | |||||
| } else { | |||||
| this.dklbText = this.selectDictLabel(this.dklbOptions, data.dklb); | |||||
| } | |||||
| this.dldjText = this.selectDictLabel(this.dldjOptions, data.dldj); | |||||
| this.tdytText = this.selectDictLabel(this.tdytOptions, data.tdyt); | |||||
| this.tdlylxText = this.selectDictLabel(this.tdlylxOptions, data.tdlylx); | |||||
| this.title = "查看地块信息"; | |||||
| this.showSaveBtn = false; | |||||
| this.showDeleteBtn = true; | |||||
| // this.isDisabled = true; | |||||
| let id = data.features[0].properties.DKBM; | |||||
| getLandDetailByDkbm(id).then(response => { | |||||
| this.form = response.data; | |||||
| setTimeout(() => { | setTimeout(() => { | ||||
| this.open = true; | this.open = true; | ||||
| }, 10); | |||||
| }, 500); | |||||
| }); | }); | ||||
| /* if (this.selectedHomesteadLayer) { | |||||
| if (this.selectedHomesteadLayer) { | |||||
| this.map.removeLayer(this.selectedHomesteadLayer); | this.map.removeLayer(this.selectedHomesteadLayer); | ||||
| this.selectedHomesteadLayer = ""; | this.selectedHomesteadLayer = ""; | ||||
| } | } | ||||
| @@ -402,17 +379,30 @@ | |||||
| style: new ol.style.Style({ | style: new ol.style.Style({ | ||||
| fill: new ol.style.Fill({ | fill: new ol.style.Fill({ | ||||
| //矢量图层填充颜色,以及透明度 | //矢量图层填充颜色,以及透明度 | ||||
| color: "rgba(255, 84, 87, 0.3)", | |||||
| color: "rgba(255,0,17,0.3)", | |||||
| }), | }), | ||||
| stroke: new ol.style.Stroke({ | stroke: new ol.style.Stroke({ | ||||
| //边界样式 | //边界样式 | ||||
| color: "#ff5457", | |||||
| color: "#ff0000", | |||||
| width: 3, | width: 3, | ||||
| }), | }), | ||||
| }) | }) | ||||
| }); | }); | ||||
| // this.map.addLayer(this.selectedHomesteadLayer); | |||||
| this.map.getLayers().insertAt(4, this.selectedHomesteadLayer);*/ | |||||
| this.map.addLayer(this.selectedHomesteadLayer); | |||||
| this.map.getLayers().insertAt(4, this.selectedHomesteadLayer); | |||||
| // getLandDetail(id).then(response => { | |||||
| // // this.form = response.data; | |||||
| // getLandDetailByDkbm(response.data.dkbm).then(res => { | |||||
| // res.data.txmj = response.data.txmj; | |||||
| // this.form = res.data; | |||||
| // }); | |||||
| // // getOperationDetailByDkbm(response.data.dkbm).then(response => { | |||||
| // // this.form = response.data | |||||
| // // }) | |||||
| // setTimeout(() => { | |||||
| // this.open = true; | |||||
| // }, 500); | |||||
| // }); | |||||
| } | } | ||||
| }); | }); | ||||
| } | } | ||||
| @@ -427,6 +417,89 @@ | |||||
| } | } | ||||
| this.addLandLayer(); | this.addLandLayer(); | ||||
| }, | }, | ||||
| getLocationMode() { | |||||
| let mode = ''; | |||||
| if(this.hasGetLocationMode) | |||||
| { | |||||
| mode = window._Native_object.GetLocationMode(); | |||||
| } | |||||
| console.log('当前选择定位模式: ' + mode); | |||||
| return mode; | |||||
| }, | |||||
| getLocationTimeout() { | |||||
| let timeout = 10000; | |||||
| if(this.hasGetLocationMode) | |||||
| { | |||||
| let to = window._Native_object.GetLocationTimeout(); | |||||
| if(to <= 0) | |||||
| to = 30000; | |||||
| timeout = to; | |||||
| } | |||||
| console.log('当前选择定位超时: ' + timeout); | |||||
| return timeout; | |||||
| }, | |||||
| getCurrentLocation(callback) { | |||||
| // 1. 首先尝试Android宿主端 | |||||
| if(this.isAndroid) // Android层注入全局对象 | |||||
| { | |||||
| let mode = this.getLocationMode(); | |||||
| if(mode !== 'h5') | |||||
| { | |||||
| console.log('使用Native获取定位'); | |||||
| let coord = window._Native_object.GetLocation(null); | |||||
| console.log('Native坐标: ' + coord); | |||||
| if(coord) | |||||
| { | |||||
| let arr = coord.split(','); | |||||
| let res = { | |||||
| code: 200, | |||||
| data: { | |||||
| lng: arr[0], | |||||
| lat: arr[1], | |||||
| }, | |||||
| }; | |||||
| callback(res); | |||||
| return; | |||||
| } | |||||
| } | |||||
| } | |||||
| // 2. 再尝试浏览器 | |||||
| if (navigator.geolocation) { | |||||
| console.log('使用浏览器获取定位'); | |||||
| const loading = Toast.loading({ | |||||
| message: '定位中...', | |||||
| duration: 0, | |||||
| }); | |||||
| let timeout = this.getLocationTimeout(); | |||||
| navigator.geolocation.getCurrentPosition( | |||||
| (position) => { | |||||
| const { latitude, longitude } = position.coords; | |||||
| console.log('浏览器定位结果: 经纬度=' + longitude + ', ' + latitude); | |||||
| let res = { | |||||
| code: 200, | |||||
| data: { | |||||
| lng: longitude, | |||||
| lat: latitude, | |||||
| }, | |||||
| }; | |||||
| loading.clear(); | |||||
| callback(res); | |||||
| }, | |||||
| (error) => { | |||||
| loading.clear(); | |||||
| console.log('定位失败: ' + error.message); | |||||
| getQueryLand().then(callback); | |||||
| }, | |||||
| { enableHighAccuracy: true, timeout: timeout } | |||||
| ); | |||||
| return; | |||||
| } | |||||
| // 最后使用地区坐标 | |||||
| console.log('使用地区坐标定位'); | |||||
| getQueryLand().then(callback); | |||||
| }, | |||||
| // 添加地块图层 | // 添加地块图层 | ||||
| addLandLayer() { | addLandLayer() { | ||||
| this.landLayer = new ol.layer.Image({ | this.landLayer = new ol.layer.Image({ | ||||
| @@ -459,117 +532,6 @@ | |||||
| }); | }); | ||||
| this.map.getLayers().insertAt(2, this.mapBorder); | this.map.getLayers().insertAt(2, this.mapBorder); | ||||
| }, | }, | ||||
| saveLand() { | |||||
| this.$refs.landForm.validate().then(() => { | |||||
| if (this.form.id) { | |||||
| this.showSaveBtn = false; | |||||
| updateDk(this.form).then(response => { | |||||
| if (response.code == 200) { | |||||
| this.$toast({ | |||||
| icon: 'success', | |||||
| message: '保存成功', | |||||
| duration:"1000", | |||||
| onClose: () => { | |||||
| this.open = false; | |||||
| this.showSaveBtn = true; | |||||
| } | |||||
| }); | |||||
| } | |||||
| }); | |||||
| } else { | |||||
| this.form.deptId = this.deptId; | |||||
| this.showSaveBtn = false; | |||||
| addDk(this.form).then(response => { | |||||
| if (response.code == 200) { | |||||
| this.$toast({ | |||||
| icon: 'success', | |||||
| message: '保存成功', | |||||
| duration:"1000", | |||||
| onClose: () => { | |||||
| this.open = false; | |||||
| this.showSaveBtn = true; | |||||
| // 移除矢量图层 | |||||
| this.map.removeLayer(this.vectorLayer); | |||||
| this.vectorLayer = ""; | |||||
| // 移除地块图层重新加载 | |||||
| this.map.removeLayer(this.landLayer); | |||||
| this.landLayer = ""; | |||||
| this.addLandLayer(); | |||||
| } | |||||
| }); | |||||
| } | |||||
| }); | |||||
| } | |||||
| }).catch(() => { | |||||
| this.$notify({ type: 'danger', message: '请填写完整的表单项' }); | |||||
| }); | |||||
| }, | |||||
| deleteLand(id) { | |||||
| this.$dialog.confirm({ | |||||
| message: '是否确认删除此地块?', | |||||
| }).then(() => { | |||||
| // on confirm | |||||
| this.showDeleteBtn = false; | |||||
| deleteDk(id).then(res => { | |||||
| if (res.code == 200) { | |||||
| this.$toast({ | |||||
| icon: 'success', | |||||
| message: '删除成功', | |||||
| duration: "1000", | |||||
| onClose: () => { | |||||
| this.open = false; | |||||
| this.showDeleteBtn = true; | |||||
| // 移除地块图层重新加载 | |||||
| this.map.removeLayer(this.landLayer); | |||||
| this.landLayer = ""; | |||||
| this.addLandLayer(); | |||||
| } | |||||
| }); | |||||
| } | |||||
| }); | |||||
| }).catch(() => { | |||||
| // on cancel | |||||
| }); | |||||
| }, | |||||
| onConfirmOwnershipOptions(value){ | |||||
| this.form.syqxz = value.dictValue; | |||||
| this.syqxzText = value.dictLabel; | |||||
| this.showOwnership = false; | |||||
| }, | |||||
| onConfirmLandCategoryOptions(value){ | |||||
| this.form.dklb = value.dictValue; | |||||
| this.dklbText = value.dictLabel; | |||||
| this.showLandCategory = false; | |||||
| }, | |||||
| onConfirmLandTypeOptions(value) { | |||||
| this.form.tdlylx = value.dictValue; | |||||
| this.tdlylxText = value.dictLabel; | |||||
| this.showLandType = false; | |||||
| }, | |||||
| onConfirmLandGradeOptions(value) { | |||||
| this.form.dldj = value.dictValue | |||||
| this.dldjText = value.dictLabel; | |||||
| this.showLandGrade = false; | |||||
| }, | |||||
| onConfirmLandPurposeOptions(value){ | |||||
| this.form.tdyt = value.dictValue; | |||||
| this.tdytText = value.dictLabel; | |||||
| this.showLandPurpose = false; | |||||
| }, | |||||
| generateCode() { | |||||
| generateLandCode({deptId: this.deptId}).then(response => { | |||||
| this.$set(this.form, 'dkbm', response.data); | |||||
| }); | |||||
| }, | |||||
| closePopup() { | |||||
| // 移除矢量图层 | |||||
| if (this.vectorLayer) { | |||||
| this.map.removeLayer(this.vectorLayer); | |||||
| this.vectorLayer = ""; | |||||
| } | |||||
| this.open = false; | |||||
| this.reset(); | |||||
| }, | |||||
| reset() { | reset() { | ||||
| this.form = { | this.form = { | ||||
| deptId: null, | deptId: null, | ||||
| @@ -596,17 +558,66 @@ | |||||
| this.dldjText = '一等地'; | this.dldjText = '一等地'; | ||||
| this.tdytText = '种植业'; | this.tdytText = '种植业'; | ||||
| }, | }, | ||||
| openLandCategoryPopup() { | |||||
| // 修改时 && 地块类别为承包地块 不允许打开地块类别弹出层 | |||||
| if (this.form.id && this.form.dklb === '10') { | |||||
| this.$toast({ | |||||
| icon: 'fail', | |||||
| message: '当前地块为承包地块,不能更改地块类别', | |||||
| duration: '2000' | |||||
| }) | |||||
| return ; | |||||
| // 根据搜索条件查询宅基地 | |||||
| searchMap() { | |||||
| if (this.keyword) { | |||||
| if (this.selectedHomesteadLayer) { | |||||
| this.map.removeLayer(this.selectedHomesteadLayer); | |||||
| this.selectedHomesteadLayer = ""; | |||||
| } | |||||
| let map_cql_filter = "DKBM = '" + this.keyword + "'"; | |||||
| // 定位查询位置 | |||||
| let param_dw = { | |||||
| // srsName: "EPSG:3857", | |||||
| service: "WFS", | |||||
| version: "1.0.0", | |||||
| request: "GetFeature", | |||||
| typename: this.landLayerName, | |||||
| // maxFeatures:1000, | |||||
| cql_filter: map_cql_filter, | |||||
| outputFormat: "application/json", | |||||
| }; | |||||
| let url_dw = this.mapGeoServerUrl + "/ows"; //wfsurl; | |||||
| url_dw = url_dw + "?"; | |||||
| for (let key in param_dw) { | |||||
| url_dw = url_dw + key + "=" + param_dw[key] + "&"; | |||||
| } | |||||
| url_dw = url_dw.substr(0, url_dw.length - 1); | |||||
| fetch(url_dw, { | |||||
| method: "GET", // *GET, POST, PUT, DELETE, etc. | |||||
| }).then((res) => { | |||||
| return res.json(); | |||||
| }).then((data) => { | |||||
| if (data.features.length > 0) { | |||||
| this.selectedHomesteadLayer = new ol.layer.Vector({ | |||||
| source: new ol.source.Vector({ | |||||
| features: new ol.format.GeoJSON().readFeatures(data) | |||||
| }), | |||||
| name: 'selectedHomesteadLayer', | |||||
| style: new ol.style.Style({ | |||||
| fill: new ol.style.Fill({ | |||||
| //矢量图层填充颜色,以及透明度 | |||||
| color: "rgba(255,0,17,0.3)", | |||||
| }), | |||||
| stroke: new ol.style.Stroke({ | |||||
| //边界样式 | |||||
| color: "#ff0000", | |||||
| width: 3, | |||||
| }), | |||||
| }) | |||||
| }); | |||||
| this.map.addLayer(this.selectedHomesteadLayer); | |||||
| this.map.getLayers().insertAt(4, this.selectedHomesteadLayer); | |||||
| let resolution = this.map.getView().getResolutionForExtent(data.bbox, this.map.getSize()); | |||||
| this.map.getView().fit(data.bbox); | |||||
| this.map.getView().setResolution(resolution); | |||||
| // this.map.getView().setZoom(16); | |||||
| } else { | |||||
| this.msgError("没有搜索到该用户的宅基地") | |||||
| } | |||||
| }); | |||||
| } | } | ||||
| this.showLandCategory = true; | |||||
| } | } | ||||
| }, | }, | ||||
| @@ -41,7 +41,7 @@ | |||||
| <van-field readonly v-model="form.jyjssj" label="经营结束时间" placeholder="请输入" input-align="right" label-width="auto" /> | <van-field readonly v-model="form.jyjssj" label="经营结束时间" placeholder="请输入" input-align="right" label-width="auto" /> | ||||
| <van-field readonly v-model="form.cbje" label="承包金额(元)" placeholder="请输入" input-align="right" label-width="auto" /> | <van-field readonly v-model="form.cbje" label="承包金额(元)" placeholder="请输入" input-align="right" label-width="auto" /> | ||||
| <van-field readonly v-model="form.surveyStatus" label="调查状态" placeholder="请输入" input-align="right" label-width="auto" /> | <van-field readonly v-model="form.surveyStatus" label="调查状态" placeholder="请输入" input-align="right" label-width="auto" /> | ||||
| <van-field readonly v-model="form.bz" label="备注信息" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly v-model="form.bzxx" label="备注信息" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-field readonly label="实物图" placeholder="" input-align="right" label-width="auto" /> | <van-field readonly label="实物图" placeholder="" input-align="right" label-width="auto" /> | ||||
| <div v-if="!!form.dkImg"> | <div v-if="!!form.dkImg"> | ||||
| <el-tooltip effect="light" :content="item" placement="bottom" v-for="(item, index) in form.dkImg.split(',')" :key="index"> | <el-tooltip effect="light" :content="item" placement="bottom" v-for="(item, index) in form.dkImg.split(',')" :key="index"> | ||||
| @@ -5,7 +5,7 @@ | |||||
| <div class="search_box"> | <div class="search_box"> | ||||
| <div class="left"> | <div class="left"> | ||||
| <p @click="showPicker = true">{{surveyStatus}}<van-icon name="play" /></p> | <p @click="showPicker = true">{{surveyStatus}}<van-icon name="play" /></p> | ||||
| <van-field v-model="value" @input="searchChange" @clear="searchClear" clearable left-icon="search" placeholder="请输入地块名称" /> | |||||
| <van-field v-model="value" @input="searchChange" @clear="searchClear" clearable left-icon="search" placeholder="地块编码" /> | |||||
| </div> | </div> | ||||
| <van-button type="primary" round @click="goSearch" >搜索</van-button> | <van-button type="primary" round @click="goSearch" >搜索</van-button> | ||||
| </div> | </div> | ||||
| @@ -17,12 +17,13 @@ | |||||
| <div class="list_main"> | <div class="list_main"> | ||||
| <van-list v-model="loading" :finished="finished" finished-text="没有更多了" @load="getList"> | <van-list v-model="loading" :finished="finished" finished-text="没有更多了" @load="getList"> | ||||
| <van-swipe-cell right-width="200" class="item" v-for="(item,index) in landList" :key="index"> | <van-swipe-cell right-width="200" class="item" v-for="(item,index) in landList" :key="index"> | ||||
| <div class="item_box" @click="$router.push({name:'appDetail',query:{dkbm:item.dkbm}})"> | |||||
| <div class="item_box"> | |||||
| <!-- --> | |||||
| <div class="head_block"> | <div class="head_block"> | ||||
| <div class="title">{{item.dkbm}}</div> | |||||
| <div class="describe"><dict-tag :options="dict.type.survey_status" :value="item.surveyStatus"/></div> | |||||
| <div class="title"><p @click="$router.push({name:'appDetail',query:{dkbm:item.dkbm}})">{{item.dkbm}}</p> <img v-clipboard:copy="item.dkbm" v-clipboard:success="onCopy" v-clipboard:error="onError" src="../../../assets/images/app/copy.png" alt=""></div> | |||||
| <div class="describe" @click="$router.push({name:'appDetail',query:{dkbm:item.dkbm}})"><dict-tag :options="dict.type.survey_status" :value="item.surveyStatus"/></div> | |||||
| </div> | </div> | ||||
| <div class="order_block"> | |||||
| <div class="order_block" @click="$router.push({name:'appDetail',query:{dkbm:item.dkbm}})"> | |||||
| <div class="order">{{item.dkmc}}</div> | <div class="order">{{item.dkmc}}</div> | ||||
| <div class="describe">{{item.scmjm}}</div> | <div class="describe">{{item.scmjm}}</div> | ||||
| </div> | </div> | ||||
| @@ -42,6 +43,7 @@ | |||||
| <script> | <script> | ||||
| import { Dialog } from 'vant'; | import { Dialog } from 'vant'; | ||||
| import { listLand, delLand } from "@/api/resource/land" | import { listLand, delLand } from "@/api/resource/land" | ||||
| import Cookies from "js-cookie"; | |||||
| export default { | export default { | ||||
| dicts: ['ownership_type', 'land_use_type', 'survey_status', 'is_common', 'land_grade_type', 'land_type', 'land_use'], | dicts: ['ownership_type', 'land_use_type', 'survey_status', 'is_common', 'land_grade_type', 'land_type', 'land_use'], | ||||
| name: "appList", | name: "appList", | ||||
| @@ -76,7 +78,7 @@ | |||||
| }; | }; | ||||
| }, | }, | ||||
| created() { | created() { | ||||
| this.queryParams.importCode = this.$store.getters.user.user.dept.importCode; | |||||
| this.queryParams.importCode = Cookies.get('importCode'); | |||||
| }, | }, | ||||
| methods: { | methods: { | ||||
| onClickLeft(){ | onClickLeft(){ | ||||
| @@ -103,7 +105,7 @@ | |||||
| this.showPicker = false; | this.showPicker = false; | ||||
| }, | }, | ||||
| searchChange(value) { | searchChange(value) { | ||||
| this.queryParams.dkmc = value; | |||||
| this.queryParams.dkbm = value; | |||||
| }, | }, | ||||
| goSearch(){ | goSearch(){ | ||||
| this.queryParams.pageNum = 1; | this.queryParams.pageNum = 1; | ||||
| @@ -116,6 +118,13 @@ | |||||
| this.surveyStatus = '调查状态'; | this.surveyStatus = '调查状态'; | ||||
| this.queryParams.surveyStatus = ''; | this.queryParams.surveyStatus = ''; | ||||
| }, | }, | ||||
| onCopy (e) { | |||||
| this.$message.success("内容已复制到剪切板!") | |||||
| }, | |||||
| // 复制失败时的回调函数 | |||||
| onError (e) { | |||||
| this.$message.error("抱歉,复制失败!") | |||||
| }, | |||||
| /** 删除按钮操作 */ | /** 删除按钮操作 */ | ||||
| handleDelete(row) { | handleDelete(row) { | ||||
| const fids = row.fid || this.ids | const fids = row.fid || this.ids | ||||
| @@ -176,6 +185,11 @@ | |||||
| text-overflow: ellipsis; | text-overflow: ellipsis; | ||||
| white-space: nowrap; | white-space: nowrap; | ||||
| padding-right: 20px; | padding-right: 20px; | ||||
| display: flex; | |||||
| align-items: center; | |||||
| img{ | |||||
| margin-left: 5px; | |||||
| } | |||||
| } | } | ||||
| .describe{ | .describe{ | ||||
| font-size: 14px; | font-size: 14px; | ||||
| @@ -1,12 +1,6 @@ | |||||
| <template> | <template> | ||||
| <div class="home_wrapper"> | <div class="home_wrapper"> | ||||
| <van-nav-bar | |||||
| title="经营信息维护" | |||||
| left-arrow | |||||
| placeholder | |||||
| safe-area-inset-top | |||||
| @click-left="onClickLeft" | |||||
| /> | |||||
| <van-nav-bar title="经营信息维护" left-arrow placeholder safe-area-inset-top @click-left="onClickLeft"/> | |||||
| <van-form @submit="onSubmit"> | <van-form @submit="onSubmit"> | ||||
| <div class="main"> | <div class="main"> | ||||
| @@ -20,77 +14,39 @@ | |||||
| <van-field readonly v-model="form.dkbz" label="地块北至" placeholder="请输入" input-align="right" label-width="auto" /> | <van-field readonly v-model="form.dkbz" label="地块北至" placeholder="请输入" input-align="right" label-width="auto" /> | ||||
| <van-field required :rules="[{ required: true }]" v-model="form.jymj" label="经营面积" placeholder="请输入" input-align="right" label-width="auto" /> | <van-field required :rules="[{ required: true }]" v-model="form.jymj" label="经营面积" placeholder="请输入" input-align="right" label-width="auto" /> | ||||
| <van-field required :rules="[{ required: true }]" readonly @click="showJyfsPicker = true" v-model="form.jyfsText" label="经营方式" placeholder="请输入" input-align="right" label-width="auto" /> | <van-field required :rules="[{ required: true }]" readonly @click="showJyfsPicker = true" v-model="form.jyfsText" label="经营方式" placeholder="请输入" input-align="right" label-width="auto" /> | ||||
| <van-popup v-model="showJyfsPicker" round position="bottom"> | <van-popup v-model="showJyfsPicker" round position="bottom"> | ||||
| <van-picker | |||||
| show-toolbar | |||||
| :columns="dict.type.jyfs" | |||||
| value-key="label" | |||||
| @cancel="showJyfsPicker = false" | |||||
| @confirm="onConfirmJyfs" | |||||
| /> | |||||
| <van-picker show-toolbar :columns="dict.type.jyfs" value-key="label" @cancel="showJyfsPicker = false" @confirm="onConfirmJyfs"/> | |||||
| </van-popup> | </van-popup> | ||||
| <van-field readonly @click="showJydxlxPicker = true" v-model="form.jydxlxText" label="经营对象类型" placeholder="请输入" input-align="right" label-width="auto" /> | <van-field readonly @click="showJydxlxPicker = true" v-model="form.jydxlxText" label="经营对象类型" placeholder="请输入" input-align="right" label-width="auto" /> | ||||
| <van-popup v-model="showJydxlxPicker" round position="bottom"> | <van-popup v-model="showJydxlxPicker" round position="bottom"> | ||||
| <van-picker | |||||
| show-toolbar | |||||
| :columns="dict.type.jydxlx" | |||||
| value-key="label" | |||||
| @cancel="showJydxlxPicker = false" | |||||
| @confirm="onConfirmJydxlx" | |||||
| /> | |||||
| <van-picker show-toolbar :columns="dict.type.jydxlx" value-key="label" @cancel="showJydxlxPicker = false" @confirm="onConfirmJydxlx"/> | |||||
| </van-popup> | </van-popup> | ||||
| <van-field required :rules="[{ required: true }]" v-model="form.jydxmc" label="经营对象名称" placeholder="请输入" input-align="right" label-width="auto" /> | <van-field required :rules="[{ required: true }]" v-model="form.jydxmc" label="经营对象名称" placeholder="请输入" input-align="right" label-width="auto" /> | ||||
| <van-field readonly @click="showJydxzjlxPicker = true" v-model="form.jydxzjlxText" label="经营对象证件类型" placeholder="请输入" input-align="right" label-width="auto" /> | <van-field readonly @click="showJydxzjlxPicker = true" v-model="form.jydxzjlxText" label="经营对象证件类型" placeholder="请输入" input-align="right" label-width="auto" /> | ||||
| <van-popup v-model="showJydxzjlxPicker" round position="bottom"> | <van-popup v-model="showJydxzjlxPicker" round position="bottom"> | ||||
| <van-picker | |||||
| show-toolbar | |||||
| :columns="dict.type.zjlx" | |||||
| value-key="label" | |||||
| @cancel="showJydxzjlxPicker = false" | |||||
| @confirm="onConfirmJydxzjlx" | |||||
| /> | |||||
| <van-picker show-toolbar :columns="dict.type.zjlx" value-key="label" @cancel="showJydxzjlxPicker = false" @confirm="onConfirmJydxzjlx"/> | |||||
| </van-popup> | </van-popup> | ||||
| <van-field v-model="form.jydxzjhm" label="经营对象证件号码" placeholder="请输入" input-align="right" label-width="auto" /> | <van-field v-model="form.jydxzjhm" label="经营对象证件号码" placeholder="请输入" input-align="right" label-width="auto" /> | ||||
| <van-field readonly @click="showSfqdhtPicker = true" v-model="form.sfqdhtText" label="是否签订合同" placeholder="请输入" input-align="right" label-width="auto" /> | <van-field readonly @click="showSfqdhtPicker = true" v-model="form.sfqdhtText" label="是否签订合同" placeholder="请输入" input-align="right" label-width="auto" /> | ||||
| <van-popup v-model="showSfqdhtPicker" round position="bottom"> | <van-popup v-model="showSfqdhtPicker" round position="bottom"> | ||||
| <van-picker | |||||
| show-toolbar | |||||
| :columns="dict.type.is_common" | |||||
| value-key="label" | |||||
| @cancel="showSfqdhtPicker = false" | |||||
| @confirm="onConfirmSfqdht" | |||||
| /> | |||||
| <van-picker show-toolbar :columns="dict.type.is_common" value-key="label" @cancel="showSfqdhtPicker = false" @confirm="onConfirmSfqdht"/> | |||||
| </van-popup> | </van-popup> | ||||
| <van-field required :rules="[{ required: true }]" readonly @click="showJykssjPicker = true" v-model="form.jykssj" label="经营开始时间" placeholder="请输入" input-align="right" label-width="auto" /> | <van-field required :rules="[{ required: true }]" readonly @click="showJykssjPicker = true" v-model="form.jykssj" label="经营开始时间" placeholder="请输入" input-align="right" label-width="auto" /> | ||||
| <van-popup v-model="showJykssjPicker" round position="bottom"> | <van-popup v-model="showJykssjPicker" round position="bottom"> | ||||
| <van-datetime-picker | |||||
| v-model="jykssj" | |||||
| type="date" | |||||
| title="选择年月日" | |||||
| :min-date="minDate" | |||||
| :max-date="maxDate" | |||||
| @cancel="showJykssjPicker = false" | |||||
| @confirm="onConfirmJykssj" | |||||
| /> | |||||
| <van-datetime-picker v-model="jykssj" type="date" title="选择年月日" :min-date="minDate" :max-date="maxDate" @cancel="showJykssjPicker = false" @confirm="onConfirmJykssj"/> | |||||
| </van-popup> | </van-popup> | ||||
| <van-field required :rules="[{ required: true }]" readonly @click="showJyjssjPicker = true" v-model="form.jyjssj" label="经营结束时间" placeholder="请输入" input-align="right" label-width="auto" /> | <van-field required :rules="[{ required: true }]" readonly @click="showJyjssjPicker = true" v-model="form.jyjssj" label="经营结束时间" placeholder="请输入" input-align="right" label-width="auto" /> | ||||
| <van-popup v-model="showJyjssjPicker" round position="bottom"> | <van-popup v-model="showJyjssjPicker" round position="bottom"> | ||||
| <van-datetime-picker | |||||
| v-model="jyjssj" | |||||
| type="date" | |||||
| title="选择年月日" | |||||
| :min-date="minDate" | |||||
| :max-date="maxDate" | |||||
| @cancel="showJyjssjPicker = false" | |||||
| @confirm="onConfirmJyjssj" | |||||
| /> | |||||
| <van-datetime-picker v-model="jyjssj" type="date" title="选择年月日" :min-date="minDate" :max-date="maxDate" @cancel="showJyjssjPicker = false" @confirm="onConfirmJyjssj"/> | |||||
| </van-popup> | </van-popup> | ||||
| <van-field required :rules="[{ required: true }]" v-model="form.cbje" label="承包金额(元)" placeholder="请输入" input-align="right" label-width="auto" /> | <van-field required :rules="[{ required: true }]" v-model="form.cbje" label="承包金额(元)" placeholder="请输入" input-align="right" label-width="auto" /> | ||||
| @@ -99,20 +55,15 @@ | |||||
| <van-field v-model="form.nsy" label="年收益(元)" placeholder="请输入" input-align="right" label-width="auto" /> | <van-field v-model="form.nsy" label="年收益(元)" placeholder="请输入" input-align="right" label-width="auto" /> | ||||
| <van-field v-model="form.bzxx" label="备注信息" placeholder="请输入" input-align="right" label-width="auto" /> | <van-field v-model="form.bzxx" label="备注信息" placeholder="请输入" input-align="right" label-width="auto" /> | ||||
| <van-field readonly label="实物图" placeholder="" input-align="right" label-width="auto" /> | |||||
| <!--<van-field readonly required :rules="[{ required: true }]" @click="showSurveyStatusPicker = true" v-model="form.surveyStatusText" label="调查状态" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-popup v-model="showSurveyStatusPicker" round position="bottom"> | |||||
| <van-picker show-toolbar :columns="dict.type.survey_status" value-key="label" @cancel="showSurveyStatusPicker = false" @confirm="onConfirmSurveyStatus"/> | |||||
| </van-popup>--> | |||||
| <field-select v-model="form.surveyStatusText" label="调查状态" value-key="dictLabel" data-key="dictValue" placeholder="请选择" requiredx remote-url="/system/dict/data/type/survey_status" :on-remote-response="'data'"/> | |||||
| <van-field readonly label="实物图" placeholder="" input-align="right" label-width="auto" /> | |||||
| <image-upload v-model="form.dkImg"/> | <image-upload v-model="form.dkImg"/> | ||||
| <van-field readonly required :rules="[{ required: true }]" @click="showSurveyStatusPicker = true" v-model="form.surveyStatusText" label="调查状态" placeholder="请输入" input-align="right" label-width="auto" /> | |||||
| <van-popup v-model="showSurveyStatusPicker" round position="bottom"> | |||||
| <van-picker | |||||
| show-toolbar | |||||
| :columns="dict.type.survey_status" | |||||
| value-key="label" | |||||
| @cancel="showSurveyStatusPicker = false" | |||||
| @confirm="onConfirmSurveyStatus" | |||||
| /> | |||||
| </van-popup> | |||||
| </div> | </div> | ||||
| <van-button round block type="primary" native-type="submit" class="subClass">提交</van-button> | <van-button round block type="primary" native-type="submit" class="subClass">提交</van-button> | ||||
| @@ -122,14 +73,15 @@ | |||||
| </template> | </template> | ||||
| <script> | <script> | ||||
| // import { getMenuApp } from "@/api/app/index"; | |||||
| import Cookies from "js-cookie"; | |||||
| import { getLandDetailByDkbm } from "@/api/resource/land" | |||||
| import { getOperation, updateOperation, addOperation } from "@/api/resource/operation" | |||||
| import {getInfoByImportCode} from "@/api/system/dept"; | |||||
| import { getLandDetail } from "@/api/resource/land" | |||||
| import { getOperationDetail, updateOperation, addOperation } from "@/api/resource/operation" | |||||
| import { getInfoByImportCode } from "@/api/system/dept"; | |||||
| import FieldSelect from "@/components/form/FieldSelect.vue"; | |||||
| export default { | export default { | ||||
| dicts: ['zjlx', 'survey_status', 'is_common', 'jydxlx', 'jyfs'], | dicts: ['zjlx', 'survey_status', 'is_common', 'jydxlx', 'jyfs'], | ||||
| name: "appEdit", | name: "appEdit", | ||||
| components: {FieldSelect}, | |||||
| data() { | data() { | ||||
| return { | return { | ||||
| showJyfsPicker: false, | showJyfsPicker: false, | ||||
| @@ -141,7 +93,33 @@ | |||||
| showSurveyStatusPicker: false, | showSurveyStatusPicker: false, | ||||
| minDate: new Date(2020, 0, 1), | minDate: new Date(2020, 0, 1), | ||||
| maxDate: new Date(2025, 10, 1), | maxDate: new Date(2025, 10, 1), | ||||
| form: {}, | |||||
| importCode: null, | |||||
| form: { | |||||
| dkbm: null, | |||||
| dkmc: null, | |||||
| dkdz: null, | |||||
| dkxz: null, | |||||
| dknz: null, | |||||
| dkbz: null, | |||||
| jymj: null, | |||||
| jyfs: null, | |||||
| jydxlx: null, | |||||
| jydxmc: null, | |||||
| jydxzjlx: null, | |||||
| jydxzjhm: null, | |||||
| sfqdht: null, | |||||
| jykssj: null, | |||||
| jyjssj: null, | |||||
| cbje: null, | |||||
| dxje: null, | |||||
| sqje: null, | |||||
| nsy: null, | |||||
| bzxx: null, | |||||
| dkImg: null, | |||||
| surveyStatus: null, | |||||
| importCode: null, | |||||
| deptName: null, | |||||
| }, | |||||
| jykssj:new Date(), | jykssj:new Date(), | ||||
| jyjssj:new Date(), | jyjssj:new Date(), | ||||
| openPic: [], | openPic: [], | ||||
| @@ -156,24 +134,45 @@ | |||||
| history.back(-1); | history.back(-1); | ||||
| }, | }, | ||||
| getDetail(){ | getDetail(){ | ||||
| getLandDetailByDkbm(this.$route.query.dkbm).then(response => { | |||||
| if (!response.data.id){ | |||||
| getOperationDetail(this.$route.query.dkbm).then(response => { | |||||
| if (response.data){ | |||||
| response.data.jyfsText = this.selectDictLabel(this.dict.type.jyfs,response.data.jyfs); | |||||
| response.data.jydxlxText = this.selectDictLabel(this.dict.type.jydxlx,response.data.jydxlx); | |||||
| response.data.jydxzjlxText = this.selectDictLabel(this.dict.type.zjlx,response.data.jydxzjlx); | |||||
| response.data.sfqdhtText = this.selectDictLabel(this.dict.type.is_common,response.data.sfqdht); | |||||
| response.data.surveyStatusText = this.selectDictLabel(this.dict.type.survey_status,response.data.surveyStatus); | |||||
| this.jykssj = new Date(response.data.jykssj); | |||||
| this.jyjssj = new Date(response.data.jyjssj); | |||||
| this.form = response.data | this.form = response.data | ||||
| }else{ | }else{ | ||||
| getOperation(response.data.id).then(response => { | |||||
| response.data.jyfsText = this.selectDictLabel(this.dict.type.jyfs,response.data.jyfs); | |||||
| response.data.jydxlxText = this.selectDictLabel(this.dict.type.jydxlx,response.data.jydxlx); | |||||
| response.data.jydxzjlxText = this.selectDictLabel(this.dict.type.zjlx,response.data.jydxzjlx); | |||||
| response.data.sfqdhtText = this.selectDictLabel(this.dict.type.is_common,response.data.sfqdht); | |||||
| response.data.surveyStatusText = this.selectDictLabel(this.dict.type.survey_status,response.data.surveyStatus); | |||||
| this.jykssj = new Date(response.data.jykssj); | |||||
| this.jyjssj = new Date(response.data.jyjssj); | |||||
| this.form = response.data | |||||
| }) | |||||
| getLandDetail(this.$route.query.dkbm).then(response => { | |||||
| //this.form = response.data | |||||
| this.form.deptName = response.data.deptName; | |||||
| this.form.importCode = response.data.importCode; | |||||
| this.importCode = response.data.importCode; | |||||
| this.form.dkbm = response.data.dkbm; | |||||
| this.form.dkmc = response.data.dkmc; | |||||
| this.form.dkdz = response.data.dkdz; | |||||
| this.form.dkxz = response.data.dkxz; | |||||
| this.form.dknz = response.data.dknz; | |||||
| this.form.dkbz = response.data.dkbz; | |||||
| this.form.jymj = response.data.scmjm; | |||||
| this.form.jyfsText = '家庭承包'; | |||||
| this.form.jyfs = '110'; | |||||
| this.form.jydxlxText = '农户'; | |||||
| this.form.jydxlx = '1'; | |||||
| this.form.jydxzjlxText = '居民身份证'; | |||||
| this.form.jydxzjlx = '1'; | |||||
| this.form.sfqdhtText = '是'; | |||||
| this.form.sfqdht = '1'; | |||||
| this.form.surveyStatusText = '已调查'; | |||||
| this.form.surveyStatus = '2'; | |||||
| getInfoByImportCode(response.data.importCode).then((res) => { | |||||
| this.form.deptId = res.data.deptId | |||||
| }); | |||||
| }); | |||||
| } | } | ||||
| getInfoByImportCode(response.data.importCode).then((res) => { | |||||
| this.form.deptId = res.data.deptId | |||||
| }); | |||||
| }); | }); | ||||
| }, | }, | ||||
| onConfirmJydxlx(value) { | onConfirmJydxlx(value) { | ||||
| @@ -0,0 +1,167 @@ | |||||
| <template> | |||||
| <div class="home_wrapper"> | |||||
| <van-nav-bar | |||||
| title="用户信息维护" | |||||
| left-arrow | |||||
| placeholder | |||||
| safe-area-inset-top | |||||
| @click-left="onClickLeft" | |||||
| /> | |||||
| <van-form @submit="onSubmit"> | |||||
| <div class="main"> | |||||
| <p class="title"><i></i>用户信息</p> | |||||
| <van-field | |||||
| required | |||||
| :rules="[{ required: true }]" | |||||
| v-model="form.nickName" | |||||
| label="用户昵称" | |||||
| placeholder="请输入" | |||||
| input-align="right" | |||||
| label-width="auto" | |||||
| /> | |||||
| <van-field | |||||
| required | |||||
| :rules="[ | |||||
| { required: true }, | |||||
| { | |||||
| pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, | |||||
| message: '请输入正确的手机号码', | |||||
| trigger: 'blur' | |||||
| } | |||||
| ]" | |||||
| v-model="form.phonenumber" | |||||
| label="手机号码" | |||||
| placeholder="请输入" | |||||
| input-align="right" | |||||
| label-width="auto" | |||||
| /> | |||||
| <van-field | |||||
| required | |||||
| :rules="[ | |||||
| { required: true }, | |||||
| { | |||||
| type: 'email', | |||||
| message: '请输入正确的邮箱地址', | |||||
| trigger: ['blur', 'change'] | |||||
| } | |||||
| ]" | |||||
| v-model="form.email" | |||||
| label="邮箱" | |||||
| placeholder="请输入" | |||||
| input-align="right" | |||||
| label-width="auto" | |||||
| /> | |||||
| <van-field | |||||
| required | |||||
| :rules="[{ required: true }]" | |||||
| label="性别" | |||||
| input-align="right" | |||||
| label-width="auto" | |||||
| > | |||||
| <van-radio-group slot="input" v-model="form.sex" direction="horizontal"> | |||||
| <van-radio name="0">男</van-radio> | |||||
| <van-radio name="1">女</van-radio> | |||||
| </van-radio-group> | |||||
| </van-field> | |||||
| </div> | |||||
| <van-button round block type="primary" native-type="submit" class="subClass">提交</van-button> | |||||
| </van-form> | |||||
| </div> | |||||
| </template> | |||||
| <script> | |||||
| // import { getMenuApp } from "@/api/app/index"; | |||||
| import Cookies from "js-cookie"; | |||||
| import { getUserProfile } from "@/api/system/user" | |||||
| import { updateUserProfile } from "@/api/system/user" | |||||
| export default { | |||||
| name: "appUserInfo", | |||||
| data() { | |||||
| return { | |||||
| form: {}, | |||||
| user: {}, | |||||
| }; | |||||
| }, | |||||
| created() { | |||||
| this.getUser() | |||||
| }, | |||||
| methods: { | |||||
| onClickLeft(){ | |||||
| history.back(-1); | |||||
| }, | |||||
| getUser() { | |||||
| getUserProfile().then(response => { | |||||
| this.form = response.data | |||||
| this.roleGroup = response.roleGroup | |||||
| this.postGroup = response.postGroup | |||||
| }) | |||||
| }, | |||||
| onSubmit() { | |||||
| updateUserProfile(this.form).then(response => { | |||||
| this.$modal.msgSuccess("修改成功") | |||||
| setTimeout(function(){ | |||||
| history.back(-1); | |||||
| },2000) | |||||
| }) | |||||
| }, | |||||
| }, | |||||
| }; | |||||
| </script> | |||||
| <style scoped lang="scss"> | |||||
| p{margin: 0;} | |||||
| .home_wrapper{ | |||||
| width: 100vw; | |||||
| min-height: 100vh; | |||||
| background: #F6F9FB; | |||||
| padding-bottom: 5vh; | |||||
| } | |||||
| .van-nav-bar{ | |||||
| background: linear-gradient( 173deg, #91E2D3 0%, #CDFCF0 100%); | |||||
| ::v-deep.van-icon{ | |||||
| color: #000000; | |||||
| } | |||||
| } | |||||
| .main{ | |||||
| width: 94%; | |||||
| margin: 3vw auto; | |||||
| padding: 3vw; | |||||
| background-color: #ffffff; | |||||
| border-radius: 10px; | |||||
| overflow: hidden; | |||||
| } | |||||
| .title{ | |||||
| display: flex; | |||||
| align-items: center; | |||||
| font-size: 20px; | |||||
| font-weight: bold; | |||||
| margin-bottom: 10px; | |||||
| i{ | |||||
| width: 5px; | |||||
| height: 20px; | |||||
| display: block; | |||||
| background-color: #29D2AF; | |||||
| margin-right: 10px; | |||||
| } | |||||
| } | |||||
| .subClass{ | |||||
| background: linear-gradient( 270deg, #53E4A5 0%, #24DBDB 100%); | |||||
| border-radius: 50px 50px 50px 50px; | |||||
| border: none; | |||||
| width: 90%; | |||||
| margin: 3vw auto; | |||||
| height: 50px; | |||||
| display: flex; | |||||
| align-items: center; | |||||
| justify-content: center; | |||||
| color: #ffffff; | |||||
| font-size: 18px; | |||||
| } | |||||
| </style> | |||||
| @@ -0,0 +1,147 @@ | |||||
| <template> | |||||
| <div class="home_wrapper"> | |||||
| <van-nav-bar | |||||
| title="修改密码" | |||||
| left-arrow | |||||
| placeholder | |||||
| safe-area-inset-top | |||||
| @click-left="onClickLeft" | |||||
| /> | |||||
| <van-form @submit="onSubmit"> | |||||
| <div class="main"> | |||||
| <p class="title"><i></i>修改密码</p> | |||||
| <van-field | |||||
| required | |||||
| :rules="[{ required: true }]" | |||||
| v-model="user.oldPassword" | |||||
| label="旧密码" | |||||
| placeholder="请输入" | |||||
| input-align="right" | |||||
| label-width="auto" | |||||
| /> | |||||
| <van-field | |||||
| required | |||||
| v-model="user.newPassword" | |||||
| :rules="[{ validator, message: '包含非法字符,重新输入' }]" | |||||
| label="新密码" | |||||
| placeholder="请输入" | |||||
| input-align="right" | |||||
| label-width="auto" | |||||
| /> | |||||
| <van-field | |||||
| required | |||||
| :rules="[{ required: true }]" | |||||
| v-model="user.confirmPassword" | |||||
| label="确认密码" | |||||
| placeholder="请输入" | |||||
| input-align="right" | |||||
| label-width="auto" | |||||
| /> | |||||
| </div> | |||||
| <van-button round block type="primary" native-type="submit" class="subClass">提交</van-button> | |||||
| </van-form> | |||||
| </div> | |||||
| </template> | |||||
| <script> | |||||
| // import { getMenuApp } from "@/api/app/index"; | |||||
| import Cookies from "js-cookie"; | |||||
| import { updateUserPwd } from "@/api/system/user" | |||||
| export default { | |||||
| name: "appUserInfo", | |||||
| data() { | |||||
| return { | |||||
| form: {}, | |||||
| user: { | |||||
| oldPassword: undefined, | |||||
| newPassword: undefined, | |||||
| confirmPassword: undefined | |||||
| } | |||||
| }; | |||||
| }, | |||||
| created() { | |||||
| }, | |||||
| methods: { | |||||
| onClickLeft(){ | |||||
| history.back(-1); | |||||
| }, | |||||
| validator(val) { | |||||
| return /^[^<>"'|\\]+$/.test(val); | |||||
| }, | |||||
| onSubmit() { | |||||
| if(this.user.newPassword.length < 6 || this.user.newPassword.length > 20){ | |||||
| this.$modal.msgWarning("长度在 6 到 20 个字符"); | |||||
| return; | |||||
| } | |||||
| if (this.user.newPassword != this.user.confirmPassword){ | |||||
| this.$modal.msgWarning("两次输入的密码不一致"); | |||||
| return; | |||||
| } | |||||
| updateUserPwd(this.user.oldPassword, this.user.newPassword).then(response => { | |||||
| this.$modal.msgSuccess("修改成功") | |||||
| setTimeout(function(){ | |||||
| history.back(-1); | |||||
| },2000) | |||||
| }) | |||||
| }, | |||||
| }, | |||||
| }; | |||||
| </script> | |||||
| <style scoped lang="scss"> | |||||
| p{margin: 0;} | |||||
| .home_wrapper{ | |||||
| width: 100vw; | |||||
| min-height: 100vh; | |||||
| background: #F6F9FB; | |||||
| padding-bottom: 5vh; | |||||
| } | |||||
| .van-nav-bar{ | |||||
| background: linear-gradient( 173deg, #91E2D3 0%, #CDFCF0 100%); | |||||
| ::v-deep.van-icon{ | |||||
| color: #000000; | |||||
| } | |||||
| } | |||||
| .main{ | |||||
| width: 94%; | |||||
| margin: 3vw auto; | |||||
| padding: 3vw; | |||||
| background-color: #ffffff; | |||||
| border-radius: 10px; | |||||
| overflow: hidden; | |||||
| } | |||||
| .title{ | |||||
| display: flex; | |||||
| align-items: center; | |||||
| font-size: 20px; | |||||
| font-weight: bold; | |||||
| margin-bottom: 10px; | |||||
| i{ | |||||
| width: 5px; | |||||
| height: 20px; | |||||
| display: block; | |||||
| background-color: #29D2AF; | |||||
| margin-right: 10px; | |||||
| } | |||||
| } | |||||
| .subClass{ | |||||
| background: linear-gradient( 270deg, #53E4A5 0%, #24DBDB 100%); | |||||
| border-radius: 50px 50px 50px 50px; | |||||
| border: none; | |||||
| width: 90%; | |||||
| margin: 3vw auto; | |||||
| height: 50px; | |||||
| display: flex; | |||||
| align-items: center; | |||||
| justify-content: center; | |||||
| color: #ffffff; | |||||
| font-size: 18px; | |||||
| } | |||||
| </style> | |||||
| @@ -5,28 +5,28 @@ | |||||
| <div class="header"> | <div class="header"> | ||||
| <div class="left"> | <div class="left"> | ||||
| <div class="avatar"><img src="../../assets/images/app/user_header.png" alt=""></div> | |||||
| <div class="avatar"><img src="../../../assets/images/app/user_header.png" alt=""></div> | |||||
| <div class="info"> | <div class="info"> | ||||
| <p>{{ nickName }}</p> | |||||
| <p>{{ deptName }}</p> | |||||
| <p>{{$store.getters.user.user.nickName}}</p> | |||||
| <p>{{$store.getters.user.user.dept.deptName}}</p> | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| <div class="content"> | <div class="content"> | ||||
| <van-cell title="用户信息" is-link center :border="false"> | |||||
| <van-cell title="用户信息" is-link center :border="false" @click="$router.push({name:'appUserInfo'})"> | |||||
| <template slot="icon"> | <template slot="icon"> | ||||
| <img src="../../assets/images/app/user_icon_01.png" width="25" alt=""> | |||||
| <img src="../../../assets/images/app/user_icon_01.png" width="25" alt=""> | |||||
| </template> | </template> | ||||
| </van-cell> | </van-cell> | ||||
| <van-cell title="修改密码" is-link center :border="false"> | |||||
| <van-cell title="修改密码" is-link center :border="false" @click="$router.push({name:'appUserPassWord'})"> | |||||
| <template slot="icon"> | <template slot="icon"> | ||||
| <img src="../../assets/images/app/user_icon_02.png" width="25" alt=""> | |||||
| <img src="../../../assets/images/app/user_icon_02.png" width="25" alt=""> | |||||
| </template> | </template> | ||||
| </van-cell> | </van-cell> | ||||
| <van-cell title="退出登录" is-link center :border="false" @click = "logOut"> | |||||
| <van-cell title="退出登录" is-link center :border="false" @click="logout"> | |||||
| <template slot="icon"> | <template slot="icon"> | ||||
| <img src="../../assets/images/app/user_icon_03.png" width="25" alt=""> | |||||
| <img src="../../../assets/images/app/user_icon_03.png" width="25" alt=""> | |||||
| </template> | </template> | ||||
| </van-cell> | </van-cell> | ||||
| </div> | </div> | ||||
| @@ -36,27 +36,36 @@ | |||||
| <script> | <script> | ||||
| import Cookies from "js-cookie"; | import Cookies from "js-cookie"; | ||||
| import {Dialog} from "vant"; | |||||
| export default { | export default { | ||||
| name: "appUser", | name: "appUser", | ||||
| data() { | data() { | ||||
| return { | return { | ||||
| nickName: null, | |||||
| deptName: null | |||||
| }; | }; | ||||
| }, | }, | ||||
| created() { | created() { | ||||
| this.nickName = this.$store.getters.user.user.nickName; | |||||
| this.deptName = this.$store.getters.user.user.dept.deptName; | |||||
| }, | }, | ||||
| methods: { | methods: { | ||||
| goBack(){ | goBack(){ | ||||
| history.go(-1) | history.go(-1) | ||||
| }, | }, | ||||
| logOut() { | |||||
| this.$store.dispatch('LogOut').then(() => { | |||||
| location.href = '/app/index' | |||||
| logout() { | |||||
| Dialog.confirm({ | |||||
| title: '提示', | |||||
| message: '确定注销并退出系统吗?', | |||||
| }) | }) | ||||
| }, | |||||
| .then(() => { | |||||
| this.$store.dispatch('LogOut').then(() => { | |||||
| location.href = '/app/login' | |||||
| }) | |||||
| }) | |||||
| .catch(() => { | |||||
| // on cancel | |||||
| }); | |||||
| } | |||||
| }, | }, | ||||
| }; | }; | ||||
| </script> | </script> | ||||
| @@ -66,7 +75,7 @@ | |||||
| .home_wrapper{ | .home_wrapper{ | ||||
| width: 100vw; | width: 100vw; | ||||
| min-height: 100vh; | min-height: 100vh; | ||||
| background: #F6F9FB url('../../assets/images/app/user_bg.png') no-repeat center top; | |||||
| background: #F6F9FB url('../../../assets/images/app/user_bg.png') no-repeat center top; | |||||
| background-size: 100% auto; | background-size: 100% auto; | ||||
| padding: 5vh 4vw 0; | padding: 5vh 4vw 0; | ||||
| } | } | ||||
| @@ -116,7 +125,7 @@ | |||||
| border: 2px solid #FFFFFF; | border: 2px solid #FFFFFF; | ||||
| overflow: hidden; | overflow: hidden; | ||||
| .title{ | .title{ | ||||
| background: url("../../assets/images/app/title_bg.png") no-repeat left 10px; | |||||
| background: url("../../../assets/images/app/title_bg.png") no-repeat left 10px; | |||||
| font-size: 2.2vh; | font-size: 2.2vh; | ||||
| font-weight: bold; | font-weight: bold; | ||||
| padding-bottom: 10px; | padding-bottom: 10px; | ||||
| @@ -90,8 +90,9 @@ | |||||
| <template slot-scope="scope"> | <template slot-scope="scope"> | ||||
| <el-button size="mini" type="text" icon="el-icon-view" @click="handleLook(scope.row)" v-hasPermi="['business:export:query']">查看</el-button> | <el-button size="mini" type="text" icon="el-icon-view" @click="handleLook(scope.row)" v-hasPermi="['business:export:query']">查看</el-button> | ||||
| <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['business:export:edit']">修改</el-button> | <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['business:export:edit']">修改</el-button> | ||||
| <el-button size="mini" type="text" icon="el-icon-video-play" @click="handleDo(scope.row)" v-hasPermi="['business:export:do']" v-if="scope.row.taskStatus == '1'">执行</el-button> | |||||
| <el-button size="mini" type="text" icon="el-icon-video-play" @click="handleDo(scope.row)" v-hasPermi="['business:export:do']" v-if="scope.row.taskStatus == '0'">执行</el-button> | |||||
| <el-button size="mini" type="text" icon="el-icon-download" @click="handleDown(scope.row)" v-hasPermi="['business:export:down']" v-if="scope.row.taskStatus == '3'">下载</el-button> | <el-button size="mini" type="text" icon="el-icon-download" @click="handleDown(scope.row)" v-hasPermi="['business:export:down']" v-if="scope.row.taskStatus == '3'">下载</el-button> | ||||
| <el-button size="mini" type="text" icon="el-icon-tickets" @click="openLog(scope.row)" v-hasPermi="['business:export:do']">日志</el-button> | |||||
| <el-dropdown size="mini" v-hasPermi="['business:export:remove']"> | <el-dropdown size="mini" v-hasPermi="['business:export:remove']"> | ||||
| <el-button size="mini" type="text" icon="el-icon-d-arrow-right">更多</el-button> | <el-button size="mini" type="text" icon="el-icon-d-arrow-right">更多</el-button> | ||||
| @@ -169,17 +170,37 @@ | |||||
| <el-button @click="cancel">取 消</el-button> | <el-button @click="cancel">取 消</el-button> | ||||
| </div> | </div> | ||||
| </el-dialog> | </el-dialog> | ||||
| <el-dialog title="任务日志" :visible.sync="log.logOpen" width="800px" append-to-body> | |||||
| <div v-html="log.logText"> | |||||
| </div> | |||||
| <!-- 弹框操作按钮 --> | |||||
| <div slot="footer" class="dialog-footer"> | |||||
| <el-button @click="downloadLog">下 载</el-button> | |||||
| <el-button @click="closeLog">关 闭</el-button> | |||||
| </div> | |||||
| </el-dialog> | |||||
| </div> | </div> | ||||
| </template> | </template> | ||||
| <script> | <script> | ||||
| import { listExport, getExport, getExportDetail, delExport, addExport, updateExport, printExport } from "@/api/business/export" | |||||
| import { | |||||
| listExport, | |||||
| getExport, | |||||
| getExportDetail, | |||||
| delExport, | |||||
| addExport, | |||||
| updateExport, | |||||
| printExport, | |||||
| startExport, exportLog, downloadLog, downloadFile | |||||
| } from "@/api/business/export" | |||||
| import { getToken } from "@/utils/auth" | import { getToken } from "@/utils/auth" | ||||
| import Treeselect from "@riophae/vue-treeselect"; | import Treeselect from "@riophae/vue-treeselect"; | ||||
| import { Splitpanes, Pane } from "splitpanes" | import { Splitpanes, Pane } from "splitpanes" | ||||
| import "@riophae/vue-treeselect/dist/vue-treeselect.css" | import "@riophae/vue-treeselect/dist/vue-treeselect.css" | ||||
| import "splitpanes/dist/splitpanes.css" | import "splitpanes/dist/splitpanes.css" | ||||
| import { deptTreeSelect } from "@/api/system/user" | import { deptTreeSelect } from "@/api/system/user" | ||||
| import {save} from "@/utils"; | |||||
| export default { | export default { | ||||
| name: "Export", | name: "Export", | ||||
| @@ -276,7 +297,11 @@ export default { | |||||
| // 上传的地址 | // 上传的地址 | ||||
| url: process.env.VUE_APP_BASE_API + "/business/export/importData" | url: process.env.VUE_APP_BASE_API + "/business/export/importData" | ||||
| }, | }, | ||||
| log: { | |||||
| taskId: null, | |||||
| logOpen: false, | |||||
| logText: '', | |||||
| }, | |||||
| } | } | ||||
| }, | }, | ||||
| watch: { | watch: { | ||||
| @@ -529,7 +554,68 @@ export default { | |||||
| this.selectDeptName = data.label | this.selectDeptName = data.label | ||||
| this.handleQuery() | this.handleQuery() | ||||
| }, | }, | ||||
| /** 开始 */ | |||||
| handleDo(row) { | |||||
| const ids = row.id || this.ids | |||||
| this.$modal.confirm('是否确认开始编号为"' + ids + '"的导出任务?').then(function() { | |||||
| return startExport(ids) | |||||
| }).then((resp) => { | |||||
| this.getList() | |||||
| this.$modal.msgSuccess(resp.data == 2 ? '正在执行' : '已加入队列, 等待执行') | |||||
| }).catch(() => {}) | |||||
| }, | |||||
| /** 日志 */ | |||||
| handleLog(row, offset = 0) { | |||||
| if(!this.log.logOpen) | |||||
| return; | |||||
| exportLog(row.id, offset).then(({data}) => { | |||||
| if(null == data.text) | |||||
| { | |||||
| this.log.logText = ''; | |||||
| return; | |||||
| } | |||||
| this.log.logText += data.text | |||||
| .replaceAll('<', '<') | |||||
| .replaceAll('>', '>') | |||||
| .replaceAll('\r\n', '<br/>') | |||||
| .replaceAll('\r', '<br/>') | |||||
| .replaceAll('\n', '<br/>') | |||||
| ; | |||||
| if(!data.eof && this.log.logOpen && (data.taskStatus === '1' || data.taskStatus === '2')) | |||||
| { | |||||
| setTimeout(() => { | |||||
| this.handleLog(row, data.length); | |||||
| }, data.nextPollDelay > 0 ? data.nextPollDelay : 2000); | |||||
| } | |||||
| }); | |||||
| }, | |||||
| /** 日志 */ | |||||
| downloadLog() { | |||||
| if(!this.log.taskId) | |||||
| return; | |||||
| downloadLog(this.log.taskId).then((resp) => { | |||||
| this.$message.success('开始下载......'); | |||||
| save(`导出任务_${this.log.taskId}.log`, resp); | |||||
| }); | |||||
| }, | |||||
| openLog(row) { | |||||
| this.log.logText = ''; | |||||
| this.log.logOpen = true; | |||||
| this.log.taskId = row.id; | |||||
| this.handleLog(row); | |||||
| }, | |||||
| closeLog() { | |||||
| this.log.logOpen = false; | |||||
| this.log.taskId = null; | |||||
| this.log.logText = ''; | |||||
| }, | |||||
| /** 下载 */ | |||||
| handleDown(row) { | |||||
| downloadFile(row.id).then((resp) => { | |||||
| this.$message.success('开始下载......'); | |||||
| save(`导出任务_${row.id}.zip`, resp); | |||||
| }); | |||||
| }, | |||||
| } | } | ||||
| } | } | ||||
| </script> | </script> | ||||
| @@ -651,6 +651,7 @@ export default { | |||||
| if(!this.log.taskId) | if(!this.log.taskId) | ||||
| return; | return; | ||||
| downloadLog(this.log.taskId).then((resp) => { | downloadLog(this.log.taskId).then((resp) => { | ||||
| this.$message.success('开始下载......'); | |||||
| save(`导入任务_${this.log.taskId}.log`, resp); | save(`导入任务_${this.log.taskId}.log`, resp); | ||||
| }); | }); | ||||
| }, | }, | ||||
| @@ -11,7 +11,7 @@ | |||||
| <div class="info-cards"> | <div class="info-cards"> | ||||
| <div class="info-card"> | <div class="info-card"> | ||||
| <h3>地块总数</h3> | <h3>地块总数</h3> | ||||
| <p class="number"><countTo v-if="homepageStatistics" :startVal="0" :endVal="Number(homepageStatistics.dataNum1)" :duration="2000"></countTo> 块</p> | |||||
| <p class="number"><countTo v-if="homepageStatistics" :startVal="0" :endVal="Number(homepageStatistics.dataNum1)" :duration="2000"></countTo> 宗</p> | |||||
| </div> | </div> | ||||
| <div class="info-card"> | <div class="info-card"> | ||||
| <h3>承包总金额</h3> | <h3>承包总金额</h3> | ||||
| @@ -22,7 +22,7 @@ | |||||
| <div class="info-cards"> | <div class="info-cards"> | ||||
| <div class="info-card"> | <div class="info-card"> | ||||
| <h3>待调查总数</h3> | <h3>待调查总数</h3> | ||||
| <p class="number"><countTo v-if="homepageStatistics" :startVal="0" :endVal="Number(homepageStatistics.dataNum2)" :duration="2000"></countTo> 块</p> | |||||
| <p class="number"><countTo v-if="homepageStatistics" :startVal="0" :endVal="Number(homepageStatistics.dataNum2)" :duration="2000"></countTo> 宗</p> | |||||
| </div> | </div> | ||||
| <div class="info-card"> | <div class="info-card"> | ||||
| <h3>兑现总金额</h3> | <h3>兑现总金额</h3> | ||||
| @@ -33,7 +33,7 @@ | |||||
| <div class="info-cards"> | <div class="info-cards"> | ||||
| <div class="info-card"> | <div class="info-card"> | ||||
| <h3>已调查总数</h3> | <h3>已调查总数</h3> | ||||
| <p class="number"><countTo v-if="homepageStatistics" :startVal="0" :endVal="Number(homepageStatistics.dataNum3)" :duration="2000"></countTo> 块</p> | |||||
| <p class="number"><countTo v-if="homepageStatistics" :startVal="0" :endVal="Number(homepageStatistics.dataNum3)" :duration="2000"></countTo> 宗</p> | |||||
| </div> | </div> | ||||
| <div class="info-card"> | <div class="info-card"> | ||||
| <h3>尚欠总金额</h3> | <h3>尚欠总金额</h3> | ||||
| @@ -47,10 +47,9 @@ | |||||
| <p class="number"><countTo v-if="homepageStatistics" :startVal="0" :endVal="Number(homepageStatistics.dataNum4)" :duration="2000"></countTo> 亩</p> | <p class="number"><countTo v-if="homepageStatistics" :startVal="0" :endVal="Number(homepageStatistics.dataNum4)" :duration="2000"></countTo> 亩</p> | ||||
| </div> | </div> | ||||
| <div class="info-card"> | <div class="info-card"> | ||||
| <h3>经营总面积</h3> | |||||
| <p class="number"><countTo v-if="homepageStatistics" :startVal="0" :endVal="Number(homepageStatistics.dataNum9)" :duration="2000"></countTo> 亩</p> | |||||
| <h3>年总收益</h3> | |||||
| <p class="number">¥ <countTo v-if="homepageStatistics" :startVal="0" :endVal="Number(homepageStatistics.dataNum10)" :duration="2000"></countTo></p> | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| <div class="info-cards"> | <div class="info-cards"> | ||||
| @@ -59,10 +58,11 @@ | |||||
| <p class="number"><countTo v-if="homepageStatistics" :startVal="0" :endVal="Number(homepageStatistics.dataNum5)" :duration="2000"></countTo> 亩</p> | <p class="number"><countTo v-if="homepageStatistics" :startVal="0" :endVal="Number(homepageStatistics.dataNum5)" :duration="2000"></countTo> 亩</p> | ||||
| </div> | </div> | ||||
| <div class="info-card"> | <div class="info-card"> | ||||
| <h3>年总收益</h3> | |||||
| <p class="number">¥ <countTo v-if="homepageStatistics" :startVal="0" :endVal="Number(homepageStatistics.dataNum10)" :duration="2000"></countTo></p> | |||||
| <h3>经营总面积</h3> | |||||
| <p class="number"><countTo v-if="homepageStatistics" :startVal="0" :endVal="Number(homepageStatistics.dataNum9)" :duration="2000"></countTo> 亩</p> | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| </template> | </template> | ||||
| @@ -217,10 +217,17 @@ | |||||
| <el-descriptions title="经营数据" border :column="2" class="margin-top"> | <el-descriptions title="经营数据" border :column="2" class="margin-top"> | ||||
| <el-descriptions-item label="经营面积(亩)">{{ form.jymj }}</el-descriptions-item> | <el-descriptions-item label="经营面积(亩)">{{ form.jymj }}</el-descriptions-item> | ||||
| <el-descriptions-item label="经营方式">{{ form.jyfs }}</el-descriptions-item> | <el-descriptions-item label="经营方式">{{ form.jyfs }}</el-descriptions-item> | ||||
| <el-descriptions-item label="经营对象类型">{{ form.jydxlx }}</el-descriptions-item> | |||||
| <el-descriptions-item label="经营对象名称">{{ form.jydxmc }}</el-descriptions-item> | <el-descriptions-item label="经营对象名称">{{ form.jydxmc }}</el-descriptions-item> | ||||
| <el-descriptions-item label="证件类型">{{ form.jydxzjlx }}</el-descriptions-item> | |||||
| <el-descriptions-item label="证件号码">{{ form.jydxzjhm }}</el-descriptions-item> | |||||
| <el-descriptions-item label="是否签订合同">{{ form.sfqdht }}</el-descriptions-item> | |||||
| <el-descriptions-item label="经营开始时间">{{ form.jykssj }}</el-descriptions-item> | <el-descriptions-item label="经营开始时间">{{ form.jykssj }}</el-descriptions-item> | ||||
| <el-descriptions-item label="经营结束时间">{{ form.jyjssj }}</el-descriptions-item> | <el-descriptions-item label="经营结束时间">{{ form.jyjssj }}</el-descriptions-item> | ||||
| <el-descriptions-item label="承包金额(元)">{{ form.cbje }}</el-descriptions-item> | <el-descriptions-item label="承包金额(元)">{{ form.cbje }}</el-descriptions-item> | ||||
| <el-descriptions-item label="兑现金额(元)">{{ form.dxje }}</el-descriptions-item> | |||||
| <el-descriptions-item label="尚欠金额(元)">{{ form.sqje }}</el-descriptions-item> | |||||
| <el-descriptions-item label="年收益(元)">{{ form.nsy }}</el-descriptions-item> | |||||
| <el-descriptions-item label="备注">{{ form.bz }}</el-descriptions-item> | <el-descriptions-item label="备注">{{ form.bz }}</el-descriptions-item> | ||||
| <el-descriptions-item label="调查状态">{{ form.surveyStatus }}</el-descriptions-item> | <el-descriptions-item label="调查状态">{{ form.surveyStatus }}</el-descriptions-item> | ||||
| <el-descriptions-item label="实物图"> | <el-descriptions-item label="实物图"> | ||||
| @@ -514,7 +521,7 @@ export default { | |||||
| dkmc: null, | dkmc: null, | ||||
| syqxz: '30', | syqxz: '30', | ||||
| dklb: '22', | dklb: '22', | ||||
| tdlylx: '011', | |||||
| tdlylx: '01', | |||||
| dldj: '01', | dldj: '01', | ||||
| tdyt: '1', | tdyt: '1', | ||||
| sfjbnt: '1', | sfjbnt: '1', | ||||
| @@ -186,10 +186,17 @@ | |||||
| <el-descriptions title="经营数据" border :column="2" class="margin-top"> | <el-descriptions title="经营数据" border :column="2" class="margin-top"> | ||||
| <el-descriptions-item label="经营面积(亩)">{{ form.jymj }}</el-descriptions-item> | <el-descriptions-item label="经营面积(亩)">{{ form.jymj }}</el-descriptions-item> | ||||
| <el-descriptions-item label="经营方式">{{ form.jyfs }}</el-descriptions-item> | <el-descriptions-item label="经营方式">{{ form.jyfs }}</el-descriptions-item> | ||||
| <el-descriptions-item label="经营对象类型">{{ form.jydxlx }}</el-descriptions-item> | |||||
| <el-descriptions-item label="经营对象名称">{{ form.jydxmc }}</el-descriptions-item> | <el-descriptions-item label="经营对象名称">{{ form.jydxmc }}</el-descriptions-item> | ||||
| <el-descriptions-item label="证件类型">{{ form.jydxzjlx }}</el-descriptions-item> | |||||
| <el-descriptions-item label="证件号码">{{ form.jydxzjhm }}</el-descriptions-item> | |||||
| <el-descriptions-item label="是否签订合同">{{ form.sfqdht }}</el-descriptions-item> | |||||
| <el-descriptions-item label="经营开始时间">{{ form.jykssj }}</el-descriptions-item> | <el-descriptions-item label="经营开始时间">{{ form.jykssj }}</el-descriptions-item> | ||||
| <el-descriptions-item label="经营结束时间">{{ form.jyjssj }}</el-descriptions-item> | <el-descriptions-item label="经营结束时间">{{ form.jyjssj }}</el-descriptions-item> | ||||
| <el-descriptions-item label="承包金额(元)">{{ form.cbje }}</el-descriptions-item> | <el-descriptions-item label="承包金额(元)">{{ form.cbje }}</el-descriptions-item> | ||||
| <el-descriptions-item label="兑现金额(元)">{{ form.dxje }}</el-descriptions-item> | |||||
| <el-descriptions-item label="尚欠金额(元)">{{ form.sqje }}</el-descriptions-item> | |||||
| <el-descriptions-item label="年收益(元)">{{ form.nsy }}</el-descriptions-item> | |||||
| <el-descriptions-item label="备注">{{ form.bz }}</el-descriptions-item> | <el-descriptions-item label="备注">{{ form.bz }}</el-descriptions-item> | ||||
| <el-descriptions-item label="调查状态">{{ form.surveyStatus }}</el-descriptions-item> | <el-descriptions-item label="调查状态">{{ form.surveyStatus }}</el-descriptions-item> | ||||
| <el-descriptions-item label="实物图"> | <el-descriptions-item label="实物图"> | ||||
| @@ -9,8 +9,8 @@ const CompressionPlugin = require('compression-webpack-plugin') | |||||
| const name = process.env.VUE_APP_TITLE | const name = process.env.VUE_APP_TITLE | ||||
| //const baseUrl = 'http://localhost:8080' // 后端接口 | |||||
| const baseUrl = 'http://192.168.0.106:8080' // 后端接口 zzl | |||||
| const baseUrl = 'http://localhost:8080' // 后端接口 | |||||
| //const baseUrl = 'http://192.168.0.106:8080' // 后端接口 zzl | |||||
| const port = process.env.port || process.env.npm_config_port || 80 // 端口 | const port = process.env.port || process.env.npm_config_port || 80 // 端口 | ||||