账本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. POI2014 FAR-FarmCraft

    [Farm Craft] [题目描述] mhy住在一棵有n个点的树的1号结点上,每个结点上都有一个妹子. mhy从自己家出发,去给每一个妹子都送一台电脑,每个妹子拿到电脑后就会开始安装zhx牌杀毒软件 ...

  2. HDU - 5970 题解

    题目链接 HDU - 5970 分析 很显然\(f(x,y)\)与\(f(x+y*k,y)\)的结果相同,因为它们在第一次取模后会变成相同的式子 我们再看一下数据的范围,突破口肯定在\(m\)那里 那 ...

  3. 底层剖析 Window 、Activity、 View 三者关系

    不管工作几年的 Android 工程师,或多或少都听说过 Window 的概念,并且隐隐约约感觉它在 Activity 与 View 之间应该发挥着某种连接的作用.但是如果需要说出这 3 者之间的关系 ...

  4. day58 作业

    目录 一.做一个图书管理系统页面 二.做一个主页模版 三.点赞 一.做一个图书管理系统页面 <!DOCTYPE html> <html lang="en"> ...

  5. shell专题(七):流程控制(重点)

    7.1 if 判断 1.基本语法 if [ 条件判断式 ];then 程序 fi 或者 if [ 条件判断式 ] then 程序 fi 注意事项: (1)[ 条件判断式 ],中括号和条件判断式之间必须 ...

  6. 数据可视化之powerBI入门(八)PowerQuery学习:认识M函数

    https://zhuanlan.zhihu.com/p/64148928 前面我们学习PQ的时候都是用鼠标操作,虽然通过这些操作能完成大部分的数据处理,但是毕竟还有些复杂的工作是处理不了的,如果想彻 ...

  7. 数据源管理 | 搜索引擎框架,ElasticSearch集群模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.集群环境搭建 1.环境概览 ES版本6.3.2,集群名称esmaster,虚拟机centos7. 服务群 角色划分 说明 en-maste ...

  8. 使用 forever 启动 vue 需要注意的问题

    forever 是 nodejs 生态中一个用来永久挂起一个应用(当这个应用崩溃时能自己重启)的应用(库). 但用他启动vue的时候必须注意一个问题: 在哪个路径启动vue,就在哪个路径启动forev ...

  9. C++语法小记---前置操作符和后置操作符

    前置操作符和后置操作符 单独的"++i"和"i++"是否有区别 对于基本类型: 二者没有区别,因为编译器会对代码进行优化,二者的汇编代码完全相同 对于类类型: ...

  10. JS闭包应用场景之函数回调(含函数的调用个人理解)

    首先我们来绑定一个函数给click事件,这个很好理解,就是创建一个匿名函数作为回调绑定给click事件,如下: 但如果我们想声明一个函数作为回调来绑定多个元素呢,例如下面(注意:绑定事件后不用加括号, ...