基于javaweb+mysql的springboot公司财务管理系统(java+springboot+vue+mysql+maven)
私信源码获取及调试交流
运行环境
Java≥8、MySQL≥5.7、Node.js≥10
开发工具
后端:eclipse/idea/myeclipse/sts等均可配置运行
前端:WebStorm/VSCode/HBuilderX等均可
适用
课程设计,大作业,毕业设计,项目练习,学习演示等
功能说明
基于javaweb的SpringBoot公司财务管理系统(java+springboot+vue+mysql+maven)
系统介绍
该系统是一个小巧精致的公司财务系统,所用皆为最新流行技术,非常适合个人研究学习或者二次开发。
技术说明
后台 SpringBoot2.x,JWT 鉴权,Druid连接池,数据库 Mysql
前台 vue-cli 3.0,vue-element-ui
前端启动命令:npm run dev
用户名/密码 admin/123456
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(user.getPassword())).build();
try{
jwtVerifier.verify(token);
}catch (Exception e){
throw new RRException("token已过期");
}
return true;
}
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
@Api(value="支出收入管理")
@RestController
@RequestMapping("/moneyinfo")
public class FmMoneyInfoController implements BaseController<FmMoneyInfoEntity> {
@Autowired
try {
userNumber = JWT.decode(token).getAudience().get(0);
}catch (Exception e){
throw new RRException("token失效,请重新登录");
}
SysUserEntity user = sysUserService.findUserByNumber(userNumber);
if(user==null){
throw new RRException("用户不存在,请重新登录");
}
// 验证 token
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(user.getPassword())).build();
try{
jwtVerifier.verify(token);
}catch (Exception e){
throw new RRException("token已过期");
}
return true;
}
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
@Override
public R getAll() {
return null;
}
@Override
public R get(FmNoticeEntity fmNoticeEntity) {
return null;
}
@ApiOperation(httpMethod = "POST", value = "分页获取公告留言信息", response = R.class,
notes = "分页获取公告留言信息")
@PostMapping("/page")
@UserLoginToken
public R getPages(@RequestBody Map<String,Object> map) {
if(map!=null){
int page = 0;
int size = 10;
if(map.containsKey("page")){
page = (int)map.get("page");
}
if(map.containsKey("size")){
size = (int)map.get("size");
}
PageEntity<FmNoticeEntity> pages = fmNoticeService.getPage(page, size);
return R.ok("获取留言公告列表",pages);
}
return R.ok("获取留言公告列表","");
}
}
@Api(value="支出收入管理")
@RestController
@RequestMapping("/business")
public class FmBusinessController implements BaseController<FmBusinessEntity>{
@Autowired
private FmBusinessService fmBusinessService;
@ApiOperation(httpMethod = "POST", value = "添加业务", response = R.class,
notes = "添加业务")
}
}
return R.error(500,"更新失败");
}
@Override
public R getAll() {
return null;
}
@Override
public R get(FmMoneyInfoEntity fmMoneyInfoEntity) {
return null;
}
@ApiOperation(httpMethod = "POST", value = "分页获取收入支出信息", response = R.class,
notes = "分页获取收入支出信息")
@PostMapping("/page")
@UserLoginToken
public R getPages(@RequestBody Map<String,Object> map) {
if(map!=null){
int page = 0;
int size = 10;
if(map.containsKey("page")){
page = (int)map.get("page");
}
if(map.containsKey("size")){
size = (int)map.get("size");
}
PageEntity<FmMoneyInfoEntity> pages = fmMoneyInfoService.getPage(page, size);
return R.ok("获取收入支出列表",pages);
}
return R.ok("获取收入支出列表","");
}
}
@Api(value="公司公告留言管理")
@RestController
SysUserEntity dbUser = sysUserService.findUserByNumber(user.getNumber());
if(dbUser!=null){
String md5Password = DigestUtils.md5DigestAsHex(user.getPassword().getBytes());
if(md5Password.equals(dbUser.getPassword())){
//获取token
String token = tokenService.getToken(dbUser);
dbUser.setToken(token);
LogUtil.i("当前登录用户信息:",dbUser);
return R.ok("登录成功",dbUser);
}
}
return R.error(500,"账户名或者密码错误");
}
return R.error(500,"账户名或者密码不可为null");
}
@ApiOperation(httpMethod = "POST", value = "退出登录", response = R.class,
notes = "系统用户退出登录")
@PostMapping("/logout")
@UserLoginToken
public R logout(){
LogUtil.i("退出登录:","");
return R.ok("退出登录","");
}
@ApiOperation(httpMethod = "POST", value = "修改密码", response = R.class,
notes = "系统用户修改密码")
@PostMapping("/updatePassword")
@UserLoginToken
public R updatePassword(@RequestBody Map<String,String> map){
LogUtil.i("用户更改密码:",map);
if(map!=null){
String number = TokenUtil.getTokenUserNumber();
if(!map.containsKey("number")){
return R.error(500,"更改密码失败,当前用户不是修改用户");
}else if(!number.equals(map.get("number"))){
return R.error(500,"更改密码失败,当前用户不是修改用户");
}
if(!map.containsKey("oldpwd")){
return R.error(500,"旧密码不可为null");
}
if(!map.containsKey("newpwd")){
return R.error(500,"新密码不可为null");
}
//查询用户
SysUserEntity user = sysUserService.findUserByNumber(number);
if(user!=null){
}
if(map.containsKey("size")){
size = (int)map.get("size");
}
PageEntity<FmDepartmentEntity> pages = fmDepartmentService.getPages(page, size);
return R.ok("获取客户列表",pages);
}
return R.ok("获取客户列表","");
}
@ApiOperation(httpMethod = "GET", value = "获取所有部门", response = R.class,
notes = "获取所有部门")
@GetMapping("/names")
@UserLoginToken
public R getNames() {
List<Map<String, Object>> names = fmDepartmentService.getNames();
if(names!=null&&names.size()>0){
return R.ok("获取部门名称",names);
}
return R.error(500,"获取失败");
}
}
@Api(value="支出收入类型管理")
@RestController
@RequestMapping("/moneytype")
@Api(value="系统用户")
@RestController
@RequestMapping("/user")
public class SysUserController implements BaseController<SysUserEntity>{
@Autowired
private SysUserService sysUserService;
@Autowired
TokenService tokenService;
@ApiOperation(httpMethod = "POST", value = "系统用户添加", response = R.class,
notes = "系统用户添加 ")
@PostMapping("/add")
@Override
public R add(@RequestBody SysUserEntity sysUserEntity) {
if(sysUserEntity!=null&&!StringUtil.isEmpty(sysUserEntity.getPhone())){
//先查询用户是否存在
SysUserEntity userByPhone = sysUserService.findUserByPhone(sysUserEntity.getPhone());
if(userByPhone!=null){
return R.error(500,"该用户手机号已经注册,请更新手机号");
}
sysUserEntity.setNumber("u"+sysUserEntity.getPhone());
boolean add = sysUserService.add(sysUserEntity);
if(add){
return R.ok("添加成功","");
}
}
return R.error(500,"添加失败");
}
@ApiOperation(httpMethod = "GET", value = "删除用户", response = R.class,
notes = "删除用户")
@GetMapping("/del")
@UserLoginToken
@Override
public R del(Long id) {
if(id>0){
notes = "删除业务")
@GetMapping("/del")
@UserLoginToken
@Override
public R del(Long id) {
if(id>0){
boolean del = fmBusinessService.del(id);
if(del){
return R.ok("删除成功","");
}
}
return R.error(500,"删除失败");
}
@ApiOperation(httpMethod = "POST", value = "更新业务信息", response = R.class,
notes = "更新业务信息")
@PostMapping("/update")
@UserLoginToken
@Override
public R update(@RequestBody FmBusinessEntity fmBusinessEntity) {
if(fmBusinessEntity!=null&&fmBusinessEntity.getId()>0){
boolean update = fmBusinessService.update(fmBusinessEntity);
if(update){
return R.ok("更新成功","");
}
}
return R.error(500,"更新失败");
}
@Override
public R getAll() {
return null;
}
@Override
public R get(FmBusinessEntity fmBusinessEntity) {
return null;
}
@ApiOperation(httpMethod = "POST", value = "分页获取业务信息", response = R.class,
notes = "分页获取业务信息")
@PostMapping("/page")
@UserLoginToken
public R getPages(@RequestBody Map<String,Object> map) {
if(map!=null){
/**
* 自己的拦截器 认证token
*/
public class AuthenticationInterceptor implements HandlerInterceptor {
@Autowired
private SysUserService sysUserService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
String token = request.getHeader("X-Token");// 从 http 请求头中取出 token
// 如果不是映射到方法直接通过
if(!(handler instanceof HandlerMethod)){
return true;
}
HandlerMethod handlerMethod=(HandlerMethod)handler;
Method method=handlerMethod.getMethod();
//检查是否有passtoken注释,有则跳过认证
if (method.isAnnotationPresent(PassToken.class)) {
PassToken passToken = method.getAnnotation(PassToken.class);
if (passToken.required()) {
return true;
}
}
//检查有没有需要用户权限的注解
if (method.isAnnotationPresent(UserLoginToken.class)) {
UserLoginToken userLoginToken = method.getAnnotation(UserLoginToken.class);
public R logout(){
LogUtil.i("退出登录:","");
return R.ok("退出登录","");
}
@ApiOperation(httpMethod = "POST", value = "修改密码", response = R.class,
notes = "系统用户修改密码")
@PostMapping("/updatePassword")
@UserLoginToken
public R updatePassword(@RequestBody Map<String,String> map){
LogUtil.i("用户更改密码:",map);
if(map!=null){
String number = TokenUtil.getTokenUserNumber();
if(!map.containsKey("number")){
return R.error(500,"更改密码失败,当前用户不是修改用户");
}else if(!number.equals(map.get("number"))){
return R.error(500,"更改密码失败,当前用户不是修改用户");
}
if(!map.containsKey("oldpwd")){
return R.error(500,"旧密码不可为null");
}
if(!map.containsKey("newpwd")){
return R.error(500,"新密码不可为null");
}
//查询用户
SysUserEntity user = sysUserService.findUserByNumber(number);
if(user!=null){
String oldpwd = DigestUtils.md5DigestAsHex(map.get("oldpwd").getBytes());
String newpwd = DigestUtils.md5DigestAsHex(map.get("newpwd").getBytes());
if(oldpwd.equals(user.getPassword())){
//更新
user.setPassword(newpwd);
boolean update = sysUserService.update(user);
if(update){
return R.ok("修改成功","");
}else{
return R.error(500,"更改密码失败");
}
}else{
return R.error(500,"旧密码错误");
}
}
}
//先判断是否是当前用户
return R.error(500,"更改密码失败");
}
@ApiOperation(httpMethod = "POST", value = "修改信息", response = R.class,
notes = "系统用户修改信息")
@PostMapping("/updateInfo")
@UserLoginToken
public R updateUserInfo(@RequestBody SysUserEntity sysUserEntity){
LogUtil.i("用户数据修改:",sysUserEntity);
if(update){
return R.ok("更新部门信息成功","");
}
}
return R.error(500,"更新失败");
}
@Override
public R getAll() {
return null;
}
@Override
public R get(FmDepartmentEntity fmDepartmentEntity) {
return null;
}
@ApiOperation(httpMethod = "POST", value = "分页获取部门信息", response = R.class,
notes = "部门列表")
@PostMapping("/page")
@UserLoginToken
public R getPages(@RequestBody Map<String,Object> map) {
if(map!=null){
int page = 0;
int size = 10;
if(map.containsKey("page")){
page = (int)map.get("page");
}
if(map.containsKey("size")){
size = (int)map.get("size");
}
PageEntity<FmDepartmentEntity> pages = fmDepartmentService.getPages(page, size);
return R.ok("获取客户列表",pages);
}
return R.ok("获取客户列表","");
}
@ApiOperation(httpMethod = "GET", value = "获取所有部门", response = R.class,
notes = "获取所有部门")
@GetMapping("/names")
@UserLoginToken
@UserLoginToken
@Override
public R add(@RequestBody FmDepartmentEntity fmDepartmentEntity) {
LogUtil.i("添加的部门",fmDepartmentEntity);
if(fmDepartmentEntity!=null){
boolean isExits = fmDepartmentService.getDepartmentByName(fmDepartmentEntity.getName());
if(!isExits){
boolean add = fmDepartmentService.add(fmDepartmentEntity);
if(add){
return R.ok("添加成功","");
}
}else{
return R.error(500,"添加失败,该部门已经存在");
}
}
return R.error(500,"添加失败");
}
@ApiOperation(httpMethod = "POST", value = "删除部门信息", response = R.class,
notes = "删除部门信息")
@GetMapping("/del")
@UserLoginToken
@Override
public R del(Long id) {
if(id>0){
boolean del = fmDepartmentService.del(id);
if(del){
return R.ok("删除成功","");
}
}
return R.error(500,"删除失败");
}
@ApiOperation(httpMethod = "POST", value = "更新部门信息", response = R.class,
notes = "更新部门信息")
@PostMapping("/update")
@UserLoginToken
@Override
public R update(@RequestBody FmDepartmentEntity fmDepartmentEntity) {
if(fmDepartmentEntity!=null&&fmDepartmentEntity.getId()>0){
boolean update = fmDepartmentService.update(fmDepartmentEntity);
if(update){
return R.ok("更新部门信息成功","");
@Api(value="支出收入管理")
@RestController
@RequestMapping("/moneyinfo")
public class FmMoneyInfoController implements BaseController<FmMoneyInfoEntity> {
@Autowired
private FmMoneyInfoService fmMoneyInfoService;
@ApiOperation(httpMethod = "POST", value = "添加支出收入", response = R.class,
notes = "添加支出收入")
@PostMapping("/add")
@UserLoginToken
@Override
public R add(@RequestBody FmMoneyInfoEntity fmMoneyInfoEntity) {
if(fmMoneyInfoEntity!=null){
boolean add = fmMoneyInfoService.add(fmMoneyInfoEntity);
if(add){
return R.ok("添加成功","");
}
}
return R.error(500,"添加失败");
}
@ApiOperation(httpMethod = "GET", value = "删除收入支出", response = R.class,
notes = "删除收入支出")
@GetMapping("/del")
@UserLoginToken
@Override
public R del(Long id) {
if(id>0){
boolean del = fmMoneyInfoService.del(id);
if(del){
return R.ok("删除成功","");
}
}
return R.error(500,"删除失败");
}
@ApiOperation(httpMethod = "POST", value = "更新收入支出信息", response = R.class,
notes = "更新收入支出信息")
@PostMapping("/update")
@Api(value="支出收入类型管理")
@RestController
@RequestMapping("/moneytype")
public class FmMoneyTypeController implements BaseController<FmMoneyTypeEntity> {
@Autowired
private FmMoneyTypeService fmMoneyTypeService;
@ApiOperation(httpMethod = "POST", value = "添加收入支出标签类型", response = R.class,
notes = "添加收入支出标签类型")
@PostMapping("/add")
@UserLoginToken
@Override
public R add(@RequestBody FmMoneyTypeEntity fmMoneyTypeEntity) {
if(fmMoneyTypeEntity!=null&& !StringUtil.isEmpty(fmMoneyTypeEntity.getName())){
//先判断是否存在
boolean existMoneyType = fmMoneyTypeService.isExistMoneyType(fmMoneyTypeEntity.getName());
if(!existMoneyType){
boolean add = fmMoneyTypeService.add(fmMoneyTypeEntity);
if(add){
return R.ok("添加成功","");
}
}else{
return R.error(500,"添加失败,改类型已经存在");
}
}
return R.error(500,"添加类型失败");
}
@ApiOperation(httpMethod = "GET", value = "删除收入支出标签类型", response = R.class,
}
return R.error(500,"删除失败");
}
@ApiOperation(httpMethod = "POST", value = "更新业务信息", response = R.class,
notes = "更新业务信息")
@PostMapping("/update")
@UserLoginToken
@Override
public R update(@RequestBody FmBusinessEntity fmBusinessEntity) {
if(fmBusinessEntity!=null&&fmBusinessEntity.getId()>0){
boolean update = fmBusinessService.update(fmBusinessEntity);
if(update){
return R.ok("更新成功","");
}
}
return R.error(500,"更新失败");
}
@Override
public R getAll() {
return null;
}
@Override
public R get(FmBusinessEntity fmBusinessEntity) {
return null;
}
@ApiOperation(httpMethod = "POST", value = "分页获取业务信息", response = R.class,
notes = "分页获取业务信息")
@PostMapping("/page")
@UserLoginToken
public R getPages(@RequestBody Map<String,Object> map) {
if(map!=null){
int page = 0;
int size = 10;
if(map.containsKey("page")){
page = (int)map.get("page");
}
if(map.containsKey("size")){
size = (int)map.get("size");
}
PageEntity<FmBusinessEntity> pages = fmBusinessService.getPages(page, size);
return R.ok("获取收入支出列表",pages);
}
@UserLoginToken
@Override
public R del(Long id) {
if(id>0){
boolean del = fmBusinessService.del(id);
if(del){
return R.ok("删除成功","");
}
}
return R.error(500,"删除失败");
}
@ApiOperation(httpMethod = "POST", value = "更新业务信息", response = R.class,
notes = "更新业务信息")
@PostMapping("/update")
@UserLoginToken
@Override
public R update(@RequestBody FmBusinessEntity fmBusinessEntity) {
if(fmBusinessEntity!=null&&fmBusinessEntity.getId()>0){
boolean update = fmBusinessService.update(fmBusinessEntity);
if(update){
return R.ok("更新成功","");
}
}
return R.error(500,"更新失败");
}
@Override
public R getAll() {
return null;
}
@Override
public R get(FmBusinessEntity fmBusinessEntity) {
return null;
}
@ApiOperation(httpMethod = "POST", value = "分页获取业务信息", response = R.class,
notes = "分页获取业务信息")
@PostMapping("/page")
@UserLoginToken
public R getPages(@RequestBody Map<String,Object> map) {
if(map!=null){
int page = 0;
int size = 10;
if(map.containsKey("page")){
page = (int)map.get("page");
}
if(map.containsKey("size")){
size = (int)map.get("size");
public R update(@RequestBody FmBusinessEntity fmBusinessEntity) {
if(fmBusinessEntity!=null&&fmBusinessEntity.getId()>0){
boolean update = fmBusinessService.update(fmBusinessEntity);
if(update){
return R.ok("更新成功","");
}
}
return R.error(500,"更新失败");
}
@Override
public R getAll() {
return null;
}
@Override
public R get(FmBusinessEntity fmBusinessEntity) {
return null;
}
@ApiOperation(httpMethod = "POST", value = "分页获取业务信息", response = R.class,
notes = "分页获取业务信息")
@PostMapping("/page")
@UserLoginToken
public R getPages(@RequestBody Map<String,Object> map) {
if(map!=null){
int page = 0;
int size = 10;
if(map.containsKey("page")){
page = (int)map.get("page");
}
if(map.containsKey("size")){
size = (int)map.get("size");
}
PageEntity<FmBusinessEntity> pages = fmBusinessService.getPages(page, size);
return R.ok("获取收入支出列表",pages);
}
return R.ok("获取收入支出列表","");
}
}
}else{
incomeList.add(fmMoneyTypeEntity);
}
}
map.put("income",incomeList);
map.put("expenditure",expenditureList);
return R.ok("获取成功",map);
}
return R.ok("获取成功","");
}
@Override
public R get(FmMoneyTypeEntity fmMoneyTypeEntity) {
return null;
}
}
/**
* 自己的拦截器 认证token
*/
public class AuthenticationInterceptor implements HandlerInterceptor {
@Autowired