前言介绍
家庭理财记账系统主要是为了提高用户的工作效率和更方便快捷的满足用户,更好存储所有数据信息及快速方便的检索功能,对家庭理财记账系统的各个模块是通过许多今天的发达家庭理财记账系统做出合理的分析来确定考虑用户的可操作性,遵循开发的系统优化的原则,经过全面的调查和研究。
家庭理财记账系统所要实现的功能分析,对于现在网络方便,家庭理财记账系统要实现管理员、用户可以直接在平台上进行查看自己所需数据信息,这样既能节省管理的时间,不用再像传统的方式,如果用户想要进行交流信息,必须双方见面进行沟通交流所需的信息,由于很多用户时间的原因,没有办法进行见面沟通交流,真的很难满足用户的各种需求。所以家庭理财记账系统的开发不仅仅是能满足用户的需求,还能提高用户的使用率。所以系统管理必须要更快捷、有效、长期地为用户或潜在用户传递信息。建立一个家庭理财记账系统更好的交流平台,提高系统对用户交流后的信息服务的效率。此系统可以满足大多数用户所提出的问题,用户可以根据自身的需求获取相应的服务,为系统管理提供了快捷的途径。
家庭理财记账系统用户端要求在浏览器上可以运行,主要实现了管理端;首页、个人中心、用户管理、家庭账户管理、收入分类管理、支出分类信息管理、家庭收入管理、家庭支出管理、银行储蓄管理、系统管理、投资理财管理,用户端;首页、家庭账户管理、收入分类管理、银行储蓄管理、投资理财管理等主要功能模块的操作和管理。
系统结构图
数据库设计表
此系统需要后台数据库,下面介绍数据库中的各个表的详细信息。
表1:gonggao表
列名 | 数据类型 | 长度 | 约束 |
id | bigint | 19 | NOT NULL |
addtime | varchar | 2000 | NULL DEFAULT |
gonggaobianhao | tinyint | 2 | NULL DEFAULT |
biaoti | varchar | 2 | NOT NULL |
xiangguantupian | varchar | 2 | NOT NULL |
gonggaoneirong | varchar | 2 | NOT NULL |
faburiqi | varchar | 2 | NOT NULL |
表2:licai表
列名 | 数据类型 | 长度 | 约束 |
id | int | 11 | NOT NULL |
addtime | varchar | 255 | NOT NULL |
licaihaoma | varchar | 255 | NOT NULL |
licaimingcheng | varchar | 2 | NOT NULL |
licaijianjie | varchar | 2 | NOT NULL |
xiangguantupian | varchar | 2 | NOT NULL |
licaileixing | varchar | 2 | NOT NULL |
fuzeren | varchar | 2 | NOT NULL |
suoshugongsi | varchar | 2 | NOT NULL |
yujinianshouyi | varchar | 2 | NOT NULL |
faburiqi | varchar | 2 | NOT NULL |
表3:liushuixinxi表
列名 | 数据类型 | 长度 | 约束 |
id | int | 9 | NOT NULL |
addtime | char | 5 | NOT NULL |
xiangmubianhao | char | 5 | NOT NULL |
xiaofeimingcheng | char | 5 | NOT NULL |
xiaofeijine | char | 5 | NOT NULL |
xiaofeiriqi | char | 5 | NOT NULL |
gerenzhanghao | char | 5 | NOT NULL |
xingming | char | 5 | NOT NULL |
xiangpian | char | 5 | NOT NULL |
表4:mubiaojihua表
列名 | 数据类型 | 长度 | 约束 |
id | int | 9 | NOT NULL |
addtime | char | 5 | NOT NULL |
jihuabianhao | char | 5 | NOT NULL |
jihuamingcheng | char | 5 | NOT NULL |
shouyifenlei | char | 5 | NOT NULL |
shouyijine | char | 5 | NOT NULL |
gerenzhanghao | char | 5 | NOT NULL |
xingming | char | 5 | NOT NULL |
xiangpian | char | 5 | NOT NULL |
dengjiriqi | char | 5 | NOT NULL |
系统详细设计
本系统使用了java和mysql结合的结构开发了家庭理财记账系统应用,系统中所有和数据库有关系的操作都通过一个通用类来实现,大大提高了代码的耦合性,当数据库类型等信息变化后直接修改类文件就可以了,不再需要每个页面都修改。另外本系统解决了中文的问题,也是在配置文件中添加了编码方式的形式解决的,本系统另外一个大的特点是系统对数据库的操作都单独的写在了一个类里,这样对系统的所有数据库操作都只访问这个类就可以了,不要每个页面都去写数据库的操作,提高了系统的集成性。
用户端功能模块
用户注册
在用户注册页面可以填写个人账号、姓名、身份证号码、手机号码等信息,进行注册如图
用户登录
在用户登录页面填写账号、密码进行登录如图
用户登录到家庭理财记账系统可以查看首页、家庭账户管理、收入分类管理、银行储蓄管理等内容,如图
家庭账户
在家庭账户页面可以查看家庭账户号码、家庭账户名称、家庭账户简介、相关图片、家庭账户类型、负责人、所属公司、预计年收益、发布日期、价格等信息,如图
在用户信息页面可以填写个人账号、姓名、性别、年龄、身份证号码、手机号码、头像等信息,并可根据需要进行保存、退出登录,如图
管理端功能界面
用户管理
通过填写个人账号、姓名、性别、年龄、身份证号码、手机号码、头像等信息进行详情、修改、删除操作,如图
家庭账户管理
通过填写用户名,账户号,用户姓名,金额等信息进行修改、删除操作,如图
收入分类管理
通过填写收入分类名等信息进行详情、修改、删除操作,如图
支出分类信息管理
通过填写支出分类名等信息进行详情、修改、删除操作,如图
家庭收入管理
通过填写用户名,用户姓名,账户号,收入分类,金额,日期,备注等信息进行详情、修改、删除操作,如图
家庭支出管理
通过填写用户名,用户姓名,账户号,支出分类,金额,日期,备注等信息进行详情、修改操作,如图
部分核心代码
上传文件
/**
* 上传文件映射表
*/
@RestController
@RequestMapping("file")
@SuppressWarnings({"unchecked","rawtypes"})
public class FileController{
@Autowired
private ConfigService configService;
/**
* 上传文件
*/
@RequestMapping("/upload")
public R upload(@RequestParam("file") MultipartFile file,String type) throws Exception {
if (file.isEmpty()) {
throw new EIException("上传文件不能为空");
}
String fileExt = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1);
File path = new File(ResourceUtils.getURL("classpath:static").getPath());
if(!path.exists()) {
path = new File("");
}
File upload = new File(path.getAbsolutePath(),"/upload/");
if(!upload.exists()) {
upload.mkdirs();
}
String fileName = new Date().getTime()+"."+fileExt;
File dest = new File(upload.getAbsolutePath()+"/"+fileName);
file.transferTo(dest);
if(StringUtils.isNotBlank(type) && type.equals("1")) {
ConfigEntity configEntity = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "faceFile"));
if(configEntity==null) {
configEntity = new ConfigEntity();
configEntity.setName("faceFile");
configEntity.setValue(fileName);
} else {
configEntity.setValue(fileName);
}
configService.insertOrUpdate(configEntity);
}
return R.ok().put("file", fileName);
}
/**
* 下载文件
*/
@IgnoreAuth
@RequestMapping("/download")
public ResponseEntity<byte[]> download(@RequestParam String fileName) {
try {
File path = new File(ResourceUtils.getURL("classpath:static").getPath());
if(!path.exists()) {
path = new File("");
}
File upload = new File(path.getAbsolutePath(),"/upload/");
if(!upload.exists()) {
upload.mkdirs();
}
File file = new File(upload.getAbsolutePath()+"/"+fileName);
if(file.exists()){
/*if(!fileService.canRead(file, SessionManager.getSessionUser())){
getResponse().sendError(403);
}*/
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", fileName);
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
}
} catch (IOException e) {
e.printStackTrace();
}
return new ResponseEntity<byte[]>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
家庭收入
/**
* 家庭收入
* 后端接口
* @author
* @email
* @date 2021-04-14 10:48:37
*/
@RestController
@RequestMapping("/jiatingshouru")
public class JiatingshouruController {
@Autowired
private JiatingshouruService jiatingshouruService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,JiatingshouruEntity jiatingshouru,
HttpServletRequest request){
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("yonghu")) {
jiatingshouru.setYonghuming((String)request.getSession().getAttribute("username"));
}
EntityWrapper<JiatingshouruEntity> ew = new EntityWrapper<JiatingshouruEntity>();
PageUtils page = jiatingshouruService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, jiatingshouru), params), params));
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,JiatingshouruEntity jiatingshouru, HttpServletRequest request){
EntityWrapper<JiatingshouruEntity> ew = new EntityWrapper<JiatingshouruEntity>();
PageUtils page = jiatingshouruService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, jiatingshouru), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( JiatingshouruEntity jiatingshouru){
EntityWrapper<JiatingshouruEntity> ew = new EntityWrapper<JiatingshouruEntity>();
ew.allEq(MPUtil.allEQMapPre( jiatingshouru, "jiatingshouru"));
return R.ok().put("data", jiatingshouruService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(JiatingshouruEntity jiatingshouru){
EntityWrapper< JiatingshouruEntity> ew = new EntityWrapper< JiatingshouruEntity>();
ew.allEq(MPUtil.allEQMapPre( jiatingshouru, "jiatingshouru"));
JiatingshouruView jiatingshouruView = jiatingshouruService.selectView(ew);
return R.ok("查询家庭收入成功").put("data", jiatingshouruView);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
JiatingshouruEntity jiatingshouru = jiatingshouruService.selectById(id);
return R.ok().put("data", jiatingshouru);
}
/**
* 前端详情
*/
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
JiatingshouruEntity jiatingshouru = jiatingshouruService.selectById(id);
return R.ok().put("data", jiatingshouru);
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody JiatingshouruEntity jiatingshouru, HttpServletRequest request){
jiatingshouru.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(jiatingshouru);
jiatingshouruService.insert(jiatingshouru);
return R.ok();
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody JiatingshouruEntity jiatingshouru, HttpServletRequest request){
jiatingshouru.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(jiatingshouru);
jiatingshouruService.insert(jiatingshouru);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody JiatingshouruEntity jiatingshouru, HttpServletRequest request){
//ValidatorUtils.validateEntity(jiatingshouru);
jiatingshouruService.updateById(jiatingshouru);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
jiatingshouruService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/**
* 提醒接口
*/
@RequestMapping("/remind/{columnName}/{type}")
public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request,
@PathVariable("type") String type,@RequestParam Map<String, Object> map) {
map.put("column", columnName);
map.put("type", type);
if(type.equals("2")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
Date remindStartDate = null;
Date remindEndDate = null;
if(map.get("remindstart")!=null) {
Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindStart);
remindStartDate = c.getTime();
map.put("remindstart", sdf.format(remindStartDate));
}
if(map.get("remindend")!=null) {
Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindEnd);
remindEndDate = c.getTime();
map.put("remindend", sdf.format(remindEndDate));
}
}
Wrapper<JiatingshouruEntity> wrapper = new EntityWrapper<JiatingshouruEntity>();
if(map.get("remindstart")!=null) {
wrapper.ge(columnName, map.get("remindstart"));
}
if(map.get("remindend")!=null) {
wrapper.le(columnName, map.get("remindend"));
}
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("yonghu")) {
wrapper.eq("yonghuming", (String)request.getSession().getAttribute("username"));
}
int count = jiatingshouruService.selectCount(wrapper);
return R.ok().put("count", count);
}
}
gitCode源码获取入口https://gitcode.com/yuanmadd/ymgg/blob/main/README.md?init=initTree