更新了最后10天的文档

pull/351/head
jackfrued 2019-10-28 23:20:39 +08:00
parent d036c5cf10
commit 00a3941355
7 changed files with 593 additions and 33 deletions

View File

@ -243,21 +243,21 @@ MySQL在过去由于性能高、成本低、可靠性好已经成为最流行
-- 创建学院表
create table tb_college
(
collid int auto_increment comment '编号',
collname varchar(50) not null comment '名称',
intro varchar(500) default '' comment '介绍',
collid int auto_increment comment '编号',
collname varchar(50) not null comment '名称',
collintro varchar(500) default '' comment '介绍',
primary key (collid)
);
-- 创建学生表
create table tb_student
(
stuid int not null comment '学号',
stuname varchar(20) not null comment '姓名',
sex boolean default 1 comment '性别',
birth date not null comment '出生日期',
addr varchar(255) default '' comment '籍贯',
collid int not null comment '所属学院',
stuid int not null comment '学号',
stuname varchar(20) not null comment '姓名',
stusex boolean default 1 comment '性别',
stubirth date not null comment '出生日期',
stuaddr varchar(255) default '' comment '籍贯',
collid int not null comment '所属学院',
primary key (stuid),
foreign key (collid) references tb_college (collid)
);
@ -265,10 +265,10 @@ MySQL在过去由于性能高、成本低、可靠性好已经成为最流行
-- 创建教师表
create table tb_teacher
(
teaid int not null comment '工号',
teaname varchar(20) not null comment '姓名',
title varchar(10) default '助教' comment '职称',
collid int not null comment '所属学院',
teaid int not null comment '工号',
teaname varchar(20) not null comment '姓名',
teatitle varchar(10) default '助教' comment '职称',
collid int not null comment '所属学院',
primary key (teaid),
foreign key (collid) references tb_college (collid)
);
@ -276,10 +276,10 @@ MySQL在过去由于性能高、成本低、可靠性好已经成为最流行
-- 创建课程表
create table tb_course
(
couid int not null comment '编号',
couname varchar(50) not null comment '名称',
credit int not null comment '学分',
teaid int not null comment '授课老师',
couid int not null comment '编号',
couname varchar(50) not null comment '名称',
coucredit int not null comment '学分',
teaid int not null comment '授课老师',
primary key (couid),
foreign key (teaid) references tb_teacher (teaid)
);
@ -287,11 +287,11 @@ MySQL在过去由于性能高、成本低、可靠性好已经成为最流行
-- 创建选课记录表
create table tb_record
(
recid int auto_increment comment '选课记录编号',
sid int not null comment '选课学生',
cid int not null comment '所选课程',
seldate datetime default now() comment '选课时间日期',
score decimal(4,1) comment '考试成绩',
recid int auto_increment comment '选课记录编号',
sid int not null comment '选课学生',
cid int not null comment '所选课程',
seldate datetime default now() comment '选课时间日期',
score decimal(4,1) comment '考试成绩',
primary key (recid),
foreign key (sid) references tb_student (stuid),
foreign key (cid) references tb_course (couid),
@ -548,13 +548,13 @@ MySQL在过去由于性能高、成本低、可靠性好已经成为最流行
```SQL
-- 插入学院数据
insert into tb_college (collname, intro) values
insert into tb_college (collname, collintro) values
('计算机学院', '创建于1956年是我国首批建立计算机专业。学院现有计算机科学与技术一级学科和网络空间安全一级学科博士学位授予权其中计算机科学与技术一级学科具有博士后流动站。计算机科学与技术一级学科在2017年全国第四轮学科评估中评为A2019 U.S.News全球计算机学科排名26名ESI学科排名0.945‰进入全球前1‰位列第43位。'),
('外国语学院', '1998年浙江大学、杭州大学、浙江农业大学、浙江医科大学四校合并成立新的浙江大学。1999年原浙江大学外语系、原杭州大学外国语学院、原杭州大学大外部、原浙江农业大学公外部、原浙江医科大学外语教学部合并成立浙江大学外国语学院。2003年学院更名为浙江大学外国语言文化与国际交流学院。'),
('经济管理学院', '四川大学经济学院历史悠久、传承厚重其前身是创办于1905年的四川大学经济科,距今已有100多年的历史。已故著名经济学家彭迪先、张与九、蒋学模、胡寄窗、陶大镛、胡代光以及当代著名学者刘诗白等曾先后在此任教或学习。在长期的办学过程中学院坚持以马克思主义的立场、观点、方法为指导围绕建设世界一流经济学院的奋斗目标做实“两个伟大”深度融合不断提高党的建设质量与科学推进一流事业深度融合。');
-- 插入学生数据
insert into tb_student (stuid, stuname, sex, birth, addr, collid) values
insert into tb_student (stuid, stuname, stusex, stubirth, stuaddr, collid) values
(1001, '杨逍', 1, '1990-3-4', '四川成都', 1),
(1002, '任我行', 1, '1992-2-2', '湖南长沙', 1),
(1033, '王语嫣', 0, '1989-12-3', '四川成都', 1),
@ -571,10 +571,10 @@ MySQL在过去由于性能高、成本低、可靠性好已经成为最流行
delete from tb_student where stuid=4040;
-- 更新学生数据
update tb_student set stuname='杨过', addr='湖南长沙' where stuid=1001;
update tb_student set stuname='杨过', stuaddr='湖南长沙' where stuid=1001;
-- 插入老师数据
insert into tb_teacher (teaid, teaname, title, collid) values
insert into tb_teacher (teaid, teaname, teatitle, collid) values
(1122, '张三丰', '教授', 1),
(1133, '宋远桥', '副教授', 1),
(1144, '杨逍', '副教授', 1),
@ -582,7 +582,7 @@ MySQL在过去由于性能高、成本低、可靠性好已经成为最流行
(3366, '韦一笑', '讲师', 3);
-- 插入课程数据
insert into tb_course (couid, couname, credit, teaid) values
insert into tb_course (couid, couname, coucredit, teaid) values
(1111, 'Python程序设计', 3, 1122),
(2222, 'Web前端开发', 2, 1122),
(3333, '操作系统', 4, 1122),

View File

@ -1,6 +1,6 @@
## 团队项目开发的问题和解决方案
我们经常听到个人开发和团队开发这两个词,所谓个人开发就是一个人把控产品的所有内容;而团队开发则是由多个人组团并完成产品的开发。要实施团队开发以下几点是必不可少的:
个人开发和团队开发这两个词相信对大家来说并不陌生。所谓个人开发就是一个人把控产品的所有内容;而团队开发则是由多个人组团并完成产品的开发。要实施团队开发以下几点是不可或缺的:
1. 对开发过程中的各种事件(例如:谁到什么时间完成了什么事情)进行管理和共享。
2. 在团队内部共享各类工作成果以及新的知识技巧等。
@ -10,6 +10,8 @@
### 团队项目开发常见问题
团队开发相较于个人开发,容易遇到以下几个方面的问题。
#### 问题1传统的沟通方式无法确定处理的优先级
例如:使用邮件进行沟通可能出现邮件数量太多导致重要的邮件被埋没,无法管理状态,不知道哪些问题已经解决,哪些问题尚未处理,如果用全文检索邮件的方式来查询相关问题效率过于低下。
@ -107,6 +109,8 @@ tar -xvf git-2.23.0.tar
yum -y install libcurl-devel
```
> 说明没有这个依赖库git的网络功能将无法执行。
安装前的配置。
```Shell
@ -575,6 +579,8 @@ tar -xvf ZenTaoPMS.pro8.5.2.zbox_64.tar
持续集成对于编译型语言的意义更大对于Python这样的解释型语言更多的时候是用于对接版本控制系统触发自动化测试并产生相应的报告。类似的功能也可以通过在Git服务上配置**Webhook**来完成,码云甚至可以直接对接[钉钉开放平台](<https://ding-doc.dingtalk.com/>)使用钉钉机器人来向项目相关人员发送即时消息。Gitlab也对CI和CD持续交付提供了支持具体内容请大家参考[《GitLab CI/CD基础教程》](<https://blog.stdioa.com/2018/06/gitlab-cicd-fundmental/>)。
> **说明**
>
> 1. 关于敏捷开发的相关内容,有兴趣的读者可以阅读知乎上的[《这才是敏捷开发》](<https://zhuanlan.zhihu.com/p/33472102>)一文。

View File

@ -137,3 +137,8 @@ API接口返回的数据通常都是**JSON**或**XML**格式,我们这里不
/* ... */
}
```
> 提示如果没有接口文档撰写经验可以使用在线接口文档编辑平台RAP2或YAPI来进行接口文档撰写也可以参考我的[《方天下(租房项目)接口文档》](../番外篇/方天下(租房项目)接口文档.md)来了解如何撰写接口文档。

View File

@ -1574,7 +1574,7 @@ class BlacklistPermission(permissions.BasePermission):
![](./res/rbac-full.png)
2. ACL - 访问控制列表(每个用户绑定自己的访问白名单)。
2. ACL - 访问控制列表(每个用户绑定自己的访问白名单或黑名单)。
#### 访问限流
@ -1616,7 +1616,7 @@ def example_view(request, format=None):
# 此处省略下面的代码
```
当然也可以通过继承`BaseThrottle`来自定义限流策略,通常需要重写`allow_request`和`wait`方法。
当然也可以通过继承`SimpleRateThrottle`来自定义限流策略,通常需要重写`allow_request`和`wait`方法。
### 异步任务和计划任务
@ -2272,9 +2272,11 @@ TOTAL 267 176 34%
4. 使用 - 在页面右侧可以看到一个调试工具栏上面包括了执行时间、项目设置、请求头、SQL、静态资源、模板、缓存、信号等调试信息查看起来非常的方便。
5. 项目上线之前,请记住**去掉django-debug-toolbar相关的所有配置**。
### 部署相关
请参考《Django项目上线指南》
请参考[《项目部署上线和性能调优》](98.项目部署上线和性能调优.md)
### 性能相关

View File

@ -70,4 +70,4 @@ Selenium是实现Web应用程序的功能测试以及集成测试自动化的浏
4. 在Jenkins的“系统管理”中选择“系统设置”并配置“Selenium Remote Control”下的“HTMLSuite Runner”。
5. 新建测试用的Jenkins任务并进行配置配置的内容包括浏览器、起始URL、测试套件和测试结果输出文件。
配置完成后就可以执行Jenkins的“立即构建”了。
配置完成后就可以执行Jenkins的“立即构建”了。

View File

@ -271,7 +271,7 @@ pip install -r code/teamproject/requirements.txt
5. 启动服务器。
```Shell
uwsgi --ini conf/uwsgi.ini
nohup uwsgi --ini conf/uwsgi.ini &
```
### Nginx的配置
@ -756,6 +756,8 @@ class MasterSlaveRouter(object):
[Supervisor](https://github.com/Supervisor/supervisor)是一个用Python写的进程管理工具可以很方便的用来在类Unix系统下启动、重启自动重启程序和关闭进程目前Supervisor暂时还没有提供对Python 3的支持可以通过Python 2来安装和运行Supervisor再通过Supervisor来管理Python 3的程序。
> **提示**还有一个和Supervisor功能类似的工具名为Circus支持Python 3。
1. 安装Supervisor。
```Shell

View File

@ -0,0 +1,545 @@
## 方天下项目(租房网站)接口文档
0. 用户登录 - **POST** `/api/login/`
开发者:骆昊
版本号v1
最后修改时间:
接口说明:登录成功后,会在`tb_user_token`表中保存或更新用户令牌token
使用帮助:测试数据库中预设了四个可供使用的账号,如下表所示。
| 用户名 | 用户口令 | 角色 |
| ---------- | -------- | ------------ |
| jackfrued | 123456 | 管理员 |
| wangdachui | 123123 | 普通用户 |
| hellokitty | 123123 | 房地产经理人 |
| wuzetian | 123456 | 房东 |
请求参数:
| 参数名 | 类型 | 是否必填 | 参数位置 | 说明 |
| -------- | ------ | -------- | -------- | -------- |
| username | 字符串 | 是 | 消息体 | 用户名 |
| password | 字符串 | 是 | 消息体 | 用户口令 |
响应信息:
- 登录成功:
```JSON
{
"code": 30000,
"message": "用户登录成功",
"token": "f83e0f624e2311e9af1f00163e02b646"
}
```
- 登录失败:
```JSON
{
"code": 30001,
"message": "用户名或密码错误"
}
```
1. 发送短信验证码 - **GET** `/api/mobile_code/{国内手机号}/`
开发者:骆昊
版本号v1
接口说明给指定手机号发送短信验证码的接口手机号必须是国内手机号作为路径参数写到URL中。接口显示短信发送成功时指定的手机号并不会收到短息因为使用的三方短信平台赠送的测试短信已经用完了。
使用帮助:国内手机号暂不支持国际区号。
请求参数:暂无。
响应信息:
- 请求成功:
```JSON
{
"code": 10001,
"msg": "短信验证码发送成功"
}
```
- 两次请求间隔小于60秒
```JSON
{
"code": 10002,
"msg": "请不要在60秒以内重复发送手机验证码"
}
```
- 手机号无效:
```JSON
{
"code": 10003,
"msg": "请提供有效的手机号"
}
```
- 短信服务平台故障:
```JSON
{
"code": 10004,
"msg": "短信服务暂时无法使用"
}
```
2. 获取所有省级行政单位 - **GET** `/api/districts/`
开发者:骆昊
版本号v1
接口说明:暂无。
使用帮助:暂无。
请求参数:暂无。
响应信息:
```JSON
[
{
"distid": 110000,
"name": "北京市"
},
{
"distid": 120000,
"name": "天津市"
}
]
```
3. 获取指定行政单位详情及其管辖的行政单位 - **GET** `/api/districts/{行政单位编号}/`
开发者:骆昊
版本号v1
接口说明通过URL参数指定行政单位编号如果行政单位编号为省级行政单位编号则返回该省以及该省所辖市级行政单位的信息如果行政单位编号为市级行政单位编号则返回该市以及该市所辖区县的信息如果行政单位编号为区县一级行政单位编号则返回该区县的信息下级行政单位`cities`属性值为`[]`。
使用帮助数据库中除四川省外其他行政单位的“intro”数据都没有录入该字段可能为空字符串。
请求参数:暂无。
响应信息:
```JSON
{
"distid": 510000,
"name": "四川省",
"intro": "位于中国西南地区内陆东连重庆南邻云南、贵州西接西藏北界陕西、甘肃、青海四川省总面积48.6万平方千米省会成都。截至2018年底四川省下辖18个省辖市3个自治州17个县级市108个县4个自治县54个市辖区。",
"cities": [
{
"distid": 510100,
"name": "成都市"
},
{
"distid": 510300,
"name": "自贡市"
},
{
"distid": 510400,
"name": "攀枝花市"
}
]
}
```
4. 获取热门城市 - **GET** `/api/hotcities/`
开发者:骆昊
版本号v1
接口说明:暂无。
使用帮助:暂无。
请求参数:暂无。
响应信息:
```JSON
[
{
"distid": 110100,
"name": "北京市"
},
{
"distid": 120100,
"name": "天津市"
},
{
"distid": 130100,
"name": "石家庄"
}
]
```
5. 分页获取房地产经理人信息 - **GET** `/api/agents/`
开发者:骆昊
版本号v1
接口说明经理人姓名按照前缀模糊匹配的方式进行处理经理人服务星级是指经理人服务星级不得低于该星级经理人是否持证只有0未持证上岗和1持证上岗两个选项。三个参数代表的筛选条件之间是而且的关系。返回结果为分页之后的房地产经理人信息。
使用帮助:暂无。
请求参数:
| 参数名 | 类型 | 是否必填 | 参数位置 | 说明 |
| ------ | ------ | -------- | -------- | ---------------------------------|
| name | 字符串 | 否 | 查询参数 | 经理人姓名 |
| key | 字符串 | 否 | 查询参数 | 经理人服务星级 |
| cert | 字符串 | 否 | 查询参数 | 经理人是否持证 |
| page | 整数 | 否 | 查询参数 | 页码默认值为1 |
| size | 整数 | 否 | 查询参数 | 页面大小默认值为5最大值不超过50 |
响应信息:
```JSON
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"agentid": 6,
"estates": [
{
"estateid": 11,
"name": "灵芝新村",
"hot": 20
}
],
"name": "肖利丽",
"tel": "13040813886",
"servstar": 4,
"realstar": 4,
"profstar": 4,
"certificated": false
}
]
}
```
6. 新增房地产经理人 - **POST** `/api/agents/`
开发者:骆昊
版本号v1
接口说明:暂无。
使用帮助:需要登录且拥有管理员权限,用户身份令牌在请求头中提供。
请求参数:
| 参数名 | 类型 | 是否必填 | 参数位置 | 说明 |
| ------------ | ------ | -------- | -------- | ---------------- |
| name | 字符串 | 是 | 消息体 | 经理人姓名 |
| tel | 字符串 | 是 | 消息体 | 经理人手机 |
| servstar | 整数 | 否 | 消息体 | 默认值0 |
| realstar | 整数 | 否 | 消息体 | 默认值0 |
| profstar | 整数 | 否 | 消息体 | 默认值0 |
| certificated | 整数 | 否 | 消息体 | 默认值0 |
| token | 字符串 | 是 | 请求头 | 用户身份认证令牌 |
响应信息:
- 新增成功 - 状态码**201**
```JSON
{
"agentid": 8,
"estates": [],
"name": "孙小美",
"tel": "13800991234",
"servstar": 0,
"realstar": 0,
"profstar": 0,
"certificated": false
}
```
- 未提供身份认证信息 - 状态码**401**
```JSON
{
"detail": "不正确的身份认证信息。"
}
```
- 当前用户没有操作权限 - 状态码**403**
```JSON
{
"detail": "您没有执行该操作的权限。"
}
```
7. 编辑房地产经理人信息 - **PUT** `/api/agents/{房地产经理人编号}/`
开发者:骆昊
版本号v1
接口说明:暂无。
使用帮助:需要登录且拥有管理员权限,用户身份令牌在请求头中提供。
请求参数:
| 参数名 | 类型 | 是否必填 | 参数位置 | 说明 |
| ------------ | ------ | -------- | -------- | ---------------- |
| name | 字符串 | 是 | 消息体 | 经理人姓名 |
| tel | 字符串 | 是 | 消息体 | 经理人手机 |
| servstar | 整数 | 否 | 消息体 | 默认值0 |
| realstar | 整数 | 否 | 消息体 | 默认值0 |
| profstar | 整数 | 否 | 消息体 | 默认值0 |
| certificated | 整数 | 否 | 消息体 | 默认值0 |
| token | 字符串 | 是 | 请求头 | 用户身份认证令牌 |
响应信息:
- 更新成功 - 状态码**200**
```JSON
{
"agentid": 1,
"estates": [
{
"estateid": 1,
"name": "今日家园",
"hot": 20
},
{
"estateid": 2,
"name": "翡翠园",
"hot": 30
},
{
"estateid": 3,
"name": "万科城市花园",
"hot": 22
}
],
"name": "袁晓梦",
"tel": "158173555285",
"servstar": 5,
"realstar": 4,
"profstar": 3,
"certificated": true
}
```
- 未提供身份认证信息 - 状态码**403** - 与新增类同
- 当前用户没有操作权限 - 状态码**403** - 与新增类同
8. 删除房地产经理人 - **DELETE** `/api/agents/{房地产经理人编号}/`
开发者:骆昊
版本号v1
接口说明:暂无。
使用说明:暂无。
请求参数:
| 参数名 | 类型 | 是否必填 | 参数位置 | 说明 |
| ------ | ------ | -------- | -------- | ---------------- |
| token | 字符串 | 是 | 请求头 | 用户身份认证令牌 |
响应信息:
- 删除成功 - 状态码**204**
- 未提供身份认证信息 - 状态码**403** - 与新增类同
- 当前用户没有操作权限 - 状态码**403** - 与新增类同
9. 分页获取楼盘信息 - **GET** `/api/estates/`
开发者:骆昊
版本号v1
接口说明经理人姓名按照前缀模糊匹配的方式进行处理经理人服务星级是指经理人服务星级不得低于该星级经理人是否持证只有0未持证上岗和1持证上岗两个选项。三个参数代表的筛选条件之间是而且的关系。返回结果为分页之后的房地产经理人信息。
使用帮助:暂无。
请求参数:
| 参数名 | 类型 | 是否必填 | 参数位置 | 说明 |
| ------ | ------ | -------- | -------- | ----------------------------------- |
| name | 字符串 | 否 | 查询参数 | 楼盘名(模糊匹配) |
| dist | 字符串 | 否 | 查询参数 | 楼盘所在地区编号 |
| page | 整数 | 否 | 查询参数 | 页码默认值为1 |
| size | 整数 | 否 | 查询参数 | 页面大小默认值为5最大值不超过50 |
响应信息:
```JSON
{
"count": 16,
"next": "https://120.77.222.217/api/estates/?page=2",
"previous": null,
"results": [
{
"estateid": 6,
"district": {
"distid": 440303,
"name": "罗湖区"
},
"agents": [
{
"agentid": 2,
"name": "杨伟",
"tel": "13352939550",
"servstar": 3
},
{
"agentid": 4,
"name": "郭志鹏",
"tel": "13686810707",
"servstar": 4
}
],
"name": "幸福里",
"hot": 300,
"intro": ""
}
]
}
```
10. 新增楼盘 - **POST** `/api/estates/`
开发者:骆昊
版本号v1
接口说明:暂无。
使用帮助:需要登录且拥有管理员权限,用户身份令牌在请求头中提供。
请求参数:
| 参数名 | 类型 | 是否必填 | 参数位置 | 说明 |
| ------ | ------ | -------- | -------- | ------------------------ |
| name | 字符串 | 是 | 消息体 | 楼盘名称 |
| hot | 整数 | 否 | 消息体 | 楼盘热度默认值0 |
| intro | 字符串 | 否 | 消息体 | 楼盘介绍,默认值空字符串 |
| distid | 整数 | 是 | 消息体 | 楼盘所在地区编号 |
| token | 字符串 | 是 | 请求头 | 用户身份认证令牌 |
响应信息:
- 新增成功 - 状态码**201**
```JSON
{
"estateid": 17,
"district": 510107,
"name": "世纪锦苑",
"hot": 100,
"intro": ""
}
```
- 未提供身份认证信息 - 状态码**403**
```JSON
{
"detail": "请提供有效的身份认证信息"
}
```
- 当前用户没有操作权限 - 状态码**403**
```JSON
{
"detail": "You do not have permission to perform this action."
}
```
11. 编辑楼盘信息 - **PUT** `/api/estates/{楼盘编号}`
12. 删除楼盘信 - **DELETE** `/api/estates/{楼盘编号}`
13. 获取所有户型信息 - **GET** `/api/housetypes/`
14. 新增户型 - **POST** `/api/housetypes/`
15. 编辑户型信息 - **PUT** `/api/housetypes/{户型编号}`
16. 删除户型 - **DELETE** `/api/housetypes/{户型编号}`
17. 分页获取房源信息 - **GET** `/api/houseinfos/`
开发者:骆昊
版本号v1
接口说明:暂无。
使用帮助:暂无。
请求参数:
| 参数名 | 类型 | 是否必填 | 参数位置 | 说明 |
| --------- | ------ | -------- | -------- | ----------------------------------- |
| title | 字符串 | 否 | 查询参数 | 房源标题关键词 |
| dist | 整数 | 否 | 查询参数 | 楼盘所在地区编号 |
| min_price | 整数 | 否 | 查询参数 | 价格区间下限 |
| max_price | 整数 | 否 | 查询参数 | 价格区间上限 |
| type | 整数 | 否 | 查询参数 | 户型编号 |
| page | 整数 | 否 | 查询参数 | 页码默认值为1 |
| size | 整数 | 否 | 查询参数 | 页面大小默认值为5最大值不超过50 |
响应信息:
```JSON
{
"count": 7,
"next": "http://localhost:8000/api/houseinfos/?dist=440303&page=2",
"previous": null,
"results": [
]
}
```
18. 查看房源详情 - **GET** `/api/houseinfos/{房源编号}`
19. 新增房源 - **POST** `/api/houseinfos/`
20. 编辑房源信息 - **PUT** `/api/houseinfos/{房源编号}`
21. 删除房源 - **DELETE** `/api/houseinfos/{房源编号}`
22. 随机获取指定数量的房源标签 - **GET** `/api/tags/`
23. 分页查看房源标签 - **GET** `/api/tags/`
24. 新增房源标签 - **POST** `/api/tags/`
25. 删除房源标签 - **DELETE** `/api/tags/{房源编号}`
26. 查看房源的图片 - **GET** `/api/houseinfos/{房源编号}/photos/`
27. 为房源添加图片 - **POST** `/api/houseinfos/{房源编号}/photos/`
28. 删除房源图片 - **DELETE** `/api/houseinfos/{房源编号}/photos/{图片编号}`