本文最后更新于 2024-03-17,文章内容可能已经过时。

Werun-backend实验室工作流程:

1.纳新:

纳新分为暑期纳新和寒假纳新.其中寒假纳新之前会有宣讲.

具体流程为首先建立纳新群,然后在纳新群中发布作业,同学们做完作业之后,发送到邮箱,由主席安排相关人员进行批阅,选出作业做得不错的同学进入面试,面试结束后根据综合情况安排新同学加入,并发送邮件通知.

1.1 宣讲:

寒假纳新之前,由主席安排同学宣讲,并且在小窝等平台做宣传。

历届的宣讲ppt可以参看实验室共享资料库。

1.1.1 实验室介绍

来自前端-汪奇隆主席,原文链接:https://c6q1b8pr8y.feishu.cn/docx/JPZ2dnAa1oEvXax6dsmcSaPhnlh

基本信息

WeRun俱乐部与IcePhone工作室是隶属于哈尔滨工业大学(威海)计算机与技术学院(软件学院)的两个实验室,由计算机学院朱东杰副教授、理学院曲荣宁老师和李晓芳老师担任指导老师。

WeRun俱乐部成立于2005年,多年来实验室由老师带队,学生着手参与项目开发。与企业紧密合作,开发了贤得家、房合荟、短租平台、东方地毯MES系统等多个商业级项目。实验室秉承为学生服务的理念,执着于培养软件工程专业学生的实际动手能力。毕业工作学生均就职于阿里、腾讯、百度、小米、华为等国内知名公司,此外还有大批学长选择保研到清华、北大、中科院、复旦、本部、国防科大等学校或者选择出国到美国(现在不行啦)、英国等地深造。

哈尔滨工业大学(威海)软件学院IcePhone工作室成立于2008年10月,是当时软件学院学生自主管理的创新实践团队,采用校企联合的发展模式,让学生在实际的商业项目中得到锻炼,真正体现软件学院的国际化、工业化、高质量、高速度的办学特色。经过十几年的努力,工作室已经发布了不下几十个基于移动平台的应用程序,从开始的“元老级”成员们的努力拼搏,到前赴后继的新成员们的奋勇直追,工作室正在大踏步地走向前方。毕业工作学长同样就职于各大国内外知名公司,其他学长均升学至国内外知名顶尖高校。

我们的优势
  • 两个实验室共有3位在读博士6位在读硕士科研力量雄厚

  • 校企联合,校际合作,实验室与中国人民解放军某部门中国广核集团有限公司(中广核)国家航天局空间碎片监测与应用中心山东大学空间科学研究院交通运输部天津水运工程科学研究院(天科院)国家电网有限公司山东省船舶技术研究院金山云哈尔滨工业大学航天学院&人事处&研究生院威海市翰宝网络科技有限公司等有项目合作关系,可以提供给大家丰富的科研和项目资源,充实你的项目经历,让你的简历更加夺目

  • 历史积淀、经验丰富,四个工程开发方向都有丰富的开发经验积累,让你更快的成长

  • 技术栈全面、项目管理规范,帮助你更好的与技术前沿接触,更快与大厂接轨,清晰的代码规范,严谨的开发流程,致力于写好每一行代码

  • 朋辈资源优厚,有上百位在国内各大一线互联网大厂工作多年的实验室前辈,帮助同学们在实习、面试和工作中指点迷津

  • 环境优渥,可以提供给大家方便舒适的学习和科研环境

  • 项目资源丰富,大佬云集,有组队参赛获得各种学分的优良机会

纳新方向简介
WeRun俱乐部工程方向
web后端

曾做项目:哈尔滨工业大学(威海)教师绩效考核系统、数字钥匙、贤得家停车场系统、哈尔滨工业大学电子会议评审系统、哈尔滨工业大学(威海)廉政档案管理系统、威海新派低代码平台、智慧校园等bu'y

web前端

曾做项目:贤得家会员、房合荟后台管理系统、贤得家物业后台管理系统、数字钥匙后台管理系统、贤得家停车场后台管理系统、哈尔滨工业大学电子会议评审系统、哈尔滨工业大学(威海)廉政档案管理系统、威海新派低代码平台、智慧校园等

WeRun俱乐部研究方向

区块链,分布式存储等

IcePhone实验室工程方向
小程序

曾做项目:房合荟房地产销售一体化管理平台、贤得家会员、贤得家旅居养老、贤得家民宿、房合荟销控、贤得家停车场小程序

App

曾做项目:小贤助理、贤得家智慧社区、房合荟App端、智能水质监测系统、数字钥匙、车智汇、电力巡检、威海经区警务PUS、哈尔滨工业大学电子会议评审系统

IcePhone实验室研究方向

图数据挖掘领域的相关内容,包括社交网络、多模态知识图谱、推荐系统、高性能图神经网络等

纳新方式

我们会通过组织纳新宣讲,转发通知等各种方式召集想加入我们实验室的同学进入纳新群,届时我们会发布相应的作业任务,需要按时提交到我们的邮箱,我们会视作业情况通知入围同学进入面试环节,面试通过即可正式加入我们实验室。

一般每年举行两个纳新季:

①秋季学期末举行纳新宣讲会,寒假发布相应作业任务并确定面试入围名单,春季学期开学初组织面试

②春季学期末视情况对部分端开放补充纳新活动,小学期及暑假完成相应作业任务并确定面试入围名单,秋季学期开学初组织面试

目前面向大一大二的学生只进行四个工程方向的纳新,研究方向不直接进行纳新,进入实验室后在兼顾好自己的生涯发展与个人兴趣之后,可以参与研究方向的学习与工作。做好工程,才能做好研究

冰峰·不止登峰 威软·永不止步

其他你可能感兴趣的
实验室环境
日常

活动(例会,年会)

福利(学长学姐交流保研、考研、就业、留学等经验)

数学建模比赛获奖情况(部分)

本科生毕业去向(部分)

1.2 作业:

大作业一般为springboot开发一个完整的后端项目,由主席安排人员进行出题.

小作业视情况而定,一般为java基本语法的应用(一般为两次),以及springboot的基础开发.(一般为一次).

以下为历届大作业,留做参考。

1.2.1 20级大作业(寒假):

WeRun后端⽅向20级⼤作业 ⾸先,欢迎各位优秀的20级同学抽出时间参加WeRun后端⽅向的纳新~ 注意,20级的同学只需要完成这⼀次作业哦~ 如果对作业有任何不明⽩的地⽅可以在群⾥讨论或者发邮件询问 ⽬标 知乎,微博这样的APP⼤家⼀定不陌⽣,我们需要你⾃⼰实现⼀个类似系统的后端。要求实现以下功能即可: ⽤户的登录,注册,注销 ⽤户可以发送,删除和编辑⾃⼰的博⽂ ⽤户之间可以互相关注和取消关注,可以看到⾃⼰被多少⼈关注 ⽤户需要看到⾃⼰关注的⼈发出的博⽂ 要求 系统可以正常使⽤,不能轻易崩溃 博⽂内容可以只⽀持⽂字 只需要实现后端接⼝即可,前端界⾯作为加分项 ⽤户浏览博⽂不需要实时更新,只需要实现⼀个 ListPost 接⼝(当然你也可以叫其他名字),让客户端调⽤ 即可 ListPost 接⼝需要⽀持分⻚,⽀持按更新时间排序 除了登录,注册的接⼝外,其他接⼝都需要登录后才能访问 数据存储需要使⽤数据库,数据库选型不限 代码⻛格统⼀,关键点需要有注释 建议使⽤ SpringBoot + MySQL 实现,其他任意的实现⽅案也都可以 你需要尽量提⾼ 读取 操作的效率 加分项

  1. 可以实现⼀个简单的前端,仿照知乎等即可,可以做的很简单

  2. 实现其他你觉得需要的功能

  3. 数据库层⾯的优化或⼀些⾼级的⽤法,索引,视图等

  4. ⼀些 SpringBoot 的⾼级⽤法,如:AOP

  5. 你可以完成⼀份设计⽂档,阐述你当前的设计,系统的特点,可能遇到的瓶颈和你是如何考量的 提交

  6. 你需要提交程序源代码,运⾏截图和⼀份简单的接⼝⽂档(⽤什么格式的参数访问什么接⼝会返回什么结果)

  7. 邮件标题格式 “20-后端-姓名-⼤作业”

  8. 20级同学只有这⼀次作业,在2⽉27⽇前,将作业提交到 werun_backend@163.com,我们会根据作业情况, 在开学后⼀周左右联系你⾯试

1.2.2 21级大作业(寒假):

威软后端 21**级 大作业**

威软后端 21**级 大作业**

🔰引入

📍一对一、一对多和多对多

实现方式推荐:Spring Data JPA

📍*认证与授权(选做)

认证 Authentication:你是谁?

授权 Authorization:你能干什么?

实现方式推荐:Apache Shiro

🚩必做题

📍要求

📍系统功能概述

🏆加分项 +++

📚资料推荐

JPA

Shiro

🔰引入

🎉大家新春快乐!

盼望着,大作业终于来了,很高兴你可以坚持到这里。在前面的几次作业中,我们学习了 Java 和

SpringBoot,并搭建了一个简易的选课系统。

现在,让我们着手丰富亿下它,加入一套较为完整的用户系统。

本次大作业仍需要你学习一些新概念和新技术

📍一对一、一对多和多对多

先看这个理解一下

数据库设计(一对一、一对多、多对多)皮一下很开心的猴头-CSDN博客数据库一对一

实现方式推荐:**Spring Data JPA**

了解以下注解及其用法:

你也可以通过操作中间表实现这个功能,但在实现某些功能时可能会有一点繁琐

📍*认证与授权(选做)**

认证 Authentication**:你是谁?**

认证是一个尝试解决你是谁的问题的过程。

以 QQ 登录为例,我们输入账户和密码,服务器通过判断账户存在、密码正确性等来判断当前用户是否

