index.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682
  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="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="folder-2" 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="close"/>
  104. <span>取消</span>
  105. </el-button>
  106. </div>
  107. <HcCard :title="menuItem.label" :scrollbar="false" 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">
  138. <HcIcon name="search-2"/>
  139. <span>搜索</span>
  140. </el-button>
  141. </div>
  142. </div>
  143. </template>
  144. <HcTable :column="logTableColumn" :datas="logTableData" :loading="logTableLoading"/>
  145. <template #action>
  146. <HcPages :pages="searchLogForm" @change="pageLogChange"/>
  147. </template>
  148. </HcCard>
  149. <HcCard :scrollbar="false" v-if="menuKey === 'recycle'" actionSize="lg">
  150. <template #header>
  151. <div class="mr-5">{{menuItem.label}}</div>
  152. <HcNewSwitch :datas="userTypeTab" :keys="userTypeKey" @change="userTypeChange"/>
  153. </template>
  154. <template #extra>
  155. <HcNewSwitch :datas="tabTypeTab" :keys="tabTypeKey" @change="tabTypeChange"/>
  156. </template>
  157. <HcTable ref="recycleTableRef" :column="recycleTableColumn" :datas="recycleTableData" :loading="recycleTableLoading" isCheck @selection-change="recycleTableSelectionChange"/>
  158. <template #action>
  159. <div class="foot-recycle">
  160. <el-button type="primary" hc-btn :disabled="userTypeKey === '2'" :loading="recycleBtnLoading" @click="recycleBtnClick">
  161. <HcIcon name="reply" fill/>
  162. <span>恢复</span>
  163. </el-button>
  164. <HcPages :pages="searchRecycleForm" @change="pageRecycleChange"/>
  165. </div>
  166. </template>
  167. </HcCard>
  168. </div>
  169. </div>
  170. </template>
  171. <script setup>
  172. import {ref, onMounted} from "vue";
  173. import {useRouter, useRoute} from 'vue-router'
  174. import {useAppStore} from "~src/store";
  175. import avatarPng from '~src/assets/images/avatar.png';
  176. import {getTokenHeader} from '~src/api/request/header';
  177. import userApi from "~api/userInfo/index"
  178. import {getIndex,formValidate,getArrValue} from "vue-utils-plus"
  179. import md5 from 'js-md5';
  180. //初始变量
  181. const router = useRouter()
  182. const useRoutes = useRoute()
  183. const useAppState = useAppStore()
  184. //全局变量信息
  185. const userInfo = ref(useAppState.getUserInfo);
  186. const projectId = ref(useAppState.getProjectId);
  187. const contractId = ref(useAppState.getContractId);
  188. const projectContractArr = ref(useAppState.getProjectContract);
  189. //路由参数数据
  190. const routerQuery = useRoutes?.query;
  191. let MenuType = routerQuery?.MenuType || 'basic'
  192. //上传组件参数
  193. const action = '/api/blade-resource/oss/endpoint/put-file';
  194. const accept = 'image/png,image/jpg,image/jpeg';
  195. const upData = ref({})
  196. //上传前
  197. const avatarLoading = ref(false)
  198. const beforeUpload = () => {
  199. avatarLoading.value = true
  200. return true
  201. }
  202. //上传完成
  203. const uploadFinish = async (res) => {
  204. const link = res?.data?.link ?? '';
  205. const user_id = userInfo.value?.user_id ?? '';
  206. if (link) {
  207. const { error, code } = await userApi.updateUserInfo({avatar: link, id: user_id})
  208. if (!error && code === 200) {
  209. avatarLoading.value = false
  210. userInfo.value.avatar = link
  211. window?.$message?.success('更换头像成功')
  212. useAppState.setUserInfo(userInfo.value)
  213. } else {
  214. avatarLoading.value = false
  215. }
  216. } else {
  217. window?.$message?.warning('上传头像异常,请稍后再试')
  218. avatarLoading.value = false
  219. }
  220. }
  221. //上传失败
  222. const uploadError = () => {
  223. avatarLoading.value = false
  224. window?.$message?.warning('上传头像失败')
  225. }
  226. //左侧菜单
  227. const menuKey = ref(MenuType)
  228. const menuItem = ref({})
  229. const menuOptions = ref([
  230. {key: 'basic', label: '基础信息', icon: 'user-3'},
  231. {key: 'password', label: '密码设置', icon: 'lock-unlock'},
  232. {key: 'project', label: '参建项目', icon: 'folder-2'},
  233. {key: 'log', label: '操作日志', icon: 'file-mark'},
  234. {key: 'recycle', label: '回收站', icon: 'delete-bin-5'},
  235. ]);
  236. //获取菜单对象数据
  237. const menuObjItem = () => {
  238. const index = getIndex(menuOptions.value, 'key', menuKey.value)
  239. menuItem.value = menuOptions.value[index]
  240. }
  241. //菜单被点击
  242. const handleMenuValue = (item) => {
  243. menuItem.value = item
  244. menuKey.value = item?.key
  245. router.push({
  246. path: useRoutes.path,
  247. query: {
  248. MenuType: item?.key
  249. }
  250. })
  251. getPageTypeData(item?.key)
  252. }
  253. //渲染完成
  254. onMounted(() => {
  255. menuObjItem()
  256. getPageTypeData(menuKey.value)
  257. })
  258. //根据类型,获取相关数据
  259. const getPageTypeData = (key) => {
  260. //编辑状态
  261. if (key === 'password') {
  262. basicFormEdit.value = true
  263. basicHight.value = true
  264. } else {
  265. basicFormEdit.value = false
  266. basicHight.value = false
  267. }
  268. //请求数据
  269. if (key === 'basic') {
  270. queryCurrentUserData()
  271. } else if (key === 'project') {
  272. getDefaultProject()
  273. } else if (key === 'log') {
  274. queryBusinessModule()
  275. queryOperationView()
  276. operationTypeStatus()
  277. getLogTableData()
  278. } else if (key === 'recycle') {
  279. getRecycleTableData()
  280. }
  281. }
  282. //是否编辑
  283. const basicFormEdit = ref(false)
  284. const basicHight = ref(false)
  285. //基础信息表单
  286. const formUserRef = ref(null)
  287. const formUserModel = ref(userInfo.value)
  288. const formUserRules = {
  289. real_name: {
  290. required: true,
  291. trigger: "blur",
  292. message: "请输入用户名称"
  293. },
  294. }
  295. //获取用户信息
  296. const queryCurrentUserData = async () => {
  297. const { error, code, data } = await userApi.queryCurrentUserData()
  298. if (!error && code === 200) {
  299. formUserModel.value.deptId = data?.deptId || ''
  300. formUserModel.value.idNumber = data?.idNumber || ''
  301. formUserModel.value.roleName = data?.roleName || ''
  302. formUserModel.value.signatureUrl = data?.signatureUrl || ''
  303. }
  304. }
  305. //切换编辑模式
  306. const basicFormEditClick = () => {
  307. basicFormEdit.value = true
  308. basicHight.value = true
  309. }
  310. //保存数据
  311. const saveUserLoading = ref(false)
  312. const saveUserInfoClick = () => {
  313. const key = menuKey.value
  314. if (key === 'basic') {
  315. saveUserInfoData()
  316. } else if (key === 'password') {
  317. saveUpdatePassword()
  318. }
  319. }
  320. //取消修改
  321. const cancelUserClick = () => {
  322. const key = menuKey.value
  323. if (key === 'basic') {
  324. basicFormEdit.value = false
  325. basicHight.value = false
  326. } else {
  327. console.log('我也不知道这个点了干什么,反正UI图上有,至于有什么作用,不知道。。')
  328. }
  329. }
  330. //保存用户信息
  331. const saveUserInfoData = async () => {
  332. const res = await formValidate(formUserRef.value)
  333. if (res) {
  334. const form = formUserModel.value
  335. saveUserLoading.value = true
  336. const { error, code } = await userApi.updateUserInfo({realName: form?.real_name, id: form?.user_id})
  337. if (!error && code === 200) {
  338. saveUserLoading.value = false
  339. window?.$message?.success('保存成功')
  340. userInfo.value.real_name = form?.real_name
  341. useAppState.setUserInfo(userInfo.value)
  342. } else {
  343. saveUserLoading.value = false
  344. }
  345. }
  346. }
  347. //密码设置表单
  348. const formUserPassRef = ref(null)
  349. const formUserPassModel = ref({oldPassword: '', newPassword: '', newPassword1: ''})
  350. const formUserPassRules = {
  351. oldPassword: {
  352. required: true,
  353. trigger: "blur",
  354. message: "请输入原始密码"
  355. },
  356. newPassword: {
  357. required: true,
  358. validator(rule, value, callback) {
  359. const pass = formUserPassModel.value.newPassword1;
  360. if (!value) {
  361. callback(new Error("请输入新的密码"))
  362. } else if (pass && value !== pass) {
  363. callback(new Error("新的密码和确认新密码不一致"))
  364. }
  365. callback()
  366. },
  367. trigger: "blur"
  368. },
  369. newPassword1: {
  370. required: true,
  371. validator(rule, value, callback) {
  372. const pass = formUserPassModel.value.newPassword;
  373. if (!value) {
  374. callback(new Error("请输入确认新密码"))
  375. } else if (pass && value !== pass) {
  376. callback(new Error("新的密码和确认新密码不一致"))
  377. }
  378. callback()
  379. },
  380. trigger: "blur"
  381. }
  382. }
  383. //更新密码
  384. const saveUpdatePassword = async () => {
  385. const res = await formValidate(formUserPassRef.value)
  386. if (res) {
  387. const form = formUserPassModel.value;
  388. saveUserLoading.value = true
  389. const { error, code } = await userApi.updatePassword({
  390. oldPassword: md5(form?.oldPassword),
  391. newPassword: md5(form?.newPassword),
  392. newPassword1: md5(form?.newPassword1),
  393. plaintextPassword: form?.newPassword
  394. })
  395. if (!error && code === 200) {
  396. saveUserLoading.value = false
  397. window?.$message?.success('密码修改成功')
  398. formUserPassModel.value = {
  399. oldPassword: '',
  400. newPassword: '',
  401. newPassword1: ''
  402. }
  403. } else {
  404. saveUserLoading.value = false
  405. }
  406. }
  407. }
  408. //获取默认项目
  409. const projectKey = ref(null)
  410. const getDefaultProject = async () => {
  411. const { error, code, data } = await userApi.getDefaultProject()
  412. if (!error && code === 200) {
  413. projectKey.value = data['contractId']
  414. }
  415. }
  416. //项目被选择
  417. const menuProjectId = ref('')
  418. const menuContractId = ref('')
  419. const projectMenuValue = (item,items) => {
  420. menuProjectId.value = item?.id
  421. menuContractId.value = items?.id
  422. projectKey.value = items?.id
  423. }
  424. //设置为默认项目
  425. const setDefaultProjectClick = async () => {
  426. const pid = menuProjectId.value, cid = menuContractId.value
  427. if (pid && cid) {
  428. const { error, code } = await userApi.setDefaultProject({
  429. projectId: pid,
  430. contractId: cid
  431. })
  432. if (!error && code === 200) {
  433. window?.$message?.success('设置成功')
  434. }
  435. } else {
  436. window?.$message?.warning('请先在下方选择一个项目合同段')
  437. }
  438. }
  439. //搜索和分页数据
  440. const searchLogForm = ref({
  441. operationModule: null, operationView: null, operationType: null, operationMedium: null,
  442. queryValue: null, startTime: null, endTime: null,
  443. current: 1, size: 10, total: 0
  444. })
  445. //业务模块
  446. const operationModuleData = ref([])
  447. const queryBusinessModule = async () => {
  448. const { error, code, data } = await userApi.queryBusinessModule()
  449. if (!error && code === 200) {
  450. operationModuleData.value = data
  451. } else {
  452. operationModuleData.value = []
  453. }
  454. }
  455. const BusinessModuleValue = () => {
  456. searchLogForm.value.operationView = null
  457. searchLogForm.value.operationType = null
  458. queryOperationView()
  459. operationTypeStatus()
  460. }
  461. //页面
  462. const operationViewData = ref([])
  463. const queryOperationView = async () => {
  464. const { error, code, data } = await userApi.queryOperationView({
  465. businessModule: searchLogForm.value?.operationModule || ''
  466. })
  467. if (!error && code === 200) {
  468. operationViewData.value = data
  469. } else {
  470. operationViewData.value = []
  471. }
  472. }
  473. const OperationViewValue = () => {
  474. searchLogForm.value.operationType = null
  475. operationTypeStatus()
  476. }
  477. //操作类型
  478. const operationTypeData = ref([])
  479. const operationTypeStatus = async () => {
  480. const { error, code, data } = await userApi.queryOperationTypeList({
  481. businessModule: searchLogForm.value?.operationModule || '',
  482. operationView: searchLogForm.value?.operationView || ''
  483. })
  484. if (!error && code === 200) {
  485. operationTypeData.value = data
  486. } else {
  487. operationTypeData.value = []
  488. }
  489. }
  490. //设备
  491. const deviceData = ref([{label: "APP", value: "APP"}, {label: "PC", value: "PC"}])
  492. //表格数据
  493. const logTableColumn = ref([
  494. {key:'operationModule', name: '业务模块', width: '180'},
  495. {key:'operationTypeValue', name: '操作类型', width: '220'},
  496. {key:'operationMedium', name: '设备', align: 'center', width: '80'},
  497. {key:'operationContent', name: '操作内容'},
  498. {key:'createTime', name: '操作时间', align: 'center', width: '180'},
  499. ])
  500. const logTableData = ref([]);
  501. //日期时间被选择
  502. const betweenTime = ref(null)
  503. const betweenDateUpdate = ({val,arr}) => {
  504. betweenTime.value = arr
  505. searchLogForm.value.startTime = val?.start
  506. searchLogForm.value.endTime = val?.end
  507. }
  508. //回车搜索
  509. const keyUpEvent = (e) => {
  510. if (e.key === "Enter") {
  511. searchLogForm.value.current = 1;
  512. getLogTableData()
  513. }
  514. }
  515. //搜索
  516. const searchClick = () => {
  517. searchLogForm.value.current = 1;
  518. getLogTableData()
  519. }
  520. //分页被点击
  521. const pageLogChange = ({current, size}) => {
  522. searchLogForm.value.current = current
  523. searchLogForm.value.size = size
  524. getLogTableData()
  525. }
  526. //获取数据
  527. const logTableLoading = ref(false)
  528. const getLogTableData = async () => {
  529. logTableLoading.value = true
  530. const { error, code, data } = await userApi.getOperationLog({
  531. projectId: projectId.value,
  532. contractId: contractId.value,
  533. ...searchLogForm.value
  534. })
  535. logTableLoading.value = false
  536. if (!error && code === 200) {
  537. logTableData.value = getArrValue(data['records'])
  538. searchLogForm.value.total = data.total || 0
  539. } else {
  540. logTableData.value = []
  541. searchLogForm.value.total = 0
  542. }
  543. }
  544. //个人和全部切换
  545. const userTypeKey = ref('1')
  546. const userTypeTab = ref([{key:'1', name: '个人'}, {key:'2', name: '全部'}]);
  547. const userTypeChange = (item) => {
  548. userTypeKey.value = item?.key;
  549. if (item?.key === '1') {
  550. searchRecycleForm.value.createUserName = ''
  551. } else {
  552. searchRecycleForm.value.createUserName = 'ALL'
  553. }
  554. getRecycleTableData()
  555. }
  556. //结构类型tab数据和相关处理
  557. const tabTypeKey = ref('1')
  558. const tabTypeTab = ref([
  559. {key: '1', name: '文件资料'},
  560. {key: '2', name: '工程划分'}
  561. ]);
  562. const tabTypeChange = (item) => {
  563. tabTypeKey.value = item?.key;
  564. tabTypeKey.value = item?.key;
  565. searchRecycleForm.value.current = 1
  566. searchRecycleForm.value.delType = item?.key
  567. getRecycleTableData()
  568. }
  569. //搜索和分页数据
  570. const searchRecycleForm = ref({
  571. projectId: projectId.value, contractId: contractId.value, createUserName: '',
  572. delType: tabTypeKey.value, current: 1, size: 20, total: 0
  573. })
  574. //表格数据
  575. const recycleTableRef = ref(null)
  576. const recycleTableColumn = ref([
  577. {key:'fileName', name: '删除内容'},
  578. {key:'position', name: '父节点名称'},
  579. {key:'createUserName', name: '操作人'},
  580. {key:'operationTime', name: '删除时间', align: 'center', width: '180'},
  581. ])
  582. const recycleTableLoading = ref(false)
  583. const recycleTableData = ref(null);
  584. //分页被点击
  585. const pageRecycleChange = ({current, size}) => {
  586. searchRecycleForm.value.current = current
  587. searchRecycleForm.value.size = size
  588. getRecycleTableData()
  589. }
  590. //获取数据
  591. const getRecycleTableData = async () => {
  592. const { error, code, data } = await userApi.queryRecycleBinList({
  593. projectId: projectId.value,
  594. contractId: contractId.value,
  595. delType: tabTypeKey.value,
  596. ...searchRecycleForm.value
  597. })
  598. if (!error && code === 200) {
  599. recycleTableData.value = getArrValue(data['records'])
  600. searchRecycleForm.value.total = data.total || 0
  601. } else {
  602. recycleTableData.value = []
  603. searchRecycleForm.value.total = 0
  604. }
  605. }
  606. //多选
  607. const RecycleCheckedKeys = ref([]);
  608. const recycleTableSelectionChange = (val) => {
  609. console.log(val)
  610. }
  611. //恢复
  612. const recycleBtnLoading = ref(false)
  613. const recycleBtnClick = async () => {
  614. const rows = RecycleCheckedKeys.value
  615. if (rows.length > 0) {
  616. //请求数据
  617. recycleBtnLoading.value = true
  618. const { error, code } = await userApi.recycleBinRegain({
  619. projectId: projectId.value,
  620. contractId: contractId.value,
  621. delType: tabTypeKey.value,
  622. regainIds: rows
  623. })
  624. recycleBtnLoading.value = false
  625. if (!error && code === 200) {
  626. window?.$message?.success('操作成功')
  627. searchRecycleForm.value.current = 1
  628. getRecycleTableData()
  629. }
  630. } else {
  631. window.$message?.warning('请先勾选要恢复的数据')
  632. }
  633. }
  634. </script>
  635. <style lang="scss" scoped>
  636. @import "../../styles/user/index.scss";
  637. </style>
  638. <style lang="scss">
  639. .user-avatar-upload .upload-dom, .upload-dom .el-upload {
  640. height: 100%;
  641. width: 100%;
  642. }
  643. </style>