news 2026/9/14 22:49:04

SpringBoot+Vue图书管理系统:从数据库设计到前后端联调的完整实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot+Vue图书管理系统:从数据库设计到前后端联调的完整实战指南

如果你点进来,大概率正在为毕业设计或课程设计发愁。SpringBoot+Vue的图书管理系统,确实是经典中的经典,但经典也意味着你很容易撞车。真正拉开差距的,不是“你做了个图书管理系统”,而是“你做的图书管理系统能不能跑通、能不能讲清楚、答辩时能不能扛住老师的追问”。这套技术栈覆盖了Java后端、MySQL数据库、Vue前端、HTTP交互、权限控制这一整套闭环,对于毕设、课设或者想练手全栈项目的人来说,都是回报率很高的选择。

我自己前后帮人排查过很多次类似项目的问题,也从最初的“页面能打开就算成功”到后来一步步把借阅流程、库存状态、权限拦截这些细节补齐。这篇内容会从项目整体设计、数据库建模、后端接口、前端页面、前后端联调、部署排错这几个方向完整拆一遍。这个过程也是我认为做一个能拿得出手的图书管理系统最合理的路线。

1. 项目整体定位与方案选型

1.1 为什么这个选题值得做

图书管理系统在毕设和课设里的出镜率一直很高,原因不是它简单,而是它的业务模型足够“安全”。图书、读者、借阅、归还、续借,这些概念不需要科普,老师一听就懂,你自己也不用花大量时间去理解领域知识。对比电商系统里的秒杀、库存、支付,图书管理系统没有特别复杂的并发场景,但它依然包含了一个业务系统最核心的通用能力:登录认证、增删改查、分页搜索、状态流转。

换句话说,这是一个“麻雀虽小,五脏俱全”的项目。做完这个系统,你不仅能交差,还能把SpringBoot和Vue的开发套路彻底打通。面试时候聊项目,你完全可以把图书管理里遇到的问题迁移到更复杂的业务场景上去讲,比如“图书库存的扣减逻辑类似订单库存预占”“不同角色的权限控制类似RBAC权限模型”,这种表达能力是背面试题背不出来的。

1.2 图书管理系统到底“管”什么

很多第一次做这个题目的同学,上来就建表、写页面,结果做到一半发现逻辑很乱。我建议第一步先别碰代码,把业务边界画清楚。图书管理系统要管的核心对象有三个:图书、读者、借阅关系。

再往下拆,就是角色和操作。最典型的角色有三种:系统管理员、图书管理员、读者。

  • 系统管理员负责用户管理、权限分配、基础数据维护,比如新增一个管理员账号、重置密码。
  • 图书管理员负责图书信息录入、图书上下架、处理借书和还书操作。
  • 读者角色可以查询图书、查看个人借阅记录、发起借阅或续借申请。

这里有一个很容易踩的坑:如果你把借书流程做成“读者自己点击借阅按钮就直接借走”,那系统就失去了管理意义。现实中图书馆一定有一个“管理员审核确认”的环节。哪怕你只做最简版本,也应该在数据库层面区分“在馆”和“已借出”两种状态,并且借阅记录需要关联操作人。这个点后面我会再展开,因为它直接决定了你系统的复杂度,也是答辩时老师最容易追问的地方。

1.3 技术栈选型为什么是这三件套

后端用SpringBoot而不是SSH或纯Servlet,核心原因不是SpringBoot更高级,而是它把项目启动成本降到了最低。你不需要手动配置一堆XML,内嵌Tomcat意味着打包后一个jar包就能跑起来,起步依赖也省去了纠结版本的时间。对你来说,写代码的时间应该花在业务逻辑上,而不是花在配置环境上。

前端用Vue而不继续用JSP,是因为现在的开发模式已经是前后端分离为主流。Vue工程通过网络请求访问后端接口,后端只负责返回JSON数据,不再是以前那种服务端渲染页面的方式。用Vue还有一个实际好处:页面交互体验流畅,组件化思路清晰,做出来的系统从观感上更像一个“现代化系统”,在答辩演示时本身就加分。

数据库选MySQL没什么悬念,开源、免费、资料多。对课设毕设来说,遇到任何问题——中文报错也好,乱码也好,连接失败也好——你几乎都能在社区找到答案。后面我会给出一套最稳妥的MySQL配置建议,避免版本问题浪费你的时间。

