console
<template>
<div>
<el-form
:model="formData"
:rules="formRules"
label-width="100px"
ref="formData"
>
<el-form-item
v-for="(field, index) in fields"
:key="index"
:label="field.label"
:prop="field.key"
>
<template v-if="field.type === 'select'">
<el-select v-model="formData[field.key]" placeholder="请选择">
<el-option
v-for="(option, optionIndex) in field.options"
:key="optionIndex"
:label="option.label"
:value="option.value"
></el-option>
</el-select>
</template>
<template v-else>
<el-input
v-model="formData[field.key]"
:type="field.type"
:readonly="field.readonly"
:rules="field.rules"
></el-input>
</template>
</el-form-item>
<el-form-item>
<el-button
type="primary"
size="small"
@click="handleSubmit('formData')"
>{{ editing ? "更新" : "添加" }}</el-button
>
</el-form-item>
</el-form>
<el-table :data="dataList" style="width: 100%">
<el-table-column
v-for="(field, index) in fields"
:key="index"
:label="field.label"
:prop="field.key"
></el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button type="primary" @click="handleEdit(scope)">编辑</el-button>
<el-button type="danger" @click="handleDelete(scope)">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
export default {
props: {
entity: {
type: String,
required: true,
},
fields: {
type: Array,
required: true,
},
apiUrl: {
type: String,
required: true,
},
},
data() {
return {
formData: {},
dataList: [],
editing: false,
formRules: {},
};
},
created() {
this.initFormRules();
},
mounted() {},
methods: {
guid() {
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);
}
);
},
handleSubmit(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
if (this.editing) {
this.updateData();
} else {
this.addData();
}
} else {
return false;
}
});
},
addData() {
this.dataList.push({
guid: this.guid(),
...this.formData,
});
this.formData = {};
},
updateData() {
const { guid } = this.formData;
this.dataList.forEach((item, index) => {
if (item.guid === guid) {
this.$set(this.dataList, index, { ...this.formData });
}
});
this.formData = {};
this.editing = false;
},
handleEdit(record) {
this.formData = JSON.parse(JSON.stringify(this.dataList.find((item) => (item.guid === record.row.guid))))
this.editing = true;
},
handleDelete(record) {
const { guid } = record.row;
this.dataList = this.dataList.filter((item) => item.guid !== guid);
this.formData = {};
this.editing = false;
},
fetchData() {
},
initFormRules() {
this.fields.forEach((field) => {
if (field.rules) {
this.formRules[field.key] = field.rules;
}
});
console.log(this.formRules);
},
},
mounted() {
this.fetchData();
},
};
</script>
<template>
<div class="app-container">
<CrudComponent :entity="entity" :fields="fields" :apiUrl="apiUrl" />
</div>
</template>
<script>
import CrudComponent from "../../components/CrudComponent";
export default {
components: {
CrudComponent,
},
data() {
return {
entity: "user",
fields: [
{
label: "姓名",
key: "name",
type: "text",
rules: [{ required: true, message: "请输入姓名", trigger: "blur" }],
},
{ label: "年龄", key: "age", type: "number" },
{ label: "邮箱", key: "email", type: "email" },
{
label: "角色",
key: "role",
type: "select",
options: [
{ label: "管理员", value: "admin" },
{ label: "普通用户", value: "user" },
],
},
],
apiUrl: "/api/users",
};
},
};
</script>
<style scoped lang="scss">
</style>