合法,这就是认证的过程。授权 Authorization**:你能干什么?**

授权是尝试对用户授予访问或操作权限的过程

用户通过登录认证后,我们解决了如何辨识的问题。下一个问题是,如何处理用户调用接口的权限。

以QQ群为例:它至少有一个「群主」,还会有「管理员」、「普通群员」。一个用户在 QQ 群中的权

限主要由其「角色」决定,比如群主可以任命管理员,而普通群员则没有这个权限。这就是授权的一种

方式,我们可以通过授予「角色」不同的权限,来保证有着相同「角色」的用户有着相同的权限。

实现方式推荐:**Apache Shiro**

shiro 是一个功能强大和易于使用的 Java 安全框架,为开发人员提供一个直观而全面的解决方案

的认证,授权,加密,会话管理。

认证和授权实现有点复杂?没关系,我们可以利用框架。

通过Shiro框架,我们可以简单快速的实现登录认证和接口的权限管理。

你可以通过网课或一些开源项目来学习使用这个框架。

这里简单讲一下 Token 的概念:

Token是服务端根据用户名、密码等基础信息加密生成的一串字符串,以作客户端进行请求的一个

,当第一次登录成功后,服务器(后端)生成一个 Token 并将此 Token 返回给客户端,以后客户端

只需带上这个Token前来请求数据即可,后端可以通过解析 Token 来判断令牌的真伪,无需再次带上用

户名和密码。

下图为使用 Token 实现登录认证的基本流程。

🚩必做题

📍要求

  1. 根据下方的「系统功能概述」实现一个选课系统

  2. JPA 和 Shiro 均为推荐使用,也可以使用其他的技术实现,如 MyBatis 等,完成要求即可

  3. 认证与授权为选做,可以根据自己的能力来

  4. 用户的角色设定可以在数据库中直接设定,不需要实现某个功能去完成这件事

  5. 本题中,每个用户有且仅有一个角色6. 程序要有⼀定健壮性,不管⽤户输⼊什么、如何操作,程序不能崩溃

  6. 需要提交的内容:

接口文档(包含 Postman 测试结果截图)

数据库备份

开发文档(写一下你的开发思路)

项目文件

  1. 发送到**:* werun_backend@163.com 邮件名为*:* 学号 + 姓名 + Java*大作业**

📍系统功能概述

  1. 对任意用户,其基本功能为:

使用学号/工号登录

使用学号/工号注册

修改密码

修改姓名

  1. 若用户角色为「学生」,除基本功能外,还可以

查看可选课程,即已被审核且「通过」的课程

选课

查看已选课程

退课

  1. 若用户角色为「教师」,除基本功能外,还可以

发布课程,课程审核状态为「待审核」,由教务进行后续审核

查看自己已发布的课程及其审核状态和结果

  1. 若用户角色为「教务」,除基本功能外,还可以

查看全部课程

审核课程,将课程审核状态设为「通过」或「不通过」

🏆加分项 +++

注:附加题不强制要求,你可以结合自己的时间、能力和兴趣,选择性完成

认证与授权

使用 shiro 框架实现用户的认证与授权

SQL

学习一些基础的SQL语法,试试用原生SQL语句来实现学生的「查看可选课程」这个功能

AOP

可以尝试监控⼀些接⼝的运⾏时间,或者打印⼀些运⾏时的⽇志(⽐如说:什么时间 什么⼈请求了

什么接⼝ 请求成功还是失败,这对项⽬上线之后排错很有⽤)

需要:了解AOP的⽤法,学习有关Java反射的相关知识

分页

当查询的结果非常多,这时将结果全部传给前端就不是一个很好的选择。例如在使用百度搜索时,

翻到最下方可以看到页数选择的功能。你可以尝试使用 JPA Pageable 实现教务人员分页查询全部

课程的功能单元测试

一个合格的程序员必须熟练使用单元测试!你可以尝试使用 Junit 实现几个单元测试

前端页面(需要较多时间)

做⼀个前端界⾯可以更好地了解前后端的交互过程。 需要:学习⼀点HTML+CSS+Javascript的知

识,详细可以参考一下威软前端的几次作业

其他你认为需要的功能

📚资料推荐

JPA

springboot jpa哔哩哔哩bilibili

尚硅谷jpa开发教程全套完整版(初学者零基础入门)哔哩哔哩bilibili

Shiro

【狂神说Java】SpringBoot整合Shiro框架哔哩哔哩bilibili P1 - P5

【编程不良人】2020最新版Shiro教程,整合SpringBoot项目实战教程哔哩哔哩bilibili P1- P15

1.2.3 22级大作业(寒假):

2023 威软后端 大作业

1.**写在前面:**

首先,祝大家新年快乐!

经过了不平凡的2022年,我们终于迎来了充满希望的2023年,希望在新的一年我们可以与大家共同成长,充

满希望,勇往直前.

相信同学们已经经过了前两次JAVA作业和一次SpringBoot作业的考验,掌握了Java语言的基本语法和一特

性,了解了SpringBoot项目的运行方式。下面我们即将迎来最后一次大作业.

2.**作业介绍:**

2.1 引入**:**

回首刚刚度过的高中时光,同学们是否有过这样的经历?

笔者记得自己在高中的时候,在枯燥的学习生活之余,为数不多的期待就是在放学吃饭和一周一度的活动课

的时候,学校里会想起久违而难得的流行音乐,丰富了我们日以继夜刷题的日子.

但是有一个问题就是每个人的口味各不相同,但是每个人对那音乐的渴望却是无二的,那要怎么满足同学们

的听歌需求呢?我们设想了这样一种解决方案:线上投票.

由学生们放假回家休息的时候,选取自己喜欢的歌进行投票,假期结束后由学校的工作人员获取歌曲的投票

名单,进行审核后.按照顺序在学校内播放.

2.2 功能介绍:

2.2.1 学生端:

2.2.1.1: 注册:

需要提供姓名,学号,班级,密码等必要信息。

学号不可重复,如果重复则注册失败,需要重新注册。

2.2.1.2: 登陆:

我们本次项目只需要提供一套运行在服务器的后端系统,采用MVC的前后端分离模式进行开发,并不需

要前端页面,但是还需要提供一个登陆接口,用于验证用户身份并返回一些必要的信息。

加分项**1:shiro和jwt:**

shiro是一个java的安全框架,用于身份验证,授权,密码,会话管理等功能.能储存用户的登录凭证:session等,

同时使用过滤器(filter).对每个http请求进行过滤(根据接口和权限等信息限制访问).

jwt是json web token的缩写,是目前最流行的跨域身份认证解决方案.本质上是一个特殊的字符串.

感兴趣的同学们可以了解一下这两个技术,也可以只使用其中的一个来解决问题。

这个问题可能对初学者来说有亿点点复杂,在这里推荐几篇文章供大家参考:

(161条消息) 一篇适合小白的Shiro教程潮汐先生的博客-CSDN***博客shiro(161条消息) JWT详解baobao555#的博客*-CSDN博客jwt

也在这里推荐一下笔者的博客关于这方面的内容(偷偷的):Springboot笔记 | 抒情小熊

(bearslyricattack.github.io),这里面也有很多其他的关于SpringBoot的内容供大家参考~

本次加分项只需要使用这两个技术实现权限的验证即可。

2.2.1.3: 增添歌曲:

需要填写的有歌曲的名称,歌手,播放平台(防止学校的工作人员可能找不到这首歌0.0),备注等。

2.2.1.4: 查看可投票歌曲:

可投票歌曲指的是被增添进数据库,并且没有播放过的歌曲(假设一个歌曲被采用后播放一遍后不会再播

放第二遍).

这个功能是获取这些歌曲的列表,方便后续进行歌曲的投票。

2.2.1.5: 投票:

对歌曲列表中的歌曲进行投票。

加分项**2:投票限制:**

现实中我们经历过投票的都知道,很多投票都是有限制的,比如每个人每天只能投一票或者说只能在某

个时间段内投票或者在某个时间点后无法进行投票等。

本次加分项要求以任意的方式对同学们的投票进行限制即可。

亿点点提示:次数的限制可以在数据库中增添一个或几个字段来解决,也可以使用中间表来解决。而时

间问题可以使用Java中的Date类,Calendar类和DateFormat类辅助解决。

2.2.1.6**:查看投票结果:**

查看所有可投票歌曲的投票结果,让同学们可以先听几遍即将播放的歌,然后回学校听到时可以一展歌

喉(笑)。

加分项**3:投票排序:**

按照投票数的多少对歌曲进行投票并展示。可以使用SQL语句实现,同学们可以学习一下SQL的相关知

识。

加分项要求按照任意顺序对投票结果继续投票并展示即可。

加分项**4:展示分页:**

当查询的结果非常多的时候,一次性把大量的数据传给前端会造成前端压力过大。这种时候就需要使用

分页功能,把数据分成很多页的,一页一页的传送到前端。

可以使用JPA Pageable实现歌曲投票列表的分页。

2.2.2 教师端:**2.2.2.1:** 注册:

教师注册的时候需要填写自己的工号而不是学号。工号与学号一样不可重复。

2.2.2.2: 登陆:

2.2.2.3: 查看投票结果:

这两个的接口与学生端的要求基本相同。

2.2.2.4: 审批歌曲:

对每首歌曲单独进行审批,只有审批通过的歌曲才可以播出。审批失败的歌曲无法播放.

2.2.2.5: 修改歌曲的播出状态:

在歌曲播出后,修改该歌曲的状态为“已经播放”,在学生端-查看已投票歌曲中展示时就不再展示。

2.2.2.6: 查询歌曲:

输入某首歌曲的名称,查询某首歌曲的票数。

加分项**5:模糊查询:**

大家平常在搜索信息的时候,通常不需要输入完整的关键词,就能查询到相应的信息。

本加分项要求以任意的方式实现歌曲模糊查询的功能。

2.2.2.7: 删除歌曲**:**

删除,顾名思义,就是去掉一些东西.

