仿写知乎日报第二周

news2024/11/23 1:07:19

新学到的

新学到了WKWebView:

  • WKWebView是是苹果推崇的一个新的类,它用于将一个网页嵌套在软件里。这里我是将点击cell后的内容中放入WKWebView对象。
  • WKWebView的使用:
    首先,要导入这个类:
#import <WebKit/WebKit.h>

然后要为这个类的实例对象添加导航代理,因此要遵守WKNavigationDelegate协议,并且声明一个WKWebView的属性:

@interface neiRongViewController : UIViewController<UIScrollViewDelegate, WKNavigationDelegate>
@property (nonatomic, strong) WKWebView *wkwebView;

在视图控制器中,我们首先创建一个这个类的实例对象,并且为其设置导航代理:

self.wkwebView = [[WKWebView alloc] initWithFrame:self.view.bounds];
self.wkwebView.navigationDelegate = self;

然后获取对应网页的url,并使用loadRequest方法加载网页:

NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@", today_stories.url]];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[self.wkwebView loadRequest:request];

WKNavigationDelegate 协议定义了一系列方法,允许你监控和响应 WKWebView 的导航事件。以下是一些常用的 WKNavigationDelegate 方法:

  1. 页面开始加载时调用

    • webView:didStartProvisionalNavigation::在开始加载一个页面时调用,通常表示已经接收到页面的主要内容,但可能还有其他资源需要加载。
  2. 页面导航发生错误时调用

    • webView:didFailProvisionalNavigation:withError::在加载页面时发生错误时调用,例如无法连接到服务器或找不到页面。
  3. 页面加载完成时调用

    • webView:didFinishNavigation::在页面成功加载完成后调用,可用于执行与页面加载相关的操作。
  4. 页面导航被重定向时调用

    • webView:didReceiveServerRedirectForProvisionalNavigation::在页面导航被服务器重定向到其他位置时调用。
  5. 页面加载失败时调用

    • webView:didFailNavigation:withError::在页面导航失败时调用,例如因为网络问题或其他原因导致加载失败。
  6. 页面加载过程中调用

    • webView:didCommitNavigation::在页面加载过程中,当接收到更多数据时调用。
  7. 页面导航操作完成时调用

    • webView:didFinishNavigation::在页面导航操作完成后调用,此时页面已完全加载。
  8. 页面加载发生错误时调用

    • webView:didFailProvisionalNavigation:withError::在加载页面时发生错误时调用,可以用于处理加载失败的情况。
  9. 处理页面身份验证时调用

    • webView:didReceiveAuthenticationChallenge:completionHandler::在需要进行身份验证时调用,你可以在此方法中提供用户凭据,例如用户名和密码。
  10. 页面内容进程终止时调用

    • webViewWebContentProcessDidTerminate::在页面内容进程意外终止时调用,你可以在此方法中处理相应的逻辑。

这些方法允许我们监控页面导航、处理导航错误、执行页面加载后的操作以及其他与 WKWebView 相关的事件。

在这里,我使用的是- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation;即完成网页的获取后调用。

