news 2026/6/15 10:10:24

RuoYi-Cloud后端与移动端协同开发:从零构建用户管理模块实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RuoYi-Cloud后端与移动端协同开发:从零构建用户管理模块实战

1. 环境准备与项目初始化

在开始构建用户管理模块前,我们需要先搭建好开发环境。这里我推荐使用HBuilderX作为开发工具,它内置了uniapp开发所需的所有插件和调试工具。安装完成后,通过以下步骤初始化项目:

  1. 从RuoYi官方仓库克隆前端模板:
git clone https://gitee.com/y_project/RuoYi-App.git
  1. 安装依赖(建议使用pnpm提升安装速度):
cd RuoYi-App && pnpm install
  1. 后端环境建议使用RuoYi-Cloud的最新版本,确保Nacos服务已启动。我在实际项目中遇到过版本不兼容的问题,所以特别提醒大家要检查版本对应关系:
前端版本后端兼容版本
v1.2.0RuoYi-Cloud 3.7.0+

配置中最容易出错的是Nacos服务发现配置。记得在application.yml中检查这两个关键配置:

spring: cloud: nacos: discovery: server-addr: 127.0.0.1:8848 config: server-addr: 127.0.0.1:8848

2. 后端用户模块开发实战

2.1 数据库设计与实体映射

用户表设计要考虑扩展性,这是我优化过的表结构:

CREATE TABLE `app_user` ( `user_id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID', `user_name` varchar(30) NOT NULL COMMENT '用户账号', `nick_name` varchar(30) NOT NULL COMMENT '用户昵称', `email` varchar(50) DEFAULT '' COMMENT '邮箱', `phonenumber` varchar(11) DEFAULT '' COMMENT '手机号码', `sex` char(1) DEFAULT '0' COMMENT '性别(0未知 1男 2女)', `avatar` varchar(100) DEFAULT '' COMMENT '头像地址', `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)', `del_flag` char(1) DEFAULT '0' COMMENT '删除标志', `login_ip` varchar(50) DEFAULT '' COMMENT '最后登录IP', `login_date` datetime DEFAULT NULL COMMENT '最后登录时间', `create_by` varchar(64) DEFAULT '' COMMENT '创建者', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_by` varchar(64) DEFAULT '' COMMENT '更新者', `update_time` datetime DEFAULT NULL COMMENT '更新时间', `remark` varchar(500) DEFAULT NULL COMMENT '备注', PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表';

对应的Domain对象要加上Swagger注解方便调试:

@Data @ApiModel("用户实体") public class AppUser { @ApiModelProperty("用户ID") private Long userId; @NotBlank(message = "用户账号不能为空") @Size(min = 2, max = 30) @ApiModelProperty("用户账号") private String userName; // 其他字段省略... }

2.2 业务逻辑层实现

Service层要处理好事务和异常,这是我的实现方案:

@Service public class AppUserServiceImpl implements IAppUserService { @Autowired private AppUserMapper userMapper; @Override @Transactional(readOnly = true) public List<AppUser> selectAppUserList() { return userMapper.selectAppUserList(); } @Override @Transactional(rollbackFor = Exception.class) public int insertAppUser(AppUser user) { // 用户名唯一性校验 if (userMapper.checkUserNameUnique(user.getUserName()) > 0) { throw new ServiceException("用户名已存在"); } user.setCreateTime(DateUtils.getNowDate()); return userMapper.insertAppUser(user); } }

2.3 控制层RESTful设计

控制器要处理好参数校验和返回格式:

@RestController @RequestMapping("/app/user") @Api(tags = "用户管理") public class AppUserController extends BaseController { @Autowired private IAppUserService userService; @GetMapping("/list") @ApiOperation("获取用户列表") public TableDataInfo list(AppUser user) { startPage(); List<AppUser> list = userService.selectAppUserList(user); return getDataTable(list); } @PostMapping @ApiOperation("新增用户") public AjaxResult add(@Validated @RequestBody AppUser user) { return toAjax(userService.insertAppUser(user)); } }

3. 前端uni-app集成

3.1 API请求封装

api/user.js中封装用户相关接口:

import request from '@/utils/request' export function getUserList(params) { return request({ url: '/app/user/list', method: 'get', params }) } export function addUser(data) { return request({ url: '/app/user', method: 'post', data }) }

3.2 页面组件开发

使用uni-ui的组件快速搭建界面:

<template> <view class="container"> <uni-card> <uni-table :data="userList"> <uni-table-column prop="userName" label="用户名"></uni-table-column> <uni-table-column prop="nickName" label="昵称"></uni-table-column> <uni-table-column label="操作"> <template #default="scope"> <uni-link @click="editUser(scope.row)">编辑</uni-link> </template> </uni-table-column> </uni-table> <uni-pagination :total="total" @change="handlePageChange" /> </uni-card> </view> </template> <script> import { getUserList } from '@/api/user' export default { data() { return { userList: [], total: 0, queryParams: { pageNum: 1, pageSize: 10 } } }, mounted() { this.loadData() }, methods: { async loadData() { const res = await getUserList(this.queryParams) this.userList = res.rows this.total = res.total }, handlePageChange(e) { this.queryParams.pageNum = e.current this.loadData() } } } </script>

4. 跨平台适配与调试技巧

4.1 条件编译处理平台差异

不同平台需要特殊处理的地方:

<template> <!-- #ifdef MP-WEIXIN --> <button open-type="getUserInfo">微信授权</button> <!-- #endif --> <!-- #ifdef H5 --> <button @click="h5Login">H5登录</button> <!-- #endif --> </template> <script> export default { methods: { // #ifdef MP-WEIXIN wxLogin() { uni.login({ success(res) { console.log(res.code) } }) }, // #endif // #ifdef H5 h5Login() { this.$refs.form.validate() } // #endif } } </script>

4.2 性能优化实践

