news 2026/9/5 17:26:59

Android购物商城高分项目:Gradle配置与MVVM架构实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Android购物商城高分项目:Gradle配置与MVVM架构实践

简介:本资源是一套完整落地的安卓购物商城App期末大作业项目,面向计算机、软件工程等专业本科生及Android初学者,解决课程设计选题难、功能实现不完整、报告撰写无参考等实际痛点。压缩包共90个文件,含30个布局XML(实现商品列表、详情页、购物车等UI)、17个Java核心逻辑类(涵盖网络请求、数据解析、本地存储与订单管理)、15张JPG/WebP格式素材图(含图标、商品图、界面截图),以及Gradle构建配置、ProGuard混淆规则、Git版本控制文件和Word版设计报告,整体大小为7.47MB。已有679人学习下载,项目已通过教师评审获98分高分,结构规范、注释清晰、模块解耦合理,附带可直接运行的源码与配套文档,便于快速理解MVC架构实践、RecyclerView优化技巧及基础电商功能闭环实现。

1. 这个98分购物商城App到底做对了什么?

你是不是也经历过——期末大作业交上去,老师批完回来,分数栏写着“82”,旁边还有一行小字:“UI较简陋,功能完整性待加强,缺乏真实业务逻辑”?而隔壁同学的同题作业,却拿了98分,源码结构清晰、报告逻辑严密、演示流畅自然,连老师都多看了两眼。我去年带过三届安卓开发课的助教,翻过不下200份购物商城类大作业,真正能拿高分的,从来不是堆功能最多的,而是在有限课时内,精准踩中评分关键点的那几个。

这个“98分项目”的核心价值,不在于它有多炫酷,而在于它是一套可复现、可讲解、可答辩的标准化高分范式。它用最基础的Android原生技术栈(Java + XML + Gradle),实现了从商品浏览、加入购物车、模拟下单到订单管理的闭环流程,所有代码都在Android Studio 4.2 + Gradle 6.5环境下实测通过,没有引入任何第三方跨平台框架(比如UniApp或Flutter),完全规避了“为啥开发App不建议UniApp”这类答辩高频质疑点。关键词里反复出现的“gradle”,恰恰是它得分的关键伏笔——不是随便写个build.gradle就完事,而是把Gradle配置本身当成了技术亮点来设计:国内镜像加速、依赖版本统一管理、模块化拆分清晰、构建缓存策略合理。这些细节,在老师快速翻阅报告和源码时,就是“专业感”的第一印象。

它适合两类人:一是正在赶期末作业、需要快速上手并确保及格线以上的同学;二是想系统梳理安卓开发全流程、但被网上碎片化教程绕晕的新手。它不教你“安卓11 root”或“安卓逆向”,也不讲“python cc攻击源码”这种偏离教学目标的内容,而是老老实实回到课堂本质——用标准Android SDK完成一个有始有终的小型电商MVP。下面我就带你一层层拆开这个98分项目的骨架,告诉你每一处高分设计背后的底层逻辑。

2. Gradle配置不是“填空题”,而是整套项目的指挥中枢

很多同学把Gradle当成一个必须填满的配置文件,复制粘贴完就扔在一边。但在这个98分项目里,build.gradle(Project级)和app/build.gradle(Module级)是整个工程的“交通管制中心”,它的设计直接决定了编译速度、依赖稳定性、模块可维护性这三项硬指标。我们先看Project级build.gradle里的关键配置:

// build.gradle (Project) buildscript { repositories { // 国内镜像加速 —— 这是解决“gradle下载慢”“gradle threw an error while downloading artifacts”问题的第一道防线 maven { url 'https://maven.aliyun.com/repository/public' } maven { url 'https://maven.aliyun.com/repository/google' } maven { url 'https://maven.aliyun.com/repository/central' } google() jcenter() // 注意:jcenter已停服,此处为兼容旧版依赖,实际项目中应逐步移除 } dependencies { classpath 'com.android.tools.build:gradle:4.2.2' // 与AS 4.2.2严格匹配,避免“you are applying flutter's main gradle plugin imperatively”类报错 // 其他插件... } }

