浏览器书签智能分类

浏览器书签智能分类工具

最近发现浏览器的书签越来越乱了,主要是因为自己太懒,其次之前建的分类太多又乱,重新手动整理确实比较烦。因此有了这个小项目。借助智谱AI的力量对书签进行重新分类。

项目简介

本工具用于自动整理浏览器书签,通过AI智能分类技术,将杂乱的书签按照主题自动归类,并且重新生成结构化的书签文件。

功能特性

  • 自动提取书签信息
  • 智能分类书签内容
  • 分类智能生成
  • 生成HTML格式书签文件,可直接导入浏览器
  • 自动清理临时文件

使用说明

准备工作

  1. 获取智谱AI API密钥
  2. 准备浏览器导出的书签HTML文件

快速开始

  1. 下载脚本
  2. 修改CONFIG配置中的INPUT_FILEOUTPUT_FILE
  3. 修改CONFIG配置中的API_KEY
  4. 运行脚本:
    python 浏览器书签文件重新分类.py
    
  5. 查看生成的分类结果文件bookmarks.html

配置文件说明

在脚本开头的CONFIG字典中可配置以下参数:

  • API_KEY: 智谱AI API密钥(必填)
  • INPUT_FILE: 输入的书签HTML文件路径
  • EXTRACTED_FILE: 提取的临时文件路径
  • CLASSIFIED_FILE: 分类结果Markdown文件路径
  • OUTPUT_FILE: 最终输出的HTML书签文件路径
  • DEFAULT_CATEGORIES: 默认分类列表

代码结构

# 主要功能模块
1. 配置参数 (CONFIG)
2. AI客户端初始化 (zhipu_client)
3. 书签提取 (extract_bookmark_info)
4. 书签分类 (classify_bookmark)
5. 分类创建 (create_new_category)
6. 格式转换 (md_to_netscape)
7. 文件清理 (cleanup_temp_files)

脚本代码详细说明

浏览器书签文件重新分类脚本详细说明

1. 配置参数
CONFIG = {
    'API_KEY': "9e2458a8acf46274d1c1b9418eec500c.oBojpibVHt3IyXnz",  # 智谱API密钥,必填
    'INPUT_FILE': 'bookmarks_2025_1_3.html',  # 输入文件,必填
    'EXTRACTED_FILE': 'extracted_bookmarks.txt',  # 提取的临时文件
    'CLASSIFIED_FILE': 'classified_bookmarks.md',  # 分类结果文件
    'OUTPUT_FILE': 'bookmarks.html',  # 最终输出文件
    'DEFAULT_CATEGORIES': [  # 默认分类
        '编程语言',
        '人工智能', 
        '数据科学',
    ]
}
  • API_KEY: 用于调用智谱AI API的密钥。
  • INPUT_FILE: 输入的HTML格式浏览器书签文件路径。
  • EXTRACTED_FILE: 提取的书签信息保存为文本文件的路径。
  • CLASSIFIED_FILE: 分类后的书签信息保存为Markdown文件的路径。
  • OUTPUT_FILE: 最终生成的HTML格式书签文件路径。
  • DEFAULT_CATEGORIES: 预定义的默认分类列表。
2. 初始化客户端
zhipu_client = ZhipuAI(api_key=CONFIG['API_KEY'])
  • 使用提供的API密钥初始化智谱AI客户端,用于后续与AI模型交互。
3. 获取AI响应
def get_llm_response(sysPrompt, questionPrompt):
    response = zhipu_client.chat.completions.create(
        model="GLM-4-Plus",  # 填写需要调用的模型编码
        messages=[
            {"role": "user", "content": sysPrompt},
            {"role": "assistant", "content": "你好,请告诉我你需要分类的书签?"},
            {"role": "user", "content": questionPrompt},
        ],
    )
    return response.choices[0].message.content
  • 定义一个函数get_llm_response,用于向AI模型发送系统提示和用户问题,并返回模型的响应内容。
