Springboot2.x仿B站项目第五章查询Es和内容推荐功能实现笔记及源码

news/2024/5/18 11:55:53/文章来源:https://blog.csdn.net/weixin_59823583/article/details/127078413

文章目录

  • 系统全局模块的开发
    • 1.系统全文搜索
      • 1.1docker 下安装ES以及kibana
      • 1.2 配置Es的相关的yaml和configuration
      • 1.3 ES全文检索需求
      • 视频投稿搜索查询
    • 2.观看记录的统计
      • 2.1观看视频的添加信息
      • 2.2查询观看记录
    • 3.用户视频推荐
    • 4.视频弹幕遮罩
    • 其他章节

系统全局模块的开发

本章主要实现对内容的搜索,根据观看内容推荐相似视频的需求以及弹幕遮照用到的人像分割技术等需求的实现

在这里插入图片描述

1.系统全文搜索

1.1docker 下安装ES以及kibana

  • 安装参考我的这篇博客:linux下安装docker ;docker下安装ES以及kibana

1.2 配置Es的相关的yaml和configuration

  • yml 配置相关连接es的地址
  elasticsearch:rest:uris: 192.168.117.130:9200
  • Configuration关于Es

@Configuration
public class ElasticSearchConfig extends AbstractElasticsearchConfiguration {@Value("${spring.elasticsearch.rest.uris}")private String esUrl;@Beanpublic RestHighLevelClient elasticsearchClient() {final ClientConfiguration clientConfiguration = ClientConfiguration.builder().connectedTo(esUrl).build();return RestClients.create(clientConfiguration).rest();}
}

也就是要连接对应docker容器上的es,然后RestHighLevelClient是ES提供的一个REST风格的API接口,实际上可以在启动Application启动类里面实现就行

  • 第二种实现方案
  • 但是需要引入依赖
        <!--引入对应的API包--><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId></dependency>
    @Beanpublic RestHighLevelClient client(){return new RestHighLevelClient(RestClient.builder(HttpHost.create("http://192.168.117.130:9200")));}

1.3 ES全文检索需求

  • demoApi
    @GetMapping("/es-videos")public JsonResponse<Video>getVideos(@RequestParam String keyword){Video video = elasticSearchService.getVideo(keyword);return new JsonResponse<>(video);}
  • service层(根据标题模糊查询)
    public Video getVideo(String keyword){return videoRepository.findByTitleLike(keyword);}
  • dao层
 public interface VideoRepository extends ElasticsearchRepository<Video,Long>{//根据关键词进行查询Video findByTitleLike(String keyword);
}
  • domain层
  • @Field代表指定查询的字段;@Document代表文档
