Przeglądaj źródła

更新 views/admin 后台管理相关页面, 接口和路由

reghao 6 miesięcy temu
rodzic
commit
ef5af187f1

+ 42 - 2
src/api/admin.js

@@ -1,17 +1,37 @@
 import { get, post } from '@/utils/request'
 
 const adminApi = {
-  getUsersApi: '/api/user/admin/user/all',
+  getUsersApi: '/api/user/admin/list',
+  getChargeReqApi: '/api/user/admin/charge',
+  approveChargeApi: '/api/user/admin/charge/approve',
+  declineChargeApi: '/api/user/admin/charge/decline',
+  getVideosApi: '/api/content/vod/admin/list',
   getUserAvatarsApi: '/api/user/admin/user/avatar',
-  getVideosApi: '/api/content/admin/video/all',
   getAlbumsApi: '/api/content/admin/video/all',
   getArticlesApi: '/api/content/admin/video/all',
+  getFileStoreConfigApi: '/api/file/admin/file_store',
+  getNotifyConfigApi: '/api/message/admin/notify',
+  getVipPlanApi: '/api/user/admin/vip_plan',
+  getSiteNoticeApi: '/api/content/vod/admin/site_notice',
+  getVideoCategoryApi: '/api/content/vod/admin/video_category'
 }
 
 export function getUserList(nextId) {
   return get(adminApi.getUsersApi + '?nextId=' + nextId)
 }
 
+export function getChargeReq(pn) {
+  return get(adminApi.getChargeReqApi + '?pn=' + pn)
+}
+
+export function approveCharge(payload) {
+  return post(adminApi.approveChargeApi, payload)
+}
+
+export function declineCharge(payload) {
+  return post(adminApi.declineChargeApi, payload)
+}
+
 export function getUserAvatarList() {
   return get(adminApi.getUserAvatarsApi)
 }
