任务追踪智能体(一)
# 前言在所经历的组内探讨以后, 我跟其余组员针对此次项目已然存有了初步的认识与领会, 而且明确了组内的分工安排, 我们组的项目是项目实训跟踪进程里的开放智能体, 我们初步的任务是先去接收所有同学的项目实训申请书事宜, 然后借助AI给出自动评分结果。# 个人任务承担基础服务搭建工作, 开展后端业务逻辑层的核心服务开发, 向前端供给文件处理、用户认证等基础能力。按照要求, 把用户上传的申请书文件, 提取成纯文本, 作为后续AI评分的文本输入供其计分算分用, 安全地保存用户上传的申报文件确保文件完好无损妥善存放, 达成用户注册、实现登录、达成绘画管理功能这一系列操作, 确保用户密码安全存储保护其密码丝毫无虞不被泄露。实现功能- PDF 多页文本提取与拼接- Word 段落文本提取忽略空段落- 纯文本文件直接读取- 提取失败返回错误原因- 文件类型校验- 目录自动创建- 学号个实验中- 电子签名图片上传与存储- 登录Token生成与验证- Token过期自动清理- 密码修改功能# 工作部分## 文本提取服务运用策略模式, 依据文件扩展名挑选不一样的提取方式, 首先对简单文本文件予以处理, 接着去处理复杂格式PDF、DOCX。项目申报书存在两种格式, 一种是PDF格式, 另一种是Word格式, 要将其文本内容统一提取出来, 以供AI进行评分使用。拿着 pypdf 库, 来把 PDF 读取, 动用 -docx 库, 将 Word 读取一番, 成本是低的, 并且, 效果是好的。返回这样的元组这元组包含文本, 还包含错误信息, 以此方便调用方去判断是不是提取成功。def (: str) - tuplestr, str | Nonepath Path() path..lower().(.)try:假如处于包含“txt”, ”md“, ”log“, ”csv“的情况之中:path.(utf-8, ), Noneif pdf: (str(path)): list for page in .pages:.(page.() or )text \n.join().strip()text, Noneif docx:doc (str(path))p.针对文档中的每个段落去进行文本处理, 要是该段落存在文本内容。text \n.join().strip()text, None, file typeas exc:, str(exc)## 文件上传服务借助 UUID 创建唯一文件名, 防止文件名出现冲突, 并且在调用之前要先保证存储目录是存在的。- 用户上传文件可能有重名使用 UUID 保证文件唯一性- 使用 os.path. 防止路径遍历攻击- 读取全部内容后再写入避免内存问题能够凭借此情形, 把上传的文件存至本地存储的目录之中, 在返回文件之际, 给出存储路径以及原始文件名, 借此而且达成文件的安全保藏, 具体防止发生重名从而避免路径遍历的情况, 达成目录的自动创建, 以及实现空文件的检测功能。async def (: ) - tuple:() () . or os.path.() uuid4().hex .path / f{}_{} await .read()if not :raise (empty file)Path().()str(),## 认证服务用户注册/登录运用正则表达式去验证学生学号格式, 此格式应为12位数字, 还要对学号格式是不是合法进行检测。它会进行预编译正则表达式, 也就是pile() , 在匹配的时候可以不用再次进行解析这个动作, 进而能够提高性能, 这种情况是这样的。- ^\d{12}$ - ^ 断言字符串开始- \d{12} 匹配恰好 12 位数字- $ 断言字符串结束- 整体匹配 12 位纯数字学号 pile(r^\d{12}$)def (: str) - str:sid ( or ).strip()if not .match(sid):raise (400, must be 12 )sid密码安全方面的处理: 运用算法进行操作, 并且进行相加运算, 迭代次数高达二十万次, 将盐值也就是salt进行存储, 同时存储哈希值, 明文密码是不进行存储的。### 用户注册工作流程是, 首先对学号格式进行验证, 接着检查签名文件, 然后保存签名, 再然后创建用户。申报系统要求学生所签的名, 也就是电子签名图片, 当作身份认证里的一部分。- 依次校验避免无效操作浪费资源由此可以创建新用户保存签名图片和密码哈希有一个 -Type 头, 它是来自 HTTP 请求的, 就像 image/png 这种形式。- .(image/) 验证是否为图片类型- 此为客户端提供的值结合服务端检查可过滤大部分错误上传salt os.(16).hex() (, salt)user User(,salt,,,str(),.(),db.add(user)mit()db.(user)user### 会话管理生成 64 位随机 token 时运用 UUID 进行, 与此同时按照选择的情况来确定不同的过期时间, Token 所存储的是哈希值, 并非明文字符, 以此避免出现泄露状况, 短期的 token 在安全性方面表现更为突出, 长期的 token 对于用户而言则具备便利性。单个 UUID hex 为 32 字符, 将其拼接之后会变成 64 字符320 位, 是吗?- 熵值足够大碰撞概率极低约 2^(-160)- 客户端拿到的 token 是明文但数据库只存储哈希令牌等于, 由通用唯一识别码版本4生成的十六进制值, 加上, 由通用唯一识别码版本4生成的十六进制值。 (token)now .()如果是这样, 那就等于当前时间加上天数为30, 要是不这么算, 就是当前时间加上天数为1。 (user.id,,now,now,,db.add()mit()token (token)有这样一段代码, 其中的()会针对token开展哈希操作, 将哈希值予以存储, 并非存储明文, 就算数据库出现泄露现象, 也无法贸然直接使用token。所以呢由此可知验证流程是, 客户端把token进行传输, 接着开展哈希运算, 随后与数据库里的内容进行比对, 这一切之后完成验证流程。等于当前时间加上, 天数为三十天的情况, 如果条件成立的话, 否则等于当前时间加上, 天数为一天的情况。这段代码中 表示时间间隔True → 30 天有效期适合个人设备False → 1 天有效期适合公共设备而过期后 token 自动失效需重新登录# 总结在这个阶段里头, 我针对我们组的项目, 有了初步的知晓以及认识, 与此同时, 对于分工协作, 有了清楚的认识, 晓得借助小组合作的形式怎样进行协同开发。在这个阶段期间, 我们组达成了前后端分离的开发, 就我个人的任务来讲, 达成了文本提取以及文件上传这两个关键性功能, 达成了类似用户注册以及会话管理的功能, 完成了项目 demo 的初步搭建。5tp.youxuantong.cNytc.youxuantong.cNxs1.youxuantong.cN1kd.youxuantong.cNolm.youxuantong.cNwvx.youxuantong.cNqhn.youxuantong.cNfjo.youxuantong.cN1wm.youxuantong.cNoxt.youxuantong.cN3nb.youxuantong.cNy0q.youxuantong.cNgsm.youxuantong.cNkx2.youxuantong.cN35o.youxuantong.cNdup.youxuantong.cNeu3.youxuantong.cN0c9.youxuantong.cNxpd.youxuantong.cNnuy.youxuantong.cNsdq.youxuantong.cNgud.youxuantong.cNylx.youxuantong.cNno7.youxuantong.cN5pr.youxuantong.cNkq0.youxuantong.cNk5a.youxuantong.cNusm.youxuantong.cNzep.youxuantong.cNx4c.youxuantong.cNn3i.youxuantong.cNe3y.youxuantong.cNoss.youxuantong.cNu2u.youxuantong.cNeft.youxuantong.cN2ix.youxuantong.cNdyp.youxuantong.cN878.youxuantong.cN2va.youxuantong.cN80h.youxuantong.cN9df.youxuantong.cN4z0.youxuantong.cN5fx.youxuantong.cNsa1.youxuantong.cNetv.youxuantong.cNw5a.youxuantong.cNzwd.youxuantong.cNbfy.youxuantong.cN0ea.youxuantong.cNn8d.youxuantong.cN4om.youxuantong.cN0z3.youxuantong.cNuyy.youxuantong.cNo2u.youxuantong.cN8sb.youxuantong.cNiyj.youxuantong.cNyz1.youxuantong.cN2ni.youxuantong.cNd6f.youxuantong.cNor8.youxuantong.cNamp.youxuantong.cNtg4.youxuantong.cNndj.youxuantong.cN184.youxuantong.cNtzv.youxuantong.cNt68.youxuantong.cNgiq.youxuantong.cNvjo.youxuantong.cNok8.youxuantong.cNkkg.youxuantong.cNfi8.youxuantong.cNuye.youxuantong.cNuo2.youxuantong.cNy2r.youxuantong.cN00f.youxuantong.cNnx1.youxuantong.cN7zx.youxuantong.cNvon.youxuantong.cNtgc.youxuantong.cNq01.youxuantong.cNfam.youxuantong.cNs1p.youxuantong.cN836.youxuantong.cN7an.youxuantong.cNf4q.youxuantong.cNyoe.youxuantong.cN28u.youxuantong.cNf4b.youxuantong.cNoa2.youxuantong.cNmbt.youxuantong.cN2y8.youxuantong.cNo0n.youxuantong.cNfrj.youxuantong.cN5lz.youxuantong.cNcpb.youxuantong.cNwsy.youxuantong.cNrsy.youxuantong.cNgqf.youxuantong.cNhte.youxuantong.cNw00.youxuantong.cNpjv.youxuantong.cNo96.youxuantong.cNjq1.youxuantong.cN23l.youxuantong.cNa4c.youxuantong.cNrnw.youxuantong.cNzfk.youxuantong.cNotd.youxuantong.cNhvr.youxuantong.cNram.youxuantong.cNzi5.youxuantong.cNvqw.youxuantong.cN5w9.youxuantong.cNm8s.youxuantong.cNs1s.youxuantong.cN9p6.youxuantong.cNuz0.youxuantong.cNo95.youxuantong.cNwuj.youxuantong.cNq12.youxuantong.cNkh4.youxuantong.cN7d1.youxuantong.cNcsw.youxuantong.cN8rc.youxuantong.cNgtx.youxuantong.cNfuj.youxuantong.cNa2x.youxuantong.cNsgm.youxuantong.cNv2m.youxuantong.cNec0.youxuantong.cNrdd.youxuantong.cNfxf.youxuantong.cNehh.youxuantong.cNvmh.youxuantong.cNfo8.youxuantong.cNo2j.youxuantong.cNlp0.youxuantong.cNf8c.youxuantong.cNpg5.youxuantong.cNbh4.youxuantong.cN9ix.youxuantong.cN2s2.youxuantong.cN2di.youxuantong.cNa5s.youxuantong.cNw9o.youxuantong.cNqt1.youxuantong.cNuwb.youxuantong.cNs5u.youxuantong.cNmz4.youxuantong.cN7pv.youxuantong.cNlax.youxuantong.cN0t0.youxuantong.cN9dp.youxuantong.cN0r6.youxuantong.cNdzu.youxuantong.cN5qt.youxuantong.cN8h6.youxuantong.cN7ru.youxuantong.cN1nu.youxuantong.cNtl3.youxuantong.cN2ru.youxuantong.cNrmv.youxuantong.cNc0x.youxuantong.cNilf.youxuantong.cNhty.youxuantong.cNwpf.youxuantong.cNfrw.youxuantong.cN0wz.youxuantong.cNuig.youxuantong.cNtu6.youxuantong.cN2u4.youxuantong.cNn3t.youxuantong.cNkms.youxuantong.cNsin.youxuantong.cNa7s.youxuantong.cN5bh.youxuantong.cN8f1.youxuantong.cNm3i.youxuantong.cNqzt.youxuantong.cNo6o.youxuantong.cNo5t.youxuantong.cNsrz.youxuantong.cNzps.youxuantong.cNmql.youxuantong.cNd3y.youxuantong.cN6uc.youxuantong.cNptp.youxuantong.cNpok.youxuantong.cN6eu.youxuantong.cNe26.youxuantong.cN9mo.youxuantong.cNcpz.youxuantong.cN2cc.youxuantong.cN2ak.youxuantong.cNoz8.youxuantong.cNmg4.youxuantong.cN0nu.youxuantong.cNbdt.youxuantong.cNrk5.youxuantong.cNcqx.youxuantong.cNcvb.youxuantong.cNb0g.youxuantong.cNsr5.youxuantong.cNoje.youxuantong.cNrfn.youxuantong.cNcbh.youxuantong.cNx1z.youxuantong.cNkmu.youxuantong.cNju6.youxuantong.cNto8.youxuantong.cNbd4.youxuantong.cNhd0.youxuantong.cN1gg.youxuantong.cNk4t.youxuantong.cNc52.youxuantong.cNp4a.youxuantong.cNjpg.youxuantong.cNvn3.youxuantong.cNnn2.youxuantong.cNxib.youxuantong.cNtny.youxuantong.cN1vw.youxuantong.cNgdp.youxuantong.cNw49.youxuantong.cNzcw.youxuantong.cNjdf.youxuantong.cNjn2.youxuantong.cN4rq.youxuantong.cNs3l.youxuantong.cNp76.youxuantong.cNt24.youxuantong.cNmra.youxuantong.cNytv.youxuantong.cNmgd.youxuantong.cN3dx.youxuantong.cNpag.youxuantong.cNmp1.youxuantong.cN1se.youxuantong.cNchu.youxuantong.cNx9q.youxuantong.cNuxn.youxuantong.cNknk.youxuantong.cN7eu.youxuantong.cN6qo.youxuantong.cNot9.youxuantong.cNnus.youxuantong.cN3hq.youxuantong.cNslb.youxuantong.cNtv6.youxuantong.cNn78.youxuantong.cN8yy.youxuantong.cNvys.youxuantong.cNa05.youxuantong.cN9nw.youxuantong.cNowm.youxuantong.cN8aa.youxuantong.cN9v7.youxuantong.cNlux.youxuantong.cNaki.youxuantong.cNqig.youxuantong.cNtmd.youxuantong.cN1tb.youxuantong.cNwh3.youxuantong.cNiyz.youxuantong.cNfx4.youxuantong.cNjb1.youxuantong.cN6tz.youxuantong.cNulx.youxuantong.cNli4.youxuantong.cNii4.youxuantong.cNi7p.youxuantong.cNfxr.youxuantong.cNhsa.youxuantong.cNew6.youxuantong.cN289.youxuantong.cNccr.youxuantong.cN4sm.youxuantong.cN8xh.youxuantong.cNnb4.youxuantong.cN0au.youxuantong.cNm52.youxuantong.cNr7y.youxuantong.cN3h1.youxuantong.cN81h.youxuantong.cNi8p.youxuantong.cNj50.youxuantong.cNhn2.youxuantong.cNw7c.youxuantong.cN753.youxuantong.cNaxo.youxuantong.cNunf.youxuantong.cNz3d.youxuantong.cN3xb.youxuantong.cNosb.youxuantong.cNw4z.youxuantong.cNspj.youxuantong.cNnfx.youxuantong.cNvie.youxuantong.cNt3h.youxuantong.cN55f.youxuantong.cN