【移动端开发】“明日头条APP”

文章目录

  • 1 系统概述
    • 1.1研究背景
    • 1.2研究意义
  • 2 系统设计
    • 2.1 关键技术
    • 2.2 系统设计
      • 2.2.1 系统功能模块
      • 2.2.2 数据库设计
  • 3 系统实现
    • 3.1 数据模型
      • 3.1.1 NewsURL
      • 3.1.2 NewsType
      • 3.1.3 NewsInfo
    • 3.2 数据库操作
      • 3.2.1 DBOpenHelper
      • 3.2.2 DBManager
    • 3.3 适配器类
      • 3.3.1 AddItem
      • 3.3.2 InfoItem
      • 3.3.3 NewsInfo
    • 3.4 Activity模块
      • 3.4.1 MainActivity
      • 3.4.2 DescActivity
      • 3.4.3 AddItemActivity
      • 3.4.4 配置类UniteApp
    • 3.5 程序运行总体思路
  • 4 系统测试
  • 5 设计总结

1 系统概述

1.1研究背景

随着移动互联网的快速发展,智能手机已经成为人们获取信息的主要工具之一。新闻作为信息的重要组成部分,其传播方式和获取途径也发生了显著变化。传统的纸质媒体逐渐被网络媒体所取代,用户能够通过各种应用程序实时获取最新的新闻动态。 在这种背景下,各类新闻客户端应运而生,它们提供了便捷的新闻获取渠道。然而,众多新闻客户端在内容、形式和用户体验上各有差异,如何设计一款功能完善、易于操作且能满足用户需求的新闻客户端APP,成为了一个值得研究的课题。本课程设计旨在通过分析现有新闻客户端的特点,结合网络爬虫技术,实现一款基于Android平台的新闻客户端APP,以解决用户在获取新闻时的信息碎片化问题,提高新闻信息的获取效率。

1.2研究意义

通过使用网络爬虫技术,能够有效地获取和整合来自不同新闻源的信息,将原本分散的新闻内容进行归纳和分类。这一过程不仅提升了对数据处理能力的认识,也为学习和掌握现代计算机科学中的数据挖掘和信息检索等技术提供了机会。 随着社会信息的高速传播,大量用户需要一个集成化的新闻平台以便于获取即时信息。本项目的实现可以帮助用户更方便地浏览新闻、获取知识、拓宽视野,并为开发者创造新的市场机会,提升其在新闻行业的竞争力。 新闻是推动社会进步的重要力量,一个优秀的新闻客户端不仅能够提高公众获取信息的效率,还有助于提升公民的新闻素养和社会责任感。在信息爆炸的时代,为用户提供准确、及时、有价值的新闻信息,有助于构建良好的社会舆论环境,促进社会的和谐发展。

2 系统设计

2.1 关键技术

在这里插入图片描述

2.2 系统设计

2.2.1 系统功能模块

在这里插入图片描述

模块功能说明

在这里插入图片描述

2.2.2 数据库设计

在这里插入图片描述

3 系统实现

3.1 数据模型

3.1.1 NewsURL

管理和构建不同类型新闻的 API 请求 URL

public class NewsURL {
// 用于存储访问新闻 API 所需的 APP KEY
public static String key = "065405525167d8e51990614a378fe7af";  // api - key
public static String info_url = "http://v.juhe.cn/toutiao/index?key="+ key + "&type=";
// 头条
public static String headline_url = info_url + "top";
// 社会
public static String society_url = info_url + "shehui";
}

3.1.2 NewsType

封装与新闻类型相关的信息, 实现了 Serializable 接口以便于在对象序列化时使用, 比如在 Android 中通过 Intent 传递数据。提供了静态方法来获取所有新闻类型的集合,用于后续填充 UI 元素。

public class TypeBean implements Serializable{
    private int id;
    private String title;
    private String url;
    private boolean isShow;

    public static List<TypeBean> getTypeList(){
        List<TypeBean> mDatas = new ArrayList<>();

        TypeBean tb1 = new TypeBean(1, "头条", NewsURL.headline_url, true);
        TypeBean tb2 = new TypeBean(2, "社会", NewsURL.society_url, true);
        mDatas.add(tb1);
        mDatas.add(tb2);
        return mDatas;
    }
}

