瀏覽代碼

feat: fix

gemercheung 6 月之前
父節點
當前提交
5ed19d77e0

+ 1 - 1
packages/backend/src/modules/web/web.service.ts

@@ -25,7 +25,7 @@ export class WebService {
     const menus = await this.menuRepo.find({
       where: {
         enable: true,
-        isPublish: true,
+        // isPublish: true,
       },
       order: {
         order: 'ASC',

+ 3 - 2
packages/frontend/src/views/article/index.vue

@@ -9,7 +9,7 @@
 
     <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>
+        <n-input v-model:value="queryItems.title" type="text" placeholder="请输入标题" clearable>
           <template #password-visible-icon />
         </n-input>
       </MeQueryItem>
@@ -55,7 +55,7 @@ const { handleDelete }
   })
 
 const columns = [
-  { title: '标题', key: 'title', width: '200' },
+  { title: '标题', key: 'title', width: '200' },
   { title: '分类', key: 'category.title' },
   {
     title: '内容',
@@ -63,6 +63,7 @@ const columns = [
     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',

+ 5 - 4
packages/frontend/src/views/category/index.vue

@@ -9,7 +9,7 @@
 
     <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>
+        <n-input v-model:value="queryItems.title" :maxlength="200" show-count type="text" placeholder="请输入分类名称" clearable>
           <template #password-visible-icon />
         </n-input>
       </MeQueryItem>
@@ -28,7 +28,8 @@
           message: '请输入分类名',
           trigger: ['input', 'blur'],
         }">
-          <n-input v-model:value="modalForm.title" />
+          <n-input :maxlength="200" show-count
+           v-model:value="modalForm.title" />
         </n-form-item>
         <n-form-item label="上层分类" path="parentId">
           <n-select v-model:value="modalForm.parentId" :options="allCategory" clearable filterable tag />
@@ -45,7 +46,7 @@
                 message: '请输入名称',
                 trigger: ['input', 'blur'],
               }">
-                <n-input v-model:value="modalForm.translations.find(i => i.locale === lang).title" />
+                <n-input :maxlength="200" show-count v-model:value="modalForm.translations.find(i => i.locale === lang).title" />
               </n-form-item>
 
               <n-form-item label="备注" path="remark" :rule="{
@@ -53,7 +54,7 @@
                 message: '请输入备注',
                 trigger: ['input', 'blur'],
               }">
-                <n-input v-model:value="modalForm.translations.find(i => i.locale === lang).remark" type="textarea" />
+                <n-input :maxlength="200" show-count v-model:value="modalForm.translations.find(i => i.locale === lang).remark" type="textarea" />
               </n-form-item>
             </n-tab-pane>
           </template>

+ 52 - 60
packages/frontend/src/views/menu/index.vue

@@ -18,10 +18,8 @@
                   <n-card :bordered="false" size="small">
                     <template #cover>
                       <!-- <div style="width: 100%;height: 50px;overflow: hidden;"> -->
-                      <n-image
-                        preview-disabled :src="child.cover" object-fit="scale-down"
-                        style="width: 100%;height: 50px;overflow: hidden;"
-                      />
+                      <n-image preview-disabled :src="child.cover" object-fit="scale-down"
+                        style="width: 100%;height: 50px;overflow: hidden;" />
                       <!-- </div> -->
                     </template>
                     <div class="text-center text-12">
@@ -38,10 +36,8 @@
             </template>
           </div>
           <template #header-extra>
-            <n-dropdown
-              class="menu_dropdown" trigger="click" :options="options" :show-arrow="true"
-              @select="(key) => handleSelect(key, item)"
-            >
+            <n-dropdown class="menu_dropdown" trigger="click" :options="options" :show-arrow="true"
+              @select="(key) => handleSelect(key, item)">
               <n-button text>
                 <i class="i-material-symbols:more-horiz text-24" />
               </n-button>
@@ -53,59 +49,47 @@
 
     <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="title" :rule="{
-            required: true,
-            message: '请输入名称',
-            trigger: ['input', 'blur'],
-          }"
-        >
-          <n-input v-model:value="modalForm.title" />
+        <n-form-item label="名称" path="title" :rule="{
+          required: true,
+          message: '请输入名称',
+          trigger: ['input', 'blur'],
+        }">
+          <n-input :maxlength="200" show-count v-model:value="modalForm.title" />
         </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 label="描述" path="description" :rule="{
+          required: false,
+          message: '请输入描述',
+          trigger: ['input', 'blur'],
+        }">
+          <n-input :maxlength="200" show-count v-model:value="modalForm.description" type="textarea" />
         </n-form-item>
-        <n-form-item
-          label="样式类型" path="styleType" :rule="{
-            required: true,
-            type: 'number',
-            message: '请输入样式类型',
-            trigger: ['input', 'blur'],
-          }"
-        >
+        <n-form-item 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-form-item>
         <n-tabs v-if="modalForm.translations.length > 0" type="line" animated>
           <template v-for="(lang, index) in langs" :key="lang">
             <n-tab-pane :name="lang" :tab="langLabel[lang]" :index="index">
-              <n-form-item
-                label="名称" path="title" :rule="{
-                  required: true,
-                  message: '请输入名称',
-                  trigger: ['input', 'blur'],
-                }"
-              >
-                <n-input v-model:value="modalForm.translations.find(i => i.locale === lang).title" />
+              <n-form-item label="名称" path="title" :rule="{
+                required: true,
+                message: '请输入名称',
+                trigger: ['input', 'blur'],
+              }">
+                <n-input :maxlength="200" show-count v-model:value="modalForm.translations.find(i => i.locale === lang).title" />
               </n-form-item>
 