2. 系统设计思路与数据库建模

2.1 前端项目设计思路

从设计思路上看,这个系统不应该做成“每个功能一个零散页面”。前后端分离的项目,一定要有“布局-路由-页面-组件”的层次感。最常规的做法是采用后台管理布局:左侧是导航菜单,顶部是用户信息和退出按钮,右侧内容区根据路由切换展示不同页面。

导航菜单建议按角色区分,比如管理员可以看到“用户管理”菜单,普通读者看不到。但这里要注意,前端隐藏菜单只是体验优化,真正的权限控制必须由后端接口来保证。如果前端把按钮藏起来,但用户猜到了接口地址直接发请求,后端却没有校验,那就是严重漏洞。所以设计时应默认一条原则:前端控制“显示什么”,后端控制“能不能执行”。

2.2 数据库表设计与关系

我在设计表结构时,通常会画一张简单的ER图,哪怕只在纸上画也行。核心表我建议至少包含下面五张,同时考虑扩展一些辅助表。

  • user表:用户表,字段包括id、用户名、密码、真实姓名、角色、状态、创建时间。密码字段不要用明文,建议存储MD5或BCrypt加密后的密文。
  • book表:图书表,字段包括id、书名、ISBN、作者、出版社、分类、图书封面URL、总库存、可借库存、位置、状态、创建时间。
  • borrower表:读者信息表。如果用户表本身就是读者,这里也可以拆分设计,但更灵活的方式是把用户的基础账号信息和读者扩展信息分开。如果为了简化,可以直接在user表上增加读者相关的字段,比如借阅上限。对学生项目来说,简化未必是坏事,但要有理由。
  • borrow_record表:借阅记录表,这是整个系统的核心,字段包括id、图书id、读者id、借书管理员id、借书时间、应还时间、实际归还时间、续借次数、状态。
  • category表:图书分类表,用于图书分类维护。不做也没关系,但做了会让项目显得更完整。

这些表的关系也很清晰:一本书可以被多条借阅记录引用,一个读者可以有多条借阅记录,所以book和user与borrow_record分别是一对多关系。读者和图书之间是多对多关系,中间表就是借阅记录表。

设计阶段你还要想清楚一个问题:一本书借出去,到底是“图书实体被借走”还是“库存数量减少”?图书管理系统里常常会出现同一本书有多个副本,比如《Java编程思想》馆藏10本。这时候数据库里可以有两种做法:第一种是book表只存一种书,用一个“可借数量”字段维护库存,借书时数量减一,还书时数量加一。第二种是把每本实体书都单独建一条数据,用一个唯一编号区分每本副本,这样每一本都有独立的借还状态。

对初学者,我推荐第一种方式,简单好理解,报表也好统计。但如果你想让项目更有深度,可以考虑第二种,同时在book_item表里增加一个“状态”字段来标记每本副本是在馆、借出还是损坏。两种方案正反都能讲,关键是你在答辩时能说清楚自己为什么这么设计。

2.3 图书借阅状态流转是核心细节

图书状态看起来简单,但很多人做系统时往往会在这里翻车。借书流程如果只做“把状态改成已借出”,会出现很多边界情况:还书逾期怎么办?图书被预约了怎么办?同一个读者借阅数量超过上限怎么办?这些都不是教科书上的考点,但都是实际运行中必然遇到的问题。

我用一个最简单的状态机来管理借阅记录:

  • 借出:读者借书成功,管理员确认,记录生成,状态为借出中。
  • 已还:读者归还图书,管理员确认,状态改为已还。
  • 逾期:当前时间超过应还时间,且状态仍为借出中。这个状态不一定要单独存在数据库里,可以实时计算,但更稳妥的方式是定期任务扫描并修改状态。
  • 续借:在未逾期的情况下,读者可以申请续借一次或两次,每次延长固定天数。

这里有个实际建议:不要通过修改“借阅状态”字段来实现所有逻辑,而应该以“借阅记录”为主表,用时间和状态字段组合判断。比如判断一本书当前是否被借出,查一下有没有状态为借出中的记录即可。这样即使某天数据出问题,也比较容易排查和修正。

3. 后端实现:SpringBoot怎么落地

3.1 项目初始化与依赖选择

