CNode

Egg.js 1.0.0 正式发布 - 企业级 Node.js 框架

精华
分享
Aatian25发布于9 年前最后回复8 年前183 回复69902 浏览0 收藏

screenshot.png

原文地址:https://zhuanlan.zhihu.com/p/25860846


时光如梭,转眼间 Egg.js 已经开源半年了,我们很荣幸地宣布,Egg.js 正式发布 1.0 版本。

  • 官网传送门:https://eggjs.org
  • GitHub:https://github.com/eggjs/egg
  • Egg.js 英文文档:与 SwiftGG 翻译组强强联合,中译英的小伙伴招募中,如果你有兴趣,请试译 这篇文章 ,并注明你的 qq 号,发送给 SwiftGG 的同学邮箱(1030041592@qq.com)。期待你的加入!

特点

  • 『企业级的 Node.js Web 基础框架』,寓意 - 孕育新生。
  • 业界领先的 『微内核 + 插件机制』,专为团队架构师量身打造的 『框架定制』 能力。
  • 内建的安全机制与多进程管理模型。
  • 高可用,高质量,严格遵循 Semver 规则,测试覆盖率 100%(travis/appveyor)。
  • 同时支持 koa 1.x 和 2.x 生态,支持 ES 2017 Async Await。
  • 沉淀自阿里各行各业不同领域最佳实践的插件,涵盖了常见的业务开发场景,稳定支撑了 15 和 16 年天猫双11大促,顶级流量压力。
  • 渐进式,极具伸缩性,既适合个人小项目快速开发,也适合企业级的团队开发协作。

更详细的特点,以及 Node.js 在阿里的定位,可以参见: 如何评价阿里开源的企业级 Node.js 框架 egg?

看来重要的事要说三次: Egg 1.x 版本完全支持 async,完全支持 koa2 的中间件 Egg 1.x 版本完全支持 async,完全支持 koa2 的中间件 Egg 1.x 版本完全支持 async,完全支持 koa2 的中间件

里程碑

  • 2013 年蚂蚁的 chair 框架,可视为 Egg.js 前身。
  • 2015 年 11 月,在苏千的召集下,阿里各 BU 的前端骨干齐聚黄龙,闭门共建一周。
  • 2016 年初,各 BU 的基础 Web 框架完成升级,在同一套规范的基础上进行差异化定制。
  • 2016 年中,成为阿里 Node.js 基建,广泛使用在绝大部分阿里的前端 Node.js 应用。
  • 2016 年 09 月,在 JSConf China 2016 上亮相并宣布开源。
  • 2017 年初,经过一周的闭关直播写文档,期待已久的 官方文档 诚意登场,足足近 30 篇。
  • 2017年 02 月,知乎问答:如何评价阿里开源的企业级 Node.js 框架 egg?
  • 2017 年 02 月第 2 周,上了 GitHub Trending 周榜第三,Star 数增加 1k 多。
  • 2017 年 03 月 21 日,Egg.js 正式发布 1.0.0 。

成就

  • 截止到今天(3.21),2250+ Star,50+ 插件,10+ 核心开发者,30+ 贡献者。
  • GitHub Trending 周榜第三,并上了 Node Weekly 周刊。
  • 官网 UV 日均 300+ 。

screenshot.png

  • Node TSC Director - Rod Vagg 在 Twitter 上关注并转发。

screenshot.png

感言

screenshot.png

规划

  • Egg.js 英文文档翻译,欢迎加入 SwiftGG 翻译组 发起的 Egg 文档翻译项目
  • 继续完善文档,沉淀最佳实践,并帮助社区产出更多的插件和上层框架。
  • Node.js 8 LTS 发布后,底层将无缝升级到 Koa@2 。
查看回复

回复 (167)

I
i5ting#1·9 年前

Screen Shot 2017-03-21 at 21.33.13.png

N
ngot#2·9 年前

🥚 的插件机制简直强大!用上 🥚 瞬间感觉自己无所不能了!

恭喜,非常不错的nodejs框架。

O
OneNewLife#4·9 年前

喜大普奔

D
dbit-xia#5·9 年前

一定抽空去看看

来自酷炫的 CNodeMD

I
i5ting#6·9 年前

顶起来

B
bendise#7·9 年前

冲着大神们必须拜读一下 自豪地采用 CNodeJS ionic

L
laoqiren#8·9 年前

哈哈,希望毕业后能到阿里工作

M
MidiGeek#9·9 年前

支持

G
gzhangzy#10·9 年前

没看出有什么好的

A
artisan#11·9 年前

node 8 lts发布?是node7 lts发布吧。。。要是node 8lts要等两代啊。。。

D
DuanPengfei#12·9 年前

@i5ting 估计芋头他们自己用 Akyuu.js 吧,虽然很初期很简陋,不过自己的东西总是亲儿子嘛 😂

R
rwing#13·9 年前

撒花 碉堡了

R
rwing#14·9 年前
引用 artisannode 8 lts发布?是node7 lts发布吧。。。要是node 8lts要等两代啊。。。

@artisan 奇数版本是没有 lts 的,所以下一个 lts 版本是8,就在4月份就发布了

A
atian25#16·9 年前
引用 artisannode 8 lts发布?是node7 lts发布吧。。。要是node 8lts要等两代啊。。。

@artisan 其实完全不用关注 egg 底层到底是 koa@1 还是 koa@2,对于应用开发者来说,如果使用 Node 7.6+ 的话,完全可以用 async 和 koa@2 的风格来写代码,我们早做好兼容了,到时候切换过去,也是无感知的。

L
lellansin#18·9 年前

M
magicdawn#19·9 年前

Akyuu.js 名字有些中二

H
hezhongfeng#20·9 年前

有时间看下插件系统是咋回事

非常感谢国内大厂的开源框架,阿里在这方面这两年的声音很大。

N
ntfs32#21·9 年前

昨晚深夜看到了 ,点个赞

L
leehomeok#22·9 年前

希望不再eggache

F
fundon#23·9 年前

Mark!

D
dfsdfddd#24·9 年前

mark

F
fomenyesu#25·9 年前

赞一个!

M
Mrlyjoutlook#26·9 年前

已经撸起来了。今天发现屏幕快照 2017-03-23 下午3.28.23.png是不是要为egg terminal添加dashboard?

D
dfsdfddd#27·9 年前

@tianj123 小白问下 测试是什么东的测试啊。

J
JexCheng#28·9 年前

话说,为什么名字叫 Egg ? ……是……因为Node.js用得Egg隐隐作痛?

A
atian25#29·9 年前
引用 Mrlyjoutlook已经撸起来了。今天发现 是不是要为egg terminal添加dashboard?

@Mrlyjoutlook 暂时没计划考虑,只是今天在回答 https://cnodejs.org/topic/58d26528f7abd67436265cb8#58d380b56f8b9bf02d1d0a13 的时候,发现了这两个库,就随口在群里面发了下。

我们的 terminal 都是基于 common-bin 开发的,包括 egg-bin, egg-scripts, egg-init

dashboard 这种也只是开发环境才有用,线上基本没有场景,如果有兴趣的同学,可以为 egg 开发一个 dashboard, 把 egg-bin 包裹下。

A
atian25#30·9 年前
引用 JexCheng话说,为什么名字叫 Egg ? ……是……因为Node.js用得Egg隐隐作痛?

@JexCheng

Egg - 寓意是孕育新生。

因为 「框架定制」能力是 Egg 最主要功能之一,通过它可以孵化出很多适合各自团队业务场景的上层框架。

Z
zhanzhenzhen#31·9 年前

赞!

O
okoala#32·9 年前

来来来,大家一起共建~

S
sofakeer#33·9 年前

破蛋🥚 !!!👍

S
sanrudongfeng#34·9 年前

egg疼的框架,这名字也是吊炸天

C
ChenXiaoMian#35·9 年前

D
duxingyu#36·9 年前

点赞!来自 vue2-cnodejs

D
duxingyu#37·9 年前
L
leyou319#38·9 年前

J
JarvisQJ#39·9 年前

必须留个记号,感谢阿里,感谢马主席,感谢阿里node团队

L
lzq920#40·9 年前
S
shaoky#41·9 年前

赞!

H
hopperhuang#43·9 年前

赞一个,以后可能用到。

F
fyibmsd#44·9 年前

代码质量感人

H
Harveytwo#45·9 年前

顶一个

来自酷炫的 CNodeMD

L
lzq920#46·9 年前
引用 atian25@461534898 去 github 提下 issius 贴下报错

@atian25 机智的我又找到了方法,原来文档跟框架生成的代码有点儿不同。。吓尿了。。

不要惹我生气,小心我把你的ID挂在我的小尾巴上,带你装逼带你灰🚀🚀🚀🚀

A
atian25#47·9 年前

@461534898 什么问题?

L
llqgithub#48·9 年前

这个蛋。要炸

Y
yimingjfe#49·9 年前

支持,支持

Y
yimingjfe#50·9 年前

支持,支持

Y
yimingjfe#51·9 年前

支持,支持

Y
yimingjfe#52·9 年前

支持,支持

F
falost#53·9 年前

居然支持插件,大赞啊,下一个discuz

L
lzq920#54·9 年前
引用 atian25@461534898 什么问题?

@atian25 模板引擎的配置选项中的exports改成config就行了。。原谅我个菜鸡,第一次用egg。

不要惹我生气,小心我把你的ID挂在我的小尾巴上,带你装逼带你灰🚀🚀🚀🚀

A
atian25#55·9 年前

好吧... 又是 module.exports 和 exports 的理解问题...

2
2YANG#56·9 年前

mark

M
MrErHu#57·9 年前
F
feifanyajun#58·9 年前
引用 i5ting

@i5ting 哈哈哈I‘m webapp-cnodejs-vue

S
sunfeng90#59·9 年前

顶起来!

C
Chalin-Shi#60·9 年前

凑个热闹啊。

L
lzq920#61·9 年前

再顶一波

🚀🚀🚀🚀

F
fengyinchao#62·9 年前

试一试

R
rebornchris#63·9 年前

不错

Z
zhanzhenzhen#64·9 年前

来自带提醒的颜cnode

C
ChenYangShao#65·9 年前

赞~

C
CocaCola183#66·9 年前

赞一个,一看文档目录就知道既解决了很多小而美框架的痛点,又给开发者留足了自由发挥的空间,而且还那么时髦!

S
sxtaosdo#67·9 年前

不错,学习一下

F
fomenyesu#68·9 年前

撸了个 eggjs+mongodb+restapi 的内容管理系统后台。求下star: https://github.com/fomenyesu/egg-mongodb-example

O
only7SAN#69·9 年前
引用 leyou319

@leyou319 666

Y
yylgit#70·9 年前
X
xiashulin#71·9 年前

大家都对ES6语法规则了如指掌吗,那么多新特性怎么记得住,有时候看到一个不熟悉的就一下懵逼了

F
feifanyajun#72·9 年前

谢谢I‘m webapp-cnodejs-vue

C
chrislbb#74·9 年前

已入坑,真是很有卵用的

M
microzz#75·9 年前

L
lcoder#76·9 年前

很多插件都是英文的,有中文的不拉

J
JsonMa#77·9 年前

神马都不说了,先顶起来!!!

L
Lucky-dj#78·9 年前

这两天特意使用了一下,就连官网的快速入门demo,跟着敲,问题都一大推,总是找不到view,然后/user/:123,${ctx.params.id},打印不出值来,心很伤,只能我抱有的期望有点高.........

N
nieheyong#80·9 年前

请问 用egg框架写程序,怎么用vs code代码跳转从controller 跳转到service ?怎么用vscode 调试? From Noder

O
okoala#83·9 年前

@nieheyong vscode 中 egg 支持跳转有两种方式:

  1. 通过插件的方式,需要社区支持。
  2. 通过 TypeScript 或者 Flow 类型系统方式支持,最近会放出 TS 版本的 example.
Z
zhangfan6644777#84·9 年前

Z
zhangfan6644777#85·9 年前

A
atian25#86·9 年前

@seasonstar 的 「微信小程序+Egg打造社区全栈解决方案」 https://cnodejs.org/topic/58f97f9c31e8c2bb1c3dcc54

H
hz0324#87·9 年前

赞赞赞!确实很有必要。 我们用的是express,确实面临到“该怎么组织代码”的问题,很多业务逻辑都写在一个api router里,已经2000多行了

D
dbit-xia#89·9 年前

egg在数据库方面是不是现在只有mysql模块

来自酷炫的 CNodeMD

A
atian25#90·9 年前
D
DukeAnn#91·9 年前

人活一世总该给世界留下一些东西。赞

D
dbit-xia#92·9 年前
引用 atian25@dbit xia 有 https://github.com/eggjs/egg sequelize 插件,支持 mysql, mariadb, postgres, mssql 等等。

@atian25 可惜我们是用ASE,如果有egg-jdbc就好了, 另外我们现在框架里还有很多都是写SQL实现的

A
atian25#93·9 年前
引用 dbit-xia@atian25 可惜我们是用ASE,如果有egg jdbc就好了, 另外我们现在框架里还有很多都是写SQL实现的

@dbit-xia 自己参考着封装就好了,egg 只是做了简单的包裹而已,底层之前 node 用什么模块还是什么模块。

D
dbit-xia#94·9 年前
引用 atian25@dbit xia 自己参考着封装就好了,egg 只是做了简单的包裹而已,底层之前 node 用什么模块还是什么模块。

@atian25 😬,如何将回调形式的模块封装成egg能用的?有教程没 我有一个基于jdbc的一个很好用的模块

来自酷炫的 CNodeMD

X
xiaojiangjiang#96·9 年前

待完善后使用

Y
youlong723687543#98·9 年前

蛋蛋支持复杂dom操作渲染吗?

A
atian25#99·9 年前
引用 youlong723687543蛋蛋支持复杂dom操作渲染吗?

@youlong723687543

什么叫 复杂dom操作渲染 ?

我们通过插件方式对模板引擎进行封装,对应的模板引擎支持我们就支持. 目前的支持有:

如果有需要你也可以自己 wrap 的一个,参见 模板插件开发规范

Y
youlong723687543#100·9 年前

@atian25 举个例子,我编写了一个表格,可能需要批量的对这个表格进行修改和删除,表格肯定关联了分页组件,那么分页组件也要跟着刷新,表格的数据影响了试图,也就是echart,echart也要重新render对吧

A
atian25#101·9 年前

@youlong723687543 你这是前端代码... egg 是后端 Node 框架...

Y
youlong723687543#102·9 年前

@atian25 不是可以渲染吗?,明白了,这个类似于express框架的一个后端处理代码

Z
ZWkang#103·9 年前

赞一个

Y
yu1an#104·9 年前

undefined

F
freya0101#106·9 年前

赞一个I‘m webapp-cnodejs-vue

Y
youlong723687543#107·8 年前

目前正在使用,没发现太大的问题

来自酷炫的 CNodeMD

W
waitingsong#108·9 年前

请问windows下启动egg后开启的多个cmd窗口能否隐藏(可以只保留mater进程的黑窗口) 另,npm start使用 --daemon启动后 npm stop就无法关闭任何开启的cmd窗口了(关闭任何一个窗口都会自动重开,除非用软件同时全部kill)。是否需要找到mater进程pid手工kill?

A
atian25#109·9 年前
引用 waitingsong请问windows下启动egg后开启的多个cmd窗口能否隐藏(可以只保留mater进程的黑窗口) 另,npm start使用 daemon启动后 npm stop就无法关闭任何开启的cmd窗口...

@waitingsong

https://github.com/eggjs/egg-scripts#stop

文档写的很清楚了,目前 egg-script 的 start 支持多系统,而 stop 不支持 win,一般部署都应该在 linux,你杀掉 worker 肯定会自动守护然后重启的,文档有写自己 kill,可以去看看。

至于隐藏窗口的那个,属于操作系统的知识了,我很久没碰 win 了,不清楚,可能需要注册成服务。

W
waitingsong#110·9 年前
引用 atian25@waitingsong https://github.com/eggjs/egg scripts stop 文档写的很清楚了,目前 egg script 的 start 支持多系统,而 st...

@atian25 谢谢

另外,hackernews-async-ts 这个模板 config/defaultConfig.ts 中:

 class DefaultConfig {
  news =  {
    pageSize: 30,
    serverUrl: 'https://hacker-news.firebaseio.com/v0',
  };
};

export default new DefaultConfig();

declare module 'egg' {
  export interface Application {
    config: EggAppConfig & DefaultConfig;
  }
}

当tsconfig.json "declaration": true 后tsc会提示:

config/defaultConfig.ts(9,1): error TS4082: Default export of the module has or is using private name 'DefaultConfig'.


13     config: EggAppConfig & DefaultConfig;
                              ~~~~
    config/defaultConfig.ts(13,28): error TS4033: Property 'config' of exported interface has or is using private name 'DefaultConfig'.

我添加了个export , 改为 export class DefaultConfig { 后tsc正常。 看文档,可以返回对象、函数,如果返回类,那么定义了 交叉类型后:

config: EggAppConfig & DefaultConfig;

是否返回的news的类型(包括news.pageSize的类型)会作为 Application.config的检查? 就是说如果我在使用Application接口时检测 config类型时是否会也检测news, pageSize, serverUrl 等这些新增的键名对应的类型?

初接触TS和egg,有许多不明之处。望指教。谢谢


markdown语法不熟悉,帖子样式没调好

A
atian25#111·9 年前

抱歉,看起来属于 TS 的语法和定义问题,我不熟悉。

S
sunailian#112·9 年前

顶顶顶

egg.js里如何嵌套路由呢?

引用 atian25@brucewar 子路由?

@atian25 是的,类似express中

// a.js
const router = express.Router();
router.get('/a', controller);
module.exports = router;

//routes.js
app.use('/api/', require('a.js'));
A
atian25#116·9 年前
引用 brucewar__legacy_51a57ccfd452213f390d2ee7@atian25 是的,类似express中 // a.js const router = express.Router(); router.get('/a', controller); mo...

@brucewar 目前没支持,可以自己写个插件实现,或者给我们的 egg-core 提 PR

L
Leungkingman#118·9 年前

@atian25 您好,关于中间件的使用想请教您2个问题。 1.在中间件中如何访问session?试了一下在中间件中使用 'ctx.session' 来访问session,貌似没有成功。 2.中间件在路由中使用的情况下,在定义的时候会执行一次。有什么办法可以阻止定义的时候的执行呢? 如图所示,在'const auth = app.middlewares.auth()' 已经执行了 QQ20170510-0.png 其实我想实现的东西很简单,就是写一个检测session的方法。检测不通过就重定向到登录页重新登录。但是在定义的时候里已经执行了的话,有些页面不需要检测session也会被强制执行。 如果类似的需求不适合通过中间件来解决的话那有没有更好的解决方案呢?谢谢

A
atian25#119·9 年前
引用 Leungkingman@atian25 您好,关于中间件的使用想请教您2个问题。 1.在中间件中如何访问session?试了一下在中间件中使用 'ctx.session' 来访问session,貌似没有成功。 2....

@Leungkingman

  1. 看下 session 文档 ,或者贴下你代码,是不是 thisctx 的问题。
  2. 你这种场景,可以直接通过 config.middleware 注册,然后通过 match 去批量挂载,参见 middleware - match 文档
  3. 另,实例化会有什么问题么? 可以贴下你的 middleware 代码。
  4. egg-userrole / egg-userservice / egg-passport 这几个插件和对应的 examples 可以看一下。
  5. 这些问题可以在我们的 gitterissue 提问,这样我们的成员都能及时关注到。
A
alwayslyp#120·9 年前

@atian25 egg可以自制框架,这点很符合公司项目的需求。公司原项目是sailsjs做的,我在想,既然eggjs可以加载框架,可不可以支持加载其他框架,这样旧项目不管谁koa、express还是sails做的,都可以平稳加入到eggjs,所有维护工作也可以放到egg上,也可以在egg上重构原项目。当然,node版本兼容首先就是是一个大问题。

A
atian25#121·9 年前
引用 alwayslyp@atian25 egg可以自制框架,这点很符合公司项目的需求。公司原项目是sailsjs做的,我在想,既然eggjs可以加载框架,可不可以支持加载其他框架,这样旧项目不管谁koa、expre...

@alwayslyp 这几个的整个处理机制是不一样的。如果仅仅是为了分步重构,你的应用在在 egg middleware 那做一个 http proxy 把还未重构迁移的,代理到旧的框架即可。

M
maochunguang#122·9 年前

在公司项目中正在使用,本来想写个教程,但是感觉官网的文档很详细了,搬出来没有意义,就没写了。用起来确实很舒服,插件模式,中间件都很好用

M
maochunguang#123·9 年前

@artisan 建议官方文档把this.ctx,this.app详细说明一下,

  1. 使用module.export和使用class继承写controller,获取this.body,logger就不一样,在module.export中直接this.body,this.logger 而在class继承的controller得用this.ctx.body,app.logger
  2. 比如重定向,this.redirect(url),在api文档才找到,放在controller介绍挺合适
M
maochunguang#126·9 年前

@atian25 好吧,用eggjs差不多一个月了,这周写一个,

M
maxonly#127·9 年前

学习中。。。

自豪地采用cnodejs-vue

S
stjw7098#128·9 年前

学习了

S
shawnWangxx#129·9 年前
引用 stjw7098学习了

@stjw7098学习了

L
leapon#130·9 年前

大牛背书啊,加入学习行列。

A
atian25#131·9 年前

@i5ting 这些测试的是不是要管管啊?

H
hcnode#132·9 年前

看了一下官方文档,egg好像没有实现类似sails的policy?这个算是sails的一大亮点,可以很简单轻松的对controller进行请求验证。

H
hcnode#134·9 年前
引用 atian25@hcnode https://github.com/eggjs/egg validate https://github.com/eggjs/egg userrole https://gith...

@atian25

看了一下你发的插件,egg-userrole看上去是类似policy,但是看上去都是基于router,而不是基于controller?而且也不清楚role是否是可以实现层级关系,实现继承和覆盖。 像sails一个controlller的方法可能会有多个路由(比如打开的blueprint后,会默认有resfulapi router和action router),所以在controller层控制验证会更方便。 这里有个sails文档这个例子显示如何配置并覆盖controller的权限: http://sailsjs.com/documentation/concepts/policies#?to-apply-a-policy-to-an-entire-controller

A
atian25#135·9 年前

@hcnode

在 koa 里面, controller 也只是一个特殊的 middleware 而已, userrole 是 middleware,所以它们是基于 router 的, 可以通过通配来解决。

若你希望的是 controller 里面的所有方法都 hook 的话,可以自己实现个插件,定制 Controller 基类,不会太难。

G
gaoli861121#136·9 年前

厉害 From Noder

D
dajianjian#137·9 年前

fork

B
brickyang#138·9 年前

Application.js 里是不是不支持 async/await… From Noder

A
atian25#139·9 年前

@brickyang 附上代码发 issue

L
leyou319#141·9 年前

可以

X
xudihui#142·9 年前
引用 leyou319可以

@leyou319 很给力啊

来自react-cnode手机版

D
DMY-sunny#143·9 年前

egg.js个人感觉会烂尾,毕竟是阿里的作品,不烂尾对不起自己

A
atian25#144·9 年前
引用 DMY-sunnyegg.js个人感觉会烂尾,毕竟是阿里的作品,不烂尾对不起自己

@DMY-sunny 说的好像那些人自己的项目都是不烂尾的,即使离职后也一直在维护的劳模,可以把自己的项目 show 出来大家膜拜下。

O
okoala#145·9 年前

楼上那位键盘党,你说这话的时候有考虑那些无私奉献在开源事业上的人? 开源精神不是靠嘴巴说出来的,觉得代码有问题、有 BUG 可以提 PR。

2
2YANG#146·9 年前

已入坑...

S
shiny#147·9 年前

用下来感觉自然、简洁、方便,希望这个框架能比阿里系其他开源项目坚持更久。

P
pengrongjie#148·9 年前

666666666666666vue-cnode-mobile

P
pengrongjie#149·9 年前

666

P
pengrongjie#150·9 年前
引用 pengrongjie666

@pengrongjie支持支持

W
wujohns#151·9 年前

等node8到lts的时候就开始入手

P
pengrongjie#152·9 年前
P
pengrongjie#153·9 年前
F
fomenyesu#154·9 年前

又撸了个egg + antd + dva + mysql 的。 egg-restapi-module-tool

B
biglight12#155·9 年前

支持支持

N
newming#156·9 年前

支持

N
newming#157·9 年前

x

N
newming#158·9 年前

x

Y
yuweiliu#159·9 年前

P
psytree#160·9 年前

好赞~

L
lionrock#161·9 年前

赞👍

N
newming#162·9 年前

@xudihui 1212121212

B
bobborn#163·9 年前

赞👍

V
vcxiaohan#164·9 年前

很好,很强大

K
ken90242#165·9 年前

GOOD!

H
hopperhuang#166·9 年前

不要@我那么多次呀虽然是很期待的。

H
hopperhuang#167·9 年前

不要@我那么多次好不好

参与回复
登录后即可参与回复。登录