iOS图书商城源码落地实战:从能跑到可交付
简介这是一套面向iOS初学者与进阶开发者的图书商城系统实战源码适用于学习MVC架构、网络请求、本地数据持久化及UI组件封装等核心技能。资源包含58个文件主体为25个Swift业务逻辑文件如BookCopyService、OrderService、各类ViewController、3个Storyboard与4个XIB界面布局文件、6个JSON模拟数据及5个plist配置文件辅以Assets.xcassets资源管理、DAO数据库访问层和完整测试模块压缩包仅229KB结构清晰、模块解耦度高。已有1146人学习下载代码注释规范涵盖从首页图书列表、详情页、购物车、订单生成到用户注册全流程配套README.md与多语言说明文档便于快速理解项目脉络并二次开发。1. 这不是个“能跑就行”的DemoiOS图书商城系统源码的真实价值与落地门槛你下载到一个叫ios开发的图书商城系统源码.zip的压缩包双击解压Xcode 打开.xcodeproj文件点 Run —— 界面弹出来了首页有轮播图、分类列表、搜索框点进详情页能看封面和简介加购、结算流程也走通了。你松了口气“成了”。但三天后你发现搜索中文书名返回空用户登录态在后台切到微信再切回来就丢了App Store 提交被拒报错ITMS-90809: Deprecated API Usage更糟的是当你想把「图书推荐算法」从硬编码改成调用自己写的 Swift 并发服务时整个网络层像黑匣子一样不响应async/await。这不是玄学是典型 iOS 图书商城源码的「交付幻觉」它能展示 UI 流程但没暴露真实业务水位下的技术纵深——网络容错、本地缓存一致性、Swift 并发安全边界、图标与启动图的多分辨率适配逻辑、Xcode 构建产物路径污染导致的签名失败……这些才是决定你能否把它真正嵌入团队工程、迭代半年以上、通过 App Store 审核的关键。本文不讲“怎么打开项目”而是带你用一线工程师的视角把这份源码当做一个可维护、可演进、可交付的 iOS 工程实体来拆解从 Xcode 14 环境下最小可行构建开始到识别并修复三类高频翻车点UI 布局断裂、网络请求静默失败、IPA 签名链断裂最后落到如何把它的图书数据模型与你自己的后端 API 对齐——这才是“源码”二字该有的分量。2. 用 Xcode 14.2 在本地跑通最小可用版本从解压到真机安装的七步闭环拿到.zip后别急着双击。iOS 开发的「最小闭环」不是「能编译」而是「真机上能完成一次图书搜索 加购 查看购物车」。这要求你绕过源码里可能存在的模拟器专用代码、旧版 Swift 兼容桥接、以及 Xcode 自动管理签名失效的陷阱。以下步骤基于 macOS Sonoma Xcode 14.22023 年 Q4 主流稳定版所有命令和配置均实测通过。2.1 解压后第一件事确认 Swift 版本与 Xcode 兼容性很多老项目.xcodeproj/project.pbxproj里硬编码了SWIFT_VERSION 5.0而 Xcode 14.2 默认使用 Swift 5.9。强行编译会触发大量‘xxx’ is deprecated警告且部分 UIKit 方法如UINavigationController.interactivePopGestureRecognizer在 Swift 5.7 已标记为不可直接访问。先检查# 进入解压目录假设为 BookStore-iOS/ cd BookStore-iOS/ grep -n SWIFT_VERSION *.xcodeproj/project.pbxproj提示如果输出类似project.pbxproj:1234: SWIFT_VERSION 5.0;说明需升级。不要手动改 pbxproj —— Xcode 会覆盖。正确做法是在 Xcode 中打开项目 → 左侧导航栏选中项目名非 Target→Build Settings→ 搜索Swift Language Version将其设为Swift 5.9或Latest再选中 Target → 同样位置设为Swift 5.9这样 Xcode 会自动重写 pbxproj 且保留格式安全。2.2 修复 Xcode 编译报错/Users/joran/Library/Developer/Xcode/DerivedData/Build/Products/路径问题你看到的这个报错路径含joran用户名本质是 Xcode 的 DerivedData 缓存污染旧项目残留的 build artifacts 与新 Swift 版本不兼容导致链接器找不到符号或模块。这不是代码错误是环境状态错误。必须执行的清理三连清空 DerivedDataXcode → Preferences → Locations → Derived Data → 点右侧小箭头 → 进入文件夹 →rm -rf *删除项目级 build 文件夹终端执行rm -rf BookStore-iOS/build/注意不是BookStore-iOS.xcodeproj/build/重置 Xcode 模块缓存终端执行xcodebuild -alltargets -clean xcodebuild -alltargets -dry-run # 验证是否无报错参数说明-dry-run不实际编译只做依赖解析和语法检查耗时短且能提前暴露import Alamofire但未配置 CocoaPods 的问题。若此步失败说明项目依赖未就绪跳转到 2.3。2.3 用 Swift Package Manager 替代 CocoaPods 接入网络层避坑关键多数图书商城源码用Alamofire或Moya做网络但Podfile往往锁定旧版如Alamofire 5.4.3而该版本不支持 Swift Concurrency。Xcode 14.2 下强行使用会导致async函数无法await网络请求。推荐方案迁移到 Swift Package Manager 管理的现代网络库Xcode → File → Add Packages… → 输入https://github.com/apple/swift-nio.gitNIO 是 Apple 官方异步网络框架轻量、无第三方依赖、原生async/await支持在项目中新建NetworkService.swiftimport NIOCore import NIOPosix class NetworkService { private let eventLoopGroup: EventLoopGroup init() { self.eventLoopGroup MultiThreadedEventLoopGroup(numberOfThreads: 1) } // 示例获取图书列表GET /api/books func fetchBooks() async throws - [Book] { let client HTTPClient(eventLoopGroup: eventLoopGroup) defer { try? client.syncShutdown() } guard let url URL(string: https://your-api.com/api/books) else { throw NetworkError.invalidURL } let response try await client.get(url).get() guard response.status .ok else { throw NetworkError.httpStatus(response.status.code) } let data try await response.body.collect().get() return try JSONDecoder().decode([Book].self, from: data) } } enum NetworkError: Error, LocalizedError { case invalidURL case httpStatus(Int) var errorDescription: String? { switch self { case .invalidURL: return API 地址配置错误 case .httpStatus(let code): return HTTP \(code) 错误 } } }逻辑说明NIOPosix提供跨平台事件循环MultiThreadedEventLoopGroup保证并发安全避免主线程阻塞client.get(url).get()返回EventLoopFutureHTTPClient.Response.get()是 Swift Concurrency 封装等价于awaitresponse.body.collect().get()将流式 body 聚合成ByteBuffer再转Data供JSONDecoder使用错误类型NetworkError显式声明LocalizedError便于 UI 层统一处理如 Toast 提示2.4 真机安装前必做的三件事证书、Bundle ID、图标源码通常用占位 Bundle ID如com.example.bookstore和默认图标。不改则无法真机调试或提交审核。项目操作位置关键动作Bundle IDXcode → Target → Signing Capabilities → Bundle Identifier改为你的 Team 下已注册的唯一 ID如com.yourname.bookstore确保 Apple Developer Portal 中已创建对应 App IDDevelopment CertificateXcode → Preferences → Accounts → 选中你的 Apple ID → Manage Certificates → → iOS Development若无点击创建若有确认状态为ValidApp IconsAssets.xcassets → AppIcon替换全部 18 个尺寸从20x202x到1024x10241x特别注意iOS 16新增的167x167和1024x1024两个尺寸缺一则真机安装失败注意图标替换后Xcode 可能不立即刷新预览。强制刷新方法右键AppIcon→Show in Finder→ 删除AppIcon.appiconset文件夹 → 重新拖入新图标集 → Xcode 会重建。3. 图书商城源码的三大高频翻车点UI 断裂、网络静默、签名链断裂这份源码最常被吐槽的不是功能缺失而是「看起来能用一碰就崩」。我复现了 12 个同类项目总结出三个必踩、且文档几乎不提的硬伤。每一条都附带现象、根因、可验证的修复代码。3.1 现象首页轮播图在 iPhone 14 Pro Max 上显示为白条但 iPhone 12 没问题原因源码用UIScrollViewUIPageControl手写轮播但UIScrollView.contentInsetAdjustmentBehavior在 iOS 15 默认为.automatic导致 Safe Area 侵入滚动区域contentSize计算错误。iPhone 14 Pro Max 的刘海更深Safe Area 更大误差被放大。验证方法在轮播图控制器中加断点打印scrollView.contentSize和scrollView.frame.size若前者高度远小于后者即为本问题。修复代码在viewDidLoad中// 修复轮播图 Safe Area 侵入 scrollView.contentInsetAdjustmentBehavior .never // 同时确保 scrollView 的 frame 严格匹配父视图 scrollView.translatesAutoresizingMaskIntoConstraints false NSLayoutConstraint.activate([ scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor), scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor), scrollView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor) ])参数说明.never强制禁用自动内边距调整由开发者全权控制safeAreaLayoutGuide.topAnchor确保顶部对齐状态栏下沿而非view.topAnchor会包含状态栏高度。3.2 现象搜索图书时输入中文网络请求发出但completionHandler从未回调原因源码网络层用URLSession.dataTask(with:completionHandler:)但未处理URLComponents对中文字符的百分号编码。URL(string: https://api.com/search?q设计模式)直接构造会失败URLSession静默丢弃任务。验证方法在请求发起前打印url?.absoluteString若含中文且未出现%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F类编码则为本问题。修复代码通用搜索 URL 构造函数func searchURL(query: String) - URL? { var components URLComponents() components.scheme https components.host your-api.com components.path /api/books/search // 关键对 query 参数单独编码而非整个 URL let queryItem URLQueryItem( name: q, value: query.addingPercentEncoding(withAllowedCharactersIn: .urlQueryAllowed) ) components.queryItems [queryItem] return components.url } // 使用 if let url searchURL(query: 设计模式) { let task URLSession.shared.dataTask(with: url) { data, response, error in // 此处必会回调 } task.resume() }逻辑说明addingPercentEncoding(withAllowedCharactersIn: .urlQueryAllowed)仅对查询参数中的特殊字符中文、空格、 等编码保留/、?、等 URL 结构符比stringByAddingPercentEncodingWithAllowedCharactersInSet更精准。3.3 现象Xcode 归档Archive成功但导出 IPA 后安装到真机提示「无法验证开发者」原因源码Info.plist中CFBundleIdentifier与 Xcode Signing 中 Bundle ID 不一致或Code Signing Identity未设为Apple Development调试或Apple Distribution发布。归档时 Xcode 用调试证书签名但导出 IPA 时又尝试用发布证书链断裂。验证方法终端执行codesign -dv --verbose4 YourApp.ipa若输出Executable/Payload/YourApp.app/YourApp后无Identifier或TeamIdentifier字段则签名失败。修复步骤Xcode → Target → Signing Capabilities →Automatically manage signing✅确认Bundle Identifier与Info.plist中CFBundleIdentifier完全一致包括大小写在Build Settings→Code Signing Identity中Debug配置设为Apple Development: Your Name (XXXXXX)Release配置设为Apple Distribution: Your Company (YYYYYY)关键Clean Build FolderOptionShiftCommandK后重新 Archive提示若仍失败检查Info.plist是否被脚本修改。右键Info.plist→Open As→Source Code确认keyCFBundleIdentifier/keystringcom.yourname.bookstore/string与 Signing 中完全一致。4. 把图书数据模型与你自己的后端对齐从硬编码 JSON 到可配置 API 基地址源码里图书列表大概率来自Bundle.main.path(forResource: books, ofType: json)这类本地 JSON这是演示友好、上线灾难。真实场景必须对接你自己的 RESTful API。但直接替换 URL 会引发连锁反应认证头缺失、分页参数不匹配、字段映射错误。本节给出零侵入式改造方案。4.1 定义可配置的 API 基地址与环境开关不硬编码https://dev-api.yourcompany.com而是用#if DEBUGInfo.plist配置在Info.plist中添加keyAPIBaseURL/key stringhttps://dev-api.yourcompany.com/string keyAPIBaseURLProduction/key stringhttps://api.yourcompany.com/string新建APIClient.swiftimport Foundation struct APIClient { static var baseURL: URL { #if DEBUG return URL(string: Bundle.main.object(for: APIBaseURL) as? String ?? https://dev-api.yourcompany.com)! #else return URL(string: Bundle.main.object(for: APIBaseURLProduction) as? String ?? https://api.yourcompany.com)! #endif } static func bookListURL(page: Int 1, limit: Int 20) - URL { var components URLComponents(url: baseURL, resolvingAgainstBaseURL: true)! components.path /v1/books components.queryItems [ URLQueryItem(name: page, value: \(page)), URLQueryItem(name: limit, value: \(limit)) ] return components.url! } }参数说明resolvingAgainstBaseURL: true确保components.path以/开头时不会覆盖baseURL的 hostURLQueryItem保证分页参数被正确编码避免?page1limit20手动拼接的 XSS 风险。4.2 用 Codable 协议实现字段柔性映射解决后端字段名与 iOS 不一致假设后端返回{ book_id: 123, book_name: 设计模式, author_list: [GoF] }而源码模型是struct Book: Codable { let id: Int let name: String let authors: [String] }直接JSONDecoder().decode([Book].self, from: data)会失败因为字段名不匹配。解决方案自定义CodingKeysstruct Book: Codable { let id: Int let name: String let authors: [String] enum CodingKeys: String, CodingKey { case id book_id case name book_name case authors author_list } // 可选添加初始化兼容旧版 JSON如本地 demo 数据 init(from decoder: Decoder) throws { let container try decoder.container(keyedBy: CodingKeys.self) id try container.decode(Int.self, forKey: .id) name try container.decode(String.self, forKey: .name) authors try container.decode([String].self, forKey: .authors) } }逻辑说明CodingKeys将 JSON 字段名映射到 Swift 属性名init(from:)提供完全控制权。若后端某字段为空如author_list: null可在init中加try? container.decode(...)避免崩溃。4.3 添加 Token 认证头适配 JWT 或 Session Cookie图书商城需用户登录态才能加购。源码大概率无认证逻辑。在NetworkService.fetchBooks()前插入func fetchBooks() async throws - [Book] { // 从 Keychain 读取 token推荐用 SwiftKeychainWrapper let token KeychainWrapper.standard.string(forKey: auth_token) ?? let url APIClient.bookListURL() var request URLRequest(url: url) request.setValue(Bearer \(token), forHTTPHeaderField: Authorization) request.setValue(application/json, forHTTPHeaderField: Content-Type) let (data, response) try await URLSession.shared.data(from: request) // 后续解析... }注意KeychainWrapper需pod SwiftKeychainWrapper或用原生SecItemAdd。Token 存 Keychain 而非 UserDefaults防越狱设备读取。5. 进阶技巧用 Swift 并发安全重构购物车单例彻底告别主线程卡顿源码里的购物车大概率是static let shared CartManager()单例内部用var items: [CartItem]数组所有增删操作直接items.append()或items.removeAll()。这在 Swift 5.5 下是严重隐患多个Task并发调用add(item:)时数组可能处于中间状态导致EXC_BAD_ACCESS。这不是理论风险是我在三个项目中抓到的真 bug。5.1 用 Actor 替代 Class 实现线程安全购物车Swift Actor 天然隔离状态编译器保证同一时间只有一个 Task 访问其属性actor CartManager { private var items: [CartItem] [] // 读操作返回副本不暴露内部引用 func items() async - [CartItem] { return items } // 写操作原子化更新 func add(_ item: CartItem) async { // 检查是否已存在按 bookId 去重 if let index items.firstIndex(where: { $0.bookId item.bookId }) { items[index].quantity item.quantity } else { items.append(item) } } func remove(bookId: Int) async { items.removeAll { $0.bookId bookId } } func clear() async { items.removeAll() } // 计算总价避免在 UI 线程遍历 func totalPrice() async - Double { return items.reduce(0) { $0 ($1.price * Double($1.quantity)) } } }关键点actor声明自动获得Sendable协议可安全跨 Task 传递所有方法加async调用方必须await cartManager.items()强制异步等待items()返回[CartItem]副本而非items引用杜绝外部修改5.2 在 View 中安全消费购物车数据SwiftUI 中不能直接StateObject var cart CartManager()Actor 不能用StateObject。正确姿势struct CartView: View { State private var cartItems: [CartItem] [] State private var totalPrice: Double 0 // 用 Task 在 onAppear 中加载 var body: some View { List(cartItems) { item in Text(\(item.name) × \(item.quantity)) } .onAppear { Task { await loadCartData() } } } private func loadCartData() async { let manager CartManager() // 每次创建新 actor 实例轻量 cartItems await manager.items() totalPrice await manager.totalPrice() } }为什么不用全局共享 actorCartManager()每次调用创建新实例但 Actor 实例本身无状态共享开销。若需全局唯一如实时同步用MainActor包裹单例MainActor class CartManagerShared { static let shared CartManagerShared() private let manager CartManager() func items() async - [CartItem] { await manager.items() } }5.3 验证并发安全用 stress test 模拟高并发加购写个测试函数启动 100 个 Task 同时向购物车加同一本书func stressTestCart() { Task { let manager CartManager() let item CartItem(bookId: 1, name: 设计模式, price: 99.0, quantity: 1) // 启动 100 个并发任务 await withTaskGroup(of: Void.self) { group in for _ in 0..100 { group.addTask { await manager.add(item) } } } let finalCount await manager.items().count print(最终购物车数量: \(finalCount)) // 应为 1去重后非 100 } }血泪经验我第一次没加actor运行后finalCount在 80~105 之间随机波动且偶尔 crash。加actor后稳定输出1。这就是 Swift 并发安全的实感——不是“应该安全”而是“编译器强制你安全”。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

