Quellcode durchsuchen

更新 views/devops 模块

reghao vor 3 Monaten
Ursprung
Commit
a174065b6f

+ 40 - 10
src/api/devops.js

@@ -2,6 +2,7 @@ import { get, post, postForm } from '@/utils/request'
 
 const devopsApi = {
   getDashboard: '/api/devops/dashboard',
+  getAccount: '/api/devops/account',
   getBuildDir: '/api/devops/build/dir',
   eraseBuildDir: '/api/devops/build/dir/erase',
   getMachineList: '/api/devops/machine/host',
@@ -16,16 +17,25 @@ const devopsApi = {
   getAppDeployConfigList: '/api/devops/app/config/app/deploy',
   getBuildDeployList: '/api/devops/app/bd',
   getAppStatList: '/api/devops/app/stat',
+  getSiteOptionList: '/api/devops/sys/site',
+  getWebhookList: '/api/devops/sys/notify/webhook',
   getMenuTree: '/api/devops/rbac/menu/ztree',
   getRoleList: '/api/devops/rbac/role',
-  getUserList: '/api/devops/rbac/user',
-  getUserKeyList: '/bg/blog/post/list1'
+  getUserList: '/api/devops/rbac/user'
 }
 
 export function getDashboard() {
   return get(devopsApi.getDashboard)
 }
 
+export function getAccountLoginRecord() {
+  return get(devopsApi.getAccount + '/record')
+}
+
+export function getAccountMessage(queryInfo) {
+  return get(devopsApi.getAccount + '/message', queryInfo)
+}
+
 export function getMachineList(queryInfo) {
   return get(devopsApi.getMachineList, queryInfo)
 }
@@ -194,6 +204,30 @@ export function getAppStat(appId) {
   return get(devopsApi.getAppStatList + '/detail?appId=' + appId)
 }
 
+export function getSiteOptionList() {
+  return get(devopsApi.getSiteOptionList)
+}
+
+export function updateSiteOption(formData) {
+  return postForm(devopsApi.getSiteOptionList + '/update', formData)
+}
+
+export function getWebhookList() {
+  return get(devopsApi.getWebhookList)
+}
+
+export function addWebhook(formData) {
+  return postForm(devopsApi.getWebhookList + '/add', formData)
+}
+
+export function deleteWebhook(formData) {
+  return postForm(devopsApi.getWebhookList + '/delete', formData)
+}
+
+export function testWebhook(formData) {
+  return postForm(devopsApi.getWebhookList + '/test', formData)
+}
+
 export function getMenuList() {
   return get(devopsApi.getMenuTree)
 }
@@ -206,14 +240,10 @@ export function getUserList() {
   return get(devopsApi.getUserList)
 }
 
-export function updateUserNode(payload) {
-  return postForm(devopsApi.getUserKeyList, payload)
-}
-
-export function getBlogPosts() {
-  return get(devopsApi.getUserKeyList)
+export function getUserRole(userId) {
+  return get(devopsApi.getUserList + '/role?userId=' + userId)
 }
 
-export function resetUserKey() {
-  return post(devopsApi.getUserKeyList)
+export function getAddUserRoleList() {
+  return get(devopsApi.getUserList + '/add')
 }

+ 10 - 33
src/router/devops.js

@@ -23,9 +23,6 @@ const Packer = () => import('views/devops/build/Packer')
 const AppConfig = () => import('views/devops/app/AppConfig')
 const BuildDeploy = () => import('views/devops/app/BuildDeploy')
 const AppStat = () => import('views/devops/app/AppStat')
-// file
-const FileList = () => import('views/devops/file/FileList')
-const ImageFile = () => import('views/devops/file/ImageFile')
 // sys
 const SiteConfig = () => import('views/devops/sys/SiteConfig')
 const AccessLog = () => import('views/devops/sys/AccessLog')
@@ -81,13 +78,13 @@ export default {
           path: '/devops/machine/host',
           name: 'MachineHost',
           component: MachineHost,
-          meta: { needAuth: true }
+          meta: { needAuth: true, roles: ['admin'] }
         },
         {
           path: '/devops/machine/aliyun_key',
           name: 'AliyunKey',
           component: AliyunKey,
-          meta: { needAuth: true }
+          meta: { needAuth: true, roles: ['admin'] }
         }
       ]
     },
@@ -155,26 +152,6 @@ export default {
         }
       ]
     },
-    {
-      path: '/devops/file',
-      name: 'FileList',
-      component: { render: (e) => e('router-view') },
-      meta: { needAuth: true },
-      children: [
-        {
-          path: '/devops/file/list',
-          name: 'FileList',
-          component: FileList,
-          meta: { needAuth: true }
-        },
-        {
-          path: '/devops/file/image',
-          name: 'ImageFile',
-          component: ImageFile,
-          meta: { needAuth: true }
-        }
-      ]
-    },
     {
       path: '/devops/sys',
       name: 'SiteConfig',
@@ -185,31 +162,31 @@ export default {
           path: '/devops/sys/site',
           name: 'SiteConfig',
           component: SiteConfig,
-          meta: { needAuth: true }
+          meta: { needAuth: true, roles: ['admin'] }
         },
         {
           path: '/devops/sys/access_log',
           name: 'AccessLog',
           component: AccessLog,
-          meta: { needAuth: true }
+          meta: { needAuth: true, roles: ['admin'] }
         },
         {
           path: '/devops/sys/runtime_log',
           name: 'RuntimeLog',
           component: RuntimeLog,
-          meta: { needAuth: true }
+          meta: { needAuth: true, roles: ['admin'] }
         },
         {
           path: '/devops/sys/realtime_log',
           name: 'RealtimeLog',
           component: RealtimeLog,
-          meta: { needAuth: true }
+          meta: { needAuth: true, roles: ['admin'] }
         },
         {
           path: '/devops/sys/webhook',
           name: 'Webhook',
           component: Webhook,
-          meta: { needAuth: true }
+          meta: { needAuth: true, roles: ['admin'] }
         }
       ]
     },
@@ -223,19 +200,19 @@ export default {
           path: '/devops/rbac/menu',
           name: 'Menu',
           component: Menu,
-          meta: { needAuth: true }
+          meta: { needAuth: true, roles: ['admin'] }
         },
         {
           path: '/devops/rbac/role',
           name: 'Role',
           component: Role,
-          meta: { needAuth: true }
+          meta: { needAuth: true, roles: ['admin'] }
         },
         {
           path: '/devops/rbac/user',
           name: 'User',
           component: User,
-          meta: { needAuth: true }
+          meta: { needAuth: true, roles: ['admin'] }
         }
       ]
     }

+ 1 - 1
src/views/devops/Dashboard.vue

@@ -45,7 +45,7 @@
             <span>系统信息</span>
           </div>
           <div class="text item">
-            <el-descriptions class="margin-top" :column="1" :size="small" border>
+            <el-descriptions v-if="sysInfo !== null" class="margin-top" :column="1" size="small" border>
               <el-descriptions-item>
                 <template slot="label">
                   <i class="el-icon-user" />

+ 6 - 6
src/views/devops/LeftAside.vue

@@ -155,6 +155,11 @@ export default {
               title: '站点配置',
               icon: 'el-icon-user-solid'
             },