3.1.3 NewsInfo

封装从新闻 API 返回的新闻信息,使用嵌套类结构来组织数据。根据API获取到的JSON格式数据编写代码。爬虫获得的JSON数据如下:

{
    "reason": "success!",
    "result": {
        "stat": "1",
        "data": [
            {
                "uniquekey": "564cdaad64ae35f817f92c83d7874753",
                "title": "开展“净网2024”专项行动 厦门警方侦破一起广告推广型网络黑灰产犯罪案",
                "date": "2024-09-18 13:57:00",
                "category": "头条",
                "author_name": "人民网,供稿:人民资讯",
                "url": "https://mini.eastday.com/mobile/240918135748337907540.html",
                "thumbnail_pic_s": "",
                "is_content": "1"
            }
        ],
        "page": "1",
        "pageSize": "30"
    },
    "error_code": 0
}

新闻信息封装类:

public class InfoBean {
    private String reason;
    private ResultBean result;
    private int error_code;

    public static class ResultBean {
        private String stat;
        private List<DataBean> data;

        public static class DataBean {
            private String uniquekey;
            private String title;
            private String date;
            private String category;
            private String author_name;
            private String url;
            private String thumbnail_pic_s;
            private String thumbnail_pic_s02;
            private String thumbnail_pic_s03;
         }
    }
}

3.2 数据库操作

3.2.1 DBOpenHelper

DBOpenHelper是用于创建和管理 SQLite 数据库的子类,负责创建和初始化 SQLite 数据库,定义表结构和插入初始数据。在数据库版本升级时进行表结构更新或数据迁移。

// 创建和管理 SQLite 数据库的子类
public class DBOpenHelper extends SQLiteOpenHelper{
    public DBOpenHelper(Context context) {
        // 指定数据库名称为 "info.db" 版本号为 1
        super(context, "info.db", null, 1);
    }

    /*
    create table itype(
             id integer primary key,shujus
             title varchar(10) unique not null,
             url text not null,
             isshow varchar(10) not null
    );
    */
    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "create table itype(id integer primary key,title varchar(10) unique not null,url text not null,isshow varchar(10) not null)";
        db.execSQL(sql);

        String insertSql = "insert into itype values(?,?,?,?)";
        db.execSQL(insertSql,new Object[]{1,"头条", NewsURL.headline_url,"true"});
        db.execSQL(insertSql,new Object[]{2,"社会",NewsURL.society_url,"true"});
    }

    // 在数据库版本升级时进行表结构更新或数据迁移
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

3.2.2 DBManager

封装对 SQLite 数据库的操作。提供初始化数据库、查询数据和更新数据的方法。

public static SQLiteDatabase database; // 保存数据库的可写实例

    // 创建一个 DBOpenHelper 实例并获取一个可写的数据库对象
    public static void initDB(Context context) {
        DBOpenHelper helper = new DBOpenHelper(context);
        database = helper.getWritableDatabase();
    }

    // 从 SQLite 数据库中查询所有的类型数据并将其转化为一个 TypeBean 对象列表
    public static List<TypeBean> getAllTypeList() {
    }

    // 获取所有要求显示的内容的集合
    public static List<TypeBean> getSelectedTypeList() {
    }

    // 根据输入的 typeList 更新数据库中的isshow字段
    public static void updateTypeList(List<TypeBean> typeList) {
    }
}

3.3 适配器类

3.3.1 AddItem

展示新闻类别的列表,结合类型数据和 UI 元素(文本和图像)。根据 TypeBean 中的 isShow来决定图标的显示状态。如果用户点击某一项,该项的状态将被切换,并相应更新图标。点击事件通过匿名内部类实现,允许动态更新 UI。

在这里插入图片描述

// 添加新闻类别的窗口 xml:文本 + 对号