-              <n-form-item
-                label="描述" path="description" :rule="{
-                  required: false,
-                  message: '请输入描述',
-                  trigger: ['input', 'blur'],
-                }"
-              >
-                <n-input
-                  v-model:value="modalForm.translations.find(i => i.locale === lang).description"
-                  type="textarea"
-                />
+              <n-form-item label="描述" path="description" :rule="{
+                required: false,
+                message: '请输入描述',
+                trigger: ['input', 'blur'],
+              }">
+                <n-input :maxlength="200" show-count v-model:value="modalForm.translations.find(i => i.locale === lang).description"
+                  type="textarea" />
               </n-form-item>
             </n-tab-pane>
           </template>
@@ -113,7 +97,7 @@
         <n-form-item label="备注" path="remark">
           <n-input v-model:value="modalForm.remark" />
         </n-form-item>
-        <n-form-item label="是否显示" path="isPublish">
+        <!-- <n-form-item label="是否显示" path="isPublish">
           <NSwitch v-model:value="modalForm.isPublish">
             <template #checked>
               启用
@@ -122,7 +106,7 @@
               停用
             </template>
           </NSwitch>
-        </n-form-item>
+        </n-form-item> -->
         <n-form-item label="状态" path="enable">
           <NSwitch v-model:value="modalForm.enable">
             <template #checked>
@@ -164,8 +148,8 @@ const { modalRef, modalFormRef, modalAction, modalForm, handleAdd, handleDelete,
     doDelete: MenuApi.delete,
     doUpdate: MenuApi.update,
     initForm: {
-      enable: true,
-      isPublish: true,
+      enable: true,
+      isPublish: true,
       translations: initTranslations({}, ['title', 'remark']).translations,
     },
     refresh: (_, keepCurrentPage) => $table.value?.handleSearch(keepCurrentPage),
@@ -205,11 +189,19 @@ function handleSelect(key, item) {
 }
 
 async function handleTopMenuDelete(id) {
-  const res = await MenuApi.delete(id)
-  if (res.code === 0) {
-    $message.success('操作成功!')
-    getTopMenuList()
-  }
+  $dialog.confirm({
+    content: '确认删除?',
+    async confirm() {
+      const res = await MenuApi.delete(id)
+      if (res.code === 0) {
+        $message.success('操作成功!')
+        getTopMenuList()
+      }
+    },
+    cancel() {
+      $message.warning('已取消')
+    },
+  })
 }
 
 async function handleTopMenuEdit(id) {

+ 30 - 28
packages/frontend/src/views/menu/list.vue

@@ -14,30 +14,30 @@
 
     <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>
+        <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
+        <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-input :maxlength="200" show-count v-model:value="modalForm.title" />
         </n-form-item>
 
         <!-- <n-form-item label="描述" path="description" :rule="{
@@ -48,56 +48,56 @@
           <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
+          <n-upload
             :multiple="false" :default-upload="true" list-type="image-card" :custom-request="uploadCover"
-            :max="1" :default-file-list="previewFileList" @preview="handlePreview" @remove="handleCoverRemove"
+            :max="1" :default-file-list="previewFileList" @preview="handlePreview" @remove="handleCoverRemove"
           />
           <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
+          <n-tree-select
             v-model:value="modalForm.categoryId" :options="allCategory" label-field="title" key-field="id"
-            placeholder="根分类" clearable
+            placeholder="根分类" clearable
           />
         </n-form-item>
 
-        <n-form-item
+        <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-form-item>
 
-        <n-form-item
+        <n-form-item
           v-if="isShowOtherCol" label="其他类别" path="otherType" :rule="{
             required: true,
             type: 'number',
             message: '请输入其他类别',
             trigger: ['input', 'blur'],
-          }"
+          }"
         >
           <n-select v-model:value="modalForm.otherType" :options="otherstyleEnum" clearable />
         </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-form-item>
@@ -106,13 +106,13 @@
           <n-input-number v-model:value="modalForm.grid" style="width:100%" />
         </n-form-item>
 
-        <n-form-item
+        <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>
@@ -120,28 +120,29 @@
         <n-tabs v-if="modalForm.translations.length > 0" type="line" animated>
           <template v-for="(lang, index) in langs" :key="lang">
             <n-tab-pane :name="lang" :tab="langLabel[lang]" :index="index">
-              <n-form-item
+              <n-form-item
                 label="名称" path="title" :rule="{
                   required: true,
                   message: '请输入名称',
                   trigger: ['input', 'blur'],
-                }"
+                }"
               >
-                <n-input v-model:value="modalForm.translations.find(i => i.locale === lang).title">
+                <n-input :maxlength="200" show-count v-model:value="modalForm.translations.find(i => i.locale === lang).title">
                   <template #password-invisible-icon />
                 </n-input>
               </n-form-item>
 
-              <n-form-item
+              <n-form-item
                 label="描述" path="description" :rule="{
                   required: false,
                   message: '请输入描述',
                   trigger: ['input', 'blur'],
-                }"
+                }"
               >
-                <n-input
+                <n-input
+                 :maxlength="200" show-count
                   v-model:value="modalForm.translations.find(i => i.locale === lang).description"
-                  type="textarea"
+                  type="textarea"
                 />
               </n-form-item>
             </n-tab-pane>
@@ -248,7 +249,7 @@ async function getMenuDetail() {
 }
 
 const columns = [
-  { title: '标题', key: 'title', width: '200' },
+  { title: '标题', key: 'title', width: '200' },
   { title: '分类', key: 'category.title' },
   {
     title: '封面图',
@@ -261,6 +262,7 @@ const columns = [
         })
       : null,
   },
+  { title: '创建人', key: 'user.username' },
   {
     title: '创建时间',
     key: 'createTime',