当前位置: 首页 > news >正文

博客程序系统其它功能扩充

一、注册功能

1、约定前后端接口


2、后端代码编写

@WebServlet("/register")
public class RegisterServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置编码,告诉 Servlet 按照什么格式来理解请求req.setCharacterEncoding("utf8");//设置响应的编码,告诉 Servlet 按照什么格式来构造请求resp.setContentType("text/html;charset=utf8");//1、读取参数中的用户名和密码String username = req.getParameter("username");String password = req.getParameter("password");if (username == null || "".equals(username) || password == null || "".equals(password)){//注册失败String html = "<h3>注册失败!缺少 username 或者 password 字段!</h3>";resp.getWriter().write(html);return;}//2、读数据库,看看数据库中是否存在 usernameUserDao userDao = new UserDao();User user = userDao.selectByUsername(username);if (user != null){//用户已经存在String html = "<h3>注册失败!该用户已经存在,请重新注册用户!";resp.getWriter().write(html);return;}//用户不存在,注册用户userDao.add(username,password);//注册完自动跳转到登录页面resp.sendRedirect("login.html");}
}

3、前端代码编写

为了添加一个注册的功能,我重新编写了一个专门用于注册的页面,该页面与登录页面类似

并且在登录页面中新添加了一个注册的按钮,当用户点击到注册按钮之后,就会自动跳转到注册页面进行注册


4、遇到的问题

当设计好注册功能后,我新注册了一个账户,并登录该账户,发现该账户虽然并没有发布任何的博客,但是仍然可以查询到别的用户发布的博客内容,于是我对 BlogDao 中的方法和 博客列表页的 doGet 进行了一些修改

在 selectAll 方法中,不再是查询全部的博客信息,而是只查询对应 userId 的博客,也就是登录的用户自己发布的博客内容而查询的所需要的 userId 的信息,则是从 session 中获取,这样就可以将两个账户发表的博客进行一个有效的分开


二、修改已发布文章功能

1、约定前后端接口

点击编辑按钮跳转到编辑页面时,使用 GET 

编辑文章后提交新的文章,使用 POST 


2、后端代码编写

@WebServlet("/update")
public class updateServlet extends HttpServlet {private ObjectMapper objectMapper = new ObjectMapper();private int BlogId = 0;protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 1. 检查当前用户是否登录resp.setContentType("application/json;charset=utf-8");HttpSession session = req.getSession(false);if (session == null) {resp.setContentType("text/html; charset=utf8");resp.getWriter().write("当前尚未登录, 不能修改!");return;}User user = (User) session.getAttribute("user");if (user == null) {resp.setContentType("text/html; charset=utf8");resp.getWriter().write("当前尚未登录, 不能修改!");return;}// 2. 获取到参数中的 blogIdString blogId = req.getParameter("blogId");if (blogId == null || "".equals(blogId)) {resp.setContentType("text/html; charset=utf8");resp.getWriter().write("当前 blogId 参数不对!");return;}// 3. 获取要修改的博客信息.BlogDao blogDao = new BlogDao();BlogId = Integer.parseInt(blogId);Blog blog = blogDao.selectById(Integer.parseInt(blogId));if (blog == null) {resp.setContentType("text/html; charset=utf8");resp.getWriter().write("当前要修改的博客不存在!");return;}else{resp.setContentType("application/json;charset=utf-8");resp.getWriter().write(objectMapper.writeValueAsString(blog));}}protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 1. 检查当前用户是否登录req.setCharacterEncoding("utf-8");resp.setContentType("application/json;charset=utf8");HttpSession session = req.getSession(false);if (session == null) {resp.setContentType("text/html; charset=utf8");resp.getWriter().write("当前尚未登录, 不能修改!");return;}User user = (User) session.getAttribute("user");if (user == null) {resp.setContentType("text/html; charset=utf8");resp.getWriter().write("当前尚未登录, 不能修改!");return;}String title = req.getParameter("title");String content = req.getParameter("content");if(title == null || "".equals(title) || content == null || "".equals(content)){resp.getWriter().write("<script>alert('有内容为空')</script>");return;}int blogId = BlogId;BlogDao blogDao = new BlogDao();Blog blog = new Blog();blog.setTitle(title);blog.setContent(content);blog.setBlogId(blogId);blogDao.update(blog);resp.sendRedirect("blog_list.html");}
}

 此外,为了能够实现更新功能,在 BlogDao 中新增加了一个 update 方法

