# FinanceManage **Repository Path**: frailty/finance-manage ## Basic Information - **Project Name**: FinanceManage - **Description**: java课程项目实战 - **Primary Language**: Java - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-06-10 - **Last Updated**: 2024-06-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # FinanceManage #### 介绍 java课程项目实战 # 实现的功能 ## 基本功能 ### 用户活动 - 注册 - 登录 - 登出 - 修改密码 - 用户身份验证 ### 数据管理 - 展示账单 - 添加账单 - 删除账单 # 项目架构 #### finance-manage - src/ # 源代码目录 - main/ - java/com/example/ - interfaces/ # 接口层 - controllers/ # 逻辑控制器层 - Control_Base.java # 逻辑控制器基类 - AccountController.java # 账户操作类控制器 - DataController.java # 数据操作类控制器 - dataAccess/ # 数据访问层 - Connect.java ---- # 数据库连接类 - DAO_Base.java ---- # 数据库操纵基类 - UserDAO.java ---- # 用户表操作类 - DataDAO.java ---- # 数据表操作类 - model/ # 数据模型 - BillData.java ---- # 账单数据模型 - JsonModel.java ---- # Json数据模型 - services/ # 服务层 | 实现多路复用 - AccountService.java ---- # 用户处理服务 - DataService.java ---- # 数据处理服务 - servlets/ # 前端控制器层 | 与前端进行数据交互 - AccountServlet.java ---- # 用户操作servlet - DataServlet.java ---- # 数据操作servlet - util/ # 工具类 - Constans.java ---- # 常量类 - Debug.java ---- # 调试工具类 - HashEncryption.java ---- # 密码加密工具类 - ReadConfig.java ---- # 读取配置类 - Main.java ---- # 主入口类 - resources/ - database_config.properties ---- # 数据库配置文件 - error_code_dict.json ---- # 错误码配置文件 - test/ # 测试代码 - target/ - web/ # 前端资源目录 - node_modules/ # 前端依赖包目录 "bootstrap": "^5.3.3", "jquery": "^3.7.1", "js-cookie": "^3.0.5" - css/ # 前端样式目录 - js/ # 前端脚本目录 - pages/ # 前端页面目录 - login.html ---- # 登录页面 - register.html ---- # 注册页面 - changePwd.html ---- # 修改密码页面 test/ # 测试代码目录 - index.html ---- # 默认主页 - package.json - package-lock.json - pom.xml ---- # Maven项目配置文件 - Dependencies.bat ---- # 安装前端依赖脚本 - package.bat ---- # 编译打包脚本 - run.bat ---- # 启动脚本 # 数据库设计 库:finance_manage 使用一个数据库用户,给予本库的 查询、插入、更新、删除、建表 权限。 下有一表格: users ```sql CREATE TABLE users( username varchar(50) NOT NULL PRIMARY KEY COMMENT '账户名', password varchar(100) NOT NULL UNIQUE COMMENT '密码' ) COMMENT '用户表'; ``` 再以账户名作为表明,创建记录数据的表格 ```sql CREATE TABLE bills_default ( bid INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '账单ID', type VARCHAR(10) NOT NULL COMMENT '账单类型', amount DECIMAL(10,2) NOT NULL COMMENT '账单金额', date DATETIME NOT NULL COMMENT '账单日期时间', statement VARCHAR(90) COMMENT '账单说明', notes VARCHAR(150) COMMENT '备注' ) COMMENT '账单表模板'; ``` ## 此设计可能存在问题 + 此用户有finance_manage下所有表的权限,因此包括了users表格,可能造成数据泄露或丢失 + 此用户没有删表权限,无法清理灰色用户的数据。但是如果给予了删表权限,可能有users表格甚至整个finance_manage数据库被删的风险 # 环境说明 - 开发环境: `Windows10/11` + `JDK19` + `Maven 3.8.4` - 前端依赖: `Bootstrap5` + `jQuery3.7.1` + `js-cookie3.0.5` - 使用npm安装前端依赖 - 可在项目根目录下运行Dependencies.bat文件进行安装 - 或于web目录下执行 `npm i` - 使用的IDE: `Visual Studio Code` + `IntelliJ IDEA Community` # 下载|配置|使用 ## 下载 ### 直接下载.zip压缩包 > https://gitee.com/frailty/finance-manage/repository/archive/master.zip ### 使用git克隆 > git clone https://gitee.com/frailty/finance-manage.git ## 配置 ### 数据库配置 `src/main/resources/database_config.properties` ```properties DRIVER = com.mysql.cj.jdbc.Driver URL = jdbc:mysql://修改您的数据库地址,端口号及库名?serverTimezone=UTC USERNAME = root # 用户名 PASSWORD = 123456 # 密码 ``` ### 错误码配置 `src/main/resources/error_code_dict.json` ### 前端依赖安装 在项目根目录下运行Dependencies.bat文件进行安装。 > Dependencies.bat 或于web目录下执行 > npm i ### 使用说明 首次运行项目,需要先编译打包,然后运行run.bat文件。 在本目录下可直接运行`package.bat`文件,对项目进行编译打包。 打包后可运行`run.bat`文件,启动项目。 ### 默认地址 https://127.0.0.1:8080 # 可优化或考虑的点: - 利用java的多态特性, 可以减少更多的冗余代码。 - 大多数数据检测位于前端,后端数据验证较少,可能存在漏洞。 - 日志管理:添加日志管理的配置和实现,以便于问题追踪和性能监控。 - API文档:考虑添加API文档的描述和管理,便于团队合作和API的维护。 # 项目思路 ## 前后端数据交互 ### 实现方式 前端使用 ajax 发送请求 后端使用 servlet 接收请求并处理 使用 Jetty 作为 web 服务器 ### 数据 使用 json 数据 字符串类型进行交互 请求时的 json 参数结构: ```json { "action": "行为", "data": { "username": "用户名", "pic": "从Cookie中获取的加密验证码", "data": "请求数据: josn" } } ``` 响应时的 json 数据结构: ```json { "errno": "错误码", "errmsg": "错误信息", "data": "响应数据: json" } ``` ## 后端分层 (由前到后) #### Main - 项目入口,负责启动项目 - 创建http服务器,监听端口 - 注册 servlet 到服务器 ### Servlert 响应层 - 经典的Servlet规范,负责处理请求和响应 - 一个Servlet向前对应一个 URL - 一个Servlet向后对应一个 Services 服务 - 不对数据进行处理,只负责调用服务 ### Models 数据模型 - 根据需求设计了两个数据模型 - 账单数据模型 `BillData` - Json 数据模型 `JsonModel` ### Services 服务层 - 利用自定义的数据模型 对数据初步解析 - 一个服务向后对应一个 控制器 Controller - 根据请求数据中 `action` 的值 调用相应的控制器方法 ### Controllers 控制器层|主逻辑处理层 - 一个控制器对应一个 数据访问层 DataAcces - 负责处理业务逻辑, 根据需求调用 DataAcces 进行数据操作 - #### 对功能进行实现的思路 - 注册: > 收到数据后, 判断用户名是否保留或已存在, 若不存在则将密码加密后插入数据库并新建数据表, 若存在则返回错误信息; - 登录: >收到数据后, 从数据库中查询用户名和密码是否匹配, 若匹配则返回登录成功信息以及加密的密码, 之后的请求使用加密的密码进行验证, 否则返回错误信息; - 登出 > 直接在前端清除Cookie中的登录信息; - 修改密码 > 收到数据后, 验证身份信息, 从数据库中查询用户名和密码是否匹配, 若匹配则将新密码加密后更新数据库, 否则返回错误信息; - 账单展示 > 收到数据后, 验证身份信息, 从数据库中查询指定用户的账单数据, 并返回给前端, 由前端渲染可视化数据; - 账单添加 > 收到数据后, 验证身份信息, 解析账单数据, 并插入数据库, 向前端返回添加成功信息. 前端接收到添加成功信息后, 重新向申请账单数据, 重新渲染可视化数据; - 账单删除 > 收到数据后, 验证身份信息, 从数据库中删除指定账单数据. 前端不等待后端相应, 直接在缓存中删除指定账单数据, 重新渲染可视化数据; ### DataAcces 数据访问层 - 负责对数据库进行操作