基于SSM(spring+springmvc+mybatis)+MySQL开发的新闻推荐系统

news2024/11/8 23:41:09

基于内容的新闻推荐系统

一、环境搭建

  • 开发框架:SSM(spring+springmvc+mybatis)
  • 开发语言:Java、HTML5、JavaScript
  • 开发工具:MyEclipse
  • 软件依赖:tomcat8、MySQL

1.1 新建工程

打开 myeclispe,新建一个 maven 工程,选择 weapp 选项。

1.2 引入 spring+springmvc

在 pom.xml 文件中引入如下依赖:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>4.3.18.RELEASE</version>
</dependency>

然后在 web.xml文件中加入以下配置:

<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:applicationContext.xml</param-value>
</context-param>

<servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:springmvc-servlet.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

创建 applicationContext.xml 和 springmvc-servlet.xml 文件,在 springmvc-servlet.xml 中加入以下配置:

<!-- spring扫描的包 -->
<context:
  component-scan base-package="com.wjj"/>

<!-- DispatcherServlet不处理静态资源,交给服务器默认的servlet处理 -->
<mvc:
  default-servlet-handler />

<!-- 启用annotation -->
<mvc:
  annotation-driven />

到此,spring+springmvc 配置基本完成。

1.3 引入 mysql+mybatis

pom.xm 依赖引入:

<!-- mysql 的驱动包-->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.12</version>
</dependency>

<!--logback 日志包-->
<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
  <version>1.2.3</version>
</dependency>

<!-- mybatis jar 包-->
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.4.5</version>
</dependency>

<!-- 数据库连接池 alibaba 的 druid  -->
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.1.7</version>
</dependency>

<!-- mybatis与spring整合的jar包-->
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis-spring</artifactId>
  <version>1.3.1</version>
</dependency>

<!--spring管理的 jdbc,以及事务相关的-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jdbc</artifactId>
  <version>4.3.17.RELEASE</version>
</dependency>

新建一个 db.properties 文件,内容如下:

db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:
mysql://localhost:3306/mybatis?serverTimezone=UTC
db.username=root
db.password=123456
max=20
min=10

