tangning 1 年之前
父節點
當前提交
4fb4307024

+ 1 - 2
package.json

@@ -40,7 +40,7 @@
     "@vueuse/core": "^6.7.4",
     "@vueuse/shared": "^6.7.4",
     "@zxcvbn-ts/core": "^1.0.0-beta.0",
-    "ant-design-vue": "2.2.8",
+    "ant-design-vue": "3.2.20",
     "axios": "^0.24.0",
     "cropperjs": "^1.5.12",
     "crypto-js": "^4.1.1",
@@ -140,7 +140,6 @@
     "vue-tsc": "^0.28.10"
   },
   "resolutions": {
-    "//": "Used to install imagemin dependencies, because imagemin may not be installed in China. If it is abroad, you can delete it",
     "bin-wrapper": "npm:bin-wrapper-china",
     "rollup": "^2.56.3"
   },

+ 1 - 1
src/api/sys/model/userModel.ts

@@ -4,6 +4,7 @@
 export interface LoginParams {
   username: string;
   password: string;
+  authCode?: string;
 }
 
 export interface RoleInfo {
@@ -42,5 +43,4 @@ export interface GetUserInfoModel {
   desc?: string;
   // 权限
   roleId: number;
-
 }

+ 12 - 4
src/api/sys/user.ts

@@ -4,10 +4,18 @@ import { encodeStr } from '/@/utils/encodeUtil';
 import { ErrorMessageMode } from '/#/axios';
 import type { AppRouteRecordRaw } from '/@/router/types';
 
+// const guid = () => {
+//   return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) {
+//     let r = (Math.random() * 16) | 0,
+//       v = c == "x" ? r : (r & 0x3) | 0x8;
+//     return v.toString(16);
+//   });
+// };
 enum Api {
   // Login = '/basic-api/login',
   Login = '/service/manage/login',
   Logout = '/service/manage/logout',
+  // getCode = '/service/notAuth/getLoginAuthCode',
   GetUserInfo = '/service/manage/sysUser/getInfo',
   GetPermCode = '/service/manage/sysMenu/getButtonByUserId',
 }
@@ -19,11 +27,11 @@ export function loginApi(params: LoginParams, mode: ErrorMessageMode = 'modal')
   return defHttp.post<LoginResultModel>(
     {
       url: Api.Login,
-      params:{
+      params: {
         ...params,
-        userName:params.username,
-        password: encodeStr(window.btoa(params.password))
-    },
+        userName: params.username,
+        password: encodeStr(window.btoa(params.password)),
+      },
     },
     {
       errorMessageMode: mode,

+ 6 - 3
src/components/Table/src/BasicTable.vue

@@ -20,6 +20,7 @@
       :rowClassName="getRowClassName"
       v-show="getEmptyDataIsShowTable"
       @change="handleTableChange"
+      @resizeColumn="handleResizeColumn"
     >
       <template #[item]="data" v-for="item in Object.keys($slots)" :key="item">
         <slot :name="item" v-bind="data || {}"></slot>
@@ -98,7 +99,6 @@
 
       const wrapRef = ref(null);
       const innerPropsRef = ref<Partial<BasicTableProps>>();
-
       const { prefixCls } = useDesign('basic-table');
       const [registerForm, formActions] = useForm();
 
@@ -218,7 +218,6 @@
 
       const { getFormProps, replaceFormSlotKey, getFormSlotKeys, handleSearchInfoChange } =
         useTableForm(getProps, slots, fetch, getLoading);
-
       const getBindValues = computed(() => {
         const dataSource = unref(getDataSourceRef);
         let propsData: Recordable = {
@@ -246,7 +245,7 @@
         propsData = omit(propsData, ['class', 'onChange']);
         return propsData;
       });
-
+      console.log('getFormSlotKeys', attrs, 'getBindValues', getBindValues.value);
       const getWrapperClass = computed(() => {
         const values = unref(getBindValues);
         return [
@@ -332,6 +331,10 @@
         replaceFormSlotKey,
         getFormSlotKeys,
         getWrapperClass,
+        handleResizeColumn: (w, col) => {
+          // col.width = w;
+          setCacheColumnsByField(col.dataIndex, { width: w });
+        },
         columns: getViewColumns,
       };
     },

+ 135 - 6
src/views/productOperation/cameraScene.vue

@@ -190,12 +190,141 @@
       const permissionStore = usePermissionStore();
       const { getCheckPerm } = permissionStore;
       const loading = ref(false);
-      const tableRef = ref<Nullable<TableActionType>>(null);
-      const tableType = ref<Number>(1); //0看看 、1看见、2深时
-      const rowSelection = ref({
-        type: 'checkbox',
-      });
-      const searchFormSs: Partial<FormProps> = {
+      const tableType = ref<Recordable>(1); //0看看 、1看见、2深时
+      const tabList = ref<Array>(['四维看看', '四维看见', '四维深时', '四维双目Lite']);
+      const columns: BasicColumn[] = [
+        {
+          title: '场景标题',
+          dataIndex: 'sceneName',
+          ellipsis: true,
+          slots: { customRender: 'href' },
+          resizable: true,
+          minWidth: 150,
+          width: 150,
+        },
+        {
+          title: '场景码',
+          dataIndex: 'num',
+          ellipsis: true,
+          width: 180,
+        },
+        {
+          title: '拍摄时间',
+          dataIndex: 'createTime',
+          width: 180,
+          customRender: ({ record }) => {
+            return (
+              record.createTime &&
+              h(Time, {
+                value: record.createTime,
+                mode: 'datetime',
+              })
+            );
+          },
+        },
+        {
+          title: '计算完成时间',
+          dataIndex: 'amount',
+          width: 180,
+          customRender: ({ record }) => {
+            return (
+              (record.algorithmTime &&
+                h(Time, {
+                  value: record.algorithmTime,
+                  mode: 'datetime',
+                })) ||
+              '-'
+            );
+          },
+        },
+        {
+          title: 'SN码',
+          dataIndex: 'snCode',
+          width: 180,
+        },
+        {
+          title: '场景大小',
+          dataIndex: 'sceneSize',
+          width: 80,
+          customRender: ({ record }) => {
+            return record.sceneSize && record.sceneSize != 0
+              ? h('span', { class: 'sceneSize' }, Math.ceil(record.sceneSize / 1024 / 1024) + 'M')
+              : '-';
+          },
+        },
+        {
+          title: '是否复制',
+          dataIndex: 'isCopy',
+          width: 80,
+          customRender: ({ record }) => {
+            return record.isCopy ? '是' : '否';
+          },
+        },
+        {
+          title: '复制时间',
+          dataIndex: 'copyTime',
+          width: 180,
+          customRender: ({ record }) => {
+            return record.copyTime
+              ? h(Time, {
+                  value: record.copyTime,
+                  mode: 'datetime',
+                })
+              : '-';
+          },
+        },
+        {
+          title: '人员编号',
+          dataIndex: 'userName',
+          width: 100,
+        },
+        {
+          title: t('routes.staff.userName'),
+          dataIndex: 'nickName',
+          width: 100,
+          customRender: ({ record }) => {
+            return record.nickName || '-';
+          },
+        },
+        {
+          title: '浏览量',
+          dataIndex: 'viewCount',
+          width: 80,
+        },
+        {
+          title: '状态',
+          dataIndex: 'status',
+          width: 80,
+          customRender: ({ record }) => {
+            let str;
+            switch (record.status - 0) {
+              case 0:
+                str = '计算中';
+                break;
+              case 1:
+                str = '计算成功';
+                break;
+              case -2:
+                str = '计算成功';
+                break;
+              case -1:
+                str = '计算失败';
+                break;
+            }
+            return record.payStatus == -2 ? '封存' : str;
+          },
+        },
+        {
+          title: '操作',
+          dataIndex: 'action',
+          slots: { customRender: 'action' },
+          ifShow: true,
+          fixed: 'right',
+          flag: 'ACTION',
+          width: 400,
+        },
+      ];
+      const searchForm: Partial<FormProps> = {
         labelWidth: 100,
         autoSubmitOnEnter: true,
         autoAdvancedLine: 1,

+ 30 - 1
src/views/sys/login/LoginForm.vue

@@ -25,6 +25,20 @@
       />
     </FormItem>
 
+    <FormItem name="sms" class="enter-x">
+      <Input
+        size="large"
+        :maxLength="6"
+        visibilityToggle
+        v-model:value="formData.code"
+        placeholder="验证码"
+      >
+        <template #suffix>
+          <img style="height: 100%; width: auto; position: absolute; right: 0;" :src="codeImg" class="code-img" @click="refer" />
+        </template>
+      </Input>
+    </FormItem>
+
     <ARow class="enter-x">
       <ACol :span="12">
         <FormItem>
@@ -113,6 +127,20 @@
 
   const { setLoginState, getLoginState } = useLoginState();
   const { getFormRules } = useFormRules();
+  console.log(getFormRules, 'getFormRules')
+  // 图片验证码
+  const guid = () => {
+    return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) {
+      let r = (Math.random() * 16) | 0,
+        v = c == "x" ? r : (r & 0x3) | 0x8;
+      return v.toString(16);
+    });
+  };
+  const baseURL = ''
+  let getCode = '/service/manage/getLoginAuthCode'
+  const imgKey = ref(guid());
+  const refer = () => (imgKey.value = guid());
+  const codeImg = computed(() => baseURL + getCode + "?key=" + imgKey.value);
 
   const formRef = ref();
   const loading = ref(false);
@@ -121,8 +149,8 @@
   const formData = reactive({
     account: '',
     password: '',
+    code: '',
   });
-
   const { validForm } = useFormValid(formRef);
 
   //onKeyStroke('Enter', handleLogin);
@@ -149,6 +177,7 @@
       const userInfo = await userStore.login({
         password: data.password,
         username: data.account,
+        authCode: formData.code,
         mode: 'none', //不要默认的错误提示
       });
       if (userInfo) {

+ 3 - 3
src/views/sys/login/useLogin.ts

@@ -84,6 +84,7 @@ export function useFormRules(formData?: Recordable) {
       sms: smsFormRule,
       mobile: mobileFormRule,
     };
+    console.log('mobileRule', unref(currentState), smsFormRule);
     switch (unref(currentState)) {
       // register form rules
       case LoginStateEnum.REGISTER:
@@ -128,9 +129,8 @@ export function useFormRules(formData?: Recordable) {
       default:
         return {
           account: accountFormRule,
-          password: [
-            { validator: getPasswordFormRule(formData?.password), trigger: 'change' },
-          ],
+          code: smsFormRule,
+          password: [{ validator: getPasswordFormRule(formData?.password), trigger: 'change' }],
         };
     }
   });

+ 20 - 19
yarn.lock

@@ -22,7 +22,7 @@
   resolved "https://registry.npmmirror.com/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz"
   integrity sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==
 
-"@ant-design/icons-vue@^6.0.0", "@ant-design/icons-vue@^6.0.1":
+"@ant-design/icons-vue@^6.0.1", "@ant-design/icons-vue@^6.1.0":
   version "6.1.0"
   resolved "https://registry.npmmirror.com/@ant-design/icons-vue/-/icons-vue-6.1.0.tgz"
   integrity sha512-EX6bYm56V+ZrKN7+3MT/ubDkvJ5rK/O2t380WFRflDcVFgsvl3NLH7Wxeau6R8DbrO5jWR6DSTC3B6gYFp77AA==
@@ -2570,22 +2570,23 @@ ansi-styles@^5.0.0:
   resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz"
   integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
 
-ant-design-vue@2.2.8:
-  version "2.2.8"
-  resolved "https://registry.npmmirror.com/ant-design-vue/-/ant-design-vue-2.2.8.tgz"
-  integrity sha512-3graq9/gCfJQs6hznrHV6sa9oDmk/D1H3Oo0vLdVpPS/I61fZPk8NEyNKCHpNA6fT2cx6xx9U3QS63uuyikg/Q==
+ant-design-vue@3.2.20:
+  version "3.2.20"
+  resolved "https://mirrors.cloud.tencent.com/npm/ant-design-vue/-/ant-design-vue-3.2.20.tgz#552f5f08e2acbcc10bd4089145d4cc2b15d4cfec"
+  integrity sha512-YWpMfGaGoRastIXEYfCoJiaRiDHk4chqtYhlKQM5GqPt6NfvrM1Vg2e60yHtjxlZjed91wCMm0rAmyUr7Hwzdg==
   dependencies:
-    "@ant-design/icons-vue" "^6.0.0"
+    "@ant-design/colors" "^6.0.0"
+    "@ant-design/icons-vue" "^6.1.0"
     "@babel/runtime" "^7.10.5"
+    "@ctrl/tinycolor" "^3.4.0"
     "@simonwep/pickr" "~1.8.0"
     array-tree-filter "^2.1.0"
-    async-validator "^3.3.0"
+    async-validator "^4.0.0"
+    dayjs "^1.10.5"
     dom-align "^1.12.1"
     dom-scroll-into-view "^2.0.0"
     lodash "^4.17.21"
     lodash-es "^4.17.15"
-    moment "^2.27.0"
-    omit.js "^2.0.0"
     resize-observer-polyfill "^1.5.1"
     scroll-into-view-if-needed "^2.2.25"
     shallow-equal "^1.0.0"
@@ -2694,10 +2695,10 @@ astral-regex@^2.0.0:
   resolved "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz"
   integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
 
-async-validator@^3.3.0:
-  version "3.5.2"
-  resolved "https://registry.npmmirror.com/async-validator/-/async-validator-3.5.2.tgz"
-  integrity sha512-8eLCg00W9pIRZSB781UUX/H6Oskmm8xloZfr09lz5bikRpBVDlJ3hRVuxxP1SxcwsEYfJ4IU8Q19Y8/893r3rQ==
+async-validator@^4.0.0:
+  version "4.2.5"
+  resolved "https://mirrors.cloud.tencent.com/npm/async-validator/-/async-validator-4.2.5.tgz#c96ea3332a521699d0afaaceed510a54656c6339"
+  integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==
 
 async@^3.2.3:
   version "3.2.4"
@@ -3965,6 +3966,11 @@ dateformat@^3.0.0:
   resolved "https://registry.npmmirror.com/dateformat/-/dateformat-3.0.3.tgz"
   integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==
 
+dayjs@^1.10.5:
+  version "1.11.13"
+  resolved "https://mirrors.cloud.tencent.com/npm/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c"
+  integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==
+
 dayjs@^1.11.5:
   version "1.11.5"
   resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.5.tgz"
@@ -7959,7 +7965,7 @@ modify-values@^1.0.0:
   resolved "https://registry.npmmirror.com/modify-values/-/modify-values-1.0.1.tgz"
   integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==
 
-moment@^2.27.0, moment@^2.29.1:
+moment@^2.29.1:
   version "2.29.4"
   resolved "https://registry.npmmirror.com/moment/-/moment-2.29.4.tgz"
   integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==
@@ -8209,11 +8215,6 @@ object.pick@^1.3.0:
   dependencies:
     isobject "^3.0.1"
 
-omit.js@^2.0.0:
-  version "2.0.2"
-  resolved "https://registry.npmmirror.com/omit.js/-/omit.js-2.0.2.tgz"
-  integrity sha512-hJmu9D+bNB40YpL9jYebQl4lsTW6yEHRTroJzNLqQJYHm7c+NQnJGfZmIWh8S3q3KoaxV1aLhV6B3+0N0/kyJg==
-
 on-finished@~2.3.0:
   version "2.3.0"
   resolved "https://registry.npmmirror.com/on-finished/-/on-finished-2.3.0.tgz"