|
@@ -19,118 +19,92 @@
|
|
|
</n-input>
|
|
|
</MeQueryItem>
|
|
|
<MeQueryItem label="状态" :label-width="50">
|
|
|
- <n-select
|
|
|
+ <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="95" :model="modalForm">
|
|
|
- <n-form-item
|
|
|
+ <n-form-item
|
|
|
label="名称" path="title" :rule="{
|
|
|
required: true,
|
|
|
message: '请输入名称',
|
|
|
trigger: ['input', 'blur'],
|
|
|
- }"
|
|
|
+ }"
|
|
|
>
|
|
|
<n-input v-model:value="modalForm.title" />
|
|
|
</n-form-item>
|
|
|
|
|
|
- <n-form-item
|
|
|
+ <n-form-item
|
|
|
label="描述" path="description" :rule="{
|
|
|
required: false,
|
|
|
message: '请输入描述',
|
|
|
trigger: ['input', 'blur'],
|
|
|
- }"
|
|
|
+ }"
|
|
|
>
|
|
|
<n-input v-model:value="modalForm.description" type="textarea" />
|
|
|
</n-form-item>
|
|
|
<n-form-item v-if="modalForm.level !== 0" label="封面" path="cover">
|
|
|
- <n-upload
|
|
|
- :multiple="false"
|
|
|
- :default-upload="true"
|
|
|
- list-type="image-card"
|
|
|
- :custom-request="uploadCover"
|
|
|
- :max="1"
|
|
|
- :default-file-list="previewFileList"
|
|
|
- @preview="handlePreview"
|
|
|
- @remove="handleCoverRemove"
|
|
|
+ <n-upload
|
|
|
+ :multiple="false" :default-upload="true" list-type="image-card" :custom-request="uploadCover"
|
|
|
+ :max="1" :default-file-list="previewFileList" @preview="handlePreview" @remove="handleCoverRemove"
|
|
|
/>
|
|
|
- <n-modal
|
|
|
- v-model:show="showModal"
|
|
|
- preset="card"
|
|
|
- style="width: 600px"
|
|
|
- title=""
|
|
|
- >
|
|
|
+ <n-modal v-model:show="showModal" preset="card" style="width: 600px" title="">
|
|
|
<img :src="previewImageUrl" style="width: 100%">
|
|
|
</n-modal>
|
|
|
</n-form-item>
|
|
|
- <n-form-item
|
|
|
+ <n-form-item
|
|
|
label="分类" path="categoryId" :rule="{
|
|
|
required: modalForm.level === 0 ? false : true,
|
|
|
type: 'number',
|
|
|
trigger: ['change', 'blur'],
|
|
|
message: '请输入分类',
|
|
|
- }"
|
|
|
+ }"
|
|
|
>
|
|
|
- <n-tree-select
|
|
|
- v-model:value="modalForm.categoryId"
|
|
|
- :options="allCategory"
|
|
|
- label-field="title"
|
|
|
- key-field="id"
|
|
|
- placeholder="根分类"
|
|
|
- clearable
|
|
|
+ <n-tree-select
|
|
|
+ v-model:value="modalForm.categoryId" :options="allCategory" label-field="title" key-field="id"
|
|
|
+ placeholder="根分类" clearable
|
|
|
/>
|
|
|
</n-form-item>
|
|
|
|
|
|
- <n-form-item
|
|
|
- v-if="modalForm.level === 0"
|
|
|
- label="样式类型" path="styleType" :rule="{
|
|
|
+ <n-form-item
|
|
|
+ v-if="modalForm.level === 0" label="样式类型" path="styleType" :rule="{
|
|
|
required: true,
|
|
|
type: 'number',
|
|
|
message: '请输入样式类型',
|
|
|
trigger: ['input', 'blur'],
|
|
|
- }"
|
|
|
+ }"
|
|
|
>
|
|
|
- <n-select
|
|
|
- v-model:value="modalForm.styleType" :options="styleEnum" clearable filterable tag
|
|
|
- />
|
|
|
+ <n-select v-model:value="modalForm.styleType" :options="styleEnum" clearable filterable tag />
|
|
|
</n-form-item>
|
|
|
|
|
|
- <n-form-item
|
|
|
+ <n-form-item
|
|
|
label="文章链接" path="articleId" :rule="{
|
|
|
required: false,
|
|
|
type: 'number',
|
|
|
trigger: ['change', 'blur'],
|
|
|
message: '请输入文章链接',
|
|
|
- }"
|
|
|
+ }"
|
|
|
>
|
|
|
- <n-select
|
|
|
- v-model:value="modalForm.articleId" :options="allArticle"
|
|
|
- clearable filterable tag
|
|
|
- />
|
|
|
+ <n-select v-model:value="modalForm.articleId" :options="allArticle" clearable filterable tag />
|
|
|
</n-form-item>
|
|
|
|
|
|
- <n-form-item
|
|
|
- v-if="modalForm.level === 0"
|
|
|
- label="一行显示数" path="grid"
|
|
|
- >
|
|
|
+ <n-form-item v-if="modalForm.level === 0" label="一行显示数" path="grid">
|
|
|
<n-input-number v-model:value="modalForm.grid" style="width:100%" />
|
|
|
</n-form-item>
|
|
|
|
|
|
- <n-form-item
|
|
|
- label="排序"
|
|
|
- path="order"
|
|
|
- :rule="{
|
|
|
+ <n-form-item
|
|
|
+ label="排序" path="order" :rule="{
|
|
|
type: 'number',
|
|
|
required: true,
|
|
|
message: '此为必填项',
|
|
|
trigger: ['blur', 'change'],
|
|
|
- }"
|
|
|
+ }"
|
|
|
>
|
|
|
<n-input-number v-model:value="modalForm.order" />
|
|
|
</n-form-item>
|
|
@@ -138,16 +112,25 @@
|
|
|
<n-tabs type="line" animated>
|
|
|
<template v-for="(lang, index) in langs" :key="lang">
|
|
|
<n-tab-pane :name="lang" :tab="langLabel[lang]" :index="index">
|
|
|
- {{ lang }}
|
|
|
- <n-form-item
|
|
|
+ <n-form-item
|
|
|
label="文章名称" path="title" :rule="{
|
|
|
required: true,
|
|
|
message: '请输入文章名称',
|
|
|
trigger: ['input', 'blur'],
|
|
|
- }"
|
|
|
+ }"
|
|
|
>
|
|
|
<n-input v-model:value="modalForm.translations[index].title" />
|
|
|
</n-form-item>
|
|
|
+
|
|
|
+ <n-form-item
|
|
|
+ label="描述" path="description" :rule="{
|
|
|
+ required: false,
|
|
|
+ message: '请输入描述',
|
|
|
+ trigger: ['input', 'blur'],
|
|
|
+ }"
|
|
|
+ >
|
|
|
+ <n-input v-model:value="modalForm.translations[index].description" type="textarea" />
|
|
|
+ </n-form-item>
|
|
|
</n-tab-pane>
|
|
|
</template>
|
|
|
</n-tabs>
|
|
@@ -185,6 +168,7 @@ import { formatDateTime } from '@/utils'
|
|
|
import { styleEnum } from '@/utils/enum.js'
|
|
|
import { initTranslations, langLabel, langs } from '@/utils/translations'
|
|
|
import { NButton, NImage, NSwitch } from 'naive-ui'
|
|
|
+import { ref, watchEffect } from 'vue'
|
|
|
import { useRoute, useRouter } from 'vue-router'
|
|
|
import articleApi from '../article/api'
|
|
|
import categoryApi from '../category/api'
|
|
@@ -211,7 +195,10 @@ const detail = ref({
|
|
|
const queryItems = ref({
|
|
|
parentId: route.params.id,
|
|
|
})
|
|
|
-const { modalRef, modalFormRef, modalAction, modalForm, handleAdd, handleDelete, handleEdit }
|
|
|
+
|
|
|
+const modalForm = ref({})
|
|
|
+
|
|
|
+const { modalRef, modalFormRef, modalAction, modalForm: newmodalForm, handleAdd, handleDelete, handleEdit }
|
|
|
= useCrud({
|
|
|
name: '子菜单',
|
|
|
doCreate: api.create,
|
|
@@ -221,8 +208,15 @@ const { modalRef, modalFormRef, modalAction, modalForm, handleAdd, handleDelete,
|
|
|
refresh: (_, keepCurrentPage) => $table.value?.handleSearch(keepCurrentPage),
|
|
|
})
|
|
|
|
|
|
-initTranslations(modalForm.value, ['title', 'remark'])
|
|
|
-
|
|
|
+watchEffect(() => {
|
|
|
+ if (newmodalForm.value) {
|
|
|
+ modalForm.value = {
|
|
|
+ ...newmodalForm.value,
|
|
|
+ }
|
|
|
+ initTranslations(modalForm.value, ['title', 'description'])
|
|
|
+ console.log('modalForm', modalForm)
|
|
|
+ }
|
|
|
+})
|
|
|
async function getMenuDetail() {
|
|
|
const { data } = await api.getOne(route.params.id)
|
|
|
if (data) {
|