创建SpringBoot项目时,推荐使用Spring Initializr,不管是IDEA自带的还是网页版都可以。Java版本建议根据学校要求来,如果没要求,用Java 8或Java 11最稳,因为这两个版本的生态兼容性最好,教程也最多。SpringBoot版本我倒不建议追新,选一个相对稳定的版本即可。如果你用Java 8,SpringBoot 2.7.x系列就不会出太大问题;如果你非要用SpringBoot 3.x,那Java版本至少要17,且一些旧依赖可能不兼容,这个坑会在后面细说。

核心依赖包括:

  • spring-boot-starter-web:提供WEB能力,内嵌Tomcat。
  • mybatis-spring-boot-starter:使用MyBatis作为ORM框架。比JPA更直观,SQL可控性更强,也更适合答辩时讲清楚。
  • mysql-connector-java:MySQL驱动。
  • lombok:简化实体类代码。
  • jjwt或java-jwt:用于生成和校验JWT Token,实现登录认证。
  • spring-boot-starter-validation:参数校验。

很多人会在MyBatis和JPA之间纠结。我个人的倾向是,如果你想把SQL掌控在自己手里,或者你希望SQL语句更“像你会的东西”,选MyBatis。如果你希望少写代码,加快开发速度,选Spring Data JPA。图书管理系统这种业务,用MyBatis写SQL反而更容易体现你对数据库设计的理解,因为老师看到你写的多表联查SQL,会比看到自动生成的SQL更有印象。

3.2 实体类、Mapper层与业务层

后端代码建议严格分层:Controller层负责接收请求和返回结果,Service层负责业务逻辑,Mapper层负责数据库操作。不要把所有代码堆在Controller里,那样后期改起来非常痛苦。

实体类直接用Lombok的@Data注解可以让代码变得干净,但有一点要提醒:密码字段在序列化时一定要忽略。你可以用@JsonIgnore注解,或者在返回VO对象时不返回密码字段。曾经有人因为没做这一步,登录接口返回了用户对象,结果把密码哈希也吐给了前端,虽然没有直接用明文密码,但这个问题在答辩时会被放大。

Mapper层用MyBatis时,最简单的做法是写一个Mapper接口配合XML文件。XML里的SQL语句不要用SELECT *,明确列出字段会更清晰。多表联查时,比如查询借阅记录需要关联出书名和读者名,建议写一个带有JOIN的SQL,拆成专门的VO字段来接收结果,而不是在Java代码里循环查询,那样性能差且代码难看。

Service层要处理的业务规则包括:借书时检查读者是否存在、能否借书、是否有可借库存;还书时计算是否逾期;删除图书时检查是否有关联借阅记录。这些规则虽然简单,但每一行代码都对应一个可能的异常分支,写好之后会让系统显得很稳重。

3.3 通用返回体与异常处理

前后端分离项目最忌讳的就是每个接口返回格式不统一。有的接口成功返回data,有的接口返回{code:1},前端拿到数据还要各种判断,这种项目维护起来就是灾难。建议所有接口统一返回一个Result对象,结构通常是:

{ "code": 200, "message": "操作成功", "data": {} }

前端只需要判断code是否等于200,再用data渲染页面。至于其他错误码,可以根据业务定义,比如401表示未登录、403表示无权限、500表示服务器异常。让全局异常处理器统一接管Service层抛出的异常,转换为对应的Result返回,前端就不需要为每个接口单独写try-catch。

全局异常处理除了做Result包装,还能在日志中打印堆栈信息,方便排查问题。很多课设项目在答辩演示时突然报错,就是因为异常信息被直接抛出到页面上,操作者完全不知道哪里出了问题。有了全局异常处理器,至少返回信息是可控的。

3.4 JWT登录认证怎么做

登录认证是图书管理系统绕不开的模块。简单版可以用Session,但我更推荐JWT,原因有两个:第一,JWT天然适合前后端分离的场景,Token存在前端,每次请求带在Header里即可,不需要服务端保存session;第二,JWT是无状态认证,适合部署到多实例环境,这个点在答辩时也是亮点。

实现逻辑可以简化成:

  1. 用户提交用户名和密码。
  2. 后端查询数据库,校验密码(BCrypt匹配)。
  3. 校验通过后,用密钥生成一个JWT Token,把用户id和角色放进Token的claim里。
  4. 返回Token给前端,前端存储在本地或内存中。
  5. 前端请求接口时,在Header中附带Authorization: Bearer token。
  6. 后端写一个拦截器或过滤器,在进入Controller之前解析Token,获取当前用户信息,放行合法请求。

