论文格式检测网站经验总结第一弹

2023-11-11

这是我的第一个实战项目,前前后后开发了大致有两个多月的时间,在开发过程中我担任的是整个项目的后端部分(只有我一个人),采用的编程语言是Python,后端框架为Django,我总结了主要的知识点如下

  • Django的基本使用(视图函数, 路由, settings配置, orm相关操作)
  • Django的进阶知识,配合DjangoRestframework(分页器, 解析器, 序列化器, 限流器, 权限认证器, 身份认证器, 渲染器, 筛选器(不属于DRF))
  • RBAC权限管理
  • Linux系统基本操作
  • git想关操作
  • Redis, MySQL基本操作(由于有操作的封装, 要求比较低)
  • Celery先关思想和操作
  • PostMan等api接口测试工具
  • DevOps自动化部署

1. 项目概览

1.1 需求分析

由于全国大学毕业生数量每年都在增多, 每年毕业季毕业论文的数量也水涨船高, 由于很多大学生在学校期间很少写过论文,并且对自己学校对论文格式的要求并不了解. 每年都有大部分人在论文写完后多次返工,不仅浪费时间也浪费精力.本项目就是旨在帮助毕业生们对论文进行一次检测找到格式不合理的位置,并给出改正建议.

1.2 项目模块

经过对需求的相关分析,项目大致分为一下几个模块

  1. Account(记录全部模块的账号,权限, 角色信息)
  2. BackendManage(平台后台管理系统)
  3. media(储存各种静态文件)
  4. PaperDetector(与远程论文检测API进行交互)
  5. Payment(积分支付相关组件)
  6. Stark(快速添加对数据库操作的路由)

1.3 表结构设计

使用Django的ORM系统能够方便的对数据库进行一系列的操作,故针对具体的要求,设计表结构如下

1.3.1 Account模块下对应的表结构设计

class Account(AbstractUser):
    """用户"""
    avatar = models.URLField(verbose_name="用户头像", default='avatars/default.png')
    invitation_code = models.CharField(verbose_name="邀请码", null=True, blank=True, max_length=20,
                                       help_text="用于推广平台,用户注册时填写邀请码给予相应邀请人积分奖励")
    real_name = models.CharField(verbose_name="真实姓名", max_length=150, null=True, blank=True, help_text="后期用于实名")
    telephone = models.CharField(max_length=11, null=True, blank=True, unique=True, help_text="后期用于实名")
    organization = models.CharField(verbose_name="机构名", null=True, blank=True, max_length=150, help_text="用户所属机构")
    integral = models.IntegerField(verbose_name="积分", default=100, help_text="用户校验论文需要的积分,默认100")
    delete = models.BooleanField(verbose_name="删除", default=False)

    roles = models.ManyToManyField(verbose_name="角色", to="Role", blank=True)
    OpenID = models.CharField(verbose_name="微信ID", null=True, max_length=150)

    def __str__(self):
        return self.username


class Permission(models.Model):
    """权限"""
    title = models.CharField(verbose_name="权限名称", max_length=32)
    url = models.CharField(verbose_name="权限URL正则表达式", max_length=256)
    name = models.CharField(verbose_name="权限URL别名", max_length=32, unique=True)
    icon = models.CharField(verbose_name="权限图标", max_length=32, null=True, blank=True)
    parentPermission = models.ForeignKey(verbose_name="父权限", to="Permission", null=True, blank=True,
                                         on_delete=models.PROTECT, help_text="非菜单权限需要一个二级菜单的父权限做默认展开和选中")

    def __str__(self):
        return self.title


class Role(models.Model):
    """角色"""
    name = models.CharField(verbose_name="角色名称", max_length=32)
    level = models.IntegerField(verbose_name="等级", default=50,
                                help_text="根据角色等级安排优先级,1-50划分为5档,用于建立多级反馈队列调度系统。")

    permissions = models.ManyToManyField(verbose_name="角色所拥有权限", to='Permission', blank=True)

    def __str__(self):
        return self.name

1.3.2 PaperDetector下表结构设计

def user_directory_path(instance, filename):
    # file will be uploaded to MEDIA_ROOT/<id>/<filename>
    return f"PaperTemplate/{instance.user.username}/{filename}"


def user_directory_path2(instance, filename):
    # file will be uploaded to MEDIA_ROOT/<id>/<filename>
    return f"PaperVerify/Upload_paper/{instance.TaskId.user.username}/{filename}"


