Browse Source

feat(组件): 修改bug

tangning 2 years ago
parent
commit
fff6cea6de

+ 2 - 2
src/components/StrengthMeter/src/StrengthMeter.vue

@@ -12,9 +12,9 @@
         <slot :name="item" v-bind="data || {}"></slot>
       </template>
     </InputPassword>
-    <div :class="`${prefixCls}-bar`">
+    <!-- <div :class="`${prefixCls}-bar`">
       <div :class="`${prefixCls}-bar--fill`" :data-score="getPasswordStrength"></div>
-    </div>
+    </div> -->
   </div>
 </template>
 

+ 21 - 8
src/layouts/default/header/components/user-dropdown/index.vue

@@ -17,7 +17,7 @@
           icon="ion:document-text-outline"
           v-if="getShowDoc"
         />
-        <MenuDivider v-if="getShowDoc" />
+        <!-- <MenuDivider v-if="getShowDoc" /> -->
         <MenuItem
           v-if="getUseLockPage"
           key="lock"
@@ -32,6 +32,7 @@
       </Menu>
     </template>
   </Dropdown>
+  <SetpaswordModal @register="registerDetail" />
   <LockAction @register="register" />
 </template>
 <script lang="ts">
@@ -46,13 +47,13 @@
   import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';
   import { useI18n } from '/@/hooks/web/useI18n';
   import { useDesign } from '/@/hooks/web/useDesign';
-  import { useModal } from '/@/components/Modal';
-
+  import SetpaswordModal from './setpaswordModal.vue';
   import headerImg from '/@/assets/images/header.jpg';
   import { propTypes } from '/@/utils/propTypes';
   import { openWindow } from '/@/utils';
-
+  import { useModal } from '/@/components/Modal';
   import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
+  import { useMessage } from '/@/hooks/web/useMessage';
 
   type MenuEvent = 'logout' | 'doc' | 'lock';
 