// 自定义适配器类public class AddItemAdapter extends BaseAdapter {
    // 上下文对象,用于获取资源和服务
    Context context;
    // 数据源,存储 TypeBean 对象的列表
    List<TypeBean> mDatas;
    // 创建视图并绑定数据
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // 使用 LayoutInflater 加载自定义布局文件 item_add_lv
        convertView = LayoutInflater.from(context).inflate(R.layout.item_add_lv, null);
        // 初始化convertview中的控件
        TextView nameTv = convertView.findViewById(R.id.item_add_tv); // 获取文本视图
        final ImageView iv = convertView.findViewById(R.id.item_add_iv); // 获取图片视图
        // 获取指定位置的 TypeBean 对象
        final TypeBean typeBean = mDatas.get(position);
        // 设置文本视图的内容为 TypeBean 的标题
        nameTv.setText(typeBean.getTitle());
        // 根据 TypeBean 的 show 状态设置图片视图的资源
        // 为了避免用户全都不选中的情况,不符合新闻的展示习惯,所以前两个项必须展示
        if (position == 0 || position == 1) {
            iv.setVisibility(View.INVISIBLE); // 隐藏前两个项的勾选框
        } else {
            iv.setVisibility(View.VISIBLE); // 显示其他项的勾选框
            // 设置点击事件监听器
            convertView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 切换选中状态
                    // 更新图片视图的资源
             }
            });
        }
        // 返回当前视图
        return convertView;
    }
}

3.3.2 InfoItem

展示新闻数据的列表项,将 InfoBean.ResultBean.DataBean 类型的数据渲染成特定的布局形式。通过内部类 ViewHolder 缓存视图组件的引用,减少性能损耗。通过 ImageLoader 来异步加载网络图片,并显示在对应的 ImageView 中,考虑图片加载失败和 URI 无效的情况。根据每个 DataBean 实例中的图片地址决定是否显示对应的 ImageView。

在这里插入图片描述

// 处理新闻数据DataBean 将这些数据以自定义的布局形式展示
public class InfoItemAdapter extends BaseAdapter {
    Context context; // 当前应用的上下文
    List<InfoBean.ResultBean.DataBean> mDatas; // 新闻正文内容
    ImageLoader imageLoader; // 异步加载和缓存图片
    DisplayImageOptions options;   // 图片加载配置信息
    public InfoItemAdapter(Context context, List<InfoBean.ResultBean.DataBean> mDatas) {
        this.context = context;
        this.mDatas = mDatas;
        imageLoader = ImageLoader.getInstance();
        options = new DisplayImageOptions.Builder();
    }
    // 创建或重用视图来展示数据
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // 在列表项第一次被创建时找到所有的视图元素并存储在 ViewHolder 对象中
        // 在后续的显示或重用过程中直接使用这些已存储的引用 避免重复的 findViewById 调用
        class ViewHolder {
            TextView titleTv, sourceTv, timeTv; // 新闻标题 新闻来源 发布时间
            ImageView iv1, iv2, iv3; // 新闻图片缩略图
            public ViewHolder(View view) {
       	    }
        }
        ViewHolder holder = null;
        // 1. 没有可复用的视图
        if (convertView == null) {
            // 2. 将自定义的布局文件R.layout.item_newsfrag_lv转换成新的视图
            convertView = LayoutInflater.from(context).inflate(R.layout.item_newsfrag_lv, null);
            // 初始化ViewHolder对象来持有视图的子视图引用
            holder = new ViewHolder(convertView);
            // 将ViewHolder对象作为标签(tag)存储在convertView上 以便后续复用
            convertView.setTag(holder);
            // 3. 有可复用的视图
        } else {
            // 直接从视图的标签中获取ViewHolder对象
            holder = (ViewHolder) convertView.getTag();
        }
        // 获取指定位置的数据源
        // 获取三张图片的地址

        return convertView;
    }
}

3.3.3 NewsInfo

管理ViewPager 的多个片段。FragmentStatePagerAdapter该适配器可以动态加载和释放 Fragments, 在 Fragment 不可见时销毁它们以节省内存。重写 getItemPosition 方法使得对数据集的任何更改都能立即反映到 ViewPager 中。getPageTitle为每个页面提供对应的标题。

在这里插入图片描述

// 扩展了 FragmentStatePagerAdapter 来管理 ViewPager 中的多个片段(Fragments)
// 支持在 ViewPager 中动态加载和释放 Fragment
public class NewsInfoAdapter extends FragmentStatePagerAdapter {
    Context context;
    List<Fragment> fragmentList;
    List<TypeBean> typeBeanList;
    // 指示所有页面都可能改变 Fragment 将在数据集更改时被重新创建
    @Override
    public int getItemPosition(@NonNull Object object) {
        return PagerAdapter.POSITION_NONE;
    }   
    // 返回指定位置的标题
    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        TypeBean typeBean = typeBeanList.get(position);
        String title = typeBean.getTitle();
        return title;
    }
}