@@ -27,3 +47,23 @@ export function getAlbumList(nextId) {
 export function getArticleList(nextId) {
   return get(adminApi.getArticlesApi + '?nextId=' + nextId)
 }
+
+export function getFileStoreConfig() {
+  return get(adminApi.getFileStoreConfigApi)
+}
+
+export function getNotifyConfig() {
+  return get(adminApi.getNotifyConfigApi)
+}
+
+export function getVipPlan() {
+  return get(adminApi.getVipPlanApi)
+}
+
+export function getSiteNotice() {
+  return get(adminApi.getSiteNoticeApi)
+}
+
+export function getVideoCategory() {
+  return get(adminApi.getVideoCategoryApi)
+}

+ 35 - 0
src/api/tnb.js

@@ -0,0 +1,35 @@
+import { get, post } from '@/utils/request'
+
+const tnbApi = {
+  getZkApi: '/api/tnb/zk',
+  getZkServiceApi: '/api/tnb/zookeeper',
+  getDubboApi: '/api/tnb/zk/dubbo',
+  getSpringCloudApi: '/api/tnb/eureka/springcloud',
+  getSpringcloudApi: '/api/tnb/eureka/springcloud',
+  gatewayRouteApi: '/api/tnb/gw/route',
+  getArticlesApi: '/api/content/admin/video/all',
+}
+
+export function getZkList() {
+  return get(tnbApi.getZkApi)
+}
+
+export function getZkService(queryInfo) {
+  return get(tnbApi.getZkServiceApi, queryInfo)
+}
+
+export function getDubboList() {
+  return get(tnbApi.getDubboApi)
+}
+
+export function getSpringCloudList() {
+  return get(tnbApi.getSpringCloudApi)
+}
+
+export function getSpringcloudList() {
+  return get(tnbApi.getSpringcloudApi)
+}
+
+export function getGatewayRoute() {
+  return get(tnbApi.gatewayRouteApi)
+}

+ 21 - 4
src/router/admin.js

@@ -1,9 +1,14 @@
 // ********************************************************************************************************************
 // 后台管理主页
 const Admin = () => import('views/admin/Admin')
+const AdminGateway = () => import('views/admin/AdminGateway')
+const AdminDubboService = () => import('views/admin/AdminDubboService')
+const AdminSpringCloudService = () => import('views/admin/AdminSpringCloudService')
 const AdminBackendLog = () => import('views/admin/AdminBackendLog')
 const AdminAccessLog = () => import('views/admin/AdminAccessLog')
 const AdminRuntimeLog = () => import('views/admin/AdminRuntimeLog')
+
+const AdminSiteConfig = () => import('views/admin/AdminSiteConfig')
 const AdminUserList = () => import('views/admin/AdminUserList')
 const AdminVideoList = () => import('views/admin/AdminVideoList')
 const AdminAvatarList = () => import('views/admin/AdminAvatarList')
@@ -172,6 +177,12 @@ export default {
       component: PostIndex,
       meta: { needAuth: true },
       children: [
+        {
+          path: '/background/admin/site',
+          name: 'AdminSiteConfig',
+          component: AdminSiteConfig,
+          meta: { needAuth: true }
+        },
         {
           path: '/background/admin/user',
           name: 'AdminUserList',
@@ -201,13 +212,19 @@ export default {
         {
           path: '/background/backend/gateway',
           name: 'Gateway',
-          component: AdminUserList,
+          component: AdminGateway,
           meta: { needAuth: true }
         },
         {
-          path: '/background/backend/service',
-          name: 'Service',
-          component: AdminUserList,
+          path: '/background/backend/dubbo_service',
+          name: 'DubboService',
+          component: AdminDubboService,
+          meta: { needAuth: true }
+        },
+        {
+          path: '/background/backend/springcloud_service',
+          name: 'SpringCloudService',
+          component: AdminSpringCloudService,
           meta: { needAuth: true }
         },
         {

+ 3 - 181
src/views/admin/AdminAccessLog.vue

@@ -1,167 +1,18 @@
 <template>
   <el-container>
     <el-header height="220">
-      <el-row style="margin-top: 10px">
-        <el-select
-          v-model="queryInfo.scope"
-          clearable
-          placeholder="查询条件"
-          style="margin-left: 5px"
-          @change="onSelectChange"
-        />
-        <el-button type="plain" icon="el-icon-refresh" style="margin-left: 5px" @click="onRefresh">刷新</el-button>
-      </el-row>
+      <h3>访问日志</h3>
     </el-header>
     <el-main>
-      <el-table
-        :data="dataList"
-        border
-        style="width: 100%"
-      >
-        <el-table-column
-          fixed="left"
-          label="No"
-          type="index"
-        />
-        <el-table-column
-          prop="avatarUrl"
-          label="头像"
-          width="90"
-        >
-          <template slot-scope="scope">
-            <el-image :src="scope.row.avatarUrl" min-width="30" height="20" />
-          </template>
-        </el-table-column>
-        <el-table-column
-          prop="userId"
-          label="用户 ID"
-        >
-        </el-table-column>
-        <el-table-column
-          prop="username"
-          label="用户名"
-        />
-        <el-table-column
-          prop="screenName"
-          label="显示名"
-        >
-          <template slot-scope="scope">
-            <router-link target="_blank" :to="`/user/${scope.row.userId}`">
-              <span>{{ scope.row.screenName }}</span>
-            </router-link>
-          </template>
-        </el-table-column>
-        <el-table-column
-          prop="signature"
-          label="签名"
-          :show-overflow-tooltip="true"
-        >
-          <template slot-scope="scope">
-            <el-tooltip
-              v-if="scope.row.signature"
-              :content="scope.row.signature"
-              raw-content
-              placement="top-start"
-            >
-              <span v-if="scope.row.signature && scope.row.signature.length <= 15">
-                {{ scope.row.signature }}
-              </span>
-              <span v-if="scope.row.signature && scope.row.signature.length > 15">
-                {{ scope.row.signature.substr(0, 15) + "..." }}
-              </span>
-            </el-tooltip>
-            <span v-else-if="scope.row.signature === null">-</span>
-          </template>
-        </el-table-column>
-        <el-table-column
-          prop="pubDate"
-          label="注册时间"
-          width="150"
-        />
-        <el-table-column
-          prop="scope"
-          label="帐号状态"
-          width="120"
-        >
-          <template slot-scope="scope">
-            <el-tag v-if="scope.row.status === 1" :type="'warning'" disable-transitions>
-              正常
-            </el-tag>
-            <el-tag v-else-if="scope.row.status === 2" :type="'success'" disable-transitions>
-              封禁中
-            </el-tag>
-            <el-tag v-else :type="'danger'" disable-transitions>
-              已注销
-            </el-tag>
-          </template>
-        </el-table-column>
-        <el-table-column
-          fixed="right"
-          label="操作"
-          width="280"
-        >
-          <template slot-scope="scope">
-            <el-button
-              size="mini"
-              @click="handleEdit(scope.$index, scope.row)"
-            >编辑</el-button>
-            <el-button
-              size="mini"
-              type="danger"
-              @click="handleDelete(scope.$index, scope.row)"
-            >删除</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-      <el-pagination
-        background
-        :small="screenWidth <= 768"
-        layout="prev, pager, next"
-        :page-size="pageSize"
-        :current-page="currentPage"
-        :total="totalSize"
-        @current-change="handleCurrentChange"
-        @prev-click="handleCurrentChange"
-        @next-click="handleCurrentChange"
-      />
     </el-main>
-
-    <!-- 修改视频可见范围对话框 -->
-    <el-dialog
-      append-to-body
-      :visible.sync="showEditScopeDialog"
-      width="30%"
-      center
-    >
-      <el-card class="box-card">
-        <div slot="header" class="clearfix">
-          <span>修改视频可见范围</span>
-          <el-button style="float: right; padding: 3px 0" type="text">更新</el-button>
-        </div>
-        <div class="text item">
-          <el-select v-model="form.scope" placeholder="选择可见范围">
-            <el-option label="本人可见" value="1" />
-            <el-option label="所有人可见" value="2" />
-            <el-option label="VIP 可见" value="3" />
-            <el-option label="验证码可见" value="4" />
-          </el-select>
-        </div>
-      </el-card>
-    </el-dialog>
   </el-container>
 </template>
 
 <script>
-import { getUserList } from '@/api/admin'
-
 export default {
-  name: 'AdminUserList',
+  name: 'AdminAccessLog',
   data() {
     return {
-      queryInfo: {
-        scope: null,
-        pn: 1
-      },
       // 屏幕宽度, 为了控制分页条的大小
       screenWidth: document.body.clientWidth,
       currentPage: 1,
@@ -172,40 +23,11 @@ export default {
     }
   },
   created() {
-    document.title = 'AdminAccessLog'
+    document.title = '访问日志'
     this.getData()
   },
   methods: {
     getData() {
-    },
-    onRefresh() {
-      this.getData()
-    },
-    handleCurrentChange(pageNumber) {
-      this.currentPage = pageNumber
-      this.getData()
-      // 回到顶部
-      scrollTo(0, 0)
-    },
-    handleEdit(index, row) {
-      this.$message.info('handleEdit')
-    },
-    handleDelete(index, row) {
-      this.$confirm('确定要删除 ' + row.title + '?', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning'
-      }).then(() => {
-        this.$message.info('handleDelete')
-      }).catch(() => {
-        this.$message({
-          type: 'info',
-          message: '已取消'
-        })
-      })
-    },
-    onSelectChange() {
-      this.$message.info(this.queryInfo)
     }
   }
 }

+ 182 - 0
src/views/admin/AdminDubboService.vue

@@ -0,0 +1,182 @@
+<template>
+  <el-container>
+    <el-header height="220">
+      <el-row style="margin-top: 10px">
+        <el-select
+          v-model="queryInfo.path"
+          clearable
+          placeholder="查询条件"
+          style="margin-left: 5px"
+          @change="onSelectChange"
+        >
+          <el-option v-for="(item, index) in tableList" :key="index" :label="item" :value="item" />
+        </el-select>
+      </el-row>
+      <el-row style="margin-top: 10px">
+        <el-tag v-for="(item, index) in tableList" :key="index" style="margin-left: 5px" :type="'warning'" disable-transitions>
+          {{ item }}
+        </el-tag>
+      </el-row>
+    </el-header>
+    <el-main>
+      <el-table
+        :data="dataList"
+        border
+        style="width: 100%"
+      >
+        <el-table-column
+          fixed="left"
+          label="No"
+          type="index"
+        />
+        <el-table-column
+          prop="application"
+          label="应用"
+        />
+        <el-table-column
+          prop="total"
+          label="节点数量"
+        />
+        <el-table-column
+          prop="hostPorts"
+          label="节点地址"
+        />
+        <el-table-column
+          prop="role"
+          label="角色"
+        />
+        <el-table-column
+          fixed="right"
+          label="操作"
+          width="280"
+        >
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              @click="handleEdit(scope.$index, scope.row)"
+            >编辑</el-button>
+            <el-button
+              size="mini"
+              type="danger"
+              @click="handleDelete(scope.$index, scope.row)"
+            >删除</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-main>
+
+    <!-- 修改视频可见范围对话框 -->
+    <el-dialog
+      append-to-body
+      :visible.sync="showEditScopeDialog"
+      width="30%"
+      center
+    >
+      <el-card class="box-card">
+        <div slot="header" class="clearfix">
+          <span>修改视频可见范围</span>
+          <el-button style="float: right; padding: 3px 0" type="text" @click="onUpdateScope">更新</el-button>
+        </div>
+        <div class="text item">
+          <el-select v-model="form.scope" placeholder="选择可见范围">
+            <el-option label="本人可见" value="1" />
+            <el-option label="所有人可见" value="2" />
+            <el-option label="VIP 可见" value="3" />
+            <el-option label="验证码可见" value="4" />
+          </el-select>
+        </div>
+      </el-card>
+    </el-dialog>
+  </el-container>
+</template>
+
+<script>
+import { getDubboList, getZkList, getZkService } from '@/api/tnb'
+
+export default {
+  name: 'AdminDubboService',
+  data() {
+    return {
+      queryInfo: {
+        path: null
+      },
+      // 屏幕宽度, 为了控制分页条的大小
+      screenWidth: document.body.clientWidth,
+      currentPage: 1,
+      pageSize: 12,
+      totalSize: 0,
+      dataList: [],
+      nextId: 0,
+      tableList: [],
+      // **********************************************************************
+      showEditScopeDialog: false,
+      form: {
+        videoId: null,
+        scope: 1
+      }
+    }
+  },
+  created() {
+    document.title = 'Dubbo 服务'
+    this.getData()
+  },
+  methods: {
+    getData() {
+      this.dataList = []
+      getZkList().then(resp => {
+        if (resp.code === 0) {
+          this.tableList = resp.data
+        }
+      })
+
+      getDubboList().then(resp => {
+        if (resp.code === 0) {
+          this.dataList = resp.data
+        }
+      })
+    },
+    onRefresh() {
+      this.getData()
+    },
+    handleCurrentChange(pageNumber) {
+      this.currentPage = pageNumber
+      this.getData()
+      // 回到顶部
+      scrollTo(0, 0)
+    },
+    handleEdit(index, row) {
+      this.$message.info('handleEdit')
+    },
+    handleDelete(index, row) {
+      this.$confirm('确定要删除 ' + row.title + '?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        this.$message.info('handleDelete')
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '已取消'
+        })
+      })
+    },
+    onUpdateScope() {
+      this.showEditScopeDialog = false
+    },
+    onSelectChange() {
+      this.dataList = []
+      getZkService(this.queryInfo).then(resp => {
+        if (resp.code === 0) {
+          this.dataList = resp.data
+        }
+      })
+    },
+    handleClose() {
+    }
+  }
+}
+</script>
+
+<style>
+</style>

+ 8 - 179
src/views/admin/AdminGateway.vue

@@ -1,167 +1,20 @@
 <template>
   <el-container>
     <el-header height="220">
-      <el-row style="margin-top: 10px">
-        <el-select
-          v-model="queryInfo.scope"
-          clearable
-          placeholder="查询条件"
-          style="margin-left: 5px"
-          @change="onSelectChange"
-        />
-        <el-button type="plain" icon="el-icon-refresh" style="margin-left: 5px" @click="onRefresh">刷新</el-button>
-      </el-row>
+      <h3>SpringCloud 网关</h3>
     </el-header>
     <el-main>
-      <el-table
-        :data="dataList"
-        border
-        style="width: 100%"
-      >
-        <el-table-column
-          fixed="left"
-          label="No"
-          type="index"
-        />
-        <el-table-column
-          prop="avatarUrl"
-          label="头像"
-          width="90"
-        >
-          <template slot-scope="scope">
-            <el-image :src="scope.row.avatarUrl" min-width="30" height="20" />
-          </template>
-        </el-table-column>
-        <el-table-column
-          prop="userId"
-          label="用户 ID"
-        >
-        </el-table-column>
-        <el-table-column
-          prop="username"
-          label="用户名"
-        />
-        <el-table-column
-          prop="screenName"
-          label="显示名"
-        >
-          <template slot-scope="scope">
-            <router-link target="_blank" :to="`/user/${scope.row.userId}`">
-              <span>{{ scope.row.screenName }}</span>
-            </router-link>
-          </template>
-        </el-table-column>
-        <el-table-column
-          prop="signature"
-          label="签名"
-          :show-overflow-tooltip="true"
-        >
-          <template slot-scope="scope">
-            <el-tooltip
-              v-if="scope.row.signature"
-              :content="scope.row.signature"
-              raw-content
-              placement="top-start"
-            >
-              <span v-if="scope.row.signature && scope.row.signature.length <= 15">
-                {{ scope.row.signature }}
-              </span>
-              <span v-if="scope.row.signature && scope.row.signature.length > 15">
-                {{ scope.row.signature.substr(0, 15) + "..." }}
-              </span>
-            </el-tooltip>
-            <span v-else-if="scope.row.signature === null">-</span>
-          </template>
-        </el-table-column>
-        <el-table-column
-          prop="pubDate"
-          label="注册时间"
-          width="150"
-        />
-        <el-table-column
-          prop="scope"
-          label="帐号状态"
-          width="120"
-        >
-          <template slot-scope="scope">
-            <el-tag v-if="scope.row.status === 1" :type="'warning'" disable-transitions>
-              正常
-            </el-tag>
-            <el-tag v-else-if="scope.row.status === 2" :type="'success'" disable-transitions>
-              封禁中
-            </el-tag>
-            <el-tag v-else :type="'danger'" disable-transitions>
-              已注销
-            </el-tag>
-          </template>
-        </el-table-column>
-        <el-table-column
-          fixed="right"
-          label="操作"
-          width="280"
-        >
-          <template slot-scope="scope">
-            <el-button
-              size="mini"
-              @click="handleEdit(scope.$index, scope.row)"
-            >编辑</el-button>
-            <el-button
-              size="mini"
-              type="danger"
-              @click="handleDelete(scope.$index, scope.row)"
-            >删除</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-      <el-pagination
-        background
-        :small="screenWidth <= 768"
-        layout="prev, pager, next"
-        :page-size="pageSize"
-        :current-page="currentPage"
-        :total="totalSize"
-        @current-change="handleCurrentChange"
-        @prev-click="handleCurrentChange"
-        @next-click="handleCurrentChange"
-      />
     </el-main>
-
-    <!-- 修改视频可见范围对话框 -->
-    <el-dialog
-      append-to-body
-      :visible.sync="showEditScopeDialog"
-      width="30%"
-      center
-    >
-      <el-card class="box-card">
-        <div slot="header" class="clearfix">
-          <span>修改视频可见范围</span>
-          <el-button style="float: right; padding: 3px 0" type="text">更新</el-button>
-        </div>
-        <div class="text item">
-          <el-select v-model="form.scope" placeholder="选择可见范围">
-            <el-option label="本人可见" value="1" />
-            <el-option label="所有人可见" value="2" />
-            <el-option label="VIP 可见" value="3" />
-            <el-option label="验证码可见" value="4" />
-          </el-select>
-        </div>
-      </el-card>
-    </el-dialog>
   </el-container>
 </template>
 
 <script>
-import { getUserList } from '@/api/admin'
+import { getGatewayRoute } from '@/api/tnb'
 
 export default {
-  name: 'AdminUserList',
+  name: 'AdminGateway',
   data() {
     return {
-      queryInfo: {
-        scope: null,
-        pn: 1
-      },
       // 屏幕宽度, 为了控制分页条的大小
       screenWidth: document.body.clientWidth,
       currentPage: 1,
@@ -172,40 +25,16 @@ export default {
     }
   },
   created() {
-    document.title = 'AdminAccessLog'
+    document.title = 'SpringCloud 网关'
     this.getData()
   },
   methods: {
     getData() {
-    },
-    onRefresh() {
-      this.getData()
-    },
-    handleCurrentChange(pageNumber) {
-      this.currentPage = pageNumber
-      this.getData()
-      // 回到顶部
-      scrollTo(0, 0)
-    },
-    handleEdit(index, row) {
-      this.$message.info('handleEdit')
-    },
-    handleDelete(index, row) {
-      this.$confirm('确定要删除 ' + row.title + '?', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning'
-      }).then(() => {
-        this.$message.info('handleDelete')
-      }).catch(() => {
-        this.$message({
-          type: 'info',
-          message: '已取消'
-        })
+      getGatewayRoute().then(resp => {
+        if (resp.code === 0) {
+          this.dataList = resp.data
+        }
       })
-    },
-    onSelectChange() {
-      this.$message.info(this.queryInfo)
     }
   }
 }

+ 3 - 181
src/views/admin/AdminRuntimeLog.vue

@@ -1,167 +1,18 @@
 <template>
   <el-container>
     <el-header height="220">
-      <el-row style="margin-top: 10px">
-        <el-select
-          v-model="queryInfo.scope"
-          clearable
-          placeholder="查询条件"
-          style="margin-left: 5px"
-          @change="onSelectChange"
-        />
-        <el-button type="plain" icon="el-icon-refresh" style="margin-left: 5px" @click="onRefresh">刷新</el-button>
-      </el-row>
+      <h3>运行日志</h3>
     </el-header>
     <el-main>
-      <el-table
-        :data="dataList"
-        border
-        style="width: 100%"
-      >
-        <el-table-column
-          fixed="left"
-          label="No"
-          type="index"
-        />
-        <el-table-column
-          prop="avatarUrl"
-          label="头像"
-          width="90"
-        >
-          <template slot-scope="scope">
-            <el-image :src="scope.row.avatarUrl" min-width="30" height="20" />
-          </template>
-        </el-table-column>
-        <el-table-column
-          prop="userId"
-          label="用户 ID"
-        >
-        </el-table-column>
-        <el-table-column
-          prop="username"
-          label="用户名"
-        />
-        <el-table-column
-          prop="screenName"
-          label="显示名"
-        >
-          <template slot-scope="scope">
-            <router-link target="_blank" :to="`/user/${scope.row.userId}`">
-              <span>{{ scope.row.screenName }}</span>
-            </router-link>
-          </template>
-        </el-table-column>
-        <el-table-column
-          prop="signature"
-          label="签名"
-          :show-overflow-tooltip="true"
-        >
-          <template slot-scope="scope">
-            <el-tooltip
-              v-if="scope.row.signature"
-              :content="scope.row.signature"
-              raw-content
-              placement="top-start"
-            >
-              <span v-if="scope.row.signature && scope.row.signature.length <= 15">
-                {{ scope.row.signature }}
-              </span>
-              <span v-if="scope.row.signature && scope.row.signature.length > 15">
-                {{ scope.row.signature.substr(0, 15) + "..." }}
-              </span>
-            </el-tooltip>
-            <span v-else-if="scope.row.signature === null">-</span>
-          </template>
-        </el-table-column>
-        <el-table-column
-          prop="pubDate"
-          label="注册时间"
-          width="150"
-        />
-        <el-table-column
-          prop="scope"
-          label="帐号状态"
-          width="120"
-        >
-          <template slot-scope="scope">
-            <el-tag v-if="scope.row.status === 1" :type="'warning'" disable-transitions>
-              正常
-            </el-tag>
-            <el-tag v-else-if="scope.row.status === 2" :type="'success'" disable-transitions>
-              封禁中
-            </el-tag>
-            <el-tag v-else :type="'danger'" disable-transitions>
-              已注销
-            </el-tag>
-          </template>
-        </el-table-column>
-        <el-table-column
-          fixed="right"
-          label="操作"
-          width="280"
-        >
-          <template slot-scope="scope">
-            <el-button
-              size="mini"
-              @click="handleEdit(scope.$index, scope.row)"
-            >编辑</el-button>
-            <el-button
-              size="mini"
-              type="danger"
-              @click="handleDelete(scope.$index, scope.row)"
-            >删除</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-      <el-pagination
-        background
-        :small="screenWidth <= 768"
-        layout="prev, pager, next"
-        :page-size="pageSize"
-        :current-page="currentPage"
-        :total="totalSize"
-        @current-change="handleCurrentChange"
-        @prev-click="handleCurrentChange"
-        @next-click="handleCurrentChange"
-      />
     </el-main>
-
-    <!-- 修改视频可见范围对话框 -->
-    <el-dialog
-      append-to-body
-      :visible.sync="showEditScopeDialog"
-      width="30%"
-      center
-    >
-      <el-card class="box-card">
-        <div slot="header" class="clearfix">
-          <span>修改视频可见范围</span>
-          <el-button style="float: right; padding: 3px 0" type="text">更新</el-button>
-        </div>
-        <div class="text item">
-          <el-select v-model="form.scope" placeholder="选择可见范围">
-            <el-option label="本人可见" value="1" />
-            <el-option label="所有人可见" value="2" />
-            <el-option label="VIP 可见" value="3" />
-            <el-option label="验证码可见" value="4" />
-          </el-select>
-        </div>
-      </el-card>
-    </el-dialog>
   </el-container>
 </template>
 
 <script>
-import { getUserList } from '@/api/admin'
-
 export default {
-  name: 'AdminUserList',
+  name: 'AdminRuntimeLog',
   data() {
     return {
-      queryInfo: {
-        scope: null,
-        pn: 1
-      },
       // 屏幕宽度, 为了控制分页条的大小
       screenWidth: document.body.clientWidth,
       currentPage: 1,
@@ -172,40 +23,11 @@ export default {
     }
   },
   created() {
-    document.title = 'AdminRuntimeLog'
+    document.title = '运行日志'
     this.getData()
   },
   methods: {
     getData() {
-    },
-    onRefresh() {
-      this.getData()
-    },
-    handleCurrentChange(pageNumber) {
-      this.currentPage = pageNumber
-      this.getData()
-      // 回到顶部
-      scrollTo(0, 0)
-    },
-    handleEdit(index, row) {
-      this.$message.info('handleEdit')
-    },
-    handleDelete(index, row) {
-      this.$confirm('确定要删除 ' + row.title + '?', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning'
-      }).then(() => {
-        this.$message.info('handleDelete')
-      }).catch(() => {
-        this.$message({
-          type: 'info',
-          message: '已取消'
-        })
-      })
-    },
-    onSelectChange() {
-      this.$message.info(this.queryInfo)
     }
   }
 }

+ 487 - 0
src/views/admin/AdminSiteConfig.vue

@@ -0,0 +1,487 @@
+<template>
+  <el-row>
+    <el-row class="movie-list">
+      <el-col :md="16" style="padding-right: 5px; padding-left: 5px; padding-bottom: 5px">
+        <el-row style="padding-right: 5px; padding-left: 5px; padding-bottom: 5px">
+          <el-card class="box-card">
+            <div slot="header" class="clearfix">
+              <span>存储配置</span>
+            </div>
+            <div class="text item">
+              <el-table
+                :data="storeConfigList"
+                border
+                style="width: 100%"
+              >
+                <el-table-column
+                  prop="id"
+                  label="ID"
+                />
+                <el-table-column
+                  prop="ossType"
+                  label="存储类型"
+                />
+                <el-table-column
+                  prop="endpoint"
+                  label="Endpoint"
+                />
+                <el-table-column
+                  prop="accessKeyId"
+                  label="AccessKeyId"
+                />
+                <el-table-column
+                  prop="accessKeySecret"
+                  label="AccessKeyIdSecret"
+                />
+                <el-table-column
+                  fixed="right"
+                  label="操作"
+                >
+                  <template slot-scope="scope">
+                    <el-button
+                      size="mini"
+                      @click="onApprove(scope.row)"
+                    >同意</el-button>
+                    <el-button
+                      size="mini"
+                      type="danger"
+                      @click="onDecline(scope.row)"
+                    >拒绝</el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+          </el-card>
+        </el-row>
+      </el-col>
+      <el-col :md="8" style="padding-right: 5px; padding-left: 5px; padding-bottom: 5px">
+        <el-row style="padding-right: 5px; padding-left: 5px; padding-bottom: 5px">
+          <el-card class="box-card">
+            <div slot="header" class="clearfix">
+              <span>视频分区</span>
+            </div>
+            <div class="text item">
+              <el-tree
+                :accordion="true"
+                :data="treeNode"
+                :props="defaultProps"
+                highlight-current
+                @node-click="handleNodeClick"
+              >
+              <span slot-scope="{ node, data }">
+                <span :class="data.icon">{{ node.label }}</span>
+              </span>
+              </el-tree>
+            </div>
+          </el-card>
+        </el-row>
+      </el-col>
+    </el-row>
+    <el-row class="movie-list">
+      <el-col :md="16" style="padding-right: 5px; padding-left: 5px; padding-bottom: 5px">
+        <el-row style="padding-right: 5px; padding-left: 5px; padding-bottom: 5px">
+          <el-card class="box-card">
+            <div slot="header" class="clearfix">
+              <span>通知配置</span>
+            </div>
+            <div class="text item">
+              <el-table
+                :data="notifyConfigList"
+                border
+                style="width: 100%"
+              >
+                <el-table-column
+                  prop="id"
+                  label="ID"
+                />
+                <el-table-column
+                  prop="smtp"
+                  label="SMTP"
+                />
+                <el-table-column
+                  prop="username"
+                  label="帐号"
+                />
+                <el-table-column
+                  prop="password"
+                  label="密码"
+                />
+                <el-table-column
+                  prop="personal"
+                  label="发送人"
+                />
+                <el-table-column
+                  prop="defaultSender"
+                  label="是否默认"
+                />
+                <el-table-column
+                  fixed="right"
+                  label="操作"
+                >
+                  <template slot-scope="scope">
+                    <el-button
+                      size="mini"
+                      @click="onApprove(scope.row)"
+                    >同意</el-button>
+                    <el-button
+                      size="mini"
+                      type="danger"
+                      @click="onDecline(scope.row)"
+                    >拒绝</el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+          </el-card>
+        </el-row>
+      </el-col>
+      <el-col :md="8" style="padding-right: 5px; padding-left: 5px; padding-bottom: 5px">
+        <el-row style="padding-right: 5px; padding-left: 5px; padding-bottom: 5px">
+          <el-card class="box-card">
+            <div slot="header" class="clearfix">
+              <span>站点公告</span>
+            </div>
+            <div class="text item">
+              {{ siteNotice }}
+            </div>
+          </el-card>
+        </el-row>
+      </el-col>
+    </el-row>
+    <el-row class="movie-list">
+      <el-col :md="16" style="padding-right: 5px; padding-left: 5px; padding-bottom: 5px">
+        <el-row style="padding-right: 5px; padding-left: 5px; padding-bottom: 5px">
+          <el-card class="box-card">
+            <div slot="header" class="clearfix">
+              <span>充值请求</span>
+            </div>
+            <div class="text item">
+              <el-table
+                :data="chargeReqList"
+                border
+                style="width: 100%"
+              >
+                <el-table-column
+                  fixed="left"
+                  label="No"
+                  type="index"
+                />
+                <el-table-column
+                  prop="chargeId"
+                  label="充值 ID"
+                />
+                <el-table-column
+                  prop="quantity"
+                  label="金额"
+                />
+                <el-table-column
+                  prop="owner"
+                  label="用户"
+                />
+                <el-table-column
+                  fixed="right"
+                  label="操作"
+                >
+                  <template slot-scope="scope">
+                    <el-button
+                      size="mini"
+                      @click="onApprove(scope.row)"
+                    >同意</el-button>
+                    <el-button
+                      size="mini"
+                      type="danger"
+                      @click="onDecline(scope.row)"
+                    >拒绝</el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+          </el-card>
+        </el-row>
+      </el-col>
+      <el-col :md="8" style="padding-right: 5px; padding-left: 5px; padding-bottom: 5px">
+        <el-row style="padding-right: 5px; padding-left: 5px; padding-bottom: 5px">
+          <el-card class="box-card">
+            <div slot="header" class="clearfix">
+              <span>会员计划</span>
+            </div>
+            <div class="text item">
+              <el-table
+                :data="vipPlanList"
+                border
+                style="width: 100%"
+              >
+                <el-table-column
+                  prop="planId"
+                  label="ID"
+                />
+                <el-table-column
+                  prop="name"
+                  label="名字"
+                />
+                <el-table-column
+                  prop="price"
+                  label="价格(¥)"
+                />
+                <el-table-column
+                  prop="duration"
+                  label="时长(天)"
+                />
+              </el-table>
+            </div>
+          </el-card>
+        </el-row>
+      </el-col>
+    </el-row>
+
+    <el-dialog
+      :title="updateTitle"
+      append-to-body
+      :visible.sync="updateMobileDialog"
+      width="30%"
+      center
+    >
+      <el-row style="padding-right: 5px; padding-left: 5px; padding-bottom: 5px; text-align: center">
+        <el-form ref="form" :model="updateMobileForm" label-width="100px">
+          <el-form-item label="邮箱/手机号" label-width="100px">
+            <el-input
+              v-model="updateMobileForm.principal"
+              placeholder="请输入邮箱或手机号"
+              style="width: 45%; padding-right: 10px"
+              clearable
+            />
+            <el-button :disabled="isBtn" @click="sendVerifyCode">{{ code }}</el-button>
+          </el-form-item>
+          <el-form-item label="验证码" label-width="90px">
+            <el-input
+              v-model="updateMobileForm.verifyCode"
+              placeholder="请输入短信验证码"
+              style="padding-right: 1px"
+              clearable
+            />
+          </el-form-item>
+          <el-form-item label="密码">
+            <el-input
+              v-model="updateMobileForm.credential"
+              type="password"
+              placeholder="请输入密码"
+              style="padding-right: 1px"
+              clearable
+            />
+          </el-form-item>
+          <el-form-item>
+            <el-button
+              type="primary"
+              @click.native="updateUserEmail"
+            >更新</el-button>
+          </el-form-item>
+        </el-form>
+      </el-row>
+    </el-dialog>
+    <el-dialog
+      :title="updateTitle"
+      append-to-body
+      :visible.sync="updatePasswordDialog"
+      width="30%"
+      center
+    >
+      <el-row style="padding-right: 5px; padding-left: 5px; padding-bottom: 5px; text-align: center">
+        <el-card class="box-card">
+          <div class="text item">
+            <el-form ref="form" :model="updatePasswordForm" label-width="100px">
+              <el-form-item label="当前密码">
+                <el-input
+                  v-model="updatePasswordForm.credential"
+                  type="password"
+                  placeholder="请输入当前密码"
+                  style="padding-right: 1px"
+                  clearable
+                />
+              </el-form-item>
+              <el-form-item label="新密码">
+                <el-input
+                  v-model="updatePasswordForm.credential"
+                  type="password"
+                  placeholder="请输入新密码"
+                  style="padding-right: 1px"
+                  clearable
+                />
+              </el-form-item>
+              <el-form-item label="确认新密码">
+                <el-input
+                  v-model="updatePasswordForm.credential"
+                  type="password"
+                  placeholder="请确认新密码"
+                  style="padding-right: 1px"
+                  clearable
+                />
+              </el-form-item>
+              <el-form-item>
+                <el-button
+                  type="primary"
+                  @click.native="updateUserPassword"
+                >更新</el-button>
+              </el-form-item>
+            </el-form>
+          </div>
+        </el-card>
+      </el-row>
+    </el-dialog>
+  </el-row>
+</template>
+
+<script>
+import { userMixin } from 'assets/js/mixin'
+import {
+  getChargeReq,
+  getFileStoreConfig,
+  getNotifyConfig,
+  getSiteNotice,
+  getVideoCategory,
+  getVipPlan
+} from '@/api/admin'
+import {videoCategories} from "@/api/video";
+
+export default {
+  name: 'AdminSiteConfig',
+  mixins: [userMixin],
+  data() {
+    return {
+      storeConfigList: null,
+      notifyConfigList: [],
+      vipPlanList: [],
+      siteNotice: null,
+      videoCategory: null,
+      chargeReqList: [],
+      treeNode: [],
+      defaultProps: {
+        children: 'children',
+        label: 'label',
+        value: 'value'
+      },
+      updateType: 1,
+      updateTitle: '',
+      updateMobileDialog: false,
+      updateMobileForm: {
+        principal: null,
+        verifyCode: null,
+        credential: null,
+        captchaCode: null,
+        channel: 1,
+        plat: 2
+      },
+      updatePasswordDialog: false,
+      updatePasswordForm: {
+        principal: null,
+        verifyCode: null,
+        credential: null,
+        captchaCode: null,
+        channel: 1,
+        plat: 2
+      }
+    }
+  },
+  created() {
+    document.title = '站点配置'
+    this.getData()
+  },
+  mounted() {
+  },
+  methods: {
+    getData() {
+      getFileStoreConfig().then(resp => {
+        if (resp.code === 0) {
+          this.storeConfigList = resp.data
+        }
+      })
+
+      getNotifyConfig().then(resp => {
+        if (resp.code === 0) {
+          this.notifyConfigList = resp.data
+        }
+      })
+
+      getVipPlan().then(resp => {
+        if (resp.code === 0) {
+          this.vipPlanList = resp.data
+        }
+      })
+
+      getSiteNotice().then(resp => {
+        if (resp.code === 0) {
+          this.siteNotice = resp.data
+        }
+      })
+
+      getVideoCategory().then(resp => {
+        if (resp.code === 0) {
+        }
+      })
+      videoCategories().then(resp => {
+        if (resp.code === 0) {
+          this.treeNode = resp.data
+        } else {
+          this.$notify({
+            title: '提示',
+            message: resp.msg,
+            type: 'error',
+            duration: 3000
+          })
+        }
+      }).catch(error => {
+        this.$notify({
+          title: '提示',
+          message: error.message,
+          type: 'warning',
+          duration: 3000
+        })
+      })
+
+      getChargeReq(1).then(resp => {
+        if (resp.code === 0) {
+          this.chargeReqList = resp.data
+        }
+      })
+    },
+    // ****************************************************************************************************************
+    showUpdateDialog(type) {
+      if (type === 1) {
+        this.updateType = 1
+        this.updateTitle = '更新用户手机号'
+        this.updateMobileDialog = true
+      } else if (type === 2) {
+        this.updateType = 2
+        this.updateTitle = '更新用户密码'
+        this.updatePasswordDialog = true
+      }
+    },
+    onUpdate() {
+      if (this.updateType === 1) {
+        this.updateMobileDialog = false
+      } else {
+        this.updatePasswordDialog = false
+      }
+    },
+    sendVerifyCode() {
+      this.$message.info('发送验证码')
+    },
+    updateUserEmail() {
+      this.$message.info(this.updateMobileForm)
+      this.updateMobileDialog = false
+    },
+    updateUserPassword() {
+      this.$message.info(this.updatePasswordForm)
+      this.updatePasswordDialog = false
+    },
+    onApprove(row) {
+      this.$message.info('同意充值 ' + row.chargeId)
+    },
+    onDecline(row) {
+      this.$message.info('拒绝充值' + row.chargeId)
+    }
+  }
+}
+</script>
+
+<style>
+</style>

+ 146 - 0
src/views/admin/AdminSpringCloudService.vue

@@ -0,0 +1,146 @@
+<template>
+  <el-container>
+    <el-header height="220">
+      <h3>SpringCloud 服务</h3>
+    </el-header>
+    <el-main>
+      <el-table
+        :data="dataList"
+        border
+        style="width: 100%"
+      >
+        <el-table-column
+          fixed="left"
+          label="No"
+          type="index"
+        />
+        <el-table-column
+          prop="instanceId"
+          label="实例 ID"
+        />
+        <el-table-column
+          prop="appName"
+          label="应用"
+        />
+        <el-table-column
+          prop="hostPort"
+          label="节点地址"
+        />
+        <el-table-column
+          prop="lastUpdateTime"
+          label="最近更新"
+        />
+        <el-table-column
+          prop="lastDirtyTime"
+          label="最近脏数据"
+        />
+        <el-table-column
+          fixed="right"
+          label="操作"
+          width="280"
+        >
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              @click="handleEdit(scope.$index, scope.row)"
+            >编辑</el-button>
+            <el-button
+              size="mini"
+              type="danger"
+              @click="handleDelete(scope.$index, scope.row)"
+            >删除</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-main>
+
+    <!-- 修改视频可见范围对话框 -->
+    <el-dialog
+      append-to-body
+      :visible.sync="showServiceDialog"
+      width="70%"
+      center
+    >
+    </el-dialog>
+  </el-container>
+</template>
+
+<script>
+import { getSpringCloudList } from '@/api/tnb'
+
+export default {
+  name: 'AdminSpringCloudService',
+  data() {
+    return {
+      queryInfo: {
+        scope: null,
+        pn: 1
+      },
+      // 屏幕宽度, 为了控制分页条的大小
+      screenWidth: document.body.clientWidth,
+      currentPage: 1,
+      pageSize: 12,
+      totalSize: 0,
+      dataList: [],
+      nextId: 0,
+      serviceList: [],
+      // **********************************************************************
+      showServiceDialog: false,
+      form: {
+        videoId: null,
+        scope: 1
+      }
+    }
+  },
+  created() {
+    document.title = 'SpringCloud 服务'
+    this.getData()
+  },
+  methods: {
+    getData() {
+      getSpringCloudList().then(resp => {
+        if (resp.code === 0) {
+          this.dataList = resp.data
+        }
+      })
+    },
+    onRefresh() {
+      this.getData()
+    },
+    handleCurrentChange(pageNumber) {
+      this.currentPage = pageNumber
+      this.getData()
+      // 回到顶部
+      scrollTo(0, 0)
+    },
+    handleEdit(index, row) {
+      this.$message.info('handleEdit')
+    },
+    handleDelete(index, row) {
+      this.$confirm('确定要删除 ' + row.title + '?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        this.$message.info('handleDelete')
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '已取消'
+        })
+      })
+    },
+    onUpdateScope() {
+      this.showServiceDialog = false
+    },
+    onSelectChange() {
+      this.$message.info(this.queryInfo)
+    },
+    handleClose() {
+    }
+  }
+}
+</script>
+
+<style>
+</style>

+ 10 - 2
src/views/admin/LeftAside.vue

@@ -101,6 +101,10 @@
         <span>后台管理</span>
       </template>
       <el-menu-item-group>
+        <el-menu-item index="/background/admin/site">
+          <i class="el-icon-picture" />
+          <span slot="title">站点管理</span>
+        </el-menu-item>
         <el-menu-item index="/background/admin/user">
           <i class="el-icon-user" />
           <span slot="title">管理用户</span>
@@ -125,9 +129,13 @@
           <i class="el-icon-user" />
           <span slot="title">网关</span>
         </el-menu-item>
-        <el-menu-item index="/background/backend/service">
+        <el-menu-item index="/background/backend/dubbo_service">
+          <i class="el-icon-user" />
+          <span slot="title">Dubbo 服务</span>
+        </el-menu-item>
+        <el-menu-item index="/background/backend/springcloud_service">
           <i class="el-icon-user" />
-          <span slot="title">服务</span>
+          <span slot="title">SpringCloud 服务</span>
         </el-menu-item>
         <el-menu-item index="/background/backend/access_log">
           <i class="el-icon-film" />