Java项目——博客系统(前后端交互)

news2024/11/30 8:33:04

项目展示

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

项目说明

使用servlet,实现前后端交互,通过jdbc和mysql数据库进行数据传输,使得可以将用户信息和博客列表存储在数据库中,实现真正的服务器,客户端,数据库三者的交互

项目代码

数据库

在sql数据库中建立数据库,建立用户表和博客列表

create database if not exists Lx_blog charset utf8mb4;
use Lx_blog;

drop table if exists blog;
create table blog (
    blogId int primary key auto_increment,
    title varchar(1024),
    content mediumtext,
    userId int,
    postTime datetime
);

insert into blog values(null,"这是第一篇博客", "从今天开始,我要一天写一篇博客",1,now());
insert into blog values(null,"这是第二篇博客", "从今天开始,我要一天写两篇博客",1,now());
insert into blog values(null,"这是第三篇博客", "从今天开始,我要一天写三篇博客",1,now());
insert into blog values(null,"这是第一篇博客", "从今天开始,我胡汉三要一天写一篇博客",2,now());
insert into blog values(null,"这是第一篇博客", "从昨天开始,我胡汉三要一天写两篇博客",2,now());
insert into blog values(null,"这是第三篇博客", "# 一级标题\n ### 三级标题\n > 引用内容",2,now());

drop table if exists user;
create table user (
    userId int primary key auto_increment,
    username varchar(128) unique,
    password varchar(128)
);

insert into user values(null, '123', 1234);
insert into user values(null, 'xiao', 8830);

后端

DBUtil

实现jdbc的基础代码——获取DataSource的方法,获取connection的方法,close各种资源的方法

package model;