public void update(Blog blog) {Connection connection = null;PreparedStatement statement = null;try {// 1. 建立连接connection = DBUtil.getConnection();// 2. 拼装 SQL 语句String sql = "update blog set content = ? ,title = ? where blogId = ?";statement = connection.prepareStatement(sql);statement.setString(1, blog.getContent());statement.setString(2, blog.getTitle());statement.setInt(3, blog.getBlogId());// 3. 执行 SQL 语句int ret = statement.executeUpdate();if (ret == 1) {System.out.println("编辑成功");} else {System.out.println("编辑失败");}} catch (SQLException e) {e.printStackTrace();} finally {DBUtil.close(connection, statement, null);}}

3、前端代码编写

重新编写了一个长的和发布文章类似的页面来实现编辑文章,同时在博客详情页中增加了一个 编辑的按钮

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>博客编辑页</title><link rel="stylesheet" href="CSS/common.css"><link rel="stylesheet" href="CSS/blog_edit.css"><!-- 引入 editor.md 的依赖 --><link rel="stylesheet" href="editor.md/css/editormd.min.css" /><script src="js/jquery.mini.js"></script><script src="editor.md/lib/marked.min.js"></script><script src="editor.md/lib/prettify.min.js"></script><script src="editor.md/editormd.js"></script>
</head>
<body>
<!-- 这是导航栏 -->
<div class="nav"><img src="image/logo2.png" alt=""><span>我的博客系统</span><!-- 空白元素, 用来占位置 --><div class="spacer"></div><a href="blog_list.html">主页</a><a href="blog_edit.html">写博客</a><a href="logout">注销</a>
</div>
<!-- 包裹整个博客编辑页内容的顶级容器 -->
<div class="blog-edit-container"><form action="update" method="post" style="height: 100%"><div class="title"><input type="text" placeholder="在此处输入标题" name="title" id="title"><!--<button>发布文章</button>--><input type="submit" value="提交修改" id="submit"></div><!-- 放置 md 编辑器 --><div id="editor"><!-- 为了进行 form 的提交,此处搞一个 textarea 多行编辑器,借助这个编辑框来实现表单的提交 --><!-- 可以设置 editor.md,让编辑器把 markdown 内容也同步的保存到这个隐藏的 textarea 中,从而进行 form 提交 --><textarea class="content" name="content" style="display: none"></textarea></div></form></div><script>function getEditUpdate(){$.ajax({type: 'get',url: 'update' + location.search,success: function(body){let title = document.querySelector(".title>#title")title.innerHTML = body.title;let content = document.querySelector('.content')content.innerHTML = body.content;}});}getEditUpdate();</script><script>//初始化编辑器let editor = editormd("editor",{//这里的尺寸必须在这里设置,设置样式会被editormd 自动覆盖掉width: "100%",//设定编辑器高度height: "calc(100% - 50px)",//编辑器中的初始内容markdown: "# 在这里写下一篇博客",//指定 editor.md 依赖的插件路径path: "editor.md/lib/",// 此处要加上一个重要的选项,然后 editor.md 就会自动把用户在编辑器输入的内容同步保存到 隐藏的 textarea 中了!saveHTMLToTextarea: true,});
</script>
<!--     <script src="js/common.js"></script>-->
</body>
</html>

4、遇到的问题

在最初代码编写的时候,我直接复用了之前发布文章的页面来实现对文章内容的修改功能,后来发现这样容易使发布功能和编辑功能混淆,最后将两个功能页面分开,重新编写了一个博客编辑的页面


三、实现用户博客总数统计

在目前的代码中,我们的博客总数是固定的,无法实时显示该用户的博客总数,于是我们加一个接口来实现这个功能


1、编写后端代码

@WebServlet("/num")
public class totalServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session = req.getSession(false);if (session == null){resp.setContentType("text/html;charset=utf8");resp.getWriter().write("当前用户未登录!");return;}User user = (User) session.getAttribute("user");if (user == null){resp.setContentType("text/html;charset=utf8");resp.getWriter().write("当前用户未登录!");return;}//确保了登录之后resp.setContentType("text/html;charset=utf8");String blogId = req.getParameter("blogId");BlogDao blogDao = new BlogDao();if (blogId ==null){resp.getWriter().write(blogDao.selectTotal(user.getUserId())+"");}else{Blog blog = blogDao.selectById(Integer.parseInt(blogId));UserDao userDao = new UserDao();User author = userDao.selectById(blog.getUserId());resp.getWriter().write(blogDao.selectTotal(author.getUserId()) + "");}}
}

此外,还在 BlogDao 中新增了一个计算个人文章总数的方法

    //6. 计算个人文章的总数public static Integer selectTotal(int userId){Connection connection = null;PreparedStatement statement = null;ResultSet resultSet = null;try {connection = DBUtil.getConnection();String sql = "select count(userId) from blog where userId = ?";statement = connection.prepareStatement(sql);statement.setInt(1,userId);resultSet = statement.executeQuery();return resultSet.getInt(1);} catch (SQLException throwables) {throwables.printStackTrace();}finally {DBUtil.close(connection,statement,resultSet);}return null;}

2、编写前端代码:

在博客详情页和博客列表页中都加入这段代码:


 四、删除博客

1、编写后端代码

在 BlogDao  中新增一个删除的方法

    public void delete(int blogId){Connection connection = null;PreparedStatement statement = null;try{//1、和数据库建立连接connection = DBUtil.getConnection();//2、构造 sql 语句String sql = "delete from blog where blogId = ?";statement = connection.prepareStatement(sql);statement.setInt(1,blogId);//3、执行 sqlstatement.executeUpdate();} catch (SQLException e) {throw new RuntimeException(e);}finally {//进行关闭DBUtil.close(connection,statement,null);}}
@WebServlet("/delete")
public class DeleteServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session = req.getSession(false);if (session == null){resp.setContentType("text/html;charset=utf8");resp.getWriter().write("当前未登录,不能进行删除操作!");return;}User user = (User) session.getAttribute("user");if (user == null){resp.setContentType("text/html;charset=utf8");resp.getWriter().write("当前未登录,不能进行删除操作!");return;}//获取 BlogIdString blogId = req.getParameter("blogId");if (blogId == null || "".equals(blogId)){resp.setContentType("text/html;charset=utf8");resp.getWriter().write("当前 blogId 参数不对!");return;}//获取要删除的博客信息BlogDao blogDao = new BlogDao();Blog blog = blogDao.selectById(Integer.parseInt(blogId));if (blog == null){resp.setContentType("text/html;charset=utf8");resp.getWriter().write("当前要删除的博客不存在,blogId = " + blogId);return;}//删除博客内容blogDao.delete(Integer.parseInt(blogId));//回到博客列表页resp.sendRedirect("blog_list.html");}
}

2、编写前端代码

前端代码与前面的同理


3、遇到的问题

在写完代码之后,对页面进行了测试,发现:虽然可以修改代码,但是无法将原先的文章内容进行回显,于是我对前端代码进行了微调,实现回显功能

1、在 title 和 content 中加入 value 属性

2、在函数中修改 title 和 content 的赋值方式,使用 value 进行赋值


四、编辑博客

思路:

在博客详情页点击编辑博客之后,自动跳转到编辑页面,同时将原先的博客内容回显到 markdown 编辑器上,然后对原文进行编辑之后,再次提交修改即可


1、后端代码

@WebServlet("/update")
public class updateServlet extends HttpServlet {private ObjectMapper objectMapper = new ObjectMapper();private int BlogId = 0;protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 1. 检查当前用户是否登录resp.setContentType("application/json;charset=utf-8");HttpSession session = req.getSession(false);if (session == null) {resp.setContentType("text/html; charset=utf8");resp.getWriter().write("当前尚未登录, 不能修改!");return;}User user = (User) session.getAttribute("user");if (user == null) {resp.setContentType("text/html; charset=utf8");resp.getWriter().write("当前尚未登录, 不能修改!");return;}// 2. 获取到参数中的 blogIdString blogId = req.getParameter("blogId");if (blogId == null || "".equals(blogId)) {resp.setContentType("text/html; charset=utf8");resp.getWriter().write("当前 blogId 参数不对!");return;}// 3. 获取要修改的博客信息.BlogDao blogDao = new BlogDao();BlogId = Integer.parseInt(blogId);Blog blog = blogDao.selectById(Integer.parseInt(blogId));if (blog == null) {resp.setContentType("text/html; charset=utf8");resp.getWriter().write("当前要修改的博客不存在!");return;}else{resp.setContentType("application/json;charset=utf-8");resp.getWriter().write(objectMapper.writeValueAsString(blog));}}protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 1. 检查当前用户是否登录req.setCharacterEncoding("utf-8");resp.setContentType("application/json;charset=utf8");HttpSession session = req.getSession(false);if (session == null) {resp.setContentType("text/html; charset=utf8");resp.getWriter().write("当前尚未登录, 不能修改!");return;}User user = (User) session.getAttribute("user");if (user == null) {resp.setContentType("text/html; charset=utf8");resp.getWriter().write("当前尚未登录, 不能修改!");return;}String title = req.getParameter("title");String content = req.getParameter("content");if(title == null || "".equals(title) || content == null || "".equals(content)){resp.getWriter().write("<script>alert('有内容为空')</script>");return;}int blogId = BlogId;BlogDao blogDao = new BlogDao();Blog blog = new Blog();blog.setTitle(title);blog.setContent(content);blog.setBlogId(blogId);blogDao.update(blog);resp.sendRedirect("blog_list.html");}
}

2、前端代码


五、管理员审核博客

1、后端代码

@WebServlet("/admin")
public class adminServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session = req.getSession(false);if (session == null){resp.setContentType("text/html;charset=utf8");resp.getWriter().write("当前未登录,无法进行审核");return;}User user = (User) session.getAttribute("user");if (user == null){resp.setContentType("text/html;charset=utf8");resp.getWriter().write("当前未登录,无法进行审核");return;}String blogId = req.getParameter("blogId");BlogDao blogDao = new BlogDao();ObjectMapper objectMapper = new ObjectMapper();if (blogId == null){//query string 不存在,则是审核详情页列表页List<Blog> blogs =  blogDao.selectAudit();String respJson = objectMapper.writeValueAsString(blogs);resp.setContentType("application/json;charset=utf8");resp.getWriter().write(respJson);}else {//query string 存在,则是审核详情页Blog blog = blogDao.selectById(Integer.parseInt(blogId));String respJson = objectMapper.writeValueAsString(blog);resp.setContentType("application/json;charset=utf8");resp.getWriter().write(respJson);}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//审核通过的 post 请求HttpSession session = req.getSession(false);if (session == null){resp.setContentType("text/html;charset=utf8");resp.getWriter().write("当前未登录,无法进行审核");return;}User user = (User) session.getAttribute("user");if (user == null){resp.setContentType("text/html;charset=utf8");resp.getWriter().write("当前未登录,无法进行审核");return;}Blog blog = new Blog();String blogId = req.getParameter("blogId");BlogDao blogDao = new BlogDao();blogDao.changeStatus(Integer.parseInt(blogId),1);resp.sendRedirect("admin_list.html");}
}
@WebServlet("/false")
public class falseServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//审核不通过的 post 请求HttpSession session = req.getSession(false);if (session == null){resp.setContentType("text/html;charset=utf8");resp.getWriter().write("当前未登录,无法进行审核");return;}User user = (User) session.getAttribute("user");if (user == null){resp.setContentType("text/html;charset=utf8");resp.getWriter().write("当前未登录,无法进行审核");return;}Blog blog = new Blog();String blogId = req.getParameter("blogId");BlogDao blogDao = new BlogDao();blogDao.changeStatus(Integer.parseInt(blogId),-1);resp.sendRedirect("admin_list.html");}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//统计审核通过了的文章总数并返回HttpSession session = req.getSession(false);if (session == null) {resp.setContentType("text/html;charset=utf8");resp.getWriter().write("当前用户未登录!");return;}User user = (User) session.getAttribute("user");if (user == null) {resp.setContentType("text/html;charset=utf8");resp.getWriter().write("当前用户未登录!");return;}//确保了登录之后resp.setContentType("text/html;charset=utf8");String blogId = req.getParameter("blogId");BlogDao blogDao = new BlogDao();int num = blogDao.countSuccess();resp.getWriter().write(num + "");}
}

2、前端代码

前端代码与之前的差不多,这里就只展示一部分


六、评论

1、后端代码

@WebServlet("/comments")
public class commentsServlet extends HttpServlet {public int blogId;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ObjectMapper objectMapper = new ObjectMapper();HttpSession session = req.getSession(false);if (session  == null){resp.setContentType("text/html;charset=utf8");resp.getWriter().write("当前用户未登录!");return;}User user = (User) session.getAttribute("user");if (user == null){resp.setContentType("text/html;charset=utf8");resp.getWriter().write("当前用户未登录!");return;}CommentsDao commentsDao = new CommentsDao();blogId = Integer.parseInt(req.getParameter("blogId"));List<Comments> commentsList = commentsDao.selectAll(blogId);//把 数据 转换成 json 格式String respJson = objectMapper.writeValueAsString(commentsList);resp.setContentType("application/json;charset=utf8");resp.getWriter().write(respJson);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session = req.getSession(false);if (session == null){resp.setContentType("text/html;charset=utf8");resp.getWriter().write("当前用户未登录,不能发表评论!");return;}User user = (User) session.getAttribute("user");if (user == null){resp.setContentType("text/html;charset=utf8");resp.getWriter().write("当前用户未登录,不能发表评论!");return;}//获取评论信息req.setCharacterEncoding("utf8");String content = req.getParameter("content");if (content == null || "".equals(content)){resp.setContentType("text/html;charset=utf8");resp.getWriter().write("当前提交数据为空!");return;}//在博客详情页,对//构造 comments 对象String blogId = req.getParameter("blogId");Comments comments = new Comments();comments.setContent(content);comments.setPostTime(new Timestamp(System.currentTimeMillis()));comments.setBlogId(Integer.parseInt(blogId));//插入数据CommentsDao commentsDao = new CommentsDao();commentsDao.add(comments);//跳转到博客列表页resp.sendRedirect("blog_list.html");}
}

2、前端代码

在博客详情页添加了一个小方块来放置评论,同时在详情页的最底下增加提交评论的功能

 


七、统计

在普通用户页面计算通过审核的文章和未通过审核的文章,在管理员页面计算待审核的文章和审核成功的文章个数

主要通过 status 列来进行统计,这里就不再展示代码了

相关文章:

博客程序系统其它功能扩充

一、注册功能 1、约定前后端接口 2、后端代码编写 WebServlet("/register") public class RegisterServlet extends HttpServlet {Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置…...

MATLAB 2023安装方法之删除旧版本MATLAB,安装新版本MATLAB

说明&#xff1a;之前一直使用的是MATLAB R2020b&#xff0c;但最近复现Github上的程序时&#xff0c;运行不了&#xff0c;联系作者说他的程序只能在MATLAB 2021之后的版本运行&#xff0c;因此决定安装最新版本的MATLAB。 系统&#xff1a;Windows 11 需要卸载的旧MATLAB 版…...

全国唯一一所初试考Java的学校!平均300分拿下

苏州科技大学 考研难度&#xff08;☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文1187字&#xff0c;预计阅读&#xff1a;3分钟 2023考情概况 苏州科技…...

day35 | 860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

目录&#xff1a; 解题及思路学习 860. 柠檬水找零 在柠檬水摊上&#xff0c;每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品&#xff0c;&#xff08;按账单 bills 支付的顺序&#xff09;一次购买一杯。 每位顾客只买一杯柠檬水&#xff0c;然后向你付 5 美元、10 美…...

ffmpeg批量转码

新建.bat文件 echo offfor %%s in (*.mp4) do ( echo %%s ffmpeg -i %%s -b 7M %%~ns7m.mp4 ) pause如果你的电脑有显卡&#xff0c;也可以使用硬件转码。转码程序链接...

时序预测 | MATLAB实现基于QPSO-BiLSTM、PSO-BiLSTM和BiLSTM时间序列预测

时序预测 | MATLAB实现基于QPSO-BiLSTM、PSO-BiLSTM和BiLSTM时间序列预测 目录 时序预测 | MATLAB实现基于QPSO-BiLSTM、PSO-BiLSTM和BiLSTM时间序列预测效果一览基本描述程序设计参考资料 效果一览 基本描述 1.Matlab实现QPSO-BiLSTM、PSO-BiLSTM和BiLSTM神经网络时间序列预测…...

【TypeScript学习】—基本类型(二)

【TypeScript学习】—基本类型&#xff08;二&#xff09; 一、TypeScript基本类型 //也可以直接用字面量进行类型声明let a:10; a10;//也可以使用 |来连接多个类型&#xff08;联合类型&#xff09;let b:"male"|"female"; b"male"; b"fe…...

uni-app点击复制指定内容(点击复制)

官方api uni.setClipboardData(OBJECT) uni.setClipboardData({data: 要被复制的内容,success: function () {console.log(success);} });...

无涯教程-Flutter - 简介

Flutter是一个由谷歌开发的开源移动应用软件开发工具包&#xff0c;用于为Android、iOS、 Windows、Mac、Linux、Google Fuchsia开发应用。 通常&#xff0c;创建移动应用程序是一个非常复杂和具有挑战性的任务。有许多框架可用&#xff0c;它提供了开发移动应用程序的出色函数…...

【STM32】学习笔记-时间戳RTC

Unix时间戳 Unix 时间戳&#xff08;Unix Timestamp&#xff09;定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数&#xff0c;不考虑闰秒 时间戳存储在一个秒计数器中&#xff0c;秒计数器为32位/64位的整型变量 世界上所有时区的秒计数器相同&#xff0c;不同时区通…...

绿色能源迎来跨越式增长新时代

当今世界&#xff0c;百年未有之大变局加速演进&#xff0c;新一轮科技革命和产业变革深入发展&#xff0c;全球气候治理呈现新局面&#xff0c;新能源和信息技术紧密融合&#xff0c;生产生活方式加快转向低碳化、智能化&#xff0c;能源体系和发展模式正在进入非化石能源主导…...

【算法】函数渐近的界基础知识及定理

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…...

stable diffusion实践操作-writing

文章目录 前言一、优点1.1、免费开源1.2、拥有强大的外接模型 二、组成要素2.1 底模2.2 风格2.3 提示词2.4 参数配置 三、生图原理四、下载链接 实践正文一、安装1.1 电脑硬件配置查看1.2 安装本地版本的stable diffusion1.3 SD使用教程 二、模型介绍与下载2.1大模型2.2 Lora模…...

idea查找maven所有依赖

文章目录 idea自带的依赖结构图idea安装maven helper插件 idea自带的依赖结构图 缺点是只有依赖&#xff0c;没有版本 idea安装maven helper插件 settings–>plugins–>搜索maven helper并安装 安装后打开pom.xml文件会有依赖解析 勾选conflict就是有冲突的依赖选中…...

【业务功能篇97】微服务-springcloud-springboot-电商购物车模块-获取当前登录用户的购物车信息

购物车功能 一、购物车模块 1.创建cart服务 我们需要先创建一个cart的微服务&#xff0c;然后添加相关的依赖&#xff0c;设置配置&#xff0c;放开注解。 <dependencies><dependency><groupId>com.msb.mall</groupId><artifactId>mall-commo…...

Shell常用的几个正则表达式:[:alnum:], [:alpha:], [:upper:], [:lower:], [:digit:] 认知

一&#xff1a;通配符命令简介&#xff1a; 匹配符合相关条件的符号&#xff0c;匹配文件名查找。 通配符类型&#xff1a; *&#xff1a;匹配任意长度的任意字符 &#xff1f;&#xff1a;匹配任意单个字符 []&#xff1a;匹配指定范围内的任意单个字符 [^]&#xff1a;匹配指…...

简单的爬虫代码 爬(豆瓣电影)

路漫漫其修远兮&#xff0c;吾将上下而求索 这次写一个最简单的python爬虫代码&#xff0c;也是大多教程第一次爬取的&#xff0c;代码里面有个别的简单介绍&#xff0c;希望能加深您对python爬虫的理解。 本次爬取两个网页数据 一 爬取的网站 豆瓣电影 爬取网页中的&#…...

微服务之架构演变

随着互联网的发展&#xff0c;网站应用规模不断扩大&#xff0c;网站架构随之不断演变&#xff0c;演变历史大致分为单体应用架构-垂直应用架构-分布式架构-SOA架构-微服务架构-云原生架构 架构演变 单体应用架构 以前网站流量小&#xff0c;只需要一个应用就可以把所有功能…...

面试问题记录一 --- C++(Qt方向)

以下是我于2023年6~7月间换工作时遇到的面试题目,有需要的小伙伴可以参考下。约100个题目。 1 C和C++的区别 1) 文件区别:C源文件后缀 .c;C++源文件后缀 .cpp 2) 返回值: C默认返回int型;C++ 若无返回值,必须指定为void 3) 参数列表:C默认接收多个…...

