校园二手交易平台APP开发:从Android Studio工程到答辩的完整落地路径
简介这是一套基于 Android Studio 开发的校园二手交易平台 APP 完整源代码面向计算机相关专业的毕业生、课程设计学习者以及需要期末大作业参考的开发者帮助解决从零搭建移动端交易类项目的难题。压缩包共 95 个文件约 929KB以 31 个 xml 布局与配置、18 个 java 核心逻辑、21 个 png 与 12 个 jpg 界面素材为主另含 gradle 构建脚本、properties 配置及 jar 依赖等整体目录结构清晰主要代码集中在 src 目录下下载后用 Android Studio 打开即可运行。目前已有 1012 人学习关注。项目功能完善、界面美观、操作简单代码中附有注释新手也能看懂适合直接作为毕业设计、课程设计或期末大作业使用也可在此基础上二次开发具有较高的实际应用与参考价值。1. 校园二手交易平台APP从Android Studio工程到能答辩的完整落地路径每年毕业季计算机专业的毕设选题里校园二手交易平台APP的出现频率高得离谱。原因很直接业务逻辑贴近生活功能边界清晰答辩时老师一听就懂不需要费劲解释场景。但真正动手做的时候很多人卡在第一步——Android Studio装完新建工程然后呢界面怎么搭、数据怎么存、后台要不要写、源代码怎么组织才能让老师翻代码的时候不皱眉这些问题没有标准答案。这篇笔记面向的是正在做这个选题的本科生或者需要快速交付一个可演示、可讲解、可扩展的校园二手交易APP的开发者。我会从工程结构、核心功能实现、数据层设计、避坑经验到答辩加分技巧把一条完整的落地路径拆开讲。不堆概念不贴大段无注释代码每个步骤都告诉你为什么这么做、参数怎么调、出问题看哪里。读完你至少能拿到一个跑得起来的工程骨架并且知道怎么把它讲清楚。2. 工程骨架与模块划分别把所有代码塞进一个Activity2.1 为什么你的MainActivity会膨胀到两千行新手做Android项目最常见的翻车现场所有逻辑写在MainActivity里登录、列表、详情、发布、个人中心全塞进去。写到第三天改一个按钮的点击事件要在两千行代码里翻半天Android Studio的代码提示都开始卡。这不是能力问题是结构问题。校园二手交易平台的功能模块其实很清晰我一般会按下面的方式拆包com.campus.market ├── ui │ ├── login 登录/注册 │ ├── home 首页商品流 │ ├── detail 商品详情 │ ├── publish 发布商品 │ ├── message 消息/聊天 │ └── profile 个人中心 ├── data │ ├── model 数据实体类 │ ├── local Room数据库 │ └── remote 网络请求可选 ├── adapter 列表适配器 ├── util 工具类 └── base 基类Activity/Fragment这个结构的好处是答辩时老师翻代码一眼能看出你懂分层自己改功能定位到对应包就行后续想加新模块直接新建包不影响已有代码。2.2 用Fragment加BottomNavigationView搭主框架主界面用底部导航加Fragment的方式这是目前Android应用最主流的导航模式。在build.gradle里引入Material组件库dependencies { implementation com.google.android.material:material:1.9.0 implementation androidx.fragment:fragment:1.6.1 }主Activity的布局文件activity_main.xmlLinearLayout xmlns:androidhttp://schemas.android.com/apk/res/android android:layout_widthmatch_parent android:layout_heightmatch_parent android:orientationvertical FrameLayout android:idid/fragment_container android:layout_widthmatch_parent android:layout_height0dp android:layout_weight1 / com.google.android.material.bottomnavigation.BottomNavigationView android:idid/bottom_nav android:layout_widthmatch_parent android:layout_heightwrap_content app:menumenu/bottom_nav_menu / /LinearLayoutbottom_nav_menu.xml里定义四个Tab首页、发布、消息、我的。MainActivity里用FragmentManager切换BottomNavigationView bottomNav findViewById(R.id.bottom_nav); bottomNav.setOnItemSelectedListener(item - { Fragment fragment; int id item.getItemId(); if (id R.id.nav_home) { fragment new HomeFragment(); } else if (id R.id.nav_publish) { fragment new PublishFragment(); } else if (id R.id.nav_message) { fragment new MessageFragment(); } else { fragment new ProfileFragment(); } getSupportFragmentManager().beginTransaction() .replace(R.id.fragment_container, fragment) .commit(); return true; });逻辑说明replace会销毁上一个Fragment再创建新的适合功能独立的Tab。如果首页滚动位置需要保留改用hide和show组合。参数上注意commit()是异步的如果在onSaveInstanceState之后调用会抛异常稳妥做法是用commitAllowingStateLoss()但更推荐在生命周期安全的位置调用。2.3 商品列表用RecyclerView加CardView首页商品流是用户第一眼看到的东西用RecyclerView加CardView实现。先定义item布局item_goods.xml一张卡片包含商品图片、标题、价格、发布时间和发布者头像。Adapter的关键代码public class GoodsAdapter extends RecyclerView.AdapterGoodsAdapter.ViewHolder { private ListGoods goodsList; private OnItemClickListener listener; public interface OnItemClickListener { void onItemClick(int position); } public GoodsAdapter(ListGoods goodsList, OnItemClickListener listener) { this.goodsList goodsList; this.listener listener; } NonNull Override public ViewHolder onCreateViewHolder(NonNull ViewGroup parent, int viewType) { View view LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_goods, parent, false); return new ViewHolder(view); } Override public void onBindViewHolder(NonNull ViewHolder holder, int position) { Goods goods goodsList.get(position); holder.tvTitle.setText(goods.getTitle()); holder.tvPrice.setText(¥ goods.getPrice()); // 图片加载用Glide后面会讲 Glide.with(holder.itemView.getContext()) .load(goods.getImageUrl()) .placeholder(R.drawable.ic_placeholder) .into(holder.ivCover); holder.itemView.setOnClickListener(v - listener.onItemClick(position)); } Override public int getItemCount() { return goodsList null ? 0 : goodsList.size(); } static class ViewHolder extends RecyclerView.ViewHolder { ImageView ivCover; TextView tvTitle, tvPrice; ViewHolder(View itemView) { super(itemView); ivCover itemView.findViewById(R.id.iv_cover); tvTitle itemView.findViewById(R.id.tv_title); tvPrice itemView.findViewById(R.id.tv_price); } } }参数说明placeholder是图片加载完成前显示的占位图避免卡片高度跳动。onItemClick回调把点击事件交给Activity或Fragment处理Adapter不持有Context以外的业务逻辑这是保持Adapter干净的关键。如果列表数据量大在onBindViewHolder里不要做耗时操作图片加载必须异步。3. 数据存储方案选型Room、SQLite还是直接上后端3.1 本地数据库用Room别手写SQLiteOpenHelper校园二手交易平台的数据实体至少有用户、商品、分类、消息、收藏。如果全部用本地存储Room是首选。它本质上是SQLite的封装但提供了编译期SQL校验和LiveData支持代码量比手写DBHelper少一半。先加依赖dependencies { def room_version 2.5.2 implementation androidx.room:room-runtime:$room_version annotationProcessor androidx.room:room-compiler:$room_version }定义商品实体Entity(tableName goods) public class Goods { PrimaryKey(autoGenerate true) public int id; ColumnInfo(name title) public String title; ColumnInfo(name price) public double price; ColumnInfo(name description) public String description; ColumnInfo(name image_url) public String imageUrl; ColumnInfo(name category) public String category; ColumnInfo(name publish_time) public long publishTime; ColumnInfo(name publisher_id) public int publisherId; }DAO接口Dao public interface GoodsDao { Query(SELECT * FROM goods ORDER BY publish_time DESC) LiveDataListGoods getAllGoods(); Query(SELECT * FROM goods WHERE category :category ORDER BY publish_time DESC) LiveDataListGoods getGoodsByCategory(String category); Query(SELECT * FROM goods WHERE title LIKE % || :keyword || %) LiveDataListGoods searchGoods(String keyword); Insert void insert(Goods goods); Delete void delete(Goods goods); }数据库类Database(entities {Goods.class, User.class, Message.class}, version 1, exportSchema false) public abstract class AppDatabase extends RoomDatabase { private static volatile AppDatabase INSTANCE; public abstract GoodsDao goodsDao(); public abstract UserDao userDao(); public abstract MessageDao messageDao(); public static AppDatabase getInstance(Context context) { if (INSTANCE null) { synchronized (AppDatabase.class) { if (INSTANCE null) { INSTANCE Room.databaseBuilder( context.getApplicationContext(), AppDatabase.class, campus_market.db) .fallbackToDestructiveMigration() .build(); } } } return INSTANCE; } }逻辑说明fallbackToDestructiveMigration在版本升级时直接重建表开发阶段方便但上线前必须改成正式的Migration否则用户数据会丢。LiveData返回值让UI层自动感知数据变化不需要手动刷新列表。搜索用LIKE模糊匹配数据量超过几千条时建议加FTS全文搜索虚拟表。3.2 什么情况下必须加后端纯本地存储的APP在答辩时会被问到一个致命问题两个用户怎么交易如果商品只存在自己手机里别人根本看不到。所以校园二手交易平台通常需要后端。但后端的选择有讲究方案开发成本适合场景答辩风险纯本地Room低演示单机功能被问数据共享时答不上Firebase中快速上线国内网络不稳定自建Spring Boot高功能完整开发周期长Bmob/LeanCloud低毕设够用免费额度有限我的建议如果时间充裕用Spring Boot写一个简单的REST API部署在本地或云服务器上Android端用Retrofit调用。如果只剩两周用Bmob这类后端云把用户和商品数据放上去本地Room只做缓存。答辩时重点讲清楚数据流向用户操作 → 网络请求 → 后端处理 → 数据库读写 → 返回结果 → UI更新。Retrofit的基本配置public class ApiClient { private static final String BASE_URL http://你的服务器地址:8080/api/; private static Retrofit retrofit; public static Retrofit getInstance() { if (retrofit null) { retrofit new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); } return retrofit; } }参数说明BASE_URL必须以/结尾否则Retrofit会抛异常。GsonConverterFactory负责JSON和Java对象的转换。如果后端返回的时间格式不是标准时间戳需要自定义Gson适配器。4. 核心功能实现登录、发布、图片选择与聊天4.1 登录注册用SharedPreferences加Room双写登录状态用SharedPreferences存用户信息用Room存。登录成功后写入SharedPreferences sp getSharedPreferences(user_session, MODE_PRIVATE); sp.edit() .putInt(user_id, user.getId()) .putString(username, user.getUsername()) .putBoolean(is_login, true) .apply();下次启动时在SplashActivity里判断boolean isLogin sp.getBoolean(is_login, false); if (isLogin) { startActivity(new Intent(this, MainActivity.class)); } else { startActivity(new Intent(this, LoginActivity.class)); } finish();注意apply()是异步写入commit()是同步。登录状态这种小数据用apply()就够了。密码不要明文存SharedPreferences至少做一次MD5或SHA256哈希。答辩时老师如果问安全性这就是加分点。4.2 发布商品从相册选图到压缩上传发布页面需要标题输入框、价格输入框、分类下拉、描述多行输入、图片选择九宫格、发布按钮。图片选择用系统相册IntentIntent intent new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); intent.setType(image/*); startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE);拿到Uri后显示在ImageView里同时保存Uri列表。上传前必须压缩否则一张照片几MB上传慢还费流量public static File compressImage(Context context, Uri uri) throws IOException { InputStream input context.getContentResolver().openInputStream(uri); Bitmap bitmap BitmapFactory.decodeStream(input); if (input ! null) input.close(); // 按比例缩放到最大边1280 int maxSize 1280; int width bitmap.getWidth(); int height bitmap.getHeight(); float scale Math.min((float) maxSize / width, (float) maxSize / height); if (scale 1) { bitmap Bitmap.createScaledBitmap(bitmap, (int) (width * scale), (int) (height * scale), true); } File output new File(context.getCacheDir(), compressed_ System.currentTimeMillis() .jpg); FileOutputStream fos new FileOutputStream(output); bitmap.compress(Bitmap.CompressFormat.JPEG, 80, fos); fos.close(); bitmap.recycle(); return output; }参数说明maxSize控制最大边像素1280足够手机屏幕显示。compress的第二个参数是质量80在清晰度和体积之间比较平衡。压缩后图片存在cache目录上传完可以删。如果要做九宫格预览用RecyclerView加GridLayoutManagerspanCount设为3。4.3 聊天功能的最小实现校园二手交易平台的聊天不需要做得像微信那么复杂。一个可用的最小方案消息存Room用Handler定时轮询新消息或者用WebSocket。毕设推荐轮询实现简单答辩好讲。消息实体Entity(tableName message) public class Message { PrimaryKey(autoGenerate true) public int id; public int fromUserId; public int toUserId; public String content; public long timestamp; public boolean isRead; }聊天界面用RecyclerView根据fromUserId判断消息是发送方还是接收方分别加载不同的item布局。轮询用Handler加postDelayedprivate Handler handler new Handler(Looper.getMainLooper()); private Runnable pollTask new Runnable() { Override public void run() { // 请求新消息 loadNewMessages(); handler.postDelayed(this, 3000); // 3秒轮询一次 } };注意onDestroy里必须handler.removeCallbacks(pollTask)否则内存泄漏。轮询间隔3到5秒比较合适太短耗电太长消息延迟明显。5. 避坑与排查那些让答辩翻车的细节5.1 图片加载用Glide别自己写缓存现象列表滑动卡顿图片错位内存溢出。原因手动用BitmapFactory解码大图没有缓存机制RecyclerView复用Item时图片没取消。解决用Glide一行代码搞定加载、缓存、生命周期绑定。如果Glide报错You cannot start a load for a destroyed activity检查是否在onDestroy之后还在加载用Glide.with(fragment)而不是Glide.with(context)。5.2 Room主线程查询报错现象Cannot access database on the main thread。原因Room默认禁止主线程做数据库操作。解决所有DAO查询返回LiveData或RxJava的Observable或者在allowMainThreadQueries()里开启主线程查询——但只建议在测试时用正式代码必须异步。用ExecutorService或AsyncTask已废弃执行插入和删除。5.3 Android Studio资源重复错误现象Duplicate resources编译失败。原因图片文件名重复或者不同drawable目录下有同名文件。解决检查res/drawable、res/mipmap下是否有同名文件Android Studio的Build菜单里点Clean Project再Rebuild。如果用了第三方库检查是否和库里的资源名冲突在build.gradle里加resourcePrefix。5.4 网络请求在Android 9以上明文HTTP被拦截现象CLEARTEXT communication not permitted。原因Android 9开始默认禁止明文HTTP。解决在AndroidManifest.xml的application标签加android:usesCleartextTraffictrue或者用HTTPS。毕设如果后端没有HTTPS加这个属性最快但答辩时要说明生产环境应该用HTTPS。5.5 混淆后APP崩溃现象Debug正常Release包闪退。原因ProGuard混淆了反射用到的类。解决在proguard-rules.pro里保留实体类和Retrofit接口-keep class com.campus.market.data.model.** { *; } -keep interface com.campus.market.data.remote.** { *; } -keepattributes Signature -keepattributes *Annotation*6. 答辩加分项把源代码讲成故事6.1 用一张架构图说清数据流向答辩时老师最想听到的是你知不知道自己的数据从哪来到哪去。准备一张图画清楚UI层、ViewModel层、Repository层、数据源层的关系。用户点击发布 → PublishFragment收集输入 → PublishViewModel调用Repository → Repository判断网络可用性 → 在线走Retrofit离线走Room → 结果通过LiveData回到UI。这张图讲完老师基本认可你的工程思维。6.2 准备三个可演示的边界场景不要只演示正常流程。准备三个边界场景第一断网情况下发布商品提示“网络不可用已保存到草稿”第二搜索不存在的商品显示空状态页而不是白屏第三连续快速点击发布按钮按钮置灰防止重复提交。这三个场景能体现你对异常处理的理解比多做一个页面管用。6.3 源代码管理用Git提交记录就是开发日志从第一天就用Git每次完成一个功能提交一次commit message写清楚做了什么。答辩时如果老师问开发过程直接打开提交记录比口头描述有说服力。.gitignore里排除build/、.idea/、local.properties。如果学校要求提交源代码压缩包用git archive导出不要直接压缩整个工程目录否则会把编译产物也打进去。git archive --formatzip --outputcampus_market_src.zip HEAD这条命令只导出被Git跟踪的文件干净利落。6.4 一个我踩过的坑当年我做毕设的时候把所有图片直接放在drawable目录没有分密度结果在低分辨率手机上图片被拉伸得没法看。后来改成drawable-nodpi让系统不缩放自己用Glide控制显示尺寸。这个细节答辩时老师不一定问但如果你主动提说明你考虑过适配问题。做Android开发设备碎片化是绕不过去的能在毕设里体现这个意识比多写两个页面更有价值。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Windows运行库系统性修复指南:DirectX、.NET、VC++与3DM合集实战

