diff --git a/package.json b/package.json
index 87db874..3036189 100644
--- a/package.json
+++ b/package.json
@@ -21,6 +21,7 @@
"core-js": "3.6.5",
"echarts": "^4.2.1",
"element-ui": "2.15.13",
+ "file-saver": "^2.0.5",
"js-cookie": "2.2.0",
"less-loader": "^5.0.0",
"moment": "^2.29.2",
@@ -33,7 +34,8 @@
"vue-count-to": "^1.0.13",
"vue-router": "3.0.6",
"vuedraggable": "^2.24.3",
- "vuex": "3.1.0"
+ "vuex": "3.1.0",
+ "xlsx": "^0.18.5"
},
"devDependencies": {
"@vue/cli-plugin-babel": "4.4.4",
diff --git a/src/api/system/baseForm.js b/src/api/system/baseForm.js
index d2443c8..d16d26a 100644
--- a/src/api/system/baseForm.js
+++ b/src/api/system/baseForm.js
@@ -49,3 +49,10 @@ export function destroy(params) {
})
}
+export function imports(data) {
+ return request({
+ method: "post",
+ url: "/api/admin/base-form/import",
+ data
+ })
+}
diff --git a/src/api/system/customForm.js b/src/api/system/customForm.js
index 6b19be6..63a7b24 100644
--- a/src/api/system/customForm.js
+++ b/src/api/system/customForm.js
@@ -9,11 +9,12 @@ export function index(params,isLoading = false) {
})
}
-export function show(params) {
+export function show(params,isLoading = true) {
return request({
method: "get",
url: "/api/admin/custom-form/show",
- params
+ params,
+ isLoading
})
}
diff --git a/src/components/XyMap/index.vue b/src/components/XyMap/index.vue
new file mode 100644
index 0000000..a8546ed
--- /dev/null
+++ b/src/components/XyMap/index.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
diff --git a/src/const/inputType.js b/src/const/inputType.js
index 62da3aa..032629c 100644
--- a/src/const/inputType.js
+++ b/src/const/inputType.js
@@ -10,5 +10,5 @@ export const domMap = new Map([
["textarea", "el-input"],
- ["map", "el-input"],
+ ["map", "my-map"],
])
diff --git a/src/main.js b/src/main.js
index 28f3f5e..4c756ca 100644
--- a/src/main.js
+++ b/src/main.js
@@ -46,9 +46,12 @@ import Message from 'element-ui/lib/message';
Vue.config.productionTip = false
-import avue from '@smallwei/avue'
+import avue from '@smallwei/avue';
import '@smallwei/avue/lib/index.css';
Vue.use(avue)
+import AvueMap from 'avue-plugin-map'
+Vue.use(AvueMap);
+
Vue.directive('loadMore', {
bind(el, binding) {
const selectWrap = el.querySelector('.el-scrollbar__wrap')
@@ -72,6 +75,10 @@ import XySelectors from '@/components/XySelectors'
Vue.component('xy-selectors',XySelectors)
import draggable from 'vuedraggable';
Vue.component('draggable',draggable)
+import tinymce from '@/components/XyTinymce'
+Vue.component('my-tinymce',tinymce)
+import myMap from "@/components/XyMap"
+Vue.component('my-map',myMap)
Vue.prototype.$integrateData = (target,value) => {
for(let i in target){
diff --git a/src/views/component/data.js b/src/views/component/data.js
deleted file mode 100644
index 3d5067b..0000000
--- a/src/views/component/data.js
+++ /dev/null
@@ -1,66 +0,0 @@
-const data = [
- {
- id:1,
- name:'a',
- age:10,
- birth:'2022-01-01'
- },
- {
- id:2,
- name:'b',
- age:11,
- birth:'2022-01-01'
- },
- {
- id:3,
- name:'c',
- age:14,
- birth:'2022-01-01'
- },
- {
- id:4,
- name:'b',
- age:11,
- birth:'2022-01-01'
- },
- {
- id:5,
- name:'e',
- age:20,
- birth:'2022-01-02'
- },
- {
- id:6,
- name:'f',
- age:20,
- birth:'2022-01-02'
- },
- {
- id:7,
- name:'g',
- age:20,
- birth:'2022-01-02'
- },
- {
- id:8,
- name:'h',
- age:20,
- birth:'2022-01-02'
- }
-]
-
-const getData = (params) => {
- const { page,page_size } = params
- let start = (page - 1) * page_size
- let res = data.slice(start,start + page_size)
- return {
- per_page:page_size,
- total:data.length,
- data:res,
- current_page:page
- }
-}
-
-export {
- getData
-}
diff --git a/src/views/component/dialog.vue b/src/views/component/dialog.vue
index 8c7ac58..31563f1 100644
--- a/src/views/component/dialog.vue
+++ b/src/views/component/dialog.vue
@@ -63,7 +63,7 @@ export default {
ref: `elEdit_${i.field}`,
props: {
...addPropsMap.get(i.edit_input),
- ...this.extraProps(i.edit_input),
+ ...this.extraProps(i),
placeholder: i.help,
value: this.form[i.field],
},
@@ -136,6 +136,9 @@ export default {
dialogVisible: false,
form: {},
rules: {},
+ file: {
+
+ }
};
},
methods: {
@@ -217,6 +220,7 @@ export default {
extraProps(info) {
let props = {};
if (info.edit_input === "file" || info.edit_input === "files") {
+ props.fileList = this.file[info.field];
props.beforeUpload = (file) => {
if (file.size / 1000 > 500) {
this.$message({
@@ -228,11 +232,11 @@ export default {
};
props.onSuccess = (response, file, fileList) => {
- info._fileList = fileList;
+ this.file[info.field] = fileList;
};
props.onRemove = (file, fileList) => {
- info._fileList = fileList;
+ this.file[info.field] = fileList;
};
}
return props;
@@ -298,6 +302,9 @@ export default {
(i) => i?.response?.id
);
}
+ if(info.edit_input === "file") {
+ this.form[info.field] = this.file[info.field][0]?.response?.id
+ }
});
console.log(this.form);
save(Object.assign(this.form, { table_name: this.tableName })).then(
@@ -319,6 +326,7 @@ export default {
handler: function (newVal) {
this.form = {};
this.rules = {};
+ this.file = {};
newVal.forEach((i) => {
if (i.field) {
this.form[i.field] = "";
@@ -327,9 +335,12 @@ export default {
{ required: true, message: `请填写${i.name}` },
];
}
- if (i.edit_input === "file" || i.edit_input === "files") {
+ if (i.edit_input === "files") {
this.form[i.field] = [];
}
+ if(i.edit_input === "files" || i.edit_input === "file") {
+ this.file[i.field] = [];
+ }
if (i.edit_input === "checkbox") {
this.form[i.field] = [];
}
diff --git a/src/views/component/imports.vue b/src/views/component/imports.vue
new file mode 100644
index 0000000..3ed0977
--- /dev/null
+++ b/src/views/component/imports.vue
@@ -0,0 +1,156 @@
+
+
+
+ 模板下载
+ 模板下载
+
+ 导入的时候请勿修改模版的标题名称
+
+
+
+
+ 将文件拖到此处,或点击上传
+ 只能上传xls/xlsx文件
+
+
+ 数据预览
+
+ 总共数据:{{ tableList.length }}条
+ 确认导入
+
+
+
+
+
+
+
diff --git a/src/views/component/table.vue b/src/views/component/table.vue
index d870f0e..46fe702 100644
--- a/src/views/component/table.vue
+++ b/src/views/component/table.vue
@@ -3,7 +3,7 @@
-
+
@@ -93,6 +93,13 @@
>新增
+
+
+
@@ -139,21 +147,25 @@ import { index,destroy } from "@/api/system/baseForm";
import { op } from "@/const/op";
import { download } from "@/utils/downloadRequest";
import { getparameter } from "@/api/system/dictionary";
+import { show } from "@/api/system/customForm";
import dialoger from './dialog.vue';
import LxHeader from "@/components/LxHeader/index.vue";
import headerContent from "@/components/LxHeader/XyContent.vue";
import drawer from "@/views/component/drawer.vue";
+import imports from "./imports.vue"
export default {
components:{
LxHeader,
dialoger,
headerContent,
drawer,
+ imports
},
mixins: [authMixin],
data() {
return {
+ title: "",
op,
select: {
table_name: "",
@@ -195,6 +207,11 @@ export default {
target.value = `${temp ? temp : ""},${e}`
},
+ async getFormDetail() {
+ const res = await show({ id: this.customForm.customFormId },false)
+ this.title = res.name
+ },
+
async getField() {
if(this.$route.meta.params?.custom_form) {
let decode = decodeURIComponent(this.$route.meta.params?.custom_form)
@@ -218,9 +235,6 @@ export default {
if(res.data && res.data instanceof Array) {
res.data.forEach(i => {
if (i.field) {
- if (i.edit_input === "file" || i.edit_input === "files") {
- i._fileList = [];
- }
if (
(i.edit_input === "checkbox" || i.edit_input === "radio") &&
i.parameter_id
@@ -294,7 +308,7 @@ export default {
},
created() {
this.getField()
-
+ this.getFormDetail()
}
}
diff --git a/src/views/system/components/editPane.vue b/src/views/system/components/editPane.vue
index 58dff3a..1c4666d 100644
--- a/src/views/system/components/editPane.vue
+++ b/src/views/system/components/editPane.vue
@@ -76,7 +76,7 @@