我的物品App的功能点和实现方案
1、添加房间
- 创建一个房间表,房间表里有房间id、房间名称、用户id和一些其他字段
- 编写sql语句添加房间信息(insert into ~ values(?,?,?))
- 后端服务器接收并验证房间信息的有效性,包括字段是否为空、是否符合要求等。
- 如果验证通过,后端服务器将房间信息存储到数据库中。
2、添加分类
- 创建一个分类表,分类表里有分类id,房间id、用户id、分类名称和一些其他字段
- 编写sql语句添加房间信息(insert into ~ values(?,?,?))
- 后端服务器接收并验证房间信息的有效性,包括字段是否为空、是否符合要求等。
- 如果验证通过,后端服务器将房间信息存储到数据库中。
3、添加物品
- 创建一个物品表,物品表里有物品id、分类id,房间id、用户id、物品名称、图片的路径和一些其他字段(使用外键关联其他表的主键)
- 编写sql语句添加房间信息(INSERT INTO ~ VALUES(?,?,?))
- 后端服务器接收并验证房间信息的有效性,包括字段是否为空、是否符合要求等。
- 如果验证通过,后端服务器将房间信息存储到数据库中。
4、物品的删除
- 根据物品的id删除物品表对应的物品数据
- 使用合适的SQL语句,如 DELETE FROM items WHERE id = ?,其中
items
是物品表的名称,id
是物品的唯一标识符列 - 客户端要提醒用户是否确认删除
5、查询全部物品,查询有物品的房间和房间里所对应的物品
- 查询全部物品:
- 编写SQL查询语句,例如:SELECT * FROM items,用于查询全部物品信息。
- 在后端,执行该SQL语句并获取物品的结果集。
- 查询有物品的房间:
- 编写SQL查询语句,例如:SELECT DISTINCT r.room_id, r.room_number FROM items i JOIN rooms r ON i.room_id = r.room_id,用于查询存在物品的房间信息。
- 查询房间对应的物品
- 编写SQL查询语句,例如:SELECT * FROM items i JOIN rooms r ON i.room_id = r.room_id,用于查询全部物品信息。
6、修改房间名称
- 首先需要验证用户是否完成登录
- 如果已经登录,可根据客户端存储的用户id和房间id查找房间信息进行修改
- 如果未登录,返回登录页面,完成登录后进行操作。
7、更新分类名称
- 首先需要验证用户是否完成登录
- 如果已经登录,可根据服务器存储的用户id、房间id和分类id查找到分类信息进行修改
- 如果未登录,返回登录页面,完成登录后进行操作。
8、添加标签(房间标签,分类标签)
- 创建一个标签表,标签表里有标签id、房间id(可为空)、分类id(可为空)和标签内容等
- 编写sql语句添加房间信息(insert into ~ values(?,?,?))
- 后端服务器接收并验证房间信息或分类信息的有效性,包括字段是否为空、是否符合要求等。
- 如果验证通过,后端服务器将房间信息存储到数据库中。
9、修改标签内容
- 首先需要验证用户是否完成登录
- 如果已经登录,可根据客户端存储的用户id和标签id查找标签信息进行修改
- 如果未登录,返回登录页面,完成登录后进行操作。
10、修改内容的回显(即根据id查询要修改的数据)
11、文件的上传和下载(在这个app中主要是图片的上传和下载)
文件上传:
- 前端界面设计:
- 在用户界面上提供一个文件上传控件,允许用户选择要上传的文件。
- 后端处理:
- 当用户选择文件并触发上传操作时,前端将文件发送到后端服务器。
- 后端服务器接收到文件后,将文件保存到指定的位置或存储系统中。
- 可以为上传的文件生成唯一的文件名,以避免重名冲突,并记录文件的相关信息(如文件名、路径、大小等)。
文件下载:
- 前端界面设计:
- 在用户界面上提供一个下载按钮或链接,允许用户点击进行文件下载操作。
- 后端处理:
- 当用户触发下载操作时,前端向后端服务器发送下载请求,包含要下载的文件的标识或其他必要的信息。
- 后端服务器根据请求的信息,检索文件并将文件发送回前端。
- 设置适当的HTTP响应头,如Content-Disposition头,以指定下载文件的名称和类型。
我之前写过的文件上传和下载示例:
/**
* 文件上传
* @param file
* @return
*/
@PostMapping("/upload")
public R<String> upload(MultipartFile file){
//file是一个临时文件,需要转存到指定位置,否则本次请求后临时文件会删除
log.info(file.toString());
//原始文件名
String originalFilename = file.getOriginalFilename();
//获取文件后缀
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
//使用UUID重新生成文件名,防止文件名重复造成文件覆盖
String fileName = UUID.randomUUID().toString() + suffix;
//创建一个目录对象
File dir = new File(basePath);
//判断是否存在该目录,没有则创建
if (!dir.exists()){
dir.mkdirs();
}
try {
//将临时文件转存到指定位置
file.transferTo(new File(basePath + fileName));
} catch (IOException e) {
e.printStackTrace();
}
return R.success(fileName);
}
/**
* 文件下载
* @param name
* @param response
*/
@GetMapping("/download")
public void download(String name, HttpServletResponse response){
try {
//输入流,通过输入流读取文件内容
FileInputStream fileInputStream = new FileInputStream(new File(basePath + name));
//输出流,通过输出流将文件写回浏览器
ServletOutputStream outputStream = response.getOutputStream();
response.setContentType("image/jpeg");
int len = 0;
byte[] bytes = new byte[1024];
while ((len = fileInputStream.read(bytes)) != -1){
outputStream.write(bytes,0,len);
outputStream.flush();
}
//关闭资源
outputStream.close();
fileInputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
12、用户的登录与注册功能
- 创建一个用户表,用户表里有用户id、账号和密码,还有一些其他信息字段
- 用户注册:
- 提供用户注册界面,包含用户名、密码和其他必要的个人信息字段。
- 用户填写注册信息后,将信息发送到后端服务器进行处理。
- 后端服务器验证用户名是否唯一并进行数据有效性检查。
- 如果验证通过,将用户信息存储在数据库中,并返回注册成功的消息给用户。
- 用户登录:
- 提供用户登录界面,包含用户名和密码输入框。(我这里使用的是微信注册登录)
- 用户输入用户名和密码后,将信息发送到后端服务器进行验证。
- 后端服务器检查用户名和密码是否匹配数据库中的记录。
- 如果验证通过,生成一个加密的用户令牌(Token)并返回给客户端。
- 客户端保存用户令牌,以便后续请求的认证和授权。
- 用户信息要进行加密处理
13、用户信息的修改
- 首先需要验证用户是否完成登录
- 如果已经登录,可根据服务器存储的用户id查找用户信息进行修改
- 如果未登录,返回登录页面,完成登录后进行操作。
14、用户退出功能
- 前端界面设计:
- 在用户界面上提供退出按钮或链接,以便用户点击退出操作。
- 后端处理:
- 当用户点击退出按钮时,前端向后端发送请求通知用户退出。
- 后端服务器将用户的会话状态标记为已注销或无效。
- 清除会话信息:
- 后端服务器应清除与该用户相关的会话信息,包括用户令牌、会话Cookie等。
- 这样做可以确保用户在退出后无法再通过之前的会话继续访问系统。
15、物品的排序功能
- 查出所有的物品信息
- 使用MyBatis中
<if>
标签来实现条件判断和动态SQL的生成,动态添加order by后的排序条件
16、支付功能
没有具体实现过,因为申请支付要使用企业号和经过审核。