使用词袋模型(BoW)测试提取图像的特征点和聚类中心

文章目录 环境配置代码测试 环境配置 (1) 导入opencv&#xff0c;参考链接 https://blog.csdn.net/Aer_7z/article/details/132612369(2) 安装numpy 激活虚拟环境的前提下&#xff0c;输入&#xff1a; pip install numpy(3) 安装sklearn 激活虚拟环境的前提下&#xff0c;输…...

利用vba处理Excel表格数据实现键值转化,适用于将编码转化成对应的文本

最近遇到了一个甲方需要提供系统登录的用户名单和对应的角色权限内容。无奈直接从数据库导出的数据对应的都是编码&#xff0c;没有转成中文&#xff0c;想着偷个懒能不能直接用Excel直接转&#xff0c;网上看了一下有修改单元格格式的&#xff0c;但需要编码是2到3个。多的就用…...

IntelliJ IDEA(Windows 版)的所有快捷键

&#x1fa81;&#x1f341; 希望本文能够给您带来一定的帮助&#x1f338;文章粗浅&#xff0c;敬请批评指正&#xff01;&#x1f341;&#x1f425; 大家好 本文参考了 IntelliJ IDEA 的官网&#xff0c;列举了IntelliJ IDEA&#xff08;Windows 版&#xff09;的所有快捷…...