但是在我们真正的业务场景中,我们一般使用的是假删除.

首先讲一下什么叫真删除和假删除:

真删除 :

指的就是彻底地删除, 从数据库表内将数据 进行移除 delete 。就是删除了数据库某一张表中的某一条

记录,不但前端访问数据库的时候得不到这些数据,后台访问数据库的时候也看不到这条记录了.

假删除:

指的就是逻辑上的删除 ,数据库表内, 数据会包含一个标识flag字段 , 例如: status(删除标识,0代

表未删除,1代表删除,默认为0) ,执行假删时,只是将数据的删除标识 status从 0 改 1,update。

本质上是数据的更新.后台访问数据库的时候仍然可以访问这写条数据,只不过前端访问接口的时候得不到

这些数据了,相当于这些数据在用户的"眼"中被删除了.但后台访问数据库的时候仍然能看到这条数据.

本次要求使用假删除的方式删除歌曲.

2.2.3 其他加分项目**:**

2.2.3.1**:个人收藏歌单:**

学生和教师可以建立自己的个人收藏歌单,里面包含了多首歌曲,可以实现对个人收藏歌单的各种操

作,比如建立,增加,删除等。

维护歌曲与个人收藏歌单之间的关系需要可能用到数据库设计中的一对一,一对多,多对多,可以使用

jpa中的相对应注解实现,也可以手写中间表实现。2.2.3.2**:反射与AOP:**

反射是Java的一种高级特性,是框架设计的灵魂。

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个

对象,都能够调用它的任意一个方法和属性。

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代

理实现程序功能的统一维护的一种技术。

反射是AOP的基础,利于反射和AOP可以做到很多事情,比如统一监控接口的运行情况,在控制台打印

程序运行日志等等。

尝试在项目中使用反射和AOP实现任意的功能,手写或者使用注解均可,有时候可以使你的程序更简洁,

并在出现bug时更加容易排错。

2.2.3.3: 批量操作**:**

批量操作可以减少重复性劳动,大大提高我们的工作效率.

要求实现批量的修改歌曲的播放状态,批量的删除数据库中的歌曲等.

批量删除也跟普通的删除一样,要求使用假删除.即通过改变数据库中的表征删除状态的字段来删除数据.

2.2.3.4: 单元测试:

单元测试指的是对某一部分功能进行单独的测试。以防止在程序出现错误时不知道从何查起的问题。

一个合格的程序员必须熟练的掌握单元测试!可以在程序中对特定的组件和逻辑使用单元测试。

2.2.3.5: 前端页面(可能需要较多时间):

使用前端页面可以更好的完成整个项目,更好的理解前后端交互的整个过程,需要学习一部分

HTML,CSS,JavaScript的知识,可以参考前端的几次作业。

如果你认为这个项目还有哪些不足或者是你认为它有哪些欠缺的功能,也可以发挥你的创造力尽情的增

添。

3.**写在最后:**

3.1 歌曲审批状态流程**:**

歌曲的审批状态应该是

1.增添歌曲,此时歌曲状态为未审批

2.进行歌曲审批,审批有审批通过和审批未通过两种情况,只有审批通过的歌曲能够播放

3.已经播放

再次提示一下,这种一个对象的多种不同的状态可以通过在数据库中增添一个专用的,表征状态的字段来实

现.

当然了也可以使用合理的任意其他方式实现.

3.2 总结**:**

作业乍一看可能有点复杂,不要害怕!,一点一点来,每天做一点可能不知不觉之间就完成了(0.0).作业自发布那一天开始**,尽量推荐在一个月之内提交,当然了如果没有完成后续提交也是可以的.**

作业推荐使用**JPA实现,其他任意合理的实现方式也可以.**

SpringBoot的学习再次推荐一下b站黑马程序员的视频,本次作业和里面的加分项所用到的相关技术则

可以去CSDN等平台上搜索相关文章进行学习。

大家如果在技术上或者这个项目的业务逻辑上有任何问题,都可以找群里的学长学姐讨论,祝大家都能有所

收获,有所成长.

1.2.4 22级大作业(暑假):

本次首次采用联合纳新的方式。详情如下:

1.2.4.1 联合纳新安排:

# werun暑期小程序&后端联合纳新计划

计划分为三个阶段实行,第一阶段小程序画静态页面,后端完成所有接口,第二阶段小程序和后端一对一组队,开始对接。第三阶段为面试选拔阶段

## 面向对象:所有22级,21级有意向加入werun的同学

## 报名方式:实名填写问卷星报名表,根据报名表拉入纳新需求沟通群

**问卷星报名表**:https://www.wjx.top/vm/tdJj5Py.aspx

## 第一阶段(7.1~8.1)

**考核方式**:后端和小程序端候选人独立单人根据需求和作业要求,完成纳新作业

其中,werun21级小程序端抽出若干人(视情况而定)后端抽出3人或3人以上,担任需求方,候选人在对于需求有疑问的地方,需要在需求沟通群中找到对应端的需求方人员,私聊沟通需求(也可以在需求群里讨论)。

**ps**:

一. werun需求方人员的任务:1.担任需求方与候选人沟通需求 2.验收批改作业 3.第二阶段可能会与多出来的候选人进行对接 4.面试选拔候选人

PS:关于3.对接任务:等到验收结束,需求工作人员可以找现成的作业理解代码后开始对接,不需要自行开发

二. 纳新需求沟通群不对外开放,成员仅限小程序后端纳新负责人和需求工作人员,以及两端候选人

三. 纳新工作代表实验室形象,需求工作人员应耐心负责,提供需求理解,需求的技术解决方向和学习方向上的指导和提示,不提供代码层面问题的具体实现和debug,并注意私聊时和回复作业时的沟通方式和措辞。

