码农齐齐齐
2022-09-09 89946abb222981e075e52feb8a01e937f322db5b
master
16个文件已修改
2个文件已添加
2个文件已删除
750 ■■■■ 已修改文件
.env.development 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package-lock.json 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/users.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Login.vue 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/hamburger/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.js 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/index.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/users/index.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/auth.js 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/request.js 85 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/support.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/validate.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/layout/components/Header/index.vue 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/layout/components/Main/index.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/layout/components/NavBar/index.vue 78 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/layout/components/SiderBar/index.vue 156 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/login/index.vue 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vue.config.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.env.development
@@ -4,8 +4,8 @@
# 开发环境配置
ENV = 'development'
# 若依管理系统/开发环境
VUE_APP_BASE_API = '/dev-api'
# 开发环境
VUE_APP_BASE_API = '/api'
# 路由懒加载
VUE_CLI_BABEL_TRANSPILE_MODULES = true
package-lock.json
@@ -8,6 +8,7 @@
      "name": "my-app",
      "version": "0.1.0",
      "dependencies": {
        "axios": "^0.27.2",
        "core-js": "^3.8.3",
        "normalize.css": "^8.0.1",
        "sass": "^1.54.8",
@@ -3370,6 +3371,11 @@
        "babel-runtime": "6.x"
      }
    },
    "node_modules/asynckit": {
      "version": "0.4.0",
      "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
    },
    "node_modules/at-least-node": {
      "version": "1.0.0",
      "resolved": "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz",
@@ -3412,6 +3418,15 @@
      },
      "peerDependencies": {
        "postcss": "^8.1.0"
      }
    },
    "node_modules/axios": {
      "version": "0.27.2",
      "resolved": "https://registry.npmmirror.com/axios/-/axios-0.27.2.tgz",
      "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
      "dependencies": {
        "follow-redirects": "^1.14.9",
        "form-data": "^4.0.0"
      }
    },
    "node_modules/babel-helper-vue-jsx-merge-props": {
@@ -4309,6 +4324,17 @@
      "resolved": "https://registry.npmmirror.com/colorette/-/colorette-2.0.19.tgz",
      "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
      "dev": true
    },
    "node_modules/combined-stream": {
      "version": "1.0.8",
      "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
      "dependencies": {
        "delayed-stream": "~1.0.0"
      },
      "engines": {
        "node": ">= 0.8"
      }
    },
    "node_modules/commander": {
      "version": "8.3.0",
@@ -5235,6 +5261,14 @@
      },
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/delayed-stream": {
      "version": "1.0.0",
      "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
      "engines": {
        "node": ">=0.4.0"
      }
    },
    "node_modules/depd": {
@@ -6205,7 +6239,6 @@
      "version": "1.15.1",
      "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.1.tgz",
      "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==",
      "dev": true,
      "engines": {
        "node": ">=4.0"
      },
@@ -6222,6 +6255,19 @@
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/form-data": {
      "version": "4.0.0",
      "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz",
      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
      "dependencies": {
        "asynckit": "^0.4.0",
        "combined-stream": "^1.0.8",
        "mime-types": "^2.1.12"
      },
      "engines": {
        "node": ">= 6"
      }
    },
    "node_modules/forwarded": {
@@ -17341,6 +17387,11 @@
        "babel-runtime": "6.x"
      }
    },
    "asynckit": {
      "version": "0.4.0",
      "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
    },
    "at-least-node": {
      "version": "1.0.0",
      "resolved": "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz",
@@ -17365,6 +17416,15 @@
        "normalize-range": "^0.1.2",
        "picocolors": "^1.0.0",
        "postcss-value-parser": "^4.2.0"
      }
    },
    "axios": {
      "version": "0.27.2",
      "resolved": "https://registry.npmmirror.com/axios/-/axios-0.27.2.tgz",
      "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
      "requires": {
        "follow-redirects": "^1.14.9",
        "form-data": "^4.0.0"
      }
    },
    "babel-helper-vue-jsx-merge-props": {
@@ -18135,6 +18195,14 @@
      "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
      "dev": true
    },
    "combined-stream": {
      "version": "1.0.8",
      "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
      "requires": {
        "delayed-stream": "~1.0.0"
      }
    },
    "commander": {
      "version": "8.3.0",
      "resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz",
@@ -18890,6 +18958,11 @@
      "requires": {
        "is-descriptor": "^1.0.0"
      }
    },
    "delayed-stream": {
      "version": "1.0.0",
      "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
    },
    "depd": {
      "version": "2.0.0",
@@ -19743,8 +19816,7 @@
    "follow-redirects": {
      "version": "1.15.1",
      "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.1.tgz",
      "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==",
      "dev": true
      "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA=="
    },
    "for-in": {
      "version": "1.0.2",
@@ -19752,6 +19824,16 @@
      "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==",
      "dev": true
    },
    "form-data": {
      "version": "4.0.0",
      "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz",
      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
      "requires": {
        "asynckit": "^0.4.0",
        "combined-stream": "^1.0.8",
        "mime-types": "^2.1.12"
      }
    },
    "forwarded": {
      "version": "0.2.0",
      "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz",
package.json
@@ -9,6 +9,7 @@
    "build:stage": "vue-cli-service build --mode staging"
  },
  "dependencies": {
    "axios": "^0.27.2",
    "core-js": "^3.8.3",
    "normalize.css": "^8.0.1",
    "sass": "^1.54.8",
src/api/users.js
New file
@@ -0,0 +1,4 @@
import axios from "axios";
export default {
  login: (data) => axios.post('/sccg/admin/login', data),
};
src/components/Login.vue
File was deleted
src/components/hamburger/index.vue
@@ -10,7 +10,7 @@
        height="64"
      >
        <path
          d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z"
          d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z" fill="#fff"
        />
      </svg>
    </el-radio-button>
src/main.js
@@ -12,6 +12,9 @@
import './assets/icons' 
// 引入全局样式
import '@/styles/index.scss' 
import axios from "axios"
Vue.prototype.$axios=axios
console.log(process.env.VUE_APP_BASE_API);
Vue.use(ElementUI)
new Vue({
  router,
src/router/index.js
@@ -1,18 +1,7 @@
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
const routes = [
  // {
  //   path: '/',
  //   component: Layout,
  //   redirect: '/home',
  //   children: [{
  //     path: 'home',
  //     name: 'home',
  //     component: () => import('@/views/layout'),
  //   }]
  // },
  {
    path:'/home',
    name:'home',
src/store/index.js
@@ -1,6 +1,6 @@
import Vue from 'vue'
import Vuex from 'vuex'
import users from "./users"
Vue.use(Vuex)
export default new Vuex.Store({
@@ -13,5 +13,6 @@
  actions: {
  },
  modules: {
    users
  }
})
src/store/users/index.js
New file
@@ -0,0 +1,17 @@
import usersApi from "@/api/users";
// import { Message } from "element-ui";
export default {
  namespaced: true,
  state: {
    userInfo: {},
  },
  actions: {
    async login({ state }, params) {
      console.log("store login");
      const res = await usersApi.login(params);
      console.log(res);
      const { data } = res;
      return res;
    },
  },
};
src/utils/auth.js
@@ -1,15 +1,15 @@
// import Cookies from 'js-cookie'
import Cookies from 'js-cookie'
// const TokenKey = 'loginToken'
const TokenKey = 'loginToken'
// export function getToken() {
//   return Cookies.get(TokenKey)
// }
export function getToken() {
  return Cookies.get(TokenKey)
}
// export function setToken(token) {
//   return Cookies.set(TokenKey, token)
// }
export function setToken(token) {
  return Cookies.set(TokenKey, token)
}
// export function removeToken() {
//   return Cookies.remove(TokenKey)
// }
export function removeToken() {
  return Cookies.remove(TokenKey)
}
src/utils/request.js
@@ -1,66 +1,23 @@
import axios from 'axios'
import { Message, MessageBox } from 'element-ui'
import store from '../store'
import { getToken } from '@/utils/auth'
// 创建axios实例
const service = axios.create({
  baseURL: process.env.BASE_API, // api的base_url
  timeout: 15000 // 请求超时时间
})
// request拦截器
service.interceptors.request.use(config => {
  if (store.getters.token) {
    config.headers['Authorization'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
  }
  return config
}, error => {
  // Do something with request error
  console.log(error) // for debug
  Promise.reject(error)
})
// respone拦截器
service.interceptors.response.use(
  response => {
  /**
  * code为非200是抛错 可结合自己业务进行修改
  */
    const res = response.data
    if (res.code !== 200) {
      Message({
        message: res.message,
        type: 'error',
        duration: 3 * 1000
      })
      // 401:未登录;
      if (res.code === 401) {
        MessageBox.confirm('你已被登出,可以取消继续留在该页面,或者重新登录', '确定登出', {
          confirmButtonText: '重新登录',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          store.dispatch('FedLogOut').then(() => {
            location.reload()// 为了重新实例化vue-router对象 避免bug
          })
        })
      }
      return Promise.reject('error')
    } else {
      return response.data
    }
import axios from 'axios';
// 拦截器
// 请求
axios.interceptors.request.use(
  // 请求之前的回调函数
  function (config) {
    config['baseURL'] = '/api';
    return config;
  },
  error => {
    console.log('err' + error)// for debug
    Message({
      message: error.message,
      type: 'error',
      duration: 3 * 1000
    })
    return Promise.reject(error)
  function (error) {
    // Do something with request error
    return Promise.reject(error);
  }
)
export default service
);
// 响应
axios.interceptors.response.use(
  function (response) {
    return response.data;
  },
  function (error) {
    return Promise.reject(error);
  }
);
src/utils/support.js
File was deleted
src/utils/validate.js
@@ -1,7 +1,7 @@
export function isvalidUsername(str) {
  // const valid_map = ['admin', 'test']
  // return valid_map.indexOf(str.trim()) >= 0
  return str.trim().length>=3
  return str.trim().length
}
/* 合法uri*/
@@ -10,21 +10,4 @@
  return urlregex.test(textval)
}
/* 小写字母*/
export function validateLowerCase(str) {
  const reg = /^[a-z]+$/
  return reg.test(str)
}
/* 大写字母*/
export function validateUpperCase(str) {
  const reg = /^[A-Z]+$/
  return reg.test(str)
}
/* 大小写字母*/
export function validatAlphabets(str) {
  const reg = /^[A-Za-z]+$/
  return reg.test(str)
}
src/views/layout/components/Header/index.vue
@@ -1,32 +1,40 @@
<template>
  <!-- 头部 -->
  <el-header>
    <!-- 展开控制按钮 -->
     <!-- <hamburger :is-active="opened" class="hamburger-container" @toggleClick="toggleSideBar" /> -->
     <!-- 右侧菜单 -->
    <div class="header-title">
      <div class="bell">
        <el-icon class="el-icon-bell" style="color: white"></el-icon>
  <div>
    <!-- 头部 -->
    <el-header>
      <!-- 右侧菜单 -->
      <div class="header-title">
        <div class="bell">
          <el-icon class="el-icon-bell" style="color: white"></el-icon>
        </div>
        <div class="userinfo">
          <div class="avatar"></div>
          <span class="username">admin</span>
        </div>
        <div class="loginout" @click="loginout">退出登录</div>
      </div>
      <div class="userinfo">
        <div class="avatar"></div>
        <span class="username">admin</span>
      </div>
      <div class="loginout">退出登录</div>
    </div>
  </el-header>
    </el-header>
    <NavBar />
  </div>
</template>
<script>
import hamburger from "@/components/hamburger"
import hamburger from "@/components/hamburger";
import NavBar from "../NavBar";
export default {
  data(){
  data() {
    return {
      opened:false
    }
      opened: false,
    };
  },
  components:{
    hamburger
  components: {
    hamburger,
    NavBar,
  },
  methods:{
    loginout(){
      this.$router.push({path:"/login"})
    }
  }
};
</script>
src/views/layout/components/Main/index.vue
@@ -1,6 +1,5 @@
<template>
  <el-main>
    <NavBar/>
    <router-view></router-view>
  </el-main>
</template>
src/views/layout/components/NavBar/index.vue
@@ -1,20 +1,76 @@
<template>
  <el-breadcrumb separator-class="el-icon-arrow-right">
    <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
    <el-breadcrumb-item>活动管理</el-breadcrumb-item>
    <el-breadcrumb-item>活动列表</el-breadcrumb-item>
    <el-breadcrumb-item>活动详情</el-breadcrumb-item>
  <el-breadcrumb class="app-breadcrumb" separator="/">
    <transition-group name="breadcrumb">
      <el-breadcrumb-item v-for="(item,index) in levelList" :key="item.path">
        <span v-if="item.redirect==='noRedirect'||index==levelList.length-1" class="no-redirect">{{ item.meta.title }}</span>
        <a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a>
      </el-breadcrumb-item>
    </transition-group>
  </el-breadcrumb>
</template>
<script>
export default {};
import pathToRegexp from 'path-to-regexp'
export default {
  data() {
    return {
      levelList: null
    }
  },
  watch: {
    $route() {
      this.getBreadcrumb()
    }
  },
  created() {
    this.getBreadcrumb()
  },
  methods: {
    getBreadcrumb() {
      // only show routes with meta.title
      let matched = this.$route.matched.filter(item => item.meta && item.meta.title)
      const first = matched[0]
      if (!this.isDashboard(first)) {
        matched = [{ path: '/dashboard', meta: { title: 'Dashboard' }}].concat(matched)
      }
      this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false)
    },
    isDashboard(route) {
      const name = route && route.name
      if (!name) {
        return false
      }
      return name.trim().toLocaleLowerCase() === 'Dashboard'.toLocaleLowerCase()
    },
    pathCompile(path) {
      const { params } = this.$route
      var toPath = pathToRegexp.compile(path)
      return toPath(params)
    },
    handleLink(item) {
      const { redirect, path } = item
      if (redirect) {
        this.$router.push(redirect)
        return
      }
      this.$router.push(this.pathCompile(path))
    }
  }
}
</script>
<style lang="scss" scoped>
.el-breadcrumb{
  background-color: #09152F;
  border: 1px  dotted #081F31;
  height: 50px;
.app-breadcrumb.el-breadcrumb {
  display: inline-block;
  font-size: 14px;
  line-height: 30px;
  margin-left: 8px;
  .no-redirect {
    color: #97a8be;
    cursor: text;
  }
}
</style>
</style>
src/views/layout/components/SiderBar/index.vue
@@ -1,89 +1,93 @@
<template>
  <!-- 侧边导航栏 -->
  <el-aside width="200px">
    <h2 class="siderbar-title">遂昌执法平台</h2>
    <el-scrollbar>
      <!-- 路由 -->
      <el-menu router class="el-menu-vertical" :default-active="$route.path">
        <!-- 视频巡查 -->
        <el-submenu index="/home/video">
          <template slot="title">
            <span slot="prefix" class="icon-padding">
              <svg-icon icon-class="video"></svg-icon>
            </span>
            <span slot="title">视频巡查</span>
          </template>
          <el-menu-item index="/home/video">视频巡查</el-menu-item>
        </el-submenu>
        <!-- 智能巡查 -->
        <el-submenu index="/admin/article1">
          <template slot="title">
            <span slot="prefix" class="icon-padding">
              <svg-icon icon-class="intelligence"></svg-icon>
            </span>
            <span>智能巡查</span>
          </template>
          <el-menu-item index="/admin/article/add">预警研判</el-menu-item>
          <el-menu-item index="/admin/article">违规检索</el-menu-item>
          <el-menu-item index="/admin/article">趋势分析</el-menu-item>
          <el-menu-item index="/admin/article">数据统计</el-menu-item>
          <el-menu-item index="/admin/article">运行报告</el-menu-item>
        </el-submenu>
        <!-- 运营管理 -->
        <el-submenu index="/admin/article2">
          <template slot="title">
            <span slot="prefix" class="icon-padding">
              <svg-icon icon-class="operate"></svg-icon>
            </span>
            <span>运营管理</span>
          </template>
          <el-menu-item index="/admin/article/add">执法管理</el-menu-item>
          <el-menu-item index="/admin/article/add">调度管理</el-menu-item>
          <el-menu-item index="/admin/article/add">店铺管理</el-menu-item>
          <el-menu-item index="/admin/article/add">车辆管理</el-menu-item>
          <el-menu-item index="/admin/article/add">图片管理</el-menu-item>
          <el-menu-item index="/admin/article/add">视频管理</el-menu-item>
          <el-menu-item index="/admin/article/add">消息管理</el-menu-item>
          <el-menu-item index="/admin/article/add">审核管理</el-menu-item>
          <el-menu-item index="/admin/article/add">短信管理</el-menu-item>
          <el-menu-item index="/admin/article">算法模型管理</el-menu-item>
          <el-menu-item index="/admin/article">日志管理</el-menu-item>
        </el-submenu>
        <!-- 系统设置 -->
        <el-submenu index="/admin/article3">
          <template slot="title">
            <!-- <i class="el-icon-reading"></i> -->
            <span slot="prefix" class="icon-padding">
              <svg-icon icon-class="system"></svg-icon>
            </span>
            <span>系统设置</span>
          </template>
          <!-- 基本设置 -->
          <el-submenu index="/admin/article/add">
  <div>
    <!-- 侧边导航栏 -->
    <el-aside width="200px">
      <h2 class="siderbar-title">遂昌执法平台</h2>
      <el-scrollbar>
        <!-- 路由 -->
        <el-menu router class="el-menu-vertical" :default-active="$route.path" >
          <!-- 视频巡查 -->
          <el-submenu index="/home/video">
            <template slot="title">
              <span>基本设置</span>
              <span slot="prefix" class="icon-padding">
                <svg-icon icon-class="video"></svg-icon>
              </span>
              <span slot="title">视频巡查</span>
            </template>
            <el-menu-item index="/admin/article">用户管理</el-menu-item>
            <el-menu-item index="/admin/article">角色管理</el-menu-item>
            <el-menu-item index="/admin/article">权限管理</el-menu-item>
            <el-menu-item index="/admin/article">部门管理</el-menu-item>
            <el-menu-item index="/home/video">视频巡查</el-menu-item>
          </el-submenu>
          <!-- 平台设置 -->
          <el-submenu index="/admin/article/add">
          <!-- 智能巡查 -->
          <el-submenu index="/admin/article1">
            <template slot="title">
              <span>平台设置</span>
              <span slot="prefix" class="icon-padding">
                <svg-icon icon-class="intelligence"></svg-icon>
              </span>
              <span>智能巡查</span>
            </template>
            <el-menu-item index="/admin/article">门户设置</el-menu-item>
            <el-menu-item index="/admin/article">第三方接口管理</el-menu-item>
            <el-menu-item index="/admin/article/add">预警研判</el-menu-item>
            <el-menu-item index="/admin/article">违规检索</el-menu-item>
            <el-menu-item index="/admin/article">趋势分析</el-menu-item>
            <el-menu-item index="/admin/article">数据统计</el-menu-item>
            <el-menu-item index="/admin/article">运行报告</el-menu-item>
          </el-submenu>
        </el-submenu>
      </el-menu>
    </el-scrollbar>
  </el-aside>
          <!-- 运营管理 -->
          <el-submenu index="/admin/article2">
            <template slot="title">
              <span slot="prefix" class="icon-padding">
                <svg-icon icon-class="operate"></svg-icon>
              </span>
              <span>运营管理</span>
            </template>
            <el-menu-item index="/admin/article/add">执法管理</el-menu-item>
            <el-menu-item index="/admin/article/add">调度管理</el-menu-item>
            <el-menu-item index="/admin/article/add">店铺管理</el-menu-item>
            <el-menu-item index="/admin/article/add">车辆管理</el-menu-item>
            <el-menu-item index="/admin/article/add">图片管理</el-menu-item>
            <el-menu-item index="/admin/article/add">视频管理</el-menu-item>
            <el-menu-item index="/admin/article/add">消息管理</el-menu-item>
            <el-menu-item index="/admin/article/add">审核管理</el-menu-item>
            <el-menu-item index="/admin/article/add">短信管理</el-menu-item>
            <el-menu-item index="/admin/article">算法模型管理</el-menu-item>
            <el-menu-item index="/admin/article">日志管理</el-menu-item>
          </el-submenu>
          <!-- 系统设置 -->
          <el-submenu index="/admin/article3">
            <template slot="title">
              <!-- <i class="el-icon-reading"></i> -->
              <span slot="prefix" class="icon-padding">
                <svg-icon icon-class="system"></svg-icon>
              </span>
              <span>系统设置</span>
            </template>
            <!-- 基本设置 -->
            <el-submenu index="/admin/article/add">
              <template slot="title">
                <span>基本设置</span>
              </template>
              <el-menu-item index="/admin/article">用户管理</el-menu-item>
              <el-menu-item index="/admin/article">角色管理</el-menu-item>
              <el-menu-item index="/admin/article">权限管理</el-menu-item>
              <el-menu-item index="/admin/article">部门管理</el-menu-item>
            </el-submenu>
            <!-- 平台设置 -->
            <el-submenu index="/admin/article/add">
              <template slot="title">
                <span>平台设置</span>
              </template>
              <el-menu-item index="/admin/article">门户设置</el-menu-item>
              <el-menu-item index="/admin/article">第三方接口管理</el-menu-item>
            </el-submenu>
          </el-submenu>
        </el-menu>
      </el-scrollbar>
    </el-aside>
  </div>
</template>
<script>
export default {};
export default {
};
</script>
<style lang="scss" scpoed>
src/views/login/index.vue
@@ -19,7 +19,7 @@
        ref="loginForm"
        label-position="left"
      >
      <!-- title -->
        <!-- title -->
        <h2 class="login-title">用户登录 / USER LOGIN</h2>
        <el-form-item prop="username">
          <!-- 用户名输入框 -->
@@ -45,9 +45,9 @@
            autoComplete="on"
            placeholder="请输入登录密码"
          >
          <!-- 输入框前icon -->
            <!-- 输入框前icon -->
            <span slot="prefix">
              <svg-icon  icon-class="password" class="color"></svg-icon>
              <svg-icon icon-class="password" class="color"></svg-icon>
            </span>
            <!-- 输入框后icon -->
            <span slot="suffix" @click="showPwd">
@@ -76,7 +76,8 @@
<script>
import { isvalidUsername } from "@/utils/validate";
import { createNamespacedHelpers } from "vuex";
const { mapActions } = createNamespacedHelpers("users");
export default {
  name: "login",
  data() {
@@ -96,8 +97,8 @@
    };
    return {
      loginForm: {
        username: "",
        password: "",
        username: "admin",
        password: "macro123",
      },
      loginRules: {
        username: [
@@ -111,23 +112,7 @@
      pwdType: false,
    };
  },
  created() {
    // this.loginForm.username = getCookie("username");
    // this.loginForm.password = getCookie("password");
    // if (
    //   this.loginForm.username === undefined ||
    //   this.loginForm.username == null ||
    //   this.loginForm.username === ""
    // ) {
    //   this.loginForm.username = "admin";
    // }
    // if (
    //   this.loginForm.password === undefined ||
    //   this.loginForm.password == null
    // ) {
    //   this.loginForm.password = "";
    // }
  },
  created() {},
  methods: {
    showPwd() {
      if (!this.pwdType) {
@@ -136,59 +121,50 @@
        this.pwdType = false;
      }
    },
    ...mapActions(["login"]),
    handleLogin() {
      this.$router.push({ path: "/home" });
      // this.$refs.loginForm.validate((valid) => {
      //   if (valid) {
      //     console.log(valid);
      //     this.loading = true;
      //     this.$store
      //       .dispatch("Login", this.loginForm)
      //       .then(() => {
      //         this.loading = false;
      //         setCookie("username", this.loginForm.username, 15);
      //         setCookie("password", this.loginForm.password, 15);
      //         this.$router.push({ path: "/" });
      //       })
      //       .catch(() => {
      //         this.loading = false;
      //       });
      //   } else {
      //     console.log("参数验证不合法!");
      //     return false;
      //   }
      // });
      console.log("in login");
      const { username, password } = this.loginForm;
      this.$axios
        .post("http://42.193.1.25:8082/sccg/admin/login", {
        password,
        username,
        })
        .then(function (response) {
          console.log(response);
        })
        .catch(function (error) {
          console.log(error);
        });
    },
  },
};
</script>
<style  lang="scss" scoped>
.color{
.color {
  color: red;
}
#background {
  width: 100vw;
  height: 100vh;
  background: url("@/assets/imgs/login/login_bg.jpg");
  background-size: cover  ;
  background-size: cover;
  position: relative;
  display: flex;
  min-width: 800px;
}
.login-form-layout {
  position: absolute;
  top: 20%;
  right: 5%;
  width: 360px;
  align-self: center;
}
.text {
  align-self: flex-start;
  position: absolute;
  top:20%;
  top: 20%;
  left: 5%;
  // margin-top: 180px;
  // margin-left: 50px;
  display: flex;
  width: 400px;
  justify-content: space-between;
vue.config.js
@@ -33,13 +33,16 @@
    host: 'localhost',
    port: port,
    open: true,
    headers: {
      "Access-Control-Allow-Origin": "*",
    },
    proxy: {
      // 跨域配置
      [process.env.VUE_APP_BASE_API]: {
        target: `http://localhost:8080`,
      "/api": {
        target: `http://42.193.1.25:8082`,
        changeOrigin: true,
        pathRewrite: {
          ['^' + process.env.VUE_APP_BASE_API]: ''
          "^/api": ''
        }
      }
    },