|
@@ -0,0 +1,204 @@
|
|
|
+<template>
|
|
|
+ <CommonPage>
|
|
|
+ <template #action>
|
|
|
+ <NButton type="primary" @click="router.push('article/add')">
|
|
|
+ <i class="i-material-symbols:add mr-4 text-18" />
|
|
|
+ 新增文章
|
|
|
+ </NButton>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <MeCrud
|
|
|
+ ref="$table"
|
|
|
+ v-model:query-items="queryItems"
|
|
|
+ :scroll-x="1200"
|
|
|
+ :columns="columns"
|
|
|
+ :get-data="api.read"
|
|
|
+ >
|
|
|
+ <MeQueryItem label="分类名称" :label-width="80">
|
|
|
+ <n-input v-model:value="queryItems.title" type="text" placeholder="请输入分类名称" clearable>
|
|
|
+ <template #password-visible-icon />
|
|
|
+ </n-input>
|
|
|
+ </MeQueryItem>
|
|
|
+ <MeQueryItem label="状态" :label-width="50">
|
|
|
+ <n-select
|
|
|
+ v-model:value="queryItems.enable"
|
|
|
+ clearable
|
|
|
+ :options="[
|
|
|
+ { label: '启用', value: 1 },
|
|
|
+ { label: '停用', value: 0 },
|
|
|
+ ]"
|
|
|
+ />
|
|
|
+ </MeQueryItem>
|
|
|
+ </MeCrud>
|
|
|
+
|
|
|
+ <MeModal ref="modalRef" width="520px">
|
|
|
+ <n-form
|
|
|
+ ref="modalFormRef"
|
|
|
+ label-placement="left"
|
|
|
+ label-align="left"
|
|
|
+ :label-width="80"
|
|
|
+ :model="modalForm"
|
|
|
+ >
|
|
|
+ <n-form-item
|
|
|
+ label="角色名"
|
|
|
+ path="name"
|
|
|
+ :rule="{
|
|
|
+ required: true,
|
|
|
+ message: '请输入角色名',
|
|
|
+ trigger: ['input', 'blur'],
|
|
|
+ }"
|
|
|
+ >
|
|
|
+ <n-input v-model:value="modalForm.name" />
|
|
|
+ </n-form-item>
|
|
|
+ <n-form-item
|
|
|
+ label="角色编码"
|
|
|
+ path="code"
|
|
|
+ :rule="{
|
|
|
+ required: true,
|
|
|
+ message: '请输入角色编码',
|
|
|
+ trigger: ['input', 'blur'],
|
|
|
+ }"
|
|
|
+ >
|
|
|
+ <n-input v-model:value="modalForm.code" :disabled="modalAction !== 'add'" />
|
|
|
+ </n-form-item>
|
|
|
+ <n-form-item label="权限" path="permissionIds">
|
|
|
+ <n-tree
|
|
|
+ key-field="id"
|
|
|
+ label-field="name"
|
|
|
+ :selectable="false"
|
|
|
+ :data="permissionTree"
|
|
|
+ :checked-keys="modalForm.permissionIds"
|
|
|
+ :on-update:checked-keys="(keys) => (modalForm.permissionIds = keys)"
|
|
|
+
|
|
|
+ default-expand-all checkable check-on-click
|
|
|
+ class="cus-scroll max-h-200 w-full"
|
|
|
+ />
|
|
|
+ </n-form-item>
|
|
|
+ <n-form-item label="状态" path="enable">
|
|
|
+ <NSwitch v-model:value="modalForm.enable">
|
|
|
+ <template #checked>
|
|
|
+ 启用
|
|
|
+ </template>
|
|
|
+ <template #unchecked>
|
|
|
+ 停用
|
|
|
+ </template>
|
|
|
+ </NSwitch>
|
|
|
+ </n-form-item>
|
|
|
+ </n-form>
|
|
|
+ </MeModal>
|
|
|
+ </CommonPage>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup>
|
|
|
+import { MeCrud, MeModal, MeQueryItem } from '@/components'
|
|
|
+import { useCrud } from '@/composables'
|
|
|
+import { NButton, NSwitch } from 'naive-ui'
|
|
|
+import api from './api'
|
|
|
+
|
|
|
+defineOptions({ name: 'RoleMgt' })
|
|
|
+
|
|
|
+const router = useRouter()
|
|
|
+
|
|
|
+const $table = ref(null)
|
|
|
+/** QueryBar筛选参数(可选) */
|
|
|
+const queryItems = ref({})
|
|
|
+
|
|
|
+onMounted(() => {
|
|
|
+ $table.value?.handleSearch()
|
|
|
+})
|
|
|
+
|
|
|
+const { modalRef, modalFormRef, modalAction, modalForm, handleAdd, handleDelete, handleEdit }
|
|
|
+ = useCrud({
|
|
|
+ name: '文章',
|
|
|
+ doCreate: api.create,
|
|
|
+ doDelete: api.delete,
|
|
|
+ doUpdate: api.update,
|
|
|
+ initForm: { enable: true },
|
|
|
+ refresh: (_, keepCurrentPage) => $table.value?.handleSearch(keepCurrentPage),
|
|
|
+ })
|
|
|
+
|
|
|
+const columns = [
|
|
|
+ { title: '分类名称', key: 'title' },
|
|
|
+ { title: '上级分类', key: 'parent.title' },
|
|
|
+ { title: '备注', key: 'remark' },
|
|
|
+ { title: '创建人', key: 'user' },
|
|
|
+ { title: '创建时间', key: 'createTime' },
|
|
|
+ {
|
|
|
+ title: '状态',
|
|
|
+ key: 'enable',
|
|
|
+ render: row =>
|
|
|
+ h(
|
|
|
+ NSwitch,
|
|
|
+ {
|
|
|
+ size: 'small',
|
|
|
+ rubberBand: false,
|
|
|
+ value: row.enable,
|
|
|
+ loading: !!row.enableLoading,
|
|
|
+ disabled: row.code === 'SUPER_ADMIN',
|
|
|
+ onUpdateValue: () => handleEnable(row),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ checked: () => '启用',
|
|
|
+ unchecked: () => '停用',
|
|
|
+ },
|
|
|
+ ),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '操作',
|
|
|
+ key: 'actions',
|
|
|
+ width: 200,
|
|
|
+ align: 'center',
|
|
|
+ fixed: 'right',
|
|
|
+ render(row) {
|
|
|
+ return [
|
|
|
+ h(
|
|
|
+ NButton,
|
|
|
+ {
|
|
|
+ size: 'small',
|
|
|
+ type: 'primary',
|
|
|
+ style: 'margin-left: 12px;',
|
|
|
+ disabled: row.code === 'SUPER_ADMIN',
|
|
|
+ onClick: () => handleEdit(row),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ default: () => '编辑',
|
|
|
+ icon: () => h('i', { class: 'i-material-symbols:edit-outline text-14' }),
|
|
|
+ },
|
|
|
+ ),
|
|
|
+
|
|
|
+ h(
|
|
|
+ NButton,
|
|
|
+ {
|
|
|
+ size: 'small',
|
|
|
+ type: 'error',
|
|
|
+ style: 'margin-left: 12px;',
|
|
|
+ disabled: row.code === 'SUPER_ADMIN',
|
|
|
+ onClick: () => handleDelete(row.id),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ default: () => '删除',
|
|
|
+ icon: () => h('i', { class: 'i-material-symbols:delete-outline text-14' }),
|
|
|
+ },
|
|
|
+ ),
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ },
|
|
|
+]
|
|
|
+
|
|
|
+async function handleEnable(row) {
|
|
|
+ row.enableLoading = true
|
|
|
+ try {
|
|
|
+ await api.update({ id: row.id, enable: !row.enable })
|
|
|
+ row.enableLoading = false
|
|
|
+ $message.success('操作成功')
|
|
|
+ $table.value?.handleSearch()
|
|
|
+ }
|
|
|
+ catch (error) {
|
|
|
+ console.error(error)
|
|
|
+ row.enableLoading = false
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const permissionTree = ref([])
|
|
|
+api.getAllPermissionTree().then(({ data = [] }) => (permissionTree.value = data))
|
|
|
+</script>
|