Day22:过滤敏感词、开发发布帖子、帖子详情

过滤敏感词

前缀树

- 名称:Trie、字典树、查找树
- 特点:查找效率高,消耗内存大
- 应用:字符串检索、词频统计、字符串排序等

在这里插入图片描述

敏感词过滤器的步骤

  • 根节点不包含任何字符;
  • 其余每个节点只有一个字符;
  • 连接起来一条路就是字符串,每条路的字符串都不同;

image

(怎么感觉有点像KMP算法)

  1. 在resources文件夹下创建敏感词txt:
赌博
嫖娼
吸毒
开票

定义前缀树

  1. 在utils下创建工具类SensitiveFilter,创建内部类定义前缀树的结构:
@Component
public class SensitiveFilter {
    private class TrieNode {
        private boolean isKeywordEnd = false;//是否是敏感词的结尾
        private Map<Character, TrieNode> subNodes = new HashMap<>();//key是下级字符,value是下级节点

        public void addSubNode(Character c, TrieNode node) {
            subNodes.put(c, node);
        }

        public TrieNode getSubNode(Character c) {
            return subNodes.get(c);
        }

        public boolean isKeywordEnd() {
            return isKeywordEnd;
        }

        public void setKeywordEnd(boolean keywordEnd) {
            isKeywordEnd = keywordEnd;
        }
    }
}

根据敏感词,初始化前缀树

//注解的意思是在在Spring创建Bean的实例,设置完所有属性,解析并完成所有的Bean的依赖注入之后调用
@PostConstruct
public void init() {
    try (InputStream is = this.getClass().getClassLoader().getResourceAsStream("sensitive-words.txt");
         BufferedReader reader = new BufferedReader(new InputStreamReader(is))) {
        String keyword;
        while ((keyword = reader.readLine()) != null) {
            //添加到前缀树
            this.addKeyword(keyword);
        }
    } catch (IOException e) {
        logger.error("加载敏感词文件失败:" + e.getMessage());
    }
}
  • 这里使用PostConstruct注解,方便在Spring创建依赖Bean的时候就创建好前缀树;
  • InputStream is = this.getClass().getClassLoader().getResourceAsStream(“sensitive-words.txt”),这个的意思是从classpath下读取txt文件,为什么不用相对路径?

在Web应用中,你通常不能控制当前工作目录。Web服务器可能在任何位置启动你的应用,这使得使用相对路径来访问资源文件变得不可靠。使用上面的路径也就是访问构建后classes底下的文件(如果构建后没有出现,需要maven clean之后重新构建):

image

  • addKeyword方法,将String添加到前缀树:
private void addKeyword(String keyword){
    TrieNode tempNode = rootNode;//相当于指针从root开始
    for (int i = 0; i < keyword.length(); i++) {
        char c = keyword.charAt(i);
        TrieNode subNode = tempNode.getSubNode(c);//之前可能挂过同样的字符了
        if(subNode == null){
            //初始化子节点
            subNode = new TrieNode();
            tempNode.addSubNode(c, subNode);
        }
        //指针指向子节点,进入下一轮循环
        tempNode = subNode;
        //设置结束标识,到这里遍历就结束了(这个词的最后一个字符)
        if(i == keyword.length() - 1){
            tempNode.setKeywordEnd(true);
        }
    }

}

编写过滤敏感词的方法

/*
    过滤敏感词
    参数:待过滤的文本
    返回:过滤后的文本
     */
    public String filter(String text){
        if(text == null){
            return null;
        }
        //指针1:指向树
        TrieNode tempNode = rootNode;
        //指针2:指向文本开始
        int begin = 0;
        //指针3:指向文本末尾
        int position = 0;
        //结果
        StringBuilder sb = new StringBuilder();
        //利用指针3遍历文本(整个文本都要遍历)
        while(position < text.length()){
            char c = text.charAt(position);
            //跳过符号(有的敏感词中间有符号以规避)
            if(isSymbol(c)){
                //若指针1处于根节点,将此符号计入结果(直接跳过特殊符号),让指针2向下走一步
                if(tempNode == rootNode){
                    sb.append(c);
                    begin++;
                }
                //无论符号在开头还是中间,指针3都向下走一步
                position++;//指针3是整体遍历的,不管都要走
                continue;//进入下一轮循环
            }
            //检查下级节点
            tempNode = tempNode.getSubNode(c);
            if(tempNode == null) {
                //以begin开头的字符串不是敏感词
                sb.append(text.charAt(begin));
                //进入下一个位置
                position = ++begin;//先加后赋值
                //重新指向根节点
                tempNode = rootNode;//指针3重新到跟节点
            }else if (tempNode.isKeywordEnd()) {
                //发现敏感词,将begin-position字符串替换掉
                sb.append(REPLACEMENT);
                //进入下一个位置(end的下一个位置),两者重合
                begin = ++position;
                //重新指向根节点
                tempNode = rootNode;
            }else {
                //检查下一个字符
                position++;
            }
        }
        //将最后一批字符计入结果
        sb.append(text.substring(begin));
        return sb.toString();
    }

  • 防止有人用特殊符号隔开敏感词。判断是否是符号。
