yudaocode/ruoyi-vue-pro:Vue2版本完全指南

yudaocode/ruoyi-vue-pro:Vue2版本完全指南

【免费下载链接】ruoyi-vue-pro 🔥 官方推荐 🔥 RuoYi-Vue 全新 Pro 版本,优化重构所有功能。基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 微信小程序,支持 RBAC 动态权限、数据权限、SaaS 多租户、Flowable 工作流、三方登录、支付、短信、商城、CRM、ERP、AI 等功能。你的 ⭐️ Star ⭐️,是作者生发的动力! 【免费下载链接】ruoyi-vue-pro 项目地址: https://gitcode.com/yudaocode/ruoyi-vue-pro

🎯 为什么选择Vue2版本?

在企业级管理系统开发中,技术选型往往需要在技术先进性团队熟悉度之间寻找平衡。ruoyi-vue-pro的Vue2版本正是为那些追求稳定性和开发效率的团队量身打造。

痛点场景:你的团队已经深度掌握Vue2技术栈,但市面上的新项目大多转向Vue3,导致学习成本陡增、开发效率下降。ruoyi-vue-pro Vue2版本让你无需重构现有技术栈,即可享受现代化后台管理系统的完整功能。

读完本文,你将获得:

  • ✅ Vue2版本的完整技术架构解析
  • ✅ 从零开始的详细部署指南
  • ✅ 核心功能模块深度使用教程
  • ✅ 企业级最佳实践和性能优化方案
  • ✅ 常见问题排查和解决方案

📊 技术架构全景图

mermaid

🛠️ 环境准备与快速启动

系统要求

组件版本要求备注
Node.js14.x 或 16.x推荐 LTS 版本
npm6.x+或使用 yarn
JavaJDK 8Spring Boot 2.7兼容
MySQL5.7+或其它支持的数据库

一键启动脚本

# 克隆Vue2前端项目
git clone https://gitcode.com/yudaocode/yudao-ui-admin-vue2.git
cd yudao-ui-admin-vue2

# 安装依赖
npm install

# 配置环境变量
cp .env.example .env

# 启动开发服务器
npm run dev

后端服务配置

# application.yml 关键配置
server:
  port: 8080
  servlet:
    context-path: /admin-api

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/ruoyi-vue-pro?useUnicode=true&characterEncoding=utf8&useSSL=false
    username: root
    password: 123456
    
  redis:
    host: localhost
    port: 6379
    database: 0

🏗️ 核心功能模块详解

1. 权限管理系统

RBAC(基于角色的访问控制)模型

mermaid

前端权限控制实现
// src/utils/permission.js
import store from '@/store'

export function hasPermission(permission) {
  const permissions = store.getters.permissions
  return permissions.includes(permission)
}

// 指令方式使用
Vue.directive('permission', {
  inserted: function (el, binding) {
    const { value } = binding
    if (value && !hasPermission(value)) {
      el.parentNode && el.parentNode.removeChild(el)
    }
  }
})

2. 动态菜单配置

<!-- 侧边栏菜单组件 -->
<template>
  <el-menu
    :default-active="$route.path"
    :collapse="isCollapse"
    background-color="#304156"
    text-color="#bfcbd9"
    active-text-color="#409EFF"
  >
    <sidebar-item
      v-for="route in permission_routes"
      :key="route.path"
      :item="route"
      :base-path="route.path"
    />
  </el-menu>
</template>

<script>
import { mapGetters } from 'vuex'
import SidebarItem from './SidebarItem'

export default {
  components: { SidebarItem },
  computed: {
    ...mapGetters(['permission_routes', 'sidebar']),
    isCollapse() {
      return !this.sidebar.opened
    }
  }
}
</script>

📈 数据表格最佳实践

高级表格配置示例

<template>
  <div class="app-container">
    <el-table
      v-loading="listLoading"
      :data="list"
      border
      fit
      highlight-current-row
      @sort-change="sortChange"
    >
      <el-table-column
        label="ID"
        prop="id"
        sortable="custom"
        align="center"
        width="80"
      />
      <el-table-column label="用户名" prop="username" min-width="120" />
      <el-table-column label="状态" width="100" align="center">
        <template slot-scope="{row}">
          <el-tag :type="row.status | statusFilter">
            {{ row.status | statusNameFilter }}
          </el-tag>
        </template>
      </el-table-column>
      <el-table-column label="操作" align="center" width="230">
        <template slot-scope="{row}">
          <el-button
            size="mini"
            @click="handleUpdate(row)"
            v-permission="['system:user:update']"
          >
            编辑
          </el-button>
          <el-button
            size="mini"
            type="danger"
            @click="handleDelete(row)"
            v-permission="['system:user:delete']"
          >
            删除
          </el-button>
        </template>
      </el-table-column>
    </el-table>
    
    <pagination
      v-show="total>0"
      :total="total"
      :page.sync="listQuery.page"
      :limit.sync="listQuery.limit"
      @pagination="getList"
    />
  </div>
</template>

后端分页查询接口

// UserController.java
@PreAuthorize("@ss.hasPermission('system:user:query')")
@GetMapping("/page")
public CommonResult<PageResult<UserRespVO>> getUserPage(UserPageReqVO reqVO) {
    return CommonResult.success(userService.getUserPage(reqVO));
}

// UserServiceImpl.java
@Override
public PageResult<UserRespVO> getUserPage(UserPageReqVO reqVO) {
    return new PageResult<>(userMapper.selectPage(reqVO), 
        userMapper.selectCount(reqVO));
}