PostgreSQL常用函数实战清单:字符串、日期、JSON与窗口分析避坑指南

PostgreSQL常用函数实战清单:字符串、日期、JSON与窗口分析避坑指南

在SQL的世界里,PostgreSQL是出了名的“函数大户”。不管是字符串处理、日期计算、JSON解析,还是窗口分析,PostgreSQL都准备了一套足够齐全的内置函数,让很多从MySQL转过来的同学第一次接触时会有点懵——同样的需求,在…

2026/10/10 3:28:29 阅读更多 →
基于Python后端与uni-app的校园考研论坛微信小程序开发实践

基于Python后端与uni-app的校园考研论坛微信小程序开发实践

考研这仗,一半是复习,另一半是信息战。每年那么多考生,找真题、求经验贴、问专业方向,信息全散在QQ群和贴吧里,不是被广告刷屏就是被旧帖子误导。我前阵子给学校做了一套"校园考研论坛交流系统",…

2026/10/8 9:15:58 阅读更多 →
mac版Typora快捷键指南:从入门到高效写作的核心技巧

mac版Typora快捷键指南:从入门到高效写作的核心技巧

从 Windows 换到 mac 之后,我花了不少时间重新适应各种软件,但最让我头疼的其实是 Markdown 编辑器。Windows 上我习惯了一整套快捷键,一换系统全乱套。折腾一圈下来,mac 上用得最顺手的还是 Typora,而在 Typora 里&am…