这套流程看起来简单,但细节处容易出错。一是JWT的过期时间,建议设置合理值,比如2小时。二是密码加密,不要用MD5,因为MD5可以被彩虹表穷举,直接用Spring Security里的BCryptPasswordEncoder更安全。三是拦截器要注意放行登录接口和静态资源路径,否则会出现“前端能打开登录页,但一点登录就报401”的尴尬情况。

4. 前端实现:Vue页面与交互

4.1 Vue版本选择:Vue2还是Vue3

如果你现在重新开始做新项目,我建议直接用Vue3。Vue3的组合式API让代码组织更清晰,生态也已经很成熟。但如果你的参考资料、视频教程、老项目代码都是Vue2,那也不要纠结,Vue2完全够用。图书管理系统本身不复杂,不存在框架性能瓶颈,关键是你能不能基于现有资料快速完成开发。

前端依赖方面,核心是vue-router和vuex或pinia。vue-router用来管理路由,pinia适合在Vue3中做全局状态管理,比如存储用户信息和登录状态。UI组件库我推荐Element Plus(Vue3)或Element UI(Vue2),表格、表单、弹窗、分页这类后台常用组件都有现成实现,可以让页面在短时间内变得专业。

这里有一个注意点:Vue CLI创建项目和Vite创建项目的差别。Vite启动速度更快,配置也更简洁,推荐使用。如果学校环境要求低版本Node.js,可能会遇到兼容性问题,这时候用Vue CLI反而更稳。Node.js版本太低或太高都可能让依赖安装失败,具体排错见后面的问题清单。

4.2 路由和权限控制

系统页面建议使用布局组件嵌套子路由。比如登录页和主页是两个顶级路由,主页下再嵌套图书管理、借阅管理、用户管理等子路由。页面路径设计要有语义,比如/books、/borrow-records、/users,方便维护和演示。

权限控制要分两层来做。第一层是前端路由守卫,在全局前置守卫里判断本地有没有Token。没有Token就跳转到登录页。有Token但访问的路由需要更高权限时,再结合用户角色判断是否放行。第二层是后端接口权限校验,比如只有管理员才能调用用户删除接口。前端路由守卫解决的是体验问题,后端接口权限解决的是安全问题,两者都不能省。

Vue中展示用户信息建议通过pinia或vuex存储,这样不同页面都能直接读取。注意刷新页面时状态会丢失,所以最好在路由守卫或应用初始化时,根据本地存储的Token重新请求一次用户信息,或者直接把用户基础信息缓存到localStorage。但不要把Token和敏感信息都放在同一个key下,否则安全隐患很大。

4.3 图书管理页面核心交互

图书管理页面是项目的门面。表格展示图书信息时,建议每一行都提供“编辑”和“删除”按钮,同时提供新建图书按钮。新增和编辑共用一个弹窗表单,能极大减少重复代码。图书封面可以是一个URL字段,也可以做成文件上传,但文件上传会牵扯到静态资源服务,如果你想控制项目复杂度,先用URL即可。

搜索功能不要漏掉。图书名称、ISBN、分类是最常用的搜索条件。前端把搜索条件组装成查询参数传给后端,后端用MyBatis动态SQL实现多条件查询。分页用PageHelper插件或者手写LIMIT语句。PageHelper比较方便,但要注意它和MyBatis版本兼容,否则会出现分页失效的诡异问题。手写LIMIT反而更直白,也方便讲清楚实现原理。

借书还书页面我建议单独拆出来。借书流程是:输入读者编号和图书编号,后端校验后返回结果。页面给读者和图书各一个选择器,选择后展示对应的图书信息和读者信息,再点确认借出。这样的交互比直接输入编号更友好,演示效果也好得多。

5. 从开发到部署:联调全过程

5.1 本地开发环境配置

开发环境配置是整个项目里最容易劝退新手的一步。我的建议是固定一套能用的版本组合:JDK 8或11,Maven 3.6以上,Node.js 14或16(如果你用Vite和Vue3,Node 16更合适),MySQL 5.7或8.0都可以。三个环境变量JAVA_HOME、MAVEN_HOME、PATH务必配置好,检查方式是在命令行分别执行java -version、mvn -version、node -v、mysql --version。

