博客论坛系统java博客管理系统基于springboot+vue的前后端分离博客论坛系统

文章目录

  • 博客论坛系统
    • 一、项目演示
    • 二、项目介绍
    • 三、部分功能截图
    • 四、部分代码展示
    • 五、底部获取项目源码(9.9¥带走)

博客论坛系统

一、项目演示

博客论坛系统

二、项目介绍

基于springboot+vue的前后端分离博客论坛系统
系统角色:管理员、用户

管理员:登录、首页、随笔、留言、评论、搜索、后台首页、角色管理、菜单管理、参数设置、通知公告、文章管理、随笔管理、分类管理、标签管理、留言管理、评论管理、文件管理

用户:注册、登录、首页、随笔、留言、评论、搜索、后台首页、通知公告、文章管理、随笔管理、留言管理、评论管理

项目技术
语言:java
前端技术:Vue、Ruoyi、ElementUI
后端技术:SpringBoot、Mybatis、Redis
数据库:MySQL

三、部分功能截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、部分代码展示

package com.ruoyi.web.controller.system;import java.util.Iterator;
import java.util.List;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.service.ISysDeptService;/*** 部门信息* * @author ruoyi*/
@RestController
@RequestMapping("/system/dept")
public class SysDeptController extends BaseController
{@Autowiredprivate ISysDeptService deptService;/*** 获取部门列表*/@PreAuthorize("@ss.hasPermi('system:dept:list')")@GetMapping("/list")public AjaxResult list(SysDept dept){List<SysDept> depts = deptService.selectDeptList(dept);return AjaxResult.success(depts);}/*** 查询部门列表(排除节点)*/@PreAuthorize("@ss.hasPermi('system:dept:list')")@GetMapping("/list/exclude/{deptId}")public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId){List<SysDept> depts = deptService.selectDeptList(new SysDept());Iterator<SysDept> it = depts.iterator();while (it.hasNext()){SysDept d = (SysDept) it.next();if (d.getDeptId().intValue() == deptId|| ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + "")){it.remove();}}return AjaxResult.success(depts);}/*** 根据部门编号获取详细信息*/@PreAuthorize("@ss.hasPermi('system:dept:query')")@GetMapping(value = "/{deptId}")public AjaxResult getInfo(@PathVariable Long deptId){deptService.checkDeptDataScope(deptId);return AjaxResult.success(deptService.selectDeptById(deptId));}/*** 获取部门下拉树列表*/@GetMapping("/treeselect")public AjaxResult treeselect(SysDept dept){List<SysDept> depts = deptService.selectDeptList(dept);return AjaxResult.success(deptService.buildDeptTreeSelect(depts));}/*** 加载对应角色部门列表树*/@GetMapping(value = "/roleDeptTreeselect/{roleId}")public AjaxResult roleDeptTreeselect(@PathVariable("roleId") Long roleId){List<SysDept> depts = deptService.selectDeptList(new SysDept());AjaxResult ajax = AjaxResult.success();ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId));ajax.put("depts", deptService.buildDeptTreeSelect(depts));return ajax;}/*** 新增部门*/@PreAuthorize("@ss.hasPermi('system:dept:add')")@Log(title = "部门管理", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@Validated @RequestBody SysDept dept){if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))){return AjaxResult.error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在");}dept.setCreateBy(getUsername());return toAjax(deptService.insertDept(dept));}/*** 修改部门*/@PreAuthorize("@ss.hasPermi('system:dept:edit')")@Log(title = "部门管理", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@Validated @RequestBody SysDept dept){if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))){return AjaxResult.error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在");}else if (dept.getParentId().equals(dept.getDeptId())){return AjaxResult.error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己");}else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus())&& deptService.selectNormalChildrenDeptById(dept.getDeptId()) > 0){return AjaxResult.error("该部门包含未停用的子部门!");}dept.setUpdateBy(getUsername());return toAjax(deptService.updateDept(dept));}/*** 删除部门*/@PreAuthorize("@ss.hasPermi('system:dept:remove')")@Log(title = "部门管理", businessType = BusinessType.DELETE)@DeleteMapping("/{deptId}")public AjaxResult remove(@PathVariable Long deptId){if (deptService.hasChildByDeptId(deptId)){return AjaxResult.error("存在下级部门,不允许删除");}if (deptService.checkDeptExistUser(deptId)){return AjaxResult.error("部门存在用户,不允许删除");}return toAjax(deptService.deleteDeptById(deptId));}
}
package com.ruoyi.cms.blog.controller;import java.util.List;
import java.util.Set;
import javax.servlet.http.HttpServletResponse;import com.ruoyi.cms.fileInfo.service.ISysFileInfoService;
import com.ruoyi.cms.tag.domain.CmsTag;
import com.ruoyi.cms.tag.service.ICmsTagService;
import com.ruoyi.cms.type.domain.CmsType;
import com.ruoyi.cms.type.service.ICmsTypeService;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.web.service.SysPermissionService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.cms.blog.domain.CmsBlog;
import com.ruoyi.cms.blog.service.ICmsBlogService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;/*** 文章管理Controller* * @author ning* @date 2022-01-01*/
@RestController
@RequestMapping("/cms/blog")
public class CmsBlogController extends BaseController
{@Autowiredprivate ICmsBlogService cmsBlogService;@Autowiredprivate ICmsTypeService cmsTypeService;@Autowiredprivate ICmsTagService cmsTagService;@Autowiredprivate SysPermissionService permissionService;@Autowiredprivate ISysFileInfoService sysFileInfoService;/*** 首页查询文章列表*/@GetMapping("/cms/cmsList")public TableDataInfo cmsList(CmsBlog cmsBlog){startPage();//状态为发布cmsBlog.setStatus("1");List<CmsBlog> list = cmsBlogService.selectCmsBlogList(cmsBlog);return getDataTable(list);}/*** 首页获取文章详细信息*/@GetMapping(value = { "/cms/detail/", "/cms/detail/{id}" })public AjaxResult getInfoDetail(@PathVariable(value = "id", required = false) Long id){AjaxResult ajax = AjaxResult.success();CmsType cmsType = new CmsType();CmsTag cmsTag = new CmsTag();ajax.put("types", cmsTypeService.selectCmsTypeList(cmsType));ajax.put("tags", cmsTagService.selectCmsTagList(cmsTag));if (StringUtils.isNotNull(id)){ajax.put(AjaxResult.DATA_TAG, cmsBlogService.selectCmsBlogById(id));}return ajax;}/*** 首页按分类查询文章列表*/@GetMapping("/cms/cmsListByType/{id}")public TableDataInfo cmsListByTypeId(@PathVariable(value = "id", required = false) Long id){startPage();List<CmsBlog> list = cmsBlogService.selectCmsBlogListByTypeId(id);return getDataTable(list);}/*** 首页按标签查询文章列表*/@GetMapping("/cms/cmsListByTag/{id}")public TableDataInfo cmsListByTagId(@PathVariable(value = "id", required = false) Long id){startPage();List<CmsBlog> list = cmsBlogService.selectCmsBlogListByTagId(id);return getDataTable(list);}/*** 首页查询推荐文章列表*/@GetMapping("/cms/cmsListRecommend")public TableDataInfo cmsListRecommend(CmsBlog cmsBlog){startPage();//状态为发布cmsBlog.setStatus("1");List<CmsBlog> list = cmsBlogService.selectCmsBlogListRecommend(cmsBlog);return getDataTable(list);}/*** 首页增加阅读量*/@GetMapping("/cms/addBlogViews/{id}")public AjaxResult addBlogViews(@PathVariable(value = "id", required = false) Long id){CmsBlog cmsBlog = cmsBlogService.selectCmsBlogById(id);Long views = cmsBlog.getViews();views+=Long.parseLong("1");cmsBlog.setViews(views);cmsBlogService.updateCmsBlog(cmsBlog);return AjaxResult.success(id);}/*** 随笔页查询文章列表*/@GetMapping("/cms/cmsEssayList")public TableDataInfo cmsEssayList(CmsBlog cmsBlog){startPage();//状态为发布cmsBlog.setStatus("1");List<CmsBlog> list = cmsBlogService.selectCmsBlogList(cmsBlog);return getDataTable(list);}/*** 查询文章管理列表*/@PreAuthorize("@ss.hasPermi('cms:blog:list')")@GetMapping("/list")public TableDataInfo list(CmsBlog cmsBlog){startPage();// 角色集合Set<String> roles = permissionService.getRolePermission(getLoginUser().getUser());if (!SecurityUtils.isAdmin(getUserId())&&!roles.contains("admin")&&!roles.contains("cms")){cmsBlog.setCreateBy(getUsername());}List<CmsBlog> list = cmsBlogService.selectCmsBlogList(cmsBlog);return getDataTable(list);}/*** 导出文章管理列表*/@PreAuthorize("@ss.hasPermi('cms:blog:export')")@Log(title = "文章管理", businessType = BusinessType.EXPORT)@PostMapping("/export")public void export(HttpServletResponse response, CmsBlog cmsBlog){List<CmsBlog> list = cmsBlogService.selectCmsBlogList(cmsBlog);ExcelUtil<CmsBlog> util = new ExcelUtil<CmsBlog>(CmsBlog.class);util.exportExcel(response, list, "文章管理数据");}/*** 获取文章管理详细信息*/@PreAuthorize("@ss.hasPermi('cms:blog:query')")@GetMapping(value = { "/", "/{id}" })public AjaxResult getInfo(@PathVariable(value = "id", required = false) Long id){AjaxResult ajax = AjaxResult.success();CmsType cmsType = new CmsType();CmsTag cmsTag = new CmsTag();ajax.put("types", cmsTypeService.selectCmsTypeList(cmsType));ajax.put("tags", cmsTagService.selectCmsTagList(cmsTag));if (StringUtils.isNotNull(id)){ajax.put(AjaxResult.DATA_TAG, cmsBlogService.selectCmsBlogById(id));}return ajax;}/*** 新增文章管理*/@PreAuthorize("@ss.hasPermi('cms:blog:add')")@Log(title = "文章管理", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody CmsBlog cmsBlog){cmsBlog.setCreateBy(getUsername());Long blogId = cmsBlogService.insertCmsBlog(cmsBlog);if (blogId==null){return AjaxResult.error();}return AjaxResult.success(blogId);}/*** 修改文章管理*/@PreAuthorize("@ss.hasPermi('cms:blog:edit')")@Log(title = "文章管理", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@RequestBody CmsBlog cmsBlog){cmsBlog.setUpdateBy(getUsername());//删除原首图CmsBlog oldBlog = cmsBlogService.selectCmsBlogById(cmsBlog.getId());if (cmsBlog.getBlogPic().isEmpty()||!cmsBlog.getBlogPic().equals(oldBlog.getBlogPic())){if(!oldBlog.getBlogPic().isEmpty()){String blogPic = oldBlog.getBlogPic();if (blogPic!=null&&!"".equals(blogPic)){int newFileNameSeparatorIndex = blogPic.lastIndexOf("/");String FileName = blogPic.substring(newFileNameSeparatorIndex + 1).toLowerCase();sysFileInfoService.deleteSysFileInfoByFileObjectName(FileName);}}}return toAjax(cmsBlogService.updateCmsBlog(cmsBlog));}/*** 删除文章管理*/@PreAuthorize("@ss.hasPermi('cms:blog:remove')")@Log(title = "文章管理", businessType = BusinessType.DELETE)@DeleteMapping("/{ids}")public AjaxResult remove(@PathVariable Long[] ids){//删除原首图for (Long id : ids) {CmsBlog oldBlog = cmsBlogService.selectCmsBlogById(id);if(!oldBlog.getBlogPic().isEmpty()){String blogPic = oldBlog.getBlogPic();if (blogPic!=null&&!"".equals(blogPic)){int newFileNameSeparatorIndex = blogPic.lastIndexOf("/");String FileName = blogPic.substring(newFileNameSeparatorIndex + 1).toLowerCase();sysFileInfoService.deleteSysFileInfoByFileObjectName(FileName);}}}return toAjax(cmsBlogService.deleteCmsBlogByIds(ids));}/*** 取消按钮-删除首图*/@PreAuthorize("@ss.hasPermi('cms:blog:edit')")@PostMapping("/cancel")public AjaxResult cancel(@RequestBody CmsBlog cmsBlog){String blogPic = cmsBlog.getBlogPic();if (blogPic!=null&&!"".equals(blogPic)){Long blogId = cmsBlog.getId();if (blogId==null){int newFileNameSeparatorIndex = blogPic.lastIndexOf("/");String FileName = blogPic.substring(newFileNameSeparatorIndex + 1).toLowerCase();sysFileInfoService.deleteSysFileInfoByFileObjectName(FileName);}else {String Pic = cmsBlogService.selectCmsBlogById(blogId).getBlogPic();if (!blogPic.equals(Pic)){int newFileNameSeparatorIndex = blogPic.lastIndexOf("/");String FileName = blogPic.substring(newFileNameSeparatorIndex + 1).toLowerCase();sysFileInfoService.deleteSysFileInfoByFileObjectName(FileName);}}}return toAjax(1);}
}
package com.ruoyi.system.service.impl;import com.ruoyi.common.annotation.DataSource;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.enums.DataSourceType;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.mapper.SysConfigMapper;
import com.ruoyi.system.service.ISysConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.Collection;
import java.util.List;/*** 参数配置 服务层实现* * @author ruoyi*/
@Service
public class SysConfigServiceImpl implements ISysConfigService
{@Autowiredprivate SysConfigMapper configMapper;@Autowiredprivate RedisCache redisCache;/*** 项目启动时,初始化参数到缓存*/@PostConstructpublic void init(){loadingConfigCache();}/*** 查询参数配置信息* * @param configId 参数配置ID* @return 参数配置信息*/@Override@DataSource(DataSourceType.MASTER)public SysConfig selectConfigById(Long configId){SysConfig config = new SysConfig();config.setConfigId(configId);return configMapper.selectConfig(config);}/*** 根据键名查询参数配置信息* * @param configKey 参数key* @return 参数键值*/@Overridepublic String selectConfigByKey(String configKey){String configValue = Convert.toStr(redisCache.getCacheObject(getCacheKey(configKey)));if (StringUtils.isNotEmpty(configValue)){return configValue;}SysConfig config = new SysConfig();config.setConfigKey(configKey);SysConfig retConfig = configMapper.selectConfig(config);if (StringUtils.isNotNull(retConfig)){redisCache.setCacheObject(getCacheKey(configKey), retConfig.getConfigValue());return retConfig.getConfigValue();}return StringUtils.EMPTY;}/*** 获取验证码开关* * @return true开启,false关闭*/@Overridepublic boolean selectCaptchaOnOff(){String captchaOnOff = selectConfigByKey("sys.account.captchaOnOff");if (StringUtils.isEmpty(captchaOnOff)){return true;}return Convert.toBool(captchaOnOff);}/*** 查询参数配置列表* * @param config 参数配置信息* @return 参数配置集合*/@Overridepublic List<SysConfig> selectConfigList(SysConfig config){return configMapper.selectConfigList(config);}/*** 新增参数配置* * @param config 参数配置信息* @return 结果*/@Overridepublic int insertConfig(SysConfig config){int row = configMapper.insertConfig(config);if (row > 0){redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());}return row;}/*** 修改参数配置* * @param config 参数配置信息* @return 结果*/@Overridepublic int updateConfig(SysConfig config){int row = configMapper.updateConfig(config);if (row > 0){redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());}return row;}/*** 批量删除参数信息* * @param configIds 需要删除的参数ID* @return 结果*/@Overridepublic void deleteConfigByIds(Long[] configIds){for (Long configId : configIds){SysConfig config = selectConfigById(configId);if (StringUtils.equals(UserConstants.YES, config.getConfigType())){throw new ServiceException(String.format("内置参数【%1$s】不能删除 ", config.getConfigKey()));}configMapper.deleteConfigById(configId);redisCache.deleteObject(getCacheKey(config.getConfigKey()));}}/*** 加载参数缓存数据*/@Overridepublic void loadingConfigCache(){List<SysConfig> configsList = configMapper.selectConfigList(new SysConfig());for (SysConfig config : configsList){redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());}}/*** 清空参数缓存数据*/@Overridepublic void clearConfigCache(){Collection<String> keys = redisCache.keys(Constants.SYS_CONFIG_KEY + "*");redisCache.deleteObject(keys);}/*** 重置参数缓存数据*/@Overridepublic void resetConfigCache(){clearConfigCache();loadingConfigCache();}/*** 校验参数键名是否唯一* * @param config 参数配置信息* @return 结果*/@Overridepublic String checkConfigKeyUnique(SysConfig config){Long configId = StringUtils.isNull(config.getConfigId()) ? -1L : config.getConfigId();SysConfig info = configMapper.checkConfigKeyUnique(config.getConfigKey());if (StringUtils.isNotNull(info) && info.getConfigId().longValue() != configId.longValue()){return UserConstants.NOT_UNIQUE;}return UserConstants.UNIQUE;}/*** 设置cache key* * @param configKey 参数键* @return 缓存键key*/private String getCacheKey(String configKey){return Constants.SYS_CONFIG_KEY + configKey;}
}