# Create your models here.
class PaperTemplate(models.Model):
    """论文模板库"""
    filename = models.CharField(verbose_name="论文模板文件名", max_length=128, help_text="用户上传的论文模板文件名")
    filepath = models.FileField(upload_to=user_directory_path, verbose_name="论文模板文件地址",
                                help_text="论文模板文件存放地址")
    organization = models.CharField(verbose_name="机构名", max_length=20, help_text="论文模板所属机构,如:南开大学、IEEE")
    date = models.DateTimeField(verbose_name="上传日期", help_text="论文模板上传日期")
    isOpen = models.BooleanField(verbose_name='是否公开', help_text="公开论文模板所有人可选,私有论文模板仅限本人使用")
    template = models.TextField(verbose_name="论文模板信息",
                                help_text="后端解析论文模板内容,按照预定义规则生成模板信息")
    user = models.ForeignKey(verbose_name="用户ID", to=Account, on_delete=models.PROTECT,
                             help_text="论文模板上传者ID")
    is_deleted = models.BooleanField(verbose_name="是否删除", default=False)

    def __str__(self):
        return self.filename


class TaskVerify(models.Model):
    """校验任务库"""
    level = models.IntegerField(verbose_name="任务优先级", help_text="任务优先级")
    user = models.ForeignKey(verbose_name="用户ID", to=Account, on_delete=models.PROTECT,
                             help_text="论文模板上传者ID")
    Queue = models.CharField(verbose_name="校验论文队列", help_text="所属任务校验论文的顺序", max_length=300)
    Processing_phase = models.CharField(max_length=12,
                                        choices=(
                                            ("Created", u"创建"), ("Processing", u"处理中"), ("Finished", u"已经完成"),
                                            ("Failed", u"请求出错")))
    isDeleted = models.BooleanField(default=False, verbose_name="是否删除")

    def __str__(self):
        return str(self.level)


class PaperVerify(models.Model):
    """ 校验论文库 """
    filename = models.CharField(verbose_name="校验论文文件名", help_text="上传论文文件名", max_length=128)
    templateId = models.ForeignKey(verbose_name="论文模板ID", to="PaperTemplate", on_delete=models.PROTECT,
                                   help_text="校验论文模板")
    TaskId = models.ForeignKey(verbose_name="所属任务ID", to="TaskVerify", on_delete=models.PROTECT,
                               help_text="所属任务ID")
    filepath = models.FileField(verbose_name="校验论文文件地址", help_text="校验论文文件存放地址",
                                upload_to=user_directory_path2)
    date = models.DateTimeField(verbose_name="上传日期", help_text="校验论文长传日期")
    checkModule = models.TextField(verbose_name="校验模块列表",
                                   help_text="1-封面、2-声明、3-摘要、4-正文、5-参考文献、6-致谢")
    checkContent = models.TextField(verbose_name="校验内容列表",
                                    help_text="1-格式检查、2-拼写检查、3-语法检查、4-论文内容查重")
    checkState = models.IntegerField(verbose_name="论文校验进度",
                                     help_text="0-文件已存储、1-模块划分完成、2-格式提取完成、3-格式对比完成、4-拼写/语法检查完成、5-文档报告生成完毕")
    formatInformation = models.TextField(verbose_name="论文格式信息")
    annotationFile = models.CharField(verbose_name="批注文件地址", max_length=300)
    errorReportFile = models.CharField(verbose_name="错误报告文件地址", max_length=300)
    resultFolder = models.CharField(verbose_name="结果文件夹地址",
                                    help_text="用户打包下载,直接压缩结果文件夹所有文件发送", max_length=300)
    PaperID = models.CharField(verbose_name="论文ID", max_length=50)

    def __str__(self):
        return self.filename

1.3.3 Payment下表结构设计

class order(models.Model):
    orderid = models.CharField(max_length=150, verbose_name="订单编号")
    cash_fee = models.IntegerField(verbose_name="订单金额")
    status = models.CharField(max_length=150, verbose_name="订单状态")
    bank_type = models.CharField(max_length=150, verbose_name="支付方式")
    user = models.ForeignKey(Account, on_delete=models.CASCADE, verbose_name="订单用户")
    time_create = models.DateTimeField(auto_now=True, verbose_name="订单创建时间")

2. Account模块中表设计的原则:RBAC详解

