x1ongzhu пре 1 година
родитељ
комит
57dd2817bd
7 измењених фајлова са 64 додато и 44 уклоњено
  1. 1 0
      .env.development
  2. 1 0
      .env.production
  3. 4 0
      .env.production.user
  4. 12 2
      src/main.js
  5. 1 1
      src/views/LoginView.vue
  6. 6 8
      src/views/MainView.vue
  7. 39 33
      src/views/TaskView.vue

+ 1 - 0
.env.development

@@ -1,3 +1,4 @@
 VITE_BASE_URL=/
+VITE_LOGIN_URL=/auth/login
 VITE_API_BASE_URL=http://localhost:3000/api
 VITE_WS_URL=ws://localhost:3000

+ 1 - 0
.env.production

@@ -1,3 +1,4 @@
 VITE_BASE_URL=/admin/
+VITE_LOGIN_URL=/auth/admin/login
 VITE_API_BASE_URL=/api
 VITE_WS_URL=/

+ 4 - 0
.env.production.user

@@ -0,0 +1,4 @@
+VITE_BASE_URL=/admin/
+VITE_LOGIN_URL=/auth/admin/login
+VITE_API_BASE_URL=/api
+VITE_WS_URL=/

+ 12 - 2
src/main.js

@@ -1,5 +1,5 @@
-import { createApp } from 'vue'
-import { createPinia } from 'pinia'
+import { computed, createApp } from 'vue'
+import { createPinia, storeToRefs } from 'pinia'
 
 import App from './App.vue'
 import router from './router'
@@ -8,6 +8,7 @@ import ElementPlus from 'element-plus'
 import './styles/main.less'
 import 'element-plus/dist/index.css'
 import 'element-plus/theme-chalk/dark/css-vars.css'
+import { useUserStore } from './stores/user'
 
 const app = createApp(App)
 
@@ -15,4 +16,13 @@ app.use(createPinia())
 app.use(router)
 app.use(ElementPlus)
 
+const { user } = storeToRefs(useUserStore())
+app.provide(
+    'isAdmin',
+    computed(() => {
+        if (!(user.value && user.value.roles)) return false
+        return user.value.roles.includes('admin')
+    })
+)
+
 app.mount('#app')

+ 1 - 1
src/views/LoginView.vue

@@ -45,7 +45,7 @@ function login() {
     form.value.validate().then(async () => {
         loading.value = true
         try {
-            const res = await http.post('/auth/admin/login', model.value)
+            const res = await http.post(process.env.VITE_LOGIN_URL, model.value)
             http.setToken(res.access_token)
             router.replace({ name: 'home' })
             loading.value = false

+ 6 - 8
src/views/MainView.vue

@@ -14,14 +14,12 @@
 
                 <el-breadcrumb separator="/">
                     <el-breadcrumb-item :to="{ path: '/' }">主页</el-breadcrumb-item>
-                    <el-breadcrumb-item v-if="route.name !== 'home'">{{
-                            route.meta?.title || route.path
-                        }}
+                    <el-breadcrumb-item v-if="route.name !== 'home'"
+                        >{{ route.meta?.title || route.path }}
                     </el-breadcrumb-item>
                 </el-breadcrumb>
                 <div class="grow"></div>
-                <div class="balance-display" v-if="user.roles.includes('user')"
-                     style="display: inline-block; width: 15%; text-align: center;">
+                <div class="mr-8 text-sm text-neutral-600 dark:text-neutral-400 invisible md:visible" v-if="user.roles.includes('user')">
                     已发送: {{ user.send }}, 余额: {{ user.balance }}
                 </div>
                 <DarkSwitch class="mr-4" />
@@ -95,7 +93,8 @@ if (roles.includes('admin')) {
                 {
                     name: '/device',
                     title: '设备列表'
-                }, {
+                },
+                {
                     name: '/channel',
                     title: '渠道列表'
                 },
@@ -170,13 +169,12 @@ if (roles.includes('admin')) {
                 {
                     name: '/task',
                     title: '任务列表'
-                },
+                }
             ]
         }
     ]
 }
 
-
 function toggleMenu() {
     showDrawer.value = !showDrawer.value
 }

+ 39 - 33
src/views/TaskView.vue

@@ -2,7 +2,7 @@
     <PagingTable url="/task" :where="where" ref="table">
         <template #filter>
             <ElButton :icon="Refresh" @click="table.refresh()"></ElButton>
-            <ElButton :icon="Plus" @click="onEdit(), getPhoneList()"> 添加</ElButton>
+            <ElButton :icon="Plus" @click="onEdit({ checkConnection: true }), getPhoneList()"> 添加</ElButton>
         </template>
         <ElTableColumn prop="id" label="#" width="80" />
         <ElTableColumn prop="name" label="名称" min-width="120" />
@@ -10,10 +10,11 @@
         <ElTableColumn prop="message" label="内容" show-overflow-tooltip />
         <ElTableColumn prop="dynamicMessage" label="动态内容" show-overflow-tooltip />
         <ElTableColumn prop="listId" label="发送列表" :formatter="phoneListFormatter" />
-        <ElTableColumn v-if="shouldShow" prop="rcsWait" label="RCS等待时间" />
-        <ElTableColumn v-if="shouldShow" prop="rcsInterval" label="RCS发送间隔" />
-        <ElTableColumn v-if="shouldShow" prop="cleanCount" label="清理数量" />
-        <ElTableColumn v-if="shouldShow" prop="requestNumberInterval" label="请求号码间隔" />
+        <ElTableColumn v-if="isAdmin" prop="rcsWait" label="RCS等待时间" />
+        <ElTableColumn v-if="isAdmin" prop="rcsInterval" label="RCS发送间隔" />
+        <ElTableColumn v-if="isAdmin" prop="cleanCount" label="清理数量" />
+        <ElTableColumn v-if="isAdmin" prop="requestNumberInterval" label="请求号码间隔" />
+        <ElTableColumn v-if="isAdmin" prop="checkConnection" label="检查连接" />
         <ElTableColumn prop="status" label="状态" align="center">
             <template #default="{ row }">
                 <ElTag v-if="row.status === 'idle'" type="info">未发送</ElTag>
@@ -76,10 +77,14 @@
                 <ElOption v-for="item in phoneList" :key="item.id" :label="item.name" :value="item.id" />
             </ElSelect>
         </ElFormItem>
-        <ElFormItem v-if="shouldShow" prop="channelId" label="渠道列表">
+        <ElFormItem v-if="isAdmin" prop="channelId" label="渠道列表">
             <ElSelect v-model="model.channelId" multiple placeholder="请选择渠道列表">
-                <ElOption v-for="item in operatorList" :key="item.id"
-                          :label="item.mcc+'-'+item.mnc+'-'+item.country+'-'+item.operator" :value="item.id" />
+                <ElOption
+                    v-for="item in operatorList"
+                    :key="item.id"
+                    :label="item.mcc + '-' + item.mnc + '-' + item.country + '-' + item.operator"
+                    :value="item.id"
+                />
             </ElSelect>
         </ElFormItem>
         <ElFormItem prop="message" label="内容">
@@ -88,22 +93,25 @@
         <ElFormItem prop="dynamicMessage" label="动态内容">
             <ElInput v-model="model.dynamicMessage" placeholder="请输入动态内容" type="textarea" />
         </ElFormItem>
-        <ElFormItem v-if="shouldShow" prop="rcsWait" label="RCS等待时间">
+        <ElFormItem v-if="isAdmin" prop="rcsWait" label="RCS等待时间">
             <ElInputNumber :controls="false" v-model="model.rcsWait" placeholder="请输入RCS等待时间" />
             <div class="tip">(0表示使用系统默认值)</div>
         </ElFormItem>
-        <ElFormItem v-if="shouldShow" prop="rcsInterval" label="RCS发送间隔">
+        <ElFormItem v-if="isAdmin" prop="rcsInterval" label="RCS发送间隔">
             <ElInputNumber :controls="false" v-model="model.rcsInterval" placeholder="请输入RCS发送间隔" />
             <div class="tip">(0表示使用系统默认值)</div>
         </ElFormItem>
-        <ElFormItem v-if="shouldShow" prop="cleanCount" label="清理数量">
+        <ElFormItem v-if="isAdmin" prop="cleanCount" label="清理数量">
             <ElInputNumber :controls="false" v-model="model.cleanCount" placeholder="请输入清理数量" />
             <div class="tip">(0表示使用系统默认值)</div>
         </ElFormItem>
-        <ElFormItem v-if="shouldShow" prop="requestNumberInterval" label="请求号码间隔">
+        <ElFormItem v-if="isAdmin" prop="requestNumberInterval" label="请求号码间隔">
             <ElInputNumber :controls="false" v-model="model.requestNumberInterval" placeholder="请输入请求号码间隔" />
             <div class="tip">(0表示使用系统默认值)</div>
         </ElFormItem>
+        <ElFormItem v-if="isAdmin" prop="checkConnection" label="检查连接">
+            <ElSwitch v-model="model.checkConnection" />
+        </ElFormItem>
     </EditDialog>
 
     <ElDialog v-model="showDetailDialog" title="详情" width="800px">
@@ -113,12 +121,7 @@
             <ElTableColumn prop="sendAt" label="发送时间" :formatter="timeFormatter" align="center" />
             <ElTableColumn prop="status" label="状态" align="center">
                 <template #default="{ row }">
-                    <el-tooltip
-                        class="box-item"
-                        effect="dark"
-                        content="Top Left prompts info"
-                        placement="top-start"
-                    >
+                    <el-tooltip class="box-item" effect="dark" content="Top Left prompts info" placement="top-start">
                         <ElTag v-if="row.status === 'success'" type="success">成功</ElTag>
                         <ElTag v-else-if="row.status === 'fail'" type="danger">失败</ElTag>
                         <ElTag v-else-if="row.status === 'pending'" type="warning">发送中</ElTag>
@@ -142,7 +145,7 @@
     </EditDialog>
 </template>
 <script setup>
-import { ref } from 'vue'
+import { computed, inject, ref } from 'vue'
 import PagingTable from '@/components/PagingTable.vue'
 import { useTimeFormatter } from '@/utils/formatter'
 import { Plus, Refresh } from '@vicons/tabler'
@@ -150,19 +153,17 @@ import EditDialog from '@/components/EditDialog.vue'
 import { setupEditDialog } from '@/utils/editDialog'
 import { http } from '@/plugins/http'
 import { ElMessage, ElMessageBox } from 'element-plus'
+import { storeToRefs } from 'pinia'
 import { useUserStore } from '@/stores/user'
 
-const { user } = useUserStore()
+const { user } = storeToRefs(useUserStore())
 const where = ref({})
-const roles = user.roles
-const shouldShow = ref(true)
-if (roles.includes('user')) {
-    where.value.userId = user.id
-    shouldShow.value = false
-}
+const isAdmin = inject('isAdmin')
 const timeFormatter = useTimeFormatter()
 const table = ref(null)
-const model = ref({})
+const model = ref({
+    checkConnection: true
+})
 const rules = {
     name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
     listId: [{ required: true, message: '请选择发送列表', trigger: 'blur' }],
@@ -171,25 +172,30 @@ const rules = {
     rcsWait: [{ required: false, message: '请输入RCS等待时间', trigger: 'blur' }],
     rcsInterval: [{ required: false, message: '请输入RCS发送间隔', trigger: 'blur' }],
     cleanCount: [{ required: false, message: '请输入清理数量', trigger: 'blur' }],
-    requestNumberInterval: [{ required: false, message: '请输入请求号码间隔', trigger: 'blur' }]
+    requestNumberInterval: [{ required: false, message: '请输入请求号码间隔', trigger: 'blur' }],
+    checkConnection: [{ required: false, message: '请选择是否检查连接', trigger: 'blur' }]
 }
 const { showEditDialog, onEdit } = setupEditDialog(model)
 
 async function submit() {
-    model.value.userId = user.id
     if (model.value.channelId) {
         model.value.channelId = model.value.channelId.join(',')
     }
-    await http.put('/task', model.value)
+    await http.put('/task', {
+        ...model.value,
+        userId: user.value.id
+    })
     ElMessage.success('保存成功')
 }
 
 const phoneList = ref([])
 
 async function getPhoneList() {
-    phoneList.value = (await http.post('/phone-list', {
-        search: { page: { page: 1, limit: 100 }, order: { createdAt: 'DESC' }, where: where.value }
-    })).items
+    phoneList.value = (
+        await http.post('/phone-list', {
+            search: { page: { page: 1, limit: 100 }, order: { createdAt: 'DESC' }, where: where.value }
+        })
+    ).items
 }
 
 getPhoneList()