// UserMapper.xml
<select id="selectPage" resultMap="UserResult">
    SELECT * FROM system_user
    <where>
        <if test="username != null and username != ''">
            AND username LIKE CONCAT('%', #{username}, '%')
        </if>
        <if test="status != null">
            AND status = #{status}
        </if>
    </where>
    ORDER BY create_time DESC
</select>

🔧 性能优化策略

1. 前端性能优化

// 路由懒加载
const User = () => import('@/views/system/user/index')
const Role = () => import('@/views/system/role/index')

// 组件按需引入
import { Table, TableColumn, Button, Pagination } from 'element-ui'
const components = [Table, TableColumn, Button, Pagination]

components.forEach(component => {
  Vue.use(component)
})

// API请求缓存
const apiCache = new Map()
export function cachedRequest(key, apiCall) {
  if (apiCache.has(key)) {
    return Promise.resolve(apiCache.get(key))
  }
  return apiCall().then(data => {
    apiCache.set(key, data)
    return data
  })
}

2. 后端性能优化

// Redis缓存配置
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
    
    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory factory) {
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
            .entryTtl(Duration.ofMinutes(30))
            .disableCachingNullValues();
        
        return RedisCacheManager.builder(factory)
            .cacheDefaults(config)
            .build();
    }
}

// 服务层缓存使用
@Service
public class UserServiceImpl implements UserService {
    
    @Cacheable(value = "user", key = "#id")
    @Override
    public UserDO getUser(Long id) {
        return userMapper.selectById(id);
    }
    
    @CacheEvict(value = "user", key = "#user.id")
    @Override
    public void updateUser(UserDO user) {
        userMapper.updateById(user);
    }
}

🚀 部署与运维

Docker容器化部署

# Dockerfile for Vue2 frontend
FROM nginx:alpine

COPY dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf

EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
# nginx.conf
server {
    listen 80;
    server_name localhost;
    
    location / {
        root /usr/share/nginx/html;
        index index.html index.htm;
        try_files $uri $uri/ /index.html;
    }
    
    location /admin-api/ {
        proxy_pass http://backend:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

监控与日志

# Spring Boot Admin配置
spring:
  boot:
    admin:
      client:
        url: http://localhost:8081
        instance:
          service-url: http://localhost:8080
          
management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics
  endpoint:
    health:
      show-details: always

🐛 常见问题解决方案

1. 权限配置不生效

问题描述:菜单或按钮权限配置后前端不显示

解决方案

// 检查路由守卫配置
router.beforeEach(async (to, from, next) => {
  // 获取用户信息
  const hasToken = getToken()
  if (hasToken) {
    if (to.path === '/login') {
      next({ path: '/' })
    } else {
      const hasRoles = store.getters.roles && store.getters.roles.length > 0
      if (hasRoles) {
        next()
      } else {
        try {
          // 获取用户信息
          const { roles } = await store.dispatch('user/getInfo')
          // 生成可访问的路由
          const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
          // 动态添加路由
          router.addRoutes(accessRoutes)
          next({ ...to, replace: true })
        } catch (error) {
          await store.dispatch('user/resetToken')
          next(`/login?redirect=${to.path}`)
        }
      }
    }
  } else {
    /* 没有token的情况 */
  }
})

2. 表格数据不更新

问题描述:操作后表格数据没有实时刷新

解决方案

<script>
export default {
  methods: {
    async handleDelete(row) {
      try {
        await this.$confirm('确认删除该用户?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        })
        
        await deleteUser(row.id)
        this.$message.success('删除成功')
        
        // 强制刷新表格数据
        this.listKey = +new Date()
        this.getList()
      } catch (error) {
        if (error !== 'cancel') {
          this.$message.error('删除失败')
        }
      }
    }
  }
}
</script>

📊 版本对比与迁移指南

Vue2 vs Vue3 功能对比

特性Vue2版本Vue3版本备注
组件系统Options APIComposition APIVue3提供更好的逻辑复用
性能良好优秀Vue3有更好的Tree-shaking
生态兼容成熟稳定逐步完善Vue2生态更成熟
学习成本中高Vue2更容易上手
长期支持维护期主流版本根据项目周期选择

迁移建议

mermaid

🎯 总结与展望

ruoyi-vue-pro的Vue2版本为传统Vue2技术栈团队提供了完美的企业级解决方案。通过本文的详细指南,你可以:

  1. 快速上手:从环境搭建到功能开发的全流程指导
  2. 深度定制:基于成熟架构进行二次开发和功能扩展
  3. 性能优化:获得生产环境级别的性能调优方案
  4. 规避风险:避免常见问题的重复踩坑

无论你是维护现有Vue2项目还是启动新项目,ruoyi-vue-pro Vue2版本都能提供稳定、高效、功能丰富的技术底座。

下一步行动:立即访问演示地址体验功能,或按照本文指南开始你的项目之旅!

演示地址:http://dashboard.yudao.iocoder.cn


点赞、收藏、关注三连,获取更多开源项目实战指南!

【免费下载链接】ruoyi-vue-pro 🔥 官方推荐 🔥 RuoYi-Vue 全新 Pro 版本,优化重构所有功能。基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 微信小程序,支持 RBAC 动态权限、数据权限、SaaS 多租户、Flowable 工作流、三方登录、支付、短信、商城、CRM、ERP、AI 等功能。你的 ⭐️ Star ⭐️,是作者生发的动力! 【免费下载链接】ruoyi-vue-pro 项目地址: https://gitcode.com/yudaocode/ruoyi-vue-pro

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值