在数字化转型浪潮中,企业普遍面临这样的困境:传统的PC端管理系统无法满足移动办公需求,而单独开发移动应用又面临技术栈复杂、开发成本高、维护困难等问题。你是否也在为这些问题烦恼?
本文将为你全面解析芋道RuoYi-Vue-Pro项目的Uniapp移动端解决方案,让你快速掌握企业级移动应用开发的最佳实践。
技术组件
管理后台Uniapp
商城Uniapp
优势说明
开发框架
Vue2 + Uniapp
Vue2 + Uniapp
一套代码多端运行
UI组件库
uView UI
uView UI
丰富的组件生态
状态管理
Vuex
Vuex
集中式状态管理
网络请求
uni.request
uni.request
内置HTTP客户端
路由管理
uni-app路由
uni-app路由
原生路由支持
打包构建
HBuilderX
HBuilderX
官方开发工具
# 安装HBuilderX# 下载地址:官方推荐版本 # 克隆项目代码git clone https://gitcode.com/yudaocode/ruoyi-vue-pro.git # 安装依赖npm install # 运行开发环境npm run dev:%PLATFORM%
yudao-ui-admin-uniapp/├── components/ # 公共组件├── pages/ # 页面文件├── static/ # 静态资源├── store/ # Vuex状态管理├── uni_modules/ # uni-app模块├── utils/ # 工具函数├── App.vue # 应用入口├── main.js # 主程序文件└── manifest.json # 应用配置
// utils/request.jsimport { getToken } from '@/utils/auth' const baseURL = process.env.VUE_APP_BASE_API const request = (options = {}) => { return new Promise((resolve, reject) => { uni.request({ url: baseURL + options.url, method: options.method || 'GET', data: options.data || {}, header: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + getToken(), ...options.header }, success: (res) => { if (res.statusCode === 200) { resolve(res.data) } else { reject(res) } }, fail: (err) => { reject(err) } }) })} // 导出常用的请求方法export const get = (url, data = {}) => { return request({ url, method: 'GET', data })} export const post = (url, data = {}) => { return request({ url, method: 'POST', data })}
// pages/login/login.vue<template> <view class="login-container"> <u-form :model="form" ref="uForm"> <u-form-item label="用户名" prop="username"> <u-input v-model="form.username" placeholder="请输入用户名" /> </u-form-item> <u-form-item label="密码" prop="password"> <u-input v-model="form.password" password placeholder="请输入密码" /> </u-form-item> <u-button type="primary" @click="handleLogin">登录</u-button> </u-form> </view></template> <script>import { login } from '@/api/user' export default { data() { return { form: { username: '', password: '' }, rules: { username: [ { required: true, message: '请输入用户名', trigger: 'blur' } ], password: [ { required: true, message: '请输入密码', trigger: 'blur' } ] } } }, methods: { async handleLogin() { try { const res = await login(this.form) if (res.code === 200) { uni.setStorageSync('token', res.data.token) uni.showToast({ title: '登录成功', icon: 'success' }) uni.switchTab({ url: '/pages/index/index' }) } } catch (error) { uni.showToast({ title: error.message, icon: 'none' }) } } }}</script>
// store/modules/user.jsconst state = { token: uni.getStorageSync('token') || '', userInfo: uni.getStorageSync('userInfo') || null} const mutations = { SET_TOKEN: (state, token) => { state.token = token uni.setStorageSync('token', token) }, SET_USER_INFO: (state, userInfo) => { state.userInfo = userInfo uni.setStorageSync('userInfo', userInfo) }, CLEAR_TOKEN: (state) => { state.token = '' state.userInfo = null uni.removeStorageSync('token') uni.removeStorageSync('userInfo') }} const actions = { login({ commit }, userInfo) { return new Promise((resolve, reject) => { login(userInfo).then(response => { const { data } = response commit('SET_TOKEN', data.token) resolve(data) }).catch(error => { reject(error) }) }) }, logout({ commit }) { return new Promise((resolve) => { commit('CLEAR_TOKEN') resolve() }) }} export default { namespaced: true, state, mutations, actions}
// 平台条件编译// #ifdef MP-WEIXINconsole.log('微信小程序平台')// #endif // #ifdef H5console.log('H5平台')// #endif // #ifdef APP-PLUSconsole.log('APP平台')// #endif // 版本条件编译// #ifdef VUE3console.log('Vue3版本')// #elseconsole.log('Vue2版本')// #endif
// 图片懒加载组件<template> <image :src="placeholder" :data-src="realSrc" @load="handleLoad" lazy-load /></template> <script>export default { props: { src: String, placeholder: { type: String, default: '/static/images/placeholder.png' } }, data() { return { realSrc: this.placeholder } }, methods: { handleLoad() { this.realSrc = this.src } }}</script>
// utils/cache.jsconst cache = new Map() export const cachedRequest = (key, requestFn, ttl = 300000) => { const now = Date.now() const cached = cache.get(key) if (cached && now - cached.timestamp < ttl) { return Promise.resolve(cached.data) } return requestFn().then(data => { cache.set(key, { data, timestamp: now }) return data })} // 使用示例const getUserInfo = () => { return cachedRequest('user_info', () => { return get('/api/user/info') })}
#!/bin/bash# deploy.sh echo "开始构建Uniapp项目..." # 构建H5端npm run build:h5 # 构建微信小程序npm run build:mp-weixin # 构建APP端npm run build:app-plus echo "构建完成,开始部署..." # 部署到CDN(H5)rsync -avz ./dist/build/h5/ user@server:/path/to/h5/ # 上传微信开发者工具./node_modules/.bin/uni-app -p mp-weixin --upload echo "部署完成!"
// manifest.json 配置{ "h5": { "devServer": { "proxy": { "/api": { "target": "http://your-api-server.com", "changeOrigin": true, "secure": false } } } }}
/* 通用样式重置 */.u-container { /* #ifdef MP-WEIXIN */ padding: 20rpx; /* #endif */ /* #ifdef H5 */ padding: 10px; /* #endif */ /* #ifdef APP-PLUS */ padding: 15px; /* #endif */} /* 解决iOS安全区域 */.safe-area { padding-bottom: constant(safe-area-inset-bottom); padding-bottom: env(safe-area-inset-bottom);}
// 获取系统信息适配导航栏const systemInfo = uni.getSystemInfoSync()const { statusBarHeight, platform } = systemInfo // 计算导航栏高度let navBarHeight = 44if (platform === 'android') { navBarHeight = 48} export const customNavBarHeight = statusBarHeight + navBarHeight
通过芋道RuoYi-Vue-Pro的Uniapp移动端解决方案,企业可以快速构建跨平台移动应用,显著降低开发成本和维护难度。该方案具有以下优势:
未来,该方案将继续完善对更多平台的支持(如支付宝小程序、抖音小程序等),并持续优化性能和开发体验。
立即行动:克隆项目代码,开始你的移动端开发之旅吧!记得给项目点个Star⭐,这是对开源作者最好的支持。
本文基于芋道RuoYi-Vue-Pro项目编写,旨在帮助开发者快速掌握Uniapp移动端开发技能。
原网址: 访问
创建于: 2025-09-10 23:28:08
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
最新评论