提示:为什么必须用阿里云镜像?因为Gradle默认从JCenter和Maven Central拉包,这两个源在国内直连极不稳定。实测对比:未配置镜像时,首次同步依赖平均耗时12分钟以上,且常因超时中断;启用阿里云镜像后,稳定控制在90秒内。这不是“锦上添花”,而是保证你能在截止前一小时顺利Build APK的基础条件。

再看Module级app/build.gradle,这里才是高分设计的核心战场:

// app/build.gradle android { compileSdkVersion 30 // 与targetSdkVersion保持一致,避免“安卓app为什么用java开发”引发的兼容性质疑 defaultConfig { applicationId "com.example.shoppingmall" minSdkVersion 21 // 放弃Android 5.0以下设备,大幅降低适配成本 targetSdkVersion 30 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } // 关键:使用AndroidX替代Support Library,这是2021年后所有高分项目的标配 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } // 关键:启用ViewBinding,替代findViewById,既提升性能又体现现代开发意识 buildFeatures { viewBinding true } } dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) // 核心依赖版本统一管理 —— 这是报告里“架构设计”章节的得分点 implementation 'androidx.appcompat:appcompat:1.3.0' implementation 'com.google.android.material:material:1.4.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.0' implementation 'androidx.lifecycle:lifecycle-viewmodel:2.3.1' implementation 'androidx.lifecycle:lifecycle-livedata:2.3.1' implementation 'androidx.navigation:navigation-fragment:2.3.5' implementation 'androidx.navigation:navigation-ui:2.3.5' // 网络请求用OkHttp+Retrofit,而非过时的HttpURLConnection,体现技术选型合理性 implementation 'com.squareup.okhttp3:okhttp:4.9.0' implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // 测试依赖,证明你做了基础质量保障 testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' }

注意:所有依赖版本号都精确锁定(如1.3.0而非1.3.+),这是避免“gradle's dependency cache may be corrupt”错误的根本方法。Gradle缓存损坏,90%源于版本通配符导致的依赖冲突。我在助教期间处理过37次类似报错,其中32次根源都是implementation 'androidx.appcompat:appcompat:1.3.+'这种写法。

这个配置背后,藏着三个必须向老师解释清楚的逻辑链:

  1. 为什么用AndroidX不用Support Library?—— 因为Support Library已停止维护,AndroidX是官方唯一推荐的后续方案,使用它代表你关注技术演进;
  2. 为什么启用ViewBinding?—— 它比ButterKnife更轻量、比Kotlin Synthetics更安全,且无需额外注解处理器,编译期生成绑定类,杜绝空指针异常;
  3. 为什么网络层选Retrofit?—— 它基于OkHttp,支持注解式API定义、自动JSON序列化、生命周期感知,比手写AsyncTask+Gson更符合现代Android开发范式。

这些不是配置项,而是你在答辩时可以展开的技术判断依据。老师问“为什么这么写”,你就能拿出一套完整的、有出处、有对比、有实测数据的回答,而不是支吾其词。

3. 源码结构不是“文件堆砌”,而是业务逻辑的可视化地图

打开这个98分项目的源码目录,你会看到一个干净、分层、命名规范的结构:

app/ ├── src/main/ │ ├── java/com/example/shoppingmall/ │ │ ├── MainActivity.java // 启动页,仅做跳转,无业务逻辑 │ │ ├── base/ // 基础组件:BaseActivity、BaseFragment、BaseAdapter │ │ ├── model/ // 数据模型:Goods、CartInfo、Order、User │ │ ├── network/ // 网络层:ApiService、ApiUtils、ResponseWrapper │ │ ├── ui/ // UI层:按功能模块划分 │ │ │ ├── home/ // 首页:HomeFragment、HomeAdapter │ │ │ ├── category/ // 分类页:CategoryFragment、CategoryAdapter │ │ │ ├── cart/ // 购物车:CartFragment、CartAdapter │ │ │ ├── order/ // 订单页:OrderListFragment、OrderDetailActivity │ │ │ └── profile/ // 个人中心:ProfileFragment │ │ ├── utils/ // 工具类:ToastUtils、DateUtils、ImageLoader(简易版) │ │ └── ShoppingMallApplication.java // 全局Application,初始化第三方库(此处为空,体现“不滥用”原则) │ ├── res/ │ │ ├── layout/ // 布局文件:activity_main.xml、fragment_home.xml等 │ │ ├── values/ // 字符串、颜色、尺寸资源 │ │ └── drawable/ // 图标、背景图 │ └── AndroidManifest.xml └── build.gradle

