index.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673
  1. <template>
  2. <div class="hc-layout-box">
  3. <div class="hc-layout-left-box">
  4. <div class="user-avatar-box">
  5. <div class="user-avatar" v-loading="avatarLoading">
  6. <img :src="userInfo['avatar'] || avatarPng" alt="" crossOrigin="anonymous"/>
  7. <div class="user-avatar-upload">
  8. <el-upload class="upload-dom" :action="action" :accept="accept" :headers="getTokenHeader()" :data="upData" :show-file-list="false" :on-success="uploadFinish" :on-error="uploadError" :before-upload="beforeUpload">
  9. <HcIcon name="photo_camera" fill/>
  10. </el-upload>
  11. </div>
  12. </div>
  13. <div class="user-name truncate">{{ userInfo['real_name'] || '游客' }}</div>
  14. </div>
  15. <div class="user-menu-box">
  16. <el-scrollbar>
  17. <HcMenuSimple :datas="menuOptions" :keys="menuKey" @change="handleMenuValue"/>
  18. </el-scrollbar>
  19. </div>
  20. </div>
  21. <div class="hc-layout-content-box">
  22. <HcCard :title="menuItem.label" :ui="basicHight?'basic-hight':''" v-if="menuKey !== 'log' && menuKey !== 'recycle'">
  23. <template #extra>
  24. <span class="text-link" v-if="menuKey === 'basic' && !basicFormEdit" @click="basicFormEditClick">编辑</span>
  25. <span class="text-link" v-if="menuKey === 'project'" @click="setDefaultProjectClick">设置默认项目</span>
  26. </template>
  27. <template v-if="menuKey === 'basic'">
  28. <el-form ref="formUserRef" :model="formUserModel" :rules="formUserRules" size="large" label-position="top">
  29. <el-row :gutter="20">
  30. <el-col :span="12">
  31. <el-form-item label="用户名称" :prop="basicFormEdit?'real_name':''">
  32. <el-input v-model="formUserModel.real_name" placeholder="请输入用户名称" :disabled="!basicHight"/>
  33. </el-form-item>
  34. </el-col>
  35. <el-col :span="12">
  36. <el-form-item label="登录账号">
  37. <el-input v-model="formUserModel.account" placeholder="" disabled/>
  38. </el-form-item>
  39. </el-col>
  40. <el-col :span="12">
  41. <el-form-item label="身份证号">
  42. <el-input v-model="formUserModel.idNumber" placeholder="" disabled/>
  43. </el-form-item>
  44. </el-col>
  45. <el-col :span="12">
  46. <el-form-item label="绑定手机">
  47. <el-input v-model="formUserModel.phone" placeholder="" disabled/>
  48. </el-form-item>
  49. </el-col>
  50. <el-col :span="12">
  51. <el-form-item label="所属角色">
  52. <el-input v-model="formUserModel.roleName" placeholder="" disabled/>
  53. </el-form-item>
  54. </el-col>
  55. <el-col :span="12">
  56. <el-form-item label="所属部门">
  57. <el-input v-model="formUserModel.deptId" placeholder="" disabled/>
  58. </el-form-item>
  59. </el-col>
  60. <el-col :span="12">
  61. <el-form-item label="CA签字体">
  62. <el-image style="height: 60px" :src="formUserModel?.signatureUrl" :preview-src-list="[formUserModel?.signatureUrl]" :initial-index="0" fit="cover" v-if="formUserModel?.signatureUrl"/>
  63. <span class="text-zinc-400" v-else>无CA签字体</span>
  64. </el-form-item>
  65. </el-col>
  66. </el-row>
  67. </el-form>
  68. </template>
  69. <template v-if="menuKey === 'password'">
  70. <el-form ref="formUserPassRef" :model="formUserPassModel" :rules="formUserPassRules" size="large" label-position="top" style="max-width: 400px; margin: auto;">
  71. <el-form-item label="原始密码" prop="oldPassword">
  72. <el-input type="password" v-model="formUserPassModel.oldPassword" placeholder="请输入原始密码" show-password/>
  73. </el-form-item>
  74. <el-form-item label="新的密码" prop="newPassword">
  75. <el-input type="password" v-model="formUserPassModel.newPassword" placeholder="请输入新的密码" show-password/>
  76. </el-form-item>
  77. <el-form-item label="确认新密码" prop="newPassword1">
  78. <el-input type="password" v-model="formUserPassModel.newPassword1" placeholder="请输入确认新密码" show-password/>
  79. </el-form-item>
  80. </el-form>
  81. </template>
  82. <template v-if="menuKey === 'project'">
  83. <el-menu :default-active="projectKey" class="hc-project-menu" unique-opened>
  84. <el-sub-menu v-for="item in projectContractArr" :index="item.id">
  85. <template #title>
  86. <HcIcon name="topic" class="hc-menu-icon"/>
  87. <span>{{ item?.name }}</span>
  88. </template>
  89. <el-menu-item v-for="items in item?.contractInfoList ?? []" :index="items?.id" @click="projectMenuValue(item,items)">
  90. <HcIcon name="star" class="hc-menu-icon" fill v-if="projectKey === items?.id"/>
  91. <span>{{ items?.name }}</span>
  92. </el-menu-item>
  93. </el-sub-menu>
  94. </el-menu>
  95. </template>
  96. </HcCard>
  97. <div class="hc-card-foot-box" v-if="basicFormEdit">
  98. <el-button type="primary" hc-btn :loading="saveUserLoading" @click="saveUserInfoClick">
  99. <HcIcon name="save"/>
  100. <span>保存</span>
  101. </el-button>
  102. <el-button hc-btn @click="cancelUserClick">
  103. <HcIcon name="cancel"/>
  104. <span>取消</span>
  105. </el-button>
  106. </div>
  107. <HcCard :title="menuItem.label" v-if="menuKey === 'log'">
  108. <template #search>
  109. <div class="flex items-center">
  110. <div class="w-32">
  111. <el-select v-model="searchLogForm.operationModule" placeholder="业务模块" clearable @change="BusinessModuleValue">
  112. <el-option v-for="item in operationModuleData" :key="item.value" :label="item?.dictValue" :value="item?.dictKey"/>
  113. </el-select>
  114. </div>
  115. <div class="w-32 ml-2">
  116. <el-select v-model="searchLogForm.operationView" placeholder="页面" clearable @change="OperationViewValue">
  117. <el-option v-for="item in operationViewData" :key="item.value" :label="item?.dictValue" :value="item?.dictKey"/>
  118. </el-select>
  119. </div>
  120. <div class="w-40 ml-2">
  121. <el-select v-model="searchLogForm.operationType" placeholder="操作类型" clearable>
  122. <el-option v-for="item in operationTypeData" :key="item.value" :label="item?.dictValue" :value="item?.dictKey"/>
  123. </el-select>
  124. </div>
  125. <div class="w-20 ml-2">
  126. <el-select v-model="searchLogForm.operationMedium" placeholder="设备" clearable>
  127. <el-option v-for="item in deviceData" :key="item.value" :label="item?.label" :value="item?.value"/>
  128. </el-select>
  129. </div>
  130. <div class="w-64 ml-2">
  131. <HcDatePicker :dates="betweenTime" clearable @change="betweenDateUpdate"/>
  132. </div>
  133. <div class="w-60 ml-2">
  134. <el-input v-model="searchLogForm.queryValue" placeholder="请输入名称关键词检索" clearable @keyup="keyUpEvent"/>
  135. </div>
  136. <div class="ml-2">
  137. <el-button type="primary" @click="searchClick">搜索</el-button>
  138. </div>
  139. </div>
  140. </template>
  141. <div class="hc-table-ref-box">
  142. <el-table hc :data="logTableData" :loading="logTableLoading" stripe>
  143. <el-table-column prop="num" label="序号" width="80">
  144. <template #default="scope">
  145. {{scope.$index + 1}}
  146. </template>
  147. </el-table-column>
  148. <el-table-column prop="operationModule" label="业务模块" width="180"/>
  149. <el-table-column prop="operationTypeValue" label="操作类型"/>
  150. <el-table-column prop="operationMedium" label="设备" width="80"/>
  151. <el-table-column prop="operationContent" label="操作内容" />
  152. <el-table-column prop="createTime" label="操作时间" width="180"/>
  153. </el-table>
  154. </div>
  155. <template #action>
  156. <HcPages :pages="searchLogForm" @change="pageLogChange"/>
  157. </template>
  158. </HcCard>
  159. <HcCard :title="menuItem.label" v-if="menuKey === 'recycle'" actionSize="lg">
  160. <template #extra>
  161. <HcNewSwitch :datas="tabTypeTab" :keys="tabTypeKey" @change="tabTypeChange"/>
  162. </template>
  163. <div class="hc-table-ref-box">
  164. <el-table ref="recycleTableRef" hc :data="recycleTableData" stripe @selection-change="recycleTableSelectionChange">
  165. <el-table-column type="selection" width="50" />
  166. <el-table-column prop="num" label="序号" width="80">
  167. <template #default="scope">
  168. {{scope.$index + 1}}
  169. </template>
  170. </el-table-column>
  171. <el-table-column prop="fileName" label="删除内容" />
  172. <el-table-column prop="position" label="父节点名称"/>
  173. <el-table-column prop="operationTime" label="删除时间"/>
  174. </el-table>
  175. </div>
  176. <template #action>
  177. <div class="foot-recycle">
  178. <el-button type="primary" hc-btn :loading="recycleBtnLoading" @click="recycleBtnClick">
  179. <HcIcon name="reply"/>
  180. <span>恢复</span>
  181. </el-button>
  182. <HcPages :pages="searchRecycleForm" @change="pageRecycleChange"/>
  183. </div>
  184. </template>
  185. </HcCard>
  186. </div>
  187. </div>
  188. </template>
  189. <script setup>
  190. import {ref, onMounted} from "vue";
  191. import {useRouter, useRoute} from 'vue-router'
  192. import {useAppStore} from "~src/store/index";
  193. import avatarPng from '~src/assets/images/avatar.png';
  194. import {getTokenHeader} from '~src/api/request/header';
  195. import userApi from "~api/userInfo/index"
  196. import {getIndex,formValidate,getArrValue} from "vue-utils-plus"
  197. import md5 from 'js-md5';
  198. //初始变量
  199. const router = useRouter()
  200. const useRoutes = useRoute()
  201. const useAppState = useAppStore()
  202. //全局变量信息
  203. const userInfo = ref(useAppState.getUserInfo);
  204. const projectId = ref(useAppState.getProjectId);
  205. const contractId = ref(useAppState.getContractId);
  206. const projectContractArr = ref(useAppState.getProjectContract);
  207. //路由参数数据
  208. const routerQuery = useRoutes?.query;
  209. let MenuType = routerQuery?.MenuType || 'basic'
  210. //上传组件参数
  211. const action = '/api/blade-resource/oss/endpoint/put-file';
  212. const accept = 'image/png,image/jpg,image/jpeg';
  213. const upData = ref({})
  214. //上传前
  215. const avatarLoading = ref(false)
  216. const beforeUpload = () => {
  217. avatarLoading.value = true
  218. return true
  219. }
  220. //上传完成
  221. const uploadFinish = async (res) => {
  222. const link = res?.data?.link ?? '';
  223. const user_id = userInfo.value?.user_id ?? '';
  224. if (link) {
  225. const { error, code } = await userApi.updateUserInfo({avatar: link, id: user_id})
  226. if (!error && code === 200) {
  227. avatarLoading.value = false
  228. userInfo.value.avatar = link
  229. window?.$message?.success('更换头像成功')
  230. useAppState.setUserInfo(userInfo.value)
  231. } else {
  232. avatarLoading.value = false
  233. }
  234. } else {
  235. window?.$message?.warning('上传头像异常,请稍后再试')
  236. avatarLoading.value = false
  237. }
  238. }
  239. //上传失败
  240. const uploadError = () => {
  241. avatarLoading.value = false
  242. window?.$message?.warning('上传头像失败')
  243. }
  244. //左侧菜单
  245. const menuKey = ref(MenuType)
  246. const menuItem = ref({})
  247. const menuOptions = ref([
  248. {key: 'basic', label: '基础信息', icon: 'person'},
  249. {key: 'password', label: '密码设置', icon: 'lock_open'},
  250. {key: 'project', label: '参建项目', icon: 'home_storage'},
  251. {key: 'log', label: '操作日志', icon: 'package'},
  252. {key: 'recycle', label: '回收站', icon: 'delete'},
  253. ]);
  254. //获取菜单对象数据
  255. const menuObjItem = () => {
  256. const index = getIndex(menuOptions.value, 'key', menuKey.value)
  257. menuItem.value = menuOptions.value[index]
  258. }
  259. //菜单被点击
  260. const handleMenuValue = (item) => {
  261. menuItem.value = item
  262. menuKey.value = item?.key
  263. router.push({
  264. path: useRoutes.path,
  265. query: {
  266. MenuType: item?.key
  267. }
  268. })
  269. getPageTypeData(item?.key)
  270. }
  271. //渲染完成
  272. onMounted(() => {
  273. menuObjItem()
  274. getPageTypeData(menuKey.value)
  275. })
  276. //根据类型,获取相关数据
  277. const getPageTypeData = (key) => {
  278. //编辑状态
  279. if (key === 'password') {
  280. basicFormEdit.value = true
  281. basicHight.value = true
  282. } else {
  283. basicFormEdit.value = false
  284. basicHight.value = false
  285. }
  286. //请求数据
  287. if (key === 'basic') {
  288. queryCurrentUserData()
  289. } else if (key === 'project') {
  290. getDefaultProject()
  291. } else if (key === 'log') {
  292. queryBusinessModule()
  293. queryOperationView()
  294. operationTypeStatus()
  295. getLogTableData()
  296. } else if (key === 'recycle') {
  297. getRecycleTableData()
  298. }
  299. }
  300. //是否编辑
  301. const basicFormEdit = ref(false)
  302. const basicHight = ref(false)
  303. //基础信息表单
  304. const formUserRef = ref(null)
  305. const formUserModel = ref(userInfo.value)
  306. const formUserRules = {
  307. real_name: {
  308. required: true,
  309. trigger: "blur",
  310. message: "请输入用户名称"
  311. },
  312. }
  313. //获取用户信息
  314. const queryCurrentUserData = async () => {
  315. const { error, code, data } = await userApi.queryCurrentUserData()
  316. if (!error && code === 200) {
  317. formUserModel.value.deptId = data?.deptId || ''
  318. formUserModel.value.idNumber = data?.idNumber || ''
  319. formUserModel.value.roleName = data?.roleName || ''
  320. formUserModel.value.signatureUrl = data?.signatureUrl || ''
  321. }
  322. }
  323. //切换编辑模式
  324. const basicFormEditClick = () => {
  325. basicFormEdit.value = true
  326. basicHight.value = true
  327. }
  328. //保存数据
  329. const saveUserLoading = ref(false)
  330. const saveUserInfoClick = () => {
  331. const key = menuKey.value
  332. if (key === 'basic') {
  333. saveUserInfoData()
  334. } else if (key === 'password') {
  335. saveUpdatePassword()
  336. }
  337. }
  338. //取消修改
  339. const cancelUserClick = () => {
  340. const key = menuKey.value
  341. if (key === 'basic') {
  342. basicFormEdit.value = false
  343. basicHight.value = false
  344. } else {
  345. console.log('我也不知道这个点了干什么,反正UI图上有,至于有什么作用,不知道。。')
  346. }
  347. }
  348. //保存用户信息
  349. const saveUserInfoData = async () => {
  350. const res = await formValidate(formUserRef.value)
  351. if (res) {
  352. const form = formUserModel.value
  353. saveUserLoading.value = true
  354. const { error, code } = await userApi.updateUserInfo({realName: form?.real_name, id: form?.user_id})
  355. if (!error && code === 200) {
  356. saveUserLoading.value = false
  357. window?.$message?.success('保存成功')
  358. userInfo.value.real_name = form?.real_name
  359. useAppState.setUserInfo(userInfo.value)
  360. } else {
  361. saveUserLoading.value = false
  362. }
  363. }
  364. }
  365. //密码设置表单
  366. const formUserPassRef = ref(null)
  367. const formUserPassModel = ref({oldPassword: '', newPassword: '', newPassword1: ''})
  368. const formUserPassRules = {
  369. oldPassword: {
  370. required: true,
  371. trigger: "blur",
  372. message: "请输入原始密码"
  373. },
  374. newPassword: {
  375. required: true,
  376. validator(rule, value, callback) {
  377. const pass = formUserPassModel.value.newPassword1;
  378. if (!value) {
  379. callback(new Error("请输入新的密码"))
  380. } else if (pass && value !== pass) {
  381. callback(new Error("新的密码和确认新密码不一致"))
  382. }
  383. callback()
  384. },
  385. trigger: "blur"
  386. },
  387. newPassword1: {
  388. required: true,
  389. validator(rule, value, callback) {
  390. const pass = formUserPassModel.value.newPassword;
  391. if (!value) {
  392. callback(new Error("请输入确认新密码"))
  393. } else if (pass && value !== pass) {
  394. callback(new Error("新的密码和确认新密码不一致"))
  395. }
  396. callback()
  397. },
  398. trigger: "blur"
  399. }
  400. }
  401. //更新密码
  402. const saveUpdatePassword = async () => {
  403. const res = await formValidate(formUserPassRef.value)
  404. if (res) {
  405. const form = formUserPassModel.value;
  406. saveUserLoading.value = true
  407. const { error, code } = await userApi.updatePassword({
  408. oldPassword: md5(form?.oldPassword),
  409. newPassword: md5(form?.newPassword),
  410. newPassword1: md5(form?.newPassword1),
  411. plaintextPassword: form?.newPassword
  412. })
  413. if (!error && code === 200) {
  414. saveUserLoading.value = false
  415. window?.$message?.success('密码修改成功')
  416. formUserPassModel.value = {
  417. oldPassword: '',
  418. newPassword: '',
  419. newPassword1: ''
  420. }
  421. } else {
  422. saveUserLoading.value = false
  423. }
  424. }
  425. }
  426. //获取默认项目
  427. const projectKey = ref(null)
  428. const getDefaultProject = async () => {
  429. const { error, code, data } = await userApi.getDefaultProject()
  430. if (!error && code === 200) {
  431. projectKey.value = data['contractId']
  432. }
  433. }
  434. //项目被选择
  435. const menuProjectId = ref('')
  436. const menuContractId = ref('')
  437. const projectMenuValue = (item,items) => {
  438. menuProjectId.value = item?.id
  439. menuContractId.value = items?.id
  440. projectKey.value = items?.id
  441. }
  442. //设置为默认项目
  443. const setDefaultProjectClick = async () => {
  444. const pid = menuProjectId.value, cid = menuContractId.value
  445. if (pid && cid) {
  446. const { error, code } = await userApi.setDefaultProject({
  447. projectId: pid,
  448. contractId: cid
  449. })
  450. if (!error && code === 200) {
  451. window?.$message?.success('设置成功')
  452. }
  453. } else {
  454. window?.$message?.warning('请先在下方选择一个项目合同段')
  455. }
  456. }
  457. //搜索和分页数据
  458. const searchLogForm = ref({
  459. operationModule: null, operationView: null, operationType: null, operationMedium: null,
  460. queryValue: null, startTime: null, endTime: null,
  461. current: 1, size: 10, total: 0
  462. })
  463. //业务模块
  464. const operationModuleData = ref([])
  465. const queryBusinessModule = async () => {
  466. const { error, code, data } = await userApi.queryBusinessModule()
  467. if (!error && code === 200) {
  468. operationModuleData.value = data
  469. } else {
  470. operationModuleData.value = []
  471. }
  472. }
  473. const BusinessModuleValue = () => {
  474. searchLogForm.value.operationView = null
  475. searchLogForm.value.operationType = null
  476. queryOperationView()
  477. operationTypeStatus()
  478. }
  479. //页面
  480. const operationViewData = ref([])
  481. const queryOperationView = async () => {
  482. const { error, code, data } = await userApi.queryOperationView({
  483. businessModule: searchLogForm.value?.operationModule || ''
  484. })
  485. if (!error && code === 200) {
  486. operationViewData.value = data
  487. } else {
  488. operationViewData.value = []
  489. }
  490. }
  491. const OperationViewValue = () => {
  492. searchLogForm.value.operationType = null
  493. operationTypeStatus()
  494. }
  495. //操作类型
  496. const operationTypeData = ref([])
  497. const operationTypeStatus = async () => {
  498. const { error, code, data } = await userApi.queryOperationTypeList({
  499. businessModule: searchLogForm.value?.operationModule || '',
  500. operationView: searchLogForm.value?.operationView || ''
  501. })
  502. if (!error && code === 200) {
  503. operationTypeData.value = data
  504. } else {
  505. operationTypeData.value = []
  506. }
  507. }
  508. //设备
  509. const deviceData = ref([{label: "APP", value: "APP"}, {label: "PC", value: "PC"}])
  510. //表格数据
  511. const logTableData = ref([]);
  512. //日期时间被选择
  513. const betweenTime = ref(null)
  514. const betweenDateUpdate = ({val,arr}) => {
  515. betweenTime.value = arr
  516. searchLogForm.value.startTime = val?.start
  517. searchLogForm.value.endTime = val?.end
  518. }
  519. //回车搜索
  520. const keyUpEvent = (e) => {
  521. if (e.key === "Enter") {
  522. searchLogForm.value.current = 1;
  523. getLogTableData()
  524. }
  525. }
  526. //搜索
  527. const searchClick = () => {
  528. searchLogForm.value.current = 1;
  529. getLogTableData()
  530. }
  531. //分页被点击
  532. const pageLogChange = ({current, size}) => {
  533. searchLogForm.value.current = current
  534. searchLogForm.value.size = size
  535. getLogTableData()
  536. }
  537. //获取数据
  538. const logTableLoading = ref(false)
  539. const getLogTableData = async () => {
  540. logTableLoading.value = true
  541. const { error, code, data } = await userApi.getOperationLog({
  542. projectId: projectId.value,
  543. contractId: contractId.value,
  544. ...searchLogForm.value
  545. })
  546. logTableLoading.value = false
  547. if (!error && code === 200) {
  548. logTableData.value = getArrValue(data['records'])
  549. searchLogForm.value.total = data.total || 0
  550. } else {
  551. logTableData.value = []
  552. searchLogForm.value.total = 0
  553. }
  554. }
  555. //结构类型tab数据和相关处理
  556. const tabTypeKey = ref('1')
  557. const tabTypeTab = ref([
  558. {key: '1', name: '文件资料'},
  559. {key: '2', name: '工程划分'}
  560. ]);
  561. const tabTypeChange = (item) => {
  562. tabTypeKey.value = item?.key;
  563. tabTypeKey.value = item?.key;
  564. searchRecycleForm.value.current = 1
  565. searchRecycleForm.value.delType = item?.key
  566. getRecycleTableData()
  567. }
  568. //搜索和分页数据
  569. const searchRecycleForm = ref({
  570. projectId: projectId.value, contractId: contractId.value,
  571. delType: tabTypeKey.value, current: 1, size: 20, total: 0
  572. })
  573. //表格数据
  574. const recycleTableRef = ref(null)
  575. const recycleTableData = ref(null);
  576. //分页被点击
  577. const pageRecycleChange = ({current, size}) => {
  578. searchRecycleForm.value.current = current
  579. searchRecycleForm.value.size = size
  580. getRecycleTableData()
  581. }
  582. //获取数据
  583. const getRecycleTableData = async () => {
  584. const { error, code, data } = await userApi.queryRecycleBinList({
  585. projectId: projectId.value,
  586. contractId: contractId.value,
  587. delType: tabTypeKey.value,
  588. ...searchRecycleForm.value
  589. })
  590. if (!error && code === 200) {
  591. recycleTableData.value = getArrValue(data['records'])
  592. searchRecycleForm.value.total = data.total || 0
  593. } else {
  594. recycleTableData.value = []
  595. searchRecycleForm.value.total = 0
  596. }
  597. }
  598. //多选
  599. const RecycleCheckedKeys = ref([]);
  600. const recycleTableSelectionChange = (val) => {
  601. console.log(val)
  602. }
  603. //恢复
  604. const recycleBtnLoading = ref(false)
  605. const recycleBtnClick = async () => {
  606. const rows = RecycleCheckedKeys.value
  607. if (rows.length > 0) {
  608. //请求数据
  609. recycleBtnLoading.value = true
  610. const { error, code } = await userApi.recycleBinRegain({
  611. projectId: projectId.value,
  612. contractId: contractId.value,
  613. delType: tabTypeKey.value,
  614. regainIds: rows
  615. })
  616. recycleBtnLoading.value = false
  617. if (!error && code === 200) {
  618. window?.$message?.success('操作成功')
  619. searchRecycleForm.value.current = 1
  620. getRecycleTableData()
  621. }
  622. } else {
  623. window.$message?.warning('请先勾选要恢复的数据')
  624. }
  625. }
  626. </script>
  627. <style lang="scss" scoped>
  628. @import "../../styles/user/index.scss";
  629. </style>
  630. <style lang="scss">
  631. .user-avatar-upload .upload-dom, .upload-dom .el-upload {
  632. height: 100%;
  633. width: 100%;
  634. }
  635. </style>