F.1 引言
F.1.1 编写目的
本详细设计说明书是针对电子科大校园地图(UESTC Campus Map)小程序的项目编写。目的是对该项目进行详细设计,在概要设计的基础上进一步明确系统结构,详细地介绍系统的各个模块,为进行后面的实现和测试做准备。本详细设计说明书的预期读者为本项目小组的成员以及对该小程序感兴趣,在以后想对系统进行拓展和维护的人员。
F.1.2 背景
说明:
a、待开发软件系统的名称:电子科大校园地图小程序(UESTC Campus Map)
b、本项目的任务提出者:金成哲,陆冠臣,罗子建
本项目的开发者:金成哲,陆冠臣,罗子建
本项目的用户:在校学生,教师,校园游客
本项目的计算中心:微信小程序
F.1.3 定义
(1) MVC Model View Controller ,是模型 ( model )-视图 ( view )-控
制器(Controller)的缩写。
(2) CURD 代表创建( Create )、更新 Update )、读取 Retrieve
和删除( Delete )操作。
(3) UCM 是 UESTC Campus Map 的简称。
F.1.4 参考资料
(1)《软件工程》(第三版)·钱乐秋等编著·清华大学出版社
(2)《设计模式之禅》)《设计模式之禅》(第二版)·秦小波著·机械工业出版社(第二版)·秦小波著·机械工业出版社
(3)《玩转DjangoDjango 2.0》·黄永祥著·清华大学出版社》·黄永祥著·清华大学出版社
(4)《数据库要求说明书》
(5)《数据库设计说明书》
(6)微信小程序开发文档
F.2 程序系统的结构
整体架构:整体架构设计演示如下:
名称 |
标识符 |
说明 |
客户端 |
Client |
客户系统提供本地服务 |
服务端 |
Server |
向客户端提供资源,保存客户端数据 |
数据库系统 |
Database |
存储客户端资源及相关信息 |
本地操作系统 |
Local operating system |
客户端提供交互界面的服务 |
电子科技大学统一身份认证系统 |
Authentication system |
电子科技大学学生认证系统,提供学生认证平台 |
微信服务器 |
Wechat server |
提供UCM的应用生态服务 |
微信小程序后台管理系统 |
Miniprogram admin system |
小程序开发者管理小程序的版本更新及用户数据分析 |
客户端:采用 MVC 软件架构设计,框图演示如下
模型(即数据表):
名称 |
标记符 |
说明 |
标记点表 |
Location |
记录校园地图的地点描述以及具体地理位置 |
功能表 |
Function |
记录标记点的功能信息以及标签分类 |
轮播图表 |
RollingImage |
记录某标记点的轮播图片 |
讨论表 |
Discussion |
记录用户发布讨论的内容信息 |
评论表 |
Comment |
记录用户参与评论的信息 |
用户表 |
User |
记录用户登录账户以及学生认证等基本信息 |
控制:
名称 |
标记符 |
说明 |
网络请求 |
Internet request |
提供连接服务,响应界面 |
存储处理 |
Storage Processing |
根据存储请求,将相关数据存储到对应数据表 |
数据清洗 |
Data cleaning |
根据内置算法设计,对数据表的数据进行再处理 |
视图:
名称 |
标记符 |
说明 |
地图界面 |
Map |
根据不同校区的需要,提供地图的功能介绍 |
讨论界面 |
Discussion |
给用户提供论坛讨论的服务,针对不同标记点发布讨论内容 |
功能界面 |
Function |
给对应标记点提供不同的功能介绍 |
认证界面 |
Authentication |
为区分不同用户,利用电子科大校园信息门户的平台,本小程序设计了一个校园身份认证的系统 |
历史关注界面 |
Historical Concerning |
为方便用户查看以前参与的讨论与功能的建设,故提供历史关注的服务 |
轮播图界面 |
Rolling Image |
为丰富用户对该标记点的认知与理解,提供对该标记点的轮播图展示服务 |
登录界面 |
login |
用户首次登录小程序 |
服务端:
名称 |
标记符 |
说明 |
日志系统 |
Logging System |
自动记录流式数据,各进程,异常信息 |
网络模块 |
Network module |
提供连接服务 |
控制模块 |
Controling module |
根据服务请求,进行不同模块的控制 |
数据库操作模块 |
Database operation module |
写入,查询,修改或删除数据库的信息 |
F.3 网络模块
F.3.1 程序描述
网络模块主要是客户端对服务器的网络请求功能的模块化实现,整个客户端采用规范化的统一格式对服务器进行网络请求。主要是为了更好的鲁棒性以及可读性。
F.3.2 功能
功能范例:
功能 |
输入 |
输出 |
格式/请求 |
校园身份认证 |
openid、学号、密码 |
code、msg identity |
json/POST |
微信登录 |
code encryptedData iv |
code、msg、uid uNickName、uavaUrl: |
json/POST |
发布功能 |
uid functionCode locationID |
code msg uid identity datatype data:[ {functionID functioncontent functiondescription locationID locationdescription locationLatitude locationLongitude}] |
json/POST |
发布讨论 |
uid discussionCode locationID |
code msg uid identity datatype data:[ discussionID presenttime locationID locationLatitude locationLongitude ] |
json/POST |
评论他人 |
uid uidor discussionID commentCode locationID |
code msg datatype commentID |
json/POST |
获取发布历史 |
identity uid dataType |
code msg uid identity: dataType data:[ discussionID discussionContent: locationID locationLatitude locationLongitude imgUrls:[ "https:********", ] ] |
json/POST |
获取讨论列表 |
locationID uid |
code msg dataType data:[ { discussionID discussionCode discussioncontent: uNickName uavaUrl imgUrls:[] presenttime locationID locationLatitude locationLongitude: comment:[ {commentID commentcontent uNickName uorNickName}]}] |
json/POST |
获取功能列表 |
uid locationID dataType |
code msg data:[{ functionID: functionCode functioncontent functiondesription: locationID locationLatitud locationLongitude: }] |
json/POST |
获取轮播图 |
uid string dataType |
code msg imgUrls:[ "https://123.png", "https://124.png",] |
json/POST |
获取所有标记点 |
uid dataType: |
code msg locationID:[] |
json/POST |
删除 |
dataType uid dataType uid |
code msg: |
json/POST |
F.3.3 性能
运行 |
模块组合 |
响应时间(ms) |
校园身份认证 |
网络模块、数据库模块 |
1000 |
微信登录 |
登录模块、数据库模块、网络模块 |
500 |
发布功能 |
功能模块、数据库模块、网络模块 |
200
|
发布讨论 |
数据库模块、讨论模块 |
1000 |
评论他人 |
数据库模块、讨论模块、评论模块、网络模块 |
200
|
获取发布历史 |
数据库模块、讨论模块、评论模块、功能模块、网络模块 |
1000 |
获取讨论列表 |
数据库模块、讨论模块、评论模块、网络模块 |
1000
|
获取功能列表 |
功能模块、网络模块、数据库模块 |
300 |
获取轮播图 |
轮播图模块、数据库模块、网络模块 |
1000+ |
获取所有标记点 |
数据库模块、网络模块、标记点模块 |
200 |
删除 |
所有模块 |
100
|
添加标记点 |
数据库模块、网络模块、标记点模块 |
200
|
F.3.4 输入项
输入输出等参考功能F.3.2;
安全保密:对请求数据进行签名,防止非法请求和重放攻击,同时,对用户敏感数据进行加密;
F.3.5 输出项
输入输出等参考功能F.3.2;
安全保密:对请求数据进行签名,防止非法请求和重放攻击,同时,对用户敏感数据进行加密;
F.3.6 算法
算法示例:
字段名 |
类型 |
含义 |
必填 |
备注 |
a |
text |
请求的字段 |
True |
|
b |
text |
请求字段 |
True |
|
appKey |
text |
客户端应用标识 |
True |
一段唯一标识客户端的字符串 |
salt |
text |
随机数(建议使用UUID) |
True |
|
timestamp |
long |
Unix时间戳(精确到秒) |
True |
|
sign |
text |
sha256签名 |
True |
计算方法:sha256(a+b+appKey+salt+timestamp+密钥) |
例如:
a:"123",
b:"地图",
appKey:"57673e9f4b774dd9a739ee668e38c0a1",
salt:"66785bb6-2df8-5e7e-a51b-cb7d257738e5",
timestamp:"1560761282",
密钥:"651d-4bbf-350f-b477-fe1b",
客户端利用sha256计算签名:
sha256(123地图57673e9f4b774dd9a739ee668e38c0a166785bb6-2df8-5e7e-a51b-cb7d257738e51560761282651d-4bbf-350f-b477-fe1b)
结果:423cb7cf98d7e11c4efa3ce042e4e4546ae342a565a460fd8443f814258d63b3
服务器流程说明:
服务器接收到数据后,首先验证appKey是否合法,然后从数据库中获取该appKey对应的密钥,然后再获取当前服务器的时间戳,计算t = 服务器时间戳-timestamp,若t>60,则是一条重放消息,若小于60,则开始验证签名,即服务器利用相同的算法计算请求的sha256,对比是否相同,若相同,则做下一步操作,否则这是一条非法请求,直接响应错误信息。
F.3.7 流程逻辑
F.3.8 接口
用图的形式说明本程序所隶属的上一层模块及隶属于本程序的下一模块、参数赋值和调用方式,说明与本程序具有直接关系之数据结构(数据库、数据文卷)。
F.3.9 存储分配
无特别要求
软件 |
存储分配 |
备注 |
客户端 |
内存:500KB(<=2MB),本地存储:10MB |
微信限制 |
服务器 |
内存:50-100MB, 硬盘:50GB |
适当情况下可以扩容,采用分布式集群的方式运行服务端 |
数据库 |
内存:1GB; 硬盘:50GB |
适当情况下可扩容 |
F.3.10 注释设计
1.单行注释(single-line)://注释内容
一次只能注释一行,一般是简单注释,用来简短描述某个变量或属性,程序块。
2.块注释(block):/*注释内容*/
为了进行多行简单注释,一般不使用。
3.文档注释:/**注释内容 */
/**
* projectName: xxx
* fileName: xxx
* packageName: xxxx
* date: 2019年6月18日下午12:28:39
* copyright(c) 2019-2020 xxx
*/
4.类注释
类注释(Class)主要用来声明该类用来做什么,以及创建者、创建日期版本、包名等一些信息:
/**
* @version: V1.0
* @author: Lulusimili
* @className: user
* @packageName: user
* @description: 这是用户类
* @data: 2019-06-28 12:20
**/
5.方法注释
方法注释(Methods)主要用来声明该类的作用、入参、返回值、异常等信息:
/**
* @version: V1.0
* @author: Lulusimili
* @methodsName: addUser
* @description: 添加用户
* @param: xxxx
* @return: String
* @throws: IOException
**/
F.3.11 限制条件
必须在连接互联网的情况下才能使用本模块,否则将提示网络异常信息。
F.3.12 测试计划
需要结合其它模块才能测试,此处不做说明。
F.3.13 尚未解决的问题
接口字段的模糊混淆处理,所以还是存在非法用户进行恶意发送脏请求的可能。
F.4 日志模块
F.4.1 程序描述
小程序日志系统
F.4.2 功能
提供日志记录功能,为系统错误和恢复提供保障。
F.4.3 性能
日志信息分类
(1)等级由低到高:debug (2)区别: debug :级别最低,可以随意的使用于任何觉得有利于在调试时更详细的了解系统运行状态的东东; info : 重要,输出信息:用来反馈系统的当前状态给最终用户的; warn:可修复,系统可继续运行下去; Error: 可修复性,但无法确定系统会正常的工作下去; Fatal: 相当严重,可以肯定这种错误已经无法修复,并且如果系统继续运行下去的话后果严重。 F.4.4 输入项 日志输入针对不同的日志类别有所区别。 F.3.5 输出项 log.error(“[接口名或操作名] [Some Error Msg] happens. [params] [Probably Because]. [Probably need to do].”); log.error(String.format(“[接口名或操作名] [Some Error Msg] happens. [%s]. [Probably Because]. [Probably need to do].”, params)); 或 log.error(“[Some Error Msg] happens to 错误参数或内容 when [in some condition]. [Probably Because]. [Probably need to do].”); log.error(String.format(“[Some Error Msg] happens to %s when [in some condition]. [Probably Because]. [Probably need to do].”, parameters)); [Probably Reason]. [Probably need to do]. 在某些情况下可以省略; 在一些重要接口和场景下最好能说明一下。 每一条错误日志都是独立的,尽可能完整、具体、直接说明何种场景下发生了什么错误,由什么原因导致,要采用什么措施或步骤。 F.3.6 算法 日志分析方法: 1.特征字符分析(Signature-based): 在日志中查找已知的漏洞特征,去发现黑客攻击行为, 是最简单的方法。 2.访问频率分析(Frequency analysis) 在黑客攻击过程中,需要对系统进行各种特定的访问,这些访问与正常用户访问有很大差别, 每种攻击行为都有不同的特征。 通过对大量用户访问数据的挖掘,可以发现这些异常访问行为。 日志检测方法: 1.漏洞扫描检测: 黑客使用漏洞扫描器对 Web 应用进行扫描,可以用匹配 User-Agent 特征的方式进行检测。如果自定义扫描器的 User-Agent,这个方法的效果可能会不好。但可匹配扫描器扫描的行为, ·访问目标离散 ·来源地址相对固定 ·访问结果大多数失败 根据这些特征对 Web 访问日志进行分析,即可提取出来可疑的扫描行为。 2.暴力破解检测: 暴力破解密码的特征是: ·相对固定的来源地址 ·对登录URL短时间内高频率发起请求 ·与漏洞扫描的区别主要是目标 URL 固定。 3.webshell 检测 如果黑客发现系统漏洞,并且利用漏洞获得上传权限,会向系统 上传 webshell。webshell 是一种后门程序,此程序由脚本语言编写, 可以在 Web 服务器上运行,攻击者可以通过网页执行系统命令,读写 系统文件。从访问行为的角度看,webshell 通常: ·只有攻击者访问 ·来源地址相对固定 ·访问时间相对集中 ·无内嵌其他页面 通过这些特征即可提取出可疑文件,再通过人工确认的方式,检测出 webshell。 F.3.7 流程逻辑 日志产出 ——>采集——>储存——>分析——>储存——>可视化 F.3.8 接口 结构设计: 日志工作流: F.3.9 存储分配 文件 存储 备注 log 2GB 每天24:00进行当天日志归档 F.3.10 注释设计 1. 单行注释(single-line)://注释内容 一次只能注释一行,一般是简单注释,用来简短描述某个变量或属性,程序块。 2.块注释(block):/*注释内容*/ 为了进行多行简单注释,一般不使用。 3.文档注释:/**注释内容 */ /** * projectName: xxx * fileName: xxx * packageName: xxxx * date: 2019年6月18日下午12:28:39 * copyright(c) 2019-2020 xxx */ 4.类注释 类注释(Class)主要用来声明该类用来做什么,以及创建者、创建日期版本、包名等一些信息: /** * @version: V1.0 * @author: Lulusimili * @className: user * @packageName: user * @description: 这是用户类 * @data: 2019-06-28 12:20 **/ 5.方法注释 方法注释(Methods)主要用来声明该类的作用、入参、返回值、异常等信息: /** * @version: V1.0 * @author: Lulusimili * @methodsName: addUser * @description: 添加用户 * @param: xxxx * @return: String * @throws: IOException **/ F.3.11 限制条件 无特别要求 F.3.12 测试计划 结合其它模块进行测试 F.3.13 尚未解决的问题 日志自动化分析工具的集成 F.5 数据库操作模块 F.5.1 程序描述 数据库操作的封装模块 F.5.2 功能 对数据库的增删查改进行功能封装,提供统一的接口 F.5.3 性能 功能操作 模块组合 资源占用时间(ms) 校园身份认证 网络模块、数据库模块 20 微信登录 登录模块、数据库模块、网络模块 20 发布功能 功能模块、数据库模块、网络模块 20 发布讨论 数据库模块、讨论模块 100 评论他人 数据库模块、讨论模块、评论模块、网络模块 20 获取发布历史 数据库模块、讨论模块、评论模块、功能模块、网络模块 100 获取讨论列表 数据库模块、讨论模块、评论模块、网络模块 100 获取功能列表 功能模块、网络模块、数据库模块 50 获取轮播图 轮播图模块、数据库模块、网络模块 20 获取所有标记点 数据库模块、网络模块、标记点模块 20 删除 所有模块 50 添加标记点 数据库模块、网络模块、标记点模块 20 F.5.4 输入项 F.5.5 输出项 操作反馈 F.5.6 算法 多表查询算法: 一、交叉连接 交叉连接即笛卡儿乘积,是指两个关系中所有元组的任意组合。一般情况下,交叉查询是没有实际意义的。 例如:如果希望得到学生表和选课表两个关系模式的乘积,查询语句为: SELECT * FROM学生表CROSS JOIN选课表 二、内连接 内连接是一种最常用的连接类型。内连接查询实际上是一种任意条件的查询。使用内连接时,如果两个表的相关字段满足连接条件,就从这两个表中提取数据并组合成新的记录,也就是在内连接查询中,只有满足条件的元组才能出现在结果关系中。 例如:要查询每个已经选课的学生的情况,查询语句为 SELECT* FROM学生表INNER JOIN选课表ON学生表.学号=选课表.学号 分类: 1)等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。 2)不等连接:在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。 3)自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。 三、自然连接 如果在一个连接查询中,涉及到的两个表都是同一个表,这种查询就称为自连接查询。同一张表在FROM字句中多次出现,为了区别该表的每一次出现,需要为表定义一个别名。自连接是一种特殊的内连接,它是指相互连接的表在物理上为同一张表,但可以在逻辑上分为两张表。 例如:要求检索出学号为20210的学生的同班同学的信息,查询语句为 SELECT学生表.* FROM学生表JOIN学生表AS学生表1ON学生表.班级=学生表1.班级 WHERE学生表1.学号='20210' 四、外连接 内连接的查询结果都是满足连接条件的元组。但有时我们也希望输出那些不满足连接条件的元组信息。比如,我们想知道每个学生的选课情况,包括已经选课的学生(这部分学生的学号在学生表中有,在选课表中也有,是满足连接条件的),也包括没有选课的学生(这部分学生的学号在学生表中有,但在选课表中没有,不满足连接条件),这时就需要使用外连接。外连接是只限制一张表中的数据必须满足连接条件,而另一张表中的数据可以不满足连接条件的连接方式。 3种外连接: 1)左外连接(LEFTOUTER JOIN) 如果在连接查询中,连接管子左端的表中所有的元组都列出来,并且能在右端的表中找到匹配的元组,那么连接成功。如果在右端的表中,没能找到匹配的元组,那么对应的元组是空值(NULL)。这时,查询语句使用关键字LEFT OUTERJOIN,也就是说,左外连接的含义是限制连接关键字右端的表中的数据必须满足连接条件,而不关左端的表中的数据是否满足连接条件,均输出左端表中的内容。 例如:要查询所有学生的选课情况,包括已经选课的和还没有选课的学生,查询语句为 SELECT学生表.学号,姓名,班级,课程号,成绩 FROM学生表LEFT OUTER JOIN选课表ON学生表.学号=选课表.学号 左外连接查询中左端表中的所有元组的信息都得到了保留。 2)右外连接(RIGHTOUTERJOIN) 右外连接与左外连接类似,只是右端表中的所有元组都列出,限制左端表的数据必须满足连接条件,而不管右端表中的数据是否满足连接条件,均输出表中的内容。 例如:同上例内容,查询语句为 SELECT学生表.学号,姓名,班级,课程号,成绩 FROM学生表RIGHTOUTERJOIN选课表ON学生表.学号=选课表.学号 右外连接查询中右端表中的所有元组的信息都得到了保留。 3)全外连接(FULL OUTER JOIN) 全外连接查询的特点是左、右两端表中的元组都输出,如果没能找到匹配的元组,就使用NULL来代替。 例如:同左外连接例子内容,查询语句为 SELECT学生表.学号,姓名,班级,课程号,成绩 FROM学生表FULL OUTER JOIN选课表ON学生表.学号=选课表.学号 F.5.7 流程逻辑 F.5.8 接口 F.5.9 存储分配 模块 存储 备注 数据库 内存:1GB 硬盘:50GB 必要可扩容 F.5.10 注释设计 1. 单行注释(single-line)://注释内容 一次只能注释一行,一般是简单注释,用来简短描述某个变量或属性,程序块。 2.块注释(block):/*注释内容*/ 为了进行多行简单注释,一般不使用。 3.文档注释:/**注释内容 */ /** * projectName: xxx * fileName: xxx * packageName: xxxx * date: 2019年6月18日下午12:28:39 * copyright(c) 2019-2020 xxx */ 4.类注释 类注释(Class)主要用来声明该类用来做什么,以及创建者、创建日期版本、包名等一些信息: /** * @version: V1.0 * @author: Lulusimili * @className: user * @packageName: user * @description: 这是用户类 * @data: 2019-06-28 12:20 **/ 5.方法注释 方法注释(Methods)主要用来声明该类的作用、入参、返回值、异常等信息: /** * @version: V1.0 * @author: Lulusimili * @methodsName: addUser * @description: 添加用户 * @param: xxxx * @return: String * @throws: IOException **/ F.5.11 限制条件 数据库不在本地的需要访问网络 F.5.12 测试计划 测试名称 值说明 输入方式 写入数据库 1.每个数据表的测试数据应包括:输入完整,不完整,字段非法等情况 2.多表插入,单表插入 自动输入 查询数据库 单表查询,多表查询 自动输入 从数据库删除 无 自动输入 F.5.13 尚未解决的问题 大数据量下的数据库的分库分表操作 F.6 讨论模块 F.6.1 程序描述 对用户讨论功能的封装,提供统一接口。 F.6.2 功能 将讨论功能进行封装,负责与底层数据库交互,提供统一的添加,修改和删除接口。 F.6.3 性能 功能 模块组合 延时(ms) 发布讨论 数据库模块、讨论模块 网络:1000 数据库:100 获取讨论列表 数据库模块、讨论模块、评论模块、网络模块 网络:1000 数据库:100 F.6.4 输入项 操作 输入 输出 格式 发布讨论 uid discussionCode locationID code msg uid identity datatype data:[ discussionID presenttime locationID locationLatitude locationLongitude ] json/POST 获取讨论列表 locationID uid code msg dataType data:[ { discussionID discussionCode discussioncontent: uNickName uavaUrl imgUrls:[] presenttime locationID locationLatitude locationLongitude: comment:[ {commentID commentcontent uNickName uorNickName}]}] json/POST F.6.5 输出项 见F.6.4 输入项 F.6.6 算法 无 F.6.7 流程逻辑 (1)发布 (2)获取 F.6.8 接口 F.6.9 存储分配 软件 存储分配 备注 客户端 内存:500KB(<=2MB),本地存储:10MB 微信限制 数据库 内存:1GB; 硬盘:50GB 适当情况下可扩容 F.6.10 注释设计 1. 单行注释(single-line)://注释内容 一次只能注释一行,一般是简单注释,用来简短描述某个变量或属性,程序块。 2.块注释(block):/*注释内容*/ 为了进行多行简单注释,一般不使用。 3.文档注释:/**注释内容 */ /** * projectName: xxx * fileName: xxx * packageName: xxxx * date: 2019年6月18日下午12:28:39 * copyright(c) 2019-2020 xxx */ 4.类注释 类注释(Class)主要用来声明该类用来做什么,以及创建者、创建日期版本、包名等一些信息: /** * @version: V1.0 * @author: Lulusimili * @className: user * @packageName: user * @description: 这是用户类 * @data: 2019-06-28 12:20 **/ 5.方法注释 方法注释(Methods)主要用来声明该类的作用、入参、返回值、异常等信息: /** * @version: V1.0 * @author: Lulusimili * @methodsName: addUser * @description: 添加用户 * @param: xxxx * @return: String * @throws: IOException **/ F.6.11 限制条件 无 F.6.12 测试计划 结合评论模块、网络模块、数据库模块进行测试 F.6.13 尚未解决的问题 无 F.7 评论模块 F.7.1 程序描述 评论模块主要是对校园论坛讨论的评论模块,通过发布评论,用户可以在线参与标记点的讨论建设。评论模块,提供一个评论收集与显示的界面。 F.7.2 功能 用户在评论界面,根据界面信息的渲染,对某些标记点的相关讨论评论进行展示。其逻辑为用户对某特定标记点发出评论列表的请求,向讨论表获取对应的评论列表,然后得到对应信息更新到界面中去。 如果用户想要发布某些评论,发出发布评论请求,将评论更新到评论表中。 功能 输入 输出 格式/请求 评论他人 uid uidor discussionID commentCode locationID code msg datatype commentID json/POST F.7.3 性能 运行 精度 响应时间(ms) 评论某人 数据库的写入与查询,精度较高 200 F.7.4 输入项 输入输出等参考功能F.7.2; 安全保密:对请求数据进行签名,防止非法请求和重放攻击,同时,对用户敏感数据进行加密; F.7.5 输出项 输入输出等参考功能F.7.2; 安全保密:对请求数据进行签名,防止非法请求和重放攻击,同时,对用户敏感数据进行加密; F.7.6 算法 F.7.7 流程逻辑 F.7.8 接口 F.7.9 存储分配 软件 存储分配 备注 客户端 内存:500KB(<=2MB),本地存储:10MB 微信限制 数据库 内存:1GB; 硬盘:50GB 适当情况下可扩容 F.7.10 注释设计 1. 单行注释(single-line)://注释内容 一次只能注释一行,一般是简单注释,用来简短描述某个变量或属性,程序块。 2.块注释(block):/*注释内容*/ 为了进行多行简单注释,一般不使用。 3.文档注释:/**注释内容 */ /** * projectName: xxx * fileName: xxx * packageName: xxxx * date: 2019年6月18日下午12:28:39 * copyright(c) 2019-2020 xxx */ 4.类注释 类注释(Class)主要用来声明该类用来做什么,以及创建者、创建日期版本、包名等一些信息: /** * @version: V1.0 * @author: Lulusimili * @className: user * @packageName: user * @description: 这是用户类 * @data: 2019-06-28 12:20 **/ 5.方法注释 方法注释(Methods)主要用来声明该类的作用、入参、返回值、异常等信息: /** * @version: V1.0 * @author: Lulusimili * @methodsName: addUser * @description: 添加用户 * @param: xxxx * @return: String * @throws: IOException **/ F.7.11 限制条件 评论界面类似微信朋友圈的风格,但是只有评论内容的显示,对评论内容的文字长度也有部分限制。 F.7.12 测试计划 结合讨论模块,网络模块一起测试,这里不做解释。 F.7.13 尚未解决的问题 无 F.8 功能模块 F.8.1 程序描述 功能模块主要是对校园固定标记点进行功能信息的采集与标签化的模块,通过发布功能系统,采集用户对标记点的功能模块化介绍,以及标签的集成处理,得到对应的功能介绍。 F.8.2 功能 用户在功能界面,根据界面信息的渲染,对某些标记点的功能信息进行展示。其逻辑为用户对某特定标记点发出功能列表的请求,向功能表获取对应的功能列表,然后得到对应信息更新到标记点表中。 如果用户想要发布某些功能信息,发出发布功能请求,将功能描述更新到功能表中。 功能 输入 输出 格式/请求 获取功能列表 uid locationID dataType code msg data:[{ functionID: functionCode functioncontent functiondesription: locationID locationLatitud locationLongitude: }] json/POST 发布功能 uid functionCode locationID code msg uid identity datatype data:[ {functionID functioncontent functiondescription locationID locationdescription locationLatitude locationLongitude}] json/POST F.8.3 性能 运行 精度 响应时间(ms) 发布功能 根据对应的数据项多少,其性能可能略有些区别 200 得到功能列表 数据库的表项查询精度较高,查询速度响应较快 20 F.8.4 输入项 输入输出等参考功能F.8.2; 安全保密:对请求数据进行签名,防止非法请求和重放攻击,同时,对用户敏感数据进行加密; F.8.5 输出项 输入输出等参考功能F.8.2; 安全保密:对请求数据进行签名,防止非法请求和重放攻击,同时,对用户敏感数据进行加密; F.8.6 算法 F.8.7 流程逻辑 F.8.8 接口 F.8.9 存储分配 软件 存储分配 备注 客户端 内存:500KB(<=2MB),本地存储:10MB 微信限制 数据库 内存:1GB; 硬盘:50GB 适当情况下可扩容 F.8.10 注释设计 1. 单行注释(single-line)://注释内容 一次只能注释一行,一般是简单注释,用来简短描述某个变量或属性,程序块。 2.块注释(block):/*注释内容*/ 为了进行多行简单注释,一般不使用。 3.文档注释:/**注释内容 */ /** * projectName: xxx * fileName: xxx * packageName: xxxx * date: 2019年6月18日下午12:28:39 * copyright(c) 2019-2020 xxx */ 4.类注释 类注释(Class)主要用来声明该类用来做什么,以及创建者、创建日期版本、包名等一些信息: /** * @version: V1.0 * @author: Lulusimili * @className: user * @packageName: user * @description: 这是用户类 * @data: 2019-06-28 12:20 **/ 5.方法注释 方法注释(Methods)主要用来声明该类的作用、入参、返回值、异常等信息: /** * @version: V1.0 * @author: Lulusimili * @methodsName: addUser * @description: 添加用户 * @param: xxxx * @return: String * @throws: IOException **/ F.8.11 限制条件 无 F.8.12 测试计划 结合网络模块、数据库模块进行测试 F.8.13 尚未解决的问题 无 F.9 标记点模块 F.9.1 程序描述 标记点模块主要负责针对电子科技大学校园地图界面上出现的标记点进行管理。 F.9.2 功能 地图界面的展示的所有标记点就是标记点模块的功能,用户自动产生查询所有标记点的请求,标记点模块根据特定语句查询标记点表中的所有标记信息,并根据界面显示需要,渲染出对应的标记点状态信息。 功能 输入 输出 格式、请求 获取所有标记点 uid dataType: code msg locationID:[] json/POST F.9.3 性能 运行 精度 响应时间(ms) 标记点管理 数据库的表项查询精度较高,查询速度响应较快 20 F.9.4 输入项 输入输出等参考功能F.9.2; 安全保密:对请求数据进行签名,防止非法请求和重放攻击,同时,对用户敏感数据进行加密; F.9.5 输出项 输入输出等参考功能F.9.2; 安全保密:对请求数据进行签名,防止非法请求和重放攻击,同时,对用户敏感数据进行加密; F.9.6 算法 F.9.7 流程逻辑 F.9.8 接口 F.9.9 存储分配 软件 存储分配 备注 客户端 内存:500KB(<=2MB),本地存储:10MB 微信限制 数据库 内存:1GB; 硬盘:50GB 适当情况下可扩容 F.9.10 注释设计 1. 单行注释(single-line)://注释内容 一次只能注释一行,一般是简单注释,用来简短描述某个变量或属性,程序块。 2.块注释(block):/*注释内容*/ 为了进行多行简单注释,一般不使用。 3.文档注释:/**注释内容 */ /** * projectName: xxx * fileName: xxx * packageName: xxxx * date: 2019年6月18日下午12:28:39 * copyright(c) 2019-2020 xxx */ 4.类注释 类注释(Class)主要用来声明该类用来做什么,以及创建者、创建日期版本、包名等一些信息: /** * @version: V1.0 * @author: Lulusimili * @className: user * @packageName: user * @description: 这是用户类 * @data: 2019-06-28 12:20 **/ 5.方法注释 方法注释(Methods)主要用来声明该类的作用、入参、返回值、异常等信息: /** * @version: V1.0 * @author: Lulusimili * @methodsName: addUser * @description: 添加用户 * @param: xxxx * @return: String * @throws: IOException **/ F.9.11 限制条件 对于合理的标记点,后台管理系统必须要有初步审查的过程,管理员手动编辑标记点的合法性,普通用户无法主动更新及添加合法标记点。 F.9.12 测试计划 测试名称 值说明 输入方式 写入数据库 1.每个数据表的测试数据应包括:输入完整,不完整,字段非法等情况 2.多表插入,单表插入 自动输入 查询数据库的所有标记点 多表查询 自动输入 从数据库删除非法标记点 无 自动输入 F.9.13 尚未解决的问题 用户无法根据实际需要添加更多标记点,后台管理员系统需要手动编辑合法标记点,提供用户固定的标记点信息推送。 F.10 微信授权模块 F.10.1 程序描述 微信授权模块主要是请求微信用户的授权,以及得到用户微信基本信息。基于微信平台,对用户进行授权请求,根据登录凭证校验请求对用户进行校验。根据用户校验的自定义登录态,写入用户信息表中。 F.10.2 功能 用户在微信授权界面,根据微信系统的载入提示,根据启用协议的凭证验证请求结果对该小程序的启用结果进行永久存储,对得到授权的用户信息写入用户信息表。 功能 输入 输出 格式/请求 微信登录 code encryptedData iv code、msg、uid uNickName、uavaUrl: json/POST F.10.3 性能 运行 精度 响应时间(ms) 微信授权 基于微信平台的认证,对用户的凭证请求做出正确的响应 500 F.10.4 输入项 输入输出等参考功能F.10.2; 安全保密:对请求数据进行签名,防止非法请求和重放攻击,同时,对用户敏感数据进行加密; F.10.5 输出项 输入输出等参考功能F.10.2; 安全保密:对请求数据进行签名,防止非法请求和重放攻击,同时,对用户敏感数据进行加密; F.10.6 算法 数据签名校验方法 为了确保开放接口返回用户数据的安全性,微信会对明文数据进行签名。开发者可以根据业务需要对数据包进行签名校验,确保数据的完整性。 通过调用接口(如 wx.getUserInfo)获取数据时,接口会同时返回 rawData、signature,其中 signature = sha1( rawData + session_key ) 开发者将 signature、rawData 发送到开发者服务器进行校验。服务器利用用户对应的 session_key 使用相同的算法计算出签名 signature2 ,比对 signature 与 signature2 即可校验数据的完整性。 如 wx.getUserInfo的数据校验: 接口返回的rawData: { "nickName": "Band", "gender": 1, "language": "zh_CN", "city": "Guangzhou", "province": "Guangdong", "country": "CN", "avatarUrl":"http://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0" } 用户的 session-key: HyVFkGl5F5OQWJZZaNzBBg== 用于签名的字符串为: {"nickName":"Band","gender":1,"language":"zh_CN","city":"Guangzhou","province":"Guangdong","country":"CN","avatarUrl":"http://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0"}HyVFkGl5F5OQWJZZaNzBBg== 使用sha1得到的结果为 75e81ceda165f4ffa64f4068af58c64b8f54b88c 加密数据解密算法: 接口如果涉及敏感数据(如wx.getUserInfo当中的 openId 和 unionId),接口的明文内容将不包含这些敏感数据。如需要获取敏感数据,需要对接口返回的加密数据(encryptedData) 进行对称解密。 解密算法如下: (1)对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。 (2)对称解密的目标密文为 Base64_Decode(encryptedData)。 (3)对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是 16字节。 (4)对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返 回。 F.10.7 流程逻辑 F.10.8 接口 F.10.9 存储分配 软件 存储分配 备注 客户端 内存:500KB(<=2MB),本地存储:10MB 微信限制 数据库 内存:1GB; 硬盘:50GB 适当情况下可扩容 F.10.10 注释设计 1.单行注释(single-line)://注释内容 一次只能注释一行,一般是简单注释,用来简短描述某个变量或属性,程序块。 2.块注释(block):/*注释内容*/ 为了进行多行简单注释,一般不使用。 3.文档注释:/**注释内容 */ /** * projectName: xxx * fileName: xxx * packageName: xxxx * date: 2019年6月18日下午12:28:39 * copyright(c) 2019-2020 xxx */ 4.类注释 类注释(Class)主要用来声明该类用来做什么,以及创建者、创建日期版本、包名等一些信息: /** * @version: V1.0 * @author: Lulusimili * @className: user * @packageName: user * @description: 这是用户类 * @data: 2019-06-28 12:20 **/ 5.方法注释 方法注释(Methods)主要用来声明该类的作用、入参、返回值、异常等信息: /** * @version: V1.0 * @author: Lulusimili * @methodsName: addUser * @description: 添加用户 * @param: xxxx * @return: String * @throws: IOException **/ F.10.11 限制条件 如需获取用户头像、昵称等信息,会弹出登录弹窗引导用户授权,开发者在交互设计上兼容弹窗,避免出现多个弹窗叠加、重复提示等不好的体验。 F.10.12 测试计划 测试名称 值说明 输入方式 请求微信服务器(服务器网络模块) 客户端从微信获取的code 和加密数据 自动输入 F.10.13 尚未解决的问题 无 F.11 校园身份认证模块 F.11.1 程序描述 校园身份认证模块主要是对校园用户的身份进行认证,基于电子科技大学信息门户平台,对学生以及教职工进行认证,根据认证结果对用户提供对应服务。根据实际用户身份的认证状态,写入用户信息表中。 F.11.2 功能 用户在校园身份认证界面,提供对应正确的学号以及密码,小程序的认证模块基于电子科大的信息门户系统,对其输入身份信息进行验证,根据认证结果对用户提供对应的服务,并将其认证结果写进用户信息表。 功能 输入 输出 格式/请求 校园身份认证 openid、学号、密码 code、msg identity json/POST F.11.3 性能 运行 精度 响应时间(ms) 校园身份认证 基于电子科大信息门户的认证精度,对正确的学号及密码能够正确认证 1000 F.11.4 输入项 输入输出等参考功能F.11.2; 安全保密:对请求数据进行签名,防止非法请求和重放攻击,同时,对用户敏感数据进行加密; F.11.5 输出项 输入输出等参考功能F.11.2; 安全保密:对请求数据进行签名,防止非法请求和重放攻击,同时,对用户敏感数据进行加密; F.11.6 算法 用户密码加密算法采用AES对称加密,加密流程如下: 解密流程(encryptedData 为加密数据): (1)对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。 (2)对称解密的目标密文为 Base64_Decode(encryptedData)。 (3)对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是 16字节。 (4)对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返 回。 F.11.7 流程逻辑 F.11.8 接口 F.11.9 存储分配 软件 存储分配 备注 客户端 内存:500KB(<=2MB),本地存储:10MB 微信限制 数据库 内存:1GB; 硬盘:50GB 适当情况下可扩容 F.11.10 注释设计 1.单行注释(single-line)://注释内容 一次只能注释一行,一般是简单注释,用来简短描述某个变量或属性,程序块。 2.块注释(block):/*注释内容*/ 为了进行多行简单注释,一般不使用。 3.文档注释:/**注释内容 */ /** * projectName: xxx * fileName: xxx * packageName: xxxx * date: 2019年6月18日下午12:28:39 * copyright(c) 2019-2020 xxx */ 4.类注释 类注释(Class)主要用来声明该类用来做什么,以及创建者、创建日期版本、包名等一些信息: /** * @version: V1.0 * @author: Lulusimili * @className: user * @packageName: user * @description: 这是用户类 * @data: 2019-06-28 12:20 **/ 5.方法注释 方法注释(Methods)主要用来声明该类的作用、入参、返回值、异常等信息: /** * @version: V1.0 * @author: Lulusimili * @methodsName: addUser * @description: 添加用户 * @param: xxxx * @return: String * @throws: IOException **/ F.11.11 限制条件 需要根据电子科技大学信息门户验证系统保持一致,如果电子科技大学信息门户验证界面有部分更新(如多次输入后,可能需要用户输入图片验证码),小程序的校园身份认证模块也要及时更新。 F.11.12 测试计划 测试名称 输入项 输入方式 结果 说明 请求电子科技大学信息门户验证平台 学号或工号,密码 手动输入 验证成功 无 多次请求电子科技大学信息门户验证平台 学号或工号,密码,验证码 手动输入 验证成功 多次输入错误,强制输入图片验证码 F.11.13 尚未解决的问题 无