【JavaEE】前后端综合项目-博客系统(上)

news2024/11/17 13:41:41

【JavaEE】前后端综合项目-博客系统(上)

在这里插入图片描述

文章目录

  • 【JavaEE】前后端综合项目-博客系统(上)
    • 1. 创建项目
    • 2. 数据库设计
    • 3. 数据库操作的封装
      • 3.1 DataSource(单例)
      • 3.1 连接操作
      • 3.2 关闭操作
      • 3.3 创建实体类
      • 3.4 封装一些必要的增删改查操作
        • 3.4.1 插入一篇博客
        • 3.4.2 查询博客
        • 3.4.3 删除博客
        • 3.4.4 查找用户
    • 4. 前后端交互逻辑
      • 4.1 博客列表页
        • 3.1.1 约定前后端交互接口
        • 3.1.2 后端代码
        • 3.1.3 前端代码
      • 4.2 博客详情页
        • 4.2.1 约定前后端交互接口
        • 4.2.2 后端代码
        • 4.2.3 前端代码
        • 4.2.4 渲染markdown

【JavaEE】前后端综合项目-博客系统(上)

前端综合项目-个人博客网页设计_s:103的博客-CSDN博客

  • 在之前的前端综合项目里,我们已经有了博客系统的前端部分
  • 接下来我们将以所学的后端知识去搞定前端后端交互!
  • 实现一个真正的网站!

1. 创建项目

在src的main里创建目录结构:webapp/WEB-INF/web.xml

<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Archetype Created Web Application</display-name>
</web-app>

Servlet依赖:

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>

需要用到的jackson依赖:

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.3</version>
</dependency>

MySQL依赖:

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.49</version>
</dependency>

打war包语句:

<packaging>war</packaging>
<build>
    <finalName>showLove</finalName>
</build>

将前端部分的资源移动到webapp目录下:

2. 数据库设计

这个步骤很关键,因为这也对应着前后端信息交互的内容

设计表结构,有几个表,每个表里有啥?

最直观的就是:
在这里插入图片描述

博客信息:

  1. 博客标题
  2. 发布时间
  3. 博客内容(摘要来自内容)

在这里插入图片描述

用户信息:

  1. 用户名
  2. 用户密码
  3. 头像

所以就可以得到两种表(两个实体:博客 与 用户):

  • Blog表:

    1. 博客ID
    2. 作者ID
    3. 博客标题
    4. 正文
    5. 发布时间
  • User表:

    1. 作者ID
    2. 用户名
    3. 密码
    4. 头像
    5. 码云链接

一个用户对应多个博客(一对多),通过作者ID进行关联

不管怎么样,先这样,以后要改进,再说~

  1. 创建数据库
  2. 创建两个表

我们可以在IDEA中创建,.sql文件,去书写sql代码,方便我们的数据库操作

– 是注释哦~

这个文件也只是为了部署到别的机器上时用到的一些固定sql语句,所以要清空之前的数据(drop…if exists…)

在这里插入图片描述

复制到数据库即可~
在这里插入图片描述

  • mysql不区分大小写,所以数据库名,表名变成小写也很正常~
insert into user values(null, '小马', '123456', '病人.png', 'https://gitee.com/carefree-state');

由于暂时没有注册功能,所以用户还不能直接在网站创建~

3. 数据库操作的封装

对于繁琐的数据库操作,我们通常会封装起来,方便后续的数据操作

在这里插入图片描述

经典的web项目结构:MVC

M => Model(与数据相关部分)

V => View(与界面相关部分)

C => Controller(联系界面和数据之间的业务逻辑)

数据库操作

  1. 连接
  2. 写入
  3. 读取
  4. 关闭

其中,对于DataSource,其实只需要一个,这也就是我们提到过的单例模式~

3.1 DataSource(单例)

博客链接:(31条消息) 【JavaEE】线程案例-单例模式 and 阻塞队列_s:103的博客-CSDN博客

//懒汉模式写法
public class DBUtil {
    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("jdbc:mysql://127.0.0.1:3306/blogsystem?characterEncoding=utf8&useSSl=false");
                    ((MysqlDataSource)dataSource).setUser("root");
                    ((MysqlDataSource)dataSource).setPassword("mmsszsd666");//微信号哦,欢迎添加一起学习!
                }
            }
        }
        return dataSource;
    }
}

