tangning 2 år sedan
förälder
incheckning
d40ad91fed

+ 24 - 5
src/views/account/product/index.vue

@@ -2,11 +2,11 @@
   <PageWrapper contentBackground>
     <template #footer>
       <a-tabs v-model:activeKey="tableType" @change="changeTable">
-        <a-tab-pane :key="0" tab="四维看看" />
-        <a-tab-pane :key="1" tab="四维看见" />
-        <a-tab-pane :key="2" tab="四维深时" />
-        <a-tab-pane :key="3" tab="四维双目Lite" /> 
-        <a-tab-pane :key="4" tab="四维全景" /> 
+        <a-tab-pane :key="0" tab="四维看看" :disabled="loading"/>
+        <a-tab-pane :key="1" tab="四维看见" :disabled="loading"/>
+        <a-tab-pane :key="2" tab="四维深时" :disabled="loading"/>
+        <a-tab-pane :key="3" tab="四维双目Lite" :disabled="loading"/> 
+        <a-tab-pane :key="4" tab="四维全景" :disabled="loading"/> 
       </a-tabs
     ></template>
     <div class="desc-wrap-BasicTable">
@@ -142,6 +142,7 @@
       const { createMessage, createConfirm } = useMessage();
       const timer = ref<NodeJS.Timeout | number | undefined | null>(null);
       const tableType = ref<number>(0); //0看看 、1看见、2深时
+      const loading = ref(false);
       function cancelDownload() {
         downloadOption.value = {};
       }
@@ -160,6 +161,14 @@
         showTableSetting: true,
         showIndexColumn:false,
         rowKey: 'num',
+        beforeFetch:(T)=>{
+          loading.value = true
+          return T
+        },
+        afterFetch: (T) => {
+          loading.value = false
+          return T;
+        },
         fetchSetting: {
           pageField: 'pageNum',
           sizeField: 'pageSize',
@@ -178,6 +187,14 @@
         formConfig: searchForm,
         showTableSetting: true,
         showIndexColumn:false,
+        beforeFetch:(T)=>{
+          loading.value = true
+          return T
+        },
+        afterFetch: (T) => {
+          loading.value = false
+          return T;
+        },
         rowKey: 'num',
         fetchSetting: {
           pageField: 'pageNum',
@@ -201,6 +218,7 @@
                 message.success({
                   content: '复制成功',
                 });
+                reload();
               })
           },
         });
@@ -289,6 +307,7 @@
         handleDelete,
         handleQjDelete,
         handleCopy,
+        loading,
         handleMove,
         handleDownload,
         handleReset,

+ 15 - 4
src/views/customer/scene.vue

@@ -2,10 +2,10 @@
   <PageWrapper contentBackground>
     <template #footer>
       <a-tabs v-model:activeKey="tableType" @change="changeTable">
-        <a-tab-pane :key="0" tab="四维看看" />
-        <a-tab-pane :key="1" tab="四维看见" />
-        <a-tab-pane :key="2" tab="四维深时" />
-        <a-tab-pane :key="3" tab="四维双目Lite" /> </a-tabs
+        <a-tab-pane :key="0" tab="四维看看" :disabled="loading"/>
+        <a-tab-pane :key="1" tab="四维看见" :disabled="loading"/>
+        <a-tab-pane :key="2" tab="四维深时" :disabled="loading"/>
+        <a-tab-pane :key="3" tab="四维双目Lite" :disabled="loading"/> </a-tabs
     ></template>
     <div class="desc-wrap-BasicTable">
       <BasicTable @register="registerTable">
@@ -133,6 +133,7 @@
       const router = useRouter();
       const permissionStore = usePermissionStore();
       const { getCheckPerm } = permissionStore;
+      const loading = ref(false);
       const companyId: Number = router.currentRoute.value.params.id - 0;
       const { createMessage, createConfirm } = useMessage();
       const tableType = ref<Recordable>(0); //0看看 、1看见、2深时
@@ -315,6 +316,14 @@
         formConfig: searchForm,
         showTableSetting: true,
         rowKey: 'num',
+        beforeFetch:(T)=>{
+          loading.value = true
+          return T
+        },
+        afterFetch: (T) => {
+          loading.value = false
+          return T;
+        },
         fetchSetting: {
           pageField: 'pageNum',
           sizeField: 'pageSize',
@@ -338,6 +347,7 @@
                 message.success({
                   content: '复制成功',
                 });
+                reload();
                 }
               })
           },