2.1 RBAC介绍(借用其他博客)

2.1.1 在RBAC模型里面,有3个基础组成部分,分别是:用户角色权限

RBAC通过定义角色的权限,并对用户授予某个角色从而来控制用户的权限,实现了用户和权限的逻辑分离(区别于ACL模型),极大地方便了权限的管理:

User(用户):每个用户都有唯一的UID识别,并被授予不同的角色
Role(角色):不同角色具有不同的权限
Permission(权限):访问权限
用户-角色映射:用户和角色之间的映射关系
角色-权限映射:角色和权限之间的映射

2.1.2 RBAC支持三个著名的安全原则:最小权限原则、责任分离原则和数据抽象原则

最小权限原则:RBAC可以将角色配置成其完成任务所需的最小权限集合
责任分离原则:可以通过调用相互独立互斥的角色来共同完成敏感的任务,例如要求一个计账员和财务管理员共同参与统一过账操作
数据抽象原则:可以通过权限的抽象来体现,例如财务操作用借款、存款等抽象权限,而不是使用典型的读、写、执行权限

2.2 我理解的RBAC

请添加图片描述
通俗的说,就是一个角色可以有多个权限,每个用户可以拥有多个角色,这样就方便了用户的管理

3. PaperDetector表结构设计

请添加图片描述
不难看出,采用了RBAC管理之后,用户的角色决定了其任务的优先级

4. Payment表结构设计

请添加图片描述
关系比较简单就不多解释了

5. 总结

由于项目涉及的知识点很多,我打算多写几期来总结,本期就先把表结构设计和整体的框架写完,欢迎持续关注哦!!!这期用的RBAC管理表设计,之前只在书上见过,主要问题就是ORM的增删改查,关系中的一对一,一对多,多对多的关系.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