小程序端纳新作业链接:[小程序暑假纳新作业](https://yaocjg1pobs.feishu.cn/docx/ASGmdJeCcori9yxGOlEcwcz5nOf) 

后端纳新作业链接:[后端暑期纳新作业](https://zqmfb0zeawm.feishu.cn/docx/USoFd8dWBow4ZoxIxYictWtUnuc) 

完成第一阶段作业后,后端将程序源文件以及附录打包发送到邮箱werun_backend@163.com

小程序端将程序源文件打包发送到邮箱icephonestudio@163.com

8.1~8.3werun内部会统一组织验收,验收通过者进入对应端的候选人员名单中

## 第二阶段(8.4~8.25)

考核方式:从小程序端后端候选人员名单中,一对一配对进行分组。

分组多出来的候选人,可以继续排队等待对方端候选名单更新,与在这期间验收通过进入第二阶段的人员对接

也可以2v1,需求方人员会询问对方端是否有进度快的同学愿意对接多个,会给予该同学一定的加分

如果仍没有人与该候选人对接,将由需求方人员与其对接:

1.若该候选人在8.1号前按时提交作业,则等待7天无人对接,由需求方人员接手与之对接

2.若该候选人在8.1号之后滞后提交作业,则等待12天无人对接,由需求方人员接手与之对接

## 第三阶段(8.26~9.20)

根据候选人在一二阶段的表现综合选拔。

选拔类型分为三类:

一类:表现极佳的候选人免试通过选拔。

二类:表现优良的候选人要经过简短的面试沟通决定选拔结果。

三类:表现一般的候选人要经过技术面试后决定选拔结果。技术面试主要考核:对未来的规划,综合背景,需求理解能力,沟通能力,技术储备

PS:按时完整完成一二阶段的候选人选拔类型为一,二类。

延期完成第一阶段,未完成或延期完成第二阶段的候选人选拔类型为二,三类

选拔过程以及选拔结束后,如有特殊情况请自行与对应端负责人沟通

面试时间初定为9.2~9.3 具体面试时间根据具体情况调整

1.2.4.2 大作业具体内容:

后端暑期纳新作业

作业原型

备注:本次作业原型为微信小程序:叮咚买菜,同学们可以登录小程序实际模拟功能效果。

作业内容为分类模块与购物车模块两部分。具体的功能需求如下

作业要求

第一阶段(自行完成所有接口)

要求

只需要根据原型设计数据库,写出接口即可,不需要与小程序对接接口。

要求使用springboot+jpa/mybatis-plus

作业提交时间截止至8月1号,如有特殊情况未能在规定时间内完成可以和负责人说明,并确定自己的提交日期。

加分项

1.有全局异常处理

2.清晰的代码风格

3.对入参作校验

4.使用lombok,stream简化代码

5.给出对项目在需求上,或者代码实现上的可能优化,自己的思考(关于项目,学习道路,生涯规划)

(提交作业时随项目文件一起发送到邮箱中)

6.时间充裕者可以考虑在数据库层面(如优化慢查询,建立索引),代码层面进行性能优化(提交作业时写文档注明)

基本要求

重要!必须完成且应优先考虑的方面

1.结构清晰,易于阅读的代码,简短易懂的注释

2.准确把握需求的理解能力

3.与小程序,需求方流畅沟通的能力。遇到不清楚的需求要与需求方沟通,对接时出现的问题要与小程序同学协商

4.封装统一格式的返回类

5.有接口文档

6.完成各模块给出需求

登录模块

  • 需求一:如图,实现用户手机号密码一键注册登录接口。(找不到图了2333,无视验证码的字样,把他当作密码就行)

    • 本系统的用户没有用户名,以用户id(主键)和手机号为标识,一个手机号码只能绑定一个用户。

    • 一键登录注册的逻辑如下:

    • 1.输入手机号和密码

    • 2.用户此前没有注册登录过该系统(也就是数据库中没有该用户的记录),请求该接口会根据输入的手机号和密码在系统中注册该用户,并跳转第四步

    • 3.如果该用户此前注册登陆过该系统,根据用户输入手机号找到对应记录中的密码信息,与该用户输入密码比对,比对正确则登录成功

    • 4.登录成功,将用户基本信息(手机号,用户id)封装到token中,返回登录成功信息和token

  • 需求二:自行封装JWT工具类,实现基于JWT的token颁发和认证机制

提示:JWT工具类需要有一个getToken方法颁发token,一个verify方法校验token,一个decodeUser方法解析token携带的用户信息,获得登录用户的id,手机号等信息

  • 需求三:实现简单的过滤器,对请求进行过滤,自行判断哪些接口需要放行,哪些接口需要校验token通过才能访问

商品分类模块

  • 需求一:商品的基本分类展示需要实现,这里采用的是二级分类(一级分类是美味麒麟榜....那一行,二级分类是闭眼入...那一列)。

如果实现增删改功能,同一级分类之间应该能够调整排序(可以考虑将排序顺序当作一个字段持久化,查询时按照该字段大小排序返回给小程序,更改这个字段的大小就是调整排序了,如果二级分类闭眼入的排序就是1,众测冠军排序就是2,现在想新加个分类到他们前面,排序为1,那闭眼入~最佳人气的排序都得+1)。

PS:由于没有web端,分类的增删改可以不做。

  • 需求二:查询商品要求能够按分类查询,能够按价格和销量排序排序,能够分页查询。

PS:这三个要求是可以用一个接口实现的

PS:商品必须有销量,价格,名称等基本信息,但是不要求考虑库存,店铺等。

  • 需求三:能够将商品加入该用户的购物车中。

PS:用户只能将商品加入自己的购物车中,不能随便给别人的购物车塞东西吧

  • 需求四:提供简单的按商品名称搜索接口。

PS:可以和需求二整合为一个查询接口

  • 需求五:进行数据库设计时,先分析需求,根据给出的需求和图片,还有小程序实际演示效果,画出实体-关系图。(ER图在提交作业时随项目文件一起发送到邮箱中)

购物车模块

  • 需求一:分页查询该用户购物车

PS:用户只能看到自己的购物车内容

  • 需求二:提供相关接口,对于购物车商品增减,是否选中功能需要实现

PS:关于选中功能,可以考虑持久化为一个字段

  • 需求三:结算接口,只需要将已选中购物车的价格累加值计算出来即可

第二阶段(接口对接)

完成第一阶段作业后,将程序源文件打包发送到邮箱werun_backend@163.com

第二阶段作业内容为对接接口,提交第一次作业完成并合格后会安排小程序同学进行接口对接。

具体对接方式可以新建一个对接群,让同学们在群里交流,并撰写对接辅助文档进行对接。

1.2.5 23级大作业(寒假):

从2023年寒假开始,实验室纳新新开go语言方向。

1.2.5.1 Java:

恭喜23级同学完成了第一次Java作业(没完成的同学不要着急,交到邮箱里的我们也会看),从第二次作业开始,我们将进入Springboot部分的学习。建议大家去B站上搜索尚硅谷、黑马、狂神说等up主发布的经典SpringBoot入门教程进行学习。

对于从未接触过Springboot的22级同学,本次大作业也可以作为本次纳新22级Java大作业的基础参考,但22级同学无需完成本次作业,直接完成22级的大作业即可。

引入

在第一次作业中,我们学习了 Java 的基础语法以及一些高级特性。而在第二次开始,我们将使用 Java以及 SpringBoot 框架进行项目实战开发。

朝辞,是一个设想的相互留言写信的软件。我们可以创建自己的账号,拥有一个属于自己的uid;可以根据对方的uid写信给他,并可以添加关注列表;在收到对方的信件时,你也可以回信;除此以外,我们也可以寻找一位陌生人,即随机查库选择一个用户(类似漂流瓶),把信件发给他。除此之外,还有很多炫酷的功能,如延时发送惊喜信件、群发信件、信件分类管理等等。

我们将会分别在第二次和第三次作业中完成这个项目,本次作业会完成这个项目最基础的功能:用户的注册登录。

项目要求

本次作业需要完成该项目的基础部分,它需要包含以下功能:

注册登录

  1. 注册:使用用户名与密码注册(需要做一定的限制),注册成功后会获取属于自己的uid。

  2. 登录:使用用户名和密码登录,也可以使用uid和密码登录,若用户名密码正确则返回登陆成功信息,反之则返回失败信息。

注意:

  • 本次作业的数据都要持久化保存,即保存在本地硬盘中的数据库。我们在关闭程序后重新启动后,我们仍然可以直接登录用户,并查看自己关注的用户。

  • 以上功能要求都以接口实现,即传入指定的url和参数可以与项目交互并返回所需要的结果。至于接口的概念可以参照这个链接

本次作业推荐使用以下技术栈作为加分项:

  • 密码加密(如MD5)

  • 过滤器/拦截器

  • 使用JWT安全框架获取token

技术栈要求
  • 后端框架:Springboot 框架。

  • 数据库:MySQL (版本不做要求)

  • 持久层框架:Mybatis / Springdata JPA 二选一。

如果选择Mybatis开发,本次作业旨在了解Mybatis的【xml】【注解开发】两种开发方式,暂时不要用Mybatis-plus进行开发,我们将在第三阶段使用Mybatis-plus。

  • 安全框架:JWT 与 token(可选,非常大的加分项)

需要使用的工具
  • 集成开发环境:IDEA

用于Java开发,最好使用旗舰版。由于我们的学生邮箱被美国制裁后无法通过学生邮箱方式激活,大家可以在网上寻找其它激活的方法。(据说想要最方便快捷的激活方式可以尝试去淘宝花几块钱(小声))

  • 数据库:MySQL

一种关系型数据库,用于数据持久化。

  • 仓库管理工具:Maven

用于管理各种依赖。推荐使用旗舰版IDEA内置的Maven,但下载依赖时速度通常很慢,可以配置镜像源。

  • 数据库可视化:Navicat

数据库可视化工具。可以以表格的形式展示数据库中存储的信息。你需要配置你的数据库信息。(到时候导出.sql文件就可以使用这个软件)。破解版可以参考群文件。

  • 接口测试工具:Postman或 ApiPost7

用于测试你写好的接口,可作为最终展示效果

项目规范与其他要求
  1. 项目分包:可以根据网上学习的参考资料进行分包(本次作业需要用到 entity、mapper、service、controller、util等):

  2. 本次作业不要求以下内容:

    1. 无需将实体类设计为继承与多态;

    2. 无需将项目部署在公网上,运行在本地运行即可。

    3. 无需将项目保存在git仓库里(如果真的做到也可以做)

  3. 本次作业着重注意以下内容,未实现以下粗体要求将会要求重新修改哦~:

    1. 理解接口与请求等Web知识,配置好环境,能够将程序按照需求运行;

    2. 第一次Java作业中实现过的异常处理、代码规范(包命名、类命名、对象命名等等)。

    3. 实现 Spring IOC 对 bean 的管理,使用**@Autowired** 理解 Spring IOC 原理,能够简要说明 @Autowired 注解的相关原理。

      1. 补充:无需过于深究底层,但是不能什么都不知道,能够说清楚即可,更多是希望在完成大作业过程中对技术和业务有自己的思考而不是只是照着各种教程搓一遍代码

  4. 本次作业以下内容为加分项,可以作为下一次作业的准备:

    1. 实现JWT安全框架,理解token,并实现用token进行登录/鉴权;

    2. 登陆注册使用密码加密(如MD5):

    3. 使用过滤器Filter/拦截器Interceptor;

提交方式
  • 需要提交的内容:项目文件、数据库备份(.sql)、⼀个接口文档(写明白访问哪个地址会得到什么数据,最好还能有实际运行效果截图)

  • 提交时间:2月10日之前,如出现特殊原因不能按时提交作业的同学,联系 @22-后端-张沣睿 说明原因即可;

  • 将程序源文件以及附录打压缩包发送到邮箱 werun_backend@163.com,邮件名为 学号-姓名-23级Java第二次作业

提示
  • 环境配置是非常让人头疼的,很有可能会出现各种莫名其妙的红色报错、安装失败,甚至IDEA打不开等等乱七八糟的问题;大家在刚开始安装学习的过程中一定要报有耐心(毕竟大家都是从小白开始的,不是所有人都是一下子什么都能熟练操作),实在大不了卸载重装从头再来,也可以问后端Java的学长学姐(@22-张沣睿 @21-王梓 @22-王豪 @22-刘硕)

  • 开发工具虽然看起来很多很杂,但不要害怕,这几个是我们最最常用的 Java Web 工具,找到对应的教程视频多实践,跟着做一遍就差不多了。

  • 所有开发工具推荐使用英文版,并尽可能安装在非中文的安装目录下,据说IDEA的一些插件会与中文插件发生冲突,我们以后也是躲不掉各种英文版的软件的。

  • 遇到任何下载速度慢的情况,首先考虑使用镜像,常用的有阿里云镜像和清华镜像

  • 如果有其他问题,欢迎在群里提问或者问后端的学长学姐,也可以在交作业时随作业内容一并发来自己的感想。加油!

2.3补充提示:

目前收到了几位同学的Java第二次作业,对一些共性问题作出补充:

  1. 第二次大作业只需要创建一个Controller文件,按照规范命名即可;

  2. 数据库设计中,密码varchar长度需要注意一下,不要过短,因为需要存储密文;

  3. 不强制要求Java版本,不过目前阶段使用Java版本为Java8,jdk版本为1.8为佳(在Oracle 官网下载),另外注意pom.xml的Java版本配置;

  4. Springboot版本使用2.x为佳,Springboot3可能会产生不兼容问题~

另外,无法如期提交大作业的同学请于2.10日之前提前联系我哦~

1.写在前面

今天(2.10)正是春节,首先祝大家新年快乐!!!

经过了一学期的大学生活,相信大家都逐渐适应了大学生活的节奏。2023对大家来说是不平凡的一年,经历了高考,来到了我v,或许你满怀喜悦,或许你心有不甘,但ldx想说的是一切都已经成为过去式(好土),少年不应踌躇于过去,少年的目光应该望向前方,未来你会有无数可以大展身手的机会(请相信你v,也请更相信你自己),2024将会是大家飞速成长的见证之年,我想把我很喜欢的一句诗送给大家:

“须知少时凌云志,曾许人间第一流”,希望大家在新的一年满怀希望,勇往直前!

相信大家经历了一次Java作业和一次springboot作业的考验,对Java和项目有了较深的了解,下面我们将迎来最后一次大作业。

2.作业介绍
2.1 概述

本次作业是接着第二阶段的朝辞项目深入完善。二阶段大家完成了框架的搭建和用户注册登录模块的编写,本阶段来具体实现朝辞的功能。

朝辞,相互之间写信的软件,当你知道对方的uid时,就可以写信给他。你也可以回信。 不需要有录入手写文字的功能,都是纯文本最多配点图,然后需要能够管理你的信箱,可以新建分类,可以延时发送消息。

2.2 功能点

大家需要仔细思考这些业务需要实现多少接口,需要设计什么样的数据库表以及表中的字段。

2.2.0 登录注册

首先,上一次作业的登陆注册接口需要保留,也需要出现在Swagger接口文档中;

上次作业作为加分项的Jwt和过滤器/拦截器,本次作业要求实现

不带token或者token校验错误,拦截请求。但不是所有的接口都需要拦截,有些接口不需要登录并携带token就可以访问,在你的拦截器中配置这些接口的路径,遇到他们直接将他们放行。

2.2.1 添加好友与设置群组(这块需要好好想想数据库表及其字段的设计)
  1. 用户可以通过uid请求添加对方为好友,用户也可以将自己的好友分组(即设置群组)方便群发信件。

  2. 用户可以查看好友列表,可以删除好友(假删除),可以给好友添加备注,可以与好友绑定关系(基友,new Object(),家人等可自由发挥)

加分项:1.好友列表进行模糊查询,分页展示,批量删除

2.自己被对方删除后,自己再给对方发送信件会有一些提示

3.屏蔽功能,类似于微信的拉黑,屏蔽某个好友或用户后,将不会收到他的来信

2.2.2 信箱

信箱分为收件箱和发件箱(二者下面的逻辑差不多)。用户可以管理自己的信箱:

  1. 可以查询信件列表,要求按时间排序,分页展示,模糊查询信件标题&内容

  2. 查询信件详情,将信件标为已读。

  3. 可以新建分类对信件进行分组管理,删除信件,批量删除。

加分项:1.为信件添加置顶功能(该信件是在自己所属分组中置顶)

2.2.3 写信与回信

用户可以在发件箱中写信给指定的用户。

  1. 你作为一个用户,当你知道对方的uid时,就可以写信给他(需要对信件的字段设计时有信件的唯一ID)。当然别人给你发的来信你也可以回复。

tips:用户使用我们的朝辞是在客户端(手机或电脑),我们写的java程序运行在服务器上提供服务,用户想发送信件给某个人就需要先将信件发送给服务器,服务器再将信件转发给目标人,这里涉及到服务器推送技术(websocket),我们将流程简化:

发送信件接口直接将信件内容和必要信息写入数据库,用户请求收件接口时直接将数据库中的数据按需要(已读,未读,延时信件(见下面的需求)到点再展示)展示即可,当然用户肯定只能看到属于自己的发件和收件吧。

补充:收件接口即“查件接口”,即查询自己所收到的邮件

  1. 你也可以寻找陌生人,把信件发给他(随机查用户表拿一个用户,类似于漂流瓶啦)。

  2. 可以延时发送消息(一个惊喜信件,发给24年冬天的ta)

延时的实现很简单(你需要一个字段区分该信件是否可见,并且设置一个定时任务(Spring Task),到时间了该定时任务就把该字段设为可见,并且把时间字段设为当前时间,因为此时如果把时间设为发信时的时间,按时间排序查询信箱里的信件不就看不到这封信了嘛)

2.3 业务实现补充提示

提示1 数据库设计:

部分业务的实现可能需要用到数据库的一对多、多对多设计,可能需要用到连表查询等。个人认为这里有些难度,大家完成时要有耐心,做好注释。

提示2 接口设计:

对于每个用户而言,自己的好友列表和备注、邮箱等都是不同的,所以我们要在部分接口内获得该用户的信息,然后根据用户信息对数据进行过滤就行啦。

提示3 假删除:

真删除 : 指的就是彻底地删除。 从数据库表内将数据 进行移除 delete 。就是删除了数据库某一张表中的某一条记录,不但前端访问数据库的时候得不到这些数据,后台访问数据库的时候也看不到这条记录了.

假删除: 指的就是逻辑上的删除。数据库表内, 数据会包含一个标识flag字段 , 例如: status(删除标识,0代表未删除,1代表删除,默认为0) ,执行假删时,只是将数据的删除标识 status从 0 改 1(update)。 本质上是数据的更新.后台访问数据库的时候仍然可以访问这写条数据,只不过前端访问接口的时候得不到这些数据了,相当于这些数据在用户的"眼"中被删除了.但后台访问数据库的时候仍然能看到这条数据

本次要求使用假删除的方式删除好友和信件。

提示4 模糊查询:

大家平常在搜索信息的时候,通常不需要输入完整的关键词,就能查询到相应的信息。如搜索“微积分”可以搜索到“微积分(1)”和“微积分(2)”等。

模糊查询和直接展示可以用同一个接口实现,根据传参动态查询。

提示5 分页展示:

当查询的结果非常多的时候,一次性把大量的数据传给前端会造成前端压力过大。这种时候就需要使用分页功能,把数据分成很多页的,一页一页的传送到前端。

这个加分项所需的技术栈不限制,大家可以自己找现成的模块也可以自己手写。

提示6 JWT工具类参考:

对于上次作业未完成加分项作业的同学进行参考:JWT工具类需要有一个getToken方法颁发token,一个verify方法校验token,一个decodeUser方法解析token携带的用户信息,获得登录用户的id,昵称等信息

1.2.5.2 go:

1.2.5.2.1 第一次作业:

想必大家都使用过哈课表,这个简单的微信小程序可以让方便快捷的让我们得知每个课程和自己的的得分信息,本次作业就是在模仿哈课表实现一个简单的成绩管理系统. 所有学生的相关信息用结构体数组表示,结构体主要包含姓名,学号,各科成绩的信息以及其他你认为任何有用的信息. 程序必须要包含以下方法: 1.输入成绩:输入一个学生的成绩 2.删除成绩:删除一个学生的成绩 3.修改成绩:修改一个学生某一科目的成绩 4.计算:计算一个学生的平均分和总分. 5.输出成绩:输出一个/所有学生的成绩.与总分/平均分信息. 上述所有的方法只需要在main函数中模拟数据进行验证即可. 加分项: 1.go routine和channel是go语言的重要组成部分,尝试使用他们优化你的项目,并讲解自己这样做的目的和设计思路。 2.go提供了很多关键字和类型来进行异常处理,比err,defer,panic,recover等,尝试使用他们为你的程序在任何你想到的地方做异常处理,以增强健壮性。 3.反射是go语言的重要功能,可以达到很多神奇的目的,尝试在你的的项目中运用反射,比如可以使用反射针对输入的不同类型和格式做出动态的判断,或者其他你认为有用的任何功能。 4.go语言本身提供了单元测试的功能,尝试探索单元测试的用法,并对你项目中的关键点提供合理的测试。 5.其他你认为可以增加和完善的任意功能. 需要提交的文件: 1.源代码 2.运行截图 3.设计文档 参考文档 1.go语言中文官网 https://golang.google.cn/ 2. https://go.dev/doc/effective_go 3.http://books.studygolang.com 4.稀土掘金,CSDN,简书,BiliBili……

截止日期:1.25

1.2.5.2.2 第二次作业:

此处作业内容在第三次作业中仍要使用(所以做完作业不要删了)。

作业内容

这是一个模仿推特的简单网页(你如果好奇下方截图的来源可以看这里:Build and Deploy: TWITTER clone with React, Tailwind, Next, Prisma, Mongo, NextAuth & Vercel (2023)

这张截图是用来参考(直观想象)一下的,第二、三次作业实际上要实现的功能有:用户、推文、评论、点赞、关注其他用户、查看所有推文、查看关注的用户的推文等。

在第二次作业中:

你需要通过ORM框架对数据库设计合适的主键约束(自选一种主键生成策略)、外键约束(外键既可以通过数据库来约束,也可以不设置约束仅依靠代码的逻辑来保证,这里自由选择一种策略)、非空约束(例如用户的密码不能为空)、唯一约束(例如用户的用户名唯一)、索引(经常作为查询参数的字段可以设置索引,例如用户的用户名需要在查询中被使用)。

注:

  • 对于非空约束、唯一约束、索引,作业中不做强制要求。

https://gorm.io/zh_CN/docs/models.html

之后使用RESTful API规范设计合适的接口实现以下功能:

  1. 添加一位用户、通过一位用户的主键查询该用户、查询所有用户、删除一位用户、修改一位用户。

  2. 添加一篇推文、通过一篇推文的主键查询该推文、查询所有推文、删除一篇推文、修改一篇推文。

  3. (一位用户可以添加多篇推文)通过一位用户的主键查询该用户的所有推文。

注:

  • 你需要选择合适的HTTP请求方法,例如GET、PUT、POST、DELETE。

  • 对于用户和推文在数据库表中需要存储什么信息需要你自行设计/想象(例如你看图片中的一个用户有两种名字,带@的那种是要保证唯一的)。

  • 你不需要考虑用户注册与登录相关的细节,但仍然可以设计存储密码的字段。

https://www.ruanyifeng.com/blog/2014/05/restful_api.html

https://gin-gonic.com/zh-cn/docs/examples/http-method/

https://gorm.io/zh_CN/docs/create.html

具体要求与参考文档

选择一种数据库(推荐MySQL或PostgreSQL)在本机安装。

https://www.mysql.com/cn/

https://www.postgresql.org

任选一种数据库可视化工具(推荐DBeaver Community〔无需破解〕,其他有Navicat〔破解方法请参考Java作业及群文件〕、DataGrip等)尝试连接数据库。

https://dbeaver.io

任选一种Go语言ORM框架(推荐GORM)尝试连接到数据库,并了解用法(下方GORM指南链接是安装教程,连接到数据库链接是测试指南)。

https://gorm.io/zh_CN/docs/index.html

https://gorm.io/zh_CN/docs/connecting_to_the_database.html

任选一种Go语言HTTP Web框架(推荐Gin)并尝试运行一个HTTP服务(下方快速入门链接是安装教程及测试指南)。

https://gin-gonic.com/zh-cn/docs/quickstart/

任选一种HTTP接口测试工具进行安装并测试HTTP接口(不做推荐,即使使用终端命令测试也是可以的)。

https://www.postman.com

https://www.apipost.cn

最后使用选择好并测试过的框架搭建一个HTTP Web服务完成本次作业。

你可以自行选择加入其他可以方便代码编写的框架,例如配置管理框架Viper。

https://www.liwenzhou.com/posts/Go/viper/

加分项

此处内容在第三次作业中同样有效,如果感觉难度较大建议完成第三次作业后再进行尝试(建议放弃要求2,个人不建议第一次写后端尝试做一个比较完善的登录功能)。

  1. 任选一种加密方法,将用户密码加密后存储到数据库中,并保证其他功能正常运行。

  2. 了解Gin框架如何接入中间件、了解JWT的原理,任选一种安全框架(推荐jwt-go),实现使用JWT进行用户登录并保证接口安全(例:用户A只能修改用户A的数据,不能修改用户B的数据,这需要调用接口时传入登录时生成的token)。

https://golang-jwt.github.io/jwt/

https://www.liwenzhou.com/posts/Go/jwt_in_gin/

  1. 增加在推文中显示图片的功能(一篇推文可以显示0-3张图片),你需要完成对图片文件的上传与存储(文件存储通常不使用关系型数据库,你可以自行选择方法),并且对原有数据库表进行修改以存储图片文件的URL地址,最终通过接口获取推文时可以直接获取到图片URL(即通过接口获得的json中已经存储了每篇推文对应的0-3张图片的URL信息)。

说明

链接给出的文档和博客都是参考信息,不保证能起到完全的指导作用,仍然可能需要进一步阅读其他文档、通过搜索引擎排查错误等方法来解决问题。

Go语言的写法比较灵活,代码架构的设计、目录结构的划分可以参考文档、博客以及网络信息后设计,也可以自行设计,不必强行与Java相似。

提交内容

  1. 项目源代码。

  2. 在数据库可视化工具中,截图项目数据库中每张表的表数据。

  3. 在接口测试工具中,截图查询所有用户、查询所有推文、通过一位用户的主键查询该用户的所有推文三个接口的测试结果。

(所以只要代码能正常运行,提交的时候截几张图就好了QAQ)

1.2.6 22级大作业(寒假):

简介

完成一个简易的商城后台系统

技术栈:springboot + jpa/mybatis-plus + JWT + swagger + lombok + validation

开发工具:IDEA, 接口测试工具(postman/apifox),数据库链接工具(navicat/IDEA datagrip)

项目分为四个功能模块:用户注册登录,商品与分类,购物车与订单

开发流程

0.准备本地开发环境

1.需求分析,根据需求抽取实体,画ER图

2.根据上阶段分析结果,设计MySQL数据库表,设计字段和索引

3.搭建项目,确定命名规范,分包

4.开发接口,每个接口写完都需要在本地自测

5.编写说明文档

规范

项目分包

JPA的项目分包:

config为配置类

exception全局异常处理

request请求类

response请求返回类

util工具类包

controller为控制层

entity实体类

repository数据访问层

service业务逻辑层

Mybatis-Plus的分包:

与JPA分包不同的地方:repository更名为mapper,entity更名为model

Controller:

整体开发遵循restful规范

固定的注解: @RestController @RequestMapping("/") @RequiredArgsConstructor(onConstructor_ = {@Autowired})

注意:不要在controller层写过多的业务逻辑!! 业务逻辑要封装在service层中

request:

请求类

命名规范:行为+对象+Request 如UpdateExampleRequest

response:

命名规范:对象+Response /对象+Page+Response /对象+List+Response

接口统一返回baseresponse类

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class BaseResponse<T> {
    private String msg;
    private Boolean success;
    private T data;

    public BaseResponse<T> construct(String msg, Boolean success){
        this.msg = msg;
        this.success = success;
        return this;
    }

    public BaseResponse<T> construct(String msg, Boolean success, T data){
        this.msg = msg;
        this.success = success;
        this.data = data;
        return this;
    }
}

T是泛型,可以接受你自定义的返回类对象,比如:

ListProdSkuResponse是我们自定义的返回类对象,我们把它的list作为参数T传入baseresponse统一返回类中,然后再把baseresponse返回给前端

exception:

在这里存放全局异常处理类和自定义的异常类

config:

这里存放配置类

比如可以存放swagger的配置类:

/**
 * Swagger 配置
 */
@Configuration
@EnableOpenApi
@EnableKnife4j
@Slf4j
public class SwaggerConfig {

    /**
     * 用于读取配置文件 bootstrap.yml 中 swagger 属性是否开启
     */
    @Value("${swagger.enabled}")
    Boolean swaggerEnabled;

    /**
     * 请求地址前缀 /service-name
     */
    @Value("${swagger.prefix}")
    private String prefix;

    @Bean
    public Docket docket() {
        return new Docket(DocumentationType.OAS_30)
                // 是否开启swagger
                .enable(swaggerEnabled)
                .select()
                // 过滤条件,扫描指定路径下的文件
                .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
                // 指定路径处理,PathSelectors.any()代表不过滤任何路径
                .paths(PathSelectors.any())
                .build()
                .securityContexts(Arrays.asList(securityContext()))
                .securitySchemes(Arrays.asList(securityScheme()))
                .apiInfo(apiInfo())
                //请求URL都会加上/project前缀
                .pathMapping(prefix);


    }

    private AuthorizationScope[] scopes() {
        return new AuthorizationScope[]{
                new AuthorizationScope("all", "all scope")
        };
    }

    private SecurityScheme securityScheme() {
        return new ApiKey("Authorization", "Authorization", "header");
    }

    private SecurityContext securityContext() {
        return SecurityContext.builder()
                .securityReferences(Arrays.asList(new SecurityReference("Authorization", scopes())))
                .operationSelector(o ->
                        o.requestMappingPattern().matches("/.*")
                )
                .build();
    }

    private ApiInfo apiInfo() {
        /*作者信息*/
        Contact contact = new Contact(
                "",
                "https://zqmfb0zeawm.feishu.cn/docx/LAModLTGZoTiF3xqptdc1r3nnJf",
                ""
        );
        return new ApiInfo(
                "xxx模块",
                "xxx模块测试接口文档",
                "v1.0",
                "https://zqmfb0zeawm.feishu.cn/docx/LAModLTGZoTiF3xqptdc1r3nnJf",
                contact,
                "Apache 2.0",
                "http://www.apache.org/licenses/LICENSE-2.0",
                new ArrayList()
        );
    }

    /**
     * 解决 swagger 不支持高版本 springboot 问题
     * https://fullstackcode.dev/2022/06/12/swagger-is-not-working-with-spring-boot-2-6-x/
     */
    @Bean
    public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
        return new BeanPostProcessor() {
            @Override
            public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
                if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) {
                    customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
                }
                return bean;
            }

            private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) {
                List<T> copy = mappings.stream()
                        .filter(mapping -> mapping.getPatternParser() == null)
                        .collect(Collectors.toList());
                mappings.clear();
                mappings.addAll(copy);
            }

            @SuppressWarnings("unchecked")
            private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {
                try {
                    Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
                    field.setAccessible(true);
                    return (List<RequestMappingInfoHandlerMapping>) field.get(bean);
                } catch (IllegalArgumentException | IllegalAccessException e) {
                    throw new IllegalStateException(e);
                }
            }
        };
    }
}