这个结构的价值,在于它让老师能在3分钟内看清你的工程能力。我们逐层拆解:

3.1 Base层:拒绝重复造轮子,但绝不滥用继承

base/目录下只有三个类:BaseActivityBaseFragmentBaseAdapter。它们不做任何“炫技”操作,只封装最刚需的公共逻辑:

  • BaseActivity:统一处理Toolbar设置、状态栏颜色、返回键监听(防止误触退出)、网络状态监听(Toast提示);
  • BaseFragment:统一处理懒加载(setUserVisibleHint)、页面可见性回调、空状态布局占位;
  • BaseAdapter:封装notifyDataSetChanged()的线程安全调用、空数据提示、加载更多状态管理。

实操心得:我见过太多同学在BaseActivity里塞一堆“万能工具方法”,结果导致子类耦合严重、调试困难。这个98分项目严格遵守“单一职责”:Base类只做UI生命周期管理,业务逻辑全在具体Activity里。比如购物车数量变更,逻辑写在CartFragment里,而不是在Base里加一个updateCartCount()方法——后者看似省事,实则破坏了模块边界。

3.2 Model层:数据契约先行,拒绝“裸Object”

model/目录下的每个类,都遵循Android开发最佳实践:

public class Goods { private long id; // 商品ID,long类型避免int溢出 private String name; // 名称,非空校验在Presenter层 private String description; // 描述,允许为空 private double price; // 价格,用double而非float(金融计算精度要求) private int stock; // 库存,int足够,且为0时禁售 private String imageUrl; // 图片URL,由ImageLoader统一处理 // 构造函数、Getter/Setter、toString() —— 全部自动生成,不手写 // 无业务方法,纯粹数据载体 }

关键细节:price字段用double而非float。虽然Android官方文档建议用BigDecimal处理货币,但大作业场景下,double配合两位小数格式化(String.format("%.2f", price))已足够准确,且避免了BigDecimal的复杂构造。这是“务实”与“教条”的平衡点——老师要的是合理选择,不是理论完美。

3.3 Network层:接口抽象清晰,Mock数据可插拔

network/目录是高分项目的另一张王牌。它没有直接在Activity里写OkHttp请求,而是通过Retrofit定义清晰的API契约:

// ApiService.java public interface ApiService { @GET("goods") Call<List<Goods>> getGoodsList(); @GET("goods/{id}") Call<Goods> getGoodsDetail(@Path("id") long id); @POST("cart/add") Call<ResponseBody> addToCart(@Body CartItem item); @GET("cart") Call<List<CartItem>> getCartItems(); }

配套的ApiUtils负责单例创建和基础配置:

// ApiUtils.java public class ApiUtils { private static ApiService apiService; public static ApiService getApiService() { if (apiService == null) { OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .build(); Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://mock-api.example.com/") // 指向本地Mock服务器,非真实后端 .addConverterFactory(GsonConverterFactory.create()) .client(client) .build(); apiService = retrofit.create(ApiService.class); } return apiService; } }

为什么用Mock API?因为大作业不要求真实后端,但老师会考察你是否理解前后端分离。这个项目用https://mock-api.example.com/作为占位地址,实际演示时,用本地Python脚本(附在报告附件里)启动一个简易HTTP Server,返回预设JSON数据。这样既展示了网络层设计能力,又规避了“联网权限申请失败”“服务器不可达”等低级扣分点。我在批改时,看到过12份作业因<uses-permission android:name="android.permission.INTERNET"/>没加或加错位置而直接扣5分。

3.4 UI层:Fragment驱动,导航清晰,无Activity爆炸

整个App采用BottomNavigationView+Navigation Component实现底部导航,所有主界面都是FragmentMainActivity只负责承载容器。ui/home/ui/cart/等子目录,严格对应导航菜单项,命名与功能一一映射。

CartFragment的代码片段:

public class CartFragment extends Fragment { private FragmentCartBinding binding; // ViewBinding实例 private CartViewModel viewModel; // ViewModel管理购物车状态 @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = FragmentCartBinding.inflate(inflater, container, false); return binding.getRoot(); } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); initViewModel(); setupRecyclerView(); observeCartData(); } private void initViewModel() { viewModel = new ViewModelProvider(this).get(CartViewModel.class); // ViewModel内部使用LiveData持有CartList,自动响应数据变化 } }

关键设计:CartViewModel不持有Context、不操作View,只负责数据获取与转换。observeCartData()方法订阅LiveData,收到数据后更新RecyclerView。这种设计,让老师一眼看出你掌握了“MVVM”架构思想,而不是把所有逻辑塞进onCreate里。这也是为什么它能拿98分——架构意识,远比功能多少更重要。

4. 报告撰写不是“凑字数”,而是技术决策的书面答辩

一份高分报告,绝不是把源码截图堆砌+几句“我学会了XXX”的空话。这个98分项目的报告,采用“问题驱动”结构,全文围绕三个核心问题展开:

4.1 为什么选择Java而非Kotlin?

报告开篇就直面热点:“为啥开发app不建议uniapp”“安卓app为什么用java开发”。它没有回避,而是用一页PPT式的对比表格给出答案:

维度Java方案UniApp方案Flutter方案
学习成本课程已教授,零额外学习需掌握Vue语法+小程序概念需掌握Dart+Widget树+State管理
调试效率Android Studio断点调试成熟HBuilderX调试体验差,真机调试卡顿VS Code调试需额外配置,热重载偶发失效
性能表现原生渲染,列表滑动帧率稳定60fpsWebView渲染,复杂列表易掉帧Skia引擎渲染,但包体积大(>20MB)
评分契合度完全符合《安卓应用开发》课程大纲要求属于“拓展技术”,不计入核心评分项同上,且需额外说明跨平台取舍理由

结论明确:“本项目严格遵循课程教学目标,聚焦Android原生开发核心能力训练,故选用Java语言。Kotlin虽为官方推荐,但课程未覆盖其语法特性,强行使用将导致代码可读性下降,增加评审负担。”

实操技巧:答辩时,老师若追问“那你为什么不学Kotlin?”,你就拿出报告里这段话,并补充:“我已在课余时间用Kotlin重写了HomeFragment(附GitHub链接),验证了语法迁移可行性。但大作业目标是展示课程所学,而非炫技。”——这叫“有备而来”。

4.2 Gradle构建失败的根因分析与解决路径

报告专门设了一节“构建问题排查记录”,不是罗列错误,而是还原完整排查链路:

  1. 现象Failed to open zip file. Gradle's dependency cache may be corrupt
  2. 假设1:磁盘空间不足 → 检查C:\Users\XXX\.gradle\caches目录,发现占用仅2GB,排除
  3. 假设2:Gradle版本与AS不匹配 → 查gradle-wrapper.properties,确认distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip,AS 4.2.2官方推荐Gradle 6.5,排除
  4. 假设3:依赖缓存损坏 → 执行gradlew --stop关闭守护进程,删除.gradle/caches/modules-2/files-2.1/目录,重新Sync → 问题依旧
  5. 关键发现:在build.gradle中,某第三方库声明为compile 'com.xxx:lib:1.0.+'+号导致Gradle尝试下载最新快照版,而该版本在Maven仓库中不存在 →根因定位
  6. 解决方案:将所有+号替换为固定版本号(如1.0.2),并添加阿里云镜像源 → 构建成功

这段内容的价值,在于它展示了你解决问题的系统性思维。老师批改报告时,最反感“我百度了一下,然后就好了”这种回答。而这份报告,把一次普通报错,变成了体现工程素养的案例。

4.3 购物车本地持久化的权衡取舍

购物车数据必须保存,但方案有多种:SharedPreferences、SQLite、Room、甚至直接内存存储。报告用半页纸分析了每种方案:

  • SharedPreferences:适合键值对,但购物车是对象集合,序列化/反序列化易出错,且无事务支持;
  • SQLite:功能完备,但需写大量SQL语句,对大作业而言过度设计;
  • Room:Google推荐,但引入新概念(Entity、DAO、Database),增加理解成本;
  • 内存存储+Activity重建恢复:最简方案,但App被杀后数据丢失。

最终选择:SharedPreferences + Gson序列化,并给出充分理由:

  • 大作业场景下,购物车商品数≤20,序列化性能无压力;
  • 使用Gson 2.8.8,经测试,100个商品JSON字符串序列化耗时<5ms;
  • onDestroy()中保存,在onCreate()中恢复,覆盖绝大多数用户场景;
  • 报告附上CartManager.java核心代码,含异常捕获与日志输出。

这体现了“合适优于先进”的工程哲学。老师想看到的,不是你用了多牛的技术,而是你能否为具体场景选择最恰当的方案。

5. 从源码到演示:如何让答辩过程稳如磐石

源码和报告写得再好,答辩翻车就前功尽弃。这个98分项目,把演示环节也当作技术交付的一部分来设计。

5.1 演示脚本:精确到秒的流程控制

整个演示时长严格控制在6分30秒,脚本如下:

时间操作口述要点目的
0:00-0:30启动App,展示首页Banner轮播“首页采用ViewPager2实现,自动轮播间隔5秒,触摸暂停,松手继续”展示基础UI能力
0:30-1:15点击商品进入详情页,点击“加入购物车”“详情页使用CoordinatorLayout实现折叠标题,加入购物车触发Snackbar提示,并实时更新底部Tab徽章”展示交互与状态反馈
1:15-2:00切换至购物车Tab,修改数量,点击结算“购物车使用RecyclerView+DiffUtil实现高效刷新,数量变更通过LiveData通知UI,结算跳转至模拟支付页”展示数据驱动与架构能力
2:00-3:00返回首页,搜索“手机”,筛选“价格从高到低”“搜索功能对接Mock API,排序逻辑在Adapter中实现,避免在UI线程做耗时操作”展示业务逻辑处理
3:00-4:30进入个人中心,查看历史订单“订单列表使用分页加载,每次请求10条,下拉刷新触发重载”展示进阶列表处理
4:30-5:30打开Android Studio,定位CartFragment.java,高亮observeCartData()方法“所有数据变更均通过LiveData观察,彻底解耦View与Model,这是MVVM的核心实践”引导老师关注架构设计
5:30-6:30展示报告中“Gradle构建问题排查”章节“这是我在开发中遇到的真实问题,通过系统性排查定位到依赖版本通配符,解决方案已融入最终代码”展示工程问题解决能力

关键细节:所有演示操作都提前在真机(华为Mate 30,Android 10)和模拟器(Pixel 3a, API 30)上录制过3遍,确保无卡顿、无白屏、无崩溃。我见过太多同学演示时App闪退,直接扣10分。稳,是最高级的炫技。

5.2 答辩预判:老师必问的5个问题及应答策略

根据近三年期末答辩记录,整理出高频问题及应答要点:

Q1:购物车数据存在哪里?为什么不用数据库?
A:存在SharedPreferences中,序列化为JSON字符串。原因有三:一是大作业数据量小(≤20件),序列化性能足够;二是避免引入SQLite或Room增加复杂度,偏离课程重点;三是SharedPreferences读写简单,便于在报告中清晰阐述持久化逻辑。当然,真实项目会升级为Room。

Q2:网络请求失败怎么处理?有重试机制吗?
A:有三层防护:第一层,OkHttpClient设置10秒超时;第二层,Retrofit Call的onFailure()回调中,弹出Toast提示“网络异常,请检查连接”;第三层,在ApiUtils中封装了简单的指数退避重试(最多2次),但未在本次作业中启用,因Mock Server极其稳定。这部分代码已写好,可随时开启。

Q3:图片加载用的什么?有做内存优化吗?
A:使用Glide 4.12.0,这是目前最成熟的Android图片加载库。它自动处理内存缓存、磁盘缓存、生命周期绑定(Fragment销毁时自动取消请求)。我没有手写Bitmap回收逻辑,因为Glide已内置LruCache和BitmapPool,手动干预反而可能引发OOM。

Q4:Gradle配置里为什么用implementation而不是compile
A:compile是旧版Gradle的配置方式,已被废弃。implementation能有效减少传递依赖,加快编译速度。例如,如果A模块implementation了B库,C模块依赖A,C模块就无法访问B库的API,这强制了模块边界,提升了可维护性。

Q5:如果让你重构,第一件事做什么?
A:第一件事是将Java代码迁移到Kotlin。不是为了时髦,而是Kotlin的空安全、扩展函数、协程,能显著减少样板代码,提升开发效率。我已经用Kotlin重写了HomeFragment,对比显示代码行数减少35%,NullPointException风险归零。

最后一个小技巧:答辩时,把手机屏幕投到教室大屏,自己手持另一台设备(或用AS的Device File Explorer),当老师问“这个方法在哪?”时,立刻切到AS,用Ctrl+Click跳转到源码,边指边说。这种“所见即所得”的演示,比口头描述有力十倍。

这个98分项目,本质上是一套经过千锤百炼的“教学级安卓开发SOP”。它不追求技术前沿,但每一步都踩在评分标准的得分点上;它不堆砌功能,但每个模块都承载着可讲解的技术决策;它不炫技,但处处透露出扎实的工程素养。如果你正为大作业焦头烂额,不妨把它当作一张精准的地图——跟着走,高分不是运气,而是必然。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/5 17:24:46

AI游戏开发实战:NVIDIA ACE与生成式引擎的落地组合

2026年聊AI游戏开发&#xff0c;已经没有多少人还在纠结“要不要接入AI”了&#xff0c;大家默认一件事&#xff1a;AI跟渲染管线、物理引擎一样&#xff0c;是立项阶段就要想清楚的底层能力。我最近大半年几乎把NVIDIA ACE和Summer Engine这两类代表工具翻了个底朝天&#xff…

作者头像 李华
网站建设 2026/9/5 17:24:32

OpenLayers、Mapbox GL JS、CesiumJS 飞行漫游方案对比与实现

做课程作业、毕业设计或者参加 WebGIS 比赛的时候&#xff0c;经常绕不开一个问题&#xff1a;需要在网页里展示一段“飞行视角”或者“自动漫游”的效果。有的项目要求从 A 点飞到 B 点&#xff0c;有的要求沿着一条线路把城市模型看一遍&#xff0c;还有的只要求在 2D 地图上…

作者头像 李华
网站建设 2026/9/5 17:23:50

Calibre 电子书格式转换实操手册:3 步搞定 30+ 格式互转

Calibre 电子书格式转换实操手册&#xff1a;3 步搞定 30 格式互转 【免费下载链接】calibre The official source code repository for the calibre ebook manager 项目地址: https://gitcode.com/GitHub_Trending/ca/calibre 拿到一本 Kindle 打不开的 EPUB&#xff0…

作者头像 李华
网站建设 2026/9/5 17:18:42

Atom 的 go-to-line 包:Ctrl+G 行/列跳转功能的完整解析

Atom 的 go-to-line 包&#xff1a;CtrlG 行/列跳转功能的完整解析 【免费下载链接】atom :atom: The hackable text editor 项目地址: https://gitcode.com/gh_mirrors/at/atom 本篇围绕 Atom 内置包 go-to-line 展开&#xff1a;它允许你通过 ctrl-g 打开一个模态输入…

作者头像 李华
网站建设 2026/9/5 17:14:47

Grok Bot API 接入实战:从环境准备到工程落地

在实际 AI 产品讨论中&#xff0c;Grok Bot 最近频繁出现在热搜里。不少人因为标题中的“表现惊人”点进来&#xff0c;想弄清楚它到底能做什么、怎么使用、能不能接入自己的项目。与此同时&#xff0c;标题里出现的 SpaceXAI 也容易让人误以为 Grok 已经大规模用于航天任务。实…

作者头像 李华