单元格的刷新

  • 单元格的刷新我使用了- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;协议方法,当scrollView的偏移量大于tableView的总长度时,就调用该方法。我使用了一个全局变量numberOfCell,其初始值为0,我的单元格的组数的返回值就是2 + numberOfCell,每当调用到该方法时,numberOfCell就会加一,因此我的单元格组数刷新后就会增加1个。当触发该方法的时候,就获取存在ManagerModel类中date属性(该属性表示当天的日期的字符串),然后将该date-1就得到前一天的时间,我还定义了一个全局变量n用于表示刷新了多少天,每当刷新一次就让n加1,因此使用date-n就能得到刷新的对应天数的字符串,再将该字符串传给beforeManager的timeStr属性,该属性用来补全https://news-at.zhihu.com/api/4/news/before/%@的url,然后进行网络请求,这样我们就获得到了刷新后的内容,再将该内容赋给对应的beforeStoriesModel类的实例的stories属性,再将该属性给单元格并刷新单元格,就实现了单元格的刷新。
  • 因为当天最新内容和以前内容的获取时机和api都不一样,所以我将当天的最新内容单独放在一个组,刷新获取的过往内容放在后面的组中。因为过往的内容必须一直保持一个相同的顺序,因此我将获取的过往的内容的model放在一个数组中,当要将其放在cell中时,使用indexPath.row访问数组元素来获取详细内容。
  • 代码实现:
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.section == 0) {
        imageScrollTableViewCell *scrollCell = [self.mainview.tableView dequeueReusableCellWithIdentifier:@"idimage"];
        scrollCell.scrollView.contentSize = CGSizeMake(self.view.bounds.size.width * 7, 400);
        scrollCell.scrollView.pagingEnabled = YES;
        scrollCell.scrollView.showsHorizontalScrollIndicator = NO;
        
        for (int i = 0; i < 6; i++) {
            if (i == 0) {
                top_storiesModel *top_stories = self.mainModel.top_stories[4];
                UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
                [button sd_setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@", top_stories.image]] forState:UIControlStateNormal placeholderImage:[UIImage imageNamed:@"geRen.jpg"]];
                button.frame = CGRectMake(0, 0, self.view.bounds.size.width, 400);
                button.tag = 4;
                [button addTarget:self action:@selector(scrollButtonPress:) forControlEvents:UIControlEventTouchUpInside];
                
                UILabel *title = [[UILabel alloc] init];
                title.font = [UIFont systemFontOfSize:24];
                title.numberOfLines = 2;
                title.textColor = [UIColor whiteColor];
                [button addSubview:title];
                
                [title mas_makeConstraints:^(MASConstraintMaker *make) {
                    make.left.equalTo(button).offset(24);
                    make.top.equalTo(button).offset(250);
                    make.width.equalTo(@374);
                    make.height.equalTo(@100);
                }];
                title.text = top_stories.title;
                
                UILabel *zuoZheTitle = [[UILabel alloc] init];
                zuoZheTitle.numberOfLines = 0;
                zuoZheTitle.textColor = [UIColor whiteColor];
                [button addSubview:zuoZheTitle];
                [zuoZheTitle mas_makeConstraints:^(MASConstraintMaker *make) {
                    make.left.equalTo(button).offset(24);
                    make.top.equalTo(button).offset(330);
                    make.width.equalTo(@374);
                    make.height.equalTo(@50);
                }];
                zuoZheTitle.text = top_stories.hint;
                
                [scrollCell.scrollView addSubview: button];
            } else {
                top_storiesModel *top_stories = self.mainModel.top_stories[i - 1];
                UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
                [button sd_setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@", top_stories.image]] forState:UIControlStateNormal placeholderImage:[UIImage imageNamed:@"geRen.jpg"]];
                button.frame = CGRectMake(self.view.bounds.size.width * i, 0, self.view.bounds.size.width, 400);
                button.tag = i - 1;
                [button addTarget:self action:@selector(scrollButtonPress:) forControlEvents:UIControlEventTouchUpInside];
                
                UILabel *title = [[UILabel alloc] init];
                title.font = [UIFont systemFontOfSize:24];
                title.numberOfLines = 2;
                title.textColor = [UIColor whiteColor];
                [button addSubview:title];
                
                [title mas_makeConstraints:^(MASConstraintMaker *make) {
                    make.left.equalTo(button).offset(24);
                    make.top.equalTo(button).offset(250);
                    make.width.equalTo(@374);
                    make.height.equalTo(@100);
                }];
                title.text = top_stories.title;
                
                UILabel *zuoZheTitle = [[UILabel alloc] init];
                zuoZheTitle.numberOfLines = 0;
                zuoZheTitle.textColor = [UIColor whiteColor];
                [button addSubview:zuoZheTitle];
                [zuoZheTitle mas_makeConstraints:^(MASConstraintMaker *make) {
                    make.left.equalTo(button).offset(24);
                    make.top.equalTo(button).offset(330);
                    make.width.equalTo(@374);
                    make.height.equalTo(@50);
                }];
                zuoZheTitle.text = top_stories.hint;
                
                [scrollCell.scrollView addSubview: button];
            }
        }
        top_storiesModel *top_stories = self.mainModel.top_stories[0];
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        [button sd_setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@", top_stories.image]] forState:UIControlStateNormal placeholderImage:[UIImage imageNamed:@"geRen.jpg"]];
        button.frame = CGRectMake(self.view.bounds.size.width * 6, 0, self.view.bounds.size.width, 400);
        button.tag = 0;
        [button addTarget:self action:@selector(scrollButtonPress:) forControlEvents:UIControlEventTouchUpInside];
        
        UILabel *title = [[UILabel alloc] init];
        title.font = [UIFont systemFontOfSize:24];
        title.numberOfLines = 2;
        title.textColor = [UIColor whiteColor];
        [button addSubview:title];
        
        [title mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.equalTo(button).offset(24);
            make.top.equalTo(button).offset(250);
            make.width.equalTo(@374);
            make.height.equalTo(@100);
        }];
        title.text = top_stories.title;
        
        UILabel *zuoZheTitle = [[UILabel alloc] init];
        zuoZheTitle.numberOfLines = 0;
        zuoZheTitle.textColor = [UIColor whiteColor];
        [button addSubview:zuoZheTitle];
        [zuoZheTitle mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.equalTo(button).offset(24);
            make.top.equalTo(button).offset(330);
            make.width.equalTo(@374);
            make.height.equalTo(@50);
        }];
        zuoZheTitle.text = top_stories.hint;
        
        [scrollCell.scrollView addSubview: button];
        [scrollCell.scrollView setContentOffset:CGPointMake(self.view.bounds.size.width, 0)];
        return scrollCell;
    }
    mainViewTableViewCell *cell = [self.mainview.tableView dequeueReusableCellWithIdentifier:@"id" forIndexPath:indexPath];
    
    if (indexPath.section == 1) {
        storiesModel *stories = self.mainModel.stories[indexPath.row];
        cell.titleLabel.text = stories.title;
        cell.zuoZheAndTimeLabel.text = stories.hint;
        cell.picImageStr = stories.images[0];
    } else {
        for (int i = 0; i < numberOfCell; i++) {
            if (indexPath.section == i + 2) {
                if ([self.beforeArray count] == numberOfCell) {
                    beforeStoriesModel *before = self.beforeArray[i][indexPath.row];
                    cell.titleLabel.text = before.title;
                    cell.zuoZheAndTimeLabel.text = before.hint;
                    cell.picImageStr = before.images[0];
                }
            }
        }
    }
    
    return cell;
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    if (section == 0 || section == 1) {
        UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 0)];
        return view;
    }
    UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 30)];
    for (int i = 0; i < numberOfCell; i++) {
        if (section == i + 2) {
            int month = [[self.beforeTimeArray[i] substringWithRange:NSMakeRange(4, 2)] intValue];
            int day = [[self.beforeTimeArray[i] substringWithRange:NSMakeRange(6, 2)] intValue];
            UILabel *titleTimeLabel = [[UILabel alloc] init];
            [view1 addSubview:titleTimeLabel];
            titleTimeLabel.text = [NSString stringWithFormat:@"%d月%d日     ——————————————", month, day];
            titleTimeLabel.textColor = [UIColor grayColor];
            titleTimeLabel.font = [UIFont systemFontOfSize:21];
            [titleTimeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
                make.left.equalTo(view1).offset(25);
                make.top.equalTo(view1).offset(0);
                make.width.equalTo(@(self.view.bounds.size.width));
                make.height.equalTo(@30);
            }];
        }
    }
    return view1;
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    if (section == 0 || section == 1) {
        UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 0)];
        return view;
    }
    UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 20)];
    return view1;
}


- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    if (scrollView.contentOffset.y > self.mainview.tableView.contentSize.height - self.view.bounds.size.height + 50) {
        self.activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame: CGRectMake(self.view.bounds.size.width / 2 - 50, self.view.bounds.size.height - 100, 80, 80)] ;
        [self.view addSubview:self.activityIndicator];
        [self.activityIndicator startAnimating];
        beforeManager *beforemanager = [beforeManager sharedBeforeManager];
        NSInteger strInt = [self.mainModel.date longLongValue];
        NSString *str = [NSString stringWithFormat:@"%ld", strInt - numberOfCell];
        beforemanager.timeStr = str;
        [beforemanager NetWorkWithBeforeData:^(beforeModel * _Nonnull beforeModel) {
            [self.beforeArray addObject:beforeModel.stories];
            [self.beforeTimeArray addObject:beforeModel.date];
            numberOfCell++;
            dispatch_async(dispatch_get_main_queue(), ^{
                sleep(1);
                [self.activityIndicator stopAnimating];
                [self.mainview.tableView reloadData];
            });

        } error:^(NSError * _Nonnull error) {
            NSLog(@"ERROE");
        }];
    }
}

点击单元格事件

  • 点击单元格后,要求是要实现页面间可以滑动,因此,对于顶部的无限轮播图,我将轮播的图片设为button,并为每个button设置tag值,点击button后,每个button的section就是它的button。然后跳转到neiRongViewController,显示的neiRongView中有一个scrollView,该scrollView的画布宽度对于顶部的轮播图来说是5 * 屏幕宽度,对于tableView中的内容来说就是所有cell数量 * 屏幕宽度。对于cell中的内容,我先将每组的Manager获取的stories放在同一个数组中,然后传入点击的cell的((int)indexPath.section - 1) * 5 + (int)indexPath.row作为其section,然后在neiRongViewController中通过section为下标来访问数组元素从而获取当前内容的url,再通过WKWebView获取网页并将其放在scrollView中,而且要根据section放在scrollView中的对应位置。
  • 同时要实现scrollView的协议方法- (void)scrollViewDidScroll:(UIScrollView *)scrollView,获取滑动滚动视图后的偏移位置,并将其作为新的section,同时调用相应方法重新获取新section的webView。要注意的是因为有些视图加载过了,再往回划的时候就要让它不要再加载一遍了,所以我使用了一个set集合,每当访问过一个section后就将当前的section加入set中,再一次调用webView方法时判断set中是否有当前元素。
  • 代码实现:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSArray *allNeiRongArr = [[NSArray alloc] init];
    allNeiRongArr = [allNeiRongArr arrayByAddingObjectsFromArray:self.mainModel.stories];
    for (int i = 0; i < numberOfCell; i++) {
        allNeiRongArr = [allNeiRongArr arrayByAddingObjectsFromArray:self.beforeArray[i]];
    }
    if (indexPath.section != 0) {
        neiRongViewController *neiRong = [[neiRongViewController alloc] init];
        neiRong.theStories = allNeiRongArr;
        neiRong.isButton = NO;
        neiRong.allIndexNum = (1 + numberOfCell) * 5;
        neiRong.section = ((int)indexPath.section - 1) * 5 + (int)indexPath.row;
        [self.navigationController pushViewController:neiRong animated:YES];
    }
}
- (void)webViewGet {
    [self.set addObject:[NSString stringWithFormat:@"%d", self.section]];
    self.wkwebView = [[WKWebView alloc] initWithFrame:self.view.bounds];
    self.wkwebView.navigationDelegate = self;
    if (self.isButton == YES) {
        top_storiesModel *top_stories = [[top_storiesModel alloc] init];
        top_stories = self.theStories[self.section];
        NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@", top_stories.url]];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        [self.wkwebView loadRequest:request];
    } else if (self.section < 5){
        storiesModel *today_stories = [[storiesModel alloc] init];
        today_stories = self.theStories[self.section];
        NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@", today_stories.url]];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        [self.wkwebView loadRequest:request];
    } else if (self.section >= 5) {
        beforeStoriesModel *before_stories = [[beforeStoriesModel alloc] init];
        before_stories = self.theStories[self.section];
        NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@", before_stories.url]];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        [self.wkwebView loadRequest:request];
    }
    [self.activityIndicator stopAnimating];
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    int index = scrollView.contentOffset.x / self.view.bounds.size.width;
    NSLog(@"index :%d", index);
    self.section = index;
    if (![self.set containsObject: [NSString stringWithFormat:@"%d", self.section]]) {
        [self webViewGet];
        self.activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame: CGRectMake(self.view.bounds.size.width / 2 - 50, self.view.bounds.size.height/2 - 50, 80, 80)] ;
        [self.view addSubview:self.activityIndicator];
        [self.activityIndicator startAnimating];
    }
    self.idStr = [self.theStories[self.section] ID];
    [self getData];

}