Windows运行库系统性修复指南:DirectX、.NET、VC++与3DM合集实战

1. 这不是“一键修复”,而是运行库问题的系统性认知重建你是不是也遇到过:双击游戏图标,弹出“MSVCP140.dll 丢失”;点开某个设计软件,提示“.NET Framework 4.8 未安装或损坏”;甚至刚装完系统&#xff0c…

2026/10/10 20:56:40 阅读更多 →
大模型API聚合平台选型指南:从模型覆盖到容灾机制的核心Checklist

大模型API聚合平台选型指南:从模型覆盖到容灾机制的核心Checklist

最近一年,身边越来越多的企业朋友开始认真考虑接入大模型,而他们问我的第一个问题往往不是“该选哪家模型”,而是“要不要走API聚合平台”。这个问题问得很实在。我见过不少团队一开始图省事直接调各家模型官方的API,结果账号管理…

2026/10/10 20:56:39 阅读更多 →
从爬楼梯到跃迁:个人成长的非线性突破之道

从爬楼梯到跃迁:个人成长的非线性突破之道

"你的成长,不是爬楼梯,而是“跃迁”"去年我参加一个技术社区的小型聚会,有位做后端开发七八年的朋友跟我说了一句话,我到现在还记得:“我每年都在学新东西、做新项目,技术栈越用越新,…

