zhangwei
2025-08-04 2801f5c8ceb1b7ddb77e79d757160c5cb89ff067
个人资料更改
10个文件已修改
2个文件已删除
1311 ■■■■■ 已修改文件
src/App.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/mine.ts 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/modules/user.ts 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/types.ts 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/auth.ts 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/item/component/editDialog.vue 307 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/item/index.vue 461 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mine/index.vue 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/register/registernav.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/dept/form.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/dept/utils/hook.tsx 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/dept/utils/rule.ts 217 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/App.vue
@@ -29,5 +29,10 @@
import { useUserStoreHook } from "@/store/modules/user";
onMounted(() => {
  useUserStoreHook().getRoleList();
  if (useUserStoreHook().nowRole.code) {
    useUserStoreHook().changeLogoInExRule({
      ruleCode: useUserStoreHook().nowRole.code
    });
  }
});
</script>
src/api/mine.ts
@@ -8,10 +8,10 @@
import { http } from "@/utils/http";
import { baseUrlApi } from "./util";
import type { Result } from "./types";
import type { ResponseEnterprise } from "@/utils/auth";
// 获取个人中心数据
export const cusExtendInfo = (data?: object) => {
  return http.request<Result>(
  return http.request<ResponseEnterprise>(
    "post",
    baseUrlApi("/api/customer/cusExtendInfo"),
    {
@@ -22,7 +22,11 @@
// 修改个人中心数据
export const changeCusExtend = (data?: object) => {
  return http.request("post", baseUrlApi("/api/customer/changeCusExtend"), {
    data
  });
  return http.request<Result>(
    "post",
    baseUrlApi("/api/customer/changeCusExtend"),
    {
      data
    }
  );
};
src/store/modules/user.ts
@@ -17,6 +17,7 @@
import { useMultiTagsStoreHook } from "./multiTags";
import {
  type DataInfo,
  type ResponseEnterprise,
  setToken,
  setRoleListInfo,
  setNowRole,
@@ -26,6 +27,7 @@
} from "@/utils/auth";
import { exRole } from "@/api/register/index";
import { cusExtendInfo } from "@/api/mine";
import type { nowRoleType } from "@/store/types";
export const useUserStore = defineStore("pure-user", {
  state: (): userType => ({
@@ -47,7 +49,7 @@
    // 企业资料
    enterpriseInfo:
      storageLocal().getItem<DataInfo<number>>("enterpriseInfo") ?? {},
    nowRole: storageLocal().getItem<DataInfo<number>>("nowRole") ?? {},
    nowRole: storageLocal().getItem<nowRoleType>("nowRole") ?? {},
    rolesList: storageLocal().getItem<DataInfo<number>>("rolesList") ?? []
  }),
  actions: {
@@ -68,7 +70,7 @@
      this.exRoles = exRoles;
    },
    /** 存储角色当前角色 */
    SET_NOW_ROLE(nowRole: object) {
    SET_NOW_ROLE(nowRole: nowRoleType) {
      this.nowRole = nowRole;
    },
    /** 存储角色列表 */
@@ -153,12 +155,12 @@
      });
    },
    async getCusExtendInfo() {
      return new Promise<LoginResult>((resolve, reject) => {
      return new Promise<ResponseEnterprise>((resolve, reject) => {
        cusExtendInfo()
          .then(data => {
            data.result.username = data.result.enterpriseName;
            setEnterpriseInfo(data.result);
            if (data?.code == 200) {
              setEnterpriseInfo(data.result);
              data.result.username = data.result?.enterpriseName;
              resolve(data);
            }
          })
src/store/types.ts
@@ -36,6 +36,12 @@
  hiddenSideBar: boolean;
};
export type nowRoleType = {
  code: string;
  name: string;
  hasFlsh: boolean;
};
export type userType = {
  avatar?: string;
  username?: string;
@@ -45,6 +51,6 @@
  isRemembered?: boolean;
  loginDay?: number;
  enterpriseInfo: object;
  nowRole: object;
  nowRole: nowRoleType;
  rolesList: object;
};
src/utils/auth.ts
@@ -1,6 +1,7 @@
import Cookies from "js-cookie";
import { useUserStoreHook } from "@/store/modules/user";
import { storageLocal, isString, isIncludeAllChildren } from "@pureadmin/utils";
import type { nowRoleType } from "@/store/types";
export interface DataInfo<T> {
  /** token */
@@ -19,6 +20,130 @@
  exRoles?: Array<string>;
  /** 当前登录用户的按钮级别权限 */
  permissions?: Array<string>;
}
/**
 * AdminResult_CusExtendDto,全局返回结果
 */
export interface ResponseEnterprise {
  /**
   * 状态码
   */
  code?: number;
  /**
   * 附加数据
   */
  extras?: null;
  /**
   * 错误信息
   */
  message?: null | string;
  result?: CusExtendDto;
  /**
   * 时间
   */
  time?: Date;
  /**
   * 类型success、warning、error
   */
  type?: null | string;
}
/**
 * CusExtendDto,用户角色资料
 */
export interface CusExtendDto {
  /**
   * 企业银行账号
   */
  bankAccount?: null | string;
  /**
   * 企业开户行
   */
  bankName?: null | string;
  /**
   * 营业执照文件路径
   */
  businessLicense?: null | string;
  /**
   * 企业邮箱
   */
  enterpriseEmail?: null | string;
  /**
   * 企业名称
   */
  enterpriseName?: null | string;
  /**
   * 企业联系电话
   */
  enterprisePhone?: null | string;
  /**
   * 企业类型 从企业类型中选择 来源企业类型
   */
  enterpriseType?: null | string;
  /**
   * 企业成立时间
   */
  establishmentTime?: Date;
  /**
   * 主键
   */
  id?: number | null;
  /**
   * 法定代表人身份证文件路径
   */
  legalRepresentativeIdCard?: null | string;
  /**
   * 法定代表人身份证号码
   */
  legalRepresentativeIdNumber?: null | string;
  /**
   * 法定代表人姓名
   */
  legalRepresentativeName?: null | string;
  /**
   * 法定代表人联系电话
   */
  legalRepresentativePhone?: null | string;
  /**
   * 企业主营业务
   */
  mainBusiness?: null | string;
  /**
   * 业务经办人身份证文件路径或标识(上传后存储信息)
   */
  operatorIdCard?: null | string;
  /**
   * 业务经办人身份证号码
   */
  operatorIdNumber?: null | string;
  /**
   * 业务经办人姓名
   */
  operatorName?: null | string;
  /**
   * 业务经办人联系电话
   */
  operatorPhone?: null | string;
  /**
   * 注册资金(单位:万元 )
   */
  registeredCapital?: null | string;
  /**
   * 企业住所(下拉选择,需结合实际可选值,先字符串接收 )
   */
  residence?: null | string;
  /**
   * 交易主体 代码 同角色代码
   */
  transactionCode: string;
  /**
   * 交易主体名称
   */
  transactionName?: null | string;
  /**
   * 统一社会信用代码
   */
  unifiedSocialCreditCode?: null | string;
}
export const userKey = "user-info";
@@ -115,7 +240,7 @@
  }
}
export function setEnterpriseInfo(data: DataInfo<Date>) {
export function setEnterpriseInfo(data: CusExtendDto) {
  useUserStoreHook().SET_ENTERPRISEINFO(data);
  useUserStoreHook().SET_USERNAME(data.enterpriseName);
  storageLocal().setItem("enterpriseInfo", data);
@@ -124,12 +249,12 @@
  storageLocal().setItem(userKey, obj);
}
export function setRoleListInfo(data: DataInfo<Date>) {
export function setRoleListInfo(data: DataInfo<string>) {
  useUserStoreHook().SET_ROLES_LIST(data);
  storageLocal().setItem("rolesList", data);
}
export function setNowRole(data: DataInfo<Date>) {
export function setNowRole(data: nowRoleType) {
  const list = storageLocal().getItem<DataInfo<number>>(userKey)?.exRoles ?? [];
  if (list.length > 0) {
    const obj = list.find(item => {
src/views/item/component/editDialog.vue
File was deleted
src/views/item/index.vue
File was deleted
src/views/mine/index.vue
@@ -4,25 +4,23 @@
import { useUserStoreHook } from "@/store/modules/user";
import type { FormInstance, FormRules, UploadProps } from "element-plus";
import { cloneDeep } from "@pureadmin/utils";
import { onMounted, reactive, ref, watch } from "vue";
import { onMounted, reactive, ref, watch, computed, onBeforeUpdate } from "vue";
import { getToken } from "@/utils/auth";
const { route } = useNav();
import { baseUrlApi } from "@/api/util";
import { cusExtendInfo, changeCusExtend } from "@/api/mine";
import { Edit } from "@element-plus/icons-vue";
import { enterpriseTypes } from "@/api/register/index";
import {
  addDialog,
  closeDialog,
  updateDialog,
  closeAllDialog
} from "@/components/ReDialog";
const ruleFormRef = ref<FormInstance>();
const isLoading = ref(false);
const showDialog = ref(false);
const nowRole = ref({});
const nowRole = computed(() => {
  return useUserStoreHook()?.nowRole;
});
const userInfo = computed(() => {
  let obj = useUserStoreHook().enterpriseInfo;
  return obj;
});
const state = reactive({
  userInfo: useUserStoreHook().enterpriseInfo,
  headers: {
@@ -40,7 +38,7 @@
    // 交易主体代码(同角色代码,不可空,最小长度为1)
    transactionCode: "", // string,必填
    // 交易主体名称
    transactionName: null, // string,可空
    transactionName: "", // string,可空
    // 营业执照文件路径
    businessLicense: null, // string,可空
    // 企业名称
@@ -186,24 +184,28 @@
  expirySeconds: 60, // 验证码过期时间
  phoneSeconds: 0, // 手机验证码倒计时
  roleList: [],
  showDialog: false
  showDialog: false,
  srcList: []
});
onMounted(async () => {
  state.ruleForm = cloneDeep(state.userInfo);
  state.ruleForm.enterpriseType = state.ruleForm.enterpriseType.split(",");
  nowRole.value = useUserStoreHook()?.nowRole;
  console.log(nowRole.value);
  // nowRole.value = useUserStoreHook()?.nowRole;
  if (nowRole.value) {
    state.ruleForm.transactionCode = nowRole.value.code;
    state.userInfo.transactionName = nowRole.value.name;
    // state.userInfo.transactionName = nowRole.value.name;
  } else {
    state.ruleForm.transactionCode = route.query.code;
    state.userInfo.enterpriseTypeName = route.query.name;
  }
  let restypes = await enterpriseTypes();
  state.enterpriseList = restypes?.result;
});
const showPreview = ref(false);
const showImg = (name: string | number) => {
  showPreview.value = true;
  state.srcList = [state.ruleForm[name]];
};
const isLeaf = data => {
  data.forEach(item => {
    if (!item.child) {
@@ -223,24 +225,24 @@
  }
};
const showImg = name => {
  addDialog({
    width: "40%",
    title: "查看营业执照",
    contentRenderer: () => <img src={state.userInfo[name]} />, // jsx 语法 (注意在.vue文件启用jsx语法,需要在script开启lang="tsx")
    closeCallBack: ({ options, args }) => {
      // options.props 是响应式的
      // const { formInline } = options.props as FormProps;
      // const text = `姓名:${formInline.user} 城市:${formInline.region}`;
      if (args?.command === "cancel") {
        // 您点击了取消按钮
        // active.value -= 1;
      } else if (args?.command === "sure") {
      } else {
      }
    }
  });
};
// const showImg = name => {
//   addDialog({
//     width: "40%",
//     title: "查看营业执照",
//     contentRenderer: () => <img src={state.userInfo[name]} />, // jsx 语法 (注意在.vue文件启用jsx语法,需要在script开启lang="tsx")
//     closeCallBack: ({ options, args }) => {
//       // options.props 是响应式的
//       // const { formInline } = options.props as FormProps;
//       // const text = `姓名:${formInline.user} 城市:${formInline.region}`;
//       if (args?.command === "cancel") {
//         // 您点击了取消按钮
//         // active.value -= 1;
//       } else if (args?.command === "sure") {
//       } else {
//       }
//     }
//   });
// };
const handleAvatarSuccess: UploadProps["onSuccess"] = (
  response,
  uploadFile
@@ -321,7 +323,9 @@
  let res = await changeCusExtend(obj);
  if (res.code == "200") {
    showDialog.value = false;
    await useUserStoreHook().getCusExtendInfo();
    await useUserStoreHook().changeLogoInExRule({
      ruleCode: useUserStoreHook().nowRole.code
    });
    message("修改成功!", {
      type: "success"
    });
@@ -338,7 +342,13 @@
<template>
  <div>
    <el-descriptions class="margin-top" title="" :column="3" border>
    <el-descriptions
      v-if="state.userInfo.enterpriseName"
      class="margin-top"
      title=""
      :column="3"
      border
    >
      <!-- <template #extra>
      <el-button type="primary">Operation</el-button>
    </template> -->
@@ -346,14 +356,15 @@
        <template #label>
          <div class="cell-item">交易主体</div>
        </template>
        {{ state.userInfo.transactionName }}
        <el-tag v-if="!nowRole.hasFlsh" type="danger">资料审核中 </el-tag>
        {{ nowRole?.name }}
        <el-tag v-if="nowRole?.hasFlsh" type="success">审核已通过 </el-tag>
        <el-tag v-else type="danger">资料审核中 </el-tag>
      </el-descriptions-item>
      <el-descriptions-item>
        <template #label>
          <div class="cell-item">企业名称</div>
        </template>
        {{ state.userInfo.enterpriseName }}
        {{ userInfo.enterpriseName }}
        <span @click="showImg('businessLicense')">
          <el-link type="primary" underline>查看营业执照</el-link>
@@ -363,62 +374,62 @@
        <template #label>
          <div class="cell-item">统一社会信用代码</div>
        </template>
        {{ state.userInfo.unifiedSocialCreditCode }}
        {{ userInfo.unifiedSocialCreditCode }}
      </el-descriptions-item>
      <el-descriptions-item>
        <template #label>
          <div class="cell-item">注册资金</div>
        </template>
        {{ state.userInfo.registeredCapital }}
        {{ userInfo.registeredCapital }}
      </el-descriptions-item>
      <el-descriptions-item :span="2">
        <template #label>
          <div class="cell-item">企业类型</div>
        </template>
        {{ state.userInfo.enterpriseType }}
        {{ userInfo.enterpriseType }}
      </el-descriptions-item>
      <el-descriptions-item>
        <template #label>
          <div class="cell-item">住所地</div>
        </template>
        {{ state.userInfo.residence }}
        {{ userInfo.residence }}
      </el-descriptions-item>
      <el-descriptions-item>
        <template #label>
          <div class="cell-item">联系电话</div>
        </template>
        {{ state.userInfo.legalRepresentativePhone }}
        {{ userInfo.legalRepresentativePhone }}
      </el-descriptions-item>
      <el-descriptions-item>
        <template #label>
          <div class="cell-item">成立时间</div>
        </template>
        {{ state.userInfo.establishmentTime }}
        {{ userInfo.establishmentTime }}
      </el-descriptions-item>
      <el-descriptions-item :span="2">
        <template #label>
          <div class="cell-item">电子邮箱</div>
        </template>
        {{ state.userInfo.enterpriseEmail }}
        {{ userInfo.enterpriseEmail }}
      </el-descriptions-item>
      <el-descriptions-item :span="3" label-width="100">
        <template #label>
          <div class="cell-item">主营业务</div>
        </template>
        {{ state.userInfo.mainBusiness }}
        {{ userInfo.mainBusiness }}
      </el-descriptions-item>
      <el-descriptions-item>
        <template #label>
          <div class="cell-item">法定代表人</div>
        </template>
        {{ state.userInfo.legalRepresentativeName }}
        {{ userInfo.legalRepresentativeName }}
      </el-descriptions-item>
      <el-descriptions-item>
        <template #label>
          <div class="cell-item">身份证</div>
        </template>
        {{ state.userInfo.legalRepresentativeIdNumber }}
        {{ userInfo.legalRepresentativeIdNumber }}
        <span @click="showImg('legalRepresentativeIdCard')">
          <el-link type="primary" underline>查看身份证</el-link>
        </span>
@@ -427,19 +438,19 @@
        <template #label>
          <div class="cell-item">联系电话</div>
        </template>
        {{ state.userInfo.legalRepresentativePhone }}
        {{ userInfo.legalRepresentativePhone }}
      </el-descriptions-item>
      <el-descriptions-item>
        <template #label>
          <div class="cell-item">业务经办人</div>
        </template>
        {{ state.userInfo.operatorName }}
        {{ userInfo.operatorName }}
      </el-descriptions-item>
      <el-descriptions-item>
        <template #label>
          <div class="cell-item">身份证</div>
        </template>
        {{ state.userInfo.operatorIdNumber }}
        {{ userInfo.operatorIdNumber }}
        <span style="margin-right: auto" @click="showImg('operatorIdCard')">
          <el-link type="primary" underline>查看身份证</el-link>
        </span>
@@ -448,19 +459,19 @@
        <template #label>
          <div class="cell-item">联系电话</div>
        </template>
        {{ state.userInfo.operatorPhone }}
        {{ userInfo.operatorPhone }}
      </el-descriptions-item>
      <el-descriptions-item>
        <template #label>
          <div class="cell-item">开户银行</div>
        </template>
        {{ state.userInfo.bankName }}
        {{ userInfo.bankName }}
      </el-descriptions-item>
      <el-descriptions-item>
        <template #label>
          <div class="cell-item">银行账号</div>
        </template>
        {{ state.userInfo.bankAccount }}
        {{ userInfo.bankAccount }}
      </el-descriptions-item>
    </el-descriptions>
    <div class="m-5">
@@ -761,6 +772,12 @@
        </span>
      </template>
    </el-dialog>
    <el-image-viewer
      v-if="showPreview"
      :url-list="state.srcList"
      show-progress
      @close="showPreview = false"
    />
  </div>
</template>
src/views/register/registernav.vue
@@ -608,7 +608,7 @@
  roleList: []
});
const toWelcome = () => {
  router.replace("welcome");
  router.replace("mine");
};
// 页面初始化
onMounted(async () => {
@@ -703,7 +703,7 @@
    await useUserStoreHook().changeLogoInExRule({
      ruleCode: state.ruleForm.transactionCode
    });
    await useUserStoreHook().getCusExtendInfo();
    // await useUserStoreHook().getCusExtendInfo();
    active.value = 3;
  } else {
    message(res.message, {
src/views/system/dept/form.vue
@@ -113,7 +113,7 @@
        </el-form-item>
      </re-col>
      <re-col :value="6" :xs="24" :sm="24">
        <el-form-item label="采购方式">
        <el-form-item label="采购方式" prop="caigoufangshi">
          <el-select
            v-model="newFormInline.caigoufangshi"
            placeholder="请选择采购方式"
@@ -351,7 +351,7 @@
        </el-form-item>
      </re-col>
      <re-col :value="6" :xs="24" :sm="24">
        <el-form-item label="联系人人" prop="dailiLianxiren">
        <el-form-item label="联系人" prop="dailiLianxiren">
          <el-input
            v-model="newFormInline.dailiLianxiren"
            clearable
src/views/system/dept/utils/hook.tsx
@@ -231,8 +231,8 @@
          toubiaobaozhengjin: row?.toubiaobaozhengjin ?? null, // 投标保证金(可选)
          lianhetitoubiao: row?.lianhetitoubiao ?? null, // 联合体投标(可选)
          kaibiaofangshi: row?.kaibiaofangshi ?? null, // 开标方式(可选)
          shifoufenbao: row?.shifoufenbao ?? false, // 是否分包(可选)
          shifoutuisongxuanchuan: row?.shifoutuisongxuanchuan ?? true, // 是否推送宣传(可选)
          shifoufenbao: row?.shifoufenbao ?? "false", // 是否分包(可选)
          shifoutuisongxuanchuan: row?.shifoutuisongxuanchuan ?? "true", // 是否推送宣传(可选)
          caigourenmingcheng: row?.caigourenmingcheng ?? null, // 采购人名称(可选)
          xingzhengquyu: row?.xingzhengquyu.split(",") ?? [], // 行政区域(可选)
          xingzhengquyuName: row?.xingzhengquyuName ?? null, // 行政区域名称(可选)
@@ -258,9 +258,10 @@
      draggable: true,
      fullscreen: deviceDetection(),
      fullscreenIcon: true,
      sureBtnLoading: true,
      closeOnClickModal: false,
      contentRenderer: () => h(editForm, { ref: formRef, formInline: null }),
      beforeSure: (done, { options }) => {
      beforeSure: (done, { options, closeLoading }) => {
        const FormRef = formRef.value.getRef();
        const curData = cloneDeep(options.props.formInline as FormItemProps);
        async function chores() {
@@ -279,14 +280,14 @@
            done(); // 关闭弹框
            onSearch(); // 刷新表格数据
          } else {
            closeLoading();
            message(res.message, {
              type: "error"
            });
          }
        }
        FormRef.validate(valid => {
        FormRef.validate((valid, obj) => {
          if (valid) {
            console.log("curData", curData);
            // 表单规则校验通过
            if (title === "新增") {
              // 实际开发先调用新增接口,再进行下面操作
@@ -295,6 +296,16 @@
              // 实际开发先调用修改接口,再进行下面操作
              chores();
            }
          } else {
            closeLoading();
            const fail = [];
            for (const key in obj) {
              fail.push(obj[key][0].message);
            }
            message(fail[0], {
              type: "warning"
            });
            return false;
          }
        });
      }
src/views/system/dept/utils/rule.ts
@@ -4,8 +4,207 @@
/** 自定义表单规则校验 */
export const formRules = reactive(<FormRules>{
  name: [{ required: true, message: "部门名称为必填项", trigger: "blur" }],
  phone: [
  // 项目编号(必填)
  projectCode: [
    { required: true, message: "请输入项目编号", trigger: "blur" },
    { max: 50, message: "项目编号长度不能超过50个字符", trigger: "blur" }
  ],
  // 项目名称(必填)
  projectName: [
    { required: true, message: "请输入项目名称", trigger: "blur" },
    { max: 200, message: "项目名称长度不能超过200个字符", trigger: "blur" }
  ],
  // 行业品目(可选,但选择时需校验)
  hangyepinmu: [
    { required: true, message: "请选择行业品目", trigger: "blur" },
    { type: "string", message: "行业品目格式不正确", trigger: "change" }
  ],
  // 采购方式(可选,但选择时需校验)
  caigoufangshi: [
    { required: true, message: "请选择采购方式", trigger: "blur" },
    { type: "string", message: "采购方式格式不正确", trigger: "change" }
  ],
  // 采购预算(可选,需为数字)
  caigouyusuan: [
    { required: true, message: "请输入采购预算", trigger: "blur" },
    { type: "number", message: "采购预算必须为数字", trigger: "blur" },
    { min: 0, message: "采购预算不能为负数", trigger: "blur" }
  ],
  // 定标规则(可选)
  dingbiaoguize: [
    { required: true, message: "请选择定标规则", trigger: "blur" },
    { type: "string", message: "定标规则格式不正确", trigger: "change" }
  ],
  // 报名费(可选,需为数字)
  baomingfei: [
    { required: true, message: "请输入报名费", trigger: "blur" },
    { type: "number", message: "报名费必须为数字", trigger: "blur" },
    { min: 0, message: "报名费不能为负数", trigger: "blur" }
  ],
  // 投标保证金(可选,需为数字)
  toubiaobaozhengjin: [
    { required: true, message: "请输入投标保证金费", trigger: "blur" },
    { type: "number", message: "投标保证金必须为数字", trigger: "blur" },
    { min: 0, message: "投标保证金不能为负数", trigger: "blur" }
  ],
  // 联合体投标(可选,需为布尔值)
  lianhetitoubiao: [
    { required: true, message: "请选择联合体投标", trigger: "blur" }
    // { type: "boolean", message: "联合体投标必须为布尔值", trigger: "change" }
  ],
  // 开标方式(可选)
  kaibiaofangshi: [
    { required: true, message: "请选择开标方式", trigger: "blur" }
    // { type: "string", message: "开标方式格式不正确", trigger: "change" }
  ],
  // 是否分包(可选,需为布尔值)
  shifoufenbao: [
    { required: true }
    // { type: "boolean", message: "是否分包必须为布尔值", trigger: "change" }
  ],
  // 是否推送宣传(可选,需为布尔值)
  shifoutuisongxuanchuan: [
    { required: true }
    // { type: "boolean", message: "是否推送宣传必须为布尔值", trigger: "change" }
  ],
  // 采购人名称(可选)
  caigourenmingcheng: [
    { required: true, message: "请输入采购人名称", trigger: "blur" },
    { max: 100, message: "采购人名称长度不能超过100个字符", trigger: "blur" }
  ],
  // 行政区域(可选,需为数组)
  xingzhengquyu: [
    { required: true, message: "请选择行政区域", trigger: "blur" },
    { type: "array", message: "行政区域必须为数组格式", trigger: "change" }
  ],
  // 行政区域名称(可选)
  xingzhengquyuName: [
    { required: false },
    { max: 100, message: "行政区域名称长度不能超过100个字符", trigger: "blur" }
  ],
  // 机构代码(可选,验证格式)
  jigoudaima: [
    { required: true, message: "请输入机构代码", trigger: "blur" },
    {
      pattern: /^[A-Z0-9]{8}-[A-Z0-9]{1}$/,
      message: "机构代码格式不正确",
      trigger: "blur"
    }
  ],
  // 代码类型(可选)
  daimaleixing: [
    { required: true, message: "请选择代码类型", trigger: "blur" },
    { type: "string", message: "代码类型格式不正确", trigger: "change" }
  ],
  // 联系人(可选)
  lianxiren: [
    { required: true, message: "请输入联系人", trigger: "blur" },
    { max: 50, message: "联系人姓名长度不能超过50个字符", trigger: "blur" }
  ],
  // 联系电话(可选,验证手机号格式)
  lianxidianhua: [
    { required: true, message: "请输入联系人电话", trigger: "blur" },
    {
      pattern: /^1[3-9]\d{9}$/,
      message: "请输入正确的手机号码",
      trigger: "blur"
    }
  ],
  // 通信地址(可选)
  tongxindizhi: [
    { required: true, message: "请输入通信地址", trigger: "blur" },
    { max: 200, message: "通信地址长度不能超过200个字符", trigger: "blur" }
  ],
  // 电子邮件(可选,验证邮箱格式)
  dianziyoujian: [
    { required: true, message: "请输入电子邮件", trigger: "blur" },
    { type: "email", message: "请输入正确的邮箱地址", trigger: "blur" }
  ],
  // 项目经办人(可选)
  xiangmujingbanren: [
    { required: true, message: "请输入项目经办人", trigger: "blur" },
    { max: 50, message: "项目经办人姓名长度不能超过50个字符", trigger: "blur" }
  ],
  // 职务(可选)
  zhiwu: [
    { required: true, message: "请输入职务", trigger: "blur" },
    { max: 50, message: "职务名称长度不能超过50个字符", trigger: "blur" }
  ],
  // 经办人电话(可选,验证手机号格式)
  jingbanrendianhua: [
    { required: true, message: "请输入经办人电话", trigger: "blur" },
    {
      pattern: /^1[3-9]\d{9}$/,
      message: "请输入正确的手机号码",
      trigger: "blur"
    }
  ],
  // 代理机构名称(可选)
  dailijigoumingcheng: [
    { required: true, message: "请输入代理机构名称", trigger: "blur" },
    { max: 100, message: "代理机构名称长度不能超过100个字符", trigger: "blur" }
  ],
  // 代理机构联系人(可选)
  dailiLianxiren: [
    { required: true, message: "请输入联系人", trigger: "blur" },
    {
      max: 50,
      message: "联系人姓名长度不能超过50个字符",
      trigger: "blur"
    }
  ],
  // 代理机构联系电话(可选,验证手机号格式)
  dailiLianxidianhua: [
    { required: true, message: "请输入联系电话", trigger: "blur" },
    {
      pattern: /^1[3-9]\d{9}$/,
      message: "请输入正确的手机号码",
      trigger: "blur"
    }
  ],
  // 代理机构电子邮件(可选,验证邮箱格式)
  dailiDianziyoujian: [
    { required: true, message: "请输入电子邮件", trigger: "blur" },
    { type: "email", message: "请输入正确的邮箱地址", trigger: "blur" },
    {
      validator: (rule, value, callback) => {
        if (value === "") {
          callback();
        } else if (!isEmail(value)) {
          callback(new Error("请输入正确的邮箱格式"));
        } else {
          callback();
        }
      },
      trigger: "blur"
    }
  ],
  // 代理机构通信地址(可选)
  dailiTongxindizhi: [
    { required: true, message: "请输入通信地址", trigger: "blur" },
    {
      max: 200,
      message: "通信地址长度不能超过200个字符",
      trigger: "blur"
    }
  ],
  // 代理机构项目经理(可选)
  dailiXiangmujingli: [
    { required: true, message: "请输入项目经理", trigger: "blur" },
    {
      max: 50,
      message: "项目经理姓名长度不能超过50个字符",
      trigger: "blur"
    }
  ],
  // 代理机构项目经理联系电话(可选,验证手机号格式)
  dailijingliLianxidianhua: [
    { required: true, message: "请输入联系电话", trigger: "blur" },
    {
      pattern: /^1[3-9]\d{9}$/,
      message: "请输入正确的手机号码",
      trigger: "blur"
    },
    {
      validator: (rule, value, callback) => {
        if (value === "") {
@@ -18,20 +217,6 @@
      },
      trigger: "blur"
      // trigger: "click" // 如果想在点击确定按钮时触发这个校验,trigger 设置成 click 即可
    }
  ],
  email: [
    {
      validator: (rule, value, callback) => {
        if (value === "") {
          callback();
        } else if (!isEmail(value)) {
          callback(new Error("请输入正确的邮箱格式"));
        } else {
          callback();
        }
      },
      trigger: "blur"
    }
  ]
});