@@ -446,6 +456,7 @@
         handleDownload,
         handleReset,
         tableType,
+        loading,
         changeTable,
         t,
         openDownModal,

+ 30 - 1
src/views/device/detailsMoadl.vue

@@ -26,6 +26,7 @@ import { companyList } from '/@/api/customer';
 // import { sceneMove } from '/@/api/operate';
 import { downTemplate } from '/@/api/customer';
 import { cameraParam, cameraUpdate, cameraOut } from '/@/api/device';
+import { agentNewList } from '/@/api/dealer';
 import { CameraList } from '/@/api/order';
 import { useI18n } from '/@/hooks/web/useI18n';
 const { t } = useI18n();
@@ -92,8 +93,36 @@ export default defineComponent({
               key: '3',
             },
           ],
+          onChange:(value)=>{
+              updateSchema([{field: 'agentId',ifShow:value=='4',}])
+            }
         },
-      },
+      },{
+            field: 'agentId',
+            component: 'ApiSelect',
+            label: '经销商名称',
+            required: true,
+            ifShow:false,
+            componentProps: {
+            api: async function () {
+              const {list} = await agentNewList({pageSize:1000,pageNum:1});
+              console.log('agentNewList',list)
+              return list.map(ele => {
+                return {name:ele.name,value:ele.id}
+              });
+            },
+            numberToString: true,
+            labelField: 'name',
+            valueField: 'value',
+            immediate: true,
+            params: {
+              agentName: '',
+            },
+          },
+            colProps: {
+              span: 18,
+            },
+          },
       {
         field: 'companyName',
         component: 'AutoComplete',

+ 217 - 0
src/views/lanUser/adddetailsModal.vue

@@ -0,0 +1,217 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @cancel="resetFields"
+    @register="register"
+    :title="title"
+    @ok="handleOk"
+  >
+    <BasicForm @register="registerForm" />
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, ref, computed } from 'vue';
+  import { checkUserApi, saveApi, updateApi, getRoleListByParam } from '/@/api/staff/list'; //roleLIstApi
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { useUserStore } from '/@/store/modules/user';
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicForm },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['ok'],
+    setup(_, context) {
+      const modelRef = ref({});
+      const userStore = useUserStore();
+      const userinfo = computed(() => userStore.getUserInfo);
+      const preventAutoFill = ref(true);
+      const { companyId } = userinfo.value;
+      const schemas: FormSchema[] = [
+        {
+          field: 'nickName',
+          component: 'Input',
+          label: '姓名',
+          colProps: {
+            span: 20,
+          },
+          componentProps: {
+            maxLength: 15,
+          },
+          rules: [
+            {
+              required: true,
+              // @ts-ignore
+              validator: async (rule, value) => {
+                var reg_tel = /^[a-zA-Z\u4e00-\u9fa5]+$/;
+                // var reg = /\S+@\S+\.\S+/;
+                if (!value) {
+                  return Promise.reject('请输入姓名');
+                }
+                if (!reg_tel.test(value)) {
+                  /* eslint-disable-next-line */
+                  return Promise.reject('请输入正确的姓名');
+                }
+                return Promise.resolve();
+              },
+              trigger: 'change',
+            },
+          ],
+        },
+        {
+          field: 'userName',
+          component: 'Input',
+          label: '账号',
+          required: true,
+          colProps: {
+            span: 20,
+          },
+          componentProps:{
+            placeholder:"请输入手机号",
+            maxLength: 15,
+            readonly:preventAutoFill.value
+          },
+          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: 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,
+            readonly:preventAutoFill.value,
+            minLength: 8,
+            autoComplete:'off',
+          }
+        },
+        {
+          field: 'id',
+          component: 'Input',
+          label: 'id',
+          show: false,
+        },
+      ];
+      const title = ref('新增账号');
+      const { createMessage } = useMessage();
+      const [registerForm, { setFieldsValue, validate, updateSchema, resetFields }] = useForm({
+        labelWidth: 120,
+        schemas,
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+
+      const [register, { closeModal }] = useModalInner((data) => {
+        data && onDataReceive(data);
+      });
+      function onDataReceive(data) {
+        console.log('onDataReceive',data)
+        // 方式1;
+        setTimeout(()=>{
+          preventAutoFill.value = false
+          updateSchema([{
+            field: 'userName',
+            componentProps:{
+              readonly:false,
+            }
+          },{
+            field: 'password',
+            componentProps:{
+              readonly:false,
+            }
+          }])
+          // updateSchema(schemas);
+        },500)
+      }
+      function companyIdChange(companyId) {
+        // resetFields(['permList'])
+        updateSchema([
+          {
+            field: 'permList',
+            componentProps: {
+              params: {
+                companyId: companyId,
+              },
+            },
+          },
+        ]);
+        setFieldsValue({
+          permList: [],
+        });
+      }
+      async function handleOk() {
+        let data = await validate();
+        const requestApi = data.id ? updateApi : saveApi;
+        let res = await requestApi({
+          ...data,
+          // userName: data.phone,
+          phone: data.phone,
+          nickName: data.nickName,
+          roleId: data.roleId,
+          id: data.id,
+        });
+        context && context.emit('ok', res);
+        createMessage.success(t('common.optSuccess'));
+        closeModal();
+        resetFields();
+      }
+
+      return {
+        register,
+        title,
+        preventAutoFill,
+        schemas,
+        registerForm,
+        modelRef,
+        handleOk,
+        resetFields,
+      };
+    },
+  });
+</script>

