index.vue 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. <template>
  2. <div class="page-container">
  3. <div class="page-header">
  4. <PageTitle title="角色管理" />
  5. <!-- <el-button type="danger" @click="handleAdd">新增角色</el-button> -->
  6. </div>
  7. <el-table :data="paginatedRoleList" border>
  8. <el-table-column prop="roleName" label="角色名称" min-width="150" align="center" />
  9. <el-table-column prop="roleSort" label="显示顺序" width="100" align="center" />
  10. <el-table-column prop="status" label="状态" width="100" align="center">
  11. <template #default="{ row }">
  12. <span :style="{ color: row.status === '0' ? '#67c23a' : '#999' }">
  13. {{ row.status === '0' ? '正常' : '停用' }}
  14. </span>
  15. </template>
  16. </el-table-column>
  17. <el-table-column prop="createTime" label="创建时间" width="180" align="center" />
  18. <el-table-column prop="remark" label="备注" min-width="150" align="center" show-overflow-tooltip />
  19. <!-- <el-table-column label="操作" width="150" align="center" fixed="right">
  20. <template #default="{ row }">
  21. <el-button disabled type="danger" link size="small" @click="handleDelete(row)">删除</el-button>
  22. </template>
  23. </el-table-column> -->
  24. </el-table>
  25. <el-pagination
  26. v-model:current-page="currentPage"
  27. v-model:page-size="pageSize"
  28. :page-sizes="[10, 20, 50, 100]"
  29. :total="total"
  30. layout="total, sizes, prev, pager, next, jumper"
  31. @size-change="handleSizeChange"
  32. @current-change="handleCurrentChange"
  33. style="margin-top: 20px; justify-content: flex-end"
  34. />
  35. <!-- 新增/编辑角色弹窗 -->
  36. <el-dialog v-model="dialogVisible" :title="dialogTitle" width="500px" destroy-on-close>
  37. <el-form ref="formRef" :model="formData" :rules="formRules" label-width="100px">
  38. <el-form-item label="角色名称" prop="roleName">
  39. <el-input v-model="formData.roleName" placeholder="请输入角色名称" />
  40. </el-form-item>
  41. <el-form-item label="显示顺序" prop="roleSort">
  42. <el-input-number v-model="formData.roleSort" :min="0" />
  43. </el-form-item>
  44. <el-form-item label="状态">
  45. <el-radio-group v-model="formData.status">
  46. <el-radio label="0">正常</el-radio>
  47. <el-radio label="1">停用</el-radio>
  48. </el-radio-group>
  49. </el-form-item>
  50. <el-form-item label="备注">
  51. <el-input v-model="formData.remark" type="textarea" :rows="3" placeholder="请输入备注" />
  52. </el-form-item>
  53. </el-form>
  54. <template #footer>
  55. <el-button @click="dialogVisible = false">取消</el-button>
  56. <el-button type="danger" @click="handleSubmit">确定</el-button>
  57. </template>
  58. </el-dialog>
  59. </div>
  60. </template>
  61. <script setup lang="ts">
  62. import { ref, reactive, computed, onMounted } from 'vue';
  63. import { ElMessage, ElMessageBox } from 'element-plus';
  64. import { PageTitle } from '@/components';
  65. import { getRoleList, addRole, updateRole, deleteRole } from '@/api/pc/organization';
  66. import { create } from 'domain';
  67. const roleList = ref([]);
  68. const currentPage = ref(1);
  69. const pageSize = ref(10);
  70. const dialogVisible = ref(false);
  71. const formRef = ref();
  72. const editingRow = ref<any>(null);
  73. const formData = reactive({
  74. roleId: undefined,
  75. roleName: '',
  76. roleKey: '',
  77. roleSort: 0,
  78. status: '0',
  79. remark: ''
  80. });
  81. const formRules = {
  82. roleName: [{ required: true, message: '请输入角色名称', trigger: 'blur' }]
  83. };
  84. const total = computed(() => roleList.value.length);
  85. const dialogTitle = computed(() => (editingRow.value ? '编辑角色' : '新增角色'));
  86. const paginatedRoleList = computed(() => {
  87. const start = (currentPage.value - 1) * pageSize.value;
  88. const end = start + pageSize.value;
  89. return roleList.value.slice(start, end);
  90. });
  91. const loadRoleList = async () => {
  92. try {
  93. // const res = await getRoleList();
  94. // if (res.code === 200 && res.data) {
  95. // roleList.value = res.data;
  96. // }
  97. roleList.value = [
  98. { roleId: 1, roleName: '管理角色', roleSort: 1, status: '0', remark: '管理角色', createTime: '2026-01-27 09:36:27' },
  99. { roleId: 2, roleName: '采购角色', roleSort: 2, status: '0', remark: '采购角色', createTime: '2026-01-27 09:36:38' },
  100. { roleId: 3, roleName: '查询角色', roleSort: 3, status: '0', remark: '查询角色', createTime: '2026-01-27 09:37:33' },
  101. { roleId: 4, roleName: '审核角色', roleSort: 4, status: '0', remark: '审核角色', createTime: '2026-01-27 09:37:50' }
  102. ];
  103. } catch (error) {
  104. console.error('获取角色列表失败:', error);
  105. ElMessage.error('获取角色列表失败');
  106. }
  107. };
  108. const handleSizeChange = (val: number) => {
  109. pageSize.value = val;
  110. currentPage.value = 1;
  111. };
  112. const handleCurrentChange = (val: number) => {
  113. currentPage.value = val;
  114. };
  115. const handleAdd = () => {
  116. editingRow.value = null;
  117. Object.assign(formData, {
  118. roleId: undefined,
  119. roleName: '',
  120. roleKey: '',
  121. roleSort: 0,
  122. status: '0',
  123. remark: ''
  124. });
  125. dialogVisible.value = true;
  126. };
  127. const handleEdit = (row: any) => {
  128. editingRow.value = row;
  129. Object.assign(formData, {
  130. roleId: row.roleId,
  131. roleName: row.roleName,
  132. roleKey: row.roleKey,
  133. roleSort: row.roleSort,
  134. status: row.status,
  135. remark: row.remark
  136. });
  137. dialogVisible.value = true;
  138. };
  139. const handleSubmit = async () => {
  140. const valid = await formRef.value?.validate();
  141. if (!valid) return;
  142. try {
  143. if (editingRow.value) {
  144. await updateRole(formData);
  145. ElMessage.success('编辑成功');
  146. } else {
  147. await addRole(formData);
  148. ElMessage.success('新增成功');
  149. }
  150. dialogVisible.value = false;
  151. await loadRoleList();
  152. } catch (error) {
  153. console.error('操作失败:', error);
  154. ElMessage.error('操作失败');
  155. }
  156. };
  157. const handleDelete = (row: any) => {
  158. ElMessageBox.confirm(`确定要删除角色"${row.roleName}"吗?`, '提示', {
  159. confirmButtonText: '确定',
  160. cancelButtonText: '取消',
  161. type: 'warning'
  162. }).then(async () => {
  163. try {
  164. await deleteRole([row.roleId]);
  165. ElMessage.success('删除成功');
  166. await loadRoleList();
  167. } catch (error) {
  168. console.error('删除失败:', error);
  169. ElMessage.error('删除失败');
  170. }
  171. });
  172. };
  173. onMounted(() => {
  174. loadRoleList();
  175. });
  176. </script>
  177. <style scoped lang="scss">
  178. .page-container {
  179. padding: 20px;
  180. background: #fff;
  181. min-height: 100%;
  182. }
  183. .page-header {
  184. display: flex;
  185. justify-content: space-between;
  186. align-items: center;
  187. margin-bottom: 20px;
  188. :deep(.page-title) {
  189. margin-bottom: 0;
  190. }
  191. }
  192. :deep(.el-table) {
  193. th.el-table__cell {
  194. background: #fafafa;
  195. font-weight: 500;
  196. color: #333;
  197. }
  198. }
  199. </style>