3.1 连接操作

在这里插入图片描述

  • 千万别选错了,这也会导致我们的代码错误!
public static Connection getConnection() throws SQLException {
    return getDataSource().getConnection();
}

3.2 关闭操作

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

3.3 创建实体类

首先,先创建两个实体的实体类:Blog与User

  • 这两个类的对象就相当于数据库的一条记录,并且这个类也可以用做作son的构造

在这里插入图片描述

public class Blog {
    private int blogId;
    private String title;
    private String content;
    private int userId;
    private Timestamp postTime;//时间戳!
}
public class User {
    int userId;
    String username;
    String password;
    String image;
    String git;
}
  • 要生成getter和setter方法哦~

3.4 封装一些必要的增删改查操作

在这里插入图片描述

DAO ==> Data Access Object,数据访问对象,也就是说这个对象用于数据访问~

  • 目前没有注册操作,所以UserDao类暂且只涉及User部分属性的查找操作~

在这里插入图片描述

对于用户名,可以修改:

  • sql文件的好处就体现出来了

在这里插入图片描述

3.4.1 插入一篇博客

//插入一条Blog数据
public void insert(Blog blog) {
    Connection connection = null;
    PreparedStatement statement = null;
    try {
        connection = DBUtil.getConnection();
        String sql = "insert into blog values(null, ?, ?, ?, ?)";
        statement = connection.prepareStatement(sql);
        statement.setString(1, blog.getTitle());
        statement.setString(2, blog.getContent());
        statement.setInt(3, blog.getUserId());
        //写入数据库,可以用字符串也可以用时间戳
        statement.setTimestamp(4, blog.getPostTime());
        statement.executeUpdate();
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        DBUtil.close(connection, statement, null);
    }
}

3.4.2 查询博客

//查询blog表中的所有数据
public List<Blog> selectAll() {
    Connection connection = null;
    PreparedStatement statement = null;
    ResultSet set = null;
    List<Blog> blogs = new ArrayList<>();
    try {
        connection = DBUtil.getConnection();
        String sql = "select * from blog";
        statement = connection.prepareStatement(sql);
        set = statement.executeQuery();
        while(set.next()) {
            Blog blog = new Blog();
            blog.setBlogId(set.getInt("blogId"));
            blog.setContent(set.getString("title"));
            blog.setUserId(set.getInt("userId"));
            blog.setPostTime(set.getTimestamp("postTime"));
            blogs.add(blog);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        DBUtil.close(connection, statement, set);
    }
    return blogs;
}

//指定博客id查询博客
public Blog selectOne(int blogId) {
    Connection connection = null;
    PreparedStatement statement = null;
    ResultSet set = null;
    Blog blog = new Blog();
    try {
        connection = DBUtil.getConnection();
        String sql = "select * from blog where blogId = ?";
        statement = connection.prepareStatement(sql);
        statement.setInt(1, blogId);
        set = statement.executeQuery();
        if(set.next()) {
            blog.setBlogId(set.getInt("blogId"));
            blog.setContent(set.getString("content"));
            blog.setTitle(set.getString("title"));
            blog.setPostTime(set.getTimestamp("postTime"));
        }else {
            blog = null;
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        DBUtil.close(connection, statement, set);
    }
    return blog;
}

3.4.3 删除博客

//指定博客id删除博客
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);
    }
}

3.4.4 查找用户