private boolean isSymbol(char c) {
    // 0x2E80-0x9FFF 东亚文字范围
    return !CharUtils.isAsciiAlphanumeric(c) && (c < 0x2E80 || c > 0x9FFF);
}

测试

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
public class FilterTests {
    @Autowired
    private SensitiveFilter sensitiveFilter;

    @Test
    public void testSensitiveFilter() {
        String text = "这里可以*赌*博*,可以|嫖|娼|,可以|吸|毒|,可以*开*票*,哈哈哈";
        String text1 = sensitiveFilter.filter(text);
        System.out.println(text1);
    }
}

输出:

这里可以*****,可以|***|,可以|***|,可以*****,哈哈哈

发布帖子

AJAX

  • Asynchronous JavaScript and XML
  • 异步的JavaScript与XML,不是一门新技术,只是一个新的术语。
  • 使用AJAX,网页能够将增量更新呈现在页面上,而不需要刷新整个页面(异步的意思)。
  • 虽然X代表XML,但目前JSON的使用比XML更加普遍。
  • https://developer.mozilla.org/zh-CN/docs/Web/Guide/AJAX

例子:使用jQuery发送AJAX请求

  1. 编写生成json字符串的工具类(CommunityUtils中重载三个方法):
public static String getJsonString(int code, String msg, Map<String, Object> map) {
        JSONObject json = new JSONObject();
        json.put("code", code);
        json.put("msg", msg);
        if(map != null) {
//            for(Map.Entry<String, Object> entry : map.entrySet()) {
//                json.put(entry.getKey(), entry.getValue());
//            }
            json.putAll(map);
        }
        return json.toJSONString();
    }

    //重载
    public static String getJsonString(int code, String msg) {
        return getJsonString(code, msg, null);
    }

    //重载
    public static String getJsonString(int code) {
        return getJsonString(code, null, null);
    }

  1. 编写controller接受异步请求:(AlphaController中)
    @RequestMapping(path = "/ajax", method = RequestMethod.POST)
    @ResponseBody
    public String testAjax(String name, int age) {
        System.out.println(name);
        System.out.println(age);
        return CommunityUtil.getJsonString(0, "操作成功");
    }
  • 因为返回的是json字符串而不是页面 ,所以使用@ResponseBody注解;
  1. 测试,编写一个静态html,在其中点击按钮就提交相应的json数据;
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ajax</title>
</head>
<body>
<p>
    <input type="button" value="发送" onclick="send();">
</p>

<script
        src="https://code.jquery.com/jquery-3.7.1.min.js"
        integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo="
        crossorigin="anonymous">
</script>
<script>
    function send() {
        $.ajax({
            url: "/community/alpha/ajax",
            type: "post",
            data: {
                name: "zhangsan",
                age: 18
            },
            success: function (data) {
                console.log(typeof (data))
                console.log(data);

                // 将json字符串转换为json对象
                data = $.parseJSON(data);
                console.log(typeof (data));
                console.log(data.code)
            }
        });
    }
</script>
</body>
</html>

开发发布帖子功能

  1. DAO层添加insert接口:
@Mapper
public interface DiscussPostMapper {
    //userId为0时,表示查询所有用户的帖子,如果不为0,表示查询指定用户的帖子
    //offset表示起始行号,limit表示每页最多显示的行数
    List<DiscussPost> selectDiscussPosts(int userId, int offset, int limit);