加载控件(小菊花)

首先要定义一个UIActivityIndicatorView属性,方便我们在任何地方可以关掉该控件

//初始化该控件并设置位置
self.activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame: CGRectMake(self.view.bounds.size.width / 2 - 50, self.view.bounds.size.height - 100, 80, 80)] ;
[self.view addSubview:self.activityIndicator];
//开启加载控件
[self.activityIndicator startAnimating];
//结束该控件
[self.activityIndicator stopAnimating];

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

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

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

相关文章

3.7 移动端TB(D)R架构基础

一、各类电子设备功耗对比 桌面级主流性能平台&#xff0c;功耗一般为300W&#xff08;R7/I7X60级别显卡&#xff09;&#xff0c;游戏主机150-200W入门和旗舰游戏本平台功耗为100W主流笔记本为50-60W&#xff0c;超极本为15-25W&#xff0c;旗舰平板为8-15W旗舰手机为5-8W&am…

《python语言程序设计》(2018版)第5章编程题 第41题第3次路过。总结一下。没有走完的路

这道题最大的需要就是能够进行两个数值的对比&#xff0c;同时还能让更多的数值依次进入到对比中。 这道题的解题版本 这个版本只是能统计出谁是最大数。但是无法统计最大数出现了多少次。 number "" count 0 data_number 0 while number ! 0:number eval(inpu…

