From fd7586c8d91473d2850af1e48b12f1a289e6b8d1 Mon Sep 17 00:00:00 2001
From: gaoshp <291585735@qq.com>
Date: 星期四, 13 六月 2024 00:10:43 +0800
Subject: [PATCH] 新增文件

---
 src/components/scForm/index.vue |  364 +++++++++++++++++++++++++++------------------------
 1 files changed, 193 insertions(+), 171 deletions(-)

diff --git a/src/components/scForm/index.vue b/src/components/scForm/index.vue
index 146acdf..dcdf32d 100644
--- a/src/components/scForm/index.vue
+++ b/src/components/scForm/index.vue
@@ -3,46 +3,52 @@
  * @version: 1.0
  * @Author: sakuya
  * @Date: 2021骞�9鏈�22鏃�09:26:25
- * @LastEditors:
- * @LastEditTime:
+ * @LastEditors: Sneed
+ * @LastEditTime: 2024-06-11 19:41:06
 -->
 
 <template>
-	<el-skeleton v-if="renderLoading || Object.keys(form).length==0" animated />
+	<el-skeleton v-if="renderLoading || Object.keys(form).length == 0" animated />
 
-	<el-form v-else ref="form" :model="form" :label-width="config.labelWidth" :label-position="config.labelPosition" v-loading="loading" element-loading-text="Loading...">
+	<el-form v-else ref="form" :model="form" :label-width="config.labelWidth" :label-position="config.labelPosition"
+		v-loading="loading" element-loading-text="Loading...">
 		<el-row :gutter="15">
 			<template v-for="(item, index) in config.formItems" :key="index">
 				<el-col :span="item.span || 24" v-if="!hideHandle(item)">
-					<sc-title  v-if="item.component=='title'"  :title="item.label"></sc-title>
+					<sc-title v-if="item.component == 'title'" :title="item.label"></sc-title>
 					<el-form-item v-else :prop="item.name" :rules="rulesHandle(item)">
 						<template #label>
-							{{item.label}}
+							{{ item.label }}
 							<el-tooltip v-if="item.tips" :content="item.tips">
 								<el-icon><el-icon-question-filled /></el-icon>
 							</el-tooltip>
 						</template>
 						<!-- input -->
-						<template v-if="item.component=='input'" >
-							<el-input v-model="form[item.name]" :placeholder="item.options.placeholder" clearable :maxlength="item.options.maxlength" show-word-limit></el-input>
+						<template v-if="item.component == 'input'">
+							<el-input v-model="form[item.name]" :placeholder="item.options.placeholder" clearable
+								:maxlength="item.options.maxlength" show-word-limit
+								:disabled="item.disabled"></el-input>
 						</template>
 						<!-- checkbox -->
-						<template v-else-if="item.component=='checkbox'" >
-							<template v-if="item.name" >
-								<el-checkbox v-model="form[item.name][_item.name]" :label="_item.label"  v-for="(_item, _index) in item.options.items" :key="_index"></el-checkbox>
+						<template v-else-if="item.component == 'checkbox'">
+							<template v-if="item.name">
+								<el-checkbox v-model="form[item.name][_item.name]" :label="_item.label"
+									v-for="(_item, _index) in item.options.items" :key="_index"></el-checkbox>
 							</template>
-							<template v-else >
-								<el-checkbox v-model="form[_item.name]" :label="_item.label"  v-for="(_item, _index) in item.options.items" :key="_index"></el-checkbox>
+							<template v-else>
+								<el-checkbox v-model="form[_item.name]" :label="_item.label"
+									v-for="(_item, _index) in item.options.items" :key="_index"></el-checkbox>
 							</template>
 						</template>
 						<!-- checkboxGroup -->
-						<template v-else-if="item.component=='checkboxGroup'" >
+						<template v-else-if="item.component == 'checkboxGroup'">
 							<el-checkbox-group v-model="form[item.name]">
-								<el-checkbox v-for="_item in item.options.items" :key="_item.value" :label="_item.value">{{_item.label}}</el-checkbox>
+								<el-checkbox v-for="_item in item.options.items" :key="_item.value"
+									:label="_item.value">{{ _item.label }}</el-checkbox>
 							</el-checkbox-group>
 						</template>
 						<!-- upload -->
-						<template v-else-if="item.component=='upload'" >
+						<template v-else-if="item.component == 'upload'">
 							<el-col v-for="(_item, _index) in item.options.items" :key="_index">
 								<el-form-item :prop="_item.name">
 									<sc-upload v-model="form[_item.name]" :title="_item.label"></sc-upload>