3.4 Activity模块

3.4.1 MainActivity

显示一个包含多个页面的 ViewPager,用户通过标签条切换不同的页面, 点击添加按钮跳转到一个新的活动来添加新闻类别。初始化界面元素和适配器,获取布局中的视图控件,设置点击事件监听器,初始化片段并设置适配器给 ViewPager,关联 tabStrip 和 ViewPager,使得用户滑动时标签会自动更新。加载用户选择的类型列表,创建对应的 NewsInfoFragment 实例,并将其加入到 fragmentList 中。每个 Fragment 通过 Bundle 接收参数,以便能够根据类型显示不同的信息。当用户点击添加按钮时,启动 AddItemActivity。当 Activity 从停止状态重新启动时,清空之前的数据,重新加载最新的类型信息,更新适配器和标签条。

在这里插入图片描述

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    ViewPager mainViewPager; //显示多个页面的视图
    PagerSlidingTabStrip tabStrip;//用户界面中的标签条,用于导航
    ImageView addIv;//用于添加项目的图标
    List<Fragment> fragmentList;  // 存储所有要在 ViewPager 中显示的 Fragment
    List<TypeBean> selectTypeList;  // 存储 用户选择的类型列表
    private NewsInfoAdapter adapter;// 设置 ViewPager 内容的适配器
    public void init() {
        addIv.setOnClickListener(this);  //添加点击事件的监听
        fragmentList = new ArrayList<>();
        selectTypeList = new ArrayList<>();
        // 初始化页面
        initPager();
        // 创建适配器对象
        // getSupportFragmentManager():获取支持库中的 Fragment 管理器 允许在 Fragment 中进行操作 比如添加、替换或移除
        adapter = new NewsInfoAdapter(getSupportFragmentManager(), this, fragmentList, selectTypeList);
        // 设置适配器
        // 使得ViewPager知道如何 获取和显示与之相关联的Fragment
        // 适配器负责创建和管理Fragment 向ViewPager提供它们
        mainViewPager.setAdapter(adapter);
        // 关联TabStrip和ViewPager
        // 当用户滑动ViewPager 选中的标签也会发生变化 使得用户可以通过点击标签条快速切换到相应的页面
        // tabStrip根据ViewPager中的Fragment数量动态生成对应的标签
        tabStrip.setViewPager(mainViewPager);
    }
    // 初始化页面的函数
    private void initPager() {
        // 1. 获取用户选择的类型列表
        List<TypeBean> typeList = DBManager.getSelectedTypeList();
        selectTypeList.addAll(typeList);
        for (int i = 0; i < selectTypeList.size(); i++) {
            // 2.1 为每个类型创建一个 NewsInfoFragment 实例
            // 2.2 将类型数据通过 Bundle 传递给 NewsInfoFragment实例 并添加到 fragmentList 中
            Bundle bundle = new Bundle();
            bundle.putSerializable("type", typeBean);
            infoFragment.setArguments(bundle);
            fragmentList.add(infoFragment);
        }
    }
    // 设置点击+号按钮后的操作 -- 跳转到添加类别新页面
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.main_iv_add:
                // 创建一个 Intent 从当前 MainActivity 跳转到 AddItemActivity(用于添加新闻类别)
                Intent intent = new Intent(MainActivity.this, AddItemActivity.class);
                startActivity(intent);
                break;
        }
    }
}

3.4.2 DescActivity

在一个 WebView 中加载和显示网页内容。初始化活动,设置布局 activity_desc。获取 WebView 组件。从 Intent 中提取 URL 字符串。设置 WebView 的各种属性,如启用 JavaScript、缓存方式等。加载指定的 URL。重写 shouldOverrideUrlLoading 方法,以确保所有链接都在同一个 WebView 内打开,而不是跳转到外部浏览器。当用户按下后退键时,如果 WebView 有历史记录,则调用 goBack() 返回上一个页面。如果没有历史记录,调用父类的方法处理其他按键。