+ 5 - 0
src/views/lanUser/category.vue

@@ -0,0 +1,5 @@
+<template>
+  <div> 设备管理 </div>
+</template>
+
+<script lang="ts" setup></script>

+ 124 - 0
src/views/lanUser/delListModal.vue

@@ -0,0 +1,124 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @cancel="resetFields"
+    @register="register"
+    title="删除员工"
+    @ok="handleOk"
+  >
+    <div class="pt-3px pr-3px">
+      <BasicForm @register="registerForm">
+        <template #tips>
+          <div>请将员工的数据迁移后,再删除员工(删除员工后,权益将进行解绑)</div>
+        </template>
+      </BasicForm>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, ref, unref } from 'vue';
+  import { delApi } from '/@/api/staff/list';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  const { t } = useI18n();
+
+  export default defineComponent({
+    components: { BasicModal, BasicForm },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['reload'],
+    setup(_, context) {
+      const modelRef = ref({
+        toUserId: 0,
+        userId: 0,
+      });
+      const options = ref([]);
+      const { createMessage } = useMessage();
+      const schemas: FormSchema[] = [
+        {
+          field: 'toUserPhone',
+          component: 'Select',
+          label: '选择迁移的员工',
+          required: true,
+          itemProps: {
+            validateTrigger: 'blur',
+          },
+          colProps: {
+            span: 22,
+          },
+          componentProps: {
+            options: options.value,
+          },
+        },
+        {
+          field: 'tips',
+          component: 'Select',
+          slot: 'tips',
+          label: ' ',
+        },
+      ];
+      const [registerForm, { validate, resetFields, updateSchema }] = useForm({
+        labelWidth: 120,
+        schemas,
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+
+      const [register, { closeModal }] = useModalInner((data) => {
+        data && onDataReceive(data);
+      });
+      function onDataReceive(data) {
+        data = unref(data);
+        modelRef.value.userId = data.id;
+        console.log('onDataReceive', data);
+        // 方式1;
+        if (data.option) {
+          options.value = data.option.map((ele) => {
+            ele.label = ele.nickName;
+            ele.value = ele.phone;
+            return ele;
+          });
+          updateSchema({
+            field: 'toUserPhone',
+            component: 'Select',
+            label: '选择迁移的员工',
+            required: true,
+            itemProps: {
+              validateTrigger: 'blur',
+            },
+            colProps: {
+              span: 22,
+            },
+            componentProps: {
+              options: data.option,
+              onChange: function (value, item) {
+                modelRef.value.toUserId = item.id;
+                console.log('onChange', value, item);
+              },
+            },
+          });
+        }
+      }
+
+      async function handleOk() {
+        let data = await validate();
+        let res = await delApi({
+          toUserPhone: data.toUserPhone,
+          userId: modelRef.value.userId,
+          toUserId: modelRef.value.toUserId,
+        });
+        context && context.emit('reload', res);
+        createMessage.success(t('common.optSuccess'));
+        closeModal();
+        resetFields();
+      }
+
+      return { options, register, registerForm, model: modelRef, handleOk, resetFields };
+    },
+  });
+</script>

+ 148 - 0
src/views/lanUser/detailsModal.vue

@@ -0,0 +1,148 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @cancel="resetFields"
+    @register="register"
+    :title="title"
+    :min-height="150"
+    @ok="handleOk"
+  >
+    <BasicForm @register="registerForm" />
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, ref, computed } from 'vue';
+  import { checkUserApi, saveApi, updateApi, getRoleListByParam } from '/@/api/staff/list'; //roleLIstApi
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { useUserStore } from '/@/store/modules/user';
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicForm },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['ok'],
+    setup(_, context) {
+      const modelRef = ref({});
+      const userStore = useUserStore();
+      const userinfo = computed(() => userStore.getUserInfo);
+      const preventAutoFill = ref(true);
+      const { companyId } = userinfo.value;
+      console.log('companyId', companyId);
+      const schemas: FormSchema[] = [
+        {
+          field: 'nickName',
+          component: 'Input',
+          label: '姓名',
+          colProps: {
+            span: 20,
+          },
+          componentProps: {
+            maxLength: 15,
+          },
+          rules: [
+            {
+              required: true,
+              // @ts-ignore
+              validator: async (rule, value) => {
+                var reg_tel = /^[a-zA-Z\u4e00-\u9fa5]+$/;
+                // var reg = /\S+@\S+\.\S+/;
+                if (!value) {
+                  return Promise.reject('请输入姓名');
+                }
+                if (!reg_tel.test(value)) {
+                  /* eslint-disable-next-line */
+                  return Promise.reject('请输入正确的姓名');
+                }
+                return Promise.resolve();
+              },
+              trigger: 'change',
+            },
+          ],
+        },
+        {
+          field: 'id',
+          component: 'Input',
+          label: 'id',
+          show: false,
+        },
+      ];
+      const title = ref('编辑账号');
+      const { createMessage } = useMessage();
+      const [registerForm, { setFieldsValue, validate, updateSchema, resetFields }] = useForm({
+        labelWidth: 120,
+        schemas,
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+
+      const [register, { closeModal }] = useModalInner((data) => {
+        data && onDataReceive(data);
+      });
+      function onDataReceive(data) {
+        // 方式1;
+        console.log('useModalInner', data);
+        // preventAutoFill.value = false
+        setTimeout(()=>{
+            console.log('useModalInner', data);
+            setFieldsValue({
+            ...data,
+            userName:'',
+            password:'',
+            roleId: data.roleId != 2 ? data.roleId : '',
+          });
+        },200)
+      }
+      function companyIdChange(companyId) {
+        // resetFields(['permList'])
+        updateSchema([
+          {
+            field: 'permList',
+            componentProps: {
+              params: {
+                companyId: companyId,
+              },
+            },
+          },
+        ]);
+        setFieldsValue({
+          permList: [],
+        });
+      }
+      async function handleOk() {
+        let data = await validate();
+        const requestApi = data.id ? updateApi : saveApi;
+        let res = await requestApi({
+          ...data,
+          // userName: data.phone,
+          phone: data.phone,
+          nickName: data.nickName,
+          roleId: data.roleId,
+          id: data.id,
+        });
+        context && context.emit('ok', res);
+        createMessage.success(t('common.optSuccess'));
+        closeModal();
+        resetFields();
+      }
+
+      return {
+        register,
+        title,
+        preventAutoFill,
+        schemas,
+        registerForm,
+        modelRef,
+        handleOk,
+        resetFields,
+      };
+    },
+  });
+</script>
+
+.