4. 读取并解析HTML文件
with open(CONFIG['INPUT_FILE'], 'r', encoding='utf-8') as file:
    html_content = file.read()

soup = BeautifulSoup(html_content, 'html.parser')
bookmarks = soup.find_all('a')

bookmark_info = []
for bookmark in bookmarks:
    href = bookmark.get('href')
    add_date = bookmark.get('add_date')
    icon = bookmark.get('icon')
    text = bookmark.text.strip().replace('\n', '').replace('\t', '').replace('\r', '').replace(' ', '')
    
    bookmark_info.append({
        'URL': href,
        'Text': text
    })

with open(CONFIG['EXTRACTED_FILE'], 'w', encoding='utf-8') as f:
    for info in bookmark_info:
        f.write(f"Name: {info['Text']}, URL: {info['URL']}\n")
  • 读取输入的HTML书签文件内容。
  • 使用BeautifulSoup解析HTML,提取所有的<a>标签作为书签。
  • 将每个书签的URL和名称保存到bookmark_info列表中。
  • 将提取的书签信息保存到临时文件EXTRACTED_FILE中。
5. 分类书签
def extract_bookmark_info(line):
    name_match = re.search(r'Name: ([^,]+)', line)
    url_match = re.search(r'URL: (https?://[^\s]+)', line)
    if not name_match or not url_match:
        return None, None
    return name_match.group(1), url_match.group(1)

def classify_bookmark(bookmark_name, bookmark_url, categories):
    system_prompt = (
        "你是一个智能助手,任务是根据提供的书签名称和URL从给定的分类列表中选择最合适的分类返回给用户。仅返回分类名称。\n"
        "请根据书签的内容和性质选择最适合的分类。如果没有合适的分类,请回答'无法分类'。\n"
        "给定分类: {categories_str}\n"
        "请选择最合适的分类。\n"
        "示例:"
        "user: 书签名称:Python官方文档\n"
        "书签URL:https://docs.python.org/3/\n"
        "assistant: 编程语言\n"
    ).format(categories_str=", ".join(categories))
    
    user_prompt = (
        "书签名称: {bookmark_name}\n"
        "书签URL: {bookmark_url}\n"
    ).format(bookmark_name=bookmark_name, bookmark_url=bookmark_url)
    
    try:
        response = get_llm_response(system_prompt, user_prompt)
    except Exception as e:
        response = "其他"
    if response == "无法分类":
        return None
    return response

def create_new_category(name, url):
    system_prompt = (
        "你是一个智能助手,任务是根据提供的书签名称和URL给定一个合适的书签分类。仅返回分类名称。\n"
        "请根据书签的内容和性质给定分类。\n"
        "示例:"
        "user: 书签名称:Python官方文档\n"
        "书签URL:https://docs.python.org/3/\n"
        "assistant: 编程语言\n"
    )

    user_prompt = (
        "书签名称: {name}\n"
        "书签URL: {url}\n"
    ).format(name=name, url=url)
    response = get_llm_response(system_prompt, user_prompt)

    return response
  • extract_bookmark_info: 从临时文件中每行提取书签名称和URL。
  • classify_bookmark: 根据书签名称和URL,使用AI模型从预定义分类中选择最合适的分类。如果无法分类,则返回None
  • create_new_category: 如果书签无法归入现有分类,则创建新分类。
6. 处理书签分类
categories = CONFIG['DEFAULT_CATEGORIES']

with open(CONFIG['EXTRACTED_FILE'], 'r', encoding='utf-8') as f:
    bookmarks = f.readlines()

classified = defaultdict(list)
for line in bookmarks:
    if not line.strip():
        continue
        
    name, url = extract_bookmark_info(line)
    if not name or not url:
        continue
        
    category = classify_bookmark(name, url, categories)
    if not category:
        category = create_new_category(name, url)
        categories.append(category)

    print(f'分类书签: {name} -> {category}')
        
    classified[category].append(line)