五、底部获取项目源码(9.9¥带走)

有问题,或者需要协助调试运行项目的也可以

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/27674.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Qt】QT textBrowser 设置字体颜色和大小

1. 效果 2. 代码 {ui->methodText->append("<font size9 colorgreen> dddddddddd </font>");ui->methodText->append("<font size9 colorred> vvvvvvvvvv </font>"); }

局域网监控软件有哪些:五款好用的网络监控神器分享(收藏篇)

在日益复杂的企业网络环境中&#xff0c;有效地监控局域网内的活动对于确保网络安全、提高工作效率和维护企业资产至关重要。 为此&#xff0c;精选了五款市场上广受好评的局域网监控软件&#xff0c;它们各自具备独特的功能和优势&#xff0c;能够满足不同规模企业的需求&…

【七合一】字典词典成语古诗词造句英语单词文库

帝国CMS7.5 UTF-8 系统开源&#xff0c;不限域名 采用静态伪静态&#xff08;会缓存静态文件&#xff09; 一款7合一的字词句诗典籍模板&#xff0c;包含字典、词典、成语、名句、诗词、古籍、英语、作文、等等。是一款养站神器。 作文范文,作文范文可生成word文档下载能自由…

【面经总结】Java集合 - Map

Map 概述 Map 架构 HashMap 要点 以 散列(哈希表) 方式存储键值对&#xff0c;访问速度快没有顺序性允许使用空值和空键有两个影响其性能的参数&#xff1a;初始容量和负载因子。 初始容量&#xff1a;哈希表创建时的容量负载因子&#xff1a;其容量自动扩容之前被允许的最大…