No172.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

MinIO安装

Minio是一个开源的分布式对象存储服务器&#xff0c;它兼容Amazon S3服务接口。它可以用于构建私有云存储&#xff0c;为应用程序提供可扩展的对象存储功能。 安装 docker安装 docker run -d -p 9000:9000 -p 50000:50000 --name minio \ -e "MINIO_ROOT_USERadminpili…

泰州市旅游景点门票预订管理系统 vue+uniapp微信小程序

本文从管理员、用户的功能要求出发&#xff0c;泰州市旅游景点管理小程序中的功能模块主要是实现用户、景点类型、景区信息、门票预定。经过认真细致的研究&#xff0c;精心准备和规划&#xff0c;最后测试成功&#xff0c;系统可以正常使用。分析功能调整与泰州市旅游景点管理…

Leetcode—275.H指数II【中等】

2023每日刷题&#xff08;十三&#xff09; Leetcode—275.H指数II 算法思想 实现代码 int minValue(int a, int b) {return a < b ? a : b; }int hIndex(int* citations, int citationsSize){int left, right;left 0;right citationsSize - 1;while(left < right) …

AD教程(一)工程组成及创建

AD教程&#xff08;一&#xff09;工程组成及创建 工程组成 原理图库 绘制电阻模型、芯片模型、电容模型等&#xff0c;即将元件模型绘制出来。 原理图 将绘制的原件模型放置到原理图中&#xff0c;然后再添加连接的导线、网络标号。器件和器件之间的连接关系&#xff0c;在原…

粤嵌实训医疗项目--day04(Vue + SpringBoot)

往期回顾 粤嵌实训医疗项目--day03&#xff08;Vue SpringBoot&#xff09;-CSDN博客粤嵌实训医疗项目day02&#xff08;Vue SpringBoot&#xff09;-CSDN博客粤嵌实训医疗项目--day01&#xff08;VueSpringBoot&#xff09;-CSDN博客 目录 一、用户详细信息查询 (查询信息与…

业务设计——用户敏感信息展示脱敏及其反脱敏

业务需求 将用户敏感信息脱敏展示到前端是出于保护用户隐私和信息安全的考虑。 敏感信息包括但不限于手机号码、身份证号、银行卡号等&#xff0c;这些信息泄露可能导致用户个人信息的滥用、身份盗用等严重问题。脱敏是一种常用的保护用户隐私的方式&#xff0c;它的目的是减少…

华为云资源搭建过程

网络搭建 EIP&#xff1a; 弹性EIP&#xff0c;支持IPv4和IPv6。 弹性公网IP&#xff08;Elastic IP&#xff09;提供独立的公网IP资源&#xff0c;包括公网IP地址与公网出口带宽服务。可以与弹性云服务器、裸金属服务器、虚拟IP、弹性负载均衡、NAT网关等资源灵活地绑定及解绑…