MySQL安装好之后,第一步是创建一个专用数据库,比如library_db,字符集选择utf8mb4,因为utf8mb4能正确存储中文和一些特殊字符。如果导入SQL脚本后中文乱码,通常就是建库时的字符集没设置对。另外root账号密码建议设置得简单一点,方便本地开发,但如果你要部署到服务器,必须换成强密码。

启动后端项目前,在application.yml里配置数据库连接:

spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/library_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai username: root password: 123456 jackson: date-format: yyyy-MM-dd HH:mm:ss

url中一定要加上characterEncoding=utf8和serverTimezone=Asia/Shanghai,否则很可能会遇到中文乱码和时间相差8小时的问题。

启动前端项目相对简单,进入前端目录执行:

npm install npm run serve

如果npm install卡住或者下载失败,大概率是网络问题。可以考虑配置国内npm镜像,但注意要使用合规的软件源配置方式,不要使用任何绕过网络限制的方案。

5.2 前后端联调细节

联调是项目开发中最花时间的阶段。常见的问题包括跨域请求被拦截、接口路径不一致、字段名对不上、时间格式不一致、空数据导致前端渲染报错。

跨域问题很好识别:浏览器控制台出现CORS相关报错时,基本就是后端没有放开跨域。开发环境最简单的解决方法是在后端加一个CorsFilter,允许前端地址localhost:8080访问。我建议只在开发环境放开,部署到服务器后通过Nginx反向代理转发接口,这样就不会有跨域问题,也更接近真实项目架构。

接口路径不一致的情况经常出现在“前端叫错名字”或“后端改名后前端没同步”。联调前最好把接口文档整理出来,哪怕用简单的表格,把路径、请求方式、参数、返回值列出来,能省掉很多沟通成本。字段名对不上通常是后端返回的属性名是驼峰命名,而前端模板里写了下划线命名,或者反过来,逐一核对即可。

时间格式问题建议后端统一返回yyyy-MM-dd HH:mm:ss格式。很多人喜欢直接把LocalDateTime对象序列化给前端,导致前端拿到一串难解析的数组结构,很让人头大。配置好Jackson格式化,或者在后端直接返回字符串,都可以规避。

还有一个容易忽视的坑:前端拿到空数组或null时,模板表达式会报错。比如借阅记录为空时,bookName是null,页面显示“undefined”。这种问题可以在后端封装VO时统一处理,把可能为空的字段设置默认值,也可以在前端模板用表达式做空值保护。

5.3 打包部署

本地开发完成后,把前端打包成静态文件,后端打包成jar包,部署到Linux服务器或本地直接演示,都是很常见的做法。

前端打包需要在工程目录下执行:

npm run build

产物会生成到dist目录,里面是静态的HTML、CSS和JS文件。如果你有Nginx,把dist目录指向Nginx的root路径,然后配置反向代理,把/api开头的请求转发到后端端口,就可以模拟线上部署。如果没有服务器,也可以直接把dist目录里的文件放到SpringBoot的static目录下,再打包进jar包,实现单jar包启动。

后端打包前先执行单元测试或至少检查一下依赖能否编译通过,再执行:

mvn clean package -DskipTests

生成的jar包在target目录下,运行方式很简单:

java -jar book-management-system.jar

启动成功后,默认端口是8080。如果端口被占用,可以在application.yml里修改server.port。这个时候用浏览器访问http://localhost:8080,如果能把前后端都跑起来,整个项目已经完成了一大半。

6. 常见问题与排查心得

6.1 环境与启动问题速查表

以下问题是我在实际复现和帮人排查时最常遇到的,你可以直接对照处理。

问题现象大概率原因解决办法
后端启动失败,报Failed to configure a DataSource数据库没启动,或配置文件的链接/账号/密码错误确认MySQL服务已开启,检查application.yml中的url、username、password
前端npm install失败,提示ERESOLVE或工具链版本不兼容Node和依赖版本不匹配固定Node版本,删除node_modules和package-lock.json后重新安装依赖
前端页面打开但接口请求全部失败跨域未配置或请求地址写错后端配置CORS,或前端改用Vite代理转发
数据库中文乱码建库字符集不是utf8mb4重建数据库,设置字符集为utf8mb4
分页查询显示所有数据PageHelper插件版本和MyBatis版本冲突统一使用兼容版本,或改用手写LIMIT分页
查询出的时间比实际时间少8小时未设置serverTimezone在数据库连接url中加入serverTimezone=Asia/Shanghai
登录成功但请求其它接口一直返回401JWT拦截器放行路径配置错误检查拦截器白名单,放行登录接口和静态资源

