123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- <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="50">
- <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>
- </CommonPage>
- </template>
- <script setup>
- import { MeCrud, MeQueryItem } from '@/components'
- import { useCrud } from '@/composables'
- import { formatDateTime } from '@/utils'
- import { NButton, NSwitch, NDropdown } 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 { handleDelete }
- = useCrud({
- name: '文章',
- doCreate: api.create,
- doDelete: api.delete,
- doUpdate: api.update,
- initForm: { enable: true },
- refresh: (_, keepCurrentPage) => $table.value?.handleSearch(keepCurrentPage),
- })
- const topOptions = [
- {
- label: '设置置顶',
- key: 'up',
- },
- {
- label: '取消置顶',
- key: 'down',
- }
- ]
- const columns = [
- { title: 'ID', key: 'id', width: '80' },
- { title: '标题', key: 'title', width: '200' },
- { title: '分类', key: 'category.title' },
- {
- title: '内容',
- key: 'content',
- width: '400',
- render: row => h('div', htmlspecialchars(row.translations?.length ? row.translations.find(i => i.locale === 'zh').content : row.content)),
- },
- { title: '创建人', key: 'user.username' },
- {
- title: '创建时间',
- key: 'createTime',
- render: row => h('span', formatDateTime(row.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(NDropdown, {
- options:topOptions,
- trigger: 'click',
- onSelect: (key) => handleUpDown(row,key)
- }, {
- default: () => h(NButton,
- {
- bordered: false,
- type: 'info',
- size: "small"
- },
- {
- default: () => '置顶',
- // icon: () => h('i', { class: 'i-fe:more-horizontal mr-4 text-16' }),
- })
- }),
- h(
- NButton,
- {
- size: 'small',
- type: 'primary',
- style: 'margin-left: 6px;margin-right: 6px;',
- 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',
- 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 {
- console.log('row', row)
- await api.update({ ...row, id: row.id, enable: !row.enable })
- row.enableLoading = false
- $message.success('操作成功')
- $table.value?.handleSearch()
- }
- catch (error) {
- console.error(error)
- row.enableLoading = false
- }
- }
- function htmlspecialchars(str) {
- const div = document.createElement('div')
- div.innerHTML = str
- const text = div.textContent || ''
- return text.length > 150 ? `${text.substring(0, 150)}...` : text
- }
- function handleEdit(row) {
- router.push(`/article/edit/${row.id}`)
- }
- async function handleUpDown(row,key) {
- row.enableLoading = true
- try {
- if(key == 'up') {
- await api.up(row.id)
- } else {
- await api.down(row.id)
- }
-
- row.enableLoading = false
- $message.success('操作成功')
- $table.value?.handleSearch()
- }
- catch (error) {
- console.error(error)
- row.enableLoading = false
- }
- }
- </script>
|