index.vue 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. <script setup lang="ts">
  2. import { reactive, ref, onMounted, watch } from "vue";
  3. import { useColumns } from "./columns";
  4. import { httpList, httpStatus } from "/@/api/interest/role";
  5. import { type FormInstance } from "element-plus";
  6. import { ElMessage } from "element-plus";
  7. import { TableProBar } from "/@/components/ReTable";
  8. import { type PaginationProps } from "@pureadmin/table";
  9. import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
  10. import { useNav } from "/@/layout/hooks/nav";
  11. import { statusList } from "/@/utils/status";
  12. import { responseHandle } from "/@/utils/responseHandle";
  13. import { useUserStoreHook } from "/@/store/modules/user";
  14. import addEdit from "./addEdit.vue";
  15. import { useCompany } from "/@/hooks/core/useCompany";
  16. const { logout } = useNav();
  17. defineOptions({
  18. name: "role"
  19. });
  20. const form = reactive({
  21. level: "",
  22. role_name: "",
  23. status: "",
  24. page: 1,
  25. size: 15
  26. });
  27. const powers = ref([]);
  28. const dataList = ref([]);
  29. const loading = ref(true);
  30. const { columns } = useColumns();
  31. const showModel = ref(false);
  32. const itemId = ref("");
  33. const isDetails = ref("add");
  34. const formRef = ref<FormInstance>();
  35. const { currentCompany } = useCompany();
  36. const pagination = reactive<PaginationProps>({
  37. total: 0,
  38. pageSize: 15,
  39. currentPage: 1,
  40. background: true
  41. });
  42. //修改状态
  43. const handleStatus = async row => {
  44. const { id, status } = row;
  45. const { code, message } = await httpStatus({
  46. roleid: id,
  47. status: status + "" === "1" ? "0" : "1"
  48. });
  49. responseHandle({
  50. code,
  51. message,
  52. logout,
  53. handler: () => onSearch()
  54. });
  55. };
  56. async function handleCurrentChange(val: number) {
  57. form.page = val;
  58. await onSearch();
  59. }
  60. async function handleSizeChange(val: number) {
  61. form.size = val;
  62. form.page = 1;
  63. await onSearch();
  64. }
  65. function handleSelectionChange(val) {
  66. console.log("handleSelectionChange", val);
  67. }
  68. async function onSearch() {
  69. loading.value = true;
  70. const { code, data, message } = await httpList({
  71. ...form,
  72. companyNo: currentCompany.value.companyNo
  73. });
  74. if (code === 0) {
  75. const { list, count } = data;
  76. dataList.value = list ?? [];
  77. pagination.total = count ?? 0;
  78. pagination.pageSize = form.size;
  79. pagination.currentPage = form.page;
  80. } else if (code > 100 && code < 140) {
  81. logout();
  82. } else {
  83. ElMessage.error(message);
  84. }
  85. loading.value = false;
  86. }
  87. async function resetSearch() {
  88. form.page = 1;
  89. await onSearch();
  90. }
  91. //新建/编辑/详情弹窗
  92. function editItem(id, type) {
  93. if (!currentCompany.value.companyNo) {
  94. ElMessage.warning("请选择一个公司");
  95. return;
  96. }
  97. itemId.value = id;
  98. isDetails.value = type;
  99. showModel.value = true;
  100. }
  101. const submitRefresh = () => {
  102. showModel.value = false;
  103. onSearch();
  104. };
  105. const submitCancel = () => {
  106. showModel.value = false;
  107. };
  108. const resetForm = (formEl: FormInstance | undefined) => {
  109. if (!formEl) return;
  110. formEl.resetFields();
  111. form.page = 1;
  112. onSearch();
  113. };
  114. onMounted(() => {
  115. powers.value = useUserStoreHook().getMenuActions("role");
  116. if (powers.value.some(i => i == "001")) {
  117. onSearch();
  118. }
  119. });
  120. watch(
  121. () => currentCompany.value,
  122. () => onSearch()
  123. );
  124. </script>
  125. <template>
  126. <div class="main role">
  127. <div v-show="powers.some(i => i == '001')">
  128. <el-form
  129. ref="formRef"
  130. :inline="true"
  131. :model="form"
  132. :label-width="0"
  133. class="bg-white w-99/100 pl-8 pt-4"
  134. >
  135. <el-form-item prop="status">
  136. <el-select
  137. v-model="form.status"
  138. style="width: 100%"
  139. placeholder="角色状态"
  140. clearable
  141. >
  142. <el-option
  143. v-for="(si, sii) in statusList"
  144. :key="'status' + si.value + sii"
  145. :label="si.label"
  146. :value="si.value"
  147. />
  148. </el-select>
  149. </el-form-item>
  150. <el-form-item prop="role_name">
  151. <el-input v-model="form.role_name" placeholder="角色名称" clearable />
  152. </el-form-item>
  153. <el-form-item>
  154. <el-button
  155. type="primary"
  156. :icon="useRenderIcon('search')"
  157. :loading="loading"
  158. @click="resetSearch"
  159. >
  160. 搜索
  161. </el-button>
  162. <el-button
  163. :icon="useRenderIcon('refresh')"
  164. @click="resetForm(formRef)"
  165. >
  166. 重置
  167. </el-button>
  168. </el-form-item>
  169. </el-form>
  170. <TableProBar
  171. title="公司角色管理"
  172. :loading="loading"
  173. :dataList="dataList"
  174. @refresh="onSearch"
  175. >
  176. <template #buttons>
  177. <el-button
  178. type="primary"
  179. v-if="powers.some(i => i == '002')"
  180. :icon="useRenderIcon('add')"
  181. @click="editItem('', 'add')"
  182. >
  183. 新增角色
  184. </el-button>
  185. </template>
  186. <template v-slot="{ size, checkList }">
  187. <PureTable
  188. border
  189. align="left"
  190. showOverflowTooltip
  191. table-layout="auto"
  192. :size="size"
  193. :data="dataList"
  194. :columns="columns"
  195. :checkList="checkList"
  196. :pagination="pagination"
  197. :paginationSmall="size === 'small' ? true : false"
  198. :header-cell-style="{ background: '#fafafa', color: '#606266' }"
  199. @selection-change="handleSelectionChange"
  200. @size-change="handleSizeChange"
  201. @current-change="handleCurrentChange"
  202. >
  203. <template #operation="{ row }">
  204. <el-button
  205. class="reset-margin"
  206. link
  207. type="primary"
  208. v-if="powers.some(i => i == '007')"
  209. :size="size"
  210. @click="editItem(row.id, 'view')"
  211. :icon="useRenderIcon('eye-view')"
  212. />
  213. <el-button
  214. class="reset-margin"
  215. link
  216. type="primary"
  217. :size="size"
  218. v-if="powers.some(i => i == '005')"
  219. @click="editItem(row.id, 'edit')"
  220. :icon="useRenderIcon('edits')"
  221. />
  222. <el-popconfirm
  223. :title="row.status === '1' ? '改为禁用?' : '改为启用?'"
  224. v-if="
  225. (powers.some(i => i == '004') && row.status + '' === '1') ||
  226. (powers.some(i => i == '003') && row.status + '' === '0')
  227. "
  228. @confirm="handleStatus(row)"
  229. >
  230. <template #reference>
  231. <el-button
  232. class="reset-margin"
  233. link
  234. type="primary"
  235. :size="size"
  236. :icon="
  237. useRenderIcon(
  238. row.status === '1'
  239. ? 'close-circle-line'
  240. : 'checkbox-circle-line'
  241. )
  242. " /></template
  243. ></el-popconfirm>
  244. </template>
  245. </PureTable>
  246. </template>
  247. </TableProBar>
  248. <addEdit
  249. :itemId="itemId"
  250. :isDetails="isDetails"
  251. :show-model="showModel"
  252. @refresh="submitRefresh"
  253. @cancel="submitCancel"
  254. />
  255. </div>
  256. <NoAuth v-show="!powers.some(i => i == '001')" />
  257. </div>
  258. </template>
  259. <style scoped lang="scss">
  260. :deep(.el-dropdown-menu__item i) {
  261. margin: 0;
  262. }
  263. </style>