在这里插入图片描述

// 在 WebView 中显示网页内容
public class DescActivity extends AppCompatActivity {
    WebView descWeb;
    String url;
    // 设置活动的布局 并获取意图数据中的 URL 用于加载网页
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        descWeb = findViewById(R.id.desc_webview);
        url = getIntent().getStringExtra("url");
        // 创建WebView设置类 对于属性进行设置: 启用 JavaScript、允许文件访问、设置缓存模式等
        WebSettings webSettings = descWeb.getSettings();
        webSettings.setJavaScriptEnabled(true);  //设置页面支持js交互
        webSettings.setUseWideViewPort(true);  //将图片调整到适合webview的大小
        // 设置要加载的网址
        descWeb.loadUrl(url);
        // 默认通过手机浏览器打开网址 为了能够直接通过webview打开网址 设置以下操作
        // 重写 shouldOverrideUrlLoading 方法以确保所有链接都在同一个 WebView 中打开 而不是使用外部浏览器
        descWeb.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                // 使用webview要加载的url
                view.loadUrl(url);
                return true;
            }
        });
    }
}

3.4.3 AddItemActivity

使用 ListView 展示从数据库中获取的项目类型。通过点击返回按钮,用户可以关闭当前活动并返回到之前的界面。在活动暂停时,更新数据库中的项目类型列表。

在这里插入图片描述

public class AddItemActivity extends AppCompatActivity implements View.OnClickListener {
    ImageView backIv;
    ListView addLv;
    // 数据源
    List<TypeBean> mDatas;
    private AddItemAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_item);
        // 查找控件
        backIv = findViewById(R.id.add_iv_back);
        addLv = findViewById(R.id.add_lv);
        backIv.setOnClickListener(this);
        mDatas = DBManager.getAllTypeList();
        // 创建适配器对象
        adapter = new AddItemAdapter(this, mDatas);
        // 设置适配器
        addLv.setAdapter(adapter);
    }
}

3.4.4 配置类UniteApp

UniteApp用于在应用程序启动时进行全局初始化操作。调用DBManager类的initDB方法进行数据库的初始化操作,在整个应用程序中共享数据库对象。创建一个Volley的请求队列httpQueue,调用initImageLoader方法初始化图片加载框架ImageLoader。创建一个ImageLoaderConfiguration对象,并对其进行配置,包括线程优先级、缓存策略等。调用ImageLoader.getInstance().init方法初始化ImageLoader。提供了静态方法getHttpQueue,用于获取全局的请求队列httpQueue。

3.5 程序运行总体思路

在这里插入图片描述

4 系统测试

图4.1 APP图标
在这里插入图片描述

图4.2 主界面

在这里插入图片描述

图4.3 点击新闻
在这里插入图片描述

图4.4 点击添加按钮
在这里插入图片描述

图4.5 选中新增新闻类别
在这里插入图片描述

图4.6 标签条同步更新
在这里插入图片描述

5 设计总结

