一、今天完成的事情
1、完成了所有的方案设计和表的设计
表已经发过了 发方案吧
1、注册/登录/找回密码
注册:
作为一个用户,我希望可以注册账号,以便于登录
方案:用户填入手机号后先触发短信验证码接口,用户输入注册所需参数,验证码核对验证码表无误且不超过三次后将注册所需参数放入user表中生成数据,完成注册后获得免登陆token; 如果用户此时使用第三方登录后进行注册,将用户注册信息插入数据库后拿到对应的用户ID和第三方的openId 插入 用户第三方登录中间表中
接口数:2(短信验证码、注册)
1、使用mysql定时任务完成验证码表的零点删除,保证每天0点定时清空验证码表
DROP event IF EXISTS delete_code;
CREATE EVENT delete_code
ON SCHEDULE
EVERY 1 DAY STARTS '2000-01-01 00:00:00'
DO
truncate table 表名;
2、使用基于redis实现手机验证码功能(redis计数器)
1.redis缓存运行效率高
2.redis可以通过expire来设定过期策略,比较适用于验证码的场景。
3.考虑到分布式数据个负载均衡数据要一致,这种共有的不用持久化的数据最好找一个缓存服务器存储
4.redis、Memcache都是内存数据库,都支持K-Y型的数据结构
5.redis还支持其他更加丰富的数据结构(list,set,hash等)
3、使用基于session实现手机验证码功能
登陆:
作为一个用户,我希望能够登录app,以便管理个人信息
方案:调用用户登陆接口,接收相应参数和数据库中做比对,核对无误即返回登陆成功信息,否则返回相应失败信息
接口数:1(登陆)
*微信登陆
作为一个用户,我希望可以使用第三方登录的功能,以便于更方便的登录app
用户点击微信登陆,弹出二维码,用户扫码后调用微信第三方授权绑定接口,获取到openid,通过openid确定用户身份,先通过对比数据库中openid验证用户是否为第一次登陆,如果已经绑定就直接登陆并发放token
如果openid未绑定过账号,就调用登陆接口(检查登陆账号是否绑定过其它openid)登陆并绑定,如果还没有账号,就调用注册接口注册并绑定登陆
接口数: 1(微信授权)
找回密码
作为一个用户,我希望有找回密码的功能,以便于忘记密码时找回密码
方案:用户填写手机号点击发送验证码,调用短信接口,验证码和新密码以及确认密码格式输入无误后在数据库中将对应用户密码更新
接口数:2 (短信验证、覆盖密码)
填写/修改资料
作为一个用户,我希望可以填写个人资料,以便于根据个人资料可以推荐和选择对应的课程
作为一个用户,我希望能够修改个人资料,以便信息发生变更的时候能及时更新
方案:将两个需求合成一个资料修改接口,进入页面时首先利用token查出该用户id返回给前端,然后接收用户修改后的资料参数(调用对象存储API完成头像上传,使用available()方法判断文件大小,使用正则匹配验证格式是否正确),将资料更新到user表对应的该用户数据
接口数:2(查询资料、更新资料)
修改密码
作为一个用户,我希望可以修改密码,以便于保证账户不被盗用
方案:调用修改密码接口,核对用户原密码是否正于数据库中对应数据匹配,匹配就更新新密码并返回成功信息,否则返回相应失败信息
接口数:1(核对原密码并更新密码)
*搜索课程/课时
作为一个用户,我希望可以对课程或课时进行搜索,以便于查找到自己想要的课程或课时
方案:根据用户选择的科目和年级使用like模糊查询与and条件查询结合,对课程和课时进行按照用户需求的查找,将结果集分页后返回给前端
接口数:2(课程查询、课时查询)
查询课程语句例如: SELECT subId,grade,course_name FROM [course] WHERE course_name LIKE '%和差倍%' and subId=#{subId} and grade=#{grade}
热门推荐
作为一个用户,我希望能向我推荐适合我年级的课程,以便于我选择和学习;
方案:用户进入主页,从token中拿出用户年级信息,调用查询推荐课程接口,如果年级信息不为空,那就按照用户的年级返回随机8个推荐课程以及课程相关信息,如果该年级推荐课程少于8个就显示全部
如果年级为空,则随机从总的推荐课程中随机选出8个返回给前端
接口数:1(推荐课程)
课程列表
作为一个用户,我希望能够有一个课程列表,以便于根据科目和等级来选择相应的课程
方案:根据用户设定的约束条件查出符合要求的课程列表,按照倒叙排列(使用order by)并分页后返回给前端
接口数:1(课程列表)
课程详情页
作为一个用户,我希望有一个课程详情,以便于我了解课程信息,查看相应的课时,收藏、分享、购买资料、开始学习;
方案:用户点击课程详情,调用课程详情接口,根据课程id返回需要的课程信息和课程内所有上架状态的课时,按照课时序号排列好之后返回给前端
接口数:1(课程页详情)
资讯列表/详情
作为一个用户,我希望可以浏览相关的学习资讯,以便于了解一些辅导方面的信息
方案:用户点击咨询按钮,调用咨询列表接口,按照时间排序返回到前端页面,用户点击某一咨询,弹出咨询详情
接口数:2(资讯列表、咨询详情)
意见反馈
作为一个用户,我希望能够及时反馈我的意见,以便平台加以改进让我有更好的体验;
方案:将用户输入的意见加入意见表中,并记录用户相关信息
用户管理
作为一个管理者,我希望有用户管理模块,以便我统计查看注册用户信息;
方案:管理者进入用户管理界面,调用接口查询分页好的用户信息,按照注册时间倒叙排列展示,管理者可选择是否调用更新解冻状态字段的接口完成用户的冻结、解冻状态的修改
管理者点击查看,可以获取用户详情相关数据以及我的收藏(课程)中的数据
查询用户收藏(课程/课时列表)先通过用户收藏表查出对应课程id的列表,再通过查出的id列表 用SELECT * FROMstudent_list WHERE id IN (id1, id2, id3...)查出对应的课程/课时列表
用户资料、课程记录所用方法和sql语句和上面相同
用户动态模糊多条件查询(例子):
private void doQuery()
{
Bool hasWhere = false;
StringBuilder sql = new StringBuilder(" SELECT * FROM T_Employee");
if(填写了学习星范围)
{
hasWhere = appendWhereIfNeed(sql, hasWhere);
sql.appendLine("FNumber BETWEEN '"+学习星1框内容+"' AND '"+学习星2框内容+"'");
}
if(填写了姓名)
{
hasWhere = appendWhereIfNeed(sql, hasWhere);
sql.appendLine("FName LIKE '%"+姓名框内容+"%'");
}
if(填写了学习课时数)
{
hasWhere = appendWhereIfNeed(sql, hasWhere);
sql.appendLine("FAge BETWEEN "+已学课时数框1内容+" AND "+已学课时数2
内容);
}
executeSQL(sql);
}
private Bool appendWhereIfNeed(StringBuilder sql,Bool hasWhere)
{
if(hasWhere==false)
{
sql. appendLine("WHERE");
}
else
{
sql. appendLine("AND");
}
}
接口数:4 (查询用户列表、用户模糊查询、更新冻结状态、查询用户详细信息)
热门推荐管理
作为一个管理者,我希望有内容模块的热门推荐管理列表页、详情页,以便我编辑管理热门推荐内容
方案:根据前端传入年级id调用课程接口,通过年级id获取课程id,课程名称,科目id,
根据科目id查出科目名称.
根据课程id查出课程名称,推荐封面,科目id.
根据用户输入的内容调用课程接口.更改数据库,
合作机构管理
作为一个管理者,我希望有内容模块的合作机构管理列表页、详情页,以便我编辑管理合作机构
方案:管理者点击合作机构管理调用查询合作机构列表接口,获取logo,名称,冻结状态(默认冻结)
点击冻结/解冻,调用修改状态接口修改为对立状态
点击新增,调用新增接口,接收logo和机构名完成一条机构数据的添加操作
点击删除,可根据机构id删除相应的机构数据
点击编辑,可以根据id修改相应机构的logo和机构名
科目管理
作为一个管理员,我希望有科目管理的功能,以便于我管理编辑科目
方案:管理者点击科目管理,后端将所有的科目按照时间顺序倒序排列分页好之后返回给前端
管理者可通过动态模糊多条件查询查询出满足自己所设定的条件的列表,sql语句与用户管理内同
无查询条件并点击查询,默认按时间倒序返回科目列表
管理者点击上/下架,调用修改科目上下架接口,完成上下架状态的修改
点击新增:从前端获取所有新增科目的内容,插入数据库新增一条科目的数据
点击查看:根据前端传过来的课程id查询出该科目的其它信息并返回给前端
点击删除:将删除状态激活,返回给前端
点击编辑:根据前端传过来的科目id修改对应的科目其它信息
点击课程:根据科目id查出该科目下所有的课程按照创建时间正序排列
教学管理-课程管理
作为一个管理者,我希望有教学模块的课程管理列表页、详情页,以便我编辑管理教学模块的课程信息;
方案:管理者点击课程管理,后端将所有的课程按照时间顺序倒序排列分页好之后返回给前端
管理者可通过动态模糊多条件查询查询出满足自己所设定的条件的列表,sql语句与用户管理内同
无查询条件并点击查询,默认按时间倒序返回课程列表
管理者点击上/下架,调用修改课程上下架接口,完成上下架状态的修改
点击新增:从前端获取所有新增课程的内容,插入数据库新增一条课程的数据
点击查看:根据前端传过来的课程id查询出该课程的其它信息并返回给前端
点击删除:将删除状态激活,返回给前端
点击编辑:根据前端传过来的课程id修改对应的课程其它信息
点击课时:根据课程id查出该课程下所有的课时按照创建时间正序排列
教学管理-课时管理
作为一个管理者,我希望有教学模块的课时管理列表页、详情页,以便我编辑管理教学模块的课时信息;
方案:管理者点击课时管理,后端将所有的课程按照时间顺序倒序排列分页好之后返回给前端
管理者可通过动态模糊多条件查询查询出满足自己所设定的条件的课时列表,sql语句与用户管理内同
无查询条件并点击查询,默认按时间倒序返回课时列表
管理者点击上/下架,调用修改课程上下架接口,完成上下架状态的修改
点击新增:从前端获取所有新增课时的内容,插入数据库新增一条课程的数据
点击查看:根据前端传过来的课时id查询出该课时的其它信息并返回给前端
点击删除:将删除状态激活,返回给前端
点击编辑:根据前端传过来的课程id修改对应的课时其它信息
点击资料:根据课程id查出该课时下所有的资料按照创建时间正序排列
绑定账户
作为一个用户,我希望可以进行帐号绑定,以便于我更多平台信息共享;
方案:用微信第三方登录获取openId ,验证是否已经绑定,若没有绑定就将openid加入对应的用户中进行绑定操作
注册统计
添加一个字段(daytime)只精确到天(y-m-d),为了高效,可以加上索引,group by daytime
这样的思路是可以把每天当成一个组,再利用count来计算每天(组)的数量,就是每天的注册数了。
SQL语句如下:
select count(1) from table where daytime between start and end group by daytime
二、明天计划的事情
1、约大佬进行方案评审
三、遇到的问题
对公司框架不熟悉,有些方案不敢写得太细
四、收获
如上所述
评论