syj

课程内容平台项目介绍

  1 +#service_wudaokou
  2 +
  3 +**模块功能划分**
  4 +
  5 +* 配置文件管理
  6 +* 跑目录
  7 +* 上传书
  8 +* 打标签
  9 +* 标签展示
  10 +* 封面优化
  11 +* 开放书
  12 +* 内容标注
  13 +
  14 +**简单介绍**
  15 +
  16 +1. 配置文件管理、跑目录、上传书对应的包为cn.boxfishedu.local,对应的数据源为本地100数据源;
  17 +2. 打标签、标签展示、开放书、内容标注对应的包为cn.boxfishedu.cloud.*,对应的数据源为cloud数据源;
  18 +3. 数据源的配置在包cn.boxfishedu.datasource.*下;
  19 +4. 封面优化为一个简单的springMVC,不牵扯数据库。
  20 +
  21 +**详细说明**
  22 +
  23 +__配置文件管理__
  24 +
  25 + 包cn.boxfishedu.local.tagmodel
  26 + >流程介绍
  27 + 界面第一次加载较慢,是因为会去加载左边罗列的属性标签信息,初次是会去github里download并缓存起来,与属性加载相关的类有cn.boxfishedu.config.JsonAddress和cn.boxfishedu.config.JsonController
  28 + a. 新增配置文件
  29 + a1.程序首先去扫描100服务器上的/share/svn路径下的所有书,然后展示在前端的弹出层里供用户选择
  30 + a2.选择要为哪个书创建配置文件并确认后,程序会去100服务器上的/share/tagWuDaoKou看有没有以书名为配置文件名的文件,有则删除,然后重建.
  31 + a3. 然后扫描对应书下的所有课,并将其部分信息写入到ini文件里,文件创建完成
  32 + b. 查看配置文件
  33 + b1. 程序首先去查询100数据库上的book_has_config_wudaokou表,并将其信息展示在前端的弹出层
  34 + b2. 用户选择要看的配置文件传给后台,后台会去指定路径下找到文件并解析返回给前端展示
  35 + c. 保存
  36 + c1.用户添加到界面的属性通过保存会写入到ini文件里
  37 + d. 更新配置文件
  38 + d1. 首先需要通过查看配置文件找到对应的文件并展示在界面上
  39 + d2. 然后传入当前的ini文件路径到服务器,服务器会去解析当前的ini文件并将属性保存在内存里,然后将文件清空,接着扫描改配置文件对应的书下的所有课并将其写入到对应的ini文件,继而将前面内存保存的属性填充到文件对应的课下面,这样便完成了配置文件的更新
  40 +
  41 + 类cn.boxfishedu.local.tagmodel.FileController
  42 +
  43 + * _接口_:新增配置文件_接口_ .
  44 + _url_:/file/creation post请求.
  45 + _参数_: **fileName** 要创建的ini文件名,一般为书名.
  46 + _返回值_:状态码 200,ini文件的路径
  47 +
  48 + * _接口_:获取100服务器上指定路径下所有的文件夹列表.
  49 + _url_:/file/config/list get请求.
  50 + _参数_: **root_path** 默认为/share/svn.
  51 + _返回值_:{"folder":["/share/svn/人教2012版七下","人教2012版七下"]}
  52 +
  53 + * _接口_:查看配置文件.
  54 + _url_:/file/config/analyse get请求.
  55 + _参数_: **config_path** 100服务器上ini文件路径.
  56 + _返回值_: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|
  57 +
  58 + * _接口_:保存ini文件属性.
  59 + _url_:/file/write post请求.
  60 + _参数_: **properties** 属性字符串, **filename** ini文件名, **old_book_name** 旧ini文件(非必须).
  61 + _返回值_:success 成功 failed 失败
  62 +
  63 + * _接口_:更新配置文件 .
  64 + _url_:/file/update post请求.
  65 + _参数_: **path** ini文件路径.
  66 + _返回值_:状态码200
  67 +
  68 + 类cn.boxfishedu.local.tagmodel.BookHasConfigController
  69 +
  70 + * _接口_:获取ini配置文件列表.
  71 + _url_:/bookHasConfig get请求.
  72 + _参数_:无.
  73 + _返回值_:[
  74 + ["/share/newTag/人教PEP三上 U1.ini","人教PEP三上 U1"],["/share/newTag/人教PEP三上 U2.ini","人教PEP三上 U2"]
  75 + ]
  76 + * _接口_:获取所有bundleName.
  77 + _url_:/bookHasConfig/bundleName get请求.
  78 + _参数_:无.
  79 + _返回值_:[
  80 + [298,"牛津上海版"],
  81 + [98,"牛津粤教版"]
  82 + ]
  83 +
  84 + * _接口_:根据bundleName获取列表.
  85 + _url_:/bookHasConfig/bundle/list get请求.
  86 + _参数_: **bundleName** 强序名称
  87 + _返回值_:[{
  88 +"id":615,
  89 +"name":"Level 4_Examination1",
  90 +"config":"/share/tagWuDaoKou/Level 4_Examination1.ini",
  91 +"bundleName":"examination",
  92 +"bundleOrder":1,
  93 +"courseSum":3,
  94 +"maxBundleOrder":0,
  95 +"createTime":1476438562000,
  96 +"updateTime":1476439503000
  97 +}]
  98 +
  99 + 类cn.boxfishedu.local.tagmodel.BookHasConfigController
  100 + * _接口_:获取带叹号的分类列表.
  101 + _url_:/bookhascatalogs.
  102 + _参数_:无.
  103 + _返回值_:{
  104 + "one":
  105 + ["!初中英语","!小学英语","!成人英语"],
  106 + "two":
  107 + ["!!PEP版","!!TOEFL","!!一句话英语新闻","!!人教版","!!人教版定制","!!仁爱版","!!八年级下","!!北京版","!!北京版一起","!!北师版"],
  108 + "three":
  109 + ["!!!长难句突破","!!!阅读","!!!高一上","!!!高三上","!!!高中","!!!高二上","!!!高级听读","!!!高考词汇","!!!高考阅读"]}
  110 +
  111 +__跑目录__
  112 +
  113 + 包cn.boxfishedu.local.rundirectory
  114 + 流程介绍
  115 + a. 跑目录模块,服务调用采用的websocket连接方式,websocket配置在cn.boxfishedu.local.
  116 + pub.config里.
  117 + b. 跑目录以书为单位,用户可选择跑一本书也可选择批量跑
  118 + c. 输入相关书名,程序会去book_has_config_wudaokou表搜索到书对应的INI文件的路径并展示的前端界面.
  119 + d. 用户勾选要跑的书,确定后会将对应的INI文件路径传到服务端,后台会根据这些路径找到对应的INI文件并解析为指定的Map结构
  120 + 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类里执行
  121 + f. 每跑一次目录,书不会被删除,但是书下面的课程对应的数据库记录,也就是book_section中的记录会被全部删掉,重新写入
  122 + d. 单课封面的大小不能超过1M
  123 +
  124 +__核心类详情__
  125 + cn.boxfishedu.local.pub.utils.AnalyseIniFileUtil
  126 + 功能:解析INI文件为map结构
  127 + cn.boxfishedu.local.rundirectory.service.SourceManager
  128 + 方法:
  129 + addBook() persist书到本地数据库
  130 + addNamespaceHasBook()将书加入到本地数据库渠道 1 中
  131 + addBookHasCourseCatalog() 保存书和目录关系
  132 + addBookSection() persist课到本地数据库
  133 + checkSum()获取课程封面的md5值
  134 + storeCover() 保存课程封面到/share/data/picture路径下并修改名为md5的封面
  135 +
  136 + __上传书__
  137 + 包cn.boxfishedu.local.upload
  138 + > 流程介绍
  139 + a. 上传书包括上传书下面的课程对应的json文件到多台服务器、课程所需的音频、视频、图片到OSS以及同步课程对应的本地数据库记录到正式数据库和测试数据库,相关表记录包括book、book_section、book_has_catalogs、namespace_has_book.
  140 + b. 用户选择上传的种类:书或者单课,上传版:学生版或者老师版
  141 + c. 如果选择学生版,则程序只会去100服务器上的/share/json/student下找课程对应的json文件,并找出json文件里的视频音频图片并上传到OSS,然后同步该课程对应的本地数据库记录到正式数据库和测试数据库
  142 + d. 如果选择教师版,程序只会去100服务器上的/share/json/teacher下找json文件,后续操作相同.
  143 + e. 两者都选则都上传.
  144 + f. 上传完后,做了一次资源完整性检查,检查的方式是根据课程json里的MD5列表去批量执行下载看是否md5都能下载成功,检查只会检查中国节点
  145 +
  146 + 类cn.boxfishedu.local.upload.web.UploadBookController
  147 + * _接口_:查询要上传的书或课.
  148 + _url_:/upload/resource get请求.
  149 + _参数_: **type** 上传类型 **key** 查询关键字.
  150 + _返回值_:[
  151 + {
  152 + "id": 6581,
  153 + "projectName": "广州口语考试1",
  154 + "name": "广州口语考试1",
  155 + "coverV2": "cover/广州口语考试1.jpg",
  156 + "lastModified": 1482129270261,
  157 + "type": "SYSTEM"
  158 + }]
  159 +
  160 + * _接口_: 上传书或课到正式
  161 + _url_: /upload/resource post请求.
  162 + _参数_: **id** 课程ID或书id, **version** 学生版或教师版.
  163 + _返回值_:状态码200或400
  164 +
  165 + * __打标签__
  166 + 包cn.boxfishedu.cloud.tagservice
  167 + > 流程介绍
  168 + 打标签模块,采用的websocket连接方式,websocket配置在cn.boxfishedu.cloud.pub.
  169 + config里
  170 + a. 用户输入搜搜索关键字,服务器端会根据关键字到本地100数据库的book_has_config_wudaokou表里找匹配的记录并返回给前端
  171 + b. 勾选要打标签的书、要打到mongo的哪个collection里,确认后,服务端会去100机器上的路径/share/tagWuDaoKou下去找INI文件并解析为Map结构
  172 + c. 接着,服务器会将Map结构中的书、课与目录的关系写入到云端mysql数据库的course_catalog表、book_has_course_catalog表、course_relation_catalog表。写之前程序会先将书对应的目录记录从book_has_course_catalog表中删除,然后写入;会将课对应的目录记录从course_relation_catalog表中删除,然后写入
  173 + d. 继而,程序会将课程所拥有的属性关系(包括课程类型、难度等)写入到云端mongo数据库的相应collection内:如果用户选择智能推荐,则写入到new_version_tag_v2;如果用户选择智能作业,则写入到course_tag_homework_wudaokou。但是不论选择哪一个,都会将记录往course_new里面写一份
  174 + e. 录入mongo的操作不会删除记录,只会覆盖或新增属性
  175 +
  176 + __核心类详情__
  177 + 1. 类cn.boxfishedu.cloud.tagservice.service.AnalyseIniServce
  178 + 功能:解析INI文件为Map结构,并将INI文件模块里的book模块的公共属性写到每一个课程模块的属性里。
  179 +
  180 + 2. 类cn.boxfishedu.cloud.tagservice.service.TagService
  181 + _成员变量_:
  182 + * courseTypeListForBundle:代表此类型的课程必须有bundle
  183 + * courseTypeListForUltimate:代表此类型的课程必须有英文名称
  184 +
  185 + _方法_:
  186 +
  187 + * saveHomeworkTag()保存智能作业标签到mongo数据库course_tag_homework_wudaokou
  188 + * saveRecommendTag()保存智能推荐和在线授课标签到mongo数据库new_version_tag_v2
  189 + * saveCourseNew()保存智能作业、智能推荐、在线授课标签到mongo数据库course_new
  190 + 3. 类cn.boxfishedu.cloud.tagservice.service.BookHasCourseCatalogService
  191 + * saveBookHasCourseCatalog()保存书和目录的关系
  192 + 4. 类cn.boxfishedu.cloud.tagservice.service.CourseCatalogService
  193 + * saveCourseCatalog() 生成CourseCatalog
  194 + 5. 类cn.boxfishedu.cloud.catalog.CatalogService
  195 + * save()保存书和目录的关系以及课程和目录的关系
  196 +
  197 +* **标签展示**
  198 +
  199 + 包cn.boxfishedu.cloud.tagshow
  200 + > 流程介绍
  201 + a. 用户输入书名执行模糊查询,服务端依据书名去云端的mysql数据库的book表查询
  202 + b. 选择需要看哪里的标签,是智能作业还是智能推荐,点击相应的书,服务端会去mysql的book_has_course_catalog、course_catalog表找到书和目录的关系,到course_relation_catalog表找到课和目录的关系。
  203 + c. 同时程序也会去mongo里通过课程ID,到相应的collection里找到对应的标签
  204 + d. 程序会将目录、标签相关信息整合在一起返回给前端展示
  205 + e. 同时,用户也可以在查看的过程中修改相应的标签属性
  206 + 类cn.boxfishedu.cloud.tagshow.web.TagShowController
  207 + * _接口_:根据关键字查询书
  208 + _url_:/tag-show/book get请求
  209 + _参数_: **key** 查询关键字 **type** 忽略此参数
  210 + _返回值_:[
  211 + {
  212 + "id": 2805,
  213 + "projectName": "人教七下 综合",
  214 + "name": "人教七下 综合",
  215 + "lastModified": 1445595498439
  216 + }
  217 + ]
  218 +
  219 + * _接口_:查看课程标签详情
  220 + _url_:/tag-show/tag/detail get请求
  221 + _参数_: **bookId** 书ID **type** homework、recommend或spoken
  222 + _返回值_:略
  223 +
  224 + * _接口_:修改课程的标签信息
  225 + _url_:/tag-show/tag post请求
  226 + _参数_: **courseId** 课程ID **key** 标签key **value** 标签值 **tagType** 操作哪个mongoDB,枚举值
  227 + _返回值_:成功状态码 200
  228 +
  229 +* **开放书**
  230 + 包cn.boxfishedu.cloud.namespace
  231 + > 流程介绍
  232 + 主要修改远端数据库的namespace、namespace_has_book两个表。将书和渠道1、13273两个关联,其中1是对外开放渠道,所有人多能看到;13273渠道为vip渠道,申请了vip认识的老师才能看到。
  233 + 另外namespace_has_book表中有两个字段student、teacher,代表是否学生或教师能看到这本书
  234 +
  235 + 类cn.boxfishedu.cloud.namespace.web.NamespaceController
  236 +
  237 + * _接口_:根据关键字查询书
  238 + _url_:/namespace/book get请求
  239 + _参数_: **key** 关键字
  240 + _返回值_:[
  241 + {
  242 + "id": 2805,
  243 + "projectName": "人教七下 综合",
  244 + "name": "人教七下 综合",
  245 + "lastModified": 1445595498439
  246 + }
  247 + ]
  248 +
  249 + * _接口_:开放书,开放渠道为1和13273
  250 + _url_:/namespace/all/open put请求
  251 + _参数_: **bookIds** 书ID数组
  252 + _返回值_:成功 状态码200
  253 +
  254 +* **修改目录**
  255 + 包cn.boxfishedu.cloud.catalog
  256 + > 流程介绍
  257 + 修改目录主要修改表book_has_course_catalog和course_relation_catalog
  258 + 类cn.boxfishedu.cloud.catalog.CatalogModifyController
  259 +
  260 + * _接口_:根据书名查询与该书相关联的目录分类
  261 + _url_:/catalog/detail
  262 + _参数_: **book_name** 书名
  263 + _返回值_:[
  264 + {
  265 + "book": {
  266 + "id": 5592,
  267 + "projectName": "Function 关切",
  268 + "name": "Function 关切",
  269 + "lastModified": 1476000233025
  270 + },
  271 + "courseCatalog": {
  272 + "wholeName": "FUNCTION"
  273 + }
  274 + }
  275 +]
  276 +
  277 + * _接口_:根据书ID修改书的目录分类
  278 + _url_:/catalog/modify post请求
  279 + _参数_: **book_id** 书ID **catalog** 目录(可能为多个,中间用,隔开)
  280 + _返回值_:成功 状态码200 其他 状态码 400
  281 +
  282 +* **优化封面**
  283 + 类cn.boxfishedu.local.localcatalog.web.ImproveImageController
  284 +
  285 + * _接口_:优化封面
  286 + _url_:/improve/image get请求
  287 + _参数_: **fileselect[]** 待优化文件数组
  288 + _返回值_:浏览器会自动打包下载优化后的文件
  289 +
  290 +###以上为tag项目的接口详细介绍,下面介绍其他的包下的类的作用
  291 +
  292 +> ###包cn.boxfishedu.local.security
  293 + * 主要是做用户登录验证相关
  294 + * 用户的用户名和密码保存在本地100数据库bebase的user_info_authentication表下
  295 +
  296 +> ###包cn.boxfishedu.local.pub
  297 + * 此包下的类只针对本地数据库做相应操作
  298 + * 类cn.boxfishedu.local.pub.utils.AnalyseIniFileUtil 作用是解析INI文件为Map结构以用来跑目录使用
  299 + * 类cn.boxfishedu.local.pub.wen.BookNameController 中的接口是根据书名查询书对应的INI配置文件,用于跑目录时输入关键字查询INI文件使用
  300 +
  301 +> ###包cn.boxfishedu.datasource
  302 + * 主要是双数据源的配置
  303 + * CloudPoolProperties是正式数据库属性,LocalPoolProperties是本地数据库属性
  304 + * GlobalDatasourceConfiguration 为初始化本地和正式数据源
  305 + * RepositoryCloudConfig为正式JPA数据仓库配置,RepositoryLocalConfig为本地JPA数据仓库配置
  306 +
  307 +> ###包cn.boxfishedu.config
  308 + * http包为http请求工具
  309 + * 类cn.boxfishedu.config.HomeController为页面切换以及登录接口相关
  310 + * 类cn.boxfishedu.config.JsonAddress 作用缓存新版配置文件页面左边展示的所有待选属性
  311 + * 类cn.boxfishedu.config.JsonController中的接口作用是根据关键字从JsonAddress中获取对应的属性集合
  312 + * 类cn.boxfishedu.config.SvnUpdate 作用的更新远端svn服务器的/share/svn下的文件到100机器的/share/svn下
  313 + * 类cn.boxfishedu.config.UserInfoFilter 作用记录每个用户请求行为
  314 +
  315 +#service_delete_book
  316 +> **功能介绍**
  317 +> 1. 主要是删除云端mysql数据库的书、课以及云端mongo数据库的相关记录
  318 +> 2. 涉及的mysql表为book、book_section、namespace_has_book、book_has_catalogs、book_has_course_catalog、course_relation_catalog、user_has_book_node。
  319 +> 3. 涉及的mongo表为course_new、new_version_tag、new_version_tag_v2、course_tag_homework_wudaokou、spoken_quiz_attribute
  320 +> 4. 删除界面有个用户名和密码,临时写死在js里了
  321 +>
  322 +> **注意事项**
  323 +> 1. 删除前首先和内容研发人员确认该书是否已经对外开放了,最好自己确认下!!确认的方式是通过书名去云端的mysql的book表找到书ID,然后去namespace_has_book表找对应的书ID是否存在namespace_id为1或者是13273的记录,1为对外开放,13273为vip渠道,如果没有,说明没有对外开放,可以删除。
  324 +> 2. 删除书或课的操作为直接操作云端,首先需要和内容研发确认好是否必须删除,同时删除的操作需要让 **邓倩或者切尔西** 知道这件事,不要删错。删完后务必自己通过mysql客户端查询一遍是否删除掉,是否删多了,同时通过mongo客户端查询对应的课程标签记录是否在mongo里已经删除。查询的方式是通过idea控制台有课程ID输出,通过ID来查询。确认好后告知内容研发。
  325 +> 3. 可能有些书我们不会对外开放,而是只是通过智能推荐或者在线授课或者智能作业的方式面向用户。这种情况下一般会看是否必须删除。如果必须删除,那么需要查询这些课有多少人学,查询的方式通过逯老师那边查询(回头你再问),之后再和逯老师商量是否要删除。
  326 +> 4. 如果一些课开放给了 **智能作业**,并且已经安排给了学生(是否已经安排通过逯老师那边能查到),那么在删除相关课的同时还需要通知逯老师你删除了哪些课, **务必记住你删除的这些课程ID**
  327 +
  328 +#service_classify_course
  329 +>**功能介绍**
  330 +>1. 模块为新旧课程对照
  331 +>2. 由于我们的课程每年会做一次更新,用户可能在上一年学过一次,为避免用户今年学到去年的翻新课程,增加了对照功能。
  332 +>3. 涉及的表为云端数据库的course_mapping_v2
  333 +
  334 +#service_schedule_task
  335 +>**功能介绍**
  336 +>1. 模块为定时任务
  337 +>2. 定时备份今天100机器上的/share/backup/data下的文件到阿里云oss上,oss上的文件有效期为3天
  338 +>3. 定时检查云端mongo数据库的course_new、new_version_tag、new_version_tag_v2的标签完整性,如果不完整会发送邮件给切尔西和邓倩他们,邮件的配置在application.yml里
  339 +>4. **改进**:new_version_tag 已经不再使用,你可以将它改为course_tag_homework_wudaokou库并定时检查
  340 +
  341 +#service_utils
  342 +> **功能介绍**
  343 +> 1. 模块为自己随手写的一些小功能,可能有些还可以用,下面是整理的一些还在使用的类并简单的说明了下。使用前建议先过一遍代码
  344 +> 2. 类com.boxfishedu.myUtils.AddTagProperty;
  345 +
  346 +>>这个类中的方法checkB()是检查云端mongo里存在记录,但是该记录的课程ID在云端mysql数据库已经不存在的所有课程。出现这个原因一般是由于删除课程的时候只删除了mysql没有删除mongo里的记录。此方法可以用来检查mongo和mysql的数据一致性, **此方法会将mongo里冗余的记录删除**,可以考虑先打印,确认后再删除
  347 +
  348 +> 3.类com.boxfishedu.myUtils.CourseSizeTool
  349 +>>这个类的作用是计算云端在线授课的课程大小并导出到文件中
  350 +
  351 +> 4.类com.boxfishedu.myUtils.CourseStatistics
  352 +>>这个类的作用是统计云端mongo里在线授课或智能推荐的课程数量,可以统计不同collection、不同课程类型、不同难度、不同渠道,需要修改参数
  353 +
  354 +> 5.类com.boxfishedu.myUtils.CreateHomeWorkCollection
  355 +>>这个类的作用是将云端mongo的course_tag_homework_wudaokou里的强序bundle全部按照本地mysql数据库的book_has_config_wudaokou表里的书顺序全部更新一遍。这个类可以指定只更新某一个bundleName下的所有课。一般用于内容研发说某个bundleName下的课程顺序不对,然后重新打标签了也还是不对的情况。
  356 +
  357 +>6.类com.boxfishedu.myUtils.NamespaceHasBook
  358 +>>作用是将某本书指定开放给某些人,一般内容研发有这个需求
  359 +
  360 +>7.类com.boxfishedu.myUtils.NamespaceHasUser
  361 +>>方法openInner是给指定用户开放内部权限;
  362 +>>方法openVip是给指定用户开放vip权限;
  363 +>>开放前只需要将用户名粘贴到“开通权限.txt”文本下,每行一条记录执行就可以了