再创建一个 userMapper.xml 文件,内容大致如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wjj.dao.UserDao">

  <insert id="addUser" parameterType="com.wjj.entity.User">
    insert into users(name,age) values(#{name}, #{age})
  </insert>

  <delete id="deleteUser" parameterType="int">
    delete from users where id=#{id}
  </delete>

  <update id="updateUser" parameterType="com.wjj.entity.User">
    update users set name=#{name},age=#{age} where id=#{id}
  </update>

  <select id="getUser" parameterType="int" resultType="com.wjj.entity.User">
    select * from users where id = #{id}
  </select>

  <select id="getAllUsers" resultType="com.wjj.entity.User">
    select * from users
  </select>
</mapper>

在 com.wjj.dao 包下创建一个 UserDao 接口:

package com.wjj.dao;

import java.util.List;
import com.wjj.entity.User;
public interface UserDao {

    void addUser(User user);
    void deleteUser(int id);
    void updateUser(User user);
    User getUser(int id);
    List<User> getAllUsers();
}

在 applicationContext.xml 文件中加入如下内容:

<context:property-placeholder location="classpath:db.properties"/>

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
  <property name="driverClassName" value="${db.driver}"/>
  <property name="url" value="${db.url}"/>
  <property name="username" value="${db.username}"/>
  <property name="password" value="${db.password}"/>

  <property name="maxActive" value="${max}"/>
  <property name="minIdle" value="${min}"/>
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource"/>
  <property name="mapperLocations" value="classpath*:*Mapper.xml"/>
</bean>

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
  <constructor-arg index="0" ref="sqlSessionFactory" />
</bean>

整体结构如下:

操作 MyBatis 示例:

ClassPathXmlApplicationContext context = new
ClassPathXmlApplicationContext("classpath:applicationContext.xml");
/* 得到 SqlSession 对象*/
SqlSession sqlSession = (SqlSession) context.getBean("sqlSession");

String statement = null;

//添加
statement = "com.wjj.dao.UserDao.addUser";
int insert = sqlSession.insert(statement, new User(-1, "yinfei", 28));
System.out.println(insert);

//删除
statement = "com.wjj.dao.UserDao.deleteUser";
int delete = sqlSession.delete(statement, 9);
System.out.println(delete);

//查询
statement = "com.wjj.dao.UserDao.getUser";
User user = sqlSession.selectOne(statement,1);
System.out.println(user);

//修改
statement = "com.wjj.dao.UserDao.updateUser";
int update = sqlSession.update(statement, new User(10, "yinfei", 30));
System.out.println(update);

//查询所有
statement = "com.wjj.dao.UserDao.getAllUsers";
List<User> list = sqlSession.selectList(statement);
System.out.println(list);

到此,MyBatis 配置基本完成。

二、主要技术实现

2.1 算法实现

TF-IDF 算法

其实这个是两个词的组合,可以拆分为 TF 和 IDF。

TF(Term Frequency,缩写为 TF)也就是词频啦,即一个词在文中出现的次数,统计出来就是词频 TF,显而易见,一个词在文章中出现很多次,那么这个词肯定有着很大的作用,但是我们自己实践的话,肯定会看到你统计出来的 TF 大都是一些这样的词:‘的’,‘是’这样的词,这样的词显然对我们的分析和统计没有什么帮助,反而有的时候会干扰我们的统计,当然我们需要把这些没有用的词给去掉,现在有很多可以去除这些词的方法,比如使用一些停用词的语料库等。

假设我们把它们都过滤掉了,只考虑剩下的有实际意义的词。这样又会遇到了另一个问题,我们可能发现"中国"、“蜜蜂”、"养殖"这三个词的出现次数一样多。这是不是意味着,作为关键词,它们的重要性是一样的?

显然不是这样。因为"中国"是很常见的词,相对而言,"蜜蜂"和"养殖"不那么常见。如果这三个词在一篇文章的出现次数一样多,有理由认为,“蜜蜂"和"养殖"的重要程度要大于"中国”,也就是说,在关键词排序上面,"蜜蜂"和"养殖"应该排在"中国"的前面。

所以,我们需要一个重要性调整系数,衡量一个词是不是常见词。如果某个词比较少见,但是它在这篇文章中多次出现,那么它很可能就反映了这篇文章的特性,正是我们所需要的关键词。

用统计学语言表达,就是在词频的基础上,要对每个词分配一个"重要性"权重。最常见的词(“的”、“是”、“在”)给予最小的权重,较常见的词(“中国”)给予较小的权重,较少见的词(“蜜蜂”、“养殖”)给予较大的权重。这个权重叫做"逆文档频率"(Inverse Document Frequency,缩写为 IDF),它的大小与一个词的常见程度成反比。

知道了"词频"(TF)和"逆文档频率"(IDF)以后,将这两个值相乘,就得到了一个词的 TF-IDF 值。某个词对文章的重要性越高,它的 TF-IDF 值就越大。所以,排在最前面的几个词,就是这篇文章的关键词。

计算词频 TF

考虑到文章有长短之分,为了便于不同文章的比较,进行"词频"标准化。

或者

计算逆文档频率 IDF

需要一个语料库(corpus),用来模拟语言的使用环境。

如果一个词越常见,那么分母就越大,逆文档频率就越小越接近 0。分母之所以要加 1,是为了避免分母为 0(即所有文档都不包含该词)。log 表示对得到的值取对数。

计算 TF-IDF

可以看到,TF-IDF 与一个词在文档中的出现次数成正比,与该词在整个语言中的出现次数成反比。所以,自动提取关键词的算法就很清楚了,就是计算出文档的每个词的 TF-IDF 值,然后按降序排列,取排在最前面的几个词。

还是以《中国的蜜蜂养殖》为例,假定该文长度为 1000 个词,“中国”、“蜜蜂”、“养殖"各出现 20 次,则这三个词的"词频”(TF)都为 0.02。然后,搜索 Google 发现,包含"的"字的网页共有 250 亿张,假定这就是中文网页总数。包含"中国"的网页共有 62.3 亿张,包含"蜜蜂"的网页为 0.484 亿张,包含"养殖"的网页为 0.973 亿张。则它们的逆文档频率(IDF)和 TF-IDF 如下:

从上表可见,"蜜蜂"的 TF-IDF 值最高,"养殖"其次,"中国"最低。(如果还计算"的"字的 TF-IDF,那将是一个极其接近 0 的值。)所以,如果只选择一个词,"蜜蜂"就是这篇文章的关键词。

除了自动提取关键词,TF-IDF 算法还可以用于许多别的地方。比如,信息检索时,对于每个文档,都可以分别计算一组搜索词(“中国”、“蜜蜂”、“养殖”)的 TF-IDF,将它们相加,就可以得到整个文档的 TF-IDF。这个值最高的文档就是与搜索词最相关的文档。

TF-IDF算法的优点是简单快速,结果比较符合实际情况。缺点是,单纯以"词频"衡量一个词的重要性,不够全面,有时重要的词可能出现次数并不多。而且,这种算法无法体现词的位置信息,出现位置靠前的词与出现位置靠后的词,都被视为重要性相同,这是不正确的。(一种解决方法是,对全文的第一段和每一段的第一句话,给予较大的权重。)

2.2 计算 TF

这里需要用到分词工具 jieba。

引入依赖:

<dependency>
  <groupId>com.huaban</groupId>
  <artifactId>jieba-analysis</artifactId>
  <version>1.0.2</version>
</dependency>

使用示例:

import com.huaban.analysis.jieba.JiebaSegmenter;

JiebaSegmenter segmenter = new JiebaSegmenter();
String sentences = "他来到了网易杭研大厦, 网易杭研大厦";
List<String> wordList = segmenter.sentenceProcess(sentences);
System.out.println(wordList);

分词结果如下:

然后统计每个单词的出现次数:

Map<String,Integer> amountWord=new HashMap<String,Integer>();
for (String string : wordList) {
    if(!amountWord.containsKey(string)) {
        amountWord.put(string,1);
    } else {
        amountWord.put(string, amountWord.get(string).intValue()+1);
    }
}
System.out.println(amountWord);

统计结果如下:

接下来需要计算词频 TF:

//计算词频TF
Map<String, Double> tfWord=new HashMap<String,Double>();
for (Entry<String, Integer> string : amountWord.entrySet()) {
    tfWord.put(string.getKey(), Double.valueOf(string.getValue())/wordList.size());
}
System.out.println(tfWord);

统计结果如下:

三、数据库

数据库采用 MySQL。

数据库名:

news_recommend

创建数据库:

CREATE DATABASE news_recommend;

3.1 用户表(users)

字段默认类型备注
idint用户 id,唯一,单调递增,主键
usernameVARCHAR(30)用户名,注册时候填写的,登录的时候使用,唯一索引
passwordVARCHAR(30)密码
phonenumVARCHAR(30)手机号
emailVARCHAR(30)邮箱
levelint用户等级。索引。;1:管理员;2:普通用户
history_newsTEXT历史浏览记录, 新闻 id 列表,用",“分割,例如"2,3,11,15”
search_wordsTEXT搜索记录,字符串列表,用",“分割,例如"信息,天天,”

创建表:

USE news_recommend;
CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT, username
                    VARCHAR(30), password VARCHAR(30), phonenum VARCHAR(30), email
                    VARCHAR(30), level INT, history_news TEXT, search_words TEXT);
