1.搭建环境
2.common
Account
public class Account implements Serializable {
private Long id;
private String cardno;
private String password;
private Double balance;
private Long status;
Record
public class Record implements Serializable {
private long id;
private String cardno;
private String transactiondate;
private double expense;
private double income;
private double balance;
private String transactiontype;
private String remark;
private String starttime;
private String endtime;
AccountService
public interface AccountService {
//1.登录
Map<String,Object> login(Account account);
//2.根据卡号查询余额
Double findBalance(Account account);
//3.修改密码
String updatePWd(Account account);
}
RecordService
public interface RecordService {
//1.转账
String transferAccounts(String currentCardNo,String targetCardNo,Double money);
//2.分页查询
PageInfo<Map<String,Object>> showPage(Integer pageno, Record record);
}
3.provider结构
AccountMapper
public interface AccountMapper {
//1.查询账号详情:根据卡号查,根据卡号密码查,根据卡号查余额
Account findAccountInfo(Account account);
//2.修改密码
@Update("update account set password=#{password} where cardno#{cardno}")
int updatePassword(Account account);
//3.修改账号余额
@Update("update account set balance=#{balance} where cardno#{cardno}")
int updateBalance(Account account);
}
RecordMapper
public interface RecordMapper {
//1.添加转出的交易记录
@Insert("insert into record(cardno,transactiondate,expense,income,balance,transactiontype) values(#{cardno},now(),#{expense},0.0,#{balance},'转出')")
int addExpenseRecord(Record record);
//2.添加转入的交易记录
@Insert("insert into record(cardno,transactiondate,expense,income,balance,transactiontype) values(#{cardno},now(),#{income},0.0,#{balance},'转入')")
int addIncomeRecord(Record record);
//3.根据交易日期分页查询,按照日期升序排列
List<Map<String,Object>> showData(Record record);
}
AccountServiceImpl
@Service
@Transactional
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountMapper accountMapper;
//登录
@Override
public Map<String, Object> login(Account account) {
Map<String, Object> map = new HashMap<String, Object>();
//根据卡号查询
Account loginuser = accountMapper.findAccountInfo(account);
//判断卡号是否存在
if (loginuser == null) {
map.put("msg", "登录失败,你输入卡号不存在!");
return map;
}
if(loginuser!=null){
//判断密码是否正确
if (!loginuser.getPassword().equals(account.getPassword())){
map.put("msg","登录失败,您输入的密码不正确!");
return map;
}
//判断账号是否被冻结
if (loginuser.getStatus()==0){
map.put("msg","登录失败,您的账号已冻结!");
return map;
}
}
//登录成功
map.put("loginuser",loginuser);
return map;
}
//查询余额
@Override
public Double findBalance(Account account) {
//根据卡号查询
return accountMapper.findAccountInfo(account).getBalance();
}
//修改密码
@Override
public String updatePWd(Account account) {
String pwd = accountMapper.findAccountInfo(account).getPassword();
if (!pwd.equals(account.getPassword())){
return "旧密码输入错误!";
}
//修改
accountMapper.updatePassword(account);
return "success";
}
}
RecordServiceImpl
public class RecordServiceImpl implements RecordService {
@Autowired
private RecordMapper recordMapper;
@Autowired
private AccountMapper accountMapper;
//转账
public String transferAccounts(String currentCardNo, String targetCardNo, Double money) {
//查询目标账号
Account targetAccount=accountMapper.findAccountInfo(new Account(targetCardNo,null,null));
//判断目标卡号是否存在
if(targetAccount==null){
return "转账失败,目标账号不存在!";
}
//判断目标账号是否冻结
if (targetAccount!=null && targetAccount.getStatus()==0){
return "转账失败,目标账号已冻结";
}
//查询当前账号
Account currentAccount=accountMapper.findAccountInfo(new Account(currentCardNo,null,null));
//判断当前账号余额是否 >= 转账金额
if (currentAccount!=null){
if (currentAccount.getBalance()<money){
return "转账失败,转出账号余额不足!";
}
}
//当前账号余额减少
currentAccount.setBalance(currentAccount.getBalance()-money);
accountMapper.updateBalance(targetAccount);
//目标账号余额增加
targetAccount.setBalance(targetAccount.getBalance()+money);
accountMapper.updateBalance(targetAccount);
//当前账号转出交易记录
Record currentAccountRecord=new Record(currentCardNo,money,null,currentAccount.getBalance());
recordMapper.addExpenseRecord(currentAccountRecord);
//目标账号转入交易记录
Record targetAccountRecord=new Record(targetCardNo,null,money,targetAccount.getBalance());
recordMapper.addIncomeRecord(targetAccountRecord);
return "success";
}
//分页
@Override
public PageInfo<Map<String, Object>> showPage(Integer pageno, Record record) {
PageHelper.startPage(pageno,3);
List<Map<String,Object>> list=recordMapper.showData(record);
return new PageInfo<Map<String,Object>>(list);
}
}
ProviderApplication
@MapperScan("cn.kgc.mapper")
@ImportResource("classpath:spring-provider.xml")
resource>mapper
AccountMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.kgc.mapper.AccountMapper">
<select id="findAccountInfo" resultType="Account" parameterType="Account">
SELECT * FROM account WHERE cardno=#{cardno}
<if test="password!=null">
AND password=#{password}
</if>
</select>
</mapper>
RecordMapper.xml
<mapper namespace="cn.kgc.mapper.RecordMapper">
<select id="showData" parameterType="Record" resultType="map">
SELECT * from record WHERE cardno=#{cardno}
<if test="starttime!=null and endtime!=nulll">
AND transactiondate BETWEEN #{starttime} AND #{endtime}
</if>
ORDER BY transactiondate ASC
</select>
</mapper>
application.properties
server.port=9090
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/bankonline
spring.datasource.username=root
spring.datasource.password=123.
mybatis.type-aliases-package=cn.kgc.vo
mybatis.mapper-locations=mapper/*.xml
pagehelper.helper-dialect=mysql
spring-provider.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="myprovider" />
<!-- 使用zookeeper注册中心暴露服务地址,我的zookeeper是架在本地的 -->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" timeout="60000"/>
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 用户服务接口 -->
<dubbo:service interface="cn.kgc.service.AccountService" ref="accountService"/>
<bean id="accountService" class="cn.kgc.service.AccountServiceImpl"/>
<dubbo:service interface="cn.kgc.service.RecordService" ref="recordService"/>
<bean id="recordService" class="cn.kgc.service.RecordServiceImpl"/>
</beans>
4.consumer
CenterController
@RestController
public class CenterController {
@Autowired
private AccountService accountService;
@Autowired
private RecordService recordService;
//登录
@RequestMapping("/login.do")
public Map<String,Object> login(Account account){
return accountService.login(account);
}
//查询余额
@RequestMapping("/balance.do")
public Double findBalance(Account account){
return accountService.findBalance(account);
}
//修改密码
@RequestMapping("/pwd.do")
public String updatePWd(Account account){
return accountService.updatePWd(account);
}
//转账
@RequestMapping("/ta.do")
public String transferAccounts(String currentCardNo,String targetCardNo,Double money){
return recordService.transferAccounts(currentCardNo,targetCardNo,money);
}
//分页
@RequestMapping("/page.do")
public PageInfo<Map<String,Object>> showPage(Integer pageno, Record record){
return recordService.showPage(pageno,record);
}
}
ConsumerApplication
@ImportResource("classpath:spring-consumer.xml")
rvice.transferAccounts(currentCardNo,targetCardNo,money);
}
//分页
@RequestMapping("/page.do")
public PageInfo<Map<String,Object>> showPage(Integer pageno, Record record){
return recordService.showPage(pageno,record);
}
}
ConsumerApplication
```java
@ImportResource("classpath:spring-consumer.xml")