# 易组题库组卷系统(高中信息技术django) **Repository Path**: davinhe/QuestionBank ## Basic Information - **Project Name**: 易组题库组卷系统(高中信息技术django) - **Description**: 浙江省高中信息组卷题库(高考为主) 一、功能介绍: 1. 录入高考、联考卷 2.选题并组卷成word、pdf、markdown等格式,下载到本地打印,此功能主要供教师使用;也可以组卷成在线练习卷、试卷,供学生练习 3.学生练习题目 - **Primary Language**: Python - **License**: MulanPubL-2.0 - **Default Branch**: master - **Homepage**: https://xxjstk.top - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 13 - **Created**: 2025-05-26 - **Last Updated**: 2025-05-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 高中信息技术题库系统 ## 开发团队 负责人: 朱清闯 #### 介绍 浙江省高中信息题库(高考为主) 题目来自浙江省各地市优质的联考卷子 还有优质的教辅 网站主要功能如下: ```python 1. 录入高考、联考卷 2.选题并组卷成word、pdf、markdown等格式,下载到本地打印, 此功能主要供教师使用;也可以组卷成在线练习卷、试卷,供学生练习 3.学生练习题目 ``` ![输入图片说明](media/%E9%A2%98%E5%BA%93%E5%AE%A3%E4%BC%A0_04.png) ![输入图片说明](media/%E9%A2%98%E5%BA%93%E5%AE%A3%E4%BC%A0_05.png) ![输入图片说明](media/%E9%A2%98%E5%BA%93%E5%AE%A3%E4%BC%A0_06.png) ![输入图片说明](media/%E9%A2%98%E5%BA%93%E5%AE%A3%E4%BC%A0_07.png) ![输入图片说明](media/%E9%A2%98%E5%BA%93%E5%AE%A3%E4%BC%A0_08.png) ### 版本 vision 1.0.8 #### 软件架构 软件架构说明 B/S 前段vue.js + 微信小程序 后端django # 安装教程 1.传统安装 (待继续) 2.docker (待继续) 3.k8s 或k3s 安装 前提要求: 1.ubuntu 22.04桌面或者服务器版本 2.本文基于已经安装docker和k3s(或k8s) 如果为安装,请参考我的另一篇文章如何安装docker和k3s,或者其他等同教程 本文的代码我将放在以下地址: https://gitee.com/weiweimaibing_juhagen/tiku_deploy.git 里面,包含了一键安装的脚本 ### 1.设置题库的ip地址池 (如果你的局域网ip地址段是192.168.0.1-192.168.0.254可以跳过这个步骤) 用文本工具打开,将metallb-config文件中的addresses部分的ip段, 改为你实际局域网的ip地址段中没被占用的ip段,比如192.168.203.133-192.168.203.134 如果你的实际ip段为192.168.203.1-192.168.203.252 ### 2.安装metallb 在主服务器上安装 MetalLB: ```bash kubectl apply -f metallb-native.yaml ``` 应用metallb-config文件 ```bash sudo kubectl apply -f metallb-config.yaml ``` ### 3.一键安装 执行以下命令 ```bash ./apply-all-pod.sh ``` 等待若干分钟后,屏幕上出现install ok!表示安装完成。 ### 4.修改本地所有局域网计算机的域名映射文件 将局域网计算机添如下ip与域名映射 ```bash 192.168.0.190 mytiku.com ``` 如果是linux电脑在/etc/hosts文件内; 如果是windows电脑,在C:\Windows\System32\drivers\etc ### 5.测试网站 浏览器内输入域名http://myutiku.com 如果进入主页,则部署成功 ![alt text](images\shouye.png){width=400px} ### 帮助与支持 安装过程有问题,请添加一下QQ群:925633059 ## 以下是部署的整体细节部分,供懂k8s和k3s部署的人员调试参考,小白可以跳过 ## k3s部署网站全过程 以下代码我将放在以下地址: https://gitee.com/weiweimaibing_juhagen/tiku_deploy.git 里面,包含了一键安装的脚本 ### 一、创建日志和redis、mysql、django和vue的持久卷 1.创建以下目录,用于存放docker的持久卷 ```bash #!/bin/bash mkdir -p /home/data/redis mkdir -p /home/data/mysql mkdir -p /home/data/djangoLog mkdir -p /home/data/djangoStatic mkdir -p /home/data/nginxLog mkdir -p /home/data/temp mkdir -p /home/data/uwsgiLog ``` ### 二、创建pv和pvc存储 在/home/pv-pvc/目录下创建pv.yml 内容如下: ```bash apiVersion: v1 kind: PersistentVolume metadata: name: redis-pv spec: capacity: storage: 300Mi #pv的存储空间容量 accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: standard hostPath: path: "/data/redis" #nfs: # path: /data/redis #把nfs的存储空间创建成pv # server: 192.168.1.1 #nfs服务器的地址 --- apiVersion: v1 kind: PersistentVolume metadata: name: mysql-pv spec: capacity: storage: 2Gi #pv的存储空间容量 accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: standard hostPath: path: "/data/mysql" #nfs: # path: /data/mysql #把nfs的存储空间创建成pv # server: 192.168.1.1 #nfs服务器的地址 --- apiVersion: v1 kind: PersistentVolume metadata: name: django-static-pv spec: capacity: storage: 3Gi #pv的存储空间容量 accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain storageClassName: standard hostPath: path: "/data/djangoStatic/static" #nfs: # path: /data/djangoStatic/static #把nfs的存储空间创建成pv # server: 192.168.1.1 #nfs服务器的地址 --- apiVersion: v1 kind: PersistentVolume metadata: name: uwsgi-log-pv spec: capacity: storage: 100Mi #pv的存储空间容量 accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: standard hostPath: path: "/data/uwsgiLog" #nfs: # path: /data/uwsgiLog #把nfs的存储空间创建成pv # server: 192.168.1.1 #nfs服务器的地址 --- apiVersion: v1 kind: PersistentVolume metadata: name: nginx-log-pv spec: capacity: storage: 150Mi #pv的存储空间容量 accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: standard hostPath: path: "/data/nginxLog" #nfs: # path: /data/nginxLog #把nfs的存储空间创建成pv # server: 192.168.1.1 #nfs服务器的地址 --- apiVersion: v1 kind: PersistentVolume metadata: name: django-log-pv spec: capacity: storage: 250Mi #pv的存储空间容量 accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: standard hostPath: path: "/data/djangoLog" #nfs: # path: /data/djangoLog #把nfs的存储空间创建成pv # server: 192.168.1.1 #nfs服务器的地址 --- apiVersion: v1 kind: PersistentVolume metadata: name: temp-pv spec: capacity: storage: 200Mi #pv的存储空间容量 accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: standard hostPath: path: "/data/temp" ``` 在/home/pv-pvc/目录下创建pvc.yml ```bash apiVersion: v1 kind: PersistentVolumeClaim metadata: name: redis-pvc spec: storageClassName: standard accessModes: - ReadWriteOnce resources: requests: storage: 300Mi --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pvc spec: storageClassName: standard accessModes: - ReadWriteOnce resources: requests: storage: 2Gi --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: django-static-pvc spec: storageClassName: standard accessModes: - ReadWriteMany resources: requests: storage: 3Gi --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: uwsgi-log-pvc spec: storageClassName: standard accessModes: - "ReadWriteOnce" resources: requests: storage: 100Mi --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nginx-log-pvc spec: storageClassName: standard accessModes: - "ReadWriteOnce" resources: requests: storage: 150Mi --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: django-log-pvc spec: storageClassName: standard accessModes: - "ReadWriteOnce" resources: requests: storage: 250Mi --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: temp-pvc spec: storageClassName: standard accessModes: - "ReadWriteOnce" resources: requests: storage: 200Mi ``` 运行pv和pvc,代码如下: ```bash kubectl apply -f pv.yml, pvc.yml ``` ## 三、创建secret,用于mysql的密码123mysql ### 1.创建文件名secret.yaml,内容如下: ```bash apiVersion: v1 kind: Secret metadata: name: mysql-root-password type: Opaque data: password: MTIzbXlzcWw= ``` 执行 ```bash kubectrl apply -f secret.yaml ``` ### 2.创建mysql容器的pod和服务service,文件名为mysql-dep-svc.yaml,内容以下: ```bash apiVersion: apps/v1 kind: Deployment metadata: name: mysql spec: replicas: 1 selector: matchLabels: app: mysql strategy: type: Recreate template: metadata: labels: app: mysql spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/zhuqingchuang/xxjstk:mysql-arm64-8-2 name: mysql env: - name: MYSQL_DATABASE value: "xxjstk" - name: MYSQL_ROOT_PASSWORD value: "123mysql" #valueFrom: #secretKeyRef: #name: mysql-root-password #key: password ports: - containerPort: 3306 name: mysql resources: {} #limits: #cpu: "0.2" #memory: "256Mi" volumeMounts: - name: mysql-pv mountPath: /var/lib/mysql volumes: - name: mysql-pv #hostPath: # path: /data/mysql # type: DirectoryOrCreate persistentVolumeClaim: claimName: mysql-pvc --- apiVersion: v1 kind: Service metadata: #creationTimestamp: null name: mysql-service labels: app: mysql spec: ports: - port: 3306 protocol: TCP targetPort: 3306 nodePort: 30001 selector: app: mysql #type: ClusterIP type: NodePort ``` 运行mysql ```bash kubectl apply -f mysql-dep-svc.yml ``` ## 四、创建redis的配置文件和服务,文件名分别为configmap.yaml和redis-dep-svc.yaml, ### 1.配置文件内容如下: ```bash kind: ConfigMap metadata: name: redis-config data: redis-config: | dir /data requirepass 123abc # bind 0.0.0.0 #protected-mode no port 6379 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize no supervised no #ipidfile /var/run/redis_6379.pid loglevel notice logfile "" databases 16 always-show-logo yes ``` ### 2.创建redis的deployment 文件内容如下: ```bash kind: ConfigMap metadata: name: redis-config data: redis-config: | dir /data requirepass 123abc # bind 0.0.0.0 #protected-mode no port 6379 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize no supervised no #ipidfile /var/run/redis_6379.pid loglevel notice logfile "" databases 16 always-show-logo yes ``` 运行服务: ```bash kubectl apply -f redis-dep-svc.yml ``` ## 四、部署ingress流量分发器 ingress执行器用的是k3s自带的traefik,文件名为ingress.yaml 内容如下: ```bash apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: new-nginx annotations: traefik.ingress.kubernetes.io/router.entrypoints: web spec: # ingressClassName: nginx rules: - host: mytiku.com #localhost http: paths: - path: /api pathType: Prefix backend: service: name: django-service port: number: 80 - path: /admin pathType: Prefix backend: service: name: django-service port: number: 80 - path: /static pathType: Prefix backend: service: name: django-service port: number: 80 - path: /media pathType: Prefix backend: service: name: django-service port: number: 80 - path: / pathType: Prefix backend: service: name: vue-service port: number: 80 ``` 执行ingress ```bash kubectl apply -f ingress.yml ``` ## 五、部署vue前端 创建deployment和service,文件名为:dep-svc-vue.yaml,内容如下: ```bash apiVersion: apps/v1 kind: Deployment metadata: name: vue-deploy namespace: default labels: app: vue-deploy spec: replicas: 1 selector: matchLabels: app: vue-deploy template: metadata: labels: app: vue-deploy spec: containers: - name: xxjstk-vue image: registry.cn-hangzhou.aliyuncs.com/zhuqingchuang/xxjstk:vue-arm64-20250520-mytiku-com imagePullPolicy: IfNotPresent ports: - containerPort: 80 # 容器对外端口 resources: {} volumeMounts: - mountPath: /var/www/html/static # 挂载静态文件 name: nginx-static - mountPath: /var/log/nginx/ # 挂载日志文件 name: nginx-log volumes: - name: nginx-static hostPath: path: /data/djangoStatic type: DirectoryOrCreate #persistentVolumeClaim: #claimName: django-static-pvc - name: nginx-log #hostPath: # path: /data/nginxLog # type: DirectoryOrCreate persistentVolumeClaim: claimName: nginx-log-pvc --- apiVersion: v1 kind: Service metadata: labels: app: vue-deploy name: vue-service spec: selector: app: vue-deploy type: ClusterIP # type: NodePort ports: - port: 80 targetPort: 80 protocol: TCP ``` 运行以上文件 ```bash kubectrl apply -f dep-svc-vue.yaml ``` ## 六、部署django后端 创建deployment和service,文件名为:dep-svc-vue.yaml,内容如下: ```bash apiVersion: apps/v1 kind: Deployment metadata: name: django namespace: default labels: app: django spec: replicas: 1 selector: matchLabels: app: django template: metadata: labels: app: django spec: containers: - name: django #command: ['tail','-f','/dev/null'] command: - /bin/sh - /var/www/html/django/start.sh image: registry.cn-hangzhou.aliyuncs.com/zhuqingchuang/xxjstk:django-arm64-2025052202-mytiku-com imagePullPolicy: IfNotPresent ports: - containerPort: 8000 # 容器对外端口 resources: {} # limits: # cpu: 0.8 # memory: 1400Mi # requests: # cpu: 0.3 # memory: 600Mi volumeMounts: - mountPath: /var/www/html/django/static/ # 挂载静态文件 name: django-static - mountPath: /var/www/html/django/uwsgiLog/ # 挂载uwsgi日志 name: uwsgi-log - mountPath: /var/www/html/django/logs/ # 挂载django日志 name: django-log volumes: - name: django-static hostPath: path: /data/djangoStatic type: DirectoryOrCreate #persistentVolumeClaim: # claimName: django-static-pvc - name: uwsgi-log hostPath: path: /data/uwsgiLog type: DirectoryOrCreate #persistentVolumeClaim: # claimName: uwsgi-log-pvc - name: django-log #hostPath: # path: /data/djangoLog # type: DirectoryOrCreate persistentVolumeClaim: claimName: django-log-pvc --- apiVersion: v1 kind: Service metadata: labels: app: django name: django-service spec: selector: app: django #type: NodePort type: ClusterIP ports: - port: 80 protocol: TCP targetPort: 8000 # nodePort: 80 ``` 执行以上文件: ```bash kubectrl apply -f dep-svc-django.yaml ``` ## 七、测试网站 ### 1.查看ingress获取的ip地址 ```bash root@orangepi5b:/home# kubectl get ingress NAME CLASS HOSTS ADDRESS PORTS AGE new-nginx traefik mytiku.com 192.168.0.190 80 9h ``` 因此网站域名通过负载均衡得到的ip地址是192.168.0.190 将局域网计算机添如下ip与域名映射 ```bash 192.168.0.190 mytiku.com ``` 如果是linux电脑在/etc/hosts文件内; 如果是windows电脑,在C:\Windows\System32\drivers\etc 浏览器内输入域名http://myutiku.com 如果进入主页,则部署成功 ![alt text](images\shouye.png){width=400px} ![输入图片说明](static_new/admin/shouye.png) #### 使用说明 ![输入图片说明](saveImg/shouye.png) #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request ![输入图片说明](media/%E9%A2%98%E5%BA%93%E5%AE%A3%E4%BC%A0_05.png)![输入图片说明](media/%E9%A2%98%E5%BA%93%E5%AE%A3%E4%BC%A0_07.png)![输入图片说明](media/%E9%A2%98%E5%BA%93%E5%AE%A3%E4%BC%A0_08.png)