+            {
+              url: '/devops/sys/webhook',
+              title: 'webhook通知',
+              icon: 'el-icon-user-solid'
+            }/*,
             {
               url: '/devops/sys/access_log',
               title: '访问日志',
@@ -169,12 +174,7 @@ export default {
               url: '/devops/sys/realtime_log',
               title: '实时日志',
               icon: 'el-icon-user-solid'
-            },
-            {
-              url: '/devops/sys/webhook',
-              title: 'webhook通知',
-              icon: 'el-icon-user-solid'
-            }
+            }*/
           ]
         },
         {

+ 1 - 1
src/views/devops/TopNav.vue

@@ -12,7 +12,7 @@
       @click="doToggle()"
     />
     <el-submenu index="2" class="submenu">
-      <template slot="title">{{ user.screenName }}</template>
+      <template slot="title">{{ user.username }}</template>
       <el-menu-item index="2-1" @click="backToHome">
         <i class="el-icon-s-home" />
         <span slot="title">回到主站</span>

+ 2 - 0
src/views/devops/build/BuildDir.vue

@@ -70,6 +70,8 @@ export default {
         } else {
           this.$message.error(resp.msg)
         }
+      }).catch(error => {
+        this.$message.error(error.message)
       })
     },
     handleEdit(index, row) {

+ 50 - 107
src/views/devops/rbac/Menu.vue

@@ -1,84 +1,74 @@
 <template>
   <el-container>
-    <el-header height="220">
+    <el-header>
       <h3>资源目录树</h3>
     </el-header>
     <el-main>
+      <el-col :md="8">
+        <div style="height: 70vh;">
+          <el-scrollbar ref="myScrollbar" style="width: 100%; height: 100%;">
+            <el-card class="box-card" :body-style="{ paddingTop: '5px' }">
+              <div class="text item">
+                <el-tree
+                  :default-expand-all="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-scrollbar>
+        </div>
+      </el-col>
     </el-main>
 
-    <!-- 修改视频可见范围对话框 -->
     <el-dialog
+      title="编辑资源"
       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-select>
-        </div>
-      </el-card>
-    </el-dialog>
-    <!-- 视频预览对话框 -->
-    <el-dialog
-      title="预览视频"
-      append-to-body
-      :visible.sync="showPreviewDialog"
-      :before-close="handleDialogClose"
-      width="70%"
       center
     >
-      <template>
-        <video-preview-player :video-prop.sync="videoProp" />
-      </template>
+      <el-form :model="menuForm" label-width="80px">
+        <el-input v-model="menuForm.id" type="hidden" style="width: 70%; padding-right: 2px" />
+        <el-form-item label="名字" style="width: 70%; padding-right: 2px">
+          <el-input v-model="menuForm.name" style="width: 70%; padding-right: 2px" readonly />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="onEdit">确定</el-button>
+        </el-form-item>
+      </el-form>
     </el-dialog>
   </el-container>
 </template>
 
 <script>
-import VideoPreviewPlayer from 'components/VideoPreviewPlayer'
-import { updateVideoScope, videoInfo } from '@/api/video'
 import { getMenuList } from '@/api/devops'
 
 export default {
-  name: 'VideoPost',
-  components: { VideoPreviewPlayer },
+  name: 'Menu',
   data() {
     return {
-      queryInfo: {
-        scope: null,
-        pn: 1
+      treeNode: [],
+      defaultProps: {
+        children: 'children',
+        label: 'label',
+        value: 'value'
       },
-      // 屏幕宽度, 为了控制分页条的大小
-      screenWidth: document.body.clientWidth,
-      currentPage: 1,
-      pageSize: 10,
-      totalSize: 0,
-      dataList: [],
-      nextId: 0,
       // **********************************************************************
-      videoProp: null,
-      showVideoResourceDialog: false,
       showEditScopeDialog: false,
-      showPreviewDialog: false,
-      form: {
-        videoId: null,
-        scope: 1
-      },
-      videoResources: [],
-      publishVideoDiaglog: false
+      menuForm: {
+        id: '',
+        name: ''
+      }
     }
   },
   created() {
-    document.title = 'Menu'
+    document.title = '资源目录树'
     this.getData()
   },
   methods: {
@@ -92,68 +82,21 @@ export default {
       this.dataList = []
       getMenuList().then(resp => {
         if (resp.code === 0) {
-          const respData = resp.data
-          this.dataList = respData.list
+          this.treeNode = resp.data
         } else {
           this.$message.error(resp.msg)
         }
+      }).catch(error => {
+        this.$message.error(error.message)
       })
     },
-    onRefresh() {
-      this.getData()
-    },
-    handleScope(index, row) {
-      this.form.videoId = row.videoId
-      this.form.scope = '' + row.scope
+    handleNodeClick(data) {
+      this.menuForm = data
       this.showEditScopeDialog = true
     },
-    handleDialogClose(done) {
-      this.showPreviewDialog = false
-      this.videoProp = {
-        videoId: null,
-        play: false
-      }
-      done()
-    },
-    handlePreview(index, row) {
-      videoInfo(row.videoId).then(res => {
-        if (res.code === 0) {
-          this.showPreviewDialog = true
-          this.videoProp = {
-            videoId: res.data.videoId,
-            play: true
-          }
-        }
-      })
-    },
-    handleEdit(index, row) {
-      const path = '/post/video/edit/' + row.videoId
-      this.$router.push(path)
-    },
-    onUpdateScope() {
+    onEdit() {
+      this.$message.info('on edit')
       this.showEditScopeDialog = false
-      updateVideoScope(this.form).then(res => {
-        if (res.code === 0) {
-          this.$notify({
-            title: '提示',
-            message: '视频可见范围已更新',
-            type: 'warning',
-            duration: 3000
-          })
-        }
-      }).catch(error => {
-        this.$notify({
-          title: '提示',
-          message: error.message,
-          type: 'warning',
-          duration: 3000
-        })
-      })
-    },
-    onSelectChange() {
-      this.$message.info(this.queryInfo)
-    },
-    handleClose() {
     }
   }
 }

+ 45 - 176
src/views/devops/rbac/Role.vue

@@ -16,251 +16,120 @@
           type="index"
         />
         <el-table-column
-          prop="pubDate"
+          prop="name"
           label="角色"
-          width="150"
         />
         <el-table-column
-          prop="videoId"
+          prop="description"
           label="描述"
-          width="120"
-        >
-          <template slot-scope="scope">
-            <router-link target="_blank" :to="`/video/${scope.row.videoId}`">
-              <span>{{ scope.row.videoId }}</span>
-            </router-link>
-          </template>
-        </el-table-column>
+        />
         <el-table-column
-          prop="title"
+          prop="createTime"
           label="创建时间"
-          :show-overflow-tooltip="true"
-        >
-          <template slot-scope="scope">
-            <el-tooltip
-              v-if="scope.row.title"
-              :content="scope.row.title"
-              raw-content
-              placement="top-start"
-            >
-              <span v-if="scope.row.title.length <= 15">
-                {{ scope.row.title }}
-              </span>
-              <span v-else>
-                {{ scope.row.title.substr(0, 15) + "..." }}
-              </span>
-            </el-tooltip>
-          </template>
-        </el-table-column>
+        />
         <el-table-column
-          prop="description"
+          prop="total"
           label="拥有角色的用户"
-          :show-overflow-tooltip="true"
         >
           <template slot-scope="scope">
-            <el-tooltip
-              v-if="scope.row.description"
-              :content="scope.row.description"
-              raw-content
-              placement="top-start"
-            >
-              <span v-if="scope.row.description && scope.row.description.length <= 15">
-                {{ scope.row.description }}
-              </span>
-              <span v-if="scope.row.description && scope.row.description.length > 15">
-                {{ scope.row.description.substr(0, 15) + "..." }}
-              </span>
-            </el-tooltip>
-            <span v-else-if="scope.row.description === null">-</span>
+            <el-tag>
+              {{ scope.row.total }}
+            </el-tag>
+            <el-button
+              style="margin-top: 5px; margin-left: 5px"
+              size="mini"
+              type="success"
+              @click="handleShowUser(scope.$index, scope.row)"
+            >查看</el-button>
           </template>
         </el-table-column>
         <el-table-column
-          prop="horizontal"
+          prop="scope"
           label="授权资源"
         >
           <template slot-scope="scope">
-            <el-tag v-if="scope.row.horizontal" :type="'warning'" disable-transitions>
-              <span icon="el-icon-monitor">横屏</span>
-            </el-tag>
-            <el-tag v-else :type="'success'" disable-transitions>
-              <span icon="el-icon-mobile-phone">竖屏</span>
-            </el-tag>
+            <el-button
+              style="margin-top: 5px; margin-left: 5px"
+              size="mini"
+              type="success"
+              @click="handleUpdateResource(scope.$index, scope.row)"
+            >设置</el-button>
           </template>
         </el-table-column>
         <el-table-column
           fixed="right"
           label="操作"
-          width="280"
+          width="90"
         >
           <template slot-scope="scope">
             <el-button
+              type="danger"
               size="mini"
-              @click="handleEdit(scope.$index, scope.row)"
+              @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
+      title="拥有角色的用户"
       append-to-body
-      :visible.sync="showEditScopeDialog"
-      width="30%"
+      :visible.sync="showUserDialog"
       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-select>
-        </div>
-      </el-card>
+      <template />
     </el-dialog>
-    <!-- 视频预览对话框 -->
     <el-dialog
-      title="预览视频"
+      title="设置角色可访问的资源"
       append-to-body
-      :visible.sync="showPreviewDialog"
-      :before-close="handleDialogClose"
-      width="70%"
+      :visible.sync="showUpdateDialog"
       center
     >
-      <template>
-        <video-preview-player :video-prop.sync="videoProp" />
-      </template>
+      <template />
     </el-dialog>
   </el-container>
 </template>
 
 <script>
-import VideoPreviewPlayer from 'components/VideoPreviewPlayer'
-import { updateVideoScope, videoInfo } from '@/api/video'
 import { getRoleList } from '@/api/devops'
 
 export default {
-  name: 'VideoPost',
-  components: { VideoPreviewPlayer },
+  name: 'Role',
   data() {
     return {
-      queryInfo: {
-        scope: null,
-        pn: 1
-      },
-      // 屏幕宽度, 为了控制分页条的大小
-      screenWidth: document.body.clientWidth,
-      currentPage: 1,
-      pageSize: 10,
-      totalSize: 0,
       dataList: [],
-      nextId: 0,
       // **********************************************************************
-      videoProp: null,
-      showVideoResourceDialog: false,
-      showEditScopeDialog: false,
-      showPreviewDialog: false,
-      form: {
-        videoId: null,
-        scope: 1
-      },
-      videoResources: [],
-      publishVideoDiaglog: false
+      showUserDialog: false,
+      // **********************************************************************
+      showUpdateDialog: false
     }
   },
   created() {
-    document.title = 'Role'
+    document.title = '角色列表'
     this.getData()
   },
   methods: {
-    handleCurrentChange(pageNumber) {
-      this.currentPage = pageNumber
-      this.getData()
-      // 回到顶部
-      scrollTo(0, 0)
-    },
     getData() {
       this.dataList = []
       getRoleList().then(resp => {
         if (resp.code === 0) {
-          const respData = resp.data
-          this.dataList = respData.data
+          this.dataList = resp.data
         } else {
           this.$message.error(resp.msg)
         }
-      })
-    },
-    onRefresh() {
-      this.getData()
-    },
-    handleScope(index, row) {
-      this.form.videoId = row.videoId
-      this.form.scope = '' + row.scope
-      this.showEditScopeDialog = true
-    },
-    handleDialogClose(done) {
-      this.showPreviewDialog = false
-      this.videoProp = {
-        videoId: null,
-        play: false
-      }
-      done()
-    },
-    handlePreview(index, row) {
-      videoInfo(row.videoId).then(res => {
-        if (res.code === 0) {
-          this.showPreviewDialog = true
-          this.videoProp = {
-            videoId: res.data.videoId,
-            play: true
-          }
-        }
-      })
-    },
-    handleEdit(index, row) {
-      const path = '/post/video/edit/' + row.videoId
-      this.$router.push(path)
-    },
-    onUpdateScope() {
-      this.showEditScopeDialog = false
-      updateVideoScope(this.form).then(res => {
-        if (res.code === 0) {
-          this.$notify({
-            title: '提示',
-            message: '视频可见范围已更新',
-            type: 'warning',
-            duration: 3000
-          })
-        }
       }).catch(error => {
-        this.$notify({
-          title: '提示',
-          message: error.message,
-          type: 'warning',
-          duration: 3000
-        })
+        this.$message.error(error.message)
       })
     },
-    onSelectChange() {
-      this.$message.info(this.queryInfo)
+    handleShowUser(index, row) {
+      this.showUserDialog = true
+    },
+    handleUpdateResource(index, row) {
+      this.showUpdateDialog = true
     },
-    handleClose() {
+    handleDelete(index, row) {
+      this.$message.info('delete -> ' + row.name)
     }
   }
 }

+ 148 - 148
src/views/devops/rbac/User.vue

@@ -2,6 +2,9 @@
   <el-container>
     <el-header height="220">
       <h3>用户列表</h3>
+      <el-row style="margin-top: 10px">
+        <el-button type="success" size="mini" icon="el-icon-plus" @click="handleAdd">添加</el-button>
+      </el-row>
     </el-header>
     <el-main>
       <el-table
@@ -16,107 +19,71 @@
           type="index"
         />
         <el-table-column
-          prop="pubDate"
+          prop="username"
           label="帐号"
-          width="150"
         />
         <el-table-column
-          prop="videoId"
+          prop="createTime"
           label="创建时间"
-          width="120"
-        >
-          <template slot-scope="scope">
-            <router-link target="_blank" :to="`/video/${scope.row.videoId}`">
-              <span>{{ scope.row.videoId }}</span>
-            </router-link>
-          </template>
-        </el-table-column>
+        />
         <el-table-column
-          prop="title"
+          prop="sessionCount"
           label="会话总数"
-          :show-overflow-tooltip="true"
         >
           <template slot-scope="scope">
-            <el-tooltip
-              v-if="scope.row.title"
-              :content="scope.row.title"
-              raw-content
-              placement="top-start"
-            >
-              <span v-if="scope.row.title.length <= 15">
-                {{ scope.row.title }}
-              </span>
-              <span v-else>
-                {{ scope.row.title.substr(0, 15) + "..." }}
-              </span>
-            </el-tooltip>
+            <el-tag>
+              {{ scope.row.sessionCount }}
+            </el-tag>
           </template>
         </el-table-column>
         <el-table-column
-          prop="description"
+          prop="lastAccess"
           label="最近访问"
           :show-overflow-tooltip="true"
-        >
-          <template slot-scope="scope">
-            <el-tooltip
-              v-if="scope.row.description"
-              :content="scope.row.description"
-              raw-content
-              placement="top-start"
-            >
-              <span v-if="scope.row.description && scope.row.description.length <= 15">
-                {{ scope.row.description }}
-              </span>
-              <span v-if="scope.row.description && scope.row.description.length > 15">
-                {{ scope.row.description.substr(0, 15) + "..." }}
-              </span>
-            </el-tooltip>
-            <span v-else-if="scope.row.description === null">-</span>
-          </template>
-        </el-table-column>
+        />
         <el-table-column
-          prop="duration"
+          prop="status"
           label="状态"
         />
         <el-table-column
-          prop="horizontal"
+          prop="roleCount"
           label="角色总数"
         >
           <template slot-scope="scope">
-            <el-tag v-if="scope.row.horizontal" :type="'warning'" disable-transitions>
-              <span icon="el-icon-monitor">横屏</span>
-            </el-tag>
-            <el-tag v-else :type="'success'" disable-transitions>
-              <span icon="el-icon-mobile-phone">竖屏</span>
+            <el-tag>
+              {{ scope.row.roleCount }}
             </el-tag>
+            <el-button
+              style="margin-top: 5px; margin-left: 5px"
+              size="mini"
+              type="success"
+              @click="handleUpdateRole(scope.$index, scope.row)"
+            >设置</el-button>
           </template>
         </el-table-column>
         <el-table-column
           prop="scope"
           label="修改密码"
-          width="120"
         >
           <template slot-scope="scope">
-            <el-tag v-if="scope.row.scope === 1" :type="'warning'" disable-transitions>
-              本人可见
-            </el-tag>
-            <el-tag v-if="scope.row.scope === 2" :type="'success'" disable-transitions>
-              所有人可见
-            </el-tag>
-            <el-tag v-if="scope.row.scope === 3" :type="'danger'" disable-transitions>
-              VIP 可见
-            </el-tag>
+            <el-button
+              style="margin-top: 5px; margin-left: 5px"
+              size="mini"
+              type="success"
+              @click="handleUpdatePasswd(scope.$index, scope.row)"
+            >重置</el-button>
           </template>
         </el-table-column>
         <el-table-column
           fixed="right"
           label="操作"
-          width="280"
+          width="90"
         >
           <template slot-scope="scope">
             <el-button
+              type="danger"
               size="mini"
-              @click="handleEdit(scope.$index, scope.row)"
+              @click="handleDelete(scope.$index, scope.row)"
             >删除</el-button>
           </template>
         </el-table-column>
@@ -134,51 +101,70 @@
       />
     </el-main>
 
-    <!-- 修改视频可见范围对话框 -->
     <el-dialog
+      title="添加用户"
+      append-to-body
+      :visible.sync="showAddDialog"
+      center
+    >
+      <el-form :model="addForm" label-width="80px">
+        <el-form-item label="帐号" style="width: 70%; padding-right: 2px">
+          <el-input v-model="addForm.username" style="width: 70%; padding-right: 2px" />
+        </el-form-item>
+        <el-form-item label="密码" style="width: 70%; padding-right: 2px">
+          <el-input v-model="addForm.password" style="width: 70%; padding-right: 2px" />
+        </el-form-item>
+        <el-form-item label="角色" style="width: 70%; padding-right: 2px">
+          <el-checkbox-group v-model="addForm.roles">
+            <el-checkbox v-for="(item, index) in addUserRoleList" :key="index" :label="item" />
+          </el-checkbox-group>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" size="mini" @click="onAdd">确定</el-button>
+        </el-form-item>
+      </el-form>
+    </el-dialog>
+    <el-dialog
+      title="设置角色"
       append-to-body
-      :visible.sync="showEditScopeDialog"
-      width="30%"
+      :visible.sync="showUpdateRoleDialog"
       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-select>
-        </div>
-      </el-card>
+      <template>
+        <el-checkbox-group v-model="userRoleList">
+          <el-checkbox v-for="(item, index) in roleList" :key="index" :label="item" />
+        </el-checkbox-group>
+        <el-button type="primary" size="mini" @click="onUpdateRole">确定</el-button>
+      </template>
     </el-dialog>
-    <!-- 视频预览对话框 -->
     <el-dialog
-      title="预览视频"
+      title="重置密码"
       append-to-body
-      :visible.sync="showPreviewDialog"
-      :before-close="handleDialogClose"
-      width="70%"
+      :visible.sync="showUpdatePasswdDialog"
       center
     >
       <template>
-        <video-preview-player :video-prop.sync="videoProp" />
+        <el-form :model="updatePasswdForm" label-width="80px">
+          <el-form-item label="帐号" style="width: 70%; padding-right: 2px">
+            <el-input v-model="updatePasswdForm.username" style="width: 70%; padding-right: 2px" readonly />
+          </el-form-item>
+          <el-form-item label="密码" style="width: 70%; padding-right: 2px">
+            <el-input v-model="updatePasswdForm.password" style="width: 70%; padding-right: 2px" />
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" size="mini" @click="onUpdatePasswd">确定</el-button>
+          </el-form-item>
+        </el-form>
       </template>
     </el-dialog>
   </el-container>
 </template>
 
 <script>
-import VideoPreviewPlayer from 'components/VideoPreviewPlayer'
-import { updateVideoScope, videoInfo } from '@/api/video'
-import { getUserList, getVideoList } from '@/api/admin'
+import { getAddUserRoleList, getUserList, getUserRole } from '@/api/devops'
 
 export default {
-  name: 'VideoPost',
-  components: { VideoPreviewPlayer },
+  name: 'User',
   data() {
     return {
       queryInfo: {
@@ -191,22 +177,33 @@ export default {
       pageSize: 10,
       totalSize: 0,
       dataList: [],
-      nextId: 0,
       // **********************************************************************
-      videoProp: null,
-      showVideoResourceDialog: false,
-      showEditScopeDialog: false,
-      showPreviewDialog: false,
-      form: {
-        videoId: null,
-        scope: 1
+      showAddDialog: false,
+      addUserRoleList: [],
+      addForm: {
+        username: null,
+        password: null,
+        roles: []
+      },
+      // **********************************************************************
+      showUpdateRoleDialog: false,
+      roleList: [],
+      userRoleList: [],
+      updateRoleForm: {
+        userId: null,
+        roles: null
       },
-      videoResources: [],
-      publishVideoDiaglog: false
+      // **********************************************************************
+      showUpdatePasswdDialog: false,
+      updatePasswdForm: {
+        userId: null,
+        username: null,
+        password: null
+      }
     }
   },
   created() {
-    document.title = 'AdminVideoList'
+    document.title = '用户列表'
     this.getData()
   },
   methods: {
@@ -226,63 +223,66 @@ export default {
         } else {
           this.$message.error(resp.msg)
         }
+      }).catch(error => {
+        this.$message.error(error.message)
       })
     },
-    onRefresh() {
-      this.getData()
-    },
-    handleScope(index, row) {
-      this.form.videoId = row.videoId
-      this.form.scope = '' + row.scope
-      this.showEditScopeDialog = true
-    },
-    handleDialogClose(done) {
-      this.showPreviewDialog = false
-      this.videoProp = {
-        videoId: null,
-        play: false
-      }
-      done()
-    },
-    handlePreview(index, row) {
-      videoInfo(row.videoId).then(res => {
-        if (res.code === 0) {
-          this.showPreviewDialog = true
-          this.videoProp = {
-            videoId: res.data.videoId,
-            play: true
-          }
+    handleAdd() {
+      getAddUserRoleList().then(resp => {
+        if (resp.code === 0) {
+          this.addUserRoleList = resp.data
+          this.showAddDialog = true
+        } else {
+          this.$message.error(resp.msg)
         }
+      }).catch(error => {
+        this.$message.error(error.message)
       })
     },
-    handleEdit(index, row) {
-      const path = '/post/video/edit/' + row.videoId
-      this.$router.push(path)
+    onAdd() {
+      this.showAddDialog = false
+      this.$message.info('add account')
+      console.log(this.addForm)
+      const formData = new FormData()
+      formData.append('userId', this.addForm.username)
+      formData.append('password', this.addForm.password)
+      formData.append('roles', this.addForm.roles)
     },
-    onUpdateScope() {
-      this.showEditScopeDialog = false
-      updateVideoScope(this.form).then(res => {
-        if (res.code === 0) {
-          this.$notify({
-            title: '提示',
-            message: '视频可见范围已更新',
-            type: 'warning',
-            duration: 3000
-          })
+    handleUpdateRole(index, row) {
+      this.updateRoleForm.userId = row.userId
+      getUserRole(row.userId).then(resp => {
+        if (resp.code === 0) {
+          this.roleList = resp.data.allRoles
+          this.userRoleList = resp.data.userRoles
+          this.showUpdateRoleDialog = true
+        } else {
+          this.$message.error(resp.msg)
         }
       }).catch(error => {
-        this.$notify({
-          title: '提示',
-          message: error.message,
-          type: 'warning',
-          duration: 3000
-        })
+        this.$message.error(error.message)
       })
     },
-    onSelectChange() {
-      this.$message.info(this.queryInfo)
+    onUpdateRole() {
+      const formData = new FormData()
+      formData.append('userId', this.updateRoleForm.userId)
+      formData.append('roles', this.userRoleList)
+      console.log(this.userRoleList)
+      this.showUpdateRoleDialog = false
+    },
+    handleUpdatePasswd(index, row) {
+      this.updatePasswdForm.userId = row.userId
+      this.updatePasswdForm.username = row.username
+      this.showUpdatePasswdDialog = true
+    },
+    onUpdatePasswd() {
+      this.showUpdatePasswdDialog = false
+      this.$message.info('update passwd')
+      const formData = new FormData()
+      formData.append('userId', this.updatePasswdForm.userId)
+      formData.append('password', this.updatePasswdForm.password)
     },
-    handleClose() {
+    handleDelete(index, row) {
+      this.$message.info('delete -> ' + row.username)
     }
   }
 }

+ 45 - 131
src/views/devops/sys/SiteConfig.vue

@@ -16,34 +16,16 @@
           type="index"
         />
         <el-table-column
-          prop="pubDate"
+          prop="propKey"
           label="属性名"
-          width="150"
         />
         <el-table-column
-          prop="description"
+          prop="propDesc"
           label="描述"
           :show-overflow-tooltip="true"
-        >
-          <template slot-scope="scope">
-            <el-tooltip
-              v-if="scope.row.description"
-              :content="scope.row.description"
-              raw-content
-              placement="top-start"
-            >
-              <span v-if="scope.row.description && scope.row.description.length <= 15">
-                {{ scope.row.description }}
-              </span>
-              <span v-if="scope.row.description && scope.row.description.length > 15">
-                {{ scope.row.description.substr(0, 15) + "..." }}
-              </span>
-            </el-tooltip>
-            <span v-else-if="scope.row.description === null">-</span>
-          </template>
-        </el-table-column>
+        />
         <el-table-column
-          prop="duration"
+          prop="propValue"
           label="属性值"
         />
         <el-table-column
@@ -54,86 +36,58 @@
           <template slot-scope="scope">
             <el-button
               size="mini"
-              @click="handlePreview(scope.$index, scope.row)"
-            >更新</el-button>
+              @click="handleEdit(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-select>
-        </div>
-      </el-card>
-    </el-dialog>
-    <!-- 视频预览对话框 -->
     <el-dialog
-      title="预览视频"
+      title="修改站点配置"
       append-to-body
-      :visible.sync="showPreviewDialog"
-      :before-close="handleDialogClose"
-      width="70%"
+      :visible.sync="showEditDialog"
       center
     >
       <template>
-        <video-preview-player :video-prop.sync="videoProp" />
+        <el-form :model="form" label-width="80px">
+          <el-form-item label="属性名">
+            <el-input v-model="form.propKey" style="width: 70%; padding-right: 2px" readonly />
+          </el-form-item>
+          <el-form-item label="属性描述">
+            <el-input v-model="form.propDesc" style="width: 70%; padding-right: 2px" />
+          </el-form-item>
+          <el-form-item label="属性值" style="width: 70%; padding-right: 2px">
+            <el-input v-model="form.propValue" style="width: 70%; padding-right: 2px" />
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" @click="onUpdate">确定</el-button>
+          </el-form-item>
+        </el-form>
       </template>
     </el-dialog>
   </el-container>
 </template>
 
 <script>
-import VideoPreviewPlayer from 'components/VideoPreviewPlayer'
-import { updateVideoScope, videoInfo } from '@/api/video'
-import { getVideoList } from '@/api/admin'
+import { getSiteOptionList, updateSiteOption } from '@/api/devops'
 
 export default {
-  name: 'VideoPost',
-  components: { VideoPreviewPlayer },
+  name: 'SiteConfig',
   data() {
     return {
-      queryInfo: {
-        scope: null,
-        pn: 1
-      },
-      // 屏幕宽度, 为了控制分页条的大小
-      screenWidth: document.body.clientWidth,
-      currentPage: 1,
-      pageSize: 10,
-      totalSize: 0,
       dataList: [],
-      nextId: 0,
       // **********************************************************************
-      videoProp: null,
-      showVideoResourceDialog: false,
-      showEditScopeDialog: false,
-      showPreviewDialog: false,
+      showEditDialog: false,
       form: {
-        videoId: null,
-        scope: 1
-      },
-      videoResources: [],
-      publishVideoDiaglog: false
+        propKey: null,
+        propDesc: null,
+        propValue: null
+      }
     }
   },
   created() {
-    document.title = 'AdminVideoList'
+    document.title = '站点配置'
     this.getData()
   },
   methods: {
@@ -145,71 +99,31 @@ export default {
     },
     getData() {
       this.dataList = []
-      getVideoList(0).then(resp => {
+      getSiteOptionList().then(resp => {
         if (resp.code === 0) {
-          const respData = resp.data
-          this.dataList = respData.list
-          this.totalSize = respData.totalSize
+          this.dataList = resp.data
         } else {
           this.$message.error(resp.msg)
         }
-      })
-    },
-    onRefresh() {
-      this.getData()
-    },
-    handleScope(index, row) {
-      this.form.videoId = row.videoId
-      this.form.scope = '' + row.scope
-      this.showEditScopeDialog = true
-    },
-    handleDialogClose(done) {
-      this.showPreviewDialog = false
-      this.videoProp = {
-        videoId: null,
-        play: false
-      }
-      done()
-    },
-    handlePreview(index, row) {
-      videoInfo(row.videoId).then(res => {
-        if (res.code === 0) {
-          this.showPreviewDialog = true
-          this.videoProp = {
-            videoId: res.data.videoId,
-            play: true
-          }
-        }
+      }).catch(error => {
+        this.$message.error(error.message)
       })
     },
     handleEdit(index, row) {
-      const path = '/post/video/edit/' + row.videoId
-      this.$router.push(path)
+      this.form = row
+      this.showEditDialog = true
     },
-    onUpdateScope() {
-      this.showEditScopeDialog = false
-      updateVideoScope(this.form).then(res => {
-        if (res.code === 0) {
-          this.$notify({
-            title: '提示',
-            message: '视频可见范围已更新',
-            type: 'warning',
-            duration: 3000
-          })
-        }
+    onUpdate() {
+      const formData = new FormData()
+      formData.append('propKey', this.form.propKey)
+      formData.append('propDesc', this.form.propDesc)
+      formData.append('propValue', this.form.propValue)
+      this.showEditDialog = false
+      updateSiteOption(formData).then(resp => {
+        this.$message.info(resp.msg)
       }).catch(error => {
-        this.$notify({
-          title: '提示',
-          message: error.message,
-          type: 'warning',
-          duration: 3000
-        })
+        this.$message.error(error.message)
       })
-    },
-    onSelectChange() {
-      this.$message.info(this.queryInfo)
-    },
-    handleClose() {
     }
   }
 }

+ 53 - 141
src/views/devops/sys/Webhook.vue

@@ -2,6 +2,9 @@
   <el-container>
     <el-header height="220">
       <h3>webhook 通知</h3>
+      <el-row style="margin-top: 10px">
+        <el-button type="success" icon="el-icon-plus" style="margin-left: 5px" @click="handleAdd">添加</el-button>
+      </el-row>
     </el-header>
     <el-main>
       <el-table
@@ -16,23 +19,15 @@
           type="index"
         />
         <el-table-column
-          prop="pubDate"
+          prop="name"
           label="发送帐号"
-          width="150"
         />
         <el-table-column
-          prop="videoId"
+          prop="url"
           label="URL"
-          width="120"
-        >
-          <template slot-scope="scope">
-            <router-link target="_blank" :to="`/video/${scope.row.videoId}`">
-              <span>{{ scope.row.videoId }}</span>
-            </router-link>
-          </template>
-        </el-table-column>
+        />
         <el-table-column
-          prop="duration"
+          prop="sign"
           label="签名"
         />
         <el-table-column
@@ -43,177 +38,94 @@
           <template slot-scope="scope">
             <el-button
               size="mini"
-              @click="handleEdit(scope.$index, scope.row)"
+              @click="handleTest(scope.$index, scope.row)"
             >测试</el-button>
             <el-button
               size="mini"
-              @click="handleEdit(scope.$index, scope.row)"
+              @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
+      title="添加 webhook"
       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-select>
-        </div>
-      </el-card>
-    </el-dialog>
-    <!-- 视频预览对话框 -->
-    <el-dialog
-      title="预览视频"
-      append-to-body
-      :visible.sync="showPreviewDialog"
-      :before-close="handleDialogClose"
-      width="70%"
+      :visible.sync="showAddDialog"
       center
     >
-      <template>
-        <video-preview-player :video-prop.sync="videoProp" />
-      </template>
+      <el-form :model="addForm" label-width="80px">
+        <el-form-item label="名字">
+          <el-input v-model="addForm.name" style="width: 70%; padding-right: 2px" readonly />
+        </el-form-item>
+        <el-form-item label="URL">
+          <el-input v-model="addForm.url" style="width: 70%; padding-right: 2px" />
+        </el-form-item>
+        <el-form-item label="签名" style="width: 70%; padding-right: 2px">
+          <el-input v-model="addForm.sign" style="width: 70%; padding-right: 2px" />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="onAdd">确定</el-button>
+        </el-form-item>
+      </el-form>
     </el-dialog>
   </el-container>
 </template>
 
 <script>
-import VideoPreviewPlayer from 'components/VideoPreviewPlayer'
-import { updateVideoScope, videoInfo } from '@/api/video'
-import { getVideoList } from '@/api/admin'
+import { getWebhookList } from '@/api/devops'
 
 export default {
-  name: 'VideoPost',
-  components: { VideoPreviewPlayer },
+  name: 'Webhook',
   data() {
     return {
-      queryInfo: {
-        scope: null,
-        pn: 1
-      },
-      // 屏幕宽度, 为了控制分页条的大小
-      screenWidth: document.body.clientWidth,
-      currentPage: 1,
-      pageSize: 10,
-      totalSize: 0,
       dataList: [],
-      nextId: 0,
       // **********************************************************************
-      videoProp: null,
-      showVideoResourceDialog: false,
-      showEditScopeDialog: false,
-      showPreviewDialog: false,
-      form: {
-        videoId: null,
-        scope: 1
-      },
-      videoResources: [],
-      publishVideoDiaglog: false
+      showAddDialog: false,
+      addForm: {
+        name: null,
+        url: null,
+        sign: null
+      }
     }
   },
   created() {
-    document.title = 'AdminVideoList'
+    document.title = 'Webhook通知'
     this.getData()
   },
   methods: {
-    handleCurrentChange(pageNumber) {
-      this.currentPage = pageNumber
-      this.getData()
-      // 回到顶部
-      scrollTo(0, 0)
-    },
     getData() {
       this.dataList = []
-      getVideoList(0).then(resp => {
+      getWebhookList().then(resp => {
         if (resp.code === 0) {
-          const respData = resp.data
-          this.dataList = respData.list
-          this.totalSize = respData.totalSize
+          this.dataList = resp.data
         } else {
           this.$message.error(resp.msg)
         }
+      }).catch(error => {
+        this.$message.error(error.message)
       })
     },
-    onRefresh() {
-      this.getData()
-    },
-    handleScope(index, row) {
-      this.form.videoId = row.videoId
-      this.form.scope = '' + row.scope
-      this.showEditScopeDialog = true
-    },
-    handleDialogClose(done) {
-      this.showPreviewDialog = false
-      this.videoProp = {
-        videoId: null,
-        play: false
-      }
-      done()
-    },
-    handlePreview(index, row) {
-      videoInfo(row.videoId).then(res => {
-        if (res.code === 0) {
-          this.showPreviewDialog = true
-          this.videoProp = {
-            videoId: res.data.videoId,
-            play: true
-          }
-        }
-      })
-    },
-    handleEdit(index, row) {
-      const path = '/post/video/edit/' + row.videoId
-      this.$router.push(path)
+    handleAdd() {
+      this.showAddDialog = true
     },
-    onUpdateScope() {
-      this.showEditScopeDialog = false
-      updateVideoScope(this.form).then(res => {
-        if (res.code === 0) {
-          this.$notify({
-            title: '提示',
-            message: '视频可见范围已更新',
-            type: 'warning',
-            duration: 3000
-          })
-        }
-      }).catch(error => {
-        this.$notify({
-          title: '提示',
-          message: error.message,
-          type: 'warning',
-          duration: 3000
-        })
-      })
+    onAdd() {
+      this.showAddDialog = false
+      const formData = new FormData()
+      formData.append('name', this.addForm.name)
+      this.$message.info('add -> ' + this.addForm.name)
     },
-    onSelectChange() {
-      this.$message.info(this.queryInfo)
+    handleTest(index, row) {
+      const formData = new FormData()
+      formData.append('name', this.addForm.name)
+      this.$message.info('test -> ' + row.name)
     },
-    handleClose() {
+    handleDelete(index, row) {
+      const formData = new FormData()
+      formData.append('name', this.addForm.name)
+      this.$message.info('delete -> ' + row.name)
     }
   }
 }

+ 29 - 178
src/views/devops/user/UserLogin.vue

@@ -16,66 +16,23 @@
           type="index"
         />
         <el-table-column
-          prop="pubDate"
+          prop="loginAt"
           label="登入时间"
-          width="150"
         />
         <el-table-column
-          prop="videoId"
+          prop="loginIp"
           label="登入 IP"
-          width="120"
-        >
-          <template slot-scope="scope">
-            <router-link target="_blank" :to="`/video/${scope.row.videoId}`">
-              <span>{{ scope.row.videoId }}</span>
-            </router-link>
-          </template>
-        </el-table-column>
+        />
         <el-table-column
-          prop="title"
+          prop="location"
           label="登入位置"
-          :show-overflow-tooltip="true"
-        >
-          <template slot-scope="scope">
-            <el-tooltip
-              v-if="scope.row.title"
-              :content="scope.row.title"
-              raw-content
-              placement="top-start"
-            >
-              <span v-if="scope.row.title.length <= 15">
-                {{ scope.row.title }}
-              </span>
-              <span v-else>
-                {{ scope.row.title.substr(0, 15) + "..." }}
-              </span>
-            </el-tooltip>
-          </template>
-        </el-table-column>
+        />
         <el-table-column
-          prop="description"
+          prop="userAgent"
           label="登入设备"
-          :show-overflow-tooltip="true"
-        >
-          <template slot-scope="scope">
-            <el-tooltip
-              v-if="scope.row.description"
-              :content="scope.row.description"
-              raw-content
-              placement="top-start"
-            >
-              <span v-if="scope.row.description && scope.row.description.length <= 15">
-                {{ scope.row.description }}
-              </span>
-              <span v-if="scope.row.description && scope.row.description.length > 15">
-                {{ scope.row.description.substr(0, 15) + "..." }}
-              </span>
-            </el-tooltip>
-            <span v-else-if="scope.row.description === null">-</span>
-          </template>
-        </el-table-column>
+        />
         <el-table-column
-          prop="duration"
+          prop="status"
           label="状态"
         />
         <el-table-column
@@ -85,163 +42,57 @@
         >
           <template slot-scope="scope">
             <el-button
+              type="danger"
               size="mini"
-              @click="handleEdit(scope.$index, scope.row)"
+              @click="handleLogout(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-select>
-        </div>
-      </el-card>
-    </el-dialog>
-    <!-- 视频预览对话框 -->
-    <el-dialog
-      title="预览视频"
-      append-to-body
-      :visible.sync="showPreviewDialog"
-      :before-close="handleDialogClose"
-      width="70%"
-      center
-    >
-      <template>
-        <video-preview-player :video-prop.sync="videoProp" />
-      </template>
-    </el-dialog>
   </el-container>
 </template>
 
 <script>
-import VideoPreviewPlayer from 'components/VideoPreviewPlayer'
-import { updateVideoScope, videoInfo } from '@/api/video'
-import { getVideoList } from '@/api/admin'
+import { getAccountLoginRecord } from '@/api/devops'
 
 export default {
-  name: 'VideoPost',
-  components: { VideoPreviewPlayer },
+  name: 'UserLogin',
   data() {
     return {
-      queryInfo: {
-        scope: null,
-        pn: 1
-      },
-      // 屏幕宽度, 为了控制分页条的大小
-      screenWidth: document.body.clientWidth,
-      currentPage: 1,
-      pageSize: 10,
-      totalSize: 0,
-      dataList: [],
-      nextId: 0,
-      // **********************************************************************
-      videoProp: null,
-      showVideoResourceDialog: false,
-      showEditScopeDialog: false,
-      showPreviewDialog: false,
-      form: {
-        videoId: null,
-        scope: 1
-      },
-      videoResources: [],
-      publishVideoDiaglog: false
+      dataList: []
     }
   },
   created() {
-    document.title = 'AdminVideoList'
+    document.title = '登入记录'
     this.getData()
   },
   methods: {
-    handleCurrentChange(pageNumber) {
-      this.currentPage = pageNumber
-      this.getData()
-      // 回到顶部
-      scrollTo(0, 0)
-    },
     getData() {
       this.dataList = []
-      getVideoList(0).then(resp => {
+      getAccountLoginRecord().then(resp => {
         if (resp.code === 0) {
-          const respData = resp.data
-          this.dataList = respData.list
-          this.totalSize = respData.totalSize
+          this.dataList = resp.data
         } else {
           this.$message.error(resp.msg)
         }
       })
     },
-    onRefresh() {
-      this.getData()
-    },
-    handleScope(index, row) {
-      this.form.videoId = row.videoId
-      this.form.scope = '' + row.scope
-      this.showEditScopeDialog = true
-    },
-    handleDialogClose(done) {
-      this.showPreviewDialog = false
-      this.videoProp = {
-        videoId: null,
-        play: false
-      }
-      done()
-    },
-    handlePreview(index, row) {
-      videoInfo(row.videoId).then(res => {
-        if (res.code === 0) {
-          this.showPreviewDialog = true
-          this.videoProp = {
-            videoId: res.data.videoId,
-            play: true
-          }
-        }
-      })
-    },
-    handleEdit(index, row) {
-      const path = '/post/video/edit/' + row.videoId
-      this.$router.push(path)
-    },
-    onUpdateScope() {
-      this.showEditScopeDialog = false
-      updateVideoScope(this.form).then(res => {
-        if (res.code === 0) {
-          this.$notify({
-            title: '提示',
-            message: '视频可见范围已更新',
-            type: 'warning',
-            duration: 3000
-          })
-        }
-      }).catch(error => {
-        this.$notify({
-          title: '提示',
-          message: error.message,
-          type: 'warning',
-          duration: 3000
+    handleLogout(index, row) {
+      this.$confirm('确定要登出该设备?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        const formData = new FormData()
+        formData.append('appId', row.appId)
+        this.$message.info('logout')
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '已取消'
         })
       })
-    },
-    onSelectChange() {
-      this.$message.info(this.queryInfo)
-    },
-    handleClose() {
     }
   }
 }

+ 40 - 120
src/views/devops/user/UserMessage.vue

@@ -16,31 +16,13 @@
           type="index"
         />
         <el-table-column
-          prop="pubDate"
+          prop="createTime"
           label="时间"
-          width="150"
         />
         <el-table-column
           prop="title"
           label="标题"
-          :show-overflow-tooltip="true"
-        >
-          <template slot-scope="scope">
-            <el-tooltip
-              v-if="scope.row.title"
-              :content="scope.row.title"
-              raw-content
-              placement="top-start"
-            >
-              <span v-if="scope.row.title.length <= 15">
-                {{ scope.row.title }}
-              </span>
-              <span v-else>
-                {{ scope.row.title.substr(0, 15) + "..." }}
-              </span>
-            </el-tooltip>
-          </template>
-        </el-table-column>
+        />
         <el-table-column
           fixed="right"
           label="操作"
@@ -48,12 +30,15 @@
         >
           <template slot-scope="scope">
             <el-button
+              style="margin-top: 5px; margin-left: 5px"
               size="mini"
-              @click="handlePreview(scope.$index, scope.row)"
+              @click="handleEdit(scope.$index, scope.row)"
             >查看</el-button>
             <el-button
+              style="margin-top: 5px; margin-left: 5px"
               size="mini"
-              @click="handleEdit(scope.$index, scope.row)"
+              type="danger"
+              @click="handleDelete(scope.$index, scope.row)"
             >删除</el-button>
           </template>
         </el-table-column>
@@ -71,55 +56,27 @@
       />
     </el-main>
 
-    <!-- 修改视频可见范围对话框 -->
     <el-dialog
+      title="消息内容"
       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-select>
-        </div>
-      </el-card>
-    </el-dialog>
-    <!-- 视频预览对话框 -->
-    <el-dialog
-      title="预览视频"
-      append-to-body
-      :visible.sync="showPreviewDialog"
-      :before-close="handleDialogClose"
-      width="70%"
+      :visible.sync="showContentDialog"
       center
     >
       <template>
-        <video-preview-player :video-prop.sync="videoProp" />
+        <span v-if="message !== null">{{ message.content }}</span>
       </template>
     </el-dialog>
   </el-container>
 </template>
 
 <script>
-import VideoPreviewPlayer from 'components/VideoPreviewPlayer'
-import { updateVideoScope, videoInfo } from '@/api/video'
-import { getVideoList } from '@/api/admin'
+import { getAccountMessage } from '@/api/devops'
 
 export default {
-  name: 'VideoPost',
-  components: { VideoPreviewPlayer },
+  name: 'UserMessage',
   data() {
     return {
       queryInfo: {
-        scope: null,
         pn: 1
       },
       // 屏幕宽度, 为了控制分页条的大小
@@ -128,34 +85,35 @@ export default {
       pageSize: 10,
       totalSize: 0,
       dataList: [],
-      nextId: 0,
       // **********************************************************************
-      videoProp: null,
-      showVideoResourceDialog: false,
-      showEditScopeDialog: false,
-      showPreviewDialog: false,
-      form: {
-        videoId: null,
-        scope: 1
-      },
-      videoResources: [],
-      publishVideoDiaglog: false
+      showContentDialog: false,
+      message: null
     }
   },
   created() {
-    document.title = 'AdminVideoList'
+    const pageNumber = this.$route.query.pn
+    if (pageNumber !== undefined && pageNumber !== null) {
+      this.currentPage = parseInt(pageNumber)
+      this.queryInfo.pn = parseInt(pageNumber)
+    }
+
+    document.title = '我的消息'
     this.getData()
   },
   methods: {
     handleCurrentChange(pageNumber) {
-      this.currentPage = pageNumber
+      this.queryInfo.pn = pageNumber
+      this.$router.push({
+        path: '/devops/user/message',
+        query: this.queryInfo
+      })
       this.getData()
       // 回到顶部
       scrollTo(0, 0)
     },
     getData() {
       this.dataList = []
-      getVideoList(0).then(resp => {
+      getAccountMessage(this.queryInfo).then(resp => {
         if (resp.code === 0) {
           const respData = resp.data
           this.dataList = respData.list
@@ -163,63 +121,25 @@ export default {
         } else {
           this.$message.error(resp.msg)
         }
-      })
-    },
-    onRefresh() {
-      this.getData()
-    },
-    handleScope(index, row) {
-      this.form.videoId = row.videoId
-      this.form.scope = '' + row.scope
-      this.showEditScopeDialog = true
-    },
-    handleDialogClose(done) {
-      this.showPreviewDialog = false
-      this.videoProp = {
-        videoId: null,
-        play: false
-      }
-      done()
-    },
-    handlePreview(index, row) {
-      videoInfo(row.videoId).then(res => {
-        if (res.code === 0) {
-          this.showPreviewDialog = true
-          this.videoProp = {
-            videoId: res.data.videoId,
-            play: true
-          }
-        }
+      }).catch(error => {
+        this.$message.error(error.message)
       })
     },
     handleEdit(index, row) {
-      const path = '/post/video/edit/' + row.videoId
-      this.$router.push(path)
+      this.message = row
+      this.showContentDialog = true
     },
-    onUpdateScope() {
-      this.showEditScopeDialog = false
-      updateVideoScope(this.form).then(res => {
-        if (res.code === 0) {
-          this.$notify({
-            title: '提示',
-            message: '视频可见范围已更新',
-            type: 'warning',
-            duration: 3000
-          })
+    handleDelete(index, row) {
+      this.$message.info('delete message')
+      /* addAppConfig().then(resp => {
+        if (resp.code === 0) {
+          this.getData()
+        } else {
+          this.$message.info(resp.msg)
         }
       }).catch(error => {
-        this.$notify({
-          title: '提示',
-          message: error.message,
-          type: 'warning',
-          duration: 3000
-        })
-      })
-    },
-    onSelectChange() {
-      this.$message.info(this.queryInfo)
-    },
-    handleClose() {
+        this.$message.error(error.message)
+      })*/
     }
   }
 }

+ 43 - 120
src/views/devops/user/UserProfile.vue

@@ -4,157 +4,80 @@
       <h3>个人资料</h3>
     </el-header>
     <el-main>
+      <el-row>
+        <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-form v-if="loginUser !== null" ref="form" :model="loginUser" label-width="80px">
+                  <el-form-item label="用户 ID">
+                    <el-input v-model="loginUser.userId" style="width: 70%; padding-right: 10px" readonly />
+                  </el-form-item>
+                  <el-form-item label="用户名">
+                    <el-input v-model="loginUser.username" style="width: 70%; padding-right: 10px" readonly />
+                  </el-form-item>
+<!--                  <el-form-item label="显示名">
+                    <el-input v-model="loginUser.screenName" style="width: 70%; padding-right: 10px" readonly />
+                  </el-form-item>
+                  <el-form-item label="手机">
+                    <el-input v-model="loginUser.mobile" style="width: 70%; padding-right: 10px" readonly />
+                    <el-button size="mini" type="info" @click="showUpdateDialog(1)">更新</el-button>
+                  </el-form-item>
+                  <el-form-item label="密码">
+                    <el-input v-model="loginUser.mobile" style="width: 70%; padding-right: 10px" readonly />
+                    <el-button size="mini" type="info" @click="showUpdateDialog(2)">更新</el-button>
+                  </el-form-item>-->
+                </el-form>
+              </div>
+            </el-card>
+          </el-row>
+        </el-col>
+      </el-row>
     </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-select>
-        </div>
-      </el-card>
-    </el-dialog>
-    <!-- 视频预览对话框 -->
-    <el-dialog
-      title="预览视频"
-      append-to-body
-      :visible.sync="showPreviewDialog"
-      :before-close="handleDialogClose"
-      width="70%"
-      center
-    >
-      <template>
-        <video-preview-player :video-prop.sync="videoProp" />
-      </template>
     </el-dialog>
   </el-container>
 </template>
 
 <script>
-import VideoPreviewPlayer from 'components/VideoPreviewPlayer'
-import { updateVideoScope, videoInfo } from '@/api/video'
-import { getVideoList } from '@/api/admin'
+import { updateVideoScope } from '@/api/video'
+import { getAuthedUser } from '@/utils/auth'
 
 export default {
-  name: 'VideoPost',
-  components: { VideoPreviewPlayer },
+  name: 'UserProfile',
   data() {
     return {
-      queryInfo: {
-        scope: null,
-        pn: 1
-      },
-      // 屏幕宽度, 为了控制分页条的大小
-      screenWidth: document.body.clientWidth,
-      currentPage: 1,
-      pageSize: 10,
-      totalSize: 0,
-      dataList: [],
-      nextId: 0,
-      // **********************************************************************
-      videoProp: null,
-      showVideoResourceDialog: false,
       showEditScopeDialog: false,
-      showPreviewDialog: false,
-      form: {
-        videoId: null,
-        scope: 1
-      },
-      videoResources: [],
-      publishVideoDiaglog: false
+      loginUser: null
     }
   },
+  mounted() {
+    this.loginUser = getAuthedUser()
+  },
   created() {
-    document.title = 'AdminVideoList'
-    this.getData()
+    document.title = '我的'
   },
   methods: {
-    handleCurrentChange(pageNumber) {
-      this.currentPage = pageNumber
-      this.getData()
-      // 回到顶部
-      scrollTo(0, 0)
-    },
-    getData() {
-      this.dataList = []
-      getVideoList(0).then(resp => {
-        if (resp.code === 0) {
-          const respData = resp.data
-          this.dataList = respData.list
-          this.totalSize = respData.totalSize
-        } else {
-          this.$message.error(resp.msg)
-        }
-      })
-    },
-    onRefresh() {
-      this.getData()
-    },
     handleScope(index, row) {
       this.form.videoId = row.videoId
       this.form.scope = '' + row.scope
       this.showEditScopeDialog = true
     },
-    handleDialogClose(done) {
-      this.showPreviewDialog = false
-      this.videoProp = {
-        videoId: null,
-        play: false
-      }
-      done()
-    },
-    handlePreview(index, row) {
-      videoInfo(row.videoId).then(res => {
-        if (res.code === 0) {
-          this.showPreviewDialog = true
-          this.videoProp = {
-            videoId: res.data.videoId,
-            play: true
-          }
-        }
-      })
-    },
-    handleEdit(index, row) {
-      const path = '/post/video/edit/' + row.videoId
-      this.$router.push(path)
-    },
     onUpdateScope() {
       this.showEditScopeDialog = false
-      updateVideoScope(this.form).then(res => {
-        if (res.code === 0) {
-          this.$notify({
-            title: '提示',
-            message: '视频可见范围已更新',
-            type: 'warning',
-            duration: 3000
-          })
-        }
+      updateVideoScope().then(resp => {
+        this.$message.info(resp.msg)
       }).catch(error => {
-        this.$notify({
-          title: '提示',
-          message: error.message,
-          type: 'warning',
-          duration: 3000
-        })
+        this.$message.error(error.message)
       })
-    },
-    onSelectChange() {
-      this.$message.info(this.queryInfo)
-    },
-    handleClose() {
     }
   }
 }

+ 0 - 5
src/views/my/MyProfile.vue

@@ -183,7 +183,6 @@ import { userMixin } from 'assets/js/mixin'
 import { updateAvatar } from '@/api/account'
 import { getAuthedUser, updateAuthedUser } from '@/utils/auth'
 import { getAvatarChannelInfo } from '@/api/file'
-import { getBlogPosts } from '@/api/devops'
 
 export default {
   name: 'MyProfile',
@@ -224,10 +223,6 @@ export default {
   },
   created() {
     this.loginUser = getAuthedUser()
-    getBlogPosts().then(resp => {
-      console.log(resp.data)
-    })
-
     getAvatarChannelInfo().then(res => {
       if (res.code === 0) {
         const resData = res.data