星辰彩虹海🌈
type: channel
link: https://www.lbxpace.com/
description: 彩虹号🚁嘟嘟嘟嘟嘟~
items: minimind-数据集处理过程（感谢作者开源）
items: minimind-数据集格式展示（感谢作者开源）
items: TokenSkip-Evaluation-代码解析（感谢作者开源）
items: minimind-微调流程-实验复现与代码解析（感谢作者开源）
items: minimind-预训练流程-实验复现与代码解析（感谢作者开源）
items: NLP-Tokenizer解析
items: Emoji获取大全
items: 美丽生活随记
items: 站点美化日志~
items: 站点优化日志~

minimind-数据集处理过程（感谢作者开源）
type: item
date: 2025-10-26T15:21:00+08:00
description: 预训练数据集处理过程class PretrainDataset(Dataset): def __init__(self, data_path, tokenizer, max_length=512): super().__init__() self.tokenizer = tokenizer #存储分词器 self.max_length = max_length #最大文本长度 self.samples = self.load_data(data_path) #获得数据初始样本 def load_data(self, path): samples = [] with open(path, 'r', encoding='utf-8') as f: for line_num, line in enumerate(f, 1): data = json.loads(line.strip()) # print(type(data)) # example(dict):{'text': '<|im_start|>abc。def。<|im_end|> <|im_start|>esdw。rwqe。<|im_end|>'} # time.sleep(10) samples.append(data) # example(list):[{'text': '<|im_start|>abc。def。<|im_end|> <|im_start|>esdw。rwqe。<|im_end|>'}, # {'text': '<|im_start|>fadsf。wqe。<|im_end|> <|im_start|>ertw。tret。<|im_end|>'}] # print(samples) # time.sleep(10) return samples def __len__(self): return len(self.samples) def __getitem__(self, index): sample = self.samples[index] # example(dict):{'text': '<|im_start|>abc。def。<|im_end|> <|im_start|>esdw。rwqe。<|im_end|>'} # 构建输入文本 encoding = self.tokenizer( str(sample['text']), max_length=self.max_length, padding='max_length', truncation=True, return_tensors='pt' ) # example(str) # sample['text']:'<|im_start|>abc。def。<|im_end|> <|im_start|>esdw。rwqe。<|im_end|>' input_ids = encoding.input_ids.squeeze() # example(list): # input_ids: tensor([ 1, 2177, ..., 1055, 2, 223, 1, 1083, ..., # 2, 223, 1, 2104, ..., 2, 0, 0, ..., 0]) # print(type(self.tokenizer.pad_token_id)) # example(int): # pad_token_id: 0 # print("input_ids:",input_ids) # print("pad_token_id:",self.tokenizer.pad_token_id) # time.sleep(10) # loss_mask = (input_ids != self.tokenizer.pad_token_id) # 只标记非填充位置 X = torch.tensor(input_ids[:-1], dtype=torch.long) # 去掉最后一位 Y = torch.tensor(input_ids[1:], dtype=torch.long) # 去掉第一位 # print("X:",X) # time.sleep(10) # print("Y:",Y) # time.sleep(10) loss_mask = torch.tensor(loss_mask[1:], dtype=torch.long) # 同Y return X, Y, loss_mask微调数据集处理过程class SFTDataset(Dataset): def __init__(self, jsonl_path, tokenizer, max_length=1024): super().__init…

