Proyecto de ingeniería de software - sistema de fletamento (implementación Python+PyQt5)

requisitos de la misión

Por favor agregue una descripción de la imagen

  1. El usuario ingresa S para comenzar a fletar un barco; ingresa E para dejar de fletar un barco.
  2. Cuando finalice el día, cuente la situación de alquiler de cada barco, imprima el tiempo de alquiler más corto, el tiempo de alquiler más largo, etc.
  3. El administrador envía una señal al barco regularmente, y si el barco no puede recibir la señal, se juzga que el barco se ha perdido.

Descripción de la biblioteca de soporte externo

  1. Use PyQt5 para diseñar la GUI , el método de instalación se refiere al artículo anterior: Tutorial de instalación de PyQt5
  2. Use graphviz y pyreverse para generar diagramas de clase UML Para la instalación de graphviz, consulte el artículo anterior: python graphviz drawing
    pyreverse installation: pip install pylint, comando de generación de diagrama de clase: pyreverse -ASmy -o png a/
    Nota: a es el directorio donde el código está almacenado y debe instalarse antes de usarlo. Cambie el nombre del código a __init__.py; de lo contrario, se informará el siguiente error.
    Por favor agregue una descripción de la imagen

diseño de clase

Por favor agregue una descripción de la imagen
El diseño de la categoría general es relativamente simple, y las respuestas se dividen en dos categorías, una es la parte de la GUI y la otra es la parte de implementación lógica de la GUI.Entre ellos, la función de clase rent_1 se usa para realizar la carta detalles, la función de clase showtime_1 se usa para calcular el tiempo, y la función de transformación se usa para tratar si el barco se pierde.

Análisis de resultados

Parte de los resultados de ejecución se muestran en la figura:
Por favor agregue una descripción de la imagen
Resultados estadísticos:
Por favor agregue una descripción de la imagen
Información sobre el autor:
Por favor agregue una descripción de la imagen

Resolución de errores

  1. Python ejecuta la función e informa un error TypeError: rent_1() toma 1 argumento posicional pero se dieron 2.
    Este error significa que esta función solo recibe una variable, pero se pasan dos variables en el uso real. Esto se debe a que cuando escribí por primera vez la función de clase de python, no escribí self en la lista de parámetros de la función de clase, solo agregué self.
    Por lo tanto, cuando Python llama a un objeto de clase, se debe escribir self en la lista de parámetros de la función de clase para representar la función en sí.
  2. Acerca QMessageBox.about()de la función
    QMessageBox es una pequeña ventana muy simple en QT. La función acerca de se usa para completar el contenido. El prototipo de la función es:
(method) about: (parent: QWidget, caption: str, text: str) -> None

Por lo tanto, además de la ventana en sí, esta función solo puede pasar dos parámetros de tipo cadena.
3. Sobre QTimela aplicación de la clase

self.timer.start(1000)
self.rent_time.stop()

Comience a cronometrar, la unidad entre paréntesis es milisegundos, lo que indica con qué frecuencia actualizar

self.sum1 = temp.secsTo(rtime)

Entre dos clases de QTime, puede usar secsTo()funciones para calcular la diferencia de tiempo, con una precisión de segundos

Resumen del análisis del sistema

  1. Con base en consideraciones prácticas, es más razonable y efectivo llamar a la base de datos para agregar, eliminar, verificar y modificar la información del arrendamiento.
  2. Para la transmisión y recepción de señales, se pueden considerar la comunicación de red y los subprocesos múltiples.

código fuente completo

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'rboat.ui'
#
# Created by: PyQt5 UI code generator 5.15.6
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.
# 作者:L-M-Y
import numbers
import threading
from tokenize import String
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QTextEdit
from matplotlib import widgets
from PyQt5.QtCore import QDate, QTime, QDateTime, Qt
import time

