# Enterprise-level-project-training
**Repository Path**: yinyuek/enterprise-level-project-training
## Basic Information
- **Project Name**: Enterprise-level-project-training
- **Description**: 企业级项目实训
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-06-22
- **Last Updated**: 2021-07-05
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 企业级项目实训
### 小组成员 邮箱:
- 罗泽武1901010726 1847044616@qq.com
- 林俊佳1901010316 813168339@qq.com
- 谢晓东1901010637 2451206734@qq.com
- 陈立浩1901250105 15815181467@163.com
### 01 设计一个RBAC模型
- RBAC模型
### 02 设计ERD数据库结构
- ERD数据库关系结构设计
### 03 Postman测试
- Postman测试天气API接口
### 04 Docker安装
### 05 时序图设计
- 上传功能时序图
- 创建任务时序图
- 注册功能时序图
### 06 Docker实操
- 安装docker
- 拉取并运行一个Busyboxy容器,进入容器的shell查看其内部资源 docker pull busybox
- 编写一个Nginx Dockerfile,构建并运行该容器
dockerfile
```
FROM nginx:1.21.0
EXPOSE 80
COPY ./assets /usr/share/nginx/assets
COPY ./nginx.conf /etc/nginx/nginx.conf
RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list && \
sed -i 's/security.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list
RUN apt update && apt install tree
```
nginx.conf
```
exents{
worker_connections 1024;
}
http{
server{
listen 80;
location / {
root /usr/share/nginx/assets;
}
}
}
```
assets/index.html
```
nginx服务
``` ``` sudo docker build --tag my_nginx -f .dockerfile . ```
```
sudo docker run -p 8080:80 my_nginx
```
- 尝试将本地的某文件目录映射到容器,使得Nginx返回目录内的静态文件资源
### 07 搭建容器化的Django开发环境
- 创建装满满Django项目
```
> django-admin startproject zmm
```
- 创建两个Django应用
- "common" 应用将实现通用的Saas功能,如用户管理,租户管理以及租户数据隔离
```
> cd zmm
> python3 manage.py startapp common
```
- “load_planner”应用将实现与装箱业务相关的功能,包含集装箱运柜数据管理、装箱任务管理
```
> python3 manage.py startapp load_planer
```
- Dockerfile
```
#设置基础镜像
FROM python:3.8
#创建/code文件夹,作为放应用代码的地方
RUN mkdir /code
#将主机的应用代码 搬运到镜像内部
COPY . /code
# WORKDIR=>work directory 进入工作目录,进入容器后所在的默认位置
WORKDIR /code
# 将Django,DRF以及IPython装到镜像中
RUN pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ && \
pip config set global.trusted-host mirrors.aliyun.com && \
pip install Django djangorestframework IPython
```
- 设置镜像源
```
#创建镜像配置文件
touch ~/.docker/daemon.json
```
```
#编辑~/.docker/daemon.json,添加如下内容
{
"registry-mirrors": ["https://alzgoonw.mirror.aliyuncs.com"]
}
```
- 在django项目目录下新建scripts文件夹存放如下文件
- scripts/run.sh
```
./scripts/db_ready.sh
cd zmm
if [ "$DJANGO_RESET_DB" = true ]; then
echo 'Completely resetting database... all previous data will be dropped!'
python manage.py reset_db
fi
# Migrate ZMM apps
# 迁移django自己的数据模型
python manage.py migrate
## 为我们自己的django迁移模型
python manage.py makemigrations common
python manage.py makemigrations load_planner
python manage.py migrate
# Start ZMM apps
python manage.py runserver 0.0.0.0:8080
```
- scripts/db_ready.sh
```
#!/bin/bash
if [ -z "$POSTGRES_USER" ]; then
export POSTGRES_USER=postgres
fi
# If not DB is set, then use USER by default
if [ -z "$POSTGRES_DB" ]; then
export POSTGRES_DB=$POSTGRES_USER
fi
# Need to update the DATABASE_URL if using DOCKER
export DATABASE_URL=postgres://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_DB:$POSTGRES_PORT/$POSTGRES_DB
# Wait for postgres server to be available
function postgres_ready(){
python << END
import sys
import psycopg2
try:
conn = psycopg2.connect(dbname="$POSTGRES_DB", user="$POSTGRES_USER", password="$POSTGRES_PASSWORD", host="$POSTGRES_HOST")
# cur = conn.cursor()
# cur.execute("GRANT USAGE ON SCHEMA public TO root;")
# cur.execute("GRANT CREATE ON SCHEMA public TO root;")
except psycopg2.OperationalError:
sys.exit(-1)
sys.exit(0)
END
}
until postgres_ready; do
>&2 echo "Postgres is unavailable - sleeping"
sleep 5
done
```
- scripts/reset_db.py
```
import psycopg2
import logging
from django.core.management.base import BaseCommand
from django.conf import settings
class Command(BaseCommand):
help = __doc__
def close_other_sessions(self, cursor, database_name):
close_sessions_query = """
SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = '%s';
""" % database_name
cursor.execute(close_sessions_query)
def handle(self, *args, **options):
if settings.ENVIRONMENT in ('staging', 'production'):
raise Exception('Stop it!')
# Prepare connection and db cursor
dbinfo = settings.DATABASES.get('default')
conn_params = {
'database': 'template1',
'user': dbinfo.get('USER'),
'password': dbinfo.get('PASSWORD'),
'host': dbinfo.get('HOST'),
'port': dbinfo.get('PORT'),
}
connection = psycopg2.connect(**conn_params)
connection.set_isolation_level(0) # autocommit false
cursor = connection.cursor()
# Forcefully close other still connected sessions
database_name = dbinfo.get('NAME')
self.close_other_sessions(cursor, database_name)
# Drop existing database
drop_query = "DROP DATABASE \"%s\";" % database_name
logging.info('Executing... "%s"', drop_query)
try:
cursor.execute(drop_query)
except psycopg2.ProgrammingError as e:
logging.exception("Error: %s", str(e))
# Create the dropped database (clean)
create_query = "CREATE DATABASE \"%s\"" % database_name
create_query += " WITH OWNER = \"%s\" " % dbinfo.get('USER')
create_query += " ENCODING = 'UTF8';"
logging.info('Executing... "%s"', create_query)
cursor.execute(create_query)
```
进入script文件夹,赋予各个文件权限
```
chmod 775 db_ready.sh
chmod 775 reset_db.py
chmod 775 run.sh
```
- 查看文件状态 ls
- change mode 变成可以被执行的文件
- 在Dockerfile同一级别目录下创建docker-compose.yml
```
version: '3.5'
services:
postgres:
image: postgres:11.1
container_name: "psql_db"
volumes:
- postgres_data:/var/lib/postgresql/data/
zmm:
build:
context: .
container_name: "zmm_app"
volumes:
- .:/code
depends_on:
- postgres
volumes:
postgres_data:
```
- 构建镜像
```
sudo docker-compose up
```
- 提示需要执行 sudo apt install docker-compose
```
sudo apt install docker-compose
```
- 更新docker-compose.yml,添加command: bash -c "./scripts/run.sh"
```
version: '3.5'
services:
postgres:
image: postgres:11.1
container_name: "psql_db"
volumes:
- postgres_data:/var/lib/postgresql/data/
zmm:
build:
context: .
container_name: "zmm_app"
command: bash -c "./scripts/run.sh"
volumes:
- .:/code
depends_on:
- postgres
volumes:
postgres_data:
```
- 报错 no muddle psycopg2-binary
- 修改Dockerfile 添加 psycopg2-binary
```
#设置基础镜像
FROM python:3.8
#创建/code文件夹,作为放应用代码的地方
RUN mkdir /code
#将主机的应用代码 搬运到镜像内部
COPY . /code
# WORKDIR=>work directory 进入工作目录,进入容器后所在的默认位置
WORKDIR /code
# 将Django,DRF以及IPython装到镜像中
RUN pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ && \
pip config set global.trusted-host mirrors.aliyun.com && \
pip install Django djangorestframework IPython psycopg2-binary
```
- 重新构建镜像
```
sudo docker-compose up --build
```
- 更新docker-compose.yml
```
version: '3.5'
services:
postgres:
image: postgres:11.1
container_name: "psql_db"
volumes:
- postgres_data:/var/lib/postgresql/data/
networks:
- zmm
expose:
- "5432"
zmm:
build:
context: .
container_name: "zmm_app"
command: bash -c "./scripts/run.sh"
volumes:
- .:/code
depends_on:
- postgres
networks:
- zmm
ports:
- "8080:8080"
volumes:
postgres_data:
networks:
zmm:
```
- 修改Django zmm/zmm/setting.py
```
DATABASES = {
'default':{
#从环境变量中读取数据库的各项配置参数
#并使用PostgrSQL数据库引擎
'ENGINE':'django.db.backends.postgresql',
'NAME':os.environ['POSTGRES_DB'],
'USER':os.environ['POSTGRES_USER'],
'PASSWORD':os.environ['POSTGRES_PASSWORD'],
'HOST':os.environ['POSTGRES_HOST'],
'PORT':os.environ['POSTGRES_PORT']
}
}
```
- 新建和dockerfle同级目录的 .env文件
```
POSTGRES_DB=zmm
POSTGRES_USER=admin
POSTGRES_PASSWORD=password
POSTGRES_HOST=postgres
POSTGRES_PORT=5432
```
- 修改Docker-compose文件
```
version: '3.5'
services:
postgres:
image: postgres:11.1
container_name: "psql_db"
volumes:
- postgres_data:/var/lib/postgresql/data/
env_file:
- .env
networks:
- zmm
expose:
- "5432"
zmm:
build:
context: .
container_name: "zmm_app"
command: bash -c "./scripts/run.sh"
volumes:
- .:/code
env_file:
- .env
depends_on:
- postgres
networks:
- zmm
ports:
- "8080:8080"
volumes:
postgres_data:
networks:
zmm:
```
- docker 命令
```
docker volume ls找到尾缀是postgres_db的volume
docker volume rm 删除该volume
docker-compose down 删除当前的容器
docker-compose up 重启容器
```
- 再次构建镜像
```
sudo docker-compose up --build
```
- 遇到的问题
docker volume ls
- 查看 找到尾缀是postgres_db的volume
```
docker volume ls
```
- 删除该volume
```
docker volume rm zmm_postgres_data
```
- Error response from daemon: remove zmm_postgres_data: volume is in use - [f72f91a71b3f14d07b9f82ab2581d3589383536d9d43bfc6c4c3829c75bf1f0e]
- 查看docker容器正在运行的进程
```
docker ps -a
```
- 停止使用
```
sudo docker volume down
```
- 再次删除
```
docker volume rm zmm_postgres_data
```
- 修改load_planner里面的models.py
```
from django.db import models
class ShippingContainer(models.Model):
name=models.FloatField(help_text='运柜的名字,比如 20GP')
length=models.FloatField(help_text='运柜的长度')
width=models.FloatField(help_text='运柜的宽度')
height=models.FloatField(help_text='运柜的高度')
created=models.DateTimeField(auto_now_add=True,help_text='数据创建时间戳')
```
settings.py添加common和load_planer
```
# INSTALLED_APPS添加
'common',
'load_planer',
```
common的models.py
```
from django.db import models
class Tenant(models.Model):
schema_name=models.CharField(
max_length=75,
unique=True,
help_text='租户的Schema名'
)
organization = models.TextField(
null=True,
default=None,
help_text='租户的企业名称'
)
created=models.DateTimeField(auto_now_add=True,help_text='数据创建时间')
```
- 启动docker
```
docker-compose up
```
### 08 ubuntu安装vscode
- vscode官网下载vscode安装包 .deb文件,在所在路径下打开终端
```
sudo dpkg -i .deb文件名
```
### 09 ubuntu安装chrome
```
sudo apt-get install libxss1 libappindicator1 libindicator7
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo dpkg -i google-chrome*.deb
```
- 如果上面运行sudo dpkg -i google-chrome*.deb命令之后报错,使用如下命令修复一下:sudo apt-get install -f,之后再次运行sudo dpkg -i google-chrome*.deb命令就可以了
### 10 搭建django容器化开发环境
### 11 ubuntu安装postman
```
sudo snap install postman
```
### 12 ubuntu安装 gIt
```
sudo apt-get install git
```
### 13 postman测试api接口
### 14 用户鉴权访问视图步骤
### 15 Postman测试任务API接口状态
- 终端运行情况
- 注册
- 查询用户
- 创建任务
- 查询任务
### 16 HTTP请求方法
```
HTTP
GET PODT PATCH DELETE
获取 创建 更新 删除
1. 注册 POST
2. 登录 POST
3. 创建任务 POST
4. 更新任务 PATCH
- 请求体的使用
{
"submit":true,
"input_dataset":[{
"name":"organersssaaaaaa"
}]
}
5 获取任务 GET
注意事项:
1.Token设置
2."更新"和"获取"API地址中需加上数据对象的ID,如 /api/tasks/1/
```
### 17 ubuntu查看虚拟机的ip
```
下载net-tools: sudo apt-get install net-tools
输入命令: ifconfig
如果是普通用户,需要使用超级用户则使用以下命令:sudo ifconfit -a
```
### 18 zmm API文档
```
https://documenter.getpostman.com/view/9807864/TzeZEmGu#a33ab291-e4e1-4a5c-8727-c12a1f61c6ff
```
### 19 windows的Postman请求虚拟机的本地web服务
- setting.py 修改允许所有人访问
```
ALLOWED_HOSTS = ['*']
```
### 20 zmm项目前端ui运行界面