ALTER TABLE users ADD UNIQUE (username);    //创建唯一索引
ALTER TABLE users ADD INDEX level_index (level); //创建普通索引
DESC users;                                  //查看表的情况

3.2 用户 token 表(users_token)

字段默认类型备注
idint等同于上表中的用户 id,主键
tokenVARCHAR(30)管理员 token,调用 API 时需要带上该参数,15 分钟后过期,唯一索引
create_timeDATETIME创建时间,用于使该条记录过期,索引
levelint用户等级。;1:管理员;2:普通用户
  • 注:1、每次用户重新登录,需要修改 token 值。
  • 用户使用 token 调用 API 时,token 过期时间需要重新刷新成 15 分钟。
  • 打开 event_scheduler:my.cnf 中[mysqld]添加 event_scheduler=on #重启服务

创建事件:create event myevent on SCHEDULE every 5 second do delete from news_recommend.users_token where create_time <(CURRENT_TIMESTAMP() + INTERVAL -15 MINUTE);#删除 15 分钟前的数据

  • 开启事件:alter event myevent on completion preserve enable;
  • 关闭事件:alter event myevent on completion preserve disable;
  • 查看事件:show events;
  • 删除事件:drop event if exists myevent;

创建表:

CREATE TABLE users_token (id INT PRIMARY KEY, token VARCHAR(30), create_time DATETIME, level INT);
ALTER TABLE users_token ADD UNIQUE (token);  //创建唯一索引
ALTER TABLE users_token ADD INDEX create_time_index (create_time); //创建普通索引
DESC users_token;                                  //查看表的情况