minimind-数据集格式展示（感谢作者开源）
type: item
date: 2025-10-26T15:10:00+08:00
description: 预训练中文数据集格式展示{"text": "<|im_start|>鉴别一组中文文章的风格和特点，例如官方、口语、文言等。需要提供样例文章才能准确鉴别不同的风格和特点。<|im_end|> <|im_start|>好的，现在帮我查一下今天的天气怎么样?今天的天气依据地区而异。请问你需要我帮你查询哪个地区的天气呢？<|im_end|> <|im_start|>打开闹钟功能，定一个明天早上七点的闹钟。好的，我已经帮您打开闹钟功能，闹钟将在明天早上七点准时响起。<|im_end|> <|im_start|>为以下场景写一句话描述：一个孤独的老人坐在公园长椅上看着远处。一位孤独的老人坐在公园长椅上凝视远方。<|im_end|> <|im_start|>非常感谢你的回答。请告诉我，这些数据是关于什么主题的？这些数据是关于不同年龄段的男女人口比例分布的。<|im_end|> <|im_start|>帮我想一个有趣的标题。这个挺有趣的：\"如何成为一名成功的魔术师\" 调皮的标题往往会吸引读者的注意力。<|im_end|> <|im_start|>回答一个问题，地球的半径是多少？地球的平均半径约为6371公里，这是地球自赤道到两极的距离的平均值。<|im_end|> <|im_start|>识别文本中的语气，并将其分类为喜悦、悲伤、惊异等。\n文本：“今天是我的生日！”这个文本的语气是喜悦。<|im_end|>"} {"text": "<|im_start|>根据输入的内容，编写一个类别标签。\n这是一篇介绍如何阅读心电图的文章类别标签: 医学/心电图阅读指南<|im_end|> <|im_start|>帮我搜索一下最近的天气情况。当然，我可以帮您搜索最新的天气情况。请问您需要查询哪个城市的天气情况呢？<|im_end|> <|im_start|>帮我讲一个令人开心的笑话。好的，我帮您讲一个关于细菌的笑话。为什么细菌不会上网？因为连接总是断开了！<|im_end|> <|im_start|>现在给我生成一首关于大海的五言诗。碧波万顷月满天，海天相接处天地间。波涛滚滚江山美，海鸟翱翔日月闲。<|im_end|> <|im_start|>谢谢你，这篇文章很有用。不客气，我很高兴能够为您提供帮助。如果您还有其他问题或需求，随时可以对我说。<|im_end|> <|im_start|>你好，我想下载一个视频编辑软件，你有什么推荐吗？您好！当然，有很多选择。您想要免费软件还是愿意付费？<|im_end|> <|im_start|>为什么我的程序不输出正确结果？可能是代码逻辑有误，或者输入数据有误，需要仔细调试代码逻辑和输入数据。<|im_end|> <|im_start|>谢谢你的回答。现在我想知道这场比赛的具体时间和地点。这场比赛的时间是北京时间10月4日，地点是上海。<|im_end|>"} ...微调中文数据集格式展示{"conversations": [{"role": "user", "content": "请告诉我在中国古代的“四大发明”是什么？"}, {"role": "assistant", "content": "中国古代的“四大发明”是指造纸术、印刷术、火药和指南针。这四项发明对世界文明的发展产生了深远的影响：\n\n1. **造纸术**：据史书记载，东汉时期的蔡伦改进了造纸工艺，使得纸张的生产更加便捷、成本更低，质量也更加优良。这一发明极大地促进了文化的传播和保存。\n\n2. **印刷术**：中国古代的印刷术最早可以追溯到唐代的雕版印刷，到了宋代发展出了活字印刷技术。印刷术的发明极大地促进了知识的传播，降低了书籍的成本，对教育和文化的发展起到了重要的推动作用。\n\n3. **火药**：火药最初是在唐代被发现的，最初可能用于医疗或炼金术。到了宋代，人们开始将火药用于军事目的，发明了各种火器。火药的发明改变了战争的面貌，对世界军事技术的发展产生了重大影响。\n\n4. **指南针**：指南针最初在中国被用于风水测量，后来逐渐发展成为航海导航的重要工具。这一发明极大地促进了海上航行技术的发展，对于新航路的开辟和世界地理大发现起到了关键作用。\n\n这四项发明不仅在中国历史上占有重要地位，而且对全世界的科技进步和文明发展都产生了深远的影响。"}]} {"conversations": [{"role": "user", "content": "请用一段话描述阿里巴巴集团的企业文化。"}, {"role": "assistant", "content": "阿里巴巴集团的企业文化以“客户第一、员工第二、股东第三”为核心价值观，强调“让天下没有难做的生意”的使命。公司倡导开放、透明、分享、责任的团队合作精神，鼓励员工创新、追求卓越，同时…

TokenSkip-Evaluation-代码解析（感谢作者开源）
type: item
date: 2025-10-22T21:01:00+08:00
description: TokenSkip-Evaluation-代码解析[quote color="info"]该函数主要两个功能：1.通过原始数据集和针对该数据集微调后的模型得到原始思维链输出-train 模式。2.评估指定模型在指定数据集上的表现，包括答题准确率，token 长度-test 模式[/quote]import os import json import torch import random import argparse import numpy as np from tqdm import tqdm from time import time from copy import deepcopy from peft import PeftModel from vllm import LLM, SamplingParams from vllm.lora.request import LoRARequest from transformers import AutoTokenizer, AutoModelForCausalLM from eval.utils import generate_completions from data_processing.process_utils import * from data_processing.answer_extraction import * from eval.eval_script import * # import time def set_random_seed(seed): # 设置随机种子 random.seed(seed) # 控制python 内置随机数生成器的随机种子 os.environ['PYTHONHASHSEED'] = str(seed) # 控制 Python 内部哈希随机性（dict/set 顺序） np.random.seed(seed) # 控制NumPy 随机数种子 torch.manual_seed(seed) # 控制CPU 上的 PyTorch 随机数 torch.cuda.manual_seed(seed) # 控制 GPU上的 PyTorhch 随机数 torch.backends.cudnn.deterministic = True # 强制 cuDNN 使用 确定性（deterministic） 算法。 也就是说： 同样的输入、同样的模型、同样的硬件 → 输出结果完全一致。 # 这对 复现实验结果 非常重要。 torch.backends.cudnn.benchmark = False # 关闭 cuDNN 的 自动算法优化（auto-tuner）。防止：1.每次运行选择的算法可能不同；2.输入形状稍有变化就会重新 benchmark； # 3.所以会导致结果不确定性。为了结果完全可复现，应关闭 benchmark（设为 False）。 def read_data(path): # 读取数据 if path.endswith("json"): data = json.load(open(path, "r")) # json.load:一次性读取整个文本数据，该函数的好处能自动将其变为字典，并且支持嵌套，里面的字典也能识别 # 。f.load 只是将其变为字符串。 # example: # [{"id": 1, "text": "hello"}, {"id": 2, "text": "world"}]可以一次性读 elif path.endswith("jsonl"): # json 文件只有一个对象（一般外层会用一个列表括号或字典括号包起来），len 为 1，jsonl 有多个对象，len 为 n data = [] with open(path, "r") as file: for line in file: line = json.loads(line) # {"id": 1, "text": "hello"}\n{"id": 2, "text": "world"}得分行读 data.append(line) else: raise NotImplementedError() return data def infer(args, test_data, answer_extraction_fn): tokenizer = AutoTokenizer.from_pretrained(args.tokenizer_path, trust_remote_code=True) # 加载分词器 # 一些模型（例如 Qwen、ChatGLM、Yi）必须加这个参数，否则会报错。 prompts = [] # test_data为包含了所有数…

minimind-微调流程-实验复现与代码解析（感谢作者开源）
type: item
date: 2025-10-21T18:10:00+08:00
description: [quote color="success"]首先对作者报以最诚挚的敬意，介绍详细，覆盖范围广，完全开源，没有特别复杂的接口，对入门NLP者相当友好🫡[/quote][button color="info" url="https://github.com/hemingkx/TokenSkip" outline="default" target="_blank"]TokenSkip-Github项目地址[/button]train_pretrain.py代码结构[quote color="warning"]预训练完成的模型只会词语接龙，只能根据前面的文本预测下一个词出现的概率，通过微调才能够做到正确的和人对话，微调阶段会把混乱的数据集变成指令+角色+内容的形式，让模型能够知道哪些是人提出的输入的问题，哪些应该由模型输出，但是字符都是分词器中已经存在的字符，只是更改了排列形式。[/quote]微调和预训练的主要区别是数据集的变化，告诉模型如何进行对话。微调阶段可以不调整所有参数，只调整一部分，通过 lora(低秩矩阵乘积)，和 fsdp（模型分卡存储）等技术可以进一步降低每张卡的显存需求。[acc status="close" title="解析统计"]代码行数：202。解析时间：X Day[/acc]import os import sys __package__ = "trainer" sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) import argparse import time import math import warnings import torch import torch.distributed as dist from contextlib import nullcontext from torch import optim, nn from torch.nn.parallel import DistributedDataParallel from torch.utils.data import DataLoader, DistributedSampler from transformers import AutoTokenizer, AutoModelForCausalLM from model.model_minimind import MiniMindConfig, MiniMindForCausalLM from dataset.lm_dataset import SFTDataset warnings.filterwarnings('ignore') def Logger(content): if not ddp or dist.get_rank() == 0: print(content) def get_lr(current_step, total_steps, lr): return lr / 10 + 0.5 * lr * (1 + math.cos(math.pi * current_step / total_steps)) #和预训练几乎一样 def train_epoch(epoch, wandb): loss_fct = nn.CrossEntropyLoss(reduction='none') start_time = time.time() for step, (X, Y, loss_mask) in enumerate(train_loader): X = X.to(args.device) Y = Y.to(args.device) loss_mask = loss_mask.to(args.device) lr = get_lr(epoch * iter_per_epoch + step, args.epochs * iter_per_epoch, args.learning_rate) for param_group in optimizer.param_groups: param_group['lr'] = lr with ctx: res = model(X) loss = loss_fct( res.logits.view(-1, res.logits.size(-1)), Y.view(-1) ).view(Y.size()) loss = (loss * loss_mask).sum() / loss_mask.sum() loss += res.aux_loss loss = loss / args.accumulation_steps sca…

minimind-预训练流程-实验复现与代码解析（感谢作者开源）
type: item
date: 2025-10-12T16:24:00+08:00
description: [quote color="success"]首先对作者报以最诚挚的敬意，介绍详细，覆盖范围广，完全开源，没有特别复杂的接口，对入门NLP者相当友好🫡[/quote][button color="info" url="https://github.com/jingyaogong/minimind" outline="default" target="_blank"]Minimind-Github项目地址[/button]train_pretrain.py代码结构[quote color="warning"]万物之源，所有微调，强化学习之前必先经此阶段[/quote]此阶段旨在训练一个文本接龙模型，该模型的唯一功能就是做文本接龙，通过之前输入的文本推测下一个文本是啥。只有先能够做到这个功能才能做到后面的智能对话。[acc status="close" title="解析统计"]代码行数：198。解析时间：1 Day[/acc]import os # import sys __package__ = "trainer" sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) import argparse import time import math import warnings import torch import torch.distributed as dist from torch import optim, nn from torch.nn.parallel import DistributedDataParallel from torch.utils.data import DataLoader, DistributedSampler from contextlib import nullcontext from transformers import AutoTokenizer from model.model_minimind import MiniMindConfig, MiniMindForCausalLM from dataset.lm_dataset import PretrainDataset warnings.filterwarnings('ignore') #忽略警告信息，以防干扰输出 def Logger(content): if not ddp or dist.get_rank() == 0: print(content) def get_lr(current_step, total_steps, lr): return lr / 10 + 0.5 * lr * (1 + math.cos(math.pi * current_step / total_steps)) #学习率逐减 def train_epoch(epoch, wandb): loss_fct = nn.CrossEntropyLoss(reduction='none') #交叉熵 start_time = time.time() #时间计算，记录开始时间 for step, (X, Y, loss_mask) in enumerate(train_loader): X = X.to(args.device) Y = Y.to(args.device) #X，Y为文本token，分别告诉模型输入为什么输出位什么，形状为【batch_size,num_tokens】 #test input data and output data #if dist.get_rank() == 0: # print("X_shape=",X.shape) # print("Y_shape=",Y.shape) # print("X=",X) # print("Y=",Y) # time.sleep(10) # print("X[0]:", X[0]) # print("Y[0]:", Y[0]) # # print(X[0]==Y[0]) # # print(decoded_input==decoded_output) # # print("程序已经暂停了 10 秒！") # #results:[32,511] # # # 假设 X 是你的输入数据，其中的每个 token ID 需要映射回文字 # decoded_input = tokenizer.decode(X[0], skip_special_tokens=False) # 将 X 中第一个样本的 tokens 解码为文本 # # print() # # # 对于 Y 也是一样 # de…

NLP-Tokenizer解析
type: item
date: 2025-10-12T15:34:00+08:00
description: Toknizer（分词器）-文字与机器之间的桥梁人工智能模型的主要作用是特征之间映射，而目前主流特征是由浮点数构成的向量。（简单来说，人工智能模型只是一个抽象函数，他能将一堆数字$x$，通过内部的参数计算$f(x)$，得到另一堆数字$y=f(x)$）。其并不能直接接收文字作为输入源。为了让模型能够接收并输出文字，需要有个载体，这个载体需要能被模型识别，同时还要能被文字映射，并且每段文字映射出来的载体要能够区分出不同。 那能想到的最好的载体就是数字索引，每段文字基于不同的索引，通过这个索引能直接在一个类似新华词典的词表里查到对应的文字是啥，比如“$你$”的索引是$1$，“$好$”的索引是$2$，那输入$你好$对模型来说就是输入$[1,2]$,然后希望模型输出比如说“$呀$”索引为$3$.Tokenizer做的就是文字与索引之间映射的工作，它能够把对应的不同的文字映射为不同的数字。比如把“$你$”映射到$1$。 这样模型就能够通过Embedding将数字进一步映射成向量从而进行训练。 当然反向操作（把索引映射回文本）也是没问题的。Tokenizer做的就是简历文本块与索引之间的一一对应的映射。[photos] [/photos][quote color="success"]值得注意的是不同的项目或论文使用的分词器不尽相同分词策略也不同。中文中或许是一个字一个索引，英文就可能是“hell”,"o"或者“h”“e”“l”“l”“o”，如何设计分词器使得模型能发挥出最大性能也是值得研究的一件事[/quote]

Emoji获取大全
type: item
date: 2025-08-13T22:00:00+08:00
description: [quote color="success"]仅为方便使用需要ovo[/quote]链接直达(更全)[button color="info" url="https://emoji6.com/emojiall/" outline="default" target="_blank"]Emoji大全链接[/button]常用Emoji(非图片可复制)常见表情😀😁😂😃😄😅😆😉😊😋😎😍😘😗😙😚☺😇😐😑😶😏😣😥😮😯😪😫😴😌😛😜😝😒😓😔😕😲😷😖😞😟😤😢😭😦😧😨😬😰😱😳😵😡😠人物👦👧👨👩👴👵👶👱👮👲👳👷👸💂🎅👰👼💆💇🙍🙎🙅🙆💁🙋🙇🙌🙏👤👥🚶🏃👯💃👫👬👭💏💑👪手势💪👈👉☝👆👇✌✋👌👍👎✊👊👋👏👐✍日常👣👀👂👃👅👄💋👓👔👕👖👗👘👙👚👛👜👝🎒💼👞👟👠👡👢👑👒🎩🎓💄💅💍🌂手机📱📲📶📳📴☎📞📟📠公共♻🏧🚮🚰♿🚹🚺🚻🚼🚾⚠🚸⛔🚫🚳🚭🚯🚱🚷🔞💈动物🙈🙉🙊🐵🐒🐶🐕🐩🐺🐱😺😸😹😻😼😽🙀😿😾🐈🐯🐅🐆🐴🐎🐮🐂🐃🐄🐷🐖🐗🐽🐏🐑🐐🐪🐫🐘🐭🐁🐀🐹🐰🐇🐻🐨🐼🐾🐔🐓🐣🐤🐥🐦🐧🐸🐊🐢🐍🐲🐉🐳🐋🐬🐟🐠🐡🐙🐚🐌🐛🐜🐝🐞🦋植物💐🌸💮🌹🌺🌻🌼🌷🌱🌲🌳🌴🌵🌾🌿🍀🍁🍂🍃自然🌍🌎🌏🌐🌑🌒🌓🌔🌕🌖🌗🌘🌙🌚🌛🌜☀🌝🌞⭐🌟🌠☁⛅☔⚡❄🔥💧🌊饮食🍇🍈🍉🍊🍋🍌🍍🍎🍏🍐🍑🍒🍓🍅🍆🌽🍄🌰🍞🍖🍗🍔🍟🍕🍳🍲🍱🍘🍙🍚🍛🍜🍝🍠🍢🍣🍤🍥🍡🍦🍧🍨🍩🍪🎂🍰🍫🍬🍭🍮🍯🍼☕🍵🍶🍷🍸🍹🍺🍻🍴文体🎪🎭🎨🎰🚣🛀🎫🏆⚽⚾🏀🏈🏉🎾🎱🎳⛳🎣🎽🎿🏂🏄🏇🏊🚴🚵🎯🎮🎲🎷🎸🎺🎻🎬恐怖😈👿👹👺💀☠👻👽👾💣旅游🌋🗻🏠🏡🏢🏣🏤🏥🏦🏨🏩🏪🏫🏬🏭🏯🏰💒🗼🗽⛪⛲🌁🌃🌆🌇🌉🌌🎠🎡🎢🚂🚃🚄🚅🚆🚇🚈🚉🚊🚝🚞🚋🚌🚍🚎🚏🚐🚑🚒🚓🚔🚕🚖🚗🚘🚚🚛🚜🚲⛽🚨🚥🚦🚧⚓⛵🚤🚢✈💺🚁🚟🚠🚡🚀🎑🗿🛂🛃🛄🛅物品💌💎🔪💈🚪🚽🚿🛁⌛⏳⌚⏰🎈🎉🎊🎎🎏🎐🎀🎁📯📻📱📲☎📞📟📠🔋🔌💻💽💾💿📀🎥📺📷📹📼🔍🔎🔬🔭📡💡🔦🏮📔📕📖📗📘📙📚📓📃📜📄📰📑🔖💰💴💵💶💷💸💳✉📧📨📩📤📥📦📫📪📬📭📮✏✒📝📁📂📅📆📇📈📉📊📋📌📍📎📏📐✂🔒🔓🔏🔐🔑🔨🔫🔧🔩🔗💉💊🚬🔮🚩🎌💦💨标志♠♥♦♣🀄🎴🔇🔈🔉🔊📢📣💤💢💬💭♨🌀🔔🔕✡✝🔯📛🔰🔱⭕✅☑✔✖❌❎➕➖➗➰➿〽✳✴❇‼⁉❓❔❕❗©®™🎦🔅🔆💯🔠🔡🔢🔣🔤🅰🆎🅱🆑🆒🆓ℹ🆔Ⓜ🆕🆖🅾🆗🅿🆘🆙🆚🈁🈂🈷🈶🈯🉐🈹🈚🈲🉑🈸🈴🈳㊗㊙🈺🈵▪▫◻◼◽◾⬛⬜🔶🔷🔸🔹🔺🔻💠🔲🔳⚪⚫🔴🔵生肖🐁🐂🐅🐇🐉🐍🐎🐐🐒🐓🐕🐖星座♈♉♊♋♌♍♎♏♐♑♒♓⛎钟表🕛🕧🕐🕜🕑🕝🕒🕞🕓🕟🕔🕠🕕🕡🕖🕢🕗🕣🕘🕤🕙🕥🕚🕦⌛⏳⌚⏰⏱⏲🕰心形💘❤💓💔💕💖💗💙💚💛💜💝💞💟❣、花草💐🌸💮🌹🌺🌻🌼🌷🌱🌿🍀树叶🌿🍀🍁🍂🍃月亮🌑🌒🌓🌔🌕🌖🌗🌘🌙🌚🌛🌜🌝水果🍇🍈🍉🍊🍋🍌🍍🍎🍏🍐🍑🍒🍓钱币💴💵💶💷💰💸💳交通🚂🚃🚄🚅🚆🚇🚈🚉🚊🚝🚞🚋🚌🚍🚎🚏🚐🚑🚒🚓🚔🚕🚖🚗🚘🚚🚛🚜🚲⛽🚨🚥🚦🚧⚓⛵🚣🚤🚢✈💺🚁🚟🚠🚡🚀建筑🏠🏡🏢🏣🏤🏥🏦🏨🏩🏪🏫🏬🏭🏯🏰💒🗼🗽⛪🌆🌇🌉办公📱📲☎📞📟📠🔋🔌💻💽💾💿📀🎥📺📷📹📼🔍🔎🔬🔭📡📔📕📖📗📘📙📚📓📃📜📄📰📑🔖💳✉📧📨📩📤📥📦📫📪📬📭📮✏✒📝📁📂📅📆📇📈📉📊📋📌📍📎📏📐✂🔒🔓🔏🔐🔑箭头⬆↗➡↘⬇↙⬅↖↕↔↩↪⤴⤵🔃🔄🔙🔚🔛🔜🔝参考链接[button color="info" url="https://emoji6.com/emojiall/" outline="default" target="_blank"]Emoji搜索大全链接[/button] [button color="info" url="https://www.json.cn/document/emoji/" outline="default" target="_blank"]Emoji复制大全链接[/button]感谢[quote color="warning"]感谢Jörg Angeli提供的封面图片[/quote][button color="success" url="https://unsplash.com/photos/white-clouds-CAMwIxYk5Xg" target="_blank"]图片链接[/button]

美丽生活随记
type: item
date: 2023-12-01T00:17:00+08:00
description: 2023/12[quote color="success"] 12.30-随拍 [/quote]2025/1[quote color="success"] 1.1-随拍 [/quote]

站点美化日志~
type: item
date: 2023-09-05T15:33:00+08:00
description: [card title="2023/9/4" color="danger"]添加猫猫站点添加可爱猫猫~评论区添加动图评论区添加动图~ 把链接里的图片改成Gif动图即可点击评论时动图划走#comment-textarea { background-image:url(https://res.liuzeqi.com/blog/images/plk.gif); background-size:contain; background-repeat:no-repeat; background-position:right bottom; transition:all 0.25s ease-in-out 0s; }textarea#comment-textarea:focus{ background-position-y:120px; transition:all 0.25s ease-in-out 0s; }再在后台设置里更改动图链接#comment-textarea {background-image:url(xxx);};xxx为自己想放上去的链接[/card][card title="2023/9/5" color="danger"]卡片边缘添加阴影增加层次感增加box-shadow属性xxx{ box-shadow: 0 3px 8px 6px rgba(7,17,27,0.05); }鼠标悬浮卡片响应式增加阴影xxx:hover{ box-shadow: 0 3px 8px 6px rgba(7,17,27,0.05); }彩色滚动条彩色滚动条~[/card]

站点优化日志~
type: item
date: 2023-09-05T15:15:00+08:00
description: 2023/9/2[card title="部署CDN加快响应速度" color="danger"] CDN加速~ [/card]2023/9/4[card title="显示器大小导致的页面溢出问题" color="danger"]解决方法：@media (max-width: 1500px){ }通过css样式判断屏幕分辨率大小并且调整显示布局。[/card]2025/10/15[card title="优化css设置使目录边框上移河狸" color="danger"].dropdown-menu{ position: relative; } .dropdown-menu::before{ z-index: 0; } .dropdown-menu .dropdown-item{ position: relative; z-index: 1; }[/card]2025/10/24[card title="目录栏追加当前阅读部分显示功能，绿色为已预读，黄色为正在阅读，红色为未阅读" color="danger"]/* === 目录整体样式 === */ .index-menu { font-weight: 500; font-size: 14px; /* ← 原15px → 14px，更细致 */ color: #212529; line-height: 1.5; /* ← 稍微收紧行距 */ letter-spacing: 0.1px; /* ← 字距更自然 */ --dot-size: 10px; --gutter: 18px; } /* 去掉原生 marker，用自定义圆点 */ .index-menu li { list-style: none; position: relative; padding-left: var(--gutter); } /* 链接过渡 */ .index-menu-item a, .index-menu li a { display: inline-block; text-decoration: none; color: inherit; vertical-align: middle; transition: color 1.2s ease, text-shadow 1.2s ease; font-size: 0.94em; } /* 默认圆点样式 */ .index-menu li::before { content: ""; position: absolute; left: 0; top: 1.05em; width: var(--dot-size); height: var(--dot-size); border-radius: 50%; background: #f25f5c; /* 默认粉红 */ box-shadow: 0 0 6px rgba(0, 0, 0, 0.1); transform: translateY(-50%); transition: all 0.4s ease; } /* 禁用所有动画 */ .index-menu li::before, .index-menu li::after { animation: none !important; } .index-menu li::after { content: none !important; } /* 子级尺寸调整 */ .index-menu li li { --dot-size: 8px; } .index-menu li li li { --dot-size: 7px; } /* === 红绿灯状态色 === */ /* 🟢 已过（past） */ .index-menu li.past::before { background-color: #62c370; box-shadow: 0 0 6px rgba(98,195,112,0.6); } /* 🟡 当前（current） */ @keyframes softPulseCurrent { 0% { transform: translateY(-50%) scale(1); box-shadow: 0 0 6px rgba(242,177,52,0.5); } 50% { transform: translateY(-50%) scale(1.3); box-shadow: 0 0 14px rgba(242,177,52,0.8); } 100% { transform: translateY(-50%) scale(1); box-shadow: 0 0 6px rgba(242,177,52,0.5); } } .index-menu li…