//通过Id查找
public User selectUserById(int userId) {
    Connection connection = null;
    PreparedStatement statement = null;
    ResultSet set = null;
    User user = new User();
    try {
        connection = DBUtil.getConnection();
        String sql = "select * from user where userId = ?";
        statement = connection.prepareStatement(sql);
        statement.setInt(1, userId);
        set = statement.executeQuery();
        if(set.next()) {
            user.setUserId(set.getInt("userId"));
            user.setPassword(set.getString("password"));
            user.setUsername(set.getString("username"));
            user.setGit(set.getString("git"));
            user.setImage(set.getString("image"));
        }else {
            user = null;
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        DBUtil.close(connection, statement, set);
    }
    return user;
}
//通过用户名查找
//用户名是唯一的,但是昵称不唯一,对于昵称,暂时不加入
public User selectUserByName(String username) {
    Connection connection = null;
    PreparedStatement statement = null;
    ResultSet set = null;
    User user = new User();
    try {
        connection = DBUtil.getConnection();
        String sql = "select * from user where username = ?";
        statement = connection.prepareStatement(sql);
        statement.setString(1, username);
        set = statement.executeQuery();
        if(set.next()) {
            user.setUserId(set.getInt("userId"));
            user.setPassword(set.getString("password"));
            user.setUsername(set.getString("username"));
            user.setGit(set.getString("git"));
            user.setImage(set.getString("image"));
        }else {
            user = null;
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        DBUtil.close(connection, statement, set);
    }
    return user;
}

4. 前后端交互逻辑

4.1 博客列表页

在这里插入图片描述

  • 要求:把所有博客查询出来排列
  1. 约定前后端交互接口
  2. 写后端代码
  3. 写前端代码

3.1.1 约定前后端交互接口

请求:GET请求

向谁请求:/blog

响应:json格式

  • 注意要与我们的类的属性名一一对应!
[
    {
        blogId:xxx,
        title:xxx,
        content:xxx,
        userId:xxx,
        postTime:xxx
    },
    {
        ...
    },
    {
        ...
    }
]

3.1.2 后端代码

在这里插入图片描述

@WebServlet("/blog")
public class BlogServlet extends HttpServlet {
    
    
}
@WebServlet("/blog")
public class BlogServlet extends HttpServlet {

    ObjectMapper objectMapper = new ObjectMapper();
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        BlogDao blogDao = new BlogDao();
        List<Blog> blogList = blogDao.selectAll();
        String respString = objectMapper.writeValueAsString(blogList;
        resp.setContentType("application/json; charset=utf8");
        resp.getWriter().write(respString);
    }
}

3.1.3 前端代码

  • 构造ajax请求,按照上述约定,发送请求
    在这里插入图片描述

  • 一篇博客我们原本是写死的,所以删掉,留下一个作为参照:

在这里插入图片描述

  • 根据这个参照,去书写前端代码

在这里插入图片描述

  • 跳转连接,用到了query string的技巧,区分不同的博客

在这里插入图片描述

  • 目前数据库无数据
    • 我们可以自己手动在数据库内添加
insert into blog values(null, "我的第一篇博客", "博客正文", 1, "2023-07-07 12:00:00");
insert into blog values(null, "我的第二篇博客", "博客正文", 1, "2023-07-07 13:00:00");
insert into blog values(null, "我的第三篇博客", "博客正文", 1, "2023-07-07 14:00:00");
insert into blog values(null, "我的第四篇博客", "博客正文", 1, "2023-07-07 15:00:00");
  • 刷新页面

在这里插入图片描述

  • 接下来就是我们要处理的问题了
  1. 按照实际情况,最新发布的应该放在最前面~
    • 这个只需要在查询的时候,按照时间逆序就行了

在这里插入图片描述

在这里插入图片描述

  1. 时间应该是格式化时间而不是时间戳~

此处我们用jackson去获得的json字符串,我们要求类的属性是public,而这里是private,原因是其是用了getter和setter

  • 所以我们只需要让getter去获取时间的时候,获取到的是格式化时间即可
  • 在之前的学习我们知道
    1. jdbc填入数据库date数据的时候,可以是字符串也可以说时间戳
    2. 但是jdbc读取出来date数据的时候,只有时间戳

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

你可能发现了,与之前不一样的是,我对博客列表显示的优化:

在这里插入图片描述

在这里插入图片描述

  1. 博客列表应该显示的是摘要,而不是正文
    • 规定:摘要为正文的前100个字~

由于selectAll只在列表页用到,所以无需返回给前端全部的正文~

  • 所以可以这样:

在这里插入图片描述

  • 现在我们更改博客正文到一定大小:
update blog set content = '我嘛就不用多说了,大大的眼睛,长长的头发,白皙的皮肤,超真宗的万人迷咳咳,好吧,我就不自夸了。总之我最大的一个特点就是活泼,文静。在大厅广众面前,我是一个活跃分子,但在自己的自由王国里,我又安静的可以坐上几个钟头。大年十三夜,全家人尽情欢乐一天,便睡了,我就一个人独自躺在床上。在这宁静的晚上,我可以静静的思考过去一年自己走过的路,回忆那些可以称得上留下一段美好回忆的时光,展望新一年自己即将踏上的征途。在周末或星期天,我总爱一个人坐在书房里静静地看书,让自己沉浸在书的海洋里。但看完书后我又开始自娱自乐了。这样的我是不是很可爱呢?可爱中又带一点小俏皮,你们是不是很想和我做朋友呢?是的话就让我们一起来说友谊万岁吧!!' where userId = 1;

效果:

在这里插入图片描述

4.2 博客详情页

4.2.1 约定前后端交互接口

与列表页不同的是,这里需要完整的一篇正文,不需要所有的

请求:GET

向谁请求:/blog

  • 这不是冲突了吗?
    • 并没有,我们可以GET请求的地址,来区分,因为详情页的地址,是包含query string的所以有query string代表是详情页,没有则代表是列表页~
    • query string包含的数据就是blogId,对应特别的博客

响应:json格式

{
    ...
}

4.2.2 后端代码

在这里插入图片描述

4.2.3 前端代码

参考:

  • 记得导入jquery

在这里插入图片描述

function getBlog() {
    jQuery.ajax({
        type: "GET",
        url: "blog" + location.search,
        sucecss: function (body) {
            var aTitle = jQuery("<h3></h3>");
            aTitle.text(blog.title);
            var aDate = jQuery("<div></div>");
            aDate.attr("class", "date");
            aDate.text(blog.postTime);
            var aContent = jQuery("<div></div>");
            aContent.attr("class", "content");
            var aP = jQuery("<p></p>");
            aP.text(blog.content);
            aContent.append(aP);
            aTitle.append(jQuery(".article"));
            aDate.append(jQuery(".article"));
            aContent.append(jQuery(".article"));
        },
    });
}
getBlog();
  • 注意,页面的query string是html?blogId=xxx,而后端要获得的query string要的是blog?blogId=xxx,所以发送请求的时候要把信息“带上”(location.search)

在这里插入图片描述

问题接踵而至,一篇博客应该是格式丰富的,而不是纯文字~

  • 而我们经常用markdown渲染后的样式!

4.2.4 渲染markdown

  • 我们直接借助editor.md这个库即可~

editormd.markdownToHTML

  • 去博客编辑页拿对应的markdown依赖
<link rel="stylesheet" href="editor.md/css/editormd.min.css" />
<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>
  1. 生成html的元素id
  2. 一个对象{markdown: body.content}
function getBlog() {
    jQuery.ajax({
        type: "GET",
        url: "blog" + location.search,
        success: function (body) {
            jQuery(".article h3").text(body.title);
            jQuery(".article .date").text(body.postTime);
            editormd.markdownToHTML("pc", { markdown: body.content });
        },
    });
}
getBlog();

在这里插入图片描述

接下来我在数据库中插入一段markdown代码为正文的博客:

insert into blog values(null, "博客系统", "# 【JavaEE】前后端综合项目-博客系统

 [前端综合项目-个人博客网页设计_s:103的博客-CSDN博客](https://blog.csdn.net/Carefree_State/article/details/130744723?spm=1001.2014.3001.5501)

*   在之前的前端综合项目里,我们已经有了博客系统的前端部分
*   接下来我们将以所学的后端知识去搞定前端后端交互!
*   实现一个真正的网站!

", 1, "2023-07-07 20:00:00");

在这里插入图片描述

  • 对于手动输入数据库,还是很难使其正确显示的

为了防止文章过长,博客登录页和编辑页以及其他留到下一篇文章~


文章到此结束!谢谢观看
可以叫我 小马,我可能写的不好或者有错误,但是一起加油鸭🦆

这是本文代码位置!

BlogSystem · 游离态/马拉圈2023年7月 - 码云 - 开源中国 (gitee.com)


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

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

相关文章

“AI无界·智链全球”!壹沓科技2023世界人工智能大会论坛成功举办,构建数智供应链新范式

“AI无界智链全球”论坛成功举办 构建数智供应链新范式 7月6日&#xff0c;由世界人工智能大会组委会办公室指导&#xff0c;壹沓科技主办&#xff0c;上海交通大学安泰经济与管理学院、上海现代服务业联合会物流与供应链专委会、中国航务周刊协办的“AI无界智链全球”高端论坛…

前端vue入门(纯代码)23_多组件共享

我不喜欢去银行&#xff0c;就好像太监不喜欢去妓院一样&#xff0c;有些东西你没有&#xff0c;去了也是难受。 【24.Vuex中的多组件状态共享】 页面展示&#xff1a; vuex数据共享完整代码&#xff1a; App.vue和main.js&#xff1a;就不展示了。 store/index.js //该文…

Verilog学习笔记1:D触发器

代码1&#xff1a; timescale 1ns/10psmodule d_trigger(d,clk,q);input d; input clk; output q;assign q~d;endmodule//testbench module d_trigger_tb; reg clk; reg d; wire q;d_trigger d_trigger(.d(d),.clk(clk),.q(q));initial begind<0;clk<0;#1000 $stop;end…

异步电路后端实现流程(cdc signOff 后端做什么)

目录 1.一种后端异步电路的signOff流程 2.cdc maxDelay的原因及relax 2.1为什么要做maxDelay检查 2.2 如果有不同名字的clk 原本是同步时钟域 该怎么办 2.3 如果有异步电路不能满足0.7倍的fastclk maxDelay检查该怎么办&#xff1f; 1.一种后端异步电路的signOff流程 同步…

Openpyxl给同个单元格的不同文字“上色”

文章目录 0.背景1. 原文代码2. 我的代码3. 总结 0.背景 openpyxl一直在用&#xff0c;今天看到一直关注的公众号又发出了奇技淫巧&#xff08;想要看原文或者要关注原作者的可以点击这里&#xff09;&#xff0c;就直接收录到主页好了。免得以后找不到了。 1. 原文代码 原来…

全网最详细,Fiddler抓包实战 - 手机APP端https请求(超详细)

前言 Fiddler抓取App端请求 准备工作&#xff1a; 将手机和电脑连接到同一路由器&#xff08;保证两者能够ping通&#xff09;&#xff1b; 如果使用的模拟器则不需要上面的步骤&#xff0c;因为模拟器是共享PC端的网络&#xff0c;两者网络默认就是连通的状态&#xff1b; 查…

【聘】夏日炎炎,高薪IT好岗位给你降温!

微思就业推荐 厦门海翼集团财务有限公司 职位&#xff1a;数字化管理部运维管理岗 6000-12000元/月*18薪 职位描述 负责公司日常办公IT设备、网络及机房服务器、业务系统的管理。 1、负责公司机房、服务器、网络设备规划、建设、管理、巡检&#xff1b;负责建立包括但不…

【Servlet综合项目练习】实现一个简单的博客系统~

目录 &#x1f31f;一、数据库设计部分 1、建表分析&#xff1a;系统中一共要实现几张表&#xff1f; 2、开始建表 &#x1f31f;二、大概框架与实现功能 &#x1f31f; 三、代码实现部分 &#x1f308;前言1&#xff1a;工具类的实现&#xff08;utils包下&#xff09;…

2023年开放式蓝牙耳机选购指南!南卡/韶音/Cleer/索尼/飞利浦等开放式耳机怎么选!最热的开放式蓝牙耳机大盘点!

前言 大家好&#xff0c;作为专注耳机研究多年的发烧级爱好者&#xff0c;毫不夸张的说我为耳机花的钱比买衣服还多&#xff0c;很多人都在问我开放式耳机到底有没有必要买&#xff1f;答案毫无疑问是有必要&#xff01;开放式耳机佩戴舒适又安全的特质让它在耳机届风靡&#…

动态SLAM论文(7) — DOT: Dynamic Object Tracking for Visual SLAM

目录 1 Introduction 2 Related work 3 DOT A 系统概述 B. 实例分割 C. 相机和物体跟踪 D. 跟踪质量、异常值和遮挡 E. 目标是否在运动&#xff1f; F. 掩码传播 4 Experimental results 5 Conclusions 摘要 - 本文我们介绍了DOT&#xff08;Dynamic Object Trackin…

计算机网络实验报告——Wireshark 抓包分析

1. Wireshark软件下载 这里放一个蓝奏云下载链接&#xff1a; https://wwix.lanzoue.com/iEklv11klvje 密码:4g0n 2. Wireshark软件抓包使用 将该软件安装之后&#xff0c;双击打开&#xff0c;首先选择你的过滤器方式&#xff0c;我这里电脑连的是WiFi&#xff0c;就选择了这…

分布式搜索--elasticsearch

一、初识 elasticsearch 1. 了解 ES ① elasticsearch 是一款非常强大的开源 搜索引擎&#xff0c;可以帮助我们从海量数据中 快速找到需要的内容 ② elasticsearch 结合 kibana、Logstash、 Beats&#xff0c;也就是 elastic stack (ELK)&#xff0c;被 广泛应用在日志数据分…

【CANoe示例分析】PythonCAPL_Call_Demo

该工程由Vector官方提供,目的是演示Python如何调用CAPL文件里的自定义函数。里面除了CANoe工程文件外,还有python文件和CAPL: 提供了两种CANoe版本的工程文件,选择其中一种打开即可。 首先我们要确定CAPL文件AnalyseFunctions.can在CANoe工程内的什么地方?首先想到的是Si…

Apache Doris 在金融壹账通指标中台的应用实践

本文导读&#xff1a; 金融壹账通作为中国平安集团的联营公司&#xff0c;依托平安集团 30 多年金融行业的丰富经验及自主科研能力&#xff0c;向客户提供“横向一体化、纵向全覆盖”的整合产品&#xff0c;以“技术业务”为独特竞争力&#xff0c;帮助客户提升效率、提升服务…

vuex中的四个map方法的使用

vuex中的四个map方法的使用 vuex里面有四个map方法&#xff0c;他们分别可以针对不同的元素进行不同的代码生成 这四个map方法都是异曲同工&#xff0c;明白了一个基本上都明白了 1 编写案例 现在想要展示一段文本&#xff0c;其中里面两个参数要存在store的state里面&…

怎样优雅地增删查改(二):扩展身份管理模块

文章目录 用户关系管理扩展组织管理功能创建可查询仓储 实现控制器测试接口 身份管理模块&#xff08;Identity模块&#xff09;为通用查询接口的按组织架构查询和按户关系查询提供查询依据。 身份管理模块的领域层依赖Volo.Abp.Identity.Domain Abp为我们实现了一套身份管理模…

CentOS 7镜像下载 以及 DVD ISO 和 Minimal ISO 等各版本的区别介绍

1.官网下载 官网下载地址&#xff1a;官网下载链接 点击进入下载页面&#xff0c;随便选择一个下载即可&#xff08;不推荐&#xff0c;推荐阿里云下载&#xff0c;见下文&#xff09; 阿里云下载站点&#xff08;速度非常快推荐&#xff09; 阿里云下载链接&#xff1a; http…

免费下载!10个3D素材网站推荐

在设计工作中&#xff0c;3D素材可以帮助设计师创建高质量的UI设计&#xff0c;提高设计效率和准确性。本文将为您推荐10个好用的3D素材网站&#xff0c;助力设计师实现高效创作。 1.即时设计资源广场 即时设计资源广场是一个致力于为设计师提供丰富多样的设计资产和灵感的社…

chatgpt 与传统3D建模对比分析

推荐&#xff1a;将NSDT场景编辑器加入你的3D工具链 随着人工智能技术的发展&#xff0c;越来越多的领域正逐渐被AI模型所取代。ChatGPT作为一种自然语言处理技术&#xff0c;越来越为人们所熟悉。最近&#xff0c;一些3D建模领域的专家想知道ChatGPT是否可以取代传统的手动3D建…

ClickHouse主键索引最佳实践

在本文中&#xff0c;我们将深入研究ClickHouse索引。我们将对此进行详细说明和讨论&#xff1a; ClickHouse的索引与传统的关系数据库有何不同ClickHouse是怎样构建和使用主键稀疏索引的ClickHouse索引的最佳实践 您可以选择在自己的机器上执行本文给出的所有Clickhouse SQL…