@@ -50,58 +56,75 @@
 							</el-col>
 						</template>
 						<!-- switch -->
-						<template v-else-if="item.component=='switch'" >
+						<template v-else-if="item.component == 'switch'">
 							<el-switch v-model="form[item.name]" />
 						</template>
 						<!-- select -->
-						<template v-else-if="item.component=='select'" >
-							<el-select v-model="form[item.name]" :multiple="item.options.multiple" :placeholder="item.options.placeholder" clearable filterable style="width: 100%;">
-								<el-option v-for="option in item.options.items" :key="option.value" :label="option.label" :value="option.value"></el-option>
+						<template v-else-if="item.component == 'select'">
+							<el-select v-model="form[item.name]" :multiple="item.options.multiple"
+								:placeholder="item.options.placeholder" clearable filterable style="width: 100%;">
+								<el-option v-for="option in item.options.items" :key="option.value"
+									:label="option.label" :value="option.value"></el-option>
 							</el-select>
 						</template>
 						<!-- cascader -->
-						<template v-else-if="item.component=='cascader'" >
-							<el-cascader v-model="form[item.name]" :options="item.options.items" clearable></el-cascader>
+						<template v-else-if="item.component == 'cascader'">
+							<el-cascader v-model="form[item.name]" :options="item.options.items"
+								clearable></el-cascader>
 						</template>
 						<!-- date -->
-						<template v-else-if="item.component=='date'" >
-							<el-date-picker v-model="form[item.name]" :type="item.options.type" :shortcuts="item.options.shortcuts" :default-time="item.options.defaultTime" :value-format="item.options.valueFormat" :placeholder="item.options.placeholder || '璇烽�夋嫨'"></el-date-picker>
+						<template v-else-if="item.component == 'date'">
+							<el-date-picker v-model="form[item.name]" :type="item.options.type"
+								:shortcuts="item.options.shortcuts" :default-time="item.options.defaultTime"
+								:value-format="item.options.valueFormat"
+								:placeholder="item.options.placeholder || '璇烽�夋嫨'"></el-date-picker>
 						</template>
 						<!-- number -->
-						<template v-else-if="item.component=='number'" >
+						<template v-else-if="item.component == 'number'">
 							<el-input-number v-model="form[item.name]" controls-position="right"></el-input-number>
 						</template>
 						<!-- radio -->
-						<template v-else-if="item.component=='radio'" >
+						<template v-else-if="item.component == 'radio'">
 							<el-radio-group v-model="form[item.name]">
-								<el-radio v-for="_item in item.options.items" :key="_item.value" :label="_item.value">{{_item.label}}</el-radio>
+								<el-radio v-for="_item in item.options.items" :key="_item.value" :label="_item.value">{{
+									_item.label }}</el-radio>
 							</el-radio-group>
 						</template>
 						<!-- color -->
-						<template v-else-if="item.component=='color'" >
+						<template v-else-if="item.component == 'color'">
 							<el-color-picker v-model="form[item.name]" />
 						</template>
 						<!-- rate -->
-						<template v-else-if="item.component=='rate'" >
+						<template v-else-if="item.component == 'rate'">
 							<el-rate style="margin-top: 6px;" v-model="form[item.name]"></el-rate>
 						</template>
 						<!-- slider -->
-						<template v-else-if="item.component=='slider'" >
+						<template v-else-if="item.component == 'slider'">
 							<el-slider v-model="form[item.name]" :marks="item.options.marks"></el-slider>
 						</template>
 						<!-- tableselect -->
-						<template v-else-if="item.component=='tableselect'" >
+						<template v-else-if="item.component == 'tableselect'">
 							<tableselect-render v-model="form[item.name]" :item="item"></tableselect-render>
 						</template>
 						<!-- editor -->
-						<template v-else-if="item.component=='editor'" >
+						<template v-else-if="item.component == 'editor'">
 							<sc-editor v-model="form[item.name]" placeholder="璇疯緭鍏�" :height="400"></sc-editor>
+						</template>
+						<template v-else-if="item.component == 'el-tree-select'">
+							<el-tree-select v-model="form[item.name]" :data="item.options.data"
+								:multiple="item.options.multiple" show-checkbox default-expand-all style="width: 100%"
+								:props="{
+									label: 'title',
+									id: 'id',
+									...item.options.props
+								}" node-key="id">
+							</el-tree-select>
 						</template>
 						<!-- noComponent -->
 						<template v-else>
