1. 项目背景与技术选型
高校固定资产管理系统是每个教育机构都不可或缺的核心业务系统。传统资产管理往往依赖Excel表格或老旧单机软件,存在数据孤岛、流程混乱、盘点困难等痛点。我们团队基于实际高校需求,设计了一套采用前后端分离架构的现代化解决方案。
在技术选型上,我们经过多轮对比后确定了以下技术栈:
- 后端框架:Flask + Django混合使用(Flask处理API,Django ORM管理数据)
- 前端框架:Vue 3 + Element Plus
- 开发工具:PyCharm专业版
- 数据库:MySQL 8.0
这种组合的独特优势在于:
- Flask的轻量级特性适合快速构建RESTful API
- Django ORM提供了完善的数据模型管理和迁移工具
- Vue 3的Composition API使前端组件更易维护
- PyCharm对Python和前端开发的全方位支持
关键决策点:没有使用纯Django而引入Flask,是因为项目中存在需要高度定制化的API接口,Flask的灵活性在这方面更具优势。同时保留Django ORM可以复用其强大的数据管理能力。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 整体架构图
系统采用典型的前后端分离架构:
code复制前端(Vue) ←HTTP→ 后端(Flask) ←→ 数据库(MySQL)
↑
Django ORM
2.2 核心模块划分
-
资产全生命周期管理模块
- 采购申请与审批流
- 资产入库与标签生成
- 使用记录与状态追踪
- 维修保养管理
- 报废处置流程
-
多维统计分析模块
- 按部门/人员/类别的资产分布
- 资产折旧计算与报表
- 使用效率分析
-
系统管理模块
- 角色权限管理(RBAC)
- 操作日志审计
- 系统参数配置
2.3 关键技术实现
2.3.1 混合使用Flask和Django
在app/__init__.py中的关键配置:
python复制from flask import Flask
from django.conf import settings
import django
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.django_settings')
django.setup()
app = Flask(__name__)
app.config.from_pyfile('config/flask_config.py')
这种混合架构需要注意:
- Django模型要在Flask应用初始化后导入
- 数据库连接池需要特殊配置避免冲突
- 事务管理要统一使用Django的atomic()
2.3.2 Vue前端工程结构
采用如下模块化组织:
code复制src/
├── api/ # 接口封装
├── assets/ # 静态资源
├── components/ # 通用组件
├── composables/ # 组合式函数
├── router/ # 路由配置
├── stores/ # Pinia状态管理
├── utils/ # 工具函数
└── views/ # 页面视图
3. 核心功能实现细节
3.1 资产二维码管理
每个固定资产在入库时自动生成唯一二维码,包含:
- 资产ID
- 所属部门
- 购置日期
- 责任人
前端使用vue-qrcode组件实现扫码功能:
vue复制<template>
<qrcode-vue
:value="qrValue"
:size="200"
level="H"
@click="handleScan"
/>
</template>
<script setup>
import QrcodeVue from 'qrcode.vue'
const qrValue = computed(() => {
return `ASSET:${asset.id}|DEPT:${asset.dept}|DATE:${asset.purchase_date}`
})
const handleScan = async () => {
try {
const result = await navigator.mediaDevices.getUserMedia({
video: { facingMode: 'environment' }
})
// 扫码处理逻辑
} catch (err) {
console.error('扫码失败:', err)
}
}
</script>
3.2 复杂审批流实现
采用状态机模式设计资产审批流程:
python复制from transitions import Machine
class AssetWorkflow:
states = ['draft', 'pending', 'approved', 'rejected', 'completed']
transitions = [
{'trigger': 'submit', 'source': 'draft', 'dest': 'pending'},
{'trigger': 'approve', 'source': 'pending', 'dest': 'approved'},
{'trigger': 'reject', 'source': 'pending', 'dest': 'rejected'},
{'trigger': 'complete', 'source': 'approved', 'dest': 'completed'}
]
def __init__(self):
self.machine = Machine(
model=self,
states=self.states,
transitions=self.transitions,
initial='draft'
)
在Flask中创建对应的API端点:
python复制@app.route('/api/assets/<int:asset_id>/workflow', methods=['POST'])
@login_required
def handle_workflow(asset_id):
action = request.json.get('action')
asset = Asset.objects.get(pk=asset_id)
try:
getattr(asset.workflow, action)()
asset.save()
return jsonify({'status': 'success'})
except AttributeError:
return jsonify({'error': 'Invalid action'}), 400
4. 开发环境配置指南
4.1 PyCharm专业版配置
-
安装必备插件:
- Vue.js
- Database Tools and SQL
- Python REST Client
-
配置Python解释器:
- 建议使用Pyenv管理多版本Python
- 创建专有虚拟环境:
python -m venv .venv
-
运行配置:
- 前端:npm run serve
- 后端:FLASK_APP=app flask run
4.2 数据库迁移管理
利用Django的迁移系统管理数据库变更:
bash复制# 创建迁移文件
python manage.py makemigrations
# 应用迁移
python manage.py migrate
# 生产环境注意事项
python manage.py migrate --database=production
常见问题:当同时使用Flask-Migrate和Django迁移时,要注意迁移文件的存放位置和顺序,建议统一使用Django的迁移系统。
5. 性能优化实践
5.1 缓存策略
采用Redis作为缓存层:
python复制from flask_caching import Cache
cache = Cache(config={
'CACHE_TYPE': 'RedisCache',
'CACHE_REDIS_URL': 'redis://localhost:6379/0',
'CACHE_DEFAULT_TIMEOUT': 300
})
@app.route('/api/assets')
@cache.cached(query_string=True)
def list_assets():
assets = Asset.objects.all().select_related('department')
return jsonify([a.to_dict() for a in assets])
5.2 异步任务处理
使用Celery处理耗时的报表生成任务:
python复制@app.route('/api/reports/generate', methods=['POST'])
def generate_report():
report_type = request.json.get('type')
task = generate_report_task.delay(report_type)
return jsonify({'task_id': task.id}), 202
@celery.task(bind=True)
def generate_report_task(self, report_type):
self.update_state(state='PROGRESS')
# 复杂的报表生成逻辑
return {'result': 'success'}
前端通过WebSocket获取任务进度:
javascript复制const socket = new WebSocket(`ws://${location.host}/ws/task/${taskId}`)
socket.onmessage = (event) => {
const data = JSON.parse(event.data)
progress.value = data.progress
if (data.state === 'SUCCESS') {
showReport(data.result)
}
}
6. 安全防护措施
6.1 认证与授权
采用JWT + RBAC的混合方案:
python复制from flask_jwt_extended import (
JWTManager, create_access_token,
jwt_required, get_jwt_identity
)
app.config['JWT_SECRET_KEY'] = 'super-secret'
jwt = JWTManager(app)
@app.route('/api/login', methods=['POST'])
def login():
username = request.json.get('username')
password = request.json.get('password')
user = authenticate(username, password)
if user:
additional_claims = {
'roles': [role.name for role in user.roles.all()]
}
access_token = create_access_token(
identity=username,
additional_claims=additional_claims
)
return jsonify(access_token=access_token)
return jsonify({"msg": "Bad credentials"}), 401
6.2 敏感数据保护
对资产价格等敏感字段进行加密存储:
python复制from cryptography.fernet import Fernet
key = Fernet.generate_key()
cipher_suite = Fernet(key)
class Asset(models.Model):
_price = models.BinaryField(db_column='price')
@property
def price(self):
return float(cipher_suite.decrypt(self._price).decode())
@price.setter
def price(self, value):
self._price = cipher_suite.encrypt(str(value).encode())
7. 项目部署方案
7.1 容器化部署
使用Docker Compose编排服务:
yaml复制version: '3.8'
services:
backend:
build: ./backend
ports:
- "5000:5000"
environment:
- FLASK_ENV=production
depends_on:
- redis
- db
frontend:
build: ./frontend
ports:
- "8080:8080"
db:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=secret
- MYSQL_DATABASE=asset_management
redis:
image: redis:alpine
7.2 Nginx配置示例
前端静态文件和服务代理配置:
nginx复制server {
listen 80;
server_name asset.example.com;
location / {
root /var/www/frontend/dist;
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://backend:5000;
proxy_set_header Host $host;
}
location /ws/ {
proxy_pass http://backend:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}
8. 项目经验总结
在实际开发过程中,我们积累了一些关键经验:
-
混合框架的调试技巧:
- 在PyCharm中配置复合运行配置,同时启动前后端
- 使用Remote Debug连接Docker容器内的Python进程
- 对Flask和Django分别配置不同的日志级别
-
前端性能优化:
- 对大型资产列表实现虚拟滚动
- 使用Vue的keep-alive缓存常用组件
- 按需加载Element Plus组件
-
数据库优化:
- 为高频查询字段添加索引
- 使用Django的prefetch_related优化关联查询
- 定期执行ANALYZE TABLE更新统计信息
-
团队协作建议:
- 使用Git Flow管理代码分支
- 制定统一的API文档规范
- 前后端约定好Mock数据格式
这个项目最值得分享的收获是:在技术选型上不必拘泥于单一框架,根据具体场景灵活组合不同技术的优势,往往能取得更好的效果。比如我们同时利用Flask的灵活性和Django的完备性,既满足了快速迭代的需求,又保证了系统的稳定性。