2026/10/10 20:56:39 阅读更多 →

最新新闻

焊接缺陷检测数据集:YOLO+VOC双格式训练与避坑实践

焊接缺陷检测数据集:YOLO+VOC双格式训练与避坑实践

简介:面向目标检测与工业视觉算法开发者,提供一套焊接缺陷检测数据集,可用于焊接质量监控、工艺异常排查、钢结构与汽车零部件制造质检等场景,也适合目标检测学习者进行 YOLO、SSD 等模型的训练、验证与算法对比。压缩包约 153.88…

2026/10/10 22:38:23 阅读更多 →
心血管预测模型Python源码拆解:从数据到推理的完整方案

心血管预测模型Python源码拆解:从数据到推理的完整方案

简介:这份Python源码集锦聚焦心血管疾病预测模型的完整实现,面向具备一定Python基础、希望进入医疗数据分析或人工智能领域的学习者与参赛者。资源包共3个文件,包含1个ipynb交互式笔记本、1个py脚本和1个csv数据集,压缩包约83KB&a…

2026/10/10 22:38:23 阅读更多 →
爬楼梯与斐波那契:动态规划入门到机考实战全解析

爬楼梯与斐波那契:动态规划入门到机考实战全解析

机考刷题系列第一篇,我选了 LeetCode 70 爬楼梯。这题在 LeetCode 上难度是简单,但它在机考里出现的频率相当高,尤其适合刚接触算法刷题的人拿来建立动态规划的直觉。题目一句话就能说清:假设你正在爬楼梯,需要 n 阶才…

