Skip to content

资产登记网站:一个全栈项目的结构与实现

以前在学校的某个部门做勤工助学,某天上级突然说想要一套“知识产权管理系统”。具体需求没细讲——甚至没明确说要网页还是小程序(后来看别的学院搞了小程序)。总之,就是需要老师上传材料,我们去审批。于是我开始动手。

功能

凭自己理解,设计了如下流程:

  • 老师登录后可以提交知识产权材料(专利、软著等),支持多文件上传(最多10个,每个50MB)。
  • 提交后,审批人(我们)看到待审批列表,可以“通过”或“驳回”,并填写意见。
  • 系统会自动发送消息通知,比如“您的申请已通过”。
  • 基础的用户管理(增删查改)也做了。

技术栈

  • 后端:Node.js + Express + TypeScript + SQLite(开发时用)
  • 前端:Vue 3 + Pinia + Vite
  • 安全:自签名 SSL 证书,强制 HTTPS(显得安全)
  • 文件存储:本地 uploads 目录

开发时在自己的笔记本上,懒得重新配置 MySQL,直接用 SQLite 省事。后面如果要部署到服务器,会换成 MySQL。

运行截图

1
2
3
4
5
67
8
9

几个印象深刻的坑

1. 登录从“工号”改成了“手机号”

按常理想,学校老师应该用工号登录。结果被告知:“很多老师连自己工号都不知道,用手机号吧。”
于是把登录字段从 employeeId 改成 phone,用户表加了一个 phone 列,工号只当备用标识。

2. 自签名证书的信任问题

为了“假装安全”,用 OpenSSL 生成了自签名证书,启用了 HTTPS。
但老师们打开浏览器时会提示“您的连接不是私密连接”。我只能挨个说:“点高级 → 继续访问”。后来想想,还不如直接用 HTTP。

3. 文件上传大小限制

默认 Express 解析 body 有大小限制。老师传的 PDF 常超过默认值,导致 413 错误。
解决:配置 express.json({ limit: '50mb' })express.urlencoded({ extended: true, limit: '50mb' }),同时调整了 nginx 的上传限制。

4. 密码加密

用户密码不能明文存。用了 bcrypt 做哈希加盐。但领导提出“要能找回密码”,我说哈希不可逆,只能重置。最后做了重置密码功能(手动操作,没有邮件服务)。

5. SQLite 并发写入问题

SQLite 默认不支持高并发写入,好在老师数量少,访问量低,勉强能用。偶尔更新状态时报 SQLITE_BUSY,加了一个重试循环解决。

结局

项目赶在毕业前交了上去。领导没实际看过界面(金融博士,不懂技术栈),只能期待下一个勤工助学的同学会用我的代码。

这玩意代码加依赖快 300MB,就不直接扔博客了。上传 GitHub?恐怕真的会成为黑历史。

结构树

shell
asset-registration-website
├── 📁 backend/                     后端服务代码(Node.js + TypeScript)
   ├── 📁 src/                     后端源代码目录
   ├── 📁 config/              配置文件(环境变量、数据库连接配置等)
   ├── 📁 controllers/         控制器层(处理用户注册、提交材料等业务逻辑)
   ├── 📁 middleware/          中间件目录(如 auth.ts 用于身份认证与权限校验)
   ├── 📁 models/              数据模型定义(对应 User、Submission 等数据库表结构)
   ├── 📁 routes/              路由定义(映射 auth、collections、submissions 等接口)
   ├── 🔷 app.ts               Express 应用实例创建与中间件配置
   ├── 🔷 database.ts          数据库连接初始化(SQLite)
   └── 🔷 server.ts            服务器启动入口(监听端口)
   ├── 📁 uploads/                 用户上传的文件存放目录(带时间戳命名)
   ├── 📄 database.sqlite          SQLite 本地数据库文件
   └── 🟨 package.json             后端项目依赖与脚本配置(含 tsconfig 等编译配置)

├── 📁 frontend/                    前端代码(Vue 3 + TypeScript)
   ├── 📁 src/                     前端源代码目录
   ├── 📁 api/                 API 请求封装(调用 auth、collection、upload 等后端接口)
   ├── 📁 components/          可复用的 Vue 组件(如 NavigationBar.vue 顶部导航栏)
   ├── 📁 router/              路由管理(含 guards.ts 路由守卫,控制页面跳转与鉴权)
   ├── 📁 stores/              Pinia 状态管理(管理 auth 登录状态、notification 通知等)
   ├── 📁 types/               TypeScript 类型定义(如 collection.ts 收集任务接口)
   ├── 📁 views/               页面级组件
   ├── 📄 Login.vue        登录页面
   ├── 📄 Home.vue         首页
   ├── 📄 Publish.vue      发布收集任务页面(管理者用)
   ├── 📄 FillForm.vue     填写收集表单页面
   ├── 📄 Approval.vue     审批页面(上级审核提交内容)
   └── 📄 ...              其他页面(Assets、FileManager、Notifications 等)
   ├── 📄 App.vue              根组件(包含整体布局与路由出口)
   └── 🔷 main.ts              前端应用入口(创建并挂载 Vue 实例)
   ├── 🌐 index.html               HTML 模板入口
   └── 🟨 package.json             前端项目配置与依赖(含 Vite、TS 等构建配置)