# personal-system-server **Repository Path**: sprouting/personal-system-server ## Basic Information - **Project Name**: personal-system-server - **Description**: 社交、时间管理系统,一个可以帮助你记账、社交管理、计划任务、生日提醒的软件,最符合中国人习惯的社交、计划工具。 - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 48 - **Forks**: 11 - **Created**: 2022-07-19 - **Last Updated**: 2025-06-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 社交时间管理系统 ## 简介 要说起这个项目,其实已经想了很久了,很早之前就做了第一版的社交管理系统v1.0,也使用了好些年了,但其中一些东西总是让我使用不够满意,然后今年就动手开始了第二版的编写。也就是现在的这个版本。 前端:https://gitee.com/sprouting/personal-system-web 后端:https://gitee.com/sprouting/personal-system-server 由来 为什么写这个系统,做第一版的时候其实就解决2个问题,一是记账,第二是生日提醒。 不知道大家有没这些痛点: - 有些亲戚一年到头就见过一次,长啥样估计都不知道,然后过年回家还要称呼他 - 梳理整个家族的人际关系,只有东西出来后,你才知道,原来你们这个家族是这么庞大,一些亲戚原来是这个关系 - 待办事件提醒,比如身份证快到期了,某个人要生日了,还有按照周期性的提醒 - 家庭成员的账单,到底支出都到哪去了,哪一块的支出最大,各项资金的占比,收入比,累计支出,年度预算是否超标,当月账单,每个月用的最多的钱用在哪里 - 孩子的作业,周期性的作业,每隔几天要做一次的作业 - 家族的墓地,因为我们是南方农村地区,墓地零零散散的,每年清明扫墓要走好些个地方,估计小年轻都不知道要去哪些地方扫墓了,这也算是家族管理中的数据吧 - 卡证管理,哪些卡要过期了,密码是多少,要提前进行换卡提醒等等 - 年度目标、月度目标管理 - 自己看的一些书籍、游戏、影视作品等,我到底看了多少,然后看完之后的观感,这也算是自己的小需求,我喜欢将看过的书和电影等记录一下,并记录下当时的评价,现在回头看的时候,没想到看了这么多的东西 - 记录打卡,一直坚持某件事进行的打卡记录 - 密码管理、复杂密码生成,特别是对于程序员来说,密码真的太多了,我自己算了下,密码差不多100来个各种密码,然后还要设置不同的密码,没这东西真记不住,而且一般的密码软件真不够用,密码可能有多个,还有注册的手机、邮箱等等都要记录下来 - 生日提醒,以前老是忘记,但有了这个东西后基本不会忘记了,还可以设置多久提醒,另外,中国的生日很多都是阴历来计算的,市面上的生日软件很多考虑不足 - 孩子成长记录、照片。 - 月经记录器 - 一些小工具,比如有时候想用手机看下电脑上的小电影,主流的做法都是开启共享,或者要安装2个软件,而我的电脑开启共享也有问题,安装软件也不想安装,最麻烦的是,我开启了共享,如果忘记关闭了,在公司被人远程查看了,就非常社死了。所以也集成了这类小工具 ### 后面可能会实现的 还有一些比较有意思的想法,想在后面加入进来,现阶段可能不会去做 - 声音保存,将一些人的声音保存下来,比如我过世的外婆,还想再听下她的声音。(暂时不会集成进来,个人拥有的照片里面有很多的视频,暂时可以满足需要) - 导入指定文件下的书籍和音乐、视频,视频和音乐有一点问题,无法获取到太多有效数据,做出来的意义不大,书籍的获取同样,没有点评的书籍录入是没有任何价值的 - 家庭教育(现阶段都可以实现,暂时没有动力进行) - 孩子的课程表 - 每天要做的作业提醒 - 音标 - 百词斩单词 - 字帖 - 下发作业给孩子 - 要解决的坏毛病,制定计划,怎么改,解决的步骤,解决的进度,解决的方案 - 建立奖惩激励记录,加减分 - 本学期的目标和月度目标、年度目标 - 加分减分表,这个还没想好,初步设想,洗碗加1分,搞卫生加1分,丢东西根据价值减分,达到多少分可以进行兑换 - 时间表 - 每天要做的作业,周期性作业 - 同学,朋友, - 计划的任务 - 充值管理和提醒 - 投资持仓,持仓时间,买入时间,初始资金和收益等 - 借贷提醒 - 标记废弃密码,增加密码重要性 ### 未解决的问题 前端过期的时候,一个页面多个请求,会导致大量重复的提示,暂无解决方案。 ## 技术栈 | 技术或工具 | 版本 | 备注 | | --------------- | ------------- | ------------------------------------------------------------ | | jdk | 1.8 + | | | springBoot | 2.3.7.RELEASE | | | sa-token | 1.28.0 | 发展期,还在快速迭代,可以酌情使用最新版本以及最新特性 http://sa-token.dev33.cn/ | | 日志 logback | | springboot内置版本,使用 sfl4j做日志记录 | | 连接池 durid | 1.2.6 | | | json处理 | | hutool自带,hutool版本 5.6.5,如无法满足,则使用springboot官方默认 `jackson` | | hutool 工具库 | 5.7.16 | https://www.hutool.cn/ | | 对象克隆 | | springBoot内置,与springboot版本相同 或 使用 hutool BeanUtils.copyProperties | | mybatis-plus | 3.4.2 | https://mp.baomidou.com/ | | 分页 | | mybatis-plus内置 | | mybatis | | mybatis-plus内置版本 | | JSR-303数据校验 | | springboot内置版本 | | liquibase | 4.5.0 | 数据库版本、构建工具 | | 翻译 | | 有使用到百度翻译、有道、彩云小译,但最终考虑到翻译的效果,使用了百度的API | | vue-pdf | | pdf预览 | ## 界面 ![image-20230209232640219](README.assets/image-20230209232640219.png) ![1](README.assets/1.gif) ![image-20230210014508442](README.assets/image-20230210014508442.png) ![image-20230210014528865](README.assets/image-20230210014528865.png) ![image-20230210014555620](README.assets/image-20230210014555620.png) ![image-20230210014613265](README.assets/image-20230210014613265.png) ![image-20230210014641986](README.assets/image-20230210014641986.png) ![image-20230210014721385](README.assets/image-20230210014721385.png) ![image-20230210014742810](README.assets/image-20230210014742810.png) ![image-20230210014811619](README.assets/image-20230210014811619.png) ![image-20230210015011081](README.assets/image-20230210015011081.png) ![2](README.assets/2.gif) ![image-20230210015159313](README.assets/image-20230210015159313.png) ![image-20230210015215707](README.assets/image-20230210015215707.png) ![image-20230210015235078](README.assets/image-20230210015235078.png) ![image-20230210015252813](README.assets/image-20230210015252813.png) ![image-20230210015308528](README.assets/image-20230210015308528.png) ![image-20230210015334033](README.assets/image-20230210015334033.png) ![image-20230210015430416](README.assets/image-20230210015430416.png) 支持局域网手机看电影 ![image-20230212020707785](README.assets/3.gif) update 2023年9月24日16:07:01 新升级 支持作业 ![image-20230212020707785](README.assets/4.gif) 支持更高自由度的组合查询 ![image-20230924160856933](README.assets/image-20230924160856933.png) 自定义签到任务 ![image-20230924160932183](README.assets/image-20230924160932183.png) 统计分析 ![image-20230924160952741](README.assets/image-20230924160952741.png) ## 快速开始 ### 配置文件 #### 开发 开发的话直接查看 `application.properties` 配置文件即可,基本所有的配置都在这里了。 需要额外注意的几个类,`AuthenticationInterceptor` 这里面配置了权限拦截器和资源映射拦截,如无必要,不建议去修改这里的配置,会导致访问异常。 #### 生产 生产环境只需要关注配置文件即可。 `application.properties` 中建议只处理修改区。 ![image-20230211200710957](README.assets/image-20230211200710957.png) **而且项目启动的时候也必须进行这一块的数据修改**。注意,前端的地址不要带中文。 需要注意,前端的地址路径,上面的路径哪些带 `/` 哪些不带。前端最终的地址是这样的。 ![image-20230211200738491](README.assets/image-20230211200738491.png) ![image-20230211011918085](README.assets/image-20230211011918085.png) 访问地址:http://127.0.0.1:8084/index.html 打包的时候注意,我使用的是jdk1.8,建议直接使用发行版,会将配置文件放在外面,另外加启动脚本。需要做的是直接打开配置文件,编辑修改数据库位置以及指定前端位置。 #### 打包(重要) 项目下载运行后,直接使用idea 的打包按钮操作 ![image-20230212002112051](README.assets/image-20230212002112051.png) 打包成功后,如下路径找到jar ![image-20230212002230635](README.assets/image-20230212002230635.png) 然后将项目合并到一起,如下: ![image-20230212192321141](README.assets/image-20230212192321141.png) dist中就是前端打包后的包,jre保证在没有安装jdk的环境也可以运行, application.properties 就是配置文件,jar包就不用说了,我们的应用主体,启动的话要使用这个 startup.bat 文件启动,否则不一定会使用外部的配置文件。外部的配置文件是直接从项目拷贝过来的,没有在maven配置了,感觉也没必要 接着修改配置文件 ![image-20230212011505740](README.assets/image-20230212011505740.png) 注意,上面使用的是 `/` 而不是win直接复制过来的`\`,否则会有问题,还有没有必要的 `/` 不要在目录后面乱加。另外,建议使用绝对路径,相对路径很可能引发bug。 运行 startup.bat 后 过一会在浏览器打开 http://127.0.0.1:8084/index.html 配置文件需要说明一点,默认是在当前目录下创建资源文件和数据库 ![image-20230212192958829](README.assets/image-20230212192958829.png) 还需要注意一点,日志文件。如果不进行设置的话,那么系统会在项目的磁盘根节点增加一个日志文件,不想放在这里则要进行修改,同样也建议使用绝对路径 ![image-20230212020707785](README.assets/image-20230212020707785.png) 另外脚本命令也可以看下,有隐藏cmd弹框的,解决乱码的,也有运行后打开自动打开网页的,但注意,这些配置有些是有冲突的,具体看脚本。 打包后的目录 ![image-20230223004904417](README.assets/image-20230223004904417.png) ## 开发管理 ### 端口管理 已使用端口:8084 ### 模板管理 ### 任务管理 系统暂时有用2个定时任务,分别是 `ClearFileTask` 和 `DatabaseBackupTask` 这2个类 | 任务 | 原理 | 任务类 | 备注 | | ------------------------ | ------------------------------------------------------------ | -------------------------- | ------------- | | 定时清理失效文件、脏数据 | 查询上传文件信息表 ps_upload_file,查询已经过了48小时的临时文件,找到后,根据记录的文件地址信息,删除对应的文件。通常会清理一些上传的图片 | ClearFileTask#start() | 1小时清理一次 | | 数据库备份 | 检查是否开启了数据库备份,检查是否sqlite数据库,检查备份记录是否已经备份,从配置文件获取数据库地址进行备份。只保存最新的三条,其他的全部删除。 | DatabaseBackupTask#start() | 2小时一次 | | | | | | ### 账号管理 测试账号: 下雪 密码:123123 ### 分支管理 `master` 主分支 ### tag管理 ## 常用组件 #### 自定义注解 1、`@CheckLength` 针对注解存在的几个问题,比如长度限制这一块,我们需要限制的是数据存储到数据库时候的长度,`@Size` 和 `@Length` 注解都不能满足,这2个注解都是活的 `str.length `的长度,并不是字符串字节的长度,故而,长度注解采用 `@CheckLength` 这个自定义注解。这个会验证字节长度,使用的时候,可以参考 `RegisterUserPram` 类控制层和实体的写法。==暂时只支持String字符串。== 2、`@CheckNotNull` 检查验证字段是否为空,用来代替 `@NotBlank` 注解。==暂时只支持String字符串。== 必须空则使用 @Null 注解 3、ID 的校验逻辑 ```java /** * 如果 @Validated(UpdGroup.class) 修改的时候必须有ID,不能是 undefined 和 null 字符串 等 * 如果 @Validated({AddGroup.class}) 新增的时候ID不能有值,比如 "" 字符串,只能是 null 对象 * 验证的时候,@Validated 注解不加任何参数,不会进入下面的校验逻辑 */ @CheckNotNull(message = "非法ID", groups = UpdGroup.class) @Null(message = "无效ID", groups = AddGroup.class) private String id; ``` 4、当存在 @Validated 注解的时候,如果里面有验证注解,就不需要担心对象为null,但注意,这个时候,这个对象里面的参数很可能是null的。 ### 本地缓存使用说明 模拟缓存使用 `private static TimedCache timedCache = CacheUtil.newTimedCache(30 * 1000);` 锁释放则使用如下方式 ```java // 通过再次设置这个值,并将过期时间设置为1毫秒,实现释放锁的功能 timedCache.put(key, "1", 1); ``` ### liquibase使用 新建的项目总是需要进行一系列的管理非常麻烦,建表,创建语句等等,liquibase可以帮助我们解决这些问题。 脚本已经指定位置,后续需要替换,直接在这里进行路径替换即可。 ![image-20230703093803372](README.assets/image-20230703093803372.png) ![image-20230703093823760](README.assets/image-20230703093823760.png) ### 翻译API 有道翻译单词发音API 默认的是美音:http://dict.youdao.com/dictvoice?audio=单词, 等号后面接单词,例如:http://dict.youdao.com/dictvoice?audio=the 英音和美音: 英音:http://dict.youdao.com/dictvoice?type=1&audio= 美音:http://dict.youdao.com/dictvoice?type=0&audio= 注意,得到的音频其实就是 mp3格式的,可以修改后缀 单词查询含义 http://dict.youdao.com/suggest?num=1&doctype=json&q=单词 等号后面接单词,例如:http://dict.youdao.com/suggest?num=1&doctype=json&q=the 有道句子翻译 http://fanyi.youdao.com/translate?&doctype=json&type=AUTO&i=要翻译的名子或短语 等号后面接句子或短语,例如:http://fanyi.youdao.com/translate?&doctype=json&type=AUTO&i=English-speaking world 如果是链接,将句子的空格替换成%20,例如:http://fanyi.youdao.com/translate?&doctype=json&type=AUTO&i=English-speaking%20world