with open(CONFIG['CLASSIFIED_FILE'], 'w', encoding='utf-8') as f:
    f.write('# 书签\n\n')
    for category, items in classified.items():
        f.write(f'## {category}\n')
        for item in items:
            name, url = extract_bookmark_info(item)
            if name and url:
                f.write(f'- [{name}]({url})\n')
        f.write('\n')
  • 从临时文件中读取所有书签信息。
  • 对每个书签进行分类,如果无法归入现有分类则创建新分类。
  • 将分类结果保存到Markdown文件CLASSIFIED_FILE中。
7. 将分类结果转换为HTML书签文件
def md_to_netscape(md_content):
    html = '''<!DOCTYPE NETSCAPE-Bookmark-file-1>
        <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
        <TITLE>Bookmarks</TITLE>
        <H1>Bookmarks</H1>
        <DL><p>
        '''

    lines = md_content.split('\n')
    stack = []
    current_level = 0
    
    for line in lines:
        if line.startswith('#'):
            level = line.count('#')
            title = line.lstrip('#').strip()
            
            while stack and stack[-1] >= level:
                html += '</DL><p>\n'
                stack.pop()
            
            html += f'    <DT><H3 ADD_DATE="{int(datetime.now().timestamp())}" LAST_MODIFIED="{int(datetime.now().timestamp())}">{title}</H3>\n'
            html += '    <DL><p>\n'
            stack.append(level)
            current_level = level
        
        elif line.startswith('-'):
            match = re.match(r'-\s*\[(.*?)\]\((.*?)\)', line)
            if match:
                name, url = match.groups()
                html += f'        <DT><A HREF="{url}" ADD_DATE="{int(datetime.now().timestamp())}">{name}</A>\n'
    
    while stack:
        html += '</DL><p>\n'
        stack.pop()
    
    return html

with open(CONFIG['CLASSIFIED_FILE'], 'r', encoding='utf-8') as f:
    md_content = f.read()

html_content = md_to_netscape(md_content)

with open(CONFIG['OUTPUT_FILE'], 'w', encoding='utf-8') as f:
    f.write(html_content)
  • 定义md_to_netscape函数,将Markdown格式的分类结果转换为Netscape Bookmark HTML格式。
  • 读取分类结果文件CLASSIFIED_FILE,将其转换为HTML格式并保存到OUTPUT_FILE
8. 清理临时文件
def cleanup_temp_files():
    temp_files = [
        CONFIG['EXTRACTED_FILE'],
        CONFIG['CLASSIFIED_FILE']
    ]
    for file in temp_files:
        if os.path.exists(file):
            os.remove(file)
            print(f"已删除临时文件: {file}")

if __name__ == '__main__':
    try:
        # 主逻辑代码...
        cleanup_temp_files()
        print("脚本执行完成,临时文件已清理")
    except Exception as e:
        print(f"脚本执行出错: {str(e)}")
  • 定义cleanup_temp_files函数,清理脚本运行过程中产生的临时文件。
  • 在主程序执行完成后调用此函数,确保临时文件被删除。

总结

该脚本通过以下步骤实现了对浏览器书签文件的重新分类:

  1. 读取和解析:从HTML文件中提取书签信息。
  2. 分类:使用AI模型对书签进行分类,必要时创建新分类。
  3. 保存结果:将分类结果保存为Markdown文件。
  4. 转换格式:将Markdown格式的分类结果转换为HTML格式。
  5. 清理:删除临时文件以保持工作环境整洁。

这个过程不仅简化了书签管理,还利用AI技术提高了分类的准确性和效率。

注意事项

  1. 确保API密钥有效
  2. 输入文件格式需为标准Netscape书签格式
  3. 分类结果可能受AI模型影响,建议人工复核
  4. 脚本运行后会清理临时文件,请及时保存结果

完整代码

# 浏览器书签文件重新分类.py

from zhipuai import ZhipuAI
from bs4 import BeautifulSoup
import re
import os
from collections import defaultdict
from datetime import datetime