+ 335 - 0
src/views/lanUser/list.vue

@@ -0,0 +1,335 @@
+<template>
+  <div class="p-4">
+    <BasicTable @register="registerTable">
+      <template #toolbar>
+        <a-button
+          type="primary"
+          @click="handleCreate"
+           v-if="getCheckPerm('sysuser-add')"
+          >新增账号</a-button
+        >
+      </template>
+      <template #role="{ record }">
+        {{ renderRoleType(record.role) }}
+      </template>
+      <template #status="{ record }">
+        {{ renderStatus(record.status) }}
+      </template>
+      <template #createTime="{ record }">
+        <Time :value="record.createTime" mode="datetime" />
+      </template>
+      <!-- , -->
+      <template #action="{ record }">
+        <TableAction
+          :actions="[
+            {
+              color: 'warning',
+              label: '重置密码',
+              onClick: handleOpenModal.bind(null, record),
+            },{
+              label: '编辑',
+              ifShow:getCheckPerm('sysuser-update'),
+              onClick: handleEdit.bind(null, record),
+            },
+            {
+              label: '删除',
+              color: 'error',
+              ifShow:getCheckPerm('sysuser-delete'),
+              onClick:handDelconfirm.bind(null, record),
+            },
+          ]"
+        />
+      </template>
+    </BasicTable>
+    <DetailsModal @register="registerDetail" @ok="reload" />
+    <SetpaswordModal @register="register" @reload="reload" />
+    <addDetailsModal @register="registerAddDetail" @ok="reload" />
+  </div>
+</template>
+<script lang="ts">
+  import { defineComponent, computed, onMounted, ref, h } from 'vue';
+  import { BasicTable, useTable, BasicColumn, FormProps, TableAction } from '/@/components/Table';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { useModal } from '/@/components/Modal';
+  import { uploadApi } from '/@/api/sys/upload';
+  import SetpaswordModal from './setpaswordModal.vue';
+  import DetailsModal from './detailsModal.vue';
+  import addDetailsModal from './adddetailsModal.vue';
+  import { Switch } from 'ant-design-vue';
+  // import DelListModal from './delListModal.vue';
+  import { Alert } from 'ant-design-vue';
+  // import { h } from 'vue';
+  import { ListApi, delApi, preDelApi, updateApi, getNumByStaff } from '/@/api/staff/list';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  // import { useCopyToClipboard } from '/@/hooks/web/useCopyToClipboard';
+  import { RoleEnum } from '/@/enums/roleEnum';
+  import { useGo } from '/@/hooks/web/usePage';
+  import { Time } from '/@/components/Time';
+  import { useUserStore } from '/@/store/modules/user';
+  import { usePermissionStore } from '/@/store/modules/permission';
+  import { getRoleListByParam } from '/@/api/staff/list'; //roleLIstApi
+  export default defineComponent({
+    components: {
+      BasicTable,
+      TableAction,
+      Time,
+      SetpaswordModal,
+      DetailsModal,
+      addDetailsModal,
+      Alert,
+    },
+    setup() {
+      const [register, { openModal }] = useModal();
+      const surplusSubNum = ref({
+        lookNum: 0,
+        shotNum: 0,
+      });
+      const [registerDetail, { openModal: openDetaileModal }] = useModal();
+      const [registerAddDetail, { openModal: openAddDetaileModal }] = useModal();
+      const [registerDelList, { openModal: openDelListeModal }] = useModal();
+      const { createConfirm, createMessage } = useMessage();
+      const userStore = useUserStore();
+      const permissionStore = usePermissionStore();
+      const { getCheckPerm } = permissionStore;
+      const roleList = computed(() => userStore.getRoleList);
+      console.log('getRoleList', roleList);
+      const go = useGo();
+      const { t } = useI18n();
+      onMounted(() => {
+        // getNumByStaffData();
+      });
+
+      const columns: BasicColumn[] = [
+        {
+          title: 'ID',
+          dataIndex: 'id',
+          fixed: 'left',
+          width: 60,
+        },
+        // {
+        //   title: t('routes.staff.userName'),
+        //   dataIndex: 'nickName',
+        //   width: 120,
+        // },
+        {
+          title: t('routes.staff.userId'),
+          dataIndex: 'userName',
+          width: 150,
+        },
+        // {
+        //   title: '手机',
+        //   dataIndex: 'phone',
+        //   width: 160,
+        // },
+        // {
+        //   title: t('common.roleName'),
+        //   dataIndex: 'roleName',
+        //   width: 100,
+        // },
+
+        {
+          title: '创建人',
+          dataIndex: 'createUserName',
+          width: 80,
+        },
+
+        {
+          title: t('routes.staff.createTime'),
+          dataIndex: 'createTime',
+          slots: { customRender: 'createTime' },
+          width: 130,
+        },
+      //   {
+      //   title: '状态',
+      //   dataIndex: 'status',
+      //   ifShow:getCheckPerm('sysuser-enable'),
+      //   width: 80,
+      //   customRender: ({ record }) => {
+      //     if (!Reflect.has(record, 'status')) {
+      //       record.pendingStatus = false;
+      //     }
+      //     return h(Switch, {
+      //       checked: record.status == 1 ? true : false,
+      //       checkedChildren: '启用',
+      //       unCheckedChildren: '禁用',
+      //       loading: false,
+      //       onChange: async (checked: boolean) => {
+      //         record.pendingStatus = true;
+      //         const newStatus = checked?1:0;
+      //         await updateApi({...record,status:newStatus});
+      //         Reflect.set(record, 'status', checked);
+      //         createMessage.success(t('common.optSuccess'));
+      //         reload()
+      //       },
+      //     });
+      //   },
+      // },
+        {
+          title: '操作',
+          dataIndex: '',
+          // ifShow: !getCheckRole('tourist'),
+          slots: { customRender: 'action' },
+          fixed: 'right',
+          width: 140,
+        },
+      ];
+
+      const searchForm: Partial<FormProps> = {
+        labelWidth: 100,
+        schemas: [
+          {
+            field: 'nickName',
+            label: t('routes.staff.userName'),
+            component: 'Input',
+            componentProps: {
+              maxLength: 15,
+            },
+            colProps: {
+              xl: 6,
+              xxl: 6,
+            },
+          },
+          {
+            field: 'userName',
+            label: '账号',
+            component: 'Input',
+            componentProps: {
+              maxLength: 15,
+            },
+            colProps: {
+              xl: 6,
+              xxl: 6,
+            },
+          },{
+            field: 'roleId',
+            label: '角色',
+            component: 'ApiSelect',
+            componentProps: {
+              api: getRoleListByParam,
+              labelField: 'roleName',
+              valueField: 'id',
+            },
+            colProps: {
+              xl: 6,
+              xxl: 6,
+            },
+          },
+        ],
+      };
+
+      const [registerTable, { reload }] = useTable({
+        title: t('routes.staff.staffList'),
+        api: ListApi,
+        columns: columns,
+        useSearchForm: true,
+        formConfig: searchForm,
+        showTableSetting: true,
+        tableSetting: { fullScreen: true },
+        showIndexColumn: false,
+        canResize: true,
+        rowKey: 'id',
+        fetchSetting: {
+          pageField: 'pageNum',
+          sizeField: 'pageSize',
+          listField: 'list',
+          totalField: 'total',
+        },
+        pagination: { pageSize: 20 },
+        afterFetch: (T) => {
+          return T;
+        },
+        bordered: true,
+        sortFn: (sortInfo) => {
+          let order = sortInfo.order && sortInfo.order.replace('end', '');
+          return { ...sortInfo, sidx: sortInfo.field, order: order };
+        },
+      });
+
+      function renderRoleType(type: number): string {
+        switch (type) {
+          case 0:
+            return t('routes.staff.roleType.0');
+          case 1:
+            return t('routes.staff.roleType.1');
+          default:
+            return '';
+        }
+      }
+      function renderStatus(type: number): string {
+        switch (type) {
+          case 1:
+            return t('common.normal');
+          case 0:
+            return t('common.unNormal');
+          default:
+            return '';
+        }
+      }
+      function handleOpenModal(record: Recordable) {
+        openModal(true, record);
+      }
+      function handleCreate() {
+        openAddDetaileModal(true,{});
+      }
+      function handleEdit(record: Recordable) {
+        openDetaileModal(true, {
+          ...record,
+          phone:record.userName,
+        });
+      }
+      function getNumByStaffData() {
+        getNumByStaff({}).then((res) => {
+          surplusSubNum.value.lookNum = res.lookNum;
+          surplusSubNum.value.shotNum = res.shotNum;
+        });
+      }
+      async function handleDelete(record) {
+        let check = await preDelApi(record.id); //
+        if (Array.isArray(check)) {
+          return openDelListeModal(true, {
+            ...record,
+            option: check,
+          });
+        }
+        createMessage.success(t('common.optSuccess'));
+        reload();
+        // handDelconfirm(record);
+      }
+      function handDelconfirm(record) {
+        createConfirm({
+          iconType: 'warning',
+          title: '警告',
+          content: `此操作将对${record.userName}进行删除, 是否继续?`,
+          onOk: async () => {
+            await delApi({ userId: record.id });
+            reload();
+          },
+        });
+      }
+      return {
+        registerTable,
+        registerDetail,
+        registerDelList,
+        registerAddDetail,
+        openDelListeModal,
+        createMessage,
+        handDelconfirm,
+        t,
+        reload,
+        go,
+        renderRoleType,
+        renderStatus,
+        handleCreate,
+        handleOpenModal,
+        register,
+        handleEdit,
+        handleDelete,
+        uploadApi: uploadApi as any,
+        RoleEnum,
+        surplusSubNum,
+        getCheckPerm,
+        getNumByStaffData,
+      };
+    },
+  });
+</script>

