Explorar o código

增加小程序管理接口

tongshangming %!s(int64=3) %!d(string=hai) anos
pai
achega
1ec679ee67

+ 0 - 1
package.json

@@ -19,7 +19,6 @@
     "element-plus": "^2.2.21",
     "nprogress": "^0.2.0",
     "pinia": "^2.0.23",
-    "qs": "^6.11.0",
     "vue": "^3.2.45",
     "vue-router": "^4.1.6"
   },

+ 7 - 11
pnpm-lock.yaml

@@ -24,7 +24,6 @@ specifiers:
   nprogress: ^0.2.0
   pinia: ^2.0.23
   prettier: ^2.7.1
-  qs: ^6.11.0
   sass: ^1.56.1
   typescript: ~4.7.4
   unocss: ^0.46.5
@@ -48,7 +47,6 @@ dependencies:
   element-plus: registry.npmmirror.com/element-plus/2.2.21_vue@3.2.45
   nprogress: registry.npmmirror.com/nprogress/0.2.0
   pinia: registry.npmmirror.com/pinia/2.0.23_e7lp6ggkpgyi5vqd44m2kxvk6i
-  qs: registry.npmmirror.com/qs/6.11.0
   vue: registry.npmmirror.com/vue/3.2.45
   vue-router: registry.npmmirror.com/vue-router/4.1.6_vue@3.2.45
 
@@ -2046,6 +2044,7 @@ packages:
     dependencies:
       function-bind: registry.npmmirror.com/function-bind/1.1.1
       get-intrinsic: registry.npmmirror.com/get-intrinsic/1.1.3
+    dev: true
 
   registry.npmmirror.com/callsites/3.1.0:
     resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz}
@@ -3433,6 +3432,7 @@ packages:
     resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz}
     name: function-bind
     version: 1.1.1
+    dev: true
 
   registry.npmmirror.com/function.prototype.name/1.1.5:
     resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz}
@@ -3467,6 +3467,7 @@ packages:
       function-bind: registry.npmmirror.com/function-bind/1.1.1
       has: registry.npmmirror.com/has/1.0.3
       has-symbols: registry.npmmirror.com/has-symbols/1.0.3
+    dev: true
 
   registry.npmmirror.com/get-stream/6.0.1:
     resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz}
@@ -3623,6 +3624,7 @@ packages:
     name: has-symbols
     version: 1.0.3
     engines: {node: '>= 0.4'}
+    dev: true
 
   registry.npmmirror.com/has-tostringtag/1.0.0:
     resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz}
@@ -3679,6 +3681,7 @@ packages:
     engines: {node: '>= 0.4.0'}
     dependencies:
       function-bind: registry.npmmirror.com/function-bind/1.1.1
+    dev: true
 
   registry.npmmirror.com/he/1.2.0:
     resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/he/-/he-1.2.0.tgz}
@@ -4743,6 +4746,7 @@ packages:
     resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.2.tgz}
     name: object-inspect
     version: 1.12.2
+    dev: true
 
   registry.npmmirror.com/object-keys/1.1.1:
     resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz}
@@ -5144,15 +5148,6 @@ packages:
     engines: {node: '>=6'}
     dev: true
 
-  registry.npmmirror.com/qs/6.11.0:
-    resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz}
-    name: qs
-    version: 6.11.0
-    engines: {node: '>=0.6'}
-    dependencies:
-      side-channel: registry.npmmirror.com/side-channel/1.0.4
-    dev: false
-
   registry.npmmirror.com/query-string/4.3.4:
     resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/query-string/-/query-string-4.3.4.tgz}
     name: query-string
@@ -5446,6 +5441,7 @@ packages:
       call-bind: registry.npmmirror.com/call-bind/1.0.2
       get-intrinsic: registry.npmmirror.com/get-intrinsic/1.1.3
       object-inspect: registry.npmmirror.com/object-inspect/1.12.2
+    dev: true
 
   registry.npmmirror.com/signal-exit/3.0.7:
     resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz}

+ 78 - 0
src/api/miniprogram.ts