# 配置参数
CONFIG = {
    'API_KEY': "my-secret-key",  # 智谱API密钥,必填
    'INPUT_FILE': 'bookmarks_2025_1_3.html',  # 输入文件,必填
    'EXTRACTED_FILE': 'extracted_bookmarks.txt',  # 提取的临时文件
    'CLASSIFIED_FILE': 'classified_bookmarks.md',  # 分类结果文件
    'OUTPUT_FILE': 'bookmarks.html',  # 最终输出文件
    'DEFAULT_CATEGORIES': [  # 默认分类
        '编程语言',#这个被用到给AI举例,不能删除
        '人工智能', 
        '数据科学',
    ]
}

# 初始化客户端
zhipu_client = ZhipuAI(api_key=CONFIG['API_KEY'])



def get_llm_response(sysPrompt, questionPrompt):
    response = zhipu_client.chat.completions.create(
        model="GLM-4-Plus",  # 填写需要调用的模型编码
        messages = [
            {"role": "user", "content": sysPrompt},
            {"role": "assistant", "content": "你好,请告诉我你需要分类的书签?"},
            {"role": "user", "content": questionPrompt},
        ],
    )
    return response.choices[0].message.content





# 读取HTML文件内容
with open(CONFIG['INPUT_FILE'], 'r', encoding='utf-8') as file:
    html_content = file.read()

# 使用BeautifulSoup解析HTML
soup = BeautifulSoup(html_content, 'html.parser')

# 查找所有的<A>标签
bookmarks = soup.find_all('a')

# 提取书签信息
bookmark_info = []
for bookmark in bookmarks:
    href = bookmark.get('href')
    add_date = bookmark.get('add_date')
    icon = bookmark.get('icon')
    text = bookmark.text.strip().replace('\n', '').replace('\t', '').replace('\r', '').replace(' ', '')
    
    bookmark_info.append({
        'URL': href,
        'Text': text
    })

# 打印提取的书签信息
for info in bookmark_info:
    print(info)

# 保存提取的书签信息

with open(CONFIG['EXTRACTED_FILE'], 'w', encoding='utf-8') as f:
    for info in bookmark_info:
        f.write(f"Name: {info['Text']}, URL: {info['URL']}\n")




def extract_bookmark_info(line):
    """从书签行中提取名称和URL"""
    name_match = re.search(r'Name: ([^,]+)', line)
    url_match = re.search(r'URL: (https?://[^\s]+)', line)
    if not name_match or not url_match:
        return None, None
    return name_match.group(1), url_match.group(1)

def classify_bookmark(bookmark_name, bookmark_url, categories):

    system_prompt = (
        "你是一个智能助手,任务是根据提供的书签名称和URL从给定的分类列表中选择最合适的分类返回给用户。仅返回分类名称。\n"
        "请根据书签的内容和性质选择最适合的分类。如果没有合适的分类,请回答'无法分类'。\n"
        "给定分类: {categories_str}\n"
        "请选择最合适的分类。\n"
        "示例:"
        "user: 书签名称:Python官方文档\n"
        "书签URL:https://docs.python.org/3/\n"
        "assistant: 编程语言\n"
    ).format(categories_str=", ".join(categories))
    
    user_prompt = (
        "书签名称: {bookmark_name}\n"
        "书签URL: {bookmark_url}\n"
    ).format(bookmark_name=bookmark_name, bookmark_url=bookmark_url)
    
    try:
        response = get_llm_response(system_prompt, user_prompt)
    except Exception as e:
        response = "其他"
    if response == "无法分类":
        return None
    return response

def create_new_category(name, url):
    """
    创建新分类
    :param name: 书签名称
    :param url: 书签URL
    :return: 新分类名
    """
    system_prompt = (
        "你是一个智能助手,任务是根据提供的书签名称和URL给定一个合适的书签分类。仅返回分类名称。\n"
        "请根据书签的内容和性质给定分类。\n"
        "示例:"
        "user: 书签名称:Python官方文档\n"
        "书签URL:https://docs.python.org/3/\n"
        "assistant: 编程语言\n"
    )

    user_prompt = (
        "书签名称: {name}\n"
        "书签URL: {url}\n"
    ).format(name=name, url=url)
    response = get_llm_response(system_prompt, user_prompt)

    return response



