基于若依前后端分离版本实现的知识管理系统

logo

RuoYi-Vue-KMS

基于ruoyi-vue实现知识管理系统 git地址:https://gitee.com/chenzuheng001/RuoYi-Vue-KMS

 

KMS-平台简介

利用空闲休息时间基于若依Vue前后端分离代码进行二次开发的KMS知识管理系统。目前系统已经完成前面五期的阶段(全文检索)的开发,目前正在梳理kms知识系统权限,后面改造若依的权限体系,让知识权限更实用。作者总共规划了7期,后续会按规划来做功能升级迭代,当然,如果作者有动力的话(希望得到更多的star),系统会陆续推出更多的实用功能。如果有更多功能推荐,欢迎交流。 +Q群:682476251

  感谢若依,KMS系统是基于若依技术框架实现,SpringBoot+Vue前后端分离,后端底层依然沿用若依的SpringBoot技术架构,前端同样使用VUE+Element UI实现。
  • 前端采用Vue、Element UI。
  • 后端采用Spring Boot、Spring Security、Redis & Jwt。
  • 权限认证使用Jwt,支持多终端认证系统。
  • 支持加载动态权限菜单,多方式轻松权限控制。
  • 高效率开发,使用代码生成器可以一键生成前后端代码。
  • 特别鸣谢:RuoYi-Vue

KMS-关于分支

有了做KMS知识管理系统这个想法之后,我做的第一件事:代码仓库管理,先fork若依vue版的demo,然后基于master拉了一个分支。

为啥要拉一个分支呢?

是这样,我验证了fork过来的代码副本,如果直接在master上修改并提交代码的话,再去同步若依的更新会把当前副本下提交的代码覆盖。而新分支下的提交的代码在同步之后还是存在的。基于此,所以拉了一个新分支。Tip:为啥fork之后还要同步,因为若依vue如果有新代码提交,不管是修复bug,还是功能升级,我们都可以同步到副本上来。

如果大家有其他更方便的方法,欢迎交流!

KMS-功能规划

第一期:实现基础功能,包括知识列表,知识新建,知识编辑,知识详情查看
1、知识新建使用富文本框作为知识正文内容,实现复杂、好看的知识内容。
2、编辑功能默认只开放给创建人使用,即本人才能编辑。
3、知识查看范围,完全公开,公开表示系统所有用户都可以看。
4、后面整体设计知识权限体系
第二期:增加知识目录关联、知识附件提交与附件预览
1、目录是层级结构,若要删除目录则要将目录下知识转移。
2、新建页面增加附件上传功能,可以提交Word,Excel,ppt、PDF等主流文件类型。
3、查看页面支持附件在线预览与下载。
4、完成附件的上传,保存和更新。
附件开发遇到的问题:详情见wiki文档第二阶段记录:Vue-KMS系统附件方案
问题1:附件预览查看
解决方案:
从测试情况来看,主流浏览器支持在线打开pdf,那么方案就是把office文件转换为pdf文件,并另存储一份,用于在线预览使用。
转换方案:使用aspose接口转换。 已经编写demo成功测试word,excel可以转换。
问题2:同一文件上传,会生成多个物理文件
去重方案:
使用md5值校验文件是否重复。
具体思路:维护一张att_file表记录每个文件的md5值,当上传新的文件时,用当前文件生成md5,然后去att_file表中比对是否有相同的记录,如果有直接返回该文件信息,不做上传处理。反之,参照新文件上传逻辑。
问题3:知识表单中上传了附件,但知识却没有提交,附件变成了游离数据,应该要清理,因为占用了资源。
解决方案:
1、维护一张att_main表,用于关联业务数据,当model_id有值时,代表该条数据(附件)是在使用的。反之,认为附件是无效的。
2、使用定时任务去做数据检查,发现无效附件数据,进行清除,包括物理文件和表记录。
3、为了错开上传时间差,定时任务执行的时间范围往前推一天。
第三期:实现知识版本管理与状态管理
1、知识第一次新建可以为草稿知识,当再次编辑,若觉得可以发布了,就提交为发布知识。反之,暂存为草稿状态。
2、当发布后的知识创建新版本之后,则产生新版本!版本号+1,新旧版本知识独立存在,互不影响!
3、在查看页面增加知识版本列表。
第四期:知识关联(暂时从规划中剔除)
场景是:多个知识之间是有前后置关系的,类似一本书的章节,这个场景的功能,我看了一些自媒体的文章创建工具里,可以通过插入超链接串起一个文章目录来实现,所以富文本框可以做到,就先搁置。

这期功能改为实现标签管理,知识标签化。

第五期:全文检索(后期重点)
参考对比网上的检索方案,最终决定使用elasticsearch.本项目采用的是elasticsearch-7.17.0版本
不要安装kibana连es,推荐:elasticvue插件,只需要安装浏览器插件即可。

 下载地址:https://download.csdn.net/download/kingchen2010/86922649

第六期:知识点评
你创建的知识是否受欢迎,是否受到大家的喜爱,评分打星来体现。
同时可以留言与回复,进行友好互动。
第七期:流程审批
目前主流的工作流开源框架有Activiti、Camunda、Flowable。如何抉择?有建议吗?

系统部分截图

         

版本内容更新

2022/5/23 上传第一期功能。

2022/5/28 上传第二期功能。

2022/5/29 附件预览查看、使用md5值校验文件是否重复、附件机制。