FL Studio21.2.0.3421最新汉化破解版中文解锁下载完整版本

音乐在人们心中的地位日益增高&#xff0c;近几年音乐选秀的节目更是层出不穷&#xff0c;喜爱音乐&#xff0c;创作音乐的朋友们也是越来越多&#xff0c;音乐的类型有很多&#xff0c;好比古典&#xff0c;流行&#xff0c;摇滚等等。对新手友好程度基本上在首位&#xff0c;…

Affinity Photo 2.2.1 高端专业Mac PS修图软件

Affinity Photo Mac中文版是一款面向专业摄影师和其他视觉艺术家的专业图像处理软件&#xff0c;拥有众多专业高端功能&#xff0c;如Raw处理、PSD导入和导出、16位通道的编辑和ICC色彩管理以及兼容大量图片格式。是现在最快、最顺、最精准的专业修图软件。Affinity Photo Mac是…

微信小程序vue+uniapp旅游景点门票预订系统 名胜风景推荐系统

与此同时越来越多的旅游公司建立了自己的基于微信小程序的名胜风景推荐平台&#xff0c;管理员通过网站可以添加用户、景点分类、景点信息、在线预订、最新推荐&#xff0c;用户可以对景点信息进行在线预订&#xff0c;以及开展电子商务等。互联网的世界里蕴藏无限生机&#xf…

calloc、malloc、realloc函数的区别及用法

三者都是分配内存&#xff0c;都是stdlib.h库里的函数&#xff0c;但是也存在一些差异。 &#xff08;1&#xff09;malloc函数。其原型void *malloc(unsigned int num_bytes)&#xff1b; num_byte为要申请的空间大小&#xff0c;需要我们手动的去计算&#xff0c;如int *p …

VBA还能这么玩?Word文档一秒自动排版

Hello,各位小伙伴们大家好呀,真的是好久不见了。旅行者1号也才用20个小时回传数据到地球。距离 Yogurt 上次正儿八经的教程推文已经快 700 天了,时间过得真快呀,感谢各位的不离不弃。 这两天群里比较活跃,便上去看看发生了啥事儿,不看不知道,一看,这推文的素材不就来…

「实验记录」CS144 Lab0 networking warmup

文章目录 一、Motivation二、SolutionsS1 - Writing webgetS2 - An in-memory reliable byte stream 三、Results四、Source 一、Motivation 第一个小测试 webget 是想让我们体验并模拟一下在浏览器中键入 URL 后获得远程服务器传来的内容&#xff0c;这并没有太大的难度&…

Spring cloud教程Gateway服务网关

Spring cloud教程|Gateway服务网关 写在前面的话&#xff1a; 本笔记在参考网上视频以及博客的基础上&#xff0c;只做个人学习笔记&#xff0c;如有侵权&#xff0c;请联系删除&#xff0c;谢谢&#xff01; Spring Cloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;…

数字频带传输——二进制数字调制及MATLAB仿真

文章目录 前言一、OOK1、表达式2、功率谱密度3、调制框图 二、2PSK1、表达式2、功率谱密度 三、2FSK1、表达式 四、MATLAB 仿真1、MATLAB 源码2、仿真及结果①、输入信号及频谱图②、2ASK 调制③、2PSK 调制④、2FSK 调制⑤、随机相位 2FSK 调制 五、资源自取 前言 数字频带信…

LightGBM 的完整解释 - 最快的梯度提升模型

文章最前&#xff1a; 我是Octopus&#xff0c;这个名字来源于我的中文名--章鱼&#xff1b;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github &#xff1b;这博客是记录我学习的点点滴滴&#xff0c;如果您对 Python、Java、AI、算法有兴趣&#xff0c;可以关注我的…

磁盘管理(初始化,引导块,坏块管理,固态硬盘)

目录 1.磁盘初始化2.引导块3.坏块的管理1.坏块检查2.坏块链表3.扇区备用 4.固态硬盘&#xff08;SSD&#xff09;1.原理2.组成3.读写性能特性4.与机械硬盘相比5.磨损均衡技术 1.磁盘初始化 ①进行低级格式化&#xff08;物理格式化&#xff09;&#xff0c;将磁盘的各个磁道划分…