3.3 新闻表(news)

字段默认类型备注
idint新闻 id,唯一,单调递增,主键
titleVARCHAR(30)新闻标题
typeVARCHAR(30)新闻类别,例如:政治新闻、经济新闻、法律新闻、军事新闻、科技新闻、文教新闻、体育版新闻、社会新闻等
labelVARCHAR(30)新闻标签,新增新闻时用户手动输入
keywordVARCHAR(30)关键字,系统自动从新闻内容中提取
contentTEXT新闻内容,长文本格式,0~65535 长度
srcVARCHAR(100)新闻来源,一个超链接,连接到源地址,例如:https://new.qq.com/omn/20200415/20200415A05J6M00.html

创建表:

USE news_recommend;
CREATE TABLE news (id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(30), type VARCHAR(30), label VARCHAR(30), keyword VARCHAR(30), content TEXT, src  VARCHAR(100));
ALTER TABLE news ADD INDEX type_index (type); //创建普通索引
ALTER TABLE news ADD INDEX label_index (label); //创建普通索引
ALTER TABLE news ADD INDEX keyword_index (keyword); //创建普通索引
DESC news;                                  //查看表的情况

3.4 新闻类别表(news_type)

字段默认类型备注
idint新闻类别 id,唯一,单调递增,主键
typeVARCHAR(30)新闻类别,例如:政治新闻、经济新闻、法律新闻、军事新闻、科技新闻、文教新闻、体育版新闻、社会新闻等

创建表:

USE news_recommend;
CREATE TABLE news_type(id INT PRIMARY KEY AUTO_INCREMENT,type VARCHAR(30));
DESC news_type;                                  //查看表的情况

四、主要功能

4.1 用户管理

4.1.1 注册、登录(管理员、普通用户)

注册:

http://localhost:8080/NewsRecommend/userRegist?username=ee&password=bb&level=1

参数:

  • username:用户名
  • password:密码
  • level:用户权限,1、管理员(只有一个),2、普通用户

登录:

http://localhost:8080/NewsRecommend/userLogin?username=ff&password=cc&level=1

参数: 同上

返回值:

{ "retcode" : "200", "token" : "bqP6PQHP4T" }

异常码:

错误码说明
301用户已存在(user is already existed)
302管理员已存在(manager is already existed)
303用户不存在(user is not existed)
304用户权限错误(user permission error)
305参数格式错误(invalid parm)
306密码错误(password incorrect)

4.1.2 修改用户信息(管理员、普通用户)

http://localhost:8080/NewsRecommend/userModify?token=ee&level1=1&username=a&level2=2&password=aa&phonenum=13015929018&email=123@qq.com

参数:

  • token: 修改人的 token
  • level1: 修改人的权限:1、管理员, 2、普通用户
  • username: 被修改人的用户名
  • level2: 被修改人的权限:1、管理员, 2、普通用户
  • password: 修改后的密码
  • phonenum: 修改后的手机号
  • email: 修改后的邮箱

异常码:

错误码说明
307无效的 token(invalid token)

4.1.3 删除用户信息(管理员)

http://localhost:8080/NewsRecommend/userDelete?token=2BQg2SDUA&username=aa

参数:

token: 管理员 token

username: 普通用户用户名

4.1.4 获取用户信息(管理员、普通用户)

http://localhost:8080/NewsRecommend/userGetInfo?token=2BQg2SDUA

参数:

token: 用户 token

返回值:

{"retcode":"200","password":"456","phonenum":"13015929018","email":"493589280@qq.com","username":"infi"}

4.1.5 管理员获取普通用户信息(管理员)