+ 125 - 0
src/views/lanUser/setpaswordModal.vue

@@ -0,0 +1,125 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    @ok="handSubmit"
+    title="重置密码"
+    :min-height="100"
+    @visible-change="handleVisibleChange"
+    @cancel="resetFields"
+  >
+    <div class="pt-3px pr-3px">
+      <BasicForm @register="registerForm" />
+      <span style="margin-left:100px;color:#9f9c9c">请设置新密码,设置后,管理员可使用新密码登录。</span>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { encodeStr } from '/@/utils/encodeUtil';
+  import { defineComponent, nextTick, ref } 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';
+
+  const { createMessage } = useMessage();
+
+  export default defineComponent({
+    components: { BasicModal, BasicForm },
+    props: {
+      userData: { type: Object },
+    },
+    setup(props) {
+      const { t } = useI18n();
+      const preventAutoFill = ref(true);
+      const schemas: FormSchema[] = [
+        {
+          field: 'id',
+          component: 'Input',
+          label: 'id',
+          show: false,
+        },
+        {
+          field: 'password',
+          component: 'StrengthMeter',
+          label: t('routes.staff.password'),
+          labelWidth: 100,
+          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 },
+        },
+      ];
+
+      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() {
+        const { id, password } = await validate();
+        await updatePasswordApi({ id, newPassword: encodeStr(window.btoa(password)) });
+        createMessage.success(t('common.optSuccess'));
+        resetFields();
+        closeModal();
+      }
+      function handleVisibleChange(v) {
+        v && props.userData && nextTick(() => onDataReceive(props.userData));
+      }
+
+      return {
+        handSubmit,
+        register,
+        t,
+        schemas,
+        registerForm,
+        handleVisibleChange,
+        resetFields,
+      };
+    },
+  });
+</script>

