用一个实例项目,带你走一遍软件开发全流程!

我是 Stephen,一个自学 Java 入行的程序员,IT 行业 10+ 年的经历,今天给想要学习软件开发的朋友梳理一下软件开发全流程。
很多想学编程的朋友,最缺的不是资源,而是实战经验。
今天我就用一个真实的项目——「高考数据查询系统http://122.51.51.126:5104/」,从需求分析到上线部署,手把手带你走一遍软件开发全流程。
不管你是零基础小白,还是想系统了解软件开发流程的同学,这篇文章都能帮到你。
一、需求分析——搞清楚"要做什么"
1.1 发现问题
在做这个系统之前,我先问了几个问题:
问题1:现在的痛点是什么?
- 高考分数出来后,考生查录取数据很不方便
- 要一个学校一个学校去官网找
- 数据分散、格式不统一、不好对比
问题2:目标用户是谁?
- 高考考生和家长
- 志愿填报指导老师
- 教育相关从业者
问题3:需要哪些功能?
- 查一分一段:知道自己的分数排名
- 查院校录取线:找目标院校
- 查专业录取线:选专业
- 查招生计划:看今年招多少人
1.2 产出文档
需求分析的结果要写成文档,方便后面的人看。
# 高考数据查询系统需求文档## 一、项目背景[描述项目解决的问题]## 二、功能需求1. 一分一段查询2. 院校录取查询3. 专业录取查询4. 招生计划查询## 三、非功能需求- 查询速度要快(< 1秒)- 界面要简洁(手机电脑都能用)- 数据要准确(实时更新)## 四、数据来源- 考试院公布的Excel数据
小贴士: 需求文档不用写得太复杂,关键是讲清楚"做什么",而不是"怎么做"。
二、概要设计——画出系统蓝图
2.1 技术选型
根据需求,我们选择这些技术:
| 层次 | 技术 | 选择理由 |
|---|---|---|
| 前端 | HTML + CSS + JS | 轻量级,不需要构建工具 |
| 后端 | Python + Flask | 简单易学,开发效率高 |
| 数据库 | MySQL | 免费、稳定、中文资料多 |
2.2 系统架构图
┌─────────────┐ │ 用户浏览器 │ └──────┬──────┘ │ HTTP请求 ▼ ┌─────────────┐ │ Flask服务 │ │ (后端) │ └──────┬──────┘ │ SQL查询 ▼ ┌─────────────┐ │ MySQL数据库 │ │ (数据层) │ └─────────────┘
三层架构:
- 表现层:用户看到的网页
- 业务层:处理逻辑的后台代码
- 数据层:存储数据的地方
2.3 数据库设计
根据需求分析,我们设计4张核心表:
┌─────────────────────┐│ 一分一段表 ││ fact_yfyfd_segment │├─────────────────────┤│ - id (主键) ││ - 省份代码 ││ - 年份 ││ - 科类(理科/文科) ││ - 分数 ││ - 本段人数 ││ - 累计人数 │└─────────────────────┘┌──────────────────────────┐│ 专业录取分数线表 ││ fact_major_admission_line│├──────────────────────────┤│ - id (主键) ││ - 省份代码 ││ - 年份 ││ - 院校名称 ││ - 专业名称 ││ - 最低分 ││ - 录取人数 │└──────────────────────────┘
为什么这样设计?
- 每张表对应一个业务场景
- 字段名用中文,方便理解
- 添加索引,加快查询速度
三、详细设计——把方案细化
3.1 页面设计
先画出页面的草图(可以用纸笔或工具):
┌────────────────────────────────┐│ 高考数据查询系统 │├────────────────────────────────┤│ [一分一段] [院校录取] [专业录取]││ [招生计划] │├────────────────────────────────┤│ 年份:[2025 ▼] ││ 科类:[理科 ▼] ││ 分数:[____] ││ [查询] │├────────────────────────────────┤│ 分数 │ 本段人数 │ 累计人数 ││ 650 │ 120 │ 500 ││ 649 │ 115 │ 620 ││ 648 │ 118 │ 738 │└────────────────────────────────┘
3.2 接口设计
前端和后端通过"接口"通信,我们先定义好接口格式:
接口1:查询一分一段
请求:GET /query/yfyfd?year=2025&kelei=物理类&score=620响应:{ "code": 0, "data": [ {"分数": 620, "本段人数": 150, "累计人数": 5200}, {"分数": 619, "本段人数": 145, "累计人数": 5350} ], "total": 100}
接口2:查询院校录取线
请求:GET /query/univ?year=2024&keyword=清华响应:{ "code": 0, "data": [ {"院校": "清华大学", "最低分": 685, "最低位次": 100}, {"院校": "清华大学深圳...", "最低分": 672, "最低位次": 200} ]}
3.3 函数设计
后端的核心函数:
def build_where(kind, year, keyword, **filters): """构建SQL查询条件""" passdef query_data(kind, params): """执行查询,返回结果""" passdef format_response(data, total): """格式化返回数据""" pass
设计原则:
- 函数名要见名知意
- 一个函数只做一件事
- 参数不要太长(超过3个用字典)
四、编码实现——动手写代码
4.1 项目结构
gaokao_web/├── app.py # Flask主程序├── templates/ # HTML模板│ ├── base.html # 基础模板│ ├── index.html # 首页│ └── query.html # 查询页├── static/ # 静态文件│ └── style.css # 样式文件├── config.py # 配置文件└── requirements.txt # 依赖列表
4.2 代码示例
后端代码(app.py):
from flask import Flask, render_template, requestimport pymysqlapp = Flask(__name__)@app.route('/')def index(): return render_template('index.html')@app.route('/query/<kind>')def query(kind): # 获取查询参数 year = request.args.get('year') keyword = request.args.get('q') # 构建SQL sql = f"SELECT * FROM {kind}_table WHERE year = %s" params = [year] if keyword: sql += " AND name LIKE %s" params.append(f'%{keyword}%') # 执行查询 conn = pymysql.connect(...) with conn.cursor() as cursor: cursor.execute(sql, params) results = cursor.fetchall() return {'data': results}
前端代码(query.html):
<form method="get"> <select name="year"> <option value="2025">2025</option> <option value="2024">2024</option> </select> <input name="q" placeholder="输入关键词"> <button type="submit">查询</button></form><table> {% for row in data %} <tr> <td>{{ row.学校名称 }}</td> <td>{{ row.最低分 }}</td> </tr> {% endfor %}</table>
4.3 编码规范
好代码 vs 坏代码:
❌ 坏代码:
def a(b,c): s="select * from t where y="+b+" and n like '%"+c+"%'" r=db.query(s) return r
✅ 好代码:
def query_by_year_and_name(year: int, name: str) -> list: """根据年份和名称查询数据""" sql = "SELECT * FROM table WHERE year = %s AND name LIKE %s" params = (year, f'%{name}%') return db.execute(sql, params)
规范要点:
- 变量名要清晰
- 要写注释
- 要格式化代码
- 要做异常处理
五、测试——确保代码没问题
5.1 测试类型
| 测试类型 | 说明 | 例子 |
|---|---|---|
| 单元测试 | 测试单个函数 | query函数返回正确结果 |
| 集成测试 | 测试多个模块配合 | 前端+后端+数据库 |
| 手工测试 | 人点点点 | 在浏览器测试所有功能 |
5.2 测试用例示例
def test_build_where(): """测试查询条件构建""" sql, params = build_where( kind='univ', year=2024, keyword='清华' ) assert 'year = %s' in sql assert 'name LIKE %s' in sql assert params == [2024, '%清华%']
5.3 手工测试清单
□ 首页能正常打开□ 一分一段查询正常□ 院校录取查询正常□ 专业录取查询正常□ 招生计划查询正常□ 分页功能正常□ 排序功能正常□ 手机端显示正常
六、部署上线——让用户能访问
6.1 购买服务器
推荐云服务商:
- 阿里云(国内用户多)
- 腾讯云(性价比高)
- 华为云(稳定性好)
配置选择:
- CPU:2核够用
- 内存:2G够用
- 带宽:1-5Mbps
- 系统:Ubuntu 或 CentOS
6.2 安装环境
登录服务器后,执行:
# 安装Pythonapt updateapt install python3 python3-pip# 安装MySQLapt install mysql-server# 安装Nginxapt install nginx
6.3 部署代码
# 1. 上传代码到服务器scp -r ./gaokao_web root@服务器IP:/var/www/# 2. 安装Python依赖pip3 install -r requirements.txt# 3. 配置MySQLmysql -u root -p < init.sql# 4. 启动服务python3 app.py &
6.4 配置Nginx反向代理
server { listen 80; server_name gaokao.example.com; location / { proxy_pass http://127.0.0.1:5000; }}
6.5 域名和SSL
- 购买域名
- 解析到服务器IP
- 申请SSL证书(免费的Let's Encrypt)
- 配置HTTPS
七、总结
软件开发全流程就是这么几步:
需求分析 → 概要设计 → 详细设计 → 编码 → 测试 → 部署 ↑ ↓ ←←←←←←←←←←←← 维护更新 ←←←←←←←←←←←←←←←←←←←←
关键点:
- 需求分析要搞清楚"做什么"
- 设计要把方案想清楚
- 编码要规范、要测试
- 部署要考虑安全和稳定
你做过什么项目?走到哪一步就卡住了?
是在需求分析阶段不知道怎么下手,还是在编码阶段遇到bug解决不了?
欢迎在评论区聊聊你的经历~
【微信公众号:Stephen】一个毕业三年后自学 Java 入行的程序员。

浙公网安备 33010602011771号