2022/6/28 上传第三期功能。

2022/9/10 实现知识全文检索功能,实现过程移步到wiki里的[ElasticSearch+Kibana实现全文检索方案](https://gitee.com/chenzuheng001/RuoYi-Vue-KMS/wikis/ElasticSearch+Kibana%E5%AE%9E%E7%8E%B0%E5%85%A8%E6%96%87%E6%A3%80%E7%B4%A2%E6%96%B9%E6%A1%88%E2%80%94%E2%80%94SpringBoot%E6%95%B4%E5%90%88)

2022/9/11 梳理知识权限体系,让系统更加实用!实现代码可以查看wiki里的[KMS知识数据权限过滤](https://gitee.com/chenzuheng001/RuoYi-Vue-KMS/wikis/KMS%E7%9F%A5%E8%AF%86%E6%95%B0%E6%8D%AE%E6%9D%83%E9%99%90%E8%BF%87%E6%BB%A4)

2022/9/24 vue增加bpmn-js依赖,开始流程之旅。详情点击[在项目中使用bpmn.js,开启流程设计之旅](https://gitee.com/chenzuheng001/RuoYi-Vue-KMS/wikis/Vue/%E5%9C%A8%E9%A1%B9%E7%9B%AE%E4%B8%AD%E4%BD%BF%E7%94%A8bpmn.js%EF%BC%8C%E5%BC%80%E5%90%AF%E6%B5%81%E7%A8%8B%E8%AE%BE%E8%AE%A1%E4%B9%8B%E6%97%85?sort_id=6089960)

2022/10/1 增加流程模板维护,知识目录关联流程模板,则在该目录下创建知识都要走当前模板配置的流程审批。

2022/10/2 提交了审批组件,实现了通过操作。

2022/10/5 增加历史审批记录。

2022/10/6 增加阅读者表,流程审批人默认拥有该知识的查看权限,方便审批。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
这是一个比较大的项目,需要涉及到前后端分离、数据库设计、用户认证、API接口设计等多方面知识。以下是一个简单的步骤: 1. 确定数据库设计,包括学生信息表、用户表等; 2. 搭建Django项目,并安装各种必要的依赖包; 3. 编写用户认证系统,包括注册、登录、注销等功能; 4. 编写API接口,包括获取学生列表、添加学生、修改学生信息、删除学生等; 5. 前端使用Vue或React等框架,调用后端API接口实现前后端分离; 6. 编写前端页面,包括学生列表展示、添加学生表单、修改学生信息表单等。 具体实现细节可以参考下面的代码示例: 1. 数据库设计 在Django项目中,定义学生信息模型和用户模型: ```python from django.db import models from django.contrib.auth.models import AbstractUser class Student(models.Model): name = models.CharField(max_length=50) age = models.IntegerField() gender = models.CharField(max_length=10) class_number = models.CharField(max_length=50) class User(AbstractUser): name = models.CharField(max_length=50) phone = models.CharField(max_length=11) ``` 2. 用户认证系统 在Django项目中,使用Django自带的认证系统实现用户注册、登录、注销等功能: ```python from django.contrib.auth import authenticate, login, logout from django.contrib.auth.decorators import login_required from django.contrib.auth.forms import UserCreationForm from django.shortcuts import render, redirect def register(request): if request.method == 'POST': form = UserCreationForm(request.POST) if form.is_valid(): form.save() return redirect('login') else: form = UserCreationForm() return render(request, 'register.html', {'form': form}) def user_login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') user = authenticate(username=username, password=password) if user is not None: login(request, user) return redirect('student_list') else: return render(request, 'login.html', {'error': 'Invalid login'}) else: return render(request, 'login.html') @login_required def user_logout(request): logout(request) return redirect('login') ``` 3. API接口设计 在Django项目中,使用Django REST framework实现API接口: ```python from rest_framework import viewsets from rest_framework.permissions import IsAuthenticated from .serializers import StudentSerializer from .models import Student class StudentViewSet(viewsets.ModelViewSet): permission_classes = [IsAuthenticated] queryset = Student.objects.all() serializer_class = StudentSerializer ``` 4. 前端页面 使用Vue框架编写前端页面,调用后端API接口实现前后端分离: ```html <template> <div> <h1>学生列表</h1> <table> <thead> <tr> <th>姓名</th> <th>年龄</th> <th>性别</th> <th>班级</th> <th>操作</th> </tr> </thead> <tbody> <tr v-for="student in students" :key="student.id"> <td>{{ student.name }}</td> <td>{{ student.age }}</td> <td>{{ student.gender }}</td> <td>{{ student.class_number }}</td> <td> <button @click="editStudent(student)">编辑</button> <button @click="deleteStudent(student)">删除</button> </td> </tr> </tbody> </table> <button @click="addStudent">添加学生</button> </div> </template> <script> import axios from 'axios' export default { name: 'StudentList', data() { return { students: [] } }, mounted() { this.getStudents() }, methods: { getStudents() { axios.get('/api/student/') .then(response => this.students = response.data) }, addStudent() { this.$router.push('/add-student') }, editStudent(student) { this.$router.push(`/edit-student/${student.id}`) }, deleteStudent(student) { axios.delete(`/api/student/${student.id}/`) .then(() => this.getStudents()) } } } </script> ``` 以上仅是一个简单的示例,实际项目中需要考虑更多的细节。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Julian向前冲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值