http://localhost:8080/NewsRecommend/userGetInfoByAdmin?token=2BQg2SDUA&username=abc

参数:

token: 管理员 token

username: 用户名

返回值:

{"retcode":"200","password":"456","phonenum":"13015929018","email":"493589280@qq.com","username":"infi"}

4.1.6 获取用户信息列表(管理员)

http://localhost:8080/NewsRecommend/userGetInfoList?token=2BQg2SDUA

参数:

token: 管理员 token

返回值:

{   "userList":
  [{"email":"493589280@qq.com","history_news":"2,3,4,5,6,9,10,","id":1,"level":2,"password":"456","phonenum":"13015929018","search_words":"天天向上,哈哈,","username":"infi"},
    {"id":7,"level":2,"password":"123456","username":"zhouyinfei"},
    {"id":9,"level":2,"password":"123","username":"wc"},
    {"id":10,"level":2,"password":"111","username":"admin"}],
  "retcode":"200"
}

4.2 新闻管理

4.2.1 添加新闻类别(管理员)

http://localhost:8080/NewsRecommend/newsTypeAdd?token=aaa&type=历史新闻

参数:

token: 管理员 token

type: 新闻类别

异常码:

错误码说明
401新闻类别已存在(news type is already existed)

4.2.2 获取新闻类别列表

http://localhost:8080/NewsRecommend/newsTypeGetList?token=aaa

参数:

token: 管理员 token

返回值:

{"newsTypeList":[{"id":2,"title":"八卦新闻"},{"id":3,"title":"法律新闻"}],"retcode":"200"}

newsTypeList: 新闻类型列表,包括 id 和名称

retcode: 错误码,200 时表示正常

4.2.3 添加新闻(管理员)

http://localhost:8080/NewsRecommend/newsAdd?token=aaa&title=aa&type=历史新闻&label=aa&content=aa&src=aa

参数:

  • token: 管理员 token
  • title: 新闻标题
  • type: 新闻类别
  • label: 新闻标签
  • content: 新闻内容
  • src: 新闻来源

异常码:

错误码说明
402新闻类别不存在(news type not exist)

4.2.4 删除新闻(管理员)

http://localhost:8080/NewsRecommend/newsDelete?token=aaa&id=3

参数:

  • token: 管理员 token
  • title: 新闻标题
  • type: 新闻类别
  • label: 新闻标签
  • content: 新闻内容
  • src: 新闻来源

异常码:

错误码说明
403新闻不存在(news not exist)

4.2.5 获取新闻列表(普通用户/管理员)

http://localhost:8080/NewsRecommend/newsGetList?token=aaa&type=aa

参数:

token: 用户 token

type: 新闻类别

返回值:

{"newsList":[{"id":2,"title":"aa"},{"id":3,"title":"aa"},{"id":4,"title":"aa"}],"retcode":"200"}

newsList: 新闻列表,包括 id 和标题

retcode: 错误码,200 时表示正常

4.2.6 获取新闻内容(普通用户/管理员)

http://localhost:8080/NewsRecommend/newsGet?token=aaa&id=aa

参数:

token: 用户 token

id: 新闻 id

返回值:

{"news":{"content":"abcd","id":2,"keyword":"bb","label":"bb","src":"http://xxx","title":"aa","type":"aa"},"retcode":"200"}

4.2.7 查看历史记录(普通用户/管理员)

http://localhost:8080/NewsRecommend/newsGetHistoryList?token=aaa

参数:

token: 用户 token

返回值

{"historyList":[{"id":2,"title":"aa"},{"id":4,"title":"aa"}],"retcode":"200"}

4.2.8 搜索新闻(普通用户/管理员)

http://localhost:8080/NewsRecommend/newsSearch?token=aaa&keyword=aaa

参数:

  • token: 用户 token
  • keyword: 搜索的关键字
  • 返回值
{"newsList":[{"id":2,"title":"天天向上"},{"id":3,"title":"天天想你"},{"id":4,"title":"天罡北斗"}],"retcode":"200"}

4.2.9 推荐新闻(普通用户/管理员)

http://localhost:8080/NewsRecommend/newsRecommend?token=aaa

根据搜索记录,推荐用户新闻

参数:

token: 用户 token

返回值