  1. 图片懒加载
<image lazy-load :src="user.avatar" mode="aspectFill" ></image>
  1. 分页加载优化
// 使用z-paging组件实现上拉加载 <z-paging ref="paging" v-model="dataList" @query="queryList" > <!-- 列表内容 --> </z-paging>
  1. 接口缓存策略
// 在store中缓存用户数据 const userStore = defineStore('user', { state: () => ({ cache: new Map() }), actions: { async getUser(id) { if (this.cache.has(id)) { return this.cache.get(id) } const res = await getUserDetail(id) this.cache.set(id, res) return res } } })

5. 常见问题解决方案

  1. 跨域问题:在gateway模块添加CORS配置
@Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); config.addAllowedOrigin("*"); config.addAllowedHeader("*"); config.addAllowedMethod("*"); source.registerCorsConfiguration("/**", config); return new CorsFilter(source); }
  1. 小程序真机调试白屏:检查以下配置
  • 确保域名已加入小程序后台request合法域名
  • 基础库版本不低于2.10.0
  • 清除编译缓存后重新运行
  1. H5页面路由刷新404:配置Nginx重定向
location / { try_files $uri $uri/ /index.html; }
  1. 表单验证最佳实践
<uni-forms :model="form" :rules="rules" ref="form"> <uni-forms-item label="用户名" name="userName"> <uni-easyinput v-model="form.userName" /> </uni-forms-item> </uni-forms> <script> export default { data() { return { rules: { userName: { rules: [{ required: true, errorMessage: '请输入用户名' }] } } } } } </script>
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 20:13:32

如何用600美元构建家用双机械臂系统

如何用600美元构建家用双机械臂系统 【免费下载链接】XLeRobot XLeRobot: Practical Household Dual-Arm Mobile Robot for ~$660 项目地址: https://gitcode.com/GitHub_Trending/xl/XLeRobot 一、为什么开源机械臂DIY成为技术探索新方向&#xff1f; 近年来&#xff…

作者头像 李华
网站建设 2026/6/10 12:37:59

660美元打造家用双臂机器人:XLeRobot技术解析与实践指南

660美元打造家用双臂机器人&#xff1a;XLeRobot技术解析与实践指南 【免费下载链接】XLeRobot XLeRobot: Practical Household Dual-Arm Mobile Robot for ~$660 项目地址: https://gitcode.com/GitHub_Trending/xl/XLeRobot XLeRobot项目通过巧妙集成SO-100/SO-101开源…

作者头像 李华
网站建设 2026/6/13 21:28:46

CosyVoice 2.0 实战安装指南:从环境配置到生产级部署避坑

背景痛点&#xff1a;为什么“跑通”≠“可上线” 第一次把 CosyVoice 2.0 扔到服务器里&#xff0c;我踩的坑比写的代码还多&#xff1a; pip 一口气装了 180 多个包&#xff0c;结果 libsndfile 版本冲突&#xff0c;推理到一半直接段错误默认线程池开得比 CPU 核数还多&am…

作者头像 李华
网站建设 2026/6/10 15:34:42

智能内容破壁:Bypass Paywalls Clean重新定义付费内容访问方式

智能内容破壁&#xff1a;Bypass Paywalls Clean重新定义付费内容访问方式 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 核心原理&#xff1a;突破数字壁垒的智能引擎 付费墙检测机…

作者头像 李华
网站建设 2026/6/13 2:55:18

高效专业的图片优化完全指南:MozJPEG开源工具应用详解

高效专业的图片优化完全指南&#xff1a;MozJPEG开源工具应用详解 【免费下载链接】mozjpeg Improved JPEG encoder. 项目地址: https://gitcode.com/gh_mirrors/mo/mozjpeg 图片优化是提升网站性能和用户体验的关键环节&#xff0c;而开源工具为开发者提供了强大且经济…

作者头像 李华
网站建设 2026/6/13 23:56:20

如何使用SQLFlow实现数据血缘可视化:从问题到实践的完整指南

如何使用SQLFlow实现数据血缘可视化&#xff1a;从问题到实践的完整指南 【免费下载链接】sqlflow_public Document, sample code and other materials for SQLFlow 项目地址: https://gitcode.com/gh_mirrors/sq/sqlflow_public 数据血缘可视化是现代数据治理的核心需求…

作者头像 李华