@font-face { font-family: Wingdings }
@font-face { font-family: 宋体 }
@font-face { font-family: 黑体 }
@font-face { font-family: 黑体 }
@font-face { font-family: Calibri }
@font-face { font-family: “@宋体” }
@font-face { font-family: “@黑体” }
@font-face { font-family: 楷体_GB2312 }
@font-face { font-family: “@楷体_GB2312” }
p.MsoNormal, li.MsoNormal, div.MsoNormal { margin: 0 0 0.0001pt; text-align: justify; text-justify: inter-ideograph; font-size: 10pt; font-family: “Arial”, “sans-serif” }
h1 { margin: 13pt 0 13pt 21.55pt; text-align: justify; text-justify: inter-ideograph; text-indent: -21.55pt; line-height: 150%; page-break-after: avoid; font-size: 12pt; font-family: 宋体; font-weight: bold }
h2 { margin: 13pt 0 13pt 28.9pt; text-align: justify; text-justify: inter-ideograph; text-indent: -28.9pt; line-height: 150%; page-break-after: avoid; font-size: 12pt; font-family: “Arial”, “sans-serif”; font-weight: bold }
h3 { margin: 13pt 0 13pt 36pt; text-align: justify; text-justify: inter-ideograph; text-indent: -36pt; line-height: 150%; page-break-after: avoid; font-size: 12pt; font-family: “Arial”, “sans-serif”; font-weight: bold }
h3.CxSpFirst { margin: 13pt 0 0.0001pt 36pt; text-align: justify; text-justify: inter-ideograph; text-indent: -36pt; line-height: 150%; page-break-after: avoid; font-size: 12pt; font-family: “Arial”, “sans-serif”; font-weight: bold }
h3.CxSpMiddle { margin: 0 0 0.0001pt 36pt; text-align: justify; text-justify: inter-ideograph; text-indent: -36pt; line-height: 150%; page-break-after: avoid; font-size: 12pt; font-family: “Arial”, “sans-serif”; font-weight: bold }
h3.CxSpLast { margin: 0 0 13pt 36pt; text-align: justify; text-justify: inter-ideograph; text-indent: -36pt; line-height: 150%; page-break-after: avoid; font-size: 12pt; font-family: “Arial”, “sans-serif”; font-weight: bold }
h4 { margin: 13pt 0 13pt 43.1pt; text-align: justify; text-justify: inter-ideograph; text-indent: -43.1pt; line-height: 150%; page-break-after: avoid; font-size: 12pt; font-family: “Arial”, “sans-serif”; font-weight: bold }
h5 { margin: 14pt 0 14.5pt 50.4pt; text-align: justify; text-justify: inter-ideograph; text-indent: -50.4pt; line-height: 156%; page-break-after: avoid; font-size: 14pt; font-family: “Arial”, “sans-serif”; font-weight: bold }
h6 { margin: 12pt 0 3.2pt 57.6pt; text-align: justify; text-justify: inter-ideograph; text-indent: -57.6pt; line-height: 133%; page-break-after: avoid; font-size: 12pt; font-family: “Arial”, “sans-serif”; font-weight: bold }
p.MsoHeading7, li.MsoHeading7, div.MsoHeading7 { margin: 12pt 0 3.2pt 64.8pt; text-align: justify; text-justify: inter-ideograph; text-indent: -64.8pt; line-height: 133%; page-break-after: avoid; font-size: 12pt; font-family: “Arial”, “sans-serif”; font-weight: bold }
p.MsoHeading8, li.MsoHeading8, div.MsoHeading8 { margin: 12pt 0 3.2pt 72pt; text-align: justify; text-justify: inter-ideograph; text-indent: -72pt; line-height: 133%; page-break-after: avoid; font-size: 12pt; font-family: “Arial”, “sans-serif” }
p.MsoHeading9, li.MsoHeading9, div.MsoHeading9 { margin: 12pt 0 3.2pt 79.2pt; text-align: justify; text-justify: inter-ideograph; text-indent: -79.2pt; line-height: 133%; page-break-after: avoid; font-size: 10pt; font-family: “Arial”, “sans-serif” }
p.MsoToc1, li.MsoToc1, div.MsoToc1 { margin: 6pt 0; font-size: 10pt; font-family: “Times New Roman”, “serif”; text-transform: uppercase; font-weight: bold }
p.MsoToc2, li.MsoToc2, div.MsoToc2 { margin: 0 0 0.0001pt 10pt; font-size: 10pt; font-family: “Times New Roman”, “serif”; font-variant: small-caps }
p.MsoToc3, li.MsoToc3, div.MsoToc3 { margin: 0 0 0.0001pt 20pt; font-size: 10pt; font-family: “Times New Roman”, “serif”; font-style: italic }
p.MsoToc4, li.MsoToc4, div.MsoToc4 { margin: 0 0 0.0001pt 30pt; font-size: 9pt; font-family: “Times New Roman”, “serif” }
p.MsoToc5, li.MsoToc5, div.MsoToc5 { margin: 0 0 0.0001pt 40pt; font-size: 9pt; font-family: “Times New Roman”, “serif” }
p.MsoToc6, li.MsoToc6, div.MsoToc6 { margin: 0 0 0.0001pt 50pt; font-size: 9pt; font-family: “Times New Roman”, “serif” }
p.MsoToc7, li.MsoToc7, div.MsoToc7 { margin: 0 0 0.0001pt 60pt; font-size: 9pt; font-family: “Times New Roman”, “serif” }
p.MsoToc8, li.MsoToc8, div.MsoToc8 { margin: 0 0 0.0001pt 70pt; font-size: 9pt; font-family: “Times New Roman”, “serif” }
p.MsoToc9, li.MsoToc9, div.MsoToc9 { margin: 0 0 0.0001pt 80pt; font-size: 9pt; font-family: “Times New Roman”, “serif” }
p.MsoFootnoteText, li.MsoFootnoteText, div.MsoFootnoteText { margin: 0 0 0.0001pt; text-align: justify; text-justify: inter-ideograph; font-size: 10pt; font-family: “Arial”, “sans-serif” }
p.MsoCommentText, li.MsoCommentText, div.MsoCommentText { margin: 0 0 0.0001pt; text-align: justify; text-justify: inter-ideograph; font-size: 10pt; font-family: “Arial”, “sans-serif” }
p.MsoHeader, li.MsoHeader, div.MsoHeader { margin: 0 0 0.0001pt; text-align: center; layout-grid-mode: char; border: none; padding: 0; font-size: 9pt; font-family: “Arial”, “sans-serif” }
p.MsoFooter, li.MsoFooter, div.MsoFooter { margin: 0 0 0.0001pt; layout-grid-mode: char; font-size: 9pt; font-family: “Arial”, “sans-serif” }
p.MsoCaption, li.MsoCaption, div.MsoCaption { margin: 18pt 0 0.0001pt; text-align: justify; text-justify: inter-ideograph; font-size: 10pt; font-family: “Arial”, “sans-serif” }
p.MsoTof, li.MsoTof, div.MsoTof { margin: 0 0 0.0001pt 20pt; text-align: justify; text-justify: inter-ideograph; text-indent: -20pt; font-size: 10pt; font-family: “Arial”, “sans-serif” }
span.MsoFootnoteReference { vertical-align: super }
span.MsoEndnoteReference { vertical-align: super }
p.MsoBodyText, li.MsoBodyText, div.MsoBodyText { margin: 0 0 0.0001pt; font-size: 10pt; font-family: “Arial”, “sans-serif” }
p.MsoBodyTextIndent, li.MsoBodyTextIndent, div.MsoBodyTextIndent { margin: 0 0 0.0001pt 17.7pt; text-indent: -17.7pt; font-size: 10pt; font-family: “Arial”, “sans-serif” }
p.MsoBodyTextFirstIndent, li.MsoBodyTextFirstIndent, div.MsoBodyTextFirstIndent { margin: 0 0 6pt; text-align: justify; text-justify: inter-ideograph; text-indent: 21pt; font-size: 10.5pt; font-family: “Times New Roman”, “serif” }
p.MsoBodyText2, li.MsoBodyText2, div.MsoBodyText2 { margin: 0 0 0.0001pt; text-align: justify; text-justify: inter-ideograph; font-size: 8pt; font-family: “Arial”, “sans-serif”; color: rgba(0, 0, 0, 1); layout-grid-mode: line; font-weight: bold }
p.MsoBodyTextIndent2, li.MsoBodyTextIndent2, div.MsoBodyTextIndent2 { margin: 0 0 0.0001pt 35.45pt; text-indent: -35.45pt; font-size: 10pt; font-family: “Arial”, “sans-serif” }
p.MsoBodyTextIndent3, li.MsoBodyTextIndent3, div.MsoBodyTextIndent3 { margin: 0 0 0.0001pt 36pt; text-align: justify; text-justify: inter-ideograph; font-size: 12pt; font-family: “Times New Roman”, “serif” }
a:link, span.MsoHyperlink { color: rgba(0, 0, 255, 1); text-decoration: underline }
a:visited, span.MsoHyperlinkFollowed { color: rgba(128, 0, 128, 1); text-decoration: underline }
p.MsoDocumentMap, li.MsoDocumentMap, div.MsoDocumentMap { margin: 0 0 0.0001pt; text-align: justify; text-justify: inter-ideograph; background: rgba(0, 0, 128, 1); font-size: 10pt; font-family: “Arial”, “sans-serif” }
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText { margin: 0 0 0.0001pt; text-align: justify; text-justify: inter-ideograph; font-size: 10pt; font-family: “Arial”, “sans-serif” }
p { margin-right: 0; margin-left: 0; font-size: 12pt; font-family: 宋体 }
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate { margin: 0 0 0.0001pt; text-align: justify; text-justify: inter-ideograph; font-size: 9pt; font-family: “Arial”, “sans-serif” }
span.style1 { mso-style-name: style1 }
p.1H1SectionHeadh11stlevell1H11H12H13H14H15H16, li.1H1SectionHeadh11stlevell1H11H12H13H14H15H16, div.1H1SectionHeadh11stlevell1H11H12H13H14H15H16 { mso-style-name: “样式 标题 1H1Section Headh11st levell1H11H12H13H14H15H16\.\.\.”; margin: 13pt 0 13pt 21.55pt; text-align: justify; text-justify: inter-ideograph; text-indent: -21.55pt; line-height: 150%; page-break-after: avoid; font-size: 12pt; font-family: 宋体; font-weight: bold }
p.3h33Heading3hidden2hh31h32SectionHeading23Al, li.3h33Heading3hidden2hh31h32SectionHeading23Al, div.3h33Heading3hidden2hh31h32SectionHeading23Al { mso-style-name: “样式 样式 标题 3h33Heading 3 hidden2hh31h32SectionHeading 2\.3\(Al\.\.\. + \.\.\.”; margin: 13pt 0 13pt 36pt; text-align: justify; text-justify: inter-ideograph; text-indent: -36pt; line-height: 150%; page-break-after: avoid; font-size: 12pt; font-family: 宋体; font-weight: bold }
p.5, li.5, div.5 { mso-style-name: 我的正文5号字体; margin: 0 0 0.0001pt; text-align: justify; text-justify: inter-ideograph; line-height: 20pt; font-size: 10.5pt; font-family: “Arial”, “sans-serif” }
p.2h22Header2l2Level2Headheading2sect12DONOT, li.2h22Header2l2Level2Headheading2sect12DONOT, div.2h22Header2l2Level2Headheading2sect12DONOT { mso-style-name: “样式 标题 2h22Header 2l2Level 2 Headheading 2sect 1\.2DO NOT \.\.\.”; margin: 13pt 0 13pt 28.9pt; text-align: justify; text-justify: inter-ideograph; text-indent: -28.9pt; line-height: 150%; page-break-after: avoid; font-size: 12pt; font-family: “Arial”, “sans-serif”; font-weight: bold }
p.tealhead15, li.tealhead15, div.tealhead15 { mso-style-name: tealhead15; margin-right: 0; margin-left: 0; font-size: 12pt; font-family: 宋体 }
p.BlockText, li.BlockText, div.BlockText { mso-style-name: “Block Text”; margin: 0 35.45pt 0.0001pt; text-align: justify; text-justify: inter-ideograph; line-height: 15pt; font-size: 12pt; font-family: “Arial”, “sans-serif” }
p.4, li.4, div.4 { mso-style-name: 4; margin-right: 0; margin-left: 0; text-indent: 24pt; line-height: 150%; font-size: 10.5pt; font-family: “Arial”, “sans-serif” }
p.2h22Header2l2Level2Headheading2sect12DONOT0, li.2h22Header2l2Level2Headheading2sect12DONOT0, div.2h22Header2l2Level2Headheading2sect12DONOT0 { mso-style-name: “样式 样式 标题 2h22Header 2l2Level 2 Headheading 2sect 1\.2DO NOT \.\.\. +\.\.\.”; margin: 13pt 0 13pt 28.9pt; text-align: justify; text-justify: inter-ideograph; text-indent: -28.9pt; line-height: 150%; page-break-after: avoid; font-size: 12pt; font-family: 宋体; font-weight: bold }
p.a, li.a, div.a { mso-style-name: 编号列项(三级); margin: 0 0 0.0001pt 40pt; text-indent: -10pt; font-size: 10.5pt; font-family: 宋体 }
p.ParaChar, li.ParaChar, div.ParaChar { mso-style-name: “默认段落字体 Para Char”; margin: 0 0 0.0001pt; text-align: justify; text-justify: inter-ideograph; line-height: 150%; font-size: 12pt; font-family: “Times New Roman”, “serif” }
p.6615, li.6615, div.6615 { mso-style-name: “样式 宋体 小四 加粗 居中 段前\: 6 磅 段后\: 6 磅 行距\: 1\.5 倍行距”; margin: 6pt 0; text-align: center; line-height: 150%; font-size: 12pt; font-family: 宋体; font-weight: bold }
@page WordSection1 { size: 595.3pt 841.9pt margin-top: 72pt margin-right: 70.9pt margin-bottom: 72pt margin-left: 79.4pt }
div.WordSection1 { page: WordSection1 }
@page WordSection2 { size: 595.3pt 841.9pt margin-top: 72pt margin-right: 70.9pt margin-bottom: 72pt margin-left: 79.4pt }
div.WordSection2 { page: WordSection2 }
ol { margin-bottom: 0 }
ul { margin-bottom: 0 }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

XXXX科技有限公司

 

XXXXXX

 

 

 

 

目录

 

1         关于本方案………………………………………………………………………………………………………………………………….. 4

2         概述………………………………………………………………………………………………………………………………………………. 4

2.1      项目背景…………………………………………………………………………………………………………………………………………… 4

2.2      建设目标…………………………………………………………………………………………………………………………………………… 4

2.3      建设原则…………………………………………………………………………………………………………………………………………… 4

3         需求描述及分析…………………………………………………………………………………………………………………………. 4

3.1      概述…………………………………………………………………………………………………………………………………………………… 4

3.1.1      需求分析目标和任务(可选)………………………………………………………………………………………………… 4

3.1.2      需求分析组织方式……………………………………………………………………………………………………………………. 4

3.2      需求描述…………………………………………………………………………………………………………………………………………… 5

3.2.1      业务需求…………………………………………………………………………………………………………………………………… 5

3.2.2      接口需求…………………………………………………………………………………………………………………………………… 5

3.2.3      性能需求…………………………………………………………………………………………………………………………………… 5

3.2.4      安全需求…………………………………………………………………………………………………………………………………… 5

3.2.5      其它需求…………………………………………………………………………………………………………………………………… 5

3.3      需求分析…………………………………………………………………………………………………………………………………………… 5

3.3.1      系统涉众分析……………………………………………………………………………………………………………………………. 5

3.3.2      功能需求分析……………………………………………………………………………………………………………………………. 6

3.3.3      对技术架构的要求……………………………………………………………………………………………………………………. 6

4         总体设计……………………………………………………………………………………………………………………………………… 6

4.1      总体设计目标……………………………………………………………………………………………………………………………………. 6

4.2      总体设计原则……………………………………………………………………………………………………………………………………. 6

4.3      总体逻辑架构设计……………………………………………………………………………………………………………………………. 6

4.4      网络系统设计……………………………………………………………………………………………………………………………………. 6

4.5      硬件系统设计……………………………………………………………………………………………………………………………………. 6

4.5.1      服务器……………………………………………………………………………………………………………………………………….. 7

4.5.2      网络设备…………………………………………………………………………………………………………………………………… 7

4.5.3      存储系统…………………………………………………………………………………………………………………………………… 7

4.6      平台选择…………………………………………………………………………………………………………………………………………… 7

4.7      标准规范设计(可选)……………………………………………………………………………………………………………………. 7

5         详细设计……………………………………………………………………………………………………………………………………… 7

5.1      技术架构设计……………………………………………………………………………………………………………………………………. 7

5.1.1      设计思路…………………………………………………………………………………………………………………………………… 7

5.1.2      设计原则…………………………………………………………………………………………………………………………………… 7

5.1.3      架构决策…………………………………………………………………………………………………………………………………… 8

5.1.4      技术架构…………………………………………………………………………………………………………………………………… 8

5.2      功能设计…………………………………………………………………………………………………………………………………………… 8

5.3      安全设计…………………………………………………………………………………………………………………………………………… 8

5.4      用户界面设计(可选)…………………………………………………………………………………………………………………………. 8

5.4.1      界面设计原则……………………………………………………………………………………………………………………………. 9

5.4.2      易用性设计……………………………………………………………………………………………………………………………….. 9

5.4.3      界面原型设计……………………………………………………………………………………………………………………………. 9

6         项目实施方案……………………………………………………………………………………………………………………………… 9

6.1      项目实施策略与运行管理机制………………………………………………………………………………………………………… 9

6.1.1      项目实施策略……………………………………………………………………………………………………………………………. 9

6.1.2      项目运行管理机制……………………………………………………………………………………………………………………. 9

6.2      项目实施和管理……………………………………………………………………………………………………………………………….. 9

6.2.1      项目组织结构……………………………………………………………………………………………………………………………. 9

6.2.2      项目管理…………………………………………………………………………………………………………………………………… 9

6.2.3      项目计划…………………………………………………………………………………………………………………………………… 9

6.2.4      项目组人员配置……………………………………………………………………………………………………………………….. 9

6.2.5      项目测试方案…………………………………………………………………………………………………………………………. 10

6.2.6      软件开发过程(可选)………………………………………………………………………………………………………….. 10

7         技术支持和服务……………………………………………………………………………………………………………………….. 10

8         项目预算……………………………………………………………………………………………………………………………………. 10

9         公司简介……………………………………………………………………………………………………………………………………. 10

10      附录一 XXX平台简介……………………………………………………………………………………………………………. 11

11      附录二 XXX技术,标准及规范简介…………………………………………………………………………………… 11

 


第1章   关于本方案

本文档的详细描述了修车养车网支付系统项目的每个功能的设计方案。例如功能的需求来源,与各功能模块之间的关系,功能操作流程示例,序列图,程序设计,外部接口,数据库设计等。开发人员可通过阅读该文档快速的了解每一个功能的业务逻辑,便于日后在对系统进行修改时确认修改内容是否正确。

同时本文档也是与终端用户(在本项目中大多数情况是技术支持人员)进行系统功能确认,业务流程确定的唯一文档。

第2章   概述

2.1  项目背景

由于公司多个系统都用到了支付模块,而且功能等方面都一致。

2.2  建设目标

把支付模块单独整理出来,然而实现统一管理、维护方便、并且方便以后新系统的开发。

 

2.3  建设原则

保证支付的安全性,一致性,不影响原系统的支付,在原有系统上以最小的改动方面来实现这个支付的分离。

第3章   需求描述及分析

3.1  概述

3.1.1需求分析

Ø 
原各系统的支付

 

Ø  问题分析

从上图可以看出我们这个养车修车网有好修养、好淘气、等多个项目。然而他们都需要用到支付宝、微信、银联这三个第三方支付。那么既然都是同一个平台的系统,每个系统支付都重新写,或者以后又有新项目支付又要写支付。

得出以下结论:

1.   代码重用性不高

2.   维护不方便

3.2  需求描述

3.2.1业务需求

 

Ø  解决问题

为了解决上面存在的问题,将原来各系统的支付独立分离出来整合成一个支付系统。现在就是由各个系统去和这个独立出来的支付系统交互,然后在由支付系统再去调用第三方支付(微信、银联、支付宝)进行交互。这样即使有新的系统需要用到支付也不要重新写支付的功能,然后也也方便以后的管理维护。

3.2.2接口需求

3.2.2.1   
支付

各个系统调用支付系统,然后我们在根据出传入的支付途径的调用对应的第三方支付进行支付(WEB)或者返回相应的属性(APP,并且返回成功或失败。

 

3.2.2.2   
退款

各个系统调用支付系统,然后我们在根据出传入的支付途径的调用对应的第三方支付进行退款,并且返回成功或失败。

 

3.2.2.3   
支付回调

第三方通知我们的支付系统的回调地址,然后我们验证签名和参数解析,如果支付成功就修改付款单支付状态为已支付,然后根据在通知付款单的系统ID将结果通知对应的系统,如果通知失败就隔1秒在失败就隔2秒依次加时间请求,超过20次就添加到系统日志里面。

3.2.2.4   
退款回调

第三方通知我们的支付系统的回调地址,然后我们验证签名和参数解析,如果支付成功就修改付款单支付状态为已支付,然后根据在通知付款单的系统ID将结果通知对应的系统,如果通知失败就隔1秒在失败就隔2秒依次加时间请求,超过20次就添加到系统日志里面。

 

3.2.3性能需求

[这里描述系统的性能需求。]

3.2.4安全需求

[这里描述系统的安全方面的需求。]

3.2.5其它需求

3.2.5.1   
对账单

3.3  需求分析

3.3.1系统涉众分析

[这里描述和系统相关的用户,包括客户,最终用户细分,他们在系统中的职责,以及他们如何使用系统。简单的说,就是本系统的所有干系人及职责描述,相当于用例分析中的角色。]

3.3.2功能需求分析

[这里描述系统的所有功能需求,可以使用用例图,如果功能需求比较多,可以采用用例包。最好在开始时,给出系统用例图。]

3.3.3对技术架构的要求

[这里描述对架构设计有指导性的关键需求,会影响到后面的架构设计。]

第4章   总体设计

4.1  总体设计目标

[这里描述系统的总体设计目标。]

4.2  总体设计原则

[这里描述系统的总体设计原则。]

4.3  总体逻辑架构设计

[这里以逻辑结构图(一般分层组织)的方式,描述我们提供的整个软件生态系统,一般不涉及具体的技术。]

 

4.4  网络系统设计

[这里用网络拓扑图的形式描述网络方面的设计。]

4.5  硬件系统设计

[这里描述硬件方面的设计,一般包括:数据库服务器、备份服务器、Web服务器、应用服务器、存储设备、防火墙等。]

 

 

4.5.1服务器

[这里描述硬件服务器的选型,依据内容多少,目录可自行添加。]

4.5.2网络设备

[这里描述网络设备的选型,依据内容多少,目录可自行添加。]

4.5.3存储系统

[这里描述存储设备的选型,依据内容多少,目录可自行添加。]

4.6  平台选择

[这里列出所有数据库,应用服务器,web服务器,操作系统等软件平台的选型,可以包含介绍和选择理由。]

4.7  标准规范设计(可选)

[在有些大型系统中,需要做开创性的规范方面的设计,用来指导后面系统的开发。一般就是数据方面的规范。这里可以分两个方面进行描述,一个是规范采用的技术,一般是xml;另一个就是规范初步设计。]

第5章   详细设计

5.1  技术架构设计

5.1.1设计思路

[描述整个技术架构的设计思路,一般是介绍架构设计的历史,引导出本系统实际的符合先进行的架构思路。]

 

5.1.2设计原则

[简要描述设计原则,一般都是都是固定的,可参考指南。]

 

5.1.3架构决策

[列出所有架构决策的要点,并逐点解释其与架构需求的对应。]

5.1.4技术架构

5.1.4.1   
平台技术架构(可选)

[给出方案所选平台的技术架构,一般是采用厂商平台的技术架构,可以从厂商网站或ppt中拷贝。]

5.1.4.2   
总体技术架构图

[在平台架构的基础上,给出具体针对本项目的技术架构。 ]

5.1.4.3   
技术架构说明

[对上面的技术架构进行说明]

5.2  功能设计

[按子系统或模块进行组织,可以使用树形图表示。]

5.3  安全设计

[视客户具体要求,可独立章节,写方案时应考虑招标方的具体安全需求,并给出具体的建议措施。]

 

 

 

版权声明:本文为hezhao原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/hezhao/p/7392039.html