在这个开发过程中我根据老师上课讲到的网络爬虫,先行创建了一个测试网络爬虫程序,但是一直报错,提示API次数不够,我在网上搜索了很多文章,终于成功申请了API。但是程序仍然无法运行成功,但是直接通过浏览器却可以获得爬虫数据,搜了很多视频,原来是要重新安装该应用才可以。之后我又通过B站视频学习安卓开使用接SQLite数据库,学习在Android Stdio中使用数据库接口进行数据库编程。对我来说最困难的是整个项目的前期思路构建,一方面是对移动开发的知识遗忘很多,一方面是第一次自己编写大项目。我花了一个星期重新把课件看了一遍,大致了解了Activity,Intent,适配器,Service,网络编程的内容。然后我开始构建思路,我先是把主要的三个界面设计出来,主界面,显示新闻的界面,支持添加新闻类别的界面,对于怎么填充界面,我用到了适配器,将从数据库或网络中的数据根据界面格式显示在布局上。在网络编程中,我搜了很多文章看了很多视频,最终选择只用Volley进行网络请求。在设计数据模型时,我根据老师讲的和课件,抽象出三个数据实体,放在Bean文件夹。另一个,让我困扰好几天的是解析网络爬虫获得的JSON数据,我同样是搜文章搜视频,最后通过AI帮忙解决了这个问题,同时我也觉得AI的设计很有道理,把JSON响应抽象出内部类,和HTTP响应一一对应。同时我认为这个项目我做的并不是很好,在主界面显示新闻简要使用RecycleView会更好,因为涉及到数据量大的时候,RecycleView性能和灵活性都更好。以及在数据库操作时,cursor使用完要关闭,但是我关闭后一直报错,不关闭虽然浪费了资源但是程序可以完整成功的运行,搜了很多文章仍没法解决,不过像这种小型程序,cursor占的资源也无伤大雅。在数据库操作时,由于影响记录条数少,并没有使用事务,不过为了提高代码健壮性,之后我应该使用事务保证数据一致性。其次我认为在编写项目时,为一些条件代码加异常,加调试信息,真是太重要了,并且要写一部分代码就调试,我总是写了很多代码再调,而且也没有详细的调试信息,导致开发进度十分缓慢,每次遇到bug就得停滞很久。不过通过这次编写项目,我对logcat这只小猫的使用理解已经更进一步。总的来说,这次项目开发还算可以,我主要复习掌握了布局设计,ListView,ImagheView,Activity,Intent,适配器,网络编程,数据库操作等知识,更重要的,自己把这些知识串起来,运用到了项目中,成功搭建了类似于今日头条的“明日头条”。同时,我也认识到持续学习和改进的重要性,以便更好地应对未来的挑战。在今后的学习中,我将继续积累经验,完善自己的开发技能。

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

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

相关文章

Redhat 7,8,9系(复刻系列) 一键部署Oracle19c rpm

Oracle19c前言 Oracle 19c 是甲骨文公司推出的一款企业级关系数据库管理系统,它带来了许多新的功能和改进,使得数据库管理更加高效、安全和可靠。以下是关于 Oracle 19c 的详细介绍: 主要新特性 多租户架构:支持多租户架构,允许多个独立的数据库实例在同一个物理服务器上…

【机器学习】9 ——最大熵模型的直观理解

机器学习9 ——最大熵模型的直观理解 文章目录 机器学习9 ——最大熵模型的直观理解前奏例子硬币垃圾邮件代码 前奏 【机器学习】6 ——最大熵模型 例子 硬币 假设我们有一枚硬币&#xff0c;可能是公平的&#xff0c;也可能是不公平的。我们的任务是估计硬币的正反面出现的…

通过Python代码发送量化交易信号邮件通知

量化交易利用数学模型和计算机算法来分析市场数据,并生成交易信号,本文将介绍如何使用Python编写一个简单的脚本,通过发送邮件通知量化交易信号。 开启SMTP服务 首先要在发件箱的邮件设置中,将POP3/SMPT服务开启,记录下授权密码,在本地可通过此密码登录,注意有效期和保…

微信小程序页面制作——婚礼邀请函(含代码)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

【网络】TCP/IP 五层网络模型:网络层

最核心的就是 IP 协议&#xff0c;是一个相当复杂的协议 TCP 详细展开讲解&#xff0c;是因为 TCP 确实在开发中非常关键&#xff0c;经常用到&#xff0c;IP 则不同&#xff0c;和普通程序猿联系比较浅。和专门开发网络的程序猿联系比较紧密&#xff08;开发路由器&#xff0…

3款免费的GPT类工具

前言 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;的崛起与发展已经成为我们生活中不可或缺的一部分。它的出现彻底改变了我们与世界互动的方式&#xff0c;并为各行各业带来了前所未有的便利。 一、Kimi 网址&#xff1a;点我前往 国产AI模型Kimi是一…

neo4j安装启动教程+对应的jdk配置

参考这位博主的视频教程&#xff1a;neo4j社区windows版下载 一、官网下载neo4j的安装包 &#xff08;1&#xff09;官网下载页面 &#xff08;2&#xff09;上一步 【download】之后&#xff0c;会自动下载&#xff0c;如果没有&#xff0c;点击【here】 这里可以看到一行字…

Qwen 2.5:阿里巴巴集团的新一代大型语言模型

