Browse Source

feat: save

gemercheung 7 months ago
parent
commit
92aec0cee8

+ 6 - 1
packages/backend/src/modules/menu/dto.ts

@@ -59,6 +59,11 @@ export class CreateMenuDto {
   @IsNumber()
   @IsOptional()
   level?: number;
+
+  @ApiProperty({ nullable: true, required: false, default: null })
+  @IsNumber()
+  @IsOptional()
+  articleId?: number;
 }
 
 export class GetMenuDto {
@@ -85,7 +90,7 @@ export class QueryMenuDto extends GetMenuDto {
   parentId?: number;
 }
 
-export class UpdateMenuDto extends CreateMenuDto {
+export class UpdateMenuDto extends PartialType(CreateMenuDto) {
   @Exclude()
   user?: User;
 }

+ 11 - 0
packages/backend/src/modules/menu/menu.entity.ts

@@ -13,6 +13,7 @@ import {
 } from 'typeorm';
 import { Category } from '../category/category.entity';
 import { User } from '../user/user.entity';
+import { Article } from '../article/article.entity';
 
 @Entity()
 export class Menu {
@@ -79,4 +80,14 @@ export class Menu {
 
   @Column({ nullable: true, default: 3 })
   grid: number;
+
+  @OneToOne(() => Article, {
+    createForeignKeyConstraints: false,
+    onDelete: 'CASCADE',
+  })
+  @JoinColumn()
+  article: Article;
+
+  @Column({ nullable: true })
+  articleId: number;
 }

+ 1 - 4
packages/frontend/src/views/article/api.js

@@ -6,9 +6,6 @@ export default {
   update: data => request.patch(`/article/${data.id}`, data),
   delete: id => request.delete(`/article/${id}`),
   getOne: id => request.get(`/article/detail/${id}`),
+  getAll: data => request.get('/article?enable=1', data),
 
-  // getAllPermissionTree: () => request.get('/permission/tree'),
-  // getAllUsers: (params = {}) => request.get('/user', { params }),
-  // addRoleUsers: (roleId, data) => request.patch(`/role/users/add/${roleId}`, data),
-  // removeRoleUsers: (roleId, data) => request.patch(`/role/users/remove/${roleId}`, data),
 }

+ 19 - 2
packages/frontend/src/views/menu/list.vue

@@ -71,12 +71,22 @@
             v-model:value="modalForm.categoryId" :options="allCategory" clearable filterable tag
           />
         </n-form-item>
+
+        <n-form-item
+          label="文章链接" path="articleId"
+        >
+          <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-input-number v-model:value="modalForm.grid" style="width:100%" />
         </n-form-item>
+
         <n-form-item label="是否显示" path="isPublish">
           <NSwitch v-model:value="modalForm.isPublish">
             <template #checked>
@@ -109,6 +119,7 @@ import { useUserStore } from '@/store/index.js'
 import { formatDateTime } from '@/utils'
 import { NButton, NImage, NSwitch } from 'naive-ui'
 import { useRoute, useRouter } from 'vue-router'
+import articleApi from '../article/api'
 import categoryApi from '../category/api'
 import api from './api.js'
 
@@ -121,6 +132,9 @@ const previewFileList = ref([])
 const showModal = ref(false)
 const previewImageUrl = ref('')
 
+const allCategory = ref([])
+const allArticle = ref([])
+
 const route = useRoute()
 const detail = ref({
   title: '',
@@ -146,6 +160,7 @@ async function getMenuDetail() {
     console.log('data', data)
     detail.value = data
   }
+  getAllType()
 }
 
 const columns = [
@@ -317,6 +332,8 @@ function handleTopMenuEdit() {
   })
 }
 
-const allCategory = ref([])
-categoryApi.getAll().then(({ data = [] }) => (allCategory.value = data.map(item => ({ label: item.title, value: item.id }))))
+function getAllType() {
+  categoryApi.getAll().then(({ data = [] }) => (allCategory.value = data.map(item => ({ label: item.title, value: item.id }))))
+  articleApi.getAll().then(({ data = [] }) => (allArticle.value = data.map(item => ({ label: item.title, value: item.id }))))
+}
 </script>