2 İşlemeler 8fb5395892 ... e66814ae64

Yazar SHA1 Mesaj Tarih
  hzx e66814ae64 用户不能操作被分享APP 1 hafta önce
  hidewnd f7d33428f8 feat: 增加渠道列表/应用列表归属用户操作校验 1 hafta önce

+ 2 - 1
.env.development

@@ -3,7 +3,8 @@ ENV = 'development'
 # 线上测试
 # VITE_BASE_URL = 'http://advise.ytmdm.com/gateway'
 # VITE_BASE_URL = 'https://test.book.ytpm.net/yt-gateway'
-VITE_BASE_URL = 'http://119.45.71.139:25001'
+# VITE_BASE_URL = 'http://119.45.71.139:25001'
+VITE_BASE_URL = 'http://192.168.1.252:25001'
 
 # 本地 
 # VITE_BASE_URL = 'http://192.168.1.9:25001'

+ 1 - 0
package.json

@@ -5,6 +5,7 @@
     "dev": "vite",
     "start": "vite",
     "build": "vite build --mode=production",
+    "build:dev": "vite build --mode=development",
     "build:stag": "vite build --mode=staging",
     "serve": "vite preview"
   },

+ 30 - 11
src/views/main/outBagModule/appAdmin.vue

@@ -52,7 +52,7 @@
         <el-table-column label="操作" width="130" v-permission="'permission'">
           <template #default="scope">
             <div class="button">
-              <div>
+              <div v-if="scope.row.userId == store.state.user.info.userId">
                 <el-link class="button-item" type="primary" style="margin-bottom: 5px" @click="edit(scope.row)">
                   编辑
                 </el-link>
@@ -62,6 +62,11 @@
                   </template>
                 </el-popconfirm>
               </div>
+              <div v-else>
+                <el-link class="button-item" type="primary" style="margin-bottom: 5px" @click="edit(scope.row, true)">
+                  查看
+                </el-link>
+              </div>
               <!-- <div>
                 <el-link class="button-item" type="primary" style="margin-bottom: 5px"
                   @click="assignPromoter(scope.row)">
@@ -85,13 +90,13 @@
         <el-row :gutter="5">
           <el-col :span="10">
             <el-form-item label="应用名称:" required prop="appName">
-              <el-input v-model="formEdit.appName" placeholder="请输入" clearable />
+              <el-input v-model="formEdit.appName" placeholder="请输入" clearable :readonly="layer.readonly"/>
             </el-form-item>
           </el-col>
           <el-col :span="2"></el-col>
           <el-col :span="10">
             <el-form-item label="应用类型:" prop="appType">
-              <el-select v-model="formEdit.appType">
+              <el-select v-model="formEdit.appType" :disabled="layer.readonly">
                 <el-option v-for="item in getOptions('app_type')" :key="item.label" :value="item.value" :label="item.label" />
               </el-select>
             </el-form-item>
@@ -100,7 +105,7 @@
         <el-row :gutter="5">
           <el-col :span="10">
             <el-form-item label="出包渠道:" required prop="ditchId">
-              <el-select v-model="formEdit.ditchId">
+              <el-select v-model="formEdit.ditchId" :disabled="layer.readonly">
                 <el-option v-for="item in ditchListData" :key="item.ditchId" :value="item.ditchId"
                   :label="item.ditchName" />
               </el-select>
@@ -109,7 +114,7 @@
           <el-col :span="2"></el-col>
           <el-col :span="10">
             <el-form-item label="所属应用:" required prop="superiorId">
-              <el-select v-model="formEdit.superiorId">
+              <el-select v-model="formEdit.superiorId" :disabled="layer.readonly">
                 <el-option v-for="item in issuedAppData" :key="item.appId" :value="item.appId" :label="item.appName" />
               </el-select>
             </el-form-item>
@@ -118,7 +123,7 @@
         <el-row :gutter="5">
           <el-col :span="10">
             <el-form-item label="版本号:" prop="versionCode">
