whychdw
2020-10-12 a9f86cabcb042fd4e4ce026bb189ba2fb0d4d3e3
内容提交
4个文件已添加
11个文件已修改
456 ■■■■ 已修改文件
VERSION.md 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/js/apis/userMager/powerMager.js 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/js/axios.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/js/tools/index.js 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/js/tools/isHasPermit.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/PageMenu.vue 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/home.vue 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/jobManage/planManage.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/login.vue 206 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/routes.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/index.js 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/modules/user.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目需求.md 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VERSION.md
@@ -40,4 +40,9 @@
|  |--操作记录管理
|--系统界面设置
|  |--实时监测配置
```
```
#### V2.1.1
##### 1.首页地图开放添加,删除站点的功能。
##### 2.添加限制用户唯一登录的限制
##### 3.根据权限内容显示页面和开放页面功能
##### 4.修复一些儿已知的bug
package.json
@@ -1,6 +1,6 @@
{
  "name": "admin_manage",
  "version": "2.1.0",
  "version": "2.1.1",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve --mode dev",
@@ -19,7 +19,8 @@
    "vue-jsonp": "^0.1.8",
    "vue-layer": "^1.2.0",
    "vue-router": "^3.4.3",
    "vuejs-progress-bar": "^1.2.2"
    "vuejs-progress-bar": "^1.2.2",
    "vuex": "^3.5.1"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "^4.5.0",
src/assets/js/apis/userMager/powerMager.js
@@ -101,5 +101,16 @@
            url: 'User_permitgroup_dataAction!batchDelete',
            data: "json="+JSON.stringify(data)
        });
    },
    /**
     * æŸ¥è¯¢å½“前用户的权限
     * æ— å‚
     */
    getPermits() {
        return axios({
            method: 'post',
            url: 'User_permitgroupAction!getPermit',
            data: null
        });
    }
}
src/assets/js/axios.js
@@ -2,10 +2,11 @@
import axios from 'axios';
if(process.env.NODE_ENV == 'dev') {
    // è·¨åŸŸè¯·æ±‚
    axios.defaults.baseURL = 'http://127.0.0.1:8919/fg/';
    axios.defaults.baseURL = 'http://localhost:8919/fg/';
    axios.defaults.withCredentials = true;  // ä¿æŒè¯·æ±‚头
}
// axios.defaults.withCredentials = true;
// æ·»åŠ è¯·æ±‚æ‹¦æˆªå™¨
axios.interceptors.request.use(function (config) {
src/assets/js/tools/index.js
@@ -11,6 +11,7 @@
import testVal from './testVal'
import LinkagePlus from './LinkagePlus'
import extend from './extend'
import isHasPermit from "@/assets/js/tools/isHasPermit";
export {
    formatSeconds,
@@ -25,5 +26,6 @@
    getBarNum,
    testVal,
    LinkagePlus,
    extend
    extend,
    isHasPermit
}
src/assets/js/tools/isHasPermit.js
New file
@@ -0,0 +1,19 @@
/**
 * æ ¡éªŒæƒé™åæ˜¯å¦æœ‰æ•ˆ
 * @param permitName    æƒé™åç§°
 * @param permitList    æƒé™åˆ—表
 * @returns {boolean}   æŸ¥è¯¢ç»“æžœ
 */
function isHasPermit(permitName, permitList) {
    let result = false;
    // éåŽ†å…¨æ–°å•Š
    for(let i=0; i<permitList.length; i++) {
        let permit = permitList[i];
        if(permit.permit_item_name === permitName && permit.permit_item_value === 1) {
            result = true;
            break;
        }
    }
    return result;
}
export default isHasPermit;
src/components/PageMenu.vue
@@ -1,6 +1,6 @@
<template>
    <el-menu :default-active="acTabs">
        <template v-for="menu in menus">
        <template v-for="menu in permitMenu">
            <el-submenu v-if="menu.childrens" :key="menu.name" :index="menu.name">
                <template slot="title">
                    <i v-if="menu.icon" :class="menu.icon"></i>
@@ -22,6 +22,8 @@
</template>
<script>
import {isHasPermit} from "@/assets/js/tools";
export default {
    props: {
        acTabs: {
@@ -37,7 +39,8 @@
                    name: "index",
                    src: "#/index",
                    icon: "el-icon-s-home",
                    closable: false
                    noChild: true,
                    closable: false,
                },
                {
                    label: "测试数据",
@@ -83,18 +86,21 @@
                            label: "电池信息配置",
                            name: "battGroupMager",
                            src: "#/dataMager/battGroupMager",
                            permitName: 'batttest_data_query_permit',
                            closable: true
                        },
                        {
                            label: "线程信息管理",
                            name: 'threadMager',
                            src: '#/dataMager/threadMager',
                            permitName: 'batttest_data_query_permit',
                            closable: true,
                        },
                        {
                            label: "机房停电查询",
                            name: "powercutMager",
                            src: "#/dataMager/powercut",
                            permitName: 'batttest_data_query_permit',
                            closable: true
                        },
                        // {
@@ -113,6 +119,7 @@
                            label: "电池关注管理",
                            name: "batteryMager",
                            src: "#/batteryMager",
                            permitName: 'batttest_data_query_permit',
                            closable: true
                        }
                    ]
@@ -163,6 +170,21 @@
                    ]
                },
                {
                    label: "作业管理",
                    name: "jobManage",
                    src: "",
                    icon: "el-icon-s-cooperation",
                    closable: false,
                    childrens: [
                        {
                            label: "放电计划管理",
                            name: "planManage",
                            src: "#/jobManage/planManage",
                            closable: true
                        },
                    ],
                },
                {
                    label: "用户管理",
                    name: "userMager",
                    src: "",
@@ -196,6 +218,36 @@
                    ]
                },
                {
                    label: "大屏数据监控",
                    name: "bigScreen",
                    src: "",
                    icon: "el-icon-s-platform",
                    closable: false,
                    childrens: [
                        {
                            label: "实时监测配置",
                            name: "bigScreenSetting",
                            src: "#/",
                            target: true,
                            closable: true
                        },
                        {
                            label: "电池系统监控",
                            name: "bigScreenBatt",
                            src: "#/screen",
                            target: true,
                            closable: true
                        },
                        {
                            label: "电源系统监控",
                            name: "bigScreenEle",
                            src: "#/screen2",
                            target: true,
                            closable: true
                        },
                    ]
                },
                {
                    label: "系统界面设置",
                    name: "systemPageSetting",
                    src: "",
@@ -216,11 +268,52 @@
    methods: {
        select(data) {
            if (data.name !== this.acTabs) {
                let url = 'big-screen/index.html';
                if(process.env.NODE_ENV == 'dev') {
                    url = " http://localhost:8081/"
                }
                // æ ¹æ®æ•°æ®è·³è½¬
                if(data.target) {
                    window.open(url+data.src);
                    return;
                }
                this.$emit("select", data);
            } else {
                console.log("菜单已激活");
            }
        }
        },
    },
    computed: {
        permitMenu() {
            let permits = this.$store.state.user.permits;
            let menus = this.menus.map(item=>{
                let tmp = {
                    label: item.label,
                    name: item.name,
                    src: item.src,
                    icon: item.icon,
                    noChild: item.noChild?true:false,
                    closable: item.closable,
                };
                if(!tmp.noChild) {
                    tmp.childrens = item.childrens.filter(child=>{
                        if(child.permitName) {
                            return isHasPermit(child.permitName, permits);
                        }else {
                            return true;
                        }
                    });
                }
                return tmp;
            });
            return menus.filter(item=>{
                return item.noChild || item.childrens.length>0;
            });
        },
    },
    mounted() {
    }
};
</script>
src/main.js
@@ -34,6 +34,9 @@
Vue.prototype.$axios = axios;
Vue.prototype.$apis = apis;
// å¼•å…¥vuex
import store from './store'
//格式化时间
Date.prototype.format =function(format)
{
@@ -58,5 +61,6 @@
new Vue({
    router,
    store,
    render: h => h(App),
}).$mount('#app')
src/pages/home.vue
@@ -37,8 +37,8 @@
import {
    checkUserLogin
} from '../assets//js/api'
} from '@/assets/js/api'
let timer;
export default {
    components: {
        PageHeader,
@@ -140,8 +140,30 @@
            // è®¾ç½®æ¿€æ´»çš„导航
            this.acTabs = menu.name;
        },
        checkUserLogin() {
            checkUserLogin().then(res=>{
                let rs = JSON.parse(res.data.result);
                if(rs.code === 1) {
                    alert(rs.msg);
                    this.$router.push('/login');
                }else {
                    clearTimeout(timer);
                    timer = setTimeout(()=>{
                        this.checkUserLogin();
                    }, 3000);
                }
            }).catch(error=>{
                clearTimeout(timer);
                timer = setTimeout(()=>{
                    this.checkUserLogin();
                }, 3000);
            })
        },
    },
    mounted() {
        // å¯åŠ¨ç”¨æˆ·äº’æ–¥ç™»å½•æ¨¡å—
        this.checkUserLogin();
        // ç›‘听来自子iframe的指令
        window.addEventListener('message', (msg)=>{
            // å¤„理数据
            this.handleMessage(msg.data);
src/pages/jobManage/planManage.vue
New file
@@ -0,0 +1,13 @@
<template>
    <div>放电计划管理</div>
</template>
<script>
export default {
    name: "planManage"
}
</script>
<style scoped>
</style>
src/pages/login.vue
@@ -1,131 +1,141 @@
<template>
  <div class="login_container">
    <div class="login_box">
      <!-- å¤´åƒåŒº -->
      <div class="avatar">
        <img src="@/assets/images/login_logo.jpg">
      </div>
      <!--  ç™»å½•表单区 -->
      <div style="margin: 20px;"></div>
      <el-form label-width="0px" class="login_from" :model="loginForm" ref="loginFormRef">
        <!-- ç”¨æˆ·å -->
        <el-form-item prop="username">
          <el-input v-model="loginForm.username" prefix-icon="el-icon-user"></el-input>
        </el-form-item>
        <!-- å¯†ç  -->
        <el-form-item prop="password">
          <el-input
            v-model="loginForm.password"
            prefix-icon="el-icon-lock"
            type="password"></el-input>
        </el-form-item>
        <el-form-item class="btns">
          <el-button type="primary" @click="onSubmit">登录</el-button>
          <el-button type="info">注册</el-button>
        </el-form-item>
      </el-form>
    <div class="login_container">
        <div class="login_box">
            <!-- å¤´åƒåŒº -->
            <div class="avatar">
                <img src="@/assets/images/login_logo.jpg">
            </div>
            <!--  ç™»å½•表单区 -->
            <div style="margin: 20px;"></div>
            <el-form label-width="0px" class="login_from" :model="loginForm" ref="loginFormRef">
                <!-- ç”¨æˆ·å -->
                <el-form-item prop="username">
                    <el-input
                    v-model="loginForm.username"
                    prefix-icon="el-icon-user"
                    @keyup.enter.native.stop="onSubmit"></el-input>
                </el-form-item>
                <!-- å¯†ç  -->
                <el-form-item prop="password">
                    <el-input
                    v-model="loginForm.password"
                    prefix-icon="el-icon-lock"
                    type="password"
                    @keyup.enter.native.stop="onSubmit"></el-input>
                </el-form-item>
                <el-form-item class="btns">
                    <el-button type="primary" @click="onSubmit">登录</el-button>
                    <el-button type="info">注册</el-button>
                </el-form-item>
            </el-form>
        </div>
    </div>
  </div>
</template>
<script>
import { login,initDBPool,checkLoginSession } from "@/assets/js/api";
import {login, initDBPool, checkLoginSession} from "@/assets/js/api";
export default {
  data() {
    return {
      labelPosition: "right" /*  ç™»å½•表单 */,
      formLabelAlign: {
        name: "",
        region: "",
        type: ""
      },
      /* ç™»å½•表单el-form çš„ æ•°æ®ç»‘定 */
      loginForm: {
        username: "",
        password: ""
      }
    };
  },
  methods: {
    /* åˆå§‹åŒ–连接池  æ£€æµ‹åŽå°session*/
    async woData(){
        const [pool,sessions] =await Promise.all([initDBPool,checkLoginSession ])
    data() {
        return {
            labelPosition: "right" /*  ç™»å½•表单 */,
            formLabelAlign: {
                name: "",
                region: "",
                type: ""
            },
            /* ç™»å½•表单el-form çš„ æ•°æ®ç»‘定 */
            loginForm: {
                username: "",
                password: ""
            }
        };
    },
    methods: {
        /* åˆå§‹åŒ–连接池  æ£€æµ‹åŽå°session*/
        async woData() {
            const [pool, sessions] = await Promise.all([initDBPool, checkLoginSession])
            /*   console.log('pool',pool);
                console.log('sessions',sessions); */
        },
        onSubmit() {
            this.$refs.loginFormRef.validate(async valid => {
                if (!valid) return;
                const {data: res} = await login(
                    this.loginForm.username,
                    this.loginForm.password
                );
                if (res.result && JSON.parse(res.result).code == 0)
                    return this.$message.error(JSON.parse(res.result).msg);
                this.$message.success("登录成功");
                sessionStorage.setItem('username', this.loginForm.username);
                this.$router.push("/home");
                // è®¾ç½®ç”¨æˆ·çš„æƒé™
                this.$store.dispatch('user/getPermits');
            });
        },
    },
    onSubmit() {
      this.$refs.loginFormRef.validate(async valid => {
        if (!valid) return;
        const { data: res } = await login(
          this.loginForm.username,
          this.loginForm.password
        );
        if (res.result && JSON.parse(res.result).code == 0)
          return this.$message.error(JSON.parse(res.result).msg);
        this.$message.success("登录成功");
        sessionStorage.setItem('username', this.loginForm.username);
        this.$router.push("/home");
      });
    },
  },
  mounted() {
    // åˆå§‹åŒ–登录状态
    sessionStorage.setItem('username', "");
  }
    mounted() {
        // åˆå§‹åŒ–user的信息
        this.$store.commit('user/init');
        // åˆå§‹åŒ–登录状态
        sessionStorage.setItem('username', "");
    }
};
</script>
<style lang="less"  scoped>
<style lang="less" scoped>
/* ç™»å½•大盒子背景 */
.login_container {
  width: 100%;
    width: 100%;
}
/* ç™»å½•框 */
.login_box {
  width: 450px;
  height: 320px;
  background-color: #fff;
  border-radius: 3px;
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  /* v图片的盒子 */
  .avatar {
    height: 130px;
    width: 130px;
    border: 1px solid #eee;
    border-radius: 50%; /* è¾¹æ¡†åœ†è§’ */
    padding: 10px;
    box-shadow: 0 0 10px #ddd;
    width: 450px;
    height: 320px;
    background-color: #fff;
    border-radius: 3px;
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
    background-color: #fff;
    /* v图片 */
    img {
      width: 130px;
      height: 130px;
      border-radius: 50%;
      background-color: #eeeeee;
    /* v图片的盒子 */
    .avatar {
        height: 130px;
        width: 130px;
        border: 1px solid #eee;
        border-radius: 50%; /* è¾¹æ¡†åœ†è§’ */
        padding: 10px;
        box-shadow: 0 0 10px #ddd;
        position: absolute;
        left: 50%;
        transform: translate(-50%, -50%);
        background-color: #fff;
        /* v图片 */
        img {
            width: 130px;
            height: 130px;
            border-radius: 50%;
            background-color: #eeeeee;
        }
    }
  }
}
/* ç™»å½•表单框 */
.login_from {
  position: absolute;
  bottom: 0;
  width: 100%;
  padding: 0 20px;
  box-sizing: border-box;
    position: absolute;
    bottom: 0;
    width: 100%;
    padding: 0 20px;
    box-sizing: border-box;
}
/* ç™»å½•按钮 */
.btns {
  text-align: center;
    text-align: center;
}
</style>
src/router/routes.js
@@ -139,6 +139,13 @@
        component: (resolve)=>require(['../pages/pageSetting/realTime.vue'], resolve)
    },
    {
        path: '/jobManage/planManage',
        meta: {
            title: '放电计划管理'
        },
        component: (resolve)=>require(['../pages/jobManage/planManage.vue'], resolve)
    },
    {
        path: '/userMager/userInfo',
        meta: {
            title: '用户信息管理',
src/store/index.js
New file
@@ -0,0 +1,14 @@
import Vue from 'vue';
import Vuex from 'vuex';
import user from '@/store/modules/user';
Vue.use(Vuex);
const store = new Vuex.Store({
    modules: {
        user
    },
});
export default store;
src/store/modules/user.js
New file
@@ -0,0 +1,30 @@
import powerMager from "@/assets/js/apis/userMager/powerMager";
export default {
    namespaced: true,
    state() {
        let permits = sessionStorage.getItem('permits');
        return {
            permits: Array.isArray(permits)?permits:[],
        }
    },
    mutations: {
        setPermits(state, data) {
            state.permits = Array.isArray(data)?data:[];
            sessionStorage.setItem('permits', data);
        },
        init(state) {
            state.permits = [];
        },
    },
    actions: {
        getPermits(context) {
            powerMager.getPermits().then(res=>{
                let rs = JSON.parse(res.data.result);
                context.commit('setPermits', rs);
            }).catch(error=>{
                console.log(error);
            });
        }
    },
};
ÏîÄ¿ÐèÇó.md
@@ -7,3 +7,9 @@
5.历史数据的电池电流折线图使用渐变色
6.实时数据的柱状图添加趋势折线图
```
####2020-10-10
```
1.逆变信息,通信计数
2.拓扑图字体调大
```