import com.mysql.cj.jdbc.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DBUtil {
    private static final String URL = "jdbc:mysql://127.0.0.1:3306/Lx_blog?characterEncoding=utf-8";
    private static final String USERNAME = "root";
	private static final String PASSWORD = "";

    private static volatile DataSource dataSource = null;

    private static DataSource getDataSource(){
        if(dataSource == null){
            synchronized (DBUtil.class){
                if (dataSource == null){
                    dataSource = new MysqlDataSource();
                    ((MysqlDataSource)dataSource).setUrl(URL);
                    ((MysqlDataSource)dataSource).setUser(USERNAME);
                    ((MysqlDataSource)dataSource).setPassword(PASSWORD);
                }
            }
        }
        return dataSource;
    }

    public static Connection getConnection() throws SQLException {
        return getDataSource().getConnection();
    }

    public static void close(Connection connection, PreparedStatement statement, ResultSet resultSet){
        if(resultSet != null){
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(statement != null){
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(connection != null){
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

Blog

是博客列表中每一个博客对象,里面包含博客id,标题,内容,用户id,提交时间,及一系列get和set方法

package model;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;

public class Blog {
    private int blogId;
    private String title;
    private String content;
    private int userId;
    private Timestamp postTime;

    public int getBlogId() {
        return blogId;
    }

    public void setBlogId(int blogId) {
        this.blogId = blogId;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

//    public Timestamp getPostTime() {
//        return postTime;
//    }

    public String getPostTime(){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return simpleDateFormat.format(postTime);
    }

    public void setPostTime(Timestamp postTime) {
        this.postTime = postTime;
    }
}

User

用户对象,其包括用户id,用户名和密码,及一系列get和set方法

package model;

public class User {
    private int userId = 0;
    private String username = "";
    private String password = "";

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

BlogDao

通过调用jdbc中的一系列查询和插入方法,实现新增博客,获取所有博客,通过博客id获取单一博客的方法

package model;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class BlogDao {
    public void insert(Blog blog){
        Connection connection = null;
        PreparedStatement statement = null;
        try {
            connection = DBUtil.getConnection();
            String sql = "insert into blog values(null, ?, ?, ?, now())";
            statement = connection.prepareStatement(sql);
            statement.setString(1, blog.getTitle());
            statement.setString(2, blog.getContent());
            statement.setInt(3, blog.getUserId());

            statement.executeUpdate();

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(connection,statement,null);
        }
    }

    public List<Blog> selectAll(){
        List<Blog> blogs = new ArrayList<>();
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        try{
            connection = DBUtil.getConnection();
            String sql = "select * from blog order by postTime desc";
            statement = connection.prepareStatement(sql);
            resultSet =  statement.executeQuery();
            while(resultSet.next()){
                Blog blog = new Blog();
                blog.setBlogId(resultSet.getInt("blogId"));
                blog.setTitle(resultSet.getString("title"));
                String content = resultSet.getString("content");
                if(content.length() > 50){
                    content = content.substring(0, 50) + "...";
                }
                blog.setContent(content);
                blog.setUserId(resultSet.getShort("userId"));
                blog.setPostTime(resultSet.getTimestamp("postTime"));
                blogs.add(blog);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtil.close(connection,statement,resultSet);
        }
        return blogs;
    }

    public Blog selectOne(int blogId){
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        try{
            connection = DBUtil.getConnection();
            String sql = "select * from blog where blogId = ?";
            statement = connection.prepareStatement(sql);
            statement.setInt(1,blogId);
            resultSet = statement.executeQuery();
            if(resultSet.next()){
                Blog blog = new Blog();
                blog.setBlogId(resultSet.getInt("blogId"));
                blog.setTitle(resultSet.getString("title"));
                blog.setContent(resultSet.getString("content"));
                blog.setUserId(resultSet.getShort("userId"));
                blog.setPostTime(resultSet.getTimestamp("postTime"));
                return blog;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(connection,statement,resultSet);
        }
        return null;
    }

    public void delete(int blogId){
        Connection connection = null;
        PreparedStatement statement = null;
        try{
            connection = DBUtil.getConnection();
            String sql = "delete from blog where blogId = ?";
            statement = connection.prepareStatement(sql);
            statement.setInt(1, blogId);
            statement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtil.close(connection,statement,null);
        }
    }
}

UserDao

通过jdbc中的查询和增加方法,实现通过用户名查询用户和根据用户id查询用户

package model;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UserDao {
    public User selectByName(String username){
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        try {
            connection = DBUtil.getConnection();
            String sql = "select * from user where username = ?";
            statement = connection.prepareStatement(sql);
            statement.setString(1,username);
            resultSet = statement.executeQuery();

            if(resultSet.next()){
                User user = new User();
                user.setUserId(resultSet.getInt("userId"));
                user.setUsername(resultSet.getString("username"));
                user.setPassword(resultSet.getString("password"));
                return user;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(connection,statement,resultSet);
        }
        return null;
    }

    public User selectById(int userId){
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        try {
            connection = DBUtil.getConnection();
            String sql = "select * from user where userId = ?";
            statement = connection.prepareStatement(sql);
            statement.setInt(1, userId);
            resultSet = statement.executeQuery();

            if(resultSet.next()){
                User user = new User();
                user.setUserId(resultSet.getInt("userId"));
                user.setUsername(resultSet.getString("username"));
                user.setPassword(resultSet.getString("password"));
                return user;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(connection,statement,resultSet);
        }
        return null;
    }
}

BlogServlet

实现get方法,以json的数据格式返回数据,如果参数中没有blogid,则返回所有博客的信息,如果有blogid则返回对应的一篇博客

实现post方法,先通过session中数据判断是否登陆,若未登陆则强制要求登陆,再判断前端传输过来的的博客是否有题目和内容,若没有则返回,若符合规范,则调用BlogDao中的插入方法,将新的博客插入到数据库中

package controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import model.Blog;
import model.BlogDao;
import model.User;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;

@WebServlet("/blog")
public class BlogServlet extends HttpServlet {
    private ObjectMapper objectMapper = new ObjectMapper();
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("application/json; charset=utf8");
        String param = req.getParameter("blogId");
        BlogDao blogDao = new BlogDao();
        if(param == null){
            //博客列表
            List<Blog> blogs = blogDao.selectAll();
            String respJson = objectMapper.writeValueAsString(blogs);
            resp.getWriter().write(respJson);
        } else {
            //博客详情
            int blogId = Integer.parseInt(param);
            Blog blog = blogDao.selectOne(blogId);
            String respJson = objectMapper.writeValueAsString(blog);
            resp.getWriter().write(respJson);
        }
    }

    @Override
    protected 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 title = req.getParameter("title");
        String content = req.getParameter("content");

        if(title == null || title.equals("") || content == null || content.equals("")){
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write("提交博客失败,缺少参数");
            return;
        }

        Blog blog = new Blog();
        blog.setTitle(title);
        blog.setContent(content);
        blog.setUserId(user.getUserId());
        BlogDao blogDao = new BlogDao();
        blogDao.insert(blog);

        resp.sendRedirect("blogList.html");
    }
}

BlogDeleteServlet

实现get方法,先判定用户是否登陆,再判断博客中的参数是否存在,判断博客的用户id和用户的id是否一致(判断是否操作者为文章作者),全部确定为真时,调用BlogDao中的blogDelete方法,实现博客的删除功能

package controller;

import model.Blog;
import model.BlogDao;
import model.User;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/blogDelete")
public class BlogDeleteServlet extends HttpServlet {
    @Override
    protected 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");
        if(blogId == null || blogId.equals("")){
            resp.setContentType("text/html; charset=utf8");
            resp.getWriter().write("当前blogId参数错误!!");
            return;
        }

        BlogDao blogDao = new BlogDao();
        Blog blog = blogDao.selectOne(Integer.parseInt(blogId));
        if(blog == null){
            resp.setContentType("text/html; charset=utf8");
            resp.getWriter().write("当前要删除的博客不存在!!");
            return;
        }

        if(user.getUserId() != blog.getUserId()){
            resp.setContentType("text/html; charset=utf8");
            resp.getWriter().write("当前登陆用户无访问权限!!");
            return;
        }

        blogDao.delete(Integer.parseInt(blogId));
        resp.sendRedirect("blogList.html");
    }
}

AuthorServlet

实现get方法,判断是否传输了blogid,判断blogid在数据库中是否存在,然后通过这个blogid,调用blogDao中的select方法,拿到blog对象,将密码设置为空(保护用户隐私),然后将用户信息以json格式传输给后端

package controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import model.Blog;
import model.BlogDao;
import model.User;
import model.UserDao;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/authorInfo")
public class AuthorServlet extends HttpServlet {
    private ObjectMapper objectMapper = new ObjectMapper();
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("application/json; charset=utf8");
        String param = req.getParameter("blogId");
        if(param == null || param.equals("")){
            resp.getWriter().write("{\"ok\": false, \"reason \": \"参数缺失!\"}");
            return;
        }

        BlogDao blogDao = new BlogDao();
        Blog blog = blogDao.selectOne(Integer.parseInt(param));
        if(blog == null){
            resp.getWriter().write("{\"ok\": false, \"reason \": \"查询的博客不存在!\"}");
            return;
        }

        UserDao userDao = new UserDao();
        User author = userDao.selectById(blog.getUserId());
        if(author == null){
            resp.getWriter().write("{\"ok\": false, \"reason \": \"查询的用户不存在!\"}");
            return;
        }

        author.setPassword("");
        resp.getWriter().write(objectMapper.writeValueAsString(author));
    }
}

LoginServlet

实现post方法,获取前端传输的用户名和密码,判断是否符合规范,用UserDao中的select方法查询用户是否存在,如果存在则用user对象构造session,最后重定向到blogList.html

实现get方法,获取sessoin,将其转换为user对象,然后将其以json数据格式传输给前端

package controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import model.User;
import model.UserDao;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    private ObjectMapper objectMapper = new ObjectMapper();
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf8");
        resp.setCharacterEncoding("utf8");
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        if(username == null || username.equals("") || password == null || password.equals("")) {
            resp.setContentType("text/html; charset=utf8");
            resp.getWriter().write("输入用户名/密码为空!!!");
            return;
        }
        UserDao userDao = new UserDao();
        User user = userDao.selectByName(username);
        if(user == null || !user.getPassword().equals(password)){
            resp.setContentType("text/html; charset=utf8");
            resp.getWriter().write("用户名不存在/密码错误!!!");
            return;
        }

        HttpSession session = req.getSession(true);
        session.setAttribute("user",user);

        resp.sendRedirect("blogList.html");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("application/json;charset=utf8");
        HttpSession session = req.getSession(false);
        if(session == null){
            User user = new User();
            resp.getWriter().write(objectMapper.writeValueAsString(user));
            return;
        }
        User user = (User) session.getAttribute("user");
        if(user == null){
            user = new User();
            resp.getWriter().write(objectMapper.writeValueAsString(user));
            return;
        }
        user.setPassword("");
        resp.getWriter().write(objectMapper.writeValueAsString(user));
    }
}

LogoutServlet

实现get方法,拿到session,通过是否为空判断用户是否登陆,如果登陆了,则移除该session,然后重定向到login.html

package controller;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/logout")
public class LogoutServlet  extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession(false);
        if(session == null){
            resp.getWriter().write("当前用户尚未登录,无法注销!");
            return;
        }
        session.removeAttribute("user");
        resp.sendRedirect("login.html");
    }
}

前端代码

在之前的博客中有前端的代码,改动的地方如下

common.js

实现changeUserName的方法,获取页面左侧的用户名对应的h3标签,将其内容设置为当前登陆的用户的用户名

实现getUserInfo方法,参数是页名,类型是get方法,url是login,对应LoginServlet中的get方法。其功能是判断用户是否曾路,如果登陆了,就调用changeUserName方法,传输用户的名字

function getUserInfo(pageName){
    $.ajax({
        type: 'GET',
        url: 'login',
        success: function(body) {
            if(body.userId && body.userId > 0){
                console.log("登录成功! 用户名:" + body.username);
                if(pageName == 'blogList.html'){
                    changeUserName(body.username);
                }
            } else {
                alert("当前未登陆!!!");
                location.assign('login.html');
            }
        },
        error: function(){
            alert("当前未登陆!!!");
            location.assign('login.html');
        }
    });
}

function changeUserName(username){
    let h3 = document.querySelector('.card>h3');
    h3.innerHTML = username;
}

login.html

用户名,密码,提交按钮用form表单包裹,action是login,对应LoginServlet,method则是post方法,将用户名,密码增加id属性,并且将提交改成submit

<form action="login" method="POST">
    <div class="row">
        <span>用户名</span>
        <input type="text" id = 'username' name = 'username'>
    </div>
    <div class="row">
        <span>密码</span>
        <input type="password" id = 'password' name = 'password'>
    </div>
    <div class="row submitRow">
        <!-- <button id = 'submit'>提 交</button> -->
        <input type="submit" id = "submit" value = "提交">
    </div>
</form>

blogList.html

<script>
        function getBlogList(){
            $.ajax({
                type: 'get',
                url: 'blog',
                success: function(body) {
                    let rightDiv = document.querySelector('.right');
                    rightDiv.innerHTML = "";
                    for(let blog of body){
                        //blog
                        let blogDiv = document.createElement('div');
                        blogDiv.className = 'blog';
                        //标题
                        let titleDiv = document.createElement('div');
                        titleDiv.className = 'title';
                        titleDiv.innerHTML =blog.title;
                        blogDiv.appendChild(titleDiv);
                        //发布时间
                        let dateDiv = document.createElement('div');
                        dateDiv.className = 'date';
                        dateDiv.innerHTML =blog.postTime;
                        blogDiv.appendChild(dateDiv);
                        //摘要
                        let descDiv = document.createElement('div');
                        descDiv.className = 'summary';
                        descDiv.innerHTML =blog.content;
                        blogDiv.appendChild(descDiv);
                        //查看全文
                        let a = document.createElement('a');
                        a.className = 'detail'
                        a.innerHTML = '查看全文 &gt;&gt;';
                        a.href = 'blogDetail.html?blogId=' + blog.blogId;
                        blogDiv.appendChild(a);

                        rightDiv.appendChild(blogDiv);
                    }
                },
                error: function(){
                    alert("获取博客失败!!!");
                }
            });
        }

        getBlogList();
    </script>
    <script src="js/common.js"></script>

    <script>
        getUserInfo('blogList.html');
    </script>

blogEdit.html

将script中加入saveHTMLToTextarea: true的属性,将html中的标题,发布按钮和内容改成下面对应的格式,外面使用form表单包裹,action是blog,方法是post,对应BlogServlet中的post方法,实现博客编辑后提交给服务器,服务器传输给数据库的功能

<form action="blog" method="POST" style="height:100%">
    <div class="title">
        <input type="text" placeholder = "在此输入标题" id = 'title' name = "title">
        <input type="submit" value="发布文章" id="submit">
    </div>

    <div id="editor">
        <textarea name="content" style="display:none;"></textarea>
    </div>
</form>
<script>
    var editor = editormd("editor", {
        width:"100%",
        height:"calc(100% - 80px)",
        markdown:"# 在这里写下一篇博客",
        path:"editor.md/lib/",
        saveHTMLToTextarea: true
    });
</script>

blogDetail.html

用ajax实现getBlogDetail方法,类型为get,url为blog+location.search,对应后端的BlogServlet中的get方法,实现通过blogid获取blog对象功能,成功时将后端传输过来的blog对象中的题目,时间,内容等添加到dom树上

用ajax实现getAuthorInfo的方法,类型为get,url为authorInfo+location.search,对应AuthorServlet中的get方法,从前端获得登陆的用户信息,如果登陆的用户和文章的用户名相同,代表这个人可以删除自己的文章,在dom树上加删除的a标签,a标签中是blogDelete + location.search,对应后端的BlogDeleteServlet,实现将文章id传输给后端,后端让数据库删除该文章的操作

用ajax实现getUserInfo功能,大体功能和common.js中的getUserInfo功能大体相同,只是在其中调用getAuthorInfo方法

<script>
        function getBlogDetail(){
            $.ajax({
                type: 'get',
                url: 'blog' + location.search,
                success: function(body){
                    let h3 = document.querySelector(".blogContainer>h3");
                    h3.innerHTML = body.title;
                    let dateDiv = document.querySelector('.date');
                    dateDiv.innerHTML = body.postTime;
                    editormd.markdownToHTML('content', {
                        markdown: body.content
                    });
                }
            });
        }
        getBlogDetail();

        function getUserInfo(pageName){
            $.ajax({
                type: 'GET',
                url: 'login',
                success: function(body) {
                    if(body.userId && body.userId > 0){
                        console.log("登录成功! 用户名:" + body.username);
                        getAuthorInfo(body);
                    } else {
                        alert("当前未登陆!!!");
                        location.assign('login.html');
                    }
                },
                error: function(){
                    alert("当前未登陆!!!");
                    location.assign('login.html');
                }
            });
        }

        getUserInfo('blogDetail.html');

        function getAuthorInfo(user){
            $.ajax({
                type: 'GET',
                url: 'authorInfo' + location.search,
                success: function(body){
                    if(body.username){
                        changeUserName(body.username);

                        if(body.username == user.username){
                            let navDiv = document.querySelector('.nav');
                            let a = document.createElement('a');
                            a.innerHTML = '删除';
                            a.href = 'blogDelete' + location.search;
                            navDiv.appendChild(a);
                        }
                    } else {
                        console.log("获取作者信息失败!!!" + body.reason);
                    }
                }
            });
        }

        function changeUserName(username){
            let h3 = document.querySelector('.card>h3');
            h3.innerHTML = username;
        }
    </script>

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

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

相关文章

进阶的风控策略篇:如果筛选最佳策略帮我们锁定优质客群

在番茄风控往期的内容中&#xff0c;我们一直在跟大家介绍风控策略干货内容&#xff0c;相关内容包括&#xff1a; ①风控的拒绝捞回策略 ②多规则的策略筛选 ③策略的调优 ④策略的开发与应用 … 策略相关的内容可谓干货满满&#xff0c;比如关于策略开发与应用的内容上&#…

SpringBoot SpringBoot 原理篇 1 自动配置 1.15 自动配置原理【1】

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇1 自动配置1.15 自动配置原理【1】1.15.1 看源码了1.15.2 Import({AutoConfig…

初识图学习

初识图学习 一、简单图的基础 什么是图 七桥问题的定义是&#xff1a;一个步行者怎样才能不重复&#xff0c;不遗漏的一次走完七座桥。最后回到出发点。 当年&#xff0c;大数学家在解答七桥问题的同时&#xff0c;也开创了数学的一个新分支图论。 可以毫不夸张的说&#xff…

半小时制作简单版澳大利亚导游地图,太简单了,你也可以

目录 1 前言 2 QQ扫码注册一个账号 3 编辑景区 3.1 新建一个景区 3.2 增加景点 4 预览 5 申请管理员审核 6 看一下发布后的效果 1 前言 不少景区为了提升游客旅游体验&#xff0c;需要制作自己的导游地图&#xff0c;游客扫一下二维码就可以看到景区全貌和景点介绍。制作这…

销售词汇Sell In、Sell Through、Sell Out辨析

原文出处&#xff1a;https://zhuanlan.zhihu.com/p/89563704 销售的过程其实是一个货物和资金双向流动的过程&#xff0c;货物从厂家流向消费者&#xff0c;资金从消费者流向厂家。 但是大多数情况下&#xff0c;厂家是没办法直接把货物卖给消费者的&#xff0c;或者说厂家是没…

虚拟机安装openEuler/MobaXterm工具登录系统

✨✨个人主页:沫洺的主页 &#x1f4da;&#x1f4da;系列专栏: &#x1f4d6; JavaWeb专栏&#x1f4d6; JavaSE专栏 &#x1f4d6; Java基础专栏&#x1f4d6;vue3专栏 &#x1f4d6;MyBatis专栏&#x1f4d6;Spring专栏&#x1f4d6;SpringMVC专栏&#x1f4d6;SpringBoot专…

一个用C#开发的操作系统的开源项目

自从C#的AOT编译机制发布以来&#xff0c;有趣的项目越来越多&#xff0c;今天给大家推荐一个开源项目&#xff0c;用C#开发的64位操作系统。 文章目录项目简介项目源码开发环境虚拟机与裸机硬件支持功能列表完善的编译、安装文档操作系统界面项目地址项目简介 这是一个使用.N…

SpringBoot SpringBoot 原理篇 2 自定义starter 2.2 IP计数业务功能开发【自定义starter】

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇2 自定义starter2.2 IP计数业务功能开发【自定义starter】2.2.1 大概看看别人…

阿里云服务器安装mysql8

1. 安装前准备 查看是否安装&#xff1a; rpm -qa | grep mysql移除不想要的版本&#xff1a; yum remove 名称查找关于mysql的所有文件&#xff08;配置文件&#xff09; find / -name mysql ##或者 whereis mysql删除配置文件 rm -rf 文件最后需要注意的是&#xff1a;卸载后…

配置iSCSI实现Linux的远程块存储

文章目录一 名词解释二 需求三 环境准备四 搭建流程1 服务端准备硬盘并分区2 服务端安装软件包&#xff0c;并启动服务3 服务端 5个create 操作3-1 定义块设备&#xff0c;创建后备存储。3-2 为目标创建IQN3-3 创建一个ACL来控制特定的客户端访问3-4 为每个后备存储创建一个LUN…

基于C#的校园闲置物品共享系统的开发和实现(Asp.net+Web)

目 录 摘 要 I Abstract II 第1章 绪论 1 1.1选题背景 1 1.1.1校园闲置物品共享系统的开发背景 1 1.1.2学生闲置物品交易活动的现状 1 1.2 校园闲置物品共享系统的研究方向和内容 1 1.2.1研究方向 1 1.2.2研究内容 2 1.3 校园闲置物品共享系统的设计目标 2 1.4 校园闲置物品共…

Visual Studio Code(vs code) 安装c# .net环境 solution

Visual Studio Code(vs code) 安装c# .net环境 solution 一、安装.net必要环境 1.安装环境 https://dotnet.microsoft.com/zh-cn/download 我这里选择的是 .net 6.0 ;版本 .net SDK x86 2.在vs code拓展 搜索.net 全名&#xff1a;.NET Core Extension Pack 作者&#xf…

操作系统的发展与分类

文章目录世界上第一台通用电子计算机操作系统的发展阶段1. 手工操作阶段&#xff08;无操作系统的计算机系统&#xff09;2. 批处理阶段&#xff1a;同时处理多道程序3. 分时操作系统&#xff08;Time Sharing System&#xff09;4. 实时操作系统&#xff08;Real Time System&…

毫米波传感器原理介绍:测距

因为本篇是第一篇关于毫米波雷达传感器设备的介绍&#xff0c;我便多啰嗦两句。近几年随着无人驾驶等领域在国内的火热&#xff0c;做支撑实现无人驾驶的智能设备也多了起了&#xff0c;首当其冲的便是无人驾驶的眼睛“摄像头”&#xff0c;同样作为一种辅助手段的雷达技术也被…

HTMLDOM中的API之btoa和atob

btoa() btoa() 方法可以将一个二进制字符串&#xff08;例如&#xff0c;将字符串中的每一个字节都视为一个二进制数据字节&#xff09;编码为 Base64 编码的 ASCII 字符串。 示例&#xff1a; let encodedData window.btoa("Hello, world"); // 编码 let decode…

【C++笔试强训计划】第一天

遇事不决&#xff0c;可问春风&#xff0c;春风不语&#xff0c;即随本心 欢迎来到我的笔试强训计划专栏&#xff0c;这是计划正式开始的第一天。另外&#xff0c;我想说的是&#xff1a;博主本身水平有限&#xff0c;本专栏只作为学习笔记分享记录使用&#xff0c;对于一些题目…

Linux中如何获得进程的运行时堆栈

关于这个话题&#xff0c;我们一般是为了处理一下生产环境中程序出现死循环或者死锁等问题。我们一般想到的方法就是gdb attach上一个运行中的进程。但是这个需要手动交互。通过网上查找和实践&#xff0c;可以有以下几种选择&#xff1a; 第一种&#xff1a;pstack 进程ID …

【电商】管理后台--采购管理(执行层)

采购&#xff0c;从表面上看是公司花钱的部门&#xff0c;实则担负了寻找、管理供应商的重任&#xff0c;确保公司绝大部分的供应链成本可以保质、保量的完成。 现在很多电商企业&#xff0c;都不自己生产产品&#xff0c;产品的来源基本上都是从供应商那里采购&#xff0c;所以…

【服务器搭建】教程四:域名怎样进行备案?快来看~

前言 购买一台服务器&#xff0c;再来个域名&#xff0c;搭建一个自己的个人博客网站&#xff0c;把一些教程、源码、想要分享的好玩的放到网站上&#xff0c;供小伙伴学习玩耍使用。我把这个过程记录下来&#xff0c;想要尝试的小伙伴&#xff0c;可以按照步骤&#xff0c;自己…

你好,法语!A2知识点总结(1)

1.语式及时态 语式&#xff1a; 1.1直陈式&#xff1a; -直陈式现在时 1&#xff09;动词变位&#xff1a; 以er结尾的动词为第一组动词 变位规则&#xff1a; 去er&#xff0c;得到词根&#xff0c;加上相应词尾 e es e ons ez ent 第二组动词变位 以ir结尾为第二组动词…