#service_wudaokou
模块功能划分
- 配置文件管理
- 跑目录
- 上传书
- 打标签
- 标签展示
- 封面优化
- 开放书
- 内容标注
简单介绍
- 配置文件管理、跑目录、上传书对应的包为cn.boxfishedu.local,对应的数据源为本地100数据源;
- 打标签、标签展示、开放书、内容标注对应的包为cn.boxfishedu.cloud.*,对应的数据源为cloud数据源;
- 数据源的配置在包cn.boxfishedu.datasource.*下;
- 封面优化为一个简单的springMVC,不牵扯数据库。
详细说明
配置文件管理
包cn.boxfishedu.local.tagmodel
>流程介绍
界面第一次加载较慢,是因为会去加载左边罗列的属性标签信息,初次是会去github里download并缓存起来,与属性加载相关的类有cn.boxfishedu.config.JsonAddress和cn.boxfishedu.config.JsonController
a. 新增配置文件
a1.程序首先去扫描100服务器上的/share/svn路径下的所有书,然后展示在前端的弹出层里供用户选择
a2.选择要为哪个书创建配置文件并确认后,程序会去100服务器上的/share/tagWuDaoKou看有没有以书名为配置文件名的文件,有则删除,然后重建.
a3. 然后扫描对应书下的所有课,并将其部分信息写入到ini文件里,文件创建完成
b. 查看配置文件
b1. 程序首先去查询100数据库上的book_has_config_wudaokou表,并将其信息展示在前端的弹出层
b2. 用户选择要看的配置文件传给后台,后台会去指定路径下找到文件并解析返回给前端展示
c. 保存
c1.用户添加到界面的属性通过保存会写入到ini文件里
d. 更新配置文件
d1. 首先需要通过查看配置文件找到对应的文件并展示在界面上
d2. 然后传入当前的ini文件路径到服务器,服务器会去解析当前的ini文件并将属性保存在内存里,然后将文件清空,接着扫描改配置文件对应的书下的所有课并将其写入到对应的ini文件,继而将前面内存保存的属性填充到文件对应的课下面,这样便完成了配置文件的更新
类cn.boxfishedu.local.tagmodel.FileController
接口:新增配置文件接口 . url:/file/creation post请求. 参数: fileName 要创建的ini文件名,一般为书名. 返回值:状态码 200,ini文件的路径
接口:获取100服务器上指定路径下所有的文件夹列表. url:/file/config/list get请求. 参数: root_path 默认为/share/svn. 返回值:{"folder":["/share/svn/人教2012版七下","人教2012版七下"]}
接口:查看配置文件. url:/file/config/analyse get请求. 参数: config_path 100服务器上ini文件路径. 返回值:bookName:人教PEP三上 U1|cover:cover/人教PEP三上 U1.jpg|catalogName:TEXTBOOK|difficulty:1|src:/share/svn/人教PEP三上 U1|relationMaterial:PEP版-三上-U1|fitAge:成人|catalogs:!小学英语|bundleName:PEP版|bundleOrder:1|^^courseName:Function_如何询问名字?|cover:cover/304.Function_如何询问名字?.jpg|courseType:Function|src:/share/svn/人教PEP三上 U1/304.Function_如何询问名字?.xlsx|
接口:保存ini文件属性. url:/file/write post请求. 参数: properties 属性字符串, filename ini文件名, old_book_name 旧ini文件(非必须). 返回值:success 成功 failed 失败
-
接口:更新配置文件 . url:/file/update post请求. 参数: path ini文件路径. 返回值:状态码200
类cn.boxfishedu.local.tagmodel.BookHasConfigController
-
接口:获取ini配置文件列表. url:/bookHasConfig get请求. 参数:无. 返回值:[ ["/share/newTag/人教PEP三上 U1.ini","人教PEP三上 U1"],["/share/newTag/人教PEP三上 U2.ini","人教PEP三上 U2"] ]
- 接口:获取所有bundleName. url:/bookHasConfig/bundleName get请求. 参数:无. 返回值:[ [298,"牛津上海版"], [98,"牛津粤教版"] ]
-
接口:根据bundleName获取列表. url:/bookHasConfig/bundle/list get请求. 参数: bundleName 强序名称 返回值:[{ "id":615, "name":"Level 4_Examination1", "config":"/share/tagWuDaoKou/Level 4_Examination1.ini", "bundleName":"examination", "bundleOrder":1, "courseSum":3, "maxBundleOrder":0, "createTime":1476438562000, "updateTime":1476439503000 }]
类cn.boxfishedu.local.tagmodel.BookHasConfigController
接口:获取带叹号的分类列表. url:/bookhascatalogs. 参数:无. 返回值:{ "one": ["!初中英语","!小学英语","!成人英语"], "two": ["!!PEP版","!!TOEFL","!!一句话英语新闻","!!人教版","!!人教版定制","!!仁爱版","!!八年级下","!!北京版","!!北京版一起","!!北师版"], "three": ["!!!长难句突破","!!!阅读","!!!高一上","!!!高三上","!!!高中","!!!高二上","!!!高级听读","!!!高考词汇","!!!高考阅读"]}
跑目录
包cn.boxfishedu.local.rundirectory
流程介绍
a. 跑目录模块,服务调用采用的websocket连接方式,websocket配置在cn.boxfishedu.local.
pub.config里.
b. 跑目录以书为单位,用户可选择跑一本书也可选择批量跑
c. 输入相关书名,程序会去book_has_config_wudaokou表搜索到书对应的INI文件的路径并展示的前端界面.
d. 用户勾选要跑的书,确定后会将对应的INI文件路径传到服务端,后台会根据这些路径找到对应的INI文件并解析为指定的Map结构
e. 进一步,程序会将Map结构按照相应的逻辑写入book表、book_section表、namespace_has_book表、book_has_course_catalog表和book_has_catalogs表,同时会将课程对应的封面重命名该封面的MD5值的名字并写入100服务器的/share/data/picture文件下的对应路径中,课程封面的原始位置在对应的INI文件里有写。这一步的操作在cn.boxfishedu.local.rundirectory.service.SourceManager类里执行
f. 每跑一次目录,书不会被删除,但是书下面的课程对应的数据库记录,也就是book_section中的记录会被全部删掉,重新写入
d. 单课封面的大小不能超过1M
核心类详情 cn.boxfishedu.local.pub.utils.AnalyseIniFileUtil 功能:解析INI文件为map结构 cn.boxfishedu.local.rundirectory.service.SourceManager 方法: addBook() persist书到本地数据库 addNamespaceHasBook()将书加入到本地数据库渠道 1 中 addBookHasCourseCatalog() 保存书和目录关系 addBookSection() persist课到本地数据库 checkSum()获取课程封面的md5值 storeCover() 保存课程封面到/share/data/picture路径下并修改名为md5的封面
上传书 包cn.boxfishedu.local.upload > 流程介绍 a. 上传书包括上传书下面的课程对应的json文件到多台服务器、课程所需的音频、视频、图片到OSS以及同步课程对应的本地数据库记录到正式数据库和测试数据库,相关表记录包括book、book_section、book_has_catalogs、namespace_has_book. b. 用户选择上传的种类:书或者单课,上传版:学生版或者老师版 c. 如果选择学生版,则程序只会去100服务器上的/share/json/student下找课程对应的json文件,并找出json文件里的视频音频图片并上传到OSS,然后同步该课程对应的本地数据库记录到正式数据库和测试数据库 d. 如果选择教师版,程序只会去100服务器上的/share/json/teacher下找json文件,后续操作相同. e. 两者都选则都上传. f. 上传完后,做了一次资源完整性检查,检查的方式是根据课程json里的MD5列表去批量执行下载看是否md5都能下载成功,检查只会检查中国节点
类cn.boxfishedu.local.upload.web.UploadBookController
* _接口_:查询要上传的书或课.
_url_:/upload/resource get请求.
_参数_: **type** 上传类型 **key** 查询关键字.
_返回值_:[
{
"id": 6581,
"projectName": "广州口语考试1",
"name": "广州口语考试1",
"coverV2": "cover/广州口语考试1.jpg",
"lastModified": 1482129270261,
"type": "SYSTEM"
}]
* _接口_: 上传书或课到正式
_url_: /upload/resource post请求.
_参数_: **id** 课程ID或书id, **version** 学生版或教师版.
_返回值_:状态码200或400
* __打标签__
包cn.boxfishedu.cloud.tagservice
> 流程介绍
打标签模块,采用的websocket连接方式,websocket配置在cn.boxfishedu.cloud.pub.
config里
a. 用户输入搜搜索关键字,服务器端会根据关键字到本地100数据库的book_has_config_wudaokou表里找匹配的记录并返回给前端
b. 勾选要打标签的书、要打到mongo的哪个collection里,确认后,服务端会去100机器上的路径/share/tagWuDaoKou下去找INI文件并解析为Map结构
c. 接着,服务器会将Map结构中的书、课与目录的关系写入到云端mysql数据库的course_catalog表、book_has_course_catalog表、course_relation_catalog表。写之前程序会先将书对应的目录记录从book_has_course_catalog表中删除,然后写入;会将课对应的目录记录从course_relation_catalog表中删除,然后写入
d. 继而,程序会将课程所拥有的属性关系(包括课程类型、难度等)写入到云端mongo数据库的相应collection内:如果用户选择智能推荐,则写入到new_version_tag_v2;如果用户选择智能作业,则写入到course_tag_homework_wudaokou。但是不论选择哪一个,都会将记录往course_new里面写一份
e. 录入mongo的操作不会删除记录,只会覆盖或新增属性
__核心类详情__
1. 类cn.boxfishedu.cloud.tagservice.service.AnalyseIniServce
功能:解析INI文件为Map结构,并将INI文件模块里的book模块的公共属性写到每一个课程模块的属性里。
2. 类cn.boxfishedu.cloud.tagservice.service.TagService
_成员变量_:
* courseTypeListForBundle:代表此类型的课程必须有bundle
* courseTypeListForUltimate:代表此类型的课程必须有英文名称
_方法_:
* saveHomeworkTag()保存智能作业标签到mongo数据库course_tag_homework_wudaokou
* saveRecommendTag()保存智能推荐和在线授课标签到mongo数据库new_version_tag_v2
* saveCourseNew()保存智能作业、智能推荐、在线授课标签到mongo数据库course_new
3. 类cn.boxfishedu.cloud.tagservice.service.BookHasCourseCatalogService
* saveBookHasCourseCatalog()保存书和目录的关系
4. 类cn.boxfishedu.cloud.tagservice.service.CourseCatalogService
* saveCourseCatalog() 生成CourseCatalog
5. 类cn.boxfishedu.cloud.catalog.CatalogService
* save()保存书和目录的关系以及课程和目录的关系
-
标签展示
包cn.boxfishedu.cloud.tagshow
流程介绍 a. 用户输入书名执行模糊查询,服务端依据书名去云端的mysql数据库的book表查询 b. 选择需要看哪里的标签,是智能作业还是智能推荐,点击相应的书,服务端会去mysql的book_has_course_catalog、course_catalog表找到书和目录的关系,到course_relation_catalog表找到课和目录的关系。 c. 同时程序也会去mongo里通过课程ID,到相应的collection里找到对应的标签 d. 程序会将目录、标签相关信息整合在一起返回给前端展示 e. 同时,用户也可以在查看的过程中修改相应的标签属性 类cn.boxfishedu.cloud.tagshow.web.TagShowController
- 接口:根据关键字查询书 url:/tag-show/book get请求 参数: key 查询关键字 type 忽略此参数 返回值:[ { "id": 2805, "projectName": "人教七下 综合", "name": "人教七下 综合", "lastModified": 1445595498439 } ]
- 接口:查看课程标签详情 url:/tag-show/tag/detail get请求 参数: bookId 书ID type homework、recommend或spoken 返回值:略
- 接口:修改课程的标签信息 url:/tag-show/tag post请求 参数: courseId 课程ID key 标签key value 标签值 tagType 操作哪个mongoDB,枚举值 返回值:成功状态码 200
-
开放书 包cn.boxfishedu.cloud.namespace
流程介绍 主要修改远端数据库的namespace、namespace_has_book两个表。将书和渠道1、13273两个关联,其中1是对外开放渠道,所有人多能看到;13273渠道为vip渠道,申请了vip认识的老师才能看到。 另外namespace_has_book表中有两个字段student、teacher,代表是否学生或教师能看到这本书
类cn.boxfishedu.cloud.namespace.web.NamespaceController
- 接口:根据关键字查询书 url:/namespace/book get请求 参数: key 关键字 返回值:[ { "id": 2805, "projectName": "人教七下 综合", "name": "人教七下 综合", "lastModified": 1445595498439 } ]
- 接口:开放书,开放渠道为1和13273 url:/namespace/all/open put请求 参数: bookIds 书ID数组 返回值:成功 状态码200
-
修改目录 包cn.boxfishedu.cloud.catalog
流程介绍 修改目录主要修改表book_has_course_catalog和course_relation_catalog 类cn.boxfishedu.cloud.catalog.CatalogModifyController
- 接口:根据书名查询与该书相关联的目录分类 url:/catalog/detail 参数: book_name 书名 返回值:[ { "book": { "id": 5592, "projectName": "Function 关切", "name": "Function 关切", "lastModified": 1476000233025 }, "courseCatalog": { "wholeName": "FUNCTION" } } ]
- 接口:根据书ID修改书的目录分类 url:/catalog/modify post请求 参数: book_id 书ID catalog 目录(可能为多个,中间用,隔开) 返回值:成功 状态码200 其他 状态码 400
-
优化封面 类cn.boxfishedu.local.localcatalog.web.ImproveImageController
- 接口:优化封面 url:/improve/image get请求 参数: fileselect[] 待优化文件数组 返回值:浏览器会自动打包下载优化后的文件
###以上为tag项目的接口详细介绍,下面介绍其他的包下的类的作用
###包cn.boxfishedu.local.security
- 主要是做用户登录验证相关
- 用户的用户名和密码保存在本地100数据库bebase的user_info_authentication表下
###包cn.boxfishedu.local.pub
- 此包下的类只针对本地数据库做相应操作
- 类cn.boxfishedu.local.pub.utils.AnalyseIniFileUtil 作用是解析INI文件为Map结构以用来跑目录使用
- 类cn.boxfishedu.local.pub.wen.BookNameController 中的接口是根据书名查询书对应的INI配置文件,用于跑目录时输入关键字查询INI文件使用
###包cn.boxfishedu.datasource
- 主要是双数据源的配置
- CloudPoolProperties是正式数据库属性,LocalPoolProperties是本地数据库属性
- GlobalDatasourceConfiguration 为初始化本地和正式数据源
- RepositoryCloudConfig为正式JPA数据仓库配置,RepositoryLocalConfig为本地JPA数据仓库配置
###包cn.boxfishedu.config
- http包为http请求工具
- 类cn.boxfishedu.config.HomeController为页面切换以及登录接口相关
- 类cn.boxfishedu.config.JsonAddress 作用缓存新版配置文件页面左边展示的所有待选属性
- 类cn.boxfishedu.config.JsonController中的接口作用是根据关键字从JsonAddress中获取对应的属性集合
- 类cn.boxfishedu.config.SvnUpdate 作用的更新远端svn服务器的/share/svn下的文件到100机器的/share/svn下
- 类cn.boxfishedu.config.UserInfoFilter 作用记录每个用户请求行为
#service_delete_book
功能介绍
- 主要是删除云端mysql数据库的书、课以及云端mongo数据库的相关记录
- 涉及的mysql表为book、book_section、namespace_has_book、book_has_catalogs、book_has_course_catalog、course_relation_catalog、user_has_book_node。
- 涉及的mongo表为course_new、new_version_tag、new_version_tag_v2、course_tag_homework_wudaokou、spoken_quiz_attribute
- 删除界面有个用户名和密码,临时写死在js里了
注意事项
- 删除前首先和内容研发人员确认该书是否已经对外开放了,最好自己确认下!!确认的方式是通过书名去云端的mysql的book表找到书ID,然后去namespace_has_book表找对应的书ID是否存在namespace_id为1或者是13273的记录,1为对外开放,13273为vip渠道,如果没有,说明没有对外开放,可以删除。
- 删除书或课的操作为直接操作云端,首先需要和内容研发确认好是否必须删除,同时删除的操作需要让 邓倩或者切尔西 知道这件事,不要删错。删完后务必自己通过mysql客户端查询一遍是否删除掉,是否删多了,同时通过mongo客户端查询对应的课程标签记录是否在mongo里已经删除。查询的方式是通过idea控制台有课程ID输出,通过ID来查询。确认好后告知内容研发。
- 可能有些书我们不会对外开放,而是只是通过智能推荐或者在线授课或者智能作业的方式面向用户。这种情况下一般会看是否必须删除。如果必须删除,那么需要查询这些课有多少人学,查询的方式通过逯老师那边查询(回头你再问),之后再和逯老师商量是否要删除。
- 如果一些课开放给了 智能作业,并且已经安排给了学生(是否已经安排通过逯老师那边能查到),那么在删除相关课的同时还需要通知逯老师你删除了哪些课, 务必记住你删除的这些课程ID
#service_classify_course
功能介绍
- 模块为新旧课程对照
- 由于我们的课程每年会做一次更新,用户可能在上一年学过一次,为避免用户今年学到去年的翻新课程,增加了对照功能。
- 涉及的表为云端数据库的course_mapping_v2
#service_schedule_task
功能介绍
- 模块为定时任务
- 定时备份今天100机器上的/share/backup/data下的文件到阿里云oss上,oss上的文件有效期为3天
- 定时检查云端mongo数据库的course_new、new_version_tag、new_version_tag_v2的标签完整性,如果不完整会发送邮件给切尔西和邓倩他们,邮件的配置在application.yml里
- 改进:new_version_tag 已经不再使用,你可以将它改为course_tag_homework_wudaokou库并定时检查
#service_utils
功能介绍
- 模块为自己随手写的一些小功能,可能有些还可以用,下面是整理的一些还在使用的类并简单的说明了下。使用前建议先过一遍代码
- 类com.boxfishedu.myUtils.AddTagProperty;
这个类中的方法checkB()是检查云端mongo里存在记录,但是该记录的课程ID在云端mysql数据库已经不存在的所有课程。出现这个原因一般是由于删除课程的时候只删除了mysql没有删除mongo里的记录。此方法可以用来检查mongo和mysql的数据一致性, 此方法会将mongo里冗余的记录删除,可以考虑先打印,确认后再删除
3.类com.boxfishedu.myUtils.CourseSizeTool
这个类的作用是计算云端在线授课的课程大小并导出到文件中
4.类com.boxfishedu.myUtils.CourseStatistics
这个类的作用是统计云端mongo里在线授课或智能推荐的课程数量,可以统计不同collection、不同课程类型、不同难度、不同渠道,需要修改参数
5.类com.boxfishedu.myUtils.CreateHomeWorkCollection
这个类的作用是将云端mongo的course_tag_homework_wudaokou里的强序bundle全部按照本地mysql数据库的book_has_config_wudaokou表里的书顺序全部更新一遍。这个类可以指定只更新某一个bundleName下的所有课。一般用于内容研发说某个bundleName下的课程顺序不对,然后重新打标签了也还是不对的情况。
6.类com.boxfishedu.myUtils.NamespaceHasBook
作用是将某本书指定开放给某些人,一般内容研发有这个需求
7.类com.boxfishedu.myUtils.NamespaceHasUser
方法openInner是给指定用户开放内部权限; 方法openVip是给指定用户开放vip权限; 开放前只需要将用户名粘贴到“开通权限.txt”文本下,每行一条记录执行就可以了