# GUI模块


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(928, 826)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(280, 20, 341, 81))
        font = QtGui.QFont()
        font.setFamily("Arial Black")
        font.setPointSize(12)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(70, 230, 71, 31))
        font = QtGui.QFont()
        font.setFamily("Arial Black")
        font.setPointSize(12)
        self.label_2.setFont(font)
        self.label_2.setObjectName("label_2")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(70, 360, 71, 21))
        font = QtGui.QFont()
        font.setFamily("Arial Black")
        font.setPointSize(12)
        self.label_3.setFont(font)
        self.label_3.setObjectName("label_3")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(70, 490, 71, 21))
        font = QtGui.QFont()
        font.setFamily("Arial Black")
        font.setPointSize(12)
        self.label_4.setFont(font)
        self.label_4.setObjectName("label_4")
        self.label_5 = QtWidgets.QLabel(self.centralwidget)
        self.label_5.setGeometry(QtCore.QRect(70, 610, 71, 21))
        font = QtGui.QFont()
        font.setFamily("Arial Black")
        font.setPointSize(12)
        self.label_5.setFont(font)
        self.label_5.setObjectName("label_5")
        self.label_6 = QtWidgets.QLabel(self.centralwidget)
        self.label_6.setGeometry(QtCore.QRect(71, 135, 71, 31))
        font = QtGui.QFont()
        font.setFamily("Arial Black")
        font.setPointSize(12)
        self.label_6.setFont(font)
        self.label_6.setObjectName("label_6")
        self.label_7 = QtWidgets.QLabel(self.centralwidget)
        self.label_7.setGeometry(QtCore.QRect(200, 130, 151, 41))
        font = QtGui.QFont()
        font.setFamily("Arial Black")
        font.setPointSize(12)
        self.label_7.setFont(font)
        self.label_7.setObjectName("label_7")
        self.label_8 = QtWidgets.QLabel(self.centralwidget)
        self.label_8.setGeometry(QtCore.QRect(480, 130, 101, 41))
        font = QtGui.QFont()
        font.setFamily("Arial Black")
        font.setPointSize(12)
        self.label_8.setFont(font)
        self.label_8.setObjectName("label_8")
        self.label_9 = QtWidgets.QLabel(self.centralwidget)
        self.label_9.setGeometry(QtCore.QRect(700, 140, 81, 21))
        font = QtGui.QFont()
        font.setFamily("Arial Black")
        font.setPointSize(12)
        self.label_9.setFont(font)
        self.label_9.setObjectName("label_9")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(620, 720, 121, 51))
        font = QtGui.QFont()
        font.setFamily("Arial Black")
        font.setPointSize(13)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName("pushButton")
        self.line = QtWidgets.QFrame(self.centralwidget)
        self.line.setGeometry(QtCore.QRect(0, 170, 881, 16))
        self.line.setFrameShape(QtWidgets.QFrame.HLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(230, 720, 121, 51))
        font = QtGui.QFont()
        font.setFamily("Arial Black")
        font.setPointSize(13)
        self.pushButton_2.setFont(font)
        self.pushButton_2.setObjectName("pushButton_2")
        self.textBrowser_9 = QtWidgets.QTextBrowser(self.centralwidget)
        self.textBrowser_9.setGeometry(QtCore.QRect(640, 80, 251, 31))
        self.textBrowser_9.setObjectName("textBrowser_9")
        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_3.setGeometry(QtCore.QRect(480, 210, 91, 51))
        font = QtGui.QFont()
        font.setFamily("Arial Black")
        font.setPointSize(12)
        self.pushButton_3.setFont(font)
        self.pushButton_3.setObjectName("pushButton_3")
        self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_4.setGeometry(QtCore.QRect(690, 210, 91, 51))
        font = QtGui.QFont()
        font.setFamily("Arial Black")
        font.setPointSize(12)
        font.setBold(False)
        font.setWeight(50)
        self.pushButton_4.setFont(font)
        self.pushButton_4.setObjectName("pushButton_4")
        self.pushButton_5 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_5.setGeometry(QtCore.QRect(480, 340, 91, 51))
        font = QtGui.QFont()
        font.setFamily("Arial Black")
        font.setPointSize(12)
        self.pushButton_5.setFont(font)
        self.pushButton_5.setObjectName("pushButton_5")
        self.pushButton_6 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_6.setGeometry(QtCore.QRect(690, 340, 91, 51))
        font = QtGui.QFont()
        font.setFamily("Arial Black")
        font.setPointSize(12)
        self.pushButton_6.setFont(font)
        self.pushButton_6.setObjectName("pushButton_6")
        self.pushButton_7 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_7.setGeometry(QtCore.QRect(480, 610, 91, 51))
        font = QtGui.QFont()
        font.setFamily("Arial Black")
        font.setPointSize(12)
        self.pushButton_7.setFont(font)
        self.pushButton_7.setObjectName("pushButton_7")
        self.pushButton_8 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_8.setGeometry(QtCore.QRect(480, 470, 91, 51))
        font = QtGui.QFont()
        font.setFamily("Arial Black")
        font.setPointSize(12)
        self.pushButton_8.setFont(font)
        self.pushButton_8.setObjectName("pushButton_8")
        self.pushButton_9 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_9.setGeometry(QtCore.QRect(690, 470, 91, 51))
        font = QtGui.QFont()
        font.setFamily("Arial Black")
        font.setPointSize(12)
        self.pushButton_9.setFont(font)
        self.pushButton_9.setObjectName("pushButton_9")
        self.pushButton_10 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_10.setGeometry(QtCore.QRect(690, 610, 91, 51))
        font = QtGui.QFont()
        font.setFamily("Arial Black")
        font.setPointSize(12)
        self.pushButton_10.setFont(font)
        self.pushButton_10.setObjectName("pushButton_10")
        self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
        self.textBrowser.setGeometry(QtCore.QRect(210, 200, 171, 31))
        self.textBrowser.setObjectName("textBrowser")
        self.textBrowser_2 = QtWidgets.QTextBrowser(self.centralwidget)
        self.textBrowser_2.setGeometry(QtCore.QRect(210, 260, 171, 31))
        self.textBrowser_2.setObjectName("textBrowser_2")
        self.textBrowser_3 = QtWidgets.QTextBrowser(self.centralwidget)
        self.textBrowser_3.setGeometry(QtCore.QRect(210, 330, 171, 31))
        self.textBrowser_3.setObjectName("textBrowser_3")
        self.textBrowser_5 = QtWidgets.QTextBrowser(self.centralwidget)
        self.textBrowser_5.setGeometry(QtCore.QRect(210, 390, 171, 31))
        self.textBrowser_5.setObjectName("textBrowser_5")
        self.textBrowser_6 = QtWidgets.QTextBrowser(self.centralwidget)
        self.textBrowser_6.setGeometry(QtCore.QRect(210, 460, 171, 31))
        self.textBrowser_6.setObjectName("textBrowser_6")
        self.textBrowser_7 = QtWidgets.QTextBrowser(self.centralwidget)
        self.textBrowser_7.setGeometry(QtCore.QRect(210, 520, 171, 31))
        self.textBrowser_7.setObjectName("textBrowser_7")
        self.textBrowser_8 = QtWidgets.QTextBrowser(self.centralwidget)
        self.textBrowser_8.setGeometry(QtCore.QRect(210, 590, 171, 31))
        self.textBrowser_8.setObjectName("textBrowser_8")
        self.textBrowser_10 = QtWidgets.QTextBrowser(self.centralwidget)
        self.textBrowser_10.setGeometry(QtCore.QRect(210, 650, 171, 31))
        self.textBrowser_10.setObjectName("textBrowser_10")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 928, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate(
            "MainWindow", "LMY\'S Boat Renting System"))
        self.label_2.setText(_translate("MainWindow", "boat 1"))
        self.label_3.setText(_translate("MainWindow", "boat 2"))
        self.label_4.setText(_translate("MainWindow", "boat 3"))
        self.label_5.setText(_translate("MainWindow", "boat 4"))
        self.label_6.setText(_translate("MainWindow", "ID"))
        self.label_7.setText(_translate("MainWindow", "Renting Time"))
        self.label_8.setText(_translate("MainWindow", "Renting"))
        self.label_9.setText(_translate("MainWindow", "Status"))
        self.pushButton.setText(_translate("MainWindow", "Sum"))
        self.pushButton_2.setText(_translate("MainWindow", "Author"))
        self.pushButton_3.setText(_translate("MainWindow", "S"))
        self.pushButton_4.setText(_translate("MainWindow", "Safe"))
        self.pushButton_5.setText(_translate("MainWindow", "S"))
        self.pushButton_6.setText(_translate("MainWindow", "Safe"))
        self.pushButton_7.setText(_translate("MainWindow", "S"))
        self.pushButton_8.setText(_translate("MainWindow", "S"))
        self.pushButton_9.setText(_translate("MainWindow", "Safe"))
        self.pushButton_10.setText(_translate("MainWindow", "Safe"))