{"newsList":[{"id":2,"title":"天天向上"},{"id":3,"title":"天天想你"},{"id":4,"title":"天罡北斗"}],"retcode":"200"}

异常码:

错误码说明
404无搜索记录(no search history)

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

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

相关文章

STM32 HAL ADC FIR 窗函数实现低通滤波

FIR 窗函数实现低通滤波 文章目录 FIR 窗函数实现低通滤波1.窗的分类与选择2.matlab设计3.代码编写4.结果欣赏与群延迟5.其他可能报错5.1.adc采集的数据没问题&#xff0c;vofa打印成-nan5.2.vofa打印的滤波数据为初始化的0 6.代码备忘 1.窗的分类与选择 2.matlab设计 主页命令…

例程学习(学习笔记)

project括号里面表示工程的名称&#xff0c;决定了最后生成的bin文件的名称&#xff0c;比如我们现在编译后的bin文件名称就是hello_world.bin文件&#xff0c;如果改成了project(xxx)&#xff0c;编译后的名称就是xxx.bin 这个文件用来设置路径&#xff0c;咱们得例程案例里面…

uniapp:上拉加载更多、下拉刷新、页面滚动到指定位置

提醒 本文实例是使用uniapp进行开发演示的。 一、需求场景 在开发商品&#xff08;SKU&#xff09;列表页面时&#xff0c;通常有三个需求&#xff1a; 页面下拉刷新&#xff0c;第一页展示最新数据&#xff1b;上拉加载更多数据&#xff1b;列表页面可以滚动到指定位置&#x…

5G在汽车零部件行业的应用

5G技术在汽车零部件行业的应用正在不断深入&#xff0c;为行业的智能化、自动化和高效化转型提供了强大的技术支持。 1、5G技术特点与优势 5G技术具有高速度、低延迟、大连接和切片技术等特点与优势。这些特性为汽车零部件行业提供了稳定、可靠、高效的通信连接&#xff0c;使…

jmeter的基本使用

Jmeter基本使用 一、变量 1.用户定义变量 2.用户参数 二、函数 1.计数器${__counter(,)} 2.时间函数 3.加密函数${__digest(,,,,)} 4. 整数相加${__intSum(,,)} 5.属性函数&#xff0c;${__P(,)}、${__property(,,)}、${__setProperty(,,)} 6.V函数 三、获取响应数据…

算法的学习笔记—和为 S 的连续正数序列(牛客JZ74)

&#x1f600;前言 在牛客网的《剑指 Offer》系列题中&#xff0c;有一道关于输出和为给定值 S 的连续正数序列的问题。这是一道典型的双指针问题&#xff0c;考察我们对连续数列求和的理解和双指针的应用。本文将详细解析这道题的思路&#xff0c;并展示如何实现代码。 &#…

D53【python 接口自动化学习】- python基础之模块与标准库

day53 自定义模块 学习日期&#xff1a;20241030 学习目标&#xff1a;模块与标准库 -- 67 自定义模块&#xff1a;如何编写一个完整功能&#xff1f; 学习笔记&#xff1a; 创建自定义模块 自定义模块注意事项 自定义模块 def func1():return this is a functionclass Cl…

上市公司企业数字金融认知数据集(2001-2023年)

一、测算方式&#xff1a;参考C刊《经济学家》王诗卉&#xff08;2021&#xff09;老师的做法&#xff0c;数字金融认知使用每万字年报描述中包含的对数字金融相关关键词的提及次数&#xff0c;关键词为&#xff1a;互联网、数字化、智能、大数据、电子银行、金融科技、科技金融…

4.2-7 运行MR应用:词频统计

文章目录 1. 准备数据文件2. 文件上传到HDFS指定目录2.1 创建HDFS目录2.2 上传文件到HDFS2.3 查看上传的文件 3. 运行词频统计程序的jar包3.1 查看Hadoop自带示例jar包3.2 运行示例jar包里的词频统计 4. 查看词频统计结果5. 在HDFS集群UI界面查看结果文件6. 在YARN集群UI界面查…

How to Train Neural Networks for Flare Removal

