账本APP服务器端开发
好好学习,天天向上
本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航
上一篇文章我们聊了账本APP客户端的开发,这篇文章就来聊一聊服务器端的开发。服务端核心功能就两个,一个是将客户端传过来的数据保存到数据库中,数据库我选择的是MySQL;还有一个功能就是从数据库中查询出指定用户的所有记录传回客户端。这篇文章主要就是来说一下这两个功能,用户注册和登录的功能我就不说了,比较简单,大家可以看一下我的源码,点击即可查看
一、环境搭建
整个项目是基于SpringBoot的,所以配置什么的比较简单,我就不多说了。先来说一下我的数据库表的设计,一共有两张表,一张是user表用于存储用户的信息;还有一张是record表,用于存放所有的记录。
持久层的框架我选择的是MyBatis,所以需要在pom.xml中添加MyBatis所需的依赖。和数据库交互有关的有三个,一个是MyBatis的起步依赖,还有一个是MySQL的连接驱动,最后一个是MyBatis数据库字段类型映射,没有第三个的话存储Date会报错。
<dependencies>
…………
<!--mybatis起步依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<!-- MySQL连接驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.5</version>
</dependency>
<!-- mybatis数据库字段类型映射 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-typehandlers-jsr310</artifactId>
<version>1.0.1</version>
</dependency>
…………
</dependencies>
准备工作做完了就来看一下功能的实现吧。
二、功能实现
1.上传功能的实现
1.1 Controller层
@RequestMapping("/uploadRecords")
public ResultInfo<String> uploadRecords(String phoneNumber , String recordsJson) {
ResultInfo<String> resultInfo = null;
List<Record> records = JSONArray.parseArray(recordsJson , Record.class);
try {
resultInfo = recordService.uploadRecords(phoneNumber,records);
} catch (Exception e) {
e.printStackTrace();
resultInfo = new ResultInfo<>();
resultInfo.setFlag(false);
resultInfo.setErrorMsg("内部错误");
}
return resultInfo;
}
控制层接收两个参数,一个是phoneNumber,作为判断是哪个用户传来的数据,还有一个是List的json字符串。在客户端上传的时候我将List转换成了json,所以首先需要把Json再变成List,然后调用recordService.uploadRecords方法将List传进去。
1.2 Service层
@Override
public ResultInfo<String> uploadRecords(String phoneNumber, List<Record> records) throws Exception {
for (Record record : records) {
int status = record.getStatus();
if (status == 1) { //添加数据
System.out.println(record.toString());
recordMapper.addRecord(phoneNumber, record);
} else if (status == 2) { //删除数据
recordMapper.deleteRecord(record.getUuid());
} else if (status == 3) { //修改数据
recordMapper.upgradeRecord(record);
}
}
//如果在上面代码中出现了异常下面的代码就不会执行,直接将异常抛给Controller层处理
ResultInfo<String> resultInfo = new ResultInfo<>();
resultInfo.setFlag(true);
resultInfo.setData("同步成功");
return resultInfo;
}
在Service层,遍历传进来的List,根据status的值去选择合适的操作,是添加、删除还是修改数据,然后去调用dao层相应的方法。再来看看Dao层具体都干了什么吧。
1.3 Dao层
/**
* 添加一条记录
* @param phoneNumber
* @param record
* @throws Exception
*/
@Insert("insert into record(id,phoneNumber,category,content,money,status,date) " +
"values (#{record.uuid},#{phoneNumber},#{record.category},#{record.content},#{record.money},0,#{record.date})")
void addRecord(@Param("phoneNumber") String phoneNumber,@Param("record") Record record) throws Exception;
/**
* 删除指定的记录
* @param recordId
* @throws Exception
*/
@Delete("DELETE FROM record WHERE id = #{recordId}")
void deleteRecord(@Param("recordId")String recordId) throws Exception;
/**
* 修改服务器中的记录
* @param record
* @throws Exception
*/
@Update("UPDATE record SET category=#{category},content=#{content},money=#{money},status=#{status},date=#{dateString} WHERE id = #{uuid}")
void upgradeRecord(Record record) throws Exception;
很简单,我们只要编写对应的SQL语句就可以实现数据的增删改了,其它的操作都由MyBatis帮我们完成了。
说完了上传数据的实现,接下来就来看看下载数据是怎么实现的吧。
2.下载功能的实现
2.1 Controller层
@RequestMapping("/downloadRecords")
public ResultInfo<List<Record>> downloadRecords(String phoneNumber) {
ResultInfo<List<Record>> resultInfo = null;
try {
resultInfo = recordService.downloadRecords(phoneNumber);
} catch (Exception e) {
e.printStackTrace();
resultInfo = new ResultInfo<>();
resultInfo.setFlag(false);
resultInfo.setErrorMsg("内部错误");
}
return resultInfo;
}
Controller层的代码很简单,就是接收一个phoneNumber参数用于判断是哪个用户发来的请求,再调用 recordService.downloadRecords(phoneNumber)方法将phoneNumber传进去,然后九来到了Service层。
2.2 Service层
@Override
public ResultInfo<List<Record>> downloadRecords(String phoneNumber) throws Exception {
List<Record> records = recordMapper.findAllByPhoneNumber(phoneNumber);
//如果在上面代码中出现了异常下面的代码就不会执行,直接将异常抛给Controller层处理
ResultInfo<List<Record>> resultInfo = new ResultInfo<>();
resultInfo.setFlag(true);
resultInfo.setData(records);
return resultInfo;
}
在Service层中也很简单,就是调用recordMapper.findAllByPhoneNumber(phoneNumber)方法拿到查询出来的List集合。
2.3 Dao层
/**
* 根据手机号码查询该用户下所有的信息
* @param phoneNumber
* @throws Exception
* @return
*/
@Select("SELECT * FROM record WHERE phoneNumber = #{phoneNumber}")
@Results({
@Result(property = "uuid",column = "id",id = true),
@Result(property = "category",column = "category"),
@Result(property = "content",column = "content"),
@Result(property = "money",column = "money"),
@Result(property = "status",column = "status"),
@Result(property = "date",column = "date")
})
List<Record> findAllByPhoneNumber(String phoneNumber) throws Exception;
数据库中的record的id字段对应了Record类中的uuid属性,为什么直接id对应id呢?原因我上篇文章也说过了,就是客户端的SQLite中id只能是int型的,所以用加了个uuid属性。
总结
服务器端并没有什么复杂的功能,就是一些简单的CRUD,我相信大家跟着我文章的思路就可以捋清楚我的代码了。
账本APP服务器端开发的更多相关文章
- 家庭版记账本app开发完成
经过这几天关于android的相关学习,对于家庭版记账本app以及开发结束. 实现的功能为:用户的注册.登录.添加支出账单.添加收入账单.显示所有的该用户的账单情况(收入和支出).生产图表(直观的显示 ...
- 账本APP开发
服务端开发 好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 前言 我平时喜欢用账 ...
- 安卓开发实战-记账本APP(六)
记账本APP开发---终结篇 昨天的动态数字录屏奉上:在抖音上拍了一个(ps:欢迎点赞) https://v.douyin.com/poEjmG/ 今天将图表的内容进行了制作,我用的是MPChart的 ...
- 简单记账本APP开发一
在对Android的一些基础的知识有了一定了解,以及对于AndroidStudio的如何使用有了 一定的熟悉后,决定做一个简单的记账本APP 开发流程 1.记账本的页面 2.可以添加新的账目 (一)页 ...
- APICloud:轻松6步完成App软件开发
现如今,谁不知道App绝对就是OUT,谁不用App简直没法过日子!但是说到App软件开发,不懂编程,不懂技术的人就一脸懵圈.在门外汉来看,App软件开发是一件非常困难的事情,然而APICloud却说, ...
- 小账本APP——软件项目风险管理及解决办法案例
小账本APP——软件项目风险管理及解决办法案例 摘要 软件项目风险是指在软件开发过程中遇到的预算和进度等方面的问题以及这些问题对软件项目的影响.软件项目风险会影响项目计划的实现,如果项目风险变成现实, ...
- 认识Web前端、Web后端、桌面app和移动app新开发模式 - 基于Node.js环境和VS Code工具
认识Web.桌面和移动app新开发模式 - 基于Node.js环境和VS Code工具 一.开发环境的搭建(基于win10) 1.安装node.js和npm 到node.js官网下载安装包(包含npm ...
- 浅谈App原生开发、混合开发及HTML5开发的优劣
App混合开发(英文名:Hybrid App),是指在开发一款App产品的时候为了提高效率.节省成本即利用了原生的开发技术还应用了HTML5开发技术,是原生和HTML5技术的混合应用.目前App的开发 ...
- Dcloud课程4 如何进行APP接口开发
Dcloud课程4 如何进行APP接口开发 一.总结 一句话总结:通过json或者xml. 1.APP如何进行通信? 通过在地址上接参数指明传递的数据的类型.而数据传递的类型一般是XML和json. ...
随机推荐
- SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 后端篇(五): 数据表设计、使用 jwt、redis、sms 工具类完善注册登录逻辑
(1) 相关博文地址: SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(一):搭建基本环境:https://www.cnblogs.com/l-y-h/p ...
- 邓布利多拍了拍你,并递来一份CSS魔法
校长:阿不思·邓布bai利多 亲爱的少年:我们愉快地通知您,您已获准在CSS魔法学校就读.特此带给你一份CSS魔法秘籍,代码简单,支持个性化定制.学期定于今日开始,我们将在此静候您的猫头鹰带来您的回信 ...
- C++输出三角图形
输出像这样的三角图形 3 1 1 1 1 1 1 1 1 1 1 1 1 ...
- Rust String(官方文档翻译)
学习Rust,官方文档全英文,查询不太方便,索性直接翻译完,方便查询使用.有需要自由转载,本人英文水平有限,文档是在谷歌翻译的基础上加个人理解完成,不敢保证正确.文档翻译错误的地方欢迎指出: 原文地址 ...
- Oracle表的基本查询
Oracle 分页 1.rownum分页 Select * from emp; Select a1.*,rownum rn from (Select * from emp) a1; 2.显示rownu ...
- mysql 漏洞利用与提权
判断MySQL服务运行的权限 1.查看系统账号,如果出现MySQL这类用户,意味着系统可能出现了降权. 2.看mysqld运行的priority值. 3.查看端口是否可外联. MySQL密码获取与破解 ...
- java 面向对象(二十七):注解的使用
1. 注解的理解① jdk 5.0 新增的功能*② Annotation 其实就是代码里的特殊标记, 这些标记可以在编译, 类加载, 运行时被读取, 并执行相应的处理.通过使用 Annotation, ...
- Dynamics CRM Audit Performance Troubleshooting
记一次Dynamics CRM Audit 查询失败的问题. 客户环境现象:由于业务逻辑需要使用RetrieveAuditDetailRequest API查询相关Record的详细更改信息.但查询过 ...
- T2 监考老师 题解
第二题,他并不是多难的算法.甚至连搜索都不用,他的题目要求和数据断定了他第二题的地位. 在一个大试场里,有 n 行 m 列的考生,小王和众多同学正在考试,这时,有一部分考生 作弊,当然,监考老师能发现 ...
- T133308 57级返校测试重测-T3-成绩单
大致题意: 给定n个学生的学号和分数, 求各个分数段的人数, 求把学号排序后的序列, 求满分的人数以及学号. 基本思路: 虽然看起来很繁琐(?),但就非常非常的简单,直接按题意做就好了. 然后有个坑, ...