2026/10/10 22:38:22 阅读更多 →
MATLAB中CNN图像分类实战:无GPU环境下的训练与参数调优指南

MATLAB中CNN图像分类实战:无GPU环境下的训练与参数调优指南

简介:面向图像分类任务,这份压缩包提供一套基于卷积神经网络CNN的完整Matlab实现,适合入门学习者、课程设计者及需要在Matlab环境下快速搭建分类模型的开发者。包内共18个文件,以16个m脚本为主体,辅以2个mat数据文件&a…

2026/10/10 22:38:22 阅读更多 →
Jev-Mobile架构深拆:低频VLM高层规划+高频Jev执行器,79%任务成功率与32.7%端到端延迟下降是怎么做到的

Jev-Mobile架构深拆:低频VLM高层规划+高频Jev执行器,79%任务成功率与32.7%端到端延迟下降是怎么做到的

Jev-Mobile架构深拆:低频VLM高层规划高频Jev执行器,79%任务成功率与32.7%端到端延迟下降是怎么做到的 【免费下载链接】jev-chat-jarvis The chat decision assistant: before you reply, Jev reads the chat, judges intent and risk, and drafts repli…

2026/10/10 22:38:22 阅读更多 →
教务系统Android端对接实战:反爬、协议逆向与离线缓存

教务系统Android端对接实战:反爬、协议逆向与离线缓存

简介:本资源是一份面向高校计算机与软件工程专业本科生及Android开发初学者的毕业设计类技术文档,聚焦移动教务系统开发实践,解决传统Web端教务平台在移动端访问不便、离线不可用、交互体验弱等痛点。文档详细阐述了基于Android客户端的教务信…

2026/10/10 22:37:21 阅读更多 →

日新闻

卫星轨道分类全解析:从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 阅读更多 →