或者是validation的配置类:

@Configuration
public class ValidatorConfig {

    /**
     * 配置快速失败模式,遇到一个不匹配直接返回,而不是扫描所有是否匹配:
     * 1. 普通模式(默认模式):会校验完所有的属性,然后返回所有的验证失败信息
     * 2. 快速失败模式:只要有一个验证失败,则返回
     */
    @Bean
    public Validator validator() {
        ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
                .configure()
                // 快速失败模式
                .failFast(true)
                .buildValidatorFactory();
        return validatorFactory.getValidator();
    }

    /**
     * 设置 Validator 模式为快速失败返回
     */
    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor();
        postProcessor.setValidator(validator());
        return postProcessor;
    }

}

lombok自动注入:

使用@RequiredArgsConstructor(onConstructor_ = {@Autowired})注解代替@Autowired

比如上图的service注入就用lombok注解代替了@Autowired

命名规范:

数据库表命名规范_数据库表名-CSDN博客

cloud.tencent.com

需求描述

总共五个实体:用户,商品,分类,购物车,订单

下面各模块描述中如果有图的话配合着图来理解需求,没有图的话可以翻一翻常见的购物平台来理解 比如购物车和订单就可以参照下京东

用户模块

功能点:

1.实现用户手机号密码一键注册登录接口。

