# 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 ``` docker启动nginx服务

docker测试

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运行界面