Browse Source

客服消息优化等

pansl 1 year ago
parent
commit
8f5630d82c

+ 19 - 1
src/layout/components/Menu/index.vue

@@ -5,7 +5,8 @@ import MenuItem from './item.vue'
 import menus from './menus.vue'
 import { useUserStore } from '@/stores/modules/user'
 import { Menu } from '@/types/Menu'
-import { tr } from 'element-plus/es/locale'
+import { Router, RouteRecordRaw } from 'vue-router';
+import { useRouter, useRoute } from 'vue-router'
 
 /**
  * 递归渲染 Menu 节点
@@ -115,6 +116,23 @@ export default defineComponent({
       immediate: true,
       deep: true
     })
+    // 挂载路由(实际是从后端获取用户的权限)
+    // 动态路由挂载
+    // 挂载路由(实际是从后端获取用户的权限)
+    const router = useRouter()
+    const permissionStore = usePermissionsStore();
+    const asyncRoutes = permissionStore.getAsyncMenusFrom(
+      toRaw(userStore.getPermissions),
+      true
+    );
+    asyncRoutes.forEach((route: Menu) => {
+      router.addRoute(route as unknown as RouteRecordRaw);
+    });
+    // 在动态路由之后挂载匹配 404 路由
+    router.addRoute({
+      path: '/:pathMatch(.*)*',
+      redirect: '/404'
+    });
 
     return () => {
       return h(

+ 17 - 15
src/views/customer/segment/form/create.vue

@@ -3,25 +3,26 @@
     <el-form-item label="人群包名称" prop="name" :rules="[{ required: true, message: '人群包名称必须填写' }]" label-width="120px">
       <el-input v-model="formCallback.name" auto-complete="off" placeholder="请输入人群包名称"></el-input>
     </el-form-item>
-    <el-form-item label="配置公众号" prop="gzh_ids" :rules="[{ required: true, message: '公众号必须选择' }]" label-width="120px">
+    <el-form-item label="配置公众号" prop="gzh_ids" :rules="[{ required: false, message: '公众号必须选择' }]" label-width="120px">
       <configPublicPlus :isShowButton="false" :required="true" @change="configPublicChange"></configPublicPlus>
     </el-form-item>
     <el-form-item label="选择标签" prop="name" :rules="[{ required: false, message: '' }]" label-width="90px">
       <div>
         <el-tabs type="card">
           <el-tab-pane label="活跃信息">
-            <el-form-item label="仅48小时内和公众号有互动的粉丝才能收到" label-width="300px"
+            <el-form-item label="仅48小时内和公众号有互动的粉丝才能收到" label-width="300px" v-if="formCallback.gzh_ids > 0"
               :rules="[{ required: false, message: '金额项必须填写' }]">
               <div class="flex items-center mb-3 mr-3">
-                <el-radio-group v-model="formCallback.tags.in_48_hour">
+                <el-radio-group v-model="formCallback.tags.in_48_hour" :disabled="formCallback.gzh_ids <= 0">
                   <el-radio :label="1">是</el-radio>
                   <el-radio :label="2">否</el-radio>
                 </el-radio-group>
               </div>
             </el-form-item>
-            <el-form-item label="关注时间" label-width="120px" :rules="[{ required: false, message: '' }]">
+            <el-form-item label="关注时间" label-width="120px" :rules="[{ required: false, message: '' }]"
+              v-if="formCallback.gzh_ids > 0">
               <div class="flex items-center mb-3 mr-3">
-                <el-radio-group v-model="formCallback.tags.attention_hour">
+                <el-radio-group v-model="formCallback.tags.attention_hour" :disabled="formCallback.gzh_ids <= 0">
                   <el-radio label="">不限</el-radio>
                   <el-radio label="0-6">6h以内</el-radio>
                   <el-radio label="24-28">24-28h</el-radio>
@@ -31,7 +32,7 @@
                 <el-tooltip placement="top">
                   <template #content>
                     <span>
-                      可自主选择用户上次互动时间范围,只填写左侧输入框即为n小时以上(包含n小时),只填写右侧输入框即为n小时以内(包含n小时)</span> <br />
+                      可自主选择用户上次互动时间范围,只填写左侧输入框即为n小时以上(包含n小时),只填写右侧输入框即为n小时以内(包含n小时),自定义最大范围在30天以内</span> <br />
                   </template>
                   <el-icon>
                     <InfoFilled />
@@ -54,9 +55,10 @@
                 </div>
               </div>
             </el-form-item>
-            <el-form-item label="上次互动时间" label-width="120px" :rules="[{ required: false, message: '' }]">
+            <el-form-item label="上次互动时间" label-width="120px" :rules="[{ required: false, message: '' }]"
+              v-if="formCallback.gzh_ids > 0">
               <div class="flex items-center mb-3 mr-3">
-                <el-radio-group v-model="formCallback.tags.interact_hour">
+                <el-radio-group v-model="formCallback.tags.interact_hour" :disabled="formCallback.gzh_ids <= 0">
                   <el-radio label="">不限</el-radio>
                   <el-radio label="0-1">1h以内</el-radio>
                   <el-radio label="1-6">1-6h</el-radio>
@@ -68,7 +70,7 @@
                 <el-tooltip placement="top">
                   <template #content>
                     <span>
-                      可自主选择用户上次互动时间范围,只填写左侧输入框即为n小时以上(包含n小时),只填写右侧输入框即为n小时以内(包含n小时)</span> <br />
+                      可自主选择用户上次互动时间范围,只填写左侧输入框即为n小时以上(包含n小时),只填写右侧输入框即为n小时以内(包含n小时),自定义最大范围在30天以内</span> <br />
                   </template>
                   <el-icon>
                     <InfoFilled />
@@ -105,7 +107,7 @@
                 <el-tooltip placement="top">
                   <template #content>
                     <span>
-                      可自主选择用户最近阅读日期范围,只填写左侧输入框即为距离今天n天前(包含n天),只填写右侧输入框即为距离今天n天以内(包含n天)</span> <br />
+                      可自主选择用户最近阅读日期范围,只填写左侧输入框即为距离今天n天前(包含n天),只填写右侧输入框即为距离今天n天以内(包含n天),自定义最大范围在30天以内</span> <br />
                   </template>
                   <el-icon>
                     <InfoFilled />
@@ -141,7 +143,7 @@
                 </el-radio-group>
                 <el-tooltip placement="top">
                   <template #content>
-                    <span>可自主选择用户最近阅读日期范围,只填写左侧输入框即为距离今天n天前(包含n天),只填写右侧输入框即为距离今天n天以内(包含n天)</span> <br />
+                    <span>可自主选择用户最近阅读日期范围,只填写左侧输入框即为距离今天n天前(包含n天),只填写右侧输入框即为距离今天n天以内(包含n天),自定义最大范围在30天以内</span> <br />
                   </template>
                   <el-icon>
                     <InfoFilled />
@@ -355,7 +357,7 @@
                 </el-radio-group>
                 <el-tooltip placement="top">
                   <template #content>
-                    <span>可自主选择用户上次充值日期范围,只填写左侧输入框即为距离今天n天前(包含n天),只填写右侧输入框即为距离今天n天以内(包含n天)</span> <br />
+                    <span>可自主选择用户上次充值日期范围,只填写左侧输入框即为距离今天n天前(包含n天),只填写右侧输入框即为距离今天n天以内(包含n天),自定义最大范围在30天以内</span> <br />
                   </template>
                   <el-icon>
                     <InfoFilled />
@@ -366,14 +368,14 @@
                 <div class="flex flex-col">
                   <el-input style="width:150px;margin:0 5px;" :min="0"
                     v-model.number="formCallback._tags.last_charge_day.min" type="number">
-                    <template #append>h</template>
+                    <template #append></template>
                   </el-input>
                 </div>
                 <span>—</span>
                 <div class="flex flex-col">
                   <el-input style="width:150px;margin:0 5px;" :min="formCallback?._tags?.last_charge_day?.min ?? 0"
                     v-model.number="formCallback._tags.last_charge_day.max" :max="30" type="number">
-                    <template #append>h</template>
+                    <template #append></template>
                   </el-input>
                 </div>
               </div>
@@ -432,7 +434,7 @@ const formCallback = ref({
   video_watch: [],
   video_charge: [],
   tags: {
-    in_48_hour: 1,
+    in_48_hour: 2,
     charge_type: '',
     attention_hour: '',
     interact_hour: '',

+ 16 - 16
src/views/officialAccount/attentionReply/form/create.vue

@@ -1,7 +1,8 @@
 <template>
-  <el-form :model="formCallback" label-width="120px" ref="form" v-loading="loading" class="pr-4">
+  <el-form :model="formCallback" label-width="120px" :disabled="props.primary?.look" ref="form" v-loading="loading"
+    class="pr-4">
     <el-form-item label="消息内容" prop="type" :rules="[{ required: true, message: '消息类型必须填写' }]" label-width="120px">
-      <el-radio-group v-model="formCallback.type" :disabled="props.primary?.look">
+      <el-radio-group v-model="formCallback.type">
         <el-radio label="txt">文本消息</el-radio>
       </el-radio-group>
     </el-form-item>
@@ -22,16 +23,15 @@
         </template>
         <div class="insert-content">
           <div v-for="(item, index) in formCallback.content" :key="index" class="flex items-center">
-            <span class="mr-5">
+            <span class="mr-5" v-if="!props.primary?.look">
               <el-icon @click="removeItem(index)" class="cursor-pointer">
                 <Delete />
               </el-icon>
             </span>
-            <el-button type="primary" link v-if="item.url" @click="linkClick({ index, ...item })">
+            <el-text type="primary" class="cursor-pointer" v-if="item.url" @click="linkClick({ index, ...item })">
               {{ item.title }}
-            </el-button>
-            <el-input style="boder:none;" type="textarea" autosize :disabled="props.primary?.look" v-else
-              v-model="item.title" clearable></el-input>
+            </el-text>
+            <el-input style="boder:none;" type="textarea" autosize v-else v-model="item.title" clearable></el-input>
           </div>
         </div>
       </el-card>
@@ -44,7 +44,8 @@
   </el-form>
 
   <Dialog v-model="insertVisible" :title="insertTitle" destroy-on-close @update:modelValue="formCallbackinsert = {}">
-    <el-form :model="formCallbackinsert" label-width="120px" ref="insertform" v-loading="loading" class="pr-4">
+    <el-form :model="formCallbackinsert" :disabled="props.primary?.look" label-width="120px" ref="insertform"
+      v-loading="loading" class="pr-4">
       <div v-if="insertType == 'link'">
         <div class="withdraw-popup-warn">
           <span>需先</span>
@@ -53,20 +54,19 @@
           <span>,已关联的小程序可被使用在自定义菜单、模板消息和附近的小程序等场景中</span>
         </div>
         <el-form-item label="标题" prop="title" :rules="[{ required: true, message: '标题必须填写' }]" label-width="120px">
-          <el-input style="width:300px;" :disabled="props.primary?.look" type="textarea" autosize
-            v-model="formCallbackinsert.title" auto-complete="off" placeholder="请输入标题"></el-input>
+          <el-input style="width:300px;" type="textarea" autosize v-model="formCallbackinsert.title" auto-complete="off"
+            placeholder="请输入标题"></el-input>
         </el-form-item>
         <el-form-item label="链接" prop="url" :rules="[{ required: true, message: '链接必须填写' }]" label-width="120px">
-          <el-input style="width:300px;" :disabled="props.primary?.look" v-model="formCallbackinsert.url"
-            auto-complete="off" placeholder="请输入链接"></el-input>
-          <el-button v-if="!props.primary?.look" type="primary" link :icon="Plus" @click="linkVisible = true"
-            class="mr-6">插入链接</el-button>
+          <el-input style="width:350px;" v-model="formCallbackinsert.url" auto-complete="off"
+            placeholder="请输入链接"></el-input>
+          <el-button type="primary" link :icon="Plus" @click="linkVisible = true" class="mr-6">插入链接</el-button>
         </el-form-item>
       </div>
       <div v-else>
         <el-form-item label="内容" prop="title" :rules="[{ required: true, message: '内容必须填写' }]" label-width="120px">
-          <el-input style="width:300px;" :disabled="props.primary?.look" type="textarea" autosize
-            v-model="formCallbackinsert.title" auto-complete="off" placeholder="请输入内容"></el-input>
+          <el-input style="width:300px;" type="textarea" autosize v-model="formCallbackinsert.title" auto-complete="off"
+            placeholder="请输入内容"></el-input>
         </el-form-item>
       </div>
       <div class="flex justify-end" v-if="!props.primary?.look">

+ 2 - 1
src/views/officialAccount/components/configPublic.vue

@@ -5,7 +5,8 @@
         <input class="filter-input" v-model="filterPlublic" clearable placeholder="请输入公众号名称"
           @change="filterExistPlublic" />
         <div class="wrapper-inner">
-          <el-checkbox v-model="selectAllValue" @change="handleCheckAllChange">全选</el-checkbox>
+          <el-checkbox v-model="selectAllValue" @change="handleCheckAllChange"
+            v-if="filteredCities.length > 0">全选</el-checkbox>
           <el-checkbox-group v-model="formCallback.wx_auth_ids" @change="handleCheckedChange" class="flex flex-col">
             <el-checkbox :key="sIndex" :label="item" v-for="(item, sIndex) in filteredCities"
               :checked="Boolean(item.is_auth)">

+ 2 - 1
src/views/officialAccount/components/configPublicPlus.vue

@@ -3,7 +3,8 @@
     <div class="wrapper">
       <input class="filter-input" v-model="filterPlublic" clearable placeholder="请输入公众号名称" @change="filterExistPlublic" />
       <div class="wrapper-inner">
-        <el-checkbox v-model="selectAllValue" @change="handleCheckAllChange">全选</el-checkbox>
+        <el-checkbox v-model="selectAllValue" @change="handleCheckAllChange"
+          v-if="filteredCities.length > 0">全选</el-checkbox>
         <el-checkbox-group v-model="formCallback.wx_auth_ids" @change="handleCheckedChange" class="flex flex-col">
           <el-checkbox :key="sIndex" :label="item.id" v-for="(item, sIndex) in filteredCities">
             {{ item.nick_name }}

+ 16 - 15
src/views/officialAccount/keywordReply/form/create.vue

@@ -2,7 +2,8 @@
   <div class="mb-3" v-if="!props.primary?.look">
     <el-alert title="注:如果一个公众号出现关键字重复配置(比如关键字相同,回复内容相同或不同的情况),以最新一次配置为准,原配置将被覆盖" type="error" :closable="false" />
   </div>
-  <el-form :model="formCallback" label-width="120px" ref="form" v-loading="loading" class="pr-4">
+  <el-form :model="formCallback" :disabled="props.primary?.look" label-width="120px" ref="form" v-loading="loading"
+    class="pr-4">
     <el-form-item label="关键字" prop="keyword" :rules="[{ required: true, message: '关键字必须填写' }]" label-width="120px">
       <template #label>
         <div class="flex items-center">
@@ -17,10 +18,10 @@
           <span>关键字</span>
         </div>
       </template>
-      <el-input :disabled="props.primary?.look" v-model="formCallback.keyword" placeholder="请输入关键字" />
+      <el-input v-model="formCallback.keyword" placeholder="请输入关键字" />
     </el-form-item>
     <el-form-item label="消息内容" prop="type" :rules="[{ required: true, message: '消息类型必须填写' }]" label-width="120px">
-      <el-radio-group v-model="formCallback.type" :disabled="props.primary?.look">
+      <el-radio-group v-model="formCallback.type">
         <el-radio label="txt">文本消息</el-radio>
       </el-radio-group>
     </el-form-item>
@@ -42,16 +43,15 @@
         <div class="insert-content">
           <div class="insert-content">
             <div v-for="(item, index) in formCallback.content" :key="index" class="flex items-center">
-              <span class="mr-5">
+              <span class="mr-5" v-if="!props.primary?.look">
                 <el-icon @click="removeItem(index)" class="cursor-pointer">
                   <Delete />
                 </el-icon>
               </span>
-              <el-button type="primary" link v-if="item.url" @click="linkClick({ index, ...item })">
+              <el-text type="primary" class="cursor-pointer" v-if="item.url" @click="linkClick({ index, ...item })">
                 {{ item.title }}
-              </el-button>
-              <el-input style="boder:none;" type="textarea" autosize :disabled="props.primary?.look" v-else
-                v-model="item.title" clearable></el-input>
+              </el-text>
+              <el-input style="boder:none;" type="textarea" autosize v-else v-model="item.title" clearable></el-input>
             </div>
           </div>
         </div>
@@ -65,7 +65,8 @@
   </el-form>
 
   <Dialog v-model="insertVisible" :title="insertTitle" destroy-on-close @update:modelValue="formCallbackinsert = {}">
-    <el-form :model="formCallbackinsert" label-width="120px" ref="insertform" v-loading="loading" class="pr-4">
+    <el-form :disabled="props.primary?.look" :model="formCallbackinsert" label-width="120px" ref="insertform"
+      v-loading="loading" class="pr-4">
       <div v-if="insertType == 'link'">
         <div class="withdraw-popup-warn">
           <span>需先</span>
@@ -74,20 +75,20 @@
           <span>,已关联的小程序可被使用在自定义菜单、模板消息和附近的小程序等场景中</span>
         </div>
         <el-form-item label="标题" prop="title" :rules="[{ required: true, message: '标题必须填写' }]" label-width="120px">
-          <el-input style="width:300px;" type="textarea" autosize :disabled="props.primary?.look"
-            v-model="formCallbackinsert.title" auto-complete="off" placeholder="请输入标题"></el-input>
+          <el-input style="width:300px;" type="textarea" autosize v-model="formCallbackinsert.title" auto-complete="off"
+            placeholder="请输入标题"></el-input>
         </el-form-item>
         <el-form-item label="链接" prop="url" :rules="[{ required: true, message: '链接必须填写' }]" label-width="120px">
-          <el-input style="width:300px;" :disabled="props.primary?.look" v-model="formCallbackinsert.url"
-            auto-complete="off" placeholder="请输入链接"></el-input>
+          <el-input style="width:350px;" v-model="formCallbackinsert.url" auto-complete="off"
+            placeholder="请输入链接"></el-input>
           <el-button v-if="!props.primary?.look" type="primary" link :icon="Plus" @click="linkVisible = true"
             class="mr-6">插入链接</el-button>
         </el-form-item>
       </div>
       <div v-else>
         <el-form-item label="内容" prop="title" :rules="[{ required: true, message: '内容必须填写' }]" label-width="120px">
-          <el-input style="width:300px;" :disabled="props.primary?.look" type="textarea" autosize
-            v-model="formCallbackinsert.title" auto-complete="off" placeholder="请输入内容"></el-input>
+          <el-input style="width:300px;" type="textarea" autosize v-model="formCallbackinsert.title" auto-complete="off"
+            placeholder="请输入内容"></el-input>
         </el-form-item>
       </div>
       <div class="flex justify-end" v-if="!props.primary?.look">

+ 21 - 21
src/views/officialAccount/newsService/form/create.vue

@@ -1,10 +1,11 @@
 <template>
-  <el-form :model="formCallback" label-width="120px" ref="form" v-loading="loading" class="pr-4">
+  <el-form :disabled="props.primary?.look" :model="formCallback" label-width="120px" ref="form" v-loading="loading"
+    class="pr-4">
     <el-form-item label="活动名称" prop="name" :rules="[{ required: true, message: '活动名称必须填写' }]" label-width="120px">
-      <el-input v-model="formCallback.name" :disabled="props.primary?.look" placeholder="请输入活动名称" />
+      <el-input v-model="formCallback.name" placeholder="请输入活动名称" />
     </el-form-item>
     <el-form-item label="消息内容" prop="message_type" :rules="[{ required: true, message: '消息类型必须选择' }]" label-width="120px">
-      <el-radio-group v-model="formCallback.message_type" :disabled="props.primary?.look">
+      <el-radio-group v-model="formCallback.message_type">
         <el-radio :label="1">文本消息</el-radio>
       </el-radio-group>
     </el-form-item>
@@ -25,39 +26,37 @@
         </template>
         <div class="insert-content">
           <div v-for="(item, index) in formCallback.message_content" :key="index" class="flex items-center">
-            <span class="mr-5">
+            <span class="mr-5" v-if="!props.primary?.look">
               <el-icon @click="removeItem(index)" class="cursor-pointer">
                 <Delete />
               </el-icon>
             </span>
-            <el-button type="primary" link v-if="item._url" @click="linkClick({ index, ...item })">
+            <el-text type="primary" class="cursor-pointer" v-if="item._url" @click="linkClick({ index, ...item })">
               {{ item._title }}
-            </el-button>
-            <el-input :disabled="props.primary?.look" autosize type="textarea" style="boder:none;" v-else
-              v-model="item.text" clearable></el-input>
+            </el-text>
+            <el-input autosize type="textarea" style="boder:none;" v-else v-model="item.text" clearable></el-input>
           </div>
         </div>
       </el-card>
     </el-form-item>
     <el-form-item label="发送用户" prop="u_type" :rules="[{ required: true, message: '发送用户必须选择' }]" label-width="120px">
-      <el-radio-group v-model="formCallback.u_type" :disabled="props.primary?.look">
+      <el-radio-group v-model="formCallback.u_type">
         <el-radio :label="1">全部粉丝</el-radio>
         <el-radio :label="2">标签用户</el-radio>
       </el-radio-group>
     </el-form-item>
     <el-form-item label="人群包" v-if="formCallback.u_type == 2" prop="ug_id"
       :rules="[{ required: true, message: '请选择人群包', trigger: 'change' }]">
-      <el-select v-model="formCallback.ug_id" :disabled="props.primary?.look" filterable remote clearable
-        :remote-method="remoteMethod" placeholder="请选择人群包">
+      <el-select v-model="formCallback.ug_id" filterable remote clearable :remote-method="remoteMethod"
+        placeholder="请选择人群包">
         <el-option v-for="(item, index) in crowdPackageList" :key="index" :label="item.name" :value="item.id" />
       </el-select>
       <el-button v-if="!props.primary?.look" type="primary" link size="default" @click="addCrowdPackage">新增人群包</el-button>
     </el-form-item>
     <el-form-item label="发送时间" prop="send_at" :rules="[{ required: true, message: '请选择发送时间', trigger: 'change' }]">
       <div>
-        <el-date-picker :disabled="props.primary?.look" unlink-panels clearable @change="sendTimeChange"
-          format="YYYY/MM/DD hh:mm:ss" value-format="YYYY-MM-DD h:m:s" v-model="formCallback.send_at" type="datetime"
-          placeholder="选择日期时间" />
+        <el-date-picker unlink-panels clearable @change="sendTimeChange" format="YYYY/MM/DD HH:mm:ss"
+          value-format="YYYY-MM-DD H:m:s" v-model="formCallback.send_at" type="datetime" placeholder="选择日期时间" />
       </div>
       <div v-if="!props.primary?.look">
         <el-button type="primary" v-for="(time, index) in timeArr" :key="index" link size="default"
@@ -70,7 +69,8 @@
   </el-form>
 
   <Dialog v-model="insertVisible" :title="insertTitle" destroy-on-close @update:modelValue="formCallbackinsert = {}">
-    <el-form :model="formCallbackinsert" label-width="120px" ref="insertform" v-loading="loading" class="pr-4">
+    <el-form :model="formCallbackinsert" :disabled="props.primary?.look" label-width="120px" ref="insertform"
+      v-loading="loading" class="pr-4">
       <div v-if="insertType == 'link'">
         <div class="withdraw-popup-warn">
           <span>需先</span>
@@ -79,20 +79,20 @@
           <span>,已关联的小程序可被使用在自定义菜单、模板消息和附近的小程序等场景中</span>
         </div>
         <el-form-item label="标题" prop="_title" :rules="[{ required: true, message: '标题必须填写' }]" label-width="120px">
-          <el-input style="width:300px;" type="textarea" autosize :disabled="props.primary?.look"
-            v-model="formCallbackinsert._title" auto-complete="off" placeholder="请输入标题"></el-input>
+          <el-input style="width:300px;" type="textarea" autosize v-model="formCallbackinsert._title" auto-complete="off"
+            placeholder="请输入标题"></el-input>
         </el-form-item>
         <el-form-item label="链接" prop="_url" :rules="[{ required: true, message: '链接必须填写' }]" label-width="120px">
-          <el-input style="width:300px;" :disabled="props.primary?.look" v-model="formCallbackinsert._url"
-            auto-complete="off" placeholder="请输入链接"></el-input>
+          <el-input style="width:350px;" v-model="formCallbackinsert._url" auto-complete="off"
+            placeholder="请输入链接"></el-input>
           <el-button type="primary" v-if="!props.primary?.look" link :icon="Plus" @click="linkVisible = true"
             class="mr-6">插入链接</el-button>
         </el-form-item>
       </div>
       <div v-else>
         <el-form-item label="内容" prop="_title" :rules="[{ required: true, message: '内容必须填写' }]" label-width="120px">
-          <el-input style="width:300px;" :disabled="props.primary?.look" type="textarea" autosize
-            v-model="formCallbackinsert._title" auto-complete="off" placeholder="请输入内容"></el-input>
+          <el-input style="width:300px;" type="textarea" autosize v-model="formCallbackinsert._title" auto-complete="off"
+            placeholder="请输入内容"></el-input>
         </el-form-item>
       </div>
       <div class="flex justify-end" v-if="!props.primary?.look">

+ 13 - 0
src/views/officialAccount/newsService/form/testSend.vue

@@ -1,6 +1,19 @@
 <template>
   <el-form :model="formCallback" label-width="120px" ref="form" v-loading="loading" class="pr-4">
     <el-form-item label="测试ID" prop="openid" :rules="[{ required: true, message: '测试ID必须填写' }]">
+      <template #label>
+        <div class="flex items-center">
+          <el-tooltip placement="top">
+            <template #content>
+              <span>测试ID即测试公众号的openid,需与测试公众号保持一致(公众号内发送pk,即可获得openid)</span> <br />
+            </template>
+            <el-icon>
+              <InfoFilled />
+            </el-icon>
+          </el-tooltip>
+          <span>测试ID</span>
+        </div>
+      </template>
       <el-input placeholder="请输入测试ID" v-model="formCallback.openid" clearable></el-input>
     </el-form-item>
     <el-form-item label="公众号" prop="gzh_id" :rules="[{ required: true, message: '公众号必须选择' }]">

+ 2 - 2
src/views/officialAccount/newsService/index.vue

@@ -23,8 +23,8 @@
             </el-select>
           </el-form-item>
           <el-form-item label="发送时间">
-            <el-date-picker unlink-panels clearable @change="sendTimeChange" format="YYYY/MM/DD hh:mm:ss"
-              value-format="YYYY-MM-DD h:m:s" v-model="query.sendTime" type="datetimerange" :shortcuts="shortcuts"
+            <el-date-picker unlink-panels clearable @change="sendTimeChange" format="YYYY/MM/DD HH:mm:ss"
+              value-format="YYYY-MM-DD H:m:s" v-model="query.sendTime" type="datetimerange" :shortcuts="shortcuts"
               range-separator="To" start-placeholder="开始时间" end-placeholder="结束时间" />
           </el-form-item>
         </template>

+ 3 - 4
src/views/officialAccount/publicCustomMenu/form/customMenu.vue

@@ -118,7 +118,7 @@
                       <el-form-item label="网页链接">
                         <el-input style="width:300px;"
                           v-model="menus.buttons[menus.curActiveIndex].sub_button[menus.curSubActiveIndex].url"
-                          auto-complete="off" placeholder="请输入公众号文章链接"></el-input>
+                          auto-complete="off" placeholder="请输入网页链接"></el-input>
                       </el-form-item>
                     </div>
                     <div
@@ -164,7 +164,7 @@
                       <div v-if="menus?.buttons[menus?.curActiveIndex]?.type == 'view'">
                         <el-form-item label="网页链接">
                           <el-input style="width:300px;" v-model="menus.buttons[menus.curActiveIndex].url"
-                            auto-complete="off" placeholder="请输入公众号文章链接"></el-input>
+                            auto-complete="off" placeholder="请输入网页链接"></el-input>
                         </el-form-item>
                       </div>
                       <div v-if="menus?.buttons[menus?.curActiveIndex]?.type == 'click'">
@@ -250,7 +250,6 @@ const cancel = () => {
   emit('close')
 }
 const submitFormChange = () => {
-  console.log(menus.value, 'menusmenus', validation(menus.value.buttons));
   if (!formCallback.value?.title) return ElMessage.error('模板名称不能为空')
   if (!validation(menus.value.buttons)) return
   let params = {
@@ -262,7 +261,7 @@ const submitFormChange = () => {
       return rest;
     })
   }
-  if (props.primary.id) {
+  if (props.primary?.id) {
     wechatPlatformMenuEdit(props.primary.id, params).then(res => {
       console.log(res);
       ElMessage.success(res.message)

+ 15 - 8
src/views/officialAccount/publicCustomMenu/form/validation.ts

@@ -2,28 +2,35 @@ export const validation = (buttons: Array<object>) => {
   try {
     buttons.forEach(button => {
       if (button.sub_button.length <= 0 && !button.name) {
-        throw new Error('菜单名称不能为空');
+        throw new Error(`(${button.name}) 菜单名称不能为空`);
       }
-      if (button.sub_button.length <= 0 && !button.url) {
-        throw new Error('链接不能为空');
+      if (
+        ['view', 'miniprogram'].includes(button.type) &&
+        button.sub_button.length <= 0 &&
+        !button.url
+      ) {
+        throw new Error(`(${button.name}) 链接不能为空`);
       }
       if (
         button.sub_button.length <= 0 &&
         button.type == 'click' &&
         !button.content
       ) {
-        throw new Error('文本内容不能为空');
+        throw new Error(`${button.name} 文本内容不能为空`);
       }
       if (button.sub_button && button.sub_button.length > 0) {
         button.sub_button.forEach(subButton => {
           if (!subButton.name) {
-            throw new Error('子菜单名称不能为空');
+            throw new Error(`子菜单 (${subButton.name}) 菜单名称不能为空`);
           }
-          if (!subButton.url) {
-            throw new Error('子菜单链接不能为空');
+          if (
+            ['view', 'miniprogram'].includes(subButton.type) &&
+            !subButton.url
+          ) {
+            throw new Error(`子菜单 (${subButton.name}) 链接不能为空`);
           }
           if (subButton.type == 'click' && !subButton.content) {
-            throw new Error('子菜单文本内容不能为空');
+            throw new Error(`子菜单 (${subButton.name}) 文本内容不能为空`);
           }
         });
       }