    //查询帖子的行数
    //userId为0时,表示查询所有用户的帖子
    int selectDiscussPostRows(@Param("userId") int userId);
    //@param注解用于给参数取别名,拼到sql语句中,如果只有一个参数,并且在<if>标签里,则必须加别名

    int insertDiscussPost(DiscussPost discussPost);

}

修改Mapper-xml:

<sql id = "insertFields">
    user_id, title, content, type, status, create_time, comment_count, score
</sql>

<insert id="insertDiscussPost" parameterType="DiscussPost">
    insert into discuss_post (<include refid="insertFields"></include>)
    values (#{userId}, #{title}, #{content}, #{type}, #{status}, #{createTime}, #{commentCount}, #{score})
</insert>
  1. Service层对内容进行敏感词过滤等:DiscussPostService
public int addDiscussPost(DiscussPost discussPost) {
        if(discussPost == null) {
            throw new IllegalArgumentException("参数不能为空");
        }
        //转义HTML标记
        discussPost.setTitle(HtmlUtils.htmlEscape(discussPost.getTitle()));
        discussPost.setContent(HtmlUtils.htmlEscape(discussPost.getContent()));
        //过滤敏感词
        discussPost.setTitle(sensitiveFilter.filter(discussPost.getTitle()));
        discussPost.setContent(sensitiveFilter.filter(discussPost.getContent()));

        return discussPostMapper.insertDiscussPost(discussPost);
    }
  1. Controller层addpost:
@Controller
@RequestMapping("/discuss")
public class DiscussPostController {
    @Autowired
    private DiscussPostService discussPostService;

    @Autowired
    private HostHolder hostHolder;

    @RequestMapping(path = "/add", method = RequestMethod.POST)
    @ResponseBody
    public String addDiscussPost(String title, String content) {
        User user = hostHolder.getUser();
        if(user == null) {
            return CommunityUtil.getJsonString(403, "你还没有登录!");
        }
        DiscussPost post = new DiscussPost();
        post.setUserId(user.getId());
        post.setTitle(title);
        post.setContent(content);
        post.setCreateTime(new Date());
        discussPostService.addDiscussPost(post);

        //报错的情况将来统一处理
        return CommunityUtil.getJsonString(0, "发布成功!");

    }



}

  1. 测试访问index发现报错:
com.mysql.cj.exceptions.UnableToConnectException: Public Key Retrieval is not allowed at java.bas

解决方法,修改properties文件:

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/community?characterEncoding=utf-8&useSSL=false&serverTimezone=Hongkong&allowPublicKeyRetrieval=true

添加allowPublicKeyRetrieval=true

  1. 修改index.html

image

image

这里修改成不登录发布按钮不显示

  1. 修改index.js
$(function(){
	$("#publishBtn").click(publish);
});

function publish() {
	$("#publishModal").modal("hide");
	//获取标题和内容
	var title = $("#recipient-name").val();
	var content = $("#message-text").val();
	//发送异步请求(POST)
	$.post(
		CONTEXT_PATH + "/discuss/add",
		{"title":title, "content":content},
		function(data){
			data = $.parseJSON(data);//将字符串转换为json对象
			//在提示框中显示返回的消息
			$("#hintBody").text(data.msg);
			//显示提示框
			$("#hintModal").modal("show");
			//2秒后自动隐藏提示框
			setTimeout(function(){
				$("#hintModal").modal("hide");
				//刷新页面
				if(data.code == 0){//发布成功
					window.location.reload();//刷新页面
				}
			}, 2000);
		}
	);
	$("#hintModal").modal("show");
	setTimeout(function(){
		$("#hintModal").modal("hide");
	}, 2000);
}

这个就是上面那个id。

  1. 测试

image

bug解决

  • 这里终于解决了bug,疑似是js文件版本不对的问题,导致点击下拉框和发布框的时候都弹不出来啊,改成了原来的index.html的js,就恢复正常了:
	<script src="https://code.jquery.com/jquery-3.3.1.min.js" crossorigin="anonymous"></script>
	<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" crossorigin="anonymous"></script>
	<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" crossorigin="anonymous"></script>

image

开发帖子详情

Dao层:DiscussPostMapper

  1. 添加一个方法:
    DiscussPost selectDiscussPostById(int id);
  1. 修改Mapper.xml
    <select id="selectDiscussPostById" resultType="DiscussPost">
        select
        <include refid="selectFields"></include>
        from discuss_post
        where id = #{id}
    </select>

Service层:DiscussPostService

 public DiscussPost findDiscussPostById(int id) {
        return discussPostMapper.selectDiscussPostById(id);
    }

Controller层:DiscussPostController

  @RequestMapping(path = "/detail/{discussPostId}", method = RequestMethod.GET)
    public String getDiscussPost(@PathVariable(name="discussPostId") int discussPostId, Model model) {
        DiscussPost post = discussPostService.findDiscussPostById(discussPostId);
        model.addAttribute("post", post);
        //帖子的作者
        User user = userService.findUserById(post.getUserId());
        model.addAttribute("user", user);
        return "/site/discuss-detail";//返回模版路径
    }
  • 需要接收帖子id,一般都使用url中带着,所以用@PathVariable从注解中取;
  • 需要通过帖子id查帖子,再用帖子差用户id,最后查到用户名;

修改index.html

<!-- 帖子列表 -->
<ul class="list-unstyled">
    <li class="media pb-3 pt-3 mb-3 border-bottom" th:each="map:${discussPosts}">
        <a href="site/profile.html">
            <img th:src="${map.user.headerUrl}" class="mr-4 rounded-circle" alt="用户头像" style="width:50px;height:50px;">
        </a>
        <div class="media-body">
            <h6 class="mt-0 mb-3">
                <a th:href="@{|/discuss/detail/${map.post.id}|}" th:utext="${map.post.title}">备战春招,面试刷题跟他复习,一个月全搞定!</a>
                <span class="badge badge-secondary bg-primary" th:if="${map.post.type==1}">置顶</span>
                <span class="badge badge-secondary bg-danger" th:if="${map.post.status==1}">精华</span>
            </h6>
            <div class="text-muted font-size-12">
                <u class="mr-3" th:utext="${map.user.username}">寒江雪</u> 发布于 <b th:text="${#dates.format(map.post.createTime,'yyyy-MM-dd HH:mm:ss')}">2019-04-15 15:32:18</b>
                <ul class="d-inline float-right">
                    <li class="d-inline ml-2">11</li>
                    <li class="d-inline ml-2">|</li>
                    <li class="d-inline ml-2">回帖 7</li>
                </ul>
            </div>
        </div>						
    </li>
</ul>
  • 这里把原来静态的都改成动态,注意变量要用${}括起来。
  • 这里我突然想起来一个问题,在实体类中,这些属性都是private为什么能直接用.运算符获取?

在你的代码中,post.title就是一个表达式,它表示post对象的title属性。虽然title属性在post类中被声明为private,但是Thymeleaf可以通过post类的getTitle方法来获取title属性的值。这是Java的标准Bean规范,即对于一个名为foo的属性,应该有一个名为getFoo的方法来获取它的值,有一个名为setFoo的方法来设置它的值。

注意这就是java的bean,不是受Spring托管的@Bean注解:

在Java中,一个类并不需要使用@Bean注解或其他任何注解就能成为一个Java Bean。Java Bean是遵循特定命名规则的Java类,主要包含私有属性和对应的公有getter和setter方法。 在你的DiscussPost类中,所有的属性都是私有的,并且每个属性都有对应的公有getter和setter方法,所以它就是一个Java Bean。 @Bean注解通常用在Spring框架中,用于声明一个方法返回的对象应该被Spring管理。但是,并不是所有的Java Bean都需要被Spring管理,所以并不是所有的Java Bean都需要使用@Bean注解。

修改discuss-detail.html

<div class="main">
  <!-- 帖子详情 -->
  <div class="container">
      <!-- 标题 -->
      <h6 class="mb-4">
          <img src="http://static.nowcoder.com/images/img/icons/ico-discuss.png"/>
          <span th:utext="${post.title}">备战春招,面试刷题跟他复习,一个月全搞定!</span>
          <div class="float-right">
              <button type="button" class="btn btn-danger btn-sm">置顶</button>
              <button type="button" class="btn btn-danger btn-sm">加精</button>
              <button type="button" class="btn btn-danger btn-sm">删除</button>
          </div>
      </h6>
      <!-- 作者 -->
      <div class="media pb-3 border-bottom">
          <a href="profile.html">
              <img th:src="${user.headerUrl}" class="align-self-start mr-4 rounded-circle user-header" alt="用户头像" >
          </a>
          <div class="media-body">
              <div class="mt-0 text-warning" th:utext="${user.username}">寒江雪</div>
              <div class="text-muted mt-3">
                  发布于 <b th:text="${#dates.format(post.createTime,'yyyy-mm-dd-hh-mm-ss')}">2019-04-15 15:32:18</b>
                  <ul class="d-inline float-right">
                      <li class="d-inline ml-2"><a href="#" class="text-primary">11</a></li>
                      <li class="d-inline ml-2">|</li>
                      <li class="d-inline ml-2"><a href="#replyform" class="text-primary">回帖 7</a></li>
                  </ul>
              </div>
          </div>
      </div>	
      <!-- 正文 -->
      <div class="mt-4 mb-3 content" th:utext="${post.content}">
          金三银四的金三已经到了,你还沉浸在过年的喜悦中吗?
          如果是,那我要让你清醒一下了:目前大部分公司已经开启了内推,正式网申也将在3月份陆续开始,金三银四,春招的求职黄金时期已经来啦!!!
          再不准备,作为19应届生的你可能就找不到工作了。。。作为20届实习生的你可能就找不到实习了。。。
          现阶段时间紧,任务重,能做到短时间内快速提升的也就只有算法了,
          那么算法要怎么复习?重点在哪里?常见笔试面试算法题型和解题思路以及最优代码是怎样的?
          跟左程云老师学算法,不仅能解决以上所有问题,还能在短时间内得到最大程度的提升!!!
      </div>
  </div>

最终效果:

image

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

StarRocks 助力金融营销数字化进化之路

作者&#xff1a;平安银行 数据资产中心数据及 AI 平台团队负责人 廖晓格 平安银行五位一体&#xff0c;做零售金融的领先银行&#xff0c;五位一体是由开放银行、AI 银行、远程银行、线下银行、综合化银行协同构建的数据化、智能化的零售客户经营模式&#xff0c;这套模式以数…

python 爬虫爬取地理空间高程图GDEMV2 30m 中国地形

一.配置Python 爬虫 环境 from selenium import webdriver import time # from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import Byfrom selenium.webdriver.common.keys import Keys # from selenium.webdriver.comm…

算法体系-14 第十四 贪心算法(上)

一 、 递归套路解决判断完全二叉树 1.1 描述 1.2 分析 1.3 代码 public static boolean isCBT2(Node head) {return process(head).isCBT;}public static class Info {public boolean isFull;public boolean isCBT;public int height;public Info(boolean full, boolean cbt…

学习人工智能:Attention Is All You Need-1-介绍;Transformer模型架构

Transformer模型是目前最成功的chatGPT&#xff0c;Sora&#xff0c;文心一言&#xff0c;LLama&#xff0c;Grok的基础模型。 《Attention Is All You Need》是一篇由Google DeepMind团队在2017年发表的论文&#xff0c;该论文提出了一种新的神经网络模型&#xff0c;即Trans…

个人可以做知识付费网站吗

个人可以做知识付费网站吗 个人能够做学问付费网站吗&#xff1f;答案是肯定的&#xff01;如今个人做学问付费网站并不需求太多的资金和技术支持&#xff0c;我们只需求购置一台效劳器或虚拟主机&#xff0c;然后在该主机空间上搭建一个WordPress网站&#xff0c;最后运用带有…

0基础学习VR全景平台篇第146篇:为什么需要3D元宇宙编辑器?

一.什么是3D元宇宙编辑器&#xff1f; 3D元宇宙编辑器是全新3DVR交互渲染创作工具&#xff0c;集3D建模、虚拟展厅、AI数字人等能力&#xff0c;渲染和虚拟现实技术于一身的生产力工具。 具有跨平台和随时随地编辑等特点&#xff0c;可广泛应用于展会、展厅、博物馆、可视化园…

基于python+vue的幼儿园管理系统flask-django-php-nodejs

随着信息时代的来临&#xff0c;过去的传统管理方式缺点逐渐暴露&#xff0c;对过去的传统管理方式的缺点进行分析&#xff0c;采取计算机方式构建幼儿园管理系统。本文通过课题背景、课题目的及意义相关技术&#xff0c;提出了一种活动信息、课程信息、菜谱信息、通知公告、家…

MySQL索引(图文并茂)

目录 一、索引的概念 二、索引的作用 三、创建索引的原则依据 四、索引的分类和创建 1、索引的分类 2、索引的创建 2.1 普通索引 2.1.1 直接创建索引 2.1.2 修改表方式创建 2.1.3 创建表的时候指定索引 2.2 唯一索引 2.2.1 直接创建唯一索引 2.2.2 修改表方式创建 …

机器学习——决策树(三)预剪枝

观前提示&#xff1a;这是本人机器学习决策树内容的第三篇博客&#xff0c;沿用了之前相关的代码&#xff0c;包括信息增益计算函数、结点类、预测函数和分类精度计算函数 完整代码指路 DrawPixel/decisionTree.ipynb at main ndsoi/DrawPixel (github.com) 前两篇博客详见…

水泥领域智慧工厂物联网解决方案

水泥领域智慧工厂物联网解决方案 在水泥生产行业中&#xff0c;构建智慧工厂物联网解决方案已经成为推动产业升级、实现智能制造的关键路径。该方案深度融合了先进的信息技术与传统的水泥生产工艺&#xff0c;通过全面感知、可靠传输、智能处理等环节&#xff0c;实现了对整个…

Macos docker安装达梦数据库

官网下载达梦docker镜像安装包 导入安装包 docker load -i /Users/yeungsinsin/Downloads/dm8_20230808_rev197096_x86_rh6_64_single.tar查看导入的镜像 docker images4. docker run 启动容器 docker run -d -p 30236:5236 --restartalways --name dm8 --privilegedtrue -e…

是德科技keysight N9917A微波分析仪

181/2461/8938产品概述&#xff1a; N9917A 是一款使用电池供电的便携式分析仪&#xff1b;基本功能是电缆和天线分析&#xff1b;配置还包括频谱和网络分析仪、可选的内置功率计和矢量电压表。 N9917A FieldFox 手持式微波分析仪 主要特性和功能 18 GHz 最大频率&#xfef…

基于Springboot的闲置图书分享(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的闲置图书分享&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

MySQL的基础操作与管理

一.MySQL数据库基本操作知识&#xff1a; 1.SQL语句&#xff1a; 关系型数据库&#xff0c;都是使用SQL语句来管理数据库中的数据。 SQL&#xff0c;即结构化查询语言(Structured Query Language) 。 SQL语句用于维护管理数据库&#xff0c;包括数据查询、数据更新、访问控…

Sora底层技术原理:Stable Diffusion运行原理

AIGC 热潮正猛烈地席卷开来&#xff0c;可以说 Stable Diffusion 开源发布把 AI 图像生成提高了全新高度&#xff0c;特别是 ControlNet 和 T2I-Adapter 控制模块的提出进一步提高生成可控性&#xff0c;也在逐渐改变一部分行业的生产模式。惊艳其出色表现&#xff0c;也不禁好…

[BT]BUUCTF刷题第3天(3.21)

第3天&#xff08;共4题&#xff09; Web [极客大挑战 2019]LoveSQL Payload&#xff1a;/check.php?username1 union select 1,(select group_concat(password) from l0ve1ysq1),3%23&password1 看到登录页面&#xff0c;先尝试万能密码&#xff1a; 用户名&#xff…

Hive和Hadoop版本对应关系

通过 Downloads (apache.org) 即可查看

Java算法总结之插入排序(详解)

程序代码园发文地址&#xff1a;Java算法总结之插入排序&#xff08;详解&#xff09;-程序代码园小说,Java,HTML,Java小工具,程序代码园,http://www.byqws.com/ ,Java算法总结之插入排序&#xff08;详解&#xff09;http://www.byqws.com/blog/3148.html?sourcecsdn 插入排…

鸿蒙Harmony应用开发—ArkTS-全局UI方法(菜单)

在页面范围内关闭通过bindContextMenu属性绑定的菜单。 说明&#xff1a; 从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 ContextMenu.close 方法描述close(): void可以通过该方法在页面范围内关闭通过bindContextMenu给…

回归预测 | Matlab基于SAO-BiLSTM雪融算法优化双向长短期记忆神经网络的数据多输入单输出回归预测

回归预测 | Matlab基于SAO-BiLSTM雪融算法优化双向长短期记忆神经网络的数据多输入单输出回归预测 目录 回归预测 | Matlab基于SAO-BiLSTM雪融算法优化双向长短期记忆神经网络的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于SAO-B…