2 Commits 9d9e5d2927 ... 61aadcb0b7

Autor SHA1 Mensagem Data
  liuxiaona 61aadcb0b7 成员管理 - 权限管理 - 项目管理开发 10 meses atrás
  liuxiaona d549e2a75b 项目管理 10 meses atrás

+ 15 - 1
src/api/ApiModel.ts

@@ -47,7 +47,11 @@ export interface menuParam{
47 47
     icon?:string,
48 48
     parent_id?:string|number,
49 49
     id?:string|number,
50
-    p_id?:any
50
+    p_id?:any,
51
+    name?:string,
52
+    note?:string,
53
+    permission_ids?:any,
54
+    permission_levels?:any,
51 55
 }
52 56
 export interface accountParam extends pageParams{
53 57
     username?:string,
@@ -236,6 +240,16 @@ export interface departParams{
236 240
     name?:string,
237 241
     pid?:string|number,
238 242
     id?:string|number,
243
+    note?:string,
244
+    head_user_id?:any,
245
+    show_type?:string|number,
246
+    department_ids?:any,
247
+    user_ids?:any,
248
+    username?:string,
249
+    password?:string,
250
+    department_id?:any,
251
+    role_id?:any,
252
+    keyword?:string
239 253
 }
240 254
 
241 255
 

+ 13 - 0
src/api/api.ts

@@ -131,6 +131,19 @@ export enum Api{
131 131
     project_edit = '/api/sys/projectsEdit',
132 132
     project_dele = '/api/sys/projectsDel',
133 133
 
134
+    //权限
135
+    limit_add = '/api/sys/roleAdd',
136
+    limit_list = '/api/sys/roleList',
137
+    limit_edit = '/api/sys/roleEdit',
138
+    limit_dele = '/api/sys/roleDel',
139
+
140
+    //人员
141
+    user_list = '/api/sys/userList',
142
+    user_add = '/api/sys/userAdd',
143
+    user_edit = '/api/sys/userEdit',
144
+    user_dele = '/api/sys/userDel',
145
+
146
+
134 147
 
135 148
 
136 149
 

+ 224 - 0
src/components/businessMoudle/limitManage/addPage.vue

@@ -0,0 +1,224 @@
1
+<template>
2
+  <div class="addPageBox"  v-loading="loading">
3
+    <Drawer :drawerShow="drawer_show" @close="closeEvent" :title="pageInfo.title" drawerSize="70%" :closeOnModal="false">
4
+      <template v-slot:content>
5
+      <div style="background-color: #fff;height: 100%">
6
+        <div class="itemBox">
7
+          <div class="title">基础信息</div>
8
+          <div class="contBox">
9
+            <Input ref="InputRef_name" spanFS="14px" title="权限名称" spanTitleWidth="100px" inputWidth="300px" placeholderTxt="权限名称" />
10
+            <Input ref="InputRef_note" spanFS="14px" class="tMar20" spanTitleWidth="100px" inputWidth="300px" title="权限描述" placeholderTxt="权限描述"/>
11
+          </div>
12
+        </div>
13
+
14
+        <div class="itemBox">
15
+          <div class="title">权限配置</div>
16
+          <div class="contBox">
17
+            <!--  列表-->
18
+            <TableList
19
+                ref="tableListRef"
20
+                :tableData="pageInfo.menuList"
21
+                :descol="tableInfo.descolList"
22
+            >
23
+              <template v-slot:subPage="slotProps">
24
+                <div>
25
+                  <el-checkbox-group v-model="slotProps.row.pageCheckList">
26
+                    <el-checkbox v-for="sub in slotProps.row.subList" :label="sub.id" :key="sub.id">{{sub.title}}</el-checkbox>
27
+                  </el-checkbox-group>
28
+                </div>
29
+              </template>
30
+              <template v-slot:limit="slotProps">
31
+                <div class="text-center" v-if="slotProps.row.title !== '首页'">
32
+                  <el-radio-group v-model="slotProps.row.limitCheckList">
33
+                    <el-radio :label="1">个人</el-radio>
34
+                    <el-radio :label="2">部门</el-radio>
35
+                    <el-radio :label="3">公司</el-radio>
36
+                    <el-radio :label="4">项目</el-radio>
37
+                  </el-radio-group>
38
+                </div>
39
+              </template>
40
+            </TableList>
41
+          </div>
42
+        </div>
43
+
44
+        <div class="itemBox">
45
+          <div class="contBox">
46
+            <el-button type="primary" plain @click="closeEvent" size="large">&nbsp;&nbsp;取消&nbsp;&nbsp;</el-button>
47
+            <el-button type="primary" @click="confirmEvent" size="large">&nbsp;&nbsp;确定&nbsp;&nbsp;</el-button>
48
+          </div>
49
+        </div>
50
+      </div>
51
+      </template>
52
+    </Drawer>
53
+  </div>
54
+</template>
55
+<script setup lang="ts">
56
+import {getCurrentInstance, nextTick, reactive, ref} from "vue";
57
+import Drawer from '@/components/capsulationMoudle/_drawer.vue'
58
+import Input from '@/components/capsulationMoudle/_input.vue'
59
+import {menuParam, reactiveTableAndAny} from "@/api/ApiModel";
60
+import TableList from '@/components/capsulationMoudle/tableList.vue'
61
+import {ElMessage} from "element-plus";
62
+import {Api} from "@/api/api";
63
+import {publicTableTs} from "@/components/businessMoudle/tableInfo";
64
+
65
+const { proxy } = getCurrentInstance() as any;
66
+// 全局方法定义
67
+const NumberHandle = proxy.$NumberHandle
68
+
69
+const emit = defineEmits<{
70
+  (event: "init"): void;
71
+}>();
72
+
73
+const props = withDefaults(defineProps<{
74
+  folderObj?:any
75
+}>(), {
76
+  folderObj:{}
77
+})
78
+
79
+const loading = ref<boolean>(false)
80
+// 表格数据公共ts
81
+const descolParams = reactive([
82
+  { name:'功能模块',column:'title',},
83
+  { name:'页面范畴',column:'subPage',slotFlag: true},
84
+  { name:'数据权限',column:'limit',slotFlag: true},
85
+])
86
+const { tableInfo,tableListRef,total } = publicTableTs(descolParams)
87
+
88
+const pageInfo = reactive<reactiveTableAndAny>({
89
+  title:'新增权限',
90
+  menuList:[],
91
+  editId:-1
92
+})
93
+
94
+// 切换显隐
95
+const drawer_show = ref<boolean>(false)
96
+const switchShow = (val:boolean,item?:any)=>{
97
+  drawer_show.value = val
98
+  nextTick(async ()=>{
99
+    if(val){
100
+      await getMenuList()
101
+      if(item!.id){
102
+        pageInfo.editId = item!.id
103
+        InputRef_name.value!.value = item.name
104
+        InputRef_note.value!.value = item.note
105
+        pageInfo.menuList.forEach(sub=>{
106
+          for(let i in item.permission_levels){
107
+            if(sub.levelName == i){
108
+              sub.limitCheckList = item.permission_levels[i]
109
+            }
110
+          }
111
+        })
112
+      }else{
113
+        pageInfo.editId =  -1
114
+        InputRef_name.value!.value = ''
115
+        InputRef_note.value!.value = ''
116
+      }
117
+
118
+    }
119
+  })
120
+}
121
+
122
+const closeEvent = () => {
123
+  drawer_show.value = false
124
+}
125
+const InputRef_name = ref<{value:string}>()
126
+const InputRef_note = ref<{value:string}>()
127
+const confirmEvent = async () => {
128
+  loading.value = true
129
+  let ids:any = []
130
+  let levels:any = {}
131
+  pageInfo.menuList.forEach(item=>{
132
+    ids = ids.concat(item.pageCheckList)
133
+    let newObj:any = {}
134
+    newObj[item.levelName] = item.limitCheckList
135
+    levels = Object.assign(levels,newObj)
136
+  })
137
+  const paramsModel = reactive<menuParam>({
138
+    name:InputRef_name.value!.value,
139
+    note:InputRef_note.value!.value,
140
+    permission_ids:ids,
141
+    permission_levels:JSON.stringify(levels),
142
+  })
143
+  let api = Api.limit_add
144
+  if(pageInfo.editId > 0){
145
+    api = Api.limit_edit
146
+    paramsModel.id = pageInfo.editId
147
+  }
148
+  let res:any = await proxy.$http.post(api,paramsModel)
149
+  loading.value = false
150
+  ElMessage.info(res.errMsg)
151
+  if(res&&res.errNo=='0'){
152
+    closeEvent()
153
+    emit('init')
154
+  }
155
+}
156
+
157
+
158
+
159
+//菜单列表
160
+const getMenuList = async () => {
161
+  let res:any = await proxy.$http.get(Api.menu_list)
162
+  if(res&&res.errNo=='0'){
163
+    pageInfo.menuList = res.rst
164
+    pageInfo.menuList.forEach(sub=>{
165
+      if(sub.title == '首页'){
166
+        sub.subList = [{id:7,title:'首页'}]
167
+      }else{
168
+        getSubMenuList(sub.id).then(result =>{
169
+          sub.subList = result
170
+        })
171
+        if(sub.title == '广告管理'){
172
+          sub.levelName = 'ad'
173
+        }else if(sub.title == '系统管理'){
174
+          sub.levelName = 'system'
175
+        }else if(sub.title == '素材管理'){
176
+          sub.levelName = 'material'
177
+        }
178
+      }
179
+    })
180
+  }
181
+}
182
+
183
+//子菜单列表
184
+const getSubMenuList = async (id:number) => {
185
+  const paramsModel = reactive<menuParam>({
186
+    parent_id:id,
187
+  })
188
+  let res:any = await proxy.$http.get(Api.menu_list,paramsModel)
189
+  return res&&res.errNo=='0' ? res.rst : []
190
+}
191
+
192
+// 父组件共享值
193
+defineExpose({
194
+  switchShow,
195
+});
196
+</script>
197
+<style scoped lang="scss">
198
+.addPageBox{
199
+  :deep(.el-drawer__header){
200
+    margin-bottom: 0;
201
+    background-color: #fff;
202
+    padding-bottom: 20px;
203
+    color: #161E46;
204
+    font-weight: 600;
205
+  }
206
+  :deep(.el-drawer__body){
207
+    background-color: #F7F7F7;
208
+  }
209
+}
210
+
211
+.itemBox{
212
+  margin-bottom: 10px;
213
+  .title{
214
+    width: 100%;
215
+    padding: 27px 33px 10px;
216
+    font-weight: 600;
217
+    font-size: 16px;
218
+  }
219
+  .contBox{
220
+    background-color: #fff;
221
+    padding: 18px 33px;
222
+  }
223
+}
224
+</style>

+ 19 - 19
src/components/businessMoudle/limitManage/index.vue

@@ -13,17 +13,21 @@
13 13
   >
14 14
     <template v-slot:operate="slotProps">
15 15
       <div class="text-center">
16
-        <span class="operate_text lMar8 pointer" @click="editEvent(slotProps.row)">编辑</span>
16
+        <span class="operate_text lMar8 pointer" @click="limitsAdd(slotProps.row)">编辑</span>
17 17
         <Popconfirm @confirm="deleEvent(slotProps.row)"/>
18 18
       </div>
19 19
     </template>
20 20
   </TableList>
21
+
22
+
23
+  <AddPage ref="AddPageRef" @init="init"></AddPage>
21 24
 </template>
22 25
 <script setup lang="ts">
23 26
 import {nextTick, onMounted, reactive, ref, getCurrentInstance} from 'vue'
24 27
 import Popconfirm from '@/components/capsulationMoudle/_popconfirm.vue'
25 28
 import TableList from '@/components/capsulationMoudle/tableList.vue'
26
-import { adqParam, reactiveTableAndAny} from "@/api/ApiModel";
29
+import AddPage from './addPage.vue'
30
+import {departParams} from "@/api/ApiModel";
27 31
 import {Api} from "@/api/api";
28 32
 import {ElMessage} from "element-plus";
29 33
 import { publicTableTs } from '@/components/businessMoudle/tableInfo'
@@ -33,31 +37,30 @@ const { proxy } = getCurrentInstance() as any;
33 37
 
34 38
 // 表格数据公共ts
35 39
 const descolParams = reactive([
36
-  { name:'权限名称',column:'account_name',},
37
-  { name:'描述',column:'account_id',cancleForMat:true},
40
+  { name:'权限名称',column:'name',},
41
+  { name:'描述',column:'note',cancleForMat:true},
38 42
   { name:'更新时间',column:'created_at'},
39 43
   { name:'操作',column:'operate',slotFlag: true},
40 44
 ])
41 45
 const { tableInfo,tableListRef,total } = publicTableTs(descolParams)
42 46
 
43
-const limitsAdd = () => {
44 47
 
48
+const AddPageRef = ref<{switchShow:(val:boolean,item?:any)=>void}>()
49
+const limitsAdd = (item?:any) => {
50
+  nextTick(()=>{
51
+    AddPageRef.value!.switchShow(true,item||'')
52
+  })
45 53
 }
46 54
 
47 55
 const InputRef_text = ref<{value:string}>()
48 56
 
49 57
 //账号列表
50
-const init = async (page?:any,pageSize?:any) => {
58
+const init = async () => {
51 59
   tableListRef.value!.loading = true
52
-  const paramsModel = reactive<adqParam>({
53
-    page:page?page:1,
54
-    page_size:pageSize?pageSize:20,
55
-  })
56
-  let res:any = await proxy.$http.get(Api.adq_list,paramsModel)
60
+  let res:any = await proxy.$http.get(Api.limit_list)
57 61
   tableListRef.value!.loading = false
58 62
   if(res&&res.errNo=='0'){
59
-    tableInfo.tableList = res.rst.data
60
-    total.value = res.rst.pageInfo.total
63
+    tableInfo.tableList = res.rst
61 64
   }else{
62 65
     ElMessage.error(res.errMsg)
63 66
   }
@@ -65,10 +68,10 @@ const init = async (page?:any,pageSize?:any) => {
65 68
 
66 69
 const deleEvent = async (item:any) => {
67 70
   tableListRef.value!.loading = true
68
-  const paramsModel = reactive<adqParam>({
69
-    account_id:item.id
71
+  const paramsModel = reactive<departParams>({
72
+    id:item.id
70 73
   })
71
-  let res:any = await proxy.$http.post(Api.adq_dele,paramsModel)
74
+  let res:any = await proxy.$http.post(Api.limit_dele,paramsModel)
72 75
   tableListRef.value!.loading = false
73 76
   ElMessage.info(res.errMsg)
74 77
   if(res&&res.errNo=='0'){
@@ -76,9 +79,6 @@ const deleEvent = async (item:any) => {
76 79
   }
77 80
 }
78 81
 
79
-const editEvent = (item:any) => {
80
-
81
-}
82 82
 
83 83
 
84 84
 onMounted( async ()=>{

+ 71 - 20
src/components/businessMoudle/memberManage/dialog/addMember.vue

@@ -8,20 +8,24 @@
8 8
           dialog-title="添加人员">
9 9
     <template v-slot:content>
10 10
       <div class="dialogBox" v-loading="loading">
11
-        <Input ref="nameRef" spanTitleWidth="50px" title="用户名" :haveTag="true"/>
12
-        <Input ref="nameRef" spanTitleWidth="50px" title="密码" :haveTag="true"/>
13
-        <div class="flex">
14
-          <Input ref="nameRef" spanTitleWidth="50px" title="部门" :haveTag="true"/>
15
-          <span>
16
-            <el-icon :size="20"><i-ep-Plus/></el-icon>
17
-            添加部门
18
-          </span>
11
+        <Input ref="nameRef" spanTitleWidth="80px" title="用户名" :haveTag="true"/>
12
+        <Input ref="psdRef" spanTitleWidth="80px" class="tMar20" title="密码" :haveTag="true"/>
13
+        <div class="flex tMar20">
14
+          <span class="spanTitle f14" style="width: 80px;">部门</span>
15
+          <el-tree-select v-model="pageInfo.treeValue"
16
+                          filterable
17
+                          :highlight-current="true"
18
+                          :props="defaultProps"
19
+                          node-key="id"
20
+                          :data="pageInfo.departList"
21
+                          :render-after-expand="false" />
19 22
         </div>
20 23
         <Select ref="ideaManRef"
24
+                spanTitleWidth="80px"
25
+                class="tMar20"
21 26
                 :clearFlag="true"
22 27
                 title="权限"
23
-                :optObj="{k:'id',la:'username',val:'id'}"
24
-                @changeEvent="init()" @clearEvent="init()"
28
+                :optObj="{k:'id',la:'name',val:'id'}"
25 29
                 :options="pageInfo.limitList"/>
26 30
 
27 31
       </div>
@@ -35,7 +39,7 @@ import Dialog from '@/components/capsulationMoudle/_dialog.vue'
35 39
 import Input from '@/components/capsulationMoudle/_input.vue'
36 40
 import {getCurrentInstance, nextTick, onMounted, reactive, ref} from "vue";
37 41
 import {ElMessage} from "element-plus";
38
-import {fileParam, reactiveTableAndAny} from "@/api/ApiModel";
42
+import {departParams, fileParam, reactiveTableAndAny} from "@/api/ApiModel";
39 43
 import {Api} from "@/api/api";
40 44
 
41 45
 const { proxy } = getCurrentInstance() as any;
@@ -47,12 +51,22 @@ const emit = defineEmits<{
47 51
 }>();
48 52
 
49 53
 
54
+const defaultProps = {
55
+  children: 'childs',
56
+  label: 'name',
57
+}
58
+
50 59
 const pageInfo = reactive<reactiveTableAndAny>({
51
-  limitList:[]
60
+  limitList:[],
61
+  departList:[],
62
+  editId:-1,
63
+  treeValue:''
52 64
 })
53 65
 
54 66
 const nameRef=ref<{value:string}>()
55
-const markRef=ref<{value:string}>()
67
+const psdRef=ref<{value:string}>()
68
+const bumenRef=ref<{value:string}>()
69
+const ideaManRef=ref<{value:string}>()
56 70
 const loading=ref<boolean>(false)
57 71
 const confirmEvent = async () => {
58 72
   if(nameRef.value!.value==''){
@@ -60,12 +74,18 @@ const confirmEvent = async () => {
60 74
     return
61 75
   }
62 76
   loading.value = true
63
-  const paramsModel = reactive<fileParam>({
64
-    pid:0,
65
-    name:nameRef.value!.value,
66
-    remarks:markRef.value!.value,
77
+  const paramsModel = reactive<departParams>({
78
+    username:nameRef.value!.value,
79
+    password:psdRef.value!.value,
80
+    department_id:pageInfo.treeValue+'',
81
+    role_id:ideaManRef.value!.value,
67 82
   })
68
-  let res:any = await proxy.$http.post(Api.file_add,paramsModel)
83
+  let api:string = Api.user_add
84
+  if(pageInfo.editId > 0){
85
+    api = Api.user_edit
86
+    paramsModel.id = pageInfo.editId
87
+  }
88
+  let res:any = await proxy.$http.post(api,paramsModel)
69 89
   loading.value = false
70 90
   if(res&&res.errNo=='0'){
71 91
     let resNew:any = res.rst
@@ -76,14 +96,45 @@ const confirmEvent = async () => {
76 96
   }
77 97
 }
78 98
 
99
+const init_depart = async () => {
100
+  let res:any = await proxy.$http.get(Api.depart_list)
101
+  if(res&&res.errNo=='0'){
102
+    let resNew:any = res.rst
103
+    pageInfo.departList = resNew
104
+  }else{
105
+    ElMessage.error(res.errMsg)
106
+  }
107
+}
79 108
 
109
+const init_limit = async () => {
110
+  let res:any = await proxy.$http.get(Api.limit_list)
111
+  if(res&&res.errNo=='0'){
112
+    pageInfo.limitList = res.rst
113
+  }else{
114
+    ElMessage.error(res.errMsg)
115
+  }
116
+}
80 117
 // 切换显隐
81 118
 const dialogShow = ref<boolean>(false)
82
-const switchShow = (val:boolean)=>{
119
+const switchShow = (val:boolean,item?:any)=>{
83 120
   dialogShow.value = val
84 121
   if(val){
85 122
     nextTick(()=>{
86
-      nameRef.value!.value = ''
123
+      init_limit()
124
+      init_depart()
125
+      if(item!.id){
126
+        pageInfo.editId = item!.id
127
+        nameRef.value!.value = item!.username
128
+        psdRef.value!.value = ''
129
+        pageInfo.treeValue = item!.department_id
130
+        ideaManRef.value!.value = item!.role_id
131
+      }else{
132
+        pageInfo.editId =  -1
133
+        nameRef.value!.value = ''
134
+        psdRef.value!.value = ''
135
+        pageInfo.treeValue = ''
136
+        ideaManRef.value!.value = ''
137
+      }
87 138
     })
88 139
   }
89 140
 }

+ 36 - 23
src/components/businessMoudle/memberManage/index.vue

@@ -1,19 +1,15 @@
1 1
 <template>
2
+
2 3
   <div class="screenBox_mini tMar0">
3
-    <Select ref="ideaManRef"
4
-            :clearFlag="true"
5
-            title="账号状态"
6
-            selectWidth="160px"
7
-            :optObj="{k:'id',la:'username',val:'id'}"
8
-            @changeEvent="init()" @clearEvent="init()"
9
-            :options="pageInfo.accStatusList"/>
10
-    <Input ref="InputRef_text" title="" placeholderTxt="用户名或邮箱" @changeEvent="init()" @clearEvent="init()"/>
4
+    <Input ref="InputRef_text" title="" placeholderTxt="名称" @changeEvent="init()" @clearEvent="init()"/>
11 5
   </div>
6
+
7
+
8
+
12 9
   <div class="albumBox flex">
13 10
     <div class="albumTree">
14 11
       <div class="title flex">
15 12
         <el-button type="primary" plain @click="newAddEvent">添加部门</el-button>
16
-        <Input ref="InputRef_text" title="" placeholderTxt="搜索部门" @changeEvent="init()" @clearEvent="init()"/>
17 13
       </div>
18 14
       <div class="companyBox">北京酷炫网络技术股份有限公司</div>
19 15
       <div class="treeBox" v-loading="treeLoading">
@@ -43,7 +39,6 @@
43 39
     <div class="albumContent">
44 40
       <div class="title flex">
45 41
         <el-button type="primary" @click="newAddEvent_member">新增成员</el-button>
46
-        <el-button type="primary" plain @click="startEvent">启用</el-button>
47 42
       </div>
48 43
       <div class="contentBox tMar10" v-loading="fileLoading">
49 44
         <!--  列表-->
@@ -56,9 +51,7 @@
56 51
         >
57 52
           <template v-slot:operate="slotProps">
58 53
             <div class="text-center">
59
-              <span class="operate_text lMar8">编辑</span>
60
-              <Popconfirm key="psd" popTxt="重置密码" @confirm="resetPsd(slotProps.row)"/>
61
-              <Popconfirm key="ty" popTxt="停用" @confirm="outService(slotProps.row)"/>
54
+              <span class="operate_text lMar8" @click="newAddEvent_member(slotProps.row)">编辑</span>
62 55
             </div>
63 56
           </template>
64 57
         </TableList>
@@ -68,6 +61,8 @@
68 61
 
69 62
 <!--  添加部门-->
70 63
   <AddDepartment ref="AddDepartmentRef" @init="init"></AddDepartment>
64
+  <!--  添加部门-->
65
+  <AddMember ref="AddMemberRef" @init="initList"></AddMember>
71 66
 </template>
72 67
 <script setup lang="ts">
73 68
 import {getCurrentInstance, nextTick, onMounted, reactive, ref} from "vue";
@@ -81,6 +76,7 @@ import {ElMessage} from "element-plus";
81 76
 import {publicTableTs} from "@/components/businessMoudle/tableInfo";
82 77
 import Popconfirm from '@/components/capsulationMoudle/_popconfirm.vue'
83 78
 import AddDepartment from '@/components/businessMoudle/memberManage/dialog/addDepartment.vue'
79
+import AddMember from '@/components/businessMoudle/memberManage/dialog/addMember.vue'
84 80
 
85 81
 const { proxy } = getCurrentInstance() as any;
86 82
 // 全局方法定义
@@ -100,6 +96,7 @@ const pageInfo = reactive<reactiveTableAndAny>({
100 96
   treeId:0,
101 97
   accStatusList:[]
102 98
 })
99
+const InputRef_text = ref<{value:string}>()
103 100
 const currentPage = ref<number>(1)
104 101
 const pageSize = ref<number>(20)
105 102
 const fileLoading = ref<boolean>(false)
@@ -108,14 +105,15 @@ const treeLoading = ref<boolean>(false)
108 105
 
109 106
 // 表格数据公共ts
110 107
 const descolParams = reactive([
111
-  { name:'用户名',column:'account_name',},
112
-  { name:'部门',column:'account_id'},
113
-  { name:'权限',column:'type_name',},
114
-  { name:'状态',column:'username',},
108
+  { name:'用户名',column:'username',},
109
+  { name:'部门',column:'department'},
110
+  { name:'权限',column:'role',},
115 111
   { name:'操作',column:'operate',slotFlag: true},
116 112
 ])
117 113
 const { tableInfo,tableListRef,total } = publicTableTs(descolParams)
118 114
 
115
+
116
+
119 117
 // 专辑树点击
120 118
 interface Tree {
121 119
   label: string
@@ -123,6 +121,7 @@ interface Tree {
123 121
 }
124 122
 
125 123
 const AddDepartmentRef = ref<{switchShow:(val:boolean,info?:any)=>void}>()
124
+const AddMemberRef = ref<{switchShow:(val:boolean,info?:any)=>void}>()
126 125
 const newAddEvent = () => {
127 126
   nextTick(()=>{
128 127
     AddDepartmentRef.value!.switchShow(true)
@@ -152,8 +151,10 @@ const deleDepart = async (id:any) => {
152 151
     ElMessage.error(res.errMsg)
153 152
   }
154 153
 }
155
-const newAddEvent_member = () => {
156
-
154
+const newAddEvent_member = (item?:any) => {
155
+  nextTick(()=>{
156
+    AddMemberRef.value!.switchShow(true,item)
157
+  })
157 158
 }
158 159
 const startEvent = () => {
159 160
 
@@ -166,10 +167,21 @@ const init = async () => {
166 167
   if(res&&res.errNo=='0'){
167 168
     let resNew:any = res.rst
168 169
     pageInfo.treeList = resNew
169
-    // if(pageInfo!.treeList!.length>0){
170
-    //   pageInfo.treeId = pageInfo.treeList[pageInfo.treeList.length-1].id
171
-    //   nextTick(()=>{treeRef.value!.setCurrentKey(pageInfo.treeId)})
172
-    // }
170
+  }else{
171
+    ElMessage.error(res.errMsg)
172
+  }
173
+}
174
+
175
+const initList = async () => {
176
+  fileLoading.value = true
177
+  const paramsModel = reactive<departParams>({
178
+    keyword:InputRef_text.value!.value,
179
+  })
180
+  let res:any = await proxy.$http.get(Api.user_list,paramsModel)
181
+  fileLoading.value = false
182
+  if(res&&res.errNo=='0'){
183
+    let resNew:any = res.rst
184
+    tableInfo.tableList = resNew
173 185
   }else{
174 186
     ElMessage.error(res.errMsg)
175 187
   }
@@ -187,6 +199,7 @@ const outService = (item:any)=>{
187 199
 onMounted(()=>{
188 200
   nextTick(async ()=>{
189 201
     await init()
202
+    await initList()
190 203
   })
191 204
 })
192 205
 </script>

+ 433 - 16
src/components/businessMoudle/projectManage/dialog/addProject.vue

@@ -5,32 +5,63 @@
5 5
           @confirm="confirmEvent"
6 6
           @close="dialogShow = false"
7 7
           width="800px"
8
+          height="calc(100vh - 220px)"
9
+          top="20px"
8 10
           :dialog-title="pageInfo.title">
9 11
     <template v-slot:content>
10 12
       <div class="dialogBox" v-loading="loading">
11 13
         <Input ref="nameRef" spanTitleWidth="80px" inputWidth="80%" title="项目名称" :haveTag="true" :haverMar15="false"/>
12
-        <Input ref="nameRef" class="tMar20" spanTitleWidth="80px" inputWidth="80%" title="备注" :haverMar15="false"/>
14
+        <Input ref="noteRef" class="tMar20" spanTitleWidth="80px" inputWidth="80%" title="备注" :haverMar15="false"/>
13 15
         <Select ref="ideaManRef"
14 16
                 class="tMar20"
15 17
                 :clearFlag="true"
16 18
                 title="项目负责人"
17 19
                 selectWidth="190px"
18 20
                 :optObj="{k:'id',la:'username',val:'id'}"
19
-                @changeEvent="init()" @clearEvent="init()"
20
-                :options="pageInfo.chargeList"/>
21
+                :options="pageInfo.userList"/>
21 22
 
22
-        <div class="flex tMar20" style="justify-content: flex-start">
23
+        <div class="flex tMar20" style="align-items: flex-start">
23 24
           <span class="spanTitle f14" style="width: 80px;">项目负责人</span>
24 25
           <div>
25
-            <el-radio-group v-model="pageInfo.visibleVal">
26
-              <el-radio-button label="所有人可见" />
27
-              <el-radio-button label="指定成员可见" />
28
-            </el-radio-group>
29
-
30
-            <div class="treeBox">
31
-              <el-tree :data="pageInfo.treeList" :props="defaultProps" show-checkbox />
26
+            <div>
27
+              <RadioGroup :showTitle="false" :id="coverRadioList.EgName"
28
+                          :radioList="coverRadioList.list"
29
+                          :echoVal="coverRadioList.radioVal"
30
+                          :title="coverRadioList.name"
31
+                          @returnEvent="val=>{coverRadioList.radioVal = val}"></RadioGroup>
32
+            </div>
33
+            <div v-show="coverRadioList.radioVal == '2'">
34
+              <div class="cascader-container left">
35
+                <div class="cascader-title">
36
+                  <span class="tab-label" :class="pageInfo.titleAc == '1' ? 'active' : ''" @click="pageInfo.titleAc = '1'"> 部门 </span>
37
+                  <span class="tab-label" :class="pageInfo.titleAc == '2' ? 'active' : ''" @click="pageInfo.titleAc = '2'"> 人员 </span>
38
+                </div>
39
+                <div class="cascader-list" v-show="pageInfo.titleAc == '1'">
40
+                  <el-tree ref="treeCascaderRef" @change="handleChange" node-key="id" :data="pageInfo.treeList" :props="defaultProps" show-checkbox />
41
+                </div>
42
+                <div class="cascader-list member-parent" v-show="pageInfo.titleAc == '2'">
43
+                  <el-tree ref="treeCascaderRef_user" @change="handleChange_user" node-key="id" :data="pageInfo.userList" :props="defaultProps_user" show-checkbox />
44
+                </div>
45
+              </div>
46
+              <div class="cascader-container right">
47
+                <div class="cascader-title">
48
+                  <span>已选可见人员({{pageInfo.chooseMemberList.length + pageInfo.chooseMemberList_user.length}})</span>
49
+                  <span class="clear" @click="clearEvent">清空</span>
50
+                </div>
51
+                <div class="cascader-list">
52
+                  <div class="choose-member" v-for="item in pageInfo.chooseMemberList" :key="item.id">
53
+                    <p class="choose">
54
+                      <span class="ellipsis">{{item.name || '-'}}</span>
55
+                    </p>
56
+                  </div>
57
+                  <div class="choose-member" v-for="item in pageInfo.chooseMemberList_user" :key="item.id">
58
+                    <p class="choose">
59
+                      <span class="ellipsis">{{item.username || '-'}}</span>
60
+                    </p>
61
+                  </div>
62
+                </div>
63
+              </div>
32 64
             </div>
33
-
34 65
           </div>
35 66
         </div>
36 67
 
@@ -40,6 +71,7 @@
40 71
 
41 72
 </template>
42 73
 <script setup lang="ts">
74
+import RadioGroup from '@/components/businessMoudle/batchGdt/configArea/directPacket/common/radioGroup.vue'
43 75
 import Select from '@/components/capsulationMoudle/_select.vue'
44 76
 import Dialog from '@/components/capsulationMoudle/_dialog.vue'
45 77
 import Input from '@/components/capsulationMoudle/_input.vue'
@@ -60,6 +92,29 @@ const defaultProps = {
60 92
   children: 'childs',
61 93
   label: 'name',
62 94
 }
95
+const defaultProps_user = {
96
+  children: 'childs',
97
+  label: 'username',
98
+}
99
+interface radioFace{
100
+  value:number | string,
101
+  name:string,
102
+  EgName:string,
103
+  radioVal:any,
104
+  haveNotes:boolean,
105
+  list:any
106
+}
107
+const coverRadioList = reactive<radioFace>({
108
+  value:1,
109
+  name:'项目负责人',
110
+  EgName:'cover',
111
+  radioVal:'1',
112
+  haveNotes:false,
113
+  list:[
114
+    {name:'所有人可见',value:'1'},
115
+    {name:'指定成员可见',value:'2'},
116
+  ]
117
+})
63 118
 
64 119
 //页面数据
65 120
 const pageInfo = reactive<reactiveTableAndAny>({
@@ -68,8 +123,35 @@ const pageInfo = reactive<reactiveTableAndAny>({
68 123
   title:'新增项目',
69 124
   chargeList:[],
70 125
   visibleVal:'',
126
+  titleAc:'1',
127
+  chooseMemberList:[],
128
+  chooseMemberList_user:[],
129
+  userList:[]
71 130
 })
72 131
 
132
+const clearEvent = () => {
133
+  nextTick(()=>{
134
+    pageInfo.chooseMemberList = []
135
+    pageInfo.chooseMemberList_user = []
136
+    treeCascaderRef.value!.setCheckedNodes([])
137
+    treeCascaderRef_user.value!.setCheckedNodes([])
138
+  })
139
+}
140
+
141
+const treeCascaderRef = ref()
142
+const treeCascaderRef_user = ref()
143
+const handleChange = (val:any) => {
144
+  nextTick(()=>{
145
+    pageInfo.chooseMemberList = treeCascaderRef.value!.getCheckedNodes()
146
+  })
147
+}
148
+
149
+const handleChange_user = () => {
150
+  nextTick(()=>{
151
+    pageInfo.chooseMemberList_user = treeCascaderRef_user.value!.getCheckedNodes()
152
+  })
153
+}
154
+
73 155
 const init = async () => {
74 156
   let res:any = await proxy.$http.get(Api.depart_list)
75 157
   if(res&&res.errNo=='0'){
@@ -80,8 +162,20 @@ const init = async () => {
80 162
   }
81 163
 }
82 164
 
165
+const init_userList = async () => {
166
+  let res:any = await proxy.$http.get(Api.user_list)
167
+  if(res&&res.errNo=='0'){
168
+    let resNew:any = res.rst
169
+    pageInfo.userList = resNew
170
+  }else{
171
+    ElMessage.error(res.errMsg)
172
+  }
173
+}
174
+
83 175
 const treeValue=ref('')
84 176
 const nameRef=ref<{value:string}>()
177
+const noteRef=ref<{value:string}>()
178
+const ideaManRef=ref<{value:any}>()
85 179
 const loading=ref<boolean>(false)
86 180
 const confirmEvent = async () => {
87 181
   if(nameRef.value!.value==''){
@@ -89,14 +183,18 @@ const confirmEvent = async () => {
89 183
     return
90 184
   }
91 185
   loading.value = true
92
-  let api:string = Api.depart_add
186
+  let api:string = Api.project_add
93 187
   const paramsModel = reactive<departParams>({
94
-    pid:treeValue.value,
95 188
     name:nameRef.value!.value,
189
+    note:noteRef.value!.value,
190
+    head_user_id:ideaManRef.value!.value,
191
+    show_type:coverRadioList.radioVal,
192
+    department_ids:pageInfo.chooseMemberList.map((el)=>{return el.id}),
193
+    user_ids:pageInfo.chooseMemberList_user.map((el)=>{return el.id}),
96 194
   })
97 195
   if(pageInfo.editId){ // 编辑
98 196
     paramsModel.id = pageInfo.editId
99
-    api = Api.depart_edit
197
+    api = Api.project_edit
100 198
   }
101 199
   let res:any = await proxy.$http.post(api,paramsModel)
102 200
   loading.value = false
@@ -117,13 +215,24 @@ const switchShow = (val:boolean,info?:any)=>{
117 215
   if(val){
118 216
     nextTick(async ()=>{
119 217
       nameRef.value!.value = ''
218
+      noteRef.value!.value = ''
219
+      ideaManRef.value!.value = ''
220
+      coverRadioList.radioVal = '1'
221
+      pageInfo.chooseMemberList = []
222
+      pageInfo.chooseMemberList_user = []
120 223
       treeValue.value = ''
121 224
       pageInfo.editId = ''
225
+      pageInfo.title = '新增项目'
122 226
       await init()
227
+      await init_userList()
123 228
       if(info?.id){ // 编辑
124 229
         pageInfo.editId = info?.id
125 230
         nameRef.value!.value = info.name
126
-        treeValue.value = info.pid
231
+        noteRef.value!.value = info.note
232
+        ideaManRef.value!.value = info.head_user_id
233
+        coverRadioList.radioVal = info.show_type + ''
234
+        pageInfo.chooseMemberList = []
235
+        pageInfo.chooseMemberList_user = []
127 236
         pageInfo.title = '编辑项目'
128 237
       }
129 238
     })
@@ -145,4 +254,312 @@ onMounted(()=>{
145 254
   border: 1px solid #EDEDED;
146 255
 
147 256
 }
257
+
258
+ .search-box {
259
+  display: block!important;
260
+  width: 400px;
261
+  margin-bottom: 10px
262
+}
263
+
264
+ .search-box .el-input__inner, .search-box .el-input__inner:focus {
265
+  border-color: #dcdfe6
266
+}
267
+
268
+.cascader-container {
269
+  display: inline-block;
270
+  vertical-align: top;
271
+  background-color: #fff;
272
+  border: 1px solid #dee4f5
273
+}
274
+
275
+.cascader-container.left {
276
+  width: 400px;
277
+  margin-right: 16px
278
+}
279
+
280
+.cascader-container.right {
281
+  width: 200px
282
+}
283
+
284
+.cascader-title {
285
+  height: 40px;
286
+  padding: 0 12px;
287
+  font-size: 14px;
288
+  line-height: 40px;
289
+  color: #333;
290
+  background-color: #fafafa;
291
+  border-bottom: 1px solid #dee4f5
292
+}
293
+
294
+.cascader-title .tab-label {
295
+  cursor: pointer
296
+}
297
+
298
+.cascader-title .tab-label:first-child {
299
+  margin-right: 16px
300
+}
301
+
302
+.cascader-title .tab-label.active {
303
+  font-weight: 700;
304
+  color: #197afb;
305
+  border-bottom: 2px solid #197afb
306
+}
307
+
308
+.cascader-title .tab-label.is-hidden {
309
+  display: none
310
+}
311
+
312
+.clear {
313
+  float: right;
314
+  color: #598fe6;
315
+  text-decoration: none;
316
+  cursor: pointer
317
+}
318
+
319
+.cascader-list {
320
+  width: 100%;
321
+  height: 236px;
322
+  overflow: auto;
323
+  font-size: 14px
324
+}
325
+
326
+.depart-tree .el-tree-node {
327
+  padding: 0 10px;
328
+  margin-top: 10px
329
+}
330
+
331
+.depart-tree .el-tree-node__content,.depart-tree .el-upload-list__item {
332
+  background-color: transparent
333
+}
334
+
335
+.depart-tree .el-tree-node:focus>.el-tree-node__content {
336
+  width: 100%;
337
+  background-color: transparent
338
+}
339
+
340
+.choose-member {
341
+  padding: 3px 10px;
342
+  cursor: pointer
343
+}
344
+
345
+.choose-member .choose {
346
+  display: flex;
347
+  flex-direction: row;
348
+  align-items: center;
349
+  justify-content: space-between;
350
+  padding: 5px 10px;
351
+  color: #666;
352
+  background-color: #f2f3f6
353
+}
354
+
355
+.choose-member .choose .icon-right {
356
+  display: inline-block;
357
+  width: 15px;
358
+  height: 15px
359
+}
360
+
361
+.member-parent {
362
+  display: flex;
363
+  flex-direction: row
364
+}
365
+
366
+.member-parent .member-left {
367
+  box-sizing: border-box;
368
+  width: 200px;
369
+  height: 100%;
370
+  padding-top: 8px;
371
+  padding-right: 10px;
372
+  padding-left: 10px;
373
+  overflow: auto
374
+}
375
+
376
+.member-parent .member-right {
377
+  flex: 1;
378
+  height: 100%;
379
+  padding-top: 8px;
380
+  padding-right: 10px;
381
+  padding-left: 10px;
382
+  overflow: auto;
383
+  border-left: 1px solid #dee4f5
384
+}
385
+
386
+.member-parent .member-right .tipbox {
387
+  display: flex;
388
+  flex-direction: row;
389
+  align-items: center;
390
+  justify-content: center;
391
+  width: 100%;
392
+  height: 100%;
393
+  font-size: 12px;
394
+  color: #909399
395
+}
396
+
397
+.member-tree .custom-tree-node {
398
+  width: 100%;
399
+  font-size: 12px;
400
+  -webkit-user-select: none;
401
+  -moz-user-select: none;
402
+  -ms-user-select: none;
403
+  user-select: none
404
+}
405
+
406
+.member-tree .custom-tree-node.active {
407
+  color: #197afb;
408
+  background-color: #f3f9ff;
409
+  border-radius: 3px
410
+}
411
+
412
+.member-tree .custom-tree-node .mg-icon-department,.member-tree .custom-tree-node .mg-icon-line {
413
+  margin-right: 6px;
414
+  font-size: 12px
415
+}
416
+
417
+.member-tree .custom-tree-node,.member-tree .el-tree-node__label {
418
+  overflow: hidden;
419
+  font-size: 14px;
420
+  text-indent: 8px;
421
+  text-overflow: ellipsis;
422
+  white-space: nowrap
423
+}
424
+
425
+.member-tree .el-tree-node__content {
426
+  height: 32px;
427
+  font-size: 14px;
428
+  line-height: 32px
429
+}
430
+
431
+.member-tree .el-tree-node__content:hover,.member-tree .el-upload-list__item:hover {
432
+  background-color: transparent
433
+}
434
+
435
+.member-tree .el-tree-node:focus>.el-tree-node__content {
436
+  width: 100%;
437
+  background-color: transparent
438
+}
439
+
440
+.member-tree .el-tree-node__content>.el-tree-node__expand-icon {
441
+  padding: 4px
442
+}
443
+
444
+.self-check .el-checkbox__label {
445
+  width: 100%;
446
+  font-size: 14px;
447
+  line-height: 32px
448
+}
449
+
450
+.display[data-v-7272e714] {
451
+  display: flex;
452
+  align-items: center
453
+}
454
+
455
+.hold[data-v-7272e714] {
456
+  width: 100%;
457
+  padding: 16px 0;
458
+  font-size: 12px;
459
+  color: #999;
460
+  text-align: center
461
+}
462
+
463
+.pricelimit[data-v-7272e714] {
464
+  padding: 6px 12px;
465
+  border: 1px solid #dcdfe6;
466
+  border-radius: 3px
467
+}
468
+
469
+.pricelimit .pricelimit-list[data-v-7272e714] {
470
+  display: flex;
471
+  align-items: center;
472
+  margin: 16px 0;
473
+  font-size: 14px
474
+}
475
+
476
+.pricelimit .pricelimit-list .tab-select[data-v-7272e714] {
477
+  width: 170px;
478
+  margin: 0 8px
479
+}
480
+
481
+.pricelimit .pricelimit-list .delete-icon[data-v-7272e714] {
482
+  font-size: 20px;
483
+  color: #999;
484
+  cursor: pointer
485
+}
486
+
487
+.pricelimit .addnew[data-v-7272e714] {
488
+  width: 100px;
489
+  font-size: 12px;
490
+  color: #197afb;
491
+  cursor: pointer
492
+}
493
+
494
+.pricelimit[data-v-7272e714] .el-form .el-form-item {
495
+  margin-bottom: 0!important
496
+}
497
+
498
+[data-v-1eec231b] .el-select .el-input__inner {
499
+  width: auto;
500
+  margin-left: 0
501
+}
502
+
503
+[data-v-1eec231b] .el-select .el-select__tags {
504
+  flex-wrap: nowrap
505
+}
506
+
507
+[data-v-1eec231b] .el-select .el-select__tags>span {
508
+  display: contents;
509
+  width: 100%
510
+}
511
+
512
+[data-v-1eec231b] .el-select .el-select__tags .el-tag {
513
+  height: 32px;
514
+  overflow: hidden;
515
+  line-height: 32px;
516
+  background-color: transparent;
517
+  border: 0 none
518
+}
519
+
520
+[data-v-1eec231b] .el-select .el-select__tags .el-tag .el-select__tags-text {
521
+  display: inline-block;
522
+  overflow: hidden;
523
+  font-size: 14px;
524
+  color: #666;
525
+  text-overflow: ellipsis;
526
+  white-space: nowrap
527
+}
528
+
529
+[data-v-1eec231b] .el-select .el-select__tags .el-tag .el-tag__close {
530
+  display: none
531
+}
532
+
533
+[data-v-1eec231b] .el-select .el-select__tags .el-select__input {
534
+  height: 32px;
535
+  margin-left: 0;
536
+  line-height: 32px
537
+}
538
+
539
+[data-v-1eec231b] .el-select.all-filter.el-select--small .el-input .el-input__inner {
540
+  height: 32px!important
541
+}
542
+
543
+[data-v-1eec231b] .el-select.all-filter.el-select--small .el-select__tags .el-select__input {
544
+  margin-left: 15px
545
+}
546
+
547
+[data-v-1eec231b] .el-select.all-filter.el-select--small .el-input__suffix {
548
+  height: 32px
549
+}
550
+
551
+.disable-icon[data-v-1eec231b] {
552
+  float: right;
553
+  width: 45px;
554
+  height: 24px;
555
+  margin-top: 5px;
556
+  margin-right: 20px;
557
+  font-size: 12px;
558
+  line-height: 24px;
559
+  color: #999;
560
+  text-align: center;
561
+  background-color: #e8eaec;
562
+  border-radius: 8px
563
+}
564
+
148 565
 </style>

+ 20 - 16
src/components/businessMoudle/projectManage/index.vue

@@ -1,5 +1,7 @@
1 1
 <template>
2 2
   <div class="screenBox flex">
3
+    <Input ref="InputRef_text" title="项目名称" placeholderTxt="项目名称" @changeEvent="init()" @clearEvent="init()"/>
4
+
3 5
     <el-button type="primary" class="lMarauto"  @click="addEvent()">新增项目</el-button>
4 6
   </div>
5 7
 
@@ -13,7 +15,7 @@
13 15
   >
14 16
     <template v-slot:operate="slotProps">
15 17
       <div class="text-center">
16
-        <span class="operate_text lMar8 pointer" @click="editEvent(slotProps.row)">编辑</span>
18
+        <span class="operate_text lMar8 pointer" @click="addEvent(slotProps.row)">编辑</span>
17 19
         <Popconfirm @confirm="deleEvent(slotProps.row)"/>
18 20
       </div>
19 21
     </template>
@@ -24,9 +26,10 @@
24 26
 </template>
25 27
 <script setup lang="ts">
26 28
 import {nextTick, onMounted, reactive, ref, getCurrentInstance} from 'vue'
29
+import Input from '@/components/capsulationMoudle/_input.vue'
27 30
 import Popconfirm from '@/components/capsulationMoudle/_popconfirm.vue'
28 31
 import TableList from '@/components/capsulationMoudle/tableList.vue'
29
-import { adqParam, reactiveTableAndAny} from "@/api/ApiModel";
32
+import {adqParam, departParams, reactiveTableAndAny} from "@/api/ApiModel";
30 33
 import {Api} from "@/api/api";
31 34
 import {ElMessage} from "element-plus";
32 35
 import { publicTableTs } from '@/components/businessMoudle/tableInfo'
@@ -37,16 +40,19 @@ const { proxy } = getCurrentInstance() as any;
37 40
 
38 41
 // 表格数据公共ts
39 42
 const descolParams = reactive([
40
-  { name:'权限名称',column:'account_name',},
41
-  { name:'描述',column:'account_id',cancleForMat:true},
42
-  { name:'更新时间',column:'created_at'},
43
+  { name:'项目名称',column:'name',},
44
+  { name:'备注',column:'note',cancleForMat:true},
45
+  { name:'项目负责人',column:'head_user'},
46
+  { name:'创建人',column:'create_user'},
47
+  { name:'创建时间',column:'created_at'},
48
+  { name:'关联账户数',column:'account_num'},
43 49
   { name:'操作',column:'operate',slotFlag: true},
44 50
 ])
45 51
 const { tableInfo,tableListRef,total } = publicTableTs(descolParams)
46 52
 
47
-const addEvent = () => {
53
+const addEvent = (item?:any) => {
48 54
   nextTick(()=>{
49
-    AddProjectRef.value!.switchShow(true)
55
+    AddProjectRef.value!.switchShow(true,item||'')
50 56
   })
51 57
 }
52 58
 
@@ -57,15 +63,13 @@ const InputRef_text = ref<{value:string}>()
57 63
 //账号列表
58 64
 const init = async (page?:any,pageSize?:any) => {
59 65
   tableListRef.value!.loading = true
60
-  const paramsModel = reactive<adqParam>({
61
-    page:page?page:1,
62
-    page_size:pageSize?pageSize:20,
66
+  const paramsModel = reactive<departParams>({
67
+    name:InputRef_text.value!.value,
63 68
   })
64
-  let res:any = await proxy.$http.get(Api.adq_list,paramsModel)
69
+  let res:any = await proxy.$http.get(Api.project_list,paramsModel)
65 70
   tableListRef.value!.loading = false
66 71
   if(res&&res.errNo=='0'){
67
-    tableInfo.tableList = res.rst.data
68
-    total.value = res.rst.pageInfo.total
72
+    tableInfo.tableList = res.rst
69 73
   }else{
70 74
     ElMessage.error(res.errMsg)
71 75
   }
@@ -73,10 +77,10 @@ const init = async (page?:any,pageSize?:any) => {
73 77
 
74 78
 const deleEvent = async (item:any) => {
75 79
   tableListRef.value!.loading = true
76
-  const paramsModel = reactive<adqParam>({
77
-    account_id:item.id
80
+  const paramsModel = reactive<departParams>({
81
+    id:item.id
78 82
   })
79
-  let res:any = await proxy.$http.post(Api.adq_dele,paramsModel)
83
+  let res:any = await proxy.$http.post(Api.project_dele,paramsModel)
80 84
   tableListRef.value!.loading = false
81 85
   ElMessage.info(res.errMsg)
82 86
   if(res&&res.errNo=='0'){

+ 5 - 2
src/components/capsulationMoudle/_drawer.vue

@@ -1,6 +1,7 @@
1 1
 <template>
2 2
   <el-drawer :model-value="drawerShow"
3 3
              direction="rtl"
4
+             :close-on-click-modal="closeOnModal"
4 5
              :before-close="handleClose"
5 6
              :show-close="false"
6 7
              :size="drawerSize">
@@ -28,12 +29,14 @@ const props = withDefaults(defineProps<{
28 29
   title?: string,
29 30
   drawerShow:boolean,
30 31
   drawerSize?:string,
31
-  headerSlotFlag?:boolean
32
+  headerSlotFlag?:boolean,
33
+  closeOnModal?:boolean
32 34
 }>(),{
33 35
   title: '',
34 36
   drawerShow:false,
35 37
   drawerSize:'80%',
36
-  headerSlotFlag:false
38
+  headerSlotFlag:false,
39
+  closeOnModal:true
37 40
 })
38 41
 // 监听弹框显示
39 42
 // watch(() => props.drawerShow, isShow => {