文件上传漏洞全面渗透姿势

0x00 文件上传场景 (本文档只做技术交流) 文件上传的场景真的随处可见&#xff0c;不加防范小心&#xff0c;容易造成漏洞&#xff0c;造成信息泄露&#xff0c;甚至更为严重的灾难。 比如某博客网站评论编辑模块&#xff0c;右上角就有支持上传图片的功能&#xff0c;提交带…...

GreenPlum的gpfdist使用与原理流程分析

一、简介 GreenPlum 的数据导入功能作为对数据源的一种扩充&#xff0c;数据导入的方式有&#xff1a; 1、insert 该方式通过 sql 语句&#xff0c;把数据一条一条插入至表中。这种方式&#xff0c;不仅读取数据慢&#xff08;一条一条读取&#xff09;&#xff0c;且数据需要…...

Spring AOP与静态代理/动态代理

文章目录 一、代理模式静态代理动态代理代理模式与AOP 二、Spring AOPSping AOP用来处理什么场景jdk 动态代理cglib 动态代理面试题&#xff1a;讲讲Spring AOP的原理与执行流程 总结 一、代理模式 代理模式是一种结构型设计模式&#xff0c;它允许对象提供替代品或占位符&…...

【LeetCode算法系列题解】第51~55题

CONTENTS LeetCode 51. N 皇后&#xff08;困难&#xff09;LeetCode 52. N 皇后 II&#xff08;困难&#xff09;LeetCode 53. 最大子序和&#xff08;中等&#xff09;LeetCode 54. 螺旋矩阵&#xff08;中等&#xff09;LeetCode 55. 跳跃游戏&#xff08;中等&#xff09; …...

驱动开发错误汇编

本博文将会不定期更新。以便记录我的驱动开发生涯中的一些点点滴滴的技术细节和琐事。 1. link阶段找不到导出函数 比如"LNK2019 无法解析的外部符号 _FltCreateCommunicationPort32"。 出现这种情况的原因是&#xff0c;驱动的编译环境忽略了所有的默认库&#x…...

知识图谱项目实践

目录 步骤 SpaCy Textacy——Text Analysis for Cybersecurity Networkx Dateparser 导入库 写出页面的名称 ​编辑 自然语言处理 词性标注 可能标记的完整列表 依存句法分析&#xff08;Dependency Parsing&#xff0c;DEP&#xff09; 可能的标签完整列表 实例理…...

stable diffusion实践操作-提示词-人物属性

系列文章目录 stable diffusion实践操作-提示词 文章目录 系列文章目录前言一、提示词汇总1.1 人物属性11.2 人物属性2 前言 本文主要收纳总结了提示词-人物属性。 一、提示词汇总 1.1 人物属性1 角色类型人物身材胸部头发-发型头发-发色[女仆][霊烏路空][大腿][乳房][呆毛…...

RabbitMQ的安装和配置

将RabbitMQ文件夹传到linux根目录 开启管理界面及配置...