本系统的用户没有用户名,以用户id(主键)和手机号为标识,一个手机号码只能绑定一个用户。

一键登录注册的逻辑如下:

1.输入手机号和密码

2.用户此前没有注册登录过该系统(也就是数据库中没有该用户的记录),请求该接口会根据输入的手机号和密码在系统中注册该用户,并跳转第四步

3.如果该用户此前注册登陆过该系统,根据用户输入手机号找到对应记录中的密码信息,与该用户输入密码比对,比对正确则登录成功

4.登录成功,将用户基本信息(手机号,用户id)封装到token中,返回登录成功信息和token

2.实现认证拦截器,不带token或者token校验错误,拦截请求

ps:不是所有的接口都需要拦截,有些接口不需要登录并携带token就可以访问,在你的拦截器中配置这些接口的路径,遇到他们直接将他们放行

3.自行封装JWT工具类,实现基于JWT的token颁发和认证机制

提示:JWT工具类需要有一个getToken方法颁发token,一个verify方法校验token,一个decodeUser方法解析token携带的用户信息,获得登录用户的id,手机号等信息

4.在需要用户信息的接口中,能够通过JwtUtils 解析携带的token获得用户信息

商品分类模块

  • 需求一:商品的基本分类展示需要实现,这里采用的是二级分类(一级分类是美味麒麟榜....那一行,二级分类是闭眼入...那一列)。

