账本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服务器端开发的更多相关文章

  1. 家庭版记账本app开发完成

    经过这几天关于android的相关学习,对于家庭版记账本app以及开发结束. 实现的功能为:用户的注册.登录.添加支出账单.添加收入账单.显示所有的该用户的账单情况(收入和支出).生产图表(直观的显示 ...

  2. 账本APP开发

    服务端开发 好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 前言 我平时喜欢用账 ...

  3. 安卓开发实战-记账本APP(六)

    记账本APP开发---终结篇 昨天的动态数字录屏奉上:在抖音上拍了一个(ps:欢迎点赞) https://v.douyin.com/poEjmG/ 今天将图表的内容进行了制作,我用的是MPChart的 ...

  4. 简单记账本APP开发一

    在对Android的一些基础的知识有了一定了解,以及对于AndroidStudio的如何使用有了 一定的熟悉后,决定做一个简单的记账本APP 开发流程 1.记账本的页面 2.可以添加新的账目 (一)页 ...

  5. APICloud:轻松6步完成App软件开发

    现如今,谁不知道App绝对就是OUT,谁不用App简直没法过日子!但是说到App软件开发,不懂编程,不懂技术的人就一脸懵圈.在门外汉来看,App软件开发是一件非常困难的事情,然而APICloud却说, ...

  6. 小账本APP——软件项目风险管理及解决办法案例

    小账本APP——软件项目风险管理及解决办法案例 摘要 软件项目风险是指在软件开发过程中遇到的预算和进度等方面的问题以及这些问题对软件项目的影响.软件项目风险会影响项目计划的实现,如果项目风险变成现实, ...

  7. 认识Web前端、Web后端、桌面app和移动app新开发模式 - 基于Node.js环境和VS Code工具

    认识Web.桌面和移动app新开发模式 - 基于Node.js环境和VS Code工具 一.开发环境的搭建(基于win10) 1.安装node.js和npm 到node.js官网下载安装包(包含npm ...

  8. 浅谈App原生开发、混合开发及HTML5开发的优劣

    App混合开发(英文名:Hybrid App),是指在开发一款App产品的时候为了提高效率.节省成本即利用了原生的开发技术还应用了HTML5开发技术,是原生和HTML5技术的混合应用.目前App的开发 ...

  9. Dcloud课程4 如何进行APP接口开发

    Dcloud课程4 如何进行APP接口开发 一.总结 一句话总结:通过json或者xml. 1.APP如何进行通信? 通过在地址上接参数指明传递的数据的类型.而数据传递的类型一般是XML和json. ...

随机推荐

  1. CF796C Bank Hacking 题解

    洛谷链接 题目 Although Inzane successfully found his beloved bone, Zane, his owner, has yet to return. To ...

  2. 洛谷P2566 [SCOI2009]围豆豆(状压dp+spfa)

    题目传送门 题解 Σ(っ °Д °;)っ 前置知识 射线法:从一点向右(其实哪边都行)水平引一条射线,若射线与路径的交点为偶数,则点不被包含,若为奇数,则被包含.(但注意存在射线与路径重合的情况) 这 ...

  3. 使用@AutoConfigureBefore调整配置顺序竟没生效?

    一个人的价值体现在能够帮助多少人.自己编码好,价值能得到很好的体现.若你做出来的东西能够帮助别人开发,大大减少开发的时间,那就功德无量. 作者:A哥(YourBatman) 公众号:BAT的乌托邦(I ...

  4. Azure Web App (一)发布你的Net Core Web 项目

    一,引言 今天我们看一下Azure上的一个服务-----Web 应用,我们都知道云计算的三大模式:Iaas(基础设施即服务),Paas(平台即服务),Saas(软件即服务). Iass,其实就是虚拟主 ...

  5. CentOS7.7 安装并配置JDK 1.8

    本文介绍如何在CentOS中安装oracleJDK1.8并配置环境变量 1.下载并安装jdk1.8 进入下载页:https://www.oracle.com/technetwork/java/java ...

  6. Docker装的Oracle 11g没有HR用户怎么办?一个脚本解决问题!

    #0x0 问题描述 这个学期有一门Oracle的课,我图省事就直接拉了个docker镜像来做练习,一直倒也没啥问题,但是今天的作业需要用到HR这个模板用户. 然而我执行alter user hr ac ...

  7. spring-boot 应用 报错 No qualifying bean of type XXXXX.***Mapper

    报错类型 NoSuchBeanDefinitionException.No qualifying bean of type  XXXXX.***Mapper 报错信息详情 Caused by: org ...

  8. javascript知识梳理之数据类型

    javascript基础知识(在javascript中 = 是赋值符号) 变量 合法的变量命名规则:大小写英文.数字. $ 和 _ 的组合,且不能用数字开头. var a; //声明变量 var s ...

  9. python 爬虫写入txt:UnicodeEncodeError: ‘gbk’ codec can’t encode character 错误的解决办法

    原链接:https://blog.csdn.net/vito21/article/details/53490435 今天爬一个网站的内容,在写入TXT文件时,某些页面总是报UnicodeEncodeE ...

  10. java 面向对象(十八):包装类的使用

    1.为什么要有包装类(或封装类)为了使基本数据类型的变量具有类的特征,引入包装类. 2.基本数据类型与对应的包装类: 3.需要掌握的类型间的转换:(基本数据类型.包装类.String) 简易版:基本数 ...