index.vue 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. <script setup lang="ts">
  2. import { useColumns } from "./columns";
  3. import { httpList, httpStatus } from "/@/api/system/updates";
  4. import { reactive, ref, onMounted } from "vue";
  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. const { logout } = useNav();
  13. defineOptions({
  14. name: "role"
  15. });
  16. const form = reactive({
  17. name: "",
  18. page: 1,
  19. size: 15
  20. });
  21. const dataList = ref([]);
  22. const loading = ref(true);
  23. const { columns } = useColumns();
  24. const showModel = ref(false);
  25. const itemId = ref("");
  26. const isDetails = ref("add");
  27. const formRef = ref<FormInstance>();
  28. const pagination = reactive<PaginationProps>({
  29. total: 0,
  30. pageSize: 15,
  31. currentPage: 1,
  32. background: true
  33. });
  34. //修改状态
  35. const handleStatus = async row => {
  36. const { id, status } = row;
  37. const { code, message } = await httpStatus({
  38. id,
  39. status: status + "" === "1" ? "0" : "1"
  40. });
  41. if (code === 0) {
  42. onSearch();
  43. } else if (code > 100 && code < 140) {
  44. logout();
  45. } else {
  46. ElMessage.error(message);
  47. }
  48. };
  49. async function handleCurrentChange(val: number) {
  50. form.page = val;
  51. await onSearch();
  52. }
  53. async function handleSizeChange(val: number) {
  54. form.size = val;
  55. form.page = 1;
  56. await onSearch();
  57. }
  58. function handleSelectionChange(val) {
  59. console.log("handleSelectionChange", val);
  60. }
  61. async function onSearch() {
  62. loading.value = true;
  63. const { code, data, message } = await httpList(form);
  64. if (code === 0) {
  65. const { list, count } = data;
  66. dataList.value = list ?? [];
  67. pagination.total = count ?? 0;
  68. pagination.pageSize = form.size;
  69. pagination.currentPage = form.page;
  70. } else if (code > 100 && code < 140) {
  71. logout();
  72. } else {
  73. ElMessage.error(message);
  74. }
  75. loading.value = false;
  76. }
  77. async function resetSearch() {
  78. form.page = 1;
  79. await onSearch();
  80. }
  81. //新建/编辑/详情弹窗
  82. function editItem(id, type) {
  83. itemId.value = id;
  84. isDetails.value = type;
  85. showModel.value = true;
  86. }
  87. const resetForm = (formEl: FormInstance | undefined) => {
  88. if (!formEl) return;
  89. formEl.resetFields();
  90. form.page = 1;
  91. onSearch();
  92. };
  93. onMounted(() => {
  94. onSearch();
  95. });
  96. </script>
  97. <template>
  98. <div class="main role">
  99. <el-form
  100. ref="formRef"
  101. :inline="true"
  102. :model="form"
  103. :label-width="0"
  104. class="bg-white w-99/100 pl-8 pt-4"
  105. >
  106. <el-form-item prop="status">
  107. <el-select
  108. v-model="form.status"
  109. style="width: 100%"
  110. placeholder="角色状态"
  111. clearable
  112. >
  113. <el-option
  114. v-for="(si, sii) in statusList"
  115. :key="'status' + si.value + sii"
  116. :label="si.label"
  117. :value="si.value"
  118. />
  119. </el-select>
  120. </el-form-item>
  121. <el-form-item prop="role_name">
  122. <el-input v-model="form.role_name" placeholder="角色名称" clearable />
  123. </el-form-item>
  124. <el-form-item>
  125. <el-button
  126. type="primary"
  127. :icon="useRenderIcon('search')"
  128. :loading="loading"
  129. @click="resetSearch"
  130. >
  131. 搜索
  132. </el-button>
  133. <el-button :icon="useRenderIcon('refresh')" @click="resetForm(formRef)">
  134. 重置
  135. </el-button>
  136. </el-form-item>
  137. </el-form>
  138. <TableProBar
  139. title="角色管理"
  140. :loading="loading"
  141. :dataList="dataList"
  142. @refresh="onSearch"
  143. >
  144. <template #buttons>
  145. <el-button
  146. type="primary"
  147. :icon="useRenderIcon('add')"
  148. @click="editItem('', 'add')"
  149. >
  150. 新增角色
  151. </el-button>
  152. </template>
  153. <template v-slot="{ size, checkList }">
  154. <PureTable
  155. border
  156. align="left"
  157. showOverflowTooltip
  158. table-layout="auto"
  159. :size="size"
  160. :data="dataList"
  161. :columns="columns"
  162. :checkList="checkList"
  163. :pagination="pagination"
  164. :paginationSmall="size === 'small' ? true : false"
  165. :header-cell-style="{ background: '#fafafa', color: '#606266' }"
  166. @selection-change="handleSelectionChange"
  167. @size-change="handleSizeChange"
  168. @current-change="handleCurrentChange"
  169. >
  170. <template #operation="{ row }">
  171. <el-button
  172. class="reset-margin"
  173. link
  174. type="primary"
  175. :size="size"
  176. @click="editItem(row.id, 'view')"
  177. :icon="useRenderIcon('eye-view')"
  178. />
  179. <el-button
  180. class="reset-margin"
  181. link
  182. type="primary"
  183. :size="size"
  184. @click="editItem(row.id, 'edit')"
  185. :icon="useRenderIcon('edits')"
  186. />
  187. <el-popconfirm
  188. :title="row.status === '1' ? '改为禁用?' : '改为启用?'"
  189. @confirm="handleStatus(row)"
  190. >
  191. <template #reference>
  192. <el-button
  193. class="reset-margin"
  194. link
  195. type="primary"
  196. :size="size"
  197. :icon="
  198. useRenderIcon(
  199. row.status === '1'
  200. ? 'close-circle-line'
  201. : 'checkbox-circle-line'
  202. )
  203. " /></template
  204. ></el-popconfirm>
  205. </template>
  206. </PureTable>
  207. </template>
  208. </TableProBar>
  209. </div>
  210. </template>
  211. <style scoped lang="scss">
  212. :deep(.el-dropdown-menu__item i) {
  213. margin: 0;
  214. }
  215. </style>