Qwen 2.5&#xff1a;阿里巴巴集团的新一代大型语言模型 摘要&#xff1a; 在人工智能领域&#xff0c;大型语言模型&#xff08;LLMs&#xff09;的发展日新月异&#xff0c;它们在自然语言处理&#xff08;NLP&#xff09;和多模态任务中扮演着越来越重要的角色。阿里巴巴集…

获取参数

获取querystring参数 querystring 指的是URL中 ? 后面携带的参数&#xff0c;例如&#xff1a;http://127.0.0.1:9090/web?query杨超越。 获取请求的querystring参数的方法如下&#xff1a; 方法1&#xff1a; Query package main// querystringimport ("github.com/…

有毒有害气体检测仪的应用和性能_鼎跃安全

随着现代工业的不断发展和扩张&#xff0c;越来越多的企业涉及到有毒有害气体的生产、使用和处理。工业规模的扩大导致有毒有害气体的排放量增加&#xff0c;同时也增加了气体泄漏的风险。在发生火灾、爆炸或危险化学品泄漏等紧急事件时&#xff0c;救援人员需要迅速了解现场的…

python+flask+mongodb+vue撸一个实时监控linux服务资源的网站

用pythonflaskmongodbvue写一个监控linux服务资源实时使用率的页面网站&#xff0c;并每30秒定时请求&#xff0c;把Linux数据保存数据到mongodb数据库中&#xff0c;监控的linux的资源有&#xff1a;cup、内存、网络带宽、mysql慢查询、redis、系统平均负载、磁盘使用率等&…

百度Android IM SDK组件能力建设及应用

作者 | 星途 导读 移动互联网时代&#xff0c;随着社交媒体、移动支付、线上购物等行业的快速发展&#xff0c;对即时通讯功能的需求不断增加。对于各APP而言&#xff0c;接入IM SDK&#xff08;即时通讯软件开发工具包&#xff09;能够大大降低开发成本、提高开发效率&#…

动手学习RAG:大模型重排模型 bge-reranker-v2-gemma微调

动手学习RAG: 向量模型动手学习RAG: moka-ai/m3e 模型微调deepspeed与对比学习动手学习RAG&#xff1a;rerank模型微调实践 bge-reranker-v2-m3动手学习RAG&#xff1a;迟交互模型colbert微调实践 bge-m3动手学习RAG: 大模型向量模型微调 intfloat/e5-mistral-7b-instruct动手学…

Leetcode Hot 100刷题记录 -Day14(矩阵置0)

矩阵置0 问题描述&#xff1a; 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&#xff1a;…

模版进阶(template)

1.非类型模版参数 模版参数分类类型形参与非类型形参。 ① 类型形参&#xff1a;出现在在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 ② 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中可将该参数当…

鸿蒙Harmony应用开发,数据驾驶舱登录页面的实现

鸿蒙Harmony应用开发&#xff0c;数据驾驶舱登录页面的实现 ​ 首先我们有个Splash 过渡页面来判断当前是用户是否登录&#xff0c;我们先从preferences中获取token是否存在。如果不存在直接跳转登录即可&#xff0c;如果存在的情况我们再去获取下用户的信息看看token是否过期…

【leetcode】树形结构习题

二叉树的前序遍历 返回结果&#xff1a;[‘1’, ‘2’, ‘4’, ‘5’, ‘3’, ‘6’, ‘7’] 144.二叉树的前序遍历 - 迭代算法 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,…

[数据集][目标检测]智慧养殖场肉鸡目标检测数据集VOC+YOLO格式3548张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3548 标注数量(xml文件个数)&#xff1a;3548 标注数量(txt文件个数)&#xff1a;3548 标注…

MacOS安装homebrew,jEnv,多版本JDK

1 安装homebrew homebrew官网 根据官网提示&#xff0c;运行安装命令 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"安装后&#xff0c;bash会提示执行两条命令 (echo; echo eval "$(/opt/homebrew/b…

VirtualBox增加磁盘并给docker用

在VirtualBox新增磁盘 在虚拟机停止的情况下依次选择&#xff0c;然后创建新磁盘 虚拟机新磁盘创建分区、格式化、挂载分区 开机自动挂载新磁盘分区/dev/sdb1&#xff1a; nano /etc/fstab末尾添加一行&#xff1a; /dev/sdb1 /disk02 e…