Abstract 当相机指向强光源时&#xff0c;生成的照片可能包含镜头眩光伪影。 耀斑以多种形式出现&#xff08;光晕、条纹、渗色、雾霾等&#xff09;&#xff0c;这种外观的多样性使得去除耀斑变得具有挑战性。 现有的分析解决方案对伪影的几何形状或亮度做出了强有力的假设&a…

Kafka如何控制消费的位置?

大家好&#xff0c;我是锋哥。今天分享关于【Kafka如何控制消费的位置?】面试题&#xff1f;希望对大家有帮助&#xff1b; Kafka如何控制消费的位置? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Kafka 中&#xff0c;控制消费位置主要通过以下几个机制来实…

shell脚本实例(4)while实现1+...+100,linux新增用户

while实现1到100求和 #!/bin/bash/ s0 i1 #-le小于等于 while [ $i -le 100 ] dos$[ $s$i ]i$[ $i1 ] done echo $s echo $i 执行结果如下 修改用户名密码脚本 #!/bin/bash/ #提示用户输入用户名 read -p "请输入用户名&#xff1a;"username useradd $username #提…

Qt 实战(10)模型视图 | 10.5、代理

文章目录 一、代理1、简介2、自定义代理 前言&#xff1a; 在Qt的模型/视图&#xff08;Model/View&#xff09;框架中&#xff0c;代理&#xff08;Delegate&#xff09;是一个非常重要的概念。它充当了模型和视图之间的桥梁&#xff0c;负责数据的显示和编辑。代理可以自定义…

lenovo联想小新 潮7000-14AST(81GE)笔记本原厂Win10系统镜像安装包下载

适用机型&#xff1a;【81GE】 链接&#xff1a;https://pan.baidu.com/s/1ciGya7OjTN73rHFJs52WpQ?pwdkgk4 提取码&#xff1a;kgk4 联想原装出厂系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软件、联想电脑管家、联想浏览器…

C语言部分输入输出(printf函数与scanf函数,getchar与putchar详解,使用Linux ubuntu)

1.输入输出 1.1.按格式输入输出 printf 可以在man手册中查看 int printf(const char *format, ...); printf:函数名(参数)int:函数的返回值 功能&#xff1a;按格式在终端输出 参数&#xff1a;多参 返回值&#xff1a;输出字符个数 格式&#xff1a; %d int %c char…

Jmeter自动化实战

一、前言 由于系统业务流程很复杂,在不同的阶段需要不同的数据,且数据无法重复使用,每次造新的数据特别繁琐,故想着能不能使用jmeter一键造数据 二、创建录制模板 可参考:jmeter录制接口 首先创建一个录制模板 因为会有各种请求头,cookies,签名,认证信息等原因,导致手动复制…

【mysql】4-2. MySQL存储结构

MySQL存储结构 1 什么是表空间⽂件&#xff1f; 解答问题 表空间⽂件是⽤来存储表中数据的⽂件&#xff0c;表空间⽂件的⼤⼩由存储的数据多少决定&#xff0c;不同的表空间⽂件存储数据的种类也有所不同&#xff0c;在MySQL中表空间分为五类&#xff0c;包括&#xff1a;系统…

Ansible基本使用

目录 介绍 安装 inventory-主机清单 分组 子组 modules-模块 command shell script file copy systemd yum get_url yum_repository user mount cron 介绍 ansible是基于python开发的自动化运维工具。架构相对比较简单&#xff0c;仅需通过ssh连接客户机执行…

HivisionIDPhoto Docker部署以及Springboot接口对接(AI证件照制作)

项目简介 项目以及官方文档地址 HivisionIDPhoto 旨在开发一种实用、系统性的证件照智能制作算法。 它利用一套完善的AI模型工作流程&#xff0c;实现对多种用户拍照场景的识别、抠图与证件照生成。 HivisionIDPhoto 可以做到&#xff1a; 轻量级抠图&#xff08;纯离线&a…

DB-GPT系列(一):DB-GPT能帮你做什么?

DB-GPT是一个开源的AI原生数据应用开发框架(AI Native Data App Development framework with AWEL and Agents)&#xff0c;围绕大模型提供灵活、可拓展的AI原生数据应用管理与开发能力&#xff0c;可以帮助企业快速构建、部署智能AI数据应用&#xff0c;通过智能数据分析、洞察…