Ver código fonte

重构工艺管理

zhuangyunsheng 1 mês atrás
pai
commit
8255d38767

+ 3 - 3
src/api/model/workmanship.js

@@ -2,9 +2,9 @@ import config from "@/config"
 import http from "@/utils/request"
 
 export default {
-    process: {
+    stage: {
 		name: "工序管理",
-        url: `${config.API_URL}/mes/processManage`,
+        url: `${config.API_URL}/mes/processStage`,
         
         get: async function (data = {}) {
 			return await http.post(`${this.url}/getPage`, data);
@@ -23,7 +23,7 @@ export default {
         }
     },
 
-    route: {
+    line: {
 		name: "工艺路线",
         url: `${config.API_URL}/mes/processRoute`,
         

+ 2 - 2
src/components/scFormTable/detail.vue

@@ -11,7 +11,7 @@
 
 <script setup>
 import XEUtils from "xe-utils";
-import processTable from "@/views/workmanship/process/index";
+import stageTable from "@/views/process/stage/index";
 import materialTable from "@/views/basic/material/index";
 import customerTable from "@/views/basic/customer/index";
 
@@ -24,7 +24,7 @@ const props = defineProps({
 });
 
 const compDic = reactive({
-    stage: { title: "工序选择", compName: processTable },
+    stage: { title: "工序选择", compName: stageTable },
     material: { title: "产品选择", compName: materialTable },
     customer: { title: "客户选择", compName: customerTable },
 });

+ 1 - 1
src/utils/basicDic.js

@@ -64,7 +64,7 @@ export const materialDic = {
     }
 }
 
-export const workmanshipDic = {
+export const processDic = {
     category: {
         preparation: "准备工序",
         processing: "加工工序",

+ 4 - 4
src/views/workmanship/line/desc.vue

@@ -8,7 +8,7 @@
                         <el-descriptions-item label="工艺路线编号" :span="ismobile ? 3 : 1" label-align="right" min-width="120">{{ descData.code }}</el-descriptions-item>
                         <el-descriptions-item label="添加时间" :span="ismobile ? 3 : 1" label-align="right" min-width="120">{{ descData.createTime }}</el-descriptions-item>
                         <el-descriptions-item label="工艺路线状态" :span="ismobile ? 3 : 1" label-align="right" min-width="120">{{ XEUtils.get(statusDic, descData.status, descData.status) }}</el-descriptions-item>
-                        <el-descriptions-item label="时间单位" :span="ismobile ? 3 : 1" label-align="right">{{ XEUtils.get(workmanshipDic.timeUnit, descData.timeUnit, descData.timeUnit) }}</el-descriptions-item>
+                        <el-descriptions-item label="时间单位" :span="ismobile ? 3 : 1" label-align="right">{{ XEUtils.get(processDic.timeUnit, descData.timeUnit, descData.timeUnit) }}</el-descriptions-item>
                         <el-descriptions-item label="版本号" :span="ismobile ? 3 : 1" label-align="right">{{ descData.version }}</el-descriptions-item>
                         <el-descriptions-item label="适用产品" :span="3" label-align="right">所有产品</el-descriptions-item>
                         <el-descriptions-item label="概要" :span="3" label-align="right">{{ descData.remark }}</el-descriptions-item>
@@ -18,7 +18,7 @@
                     </el-descriptions>
                 </el-collapse-item>
 
-                <el-collapse-item title="加工路线" name="route">
+                <el-collapse-item title="加工路线" name="line">
                     <sc-form-table v-model="descData.detailList" v-bind="options"></sc-form-table>
                 </el-collapse-item>
 
@@ -31,7 +31,7 @@
 
 <script setup>
 import XEUtils from "xe-utils";
-import { statusDic, workmanshipDic } from "@/utils/basicDic";
+import { statusDic, processDic } from "@/utils/basicDic";
 import { tableOptions } from "./main";
 import scUploadFile from "@/components/scUpload/file";
 
@@ -48,7 +48,7 @@ const options = reactive({
     mergeFooterItems: [{ row: 0, col: 0, rowspan: 1, colspan: 4 }]
 });
 
-const activeNames = ref(["basic", "route", "plan"]);
+const activeNames = ref(["basic", "line", "plan"]);
 const descData = ref({
     id: null,
     parentId: null,

+ 5 - 5
src/views/workmanship/line/detail.vue

@@ -17,7 +17,7 @@
                         <el-col :md="8" :xs="24">
                             <el-form-item label="时间单位">
                                 <el-radio-group v-model="form.timeUnit">
-                                    <el-radio v-for="(label, key) in workmanshipDic.timeUnit" :key="key" :label="label" :value="key"></el-radio>
+                                    <el-radio v-for="(label, key) in processDic.timeUnit" :key="key" :label="label" :value="key"></el-radio>
                                 </el-radio-group>
                             </el-form-item>
                         </el-col>
@@ -37,7 +37,7 @@
                     </el-row>
                 </el-collapse-item>
 
-                <el-collapse-item title="加工路线" name="route">
+                <el-collapse-item title="加工路线" name="line">
                     <sc-form-table ref="formTableRef" v-model="form.detailList" v-bind="tableOptions"></sc-form-table>
                 </el-collapse-item>
 
@@ -77,7 +77,7 @@
 import XEUtils from "xe-utils";
 
 import API from "@/api";
-import { workmanshipDic } from "@/utils/basicDic";
+import { processDic } from "@/utils/basicDic";
 import { tableOptions } from "./main";
 import scUploadFile from "@/components/scUpload/file";
 
@@ -86,7 +86,7 @@ const visible = ref(false);
 const isSaving = ref(false);
 const isDel = ref(false);
 
-const activeNames = ref(["basic", "route", "other"]);
+const activeNames = ref(["basic", "line", "other"]);
 const mode = ref("add");
 const titleMap = reactive({
     add: "新增工艺路线",
@@ -155,7 +155,7 @@ const submit = () => {
                 fileList.length > 0 && XEUtils.set(data, "fileList", fileList);
     
                 isSaving.value = true;
-                API.workmanship.route[mode.value](data).then(res => {
+                API.process.line[mode.value](data).then(res => {
                     ElMessage.success("操作成功");
                     isSaving.value = false;
                     isDel.value = false;

+ 1 - 1
src/views/workmanship/line/history.vue

@@ -5,7 +5,7 @@
 </template>
 
 <script setup>
-import dataTable from "@/views/workmanship/line/index";
+import dataTable from "@/views/process/line/index";
 
 const $emit = defineEmits(["closed"]);
 const paramsColums = reactive([]);

+ 15 - 15
src/views/workmanship/line/index.vue

@@ -2,7 +2,7 @@
 	<el-container class="is-vertical">
         <sc-page-header v-if="!hidePageHeader" @add="table_add"></sc-page-header>
 
-        <scTable ref="xGridTable" :apiObj="$API.workmanship.route" :formConfig="formConfig" :paramsColums="paramsColums" :columns="columns" v-bind="options">
+        <scTable ref="xGridTable" :apiObj="$API.process.line" :formConfig="formConfig" :paramsColums="paramsColums" :columns="columns" v-bind="options">
             <template #code_link="{ row }">
                 <vxe-text status="primary" @click="table_detail(row)">{{ row.code }}</vxe-text>
             </template>
@@ -35,8 +35,8 @@
         </scTable>
 	</el-container>
 
-    <process-detail v-if="dialog.detail" ref="processRef" @success="refreshTable" @closed="dialogClose"></process-detail>
-    <process-desc v-if="dialog.desc" ref="processDescRef" @closed="dialog.desc = false"></process-desc>
+    <line-detail v-if="dialog.detail" ref="lineRef" @success="refreshTable" @closed="dialogClose"></line-detail>
+    <line-desc v-if="dialog.desc" ref="lineDescRef" @closed="dialog.desc = false"></line-desc>
     <version-history v-if="dialog.history" ref="historyRef" @closed="dialog.history = false"></version-history>
 </template>
 
@@ -46,10 +46,10 @@ import XEUtils from "xe-utils";
 
 import API from "@/api";
 import TOOL from "@/utils/tool";
-import { statusDic, workmanshipDic } from "@/utils/basicDic";
+import { statusDic, processDic } from "@/utils/basicDic";
 import { mapFormItemInput, mapFormItemSelect, mapFormItemDatePicker } from "@/components/scTable/helper";
-import processDetail from "./detail";
-import processDesc from "./desc";
+import lineDetail from "./detail";
+import lineDesc from "./desc";
 import versionHistory from "./history";
 
 const props = defineProps({
@@ -103,7 +103,7 @@ const columns = reactive([
     { type: "html", field: "name", title: "工艺路线名称", fixed: "left", minWidth: 150, sortable: true },
     { field: "code", title: "工艺路线编号", fixed: "left", minWidth: 150, sortable: true, className: "vxe-table-link-cell", slots: { default: "code_link" } },
     { visible: !props.hideHandler, field: "status", title: "工艺路线状态", minWidth: 120, editRender: { name: "$cell-tag", options: statusDic } },
-    { visible: false, type: "html", field: "timeUnit", title: "时间单位", minWidth: 100, sortable: true, formatter: ({ cellValue }) => XEUtils.get(workmanshipDic.timeUnit, cellValue, cellValue) },
+    { visible: false, type: "html", field: "timeUnit", title: "时间单位", minWidth: 100, sortable: true, formatter: ({ cellValue }) => XEUtils.get(processDic.timeUnit, cellValue, cellValue) },
     { type: "html", field: "", title: "质检方案", minWidth: 160, sortable: true },
     { type: "html", field: "createTime", title: "创建日期", minWidth: 120, sortable: true, formatter: ({ cellValue }) => TOOL.dateFormat(cellValue, "YYYY-MM-DD") || cellValue },
     { type: "html", field: "version", title: "版本号", minWidth: 120, sortable: true, className: "vxe-table-link-cell", slots: { default: "version_link" } },
@@ -115,8 +115,8 @@ const columns = reactive([
 const xGridTable = ref();
 const refreshTable = (mode = "add") => xGridTable.value.searchData(mode);
 
-const processRef = ref();
-const processDescRef = ref();
+const lineRef = ref();
+const lineDescRef = ref();
 const historyRef = ref();
 const dialog = reactive({
     detail: false,
@@ -126,17 +126,17 @@ const dialog = reactive({
 
 const table_add = () => {
     dialog.detail = true;
-    nextTick(() => processRef.value?.open());
+    nextTick(() => lineRef.value?.open());
 }
 
 const table_edit = (row, mode = "edit") => {
     dialog.detail = true;
-    nextTick(() => processRef.value?.setData(row, mode));
+    nextTick(() => lineRef.value?.setData(row, mode));
 }
 
 const table_detail = row => {
     dialog.desc = true;
-    nextTick(() => processDescRef.value?.setData(row));
+    nextTick(() => lineDescRef.value?.setData(row));
 }
 
 const table_history = row => {
@@ -150,7 +150,7 @@ const table_del = ({ id }) => {
         confirmButtonText: "确定",
         cancelButtonText: "取消"
     }).then(() => {
-        API.workmanship.route.del({ id }).then(() => {
+        API.process.line.del({ id }).then(() => {
             ElMessage.success("操作成功");
             refreshTable();
         });
@@ -163,7 +163,7 @@ const table_regrade = ({ id }) => {
         confirmButtonText: "确定",
         cancelButtonText: "取消"
     }).then(() => {
-        API.workmanship.route.regrade({ id }).then(() => {
+        API.process.line.regrade({ id }).then(() => {
             ElMessage.success("操作成功");
             refreshTable();
         });
@@ -179,7 +179,7 @@ const table_change = row => {
         confirmButtonText: "确定",
         cancelButtonText: "取消"
     }).then(() => {
-        API.workmanship.route.edit({ id: row.id, status }).then(() => {
+        API.process.line.edit({ id: row.id, status }).then(() => {
             ElMessage.success("操作成功");
             refreshTable();
         });

+ 2 - 2
src/views/workmanship/line/main.js

@@ -1,6 +1,6 @@
 import XEUtils from "xe-utils";
 import { mapFormItemInput } from "@/components/scTable/helper";
-import { workmanshipDic } from "@/utils/basicDic";
+import { processDic } from "@/utils/basicDic";
 
 export const tableOptions = reactive({
     tableKey: "stage",
@@ -10,7 +10,7 @@ export const tableOptions = reactive({
         { field: "orderNum", title: "加工顺序", fixed: "left", minWidth: 100, footerAlign: "right", dragSort: true, editRender: { name: "VxeNumberInput", props: { min: 0, controlConfig: { enabled: false } } } },
         { field: "name", title: "加工工序", fixed: "left", minWidth: 150 },
         { field: "code", title: "工序编号", fixed: "left", minWidth: 150 },
-        { field: "processType", title: "加工类型", fixed: "left", minWidth: 140, formatter: ({ cellValue }) => XEUtils.get(workmanshipDic.type, cellValue, cellValue) },
+        { field: "processType", title: "加工类型", fixed: "left", minWidth: 140, formatter: ({ cellValue }) => XEUtils.get(processDic.type, cellValue, cellValue) },
         // { field: "", title: "工作中心", minWidth: 150 }, // select 车间
         { field: "readyTimeHour", title: "准备时间", minWidth: 100, editRender: { name: "VxeNumberInput", props: { min: 0, type: "float", controlConfig: { enabled: false } }, defaultValue: 0 } },
         { title:  "定额工时", headerAlign: "center",

+ 5 - 5
src/views/workmanship/process/detail.vue

@@ -17,7 +17,7 @@
                         <el-col :md="8" :xs="24">
                             <el-form-item label="工序分类">
                                 <el-select v-model="form.category" clearable placeholder="请选择工序分类">
-                                    <el-option v-for="(label, key) in workmanshipDic.category" :key="key" :label="label" :value="key" />
+                                    <el-option v-for="(label, key) in processDic.category" :key="key" :label="label" :value="key" />
                                 </el-select>
                             </el-form-item>
                         </el-col>
@@ -34,14 +34,14 @@
                         <el-col :md="8" :xs="24">
                             <el-form-item label="默认加工类型">
                                 <el-radio-group v-model="form.processType">
-                                    <el-radio v-for="(label, key) in workmanshipDic.type" :key="key" :label="label" :value="key"></el-radio>
+                                    <el-radio v-for="(label, key) in processDic.type" :key="key" :label="label" :value="key"></el-radio>
                                 </el-radio-group>
                             </el-form-item>
                         </el-col>
                         <el-col :xs="24">
                             <el-form-item label="工资默认计算方式" label-width="150" required>
                                 <el-radio-group v-model="form.calculateMethod">
-                                    <el-radio v-for="(label, key) in workmanshipDic.calcMethod" :key="key" :label="label" :value="key"></el-radio>
+                                    <el-radio v-for="(label, key) in processDic.calcMethod" :key="key" :label="label" :value="key"></el-radio>
                                 </el-radio-group>
                             </el-form-item>
                         </el-col>
@@ -78,7 +78,7 @@
 import XEUtils from "xe-utils";
 
 import API from "@/api";
-import { workmanshipDic } from "@/utils/basicDic";
+import { processDic } from "@/utils/basicDic";
 import scUploadFile from "@/components/scUpload/file";
 
 const $emit = defineEmits(["success", "closed"]);
@@ -129,7 +129,7 @@ const submit = () => {
             fileList.length > 0 && XEUtils.set(data, "fileList", fileList);
 
             isSaving.value = true;
-            API.workmanship.process[mode.value](data).then(res => {
+            API.process.stage[mode.value](data).then(res => {
                 ElMessage.success("操作成功");
                 isSaving.value = false;
                 isDel.value = false;

+ 16 - 16
src/views/workmanship/process/index.vue

@@ -2,7 +2,7 @@
 	<el-container class="is-vertical">
         <sc-page-header v-if="!selectable" @add="table_add"></sc-page-header>
 
-        <scTable ref="xGridTable" :apiObj="$API.workmanship.process" :formConfig="formConfig" :paramsColums="paramsColums" :columns="columns" v-bind="options">
+        <scTable ref="xGridTable" :apiObj="$API.process.stage" :formConfig="formConfig" :paramsColums="paramsColums" :columns="columns" v-bind="options">
             <template #action="{ row }">
                 <el-button type="primary" link @click="table_edit(row)">
                     <template #icon><sc-iconify icon="ant-design:edit-outlined"></sc-iconify></template>修改
@@ -20,7 +20,7 @@
         </scTable>
 	</el-container>
 
-    <process-detail v-if="dialog" ref="processRef" @success="refreshTable" @closed="dialogClose"></process-detail>
+    <stage-detail v-if="dialog" ref="stageRef" @success="refreshTable" @closed="dialogClose"></stage-detail>
 </template>
 
 <script setup>
@@ -29,9 +29,9 @@ import XEUtils from "xe-utils";
 
 import API from "@/api";
 import TOOL from "@/utils/tool";
-import { statusDic, workmanshipDic } from "@/utils/basicDic";
+import { statusDic, processDic } from "@/utils/basicDic";
 import { mapFormItemInput, mapFormItemSelect, mapFormItemDatePicker } from "@/components/scTable/helper";
-import processDetail from "./detail";
+import stageDetail from "./detail";
 
 const props = defineProps({
     selectable: { type: Boolean, default: false },
@@ -66,7 +66,7 @@ const formConfig = reactive({
         mapFormItemInput("nameLike", "工序名称"),
         mapFormItemInput("codeLike", "工序编号"),
         mapFormItemSelect("status", "工序状态", selectConfig),
-        mapFormItemSelect("category", "工序分类", { ...selectConfig, options: workmanshipDic.category }),
+        mapFormItemSelect("category", "工序分类", { ...selectConfig, options: processDic.category }),
         mapFormItemDatePicker("createTime", "创建日期", daterangeConfig)
     ])
 });
@@ -86,19 +86,19 @@ const columns = computed(() => props.selectable ? [
     { type: props.multiple && "checkbox" || "radio", fixed: "left", width: 40 },
     { type: "html", field: "name", title: "工序名称", fixed: "left", minWidth: 150, sortable: true },
     { type: "html", field: "code", title: "工序编号", fixed: "left", minWidth: 150, sortable: true },
-    { type: "html", field: "category", title: "工序分类", minWidth: 100, sortable: true, formatter: ({ cellValue }) => XEUtils.get(workmanshipDic.category, cellValue, cellValue) },
-    { type: "html", field: "processType", title: "默认加工类型", minWidth: 140, sortable: true, formatter: ({ cellValue }) => XEUtils.get(workmanshipDic.type, cellValue, cellValue) },
-    { type: "html", field: "calculateMethod", title: "工资默认计算方式", minWidth: 140, sortable: true, formatter: ({ cellValue }) => XEUtils.get(workmanshipDic.calcMethod, cellValue, cellValue) }
+    { type: "html", field: "category", title: "工序分类", minWidth: 100, sortable: true, formatter: ({ cellValue }) => XEUtils.get(processDic.category, cellValue, cellValue) },
+    { type: "html", field: "processType", title: "默认加工类型", minWidth: 140, sortable: true, formatter: ({ cellValue }) => XEUtils.get(processDic.type, cellValue, cellValue) },
+    { type: "html", field: "calculateMethod", title: "工资默认计算方式", minWidth: 140, sortable: true, formatter: ({ cellValue }) => XEUtils.get(processDic.calcMethod, cellValue, cellValue) }
 ] : [
     { type: "seq", fixed: "left", width: 60 },
     { type: "html", field: "name", title: "工序名称", fixed: "left", minWidth: 150, sortable: true },
     { type: "html", field: "code", title: "工序编号", fixed: "left", minWidth: 150, sortable: true },
     { field: "status", title: "工序状态", minWidth: 100, editRender: { name: "$cell-tag", options: statusDic } },
-    { type: "html", field: "category", title: "工序分类", minWidth: 100, sortable: true, formatter: ({ cellValue }) => XEUtils.get(workmanshipDic.category, cellValue, cellValue) },
+    { type: "html", field: "category", title: "工序分类", minWidth: 100, sortable: true, formatter: ({ cellValue }) => XEUtils.get(processDic.category, cellValue, cellValue) },
     { type: "html", field: "directorName", title: "工序负责人", minWidth: 120, sortable: true },
     { visible: false, type: "html", field: "directorPhone", title: "联系方式", minWidth: 120, sortable: true },
-    { visible: false, type: "html", field: "processType", title: "默认加工类型", minWidth: 140, sortable: true, formatter: ({ cellValue }) => XEUtils.get(workmanshipDic.type, cellValue, cellValue) },
-    { visible: false, type: "html", field: "calculateMethod", title: "工资默认计算方式", minWidth: 140, sortable: true, formatter: ({ cellValue }) => XEUtils.get(workmanshipDic.calcMethod, cellValue, cellValue) },
+    { visible: false, type: "html", field: "processType", title: "默认加工类型", minWidth: 140, sortable: true, formatter: ({ cellValue }) => XEUtils.get(processDic.type, cellValue, cellValue) },
+    { visible: false, type: "html", field: "calculateMethod", title: "工资默认计算方式", minWidth: 140, sortable: true, formatter: ({ cellValue }) => XEUtils.get(processDic.calcMethod, cellValue, cellValue) },
     { type: "html", field: "createTime", title: "创建日期", minWidth: 120, sortable: true, formatter: ({ cellValue }) => TOOL.dateFormat(cellValue, "YYYY-MM-DD") || cellValue },
     { visible: false, type: "html", field: "remark", title: "概要", minWidth: 300, sortable: true },
     { title: "操作", fixed: "right", width: 220, slots: { default: "action" } }
@@ -108,17 +108,17 @@ const columns = computed(() => props.selectable ? [
 const xGridTable = ref();
 const refreshTable = (mode = "add") => xGridTable.value.searchData(mode);
 
-const processRef = ref();
+const stageRef = ref();
 const dialog = ref(false);
 
 const table_add = () => {
     dialog.value = true;
-    nextTick(() => processRef.value?.open());
+    nextTick(() => stageRef.value?.open());
 }
 
 const table_edit = row => {
     dialog.value = true;
-    nextTick(() => processRef.value?.setData(row));
+    nextTick(() => stageRef.value?.setData(row));
 }
 
 const table_del = ({ id }) => {
@@ -127,7 +127,7 @@ const table_del = ({ id }) => {
         confirmButtonText: "确定",
         cancelButtonText: "取消"
     }).then(() => {
-        API.workmanship.process.del({ id }).then(() => {
+        API.process.stage.del({ id }).then(() => {
             ElMessage.success("操作成功");
             refreshTable();
         });
@@ -143,7 +143,7 @@ const table_change = row => {
         confirmButtonText: "确定",
         cancelButtonText: "取消"
     }).then(() => {
-        API.workmanship.process.edit({ id: row.id, status }).then(() => {
+        API.process.stage.edit({ id: row.id, status }).then(() => {
             ElMessage.success("操作成功");
             refreshTable();
         });

+ 1 - 1
src/views/production/bom/desc.vue

@@ -32,7 +32,7 @@
 import XEUtils from "xe-utils";
 
 import API from "@/api";
-import { statusDic, workmanshipDic } from "@/utils/basicDic";
+import { statusDic } from "@/utils/basicDic";
 import { tableOptions } from "./main";
 
 const $emit = defineEmits(["closed"]);

+ 0 - 1
src/views/production/bom/index.vue

@@ -92,7 +92,6 @@ const paramsColums = reactive([
 ]);
 
 const columns = reactive([
-    { type: "checkbox", fixed: "left", width: 40 },
     { type: "seq", fixed: "left", width: 80 },
     { type: "html", field: "materialCode", title: "产品编码", fixed: "left", minWidth: 150, treeNode: true, headerAlign: "center", align: "left", sortable: true },
     { type: "html", field: "materialName", title: "产品名称", fixed: "left", minWidth: 150, sortable: true },

+ 0 - 1
src/views/sales/order/detail.vue

@@ -98,7 +98,6 @@ import moment from "moment";
 import XEUtils from "xe-utils";
 
 import API from "@/api";
-import { workmanshipDic } from "@/utils/basicDic";
 import { tableOptions, selectOptions } from "./main";
 import scUploadFile from "@/components/scUpload/file";
 

+ 0 - 1
src/views/sales/order/index.vue

@@ -80,7 +80,6 @@ const paramsColums = reactive([
 ]);
 
 const columns = reactive([
-    { type: "checkbox", fixed: "left", width: 40 },
     { type: "seq", fixed: "left", width: 60 },
     { field: "code", title: "单据编号", fixed: "left", minWidth: 150, sortable: true, className: "vxe-table-link-cell", slots: { default: "code_link" } },
     { type: "html", field: "orderDate", title: "单据日期", fixed: "left", minWidth: 120, sortable: true },

+ 17 - 7
src/views/userCenter/index.vue

@@ -38,16 +38,20 @@
                     <el-input v-model="form.nickName" placeholder="请输入用户昵称"></el-input>
                 </el-form-item>
                 <el-form-item label="手机号码" prop="phone">
-                    <el-input v-model="form.phone" placeholder="请输入手机号码"></el-input>
+                    <el-input v-model="form.phone" clearable placeholder="请输入手机号码"></el-input>
                 </el-form-item>
                 <el-form-item label="用户邮箱">
-                    <el-input v-model="form.email" placeholder="请输入用户邮箱"></el-input>
+                    <el-input v-model="form.email" clearable placeholder="请输入用户邮箱"></el-input>
                 </el-form-item>
-                <el-form-item label="用户性别">
-                    <el-radio-group v-model="form.gender">
-                        <el-radio label="男"></el-radio>
-                        <el-radio label="女"></el-radio>
-                    </el-radio-group>
+                <el-form-item>
+                    <template #label>
+                        <vxe-tooltip content="点击选中,再次点击取消"><vxe-icon name="question-circle-fill"></vxe-icon></vxe-tooltip>
+                        用户性别
+                    </template>
+                    <vxe-radio-group v-model="form.gender" :strict="false">
+                        <vxe-radio checked-value="男" content="男"></vxe-radio>
+                        <vxe-radio checked-value="女" content="女"></vxe-radio>
+                    </vxe-radio-group>
                 </el-form-item>
                 <el-form-item>
                     <el-button :loading="isSaving" type="primary" auto-insert-space @click="submit">保存</el-button>
@@ -109,6 +113,12 @@ const submit = () => {
     .el-form .el-form-item {margin-bottom: 0;color: rgba(0, 0, 0, 0.88);}
     .el-form :deep(.el-form-item__label) {display: flex;align-items: center;color: rgba(0, 0, 0, 0.88);}
     .el-form :deep(.el-form-item__label) .sc-iconify-icon {margin-right: 6px;}
+
+    .el-form .el-form-item :deep(.el-form-item__label) {align-items: center;}
+    .el-form .el-form-item .vxe-icon-question-circle-fill {margin-right: .25em;color: var(--el-text-color-regular);}
+    .el-form .vxe-radio {margin-right: 30px;line-height: 32px;font-weight: 500;}
+    .el-form .vxe-radio :deep(.vxe-radio--icon) {font-size: 1.1em;}
+    .el-form .vxe-radio:not(.is--disabled) > :deep(input:focus + .vxe-radio--icon) {color: var(--vxe-ui-font-primary-color);}
 }
 
 .el-card + .el-card {flex: 1;margin-left: 20px;