Browse Source

Merge branch 'master' of http://git.zhiqiyun.com/liucheng/open-platform-admin-ui

stjdydayou 3 năm trước cách đây
mục cha
commit
5c54eb46bd

+ 2 - 0
.env.development

@@ -3,3 +3,5 @@ ENV = 'development'
 
 # base api
 VUE_APP_BASE_API = 'http://127.0.0.1:9800'
+
+VUE_UNIFIED_LOGIN_URL = 'http://smartcity-dev.123cx.com/login'

+ 3 - 0
.env.production

@@ -4,3 +4,6 @@ ENV = 'production'
 # base api
 VUE_APP_BASE_API = ''
 
+#unified login url
+VUE_UNIFIED_LOGIN_URL = ''
+

+ 2 - 0
.env.staging

@@ -6,3 +6,5 @@ ENV = 'staging'
 # base api
 VUE_APP_BASE_API = '/stage-api'
 
+#unified login url
+VUE_UNIFIED_LOGIN_URL = ''

+ 1 - 0
package.json

@@ -22,6 +22,7 @@
     "nprogress": "0.2.0",
     "path-to-regexp": "2.4.0",
     "vue": "2.6.10",
+    "vue-cookies": "^1.8.1",
     "vue-count-to": "^1.0.13",
     "vue-router": "3.0.6",
     "vuex": "3.1.0"

+ 34 - 0
src/api/bz.js

@@ -0,0 +1,34 @@
+import request from '@/utils/request'
+
+export function findMediaPage(data) {
+  return request({
+    url: '/bz/findMediaPage',
+    method: 'post',
+    data
+  })
+}
+
+export function saveMedia(data) {
+  return request({
+    url: '/bz/saveMedia',
+    method: 'post',
+    data
+  })
+}
+
+export function updateMediaId(id, data) {
+  return request({
+    url: '/bz/updateMediaId',
+    method: 'post',
+    params: { id },
+    data
+  })
+}
+
+export function deleteMediaByIds(ids) {
+  return request({
+    url: '/bz/deleteMediaByIds',
+    method: 'post',
+    data: ids
+  })
+}

+ 3 - 0
src/main.js

@@ -18,6 +18,9 @@ import '@/permission' // permission control
 import PermissionDirective from '@/permission/directive/index.js' // 权限判断指令
 Vue.use(PermissionDirective)
 
+import VueCookies from 'vue-cookies';
+Vue.use(VueCookies)
+
 // set ElementUI lang to EN
 Vue.use(ElementUI, { locale })
 // 如果想要中文版 element-ui,按如下方式声明

+ 21 - 6
src/permission.js

@@ -4,12 +4,15 @@ import { Message } from 'element-ui'
 import NProgress from 'nprogress' // progress bar
 import 'nprogress/nprogress.css' // progress bar style
 import getPageTitle from '@/utils/get-page-title'
+import cookies from 'vue-cookies';
 
 NProgress.configure({ showSpinner: false }) // NProgress Configuration
 
 const whiteList = ['/login', '/api/docs'] // no redirect whitelist
+// const loginUrl = 'development' === process.env.NODE_ENV ? '/login' : 'http://smartcity-dev.123cx.com/login';
+const loginUrl = '/login';
 