# 使用配置中的分类规则
categories = CONFIG['DEFAULT_CATEGORIES']
    



with open(CONFIG['EXTRACTED_FILE'], 'r', encoding='utf-8') as f:
    bookmarks = f.readlines()

classified = defaultdict(list)
for line in bookmarks:
    if not line.strip():
        continue
        
    name, url = extract_bookmark_info(line)
    if not name or not url:
        continue
        
    # 分类书签
    category = classify_bookmark(name, url, categories)
    if not category:
        # 创建新分类
        category = create_new_category(name, url)
        categories.append(category)

    print(f'分类书签: {name} -> {category}')
        
    classified[category].append(line)

# 将分类结果保存为文件
with open(CONFIG['CLASSIFIED_FILE'], 'w', encoding='utf-8') as f:
    f.write('# 书签\n\n')
    for category, items in classified.items():
        f.write(f'## {category}\n')
        for item in items:
            name, url = extract_bookmark_info(item)
            if name and url:
                f.write(f'- [{name}]({url})\n')
        f.write('\n')

from datetime import datetime
# 将分类结果重新转为HTML书签文件
def md_to_netscape(md_content):
    # 初始化HTML结构
    html = '''<!DOCTYPE NETSCAPE-Bookmark-file-1>
        <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
        <TITLE>Bookmarks</TITLE>
        <H1>Bookmarks</H1>
        <DL><p>
        '''

    # 解析MD内容
    lines = md_content.split('\n')
    stack = []
    current_level = 0
    
    for line in lines:
        # 处理标题
        if line.startswith('#'):
            level = line.count('#')
            title = line.lstrip('#').strip()
            
            # 关闭之前的DL
            while stack and stack[-1] >= level:
                html += '</DL><p>\n'
                stack.pop()
            
            # 添加H3标签
            html += f'    <DT><H3 ADD_DATE="{int(datetime.now().timestamp())}" LAST_MODIFIED="{int(datetime.now().timestamp())}">{title}</H3>\n'
            html += '    <DL><p>\n'
            stack.append(level)
            current_level = level
        
        # 处理链接
        elif line.startswith('-'):
            match = re.match(r'-\s*\[(.*?)\]\((.*?)\)', line)
            if match:
                name, url = match.groups()
                html += f'        <DT><A HREF="{url}" ADD_DATE="{int(datetime.now().timestamp())}">{name}</A>\n'
    
    # 关闭所有打开的DL
    while stack:
        html += '</DL><p>\n'
        stack.pop()
    
    return html

with open(CONFIG['CLASSIFIED_FILE'], 'r', encoding='utf-8') as f:
    md_content = f.read()

html_content = md_to_netscape(md_content)

with open(CONFIG['OUTPUT_FILE'], 'w', encoding='utf-8') as f:
    f.write(html_content)

# 清理临时文件
def cleanup_temp_files():
    """清理脚本运行过程中产生的临时文件"""
    temp_files = [
        CONFIG['EXTRACTED_FILE'],
        CONFIG['CLASSIFIED_FILE']
    ]
    for file in temp_files:
        if os.path.exists(file):
            os.remove(file)
            print(f"已删除临时文件: {file}")

# 主程序执行
if __name__ == '__main__':
    try:
        # 原有主逻辑代码...
        
        # 脚本执行完成后清理临时文件
        cleanup_temp_files()
        print("脚本执行完成,临时文件已清理")
    except Exception as e:
        print(f"脚本执行出错: {str(e)}")


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

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

相关文章

在 macOS 上,你可以使用系统自带的 终端(Terminal) 工具,通过 SSH 协议远程连接服务器

