• Vue前端模板框架--vue-admin-template


    一、简介

    vue-admin-template是基于vue-element-admin的一套后台管理系统基础模板(最少精简版),可作为模板进行二次开发。

    GitHub地址:GitHub - PanJiaChen/vue-admin-template: a vue2.0 minimal admin template

    建议:你可以在 vue-admin-template 的基础上进行二次开发,把 vue-element-admin当做工具箱,想要什么功能或者组件就去 vue-element-admin 那里复制过来。

    二、使用

    修改项目名称 vue-admin-template 改为 “自己定义的项目名称”
    解压压缩包
    进入目录
    cd  “自己的项目名称下”
    安装依赖
    npm install
    启动。执行后,浏览器自动弹出并访问http://localhost:9528/
    npm run dev

    三、源码目录结构

    |-dist 生产环境打包生成的打包项目
    |-mock 产生模拟数据
    |-public 包含会被自动打包到项目根路径的文件夹
        |-index.html 唯一的页面
    |-src
        |-api 包含接口请求函数模块
            |-table.js  表格列表mock数据接口的请求函数
            |-user.js  用户登陆相关mock数据接口的请求函数
        |-assets 组件中需要使用的公用资源
            |-404_images 404页面的图片
        |-components 非路由组件
            |-SvgIcon svg图标组件
            |-Breadcrumb 面包屑组件(头部水平方向的层级组件)
            |-Hamburger 用来点击切换左侧菜单导航的图标组件
        |-icons
            |-svg 包含一些svg图片文件
            |-index.js 全局注册SvgIcon组件,加载所有svg图片并暴露所有svg文件名的数组
        |-layout
            |-components 组成整体布局的一些子组件
            |-mixin 组件中可复用的代码
            |-index.vue 后台管理的整体界面布局组件
        |-router
            |-index.js 路由器
        |-store
            |-modules
                |-app.js 管理应用相关数据
                |-settings.js 管理设置相关数据
                |-user.js 管理后台登陆用户相关数据
            |-getters.js 提供子模块相关数据的getters计算属性
            |-index.js vuex的store
        |-styles
            |-xxx.scss 项目组件需要使用的一些样式(使用scss)
        |-utils 一些工具函数
            |-auth.js 操作登陆用户的token cookie
            |-get-page-title.js 得到要显示的网页title
            |-request.js axios二次封装的模块
            |-validate.js 检验相关工具函数
            |-index.js 日期和请求参数处理相关工具函数
        |-views 路由组件文件夹
            |-dashboard 首页
            |-login 登陆
        |-App.vue 应用根组件
        |-main.js 入口js
        |-permission.js 使用全局守卫实现路由权限控制的模块
        |-settings.js 包含应用设置信息的模块
    |-.env.development 指定了开发环境的代理服务器前缀路径
    |-.env.production 指定了生产环境的代理服务器前缀路径
    |-.eslintignore eslint的忽略配置
    |-.eslintrc.js eslint的检查配置
    |-.gitignore git的忽略配置
    |-.npmrc 指定npm的淘宝镜像和sass的下载地址
    |-babel.config.js babel的配置
    |-jsconfig.json 用于vscode引入路径提示的配置
    |-package.json 当前项目包信息
    |-package-lock.json 当前项目依赖的第三方包的精确信息
    |-vue.config.js webpack相关配置(如: 代理服务器)

    四、 修改登录功能

    因为该模板使用的是mock数据,没有连接到后端系统。

    所以当我们想要连接到自己写的后端系统时,需要对vue-admin-template进行改造。

     1、因为浏览器对Ajax请求具有限制问题,一下三个地方不同,就会产生跨域问题。

    跨域问题的原因:访问协议、地址IP、端口号

    前端地址:http://localhost:9258

    后端地址:http://localhost:8800

    解决方法:

    第一种方法:

    .env.development文件内,将

                    VUE_APP_BASE_API = '/dev-api'
    改为         VUE_APP_BASE_API = 'http://localhost:8800'

     

    第二种方法:

    在vue.config.js文件内

            注释掉mock接口配置

            配置代理转发请求到目标接口

    // before: require('./mock/mock-server.js')
    proxy: {
      '/dev-api': { // 匹配所有以 '/dev-api'开头的请求路径
        target: 'http://localhost:8800',
        changeOrigin: true, // 支持跨域
        pathRewrite: { // 重写路径: 去掉路径中开头的'/dev-api'
          '^/dev-api': ''
        }
      }
    }
    

    2、 修改src/utils/request.js的请求状态码

    由于前端访问后端的数据,会传递一个状态码,后端返回数据的状态码可能是200,但是前端默认是20000,这时候需要把两者改为一样的即可,默认修改前端状态码的判断条件即可。

    1. import axios from 'axios'
    2. import { MessageBox, Message } from 'element-ui'
    3. import store from '@/store'
    4. import { getToken } from '@/utils/auth'
    5. // create an axios instance
    6. const service = axios.create({
    7. baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
    8. timeout: 5000 // request timeout
    9. })
    10. // request interceptor
    11. service.interceptors.request.use(
    12. config => {
    13. if (store.getters.token) {
    14. config.headers['X-Token'] = getToken()
    15. }
    16. return config
    17. },
    18. error => {
    19. console.log(error) // for debug
    20. return Promise.reject(error)
    21. }
    22. )
    23. // response interceptor
    24. service.interceptors.response.use(
    25. response => {
    26. const res = response.data
    27. // if the custom code is not 20000, it is judged as an error.
    28. if (res.code !== 200) {
    29. Message({
    30. message: res.message || 'Error',
    31. type: 'error',
    32. duration: 5 * 1000
    33. })
    34. // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
    35. if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
    36. // to re-login
    37. MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', {
    38. confirmButtonText: 'Re-Login',
    39. cancelButtonText: 'Cancel',
    40. type: 'warning'
    41. }).then(() => {
    42. store.dispatch('user/resetToken').then(() => {
    43. location.reload()
    44. })
    45. })
    46. }
    47. return Promise.reject(new Error(res.message || 'Error'))
    48. } else {
    49. return res
    50. }
    51. },
    52. error => {
    53. console.log('err' + error) // for debug
    54. Message({
    55. message: error.message,
    56. type: 'error',
    57. duration: 5 * 1000
    58. })
    59. return Promise.reject(error)
    60. }
    61. )
    62. export default service

    3、修改前端接口路径

    src/api/user.js 中的 url 地址改为自己后端的发送地址。

    1. import request from '@/utils/request'
    2. export function login(data) {
    3. return request({
    4. url: '/admin/system/index/login',
    5. method: 'post',
    6. data
    7. })
    8. }
    9. export function getInfo(token) {
    10. return request({
    11. url: '/admin/system/index/info',
    12. method: 'get',
    13. params: { token }
    14. })
    15. }
    16. export function logout() {
    17. return request({
    18. url: '/admin/system/index/logout',
    19. method: 'post'
    20. })
    21. }

    4、修改后端的登录请求

    1. @RestController
    2. @RequestMapping("/admin/system/index")
    3. public class IndexController {
    4. //login
    5. //{"code":20000,"data":{"token":"admin-token"}}
    6. @PostMapping("/login")
    7. public Result login(@RequestBody LoginVo loginVo) {
    8. Map map = new HashMap<>();
    9. map.put("token ", "admin-token-a");
    10. return Result.ok(map);
    11. }
    12. //info
    13. // {"code":20000,"data":{"roles":["admin"],
    14. // "introduction":"I am a super administrator",
    15. // "avatar":"https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif",
    16. // "name":"Super Admin"}}
    17. @GetMapping("/info")
    18. public Result info(HttpServletRequest request) {
    19. Map map = new HashMap<>();
    20. map.put("roles", "[admin]");
    21. map.put("introduction", "管理员");
    22. map.put("avatar", "https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif");
    23. map.put("name", "Super Admin");
    24. return Result.ok(map);
    25. }
    26. }

    5、添加登录失败的接口

    vue端:

    1. // user logout
    2. logout({ commit, state }) {
    3. return new Promise((resolve, reject) => {
    4. logout(state.token).then(() => {
    5. removeToken() // must remove token first
    6. resetRouter()
    7. commit('RESET_STATE')
    8. resolve()
    9. }).catch(error => {
    10. reject(error)
    11. })
    12. })
    1. export function logout() {
    2. return request({
    3. url: '/admin/system/index/logout',
    4. method: 'post'
    5. })
    6. }

    后端接口:

    1. @PostMapping("/logout")
    2. public Result logout() {
    3. return Result.ok();
    4. }

    另一种退出登录的方式是:

    修改logout,直接退出,不发送请求。

    1. // user logout
    2. logout({ commit, state }) {
    3. return new Promise((resolve, reject) => {
    4. removeToken() // must remove token first
    5. resetRouter()
    6. commit('RESET_STATE')
    7. resolve()
    8. })

    五、帮助

    如果感觉对您有帮助,麻烦您给我一个小小的关注,这是经久不衰的动力。

  • 相关阅读:
    会声会影2023mac电脑免费永久版视频编辑软件
    0084 快速排序、归并排序、基数排序,常用算法排序总结
    Docker 及 Docker Compose 安装指南
    【PAT(甲级)】1049 Counting Ones(与位数以及位数上的数字有关)
    OpenCV 08(图像滤波器 算子)
    linux篇---解决 Linux 系统,出现“不在sudoers文件中,此事将被报告”的问题
    5 h0255. 迷宫问题,6 h0253. 鸣人和佐助(广度优先搜索)
    C++ 字符串string
    Openresty(二十二)ngx.balance和balance_by_lua终结篇
    5.1EF Core原理
  • 原文地址:https://blog.csdn.net/m0_57037182/article/details/127684812