zoukankan      html  css  js  c++  java
  • 案例分析——笔记软件分析报告

    项目 内容
    这个作业属于哪个课程 2021春季软件工程(罗杰 任健)
    这个作业的要求在哪里 案例分析作业
    我在这个课程的目标是 认识软工,拥抱软工,提升相关能力以便日后与其朝夕相伴
    这个作业在哪个具体方面帮助我实现目标 评测现有软件,思索BUG成因,探究解决方法,调研现有市场,设想开发流程,为后续实际开发工作积累经验

    一、前言

    在真正着手完成本次案例分析作业前,笔者一直在思考我们期望使用的软件究竟是怎样的?如何衡量一款软件的好与坏?

    如果从软件开发团队,软件使用群体等多角度进行考量,笔者认为软件的迭代发展的过程应当是:

    • 首先满足需求。软件至少要满足功能需求和非功能需求,功能需求赋予了软件的使命,非功能需求保证了软件自身的稳定。
    • 然后保证体验。对于目标群体而言,软件的设计布局等应当是规范的、用户友好的;软件的使用应当是有指南或文档的;软件的维护应当是有友善的社区和及时的反馈的。
    • 最后处理未知。软件能够很好地解决未知情况,这要求软件在迭代过程中提升自身的容错性,可以游刃有余地解决突发情况,甚至化未知为已知。

    "First do it, then do it right, then do it better." Addy Osmani

    二、调研与评测

    1.体验

    语雀:

    首先注册登录网页版语雀

    尝试新建知识库

    直接根据现有模板直接生成,模板较全面,当然也存在一些小问题(在功能性Bug中阐述)

    探索语雀的更多功能,比如语雀的帮助文档(附有例子,较为详细),反馈社区(能直接根据标签删选,整体风格较为简洁,帖子包含Bug反馈和改进想法等,官方反馈较为及时,有些回复很敷衍)以及更新日志(语雀的更新频率着实快,且更新说明中包含了新功能的介绍,优化和Bugfix的反馈)

    notion:

    下载客户端,并直接用Google账号登录

    第一感觉:制作精良

    从模板到指南,既完整地介绍了软件的功能、特色等,还能让用户快速体验,爱了爱了

    notion还支持查看更新情况,方便快速定位

    尝试各种block的组合,在/地提示下,创建编辑地很流畅,层层嵌入,结构明晰,可收纳,支持block直接拖动,包含各种丰富美观的模板

    typora的快捷方式不尽相同,比如创建引用和代码块(为什么不能先设置语言,再生成代码块,每次创建还要单独调语言,不过可以直接查看上次修改的时间等信息,还可以直接添加captioncomment,赞)

    支持直接通过链接查看,方便团队共享,共同编辑等,提升团队合作开发效率的利器

    还有相关的总结,可以快速上手使用

    2.功能性bug

    bug严重性:

    星级 描述
    五星 致命性系统故障,系统主要功能丧失;致命性安全漏洞,用户数据大规模泄露等;几乎所有用户完全不能接受。
    四星 严重系统故障,主要功能部分失效;严重安全漏洞,用户数据等资料泄露;严重影响用户体验,绝大部分用户不能接受。
    三星 中等程度系统故障,核心功能少部分失效,次要功能部分失效;中等程度安全漏洞,存在泄露用户资料、数据的可能;较严重地影响常使用部分失效功能的用户体验,较小地影响大部分用户的使用体验。
    二星 轻微程度系统故障,非主要功能少部分失效;轻微程度安全漏洞,用户数据等虽然存在泄露的可能,但绝大多数不能被他人利用;轻微程度影响用户体验,用户虽然能察觉到故障所在,但不会影响软件的正常使用。
    一星 极轻微系统故障,非主要功能偶尔失效;极轻微安全漏洞,用户数据等虽然存在泄露的可能,但几乎不会被他人利用;极轻微地影响用户体验,用户会直接忽略故障,甚至不会察觉到故障所在。

    评测环境说明:

    PC端:

    • Windows10 家庭中文版64位
    • 处理器:AMD Ryzen 7 4800U with Radeon Graphics 16CPUs

    网页端:

    • Google Chrome 89.0.4389.90(64位)浏览器

    语雀:

    Bug1 官方模板链接失效

    • 环境:网页端(详见上述评测环境说明)

    • 可复现性:必然发生

    • 复现步骤:

      • 新建知识库
      • 选择学习计划官方模板并新建文档
      • 发现文档内部分内容链接失效
    • 具体描述:

      当笔者尝试新建文档这一新功能时,发现官方文档里的链接已经失效,不能很好地起到示范或指南的作用,如图所示:

    • 可能成因:软件维护团队维护不及时

    • 严重程度:一星,用户可以通过其他模板进行学习

    • 改进建议:及时维护官方模板

    Bug2 当没有编辑历史时无法正常显示

    • 环境:网页端(详见上述评测环境说明)

    • 可复现性:必然发生

    • 复现步骤:

      • 新建知识库
      • 新建文档
      • 点击编排目录
      • 点击查看历史
      • 发现此时无编辑数据,但是一直在loading
    • 具体描述:

      对于新建的知识库,此时知识库中没有编辑记录,但是右侧一直显示正在加载,如动图所示:

    • 可能成因:未设置加载时间,一直未获取编辑数据所以前端一直显示加载中

    • 严重程度:二星,用户通过左侧文字获知暂无数据

    • 改进建议:前端请求增加时限约束

    Bug3 ctrl+s显示保存成功后内容无更新

    • 环境:网页端,PC端(详见上述评测环境说明)

    • 可复现性:必然发生

    • 复现步骤:

      • 点开小记部分
      • 新建小记
      • 利用ctrl + s 保存,此时显示保存成功
      • 点击完成按钮,小记内容并未更新
    • 具体描述:

      在网页端和PC端的小记均存在上述bug,即仅提示保存成功,但是没有实时更新小记中的内容,如下图所示,分别为网页端和PC端的复现情景

    • 可能成因:在前端通过ctrl+s保存后未及时更新后台数据

    • 严重程度:三星,不能正常显示数据的问题,在网页端只能通过刷新页面的方式解决,在PC端只能通过重启软件才能解决,影响用户使用体验

    • 改进建议:前端保存后及时更新数据,拉取新的内容展示给用户

    notion:

    Bug1 行内代码不能正确渲染

    • 环境:PC端(详见上述评测环境说明)

    • 可复现性:共测试100次中文输入,共有70次复现

    • 复现步骤:

      • ctrl+e切换到行内代码输入模式,输入中文
      • ctrl+e退出行内代码编辑模式
    • 具体描述

      在ctrl+e输入行内代码时,正常应当自动将后续输入内容渲染,然而它可能会将前面编辑的内容渲染,如图所示:

    • 可能成因:行内代码不能较好地支持中文渲染,渲染方向判断错误

    • 严重程度:二星,行内代码大部分为英文,所以影响较小

    • 改进建议:优化行内代码中文渲染

    Bug(改进建议)2 支持子block的行内拖拽分栏

    • 环境:PC端(详见上述评测环境说明)

    • 可复现性:必然发生

    • 复现步骤:

      • 利用缩进创建子block1
      • 再在下方创建子block2
      • 无法直接将子block2拖拽进子block1后,形成行内分栏
      • 但是通过创建新的page,再将其转为text(见详细描述内动图),则可以实现子block行内分栏,说明本身支持子block行内分栏
    • 具体描述

      如动图所示,无法直接通过拖拽的形式创建子block的行内分栏

    但是通过如下方式,则可以创建子block的行内分栏

    • 可能成因:不支持子block的分栏检测

    • 严重程度:二星,应当统一各层级的block的分栏设置

    • 改进建议:每一层级均设置分栏的检测,支持拖拽形成分栏

    Bug(改进建议)3 软件运行占用内存过高

    • 环境:PC端(详见上述评测环境说明)

    • 可复现性:共测试10次,其中6次占用内存过高

    • 复现步骤:

      • 关闭其他软件
      • 打开软件尝试使用各种功能
    • 具体描述

      笔者在体验notion和写这篇博客时,notion直接将笔者的16G内存占满,导致博客有的部分没有来得及保存就崩掉(悲),如图:

    PC端启动notion时,直接开了这么多进程(悲

    • 可能成因:笔者了解到notion是在electron基础上开发,之前使用过的同样在electron上开发的软件的内存体验也不是很好(当然也有Atom等对electron做出优化的,最后并不占用很多内存的软件),所以笔者认为虽然electron可以很容易将界面做好看,但是开发团队还应当做一些对应的优化

    • 严重程度:三星,已经影响软件和其他软件的正常使用

    • 改进建议:对PC端软件的内存占用做出相应优化

    3.bug反馈

    已经将语雀中发现的bug向官方团队进行反馈,如图

    4.定性定量测评

    定性评价:

    a) 非常不推荐

    b) 不推荐

    c) 一般

    d) 好,不错

    e) 非常推荐

    对于语雀,反馈社区较为友好,界面简洁,功能较为全面,虽然存在一些小bug,但是官方维护更新的都较为及时,所以给出e)非常推荐的评价。

    对于notion,由于服务器在国外,有时同步会出现卡顿现象,而且结合目前需求,notion显得有些花里胡哨(当然确实是很漂亮精致),block嵌套的层次关系清楚,且支持各种内嵌,所以给出d)好,不错的评价。

    定量评价:

    参考邹欣老师在这篇博客中给出的评分表格

    语雀量化打分如下:

    描述 评分(满分 10 分, 良好 6 分, 及格 4 分,聊胜于无 1 分, 很差 -3 分)
    核心功能 核心功能的设计和质量 8(笔记记录和共同编辑均可正常使用)
    细节 有什么为用户考虑的细节? 4(前端仍然存在一些需要改进的细节bug)
    用户体验 当用户完成功能时,不干扰用户 10(在编辑页面基本没有看到广告)
    辅助功能 一些辅助功能如皮肤等 6(软件整体较为简洁朴素)
    差异化功能 这个软件独特的功能. 它对用户的吸引力有多大? 5(团队协作,共享编辑,中英文支持)
    软件的效能 占用内存, 启动速度, 内存泄漏情况 8(PC端启动较快,占用内存较少;网页端访问较快)
    软件的适应性 在联网/断网, 大小屏幕, 没有鼠标的情况下都可以顺畅操作. 和不同平台的软件能流畅协作 6(语雀不支持移动端)
    成长性 记住用户的选择, 适应用户的特点,用户越用越方便 6(可以保存为模板,方便后续使用)
    用户有控制权 系统状态有反馈,等待时间要合适。关键操作有确认提示,有明确的错误信息。 让用户方便地从错误中恢复工作, 快捷操作键可调整。 4(一些提示有误)
    自选评分项目 反馈社区与产品迭代更新 10(反馈社区氛围较好,反馈较为及时,产品更新较快)
    总分 67

    notion量化打分如下:

    描述 评分(满分 10 分, 良好 6 分, 及格 4 分,聊胜于无 1 分, 很差 -3 分)
    核心功能 核心功能的设计和质量 9(笔记记录和共同编辑均可正常使用,database和block的设计较为优异)
    细节 有什么为用户考虑的细节? 5(指南详尽,且均有示例,用户可以直接在示例上体验)
    用户体验 当用户完成功能时,不干扰用户 10(在软件使用过程周哥基本没有看到广告)
    辅助功能 一些辅助功能如皮肤等 10(软件设计精良美观)
    差异化功能 这个软件独特的功能. 它对用户的吸引力有多大? 5(团队协作,共享编辑,中英文支持)
    软件的效能 占用内存, 启动速度, 内存泄漏情况 -3(PC端占用内存较高)
    软件的适应性 在联网/断网, 大小屏幕, 没有鼠标的情况下都可以顺畅操作. 和不同平台的软件能流畅协作 10(支持web应用、桌面端、移动端安卓和ios)
    成长性 记住用户的选择, 适应用户的特点,用户越用越方便 6(可以保存为模板,方便后续使用)
    用户有控制权 系统状态有反馈,等待时间要合适。关键操作有确认提示,有明确的错误信息。 让用户方便地从错误中恢复工作, 快捷操作键可调整。 6(快捷操作提示较多,出错时也方便修改)
    自选评分项目 反馈社区与产品迭代更新 6(twitter上反馈较多,但由于国内网络设置,较为不方便)
    总分 64

    5.采访

    采访者背景及需求:

    采访对象冯某为大三学生,平日利用笔记软件记录并整理课程内容,具有较长时间的Markdown编辑习惯;为完成团队作业,合作时需要文档共同编辑的平台,且经常跨平台(windows,Linux)工作,因此对可以支持网页端编辑的软件更加偏爱

    采访现场:

    采访内容:

    Q:之前有使用过语雀或notion这类支持团队共同编辑的软件吗?

    A:有的,语雀、notion、overleaf都有使用过

    Q:那你如何评价这三种软件呢?

    A:我觉得overleaf是一个很典型的团队协作软件,它能随时渲染Latex,可以显示其他成员的光标并跳转,可以支持绝大部分Latex特性,overleaf可以输出排版较好的文档,而语雀或notion创作的大部分是平时工作中需要记录的内容,虽然notion的功能很强大,但是界面十分花哨,让人觉得眼花缭乱。语雀有非常完备的文档管理,包括文档的版本管理,权限管理等

    Q:那你最期望的团队协作软件或者笔记编辑软件是什么样子或者具备什么功能呢?

    A:首先是上手难度要低,如果上手难度太高,我很难把它当成文档的产出工作;然后价格亲民(学生党泪目);希望还可以挂靠某一种主流的文件格式,比如markdown,可以保证方便地迁移或分享文档

    三、分析

    1.使用此服务的所有功能,估计这个软件/网站/服务做到这个程度大约需要多少时间(团队人数6人左右,计算机大学毕业生,并有专业UI支持)

    首先明确做到这个程度不包含达到软件当前的社区生态环境,如语雀的上万条反馈和notion在twitter上的模板分享和bug反馈社区。仅讨论从无到有,从0到1的过程,不讨论从1到999+的生态建立过程

    语雀:预计在12周左右可以上线产品,由于存在专业的UI支持,所以3周左右应当能搭建出MVP并同步进行单元测试,可以支持核心功能,例如语雀中的工作台模块,然后再利用4周时间,开发配套功能,比如空间、分享等模块,最后5周进行集成测试,内测和公测,对产品全面测试并对产品的宣传推广

    notion:预计在10周左右可以上线产品,由于可以直接基于electron开发,且拥有专业的UI支持(notion最突出的特点是精美),所以利用4周左右搭建MVP并同步进行单元测试,实现核心的blockdatabase功能,再利用2周完善其他功能并同步进行单元测试,比如实现用户更新的记录和追踪等,最后利用4周进行集成测试,内测和公测等,并对产品进行宣传推广

    2.分析这个软件目前的优劣(和类似软件相比),这个产品的质量在同类产品中估计名列第几?

    语雀相比于notion,优势在于国内开发,使用时较为稳定;指南、参考等均为中文文档,更为详细。劣势在于目前不能支持移动端,且产品较为朴素,从反馈社区来看,目前存在的小bug仍然较多,需要不断更新迭代

    notion相比于语雀,优势在于制作精良,社区活跃;支持从web应用端、桌面端到移动端等当前所有类型的设备;block模式极大地拓展了产品功能;database重新定义了笔记软件的存储模式。劣势在于当前的notion仅包含英文和韩文两个版本(因此才有我来这种国内汉化阉割版notion),且服务器在国外,访问或同步更新时较慢,且个人认为虽然notion堪称艺术品,但可能有些使用人群会觉得产品过于花哨。

    根据SimilarWeb的调研数据显示,网站访问量排名如下:

    如果将同类产品定义为笔记软件,根据当前主流的笔记软件,如evernote、notion、语雀、Typora、Bear、我来(汉化阉割版notion)和有道云笔记等

    所以鉴于notion和语雀当前的访问情况和使用情况,笔者估计在同类产品中,两款软件都能达到前三的排名,且notion相较于语雀更加活跃,设计审美也更加现代,block逻辑抽象简洁便于使用,被访问的次数也较多,所以notion的排名应当高于语雀。

    个人认为如果以typora简洁美观大方的设计理念,佐以共享编辑,必定可以达到同类产品中的第一名。

    3.从各方面的问题,推理出这个软件团队在软件工程方面可以提高的一个重要方面(具体建议)。

    语雀团队应当尽快推出移动版,做到全平台同步,支持更多设备体验与共享,且根据反馈及时迭代当前软件存在的细节问题。

    notion团队应当优化内存存储(16G内存能拉满是真的顶不住),且尽快发布中文版(或在中国部署服务器),提升访问速率。

    4.你在第一部分发现的bug,为何软件团队不能在发布前修复?他们是不知道,还是有意不修复?你觉得是什么原因?

    语雀:

    bug 原因
    官方模板链接失效 未能及时维护
    当没有编辑历史时无法正常显示 测试不充足,未能考察边界情况
    ctrl+s显示保存成功后内容无更新 设计质量不高,未能及时同步

    notion

    bug 原因
    行内代码不能正常渲染 未能进行全面测试,不能较好地支持行内代码渲染
    支持子block的行内拖拽分栏(改进意见) 设计质量不高,未能做到完全统一
    优化PC端软件运行占用内存(改进意见) 开发不充分,对软件内存优化不到位

    四、建议和规划

    1.市场概况

    市场有多大?

    笔记软件的使用人群应该横跨18岁至45岁:在18岁之前(初高中阶段)主要使用纸质笔记,18岁步入大学后逐步采用电子笔记,走入职场后作为办公必备会一直使用,而且笔记软件具有依赖性,因为用户一旦较长时间使用某一笔记软件后,软件中管理的笔记越来越多,用户会时常在软件查找过往笔记,并在原有笔记的基础上创造更多的内容。

    所以粗略估计会有超过40%的用户会使用个人知识管理(笔记管理)的软件,且根据资料显示,笔记管理软件市场在2018年的价值为8.977亿美元,预计到2026年将达到13.5亿美元,从2019年到2026年的复合年增长率为5.32%。

    直接的用户有多少?潜在的用户又有多少?

    直接用户包含需要快捷便利记录笔记的学生、白领等

    潜在用户包含这些只在本机备忘录记录,未来需要多端同步的用户,以及各类打算投入无纸化笔记记录的人群。

    2.市场现状

    目前市场上有什么样的产品了?

    目前市场上的笔记软件包括OneNote、印象笔记(evernote)、幕布、Bear、Google Keep、语雀、notion和有道云笔记等

    上述产品的定位、优势与劣势在哪里?

    笔记软件的定位为用户依赖型软件,且为满足更多用户需求,应当尽量兼容更多平台;同时应当保证上手简单,操作容易,管理方便等

    笔记软件 优点 缺点
    OneNote 界面美观,可为每个笔记本设置 logo 颜色,笔记本列表还可自定义放在两侧或者顶部,强大的搜索功能,可以对常规的文字图片里的文字搜索的同时尽然还能使用语音搜索 下载慢、不支持多标签
    印象笔记 功能全面、界面简洁,自定义桌面工具丰富,可以在任何平台(PC、手机)转存内容,并且格式不混乱,支持MarkDown和思维导图,可以满足绝大多数不同需求的用户 缺少多层级目录、会员制
    幕布 一键生成思维导图,而且支持思维导图演示播放,只需要输入文字,设置文档层级就能一键转换为思维导图,适合梳理知识点,便于记忆强化 不支持Latex
    Bear 轻便,友好地支持Markdown文本,整体相当于一个笔记本 免费版功能有限
    Google Keep 具备强大的搜索功能,可以按照记事类型、标签、事物以及笔记颜色分类 国内无法使用
    语雀 具备个人知识库、小记等内容,团队可以共同编辑文档,实时共享 无移动端设备
    notion block的设计为软件的核心,block可以随意拖动,具有丰富的表现形式,且软件精致,具有丰富的模板,开发社区十分友好 英文版,占用内存较高
    有道云笔记 主打办公协作,不限设备,不限流量,3GB总容量,且分享的笔记可直接让他人查看,实现增量式同步 广告较多

    上述产品之间呈现什么样的关系,哪些为竞品关系?以及竞争中的各方态势如何?

    以上笔记软件均为竞品关系,选取主流的四款笔记软件:notion、语雀、有道云笔记和印象笔记,根据百度搜索指数显示其发展态势

    3.市场与产品生态

    这个产品的核心用户群是什么样的人?典型用户是什么样的?学历,年龄,专业,爱好,收入,表面需求,潜在需求都是什么?

    核心用户群应当为追求无纸化记录和平台同步的学生和公司白领等,年龄跨度在18-45岁之间

    典型用户包含:

    • 在校大学生,需要笔记软件整理所学知识,以笔者自身为例,平时需要利用笔记软件梳理课程知识,软件需要支持代码嵌入、latex、markdown等,需要软件保证自身的产出效率
    • 职场白领,需要对管理内容整合,编写报告等,利用软件对自身工作进行合理的安排,同时可以查看其他人分享的内容提升自己
    • 团队开发人员,需要利用笔记软件同步编辑文档,提升共同开发效率;笔记软件还应当追踪保留更新日志,设置管理权限,明确任务安排等,方便团队leader管理;

    产品的用户群体之间是否存在一定的关系?是否有利用其相互作用二次构成特定用户生态的可能性?

    存在关系

    同一类型的群体之间会分享好用的笔记软件(比如当新用户想使用一款新的软件时,会在知乎等平台进行提问)。以学生群体为例,他们会受到同学安利,课程推荐等影响,共同使用某一或某几类笔记软件

    不同类型的群体之间还存在笔记软件使用的连续性。因为用户存在对笔记软件的依赖性,目前仍是大学生的用户群体由于长时间使用某一笔记软件,梳理内容,当走向社会参加工作后,仍然会使用相应软件,在原有的基础上继续记录整理

    4.产品规划

    你要在当前软件的基础上设计什么样的新功能?为何要做这个功能,而不是其他功能?为什么用户会用你的产品/功能?你的创新在哪里?可以用NABCD分析。

    添加功能:增加社区组管理(非团队组,更多的是具有共同职业、偏好、使用习惯甚至相同地域的陌生人的组)的内容,组内共性较强,可以在组内分享技巧手册、文档模板等,且对于一些共性问题,也方便软件开发团队测试解决

    NABCD分析:

    • Need 需求
      • 软件团队需要社区组,以语雀为例,反馈社区较为松散,一些共性问题被重复提问,需要通过社区组的方式(比如某一社区组内职业领域相同,都会使用某些功能)获取某一功能的详细全面的反馈
      • 软件使用者需要社区组:仍以语雀为例,语雀的发现版块甚至不支持搜索功能,社区组内的软件使用者共性较强,可以从社区组中获得使用技巧、理念等
    • Approach 做法
      • 首先设计相应的数据库表单,为社区组的运营创建环境
      • 软件团队先创建几个社区组,比如根据使用群体建立相应的社区组:大学生组,技术人员组等,允许用户加入社区组
      • 社区组功能测试完善后,允许用户建立社区组,软件开发团队需要进一步对社区组进行管理,降低重复性等
    • Benefit 好处
      • 对于软件团队而言,当前社区组内共性强,对某一功能的使用较为深入,可以较全面的反馈,同时当增加新功能时,还可以直接在社区组内调研,获得用户习惯等
      • 对于软件使用者而言,社区组内成员可以共享模板、使用技巧、理念等,互相分享、共同进步
    • Competitor 竞争
      • 目前语雀和notion没有支持此功能,可以作为竞争中的亮点
    • Delivery 推广
      • 通过软件开发团队主动建立社区组的形式进行宣传,引导,待用户从中受益后,会自发建立讨论组

    如果你是项目经理,可以招聘6个人,并且有4个月的时间,你认为应该如何配置角色(开发,测试,美工等等) 才能在第16周如期发布软件的改进版本,并取得预想中的成绩。

    人员分配:

    • 美工:1人
    • 开发:2人
    • 测试:3人

    主要是在原有功能的基础上进行增量开发,所以测试(包含集成测试、回归测试等较为重要)

    请为你的团队设计16个周期每周的详细规划

    周次 任务
    1 明确分工,明确主要完成目标
    2~4 通过需求分析明确任务安排,完成基础功能设计
    5~10 alpha阶段开发,根据设计进行开发,测试人员同步完成单元测试,实现基础功能后在平台建立官方社区组,形成小范围内测
    10~15 总结alpha阶段任务完成和用户反馈情况后,开始beta阶段开发,测试人员进行回归测试和集成测试,实现预定内容后,允许用户建立社区组,并进一步收集反馈做出改进
    16 功能宣传并发布,同时维护软件更新文档
  • 相关阅读:
    python算法:嵌套数组转变成一维数组
    python算法:约瑟夫问题
    python的加密算法(1):反转加密
    算法:桶排序
    正则表达式学习(3):相关符号解释
    代码这样写更优雅(1)
    正则表达式学习(2)
    神奇的Bank系统之旅哦
    C#之第五单元的项目打印购物单
    C#语言的基础
  • 原文地址:https://www.cnblogs.com/joeye153/p/14619959.html
Copyright © 2011-2022 走看看