文章目录 1. 打开终端2. 使用 SSH 命令连接服务器3. 输入密码4. 连接成功5. 使用密钥登录&#xff08;可选&#xff09;6. 退出 SSH 连接7. 其他常用 SSH 选项8. 常见问题排查问题 1&#xff1a;连接超时问题 2&#xff1a;权限被拒绝&#xff08;Permission denied&#xff09…

【书籍连载】《软件测试架构实践与精准测试》| 有关软件测试模型的调查结果

各位软件领域的精英们&#xff0c;今天小编邀请你继续深入学习《软件测试架构实践与精准测试》。 《软件测试架构实践与精准测试》是作者李龙&#xff08;安畅检测首席技术专家&#xff09;基于软件测试“川模型”的著作。本书结合作者首次提出的软件测试新的模型“川模型”测试…

软件工程大作业——图书管理系统/图书个性化推荐与实现系统

目录 1 绪论 1.1研究背景 1.2研究现状 1.3研究内容 2 系统关键技术 2.1 Spring Boot框架 2.2 JAVA技术 2.3 MYSQL数据库 2.4 B/S结构 3 系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2经济可行性 3.1.3操作可行性 3.2 系统性能分析 3.3 系统功能分析 3.4系统流程分析 3.4.1登…

“AI智慧教学系统:开启个性化教育新时代

大家好&#xff0c;我是老王&#xff0c;一个在产品圈摸爬滚打多年的资深产品经理。今天&#xff0c;我想和大家聊聊一个最近特别火的概念——AI智慧教学系统。这东西听起来好像很高大上&#xff0c;但其实和我们每个人都息息相关&#xff0c;因为它关系到我们下一代的教育。 一…

vue实现平滑滚动到目标标签页

平滑滚动 <div class"tabs" ref"tabList"><div class"tab" v-for"(item, index) in 10":key"index" click"clickTab(index)"><div class"inside" :class"tabIndex index ? ins…

防御式CSS是一种编写CSS的方法,旨

1.防御式CSS 防御式CSS是一种编写CSS的方法&#xff0c;旨在提高样式的健壮性和可维护性。以下是一些实现防御式CSS的关键策略&#xff1a; 避免使用!important 尽量避免使用!important&#xff0c;因为它会破坏CSS的优先级规则&#xff0c;导致样式难以调试和维护。 使用具…

Python实现接口签名调用

目录: 1、第三方接口签名调用2、调用结果 1、第三方接口签名调用 import json import requests import hashlib import time import hmac access_key xxxxxxxxxxxxxxx secret_key xxxxxxxxxxxxxxx # 应用信息 def _wps4_sig(method, url, date, body): print(body)if bod…

【Hackthebox 中英 Write-Up】Web Request | 分析 HTTP 请求和响应

欢迎来到我的writeup分享&#xff01;我希望大家不要只关注结果或答案&#xff0c;而是通过耐心阅读&#xff0c;尝试逆向工程理解背后的运作原理。在这里&#xff0c;你不仅能找到解题的思路&#xff0c;还能学到更多与Hack The Box等平台相关的技术和技巧&#xff0c;期待与你…

物联网控制期末复习

第3章 物联网控制系统的过程通道设计 3.1 模拟量输出通道 3.1.1单模拟量输出通道的构成 计算机控制系统的模拟量输出通道将计算机产生的数字控制信号转换为模拟信号&#xff08;电压或电流&#xff09;作用于执行机构&#xff0c;以实现对被控对象的控制。 多D/A结构&#…

探索Wiki:开源知识管理平台及其私有化部署

在如今的信息时代&#xff0c;企业和团队的知识管理变得愈发重要。如何有效地存储、整理、共享和协作&#xff0c;是提高团队效率和创新能力的关键因素之一。今天&#xff0c;我要为大家介绍一款非常有用的github上开源知识管理工具——Wiki&#xff0c;并分享它的私有化部署方…

PDF文件提示-文档无法打印-的解决办法

