当前位置: 首页 > 编程日记 > 正文

Java项目:美食菜谱分享平台系统设计和实现(java+springboot+mysql+ssm)

源码获取:博客首页 "资源" 里下载!

主要技术实现:spring、 springmvc、 springboot、mybatis 、session、 jquery 、 md5 、bootstarp.js  tomcat、拦截器等。


具体主要功能模块如下:

1.用户模块管理:用户登录、用户注册、用户的查询、添加、删除操作、
2.美食分享笔记管理:分享笔记列表的展示、添加、修改、删除操作、
3.美食笔记详情管理:美食笔记详情列表的查看、添加、删除等操作、
4.管理员信息管理:管理员信息的查看、修改、
5.公告信息管理:公告信息的查看、添加、修改、删除操作、
6.用户模块管理:用户列表查询、添加、删除、
7.用户评论模块管理:用户评论查询、添加、删除、
8.注销退出登录管理

给大家截一部分效果图吧
系统首页主要功能:

分类查看没事菜谱信息以及智能推荐:

美食分享笔记详情信息查看、用户登录后可以进行评论、浏览量会增加、用户可以收藏当前文档信息、可以点击查看作者信息、可以对作者进行关注等操作:

用户评论操作:

富文本编辑器添加美食分享笔记:

个人中心我的收藏 我的关注等:

关注用户信息以及具体功能操作等:

后台管理主要功能:用户管理、美食菜谱笔记管理、美食菜谱详情发布以及评论等管理

代码结构:

项目文档报告:

时光轴控制器:

/*** 时光轴控制器**/
@RestController
@RequestMapping("/timeline")
public class TimelineController {@Resourceprivate TimelineService timelineService;/*** 查询时光轴* @param page* @param pageSize* @return*/@RequestMapping("/list")public Map<String, Object> list2() {Map<String, Object> resultMap = new HashMap<>();List<Timeline> maps = timelineService.list(null, 0, 100);if (CollectionUtils.isNotEmpty(maps)) {Map<String, Object> jsonMap = new LinkedHashMap<String, Object>();for (Timeline map : maps) {Map<String, Object> yearMap = (Map<String, Object>) jsonMap.get(map.getYear());if (null == yearMap) {yearMap = new LinkedHashMap<String, Object>();yearMap.put("year", map.getYear());}Map<String, Object> monthMap = (Map<String, Object>) yearMap.get("month");if (null == monthMap) {monthMap = new LinkedHashMap<String, Object>();}List<Map<String, Object>> monthList = (List<Map<String, Object>>) monthMap.get(map.getMonth());if (null == monthList) {monthList = new ArrayList<>();}monthMap.remove(map.getMonth());Map<String, Object> obj = new HashMap<>();obj.put("create_time", DateUtil.formatDate(map.getPublishDate(), "MM月dd日 hh:mm"));obj.put("content", map.getContent());monthList.add(obj);monthMap.put(map.getMonth(), monthList);yearMap.remove("month");yearMap.put("month", monthMap);jsonMap.remove(map.getYear());jsonMap.put(map.getYear(), yearMap);}List<Map<String, Object>> datas = new ArrayList<Map<String, Object>>();for (Map.Entry<String, Object> entry : jsonMap.entrySet()) {datas.add((Map<String, Object>) entry.getValue());}resultMap.put("datas", datas);resultMap.put("result", 1);}else {resultMap.put("data", "还没有时光轴数据!");}return resultMap;}
}

根路径以及其他请求处理:

/*** 根路径以及其他请求处理**/
@Controller
public class IndexController {@Value("${imageFilePath}")private String imageFilePath; // 文件路径@Resourceprivate NoticeService noticeService;@Resourceprivate UserService userService;@Resourceprivate ArticleService articleService;@Resourceprivate ClassifyService classifyService;@RequestMapping("/")public String index(HttpSession session) {// 查询公告session.setAttribute("noticeList", noticeService.list(0, 5));return "index";// 跳转到index.html}@RequestMapping("/delete")public Map<String, Object> delete(Integer userId) {Map<String, Object> resultMap = new HashMap<String, Object>();userService.delete(userId);resultMap.put("errorNo", 0);return resultMap;}/*** 登录页面* * @return*/@RequestMapping("/login")public String login() {return "login";}/*** 前台登录页面* * @return*/@RequestMapping("/webLogin")public String webLogin() {return "webLogin";}/*** 注册* * @return*/@RequestMapping("/regist")public String regist() {return "regist";}/*** 保存注册信息* * @param user* @return*/@RequestMapping("/saveUser")public String saveUser(User user) {List<Article> randomArticle = articleService.getRandomArticle(3);String ids="";for (int i = 0; i < randomArticle.size(); i++) {Integer articleId = randomArticle.get(i).getArticleId();ids+=articleId+",";}ids = ids.substring(0, ids.length() -1);user.setArticleIds(ids);userService.save(user);return "webLogin";}/*** 退出登录* * @param request* @return*/@RequestMapping("/quit")public String quit(HttpServletRequest request) {HttpSession session = request.getSession();session.removeAttribute("user");return "index";}/*** 退出登录* * @param request* @return*/@RequestMapping("/quitAdmin")public String quitAdmin(HttpServletRequest request) {HttpSession session = request.getSession();session.removeAttribute("user");return "login";}/*** 验证登录** @param user* @param request* @return*/@RequestMapping("/checkLogin")public ModelAndView checkLogin(User user, HttpServletRequest request) {ModelAndView mav = new ModelAndView();HttpSession session = request.getSession();User u = userService.findByUsernameAndPassword(user.getUsername(), user.getPassword());if (u == null) {mav.addObject("user", user);mav.addObject("errorInfo", "用户名或者密码错误!");mav.setViewName("webLogin");} else {u.setLatelyLoginTime(new Date());userService.save(u);session.setAttribute("user", u);mav.addObject("username", u.getUsername());mav.addObject("user", u);mav.addObject("success", true);mav.setViewName("/index");}return mav;}/*** 查看个人信息* * @return*/@RequestMapping("viewPerson")public ModelAndView viewPerson(HttpServletRequest request) {User user = (User) request.getSession().getAttribute("user");ModelAndView mav = new ModelAndView();User u = userService.findById(user.getUserId());mav.addObject("user", u);mav.setViewName("/viewPerson");return mav;}/*** 查看个人收藏夹* * @return*/@RequestMapping("viewCollection")public ModelAndView viewCollection(HttpServletRequest request, HttpSession session) {User user = (User) request.getSession().getAttribute("user");ModelAndView mav = new ModelAndView();User u = userService.findById(user.getUserId());String artIds = u.getArticleIds();List<String> result = new ArrayList<>();if (StringUtils.isNotBlank(artIds)) {result = Arrays.asList(StringUtils.split(artIds, ","));}List<Integer> retIds = new ArrayList<>();for (String temp : result) {retIds.add(Integer.valueOf(temp).intValue());}List<Article> retArt = articleService.findByListId(retIds);session.setAttribute("noticeList", noticeService.list(0, 5));mav.addObject("retArt", retArt);mav.addObject("user", u);mav.setViewName("/viewCollection");return mav;}/*** 查看个人关注用户* * @return*/@RequestMapping("viewFocusUser")public ModelAndView viewFocusUser(HttpServletRequest request, HttpSession session) {User user = (User) request.getSession().getAttribute("user");ModelAndView mav = new ModelAndView();User u = userService.findById(user.getUserId());String userIds = u.getUserIds();List<String> result = new ArrayList<>();if (StringUtils.isNotBlank(userIds)) {result = Arrays.asList(StringUtils.split(userIds, ","));}List<Integer> retIds = new ArrayList<>();for (String temp : result) {retIds.add(Integer.valueOf(temp).intValue());}List<User> retArt = userService.findByListId(retIds);session.setAttribute("noticeList", noticeService.list(0, 5));mav.addObject("retArt", retArt);mav.addObject("user", u);mav.setViewName("/viewFocusUser");return mav;}/*** 保存用户信息* * @param user* @return*/@RequestMapping("/save")public ModelAndView save(User user) {ModelAndView mav = new ModelAndView();userService.save(user);mav.setViewName("/index");return mav;}/*** 写笔记页面* * @param request* @return*/// @RequestMapping("notePage")// public String notePage(HttpServletRequest request, Model model) {// User user = (User) request.getSession().getAttribute("user");// if (user == null) {// return "webLogin";// }// List<Classify> list = classifyService.findAll();// model.addAttribute("list", list);// return "one";// }@RequestMapping("notePage")public ModelAndView notePage(HttpServletRequest request) {ModelAndView mav = new ModelAndView();User user = (User) request.getSession().getAttribute("user");if (user == null) {mav.setViewName("/webLogin");return mav;}List<Classify> list = classifyService.findAll();mav.addObject("list", list);mav.setViewName("/one");return mav;}/*** 保存笔记* * @param article* @param request* @return*/@RequestMapping("addNote")public ModelAndView addNote(Article article, HttpServletRequest request) {ModelAndView mav = new ModelAndView();// 获取当前用户信息User user = (User) request.getSession().getAttribute("user");article.setUserId(user.getUserId());article.setPublishDate(new Date());article.setClick(0);article.setCommentNum(0);article.setContentNoTag(StringUtil.Html2Text(article.getContent()));articleService.save(article);mav.setViewName("/index");return mav;}@RequestMapping("saveNote")public ModelAndView saveNote(Article article, HttpServletRequest request) {ModelAndView mav = new ModelAndView();Article a = articleService.findById(article.getArticleId());article.setPublishDate(a.getPublishDate());// 获取当前用户信息articleService.save(article);mav.setViewName("/index");return mav;}/*** 查看笔记* * @return*/@RequestMapping("viewNote")public String viewNote(HttpSession session) {session.setAttribute("noticeList", noticeService.list(0, 5));return "mylist";}@RequestMapping("/delete/{id}")public String delete(@PathVariable(value = "id") String id) throws Exception {articleService.delete(Integer.parseInt(id));return "mylist";}/*** 查看个人笔记加载数据列表* * @param article* @param publishDates* @param page* @param pageSize* @return*/@RequestMapping("/mylist")public Map<String, Object> list(Article article,@RequestParam(value = "publishDates", required = false) String publishDates,@RequestParam(value = "page", required = false) Integer page,@RequestParam(value = "pageSize", required = false) Integer pageSize, HttpServletRequest request) {Map<String, Object> resultMap = new HashMap<String, Object>();// User user = (User) request.getSession().getAttribute("user");// article.setUserId(user.getUserId());String s_bPublishDate = null; // 开始时间String s_ePublishDate = null; // 结束时间if (StringUtil.isNotEmpty(publishDates)) {String[] strs = publishDates.split(" - "); // 拆分时间段s_bPublishDate = strs[0];s_ePublishDate = strs[1];}Long total = articleService.getCount(article, s_bPublishDate, s_ePublishDate);int totalPage = (int) (total % pageSize == 0 ? total / pageSize : total / pageSize + 1); // 总页数resultMap.put("totalPage", totalPage);resultMap.put("errorNo", 0);resultMap.put("data", articleService.list(article, s_bPublishDate, s_ePublishDate, page - 1, pageSize));resultMap.put("total", total);return resultMap;}/*** 后台默认首页* * @return*/@RequestMapping("/index")public String root() {return "/common/index";}/*** 博主信息页面* * @return*/@RequestMapping("/blogger")public String blogger() {return "/blogger/index";}/*** 图片上传处理 @Title: ckeditorUpload @param file 图片文件 @return 参数说明 @return* Map<String,Object> 返回类型 @throws*/@ResponseBody@RequestMapping("/upload")public Map<String, Object> ckeditorUpload(@RequestParam("file") MultipartFile file) {Map<String, Object> resultMap = new HashMap<String, Object>();Map<String, Object> resultMap1 = new HashMap<String, Object>();String fileName = file.getOriginalFilename(); // 获取文件名String suffixName = fileName.substring(fileName.lastIndexOf(".")); // 获取文件的后缀String newFileName = "";try {newFileName = DateUtil.getCurrentDateStr() + suffixName; // 新文件名FileUtils.copyInputStreamToFile(file.getInputStream(), new File(imageFilePath + newFileName)); // 上传} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}resultMap.put("code", 0);resultMap1.put("filePath", newFileName);resultMap.put("data", resultMap1);return resultMap;}}

评论控制器:

/*** 评论控制器**/
@RestController
@RequestMapping("/comment")
public class CommentController {@Resourceprivate CommentService commentService;@Resourceprivate ArticleService articleService;@Resourceprivate ReplyService replyService;/*** 分页查询评论* @param comment* @param page* @param pageSize* @return*/@RequestMapping("/list")public Map<String, Object> commentList(Comment comment, @RequestParam(value = "page", required = false) Integer page,@RequestParam(value = "pageSize", required = false) Integer pageSize) {List<Comment> commentList = commentService.list(comment, null, null, page - 1, pageSize, null);Long total = commentService.getCount(comment, null, null, null);int totalPage = (int) (total % pageSize == 0 ? total / pageSize : total / pageSize + 1);Map<String, Object> resultMap = new HashMap<String, Object>();resultMap.put("totalPage", totalPage);resultMap.put("data", commentList);return resultMap;}/*** 分页查询评论* @param page* @param pageSize* @return*/@RequestMapping("/massageList")public Map<String, Object> massageList(@RequestParam(value = "page", required = false) Integer page,@RequestParam(value = "pageSize", required = false) Integer pageSize) {List<Comment> commentList = commentService.massageList(page - 1, pageSize);Long total = commentService.getCount2();int totalPage = (int) (total % pageSize == 0 ? total / pageSize : total / pageSize + 1);Map<String, Object> resultMap = new HashMap<String, Object>();resultMap.put("totalPage", totalPage);resultMap.put("data", commentList);return resultMap;}/*** 添加评论* @Title: add* @param comment  评论实体* @return  参数说明* @return Map<String,Object>    返回类型* @throws*/@RequestMapping("/add")public Map<String, Object> add(Comment comment, HttpSession session) {User currentUser = (User) session.getAttribute("user");Map<String, Object> resultMap = new HashMap<String, Object>();comment.setCommentDate(new Date());comment.setUser(currentUser);commentService.add(comment);if (comment.getArticle() != null) {articleService.increaseComment(comment.getArticle().getArticleId());}resultMap.put("comment", comment);resultMap.put("success", true);return resultMap;}}

源码获取:博客首页 "资源" 里下载!

相关文章:

【leetcode】Roman to Integer

题目描述&#xff1a; Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. 解题思路&#xff1a; 首先我们要了解罗马数字怎么写的 个位数举例 I, 1 】II, 2】 III, 3】 IV, 4 】V, 5 】VI, 6】 VII, 7】 VIII,8 】…

Apache Traffic Server管理工具

Traffic Line是命令行程序&#xff0c;可以用来快速监视 Traffic Server 的性能和网络流量&#xff0c;也能配置 TS。Traffic Shell也是命令行工具&#xff0c;进入该 shell 后有自己一套语法&#xff0c;可代替 Traffic Line 完成监控、配置任务。通过 Traffic Line 和 Traffi…

npm使用记录

npm是一个 包管理工具。安装node之后就可以使用npm命令了&#xff0c;为了方便使用&#xff0c;通常我们还要装下 淘宝NPM镜像&#xff0c;之后就可以用cnpm命令了。 注意&#xff1a;以下提到的如-g --save等标签都可以放在 包名前面。 首先一个前端项目下载下来&#xff0c;需…

Go 分布式学习利器(18)-- Go并发编程之lock+WaitGroup实现线程安全

Go语言中通过Groutine 启动一个Go协程&#xff0c;不同协程之间是并发执行的&#xff0c;就像C/Java中线程之间线程安全是一个常见的问题。 如下Go 语言代码: func TestConcurrent(t *testing.T) {var counter int 0for i : 0;i < 5000; i {go func() { // 启动groutine 进…

Java项目:网上家具商城平台设计和实现(java+springboot+mysql+ssm)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 主要技术&#xff1a;springmvc springboot mybatis mysql jquery layui 等技术 具体功能模块&#xff1a; (1) 用户注册和登录登录功能&#xff1a; ①用户的注册功能 : 访问网站的人根据网站的提示注册…

Linux socket TIME_WAIT 优化

如发现系统存在大量TIME_WAIT状态的连接&#xff0c;通过调整内核参数解决&#xff0c;vim /etc/sysctl.conf编辑文件&#xff0c;加入以下内容&#xff1a;net.ipv4.tcp_syncookies 1net.ipv4.tcp_tw_reuse 1net.ipv4.tcp_tw_recycle 1net.ipv4.tcp_fin_timeout 30然后执行…

Android Handler的使用!!!

大家好我们这一节讲的是Android Handler的使用,在讲Handler之前&#xff0c;我们先提个小问题&#xff0c;就是如何让程序5秒钟更新一下Title.首先我们看一下习惯了Java编程的人&#xff0c;在不知道Handler的用法之前是怎么样写的程序,代码如下所示:view plaincopy to clipboa…

git之reset图解

https://blog.csdn.net/longintchar/article/details/81843048 1、三棵树。 此时如果我们运行 git status&#xff0c;会发现没有任何改动&#xff0c;因为现在三棵树完全相同。 修改文件 现在我们想要对文件进行修改然后提交它。我们将会经历同样的过程&#xff1b;首先在工作…

Go 分布式学习利器(19)-- Go并发编程 之 CSP(communicating sequential processes) 机制

文章目录前言CSP 特点CSP代码 演示1. 正常流程的代码2. CSP 未设置buffer 代码3. 设置指定大小的channel buffer总结前言 CSP 这个名词大家会比较陌生&#xff0c;但是说到future 熟悉C / JAVA 线程模型的伙伴可能就会很熟悉了&#xff0c; 通过future机制能够实现两个线程之间…

Java项目:学生学科竞赛管理管理系统设计和实现(java+springboot+ssm+maven)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 主要技术、spring、 springmvc、 springboot、 mybatis 、 jquery 、 layUI、md5 、bootstarp.js tomcat、、拦截器等项目 主要功能:登录、用户、菜单管理、角色管理、权限管理、立项申请、报名、结、经费…

update 改写 merge into

update语句改写成merge into有时会提高运行速度 看两个案例 1.根据业务将两个嵌套子查询改写成max&#xff0c;速度有3min提升到3s UPDATE OPER_792.LL_SCB_YDKB_20120730 A SET A.DCP (SELECT B.PROD_OFFER_NAME FROM OPER_792.YD_TC B WHERE A.SERV_ID B.SERV_ID AND B.TC_…

CCControlSwitch 、CCControlSlider、CCControlButton

/**bool hasMoved(); 这里获取的不是开关是否正在被用户拨动&#xff0c;而是开关最终的状态是由用户手动拨动开关进行的&#xff0c;*还是用户点击开关进行的状态更改*/CCControlSwitch* pSwitch CCControlSwitch::create(CCSprite::create("switch-mask.png"),CCS…

bzoj2961 共点圆 (CDQ分治, 凸包)

/* 可以发现可行的圆心相对于我们要查询的点是在一个半平面上&#xff0c; 然后我们要做的就是动态维护凸壳然后用这个半平面去切它 看看是否是在合法的那一面然后cdq分治就可以了代码基本是抄的&#xff0c;*/#include<cstdio> #include<algorithm> #include<c…

Rocksdb Iterator实现:从DBIter 到 TwoLevelIter 的漫长链路

文章目录1. 迭代器简单介绍2. 迭代器用户态相关接口3. 迭代器内部架构4. 迭代器的入口实现4.1 DBIter4.2 MergingIterator4.3 Memtable系列Iterator4.4 LevelIterator 和 TwoLevelIteratorps&#xff1a;本文的基础迭代器设计 以及 相关代码 是基于rocksdb 6.4.6版本进行描述的…

Java项目:OA办公自动化系统设计和实现(java+springboot+freemarker+mysql+maven+mybatis+jpa)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; java springbootOA办公自动化系统&#xff1a; 主要功能模块&#xff1a;系统、用户、角色、考勤、流程、公告、邮件、任务、日程、计划、文件、笔记、通讯录、讨论区等多个模块管理 使用Maven进行项目管理…

UIScrollView上面放一个UIScrollView或者UITableView拖动时候 View出现一闪一闪解决办法...

在项目中发现一个问题&#xff1a; 创建一个UIScrollView 上面放一个scrollView或者TableView&#xff0c;拖动scrollview或TableView 画面出现一闪一闪的情况。 解决办法设置一下UIScrollView的contentSize 如果你是上下滑动scrollView.contentSize CGSizeMake(0, self.view.…

理解koa-router 路由一般使用

阅读目录 一&#xff1a;理解koa-router一般的路由二&#xff1a;理解koa-router命名路由三&#xff1a;理解koa-router多个中间件使用四&#xff1a;理解koa-router嵌套路由五&#xff1a;分割路由文件回到顶部一&#xff1a;理解koa-router一般的路由 koa-router是koa的路由库…

Go 分布式学习利器(20)-- Go并发编程之多路选择和超时控制,channel的关闭和广播

Select 多路选择 基本使用语法如下&#xff1a; select { case ret : <-retCh1: //阻塞事件&#xff0c;等待channel1的消息t.Logf("result %s \n",ret) case ret : <-retCh2:t.Logf("result %s \n", rest) default :t.Error("return empty&q…

Java项目:网盘系统设计和实现(java+ssm+jpa)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 很多同学都有自己的网盘&#xff0c;方便存储一些java学习教程。该毕业设计实现了一个简易的网盘&#xff0c;包含文件上传和文件分享等功能。 后端技术采用了spring&#xff0c;spring mvc&#xff0c;JPA&…

快速学习的方法论

大多数人认为学习的快慢取决于学习者的天赋&#xff0c;实际上研究表明学习方法起着至关重要的作用。更深层次的知识加工&#xff0c;与时而反复的温故知新&#xff0c;在某些情况下会加倍你的学习效率。最近学习了如何快速学习的方法论&#xff0c;分享给大家。 是否能加速理解…

C#拉姆达(=)表达式

前言&#xff1a; 之前小猪曾经分享过自己对C#委托的一点理解 其实在使用委托的过程中我们会大量的使用拉姆达(>)表达式 介绍&#xff1a; "Lambda表达式"是一个匿名函数&#xff0c;是一种高效的类似于函数式编程的表达式&#xff0c;Lambda简化了开发中需要编写…

Python爬虫入门教程 57-100 python爬虫高级技术之验证码篇3-滑动验证码识别技术

滑动验证码介绍 本篇博客涉及到的验证码为滑动验证码&#xff0c;不同于极验证&#xff0c;本验证码难度略低&#xff0c;需要的将滑块拖动到矩形区域右侧即可完成。 这类验证码不常见了&#xff0c;官方介绍地址为&#xff1a;https://promotion.aliyun.com/ntms/act/captchaI…

FlameScope 更高级全面的火焰图

FlameScope 更高级全面的火焰图 文章目录FlameScope 更高级全面的火焰图安装步骤安装问题fix使用方式网飞(Netflix)开发的火焰图工具能够更好得呈现出一段时间内的服务器on/off cpu 的热力图。安装步骤 $ git clone https://github.com/Netflix/flamescope $ cd flamescope $ …

sql 基础--mysql 5 (6)

12.子查询 子查询进行过滤 mysql> select msg from pw_luck where name wang5-> ; ------ | msg | ------ | 1001 | | 1000 | | 1000 | | 100 | | 100 | ------ 5 rows in set (0.03 sec)mysql> select uid from pw_luck where msg in (select msg from pw_luck w…

Java项目:就业管理系统设计和实现(java+springboot+ssm)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 就业管理系统: 该毕业设计采用了spring boot&#xff0c;spring&#xff0c;spring mvc&#xff0c;mybatis作为后端技术框架&#xff0c;这些组合稳定抗打&#xff0c;前端使用了layui&#xff0c;界面美观…

算法设计与分析之循环与递归

前言&#xff1a;循环与递归可以说是算法设计中最基本但却也是最重要的工具方法。循环和递归对于学习过高级程序设计语言的人来说都并不陌生&#xff0c;但还是有必要仔细的探究一下循环和递归之间的相似和区别。循环与递归最大的相似之处莫不是在于他们在算法设计中的工具作用…

面向对象与软件工程---团队作业1

1.队伍名称&#xff1a; 遥遥万里&#xff08;还有很长路要走的意思&#xff09; 2.队员信息&#xff1a; 陈雄&#xff08;组长&#xff09; 学号&#xff1a;1700509024 博客园链接&#xff1a;https://www.cnblogs.com/bearchan/ 廖鹏辉 学号&#xff1a;1700802007 博客园…

从paxos到raft zab,为何raft能够“独领风骚”

文章目录RAFT出现的缘由RAFT 的实现STATE MACHINELog Replicated State MachineLeader Election基本角色关键变量基本选举过程Log Replicated基本概念基本操作SafetyLog Replication: Consistency checkLeader Election: Leader Completeness总结RAFT 和 ZAB 的对比参考文献:阅…

Java项目:前台+后台精品水果商城系统设计和实现(java+Springboot+ssm+mysql+jsp+maven)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 一、项目简述 本系统主要实现的功能有&#xff1a; 前台用户的登录注册&#xff0c;水果商品的展示&#xff0c;水果的购物车&#xff0c; 购物车新增结算等等&#xff0c;银行卡的支付绑定&#xff0c;收货…

Android屏幕像素密度适配详解

讲到像素密度&#xff0c;我们先要搞明白什么是像素密度&#xff0c;像素密度的字面上的意思为手机屏幕上一定尺寸区域内像素的个数。在Android开发中&#xff0c; 我们一般会使用每英寸像素密度&#xff08;dpi&#xff09;这样一个单位来表示手机屏幕的像素密度&#xff0c;d…