|
@@ -211,7 +211,7 @@
|
|
|
>
|
|
>
|
|
|
> 创建超级管理员用于登陆django的后台:`python manage.py createsuperuser `
|
|
> 创建超级管理员用于登陆django的后台:`python manage.py createsuperuser `
|
|
|
|
|
|
|
|
-### 工作内容分工
|
|
|
|
|
|
|
+## 工作内容分工
|
|
|
|
|
|
|
|
- 图片链接收集
|
|
- 图片链接收集
|
|
|
- 文章数据收集(html2markdown)
|
|
- 文章数据收集(html2markdown)
|
|
@@ -222,13 +222,15 @@
|
|
|
- 初始数据维护
|
|
- 初始数据维护
|
|
|
- 打包部署上线
|
|
- 打包部署上线
|
|
|
|
|
|
|
|
-| 姓名 | 负责内容 | 备注 |
|
|
|
|
|
-| ---- | -------- | ---- |
|
|
|
|
|
-| | | |
|
|
|
|
|
|
|
+| 姓名 | 负责内容 | 备注 |
|
|
|
|
|
+| ------ | -------------------- | ---- |
|
|
|
|
|
+| 黄略 | 总体设计、前后端开发 | |
|
|
|
|
|
+| 杨昊廷 | 前后端开发 | |
|
|
|
|
|
+| 李锐 | 数据采集、数据清洗 | |
|
|
|
|
|
+| 朱启政 | 数据采集、数据清洗 | |
|
|
|
|
|
+| 毕熙 | 数据录入、数据维护 | |
|
|
|
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-### 功能模块
|
|
|
|
|
|
|
+## 功能模块
|
|
|
|
|
|
|
|
> 参考网站:[计算机学院官网](https://www-new.gwng.edu.cn/xkxy/main.psp)
|
|
> 参考网站:[计算机学院官网](https://www-new.gwng.edu.cn/xkxy/main.psp)
|
|
|
|
|
|
|
@@ -254,18 +256,165 @@
|
|
|
- 招生信息
|
|
- 招生信息
|
|
|
- 就业信息
|
|
- 就业信息
|
|
|
|
|
|
|
|
-### 数据库设计
|
|
|
|
|
|
|
+## 数据库设计
|
|
|
|
|
|
|
|
#### 概要设计
|
|
#### 概要设计
|
|
|
|
|
|
|
|
-- 用户(**ID**,账号,密码,用户名,角色,头像)
|
|
|
|
|
-
|
|
|
|
|
-> 角色:管理员,用户
|
|
|
|
|
-
|
|
|
|
|
- 文章(**ID**,标题,markdown内容,,html内容,时间,创建人,文章分类,封面)
|
|
- 文章(**ID**,标题,markdown内容,,html内容,时间,创建人,文章分类,封面)
|
|
|
|
|
|
|
|
> 文章分类:专业介绍,领导分工,学院学科建设带头人教师,计算机系教师,软件工程系教师,数字媒体技术系教师,物联网与网络工程系教师,数学教研室教师,党政学工队伍教师,教学科研,党建动态,团学动态,招生,就业
|
|
> 文章分类:专业介绍,领导分工,学院学科建设带头人教师,计算机系教师,软件工程系教师,数字媒体技术系教师,物联网与网络工程系教师,数学教研室教师,党政学工队伍教师,教学科研,党建动态,团学动态,招生,就业
|
|
|
|
|
|
|
|
- 首页轮播图(标题,链接,序号)
|
|
- 首页轮播图(标题,链接,序号)
|
|
|
|
|
|
|
|
-#### 物理设计
|
|
|
|
|
|
|
+#### 物理设计
|
|
|
|
|
+
|
|
|
|
|
+项目设计了两个核心模型,均定义在 `common` 模块中:
|
|
|
|
|
+
|
|
|
|
|
+**Article(文章模型):** 存储所有模块的文章内容,通过 `category` 字段区分所属模块。内容以 Markdown 格式存储,请求时渲染为 HTML。
|
|
|
|
|
+
|
|
|
|
|
+| 字段 | 类型 | 说明 |
|
|
|
|
|
+| ---------------- | ------------- | --------------------- |
|
|
|
|
|
+| title | CharField | 文章标题 |
|
|
|
|
|
+| markdown_content | TextField | Markdown 格式内容 |
|
|
|
|
|
+| html_content | TextField | HTML 格式内容(预留) |
|
|
|
|
|
+| category | CharField | 文章分类(14 种) |
|
|
|
|
|
+| cover | URLField | 封面图片链接 |
|
|
|
|
|
+| created_at | DateTimeField | 创建时间 |
|
|
|
|
|
+| updated_at | DateTimeField | 更新时间 |
|
|
|
|
|
+
|
|
|
|
|
+**Banner(轮播图模型):** 存储首页轮播图数据。
|
|
|
|
|
+
|
|
|
|
|
+| 字段 | 类型 | 说明 |
|
|
|
|
|
+| ----- | ------------ | -------- |
|
|
|
|
|
+| title | CharField | 标题 |
|
|
|
|
|
+| url | URLField | 图片链接 |
|
|
|
|
|
+| order | IntegerField | 排序序号 |
|
|
|
|
|
+
|
|
|
|
|
+**数据库ER图:**
|
|
|
|
|
+
|
|
|
|
|
+```mermaid
|
|
|
|
|
+erDiagram
|
|
|
|
|
+ Article {
|
|
|
|
|
+ int id PK
|
|
|
|
|
+ string title
|
|
|
|
|
+ text markdown_content
|
|
|
|
|
+ text html_content
|
|
|
|
|
+ datetime created_at
|
|
|
|
|
+ datetime updated_at
|
|
|
|
|
+ string category
|
|
|
|
|
+ string cover
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Banner {
|
|
|
|
|
+ int id PK
|
|
|
|
|
+ string title
|
|
|
|
|
+ string url
|
|
|
|
|
+ int order
|
|
|
|
|
+ }
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+###
|
|
|
|
|
+
|
|
|
|
|
+## 构建部署
|
|
|
|
|
+
|
|
|
|
|
+### 构建docker镜像及运行
|
|
|
|
|
+
|
|
|
|
|
+- dockerfile文件
|
|
|
|
|
+
|
|
|
|
|
+```dockerfile
|
|
|
|
|
+# 使用官方Python 3.9镜像作为基础
|
|
|
|
|
+FROM python:3.9-slim
|
|
|
|
|
+
|
|
|
|
|
+# 设置工作目录
|
|
|
|
|
+WORKDIR /app
|
|
|
|
|
+
|
|
|
|
|
+# 设置环境变量
|
|
|
|
|
+ENV PYTHONDONTWRITEBYTECODE=1 \
|
|
|
|
|
+ PYTHONUNBUFFERED=1 \
|
|
|
|
|
+ DJANGO_SETTINGS_MODULE=pythonweb.settings
|
|
|
|
|
+
|
|
|
|
|
+# 安装Python依赖
|
|
|
|
|
+RUN pip install --no-cache-dir Django Markdown
|
|
|
|
|
+
|
|
|
|
|
+# 复制项目文件
|
|
|
|
|
+COPY ./pythonweb .
|
|
|
|
|
+
|
|
|
|
|
+# 创建非root用户
|
|
|
|
|
+RUN useradd -m -u 1000 django && chown -R django:django /app
|
|
|
|
|
+USER django
|
|
|
|
|
+
|
|
|
|
|
+# 暴露端口
|
|
|
|
|
+EXPOSE 8000
|
|
|
|
|
+
|
|
|
|
|
+# 启动命令
|
|
|
|
|
+CMD ["python", "/app/pythonweb/manage.py", "runserver", "8000"]
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+使用`docker build ./ -t gwng-pythonweb:v1.0`命令构建docker镜像
|
|
|
|
|
+
|
|
|
|
|
+使用`docker run --name gwng -p 8000:8000 gwng-pythonweb:v1.0`命令运行
|
|
|
|
|
+
|
|
|
|
|
+### 申请域名SSL证书
|
|
|
|
|
+
|
|
|
|
|
+```shell
|
|
|
|
|
+#安装certbot
|
|
|
|
|
+apt install cerbot
|
|
|
|
|
+#使用certbot向letsencrypt申请SSL证书
|
|
|
|
|
+certbot certonly --webroot -w /home/nginx/www/ -d pythonweb.display.anyi.space
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+### 使用nginx反向代理
|
|
|
|
|
+
|
|
|
|
|
+```nginx
|
|
|
|
|
+upstream pythonwebServer{
|
|
|
|
|
+ server 127.0.0.1:8000;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+server{
|
|
|
|
|
+ listen 80;
|
|
|
|
|
+ listen [::]:80;
|
|
|
|
|
+ server_name pythonweb.display.anyi.space;
|
|
|
|
|
+ client_max_body_size 1024m;
|
|
|
|
|
+
|
|
|
|
|
+ #certbot自动续签使用的验证路径映射
|
|
|
|
|
+ location ^~ /.well-known/acme-challenge/ {
|
|
|
|
|
+ root /home/nginx/www/;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ location / {
|
|
|
|
|
+ proxy_pass http://pythonwebServer;
|
|
|
|
|
+ proxy_set_header HOST $host;
|
|
|
|
|
+ proxy_set_header X-Forwarded-Proto $scheme;
|
|
|
|
|
+ proxy_set_header X-Real-IP $remote_addr;
|
|
|
|
|
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+server{
|
|
|
|
|
+ listen 443 ssl;
|
|
|
|
|
+ server_name pythonweb.display.anyi.space;
|
|
|
|
|
+
|
|
|
|
|
+ ssl_certificate /etc/letsencrypt/live/pythonweb.display.anyi.space/fullchain.pem;
|
|
|
|
|
+ ssl_certificate_key /etc/letsencrypt/live/pythonweb.display.anyi.space/privkey.pem;
|
|
|
|
|
+
|
|
|
|
|
+ ssl_session_cache shared:SSL:1m;
|
|
|
|
|
+ ssl_session_timeout 5m;
|
|
|
|
|
+
|
|
|
|
|
+ ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
|
|
|
|
|
+ ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
|
|
|
|
|
+
|
|
|
|
|
+ ssl_prefer_server_ciphers on;
|
|
|
|
|
+
|
|
|
|
|
+ location / {
|
|
|
|
|
+ proxy_pass http://pythonwebServer;
|
|
|
|
|
+ proxy_set_header HOST $host;
|
|
|
|
|
+ proxy_set_header X-Forwarded-Proto $scheme;
|
|
|
|
|
+ proxy_set_header X-Real-IP $remote_addr;
|
|
|
|
|
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|