@@ -60,6 +61,7 @@
     name: 'UserDropdown',
     components: {
       Dropdown,
+      SetpaswordModal,
       Menu,
       MenuItem: createAsyncComponent(() => import('./DropMenuItem.vue')),
       MenuDivider: Menu.Divider,
@@ -71,12 +73,14 @@
     setup() {
       const { prefixCls } = useDesign('header-user-dropdown');
       const { t } = useI18n();
+      const [registerDetail, { openModal: openPasswordModal }] = useModal();
       const { getShowDoc, getUseLockPage } = useHeaderSetting();
       const userStore = useUserStore();
-
+      const { createConfirm } = useMessage();
       const getUserInfo = computed(() => {
-        const { realName = '', avatar, desc } = userStore.getUserInfo || {};
-        return { realName, avatar: avatar || headerImg, desc };
+        console.log('realName',userStore.getUserInfo)
+        const { nickName = '', avatar, desc } = userStore.getUserInfo || {};
+        return { realName:nickName, avatar: avatar || headerImg, desc };
       });
 
       const [register, { openModal }] = useModal();
@@ -92,7 +96,15 @@
 
       // open doc
       function openDoc() {
-        openWindow(DOC_URL);
+        createConfirm({
+          iconType: 'warning',
+          title: '警告',
+          content: `此操作将对当前账号修改密码, 修改成功后将会退出当前账号,是否继续?`,
+          onOk: async () => {
+            openPasswordModal(true);
+          },
+        });
+        // openWindow(DOC_URL);
       }
 
       function handleMenuClick(e: { key: MenuEvent }) {
@@ -116,6 +128,7 @@
         handleMenuClick,
         getShowDoc,
         register,
+        registerDetail,
         getUseLockPage,
       };
     },

+ 138 - 0
src/layouts/default/header/components/user-dropdown/setpaswordModal.vue

@@ -0,0 +1,138 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    @ok="handSubmit"
+    :title="t('routes.staff.updateBtn')"
+    @visible-change="handleVisibleChange"
+    @cancel="resetFields"
+  >
+    <div class="pt-3px pr-3px">
+      <BasicForm @register="registerForm" />
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { encodeStr } from '/@/utils/encodeUtil';
+  import { defineComponent, nextTick } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+  import { updatePasswordApi } from '/@/api/staff/list';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { useUserStore } from '/@/store/modules/user';
+
+  const { createMessage } = useMessage();
+
+  export default defineComponent({
+    components: { BasicModal, BasicForm },
+    props: {
+      userData: { type: Object },
+    },
+    setup(props) {
+      const { t } = useI18n();
+      const userStore = useUserStore();
+      const getUserInfo = userStore.getUserInfo;
+      const schemas: FormSchema[] = [
+        {
+          field: 'id',
+          component: 'Input',
+          label: 'id',
+          show: false,
+        },
+        {
+          field: 'oldPassword',
+          component: 'Input',
+          label: '原密码',
+          labelWidth: 120,
+          required: true,
+          colProps: { span: 18 },
+        },
+        {
+          field: 'password',
+          component: 'StrengthMeter',
+          label: '新密码',
+          labelWidth: 120,
+          required: true,
+          rules: [
+            {
+              required: true,
+              // @ts-ignore
+              validator: async (rule, value) => {
+                const regPos = /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$/; // 非中文
+                if (!value) {
+                  return Promise.reject('请输入8-16位数字、字母大小写组合');
+                }
+                if (!regPos.test(value)) {
+                  /* eslint-disable-next-line */
+                  return Promise.reject('请输入8-16位数字、字母大小写组合');
+                }
+                return Promise.resolve();
+              },
+              trigger: 'change',
+            },
+          ],
+          componentProps:{
+            maxLength: 16,
+            minLength: 8,
+            placeholder:"请输入8-16位数字、字母大小写组合"
+          },
+          colProps: { span: 18 },
+        },
+      ];
+
+      const [
+        registerForm,
+        {
+          setFieldsValue,
+          validate,
+          resetFields,
+          // setProps
+        },
+      ] = useForm({
+        labelWidth: 120,
+        schemas,
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+
+      const [register, { closeModal }] = useModalInner((data) => {
+        data && onDataReceive(data);
+      });
+
+      function onDataReceive(data) {
+        setFieldsValue({
+          id: data.id,
+        });
+      }
+      async function handSubmit() {
+        console.log('getUserInfo',getUserInfo)
+        const { id } = getUserInfo
+        const { password,oldPassword } = await validate();
+        await updatePasswordApi({ 
+          id, 
+          newPassword: encodeStr(window.btoa(password)),
+          oldPassword: encodeStr(window.btoa(oldPassword)),
+         });
+        createMessage.success(t('common.optSuccess'));
+        resetFields();
+        userStore.confirmLoginOut();
+      }
+      function handleVisibleChange(v) {
+        v && props.userData && nextTick(() => onDataReceive(props.userData));
+      }
+
+      return {
+        handSubmit,
+        register,
+        t,
+        schemas,
+        registerForm,
+        handleVisibleChange,
+        resetFields,
+      };
+    },
+  });
+</script>

+ 2 - 3
src/layouts/default/header/index.vue

@@ -41,15 +41,14 @@
 
       <FullScreen v-if="getShowFullScreen" :class="`${prefixCls}-action__item fullscreen-item`" />
 
-      <AppLocalePicker
+      <!-- <AppLocalePicker
         v-if="getShowLocalePicker"
         :reload="true"
         :showText="false"
         :class="`${prefixCls}-action__item`"
-      />
+      /> -->
 
       <UserDropDown :theme="getHeaderTheme" />
-
       <SettingDrawer v-if="getShowSetting" :class="`${prefixCls}-action__item`" />
     </div>
   </Header>

+ 1 - 1
src/locales/lang/zh-CN/layout.ts

@@ -2,7 +2,7 @@ export default {
   footer: { onlinePreview: '在线预览', onlineDocument: '在线文档' },
   header: {
     // user dropdown
-    dropdownItemDoc: '文档',
+    dropdownItemDoc: '修改密码',
     dropdownItemLoginOut: '退出系统',
 
     // tooltip

+ 3 - 3
src/locales/lang/zh-CN/routes/staff.ts

@@ -1,14 +1,14 @@
 export default {
   deptName: '所属公司',
-  userName: '员工名称',
+  userName: '姓名',
   nickName: '员工昵称',
   setpaswd: '修改密码',
   mobile: '手机',
   permList: '权益',
-  userId: '号',
+  userId: '号',
   createTime: '创建时间',
   updateTime: '修改时间',
-  staffList: '员工列表',
+  staffList: '账号列表',
   updateBtn: '修改密码',
   password: '修改密码',
   roleType: {

+ 35 - 0
src/utils/index.ts

@@ -89,3 +89,38 @@ export const withInstall = <T>(component: T, alias?: string) => {
   };
   return component as T & Plugin;
 };
+
+// 禁止输入表情包
+export const isEmojiCharacter = (substring) => {
+  for ( var i = 0; i < substring.length; i++) {
+      var hs = substring.charCodeAt(i);
+      if (0xd800 <= hs && hs <= 0xdbff) {
+          if (substring.length > 1) {
+              var ls = substring.charCodeAt(i + 1);
+              var uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
+              if (0x1d000 <= uc && uc <= 0x1f77f) {
+                  return true;
+              }
+          }
+      } else if (substring.length > 1) {
+          var ls = substring.charCodeAt(i + 1);
+          if (ls == 0x20e3) {
+              return true;
+          }
+      } else {
+          if (0x2100 <= hs && hs <= 0x27ff) {
+              return true;
+          } else if (0x2B05 <= hs && hs <= 0x2b07) {
+              return true;
+          } else if (0x2934 <= hs && hs <= 0x2935) {
+              return true;
+          } else if (0x3297 <= hs && hs <= 0x3299) {
+              return true;
+          } else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030
+              || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b
+              || hs == 0x2b50) {
+              return true;
+          }
+      }
+  }
+}

+ 1 - 1
src/views/customer/index.vue

@@ -8,7 +8,7 @@
             v-if="getCheckPerm('company-add')"
             @click="
               () => {
-                openInfoModal(true);
+                openInfoModal(true,{});
               }
             "
           >

+ 4 - 3
src/views/customer/modal/InfoModal.vue

@@ -34,7 +34,7 @@
     },
     emits: ['update', 'register'],
     setup(props, { emit }) {
-      const modelRef = ref(null);
+      const modelRef = ref(false);
       const fileFlow = reactive({
         file: null,
       });
@@ -202,9 +202,10 @@
       onMounted(() => {});
       let addListFunc = () => {};
       const [register, { closeModal }] = useModalInner((data) => {
+        console.log('data',data)
         if (data) {
-          title.value ='编辑客户'
-          modelRef.value = data;
+          title.value =data.id?'编辑客户':'新增客户'
+          modelRef.value = data.id?true:false;
           setFieldsValue({
             ...data,
             floorLogo: data.floorLogo ? [data.floorLogo] : [],

+ 2 - 2
src/views/customer/scene.vue

@@ -188,11 +188,11 @@
           dataIndex: 'sceneSize',
           width: 80,
           customRender: ({ record }) => {
-            return h(
+            return (record.sceneSize && record.sceneSize != 0)?h(
               'span',
               { class: 'sceneSize' },
               Math.ceil(record.sceneSize / 1024 / 1024) + 'M',
-            );
+            ):'-';
           },
         },
         {

+ 14 - 8
src/views/device/index.vue

@@ -14,15 +14,15 @@
               {
                 label: '删除',
                 color: 'error',
-                ifShow: getCheckPerm('device-delete') && !Boolean(record.outType),
+                ifShow: getCheckPerm('device-delete') && (!Boolean(record.outType) || Boolean(record.userName)),
                 onClick: handleDelete.bind(null, record),
               },{
                 label: '出库',
-                ifShow: getCheckPerm('device-out') && !record.outType,
+                ifShow: getCheckPerm('device-out') && !Boolean(record.outType),
                 onClick: handleCheckout.bind(null, record),
               },{
                 label: '编辑',
-                ifShow: getCheckPerm('device-update') && Boolean(record.companyName),
+                ifShow: getCheckPerm('device-update') && Boolean(record.outType),
                 onClick: handleEdit.bind(null, record),
               },{
                 label: '解绑',
@@ -136,7 +136,7 @@
               '2':t('routes.product.outType.2'),
               '3':t('routes.product.outType.3'),
             }
-            return typeObj[record.outType]
+            return typeObj[record.outType] || '未出库'
           }
         },
         {
@@ -323,10 +323,16 @@
         });
       }
       async function handleDelete(record: Recordable){
-        const res = await cameraDelete({id:record.id})
-        createMessage.success(t('common.optSuccess'));
-        reload()
-        console.log('res',res)
+        createConfirm({
+          iconType: 'warning',
+          title: () => h('span', '温馨提示'),
+          content: '删除设备后需要重新入库<br/>确定删除吗?',
+          onOk: async () => {
+            await cameraDelete({id:record.id})
+            createMessage.success(t('common.optSuccess'));
+            reload()
+          },
+        });
       }
 
       function deviceLink() {

+ 5 - 2
src/views/invoice/InvoiceModal.vue

@@ -3,7 +3,7 @@
     v-bind="$attrs"
     @register="register"
     title="开票登记"
-    okText="发送"
+    :okText="okText"
     @visible-change="handleVisibleChange"
     @cancel="resetFields"
     @ok="handleSubmit"
@@ -18,7 +18,7 @@
   </BasicModal>
 </template>
 <script lang="ts">
-  import { defineComponent, nextTick, onMounted, reactive } from 'vue';
+  import { defineComponent, nextTick, onMounted, reactive, ref } from 'vue';
   import { BasicModal, useModalInner } from '/@/components/Modal';
   import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
   import { useMessage } from '/@/hooks/web/useMessage';
@@ -39,6 +39,7 @@
         file:null,
         type:2,//2-普通发票,3-专用发票
       })
+      const okText = ref('发送')
       const { createMessage } = useMessage();
       const schemas: FormSchema[] = [
           {
@@ -141,6 +142,7 @@
         resetFields();
         fileFlow.type = data.type
         setFieldsValue(data);
+        okText.value = fileFlow.type == 2?'发送':'确认'
         updateSchema([
           {field: 'shipNum',ifShow:fileFlow.type == 3,},
           {field: 'email',ifShow:fileFlow.type == 2,},
@@ -183,6 +185,7 @@
         handleSubmit,
         addListFunc,
         resetFields,
+        okText,
         t,
       };
     },

+ 6 - 3
src/views/operate/components/new/addModal.vue

@@ -78,8 +78,8 @@
           componentProps: {
             api: uploadApi,
             maxNumber: 1,
-            maxSize: 10,
-            accept: ['jpeg','jpg','png'],
+            maxSize: 1,
+            accept: ['jpg'],
             afterFetch: function (data) {
               console.log('uploadApi',data)
               fileFlow.coverImageUrl = data.url
@@ -162,7 +162,10 @@
           });
         }else{
           title.value = '新增新闻'
-          setFieldsValue(data);
+          setFieldsValue({
+            content:'',
+            ...data,
+          });
         }
       }
       function NewTypeChange(val){

+ 7 - 5
src/views/operate/newsList.vue

@@ -2,7 +2,7 @@
   <div>
     <BasicTable @register="registerTable">
       <template #toolbar>
-        <a-button type="primary" @click="openModal(true)" v-if="getCheckPerm('news-add')"> 新增新闻</a-button>
+        <a-button type="primary" @click="openModal(true,{})" v-if="getCheckPerm('news-add')"> 新增新闻</a-button>
       </template>
         <template #action="{ record }">
           <TableAction
@@ -74,18 +74,19 @@
         {
           title: '新闻标题',
           dataIndex: 'title',
-          ellipsis: false,
+          ellipsis: true,
           width: 250,
         },
         {
           title: '来源',
           dataIndex: 'source',
-          ellipsis: false,
+          ellipsis: true,
           width: 120,
         },
         {
           title: '类型',
           dataIndex: 'newType',
+          ellipsis: true,
           width: 80,
           customRender: ({ record }) => {
             return  record.newType == 1?'链接':'图文'
@@ -93,6 +94,7 @@
         },
         {
           title: '创建人',
+          ellipsis: true,
           dataIndex: 'creater',
           width: 80,
         },
@@ -134,8 +136,8 @@
             }
             return h(Switch, {
               checked: record.display === 1,
-              checkedChildren: '显示',
-              unCheckedChildren: '隐藏',
+              checkedChildren: '',
+              unCheckedChildren: '',
               loading: false,
               onChange: async (checked: boolean) => {
                 record.pendingStatus = true;

+ 11 - 2
src/views/product/firmware/AddModal.vue

@@ -23,6 +23,7 @@
   import { useMessage } from '/@/hooks/web/useMessage';
   import { uploadApi, AddAndUpload } from '/@/api/product/index';
   import { useI18n } from '/@/hooks/web/useI18n';
+  import { isEmojiCharacter } from '/@/utils';
 
   const { t } = useI18n();
   export default defineComponent({
@@ -68,13 +69,17 @@
               required: true,
               // @ts-ignore
               validator: async (rule, value) => {
-                if (!value) {
+                if (!value.trim()) {
                   return Promise.reject(t('common.inputText')+t('routes.product.version'));
                 }
                 if(/.*[\u4e00-\u9fa5]+.*$/.test(value)){
                   /* eslint-disable-next-line */
                   return Promise.reject('不支持中文字符');
                 }
+                if(isEmojiCharacter(value)){
+                  /* eslint-disable-next-line */
+                  return Promise.reject('不支持emoji表情');
+                }
                 return Promise.resolve();
               },
               trigger: 'change',
@@ -103,6 +108,10 @@
                   /* eslint-disable-next-line */
                   return Promise.reject('不支持中文字符');
                 }
+                if(isEmojiCharacter(value)){
+                  /* eslint-disable-next-line */
+                  return Promise.reject('不支持emoji表情');
+                }
                 return Promise.resolve();
               },
               trigger: 'change',
@@ -115,7 +124,7 @@
         {
           field: 'description',
           component: 'InputTextArea',
-          // required: true,
+          required: true,
           label: t('routes.product.description'),
           colProps: {
             span: 24,

+ 12 - 3
src/views/product/firmware/EditModal.vue

@@ -2,7 +2,7 @@
   <BasicModal
     v-bind="$attrs"
     @register="register"
-    title="编辑相机"
+    title="编辑版本"
     @visible-change="handleVisibleChange"
     @cancel="resetFields"
     @ok="handleSubmit"
@@ -23,6 +23,7 @@
   import { useMessage } from '/@/hooks/web/useMessage';
   import { EditAndUpload, } from '/@/api/product/index';
   import { useI18n } from '/@/hooks/web/useI18n';
+  import { isEmojiCharacter } from '/@/utils';
 
   const { t } = useI18n();
   export default defineComponent({
@@ -77,13 +78,17 @@
               required: true,
               // @ts-ignore
               validator: async (rule, value) => {
-                if (!value) {
+                if (!value.trim()) {
                   return Promise.reject(t('common.inputText')+t('routes.product.version'));
                 }
                 if(/.*[\u4e00-\u9fa5]+.*$/.test(value)){
                   /* eslint-disable-next-line */
                   return Promise.reject('不支持中文字符');
                 }
+                if(isEmojiCharacter(value)){
+                  /* eslint-disable-next-line */
+                  return Promise.reject('不支持emoji表情');
+                }
                 return Promise.resolve();
               },
               trigger: 'change',
@@ -119,6 +124,10 @@
                   /* eslint-disable-next-line */
                   return Promise.reject('不支持中文字符');
                 }
+                if(isEmojiCharacter(value)){
+                  /* eslint-disable-next-line */
+                  return Promise.reject('不支持emoji表情');
+                }
                 return Promise.resolve();
               },
               trigger: 'change',
@@ -131,7 +140,7 @@
         {
           field: 'description',
           component: 'InputTextArea',
-          // required: true,
+          required: true,
           label: t('routes.product.description'),
           componentProps: {
             rows:4,

+ 1 - 1
src/views/product/firmware/index.vue

@@ -175,7 +175,7 @@ export default defineComponent({
     };
     const [registerTimeTable, { reload }] = useTable({
       api: CameraList,
-      title: '相机列表',
+      title: '固件列表',
       columns: refundTimeTableSchema,
       useSearchForm: true,
       formConfig: searchForm,

+ 6 - 2
src/views/product/sdk/AddModal.vue

@@ -23,7 +23,7 @@
   import { useMessage } from '/@/hooks/web/useMessage';
   import { uploadApi, SpaceSdkUpload } from '/@/api/product/index';
   import { useI18n } from '/@/hooks/web/useI18n';
-
+  import { isEmojiCharacter } from '/@/utils';
   const { t } = useI18n();
   export default defineComponent({
     components: { BasicModal, BasicForm },
@@ -61,13 +61,17 @@
               required: true,
               // @ts-ignore
               validator: async (rule, value) => {
-                if (!value) {
+                if (!value.trim()) {
                   return Promise.reject(t('common.inputText')+t('routes.product.version'));
                 }
                 if(/.*[\u4e00-\u9fa5]+.*$/.test(value)){
                   /* eslint-disable-next-line */
                   return Promise.reject('不支持中文字符');
                 }
+                if(isEmojiCharacter(value)){
+                  /* eslint-disable-next-line */
+                  return Promise.reject('不支持emoji表情');
+                }
                 return Promise.resolve();
               },
               trigger: 'change',

+ 6 - 1
src/views/product/sdk/EditModal.vue

@@ -29,6 +29,7 @@
   import { useMessage } from '/@/hooks/web/useMessage';
   import { useI18n } from '/@/hooks/web/useI18n';
   import { uploadApi, SpaceSdkUpdate } from '/@/api/product/index';
+  import { isEmojiCharacter } from '/@/utils';
 
   const { t } = useI18n();
   export default defineComponent({
@@ -90,13 +91,17 @@
               required: true,
               // @ts-ignore
               validator: async (rule, value) => {
-                if (!value) {
+                if (!value.trim()) {
                   return Promise.reject(t('common.inputText')+t('routes.product.version'));
                 }
                 if(/.*[\u4e00-\u9fa5]+.*$/.test(value)){
                   /* eslint-disable-next-line */
                   return Promise.reject('不支持中文字符');
                 }
+                if(isEmojiCharacter(value)){
+                  /* eslint-disable-next-line */
+                  return Promise.reject('不支持emoji表情');
+                }
                 return Promise.resolve();
               },
               trigger: 'change',

+ 2 - 2
src/views/productOperation/cameraScene.vue

@@ -183,11 +183,11 @@
           dataIndex: 'sceneSize',
           width: 80,
           customRender: ({ record }) => {
-            return h(
+            return (record.sceneSize && record.sceneSize != 0)?h(
               'span',
               { class: 'sceneSize' },
               Math.ceil(record.sceneSize / 1024 / 1024) + 'M',
-            );
+            ):'-';
           },
         },
         {

+ 59 - 10
src/views/staff/detailsModal.vue

@@ -50,7 +50,7 @@
           component: 'Input',
           label: '姓名',
           colProps: {
-            span: 18,
+            span: 20,
           },
           componentProps: {
             maxLength: 15,
@@ -63,11 +63,11 @@
                 var reg_tel = /^[a-zA-Z\u4e00-\u9fa5]+$/;
                 // var reg = /\S+@\S+\.\S+/;
                 if (!value) {
-                  return Promise.reject('请输入员工名称');
+                  return Promise.reject('请输入姓名');
                 }
                 if (!reg_tel.test(value)) {
                   /* eslint-disable-next-line */
-                  return Promise.reject('请输入正确的员工名称');
+                  return Promise.reject('请输入正确的姓名');
                 }
                 return Promise.resolve();
               },
@@ -84,7 +84,7 @@
             validateTrigger: 'blur',
           },
           colProps: {
-            span: 18,
+            span: 20,
           },
           defaultValue: 8,
           componentProps: {
@@ -103,19 +103,64 @@
           label: '账号',
           required: true,
           colProps: {
-            span: 18,
+            span: 20,
           },
           componentProps:{
+            placeholder:"请输入字母或数字组合",
             autoComplete:'off',
-          }
+            maxLength: 15,
+          },
+          rules: [
+            {
+              required: true,
+              // @ts-ignore
+              validator: async (rule, value) => {
+                console.log('value',value)
+                const regPos = /^[\da-z]+$/i; // 非中文
+                if (!value) {
+                  return Promise.reject('请输入字母或数字组合');
+                }
+                if (!regPos.test(value)) {
+                  /* eslint-disable-next-line */
+                  return Promise.reject('请输入字母或数字组合');
+                }
+                return Promise.resolve();
+              },
+              trigger: 'change',
+            },
+          ],
         },
         {
           field: 'password',
           component: 'StrengthMeter',
           label: '密码',
           required: true,
-          colProps: { span: 18 },
+          colProps: {
+            span: 20,
+          },
+          rules: [
+            {
+              required: true,
+              // @ts-ignore
+              validator: async (rule, value) => {
+                console.log('value',value)
+                const regPos = /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$/; // 非中文
+                if (!value) {
+                  return Promise.reject('请输入8-16位数字、字母大小写组合');
+                }
+                if (!regPos.test(value)) {
+                  /* eslint-disable-next-line */
+                  return Promise.reject('请输入8-16位数字、字母大小写组合');
+                }
+                return Promise.resolve();
+              },
+              trigger: 'change',
+            },
+          ],
           componentProps:{
+            placeholder:"请输入8-16位数字、字母大小写组合",
+            maxLength: 16,
+            minLength: 8,
             autoComplete:'off',
           }
         },
@@ -126,7 +171,7 @@
           show: false,
         },
       ];
-      const title = ref('新 增');
+      const title = ref('新增账号');
       const { createMessage } = useMessage();
       const [registerForm, { setFieldsValue, validate, updateSchema, resetFields }] = useForm({
         labelWidth: 120,
@@ -152,7 +197,7 @@
             field: 'roleId',
             component: 'ApiSelect',
             componentProps: {
-              disabled: data.roleId == 2 ? false : data.id ? true : false,
+              // disabled: data.roleId == 2 ? false : data.id ? true : false,
               api: getRoleListByParam,
               labelField: 'roleName',
               valueField: 'id',
@@ -169,6 +214,10 @@
             },
           },
           {
+            field: 'userName',
+            ifShow:data.id ? false:true,
+          },
+          {
             field: 'password',
             ifShow:data.id ? false:true,
           },
@@ -188,7 +237,7 @@
             },
           },
         ];
-        title.value = data.id ? '编辑' : '新增';
+        title.value = data.id ? '编辑账号' : '新增账号';
         updateSchema(setSchema);
       }
       function companyIdChange(companyId) {

+ 4 - 4
src/views/staff/list.vue

@@ -6,7 +6,7 @@
           type="primary"
           @click="handleCreate"
            v-if="getCheckPerm('sysuser-add')"
-          >新增</a-button
+          >新增账号</a-button
         >
       </template>
       <template #role="{ record }">
@@ -189,7 +189,7 @@ import { Switch } from 'ant-design-vue';
         labelWidth: 100,
         schemas: [
           {
-            field: 'staffName',
+            field: 'nickName',
             label: t('routes.staff.userName'),
             component: 'Input',
             componentProps: {
@@ -201,8 +201,8 @@ import { Switch } from 'ant-design-vue';
             },
           },
           {
-            field: 'staffPhone',
-            label: t('common.mobile'),
+            field: 'userName',
+            label: '账号',
             component: 'Input',
             componentProps: {
               maxLength: 15,

+ 24 - 0
src/views/staff/setpaswordModal.vue

@@ -43,6 +43,30 @@
           label: t('routes.staff.password'),
           labelWidth: 120,
           required: true,
+          rules: [
+            {
+              required: true,
+              // @ts-ignore
+              validator: async (rule, value) => {
+                console.log('value',value)
+                const regPos = /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$/; // 非中文
+                if (!value) {
+                  return Promise.reject('请输入8-16位数字、字母大小写组合');
+                }
+                if (!regPos.test(value)) {
+                  /* eslint-disable-next-line */
+                  return Promise.reject('请输入8-16位数字、字母大小写组合');
+                }
+                return Promise.resolve();
+              },
+              trigger: 'change',
+            },
+          ],
+          componentProps:{
+            placeholder:"请输入8-16位数字、字母大小写组合",
+            maxLength: 16,
+            minLength: 8,
+          },
           colProps: { span: 18 },
         },
       ];

+ 34 - 4
src/views/sys/login/useLogin.ts

@@ -42,13 +42,25 @@ export function useFormRules(formData?: Recordable) {
   const { t } = useI18n();
 
   const getAccountFormRule = computed(() => createRule(t('sys.login.accountPlaceholder')));
-  const getPasswordFormRule = computed(() => createRule(t('sys.login.passwordPlaceholder')));
   const getSmsFormRule = computed(() => createRule(t('sys.login.smsPlaceholder')));
   const getMobileFormRule = computed(() => createRule(t('sys.login.mobilePlaceholder')));
 
   const validatePolicy = async (_: RuleObject, value: boolean) => {
     return !value ? Promise.reject(t('sys.login.policyPlaceholder')) : Promise.resolve();
   };
+  const getPasswordFormRule = (value) => {
+    return async (_: RuleObject, value: string) => {
+      if (!value) {
+        return Promise.reject(t('sys.login.passwordPlaceholder'));
+      }
+      const regPos = /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$/; // 非中文
+      if (!regPos.test(value)) {
+        /* eslint-disable-next-line */
+        return Promise.reject('请输入8-16位数字、字母大小写组合');
+      }
+      return Promise.resolve();
+    };
+  };
 
   const validateConfirmPassword = (password: string) => {
     return async (_: RuleObject, value: string) => {
@@ -64,7 +76,7 @@ export function useFormRules(formData?: Recordable) {
 
   const getFormRules = computed((): { [k: string]: ValidationRule | ValidationRule[] } => {
     const accountFormRule = unref(getAccountFormRule);
-    const passwordFormRule = unref(getPasswordFormRule);
+    // const passwordFormRule = unref(getPasswordFormRule);
     const smsFormRule = unref(getSmsFormRule);
     const mobileFormRule = unref(getMobileFormRule);
 
@@ -77,7 +89,23 @@ export function useFormRules(formData?: Recordable) {
       case LoginStateEnum.REGISTER:
         return {
           account: accountFormRule,
-          password: passwordFormRule,
+          password: [{
+            required: true,
+            trigger: 'change',
+            // @ts-ignore
+            validator: async (rule, value) => {
+              console.log('value',value)
+              const regPos = /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$/; // 非中文
+              if (!value) {
+                return Promise.reject('请输入8-16位数字、字母大小写组合');
+              }
+              if (!regPos.test(value)) {
+                /* eslint-disable-next-line */
+                return Promise.reject('请输入8-16位数字、字母大小写组合');
+              }
+              return Promise.resolve();
+            },
+          }],
           confirmPassword: [
             { validator: validateConfirmPassword(formData?.password), trigger: 'change' },
           ],
@@ -100,7 +128,9 @@ export function useFormRules(formData?: Recordable) {
       default:
         return {
           account: accountFormRule,
-          password: passwordFormRule,
+          password: [
+            { validator: getPasswordFormRule(formData?.password), trigger: 'change' },
+          ],
         };
     }
   });