wenhongquan 6 месяцев назад
Родитель
Сommit
d44c4322b1
7 измененных файлов с 443 добавлено и 3 удалено
  1. 1 0
      auto-imports.d.ts
  2. 1 1
      public/js/global.js
  3. 67 0
      src/request/api.js
  4. 5 0
      src/router/index.ts
  5. 10 1
      src/views/HomeView.vue
  6. 358 0
      src/views/miniprogramman/index.vue
  7. 1 1
      vite.config.ts

+ 1 - 0
auto-imports.d.ts

@@ -6,4 +6,5 @@
 export {}
 declare global {
   const ElMessage: typeof import('element-plus/es')['ElMessage']
+  const ElMessageBox: typeof import('element-plus/es')['ElMessageBox']
 }

+ 1 - 1
public/js/global.js

@@ -4,7 +4,7 @@ var systemType = '线上环境'
 
 switch(systemType){
     case '测试环境':
-        baseUrl='http://127.0.0.1:8080'
+        baseUrl='http://127.0.0.1:8081'
         loginPageUrl='/login'
         break;
     case '线上环境':

+ 67 - 0
src/request/api.js

@@ -950,3 +950,70 @@ export const apisystemdzbcCozeChatStream = (query, onDownloadProgress) => {
         onDownloadProgress: onDownloadProgress
     });
 };
+
+
+// ================== 小程序管理 ==================
+
+// 查询小程序信息列表
+// @ts-ignore
+export const apisystemminiprogramlist = query => {
+    query["params['type']"] = "2"
+    return service({
+        url: '/api/system/miniprogram/list',
+        method: 'GET',
+        params: query
+    });
+};
+
+// 查询小程序信息详细
+// @ts-ignore
+export const apisystemminiprogramget = query => {
+    return service({
+        url: `/api/system/miniprogram/${query.id}`,
+        method: 'GET'
+    });
+};
+
+// 新增小程序信息
+// @ts-ignore
+export const apisystemminiprogramadd = query => {
+    query['ext1'] = query.ext1 || '{"type":"2"}'
+    query.ext1 = JSON.parse(query.ext1 == '' ? '{"type":"2"}' : query.ext1)
+    query.ext1.type = "2"
+    query.ext1 = JSON.stringify(query.ext1);
+    if(query.ext2 == ''){
+        delete query.ext2
+    }
+    debugger
+    return service({
+        url: '/api/system/miniprogram',
+        method: 'POST',
+        data: query
+    });
+};
+
+// 修改小程序信息
+// @ts-ignore
+export const apisystemminiprogramupdate = query => {
+    query['ext1'] = query.ext1 || '{"type":"2"}'
+    query.ext1 = JSON.parse(query.ext1 == '' ? '{"type":"2"}' : query.ext1)
+    query.ext1.type = '2'
+    query.ext1 = JSON.stringify(query.ext1)
+    if (query.ext2 == '') {
+        delete query.ext2
+    }
+    return service({
+        url: '/api/system/miniprogram',
+        method: 'PUT',
+        data: query
+    });
+};
+
+// 删除小程序信息
+// @ts-ignore
+export const apisystemminiprogramdel = query => {
+    return service({
+        url: `/api/system/miniprogram/${query.id}`,
+        method: 'DELETE'
+    });
+};

+ 5 - 0
src/router/index.ts