-							<el-tag type="danger">[{{item.component}}] Component not found</el-tag>
+							<el-tag type="danger">[{{ item.component }}] Component not found</el-tag>
 						</template>
-						<div v-if="item.message" class="el-form-item-msg">{{item.message}}</div>
+						<div v-if="item.message" class="el-form-item-msg">{{ item.message }}</div>
 					</el-form-item>
 				</el-col>
 			</template>
@@ -117,156 +140,155 @@
 </template>
 
 <script>
-	import http from "@/utils/request"
+import http from "@/utils/request"
 
-	import { defineAsyncComponent } from 'vue'
-	const tableselectRender = defineAsyncComponent(() => import('./items/tableselect'))
-	const scEditor = defineAsyncComponent(() => import('@/components/scEditor'))
+import { defineAsyncComponent } from 'vue'
+const tableselectRender = defineAsyncComponent(() => import('./items/tableselect'))
+const scEditor = defineAsyncComponent(() => import('@/components/scEditor'))
 
-	export default {
-		props: {
-			modelValue: { type: Object, default: () => {} },
-			config: { type: Object, default: () => {} },
-			loading: { type: Boolean, default: false },
-		},
-		components: {
-			tableselectRender,
-			scEditor
-		},
-		data() {
-			return {
-				form: {},
-				renderLoading: false
+export default {
+	props: {
+		modelValue: { type: Object, default: () => { } },
+		config: { type: Object, default: () => { } },
+		loading: { type: Boolean, default: false },
+	},
+	components: {
+		tableselectRender,
+		scEditor
+	},
+	data() {
+		return {
+			form: {},
+			renderLoading: false
+		}
+	},
+	watch: {
+		modelValue() {
+			if (this.hasConfig) {
+				this.deepMerge(this.form, this.modelValue)
 			}
 		},
-		watch:{
-			modelValue(){
-				if(this.hasConfig){
-					this.deepMerge(this.form, this.modelValue)
-				}
-			},
-			config(){
-				this.render()
-			},
-			form:{
-				handler(val){
-					this.$emit("update:modelValue", val)
-				},
-				deep: true
-			}
+		config() {
+			this.render()
 		},
-		computed: {
-			hasConfig(){
-				return Object.keys(this.config).length>0
+		form: {
+			handler(val) {
+				this.$emit("update:modelValue", val)
 			},
-			hasValue(){
-				return Object.keys(this.modelValue).length>0
-			}
+			deep: true
+		}
+	},
+	computed: {
+		hasConfig() {
+			return Object.keys(this.config).length > 0
 		},
-		created() {
+		hasValue() {
+			return Object.keys(this.modelValue).length > 0
+		}
+	},
+	created() {
 
-		},
-		mounted() {
-			if(this.hasConfig){
-				this.render()
-			}
-		},
-		methods: {
-			//鏋勫缓form瀵硅薄
-			render() {
-				this.config.formItems.forEach((item) => {
-					if(item.component == 'checkbox'){
-						if(item.name){
-							const value = {}
-							item.options.items.forEach((option) => {
-								 value[option.name] = option.value
-							})
-							this.form[item.name] = value
-						}else{
-							item.options.items.forEach((option) => {
-								 this.form[option.name] = option.value
-							})
-						}
-					}else if(item.component == 'upload'){
-						if(item.name){
-							const value = {}
-							item.options.items.forEach((option) => {
-								 value[option.name] = option.value
-							})
-							this.form[item.name] = value
-						}else{
-							item.options.items.forEach((option) => {
-								 this.form[option.name] = option.value
-							})
-						}
-					}else{
-						this.form[item.name] = item.value
-					}
-				})
-				if(this.hasValue){
-					this.form = this.deepMerge(this.form, this.modelValue)
-				}
-				this.getData()
-			},
-			//澶勭悊杩滅▼閫夐」鏁版嵁
-			getData() {
-				this.renderLoading = true
-				var remoteData = []
-				this.config.formItems.forEach((item) => {
-					if(item.options && item.options.remote){
-						var req = http.get(item.options.remote.api, item.options.remote.data).then(res=>{
-							item.options.items = res.data
+	},
+	mounted() {
+		if (this.hasConfig) {
+			this.render()
+		}
+	},
+	methods: {
+		//鏋勫缓form瀵硅薄
+		render() {
+			this.config.formItems.forEach((item) => {
+				if (item.component == 'checkbox') {
+					if (item.name) {
+						const value = {}
+						item.options.items.forEach((option) => {
+							value[option.name] = option.value
 						})
-						remoteData.push(req)
+						this.form[item.name] = value
+					} else {
+						item.options.items.forEach((option) => {
+							this.form[option.name] = option.value
+						})
 					}
-				})
-				Promise.all(remoteData).then(()=>{
-					this.renderLoading = false
-				})
-			},
-			//鍚堝苟娣辩粨鏋勫璞�
-			deepMerge(obj1, obj2) {
-				let key;
-				for (key in obj2) {
-					obj1[key] = obj1[key] && obj1[key].toString() === "[object Object]" && (obj2[key] && obj2[key].toString() === "[object Object]") ? this.deepMerge(obj1[key], obj2[key]) : (obj1[key] = obj2[key])
+				} else if (item.component == 'upload') {
+					if (item.name) {
+						const value = {}
+						item.options.items.forEach((option) => {
+							value[option.name] = option.value
+						})
+						this.form[item.name] = value
+					} else {
+						item.options.items.forEach((option) => {
+							this.form[option.name] = option.value
+						})
+					}
+				} else {
+					this.form[item.name] = item.value
 				}
-				return obj1
-				//return JSON.parse(JSON.stringify(obj1))
-			},
-			//澶勭悊鍔ㄦ�侀殣钘�
-			hideHandle(item){
-				if(item.hideHandle){
-					const exp = eval(item.hideHandle.replace(/\$/g,"this.form"))
-					return exp
-				}
-				return false
-			},
-			//澶勭悊鍔ㄦ�佸繀濉�
-			rulesHandle(item){
-				if(item.requiredHandle){
-					const exp = eval(item.requiredHandle.replace(/\$/g,"this.form"))
-					var requiredRule = item.rules.find(t => 'required' in t)
-					requiredRule.required = exp
-				}
-				return item.rules
-			},
-			//鏁版嵁楠岃瘉
-			validate(valid, obj){
-				return this.$refs.form.validate(valid, obj)
-			},
-			scrollToField(prop){
-				return this.$refs.form.scrollToField(prop)
-			},
-			resetFields(){
-				return this.$refs.form.resetFields()
-			},
-			//鎻愪氦
-			submit(){
-				this.$emit("submit", this.form)
+			})
+			if (this.hasValue) {
+				this.form = this.deepMerge(this.form, this.modelValue)
 			}
+			this.getData()
+		},
+		//澶勭悊杩滅▼閫夐」鏁版嵁
+		getData() {
+			this.renderLoading = true
+			var remoteData = []
+			this.config.formItems.forEach((item) => {
+				if (item.options && item.options.remote) {
+					var req = http.get(item.options.remote.api, item.options.remote.data).then(res => {
+						item.options.items = res.data
+					})
+					remoteData.push(req)
+				}
+			})
+			Promise.all(remoteData).then(() => {
+				this.renderLoading = false
+			})
+		},
+		//鍚堝苟娣辩粨鏋勫璞�
+		deepMerge(obj1, obj2) {
+			let key;
+			for (key in obj2) {
+				obj1[key] = obj1[key] && obj1[key].toString() === "[object Object]" && (obj2[key] && obj2[key].toString() === "[object Object]") ? this.deepMerge(obj1[key], obj2[key]) : (obj1[key] = obj2[key])
+			}
+			return obj1
+			//return JSON.parse(JSON.stringify(obj1))
+		},
+		//澶勭悊鍔ㄦ�侀殣钘�
+		hideHandle(item) {
+			if (item.hideHandle) {
+				const exp = eval(item.hideHandle.replace(/\$/g, "this.form"))
+				return exp
+			}
+			return false
+		},
+		//澶勭悊鍔ㄦ�佸繀濉�
+		rulesHandle(item) {
+			if (item.requiredHandle) {
+				const exp = eval(item.requiredHandle.replace(/\$/g, "this.form"))
+				var requiredRule = item.rules.find(t => 'required' in t)
+				requiredRule.required = exp
+			}
+			return item.rules
+		},
+		//鏁版嵁楠岃瘉
+		validate(valid, obj) {
+			return this.$refs.form.validate(valid, obj)
+		},
+		scrollToField(prop) {
+			return this.$refs.form.scrollToField(prop)
+		},
+		resetFields() {
+			return this.$refs.form.resetFields()
+		},
+		//鎻愪氦
+		submit() {
+			this.$emit("submit", this.form)
 		}
 	}
+}
 </script>
 
-<style>
-</style>
+<style></style>

--
Gitblit v1.9.3