乐于分享
好东西不私藏

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

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

我是 Stephen,一个自学 Java 入行的程序员,IT 行业 10+ 年的经历,今天给想要学习软件开发的朋友梳理一下软件开发全流程。

很多想学编程的朋友,最缺的不是资源,而是实战经验。

今天我就用一个真实的项目——「高考数据查询系统,开发效果可点文末阅读原文查看」,从需求分析到上线部署,手把手带你走一遍软件开发全流程。

不管你是零基础小白,还是想系统了解软件开发流程的同学,这篇文章都能帮到你。


一、需求分析——搞清楚"要做什么"

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 函数设计

后端的核心函数:

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 测试类型

测试类型
说明
例子
单元测试
测试单个函数
query函数返回正确结果
集成测试
测试多个模块配合
前端+后端+数据库
手工测试
人点点点
在浏览器测试所有功能

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

  1. 购买域名
  2. 解析到服务器IP
  3. 申请SSL证书(免费的Let's Encrypt)
  4. 配置HTTPS

七、总结

软件开发全流程就是这么几步:

需求分析 → 概要设计 → 详细设计 → 编码 → 测试 → 部署
    ↑                                              ↓
    ←←←←←←←←←←←← 维护更新 ←←←←←←←←←←←←←←←←←←←←

关键点

  • 需求分析要搞清楚"做什么"
  • 设计要把方案想清楚
  • 编码要规范、要测试
  • 部署要考虑安全和稳定

你做过什么项目?走到哪一步就卡住了?

是在需求分析阶段不知道怎么下手,还是在编码阶段遇到bug解决不了?

欢迎在评论区聊聊你的经历~