-              <el-input v-model="formEdit.versionCode" placeholder="请输入" clearable />
+              <el-input v-model="formEdit.versionCode" placeholder="请输入" clearable :readonly="layer.readonly" />
             </el-form-item>
           </el-col>
           <!-- <el-col :span="2"></el-col>
@@ -130,7 +135,7 @@
           </el-col> -->
         </el-row>
         <el-form-item label="更新提示:" prop="updateTips">
-          <el-input v-model="formEdit.updateTips" type="textarea" placeholder="请输入" clearable />
+          <el-input v-model="formEdit.updateTips" type="textarea" placeholder="请输入" clearable :readonly="layer.readonly"/>
         </el-form-item>
       </el-form>
     </Layer>
@@ -166,6 +171,7 @@ import Table from "@/components/table/index.vue";
 import Layer from "@/components/layer/index.vue";
 import { usePermission } from '@/hooks/usePermission.js'
 import { promoterUserAssignment, promoterUserAssignmentDelete, promoterUserQueryList } from "@/api/outBagModule.js";
+import store from '@/store'
 
 const { checkPermission } = usePermission()
 const { loadDictData, getDictionaryName, getOptions } = useGetDictList();
@@ -189,6 +195,7 @@ const formSearch = ref({
 const dynamicFormItems = ref([]);
 
 onBeforeMount(() => {
+  console.log('store.state.user', store.state.user)
   settingData();
   getList();
   getDitchList();
@@ -291,6 +298,7 @@ const layer = ref({
   show: false,
   title: "新增App",
   showButton: true,
+  readonly: false,
   width: "60vw",
   edit: false,
 });
@@ -309,16 +317,27 @@ const formEdit = ref({
   revenueDisplayRate: '',//收益,显示比例
 });
 
-const edit = (row) => {
+const edit = (row, isView = false) => {
   ruleForm.value?.resetFields();
-  if (row) {
+  layer.value.showButton = true;
+  layer.value.readonly = false;
+  if(row && isView) {
+    layer.value.title = "查看APP";
+    layer.value.edit = false;
+    layer.value.showButton = false;
+    layer.value.readonly = true;
+    formEdit.value = row;
+    formEdit.value.ditchId = Number(row.ditchId)
+    formEdit.value.revenueDisplayRate = Number(row.revenueDisplayRate)
+  }
+  else if (row) {
     layer.value.title = "编辑APP";
     layer.value.edit = true;
     formEdit.value = row;
     formEdit.value.ditchId = Number(row.ditchId)
     formEdit.value.revenueDisplayRate = Number(row.revenueDisplayRate)
-
-  } else {
+  } 
+  else {
     layer.value.title = "新增APP";
     layer.value.edit = false;
     formEdit.value = {};

+ 2 - 3
src/views/main/outBagModule/channelTypeAdmin.vue

@@ -23,7 +23,7 @@
         </el-table-column>
         <el-table-column label="操作" width="100" v-permission="'permission'">
           <template #default="scope">
-            <div class="button">
+            <div class="button" v-if="scope.row.userId == store.state.user.info.userId">
               <el-link class="button-item" type="primary" style="margin-bottom: 5px;" @click="edit(scope.row)">
                 编辑
               </el-link>
@@ -65,12 +65,11 @@ import Layer from '@/components/layer/index.vue'
 import { ElMessage } from 'element-plus'
 import { convertUTCToBeijing } from '@/utils/index.js'
 import { useGetDictList } from '@/hooks/useGetDictList.js'
-import { useStore } from 'vuex'
 import { ditchList, ditchAddOne, ditchDeleteOne, ditchUpdateOne } from '@/api/outBagModule.js'
 import { usePermission } from '@/hooks/usePermission.js'
+import store from '@/store'
 
 const { checkPermission } = usePermission()
-const store = useStore()
 const { dictData, loadDictData, getOptions, getDictionaryName } = useGetDictList();
 const form = ref(null);
 const tableData = ref([]);

+ 20 - 0
src/views/main/userModule/relieveLogsList.vue

@@ -86,6 +86,8 @@ const store = useStore()
 const { dictData, loadDictData, getOptions, getDictionaryName } = useGetDictList();
 const form = ref(null);
 const tableData = ref([]);
+// 用户分享的渠道AppiD
+//const shareAppIds = ref([]);
 
 // 分页参数, 供table使用
 const page = reactive({
@@ -159,6 +161,19 @@ const getApiOptions = async () => {
       value: item.ditchId
     }))
 
+    // const currentUserId = store.state.user.info.userId
+    // ditchData.forEach(item => {
+    //   // 检查是否满足条件:sharedUserId 等于当前登录用户的 userId
+    //   if (item.sharedUserId === currentUserId) {
+    //     // 将符合条件的 appId 添加到 shareAppIds 数组中
+    //     shareAppIds.value.push(item.appId)
+    //   }
+    // })
+
+    // // 去重,避免重复添加相同的 appId
+    // shareAppIds.value = [...new Set(shareAppIds.value)]
+    // console.log("分享的appId",shareAppIds)  
+
     // 赋值到表单项
     dynamicFormItems.value[2].options = ditchOptions
 
@@ -246,6 +261,11 @@ const formEdit = ref({
 })
 
 const edit = (row) => {
+  // 检查权限
+  // if (shareAppIds.value.includes(row.appId)) {
+  //   ElMessage.warning('您没有权限修改此应用下的用户状态')
+  //   return
+  // }
   ruleForm.value?.resetFields()
   layer.value.show = true
 

+ 41 - 0
src/views/main/userModule/riskLogsList.vue

@@ -55,6 +55,27 @@
             {{ convertUTCToBeijing(scope.row.registryTime) }}
           </template>
         </el-table-column>
+        
+        <!-- <el-table-column label="操作" width="150" fixed="right">
+          <template #default="scope">
+            <div class="button">
+              <el-tooltip 
+                :content="shareAppIds.includes(scope.row.appId) ? '您没有权限解封此应用下的用户' : '用户解封'"
+                placement="top"
+              >
+                <el-button 
+                  class="button-item" 
+                  type="primary" 
+                  style="margin-bottom: 5px;" 
+                  @click="editUserType(scope.row)"
+                  :disabled="shareAppIds.includes(scope.row.appId)"
+                >
+                解封
+                </el-button>
+              </el-tooltip>
+            </div>
+          </template>
+        </el-table-column>   -->
       </Table>
     </div>
 
@@ -88,6 +109,8 @@
   const { dictData, loadDictData, getOptions, getDictionaryName } = useGetDictList();
   const form = ref(null);
   const tableData = ref([]);
+  // 用户分享的渠道AppiD
+  //const shareAppIds = ref([]);
 
   // 分页参数, 供table使用
   const page = reactive({
@@ -166,6 +189,19 @@ const getApiOptions = async () => {
     // 赋值到表单项
     dynamicFormItems.value[3].options = ditchOptions
 
+    // const currentUserId = store.state.user.info.userId
+    // ditchData.forEach(item => {
+    //   // 检查是否满足条件:sharedUserId 等于当前登录用户的 userId
+    //   if (item.sharedUserId === currentUserId) {
+    //     // 将符合条件的 appId 添加到 shareAppIds 数组中
+    //     shareAppIds.value.push(item.appId)
+    //   }
+    // })
+    // // 去重,避免重复添加相同的 appId
+    // shareAppIds.value = [...new Set(shareAppIds.value)]
+    // console.log("分享的appId",shareAppIds)
+
+
     // 获取列表数据
     getList()
   } catch (err) {
@@ -259,6 +295,11 @@ const getApiOptions = async () => {
   })
 
   const editUserType = (row) => {
+    // 检查权限
+    // if (shareAppIds.value.includes(row.appId)) {
+    //   ElMessage.warning('您没有权限解封此应用下的用户')
+    //   return
+    // }
     ruleForm.value?.resetFields()
     layer.value.show = true
     layer.value.title = `解封用户${row.nickName}`

+ 23 - 9
src/views/main/userModule/userList.vue

@@ -7,13 +7,13 @@
     <div class="btn">
       <el-button type="" v-if="formSearch.appIds && selectData.length > 0" @click="clearSelection">取消全选</el-button>
       <!-- <el-button type="primary" :disabled="!selectData.length > 0" @click="userCheck">批量审核</el-button> -->
-      <el-button type="danger" :disabled="!selectData.length > 0" @click="edit({}, 2)">批量封禁母包</el-button>
-      <el-button type="danger" :disabled="!selectData.length > 0" @click="edit({}, 1)">批量封禁</el-button>
-      <el-button type="danger" :disabled="!selectData.length > 0" @click="edit({}, 3)">批量封禁IP</el-button>
-      <el-button type="primary" :disabled="!selectData.length > 0" @click="editUserType({}, true)">批量解封</el-button>
-      <el-button type="success" :disabled="!selectData.length > 0" @click="exportUserList">批量导出</el-button>
-      <el-tooltip class="box-item" effect="dark" content="慎用 比较占用服务器资源!!! 导出数量(根据左下角条数)" placement="bottom">
-        <el-button type="warning" :disabled="!page.total > 0" @click="allExportUserList">全部导出</el-button>
+      <el-button type="danger" v-if="appShare" :disabled="!selectData.length > 0" @click="edit({}, 2)">批量封禁母包</el-button>
+      <el-button type="danger" v-if="appShare" :disabled="!selectData.length > 0" @click="edit({}, 1)">批量封禁</el-button>
+      <el-button type="danger" v-if="appShare" :disabled="!selectData.length > 0" @click="edit({}, 3)">批量封禁IP</el-button>
+      <el-button type="primary" v-if="appShare" :disabled="!selectData.length > 0" @click="editUserType({}, true)">批量解封</el-button>
+      <el-button type="success" v-if="appShare" :disabled="!selectData.length > 0" @click="exportUserList">批量导出</el-button>
+      <el-tooltip class="box-item" v-if="appShare" effect="dark" content="慎用 比较占用服务器资源!!! 导出数量(根据左下角条数)" placement="bottom">
+        <el-button type="warning"  :disabled="!page.total > 0" @click="allExportUserList">全部导出</el-button>
       </el-tooltip>
     </div>
 
@@ -204,6 +204,9 @@ const { loadDictData, getOptions, getDictionaryName } = useGetDictList();
 const tableData = ref([]);
 const table = ref(null)
 const appType = ref(1)
+const appShare = ref(false);
+// 新增:存储所有应用选项的响应式变量
+const allAppsOptions = ref([]);
 
 // 分页参数, 供table使用
 const page = reactive({
@@ -315,8 +318,10 @@ const getApiOptions = async () => {
     const appsOptions = appData.map(item => ({
       label: item.appName,
       value: item.appId,
-      appType: item.appType
+      appType: item.appType,
+      appUserId: item.userId
     }))
+    allAppsOptions.value = appsOptions;
 
     // 赋值到表单项
     dynamicFormItems.value[3].options = ditchOptions
@@ -329,6 +334,9 @@ const getApiOptions = async () => {
       dynamicFormItems.value[2].defaultVal = firstApp.value
       formSearch.value.appIds = firstApp.value
 
+      // 判断第一个应用是否属于当前用户
+      appShare.value = appsOptions[0].appUserId == store.state.user.info.userId;
+
       dynamicFormItemsTarget.value = appsOptions[0].appType === 1
         ? dynamicFormItems.value.slice(0, 7)
         : dynamicFormItems.value
@@ -433,11 +441,17 @@ const handleFormReset = () => {
 
 const handleFormSelect = (item, e) => {
   if (item.prop === 'appIds') {
+    // 查找选中的应用信息
+    const selectedApp = allAppsOptions.value.find(app => app.value === e);
+    if (selectedApp) {
+      // 判断选中的应用是否属于当前用户
+      appShare.value = selectedApp.appUserId == store.state.user.info.userId;
+    } 
+
     const options = item.options
     // appType 1-安卓 2-IOS
     const appTypeNum = options.find((item) => item.value === e).appType
 
-
     dynamicFormItems.value[0].defaultVal = formSearch.value.nickName
     dynamicFormItems.value[1].defaultVal = formSearch.value.userId
     dynamicFormItems.value[2].defaultVal = e