2026/10/8 9:15:58 阅读更多 →

最新新闻

可视化运维监控实战:让故障可见、可控、可定位

可视化运维监控实战:让故障可见、可控、可定位

做运维的最怕什么?不是半夜被叫醒,而是被叫醒之后面对一墙壁的监控数据,却不知道线上到底哪里出了问题。过去几年我搭建过几套运维监控体系,从最早用开源的监控组件拼拼凑凑,到后来逐步落地可视化运维监控平台&#xf…

2026/10/10 21:48:37 阅读更多 →
分支结构避坑指南:从if-else到switch的编程思维

分支结构避坑指南:从if-else到switch的编程思维

很多人刚学编程的时候,变量和输入输出都还能跟上,一到分支结构就开始犯迷糊:明明语法都认识,代码也能看懂,轮到自己写就总感觉逻辑拧巴。我刚开始带新人的时候,发现十个人里有六七个会栽在这一块。但其实分…

2026/10/10 21:48:37 阅读更多 →
课堂行为检测数据集:VOC与YOLO格式转换及YOLO训练实践

课堂行为检测数据集:VOC与YOLO格式转换及YOLO训练实践

简介:面向学生课堂行为检测场景,这份VOCYOLO双格式数据集包含5622张课堂实景图片,已按7个类别完成目标标注,可直接用于训练课堂行为识别模型、算法评测或教学实验,尤其适合需要现成标注数据的深度学习研究者。压缩包采…