@@ -0,0 +1,78 @@
+import request from '@/utils/request'
+
+// 轮播图
+export function getBannerList(data: any) {
+  return request.post('/sys/banner/data', data)
+}
+export function saveBanner(data: any) {
+  return request.post('/sys/banner/save', data, {
+    headers: { 'content-type': 'application/x-www-form-urlencoded' }
+  })
+}
+export function deleteBanner(data: any) {
+  return request.get('/sys/banner/delete', {
+    params: data
+  })
+}
+
+// 常见问题
+export function getQuestionList(data: any) {
+  return request.post('/sys/questionIntro/data', data)
+}
+export function saveQuestion(data: any) {
+  return request.post('/sys/questionIntro/save', data, {
+    headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
+  })
+}
+export function deleteQuestion(data: any) {
+  return request.get('/sys/questionIntro/delete', {
+    params: data
+  })
+}
+
+// 意见反馈
+export function getAdviceList(data: any) {
+  return request.get('/setting/advice/list', {
+    params: data
+  })
+}
+export function saveAdvice(data: any) {
+  return request.get('/setting/advice/updateRegContent', {
+    params: data
+  })
+}
+export function deleteAdvice(data: any) {
+  return request.get('/setting/advice/delete', {
+    params: data
+  })
+}
+
+// 关于我们
+export function getAboutUs() {
+  return request.get('/setting/about/info')
+}
+export function saveAboutUs(data: any) {
+  return request.post('/setting/about/save', data, {
+    headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
+  })
+}
+
+// 版本信息
+// 列表
+export function getVersionList(data: any) {
+  return request.get('/setting/version/list', {
+    params: data
+  })
+}
+// 保存
+export function saveVersion(data: any) {
+  return request.post('/setting/version/save', data, {
+    headers: { 'content-type': 'application/x-www-form-urlencoded' }
+  })
+}
+// 删除
+export function deleteVersion(data: any) {
+  return request.post('/setting/version/delete', data, {
+    headers: { 'content-type': 'application/x-www-form-urlencoded' }
+  })
+}

+ 4 - 6
src/components/ElEditor.vue

@@ -34,15 +34,13 @@ const editorConfig = {
   placeholder: '请输入内容...',
   MENU_CONF: {
     uploadImage: {
-      server: `/fileUploadAndDownload/upload`,
+      server: `${import.meta.env.VITE_BASE_API}/file/upload`,
       headers: { 'x-token': userStore.token },
       fieldName: 'file',
       // 自定义插入图片
       customInsert(res: any, insertFn: Function) {
-        // res 即服务端的返回结果
-        const file = res?.data?.file
-        // 从 res 中找到 url alt href ,然后插图图片
-        insertFn(file.url)
+        const file = res?.data
+        insertFn(import.meta.env.VITE_BASE_PATH + file)
       }
     }
   }
@@ -60,7 +58,7 @@ const handleCreated = (editor: any) => {
 }
 
 const handleChange = (editor: any) => {
-  emits('change', editor.getText())
+  emits('change', editor.getHtml())
 }
 </script>
 

+ 22 - 9
src/components/ProTable.vue

@@ -11,6 +11,8 @@ import type { AdvancedForm, BasicForm, ICRUD } from '@/types/form'
 
 interface CustomTable {
   showOperate?: boolean
+  showEdit?: boolean
+  showDelete?: boolean
   operateWidth?: number
 }
 
@@ -66,6 +68,8 @@ const curPage = ref(1)
 const loading = ref(false)
 const tableConfig = ref<CustomTable>({
   showOperate: true,
+  showEdit: true,
+  showDelete: true,
   operateWidth: 140,
   ...props.tableConfig
 })
@@ -79,19 +83,24 @@ const getTableData = () => {
       pageNo: curPage.value
     })
     .then((res: any) => {
-      tableData.value = res.data
+      tableData.value = res.list || res.rows
       total.value = res.total
     })
     .finally(() => {
       loading.value = false
     })
 }
-getTableData()
 