@Data
@Document(indexName = "videos")
public class Video {@Idprivate Long id;@Field(type = FieldType.Long)private Long userId;//用户Idprivate String url;//视频链接private String thumbnail;//封面@Field(type = FieldType.Text)private String title;//标题private String type;//类型0 自制 1 转载private String duration;//时长private String area;//分区private List<VideoTag>videoTagList;//标签列表@Field(type = FieldType.Text)private String description;//简介@Field(type = FieldType.Date)private Date createTime;@Field(type = FieldType.Date)private Date updateTime;
  • systemAPI

根据关键词和页码来进行全文检索

@RestController
public class SystemApi {@Autowiredprivate ElasticSearchService elasticSearchService;/*** 全文搜索* @param keyword* @param pageNo* @param pageSize* @return* @throws IOException*/@GetMapping("/contents")public JsonResponse<List<Map<String,Object>>>getContents(@RequestParam String keyword,@RequestParam Integer pageNo,@RequestParam Integer pageSize) throws IOException {List<Map<String,Object>>list =  elasticSearchService.getContents(keyword,pageNo,pageSize);return new JsonResponse<>(list);}
}
  • ElasticSearchService
@Service
public class ElasticSearchService {@Autowiredprivate VideoRepository videoRepository;@Autowiredprivate UserInfoRepository userInfoRepository;@Autowiredprivate RestHighLevelClient client;//最基本的存储public void addVideo(Video video){videoRepository.save(video);}public Video getVideo(String keyword){return videoRepository.findByTitleLike(keyword);}public void deleteAllVideos(){videoRepository.deleteAll();}public void addUserInfo(UserInfo userInfo){userInfoRepository.save(userInfo);}//分页请求public List<Map<String,Object>>getContents(String keyword,Integer pageNo,Integer pageSize) throws IOException {String[]indices = new String[]{"video","user-infos"};//索引库SearchRequest searchRequest = new SearchRequest(indices);//构建request//构建分页SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.from(pageNo-1);sourceBuilder.size(pageSize);MultiMatchQueryBuilder matchQueryBuilder = QueryBuilders.multiMatchQuery(keyword,"title","nick","description");sourceBuilder.query(matchQueryBuilder);searchRequest.source(sourceBuilder);//高亮显示HighlightBuilder highlightBuilder = new HighlightBuilder();String[]array = {"title","nick","description"};for(String key:array){highlightBuilder.fields().add(new HighlightBuilder.Field(key));}highlightBuilder.requireFieldMatch(false);highlightBuilder.preTags("<span style=\"color:red\">");highlightBuilder.postTags("</span>");sourceBuilder.highlighter(highlightBuilder);//解析结果SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);List<Map<String,Object>>arrayList = new ArrayList<>();//hit->是指查询出来的内容for(SearchHit hit:searchResponse.getHits()){//处理高亮字段Map<String, HighlightField>highLightBuilderFields = hit.getHighlightFields();//获取结果中高亮的部分Map<String,Object>sourceMap = hit.getSourceAsMap();for(String key:array){HighlightField field = highLightBuilderFields.get(key);if(field!=null){Text[]fragments = field.getFragments();String str = Arrays.toString(fragments);str = str.substring(1,str.length()-1);sourceMap.put(key,str);}}arrayList.add(sourceMap);}return arrayList;}
}
  • es用法笔记博客ES使用笔记

视频投稿搜索查询

在第四章的基础上,我们加上ES搜索的save方法即可

  • api层
   /*** 视频投稿* @param video* @return*/@PostMapping("/videos")public JsonResponse<String>addVideos(@RequestBody Video video){Long userId = userSupport.getCurrentUserId();video.setUserId(userId);videoService.addVideos(video);elasticSearchService.addVideo(video);return JsonResponse.success();}
  • ElasticService层;利用ES基本功能进行包装最基础的查询,删除,分页,高亮等…
    public void addVideo(Video video){videoRepository.save(video);}
  • 进行测试

  • 新增视频测试
    在这里插入图片描述

  • 查询结果
    在这里插入图片描述

  • 进行分页查询
    在这里插入图片描述

2.观看记录的统计

在这里插入图片描述

