# 开源词典
**Repository Path**: syuchen/os-dictionary-server
## Basic Information
- **Project Name**: 开源词典
- **Description**: 这是一款基于Java GUI、Socket通信、Nginx网关以及MySQL数据库实现的开源词典软件(C/S架构),可供多个用户共同编辑,集众人之力完成一个独特的词典,支持向词典数据库中添加/删除单词、添加/修改/删除单词释义、检索单词等等功能。
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 0
- **Created**: 2022-03-28
- **Last Updated**: 2024-06-11
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 一、项目简介
这是一款基于Java GUI、Socket通信、Nginx网关以及MySQL数据库实现的开源词典软件(C/S架构),可供多个用户共同编辑,集众人之力完成一个独特的词典,支持向词典数据库中添加/删除单词、添加/修改/删除单词释义、检索单词等等功能。

图1 . 项目客户端主界面展示图
## 三、主要功能介绍
### 1. 用户注册、登录

图5 . 用户注册流程图

图6 . 用户登录流程图
### 2. 检索单词
可在检索框中输入单词进行单词检索,并通过字典树算法实现了搜索提示的功能,能够根据用户的输入进行实时提示。

图7 . 搜索提示功能展示
**算法实现原理**:字典树(Trie树)又称单词查找树,是一种树形结构,是一种哈希树的变种,可实现根据单词前缀查找树中所有以此前缀开头的单词。一个字典树节点中有三个数据字段,第一个是当前节点存储的字符(根节点不存储字符),第二个是当前节点是否为一个单词的结尾isWord,第三个是存储当前节点所有子节点的字符以及引用。在字典树中插入单词时就是将单词字符串中的所有字符按顺序插入到字典树的每一层中,插入的最后一个节点设置为字符串的结尾;根据单词前缀检索就是先查找到前缀最后一个字符所在的节点,再利用回溯算法遍历这个节点下的所有节点,找到所有为一个单词的结尾的节点,并将遍历的路径组成的单词中添加到结果集中;从字典树中删除单词就是找到结尾节点,将isWord置为false,如果当前节点没有子节点且isWord字段值为false,则将当前节点删除,这样向上递归删除,直到找到一个有子节点的节点。
### 3. 最近新增单词列表
客户端主界面右侧可展示词典中最近新增的十个单词。
### 4. 添加单词、添加单词释义、删除单词
右击主界面展示的单词可弹出选项菜单,提供查看单词详情、添加单词释义和删除单词的功能
### 5. 修改、删除单词释义
右击释义可弹出选项菜单,提供查看释义详情、修改和删除单词释义的功能
### 6. 个人成就
个人主页中可展示用户对词典的贡献,包括贡献的单词数、单词释义数以及单词释义修正次数。
### 7. 桌面单词
在个人主页中可开启/关闭桌面单词界面,桌面单词默认显示在桌面右上角,并通过定时器实现桌面单词的定时刷新(从词典中随机获取一个单词进行展示),并可实时修改单词的刷新时间。

图8 . 桌面单词功能展示
## 二、项目设计架构
### 1. 项目整体架构
项目整体架构设计如图2所示,客户端通过socket与服务端Nginx建立tcp连接发送请求,Nginx通过设置好的负载均衡配置将请求转发给一个合适的代理服务器,服务器的ServerSocket接收到客户端连接请求后新开一个处理线程(即同步并阻塞(BIO)模型),放到线程池中去执行,在线程的run方法中具体的执行请求数据的解析、处理与响应流程,处理过程中通过Druid连接池和Jedis连接池对MySQL和Redis数据库中的数据进行读写。

图2 . 项目整体架构图
### 2. 客户端项目结构
客户端的项目源码结构如图3所示,客户端从client.Main类中启动,显示GUI窗口,用户在窗口中操作时触发各类请求事件,调Api类中对应的方法,Api类中将要调用的服务端方法名和请求参数传给http服务类,http服务类中构造http1.1格式的请求报文,并从Server类中获取与服务端连接的socket,然后将请求发送出去,服务端响应后从socket中读取响应报文并解析为Response对象,最后将Response对象回传给GUI类去更新界面。

图3 . 客户端项目源码结构图
### 3. 服务端项目结构
服务端项目源码结构如图4所示,服务端从server.Main类启动,新建一个Server对象开始监听某个端口(此端口已在Nginx中注册),当接收到Nginx转发过来的客户端连接请求时,新建一个ClientSocketHandleThread线程类对象放到线程池中去运行,在线程的run方法中循环读取从客户端发送过来的http请求报文,从报文中解析出要调用的api和请求参数,通过反射调用api响应层中对应的api方法,api响应层接收请求参数,转交给service层进行处理,处理过程中调用dao层的方法对数据表进行增删改查,完成后将结果封装为响应数据模型返回给api响应层,api响应层再将结果封装为Response对象交给http服务类,最后由http服务类将Response对象解析为http1.1格式的响应报文发送回给客户端。

图4 . 服务端项目源码结构图
## 四、未来工作
由于时间限制,还有部分设想未完成
### 1. 服务端api增加接口JWT鉴权
通过给api方法加上权限注解,实现JWT鉴权,防止第三方对接口的攻击。
### 2. 实现redis对MySQL查询结果的缓存
目前只用redis存储了用户登录的token信息,后续要将对MySQL查询结果缓存在redis,使redis成为MySQL的前置缓存层,避免对MySQL的大量重复读请求,提升服务器性能。
### 3. 仿Tomcat重构http服务器
目前设计的http服务器结构还不够优雅,可复用性不高,之后希望能够通过模仿Tomcat的结构实现一个可复用的、轻量级的http服务器。
### 4. 对用户实施权限分级管理
词典管理者:有用户权限管理的权限,以及词典的编辑和使用的权限
词典贡献者:有词典的编辑和使用权限
词典使用者:只有检索等使用权限,无编辑权限