需要实现增删改功能,同一级分类之间应该能够调整排序(可以考虑将排序顺序当作一个字段持久化,查询时按照该字段大小排序返回给小程序,更改这个字段的大小就是调整排序了,如果二级分类闭眼入的排序就是1,众测冠军排序就是2,现在想新加个分类到他们前面,排序为1,那闭眼入~最佳人气的排序都得+1)。

  • 需求二:查询商品要求能够按分类/名称查询,能够按价格/销量排序排序,能够分页查询。

PS:用一个接口实现,根据传参动态查询

PS:商品必须有销量,价格,名称等基本信息,但是不要求考虑库存,店铺等。

  • 需求三:能够将商品加入该用户的购物车中。

PS:用户只能将商品加入自己的购物车中,不能随便给别人的购物车塞东西吧,这里我们需要在接口内获得该请求用户的信息

购物车模块

  • 需求一:分页查询该用户购物车

PS:用户只能看到自己的购物车内容

  • 需求二:提供对于购物车商品增减,是否选中功能,购物车项状态(激活/失效)的实现

PS:关于是否选中,购物车商品增减功能,需要持久化为isSelected,quantity,status字段

我们需要一个接口更新购物车状态、是否选中、数量

ps:购物车失效的原因可能是商品下架

  • 需求三:批量下单接口

ps:图上每一个购物车项对应一个商品,如下图是一个购物车项, 购物车项实体和商品实体的关系是:一个购物车项只能对应一种商品,一种商品可以有多个对应的购物车项。此外,用户和购物车项的关系也是一对多。

订单模块

选做,加分项,如果做了的话面试的时候讲讲自己的实现

自行设计订单模块的实现,在满足基本订单功能的情况下 还要实现以下核心功能

1.某个用户的购物车批量下单:当用户在购物车页面选择了几个购物车项点击结算,此时会创建一个订单,而涉及的购物车项都会在用户的购物车页面中删掉

(可以考虑结合购物车模块的isSelected字段,根据用户id查找所有该用户的已选中购物车,并根据查到的购物车项列表创建订单)

2.基础:订单信息只需要有价格,状态(待支付,已取消,已完成,已退款),金额,配送方式,地址,收货人信息...等字段

选做:考虑下,如果现在需要订单信息中能够看到订单中每一个购物车项的信息怎么办(商品名称,商品图片,商品单价,购入份数)

3.选做:创建订单后开始计时,十分钟后如果该用户未支付,就取消订单(定时任务,可以使用quartz,或者mq的延时消息实现)

ps:涉及到支付,退款的流程都不用实现,我们只需要实现到创建订单,查看订单,和订单超时取消即可

基本要求

1.结构清晰,易于阅读的代码,简短易懂的注释

2.准确把握需求的理解能力

3.封装统一格式的返回类

4.swagger接口文档

5.有全局异常处理

6.使用lombok,stream简化代码

7.完成各模块给出需求

8.面试时项目能够本地跑通演示

加分项

1.在完成基础要求的情况下,给商品模块的商品分页查询需求添加Redis缓存加快查询速度,在设计文档中说明自己的方案

2.将项目部署到linux云服务器中

作业提交

需要提交的:

1.源代码工程文件

2.SQL文件

3.设计文档(需要包括接口文档(从swagger给每个接口截个图,并文字说明实现),项目架构,项目难点/亮点说明...)

4.ER图

可以尝试在linux云服务器上部署MySQL;

1.3 面试:

1.3.1 发布面试内容:

在大作业结束之后,在群里发布面试会问的问题.一下问题可做参考:

0.提高自己对业务的理解能力,思考项目中需求的实现是否有其他方案,结合需求的场景思考实现的优劣之处。以及对于对接流程的思考,作为后端怎样提高开发,对接的速度和质量,推进对接流程.

1.swagger基本知识

2.开发技术基础:jpa&Mybatis-plus 的基础应用,多条件分页查询,动态sql

3.SQL基本语法

4.Java基础,Java高级:注解,反射,泛型,异常处理

5.git基础知识,linux基础知识

6.Spring与springboot基本原理: Ioc Aop

7.Mysql进阶应用-索引,sql优化

8.中间件:redis,mq基本知识 

1.3.2 进行面试安排:

发送邮件(或者其他形式),安排面试.

安排不少于三位同学担当面试官,要求同学们携带电脑,把自己的项目进行投屏.

1.3.3 进行面试:

由于暑假和寒假面向的同学不同,水平不同,面试的问题也有所不同.

面试内容构成(暑假):仅做参考

1.自我介绍 5min(性格兴趣爱好,未来规划方向:考研/保研/出国/就业,成绩)

2.业务需求 15min

3.技术问题 15min

4.一道sql题 20min

面试内容构成(寒假):仅做参考

1.自我介绍 5min(性格兴趣爱好,未来规划方向:考研/保研/出国/就业,成绩)

2.业务需求 15min

3.大作业相关内容 15-20 min

对高年级的同学要求要对应提高.一下是一些面试题目参考.

# 纳新试题

## 0.业务

1. 在这次纳新考核中你是如何和前端进行交流的,对方是否有提出一些需求(问题),你是如何解决的。(最好是积极&主动交流) 你认为对接过程中的难点是什么?
2. 如果引入会员系统,只有会员可以选购特殊商品,简述一下你的看法(用户进行权鉴设置)
3. 购物车选中功能应该交给前端还是后端比较好,为什么?,如果后端,如何实现。(后端比较好,正常电商平台是可以保持选中状态的,你上次登录选中了,下次也可以看到,当然你可以说是缓存,那么跨设备场景下缓存不就消失了?所以还是后端,在购物车相关实体保存个is selected字段,提供更新状态的接口就可以)
4. 讲讲你是如何实现二级分类的,可以从如何进行分类顺序调整(parentid)
5. 系统中商品和购物车,购物车和用户实体的关系。一对多关系,在数据库层面如何设计实现,多对多关系呢?(合理即可,用户和购物车必须是一对多,一个购物车的所有者不能是两个人吧hhhh)
6. 购物车实体中,有什么必须要加入的业务字段(能答到用户id就行)
7. 讲讲项目中分页查询的实现,以及查询返回的数据是否能满足分页要求(需要返回 总共条数,总共页数,分页粒度,当前页数,这样前端才好展示)

## 1.swagger基本知识