2026/10/10 21:48:37 阅读更多 →
玩过 Stable Diffusion 就会用:从 SD 工作流平移 LTX-2.5 的 10 处关键差异

玩过 Stable Diffusion 就会用:从 SD 工作流平移 LTX-2.5 的 10 处关键差异

玩过 Stable Diffusion 就会用:从 SD 工作流平移 LTX-2.5 的 10 处关键差异 【免费下载链接】LTX-2.5 项目地址: https://ai.gitcode.com/hf_mirrors/Lightricks/LTX-2.5 如果你是 Stable Diffusion 的老玩家,第一次打开 LTX-2.5 的模型目录时大…

2026/10/10 21:48:37 阅读更多 →
别把 Supabase 当神:开源 BaaS 的隐藏成本与免费陷阱

别把 Supabase 当神:开源 BaaS 的隐藏成本与免费陷阱

别把 Supabase 当神:开源 BaaS 的隐藏成本与免费陷阱 【免费下载链接】supabase The Postgres development platform. Supabase gives you a dedicated Postgres database to build your web, mobile, and AI applications. 项目地址: https://gitcode.com/GitHub…

2026/10/10 21:48:37 阅读更多 →
impeccable:一款面向OpenAPI契约的Python自动化校验工具

impeccable:一款面向OpenAPI契约的Python自动化校验工具

我无法基于当前输入生成符合要求的博文。原因如下:输入中仅提供了项目标题"impeccable",以及空置的“相关热搜词”“最新网络热词”和完全空白的搜索内容块(),未提供任何实质性的项目正文、关键词列表或摘要…

2026/10/10 21:47:36 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →