找回密码
 注册
关于网站域名变更的通知
查看: 418|回复: 1
打印 上一主题 下一主题

开发为什么要从零开始搭建属于自己的统一研发平台和中台架构

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-8-24 10:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

从零开始搭建的意思,就是从需求分析,系统规划,设计分析和落地实践几个步骤,从无到有的过程。考虑左右,为了个人学习和提升,选型基于流行的springboot+springcloud,从零开始搭建一套自己用于学习的研发平台。

整体平台的流程,从管理、开发、测试、运维、生产几条线,实现整体平台的落地和管理,下面是整体研发平台架构。

整个研发平台架构设计

整体研发平台使用的基线规划如下

平台所有基线及所有项目目录结构,整体从零开始进行平台基线搭建及规划,多个基线的规划,考虑更合适多个岗位角色的管理

序号
基线说明
基线地址
维护人员
状态
备注

% C7 T- S+ C$ Q" A9 M1平台整体文档目录alinesno-cloud-document 集成中
1 c) S( Z: I8 ?# s* h2平台环境搭建文档记录文档基线alinesno-cloud-evn 集成中 + V+ o6 h! K5 G
3平台前端规划及页面基础页面设计基线alinesno-cloud-pages 集成中
7 P7 m: ]$ v' [3 D4平台所有服务列表代码基线alinesno-cloud-service 集成中 0 _1 I9 n5 Y& O
5平台前端应用和手机应用代码基线alinesno-cloud-application
  W) W/ n- b9 x, }6平台自动化测试基线alinesno-cloud-test # N% c9 r$ y$ `4 M
7平台运维脚本过程产物基线alinesno-cloud-operation 2 N/ o) X5 b! p0 s2 [6 e9 ]
8平台搭建过程中常见问题基线alinesno-cloud-question
: P; ?. a6 \' @9开发人员使用平台指引alinesno-cloud-guide
& B; x4 D9 T- P1 a1 E  b4 F6 @
一、个人为什么要搭建一个统一研发平台

1、为了有方向感,不迷茫,不浪费时间,有可行的学习计划

上大学的时候,就开始学习计算机,从基础的Java到Java web,再到框架,再到在学校接一些小项目,如企业网站,兼职网,报名网站等,这几步路大概走了2年左右,而在学完两年之后,人还是很迷茫,方向感还不是特别强,而在找方向和突破迷茫上面,走过了很多弯路,终于找到点方向。后来才发现,很多这个专业的同学,可能毕业几年之后,依然还找不到方向和定位,东学一点西学一点,很浪费时间,可能醒悟的时候,已经过了3~5年,很难再转回头。

2、为了在工作和学习过得中不断积累和提高学习效率

学习和工作的几年里,几乎每个项目,资料,文档,规范都是有共性的,而由于各个项目的不统一,在接收新项目的,几乎都从零开始,一些非功能性需求的建设已经占去了实际项目的很多时间,投入需求建设的时间其实没多少,最简单的,代码的CURD都是一样,自己在做的时候,针对每个项目都有改进,比如这个项目统一了CURD,那个项目梳理出了公共代码,但是项目是分开的,最终新的项目,也是从零开始或者复制,再加上人工,手工,人肉运维,不断的繁琐而简单的工作的学习中无法脱身,影响进入下一步学习。这类似于温水煮青蛙,没有感觉,可能慢慢拖死自己,特别是做项目的前两年,除了数据的添加删除,还是这些。重复开发,无法共用这些都消耗了很长的时间。比如一直想学大数据,但是由于没有好的平台依托,目前还是无法投入学习。

3、为了可以总结和反思,可以不断的打磨出一个平台,一个产品或者一个精品

这几年的工作和学习中,有很多都是在学习,在努力,也很上进,资料有不计其数,但是却在用的时候,没有深入或者精通某一个模块,最常见的,连自己精通的模块都无法界定,不自信,没有自己的深入心得,比较浮在表面上。自己近乎有两年的状态如此,一直在努力,但是却一直没有达到预期的,别人认可的效果,接触的面好像很多,但是却没有哪一样是完全吃透的。最终发现的原因是没有做好总结和复习,反思,一个知识点以为看过了就懂,但是没有结合实际进行提炼与打磨,没有吃透,就往下一个模块,最终导致好像不断的在捡东西,但最终这些东西都不是自己的。所以需要打磨自己的东西,能谈出自己心得,这就是自己的产品,就是自己的精品,或者自己就一个精品。

4、为了扩大自己的视野和学习心态,开放心态

学习中最怕和就是无沟通与交流,没有他人的指点和自己的固步自封,坐井观天等心态,在学得一些技术之后,开始自以为自,然后偏向于安逸。明显,这种心态自己曾经有过,而且持续很长一段时间。这间接造成不管是沟通、技术方面都慢慢出现问题。自己一直相信,心态有多开放,有多宽容,帮助的人越多,自己也才更好的成长,不管是技术还是管理,包括生活等。

二、个人需要搭建怎么样的研发平台来学习

1、可以随时随地的学习,只要有网络和电脑,就可以学习

闲碎的时间常常存在,比如学校上机,看手机,还有一些无聊的聚会,甚至上厕所,这些都要能可以用来学习,网络现在无处不在,有个手机就可以上网,所以这些时间要能充分利用起来。

2、可以好的工具和学习环境

学习过程,工具的成熟度和熟练程度很多时间影响到自己的学习效率。比如vim的配置使用,熟练之后,不管在编辑和代码方面,速度都比一般的操作快得多。还有jenkins,在这个工具上不断的学习和积累,不管是配置和权限,发布,运维,分布式都能很大的帮助,同时节省很多时间。

3、可以不断的学习目标,最好从基础程序员到总监

学习有一个从零开始,到不断往上的过程,并且有目标,知道每个目标阶段需要什么样的技术,能力,成长时间等,做到心知肚明,不浪费多余时间 。可以不断的有学习积累,在积累上由量变到质变

5、可以不断的跟外界沟通交流,避免闭门造车,固步自封

需要不断的与外部学习,获取到外部的建议,看到自己的不足,同时也看到自己的优点。在自己不断学习的过程中,同时不断的成果,并让别人看到,给自己提建议,在自己把自己的思路成果对外贡献的同时,别人也一样帮自己提升。

三、研发平台怎么搭建,搭建到什么样的程度

搭建的思路都是先有一稿,然后再后期慢慢在这一稿上面做好优化,同时参考当前社会主流技术,便于学习。

1、制定整体学习规划和学习路线,技术路线和成长规划

平台构建过程中,产生大量的技术产物和管理产物,而在大量的项目过程中,同时也会产生大量的问题导致过程中细节的不完善,人为的不完善及限制,导致平台无法正常管理和运维,开发平台的管理规划即针对整体平台的运维管理进行的建议,以达到管理统一有序,过程明确,产物明确,目标明确

需求->准备->组织->开发<->内部测试<->用户测试<->自动测试->生产(试运行)->生产->运维整个流程完善,每个流程中又包括多个工作,如需求管理,同时每个工具必然有一定的产物,如需求管理的产物是需求管理基线和需求文档。

序号
模块
功能
产物
备注
  o: ~, o% S! |( J
1需求需求管理管理基线 ( X* `0 z8 U- ~9 Z  M1 H
2需求组织分工需求人员管理表
6 Y, _) z5 r- u+ L# J1 T3需求需求变更
7 r* q+ d% d$ z) r& |" T: ~; S4需求需求确认需求文档 5 y! i8 B8 ^- y! o5 V
5需求需求分配
3 |, H" @6 J  p1 ^; [6准备工具准备工具管理文档
, t* n# k0 A2 c! u# m$ L! S% M7准备组织结构人员资源清单 & s. ?. T( L& A8 n
8准备环境准备开发基线/文档管理基线 ! g/ W% \5 y; B/ B
9准备资源准备 + e+ ?4 s2 s+ z: J
10准备基线准备 . a' c9 v8 I5 Z1 [& M( X" E! t
11组织人员资源人员资源准备 3 i$ g8 n: Y4 N" K! q7 A4 K
12组织开发管理
  H: f4 E, V" P5 O, A13组织沟通管理 - K8 S# u7 {( Z' o6 h
14组织角色分工角色分工及联系沟通表   L$ m+ R" o2 i! q6 x' I, Y* p
15组织版本管理
$ l" D- q2 k/ p6 V+ J5 [6 n16开发开发培训
! U9 \. G6 F" q% `. _17开发开发管理
0 L1 z6 g! U6 v& X  M18开发单元测试
, a# W$ e6 @' a0 y5 U  ^19开发开发流程 8 W; H; n( z' G
20开发部署管理
! j% c7 F- \5 q9 s4 k21开发问题处理
2 o+ y5 c/ y- s3 v3 \' b# b22测试(内部)内部测试 1 e1 P7 n) C: F5 \
23测试(内部)组织机构
) y: t( a9 ~; g  y1 f24测试(内部)问题反馈
) z% i( ^( s/ d/ B25测试(内部)Bug管理
; \2 V) }0 e  k2 S% V6 T* m2 f$ y26测试(内部)接口测试
. S) B) w  R, h$ I$ A+ z4 f+ A27测试(内部)功能测试 - ?6 G1 E: I6 U4 C# j1 X( r9 Z
28测试(内部)集成测试 + w7 t; D: v/ y; _1 x! s0 q4 t
29测试(用户)业务测试 , s3 A7 p( {" M8 J+ D
30测试(用户)问题反馈 4 q& K5 L- L* Z3 H1 L; a4 |
31测试(用户)Bug管理 ) |6 Y3 a: Z- [( }( n- F
32测试(用户)问题反馈
  ~3 X! E8 L0 S! ?8 B33测试(用户)测试报告
1 _+ @3 Y3 F- b1 d( t8 P' L34测试(用户)版本管理
, E3 F4 m3 Q& v4 a; R35测试(自动)测试配置
7 Z6 Y7 {1 _. G' d36测试(自动)压力测试
" ^5 {6 w* S) R/ V+ m+ w9 r37测试(自动)安全扫描 7 a: g, x- f* Y" }7 m; o# L
38测试(自动)功能测试测试报告 . e8 C* a6 N/ i" X7 c/ B
39测试(自动)安全测试安全报告
) r( s$ d# K4 B40测试(自动)压力测试压力报告
! j1 \5 l# {) s' r8 d, K41生产(试运行)切换计划
& @; S  R' Q* ?5 P42生产(试运行)工单管理
9 k# O8 q/ d' @- ?6 Q* J" s43生产(试运行)账号管理
. c  y4 m) x' ^" {$ N# ?44生产(试运行)安全管理
4 e3 O6 j& x/ S" I8 r45生产(正式)运维监控 , d! V6 E0 n0 c6 ^* g0 O
46生产(正式)工单管理
( z5 S. o. ?7 p7 j1 z47生产(正式)日志管理

( {( j+ k+ B; e: s* p  G7 E) E

为达到以上的要求,也为了过程有记录和沉淀,考虑一些必要性的管理工具,暂时考虑以下几个工具:

序号
说明
技术
版本
备注

6 m) D7 N+ O4 P1文档管理GitBook 企业内部做好考虑,团队未必每个人都能接受markdown
% \' E7 m6 N4 A( k9 J2Wiki管理GitBook 企业内部做好考虑,团队未必每个人都能接受markdown! G3 t& A) ]) \# r/ U/ ^
3开发过程管理Jira
$ f1 L) [, d6 ]8 R4 Y$ M4开发工具管理百度网盘 公司内部建议使用FTP或者内部文件系统0 G: x% R/ D' g/ J! q
5邮件通知163邮箱 建议使用企业内部邮箱

8 s& N( |* |& C& {7 n

以下为文档管理基线示例

2、制定持续集成环境,为学习提供基础的准备和提升效率

持续集成他一套比较成熟的自动化研发解决方案,使用也有几年时间,不同的人有不同的设计,有些可能只是发布工程,这里针对于需求、开发、测试、文档、运维几个维度,进行了整合,同时也制定和管理方案,以达到基础规范组织结构基础架构业务开发持续集成自动化部署自动化测试生产运维监控在线升级 几个方向自动化,这里不得不提一下Jenkins+git,确实是整个自动化的核心。目前考虑了一下这些工具,针对于开发的:

序号
说明
技术
版本
备注

/ ^, [0 u' X* M; I1代码管理Git(gitee)2.17.1企业内部建议使用gitlab(更能满足需求)2 V4 _2 g$ R# U5 Z8 a
5代码管理客户端SourceTree2.7.6
$ X" n: G: \. Y4 q  U. ^# E9 |8 R2自动部署工具Jenkins2.107.1不建议使用太新版本
; e3 [1 R9 o) d9 `3私服库Nexus2.14.1不建议使用3.x版本; z1 F4 T3 n6 n" {2 B' Y& N
3构建工具Maven3.6.0 # M3 ]! n. t9 A5 ^
4代码检测Sonar5.x不建议使用太新版本' g0 u* G4 q7 D4 c
5镜像管理Harbor1.5.2 ) t7 K8 I. D+ E9 ]& t
6镜像容器Docker1.12.1 5 ]( @+ w7 a- p1 ?% h4 L) i' C0 W
7容器管理Kubernetes1.10不建议使用太高版本,跟着社区走
% V! z" c$ I, C+ f

自动化持续集成的效果如下:

文档持续集成效果如下:

3、下载和整理软件工具,整理软件工具版本

基础环境完善及配置,为整个开发平台做基础,以环境搭建为主,为本地开发环境。

使用的阿里云服务器规划如下:

序号
作用
服务器资源(系统/内存/硬盘)
IP规划
备注
9 s4 _% A- j1 Q
1开发服务器_masterCentOS7.4_x64_4G_40G192.168.1.110 ! A* m! P' {# h: i
2开发服务器_slaveCentOS7.4_x64_2G_40G192.168.1.111
) R& n  M  `8 b6 ~3开发服务器_slaveCentOS7.4_x64_1G_40G192.168.1.112
3 ^5 {2 p) g. L# s6 D

规划的使用工具如下:

序号
说明
工具
IP
是否集群
文档完善进度
备注
  R" ?$ q" N7 j# W2 n
1基础环境JDK172.18.11.17单点已完善 5 d* U% }9 Z2 M0 ?# B" R
8反向代理Nginx172.18.11.17单点已完善 4 z4 W5 x. d  b6 ?: t9 s
11自动部署工具Jenkins172.18.11.17单点完善中 $ c; M$ V" |( t8 ~+ e
12私服库Nexus172.18.11.17单点已完善 3 f, b$ u6 ~$ Z5 f7 g5 F9 Y! l
17链接跟踪skywalking172.18.11.17单点
7 w" W5 [* V; W& Q. r( W$ k, k13代码检测Sonar172.18.11.17单点 5 [+ V5 q8 I% V' N! y' Y  {
2缓存工具Redis172.18.11.17单点已完善 + Z* C2 h/ z$ M0 j' S; p  P  \
4消息列表Kafka172.18.11.17单点已完善 # c  n5 k' J  d
10分布式注册中心zeekeeper172.18.11.17单点完善中
; G( e3 M% z* _/ c% }6分布式注册中心Eurake172.18.11.139单点
$ k5 i: [/ t& D10分页式配置中心Apollo172.18.11.139单点
4 g9 n; e( _. Y6 R* O6数据库MySQL172.18.11.139单点已完善
7 ]/ l( S( _' X9 R' @4 i8 M% i5 w1开发过程管理Jira192.168.1.120集群
) p8 X) w+ a- V7 b% P3Redis监控工具Redmon192.168.1.119单点 ! V( v- x' V8 V/ R# I/ f* \
5消息管理工具Kafka-Manager192.168.1.119单点 % p' L9 o$ @2 W+ |; H" H# ^
7数据库主从MyCAT192.168.1.111/112集群
. c8 X1 F: W. T7容器管理Kubernetes192.168.1.1110/111/112集群
4 S  C) A4 a+ m' T9高可用KeepAlived192.168.1.110/111/112集群 ( L  Y+ H" r) [' D; y- x. W
14镜像管理Harbor192.168.1.110单点   q& }+ U  O2 \! I# ~
15自动部署Ansible192.168.1.119单点
' s( M; b: s% U- y  H16自动部署管理Ansible Tower192.168.1.119单点 2 A3 |3 V4 s, L& y7 X; t1 d7 Q, w: t
17链接跟踪pinpoint192.168.1.119单点 8 {- y1 F) m0 a# _5 C8 Q
18日志监控elk192.168.1.119集群
* Q3 Y4 R) _. `! B1 k19服务器监控Zabbix192.168.1.119单点

% N7 }" |' m  {* P4 Q& e" O

工具的保存是放在百度云上面:

4、规划平台非功能性需求组件,包括基础组件等

功能重用,组件重用,目前最好的技术承载就是微服务了,这也是这几年才出现,这样规划研发平台构架,对我而言,微服务架构自然成为不二的选择(后面的中台业务也是在微服务上进行进程创建)

服务设计原则

服务单库设计,以减少迁移,服务之前影响等;
5 p* X; Y* D6 ?) E' Q* W: F: f基础服务只为调用设计,位于服务的底层或者中间层,基础服务禁止调用业务服务;4 {) U. O2 p9 f" u% D
业务服务调用基础服务,或者其它服务,业务服务为服务的顶层,用于定制化业务;+ Z, Z! X3 X- x- [! D
同一级服务之间可以互相调用,只能自下往下调用,平级调用,禁止自下往上调用,以避免服务混乱及维护混乱。
% p2 E5 w3 z, d/ b: R; j( g0 D每种服务目录按999个服务规划

服务设计规划

类型
目录名称
说明
备注

7 @3 W. _, C* z3 r教程示例服务做示例工程,包含有所有服务调用示例
/ d# O) s0 b' ]前端应用门户服务与中台服务同级,用于统一门户服务 3 B0 n) r5 a6 r% m
前端应用应用服务前端应用或者手机应用 & g: h& q. B3 }3 O
网关应用网关服务对外网关服务,与平台组件同级,但仅做为网关部分
! z  W% A& [! N1 G# R; T中台服务中台服务服务于前端应用,处理业务,可以服务之间互相调用,或者调用基础服务
1 L; k0 ^* ?9 p0 i" z0 k基础服务基础服务公用基础组件,只能被调用或者调用公共或者组件包,不能主动调用其它服务
; a4 X0 ^- v6 S. N基础服务公共服务基础公共包,所有工程的基础,包括配置,页面,核心包等
. {# J' ]6 A, h' `基础服务组件服务基础组件包,用于第三方等,组件包不能单独运行,只能被依赖 + X. N# g. q. R, l
运维环境监控服务监控平台,用于运维平台,目前仅规划,有可能与平台服务合并一起 8 p9 ?: Z8 h  s0 r) @1 ?5 t
运维环境平台服务包括注册中心,配置中心等

" R. F+ y, D4 C/ K: z! v

工程目录规划

关于命名方向,一直不知道用什么名字比较合适,所以使用自己网站的域名。

序号
目录名称
目录规划
端口规划
权限
备注

  O- z! Q2 f, J5 Y# v- {! g) u1公共服务alinesno-cloud-common 研发
4 D4 e/ n' f( ]' k8 O% D) l& B2组件服务alinesno-cloud-component 研发 . }' W' N1 ^- m5 H* C* {+ l
3平台服务alinesno-cloud-platform24000+研发
. a& m$ ~  W- P) V0 w: j4基础服务alinesno-cloud-base25000+研发
, O- d( x( W' Z- n5业务服务alinesno-cloud-business26000+开发 * L( E9 ^: U7 k6 q, U, I
6门户服务alinesno-cloud-portal27000+研发
; [; Z3 C, `5 z+ }) W! ]7网关服务alinesno-cloud-gate28000+开发 % Z5 i1 @3 j2 b; \2 u# Z
8应用服务alinesno-cloud-web34000+开发 " q$ E! q2 v6 P* ?0 v
9监控服务alinesno-cloud-monitor35000+研发 ' K4 ]1 {4 K# ?. q, {: P3 b9 g) v
10示例服务alinesno-cloud-demo30000+研发置于guide基线
" K4 ^/ y( ^3 I- H5 S" a7 u

5、提取出业务中台规划,并完善组件,打磨中台业务产品

上面也提到,业务中台也是在微服务上面构建,设计原则加上了几个点,分别如下:

按“重中台”+”轻应用”设计,业务应用逻辑思路放在前端应用,推荐是尽量减少或不拆分前端服务;
# L# o' z6 t! H, z8 y0 S1 {1 ]重中台的建设,在于前端应用共性部分的抽取和后期的沉淀,形成中台业务服务;
1 y- ?' V: k5 m. d5 a- \2 `8 x中台服务调用基础服务,或者其它同级服务,中台服务为服务的中层,用于业务共性(共享)抽取;

整体中台的业务架构如下:

中台业务架构设计

中台业务建设目标如下

中台业务建设目标

6、统一和通用的权限配置系统和界面设计

这个就是通用的,只需要在配置平台添加好菜单,分配好账号权限,本地开发只需要账户就可以进行本地开发,配置平台包括的一些功能规划如下:

应用管理:用于配置系统应用,添加和删除管理。
/ N5 g' @4 _& e3 J, i6 o用户管理:用户是系统操作者,该功能主要完成系统用户配置。- g: q& I( l. F1 V6 D+ E
部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。/ N0 N) n6 s/ b. v2 o6 `$ ~
岗位管理:配置系统用户所属担任职务。- @/ l# F9 P4 T- L  ?" [0 N, j
菜单管理:配置系统菜单,操作权限,按钮权限标识等。
& e0 O- P& L( M角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。
. }; F, y) Q2 @0 l, P7 g" b字典管理:对系统中经常使用的一些较为固定的数据进行维护。2 k- p; M- c4 R' _# O
参数管理:对系统动态配置常用参数。. q. q3 V5 v) b2 q
通知公告:系统通知公告信息发布维护。( G6 r0 y7 f( X$ {: \
操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。
' D5 d% d$ `+ O: }$ I$ ~登录日志:系统登录日志记录查询包含登录异常。) R1 J7 D' U( z5 P. L: F
在线用户:当前系统中活跃用户状态监控。
6 |. D; L7 C% l& y6 M' [定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。
8 c4 U8 i4 H1 E7 o代码生成:前后端代码的生成(java、html、xml、sql)支持CRUD下载 。

然后大概的设计如下:

开发人员的开发流程如下:

7、完善软件组件辅助,包括测试、运维、环境管理

以上组件的搭建过程,如果一个人管理,会产生很多问题,同时延伸出其它方向的建设,其中包括最基础的服务器管理和服务预警方向,安全策略管理,平台整体入口和常用文档,功能,平台组件的质量保证,即运维、机房环境,测试这几块。在建设统一研发平台的同时,也自然包括建设这些内容,大概做了一些建设工作,以下为一些设计的示例。

机房服务器管理系统

机房管理系统,针对云系统和服务部署的管理

平台统一门户管理

  • 6 o$ C! `+ E& Q% n5 q( Y

其它的建议,如包括人才培养,大数据,人工智能,项目管理,都是在研发平台中慢慢积累和培养的产物,而最终的结果是为了整理出一套完整的企业统一研发平台。

四、总结

以上为目前搭建整体个人整体研发平台的思路和设计,一个优秀的研发人员的工作并非只是编制代码,更多的是自己能做什么,完成什么,有什么价值,能帮别人做什么。


& r: u( R' o1 A& w  S4 Z

该用户从未签到

2#
发表于 2020-8-24 10:38 | 只看该作者
上大学的时候,就开始学习计算机,从基础的Java到Java web,再到框架,再到在学校接一些小项目,如企业网站,兼职网,报名网站等,这几步路大概走了2年左右,而在学完两年之后,人还是很迷茫,方向感还不是特别强,而在找方向和突破迷茫上面,走过了很多弯路,终于找到点方向。后来才发现,很多这个专业的同学,可能毕业几年之后,依然还找不到方向和定位,东学一点西学一点,很浪费时间,可能醒悟的时候,已经过了3~5年,很难再转回头。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-12 11:16 , Processed in 0.156250 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表