+ 5 - 0
src/views/lanUser/sorts.vue

@@ -0,0 +1,5 @@
+<template>
+  <div> 设备管理 </div>
+</template>
+
+<script lang="ts" setup></script>

+ 16 - 5
src/views/productOperation/cameraScene.vue

@@ -1,11 +1,11 @@
 <template>
   <PageWrapper contentBackground>
-    <template #footer>
+    <template #footer >
       <a-tabs v-model:activeKey="tableType" @change="changeTable">
-        <a-tab-pane :key="0" tab="四维看看" />
-        <a-tab-pane :key="1" tab="四维看见" />
-        <a-tab-pane :key="2" tab="四维深时" />
-        <a-tab-pane :key="3" tab="四维双目Lite" /> </a-tabs
+        <a-tab-pane :key="0" tab="四维看看" :disabled="loading"/>
+        <a-tab-pane :key="1" tab="四维看见" :disabled="loading"/>
+        <a-tab-pane :key="2" tab="四维深时" :disabled="loading"/>
+        <a-tab-pane :key="3" tab="四维双目Lite" :disabled="loading"/> </a-tabs
     ></template>
     <div class="desc-wrap-BasicTable">
       <BasicTable @register="registerTable">
@@ -130,6 +130,7 @@
       const { createMessage, createConfirm } = useMessage();
       const permissionStore = usePermissionStore();
       const { getCheckPerm } = permissionStore;
+      const loading = ref(false);
       const tableType = ref<Recordable>(0); //0看看 、1看见、2深时
       const tabList = ref<Array>(['四维看看', '四维看见', '四维深时', '四维双目Lite']);
       const columns: BasicColumn[] = [
@@ -309,6 +310,14 @@
         useSearchForm: true,
         formConfig: searchForm,
         showTableSetting: true,
+        beforeFetch:(T)=>{
+          loading.value = true
+          return T
+        },
+        afterFetch: (T) => {
+          loading.value = false
+          return T;
+        },
         rowKey: 'num',
         fetchSetting: {
           pageField: 'pageNum',
@@ -332,6 +341,7 @@
                 message.success({
                   content: '复制成功',
                 });
+                reload();
               })
           },
         });
@@ -437,6 +447,7 @@
         handleDownload,
         handleReset,
         tableType,
+        loading,
         changeTable,
         t,
         openDownModal,