矩阵练习2

48.旋转图像 规律&#xff1a; 对于矩阵中第 i行的第 j 个元素&#xff0c;在旋转后&#xff0c;它出现在倒数第i 列的第 j 个位置。 matrix[col][n−row−1]matrix[row][col] 可以使用辅助数组&#xff0c;如果不想使用额外的内存&#xff0c;可以用一个临时变量 。 还可以通…

【Linux】进程_4

文章目录 五、进程4. 进程状态5. 进程优先级6. 进程的调度和转换 未完待续 五、进程 4. 进程状态 当进程属于挂起状态时&#xff0c;进程的可执行程序代码和数据均会被从内存中换入到磁盘中&#xff0c;此时进程的PCB并没有消失&#xff0c;只要操作系统还需要管理这个进程&a…

C++11左值、右值

知识回顾&#xff0c;详解引用 简单概括&#xff0c;引用就是给已存在对象取别名&#xff0c;引用变量与其引用实体共用同一块内存空间 左右值区分 注意&#xff1a;不一定左边的都是左值&#xff0c;右边的都是右值 左边的也可能是右值&#xff0c;等号右边的也可能是左值 …

Linux C语言:函数的基本用法及传参

一、函数的基本用法 1、main函数 int main(int argc, const char * argv[]) { printf("Hello world\n"); return 0; }数据类型 函数名称 (参数) { //.... return 表达式 } 2、函数 函数是一个完成特定功能的代码模块&#xff0c;其程序代码独立&#xff0c;通常要…

Kafka生产者消息发送流程原理及源码分析

Kafka是一个分布式流处理平台,它能够以极高的吞吐量处理数据。在Kafka中,生产者负责将消息发送到Kafka集群,而消费者则负责从Kafka集群中读取消息。本文将探讨Kafka生产者消息发送流程的细节,包括消息的序列化、分区分配、记录提交等关键步骤。 先看一个生产者发送消息的代…

LaDM3IL:多实例学习用于免疫库分类

一个人的免疫组库由某一时间点的大量适应性免疫受体组成&#xff0c;代表了该个体的适应性免疫状态。免疫组库分类和相关受体识别有可能为新型疫苗的开发做出贡献。大量的实例对免疫组库分类提出了挑战&#xff0c;这可以表述为大规模多实例学习 (MMIL&#xff0c;Massive Mult…

通信协议—Modbus

1、modbus简介 Modbus服务器&#xff1a;接收处理来自客户端的请求&#xff0c;并返回相应的响应&#xff1b; Modbus客户端&#xff1a;向Modbus服务器发送请求&#xff0c;并接收服务器返回的响应的设备或程序&#xff1b; 2、modbus poll调试工具下载 modbus poll用于测…

Python基础教程(二十):SMTP发送邮件

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

微信监控销售防飞单系统,让你的团队业绩稳如泰山!

团队中偶尔出现的私单、飞单问题而烦恼不已&#xff1f;你是否渴望拥有一个神器&#xff0c;能够实时监控销售过程&#xff0c;确保团队业绩的稳健增长&#xff1f;今天&#xff0c;就让我们一起探索这款神奇的“微信监控销售防飞单系统”&#xff0c;让你的销售团队如虎添翼&a…

React 渲染流程分析

React 页面是由组件组成的&#xff0c;从根组件直到叶组件&#xff0c;内部的组件数通过 Fiber 来保存并触发并发更新。页面的展示分为两部分&#xff0c;首先是初始化&#xff0c;所有组件首次展示&#xff0c;都要进行渲染&#xff0c;之后是更新流程&#xff0c;也就是页面产…

实况:老菜鸟自力更生从零开始重学spring目标是画出一张唬人大图(二、源码下载编译)

前情提要&#xff1a;调试前的基础知识梳理 速览 “Spring”包含哪些东西源码下载源码编译1、编译工具选择&#xff1a;gradle2、使用gradle编译spring并导入idea预编译spring-oxm导入IDEA确认合适的jdk版本排除spring-aspects模块 开始调试 “Spring”包含哪些东西 可以明确的…

代码随想录算法训练营第二十四天| (回溯) 77. 组合、 216.组合总和III、17.电话号码的字母组合

77. 组合 题目链接&#xff1a;77. 组合 文档讲解&#xff1a;代码随想录 状态&#xff1a;很多细节忘了 思路&#xff1a;先画图&#xff0c;然后可以发现&#xff0c;从1到n中选择k个数&#xff0c;可以看成是一个递归过程&#xff0c;这个递归的深度就是k。然后遍历当前这层…

Centos7安装jdk8或11以及切换方案

目录 jdk安装 安装OpenJDK11 安装OpenJDK8 配置默认的 Java 版本 验证 全局环境变量&#xff08;选配&#xff09; 个人版&#xff08;自己可以用&#xff0c;公司不建议&#xff09; 公司版本 /etc/profile 和 ~/.bash_profile 区别 前言-与正文无关 生活远不止眼前的苦…

【动态规划】| 路径问题之不同路径 力扣62

&#x1f397;️ 主页&#xff1a;小夜时雨 &#x1f397;️ 专栏&#xff1a;动态规划 &#x1f397;️ 如何活着&#xff0c;是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: https://leetcode.cn/problems/unique-paths/description/ 通常动态规划的题目有…

建筑电工精选最新模拟试题(含答案)

一、填空题 1、我国安全生产的基本方针是 安全 第一&#xff0c;预防 为主&#xff0c;综合治理。 2、特种作业人员&#xff0c;必须积极主动参加培训与考核 。既是法律法规的规定&#xff0c;也是自身工作&#xff0c;生产及生命安全 的需要 3、触电急救&#x…

【Tkinter界面】Canvas 图形绘制(03/5)

文章目录 一、说明二、画布和画布对象2.1 画布坐标系2.2 鼠标点中画布位置2.3 画布对象显示的顺序2.4 指定画布对象 三、你应该知道的画布对象操作3.1 什么是Tag3.2 操作Tag的函数 https://www.cnblogs.com/rainbow-tan/p/14852553.html 一、说明 Canvas&#xff08;画布&…