@@ -99,6 +99,11 @@ const router = createRouter({
           component: () => import("../views/cozechat/index.vue"),
           meta: { title: "智能客服", parent: 'wdxx' },
         },
+        {
+          path: "/miniprogramman",
+          component: () => import("../views/miniprogramman/index.vue"),
+          meta: { title: "小程序管理", parent: 'wdxx' },
+        },
       ]
     },
     {

+ 10 - 1
src/views/HomeView.vue

@@ -282,6 +282,15 @@ watch(() => route, (newRoute, oldRoute) => {
             <el-icon><ArrowRightBold /></el-icon>
           </div>
         </el-menu-item>
+        <el-menu-item index="miniprogramman">
+          <div class="ima-icon">
+            <img style="width:16px;height:auto" src="../../public/imgs/userman.png" alt="">
+          </div>
+          <span style="flex:1">小程序管理</span>
+          <div class="next-img">
+            <el-icon><ArrowRightBold /></el-icon>
+          </div>
+        </el-menu-item>
       </el-menu>
       </el-aside>
       <el-container>
@@ -342,7 +351,7 @@ watch(() => route, (newRoute, oldRoute) => {
 <style lang="scss"  scoped>
   
   .el-menu{
-    height:calc(100% - 56px);
+    min-height:calc(100% - 56px);
   }
   .common-layout{
     height:100%;

+ 358 - 0
src/views/miniprogramman/index.vue

@@ -0,0 +1,358 @@
+<template>
+  <div class="app-container">
+    <!-- 搜索表单 -->
+    <el-form :inline="true" class="search-form" @keyup.enter="handleQuery">
+      <el-form-item label="小程序名称">
+        <el-input v-model="queryParams.name" placeholder="请输入小程序名称" clearable style="width: 200px" />
+      </el-form-item>
+      <el-form-item label="状态">
+        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable style="width: 120px">
+          <el-option label="启用" value="1" />
+          <el-option label="禁用" value="0" />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" :icon="Search" @click="handleQuery">搜索</el-button>
+        <el-button :icon="RefreshLeft" @click="resetQuery">重置</el-button>
+        <el-button type="success" :icon="Plus" @click="handleAdd">新增</el-button>
+      </el-form-item>
+    </el-form>
+
+    <!-- 表格 -->
+    <el-table v-loading="loading" :data="miniprogramList" style="width: 100%">
+      <el-table-column type="index" label="序号" width="80" />
+      <el-table-column prop="name" label="小程序名称" min-width="150" />
+      <el-table-column prop="logo" label="图标地址" width="100">
+      </el-table-column>
+      <el-table-column prop="url" label="链接" min-width="200" show-overflow-tooltip />
+      <el-table-column prop="status" label="状态" width="100">
+        <template #default="scope">
+          <el-tag :type="scope.row.status == '1' ? 'success' : 'danger'">
+            {{ scope.row.status == '1' ? '启用' : '禁用' }}
+          </el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column prop="desc" label="描述" min-width="150" show-overflow-tooltip />
+      <el-table-column label="操作" width="180" fixed="right">
+        <template #default="scope">
+          <el-button type="primary" size="small" :icon="Edit" @click="handleEdit(scope.row)">
+            修改
+          </el-button>
+          <el-button type="danger" size="small" :icon="Delete" @click="handleDelete(scope.row.id)">
+            删除
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 分页 -->
+    <el-pagination
+      v-model:current-page="queryParams.pageNum"
+      v-model:page-size="queryParams.pageSize"
+      :page-sizes="[10, 20, 30, 50]"
+      layout="total, sizes, prev, pager, next, jumper"
+      :total="total"
+      @size-change="handleSizeChange"
+      @current-change="handleCurrentChange"
+    />
+
+    <!-- 新增/修改对话框 -->
+    <el-dialog
+      v-model="dialogVisible"
+      :title="dialogTitle"
+      width="500px"
+      destroy-on-close
+    >
+      <el-form
+        ref="formRef"
+        :model="form"
+        :rules="rules"
+        label-width="100px"
+        style="width: 100%"
+      >
+        <el-form-item label="小程序名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入小程序名称" />
+        </el-form-item>
+        <el-form-item label="图标地址" prop="logo">
+          <el-input v-model="form.logo" placeholder="请输入图标地址" />
+        </el-form-item>
+        <el-form-item label="链接" prop="url">
+          <el-input v-model="form.url" placeholder="请输入小程序链接" />
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-select v-model="form.status" placeholder="请选择状态">
+            <el-option label="启用" :value="1" />
+            <el-option label="禁用" :value="0" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="描述" prop="desc">
+          <el-input
+            v-model="form.desc"
+            type="textarea"
+            rows="3"
+            placeholder="请输入小程序描述"
+          />
+        </el-form-item>
+        <el-form-item label="扩展1" prop="ext1">
+          <el-input v-model="form.ext1" placeholder="请输入扩展1" />
+        </el-form-item>
+        <el-form-item label="扩展2" prop="ext2">
+          <el-input v-model="form.ext2" placeholder="请输入扩展2" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <span class="dialog-footer">
+          <el-button @click="dialogVisible = false">取消</el-button>
+          <el-button type="primary" @click="handleSubmit">确定</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { apisystemminiprogramlist, apisystemminiprogramadd, apisystemminiprogramupdate, apisystemminiprogramdel, apisystemminiprogramget } from '@/request/api';
+import { ElMessage, ElMessageBox } from 'element-plus';
+import { Plus, Search, RefreshLeft, Edit, Delete } from '@element-plus/icons-vue';
+import service from '@/request/index';
+
+export default {
+  name: 'MiniprogramMan',
+  data() {
+    let Authorization = localStorage.getItem('access_token');
+    return {
+      Search,
+      RefreshLeft,
+      Plus,
+      Edit,
+      Delete,
+      loading: false,
+      miniprogramList: [],
+      total: 0,
+      dialogVisible: false,
+      dialogTitle: '',
+      form: {
+        id: '',
+        name: '',
+        logo: '',
+        url: '',
+        status: 1,
+        desc: '',
+        ext1: '',
+        ext2: ''
+      },
+      rules: {
+        name: [{ required: true, message: '请输入小程序名称', trigger: 'blur' }],
+        url: [{ required: true, message: '请输入小程序链接', trigger: 'blur' }]
+      },
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: '',
+        status: ''
+      },
+      uploading: false,
+      fileList: [],
+      upUrl: window.baseUrl + '/api/resource/oss/upload',
+      headers: {
+        Authorization: 'Bearer' + ` ${Authorization}`,
+        clientid: 'e5cd7e4891bf95d1d19206ce24a7b32e'
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    // 获取列表
+    getList() {
+      this.loading = true;
+      apisystemminiprogramlist(this.queryParams)
+        .then(response => {
+          this.miniprogramList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        })
+        .catch(error => {
+          console.error('获取小程序列表失败:', error);
+          this.loading = false;
+        });
+    },
+
+    // 搜索
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+
+    // 重置搜索
+    resetQuery() {
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        name: '',
+        status: ''
+      };
+      this.getList();
+    },
+
+    // 分页大小变化
+    handleSizeChange(val) {
+      this.queryParams.pageSize = val;
+      this.getList();
+    },
+
+    // 当前页变化
+    handleCurrentChange(val) {
+      this.queryParams.pageNum = val;
+      this.getList();
+    },
+
+    // 新增
+    handleAdd() {
+      this.dialogTitle = '新增小程序';
+      this.form = {
+        id: '',
+        name: '',
+        logo: '',
+        url: '',
+        status: 1,
+        desc: '',
+        ext1: '',
+        ext2: ''
+      };
+      this.fileList = [];
+      this.uploading = false;
+      this.dialogVisible = true;
+    },
+
+    // 修改
+    handleEdit(row) {
+      this.dialogTitle = '修改小程序';
+      this.fileList = [];
+      this.uploading = false;
+      apisystemminiprogramget({ id: row.id })
+        .then(response => {
+          this.form = response.data;
+          this.dialogVisible = true;
+        })
+        .catch(error => {
+          console.error('获取小程序详情失败:', error);
+        });
+    },
+
+    // 删除
+    handleDelete(id) {
+      ElMessageBox.confirm('确定要删除该小程序吗?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+        .then(() => {
+          apisystemminiprogramdel({ id })
+            .then(response => {
+              ElMessage.success('删除成功');
+              this.getList();
+            })
+            .catch(error => {
+              console.error('删除小程序失败:', error);
+              ElMessage.error('删除失败');
+            });
+        })
+        .catch(() => {});
+    },
+
+    // 提交表单
+    handleSubmit() {
+      this.$refs.formRef.validate(valid => {
+        if (valid) {
+          if (this.form.id) {
+            // 修改
+            apisystemminiprogramupdate(this.form)
+              .then(response => {
+                ElMessage.success('修改成功');
+                this.dialogVisible = false;
+                this.getList();
+              })
+              .catch(error => {
+                console.error('修改小程序失败:', error);
+                ElMessage.error('修改失败');
+              });
+          } else {
+            // 新增
+            apisystemminiprogramadd(this.form)
+              .then(response => {
+                ElMessage.success('新增成功');
+                this.dialogVisible = false;
+                this.getList();
+              })
+              .catch(error => {
+                console.error('新增小程序失败:', error);
+                ElMessage.error('新增失败');
+              });
+          }
+        }
+      });
+    },
+
+    // 上传图标变更
+    handleLogoUploadChange(file, fileList) {
+      this.uploading = true;
+      const formData = new FormData();
+      formData.append('file', file.raw);
+      
+      service({
+        url: this.upUrl,
+        method: 'POST',
+        headers: {
+          ...this.headers,
+          'Content-Type': 'multipart/form-data'
+        },
+        data: formData
+      }).then(response => {
+        this.uploading = false;
+        if (response.code === 200) {
+          this.form.logo = response.data;
+          ElMessage.success('上传成功');
+        } else {
+          ElMessage.error('上传失败');
+        }
+      }).catch(error => {
+        this.uploading = false;
+        console.error('上传失败:', error);
+        ElMessage.error('上传失败');
+      });
+    }
+  }
+};
+</script>
+
+<style scoped>
+.search-form {
+  margin-bottom: 20px;
+  padding: 20px;
+  background: #f5f7fa;
+  border-radius: 4px;
+}
+
+.dialog-footer {
+  text-align: right;
+}
+
+.avatar {
+  border-radius: 6px;
+}
+
+.avatar-uploader-icon {
+  width: 100px;
+  height: 100px;
+  line-height: 100px;
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  color: #999;
+  font-size: 28px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+</style>

+ 1 - 1
vite.config.ts

@@ -25,7 +25,7 @@ export default defineConfig(({command})=>{
     devServer:{
       proxy:{
         '/api':{
-          target:'http://127.0.0.1:8080/',
+          target:'http://127.0.0.1:8081/',
           changeOrigin:true,
           secure:false,
           rewrite:(path)=>path.replace(/^\/api/,'')