背景信息 下载了几个签名的PDF文件&#xff0c;想要打印纸质版&#xff0c;结果打印时 Adobe Acrobat Reader 提示【文档无法打印】: 解决办法 网上的方案是使用老版本的PDF阅读器&#xff0c; 因为无法打印只是一个标识而已。 PDF文件不能打印的五种解决方案-zhihu 这些方…

快速上手LangChain(三)构建检索增强生成(RAG)应用

文章目录 快速上手LangChain(三)构建检索增强生成(RAG)应用概述索引阿里嵌入模型 Embedding检索和生成RAG应用(demo:根据我的博客主页,分析一下我的技术栈)快速上手LangChain(三)构建检索增强生成(RAG)应用 langchain官方文档:https://python.langchain.ac.cn/do…

【前端系列】Pinia状态管理库

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、Pinia状态管理库&#xff1a;☀️☀️☀️2.1 pinia基本使用① pinia充当中转站存放token② 使用步骤 2.1 axios请求拦截器 一、前言&#x1f680;&#x1f680;&#x1f680; ☀️ 回报不在行动之后&#xff0c;…

Springboot - Web

Spring Boot 是一个用于简化 Spring 应用程序配置和部署的框架。它提供了一种快速开发的方式&#xff0c;通过默认配置、自动化配置等特性&#xff0c;使得开发者能够更快捷地构建和部署基于 Spring 的应用。 Spring Boot Web 是 Spring Boot 的一个子模块&#xff0c;它专注于…

鸿蒙应用开发搬砖经验之—使用DevTools工具调试前端页面

环境说明&#xff1a; 系统环境&#xff1a;Mac mini M2 14.5 (23F79) 开发IDE&#xff1a;DevEco Studio 5.0.1 Release 配置步骤&#xff1a; 按着官方的指引来慢慢一步一步来&#xff0c;但前提是要配置好SDK的路径&#xff08;没有配置的话&#xff0c;可能先看下面的配…

Java-数据结构-顺序表(ArrayList)

在之前的博客中&#xff0c;我们大部分都在学习数据结构相关的理论知识&#xff0c;而今天我们要学到的ArrayList便有所不同了&#xff0c;ArrayList这部分算是重要的知识&#xff0c;所以大家打起精神&#xff0c;让我们一起学习~ 在学习ArrayList之前&#xff0c;我们需要先…

stable diffusion安装mov2mov

第一步&#xff1a; 下载mov2mov&#xff0c;地址&#xff1a;https://gitcode.com/gh_mirrors/sd/sd-webui-mov2mov 下载包到web-ui的sd-webui-aki-v4.10\extensions文件夹面解压 第二步&#xff1a;在文件夹中调出cmd窗口&#xff0c;执行下列命令&#xff0c; git restore…

RWKV 语言模型

RWKV Language Model是一种独特的循环神经网络&#xff08;RNN&#xff09;架构的语言模型&#xff0c;具有诸多优势和特点&#xff0c;在自然语言处理领域展现出了良好的性能和应用潜力&#xff0c;以下是具体介绍&#xff1a; 核心原理 融合RNN与Transformer优点&#xff1a;…

基于单片机的温湿度采集系统(论文+源码)

2.1系统的功能 本系统的研制主要包括以下几项功能&#xff1a; (1)温度检测功能&#xff1a;对所处环境的温度进行检测&#xff1b; (2)湿度检测功能&#xff1a;对所处环境的湿度进行检测&#xff1b; (3)加热和制冷功能&#xff1a;可以完成加热和制冷功能。 (4)加湿和除…

「Mac畅玩鸿蒙与硬件49」UI互动应用篇26 - 数字填色游戏

本篇教程将带你实现一个数字填色小游戏&#xff0c;通过简单的交互逻辑&#xff0c;学习如何使用鸿蒙开发组件创建趣味性强的应用。 关键词 UI互动应用数字填色动态交互逻辑判断游戏开发 一、功能说明 数字填色小游戏包含以下功能&#xff1a; 数字选择&#xff1a;用户点击…