论文格式检测网站经验总结第一弹 的相关文章

  • Kivy - 有所有颜色名称的列表吗?

    在 Kivy 中 小部件 color属性允许输入其值作为字符串颜色名称 也 例如在 kv file Label color red 是否有所有可能的颜色名称的列表 就在这里 来自Kivy 的文档 https kivy org doc sta
  • Django子模板可以创建新块作为钩子吗

    我有以下场景 基本 html block content endblock 孩子 html extends base html block content p Overriding content p endblock block chil
  • Mac OS X 中文件系统的 Unicode 编码在 Python 中不正确?

    在 OS X 和 Python 中处理 Unicode 文件名有点困难 我试图在代码中稍后使用文件名作为正则表达式的输入 但文件名中使用的编码似乎与 sys getfilesystemencoding 告诉我的不同 采取以下代码 usr b
  • Python 中的流式传输管道

    我正在尝试使用 Python 将 vmstat 的输出转换为 CSV 文件 因此我使用类似的方法转换为 CSV 并将日期和时间添加为列 vmstat 5 python myscript py gt gt vmstat log 我遇到的问题是
  • Python3.0 - 标记化和取消标记化

    我正在使用类似于以下简化脚本的内容来解析较大文件中的 python 片段 import io import tokenize src foo bar src bytes src encode src io BytesIO src src l
  • Pandas:如果单元格包含特定文本则删除行

    pandas 中的这段代码不起作用 如果该列包含提供的任何文本 数字 我希望它删除该行 目前 我只能在单元格与我的代码中传递的确切文本匹配时才能使其工作 因为它只删除显示 Fin 的单元格不是金融或金融 df2 df df Team Fin
  • 重定向到 /admin/login/ 结果为 302

    当用户未经身份验证时 我尝试重定向到登录页面 在我的settings py我的课程有 MIDDLEWARE CLASSES path to AuthRequiredMiddleware 这是我的课程 class AuthRequiredMi
  • 在 Django OAuth Toolkit 中安全创建新应用程序

    如何将 IsAdminUser 权限添加到 Django OAuth Toolkit 中的 o applications 视图 REST FRAMEWORK DEFAULT PERMISSION CLASSES rest framework
  • 如何使用文本相似性删除 pandas 数据框中相似(不重复)的行?

    我有数千个数据 这些数据可能相似也可能不相似 使用 python 的默认函数 drop duplicates 并没有真正的帮助 因为它们只检测相似的数据 例如 如果我的数据包含类似以下内容怎么办 嗨 早上好 嗨 早上好 Python 不会将
  • 结构差异 sudo() run('sudo 命令')

    我想知道函数之间有什么区别sudo 和函数run sudo u user smth 文档上有 sudo 在所有运行方式上都是相同的 除了它总是换行 调用 sudo 程序中的给定命令以提供超级用户 特权 但有几次 sudo cmd 提示我输入
  • 使用Python计算目录的大小?

    在我重新发明这个特殊的轮子之前 有没有人有一个很好的例程来使用 Python 计算目录的大小 如果例程能够很好地以 Mb Gb 等格式格式化大小 那就太好了 这会遍历所有子目录 总结文件大小 import os def get size s
  • SMTP_SSL SSLError: [SSL: UNKNOWN_PROTOCOL] 未知协议 (_ssl.c:590)

    此问题与 smtplib 的 SMTP SSL 连接有关 当与 SMTP 无 ssl 连接时 它正在工作 在 SMTP SSL 中尝试相同的主机和端口时 出现错误 该错误仅基于主机 gmail 设置也工作正常 请检查下面的示例 如果 Out
  • Matplotlib 中 x 轴标签的频率和旋转

    我在下面编写了一个简单的脚本来使用 matplotlib 生成图形 我想将 x tick 频率从每月增加到每周并轮换标签 我不知道从哪里开始 x 轴频率 我的旋转线产生错误 TypeError set xticks got an unexp
  • 如何在 pandas 中使用 read_fwf 跳过空行?

    I use pandas read fwf http pandas pydata org pandas docs stable generated pandas read fwf htmlPython pandas 0 19 2 中的函数读
  • Django 基于类的视图上的 success_url 的反向抱怨循环导入

    当使用基于方法的视图时 重定向为reverse没有抱怨这一点 并且仍然可以找到 root url conf 但是 在基于阶级的观点中 它抱怨 ImproperlyConfigured at blog new post The include
  • 使用 Django 在 Google 地图上放置标记

    我正在尝试使用 API 和 HTML5 地理位置根据 Google 地图上模型中存储的纬度和经度放置标记 问题是如何使用模板关键字循环遍历 JavaScript 标签中存储的每个对象的经纬度信息 我不认为这可以在 Django 中完成 我在
  • Python SSL X509:KEY_VALUES_MISMATCH

    Python HTTPS server from http server import HTTPServer SimpleHTTPRequestHandler import ssl https stackoverflow com a 408
  • 混淆矩阵不支持多标签指示符

    multilabel indicator is not supported是我在尝试运行时收到的错误消息 confusion matrix y test predictions y test is a DataFrame其形状为 Horse
  • Django 与谷歌图表

    我试图让谷歌图表显示在我的页面上 但我不知道如何将值从 django 视图传递到 javascript 以便我可以绘制图表 姜戈代码 array Year Sales Expenses 2004 1000 400 2005 1170 460
  • 多个对象以某种方式相互干扰[原始版本]

    我有一个神经网络 NN 当应用于单个数据集时 它可以完美地工作 但是 如果我想在一组数据上运行神经网络 然后创建一个新的神经网络实例以在不同的数据集 甚至再次同一组数据 上运行 那么新实例将产生完全错误的预测 例如 对 XOR 模式进行训练