6.2 业务逻辑上的易踩坑

业务逻辑方面的坑,往往比环境问题更隐蔽。比如删除图书时,如果这本书还有未归还的借阅记录,数据库会报外键约束错误。这不是数据库不该有外键,而是你的业务逻辑没考虑清楚。正确的做法是删除前先查借阅记录,如果有未归还的,就提示“该图书存在未归还记录,无法删除”。这种严谨性,在答辩时很加分。

再比如用户注册功能。如果你开放了读者注册,一定要做用户名重复校验和密码强度校验。不要只在前端校验,后端也必须校验,因为前端校验随时可以被绕过。密码加密那一步不能省,即便你只是课设,也建议写几个字解释为什么用BCrypt而不用MD5。

退一步讲,图书管理系统的业务逻辑并不复杂,真正的复杂度都集中在“规则的边界条件”上。把边界条件逐一列出来,用代码实现,再准备几个测试用例,这个项目的质量就会明显高于普通课设水平。

6.3 答辩和学习过程中怎么说

做完项目之后,你还需要把技术亮点讲出来。不要只说“我用了SpringBoot和Vue”,那太普通了。你可以从这几个角度提炼亮点:

  • 安全性:密码BCrypt加密、登录Token过期机制、后端接口权限校验。
  • 规范性:统一Result返回格式、全局异常处理、分层架构清晰。
  • 业务完整性:借阅状态机、多条件搜索、分页、数据校验。
  • 工程化:前后端分离、打包部署、接口文档。

在面试或答辩时,不要背八股文,而是结合项目里的具体场景说。比如别人问你SpringBoot有哪些核心特性,你可以借“图书管理系统里用到了自动配置和起步依赖,提高了开发效率,同时遇到冲突时又通过排除特定自动配置来解决”来说明,这比背书有力得多。

如果后续还想扩展,可以加一个邮件提醒功能,在图书逾期时发送通知;或者加入Book预约功能;也可以引入Redis缓存热门图书列表。这些扩展方向都能让项目在基础功能之上具备更多可聊的空间。我个人在实际操作中的体会是:先跑通完整链路,再回头看代码质量,最后再谈优化。不要一上来就想着用什么高级特性,哪怕你只是用最基础的MyBatis和Vue把流程走通,这个项目已经足够证明你的全栈开发能力了。真正让你和别人拉开差距的,是你对每一个模块为什么这么设计的理解深度。

最后再分享一个小技巧:所有接口在开发时都要想一想“如果用户传了一个不存在的id会发生什么”“如果参数为空字符串会怎么样”。这些边界情况不用全部写在代码里,但至少要做到心里有数。把一个简单的业务系统做严谨,比做一个花哨但处处是洞的系统,更有价值。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 22:48:48

国微CMS源码解析:PHP站群系统架构与二次开发指南

简介:基于PHP的国微CMS部队门户站群系统源码,是一套面向部队单位网站建设的内容管理解决方案,适用于需要构建多级子站点、统一维护信息门户的PHP开发人员及部队信息化技术支持者。该系统围绕多站点管理、用户权限控制、模块化设计、模板引擎与…

作者头像 李华
网站建设 2026/9/14 22:48:45

React Native在OpenHarmony平台实现Shimmer效果的最佳实践

1. React Native与OpenHarmony平台下的Shimmer效果概述Shimmer效果是现代移动应用中广泛使用的加载状态指示器,它通过模拟光线扫过内容区域的视觉效果,为用户提供更自然、更友好的加载体验。在React Native跨平台开发框架中实现这一效果时,Op…

作者头像 李华
网站建设 2026/9/14 22:46:21

AtlasOS 实战指南:3 步让 Windows 11 更轻、更隐私、更跟手

AtlasOS 实战指南:3 步让 Windows 11 更轻、更隐私、更跟手 【免费下载链接】Atlas 🚀 An open and lightweight modification to Windows, designed to optimize performance, privacy and usability. 项目地址: https://gitcode.com/GitHub_Trending…

作者头像 李华
网站建设 2026/9/14 22:43:36

【javaweb】day3

1.<b> <strong>字体加粗&#xff1b;line-height行高&#xff1b;text-indent:2em首行缩进&#xff1b;&nbsp空格2.盒子模型&#xff1a;

作者头像 李华