  • 观看记录无论是游客还是用户都是要记录的,但是每个用户和游客一天只能算一个播放量,游客可以用ip+电脑操作系统来记录
  • 实现思路:创建一个用户观看表,包含userId,videoId,ip,clientId,前端传给我们一个videoView和httpRequest,包含了这些信息,然后service层里面进行是游客还是用户,是第一次还是多次,只有第一次才进行添加,查询该观看记录视频的参数还是可以参考之前的用一个map来封装,在根据查到的进行判断是否为空,为空代表第一次,将用户的信息set进去再齿形添加,对于查询观看数量,我们直接count查询就行
  • 依赖
        <!--引入获取Ip和电脑信息--><dependency><groupId>eu.bitwalker</groupId><artifactId>UserAgentUtils</artifactId><version>1.21</version></dependency>
  • 观看记录表
DROP TABLE IF EXISTS `t_video_view`;
CREATE TABLE `t_video_view` (`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键id',`videoId` BIGINT NOT NULL COMMENT '视频id',`userId` BIGINT DEFAULT NULL COMMENT '用户id',`clientId` VARCHAR(500) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '客户端id',`ip` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT 'ip',`createTime` DATETIME DEFAULT NULL COMMENT '创建时间',PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb3 COMMENT='视频观看记录表';

2.1观看视频的添加信息

  • Controller
    @PostMapping("/video-views")public JsonResponse<String>addVideoView(@RequestBody VideoView videoView,HttpServletRequest request){Long userId;try{userId = userSupport.getCurrentUserId();videoView.setUserId(userId);videoService.addVideoView(videoView,request);}catch (Exception e){videoService.addVideoView(videoView,request);}return JsonResponse.success();}
  • service
  • 由于我们要获取操作系统,因此我们要知道传request是为了获得请求头中的user-agent
    在这里插入图片描述
    public void addVideoView(VideoView videoView, HttpServletRequest request) {Long videoId = videoView.getVideoId();Long userId = videoView.getUserId();//生成clientIdString agent = request.getHeader("User-Agent");UserAgent userAgent = UserAgent.parseUserAgentString(agent);String clientId = String.valueOf(userAgent.getId());String ip = IpUtil.getIP(request);Map<String,Object>params = new HashMap<>();if(userId != null){//不是访客params.put("userId",userId);}else{params.put("ip",ip);params.put("clientId",clientId);}Date now = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");params.put("today",sdf.format(now));params.put("videoId",videoId);//查看是否存在VideoView dbVideoView = videoDao.getVideoView(params);//每天只需要记录一次观看记录if(dbVideoView== null){videoView.setIp(ip);videoView.setClientId(clientId);videoView.setCreateTime(new Date());videoDao.addVideoView(videoView);}}
  • IPutil
package com.imooc.bilibili.service.util;import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;/*** IP工具类*/
public class IpUtil {public static String getIP(HttpServletRequest httpServletRequest) {String ip = httpServletRequest.getHeader("X-Forwarded-For");if (ip != null && !"".equals(ip.trim())) {int index = ip.indexOf(",");if (index != -1) {ip = ip.substring(0, index);}return ip;} else {ip = httpServletRequest.getHeader("X-Real-IP");if (ip == null || "".equals(ip.trim())) {ip = httpServletRequest.getRemoteAddr();}return ip;}}public static String getLocalAddress() {try {InetAddress candidateAddress = null;Enumeration<NetworkInterface> ifaces = NetworkInterface.getNetworkInterfaces();while (ifaces.hasMoreElements()) {NetworkInterface iface = ifaces.nextElement();Enumeration<InetAddress> inetAddrs = iface.getInetAddresses();while (inetAddrs.hasMoreElements()) {InetAddress inetAddr = inetAddrs.nextElement();if (!inetAddr.isLoopbackAddress()) {if (inetAddr.isSiteLocalAddress()) {return inetAddr.getHostAddress();}if (candidateAddress == null) {candidateAddress = inetAddr;}}}}if (candidateAddress != null) {return candidateAddress.getHostAddress();} else {InetAddress jdkSuppliedAddress = InetAddress.getLocalHost();return jdkSuppliedAddress.getHostAddress();}} catch (Exception var5) {return "unkown";}}
}
  • getVideoView & addVideoView
<-- getVideoView是需要进行复杂查询的,对于clientId我们查询的是clientId 不为NULL 但是 userId为NULL,这样就代表将访客给查询到了!--><!--查询对应的观看记录--><select id="getVideoView" resultType="com.imooc.bilibili.domain.VideoView" parameterType="java.util.Map">select*fromt_video_viewwherevideoId = #{videoId}<if test="userId==null and clientId != null">and clientId = #{clientId} and userId is null</if><if test="userId != null">and userId = #{userId}</if><if test="ip != null and ip !='' ">and ip = #{ip}</if><if test="today != null and today != '' ">and DATE_FORMATE(createTime,'%Y-%m-%d') = #{today}</if></select><insert id="addVideoView" parameterType="com.imooc.bilibili.domain.VideoView" >insert intot_video_view(videoId,userId,clientId,ip,createTime)values(#{videoId},#{userId},#{clientId},#{ip},#{createTime})</insert>

2.2查询观看记录

    /*** 查看视频观看人数记录* @param videoId* @return*/@GetMapping("/video-view-counts")public JsonResponse<Integer>getVideoViewCounts(@RequestParam Long videoId){Integer count = videoService.getVideoViewCount(videoId);return new JsonResponse<>(count);}
  • servcie层
public Integer getVideoViewCount(Long videoId) {return videoDao.getVideoViewCount(videoId);}
  • getVideoViewCount.xml
    <!--查看观看记录人数--><select id="getVideoViewCount" resultType="java.lang.Integer" parameterType="java.lang.Integer">selectcount(1)fromt_video_viewwherevideoId = #{videoId};</select>

3.用户视频推荐

  • 这里我们采用第三方库包提供的推荐算法
       <!--引入推荐引擎mahout,注意要先全部引入,再使用exclusion标签--><dependency><groupId>org.apache.mahout</groupId><artifactId>mahout-mr</artifactId><version>0.12.2</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId></exclusion><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-jcl</artifactId></exclusion><exclusion><groupId>org.apache.lucene</groupId><artifactId>lucene-core</artifactId></exclusion><exclusion><groupId>org.apache.lucene</groupId><artifactId>lucene-analyzers-common</artifactId></exclusion><exclusion><groupId>log4j</groupId><artifactId>log4j</artifactId></exclusion><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion><exclusion><artifactId>jersey-client</artifactId><groupId>com.sun.jersey</groupId></exclusion><exclusion><artifactId>jersey-core</artifactId><groupId>com.sun.jersey</groupId></exclusion><exclusion><artifactId>jersey-apache-client4</artifactId><groupId>com.sun.jersey.contribs</groupId></exclusion></exclusions></dependency>

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

  • 用户视频推荐表
    在这里插入图片描述
    在这里插入图片描述

  • 推荐算法用sql可以这样进行计算
    在这里插入图片描述

  • 视频内容推荐RestController(推荐视频所以返回一个Listlist的集合)

    /*** 根据用户喜好推送视频* @return*/@GetMapping("/recommendations")public JsonResponse<List<Video>>recommend() throws TasteException {Long userId = userSupport.getCurrentUserId();List<Video>list = videoService.recommend(userId);return new JsonResponse<>(list);}
  • service
  • 根据用户喜好,建立模型数据,再获取对应的相似度和相邻的视频内容,最后得到一个recoomend系数

    //获取用户喜好,进行视频的推送public List<Video> recommend(Long userId) throws TasteException {List<UserPreference>list = videoDao.getAllUserPreference();//创建模型数据DataModel dataModel = this.createDataModel(list);//2.创建similar相似度UserSimilarity similarity = new UncenteredCosineSimilarity(dataModel);//3.获取用户userNeighborhoodSystem.out.println(similarity.userSimilarity(7,8));UserNeighborhood userNeighborhood = new NearestNUserNeighborhood(2,similarity,dataModel);long[]ar = userNeighborhood.getUserNeighborhood(userId);//4.构建推荐器recommendRecommender recommender = new GenericUserBasedRecommender(dataModel,userNeighborhood,similarity);List<RecommendedItem>recommendedItems = recommender.recommend(userId,5);//展示类似的5个视频List<Long>itemIds = recommendedItems.stream().map(RecommendedItem::getItemID).collect(Collectors.toList());return videoDao.batchGetVideoByIds(itemIds);}private DataModel createDataModel(List<UserPreference> userPreferenceList) {FastByIDMap<PreferenceArray> fastByIdMap = new FastByIDMap<>();Map<Long, List<UserPreference>> map = userPreferenceList.stream().collect(Collectors.groupingBy(UserPreference::getUserId));Collection<List<UserPreference>> list = map.values();for(List<UserPreference> userPreferences : list){GenericPreference[] array = new GenericPreference[userPreferences.size()];for(int i = 0; i < userPreferences.size(); i++){UserPreference userPreference = userPreferences.get(i);GenericPreference item = new GenericPreference(userPreference.getUserId(), userPreference.getVideoId(), userPreference.getValue());array[i] = item;}fastByIdMap.put(array[0].getUserID(), new GenericUserPreferenceArray(Arrays.asList(array)));}return new GenericDataModel(fastByIdMap);}
  • Userprefrence
@Data
public class UserPreference {private Long id;private Long userId;private Long videoId;private Float value;private Date createTime;
}
  • dao
    List<UserPreference> getAllUserPreference();List<Video> batchGetVideoByIds(@Param("idList") List<Long> idList);
  • batchGetVideo
       <!--通过id批计算喜好度视频,这个也可以自定义计算参数--><select id="getAllUserPreference" resultType="com.imooc.bilibili.domain.UserPreference">selectuserId,videoId,sum(case operationTypewhen '0' then 6when '1' then 2when '2' then 2else 0 end)as `value`fromt_video_operationgroup by userId,videoId;</select><!--通过id批量查询视频--><select id="batchGetVideoByIds" resultType="com.imooc.bilibili.domain.Video">select*fromt_videowhereid in<foreach collection="idList" item="id" open="(" close=")" separator=",">#{id}</foreach></select>
  • 测试
    在这里插入图片描述

4.视频弹幕遮罩

这一块是基于百度API中的人像分隔我还有点蒙,回头再看看,具体如下
在这里插入图片描述

  • yml:需要获取对应百度API的key等信息
    在这里插入图片描述
    具体百度AI文档:https://ai.baidu.com/ai-doc/REFERENCE/Ck3dwjgn3
    在这里插入图片描述
  • 相关依赖
        <dependency><groupId>org.bytedeco</groupId><artifactId>javacv</artifactId><version>1.4.3</version></dependency><dependency><groupId>org.bytedeco.javacpp-presets</groupId><artifactId>ffmpeg-platform</artifactId><version>4.0.2-1.4.3</version></dependency>
  • controller
/*** 视频帧截取生成黑白剪影*/@GetMapping("/video-frames")public JsonResponse<List<VideoBinaryPicture>> captureVideoFrame(@RequestParam Long videoId,@RequestParam String fileMd5) throws Exception {List<VideoBinaryPicture> list = videoService.convertVideoToImage(videoId, fileMd5);return new JsonResponse<>(list);}/*** 查询视频黑白剪影*/@GetMapping("/video-binary-images")public JsonResponse<List<VideoBinaryPicture>> getVideoBinaryImages(@RequestParam Long videoId,Long videoTimestamp,String frameNo) {Map<String, Object> params = new HashMap<>();params.put("videoId", videoId);params.put("videoTimestamp", videoTimestamp);params.put("frameNo", frameNo);List<VideoBinaryPicture> list = videoService.getVideoBinaryImages(params);return new JsonResponse<>(list);}
  • service
    public List<VideoBinaryPicture> convertVideoToImage(Long videoId, String fileMd5) throws Exception {File file = fileService.getFileByMd5(fileMd5);String filePath = "E:\\WorkSpace\\tmp"+videoId + "."+ file.getType();fastDFSUtil.downLoadFile(file.getUrl(),filePath);FFmpegFrameGrabber fFmpegFrameGrabber = FFmpegFrameGrabber.createDefault(filePath);fFmpegFrameGrabber.start();//启动int ffLength = fFmpegFrameGrabber.getLengthInFrames();//获取帧Frame frame;Java2DFrameConverter converter = new Java2DFrameConverter();int count = 1;List<VideoBinaryPicture>pictures = new ArrayList<>();for(int i =1;i<=ffLength;i++){Long timestamp = fFmpegFrameGrabber.getTimestamp();frame = fFmpegFrameGrabber.grabImage();if(count == i){if(frame == null){throw  new ConditionalException("无效帧");}BufferedImage bufferedImage = converter.getBufferedImage(frame);ByteArrayOutputStream os = new ByteArrayOutputStream();ImageIO.write(bufferedImage,"png",os);InputStream inputStream = new ByteArrayInputStream(os.toByteArray());//输出黑白剪影文件java.io.File outputFile = java.io.File.createTempFile("convert-"+videoId+"-",".png");BufferedImage binaryImg = imageUtil.getBodyOutline(bufferedImage, inputStream);ImageIO.write(binaryImg,"png",outputFile);//有的浏览器或网站需要把图片白色的部分转为透明色,使用以下方法可实现imageUtil.transferAlpha(outputFile,outputFile);//上传视频剪影文件String imgUrl = fastDFSUtil.uploadCommonFile(outputFile,"png");VideoBinaryPicture videoBinaryPicture = new VideoBinaryPicture();videoBinaryPicture.setFrameNo(i);videoBinaryPicture.setUrl(imgUrl);videoBinaryPicture.setVideoId(videoId);videoBinaryPicture.setVideoTimeStamp(timestamp);pictures.add(videoBinaryPicture);count += FRAME_NO;//删除临时文件outputFile.delete();}}//删除临时文件java.io.File tmpFile = new java.io.File(filePath);tmpFile.delete();//批量添加视频剪影文件videoDao.batchAddVideoBinaryPictures(pictures);return pictures;}public List<VideoBinaryPicture> getVideoBinaryImages(Map<String, Object> params) {return videoDao.getVideoBinaryImages(params);}
  • dao
    Integer batchAddVideoBinaryPictures(@Param("pictureList") List<VideoBinaryPicture> pictureList);List<VideoBinaryPicture> getVideoBinaryImages(Map<String, Object> params);
  • xml
    <!--添加视频分隔文件--><insert id="batchAddVideoBinaryPictures" parameterType="java.util.List">insert intot_video_binary_picture(videoId,frameNo,url,videoTimestamp,createTime)values<foreach collection="pictureList" item="picture" separator=",">(#{picture.videoId},#{picture.frameNo},#{picture.url},#{picture.videoTimestamp},#{picture.createTime})</foreach></insert><!--查看视频二值化--><select id="getVideoBinaryImages" resultType="com.imooc.bilibili.domain.VideoBinaryPicture" parameterType="java.util.Map">select*fromt_video_binary_picturewhere<if test="frameNo != null and frameNo != '' ">and frameNo = #{frameNo}</if><if test="videoTimestamp != null">and videoTimestamp = #{videoTimestamp}</if></select>

其他章节

第二章
第三章
第四章

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

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

相关文章

嵌入式分享合集67

一、CAN的接口保护电路 在一个模块上&#xff0c;由于是中转的CAN&#xff0c;需要从两个不同的连接器上连接出去&#xff08;这种情况是根据客户的需求而定的&#xff09;。 一般的设计如图&#xff1a; 一般的&#xff0c;我们最多使用两个电压斜坡控制电容&#xff08;C2和…

Windows如何生成公钥和私钥

Windows如何生成公钥和私钥 方法一)使用git命令 一. 首先安装git二. 桌面上右键 Git Bash Here三. 命令ssh-keygen -t rsa然后 一直enter 四. 将公钥放到服务器上就可以使用SSH链接了. 方法二)使用openssl生成公钥和私钥 参考链接:https://blog.csdn.net/cduoa/article/deta…

组播路由协议——PIM DM工作机制

目录 扩散、剪枝机制 嫁接机制 状态刷新机制 断言机制 采用“推&#xff08;Push&#xff09;”的方式转发组播报文并生成组播表&#xff0c;建立SPT&#xff08;最短路径树&#xff09;转发组播报文。它假定每条链路都有接收者&#xff0c;在每条链路上都直接推送组播流量…

大学生简单个人静态HTML网页设计作品 DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载 HTML5期末大作业

&#x1f329;️ 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f482; 作者主页: 【进入主页—&#x1f680;获取更多源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;HTML5网页期末作业 (1000套…

Oracle 常用的经典SQL查询

/*1、查看表空间的名称及大小*/ select t.tablespace_name, round(sum(bytes / (1024 * 1024)), 0) ts_sizefrom dba_tablespaces t, dba_data_files dwhere t.tablespace_name d.tablespace_namegroup by t.tablespace_name; /*2、查看表空间物理文件的名称及大小*/ select…

vue3 模版语法

App.vue 注释掉首页的文本内容&#xff0c;只剩下对应的图标即可。 <div class"wrapper"><!-- <HelloWorld msg"You did it!day day up 自己更新" /> --></div></header><main><!-- <TheWelcome /> -->&…

“发展与治理”2022元宇宙共治大会成功举行

2022年9月24日下午&#xff0c;“发展与治理”2022元宇宙共治大会暨《元宇宙发展与治理》课题征求意见会、元宇宙产业委数字藏品发展研讨会议&#xff0c;在央链直播平台线上召开&#xff0c;本次会议汇聚众多高科技产业引领者和建设者&#xff0c;以及数权藏品众多流量平台共聚…

Navicat设置utf8mb4后保存emoji仍然报错的解决方法

一、前言 最近遇到一个问题&#xff0c;需要查库并导出报表&#xff1b; 由于报表比较特殊&#xff0c;程序没有实现&#xff0c;因此准备先查询生产库、复制为insert语句&#xff0c;然后在本地Navicat里执行、处理、再导出xls&#xff0c;这样快一些。 但是&#xff0c;没想…

SwiftUI AR教程之如何使用 SwiftUI 按钮在 RealityKit 中切换前后摄像头(教程含源码)

iOS AR 开发快速指南 如果您正在为 iOS 构建增强现实体验,您可能希望让您的用户能够在前置(又称“自拍”或“正面”)摄像头和后置(又称“世界侧”)摄像头之间切换。这是有关如何将此功能添加到您的应用程序的基本教程。 基本设置 首先,让我们从 Xcode 中的 Augmented …

Nginx系列之反向代理过程

nginx通过proxy模块对上游服务使用http/https协议进行反向代理&#xff0c;下图是反向代理处理过程 在读取客户端发送的请求时&#xff0c;如果proxy_request_bufferringon,那么读取完整的包体后再发送给后端服务&#xff0c;如果 proxy_request_bufferringoff&#xff0c;则是…

DDL操作表-查询和DDL操作表-创建

DDL操作表-查询 1.C(Create):创建 2.R(Retrieve):查询 3.U(Update):修改 4.D(Delete):删除 R(Retrieve):查询 查询某个数据库中所有的表名称show tables;查询表结构desc 表名; DDL操作表-创建 C(Create):创建 1.语法:create table 表名(列名  数据类型1,列…

指针初阶详解

目录序言地址指针是什么指针和指针变量为什么定义指针指针指针的大小类型指针的解引用指针-整数指针运算指针 - 指针指针比较野指针二级指针指针数组序言 指针这个模块是C语言里面比较难理解的的,学习成本倒是不高,就是有点费脑子.我们这里重点关注什么是指针和指针的用法.这篇…

Fast.ai 的新课来了,给你详细介绍 Stable Diffusion 原理

最近跟学生们学了个新词儿&#xff0c;叫做「双厨狂喜」。一般形容两个知名创作者合作出来的作品 ------ 例如视频或者直播等 ------ 很受大伙儿欢迎。这次&#xff0c;告诉你一个好消息&#xff0c;fast.ai 要和 Huggingface, Stability.ai&#xff08;Stable Diffusion 作者之…

[BJDCTF2020]EasySearch

解题&#xff1a; 进入环境只有 一个登录框&#xff0c;一般我的思路都是先用 万能密码登录一下&#xff0c;不行的话就扫源码 发现 index.php.swp 文件 <?phpob_start();//加密function get_hash(){$chars ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234…

PDF转word格式如果失败了,可以这样做

PDF是可以直接转成Word格式&#xff0c;方法也很简单&#xff0c;只需要把PDF另存为就可以了。 首先&#xff0c;在PDF的【文件】下选择【另存为】&#xff0c;然后选择新的保存路径。 出现新的对话框后&#xff0c;在【保存类型】那里选择【Word】格式&#xff0c;再点击保存…

连接打印机出现错误0X00000709怎么解决?

在使用打印机的时候&#xff0c;出现系统提示&#xff1a;操作无法完成&#xff08;错误0x00000709&#xff09;&#xff0c;再次检查打印机名称&#xff0c;并确保打印机已连接到网络。该怎么办呢&#xff1f;下面小编总结了这个问题的几种解决办法&#xff0c;总有一种适合你…

SpringCloud2——Nacos配置管理

个人名片&#xff1a; 博主&#xff1a;酒徒ᝰ. 个人简介&#xff1a;沉醉在酒中&#xff0c;借着一股酒劲&#xff0c;去拼搏一个未来。 本篇励志&#xff1a;三人行&#xff0c;必有我师焉。 本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》&#xff0c;SpringCloud…

基于html和Node.js的网页音乐播放器设计

目录 实验报告 1 【实验工具】 1【运行方法】 1【文件说明】 1【使用说明】 2 没有生成目录时的页面 3 生成目录后&#xff0c;自动播放歌曲 4 显示状态的歌词与目录 5 隐藏状态的歌词与目录 6 5.【实现方式】 7 1.目录生成&#xff1a; 7 2.切换歌曲 7 3.获取歌词 7 4.单曲循…

AI大佬怼怼怼的背后,究竟暗藏哪些玄机?

整理 | 杨阳出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;四年前&#xff0c;纽约大学教授Marcus为反驳深度学习三巨头之一Bengio的“有意识先验”和“解纠缠观念”理论&#xff0c;发表了一篇名为《Deep Learning: A Critical Appraisal》的论文&#…

91-Lucene+ElasticSeach核心技术

LuceneElasticSeach什么是全文检索&#xff1a; 数据分类&#xff1a; 我们生活中的数据总体分为两种&#xff1a;结构化数据和非结构化数据 结构化数据&#xff1a;指具有固定格式或有限长度的数据&#xff0c;如数据库&#xff0c;元数据等 非结构化数据&#xff1a;指不…