1. swagger的优点(

   *1 节省了大量手写接口文档的时间,低成本低侵入性生成RESTful 接口文档*

   *2 生成的接口文档可以直接在线测试,省去了使用 Postman 设置接口参数的过程,而且请求参数,返回参数一目了然*

2. swagger在项目中的使用方式(引入依赖,编写配置类,在需要注释的地方写上注解描述,项目启动后访问接口文档,在上面测试)

## 2.开发技术基础

1. 项目的结构及其应用(entity\mapper\service...)(entity\repository\service\controller)

2. 结合其项目,问其一个具体的CRUD如何操作的,来检验对于JPA&Mybatis-plus的基本应用。

3. Mybatis的动态sql有什么用?执行原理是什么?(Mybatis 动态 sql 可以在 Xml 映射文件内,以标签的形式编写动态 sql,执行原理是根据表达式的值 完成逻辑判断并动态拼接 sql 的功能。)/Jpa的动态查询(Specification[Spring-Data-Jpa动态查询(Specification)_小马 同学的博客-CSDN博客](https://blog.csdn.net/qq_40205116/article/details/103329592))会吗

4. 讲讲jpa 查询[API](https://so.csdn.net/so/search?q=API&spm=1001.2101.3001.7020):Criteria API 以及Root,CriteriaBuilder,Predicate是什么意思?

## 3.SQL基础语法

SQL

1. 左外连接和右外连接的区别
2. LIMIT的含义及用法
3. Having 和 where 的区别
4. 约束的种类及用法
5. 说几个你知道的聚合函数,以及他的功能

## 4.Java基础

1. Java有几种集合(*主要有 3 种:set(集)、list(列表包含 Queue)和 map(映射))*

   *集合中能够存储基本类型数据吗(不可以,集合不允许存储基本类型的数据,只能存储引用类型的数据,也就是包装类*)

2. Java的泛型是什么?(*Java中的泛型是一种参数化类型的机制,可以让代码更加通用和安全。通过使用泛型,可以定义一些带有类型参数的类、接口、方法等,以达到编写通用代码的目的。*)

3. Java四大特性(*封装、继承、多态、抽象*)

4. “int 和 Integer的区别是什么”(*一个是基本数据类型,一个是包装类*)

•       使用包装类有什么好处?(

•           *1,包装类型可用于泛型,可以添加进集合,而基本类型数据不可以。*

•           *2,包装类可以为null*

•           *3.包装类提供了用于操作的方法,如String.parseInt,而基本类型数据没有*)

5.自动装箱和拆箱?(

*什么是自动拆装箱?*

- ***装箱**:将基本类型用它们对应的引用类型包装起来;*
- ***拆箱**:将包装类型转换为基本数据类型;*

```java
Integer i = 10;  //装箱
int n = i;   //拆箱
```

*ps:自动装箱是通过 Integer.valueOf() 完成的;自动拆箱是通过 Integer.intValue() 完成的*

)

6.什么是Java的反射?(*运行时获取对象所属类的字段、方法、构造方法,且可以在程序运行时动态地调用这些方法和构造函数。*) 

7.你在项目中有哪些注解的应用(*在编译时进行格式检查,比如:@Override放在方法前。在Spring框架中,注解用来描述依赖注入、事务管理、AOP等行为。在JUnit测试框架中,注解用来描述测试方法、测试类、测试套件等。在JPA持久化框架中,注解用来描述实体、关联关系、查询等*。)

8.项目中你是如何处理异常的?(try catch?全局?throw手动抛出?throws?)可以解释一下吗?

你对Java异常处理机制的理解?为什么需要(*Java采用的异常处理机制,是将异常处理的程序代码集中在一起,与正常的程序代码分开,使得程序简洁、优雅,并易于维护。*      

在编写程序时,经常要在可能出现错误的地方加上检测的代码(ifelse),过多的if-else分支会导致程序的代码加长、臃肿,可读性差。因此采用异常处理机制。)

9.java需要事务的场景(一个方法内多个增删改操作)

10.spring有哪两种事务管理方式(编程式事务和声明式事务)

声明式事务的实现是基于什么(AOP)





## 5.git基础&Linux基础

### git部分

1. 如何解释`git push origin dev`,如何给远程仓库起别名

2. 如何处理git 冲突

3. 简述git的工作流程。

   如果有讲到git status,询问该指令的作用。

4. git在本地的工作区域是哪三个,分别是哪三个,其中仓库区和暂存区在哪个目录下(

   *工作区:平时放代码的地方,*

   *仓库区:这里面有你提交到所有版本的数据,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪* 

   *暂存区:用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息,一般存放在 .git 目录下的 index 文件     仓库区和暂存区一般在.git目录里*)

### linux部分

1. 如何配置mysql 远程连接
2. 如何后台运行的jar包及查看运行日志(nohup的命令启动jar,tail -fn 200 nohup.out)

## 6.IOC AOP

1) 简要介绍IOC及其优点(*控制反转、将创建对象的控制权交给了IOC容器,从而使程序员不用关注如何去创建对象,而是把精力放在业务逻辑上*)
2) 简要介绍AOP
3) 依赖注入相关注解(*@Autowired:自动按类型注入,如果有多个匹配则按照指定Bean的id查找,查找不到会报错。*

*@Qualifier:在自动按照类型注入的基础上再按照Bean的id注入,给变量注入时必须搭配@Autowired,给方法注入时可单独使用。*
*@Resource:直接按照Bean的id注入,只能注入Bean类型。*
*@value:用于注入基本数据类型和String类型)*

4. AOP常用注解(

   *@Aspect:声明被注解的类是一个切面Bean。*

*@Before:前置通知,指在某个连接点之前执行的通知。*
*@After:后置通知,指某个连接点退出时执行的通知(不论正常返回还是异常退出)*
*@AfterReturning:返回后通知,指某连接点正常完成之后执行的通知,返回值使用returning属性接*
*HI.*
*@AfterThrowing:异常通知,指方法抛出异常导致退出时执行的通知,和@AfterReturning只会有-*
*执行,异常使用throwing厲性接收)*

5,什么是 Spring Bean?

## 7.索引

1.索引是什么?(用于快速查询检索数据,本质可以看成是一种排序好的数据结构,能够提高查询速度的思想实际上是空间换时间)

2,项目中哪里可以用到索引(比如用户注册的账号名可以加唯一索引,又比如最常见的主键索引(设定主键后,数据库自动建立))

3.什么情况下不建议用索引(

1. *数据唯一性差(一个字段的取值只有几种时)的字段不要使用索引*

> *比如性别,只有两种可能数据。意味着索引的二叉树级别少,多是平级。这样的二叉树查找无异于全表扫描。*

1. *频繁更新的字段不要使用索引*

> *比如logincount登录次数,频繁变化导致索引也频繁变化,增大数据库工作量,降低效率。*

1. *字段不在where语句出现时。where后含IS NULL /IS NOT NULL/ like ‘%输入符%’等条件,不建议使用索引*

> *只有在where语句出现,mysql才会去使用索引*

*4) where 子句里对索引列使用不等于(<>),*

)

## 8.Redis Mq

1.什么业务场景下你会用redis/mq,这么用的好处是什么?

1.3.4 发布面试结果:

面试结束后,由主席和面试人员共同商议出面试通过的名单,然后以邮件的形式发送到通过同学的邮箱。没有通过的同学也要发邮件通知并加以鼓励。

纳新结束后,在纳新大群里发布结束信息。并鼓励相关同学。

1.4 考核项目:

最新一级的寒假纳新结束之后,安排考核项目。

考核项目的主要意义是给同学们一个实际开发实验室项目的机会。并体验后端项目的服务器部署,与前端,小程序端,安卓端等各个客户端联合调整的过程。

一般由主席设计,在纳新结束之后的第一周例会上发布。时间为一个月左右。

2.例会:

最好两周开一次例会.例会的主要工作是说一下实验室的最近事务,和请同学做技术分享.

以下是22级的例会调整:

关于分享会:

考虑到21级同学时间逐渐紧迫,路线差异大,宣讲会从上学期开始就变成21级同学单方向去给22级同学输出,然而这种方式不一定能够让22级同学学到知识,也不能提高22级同学的自驱力。 对于上一级学长的技术分享,一是内容选题不一定基础能够接受,有些分享较为敷衍难以让人从中学到知识(当然肯定是有优秀的知识分享),二是难以调动积极性,会有 这是21级学长学的,很难啊,或者是我现在还没到需要学习那些的时候 这种想法。而作为同级生的技术分享,能促进相互技术交流,并且内容更容易让22级同学接受,更能激发peer pressure,激发22级同学学习新技术。

还有一个问题就是后端大部分成员不怎么参与实验室日常事务进程,整体上较为松散也难以对实验室投入或有归属感,这种情况应该从22级开始得到改善,让后端各同学逐步参与到各种事务里,培养22级同学的责任感,不产生理所应当的想法:我不做总有人会做,从而事务积压在少数同学身上。而且也可以让22级同学提前熟悉实验室事务流程,未来担任主席时能够更轻松的度过新手期。

因此分享会和后端例会合并采用下面的方式:

1.每周/每两周例会,考试周不举办或两周一次

2.除了实验室的重要会议,要求全员与会。其他例会,22级五位同学轮流主持例会,主持者负责组织这次例会,包括协调安排例会举行时间,这次例会的事务说明,与技术分享。(主席应当提前把例会需要的日程/事务发送给会议主持人。提前说明清楚,并选择线上或线下参加会议,监督会议进程)

3.技术分享池,提前一周将自己要将的内容同步到分享池文档中。

3.项目:

给出进行项目开发的一般流程与部分注意事项,进行参考。

3.1 获取项目:

一般由实验室老师获取项目,然后由研究生负责人在chairman群里联系两位主席,给出项目基本的需求。

3.2 联系同学:

然后由主席负责联系同学,告知项目基本的情况,开发时间,项目难度等关键信息。

一定要确认好负责进行项目开发的同学的基本情况,比如最近忙不忙,后续有什么安排之类的,避免做到一半没有时间等问题的出现。

联系好同学后,建议项目群聊/拉同学进入相应的群聊。

3.3 获取需求:

找到甲方的产品,获取完整的需求文档,仔细阅读并在不理解需求的地方与甲方及时的进行沟通。

3.4 架构项目:

由项目的负责人进行项目的架构,进行项目架构,选择框架,确定要使用的技术栈和中间件时要考虑到可拓展性与成员的业务水平。

3.5 搭建项目:

项目架构完毕后,一般由项目负责人搭建基本的项目框架,主要包括两部分:代码框架和开发框架。

代码框架为具体业务开发的技术框架。

开发框架比如需要用到的数据库,中间件,gitlab/github仓库,自动化部署的相关工具等。

建议各种中间件统一配置在云端,便于调试和debug。

3.6 撰写项目文档:

文档主要包含三部分:服务端开发文档.客户端对接文档.服务端新人接入文档呢

3.6.1 服务端开发文档:

服务端开发文档主要给后端的开发同学使用。

主要可以参考电梯维保项目的第二阶段文档的架构,把项目文档分为五个部分:

1.账号和群组:

主要存放各种账号,以及各种交流群的群号。

2.参考文档:

主要存放各种原型图,以及甲方的产品对需求的讲解文档。

3.技术:

主要存放该项目遇到的技术问题,包括项目架构,项目使用的中间件,项目通用的工具类和方法,项目的代码提交和部署方式等。

4.规范:

主要存放项目的代码规范,包括分包,每一层的开发以及编码规范。分支的管理规范,会议的管理规范,以及其他可能存在的规范等。

5.进度管理:

主要包含两部分:一是项目的各个模块的ddl,而是建议以文档的形式把控项目进度。

6.bug池:

主要存放对接过程中出现的各种bug。

3.6.2 客户端对接文档:

pc端,安卓端,微信小程序端同学参看此文档,进行对接。

主要包括三部分。

1.接口文档:

方便客户端同学依照此文档进行对接。

2.各模块负责同学:

客户端对接过程中出现问题,知道该联系谁去处理,而不是直接去联系主席。

3.特殊接口的使用说明:

针对一些只靠接口文档无法说明情况的接口,在此处给出特殊的说明。

(后续可以考虑使用apifox等工具管理项目,届时更新文档以及相关说明)

3.6.3 新人接入文档:

项目开发过程中,总是会不可避免的发生新加入同学的情况。为了应对这种情况,项目负责人应编写新人接入文档。

新人接入文档主要包含项目的启动,测试以及关键的技术。属于服务端开发文档的略缩版。

3.7. 项目开发:

前期准备工作完成后,开始正式的项目开发工作。

项目负责人要时刻关注群里的消息和仓库的情况,确保不会因为某些流程而阻塞。

3.8 验收:

项目完成之后进行验收,相关文档的编写等工作。并留存项目的相关文件,脱敏之后上传至资料库。