# GUI逻辑功能部分


class NameController(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        global cnt
        i = 0
        self.flag_1 = "0"
        self.sum1 = 0
        self.sum2 = "0"
        self.sum3 = "0"
        self.sum4 = "0"
        self.rent = []
        self.overall_string = "Date : "
        for i in range(4):
            self.rent.append(0)
        cnt = 1
        push = 0
        super().__init__()
        self.setupUi(self)
        time = QDateTime.currentDateTime()  # 获取当前时间
        timedisplay = time.toString("yyyy-MM-dd hh:mm:ss dddd")  # 格式化时间
        rtime = QDateTime.currentDateTime()  # 获取当前时间
        rtimedisplay = rtime.toString("yyyy-MM-dd hh:mm:ss dddd")  # 格式化时间
        self.textBrowser_9.setText(timedisplay)
        self.timer = QTimer()
        self.timer.start(1000)  # 时间类开始运转,每秒更新一次
        self.rent_time = QTimer()
        self.rent_time_2 = QTimer()
        self.rent_time_3 = QTimer()
        self.rent_time_4 = QTimer()

        self.timer.timeout.connect(self.showtime)
        self.pushButton_3.clicked.connect(self.rent_1)
        self.pushButton_5.clicked.connect(self.rent_2)
        self.pushButton_8.clicked.connect(self.rent_3)
        self.pushButton_7.clicked.connect(self.rent_4)
        self.pushButton_2.clicked.connect(lambda: QMessageBox.about(
            self, "About the author", "Name: Liu MiYi\n Class: Computer Science\nDate: 2022.9.23"))

        ''' self.pushButton.clicked.connect(lambda: QMessageBox.about(
            self, "About the renting of boats", self.overall_string)) '''
        self.push_1 = 0
        self.push_2 = 0
        self.push_3 = 0
        self.push_4 = 0

        # self.end_time1 = "0"

        self.pushButton_4.clicked.connect(self.transform_1)
        self.pushButton_6.clicked.connect(self.transform_2)
        self.pushButton_9.clicked.connect(self.transform_3)
        self.pushButton_10.clicked.connect(self.transform_4)

    def transform_1(self):
        self.pushButton_4.setText("Safe")

    def transform_2(self):
        self.pushButton_6.setText("Safe")

    def transform_3(self):
        self.pushButton_9.setText("Safe")

    def transform_4(self):
        self.pushButton_10.setText("Safe")

    def rent_1(self):
        self.push_1 = self.push_1+1
        # print(self.push_1)
        self.rent_time.start(1000)
        self.rent_time.timeout.connect(self.showtime_1)
        self.pushButton_3.setText("E")
        if(self.push_1 == 1):
            rttime = QDateTime.currentDateTime()  # 获取当前时间
            global temp
            temp = rttime
            rttimedisplay = rttime.toString("yyyy-MM-dd hh:mm:ss dddd")
            rt = rttimedisplay[0:19]
            okl = int(rttimedisplay[11:13])
            # print(okl)
            if(okl < 13):
                self.overall_string = self.overall_string + \
                    rttimedisplay[5:10]+" Morning\nBoat1 Renting Time : "
            else:
                self.overall_string = self.overall_string + \
                    rttimedisplay[5:10]+" Afternoon\nBoat1 Renting Time : "
            self.textBrowser.setText(rt)
        if(self.push_1 == 2):
            self.pushButton_3.setText("S")
            self.rent_time.stop()
            self.overall_string = self.overall_string + \
                str(self.rent[0])+"seconds\nBoat1 Renting Time: "

    def showtime_1(self):
        rtime = QDateTime.currentDateTime()  # 获取当前时间
        rtimedisplay = rtime.toString("yyyy-MM-dd hh:mm:ss dddd")  # 格式化时间
        r = rtimedisplay[0:19]
        self.flag_1 = rtimedisplay[18]
        if(self.flag_1 == "5"):
            self.pushButton_4.setText("Lost")
        self.textBrowser_2.setText(r)
        self.sum1 = temp.secsTo(rtime)
        self.rent[0] = self.sum1

    def rent_2(self):
        self.push_2 = self.push_2+1
        self.rent_time_2.start(1000)
        self.rent_time_2.timeout.connect(self.showtime_2)
        self.pushButton_5.setText("E")
        if(self.push_2 == 1):
            rttime_2 = QDateTime.currentDateTime()  # 获取当前时间
            rttimedisplay_2 = rttime_2.toString("yyyy-MM-dd hh:mm:ss dddd")
            rt_2 = rttimedisplay_2[0:19]
            global temp2
            temp2 = rttime_2
            self.textBrowser_3.setText(rt_2)
        if(self.push_2 == 2):
            # self.textBrowser_2.setText(self.end_time1)
            self.pushButton_5.setText("S")
            self.rent_time_2.stop()
            self.overall_string = self.overall_string + \
                str(self.rent[1])+" seconds\n"+"Boat3 Renting Time : "
        # print(self.push_1)

    def showtime_2(self):
        rtime = QDateTime.currentDateTime()  # 获取当前时间
        rtimedisplay = rtime.toString("yyyy-MM-dd hh:mm:ss dddd")  # 格式化时间
        r = rtimedisplay[0:19]
        self.flag_2 = rtimedisplay[18]
        if(self.flag_2 == "5"):
            self.pushButton_6.setText("Lost")
        self.textBrowser_5.setText(r)
        self.sum2 = temp2.secsTo(rtime)
        self.rent[1] = self.sum2
        # print(self.rent[1])

    def rent_3(self):
        self.push_3 = self.push_3+1
        self.rent_time_3.start(1000)
        self.rent_time_3.timeout.connect(self.showtime_3)
        self.pushButton_8.setText("E")
        if(self.push_3 == 1):
            rttime_3 = QDateTime.currentDateTime()  # 获取当前时间
            rttimedisplay_3 = rttime_3.toString("yyyy-MM-dd hh:mm:ss dddd")
            global temp3
            temp3 = rttime_3
            rt_3 = rttimedisplay_3[0:19]
            self.textBrowser_6.setText(rt_3)
        if(self.push_3 == 2):
            self.pushButton_8.setText("S")
            self.rent_time_3.stop()
            self.overall_string = self.overall_string + \
                str(self.rent[2])+" seconds\n"+"Boat4 Renting Time : "

    def showtime_3(self):
        rtime = QDateTime.currentDateTime()  # 获取当前时间
        rtimedisplay = rtime.toString("yyyy-MM-dd hh:mm:ss dddd")  # 格式化时间
        r = rtimedisplay[0:19]
        self.flag_3 = rtimedisplay[18]
        self.sum3 = temp3.secsTo(rtime)
        self.rent[2] = self.sum3
        if(self.flag_3 == "5"):
            self.pushButton_9.setText("Lost")
        self.textBrowser_7.setText(r)

    def rent_4(self):
        self.push_4 = self.push_4+1
        self.rent_time_4.start(1000)
        self.rent_time_4.timeout.connect(self.showtime_4)
        self.pushButton_7.setText("E")
        if(self.push_4 == 1):
            rttime_4 = QDateTime.currentDateTime()  # 获取当前时间
            rttimedisplay_4 = rttime_4.toString("yyyy-MM-dd hh:mm:ss dddd")
            global temp4
            temp4 = rttime_4
            rt_4 = rttimedisplay_4[0:19]
            self.textBrowser_8.setText(rt_4)
        if(self.push_4 == 2):
            self.pushButton_7.setText("S")
            self.rent_time_4.stop()
            num_boats = 0
            if(self.pushButton_4.text() == "Safe"):
                num_boats = num_boats+1
            if(self.pushButton_6.text() == "Safe"):
                num_boats = num_boats+1
            if(self.pushButton_9.text() == "Safe"):
                num_boats = num_boats+1
            if(self.pushButton_10.text() == "Safe"):
                num_boats = num_boats+1

            self.overall_string = self.overall_string + \
                str(self.rent[3])+" seconds\nMax Renting Time : " + \
                str(max(self.rent))+" seconds\nMin Renting Time : " + \
                str(min(self.rent)) + \
                " seconds\n"+"The Number of Boats :" + str(num_boats)
            self.pushButton.clicked.connect(lambda: QMessageBox.about(
                self, "About the renting of boats", self.overall_string))
        # print(self.push_1)

    def showtime_4(self):
        rtime = QDateTime.currentDateTime()  # 获取当前时间
        rtimedisplay = rtime.toString("yyyy-MM-dd hh:mm:ss dddd")  # 格式化时间
        r = rtimedisplay[0:19]
        self.flag_4 = rtimedisplay[18]
        self.sum4 = temp4.secsTo(rtime)
        self.rent[3] = self.sum4
        if(self.flag_4 == "5"):
            self.pushButton_10.setText("Lost")
        self.textBrowser_10.setText(r)

    def showtime(self):
        if(cnt):
            time = QDateTime.currentDateTime()  # 获取当前时间
            timedisplay = time.toString("yyyy-MM-dd hh:mm:ss dddd")  # 格式化时间
            self.textBrowser_9.setText(timedisplay)
        else:
            self.timer.stop()


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)    # Instantiate an app
    window = NameController()       # Instantiate a window
    window.show()                   # Show window at default size
    # Run the app and do some cleanup when the app exits
    sys.exit(app.exec_())

Supongo que te gusta

Origin blog.csdn.net/qq_52109814/article/details/127024315
Recomendado
Clasificación