
我是 Stephen,一个自学 Java 入行的程序员,IT 行业 10+ 年的经历,今天给想要学习软件开发的朋友梳理一下软件开发全流程。
很多想学编程的朋友,最缺的不是资源,而是实战经验。
今天我就用一个真实的项目——「高考数据查询系统,开发效果可点文末阅读原文查看」,从需求分析到上线部署,手把手带你走一遍软件开发全流程。
不管你是零基础小白,还是想系统了解软件开发流程的同学,这篇文章都能帮到你。
一、需求分析——搞清楚"要做什么"
1.1 发现问题
在做这个系统之前,我先问了几个问题:
问题1:现在的痛点是什么?
高考分数出来后,考生查录取数据很不方便 要一个学校一个学校去官网找 数据分散、格式不统一、不好对比
问题2:目标用户是谁?
高考考生和家长 志愿填报指导老师 教育相关从业者
问题3:需要哪些功能?
查一分一段:知道自己的分数排名 查院校录取线:找目标院校 查专业录取线:选专业 查招生计划:看今年招多少人
1.2 产出文档
需求分析的结果要写成文档,方便后面的人看。
# 高考数据查询系统需求文档
## 一、项目背景
[描述项目解决的问题]
## 二、功能需求
1. 一分一段查询
2. 院校录取查询
3. 专业录取查询
4. 招生计划查询
## 三、非功能需求
- 查询速度要快(< 1秒)
- 界面要简洁(手机电脑都能用)
- 数据要准确(实时更新)
## 四、数据来源
- 考试院公布的Excel数据
小贴士: 需求文档不用写得太复杂,关键是讲清楚"做什么",而不是"怎么做"。
二、概要设计——画出系统蓝图
2.1 技术选型
根据需求,我们选择这些技术:
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 函数设计
后端的核心函数:
defbuild_where(kind, year, keyword, **filters):
"""构建SQL查询条件"""
pass
defquery_data(kind, params):
"""执行查询,返回结果"""
pass
defformat_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, request
import pymysql
app = Flask(__name__)
@app.route('/')
defindex():
return render_template('index.html')
@app.route('/query/<kind>')
defquery(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):
<formmethod="get">
<selectname="year">
<optionvalue="2025">2025</option>
<optionvalue="2024">2024</option>
</select>
<inputname="q"placeholder="输入关键词">
<buttontype="submit">查询</button>
</form>
<table>
{% for row in data %}
<tr>
<td>{{ row.学校名称 }}</td>
<td>{{ row.最低分 }}</td>
</tr>
{% endfor %}
</table>
4.3 编码规范
好代码 vs 坏代码:
❌ 坏代码:
defa(b,c):
s="select * from t where y="+b+" and n like '%"+c+"%'"
r=db.query(s)
return r
✅ 好代码:
defquery_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 测试类型
5.2 测试用例示例
deftest_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 安装环境
登录服务器后,执行:
# 安装Python
apt update
apt install python3 python3-pip
# 安装MySQL
apt install mysql-server
# 安装Nginx
apt install nginx
6.3 部署代码
# 1. 上传代码到服务器
scp -r ./gaokao_web root@服务器IP:/var/www/
# 2. 安装Python依赖
pip3 install -r requirements.txt
# 3. 配置MySQL
mysql -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解决不了?
欢迎在评论区聊聊你的经历~
夜雨聆风