若依使用及源码解析(前后端分离版)

这篇具有很好参考价值的文章主要介绍了若依使用及源码解析(前后端分离版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

部署环境

JDK >= 1.8

MYSQL >= 5.7

Maven >= 3.0

Node >= 12

Redis >= 3

运行若依项目

下载若依源码

 若依官网

若依项目源码(前后端分离)

运行后端项目 

ruoyi-ui就是vue项目(这里使用vscode打开) 

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript 整体用idea打开

1.配置数据库(sql提供sql文件中的sql脚本配置)

创建数据库 ruoyi_vue数据库并导入quartz.sql脚本和ry_20230706.sql脚本

结果为下:

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

 2.在工程中配置数据源(在ruoyi-admin中的配置文件中配置)

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

3.配置redis

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

4.通过启动类RuoYiApplication进行启动。 

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript 后端启动成功。

启动前端项目(ruoyi-ui) 

 1.打开前端项目若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

2.打开终端

#导入所需要的依赖
npm install 

#使用下面指令解决下载速度慢的问题
npm install --registry=https://registry.npmmirror.com

#启动前端项目
npm run dev

 前端启动结果为下:

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

用户名:admin,密码: admin123

进入主页

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

 验证码实现

实现的思路:后端会随机生成一个固定的表达式比如(2*2=?@4),通过字符串符分割的方式,获得对应的题目和答案,后端会通过该题目生成对应的验证码图, 并将答案存放到redis中,后端把生成好的图片和redis对应的key传给前端。前端通过调用后端api传入用户输入值和之前的key值,最终这个api查询redis,判断redis中的value是否和用户输入的值一样,最终实现验证码。

前端的实现步骤

1.在页面初始化时调用自定义方法 getCode

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

调用该方法后会获取到后端生成的图片 img 和对应的key,这里使用uuid表示。

 自定义的getCodeImage的方法为下若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

在该方法中调用了自定义方法request,该方法就是使用axios实现ajax。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

 在该request.js中设置的了前端请求的共部分 VUE_APP_BASE_API, 这里该值为:

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript 此时表示开发环境,我们后续可以根据需求设置为上线环境。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

 上线环境的配置为下:

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

因为Request方法中设置了BaseURL所以对应的getCodeImg的请求路径为下:

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

我们通过观察可以发现前端地址是 localhost:80, 而我们的后端接口却是localhost:8080,存在跨域的问题,这种跨域问题前端和后端都有方法解决,这里通过前端解决此问题。

前端通过反向代理的方法解决,使用vue自带的反向代理服务器。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

其中在进行反向代理的时候会将将/dev-api重写成空,如果将localhost:80代理成localhost:8080,最终实现反向代理。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

 最终前端实现验证码的效果。

后端的实现步骤

 Controlle层的实现方法为下:

判断项目是否开启验证,项目是支持不开启验证的。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript生成一个vo对象,用于最后返回给前端,这里的vo对象就是自定义的AjaxResult。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

 生成对应的uuid用于作为redis中的key。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

通过自定义方法createText生成题目和答案拼接的字符串,通过分割字符,获得题目和答案。

生成的表达式效果为下: 

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

通过createImage将题目生成对应的图片。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript 将key和对应的答案存放到redis中。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

将生成的图片以流的形式也就是这里的os,最终通过流的形式返回给前端, uuid和图片都封装到ajaxResult中,最终将这个vo返回给前端。

完成验证码。

登录实现

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

调用service层的login

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript 验证码校验

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

通过uuid从redis中获取对应验证码的答案,获取后就将对应的键值对从redis中删除,判断用户输入的验证码的有效性,错误就返回异常。

判断账号和密码的有效性 

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

 只要出现错误就会通过异步的方式记录日志到数据库中的sys_logininfor中若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

 sys_logininfor表为下:

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

 使用springsecurity设置权限若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

获取当前用户的登录信息,将该用户信息更新到数据库sys_user中 

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

updateUserProfile就是修改数据库表中对应的用户信息。

 sys_user表为下:

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

使用JWT生成对应的token令牌。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript 使用setUserAgent方法获取loginUser的完整信息。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

使用refreshToken方法设置loginUser的过期时间(默认是30分钟),在前端用不到,主要是为了做备份。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

 并将loginUser的信息持久化到redis中,设置其的有效时间。

生成JWT令牌

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript 最后会将生成好的token返回给前端。

在前端的login中

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

 会将获得JWT令牌设置为前端的token,也就是存到cookie中,最终完成登录。

获取用户角色和权限

getInfo(将最终的数据存在vueX中)

在我们进行登录操作以后,我们可以观察到发送了两个请求。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

1.前端实现

因为getInfo是获取用户的信息,所以为了保证正常的使用,进入每个界面都会调用getInfo,设置在全局路由 promission.js中。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

 router.beforeEach方法的作用就是在做每次路由前都会执行其中的内容。(这里就是每次都会执行getInfo和getRoutes)

在GetInfo方法中调用getInfo方法,最终返回给前端当前的用户数据,将用户数据存储在全局存储中(这里会存储用户的角色,权限,名字,头像 ,此处为该getInfo实现的核心)

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

在该方法中的getInfo方法的实现为下:

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript 就是调用后端的getInfo接口

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

 2.后端实现

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

 获取用户的身份信息,如果不是admin就到数据库中从查询。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

因为是多对多的关系,所以将sys_role,sys_user,sys_user_role三表联合起来查询。

最终查出用户的身份,并返回对应的身份。

获取用户的权限 ,如果用户是admin的话就直接返回*.*.*。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

 如果不是就到数据库查询,通过身份的判断,关联sys_menu和sys_role两表返回该用户有权限访问的菜单。

最终将数据返回给前端,完成getInfo。

getRouters

1.前端实现 

 在界面加载时就会调用方法GenerateRoutes若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

在GenerateRoutes中会调用 getRouters方法,调用后端对用的getRouters接口

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

 2.后端实现

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

在数据库中对应的menu表中设置了父id用于递归做树形菜单。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

通过userId查询中间表sys_role_menu,查询出所有属于该角色的menu。

通过对应的菜单表通过递归的方式将其组装起来成为以含有完整子菜单的菜单表。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript通过遍历根据parentId查询所有主节点,通过方法recursionFn查询各个主节点对应的子节点,并将其组装起来。若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

从通过userId查询到总菜单列表中查询出该节点对应的所有菜单,将这些菜单全部设置为当前节点的子菜单,设置完毕之后,通过循环递归的方式去访问各个子节点的对应的子菜单并对其进行组装,以此类推,那些没有子菜单的菜单就不会继续递归,最终完成菜单的组装。

最终返回组装好的菜单列表返回给前端,完成getRouters。

首页数据加载

主页分析 

进入主页

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

在登录时会执行handleLogin方法会通过路由到主界面,该方法会路由到"/"

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript 对应"/"的路由为下:

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript 会去加载主组件Layout,还会加载子组件/views/index.vue

 因为Layout组件没有特定指定对应名字的vue界面,所以默认就会跳转到该组件文件夹下的index.vue

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

在该index.vue中sidebar就是自定义的侧边栏组件,app-mian就是主界面的自定义组件。

 在sidebar组件中就是去生成对应的树形菜单。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

我们可以发现在我们进入主页后,直接加载主页的信息,而不是别的菜单信息。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript 在路由中我们做了重定向,在地址是"/"时会直接重定向到 /views/index.vue界面。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

 用户管理界面分析

在我们点击用户管理界面时对应的路径为下: 

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

我们就可以找到对应的index.vue文件

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript 在加载该界面时就会去调用方法getList和getDeptTree。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

1.getList 

getList获取的数据由于展示页面中的用户信息,getDeptTree获取的数据由于生成页面中的部门树形图。

getList通过调用listUser方法进行实现,这里queryParams就是用户在界面中设置的限制条件。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

 params就是传入的搜索的限制条件若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

发送的请求为下: 

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript @PreAuthorize注解就是判断当前用户身份有权限调用该接口,这里是管理员角色,权限就是

*:*:*,参数就是传入的限制条件。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

@DataScope(deptAlias = "d, userAlias = "u"),此注解用于设置别名。 

 2.getDeptTree

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

deptTreeSelect方法

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

发送的请求为下: 

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript 后端的Controller中若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

也是使用和菜单组装的递归方式将部门进行组装,最终返回给前端。(就是广度优先搜索)

 用户数据分页

在用户管理中用户数据存在分页的步骤

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

在发送获取用户数据的请求时就会携带对应的分页参数

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript 分页设置步骤就在getDataTable方法中若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

在方法startPage中就会设置分页

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

该方法使用mybatis实现分页操作。此时我们会有一个疑问,它是怎么获取分页参数的呢?(我们在controller层中可没有就是对应的分页参数)

setReasonable(reasonable)的作用就是设置页面逻辑判断。(如果页面为负数,字母,那么页面就会自动设置为1,保证逻辑正确)

在buildPageRequest中通过 ServletUtils工具类获取请求对应的路径参数。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

通过对应的名字获取对应的路径参数。 

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

 在我们这给请求中的路径参数就是pageNum和pageSize。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

 获取到对应的分页参数,使用pageHelper生成对应的page结果。(mybatis的pagehelper会通过拦截器在我们查询对应的用户数据时自动进行分页),mybtis的pageHelper只需要我们配置其参数也就是配置当前页码和总页数,配置完后在我们查询数据的时候就会自动实现分页效果。

 将最终分页的总数据,总个数,封装成对象返回给前端。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

前端会获取到用户的数据列表和用户的个数。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

最终完成分页。

添加用户

添加用户前的数据加载

在点击新增按钮时,会调用方法handleAdd方法。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

调用后端接口为下:

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

 获取用户的基本信息,因为这里是新增操作且身份是admin,所以就返回对应的身份列表,所有职位列表。(这里没有返回部门列表,因为需要显示所有恶的部门,之前已经查询过了,所以我们直接使用之前查到的部门列表)最终实现数据加载。

添加用户

在新增页面中,填写数据完成后,调用方法submitform。 

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

调用后端接口

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript 校验基本的信息,设置被新建的时间,对密码进行加密。

最终完成用户的添加。

修改用户

在点击修改的时候,会调用handleUpdate,该方法会调用后端的接口 

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

该后端接口就会通过userId返回对应的数据。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript 在设置好修改修改的新内容后,点击修改就会调用后端的以下方法edit:

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

其会先判断该用户是否为超级管理员,如果是就不能进行修改,判断当前用户是否有访问权限,判断基本的输入,设置修改时间,对新密码进行加密 。

在updateUser中其步骤就是先删除对应的该用户旧信息,在重新添加该用户的新信息。

最终完成修改。

删除用户

点击删除按钮就都会调用handleDelete函数 

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

handleDelete方法为下: 

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript 通过delUser会调用后端接口

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript 如果要删除的用户就是当前用户的话就无法删除,最终实现的删除也是逻辑删除。(并非真正的删除)

代码自动生成

在改该项目的数据库中创建对应的新表 

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript 在代码生成中选择导入表,选中test表。若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

点击编辑按钮设置基本信息。(每个属性的注释,生成的包名及路径) 

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

因为是基于若依项目,所以设置对应的上级菜单。 

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

设置对应的上级菜单。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

点击生成代码, 最终会生成一个压缩包,解压进行使用。

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

1.后端修改部分 

将对应的代码复制到前后端即可。 

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript 直接选中java和resources将其复制到项目的main中(直接心中 idea中main的文件夹粘贴即可)

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript 若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

 2.前端修改部分

选中api和views直接复制到ruoyi-ui项目中(选中src进行粘贴,也就是粘贴到根路径) 

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

 若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript  

执行SQL(导入新菜单在数据库中的信息)

重新运行进行测试(后端点击构建项目按钮),测试结果为下:

若依使用及源码解析(前后端分离版),SpringBoot,vue.js,前端,javascript

最终完成代码的自动生成。文章来源地址https://www.toymoban.com/news/detail-732129.html

到了这里,关于若依使用及源码解析(前后端分离版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用springboot框架Java+vue2开发的智慧班牌系统源码,SaaS云平台前后端分离架构

    智慧班牌系统可实现数字化办公,对外向学生家长提供各种服务,如:消息通知、请假管理,校园活动,学生动态,教师通讯录,学生定位等各种服务。对内向教师提供各类服务,如:班级管理,考勤管理,请假管理,活动管理,课堂点名,家长会管理,教师课程等等各种服

    2024年02月12日
    浏览(40)
  • 手把手从安装本地虚拟机,基于docker,部署springboot+vue项目(若依框架前后端分离版本演示),基于openjdk的dockerfile

    部署环境提供vm16,和centos7,其中把镜像改成.iso文件就可以了 阿里云链接: https://www.alipan.com/s/BTnpjuHWtEp 为什么用阿里云,不限速啊,秉持着开源白嫖的精神 新建虚拟机 选择镜像 创建用户 设置虚拟机存存放位置 默认下一步 自定义硬件 选了扩大一下内存,扩不扩无所谓 检查

    2024年01月16日
    浏览(55)
  • 【学习】若依源码(前后端分离版)之 “ 异常处理”

    通常一个web框架中,有大量需要处理的异常。比如业务异常,权限不足等等。前端通过弹出提示信息的方式告诉用户出了什么错误。 通常情况下我们用try…catch…对异常进行捕捉处理,但是在实际项目中对业务模块进行异常捕捉,会造成代码重复和繁杂, 我们希望代码中只有

    2024年02月13日
    浏览(28)
  • SpringBoot+Vue实现校园二手系统。前后端分离技术【完整功能介绍+实现详情+源码】

    全部源代码地址 :传送门 文章内容有点长,建议打开右侧目录导航栏查看 。         这个系统基本上可以改造为其它类似的系统。后台管理基本上一致。前台进行一些页面样式的改造就可以变成一个新的系统。有时间,做几个变体系统。        闲的无聊,把大学时候

    2024年02月07日
    浏览(32)
  • 若依RuoYi-Vue项目部署(前后端分离版本)

    RuoYi 是一个后台管理系统,基于经典技术组合(Spring Boot、Apache Shiro、MyBatis、Thymeleaf)主要目的让开发者注重专注业务,降低技术难度,从而节省人力成本,缩短项目周期,提高软件安全质量。 若依是作者给女儿取的名字(寓意:你若不离不弃,我必生死相依) 在线体验 若

    2023年04月08日
    浏览(39)
  • 若依vue(前后端分离版本)前端获取登录用户id

    1.找到user.js 2.在user.js中找到以下几个地方 属性:state{} 属性:mutations{} 函数:GetInfo() 3.在user.js中添加代码  4.在自己的页面中添加获取id的代码 在该若依的版本中,从下列目录找到,ruoyi-ui-src-store-modules-user.js 属性state在页面中的位置 还有mutations 最后是GetInfo方法 步骤三 到此

    2024年04月12日
    浏览(36)
  • 基于springboot+vue+mysql的新能源充电系统--前后端分离(内含源码+报告+部署教程)

    新能源充电系统管理系统按照操作主体分为管理员和用户。管理员的功能包括反馈管理、客服聊天管理、充电桩管理、充电桩预约管理、字典管理、新能源公告管理、用户管理、管理员管理等,可以管理报修。用户的功能包括管理部门以及部门岗位信息,管理充电桩信息,培

    2024年02月09日
    浏览(33)
  • 基于Java+SpringBoot+Vue.js前后端分离零食购物商城系统设计和实现 可行性分析

     博主介绍 :黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。 项目配有对应开发文档、

    2024年02月20日
    浏览(49)
  • 基于Java+SpringBoot+Vue.js前后端分离宠物购物商城系统设计和实现 可行性分析

     博主介绍 :黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。 项目配有对应开发文档、

    2024年02月19日
    浏览(35)
  • 基于Java+SpringBoot+Vue.js前后端分离鞋子购物商城系统设计和实现 可行性分析

     博主介绍 :黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。 项目配有对应开发文档、

    2024年02月20日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包