jwyu 9 月之前
父節點
當前提交
33d1b7c3e5

+ 87 - 28
src/directives/buttonPermission.js

@@ -1,33 +1,92 @@
-import {usePermission} from '@/hooks/permission'
-import { watchEffect } from 'vue';
-
-const {authCodeOpts} =usePermission()
-
-function checkPermission(el,binding) {
-  let {value} = binding
-  if(value && typeof(value)=='string'){
-    // 使用watchEffect来监听authList的变化
-    watchEffect(() => {
-      // 如果authList还未获取到,则直接返回
-      if (!authCodeOpts.value) return;
-
-      // 拿出所有按钮的code
-      let buttonCodes = authCodeOpts.value
-      if (!buttonCodes.includes(value)) {
-        // 没有权限,删除dom
-        el.parentNode && el.parentNode.removeChild(el);
-      }
-    });
-  }else{
-    throw new Error('permission指令只接受字符串类型')
+// import {usePermission} from '@/hooks/permission'
+// import { watchEffect } from 'vue';
+
+// const {authCodeOpts} =usePermission()
+
+// function checkPermission(el,binding) {
+//   let {value} = binding
+//   if(value && typeof(value)=='string'){
+//     // 使用watchEffect来监听authList的变化
+//     watchEffect(() => {
+//       // 如果authList还未获取到,则直接返回
+//       if (!authCodeOpts.value) return;
+
+//       // 拿出所有按钮的code
+//       let buttonCodes = authCodeOpts.value
+//       if (!buttonCodes.includes(value)) {
+//         // 没有权限,删除dom
+//         el.parentNode && el.parentNode.removeChild(el);
+//       }
+//     });
+//   }else{
+//     throw new Error('permission指令只接受字符串类型')
+//   }
+// }
+
+// export const permission={
+//   inserted(el,binding){
+//     checkPermission(el,binding)
+//   },
+//   updated(el,binding) {
+//     checkPermission(el,binding)
+//   },
+// }
+
+import { usePermission } from '@/hooks/permission';
+import { watch } from 'vue';
+
+const { authCodeOpts } = usePermission();
+
+function checkPermission(el, binding, vnode) {
+  let { value } = binding;
+  if (value && typeof value === 'string') {
+    // 创建一个占位元素,用于在权限重新赋予时插入按钮
+    const placeholder = document.createComment(' ');
+    el._placeholder = placeholder;
+
+    // 使用 watch 来监听 authCodeOpts 的变化
+    const stop = watch(
+      () => authCodeOpts.value,
+      (newVal) => {
+        // 如果 authCodeOpts 还未获取到,则直接返回
+        if (!newVal) return;
+
+        // 拿出所有按钮的 code
+        let buttonCodes = newVal;
+        if (!buttonCodes.includes(value)) {
+          // 没有权限,删除 DOM 并保留占位
+          if (el.parentNode) {
+            el.parentNode.replaceChild(placeholder, el);
+          }
+        } else {
+          // 有权限,恢复按钮
+          if (placeholder.parentNode) {
+            placeholder.parentNode.replaceChild(el, placeholder);
+          }
+        }
+      },
+      { immediate: true }
+    );
+
+    // 将 stop 作为元素的属性存储,以便在指令 unmounted 时可以停止监听
+    el._stop = stop;
+  } else {
+    throw new Error('permission 指令只接受字符串类型');
   }
 }
 
-export const permission={
-  inserted(el,binding){
-    checkPermission(el,binding)
+export const permission = {
+  mounted(el, binding, vnode) {
+    checkPermission(el, binding, vnode);
+  },
+  updated(el, binding, vnode) {
+    checkPermission(el, binding, vnode);
   },
-  updated(el,binding) {
-    checkPermission(el,binding)
+  unmounted(el) {
+    // 组件卸载时停止监听
+    if (el._stop) {
+      el._stop();
+      delete el._stop;
+    }
   },
-}
+};

+ 1 - 0
src/views/Login.vue

@@ -111,6 +111,7 @@ onMounted(() => {
             v-model="formState.pwd"
             placeholder="请输入密码"
             type="password"
+            show-password
           />
         </el-form-item>
         <el-form-item class="remember-cont" prop="checked">

+ 14 - 1
src/views/customer/PotentialUserList.vue

@@ -4,6 +4,7 @@ import { apiCustomerUser } from '@/api/customer'
 import { useRouter } from 'vue-router'
 import { ElMessage, ElMessageBox } from 'element-plus'
 import EnableUser from './components/EnableUser.vue'
+import UserStatisticDetail from './reportStatistic/components/UserStatisticDetail.vue'
 
 const router = useRouter()
 
@@ -53,6 +54,8 @@ async function getUserList() {
     KeyWord: filterState.keyword,
     RegisterStartDate: filterState.regsiterTime ? filterState.regsiterTime[0] : '',
     RegisterEndDate: filterState.regsiterTime ? filterState.regsiterTime[1] : '',
+    LastUpdateStartDate:filterState.readTime ? filterState.readTime[0] : '',
+    LastUpdateEndDate:filterState.readTime ? filterState.readTime[1] : '',
     SortParam:filterState.sortType,
     SortType:filterState.sortVal
   })
@@ -95,6 +98,15 @@ function handleEditUser(e) {
   })
 }
 
+const showDetail=ref(false)
+const activeUserId=ref(0)
+const activeUserName=ref('')
+function handleShowDetail(e){
+  activeUserId.value=e.UserId
+  activeUserName.value=e.RealName
+  showDetail.value=true
+}
+
 
 </script>
 
@@ -170,6 +182,7 @@ function handleEditUser(e) {
               :style="{ color: !row.Status ? '#f00' : '' }"
               >{{ row.Status ? "启用" : "禁用" }}</span
             >
+            <el-button v-else-if="column.key === 'ReadCnt'&&row.ReadCnt>0" link type="primary" @click="handleShowDetail(row)">{{row.ReadCnt}}</el-button>
             <span v-else>{{ row[column.key] }}</span>
           </template>
         </el-table-column>
@@ -193,7 +206,7 @@ function handleEditUser(e) {
       />
     </div>
   </div>
-
+  <UserStatisticDetail v-model:show="showDetail" :userId="activeUserId" :userName="activeUserName"/>
 </template>
 
 <style lang="scss" scoped>

+ 18 - 2
src/views/customer/reportStatistic/List.vue

@@ -2,6 +2,9 @@
 import { Search,Switch } from '@element-plus/icons-vue'
 import { apiCustomerStatistic } from '@/api/customer'
 import UserStatisticDetail from './components/UserStatisticDetail.vue'
+import { useRouter } from 'vue-router'
+
+const router=useRouter()
 
 const emits=defineEmits(['change'])
 
@@ -99,11 +102,23 @@ function handleFilterList() {
 
 const showDetail=ref(false)
 const activeUserId=ref(0)
+const activeUserName=ref('')
 function handleShowDetail(e){
   activeUserId.value=e.UserId
+  activeUserName.value=e.RealName
   showDetail.value=true
 }
 
+// 跳转详情
+function handleGoDetail(e){
+  router.push({
+    path:'/customer/userDetail',
+    query:{
+      id:e.UserId
+    }
+  })
+}
+
 </script>
 
 <template>
@@ -190,6 +205,7 @@ function handleShowDetail(e){
         element-loading-text="数据加载中..."
         v-loading="tableLoading"
         @sort-change="handleTableSort"
+        @row-click="handleGoDetail"
       >
         <el-table-column
           v-for="column in tableColOpt"
@@ -204,7 +220,7 @@ function handleShowDetail(e){
               :style="{ color: !row.Status ? '#f00' : '' }"
               >{{ row.Status ? "启用" : "禁用" }}</span
             >
-            <el-button v-else-if="column.key === 'ReadCnt'&&row.ReadCnt>0" link type="primary" @click="handleShowDetail(row)">{{row.ReadCnt}}</el-button>
+            <el-button v-else-if="column.key === 'ReadCnt'&&row.ReadCnt>0" link type="primary" @click.stop="handleShowDetail(row)">{{row.ReadCnt}}</el-button>
             <span v-else>{{ row[column.key] }}</span>
           </template>
         </el-table-column>
@@ -220,7 +236,7 @@ function handleShowDetail(e){
       />
     </div>
   </div>
-  <UserStatisticDetail v-model:show="showDetail" :userId="activeUserId"/>
+  <UserStatisticDetail v-model:show="showDetail" :userId="activeUserId" :userName="activeUserName"/>
 </template>
 
 <style lang="scss" scoped>

+ 8 - 2
src/views/customer/reportStatistic/components/UserStatisticDetail.vue

@@ -8,7 +8,12 @@ const props = defineProps({
   userId: {
     type: Number,
     default: 0
+  },
+  userName:{
+    type:String,
+    default:''
   }
+
 })
 
 const tableColOpt = [
@@ -76,7 +81,7 @@ watch(() => show.value, (n) => {
 </script>
 
 <template>
-  <el-dialog v-model="show" width="850" title="研报阅读统计" draggable>
+  <el-dialog v-model="show" width="850" :title="props.userName+'研报统计'" draggable>
     <div class="user-statistic-detail-wrap">
       <div>
         <select-permission
@@ -99,13 +104,14 @@ watch(() => show.value, (n) => {
           @change="handleRefreshList"
         />
       </div>
-      <div class="total-text">有{{ totals }}条阅读记录</div>
+      <div class="total-text">有{{ totals }}条阅读记录</div>
       <el-table
         :data="list"
         border
         highlight-current-row
         element-loading-text="数据加载中..."
         v-loading="tableLoading"
+        height="700px"
       >
         <el-table-column
           v-for="column in tableColOpt"

+ 1 - 1
src/views/system/RoleList.vue

@@ -40,7 +40,7 @@ function handleEdit(e) {
 }
 async function handleSubmitForm() {
   await formRef.value.validate()
-  const res = activeItem.value ? await apiSystemRole.roleAdd({
+  const res = !activeItem.value ? await apiSystemRole.roleAdd({
     SysRoleName: formState.name
   }) : await apiSystemRole.roleEdit({
     SysRoleName: formState.name,