-router.beforeEach(async(to, from, next) => {
+router.beforeEach(async (to, from, next) => {
   // start progress bar
   NProgress.start()
 
@@ -18,8 +21,8 @@ router.beforeEach(async(to, from, next) => {
 
   // determine whether the user has logged in
   // const hasToken = getToken()
-  const accessToken = localStorage.getItem('x-access-token') || undefined
-
+  // const accessToken = localStorage.getItem('x-access-token') || undefined
+  const accessToken = cookies.get('saber-access-token') || undefined
   if (accessToken) {
     if (to.path === '/login') {
       // if is logged in, redirect to the home page
@@ -40,7 +43,11 @@ router.beforeEach(async(to, from, next) => {
           // remove token and go to login page to re-login
           await store.dispatch('user/resetToken')
           Message.error(error || 'Has Error')
-          next(`/login?redirect=${to.path}`)
+          // if ('development' === process.env.NODE_ENV) {
+            next(`/login?redirect=${to.path}`)
+          // } else {
+            // window.location.href = loginUrl;
+          // }
           NProgress.done()
         }
       }
@@ -49,10 +56,18 @@ router.beforeEach(async(to, from, next) => {
     /* has no token*/
     if (whiteList.indexOf(to.path) !== -1) {
       // in the free login whitelist, go directly
-      next()
+      // if (to.path === '/login' && 'development' !== process.env.NODE_ENV) {
+        // window.location.href = loginUrl;
+      // } else {
+        next()
+      // }
     } else {
       // other pages that do not have permission to access are redirected to the login page.
-      next(`/login?redirect=${to.path}`)
+      // if ('development' === process.env.NODE_ENV) {
+        next(`/login?redirect=${to.path}`)
+      // } else {
+        // window.location.href = loginUrl;
+      // }
       NProgress.done()
     }
   }

+ 6 - 6
src/router/index.js

@@ -152,38 +152,38 @@ export const asyncRoutes = [
     path: '/bz',
     component: Layout,
     name: 'Bz',
-    meta: { title: '业务数据展示系统', icon: 'el-icon-help', authorities: ['app.key.find', 'app.key.request.logs'] },
+    meta: { title: '业务数据展示系统', icon: 'el-icon-help', authorities: ['bz.media', 'bz.monitor', 'bz.consume', 'bz.resourceAnalysis', 'bz.touristAnalysis'] },
     redirect: '/bz/media',
     children: [
       {
         path: 'media',
         name: 'BzMedia',
         component: () => import('@/views/bz/media'),
-        meta: { title: '多媒体资源管理', authorities: ['app.key.find'] }
+        meta: { title: '多媒体资源管理', authorities: ['bz.media'] }
       },
       {
         path: 'monitor',
         name: 'BzMonitor',
         component: () => import('@/views/bz/monitor'),
-        meta: { title: '实时监测', authorities: ['app.key.request.logs'] }
+        meta: { title: '实时监测', authorities: ['bz.monitor'] }
       },
       {
         path: 'consume',
         name: 'BzConsume',
         component: () => import('@/views/bz/consume'),
-        meta: { title: '文旅消费', authorities: ['app.key.request.logs'] }
+        meta: { title: '文旅消费', authorities: ['bz.consume'] }
       },
       {
         path: 'resourceAnalysis',
         name: 'BzResourceAnalysis',
         component: () => import('@/views/bz/resourceAnalysis'),
-        meta: { title: '文旅资源分析', authorities: ['app.key.request.logs'] }
+        meta: { title: '文旅资源分析', authorities: ['bz.resourceAnalysis'] }
       },
       {
         path: 'touristAnalysis',
         name: 'BzTouristAnalysis',
         component: () => import('@/views/bz/touristAnalysis'),
-        meta: { title: '游客分析', authorities: ['app.key.request.logs'] }
+        meta: { title: '游客分析', authorities: ['bz.touristAnalysis'] }
       }
     ]
   },

+ 12 - 0
src/store/modules/user.js

@@ -1,5 +1,9 @@
 import { login, getOauthInfo, loginOut } from '@/api/oauth'
 import { resetRouter } from '@/router'
+import cookies from 'vue-cookies';
+
+const domian = 'development' === process.env.NODE_ENV ? '127.0.0.1' : '.123cx.com';
+const expires = 60 * 60 * 24 * 7;
 
 const getDefaultState = () => {
   return {
@@ -26,6 +30,10 @@ const actions = {
     return new Promise((resolve, reject) => {
       login({ loginAccount: username.trim(), loginPassword: password, captcha, token }).then(data => {
         localStorage.setItem('x-access-token', data.accessToken || '')
+        sessionStorage.setItem('saber-access-token', data.accessToken);
+        sessionStorage.setItem('saber-refresh-token', data.refreshToken);
+        cookies.set('saber-access-token', data.accessToken, expires, '/', domian);
+        cookies.set('saber-refresh-token', data.refreshToken, expires, '/', domian)
         resolve()
       }).catch(error => {
         reject(error)
@@ -54,6 +62,10 @@ const actions = {
     return new Promise((resolve, reject) => {
       loginOut().then(() => {
         localStorage.removeItem('x-access-token')
+        sessionStorage.removeItem('saber-access-token');
+        sessionStorage.removeItem('saber-refresh-token');
+        cookies.set('saber-access-token', '', expires, '/', domian);
+        cookies.set('saber-refresh-token', '', expires, '/', domian)
         resetRouter()
         commit('RESET_STATE')
         resolve()

+ 1 - 0
src/styles/index.scss

@@ -207,6 +207,7 @@ div:focus {
 
   .image {
     height: 40px;
+    width: 40px;
     margin-top: 20px;
     margin-left: 10px;
   }

+ 3 - 1
src/utils/request.js

@@ -1,6 +1,7 @@
 import axios from 'axios'
 import { Message } from 'element-ui'
 import router from '@/router'
+import cookies from 'vue-cookies';
 
 // create an axios instance
 const service = axios.create({
@@ -11,7 +12,8 @@ const service = axios.create({
 
 service.interceptors.request.use(
   config => {
-    const accessToken = localStorage.getItem('x-access-token') || ''
+    // const accessToken = localStorage.getItem('x-access-token') || ''
+    const accessToken = cookies.get('saber-access-token') || ''
     if (accessToken) {
       config.headers['x-access-token'] = accessToken
     }

+ 82 - 0
src/views/bz/media/DialogForm.vue

@@ -0,0 +1,82 @@
+<template>
+  <el-dialog
+    v-if="visible"
+    :title="form.id?'编辑多媒体资源':'新建多媒体资源'"
+    :visible.sync="visible"
+  >
+    <el-form v-loading="isLoading" :model="form" label-width="100px" label-position="top">
+
+      <el-form-item label="场所类型">
+        <el-select v-model="form.categoryId" placeholder="请选择场所类型" clearable>
+          <el-option v-for="item in listDataType" :key="item.id" :label="item.name" :value="item.id" />
+        </el-select>
+      </el-form-item>
+
+      <el-row :gutter="24">
+        <el-col :span="12">
+          <el-form-item label="场所名称">
+            <el-input v-model="form.name" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <el-form-item label="地址">
+        <el-input v-model="form.address" />
+      </el-form-item>
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button @click="visible = false">取 消</el-button>
+      <el-button type="primary" @click="handleSubmit">确 定</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+
+import { findAllDataType } from '@/api/place/base_info'
+import { saveMedia, updateMediaId } from '@/api/bz'
+
+export default {
+  data() {
+    return {
+      visible: false,
+      isLoading: false,
+      listDataType: [],
+      form: {}
+    }
+  },
+  mounted() {
+  },
+  methods: {
+    open(data) {
+      this.visible = true
+      this.isLoading = false
+      this.listDataType = []
+      this.form = Object.assign({}, data)
+
+      findAllDataType().then(listDataType => {
+        this.listDataType = listDataType
+      })
+    },
+    handleSubmit() {
+      console.log(this.form)
+      this.isLoading = true
+      if (this.form.id) {
+        updateMediaId(this.form.id, this.form).then(() => {
+          this.visible = false
+          this.$emit('ok')
+        }).finally(() => {
+          this.isLoading = false
+        })
+      } else {
+        saveMedia(this.form).then(res => {
+          this.visible = false
+          this.$emit('ok')
+        }).finally(() => {
+          this.isLoading = false
+        })
+      }
+    }
+  }
+}
+</script>

+ 67 - 8
src/views/bz/media/index.vue

@@ -5,12 +5,23 @@
         <el-input v-model="queryForm.name" placeholder="名称" />
       </el-form-item>
       <el-form-item label="类型">
-        <el-select v-model="queryForm.isEnable" clearable placeholder="用户状态">
-          <el-option label="是" value="Y" />
-          <el-option label="否" value="N" />
+        <el-select v-model="queryForm.categoryId" placeholder="请选择场所类型" clearable>
+          <el-option v-for="item in listDataType" :key="item.id" :label="item.name" :value="item.id" />
         </el-select>
       </el-form-item>
     </el-form>
+
+    <el-row class="action-bar-container" type="flex" justify="end">
+      <el-button type="primary" size="small" @click.native="fetchData">查询</el-button>
+      <el-button-group>
+        <el-button size="small" @click.native="$refs.dialogForm.open({})">
+          新建
+        </el-button>
+        <el-button size="small" @click.native="deleteByIds(multipleSelection)">
+          删除
+        </el-button>
+      </el-button-group>
+    </el-row>
     <el-table
       v-loading="isLoading"
       :data="pageData.records"
@@ -20,9 +31,15 @@
       @selection-change="selectionChange"
     >
       <el-table-column type="selection" width="55" />
-      <el-table-column label="名称" prop="id" width="150" />
-      <el-table-column label="地址" prop="name" />
-      <el-table-column label="类型" prop="publicKey" width="150" />
+      <el-table-column label="#" prop="id" width="150" />
+      <el-table-column label="名称" prop="name" />
+      <el-table-column label="地址" prop="address" />
+      <el-table-column label="类型" prop="category.name" width="150" />
+      <el-table-column label="操作" width="70" fixed="right">
+        <template slot-scope="scope">
+          <el-button type="text" @click.native="$refs.dialogForm.open(scope.row)">编辑</el-button>
+        </template>
+      </el-table-column>
     </el-table>
 
     <el-pagination
@@ -33,28 +50,70 @@
       :page-size="pageData.pageSize"
       @current-change="paginationChange"
     />
+    <dialog-form ref="dialogForm" @ok="fetchData" />
   </div>
+
 </template>
 
 <script>
 
+import { findAllDataType } from '@/api/place/base_info'
+import { deleteMediaByIds, findMediaPage } from '@/api/bz'
+import DialogForm from './DialogForm'
+
 export default {
-  components: {},
+  components: {
+    DialogForm
+  },
   data() {
     return {
+      isLoading: true,
       queryForm: {},
-      pageData: {}
+      pageData: {},
+      listDataType: [],
+      multipleSelection: []
     }
   },
   computed: {},
   created() {
   },
   mounted() {
+    this.fetchData()
+    findAllDataType().then(listDataType => {
+      this.listDataType = listDataType
+    })
   },
   methods: {
+
+    deleteByIds(ids) {
+      this.$confirm('确认要删除吗?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        deleteMediaByIds(ids).then(() => {
+          this.fetchData()
+        })
+      })
+    },
+    fetchData() {
+      this.isLoading = true
+      findMediaPage({ ...this.queryForm, current: this.currentPage })
+        .then((response) => {
+          this.pageData = response
+        })
+        .finally(() => (this.isLoading = false))
+    },
     paginationChange(val) {
       this.currentPage = val
       this.fetchData()
+    },
+    selectionChange(val) {
+      const temp = []
+      val.forEach(o => {
+        temp.push(o.id)
+      })
+      this.multipleSelection = temp
     }
   }
 }

+ 9 - 1
src/views/place/category/DialogForm.vue

@@ -11,7 +11,15 @@
           <el-form-item label="物务类型名称">
             <el-input v-model="form.name" />
           </el-form-item>
-
+          <el-form-item label="展示状态">
+             <el-radio-group v-model="form.isShow">
+              <el-radio :label="0">不展示</el-radio>
+              <el-radio :label="1">展示</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item label="编码">
+            <el-input v-model="form.categoryId"/>
+          </el-form-item>
           <el-form-item label="排序">
             <el-input-number v-model="form.sortNumber" :min="0" />
           </el-form-item>

+ 5 - 0
src/views/place/category/index.vue

@@ -30,6 +30,11 @@
       <el-table-column label="分类名称" prop="name" width="200" />
       <el-table-column label="排序" prop="sortNumber" width="100" />
       <el-table-column label="备注说明" prop="remark" min-width="300" />
+      <el-table-column label="展示状态" prop="isShow" width="100" >
+         <template slot-scope="scope">
+          {{scope.row.isShow === 1 ? '展示' : '不展示'}}
+         </template>
+      </el-table-column>
       <el-table-column label="创建时间" prop="createdTime" :formatter="dateTimeFormatter" width="180" />
       <el-table-column label="操作" width="150" fixed="right">
         <template slot-scope="scope">