随机推荐

  • 读 沉思 第三次 有感

    第三次沉思 一 忘记在哪里看到了这本书的推荐 就买了 决定这学期细细品味这本书 第三次沉思 这本书是著名物理学家 斯蒂芬 温伯格 2021年7月23日与世长辞 关于科学 物理 宇宙 社会观评 个人遐想的文集 很值得细细品味 2022年4月9
  • C语言易错选择判断题

    选择题 1 设有如下定义 struct sk int a float b data p 若有p data 则对data中的成员a的正确引用是 B A p data a B p a C p gt data a D p data a 解析 本题
  • 异常:org.springframework.http.converter.HttpMessageConversionException: Type definition error:

    org springframework http converter HttpMessageConversionException Type definition error simple type class org apache iba
  • 手动为k8s的kubelet生成有效期30年的证书

    这个东西的作用有 1 在新部署k8s集群时 就生成30年证书 这样就不用1年后为kubelet更换证书 2 在证书快到期时 手动生成新证书 替换原证书 不需要替换key 这样只需要重启 服务器或kubelet服务 就能使用新证书 不用等到证
  • Python绘制三角函数图(sin\cos\tan)并标注特定范围

    根据我们指定的条件检索函数中的元素 import matplotlib pyplot as plt import numpy as np a np linspace 0 2 np pi 50 b np sin a plt plot a b
  • 总结sanic博客

    使用sanic openapi 博客计划 1 阅读sanic的源码和案例 已经做注解 https github com huge success sanic 2 使用sanic openapi优化api界面 https github com
  • 口语理解任务源码详解系列(二)利用seq2seq-attention模型实现

    利用seq2seq attention模型实现 写在前面 在前文介绍了项目的数据集构建 传送门 本文利用seq2seq attention实现 实现细节请参考论文 Attention Based Recurrent Neural Netwo
  • S7协议抓包分析(附pcap数据包)

    一 S7协议概述 1 S7协议简介 S7comm S7 通信 是西门子专有协议 可在西门子 S7 300 400 系列的可编程逻辑控制器 PLC 之间运行 它用于 PLC 编程 PLC 之间的数据交换 从 SCADA 监控和数据采集 系统访
  • 算法:单圈绝对值编码器处理成多圈的

    硬件描述 单圈编码器的分辨率是4096 功能描述 将单圈数据处理处理成多圈数据 起始圈数是1000圈 long GetCurrentAbsTotalValue long lValue long m absEncTotal 计算编码器总时间片
  • STM32与USB3300共同实现USB OTG HS的CDC串口通信速度测试

    项目场景 STM32和上位机传统通信方式就是串口 IIC SPI等 IIC和SPI一般不常用 串口是用的最多的通信方式 然而串口一般用于输出调试信息这种对传输速度没要求的场景 那种大容量数据快速传输的场景 串口显得捉襟见肘 STM32自带U
  • Siebel是什么意思

    简介 Siebel是电子商务软件的突出供应商 其客户关系管理 CRM 企业资源管理 ERM 以及合作关系管理 PRM 应用设计用于实现企业这些方面的自动化以及允许企业在互联网和零售或电话中心网络等其它渠道来执行和调节相关任务 Sieble的
  • Unity中的Animator动画详解

    Unity中的Animator动画详解 Animator动画导入 Animator动画详解 动画类型选择 Rig面板属性 Mode面板属性 Animation面板属性 动画片段 控制使用 Animator动画 创建动画控制器 添加需要播放的
  • 疑似APT组织响尾蛇的JavaScript脚本调试分析

    APT组织响尾蛇JavaScript脚本调试分析 样本描述 样本分析 投递手法 HTA JS代码 JavaScript调试方式 IE 打印参数 代码逻辑 样本描述 响尾蛇投递与巴基斯坦外交政策有关的LNK文件 LNK文件不携带主要的恶意代码
  • 认识一下以太坊、EOS和Hyperledger等不同的区块链

    不同的区块链智能合约和区块链技术现在风靡一时 越来越多的人出于某种原因试图进入这个神奇的世界 如果你是这项技术的新手并正在寻找基于区块链的开发平台的快速入门 那么本指南非常适合你 我们将重点关注和比较的平台是 Ethereum EOS Hy
  • eclipse上配置JavaFX完整教程

    1 选择菜单栏Help中的Install New Software 2 点击Add添加安装JavaFx环境 name e fx clipse Location http download eclipse org efxclipse upda
  • QT4、5、6各版本之间的特点和选择

    文章目录 0 引入 1 稳定版本 2 各版本冷知识 持续补充 3 5 0系列主要版本特性 4 建议 0 引入 QT用的最多的是QT5系列 qt6系列目前虽然是一个大版本 增加了更多的系列 但是不稳定且要求win10以及以上版本 1 稳定版本
  • 图像处理系列——直方图之灰度直方图(Image Histogram)

    目录 0 前言 1 理论知识 2 数学原理 3 案例分析 4 代码实现
  • 在CSS之中实现

  • C语言基础练习题

    文章目录 一 初始C语言 题目1 7 前言 最近做的一些C语言的基础题目 可能有错 最近找忙着找工作 内容 一 依次输入10个数 求出之中的最大数 int main int a i t i 2 scanf d a 先输入第一个数的值 t a
  • 论文格式检测网站经验总结第一弹

    这是我的第一个实战项目 前前后后开发了大致有两个多月的时间 在开发过程中我担任的是整个项目的后端部分 只有我一个人 采用的编程语言是Python 后端框架为Django 我总结了主要的知识点如下 Django的基本使用 视图函数 路由 se