-const pageChange = (val: number) => {
-  curPage.value = val
-  getTableData()
-}
+watch(
+  curPage,
+  () => {
+    getTableData()
+  },
+  {
+    immediate: true
+  }
+)
+
 const refresh = () => {
   curPage.value = 1
   getTableData()
@@ -224,8 +233,12 @@ defineExpose({
           <el-table-column fixed="right" label="操作" :width="tableConfig.operateWidth" v-if="tableConfig.showOperate">
             <template #default="{ row }">
               <slot name="operateBefore" :row="row"></slot>
-              <el-button type="primary" size="small" @click="handleUpdate(row)">编辑</el-button>
-              <el-button type="danger" size="small" @click="handleDelete(row.id)">删除</el-button>
+              <el-button type="primary" size="small" @click="handleUpdate(row)" v-if="tableConfig.showEdit">
+                编辑
+              </el-button>
+              <el-button type="danger" size="small" @click="handleDelete(row.id)" v-if="tableConfig.showDelete">
+                删除
+              </el-button>
               <slot name="operateAfter" :row="row"></slot>
             </template>
           </el-table-column>
@@ -234,9 +247,9 @@ defineExpose({
           <el-pagination
             background
             layout="prev, pager, next, jumper, total"
+            v-model:current-page="curPage"
             :page-size="pageSize"
             :total="total"
-            @current-change="pageChange"
             class="mt-16px"
           />
         </div>

+ 6 - 8
src/utils/request.ts

@@ -1,8 +1,6 @@
 import axios from 'axios'
 import { useUserStore } from '@/stores/user'
-import router from '@/router'
 import { ElMessage, ElMessageBox } from 'element-plus'
-import qs from 'qs'
 
 const request = axios.create({
   baseURL: '/apiSys'
@@ -23,7 +21,6 @@ const errorHandler = (error: any) => {
       center: true,
       confirmButtonText: '重新登录'
     }).then(() => {
-      console.log(router.currentRoute)
       userStore.logout()
     })
   } else if (status === 403) {
@@ -46,10 +43,6 @@ request.interceptors.request.use(config => {
     config.headers.access_token = token
   }
 
-  if (config.headers['content-type'] === 'application/x-www-form-urlencoded') {
-    config.data = qs.stringify(config.data)
-  }
-
   return config
 })
 
@@ -58,7 +51,12 @@ request.interceptors.response.use(res => {
   if (data.success || data.code === 200) {
     return data.data
   } else {
-    ElMessage.error(data.msg)
+    if (data.code === 201 && data.msg === '登录超时,请登录') {
+      const userStore = useUserStore()
+      userStore.logout()
+    } else {
+      ElMessage.error(data.msg)
+    }
     return Promise.reject(data)
   }
 }, errorHandler)

+ 17 - 3
src/views/miniprogram/About.vue

@@ -1,16 +1,30 @@
 <script setup lang="ts">
-const formData = ref<any>({})
+import { getAboutUs, saveAboutUs } from '@/api/miniprogram'
+import { ElMessage } from 'element-plus'
+
+const formData = ref<any>({
+  content: ''
+})
 const formRef = ref(null)
 
+getAboutUs().then((res: any) => {
+  formData.value.content = res
+})
+
 const handleSave = () => {
-  // 保存接口
+  saveAboutUs(formData.value).then(() => {
+    ElMessage({
+      type: 'success',
+      message: '保存成功'
+    })
+  })
 }
 </script>
 
 <template>
   <el-form :model="formData" ref="formRef">
     <el-form-item>
-      <el-editor></el-editor>
+      <el-editor v-model="formData.content"></el-editor>
     </el-form-item>
     <el-form-item>
       <div class="text-center w-full"><el-button type="primary" @click="handleSave">保存</el-button></div>

+ 15 - 14
src/views/miniprogram/Banner.vue

@@ -1,18 +1,19 @@
 <script setup lang="ts">
 import type { BasicForm, ICRUD } from '@/types/form'
+import { getBannerList, saveBanner, deleteBanner } from '@/api/miniprogram'
 
 const CRUD: ICRUD = {
   create(data: any) {
-    return Promise.resolve(data)
+    return saveBanner(data)
   },
   update(data: any) {
-    return Promise.resolve(data)
+    return saveBanner(data)
   },
-  getList() {
-    return Promise.resolve()
+  getList(data: any) {
+    return getBannerList(data)
   },
   delete(data: any) {
-    return Promise.resolve(data)
+    return deleteBanner(data)
   }
 }
 
@@ -35,26 +36,26 @@ const formConfig = reactive<BasicForm>({
       value: '',
       name: 'name',
       type: 'input'
-    },
-    {
-      label: '跳转地址',
-      value: 'src',
-      name: 'phone',
-      type: 'input'
     }
+    // {
+    //   label: '跳转地址',
+    //   value: '',
+    //   name: 'src',
+    //   type: 'input'
+    // }
   ]
 })
 </script>
 
 <template>
   <pro-table :crud="CRUD" :formConfig="formConfig">
-    <el-table-column prop="name" label="标题"></el-table-column>
+    <el-table-column prop="name" label="标题" show-overflow-tooltip></el-table-column>
     <el-table-column prop="image" label="图片">
       <template #default="{ row }">
-        <el-image :src="row.src" style="width: 100px"></el-image>
+        <el-image :src="row.image" style="width: 100px"></el-image>
       </template>
     </el-table-column>
-    <el-table-column prop="src" label="跳转地址"></el-table-column>
+    <!-- <el-table-column prop="src" label="跳转地址"></el-table-column> -->
   </pro-table>
 </template>
 

+ 11 - 11
src/views/miniprogram/Feedback.vue

@@ -1,18 +1,20 @@
 <script setup lang="ts">
 import type { BasicForm, ICRUD } from '@/types/form'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import { getAdviceList, saveAdvice, deleteAdvice } from '@/api/miniprogram'
 
 const CRUD: ICRUD = {
   create(data: any) {
-    return Promise.resolve(data)
+    return saveAdvice(data)
   },
   update(data: any) {
     return Promise.resolve(data)
   },
-  getList() {
-    return Promise.resolve()
+  getList(data: any) {
+    return getAdviceList(data)
   },
   delete(data: any) {
-    return Promise.resolve(data)
+    return deleteAdvice(data)
   }
 }
 
@@ -55,15 +57,13 @@ const handleReply = () => {
     :crud="CRUD"
     :selection="false"
     :showToolbar="false"
-    :tableConfig="{ showOperate: false }"
+    :tableConfig="{ showEdit: false }"
   >
     <el-table-column prop="content" label="反馈内容"></el-table-column>
-    <el-table-column prop="publishDate" label="反馈时间"></el-table-column>
-    <el-table-column fixed="right" label="操作" width="100">
-      <template #default="{ row }">
-        <el-button link type="primary" size="small" @click="openDiolog(row)">回复</el-button>
-      </template>
-    </el-table-column>
+    <el-table-column prop="createDate" label="反馈时间"></el-table-column>
+    <template #operateBefore="{ row }">
+      <el-button type="primary" size="small" @click="openDiolog(row)">回复</el-button>
+    </template>
   </pro-table>
 
   <dialog-form

+ 9 - 5
src/views/miniprogram/Question.vue

@@ -1,18 +1,22 @@
 <script setup lang="ts">
 import type { BasicForm, ICRUD } from '@/types/form'
+import { getQuestionList, saveQuestion, deleteQuestion } from '@/api/miniprogram'
 
 const CRUD: ICRUD = {
   create(data: any) {
-    return Promise.resolve(data)
+    return saveQuestion(data)
   },
   update(data: any) {
-    return Promise.resolve(data)
+    return saveQuestion(data)
   },
-  getList() {
-    return Promise.resolve()
+  getList(data: any) {
+    return getQuestionList(data)
   },
   delete(data: any) {
-    return Promise.resolve(data)
+    return deleteQuestion({ ids: data.id })
+  },
+  deleteBatch(data: any) {
+    return deleteQuestion({ ids: data.id })
   }
 }
 

+ 12 - 5
src/views/miniprogram/Version.vue

@@ -1,18 +1,25 @@
 <script setup lang="ts">
 import type { BasicForm, ICRUD } from '@/types/form'
+import { getVersionList, saveVersion, deleteVersion } from '@/api/miniprogram'
 
 const CRUD: ICRUD = {
   create(data: any) {
-    return Promise.resolve(data)
+    return saveVersion(data)
   },
   update(data: any) {
-    return Promise.resolve(data)
+    return saveVersion(data)
   },
-  getList() {
-    return Promise.resolve()
+  getList(data: any) {
+    return getVersionList(data).then((res: any) => {
+      return {
+        list: res
+      }
+    })
   },
   delete(data: any) {
-    return Promise.resolve(data)
+    return deleteVersion({
+      ids: data.id
+    })
   }
 }