first commit

This commit is contained in:
K.H.CHOI 2024-03-26 16:18:04 +09:00
commit 22804577f4
33 changed files with 7839 additions and 0 deletions

20
.gitignore vendored Normal file
View File

@ -0,0 +1,20 @@
__pycache__/
dist/
build/
Lib/
Scripts/
*.db_save_images/
*.db_tao_save_images/
*.pyc
*.db
*.pkl
*.log
*.zip
*.log.*
*.xlsx
pyvenv.cfg
!base.db
!baseXLS.xlsx
!baseXLS_backup.xlsx
!baseXLS_Percenty.xlsx
!test*.xlsx

2077
MainTao.ui Normal file

File diff suppressed because it is too large Load Diff

756
MainTao_ui.py Normal file
View File

@ -0,0 +1,756 @@
# -*- coding: utf-8 -*-
################################################################################
## Form generated from reading UI file 'MainTao.ui'
##
## Created by: Qt User Interface Compiler version 6.6.1
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################
from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
QMetaObject, QObject, QPoint, QRect,
QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QAction, QBrush, QColor, QConicalGradient,
QCursor, QFont, QFontDatabase, QGradient,
QIcon, QImage, QKeySequence, QLinearGradient,
QPainter, QPalette, QPixmap, QRadialGradient,
QTransform)
from PySide6.QtWebEngineWidgets import QWebEngineView
from PySide6.QtWidgets import (QAbstractButton, QAbstractSpinBox, QApplication, QComboBox,
QDialogButtonBox, QGraphicsView, QGroupBox, QHBoxLayout,
QHeaderView, QLabel, QLineEdit, QMainWindow,
QMenu, QMenuBar, QProgressBar, QPushButton,
QSizePolicy, QSpinBox, QStatusBar, QTabWidget,
QTableView, QVBoxLayout, QWidget)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
if not MainWindow.objectName():
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(1902, 1036)
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName(u"centralwidget")
self.horizontalLayoutWidget = QWidget(self.centralwidget)
self.horizontalLayoutWidget.setObjectName(u"horizontalLayoutWidget")
self.horizontalLayoutWidget.setGeometry(QRect(10, 10, 511, 51))
self.horizontalLayout = QHBoxLayout(self.horizontalLayoutWidget)
self.horizontalLayout.setObjectName(u"horizontalLayout")
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.groupBox = QGroupBox(self.horizontalLayoutWidget)
self.groupBox.setObjectName(u"groupBox")
self.matchCount_2 = QLabel(self.groupBox)
self.matchCount_2.setObjectName(u"matchCount_2")
self.matchCount_2.setGeometry(QRect(130, 10, 31, 31))
self.timerStart = QPushButton(self.groupBox)
self.timerStart.setObjectName(u"timerStart")
self.timerStart.setGeometry(QRect(10, 10, 61, 31))
self.timerStart.setCheckable(False)
self.timerStart.setAutoDefault(True)
self.timerStart.setFlat(False)
self.timerStop = QPushButton(self.groupBox)
self.timerStop.setObjectName(u"timerStop")
self.timerStop.setGeometry(QRect(270, 10, 51, 31))
self.timerStop.setCheckable(False)
self.timerStop.setAutoDefault(True)
self.timerStop.setFlat(False)
self.timerSecond = QLineEdit(self.groupBox)
self.timerSecond.setObjectName(u"timerSecond")
self.timerSecond.setGeometry(QRect(150, 10, 31, 31))
self.timerSecond.setAlignment(Qt.AlignCenter)
self.matchCount_3 = QLabel(self.groupBox)
self.matchCount_3.setObjectName(u"matchCount_3")
self.matchCount_3.setGeometry(QRect(190, 10, 31, 31))
self.timerMinute = QLineEdit(self.groupBox)
self.timerMinute.setObjectName(u"timerMinute")
self.timerMinute.setGeometry(QRect(90, 10, 31, 31))
self.timerMinute.setAlignment(Qt.AlignCenter)
self.timerSet = QPushButton(self.groupBox)
self.timerSet.setObjectName(u"timerSet")
self.timerSet.setGeometry(QRect(210, 10, 61, 31))
self.timerSet.setCheckable(False)
self.timerSet.setAutoDefault(True)
self.timerSet.setFlat(False)
self.papagoApi = QPushButton(self.groupBox)
self.papagoApi.setObjectName(u"papagoApi")
self.papagoApi.setGeometry(QRect(330, 10, 101, 28))
self.horizontalLayout.addWidget(self.groupBox)
self.horizontalLayoutWidget_2 = QWidget(self.centralwidget)
self.horizontalLayoutWidget_2.setObjectName(u"horizontalLayoutWidget_2")
self.horizontalLayoutWidget_2.setGeometry(QRect(530, 10, 501, 51))
self.horizontalLayout_2 = QHBoxLayout(self.horizontalLayoutWidget_2)
self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
self.groupBox_2 = QGroupBox(self.horizontalLayoutWidget_2)
self.groupBox_2.setObjectName(u"groupBox_2")
self.sel_relatedTagbox = QLineEdit(self.groupBox_2)
self.sel_relatedTagbox.setObjectName(u"sel_relatedTagbox")
self.sel_relatedTagbox.setGeometry(QRect(90, 10, 401, 31))
self.sel_relatedTagbox.setClearButtonEnabled(True)
self.sel_item12_4 = QLabel(self.groupBox_2)
self.sel_item12_4.setObjectName(u"sel_item12_4")
self.sel_item12_4.setGeometry(QRect(10, 10, 75, 31))
self.horizontalLayout_2.addWidget(self.groupBox_2)
self.horizontalLayoutWidget_3 = QWidget(self.centralwidget)
self.horizontalLayoutWidget_3.setObjectName(u"horizontalLayoutWidget_3")
self.horizontalLayoutWidget_3.setGeometry(QRect(1040, 10, 491, 51))
self.horizontalLayout_3 = QHBoxLayout(self.horizontalLayoutWidget_3)
self.horizontalLayout_3.setObjectName(u"horizontalLayout_3")
self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0)
self.groupBox_3 = QGroupBox(self.horizontalLayoutWidget_3)
self.groupBox_3.setObjectName(u"groupBox_3")
self.taourlbox = QLineEdit(self.groupBox_3)
self.taourlbox.setObjectName(u"taourlbox")
self.taourlbox.setGeometry(QRect(140, 10, 341, 31))
self.taourl = QLabel(self.groupBox_3)
self.taourl.setObjectName(u"taourl")
self.taourl.setGeometry(QRect(10, 10, 121, 31))
self.horizontalLayout_3.addWidget(self.groupBox_3)
self.horizontalLayoutWidget_4 = QWidget(self.centralwidget)
self.horizontalLayoutWidget_4.setObjectName(u"horizontalLayoutWidget_4")
self.horizontalLayoutWidget_4.setGeometry(QRect(10, 70, 511, 731))
self.horizontalLayout_4 = QHBoxLayout(self.horizontalLayoutWidget_4)
self.horizontalLayout_4.setObjectName(u"horizontalLayout_4")
self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0)
self.inputGroup = QGroupBox(self.horizontalLayoutWidget_4)
self.inputGroup.setObjectName(u"inputGroup")
self.inputGroup.setEnabled(True)
self.Excel_btn = QPushButton(self.inputGroup)
self.Excel_btn.setObjectName(u"Excel_btn")
self.Excel_btn.setGeometry(QRect(10, 20, 51, 41))
self.dbviewer1 = QTableView(self.inputGroup)
self.dbviewer1.setObjectName(u"dbviewer1")
self.dbviewer1.setGeometry(QRect(10, 180, 471, 541))
self.isOverseas = QLineEdit(self.inputGroup)
self.isOverseas.setObjectName(u"isOverseas")
self.isOverseas.setGeometry(QRect(150, 20, 31, 31))
self.isOverseas.setAlignment(Qt.AlignCenter)
self.selkeyword_2 = QLabel(self.inputGroup)
self.selkeyword_2.setObjectName(u"selkeyword_2")
self.selkeyword_2.setGeometry(QRect(80, 20, 64, 31))
self.selkeyword_3 = QLabel(self.inputGroup)
self.selkeyword_3.setObjectName(u"selkeyword_3")
self.selkeyword_3.setGeometry(QRect(80, 74, 64, 21))
self.sortcount = QLineEdit(self.inputGroup)
self.sortcount.setObjectName(u"sortcount")
self.sortcount.setGeometry(QRect(150, 70, 31, 31))
self.sortcount.setEchoMode(QLineEdit.Normal)
self.sortcount.setCursorPosition(1)
self.sortcount.setAlignment(Qt.AlignCenter)
self.db_btn = QPushButton(self.inputGroup)
self.db_btn.setObjectName(u"db_btn")
self.db_btn.setGeometry(QRect(10, 70, 51, 41))
self.export_btn = QPushButton(self.inputGroup)
self.export_btn.setObjectName(u"export_btn")
self.export_btn.setGeometry(QRect(390, 70, 91, 41))
self.comboBox = QComboBox(self.inputGroup)
self.comboBox.setObjectName(u"comboBox")
self.comboBox.setGeometry(QRect(330, 120, 151, 31))
self.matchCount = QLabel(self.inputGroup)
self.matchCount.setObjectName(u"matchCount")
self.matchCount.setGeometry(QRect(210, 20, 64, 31))
self.matchCountbox = QLabel(self.inputGroup)
self.matchCountbox.setObjectName(u"matchCountbox")
self.matchCountbox.setGeometry(QRect(290, 20, 64, 31))
font = QFont()
font.setFamilies([u"Arial"])
font.setPointSize(20)
font.setBold(True)
font.setUnderline(True)
self.matchCountbox.setFont(font)
self.matchCount_4 = QLabel(self.inputGroup)
self.matchCount_4.setObjectName(u"matchCount_4")
self.matchCount_4.setGeometry(QRect(210, 70, 64, 31))
self.timerLabel = QLabel(self.inputGroup)
self.timerLabel.setObjectName(u"timerLabel")
self.timerLabel.setGeometry(QRect(270, 70, 111, 31))
font1 = QFont()
font1.setFamilies([u"Adobe Devanagari"])
font1.setPointSize(20)
font1.setBold(True)
self.timerLabel.setFont(font1)
self.timerLabel.setAlignment(Qt.AlignCenter)
self.sc_button = QDialogButtonBox(self.inputGroup)
self.sc_button.setObjectName(u"sc_button")
self.sc_button.setGeometry(QRect(390, 30, 91, 31))
self.sc_button.setStandardButtons(QDialogButtonBox.Apply)
self.matchCount_5 = QLabel(self.inputGroup)
self.matchCount_5.setObjectName(u"matchCount_5")
self.matchCount_5.setGeometry(QRect(400, 10, 64, 21))
self.sc_progressBar = QProgressBar(self.inputGroup)
self.sc_progressBar.setObjectName(u"sc_progressBar")
self.sc_progressBar.setGeometry(QRect(20, 120, 311, 20))
self.sc_progressBar.setStyleSheet(u"font: 75 14pt \"Agency FB\";")
self.sc_progressBar.setValue(0)
self.img_progressBar = QProgressBar(self.inputGroup)
self.img_progressBar.setObjectName(u"img_progressBar")
self.img_progressBar.setGeometry(QRect(20, 150, 311, 20))
self.img_progressBar.setStyleSheet(u"font: 75 14pt \"Agency FB\";")
self.img_progressBar.setValue(0)
self.selkeyword_4 = QLabel(self.inputGroup)
self.selkeyword_4.setObjectName(u"selkeyword_4")
self.selkeyword_4.setGeometry(QRect(130, 120, 51, 21))
self.selkeyword_5 = QLabel(self.inputGroup)
self.selkeyword_5.setObjectName(u"selkeyword_5")
self.selkeyword_5.setGeometry(QRect(120, 150, 71, 21))
self.horizontalLayout_4.addWidget(self.inputGroup)
self.horizontalLayoutWidget_5 = QWidget(self.centralwidget)
self.horizontalLayoutWidget_5.setObjectName(u"horizontalLayoutWidget_5")
self.horizontalLayoutWidget_5.setGeometry(QRect(530, 70, 501, 851))
self.horizontalLayout_5 = QHBoxLayout(self.horizontalLayoutWidget_5)
self.horizontalLayout_5.setObjectName(u"horizontalLayout_5")
self.horizontalLayout_5.setContentsMargins(0, 0, 0, 0)
self.groupBox_4 = QGroupBox(self.horizontalLayoutWidget_5)
self.groupBox_4.setObjectName(u"groupBox_4")
self.graphicsView_multi = QGraphicsView(self.groupBox_4)
self.graphicsView_multi.setObjectName(u"graphicsView_multi")
self.graphicsView_multi.setGeometry(QRect(310, 30, 170, 810))
self.groupBox_5 = QGroupBox(self.groupBox_4)
self.groupBox_5.setObjectName(u"groupBox_5")
self.groupBox_5.setGeometry(QRect(10, 30, 291, 141))
self.sel_item11_2 = QLabel(self.groupBox_5)
self.sel_item11_2.setObjectName(u"sel_item11_2")
self.sel_item11_2.setGeometry(QRect(10, 20, 31, 20))
self.sel_itembox11 = QLineEdit(self.groupBox_5)
self.sel_itembox11.setObjectName(u"sel_itembox11")
self.sel_itembox11.setGeometry(QRect(60, 20, 221, 21))
self.sel_item12_5 = QLabel(self.groupBox_5)
self.sel_item12_5.setObjectName(u"sel_item12_5")
self.sel_item12_5.setGeometry(QRect(10, 50, 51, 20))
self.sel_itembox12 = QLineEdit(self.groupBox_5)
self.sel_itembox12.setObjectName(u"sel_itembox12")
self.sel_itembox12.setGeometry(QRect(60, 50, 221, 21))
self.sel_item12_2 = QLabel(self.groupBox_5)
self.sel_item12_2.setObjectName(u"sel_item12_2")
self.sel_item12_2.setGeometry(QRect(10, 80, 51, 20))
self.sel_itembox13 = QLineEdit(self.groupBox_5)
self.sel_itembox13.setObjectName(u"sel_itembox13")
self.sel_itembox13.setGeometry(QRect(60, 80, 101, 21))
self.sel_item12_3 = QLabel(self.groupBox_5)
self.sel_item12_3.setObjectName(u"sel_item12_3")
self.sel_item12_3.setGeometry(QRect(170, 80, 31, 20))
self.sel_itembox14 = QLineEdit(self.groupBox_5)
self.sel_itembox14.setObjectName(u"sel_itembox14")
self.sel_itembox14.setGeometry(QRect(210, 80, 71, 21))
self.sel_item11 = QLabel(self.groupBox_5)
self.sel_item11.setObjectName(u"sel_item11")
self.sel_item11.setGeometry(QRect(10, 110, 51, 20))
self.sel_itembox15 = QLineEdit(self.groupBox_5)
self.sel_itembox15.setObjectName(u"sel_itembox15")
self.sel_itembox15.setGeometry(QRect(60, 110, 91, 21))
self.sel_item12 = QLabel(self.groupBox_5)
self.sel_item12.setObjectName(u"sel_item12")
self.sel_item12.setGeometry(QRect(160, 110, 61, 20))
self.sel_itembox16 = QLineEdit(self.groupBox_5)
self.sel_itembox16.setObjectName(u"sel_itembox16")
self.sel_itembox16.setGeometry(QRect(230, 110, 51, 21))
self.groupBox_6 = QGroupBox(self.groupBox_4)
self.groupBox_6.setObjectName(u"groupBox_6")
self.groupBox_6.setGeometry(QRect(10, 180, 291, 161))
self.sel_item11_3 = QLabel(self.groupBox_6)
self.sel_item11_3.setObjectName(u"sel_item11_3")
self.sel_item11_3.setGeometry(QRect(10, 20, 31, 20))
self.sel_itembox21 = QLineEdit(self.groupBox_6)
self.sel_itembox21.setObjectName(u"sel_itembox21")
self.sel_itembox21.setGeometry(QRect(60, 20, 221, 21))
self.sel_item12_6 = QLabel(self.groupBox_6)
self.sel_item12_6.setObjectName(u"sel_item12_6")
self.sel_item12_6.setGeometry(QRect(10, 50, 51, 20))
self.sel_itembox22 = QLineEdit(self.groupBox_6)
self.sel_itembox22.setObjectName(u"sel_itembox22")
self.sel_itembox22.setGeometry(QRect(60, 50, 221, 21))
self.sel_item12_7 = QLabel(self.groupBox_6)
self.sel_item12_7.setObjectName(u"sel_item12_7")
self.sel_item12_7.setGeometry(QRect(0, 70, 51, 20))
self.sel_itembox23 = QLineEdit(self.groupBox_6)
self.sel_itembox23.setObjectName(u"sel_itembox23")
self.sel_itembox23.setGeometry(QRect(60, 80, 101, 21))
self.sel_item12_8 = QLabel(self.groupBox_6)
self.sel_item12_8.setObjectName(u"sel_item12_8")
self.sel_item12_8.setGeometry(QRect(170, 80, 31, 20))
self.sel_itembox24 = QLineEdit(self.groupBox_6)
self.sel_itembox24.setObjectName(u"sel_itembox24")
self.sel_itembox24.setGeometry(QRect(210, 80, 71, 21))
self.sel_item11_4 = QLabel(self.groupBox_6)
self.sel_item11_4.setObjectName(u"sel_item11_4")
self.sel_item11_4.setGeometry(QRect(10, 110, 51, 20))
self.sel_itembox25 = QLineEdit(self.groupBox_6)
self.sel_itembox25.setObjectName(u"sel_itembox25")
self.sel_itembox25.setGeometry(QRect(60, 110, 91, 21))
self.sel_item12_9 = QLabel(self.groupBox_6)
self.sel_item12_9.setObjectName(u"sel_item12_9")
self.sel_item12_9.setGeometry(QRect(160, 110, 61, 20))
self.sel_itembox26 = QLineEdit(self.groupBox_6)
self.sel_itembox26.setObjectName(u"sel_itembox26")
self.sel_itembox26.setGeometry(QRect(230, 110, 51, 21))
self.groupBox_7 = QGroupBox(self.groupBox_4)
self.groupBox_7.setObjectName(u"groupBox_7")
self.groupBox_7.setGeometry(QRect(10, 350, 291, 161))
self.sel_item11_5 = QLabel(self.groupBox_7)
self.sel_item11_5.setObjectName(u"sel_item11_5")
self.sel_item11_5.setGeometry(QRect(10, 20, 31, 20))
self.sel_itembox31 = QLineEdit(self.groupBox_7)
self.sel_itembox31.setObjectName(u"sel_itembox31")
self.sel_itembox31.setGeometry(QRect(60, 20, 221, 21))
self.sel_item12_10 = QLabel(self.groupBox_7)
self.sel_item12_10.setObjectName(u"sel_item12_10")
self.sel_item12_10.setGeometry(QRect(10, 50, 51, 20))
self.sel_itembox32 = QLineEdit(self.groupBox_7)
self.sel_itembox32.setObjectName(u"sel_itembox32")
self.sel_itembox32.setGeometry(QRect(60, 50, 221, 21))
self.sel_item12_11 = QLabel(self.groupBox_7)
self.sel_item12_11.setObjectName(u"sel_item12_11")
self.sel_item12_11.setGeometry(QRect(10, 80, 51, 20))
self.sel_itembox33 = QLineEdit(self.groupBox_7)
self.sel_itembox33.setObjectName(u"sel_itembox33")
self.sel_itembox33.setGeometry(QRect(60, 80, 101, 21))
self.sel_item12_12 = QLabel(self.groupBox_7)
self.sel_item12_12.setObjectName(u"sel_item12_12")
self.sel_item12_12.setGeometry(QRect(170, 80, 31, 20))
self.sel_itembox34 = QLineEdit(self.groupBox_7)
self.sel_itembox34.setObjectName(u"sel_itembox34")
self.sel_itembox34.setGeometry(QRect(210, 80, 71, 21))
self.sel_item11_6 = QLabel(self.groupBox_7)
self.sel_item11_6.setObjectName(u"sel_item11_6")
self.sel_item11_6.setGeometry(QRect(10, 110, 51, 20))
self.sel_itembox35 = QLineEdit(self.groupBox_7)
self.sel_itembox35.setObjectName(u"sel_itembox35")
self.sel_itembox35.setGeometry(QRect(60, 110, 91, 21))
self.sel_item12_13 = QLabel(self.groupBox_7)
self.sel_item12_13.setObjectName(u"sel_item12_13")
self.sel_item12_13.setGeometry(QRect(160, 110, 61, 20))
self.sel_itembox36 = QLineEdit(self.groupBox_7)
self.sel_itembox36.setObjectName(u"sel_itembox36")
self.sel_itembox36.setGeometry(QRect(230, 110, 51, 21))
self.groupBox_8 = QGroupBox(self.groupBox_4)
self.groupBox_8.setObjectName(u"groupBox_8")
self.groupBox_8.setGeometry(QRect(10, 520, 291, 151))
self.sel_item11_7 = QLabel(self.groupBox_8)
self.sel_item11_7.setObjectName(u"sel_item11_7")
self.sel_item11_7.setGeometry(QRect(10, 20, 31, 20))
self.sel_itembox41 = QLineEdit(self.groupBox_8)
self.sel_itembox41.setObjectName(u"sel_itembox41")
self.sel_itembox41.setGeometry(QRect(60, 20, 221, 21))
self.sel_item12_14 = QLabel(self.groupBox_8)
self.sel_item12_14.setObjectName(u"sel_item12_14")
self.sel_item12_14.setGeometry(QRect(10, 50, 51, 20))
self.sel_itembox42 = QLineEdit(self.groupBox_8)
self.sel_itembox42.setObjectName(u"sel_itembox42")
self.sel_itembox42.setGeometry(QRect(60, 50, 221, 21))
self.sel_item12_15 = QLabel(self.groupBox_8)
self.sel_item12_15.setObjectName(u"sel_item12_15")
self.sel_item12_15.setGeometry(QRect(10, 80, 51, 20))
self.sel_itembox43 = QLineEdit(self.groupBox_8)
self.sel_itembox43.setObjectName(u"sel_itembox43")
self.sel_itembox43.setGeometry(QRect(60, 80, 101, 21))
self.sel_item12_16 = QLabel(self.groupBox_8)
self.sel_item12_16.setObjectName(u"sel_item12_16")
self.sel_item12_16.setGeometry(QRect(170, 80, 31, 20))
self.sel_itembox44 = QLineEdit(self.groupBox_8)
self.sel_itembox44.setObjectName(u"sel_itembox44")
self.sel_itembox44.setGeometry(QRect(210, 80, 71, 21))
self.sel_item11_8 = QLabel(self.groupBox_8)
self.sel_item11_8.setObjectName(u"sel_item11_8")
self.sel_item11_8.setGeometry(QRect(10, 110, 51, 20))
self.sel_itembox45 = QLineEdit(self.groupBox_8)
self.sel_itembox45.setObjectName(u"sel_itembox45")
self.sel_itembox45.setGeometry(QRect(60, 110, 91, 21))
self.sel_item12_17 = QLabel(self.groupBox_8)
self.sel_item12_17.setObjectName(u"sel_item12_17")
self.sel_item12_17.setGeometry(QRect(160, 110, 61, 20))
self.sel_itembox46 = QLineEdit(self.groupBox_8)
self.sel_itembox46.setObjectName(u"sel_itembox46")
self.sel_itembox46.setGeometry(QRect(230, 110, 51, 21))
self.groupBox_9 = QGroupBox(self.groupBox_4)
self.groupBox_9.setObjectName(u"groupBox_9")
self.groupBox_9.setGeometry(QRect(10, 680, 291, 161))
self.sel_item11_9 = QLabel(self.groupBox_9)
self.sel_item11_9.setObjectName(u"sel_item11_9")
self.sel_item11_9.setGeometry(QRect(10, 20, 31, 20))
self.sel_itembox51 = QLineEdit(self.groupBox_9)
self.sel_itembox51.setObjectName(u"sel_itembox51")
self.sel_itembox51.setGeometry(QRect(60, 20, 221, 21))
self.sel_item12_18 = QLabel(self.groupBox_9)
self.sel_item12_18.setObjectName(u"sel_item12_18")
self.sel_item12_18.setGeometry(QRect(10, 50, 51, 20))
self.sel_itembox52 = QLineEdit(self.groupBox_9)
self.sel_itembox52.setObjectName(u"sel_itembox52")
self.sel_itembox52.setGeometry(QRect(60, 50, 221, 21))
self.sel_item12_19 = QLabel(self.groupBox_9)
self.sel_item12_19.setObjectName(u"sel_item12_19")
self.sel_item12_19.setGeometry(QRect(10, 80, 51, 20))
self.sel_itembox53 = QLineEdit(self.groupBox_9)
self.sel_itembox53.setObjectName(u"sel_itembox53")
self.sel_itembox53.setGeometry(QRect(60, 80, 101, 21))
self.sel_item12_20 = QLabel(self.groupBox_9)
self.sel_item12_20.setObjectName(u"sel_item12_20")
self.sel_item12_20.setGeometry(QRect(170, 80, 31, 20))
self.sel_itembox54 = QLineEdit(self.groupBox_9)
self.sel_itembox54.setObjectName(u"sel_itembox54")
self.sel_itembox54.setGeometry(QRect(210, 80, 71, 21))
self.sel_item11_10 = QLabel(self.groupBox_9)
self.sel_item11_10.setObjectName(u"sel_item11_10")
self.sel_item11_10.setGeometry(QRect(10, 110, 51, 20))
self.sel_itembox55 = QLineEdit(self.groupBox_9)
self.sel_itembox55.setObjectName(u"sel_itembox55")
self.sel_itembox55.setGeometry(QRect(60, 110, 91, 21))
self.sel_item12_21 = QLabel(self.groupBox_9)
self.sel_item12_21.setObjectName(u"sel_item12_21")
self.sel_item12_21.setGeometry(QRect(160, 110, 61, 20))
self.sel_itembox56 = QLineEdit(self.groupBox_9)
self.sel_itembox56.setObjectName(u"sel_itembox56")
self.sel_itembox56.setGeometry(QRect(230, 110, 51, 21))
self.urlgobtn = QPushButton(self.groupBox_4)
self.urlgobtn.setObjectName(u"urlgobtn")
self.urlgobtn.setGeometry(QRect(1280, 800, 41, 31))
self.horizontalLayout_5.addWidget(self.groupBox_4)
self.horizontalLayoutWidget_6 = QWidget(self.centralwidget)
self.horizontalLayoutWidget_6.setObjectName(u"horizontalLayoutWidget_6")
self.horizontalLayoutWidget_6.setGeometry(QRect(1040, 70, 851, 851))
self.horizontalLayout_6 = QHBoxLayout(self.horizontalLayoutWidget_6)
self.horizontalLayout_6.setObjectName(u"horizontalLayout_6")
self.horizontalLayout_6.setContentsMargins(0, 0, 0, 0)
self.groupBox_10 = QGroupBox(self.horizontalLayoutWidget_6)
self.groupBox_10.setObjectName(u"groupBox_10")
self.selkeyword = QLabel(self.groupBox_10)
self.selkeyword.setObjectName(u"selkeyword")
self.selkeyword.setGeometry(QRect(10, 250, 131, 20))
self.selkeyword.setAlignment(Qt.AlignCenter)
self.urlbox = QLineEdit(self.groupBox_10)
self.urlbox.setObjectName(u"urlbox")
self.urlbox.setGeometry(QRect(150, 810, 631, 31))
self.urlbox.setDragEnabled(False)
self.urlbox.setClearButtonEnabled(True)
self.deliveryfee = QLabel(self.groupBox_10)
self.deliveryfee.setObjectName(u"deliveryfee")
self.deliveryfee.setGeometry(QRect(10, 370, 64, 15))
self.deliveryfee.setWordWrap(False)
self.addmargin = QLabel(self.groupBox_10)
self.addmargin.setObjectName(u"addmargin")
self.addmargin.setGeometry(QRect(10, 490, 81, 16))
self.addmargin.setWordWrap(False)
self.addpackingfee = QLabel(self.groupBox_10)
self.addpackingfee.setObjectName(u"addpackingfee")
self.addpackingfee.setGeometry(QRect(10, 430, 91, 16))
self.addpackingfee.setWordWrap(False)
self.selkeywordbox = QLineEdit(self.groupBox_10)
self.selkeywordbox.setObjectName(u"selkeywordbox")
self.selkeywordbox.setGeometry(QRect(10, 270, 131, 31))
self.selkeywordbox.setStyleSheet(u"font: 10pt \"\uc0c8\uad74\ub9bc\";")
self.selkeywordbox.setClearButtonEnabled(True)
self.urlgobtn_2 = QPushButton(self.groupBox_10)
self.urlgobtn_2.setObjectName(u"urlgobtn_2")
self.urlgobtn_2.setGeometry(QRect(790, 810, 51, 31))
self.sel_item12_42 = QLabel(self.groupBox_10)
self.sel_item12_42.setObjectName(u"sel_item12_42")
self.sel_item12_42.setGeometry(QRect(10, 310, 51, 20))
self.sel_itemtagbox = QLineEdit(self.groupBox_10)
self.sel_itemtagbox.setObjectName(u"sel_itemtagbox")
self.sel_itemtagbox.setGeometry(QRect(10, 330, 131, 31))
self.sel_itemtagbox.setClearButtonEnabled(True)
self.matchbtn = QPushButton(self.groupBox_10)
self.matchbtn.setObjectName(u"matchbtn")
self.matchbtn.setGeometry(QRect(10, 200, 121, 41))
self.matchbtn.setStyleSheet(u"background-color: rgb(0, 255, 255);\n"
"font: 16pt \"HY\ud5e4\ub4dc\ub77c\uc778M\";")
self.search_keyword_box = QLineEdit(self.groupBox_10)
self.search_keyword_box.setObjectName(u"search_keyword_box")
self.search_keyword_box.setGeometry(QRect(140, 10, 191, 41))
self.search_keyword_box.setClearButtonEnabled(True)
self.searchbtn_2 = QPushButton(self.groupBox_10)
self.searchbtn_2.setObjectName(u"searchbtn_2")
self.searchbtn_2.setGeometry(QRect(340, 10, 111, 41))
self.searchbtn_2.setCheckable(False)
self.searchbtn_2.setAutoDefault(True)
self.searchbtn_2.setFlat(False)
self.switchBtn = QPushButton(self.groupBox_10)
self.switchBtn.setObjectName(u"switchBtn")
self.switchBtn.setGeometry(QRect(734, 10, 101, 41))
self.tabWidget = QTabWidget(self.groupBox_10)
self.tabWidget.setObjectName(u"tabWidget")
self.tabWidget.setGeometry(QRect(140, 60, 701, 741))
self.tabWidget.setTabBarAutoHide(False)
self.tab_1 = QWidget()
self.tab_1.setObjectName(u"tab_1")
self.webEngineView = QWebEngineView(self.tab_1)
self.webEngineView.setObjectName(u"webEngineView")
self.webEngineView.setGeometry(QRect(0, 0, 711, 731))
self.webEngineView.setUrl(QUrl(u"https://m.intl.taobao.com/"))
self.webEngineView.setZoomFactor(0.500000000000000)
self.tabWidget.addTab(self.tab_1, "")
self.tab_2 = QWidget()
self.tab_2.setObjectName(u"tab_2")
self.webEngineView_2 = QWebEngineView(self.tab_2)
self.webEngineView_2.setObjectName(u"webEngineView_2")
self.webEngineView_2.setGeometry(QRect(10, 10, 711, 711))
self.webEngineView_2.setUrl(QUrl(u"https://world.taobao.com/"))
self.webEngineView_2.setZoomFactor(0.400000000000000)
self.tabWidget.addTab(self.tab_2, "")
self.cat1 = QLabel(self.groupBox_10)
self.cat1.setObjectName(u"cat1")
self.cat1.setGeometry(QRect(10, 550, 81, 16))
self.cat1.setWordWrap(False)
self.cat2 = QLabel(self.groupBox_10)
self.cat2.setObjectName(u"cat2")
self.cat2.setGeometry(QRect(10, 610, 81, 16))
self.cat2.setWordWrap(False)
self.cat3 = QLabel(self.groupBox_10)
self.cat3.setObjectName(u"cat3")
self.cat3.setGeometry(QRect(10, 670, 81, 16))
self.cat3.setWordWrap(False)
self.cat4 = QLabel(self.groupBox_10)
self.cat4.setObjectName(u"cat4")
self.cat4.setGeometry(QRect(10, 730, 81, 16))
self.cat4.setWordWrap(False)
self.catbox1 = QLineEdit(self.groupBox_10)
self.catbox1.setObjectName(u"catbox1")
self.catbox1.setGeometry(QRect(10, 570, 131, 31))
self.catbox1.setClearButtonEnabled(True)
self.catbox2 = QLineEdit(self.groupBox_10)
self.catbox2.setObjectName(u"catbox2")
self.catbox2.setGeometry(QRect(10, 630, 131, 31))
self.catbox2.setClearButtonEnabled(True)
self.catbox3 = QLineEdit(self.groupBox_10)
self.catbox3.setObjectName(u"catbox3")
self.catbox3.setGeometry(QRect(10, 690, 131, 31))
self.catbox3.setClearButtonEnabled(True)
self.catbox4 = QLineEdit(self.groupBox_10)
self.catbox4.setObjectName(u"catbox4")
self.catbox4.setGeometry(QRect(10, 750, 131, 31))
self.catbox4.setClearButtonEnabled(True)
self.catcodebox = QLineEdit(self.groupBox_10)
self.catcodebox.setObjectName(u"catcodebox")
self.catcodebox.setGeometry(QRect(10, 810, 131, 31))
self.catcodebox.setClearButtonEnabled(True)
self.cat4_2 = QLabel(self.groupBox_10)
self.cat4_2.setObjectName(u"cat4_2")
self.cat4_2.setGeometry(QRect(10, 790, 101, 16))
self.cat4_2.setWordWrap(False)
self.addmargin_spbox = QSpinBox(self.groupBox_10)
self.addmargin_spbox.setObjectName(u"addmargin_spbox")
self.addmargin_spbox.setGeometry(QRect(10, 510, 131, 31))
sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.addmargin_spbox.sizePolicy().hasHeightForWidth())
self.addmargin_spbox.setSizePolicy(sizePolicy)
font2 = QFont()
font2.setFamilies([u"Agency FB"])
font2.setPointSize(16)
self.addmargin_spbox.setFont(font2)
self.addmargin_spbox.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter)
self.addmargin_spbox.setButtonSymbols(QAbstractSpinBox.PlusMinus)
self.addmargin_spbox.setCorrectionMode(QAbstractSpinBox.CorrectToPreviousValue)
self.addmargin_spbox.setMinimum(1000)
self.addmargin_spbox.setMaximum(600000)
self.addmargin_spbox.setSingleStep(1000)
self.addmargin_spbox.setStepType(QAbstractSpinBox.DefaultStepType)
self.addmargin_spbox.setValue(5000)
self.addmargin_spbox.setDisplayIntegerBase(10)
self.addpackingfee_spbox = QSpinBox(self.groupBox_10)
self.addpackingfee_spbox.setObjectName(u"addpackingfee_spbox")
self.addpackingfee_spbox.setGeometry(QRect(10, 450, 131, 31))
sizePolicy.setHeightForWidth(self.addpackingfee_spbox.sizePolicy().hasHeightForWidth())
self.addpackingfee_spbox.setSizePolicy(sizePolicy)
self.addpackingfee_spbox.setFont(font2)
self.addpackingfee_spbox.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter)
self.addpackingfee_spbox.setButtonSymbols(QAbstractSpinBox.PlusMinus)
self.addpackingfee_spbox.setCorrectionMode(QAbstractSpinBox.CorrectToPreviousValue)
self.addpackingfee_spbox.setMinimum(0)
self.addpackingfee_spbox.setMaximum(100000)
self.addpackingfee_spbox.setSingleStep(1000)
self.addpackingfee_spbox.setStepType(QAbstractSpinBox.DefaultStepType)
self.addpackingfee_spbox.setValue(0)
self.addpackingfee_spbox.setDisplayIntegerBase(10)
self.delivfee_spbox = QSpinBox(self.groupBox_10)
self.delivfee_spbox.setObjectName(u"delivfee_spbox")
self.delivfee_spbox.setGeometry(QRect(10, 390, 131, 31))
sizePolicy.setHeightForWidth(self.delivfee_spbox.sizePolicy().hasHeightForWidth())
self.delivfee_spbox.setSizePolicy(sizePolicy)
self.delivfee_spbox.setFont(font2)
self.delivfee_spbox.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter)
self.delivfee_spbox.setButtonSymbols(QAbstractSpinBox.PlusMinus)
self.delivfee_spbox.setCorrectionMode(QAbstractSpinBox.CorrectToPreviousValue)
self.delivfee_spbox.setMinimum(7000)
self.delivfee_spbox.setMaximum(6000000)
self.delivfee_spbox.setSingleStep(1000)
self.delivfee_spbox.setStepType(QAbstractSpinBox.DefaultStepType)
self.delivfee_spbox.setValue(7000)
self.delivfee_spbox.setDisplayIntegerBase(10)
self.img_searchbtn = QPushButton(self.groupBox_10)
self.img_searchbtn.setObjectName(u"img_searchbtn")
self.img_searchbtn.setGeometry(QRect(10, 10, 121, 41))
self.current_img = QGraphicsView(self.groupBox_10)
self.current_img.setObjectName(u"current_img")
self.current_img.setGeometry(QRect(10, 70, 120, 120))
self.backbtn = QPushButton(self.groupBox_10)
self.backbtn.setObjectName(u"backbtn")
self.backbtn.setGeometry(QRect(530, 10, 61, 41))
self.forwardbtn = QPushButton(self.groupBox_10)
self.forwardbtn.setObjectName(u"forwardbtn")
self.forwardbtn.setGeometry(QRect(600, 10, 61, 41))
self.horizontalLayout_6.addWidget(self.groupBox_10)
self.verticalLayoutWidget = QWidget(self.centralwidget)
self.verticalLayoutWidget.setObjectName(u"verticalLayoutWidget")
self.verticalLayoutWidget.setGeometry(QRect(1549, 10, 341, 51))
self.verticalLayout = QVBoxLayout(self.verticalLayoutWidget)
self.verticalLayout.setObjectName(u"verticalLayout")
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.loginUser = QLabel(self.verticalLayoutWidget)
self.loginUser.setObjectName(u"loginUser")
self.verticalLayout.addWidget(self.loginUser)
self.verticalLayoutWidget_2 = QWidget(self.centralwidget)
self.verticalLayoutWidget_2.setObjectName(u"verticalLayoutWidget_2")
self.verticalLayoutWidget_2.setGeometry(QRect(10, 810, 511, 161))
self.verticalLayout_4 = QVBoxLayout(self.verticalLayoutWidget_2)
self.verticalLayout_4.setObjectName(u"verticalLayout_4")
self.verticalLayout_4.setContentsMargins(0, 0, 0, 0)
self.loginUserInfo = QLabel(self.verticalLayoutWidget_2)
self.loginUserInfo.setObjectName(u"loginUserInfo")
self.verticalLayout_4.addWidget(self.loginUserInfo)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QMenuBar(MainWindow)
self.menubar.setObjectName(u"menubar")
self.menubar.setGeometry(QRect(0, 0, 1902, 26))
self.menu = QMenu(self.menubar)
self.menu.setObjectName(u"menu")
self.menu_2 = QMenu(self.menubar)
self.menu_2.setObjectName(u"menu_2")
self.menu_3 = QMenu(self.menubar)
self.menu_3.setObjectName(u"menu_3")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QStatusBar(MainWindow)
self.statusbar.setObjectName(u"statusbar")
MainWindow.setStatusBar(self.statusbar)
self.menubar.addAction(self.menu.menuAction())
self.menubar.addAction(self.menu_2.menuAction())
self.menubar.addAction(self.menu_3.menuAction())
self.retranslateUi(MainWindow)
self.timerStart.setDefault(True)
self.timerStop.setDefault(True)
self.timerSet.setDefault(True)
self.searchbtn_2.setDefault(True)
self.tabWidget.setCurrentIndex(1)
QMetaObject.connectSlotsByName(MainWindow)
# setupUi
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
self.groupBox.setTitle("")
self.matchCount_2.setText(QCoreApplication.translate("MainWindow", u"\ubd84", None))
self.timerStart.setText(QCoreApplication.translate("MainWindow", u"Start", None))
self.timerStop.setText(QCoreApplication.translate("MainWindow", u"Stop", None))
self.timerSecond.setText(QCoreApplication.translate("MainWindow", u"00", None))
self.matchCount_3.setText(QCoreApplication.translate("MainWindow", u"\ucd08", None))
self.timerMinute.setText(QCoreApplication.translate("MainWindow", u"60", None))
self.timerSet.setText(QCoreApplication.translate("MainWindow", u"Set", None))
self.papagoApi.setText(QCoreApplication.translate("MainWindow", u"PAPAGO API", None))
self.groupBox_2.setTitle("")
self.sel_item12_4.setText(QCoreApplication.translate("MainWindow", u"\uc5f0\uad00\ud0a4\uc6cc\ub4dc", None))
self.groupBox_3.setTitle("")
self.taourl.setText(QCoreApplication.translate("MainWindow", u"\ud0c0\uc624\ubc14\uc774 PC-URL", None))
self.inputGroup.setTitle(QCoreApplication.translate("MainWindow", u"\uc785\ub825\uc601\uc5ed", None))
self.Excel_btn.setText(QCoreApplication.translate("MainWindow", u"\uc5d1\uc140\n"
"\uc5f4\uae30", None))
self.isOverseas.setText(QCoreApplication.translate("MainWindow", u"1", None))
self.selkeyword_2.setText(QCoreApplication.translate("MainWindow", u"\ud574\uc678\uc5ec\ubd80", None))
self.selkeyword_3.setText(QCoreApplication.translate("MainWindow", u"\ucd94\ucd9c\uac2f\uc218", None))
self.sortcount.setText(QCoreApplication.translate("MainWindow", u"5", None))
self.db_btn.setText(QCoreApplication.translate("MainWindow", u"DB\n"
"\uc5f4\uae30", None))
self.export_btn.setText(QCoreApplication.translate("MainWindow", u"XLS\n"
"\uc800\uc7a5", None))
self.matchCount.setText(QCoreApplication.translate("MainWindow", u"\ub9e4\uce6d\uac2f\uc218", None))
self.matchCountbox.setText("")
self.matchCount_4.setText(QCoreApplication.translate("MainWindow", u"\ud0c0\uc774\uba38", None))
self.timerLabel.setText(QCoreApplication.translate("MainWindow", u"60:00", None))
self.matchCount_5.setText(QCoreApplication.translate("MainWindow", u"\uc2a4\ud06c\ub798\ud551", None))
self.selkeyword_4.setText(QCoreApplication.translate("MainWindow", u"Scraping", None))
self.selkeyword_5.setText(QCoreApplication.translate("MainWindow", u"Save Image", None))
self.groupBox_4.setTitle(QCoreApplication.translate("MainWindow", u"\ud45c\uc2dc\uc601\uc5ed", None))
self.groupBox_5.setTitle(QCoreApplication.translate("MainWindow", u"1\ubc88 \uc0c1\ud488", None))
self.sel_item11_2.setText(QCoreApplication.translate("MainWindow", u"\uc774\ub984", None))
self.sel_item12_5.setText(QCoreApplication.translate("MainWindow", u"Tag", None))
self.sel_item12_2.setText(QCoreApplication.translate("MainWindow", u"\ub9ac\ubdf0\uc218", None))
self.sel_item12_3.setText(QCoreApplication.translate("MainWindow", u"\ucc1c\uc218", None))
self.sel_item11.setText(QCoreApplication.translate("MainWindow", u"\uac00 \uaca9", None))
self.sel_item12.setText(QCoreApplication.translate("MainWindow", u"\uad6c\ub9e4\uac74\uc218", None))
self.groupBox_6.setTitle(QCoreApplication.translate("MainWindow", u"2\ubc88 \uc0c1\ud488", None))
self.sel_item11_3.setText(QCoreApplication.translate("MainWindow", u"\uc774\ub984", None))
self.sel_item12_6.setText(QCoreApplication.translate("MainWindow", u"Tag", None))
self.sel_item12_7.setText(QCoreApplication.translate("MainWindow", u"\ub9ac\ubdf0\uc218", None))
self.sel_item12_8.setText(QCoreApplication.translate("MainWindow", u"\ucc1c\uc218", None))
self.sel_item11_4.setText(QCoreApplication.translate("MainWindow", u"\uac00 \uaca9", None))
self.sel_item12_9.setText(QCoreApplication.translate("MainWindow", u"\uad6c\ub9e4\uac74\uc218", None))
self.groupBox_7.setTitle(QCoreApplication.translate("MainWindow", u"3\ubc88 \uc0c1\ud488", None))
self.sel_item11_5.setText(QCoreApplication.translate("MainWindow", u"\uc774\ub984", None))
self.sel_item12_10.setText(QCoreApplication.translate("MainWindow", u"Tag", None))
self.sel_item12_11.setText(QCoreApplication.translate("MainWindow", u"\ub9ac\ubdf0\uc218", None))
self.sel_item12_12.setText(QCoreApplication.translate("MainWindow", u"\ucc1c\uc218", None))
self.sel_item11_6.setText(QCoreApplication.translate("MainWindow", u"\uac00 \uaca9", None))
self.sel_item12_13.setText(QCoreApplication.translate("MainWindow", u"\uad6c\ub9e4\uac74\uc218", None))
self.groupBox_8.setTitle(QCoreApplication.translate("MainWindow", u"4\ubc88 \uc0c1\ud488", None))
self.sel_item11_7.setText(QCoreApplication.translate("MainWindow", u"\uc774\ub984", None))
self.sel_item12_14.setText(QCoreApplication.translate("MainWindow", u"Tag", None))
self.sel_item12_15.setText(QCoreApplication.translate("MainWindow", u"\ub9ac\ubdf0\uc218", None))
self.sel_item12_16.setText(QCoreApplication.translate("MainWindow", u"\ucc1c\uc218", None))
self.sel_item11_8.setText(QCoreApplication.translate("MainWindow", u"\uac00 \uaca9", None))
self.sel_item12_17.setText(QCoreApplication.translate("MainWindow", u"\uad6c\ub9e4\uac74\uc218", None))
self.groupBox_9.setTitle(QCoreApplication.translate("MainWindow", u"5\ubc88 \uc0c1\ud488", None))
self.sel_item11_9.setText(QCoreApplication.translate("MainWindow", u"\uc774\ub984", None))
self.sel_item12_18.setText(QCoreApplication.translate("MainWindow", u"Tag", None))
self.sel_item12_19.setText(QCoreApplication.translate("MainWindow", u"\ub9ac\ubdf0\uc218", None))
self.sel_item12_20.setText(QCoreApplication.translate("MainWindow", u"\ucc1c\uc218", None))
self.sel_item11_10.setText(QCoreApplication.translate("MainWindow", u"\uac00 \uaca9", None))
self.sel_item12_21.setText(QCoreApplication.translate("MainWindow", u"\uad6c\ub9e4\uac74\uc218", None))
self.urlgobtn.setText(QCoreApplication.translate("MainWindow", u"GO", None))
self.groupBox_10.setTitle("")
self.selkeyword.setText(QCoreApplication.translate("MainWindow", u"\ud604\uc7acitem(\uac00\uc9c0\uce58\uae30)", None))
self.urlbox.setText(QCoreApplication.translate("MainWindow", u"http://naver.com", None))
self.deliveryfee.setText(QCoreApplication.translate("MainWindow", u"\ubc30\uc1a1\ube44", None))
self.addmargin.setText(QCoreApplication.translate("MainWindow", u"\ub354\ud558\uae30\ub9c8\uc9c4", None))
self.addpackingfee.setText(QCoreApplication.translate("MainWindow", u"\ucd94\uac00\ud3ec\uc7a5\ube44", None))
self.urlgobtn_2.setText(QCoreApplication.translate("MainWindow", u"GO", None))
self.sel_item12_42.setText(QCoreApplication.translate("MainWindow", u"Tag", None))
self.matchbtn.setText(QCoreApplication.translate("MainWindow", u"\ub9e4\uce6d", None))
self.searchbtn_2.setText(QCoreApplication.translate("MainWindow", u"\ud0a4\uc6cc\ub4dc \uac80\uc0c9", None))
self.switchBtn.setText(QCoreApplication.translate("MainWindow", u"PC-\ubaa8\ubc14\uc77c\n"
"\uc804\ud658", None))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_1), QCoreApplication.translate("MainWindow", u"\ubaa8\ubc14\uc77c\ud0ed-\ud14d\uc2a4\ud2b8\uac80\uc0c9", None))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), QCoreApplication.translate("MainWindow", u"PC\ud0ed-\uc774\ubbf8\uc9c0\uac80\uc0c9", None))
self.cat1.setText(QCoreApplication.translate("MainWindow", u"\uce74\ud14c\uace0\ub9ac 1", None))
self.cat2.setText(QCoreApplication.translate("MainWindow", u"\uce74\ud14c\uace0\ub9ac 2", None))
self.cat3.setText(QCoreApplication.translate("MainWindow", u"\uce74\ud14c\uace0\ub9ac 3", None))
self.cat4.setText(QCoreApplication.translate("MainWindow", u"\uce74\ud14c\uace0\ub9ac 4", None))
self.cat4_2.setText(QCoreApplication.translate("MainWindow", u"\uce74\ud14c\uace0\ub9ac \ucf54\ub4dc", None))
self.img_searchbtn.setText(QCoreApplication.translate("MainWindow", u"\ud604\uc7ac \uc774\ubbf8\uc9c0 \uac80\uc0c9", None))
self.backbtn.setText(QCoreApplication.translate("MainWindow", u"\ub4a4\ub85c", None))
self.forwardbtn.setText(QCoreApplication.translate("MainWindow", u"\uc55e\uc73c\ub85c", None))
self.loginUser.setText("")
self.loginUserInfo.setText("")
self.menu.setTitle(QCoreApplication.translate("MainWindow", u"\ud30c\uc77c", None))
self.menu_2.setTitle(QCoreApplication.translate("MainWindow", u"\uc124\uc815", None))
self.menu_3.setTitle(QCoreApplication.translate("MainWindow", u"\ub3c4\uc6c0\ub9d0", None))
# retranslateUi

29
main.py Normal file
View File

@ -0,0 +1,29 @@
import sys
from modules.login_widget import LoginWidget
from modules.mongo_config import MongoConfig
from modules.main_window import MainWindow
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QApplication
def main():
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_ShareOpenGLContexts)
app = QtWidgets.QApplication(sys.argv)
mongo_config = MongoConfig() # MongoDB 설정 관리 인스턴스 생성
mongo_config.try_connect(*mongo_config.load_config()) # MongoDB에 연결 시도
# main_window = MainWindow(mongo_config) # 메인 윈도우 인스턴스 생성
login_widget = LoginWidget(mongo_config) # 로그인 위젯 생성, 메인 윈도우 인스턴스 전달
login_widget.show() # 로그인 위젯 표시
sys.exit(app.exec_())
if __name__ == '__main__':
main()
app = QApplication(sys.argv)

114
modules/DBList.py Normal file
View File

@ -0,0 +1,114 @@
from PyQt5.QtWidgets import QDialog, QVBoxLayout, QHBoxLayout, QComboBox, QListWidget, QAbstractItemView, QPushButton, QMessageBox
from PyQt5.QtCore import Qt
from datetime import datetime
class DbDialog(QDialog):
def __init__(self, mydb):
super().__init__()
self.mydb = mydb
print(f"class DbDialog 현재 DB상태 : {self.mydb}")
self.setWindowTitle("DB 목록 선택")
self.setFixedSize(400, 600)
# Dialog 레이아웃 설정
dialog_layout = QVBoxLayout()
self.setLayout(dialog_layout)
# 년도 선택 콤보박스
self.year_combo = QComboBox()
self.year_combo.addItems(self.get_years())
self.year_combo.setCurrentText(str(datetime.now().year))
self.year_combo.setFixedSize(100, 50)
dialog_layout.addWidget(self.year_combo)
# 월 선택 콤보박스
self.month_combo = QComboBox()
self.month_combo.addItems(self.get_months())
self.month_combo.setCurrentText(str(datetime.now().month))
self.month_combo.setFixedSize(100, 50)
dialog_layout.addWidget(self.month_combo)
# DB 목록 리스트
self.db_index_list = QListWidget()
self.db_index_list.setSelectionMode(QAbstractItemView.SingleSelection)
self.db_index_list.setFixedSize(350, 450)
dialog_layout.addWidget(self.db_index_list)
self.db_index_list.itemDoubleClicked.connect(self.on_confirm_clicked)
# 확인 버튼
self.confirm_btn = QPushButton("확인")
self.confirm_btn.setFixedSize(100, 50)
self.confirm_btn.clicked.connect(self.on_confirm_clicked)
dialog_layout.addWidget(self.confirm_btn, alignment=Qt.AlignRight)
# 콤보박스 선택 시 목록 업데이트
self.year_combo.currentIndexChanged.connect(self.update_db_list)
self.month_combo.currentIndexChanged.connect(self.update_db_list)
# 초기 목록 업데이트
self.update_db_list()
def get_years(self):
years = []
for doc in self.mydb.keywords_index.distinct("year", {}):
years.append(doc)
return years
def get_months(self):
# 월 목록 (1~12)
return [str(i) for i in range(1, 13)]
def update_db_list(self):
# 선택된 년도와 월에 해당하는 filename 목록 가져오기
selected_year = self.year_combo.currentText()
selected_month = self.month_combo.currentText()
filter_query = {"year": selected_year, "month": selected_month}
filenames = [doc["filename"] for doc in self.mydb.keywords_index.find(filter_query, {})]
# 목록 위젯에 filename 목록 표시
self.db_index_list.clear()
self.db_index_list.addItems(filenames)
def on_confirm_clicked(self):
# 선택된 아이템 확인
selected_items = self.db_index_list.selectedItems()
# 선택된 아이템 정보 출력
for item in selected_items:
print(f"아이템 텍스트: {item.text()}")
# print(f"아이템 데이터: {item.data(Qt.UserRole)}")
if not self.db_index_list.selectedItems():
QMessageBox.information(self, "알림", "목록을 선택해주세요.")
return None
# 선택된 아이템의 filename 추출
selected_item = selected_items[0]
filename = selected_item.text()
# keyword_ids 목록 반환
try:
# filename을 기준으로 keyword_ids만 검색
result = self.mydb.keywords_index.find_one({"filename": filename}, {"keyword_ids": 1})
if result:
self.selected_keyword_data = result['keyword_ids']
print(f"DBList 내 self.selected_keyword_data : {self.selected_keyword_data}")
self.accept()
# print(f"result : {result}")
# return result
else:
raise ValueError(f"데이터베이스에서 {filename}에 해당하는 데이터를 찾을 수 없습니다.")
except Exception as e:
# 예외 발생 시 에러 메시지 출력
QMessageBox.warning(self, "에러", f"{e}")
# return None

16
modules/SignUpWidget.py Normal file
View File

@ -0,0 +1,16 @@
from PyQt5 import QtWidgets, uic, QtWidgets
class SignUpWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.initUI()
# UI 파일 로드
uic.loadUi('signup.ui', self)
def initUI(self):
self.setWindowTitle("회원가입")
layout = QtWidgets.QVBoxLayout()
# UI 구성 요소 추가 (이메일 입력, 비밀번호 입력, 약관 동의 등)
self.setLayout(layout)

0
modules/_init.py Normal file
View File

15
modules/backendserver.py Normal file
View File

@ -0,0 +1,15 @@
import os
def create_user_directory_on_nas(self, email, now):
base_path = "/volume1/Listup"
user_name = email.split('@')[0] # 이메일에서 사용자 이름 추출
year_folder = now.strftime('%Y년')
month_folder = now.strftime('%m월')
user_path = os.path.join(base_path, user_name, year_folder, month_folder)
# 해당 경로가 존재하지 않는 경우 생성
if not os.path.exists(user_path):
os.makedirs(user_path)
print(f"NAS에서 디렉토리 생성: {user_path}")
else:
print(f"NAS에서 디렉토리 이미 존재: {user_path}")

6
modules/config.ini Normal file
View File

@ -0,0 +1,6 @@
[MongoDB]
address = cckb9998.synology.me
port = 27017
user = root
password = 1234

155
modules/dataview.py Normal file
View File

@ -0,0 +1,155 @@
from collections import OrderedDict
from PyQt5.QtWidgets import QTableView, QHeaderView
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QStandardItemModel, QStandardItem
from bson.objectid import ObjectId
class DataView(QTableView):
def __init__(self, mydb, dbviewer1):
super().__init__()
self.mydb = mydb
self.dbviewer1 = dbviewer1
print(f"class DataView 현재 DB상태 : {self.mydb}")
def collect_data(self, selected_keyword_data):
# 컬렉션 설정
keywords_col = self.mydb["keywords"]
print(f"keywords_col : {keywords_col}")
naver_shopping_col = self.mydb["NaverShopping"]
print(f"naver_shopping_col : {naver_shopping_col}")
print(f"넘겨받은 selected_keyword_data : {selected_keyword_data}")
# keywords 컬렉션에서 키워드 정보 가져오기
keyword_infos = keywords_col.find({"_id": {"$in": selected_keyword_data}})
print(f"keyword_infos : {keyword_infos}")
# try:
# keyword_info = keywords_col.find_one({"_id": ObjectId(selected_keyword_data)})
for keywords in keyword_infos:
# 키워드, 카테고리, state 정보 추출
keyword = keywords["키워드"]
print(f"keyword : {keyword}")
category = keywords["카테고리"]
print(f"category : {category}")
state = keywords["state"]
print(f"state : {state}")
# 네이버쇼핑 컬렉션에서 키워드 ID 기반으로 상품 목록 가져오기
products = naver_shopping_col.find({"keyword_id": {"$in": selected_keyword_data}})
# print(f"네이버쇼핑 products : {products}")
# # products를 list로 변환
# products_list = list(products)
# print(f"네이버쇼핑 products_list : {products_list}")
# 상품 데이터 리스트
product_list = []
print("상품 데이터 리스트 초기화")
# 상품 데이터 루프 처리
for product in products:
# product_info = naver_shopping_col.find_one({"_id": product})
# 상품 정보 추출
print("상품 정보 추출")
product_id = product["_id"]
productName = product["productName"]
overseaTp = product["overseaTp"]
keepCnt = product["keepCnt"]
imageUrl = product["imageUrl"]
price = product["price"]
openDate = product["openDate"]
rank = product["rank"]
manuTag = product["manuTag"]
reviewCountSum = product["reviewCountSum"]
dlvryPrice = product["dlvryPrice"]
purchaseCnt = product["purchaseCnt"]
# 상품 정보 OrderedDict에 저장
product_dict = OrderedDict([
("키워드", keyword),
("BASE카테고리", category),
("상품명", productName),
("해외배송여부", overseaTp),
("찜수", keepCnt),
("리뷰수", reviewCountSum),
("구매건수", purchaseCnt),
("가격", price),
("배송비포함가격", dlvryPrice),
("등록일", openDate),
("순위", rank),
("상품태그", manuTag),
("이미지주소", imageUrl),
("상태", state),
("상품 ID", product_id),
])
# 상품 정보 리스트에 추가
product_list.append(product_dict)
print(f"product_list : {product_list}")
return product_list
# self.show_viewer(product_list)
def show_viewer11(self, product_list):
# QTableView 객체 생성
# dbViewer1 = QTableView()
# dbViewer1 = self.findChild(QTableView, "dbViewer1")
if not product_list: # product_list가 비어있는 경우 처리
print("product_list가 비어있습니다.")
return
# 모델 생성 및 데이터 설정
model = QStandardItemModel(len(product_list), len(product_list[0]))
for row, product_data in enumerate(product_list):
for col, value in enumerate(product_data.values()):
item = QStandardItem(str(value))
model.setItem(row, col, item)
# 헤더 설정
headers = list(product_list[0].keys())
model.setHorizontalHeaderLabels(headers) # 컬럼 헤더 제목 설정
# MainTao.ui 파일에서 dbViewer1 객체 참조
self.dbviewer1 = self.findChild(QTableView, "dbviewer1")
# 모델을 QTableView에 설정
self.dbviewer1.setModel(model)
# 헤더 가로 크기 조절 방식 설정
for i in range(len(headers)):
self.dbviewer1.horizontalHeader().setSectionResizeMode(i, QHeaderView.Stretch)
# QTableView 표시
self.dbviewer1.show()
def show_viewer(self, product_list):
if not product_list:
print("No products to display.")
return
# Create a model for the QTableView
model = QStandardItemModel()
# Assuming product_list is a list of dictionaries, where each dictionary represents a product
if product_list:
# Set model headers using the keys from the first item in product_list
model.setHorizontalHeaderLabels(list(product_list[0].keys()))
for product in product_list:
# Create a list of QStandardItems from product values
row = [QStandardItem(str(value)) for value in product.values()]
model.appendRow(row)
self.dbviewer1.setModel(model)
self.dbviewer1.horizontalHeader().setStretchLastSection(True)
self.dbviewer1.resizeColumnsToContents()

129
modules/dbConnect.py Normal file
View File

@ -0,0 +1,129 @@
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QLineEdit, QPushButton, QMessageBox, QCheckBox
from pymongo import MongoClient
from modules.mongo_config import MongoConfig
from configparser import ConfigParser
from pymongo.errors import ConnectionFailure
from PyQt5.QtCore import Qt
class MongoConnectionWidget(QWidget):
def __init__(self):
super().__init__()
self.mongoConfig = MongoConfig()
self.initUI()
def initUI(self):
self.setGeometry(780, 420, 360, 240)
layout = QVBoxLayout()
self.infoLabel = QLabel("사용자 로그인 정보를 입력하세요")
self.infoLabel = QLabel("서버 정보를 입력하세요:")
self.addressInput = QLineEdit("qcy2.duckdns.org")
self.addressInput.setPlaceholderText("서버 주소 (예: www.naver.com)")
self.addressInput.returnPressed.connect(self.focus_to_port_input)
self.portInput = QLineEdit("27017")
self.portInput.setPlaceholderText("서버 포트 (예: 27017)")
self.portInput.returnPressed.connect(self.focus_to_user_input)
self.userInput = QLineEdit("root")
self.userInput.setPlaceholderText("사용자 이름")
self.userInput.returnPressed.connect(self.focus_to_password_input)
self.passwordInput = QLineEdit("1234")
self.passwordInput.setPlaceholderText("비밀번호")
self.passwordInput.setEchoMode(QLineEdit.Password)
self.passwordInput.returnPressed.connect(self.try_connect)
# 비밀번호 표시 토글 버튼
self.showPasswordCheckBox = QCheckBox("비밀번호 표시")
self.showPasswordCheckBox.stateChanged.connect(self.togglePasswordVisibility)
self.connectButton = QPushButton("접속하기")
self.connectButton.clicked.connect(self.try_connect)
layout.addWidget(self.infoLabel)
layout.addWidget(self.addressInput)
layout.addWidget(self.portInput)
layout.addWidget(self.userInput)
layout.addWidget(self.passwordInput)
layout.addWidget(self.showPasswordCheckBox)
layout.addWidget(self.connectButton)
self.setLayout(layout)
self.setWindowTitle('데이터베이스 연결 설정')
def focus_to_user_input(self):
self.userInput.setFocus()
def focus_to_port_input(self):
self.portInput.setFocus()
def focus_to_password_input(self):
self.passwordInput.setFocus()
def togglePasswordVisibility(self, state):
if state == Qt.Checked:
self.passwordInput.setEchoMode(QLineEdit.Normal)
else:
self.passwordInput.setEchoMode(QLineEdit.Password)
def load_config_and_try_connect(self):
config = ConfigParser()
config.read('config.ini')
if config.has_section('MongoDB'):
address = config.get('MongoDB', 'address')
port = config.get('MongoDB', 'port')
user = config.get('MongoDB', 'user')
password = config.get('MongoDB', 'password')
return self.try_connect_with_config(address, port, user, password)
return False
def try_connect_with_config(self, address, port, user, password):
try:
client = MongoClient(f'mongodb://{user}:{password}@{address}:{port}/')
client.admin.command('ping') # 접속 확인
return True, "접속 성공"
except ConnectionFailure as e:
# ConnectionFailure 예외 발생 시 에러 메시지 포착
error_message = str(e.details) if hasattr(e, 'details') else str(e)
return False, f"접속 실패: {error_message}"
except Exception as e:
# 기타 예외 처리
return False, f"접속 실패: {str(e)}"
def try_connect(self):
address = self.addressInput.text()
port = self.portInput.text()
user = self.userInput.text()
password = self.passwordInput.text()
success, message = self.try_connect_with_config(address, port, user, password)
if success:
QMessageBox.information(self, "성공", message)
self.save_config(address, port, user, password)
self.proceed_to_main_program()
else:
QMessageBox.warning(self, "실패", message)
def save_config(self, address, port, user, password):
config = ConfigParser()
config['MongoDB'] = {
'address': address,
'port': port,
'user': user,
'password': password
}
with open('config.ini', 'w') as configfile:
config.write(configfile)
#def main():
# app = QApplication(sys.argv)
# ex = MongoConnectionWidget()
# ex.show()
# sys.exit(app.exec_())
#if __name__ == '__main__':
# main()

View File

224
modules/login_widget.py Normal file
View File

@ -0,0 +1,224 @@
from werkzeug.security import check_password_hash
from PyQt5.QtCore import Qt, QSettings
from PyQt5 import QtWidgets, QtCore, QtWidgets
from datetime import datetime
import sys
from modules.SignUpWidget import SignUpWidget
from modules.main_window import MainWindow
class LoginWidget(QtWidgets.QWidget):
def __init__(self, mongo_config):
super().__init__()
self.mongoConfig = mongo_config
self.client = mongo_config.client
# self.login_db = self.mongoConfig.get_db() # mongo_config 인스턴스를 통해 데이터베이스 객체를 가져옴
self.login_db = self.client['taobao_project']
self.initUI()
# Initialize MongoDB client and select database
self.loadSettings()
master_email = "로그인 하세요"
def initUI(self):
self.setGeometry(780, 420, 240, 200)
layout = QtWidgets.QVBoxLayout()
self.signupButton = QtWidgets.QPushButton("회원 가입")
self.signupButton.clicked.connect(self.showSignUpWindow)
self.infoLabel = QtWidgets.QLabel("로그인 정보를 입력하세요")
self.emailInput = QtWidgets.QLineEdit()
self.emailInput.setPlaceholderText("사용자 이름(이메일형식)")
self.emailInput.returnPressed.connect(self.focusToPassword) # 사용자 이름에서 엔터 -> 암호칸으로 포커스
self.passwordInput = QtWidgets.QLineEdit()
self.passwordInput.setPlaceholderText("비밀번호")
self.passwordInput.setEchoMode(QtWidgets.QLineEdit.Password)
self.passwordInput.returnPressed.connect(self.login) # 암호에서 엔터 -> 로그인 시도
# 비밀번호 표시 토글 버튼
self.showPasswordCheckBox = QtWidgets.QCheckBox("비밀번호 표시")
self.showPasswordCheckBox.stateChanged.connect(self.togglePasswordVisibility)
self.loginButton = QtWidgets.QPushButton("로그인")
self.loginButton.clicked.connect(self.login)
layout.addWidget(self.signupButton)
layout.addWidget(self.infoLabel)
layout.addWidget(self.emailInput)
layout.addWidget(self.passwordInput)
layout.addWidget(self.showPasswordCheckBox)
layout.addWidget(self.loginButton)
self.setLayout(layout)
self.setWindowTitle('로그인')
def togglePasswordVisibility(self):
if self.showPasswordCheckBox.isChecked():
self.passwordInput.setEchoMode(QtWidgets.QLineEdit.Normal)
else:
self.passwordInput.setEchoMode(QtWidgets.QLineEdit.Password)
def focusToPassword(self):
self.passwordInput.setFocus()
def saveSettings(self, email, password):
settings = QSettings("혜리수샵", "쏘서러")
settings.setValue("email", email)
settings.setValue("password", password)
def loadSettings(self):
settings = QSettings("혜리수샵", "쏘서러")
email = settings.value("email", "")
password = settings.value("password", "")
self.emailInput.setText(email)
self.passwordInput.setText(password)
def login(self):
email = self.emailInput.text()
password = self.passwordInput.text()
# MongoDB에서 사용자 문서 조회
user_doc = self.login_db.users.find_one({"email": email})
if user_doc and check_password_hash(user_doc['password'], password):
# 비밀번호 검증 성공
self.email = email # 여기에서 사용자 이메일을 self.email 속성에 저장
# 마지막 로그아웃 시간, 총 작업량, 주별 및 월별 성과 조회
last_logout = user_doc.get('lastLogoutTime', '기록 없음')
total_workload = user_doc.get('totalWorkload', 0)
weekly_performance = user_doc.get('weeklyPerformance', {})
monthly_performance = user_doc.get('monthlyPerformance', {})
performance_msg = f"\n마지막 로그아웃 시간: {last_logout}\n마지막 작업량: {total_workload}\n주간성과: {weekly_performance}\n월간성과: {monthly_performance}"
#QtWidgets.QMessageBox.information(self, "로그인 성공", performance_msg)
if user_doc['userType'] in ['slave', 'manager']:
master_email = user_doc.get('master', None)
QtWidgets.QMessageBox.information(self, "로그인 성공", f"{master_email} 데이터베이스를 사용합니다.\n{performance_msg}")
else:
QtWidgets.QMessageBox.information(self, "로그인 성공", f"{email} 데이터베이스를 사용합니다.\n{performance_msg}")
self.saveSettings(email, password) # 로그인 성공 시 설정 저장
now = datetime.now()
self.login_db.users.update_one(
{"email": email},
{"$set": {"lastLoginTime": now.strftime('%Y-%m-%d %H:%M:%S')}}
)
self.on_login_success()
else:
# 로그인 실패
QtWidgets.QMessageBox.warning(self, "로그인 실패", "이메일 또는 비밀번호가 잘못되었습니다.")
def on_login_success(self):
# MongoDB에서 사용자 문서 조회
user_doc = self.login_db.users.find_one({"email": self.email})
if user_doc['userType'] == 'master':
# 마스터 사용자 정보 표시
userInfo = f"등급: {user_doc['userGrade']}, 플랜 종료일: {user_doc['planEndDate']}"
# 종속된 사용자 정보 조회 및 표시
dependent_users = self.login_db.users.find({"master": user_doc['email']})
print(dependent_users)
#dependent_users = self.login_db.users.find({"master": self.email}) # 수정된 부분: user_doc['email'] 대신 self.email 사용
for user in dependent_users:
last_login = user.get('lastLoginTime', '로그인 기록 없음')
total_workload = user.get('totalWorkload', 0)
userInfo += f"\n종속 사용자: {user['email']}, 마지막 로그인: {last_login}, 총 작업량: {total_workload}"
elif user_doc['userType'] in ['slave', 'manager']:
userInfo = "해당 정보는 마스터 사용자만 볼 수 있습니다."
main_window = MainWindow(self.mongoConfig, self.email, userInfo)
if main_window:
main_window.set_user_email(self.email) # 메인 윈도우의 메서드를 호출하여 현재 로그인된 사용자 표시
main_window.set_User_Info(userInfo) # 메인 윈도우의 메서드를 호출하여 현재 로그인된 사용자 표시
# 메인 윈도우를 클래스 멤버 변수에 할당
self.main_window = main_window
self.close() # 로그인 창 닫기
main_window.show() # 메인 윈도우 표시
# sys.exit()
# self.close() # 로그인 창 닫기
def find_master_username(self, slave_username):
# 실제 애플리케이션에서는 여기서 MongoDB를 조회하여 master 사용자를 찾아야 합니다.
# 이 예시에서는 단순화를 위해 'master' 문자열을 반환합니다.
return self.master_email
def login_user(self, email, password):
# 로그인 검증 로직 (생략)
now = datetime.now()
self.login_db.users.update_one(
{"email": email},
{"$set": {"lastLoginTime": now.strftime('%Y-%m-%d %H:%M:%S')}}
)
# 로그인 성공 메시지와 마지막 로그아웃 시간 표시 (구현 필요)
def logout(self, email):
print("로그아웃 프로세스 시작")
now = datetime.now()
# 로그아웃 시간 업데이트
self.login_db.users.update_one(
{"email": email},
{"$set": {"lastLogoutTime": now.strftime('%Y-%m-%d %H:%M:%S')}}
)
print(f"사용자 {email}의 로그아웃 시간이 기록되었습니다.")
# 변경된 문서 다시 조회
user_doc = self.login_db.users.find_one({"email": email})
# 성과 메시지 생성
performance_msg = self.create_performance_message(user_doc)
# 로그아웃 메시지 박스 표시 및 5초 후 자동 닫기
msgBox = QtWidgets.QMessageBox(self)
msgBox.setWindowTitle("로그아웃")
msgBox.setText("성공적으로 로그아웃되었습니다.\n" + performance_msg)
msgBox.setStandardButtons(QtWidgets.QMessageBox.Ok)
msgBox.buttonClicked.connect(msgBox.close)
QTimer = QtCore.QTimer(self)
QTimer.singleShot(3000, msgBox.close) # 5초 후 자동 닫기
msgBox.exec_()
def show_user_performance(self, email):
user_doc = self.login_db.users.find_one({"email": email}, {"totalWorkload": 1, "weeklyPerformance": 1, "monthlyPerformance": 1})
if user_doc:
print(f"총 작업량: {user_doc.get('totalWorkload', 0)}")
print("주별 성과:")
for week, workload in user_doc.get("weeklyPerformance", {}).items():
print(f"{week}: {workload}")
print("월별 성과:")
for month, workload in user_doc.get("monthlyPerformance", {}).items():
print(f"{month}: {workload}")
def create_performance_message(self, user_doc):
# 마지막 로그아웃 시간, 총 작업량, 주별 및 월별 성과 조회
last_logout = user_doc.get('lastLogoutTime', '기록 없음')
total_workload = user_doc.get('totalWorkload', 0)
weekly_performance = user_doc.get('weeklyPerformance', {})
monthly_performance = user_doc.get('monthlyPerformance', {})
performance_msg = f"마지막 로그아웃 시간: {last_logout}\n총 작업량: {total_workload}\n"
for week, workload in weekly_performance.items():
performance_msg += f"주별 성과 ({week}): {workload}\n"
for month, workload in monthly_performance.items():
performance_msg += f"월별 성과 ({month}): {workload}\n"
return performance_msg
def showSignUpWindow(self):
self.signUpWidget = SignUpWidget()
self.signUpWidget.show()

209
modules/main.py Normal file
View File

@ -0,0 +1,209 @@
import sys
from datetime import datetime
#from modules.keyword_management import add_keyword
#from modules.product_parsing import parse_naver_shopping
#from modules.matching_operations import save_matching_info
from modules.pandas_data import PandasModel
from modules.spinBox import CustomSpinBox
from modules.webPage import CustomWebEnginePage
from modules.dbConnect import MongoConnectionWidget
from modules.login_widget import LoginWidget
from modules.mongo_config import MongoConfig
from modules.DBList import DbDialog
from PyQt5 import QtCore, QtWidgets, uic
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QApplication, QFileDialog, QTableWidgetItem, QLabel, QMainWindow, QTableView, QVBoxLayout, QWidget, QComboBox, QMessageBox, QGraphicsScene, QGraphicsPixmapItem, QDialogButtonBox, QInputDialog, QMessageBox, QTabWidget, QSpinBox
from PyQt5.QtCore import Qt, QUrl, pyqtSignal, QAbstractTableModel, QTimer, QObject, pyqtSlot, QEvent, QUrl, QTimer
from PyQt5.QtWebEngineWidgets import QWebEngineProfile
from pymongo import MongoClient
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, mongo_config, email, user_info):
super(MainWindow, self).__init__()
# UI 파일 로드
uic.loadUi('MainTao.ui', self)
self.mongo_config = mongo_config
self.client = self.mongo_config.client
self.currentUserEmail = email
self.currentUserInfo = user_info
if self.currentUserEmail:
# 사용자 이메일 기반 데이터베이스 설정
user_id = self.currentUserEmail.split('@')[0]
Listup_user_id = 'Listup_id_' + user_id
self.mydb = self.client[Listup_user_id]
# # 데이터베이스 선택
# self.logindb = self.client['taobao_project']
now = datetime.now()
# 컬렉션(테이블) 선택, 없으면 생성
#collection = self.db['컬렉션명']
self.loginUser.setText("로그인 되지 않음")
#self.login_widget = LoginWidget() # login_widget 인스턴스 저장
self.currentUserEmail = None # 사용자 이메일 주소를 저장할 멤버 변수 초기화
self.currentUserInfo = None # 사용자 정보를 저장할 멤버 변수 초기화
self.mydb = None
self.login_widget = LoginWidget(mongo_config, self) # LoginWidget 인스턴스 생성 및 저장
self.count_test1 = 0
self.count_test2 = 0
self.papago_client_id =""
self.papago_client_secret = ""
self.tao_id = "id_input"
self.tao_pw = "password_input"
# DB 목록 선택 Dialog 객체 생성
self.db_dialog = DbDialog(self.mydb)
#self.img_searchbtn.clicked.connect(self.img_search)
#self.Excel_btn.clicked.connect(self.openxls)
#self.matchbtn.clicked.connect(self.matchbtn_clicked)
#self.webEngineView.urlChanged.connect(self.update_url)
#self.dbviewer1.clicked.connect(self.on_table_clicked)
#self.sc_button.clicked.connect(self.on_button_clicked)
#self.papagoApi.clicked.connect(self.manage_papago_api_keys)
# 프로그램 초기화 부분에 API 키 관리 함수 호출
#self.manage_papago_api_keys()
# 초기 탭 설정
self.tabWidget.setCurrentIndex(0) # 첫 번째 탭을 활성화
# 페이지 설정
profile = QWebEngineProfile.defaultProfile()
# webEngineView에는 모바일 에이전트 설정
self.webEngineView.setPage(CustomWebEnginePage(profile, self.webEngineView, use_mobile=True))
print("webEngineView 페이지 설정 완료")
# webEngineView_2에는 PC 에이전트 설정
self.webEngineView_2.setPage(CustomWebEnginePage(profile, self.webEngineView_2, use_mobile=False))
print("webEngineView_2 페이지 설정 완료")
# 스위치 UI 요소 (예: 버튼)에 이벤트 연결
#self.switchBtn.clicked.connect(self.toggleUserAgent)
default_url = "https://main.m.taobao.com"
default_url2 = "https://world.taobao.com/wow/tmg-fc/tmw/search_image?"
self.webEngineView.load(QUrl(default_url))
self.webEngineView_2.load(QUrl(default_url2))
# 기존DB불러오기 버튼 클릭이벤트
self.db_btn.clicked.connect(self.show_db_dialog)
# db를 엑셀로 저장 버튼
#self.export_btn.clicked.connect(self.export_data)
# 불러와진 DB에서 테이블을 읽어서 콤보박스에 표시하기
#self.comboBox.currentIndexChanged.connect(self.loadTable)
#self.loadTableNames()
# QGraphicsScene 초기화
self.scene = QGraphicsScene(self)
self.scene_current_img = QGraphicsScene(self)
#self.current_img
self.graphicsView_multi.setScene(self.scene)
# QGraphicsView의 정렬을 상단 및 좌측에 맞추기
self.graphicsView_multi.setAlignment(Qt.AlignTop)
# 새로운 QGraphicsView 및 QGraphicsScene 초기화
self.current_img.setScene(self.scene_current_img)
# searchbtn 버튼 클릭 이벤트 연결
#self.searchbtn_2.clicked.connect(self.search_chinese)
#self.search_keyword_box.returnPressed.connect(self.search_chinese)
# urlbox와 urlgobtn 이벤트 연결
#self.urlbox.returnPressed.connect(self.load_url_from_urlbox)
#self.urlgobtn.clicked.connect(self.load_url_from_urlbox)
# 타이머 설정
self.timer = QTimer(self)
#self.timer.timeout.connect(self.updateTimer)
# 시작, 정지, 설정 버튼
#self.timerStart.clicked.connect(self.startTimer)
#self.timerStop.clicked.connect(self.stopTimer)
# self.timerSet.clicked.connect(self.setTimer)
#self.startTimer()
# 타이머 시간
self.remainingTime = 3600 # 초 단위 (60분)
# 기존 QSpinBox 객체를 CustomSpinBox 객체로 변환
self.delivfee_spbox = self.findChild(QSpinBox, 'delivfee_spbox')
self.addpackingfee_spbox = self.findChild(QSpinBox, 'addpackingfee_spbox')
self.addmargin_spbox = self.findChild(QSpinBox, 'addmargin_spbox')
# QSpinBox 객체를 CustomSpinBox로 설정
#self.updateSpinBox(self.delivfee_spbox, 1000)
#self.updateSpinBox(self.addpackingfee_spbox, 1000)
#self.updateSpinBox(self.addmargin_spbox, 1000)
#기타 코드
def show_db_dialog(self):
# DB 목록 선택 Dialog 실행
self.db_dialog.exec_()
# 선택된 filename 값 처리
selected_filename = self.db_dialog.get_selected_filename()
if selected_filename:
print(f"선택된 DB : {selected_filename}")
# ...
def set_user_email(self, email):
# 로그인된 사용자 이메일 설정
self.loginUser.setText(f"로그인된 사용자: {email}")
self.currentUserEmail = email
# 로그인된 사용자 이메일로 DATABASE 설정
user_id = email.split('@')[0]
Listup_user_id = 'Listup_id_' + user_id
self.mydb = self.client[Listup_user_id]
def set_User_Info(self, userInfo):
self.loginUser.setText(f"로그인된 사용자: {self.currentUserEmail}")
self.loginUserInfo.setText(f"{userInfo}")
self.currentUserInfo = userInfo
print(self.currentUserInfo)
def closeEvent(self, event):
"""메인 윈도우가 닫힐 때 호출되는 이벤트 핸들러."""
if hasattr(self, 'login_widget'):
self.login_widget.logout(self.currentUserEmail) # 로그아웃 처리
super().closeEvent(event) # 기본 closeEvent 처리 호출
# 사용자에게 메시지 표시 등의 추가적인 처리를 할 수 있습니다.
print("메인 윈도우가 닫히고 있습니다.")
def main():
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_ShareOpenGLContexts)
app = QtWidgets.QApplication(sys.argv)
mongo_config = MongoConfig() # MongoDB 설정 관리 인스턴스 생성
mongo_config.try_connect(*mongo_config.load_config()) # MongoDB에 연결 시도
# main_window = MainWindow(mongo_config) # 메인 윈도우 인스턴스 생성
login_widget = LoginWidget(mongo_config) # 로그인 위젯 생성, 메인 윈도우 인스턴스 전달
login_widget.show() # 로그인 위젯 표시
sys.exit(app.exec_())
if __name__ == '__main__':
main()
app = QApplication(sys.argv)

216
modules/main_window.py Normal file
View File

@ -0,0 +1,216 @@
import sys
from datetime import datetime
#from modules.keyword_management import add_keyword
#from modules.product_parsing import parse_naver_shopping
#from modules.matching_operations import save_matching_info
from modules.pandas_data import PandasModel
from modules.spinBox import CustomSpinBox
from modules.webPage import CustomWebEnginePage
# from modules.login_widget import LoginWidget
from modules.mongo_config import MongoConfig
from modules.DBList import DbDialog
from modules.dataview import DataView
from PyQt5 import QtCore, QtWidgets, uic
from PyQt5.QtWidgets import QApplication, QSpinBox, QGraphicsScene, QDialog, QTableView
from PyQt5.QtCore import Qt, QUrl, QTimer, QUrl, QTimer
from PyQt5.QtWebEngineWidgets import QWebEngineProfile
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, mongo_config, email, user_info):
super(MainWindow, self).__init__()
# UI 파일 로드
uic.loadUi('MainTao.ui', self)
self.mongo_config = mongo_config
self.client = self.mongo_config.client
self.currentUserEmail = email
self.currentUserInfo = user_info
if self.currentUserEmail:
# 사용자 이메일 기반 데이터베이스 설정
user_id = self.currentUserEmail.split('@')[0]
Listup_user_id = 'Listup_id_' + user_id
print(f"Listup_user_id : {Listup_user_id}")
self.mydb = self.client[Listup_user_id]
print(f"self.mydb : {self.mydb}")
# # 데이터베이스 선택
# self.logindb = self.client['taobao_project']
now = datetime.now()
# 컬렉션(테이블) 선택, 없으면 생성
#collection = self.db['컬렉션명']
self.loginUser.setText("로그인 되지 않음")
#self.login_widget = LoginWidget() # login_widget 인스턴스 저장
# self.currentUserEmail = None # 사용자 이메일 주소를 저장할 멤버 변수 초기화
# self.currentUserInfo = None # 사용자 정보를 저장할 멤버 변수 초기화
# self.mydb = None
# self.login_widget = LoginWidget(mongo_config, self) # LoginWidget 인스턴스 생성 및 저장
self.count_test1 = 0
self.count_test2 = 0
self.papago_client_id =""
self.papago_client_secret = ""
self.tao_id = "id_input"
self.tao_pw = "password_input"
# DB 목록 선택 Dialog 객체 생성
self.db_dialog = DbDialog(self.mydb)
#self.img_searchbtn.clicked.connect(self.img_search)
#self.Excel_btn.clicked.connect(self.openxls)
#self.matchbtn.clicked.connect(self.matchbtn_clicked)
#self.webEngineView.urlChanged.connect(self.update_url)
#self.dbviewer1.clicked.connect(self.on_table_clicked)
#self.sc_button.clicked.connect(self.on_button_clicked)
#self.papagoApi.clicked.connect(self.manage_papago_api_keys)
# 프로그램 초기화 부분에 API 키 관리 함수 호출
#self.manage_papago_api_keys()
# 초기 탭 설정
self.tabWidget.setCurrentIndex(0) # 첫 번째 탭을 활성화
# 페이지 설정
profile = QWebEngineProfile.defaultProfile()
# webEngineView에는 모바일 에이전트 설정
self.webEngineView.setPage(CustomWebEnginePage(profile, self.webEngineView, use_mobile=True))
print("webEngineView 페이지 설정 완료")
# webEngineView_2에는 PC 에이전트 설정
self.webEngineView_2.setPage(CustomWebEnginePage(profile, self.webEngineView_2, use_mobile=False))
print("webEngineView_2 페이지 설정 완료")
# 스위치 UI 요소 (예: 버튼)에 이벤트 연결
#self.switchBtn.clicked.connect(self.toggleUserAgent)
default_url = "https://main.m.taobao.com"
default_url2 = "https://world.taobao.com/wow/tmg-fc/tmw/search_image?"
self.webEngineView.load(QUrl(default_url))
self.webEngineView_2.load(QUrl(default_url2))
# DB불러오기 버튼 클릭이벤트
self.db_btn.clicked.connect(self.show_db_dialog)
# db를 엑셀로 저장 버튼
#self.export_btn.clicked.connect(self.export_data)
# 불러와진 DB에서 테이블을 읽어서 콤보박스에 표시하기
#self.comboBox.currentIndexChanged.connect(self.loadTable)
#self.loadTableNames()
# QGraphicsScene 초기화
self.scene = QGraphicsScene(self)
self.scene_current_img = QGraphicsScene(self)
#self.current_img
self.graphicsView_multi.setScene(self.scene)
# QGraphicsView의 정렬을 상단 및 좌측에 맞추기
self.graphicsView_multi.setAlignment(Qt.AlignTop)
# 새로운 QGraphicsView 및 QGraphicsScene 초기화
self.current_img.setScene(self.scene_current_img)
# searchbtn 버튼 클릭 이벤트 연결
#self.searchbtn_2.clicked.connect(self.search_chinese)
#self.search_keyword_box.returnPressed.connect(self.search_chinese)
# urlbox와 urlgobtn 이벤트 연결
#self.urlbox.returnPressed.connect(self.load_url_from_urlbox)
#self.urlgobtn.clicked.connect(self.load_url_from_urlbox)
# 타이머 설정
self.timer = QTimer(self)
#self.timer.timeout.connect(self.updateTimer)
# 시작, 정지, 설정 버튼
#self.timerStart.clicked.connect(self.startTimer)
#self.timerStop.clicked.connect(self.stopTimer)
# self.timerSet.clicked.connect(self.setTimer)
#self.startTimer()
# 타이머 시간
self.remainingTime = 3600 # 초 단위 (60분)
# 기존 QSpinBox 객체를 CustomSpinBox 객체로 변환
self.delivfee_spbox = self.findChild(QSpinBox, 'delivfee_spbox')
self.addpackingfee_spbox = self.findChild(QSpinBox, 'addpackingfee_spbox')
self.addmargin_spbox = self.findChild(QSpinBox, 'addmargin_spbox')
# QSpinBox 객체를 CustomSpinBox로 설정
#self.updateSpinBox(self.delivfee_spbox, 1000)
#self.updateSpinBox(self.addpackingfee_spbox, 1000)
#self.updateSpinBox(self.addmargin_spbox, 1000)
#기타 코드
# self.selected_keyword_data = None
def show_db_dialog(self):
# DB 목록 선택 Dialog 실행
# selected_keyword_data = None
self.db_dialog = DbDialog(self.mydb)
if self.db_dialog.exec_() == QDialog.Accepted:
selected_keyword_data = self.db_dialog.selected_keyword_data
print(f"선택된 selected_keyword_ids : {selected_keyword_data}")
else:
print("다이얼로그가 취소되었습니다.")
# print(f"선택된 selected_keyword_data : {self.selected_keyword_data}")
# dbViewer1 = self.findChild(QTableView, "dbViewer1")
self.dataView = DataView(self.mydb, self.dbviewer1)
product_list = self.dataView.collect_data(selected_keyword_data)
# print(f"메인윈도우 product_list : {product_list}")
self.dataView.show_viewer(product_list)
# if self.selected_keyword_data:
# print(f"선택된 self.selected_keyword_data : {self.selected_keyword_data}")
# self.collect_data(self.selected_keyword_data, self.mydb)
def set_user_email(self, email):
# 로그인된 사용자 이메일 설정
self.loginUser.setText(f"로그인된 사용자: {email}")
self.currentUserEmail = email
# 로그인된 사용자 이메일로 DATABASE 설정
user_id = email.split('@')[0]
Listup_user_id = 'Listup_id_' + user_id
self.mydb = self.client[Listup_user_id]
def set_User_Info(self, userInfo):
self.loginUser.setText(f"로그인된 사용자: {self.currentUserEmail}")
self.loginUserInfo.setText(f"{userInfo}")
self.currentUserInfo = userInfo
print(self.currentUserInfo)
def closeEvent(self, event):
"""메인 윈도우가 닫힐 때 호출되는 이벤트 핸들러."""
if hasattr(self, 'login_widget'):
self.login_widget.logout(self.currentUserEmail) # 로그아웃 처리
super().closeEvent(event) # 기본 closeEvent 처리 호출
# 사용자에게 메시지 표시 등의 추가적인 처리를 할 수 있습니다.
print("메인 윈도우가 닫히고 있습니다.")
def main():
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_ShareOpenGLContexts)
app = QtWidgets.QApplication(sys.argv)
mongo_config = MongoConfig() # MongoDB 설정 관리 인스턴스 생성
mongo_config.try_connect(*mongo_config.load_config()) # MongoDB에 연결 시도
main_window = MainWindow(mongo_config) # 메인 윈도우 인스턴스 생성
sys.exit(app.exec_())
if __name__ == '__main__':
main()
app = QApplication(sys.argv)

View File

86
modules/mongo_config.py Normal file
View File

@ -0,0 +1,86 @@
from pymongo import MongoClient
from configparser import ConfigParser
import os
class MongoConfig:
_instance = None # 클래스 레벨의 인스턴스 변수
def __new__(cls):
if cls._instance is None:
cls._instance = super(MongoConfig, cls).__new__(cls)
cls._instance.init_config()
return cls._instance
def init_config(self):
self.config = ConfigParser()
config_path = os.path.join(os.path.dirname(__file__), 'config.ini')
self.config.read(config_path)
print(config_path)
self.client = None # MongoDB 클라이언트 초기화
self.load_config()
def load_config(self):
if not self.config.has_section('MongoDB'):
raise Exception('서버 설정파일이 없습니다.config.ini 파일을 체크하세요.')
if self.config.has_section('MongoDB'):
address = self.config.get('MongoDB', 'address', fallback='localhost')
port = self.config.get('MongoDB', 'port', fallback='27017')
user = self.config.get('MongoDB', 'user', fallback='')
password = self.config.get('MongoDB', 'password', fallback='')
if not all([address, port, user, password]):
raise Exception('Incomplete MongoDB configuration. Please check your config.ini file.')
return address, port, user, password
# def connect(self):
# self.client = MongoClient(f'mongodb://{self.user}:{self.password}@{self.address}:{self.port}/')
# self.db = self.client['taobao_project']
@staticmethod
def get_db():
return MongoConfig()._instance.db
def save_config(self, address, port, user, password):
self.config['MongoDB'] = {
'address': address,
'port': port,
'user': user,
'password': password
}
with open('config.ini', 'w') as configfile:
self.config.write(configfile)
def try_connect(self, address, port, user, password):
address, port, user, password = self.load_config()
print(f"{address},{port},{user},{password}")
if not all([address, port, user, password]):
print("Configuration missing. Please check your config.ini file.")
return False
try:
self.client = MongoClient(f'mongodb://{user}:{password}@{address}:{port}/')
self.db = self.client['taobao_project'] # 여기에서 추가 연결 확인 작업을 수행할 수 있습니다.
print("MongoDB 연결 성공.")
return True
except Exception as e:
print(f"MongoDB 연결 실패: {e}")
return False
def load_synology_config(self):
# if not self.config.has_section('SynologyDrive'):
# raise Exception('SynologyDrive 설정 섹션이 config.ini 파일에 없습니다.')
# url = self.config.get('SynologyDrive', 'url', fallback='')
# account = self.config.get('SynologyDrive', 'account', fallback='')
# password = self.config.get('SynologyDrive', 'password', fallback='')
# if not all([url, account, password]):
# raise Exception('Incomplete SynologyDrive configuration in config.ini.')
# self.synology_url = url
# self.synology_account = account
# self.synology_password = password
if self.config.has_section('SynologyDrive'):
url = self.config.get('SynologyDrive', 'url')
account = self.config.get('SynologyDrive', 'account')
password = self.config.get('SynologyDrive', 'password')
return {'url': url, 'account': account, 'password': password}
else:
print("SynologyDrive 설정이 config.ini 파일에 없습니다.")
return None # 여기서 None을 반환하는 대신, 적절한 기본값을 제공하거나 예외를 발생시키는 것을 고려해볼 수 있습니다.

71
modules/pandas_data.py Normal file
View File

@ -0,0 +1,71 @@
from PyQt5.QtCore import QAbstractTableModel
from PyQt5.QtGui import QColor
from PyQt5.QtCore import Qt
from PyQt5 import QtGui
class PandasModel(QAbstractTableModel):
def __init__(self, data):
QAbstractTableModel.__init__(self)
self._data = data
def rowCount(self, parent=None):
return self._data.shape[0]
def columnCount(self, parent=None):
return self._data.shape[1]
def data(self, index, role):
if not index.isValid():
return None
# 배경색 변경
if role == Qt.BackgroundColorRole:
matching_url = self._data.iloc[index.row()]['MatchingUrl']
if matching_url and matching_url.startswith('http'):
return QColor('lightgray')
if self.selected_cell == (index.row(), index.column()): # 선택된 셀
return QColor('yellow')
# 폰트 변경
if role == Qt.FontRole:
current_row = index.row()
current_keyword_id = self._data.iloc[current_row, 1]
# None 값 처리
if current_keyword_id is None:
current_keyword_id = ""
previous_keyword_id = ""
if current_row > 0:
previous_keyword_id = self._data.iloc[current_row - 1, 1]
if previous_keyword_id is None:
previous_keyword_id = ""
# 첫 번째 행이거나 이전 행보다 keyword_id가 큰 경우 폰트 스타일 변경
if current_row == 0 or current_keyword_id > previous_keyword_id:
font = QtGui.QFont()
font.setBold(True)
font.setUnderline(True)
return font
# 기타 데이터 처리
if role == Qt.DisplayRole:
return str(self._data.iloc[index.row(), index.column()])
return None
def headerData(self, section, orientation, role):
if role == Qt.DisplayRole:
if orientation == Qt.Horizontal:
return self._data.columns[section]
else:
return str(self._data.index[section])
return None
def selected_cell(self, cell):
self.selected_cell = cell
self.layoutChanged.emit() # 뷰 업데이트
def update_selected_cell(self, cell):
self.selected_cell = cell
self.layoutChanged.emit() # 뷰 업데이트

View File

11
modules/spinBox.py Normal file
View File

@ -0,0 +1,11 @@
from PyQt5.QtWidgets import QSpinBox
class CustomSpinBox(QSpinBox):
def __init__(self, delta=1000, parent=None):
super(CustomSpinBox, self).__init__(parent)
self.delta = delta
self.setSingleStep(self.delta)
def textFromValue(self, value):
# 3자리 숫자마다 콤마를 찍는 로직
return "{:,}".format(value)

18
modules/synology.py Normal file
View File

@ -0,0 +1,18 @@
from datetime import datetime
from synology_drive_api.drive import SynologyDrive
import pandas as pd
# default http port is 5000, https is 5001.
with SynologyDrive('ckh08045', 'Darknes1!', 'cckb9998.synology.me', '10002', https=False, dsm_version='7') as synd:
# response = synd.create_folder('test1111', 'team-folders/Listup')
# response = synd.list_folder('team-folders/Listup/')
# synd.download_file('/team-folders/Listup/01.osheet') # write your code here
# print(f"{response}")
# download osheet as xlsx and read into pandas dataframe.
bio = synd.download_synology_office_file('/team-folders/Listup/01.osheet')
# bio = synd.download_file('/mydrive/test.osheet')
data = pd.read_excel(bio, sheet_name=None)
print(f"{data}")

View File

@ -0,0 +1,111 @@
from datetime import datetime
import requests
class SynologyFolderManager:
def __init__(self, account, password, base_url):
self.account = account
self.password = password
self.base_url = base_url
self.session_id = None
def login(self):
params = {
'api': 'SYNO.API.Auth',
'version': '7',
'method': 'login',
'account': self.account,
'passwd': self.password,
'session': 'FileStation',
'format': 'sid'
}
resp = requests.get(f'{self.base_url}/webapi/auth.cgi', params=params)
resp_json = resp.json()
self.session_id = resp_json['data']['sid']
if resp.status_code == 200:
result = resp.json()
if result.get("success", False):
self.session_id = result['data']['sid']
print(f"Login successful. Session ID: {self.session_id}")
else:
print(f"Login failed. Response: {result}")
else:
print(f"HTTP error. Status code: {resp.status_code}. Response: {resp.text}")
def list_folder(self, folder_path):
params = {
'api': 'SYNO.FileStation.List',
'version': '2',
'method': 'list',
'folder_path': folder_path,
'_sid': self.session_id
}
response = requests.get(f'{self.base_url}/webapi/entry.cgi', params=params)
if response.status_code == 200:
result = response.json()
if result.get("success", False):
print(f"Contents of {folder_path}:")
for item in result['data']['files']:
print(f"- {item['name']} ({'Folder' if item['isdir'] else 'File'})")
else:
error_code = result.get("error", {}).get("code", "")
print(f"Failed to list folder contents. Error code: {error_code}.")
else:
print(f"Failed to communicate with Synology NAS. HTTP status code: {response.status_code}.")
def create_folder(self, path, name):
params = {
'api': 'SYNO.FileStation.CreateFolder',
'version': '2',
'method': 'create',
'folder_path': path,
'name' : name,
'_sid': self.session_id
}
response = requests.get(f'{self.base_url}/webapi/entry.cgi', params=params)
if response.status_code == 200:
result = response.json()
if result.get("success", False):
print(f"Folder created successfully at {path}.")
else:
error_code = result.get("error", {}).get("code", "")
print(f"Failed to create folder. Error code: {error_code}.")
else:
print(f"Failed to communicate with Synology NAS. HTTP status code: {response.status_code}.")
def logout(self):
params = {
'api': 'SYNO.API.Auth',
'version': '1',
'method': 'logout',
'session': 'FileStation',
'_sid': self.session_id
}
requests.get(f'{self.base_url}/webapi/auth.cgi', params=params)
def create_user_directory(self, email):
# 이메일에서 사용자 ID 추출
user_id = email.split('@')[0]
# 현재 날짜 기준 연도 및 월 폴더 이름 설정
current_year = datetime.now().year
current_month = datetime.now().month
# 사용자 기본 폴더 경로 구성
base_path = "/volume1/Listup"
user_path = f"/Listup_id_{user_id}"
year_path = f"{user_path}/{current_year}"
month_path = f"{year_path}/{current_month}"
# 사용자 폴더 생성
self.drive.create_folder(user_path)
# 연도별 폴더 생성
self.drive.create_folder(year_path)
# 월별 폴더 생성
self.drive.create_folder(month_path)
print(f"{email}에 대한 폴더 생성 완료: {month_path}")

49
modules/webPage.py Normal file
View File

@ -0,0 +1,49 @@
from PyQt5.QtWebEngineWidgets import QWebEnginePage, QWebEngineSettings
from PyQt5.QtCore import Qt, QUrl, QEvent, QUrl
class CustomWebEnginePage(QWebEnginePage):
def __init__(self, profile, parent=None, use_mobile=False):
super(CustomWebEnginePage, self).__init__(profile, parent)
self.mobile_user_agent = "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1"
self.desktop_user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
self.setZoomFactor(0.75) # 줌을 75%로 설정
#self.use_mobile_agent(False)
#self.profile().setHttpUserAgent(mobile_user_agent)
if use_mobile:
self.profile().setHttpUserAgent(self.mobile_user_agent)
else:
self.profile().setHttpUserAgent(self.desktop_user_agent)
# JavaScript 활성화
settings = self.settings()
settings.setAttribute(QWebEngineSettings.JavascriptEnabled, True)
settings.setAttribute(QWebEngineSettings.JavascriptCanOpenWindows, True)
settings.setAttribute(QWebEngineSettings.JavascriptCanAccessClipboard, True)
def use_mobile_agent(self, use_mobile):
if use_mobile:
self.profile().setHttpUserAgent(self.mobile_user_agent)
else:
self.profile().setHttpUserAgent(self.desktop_user_agent)
self.parent().load(QUrl("https://world.taobao.com/wow/tmg-fc/tmw/search_image?spm="))
def event(self, event):
if event.type() == QEvent.KeyPress and event.key() == Qt.Key_Backspace:
self.triggerAction(QWebEnginePage.Back)
return True
return super().event(event)
def contextMenuEvent(self, event):
menu = self.createStandardContextMenu()
menu.addAction('Open Inspector', self.inspect)
menu.exec_(event.globalPos())
def inspect(self):
self.triggerAction(QWebEnginePage.InspectElement)
def keyPressEvent(self, event):
if event.key() == Qt.Key_Backspace:
self.back() # 백스페이스가 눌리면 이전 페이지로 이동
else:
super().keyPressEvent(event)

BIN
newTao.7z Normal file

Binary file not shown.

193
newTao.py Normal file
View File

@ -0,0 +1,193 @@
import sys
from datetime import datetime
#from modules.keyword_management import add_keyword
#from modules.product_parsing import parse_naver_shopping
#from modules.matching_operations import save_matching_info
from modules.pandas_data import PandasModel
from modules.spinBox import CustomSpinBox
from modules.webPage import CustomWebEnginePage
from modules.dbConnect import MongoConnectionWidget
from modules.login_widget import LoginWidget
from modules.mongo_config import MongoConfig
from modules.DBList import DbDialog
from PyQt5 import QtCore, QtWidgets, uic
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QApplication, QFileDialog, QTableWidgetItem, QLabel, QMainWindow, QTableView, QVBoxLayout, QWidget, QComboBox, QMessageBox, QGraphicsScene, QGraphicsPixmapItem, QDialogButtonBox, QInputDialog, QMessageBox, QTabWidget, QSpinBox
from PyQt5.QtCore import Qt, QUrl, pyqtSignal, QAbstractTableModel, QTimer, QObject, pyqtSlot, QEvent, QUrl, QTimer
from PyQt5.QtWebEngineWidgets import QWebEngineProfile
from pymongo import MongoClient
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, mongo_config):
super(MainWindow, self).__init__()
# UI 파일 로드
uic.loadUi('MainTao.ui', self)
self.mongo_config = mongo_config
self.client = self.mongo_config.client
# 데이터베이스 선택
self.logindb = self.client['taobao_project']
now = datetime.now()
# 컬렉션(테이블) 선택, 없으면 생성
#collection = self.db['컬렉션명']
self.loginUser.setText("로그인 되지 않음")
#self.login_widget = LoginWidget() # login_widget 인스턴스 저장
self.currentUserEmail = None # 사용자 이메일 주소를 저장할 멤버 변수 초기화
self.currentUserInfo = None # 사용자 정보를 저장할 멤버 변수 초기화
self.mydb = None
self.login_widget = LoginWidget(mongo_config, self) # LoginWidget 인스턴스 생성 및 저장
self.count_test1 = 0
self.count_test2 = 0
self.papago_client_id =""
self.papago_client_secret = ""
self.tao_id = "id_input"
self.tao_pw = "password_input"
# DB 목록 선택 Dialog 객체 생성
self.db_dialog = DbDialog(self.mydb)
#self.img_searchbtn.clicked.connect(self.img_search)
#self.Excel_btn.clicked.connect(self.openxls)
#self.matchbtn.clicked.connect(self.matchbtn_clicked)
#self.webEngineView.urlChanged.connect(self.update_url)
#self.dbviewer1.clicked.connect(self.on_table_clicked)
#self.sc_button.clicked.connect(self.on_button_clicked)
#self.papagoApi.clicked.connect(self.manage_papago_api_keys)
# 프로그램 초기화 부분에 API 키 관리 함수 호출
#self.manage_papago_api_keys()
# 초기 탭 설정
self.tabWidget.setCurrentIndex(0) # 첫 번째 탭을 활성화
# 페이지 설정
profile = QWebEngineProfile.defaultProfile()
# webEngineView에는 모바일 에이전트 설정
self.webEngineView.setPage(CustomWebEnginePage(profile, self.webEngineView, use_mobile=True))
print("webEngineView 페이지 설정 완료")
# webEngineView_2에는 PC 에이전트 설정
self.webEngineView_2.setPage(CustomWebEnginePage(profile, self.webEngineView_2, use_mobile=False))
print("webEngineView_2 페이지 설정 완료")
# 스위치 UI 요소 (예: 버튼)에 이벤트 연결
#self.switchBtn.clicked.connect(self.toggleUserAgent)
default_url = "https://main.m.taobao.com"
default_url2 = "https://world.taobao.com/wow/tmg-fc/tmw/search_image?"
self.webEngineView.load(QUrl(default_url))
self.webEngineView_2.load(QUrl(default_url2))
# 기존DB불러오기 버튼 클릭이벤트
self.db_btn.clicked.connect(self.show_db_dialog)
# db를 엑셀로 저장 버튼
#self.export_btn.clicked.connect(self.export_data)
# 불러와진 DB에서 테이블을 읽어서 콤보박스에 표시하기
#self.comboBox.currentIndexChanged.connect(self.loadTable)
#self.loadTableNames()
# QGraphicsScene 초기화
self.scene = QGraphicsScene(self)
self.scene_current_img = QGraphicsScene(self)
#self.current_img
self.graphicsView_multi.setScene(self.scene)
# QGraphicsView의 정렬을 상단 및 좌측에 맞추기
self.graphicsView_multi.setAlignment(Qt.AlignTop)
# 새로운 QGraphicsView 및 QGraphicsScene 초기화
self.current_img.setScene(self.scene_current_img)
# searchbtn 버튼 클릭 이벤트 연결
#self.searchbtn_2.clicked.connect(self.search_chinese)
#self.search_keyword_box.returnPressed.connect(self.search_chinese)
# urlbox와 urlgobtn 이벤트 연결
#self.urlbox.returnPressed.connect(self.load_url_from_urlbox)
#self.urlgobtn.clicked.connect(self.load_url_from_urlbox)
# 타이머 설정
self.timer = QTimer(self)
#self.timer.timeout.connect(self.updateTimer)
# 시작, 정지, 설정 버튼
#self.timerStart.clicked.connect(self.startTimer)
#self.timerStop.clicked.connect(self.stopTimer)
# self.timerSet.clicked.connect(self.setTimer)
#self.startTimer()
# 타이머 시간
self.remainingTime = 3600 # 초 단위 (60분)
# 기존 QSpinBox 객체를 CustomSpinBox 객체로 변환
self.delivfee_spbox = self.findChild(QSpinBox, 'delivfee_spbox')
self.addpackingfee_spbox = self.findChild(QSpinBox, 'addpackingfee_spbox')
self.addmargin_spbox = self.findChild(QSpinBox, 'addmargin_spbox')
# QSpinBox 객체를 CustomSpinBox로 설정
#self.updateSpinBox(self.delivfee_spbox, 1000)
#self.updateSpinBox(self.addpackingfee_spbox, 1000)
#self.updateSpinBox(self.addmargin_spbox, 1000)
#기타 코드
def show_db_dialog(self):
# DB 목록 선택 Dialog 실행
self.db_dialog.exec_()
# 선택된 filename 값 처리
selected_filename = self.db_dialog.get_selected_filename()
if selected_filename:
print(f"선택된 DB : {selected_filename}")
# ...
def set_user_email(self, email):
# 로그인된 사용자 이메일 설정
self.loginUser.setText(f"로그인된 사용자: {email}")
self.currentUserEmail = email
# 로그인된 사용자 이메일로 DATABASE 설정
user_id = email.split('@')[0]
Listup_user_id = 'Listup_id_' + user_id
self.mydb = self.client[Listup_user_id]
def set_User_Info(self, userInfo):
self.loginUser.setText(f"로그인된 사용자: {self.currentUserEmail}")
self.loginUserInfo.setText(f"{userInfo}")
self.currentUserInfo = userInfo
print(self.currentUserInfo)
def closeEvent(self, event):
"""메인 윈도우가 닫힐 때 호출되는 이벤트 핸들러."""
if hasattr(self, 'login_widget'):
self.login_widget.logout(self.currentUserEmail) # 로그아웃 처리
super().closeEvent(event) # 기본 closeEvent 처리 호출
# 사용자에게 메시지 표시 등의 추가적인 처리를 할 수 있습니다.
print("메인 윈도우가 닫히고 있습니다.")
def main():
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_ShareOpenGLContexts)
app = QtWidgets.QApplication(sys.argv)
mongo_config = MongoConfig() # MongoDB 설정 관리 인스턴스 생성
mongo_config.try_connect(*mongo_config.load_config()) # MongoDB에 연결 시도
main_window = MainWindow(mongo_config) # 메인 윈도우 인스턴스 생성
login_widget = LoginWidget(mongo_config, main_window) # 로그인 위젯 생성, 메인 윈도우 인스턴스 전달
login_widget.show() # 로그인 위젯 표시
sys.exit(app.exec_())
if __name__ == '__main__':
main()
app = QApplication(sys.argv)

1961
outline7.ui Normal file

File diff suppressed because it is too large Load Diff

640
outline7_ui.py Normal file
View File

@ -0,0 +1,640 @@
# -*- coding: utf-8 -*-
################################################################################
## Form generated from reading UI file 'outline7.ui'
##
## Created by: Qt User Interface Compiler version 6.6.1
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################
from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
QMetaObject, QObject, QPoint, QRect,
QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
QFont, QFontDatabase, QGradient, QIcon,
QImage, QKeySequence, QLinearGradient, QPainter,
QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtWebEngineWidgets import QWebEngineView
from PySide6.QtWidgets import (QAbstractButton, QAbstractSpinBox, QApplication, QComboBox,
QDialog, QDialogButtonBox, QGraphicsView, QGroupBox,
QHeaderView, QLabel, QLineEdit, QProgressBar,
QPushButton, QSizePolicy, QSpinBox, QTabWidget,
QTableView, QWidget)
class Ui_Dialog(object):
def setupUi(self, Dialog):
if not Dialog.objectName():
Dialog.setObjectName(u"Dialog")
Dialog.resize(1850, 1000)
self.inputGroup = QGroupBox(Dialog)
self.inputGroup.setObjectName(u"inputGroup")
self.inputGroup.setGeometry(QRect(10, 50, 501, 941))
self.Excel_btn = QPushButton(self.inputGroup)
self.Excel_btn.setObjectName(u"Excel_btn")
self.Excel_btn.setGeometry(QRect(10, 20, 51, 41))
self.dbviewer1 = QTableView(self.inputGroup)
self.dbviewer1.setObjectName(u"dbviewer1")
self.dbviewer1.setGeometry(QRect(10, 180, 471, 641))
self.isOverseas = QLineEdit(self.inputGroup)
self.isOverseas.setObjectName(u"isOverseas")
self.isOverseas.setGeometry(QRect(150, 20, 31, 31))
self.isOverseas.setAlignment(Qt.AlignCenter)
self.selkeyword_2 = QLabel(self.inputGroup)
self.selkeyword_2.setObjectName(u"selkeyword_2")
self.selkeyword_2.setGeometry(QRect(80, 20, 64, 31))
self.selkeyword_3 = QLabel(self.inputGroup)
self.selkeyword_3.setObjectName(u"selkeyword_3")
self.selkeyword_3.setGeometry(QRect(80, 74, 64, 21))
self.sortcount = QLineEdit(self.inputGroup)
self.sortcount.setObjectName(u"sortcount")
self.sortcount.setGeometry(QRect(150, 70, 31, 31))
self.sortcount.setEchoMode(QLineEdit.Normal)
self.sortcount.setCursorPosition(1)
self.sortcount.setAlignment(Qt.AlignCenter)
self.db_btn = QPushButton(self.inputGroup)
self.db_btn.setObjectName(u"db_btn")
self.db_btn.setGeometry(QRect(10, 70, 51, 41))
self.export_btn = QPushButton(self.inputGroup)
self.export_btn.setObjectName(u"export_btn")
self.export_btn.setGeometry(QRect(390, 70, 91, 41))
self.comboBox = QComboBox(self.inputGroup)
self.comboBox.setObjectName(u"comboBox")
self.comboBox.setGeometry(QRect(330, 120, 151, 31))
self.matchCount = QLabel(self.inputGroup)
self.matchCount.setObjectName(u"matchCount")
self.matchCount.setGeometry(QRect(210, 20, 64, 31))
self.matchCountbox = QLabel(self.inputGroup)
self.matchCountbox.setObjectName(u"matchCountbox")
self.matchCountbox.setGeometry(QRect(290, 20, 64, 31))
font = QFont()
font.setFamilies([u"Arial"])
font.setPointSize(20)
font.setBold(True)
font.setUnderline(True)
self.matchCountbox.setFont(font)
self.matchCount_4 = QLabel(self.inputGroup)
self.matchCount_4.setObjectName(u"matchCount_4")
self.matchCount_4.setGeometry(QRect(210, 70, 64, 31))
self.timerLabel = QLabel(self.inputGroup)
self.timerLabel.setObjectName(u"timerLabel")
self.timerLabel.setGeometry(QRect(270, 70, 111, 31))
font1 = QFont()
font1.setFamilies([u"Adobe Devanagari"])
font1.setPointSize(20)
font1.setBold(True)
self.timerLabel.setFont(font1)
self.timerLabel.setAlignment(Qt.AlignCenter)
self.sc_button = QDialogButtonBox(self.inputGroup)
self.sc_button.setObjectName(u"sc_button")
self.sc_button.setGeometry(QRect(390, 30, 91, 31))
self.sc_button.setStandardButtons(QDialogButtonBox.Apply)
self.matchCount_5 = QLabel(self.inputGroup)
self.matchCount_5.setObjectName(u"matchCount_5")
self.matchCount_5.setGeometry(QRect(400, 10, 64, 21))
self.sc_progressBar = QProgressBar(self.inputGroup)
self.sc_progressBar.setObjectName(u"sc_progressBar")
self.sc_progressBar.setGeometry(QRect(20, 120, 311, 20))
self.sc_progressBar.setStyleSheet(u"font: 75 14pt \"Agency FB\";")
self.sc_progressBar.setValue(0)
self.img_progressBar = QProgressBar(self.inputGroup)
self.img_progressBar.setObjectName(u"img_progressBar")
self.img_progressBar.setGeometry(QRect(20, 150, 311, 20))
self.img_progressBar.setStyleSheet(u"font: 75 14pt \"Agency FB\";")
self.img_progressBar.setValue(0)
self.selkeyword_4 = QLabel(self.inputGroup)
self.selkeyword_4.setObjectName(u"selkeyword_4")
self.selkeyword_4.setGeometry(QRect(130, 120, 51, 21))
self.selkeyword_5 = QLabel(self.inputGroup)
self.selkeyword_5.setObjectName(u"selkeyword_5")
self.selkeyword_5.setGeometry(QRect(120, 150, 71, 21))
self.groupBox = QGroupBox(Dialog)
self.groupBox.setObjectName(u"groupBox")
self.groupBox.setGeometry(QRect(520, 50, 1331, 941))
self.selkeyword = QLabel(self.groupBox)
self.selkeyword.setObjectName(u"selkeyword")
self.selkeyword.setGeometry(QRect(500, 240, 111, 20))
self.selkeyword.setAlignment(Qt.AlignCenter)
self.urlbox = QLineEdit(self.groupBox)
self.urlbox.setObjectName(u"urlbox")
self.urlbox.setGeometry(QRect(630, 800, 641, 31))
self.urlbox.setDragEnabled(False)
self.urlbox.setClearButtonEnabled(True)
self.deliveryfee = QLabel(self.groupBox)
self.deliveryfee.setObjectName(u"deliveryfee")
self.deliveryfee.setGeometry(QRect(500, 360, 64, 15))
self.deliveryfee.setWordWrap(False)
self.addmargin = QLabel(self.groupBox)
self.addmargin.setObjectName(u"addmargin")
self.addmargin.setGeometry(QRect(500, 480, 81, 16))
self.addmargin.setWordWrap(False)
self.addpackingfee = QLabel(self.groupBox)
self.addpackingfee.setObjectName(u"addpackingfee")
self.addpackingfee.setGeometry(QRect(500, 420, 91, 16))
self.addpackingfee.setWordWrap(False)
self.selkeywordbox = QLineEdit(self.groupBox)
self.selkeywordbox.setObjectName(u"selkeywordbox")
self.selkeywordbox.setGeometry(QRect(500, 260, 113, 31))
self.selkeywordbox.setStyleSheet(u"font: 10pt \"\uc0c8\uad74\ub9bc\";")
self.selkeywordbox.setClearButtonEnabled(True)
self.graphicsView_multi = QGraphicsView(self.groupBox)
self.graphicsView_multi.setObjectName(u"graphicsView_multi")
self.graphicsView_multi.setGeometry(QRect(310, 30, 170, 810))
self.groupBox_2 = QGroupBox(self.groupBox)
self.groupBox_2.setObjectName(u"groupBox_2")
self.groupBox_2.setGeometry(QRect(10, 30, 291, 151))
self.sel_item11_2 = QLabel(self.groupBox_2)
self.sel_item11_2.setObjectName(u"sel_item11_2")
self.sel_item11_2.setGeometry(QRect(10, 20, 31, 20))
self.sel_itembox11 = QLineEdit(self.groupBox_2)
self.sel_itembox11.setObjectName(u"sel_itembox11")
self.sel_itembox11.setGeometry(QRect(60, 20, 221, 21))
self.sel_item12_5 = QLabel(self.groupBox_2)
self.sel_item12_5.setObjectName(u"sel_item12_5")
self.sel_item12_5.setGeometry(QRect(10, 50, 51, 20))
self.sel_itembox12 = QLineEdit(self.groupBox_2)
self.sel_itembox12.setObjectName(u"sel_itembox12")
self.sel_itembox12.setGeometry(QRect(60, 50, 221, 21))
self.sel_item12_2 = QLabel(self.groupBox_2)
self.sel_item12_2.setObjectName(u"sel_item12_2")
self.sel_item12_2.setGeometry(QRect(10, 80, 51, 20))
self.sel_itembox13 = QLineEdit(self.groupBox_2)
self.sel_itembox13.setObjectName(u"sel_itembox13")
self.sel_itembox13.setGeometry(QRect(60, 80, 101, 21))
self.sel_item12_3 = QLabel(self.groupBox_2)
self.sel_item12_3.setObjectName(u"sel_item12_3")
self.sel_item12_3.setGeometry(QRect(170, 80, 31, 20))
self.sel_itembox14 = QLineEdit(self.groupBox_2)
self.sel_itembox14.setObjectName(u"sel_itembox14")
self.sel_itembox14.setGeometry(QRect(210, 80, 71, 21))
self.sel_item11 = QLabel(self.groupBox_2)
self.sel_item11.setObjectName(u"sel_item11")
self.sel_item11.setGeometry(QRect(10, 110, 51, 20))
self.sel_itembox15 = QLineEdit(self.groupBox_2)
self.sel_itembox15.setObjectName(u"sel_itembox15")
self.sel_itembox15.setGeometry(QRect(60, 110, 91, 21))
self.sel_item12 = QLabel(self.groupBox_2)
self.sel_item12.setObjectName(u"sel_item12")
self.sel_item12.setGeometry(QRect(160, 110, 61, 20))
self.sel_itembox16 = QLineEdit(self.groupBox_2)
self.sel_itembox16.setObjectName(u"sel_itembox16")
self.sel_itembox16.setGeometry(QRect(230, 110, 51, 21))
self.groupBox_3 = QGroupBox(self.groupBox)
self.groupBox_3.setObjectName(u"groupBox_3")
self.groupBox_3.setGeometry(QRect(10, 190, 291, 151))
self.sel_item11_3 = QLabel(self.groupBox_3)
self.sel_item11_3.setObjectName(u"sel_item11_3")
self.sel_item11_3.setGeometry(QRect(10, 20, 31, 20))
self.sel_itembox21 = QLineEdit(self.groupBox_3)
self.sel_itembox21.setObjectName(u"sel_itembox21")
self.sel_itembox21.setGeometry(QRect(60, 20, 221, 21))
self.sel_item12_6 = QLabel(self.groupBox_3)
self.sel_item12_6.setObjectName(u"sel_item12_6")
self.sel_item12_6.setGeometry(QRect(10, 50, 51, 20))
self.sel_itembox22 = QLineEdit(self.groupBox_3)
self.sel_itembox22.setObjectName(u"sel_itembox22")
self.sel_itembox22.setGeometry(QRect(60, 50, 221, 21))
self.sel_item12_7 = QLabel(self.groupBox_3)
self.sel_item12_7.setObjectName(u"sel_item12_7")
self.sel_item12_7.setGeometry(QRect(0, 70, 51, 20))
self.sel_itembox23 = QLineEdit(self.groupBox_3)
self.sel_itembox23.setObjectName(u"sel_itembox23")
self.sel_itembox23.setGeometry(QRect(60, 80, 101, 21))
self.sel_item12_8 = QLabel(self.groupBox_3)
self.sel_item12_8.setObjectName(u"sel_item12_8")
self.sel_item12_8.setGeometry(QRect(170, 80, 31, 20))
self.sel_itembox24 = QLineEdit(self.groupBox_3)
self.sel_itembox24.setObjectName(u"sel_itembox24")
self.sel_itembox24.setGeometry(QRect(210, 80, 71, 21))
self.sel_item11_4 = QLabel(self.groupBox_3)
self.sel_item11_4.setObjectName(u"sel_item11_4")
self.sel_item11_4.setGeometry(QRect(10, 110, 51, 20))
self.sel_itembox25 = QLineEdit(self.groupBox_3)
self.sel_itembox25.setObjectName(u"sel_itembox25")
self.sel_itembox25.setGeometry(QRect(60, 110, 91, 21))
self.sel_item12_9 = QLabel(self.groupBox_3)
self.sel_item12_9.setObjectName(u"sel_item12_9")
self.sel_item12_9.setGeometry(QRect(160, 110, 61, 20))
self.sel_itembox26 = QLineEdit(self.groupBox_3)
self.sel_itembox26.setObjectName(u"sel_itembox26")
self.sel_itembox26.setGeometry(QRect(230, 110, 51, 21))
self.groupBox_4 = QGroupBox(self.groupBox)
self.groupBox_4.setObjectName(u"groupBox_4")
self.groupBox_4.setGeometry(QRect(10, 350, 291, 151))
self.sel_item11_5 = QLabel(self.groupBox_4)
self.sel_item11_5.setObjectName(u"sel_item11_5")
self.sel_item11_5.setGeometry(QRect(10, 20, 31, 20))
self.sel_itembox31 = QLineEdit(self.groupBox_4)
self.sel_itembox31.setObjectName(u"sel_itembox31")
self.sel_itembox31.setGeometry(QRect(60, 20, 221, 21))
self.sel_item12_10 = QLabel(self.groupBox_4)
self.sel_item12_10.setObjectName(u"sel_item12_10")
self.sel_item12_10.setGeometry(QRect(10, 50, 51, 20))
self.sel_itembox32 = QLineEdit(self.groupBox_4)
self.sel_itembox32.setObjectName(u"sel_itembox32")
self.sel_itembox32.setGeometry(QRect(60, 50, 221, 21))
self.sel_item12_11 = QLabel(self.groupBox_4)
self.sel_item12_11.setObjectName(u"sel_item12_11")
self.sel_item12_11.setGeometry(QRect(10, 80, 51, 20))
self.sel_itembox33 = QLineEdit(self.groupBox_4)
self.sel_itembox33.setObjectName(u"sel_itembox33")
self.sel_itembox33.setGeometry(QRect(60, 80, 101, 21))
self.sel_item12_12 = QLabel(self.groupBox_4)
self.sel_item12_12.setObjectName(u"sel_item12_12")
self.sel_item12_12.setGeometry(QRect(170, 80, 31, 20))
self.sel_itembox34 = QLineEdit(self.groupBox_4)
self.sel_itembox34.setObjectName(u"sel_itembox34")
self.sel_itembox34.setGeometry(QRect(210, 80, 71, 21))
self.sel_item11_6 = QLabel(self.groupBox_4)
self.sel_item11_6.setObjectName(u"sel_item11_6")
self.sel_item11_6.setGeometry(QRect(10, 110, 51, 20))
self.sel_itembox35 = QLineEdit(self.groupBox_4)
self.sel_itembox35.setObjectName(u"sel_itembox35")
self.sel_itembox35.setGeometry(QRect(60, 110, 91, 21))
self.sel_item12_13 = QLabel(self.groupBox_4)
self.sel_item12_13.setObjectName(u"sel_item12_13")
self.sel_item12_13.setGeometry(QRect(160, 110, 61, 20))
self.sel_itembox36 = QLineEdit(self.groupBox_4)
self.sel_itembox36.setObjectName(u"sel_itembox36")
self.sel_itembox36.setGeometry(QRect(230, 110, 51, 21))
self.groupBox_5 = QGroupBox(self.groupBox)
self.groupBox_5.setObjectName(u"groupBox_5")
self.groupBox_5.setGeometry(QRect(10, 510, 291, 151))
self.sel_item11_7 = QLabel(self.groupBox_5)
self.sel_item11_7.setObjectName(u"sel_item11_7")
self.sel_item11_7.setGeometry(QRect(10, 20, 31, 20))
self.sel_itembox41 = QLineEdit(self.groupBox_5)
self.sel_itembox41.setObjectName(u"sel_itembox41")
self.sel_itembox41.setGeometry(QRect(60, 20, 221, 21))
self.sel_item12_14 = QLabel(self.groupBox_5)
self.sel_item12_14.setObjectName(u"sel_item12_14")
self.sel_item12_14.setGeometry(QRect(10, 50, 51, 20))
self.sel_itembox42 = QLineEdit(self.groupBox_5)
self.sel_itembox42.setObjectName(u"sel_itembox42")
self.sel_itembox42.setGeometry(QRect(60, 50, 221, 21))
self.sel_item12_15 = QLabel(self.groupBox_5)
self.sel_item12_15.setObjectName(u"sel_item12_15")
self.sel_item12_15.setGeometry(QRect(10, 80, 51, 20))
self.sel_itembox43 = QLineEdit(self.groupBox_5)
self.sel_itembox43.setObjectName(u"sel_itembox43")
self.sel_itembox43.setGeometry(QRect(60, 80, 101, 21))
self.sel_item12_16 = QLabel(self.groupBox_5)
self.sel_item12_16.setObjectName(u"sel_item12_16")
self.sel_item12_16.setGeometry(QRect(170, 80, 31, 20))
self.sel_itembox44 = QLineEdit(self.groupBox_5)
self.sel_itembox44.setObjectName(u"sel_itembox44")
self.sel_itembox44.setGeometry(QRect(210, 80, 71, 21))
self.sel_item11_8 = QLabel(self.groupBox_5)
self.sel_item11_8.setObjectName(u"sel_item11_8")
self.sel_item11_8.setGeometry(QRect(10, 110, 51, 20))
self.sel_itembox45 = QLineEdit(self.groupBox_5)
self.sel_itembox45.setObjectName(u"sel_itembox45")
self.sel_itembox45.setGeometry(QRect(60, 110, 91, 21))
self.sel_item12_17 = QLabel(self.groupBox_5)
self.sel_item12_17.setObjectName(u"sel_item12_17")
self.sel_item12_17.setGeometry(QRect(160, 110, 61, 20))
self.sel_itembox46 = QLineEdit(self.groupBox_5)
self.sel_itembox46.setObjectName(u"sel_itembox46")
self.sel_itembox46.setGeometry(QRect(230, 110, 51, 21))
self.groupBox_6 = QGroupBox(self.groupBox)
self.groupBox_6.setObjectName(u"groupBox_6")
self.groupBox_6.setGeometry(QRect(10, 670, 291, 151))
self.sel_item11_9 = QLabel(self.groupBox_6)
self.sel_item11_9.setObjectName(u"sel_item11_9")
self.sel_item11_9.setGeometry(QRect(10, 20, 31, 20))
self.sel_itembox51 = QLineEdit(self.groupBox_6)
self.sel_itembox51.setObjectName(u"sel_itembox51")
self.sel_itembox51.setGeometry(QRect(60, 20, 221, 21))
self.sel_item12_18 = QLabel(self.groupBox_6)
self.sel_item12_18.setObjectName(u"sel_item12_18")
self.sel_item12_18.setGeometry(QRect(10, 50, 51, 20))
self.sel_itembox52 = QLineEdit(self.groupBox_6)
self.sel_itembox52.setObjectName(u"sel_itembox52")
self.sel_itembox52.setGeometry(QRect(60, 50, 221, 21))
self.sel_item12_19 = QLabel(self.groupBox_6)
self.sel_item12_19.setObjectName(u"sel_item12_19")
self.sel_item12_19.setGeometry(QRect(10, 80, 51, 20))
self.sel_itembox53 = QLineEdit(self.groupBox_6)
self.sel_itembox53.setObjectName(u"sel_itembox53")
self.sel_itembox53.setGeometry(QRect(60, 80, 101, 21))
self.sel_item12_20 = QLabel(self.groupBox_6)
self.sel_item12_20.setObjectName(u"sel_item12_20")
self.sel_item12_20.setGeometry(QRect(170, 80, 31, 20))
self.sel_itembox54 = QLineEdit(self.groupBox_6)
self.sel_itembox54.setObjectName(u"sel_itembox54")
self.sel_itembox54.setGeometry(QRect(210, 80, 71, 21))
self.sel_item11_10 = QLabel(self.groupBox_6)
self.sel_item11_10.setObjectName(u"sel_item11_10")
self.sel_item11_10.setGeometry(QRect(10, 110, 51, 20))
self.sel_itembox55 = QLineEdit(self.groupBox_6)
self.sel_itembox55.setObjectName(u"sel_itembox55")
self.sel_itembox55.setGeometry(QRect(60, 110, 91, 21))
self.sel_item12_21 = QLabel(self.groupBox_6)
self.sel_item12_21.setObjectName(u"sel_item12_21")
self.sel_item12_21.setGeometry(QRect(160, 110, 61, 20))
self.sel_itembox56 = QLineEdit(self.groupBox_6)
self.sel_itembox56.setObjectName(u"sel_itembox56")
self.sel_itembox56.setGeometry(QRect(230, 110, 51, 21))
self.urlgobtn = QPushButton(self.groupBox)
self.urlgobtn.setObjectName(u"urlgobtn")
self.urlgobtn.setGeometry(QRect(1280, 800, 41, 31))
self.sel_item12_22 = QLabel(self.groupBox)
self.sel_item12_22.setObjectName(u"sel_item12_22")
self.sel_item12_22.setGeometry(QRect(500, 300, 51, 20))
self.sel_itemtagbox = QLineEdit(self.groupBox)
self.sel_itemtagbox.setObjectName(u"sel_itemtagbox")
self.sel_itemtagbox.setGeometry(QRect(500, 320, 111, 31))
self.sel_itemtagbox.setClearButtonEnabled(True)
self.matchbtn = QPushButton(self.groupBox)
self.matchbtn.setObjectName(u"matchbtn")
self.matchbtn.setGeometry(QRect(500, 190, 121, 41))
self.matchbtn.setStyleSheet(u"background-color: rgb(0, 255, 255);\n"
"font: 16pt \"HY\ud5e4\ub4dc\ub77c\uc778M\";")
self.search_keyword_box = QLineEdit(self.groupBox)
self.search_keyword_box.setObjectName(u"search_keyword_box")
self.search_keyword_box.setGeometry(QRect(630, 10, 191, 41))
self.search_keyword_box.setClearButtonEnabled(True)
self.searchbtn_2 = QPushButton(self.groupBox)
self.searchbtn_2.setObjectName(u"searchbtn_2")
self.searchbtn_2.setGeometry(QRect(830, 10, 111, 41))
self.searchbtn_2.setCheckable(False)
self.searchbtn_2.setAutoDefault(True)
self.searchbtn_2.setFlat(False)
self.switchBtn = QPushButton(self.groupBox)
self.switchBtn.setObjectName(u"switchBtn")
self.switchBtn.setGeometry(QRect(1240, 10, 75, 41))
self.tabWidget = QTabWidget(self.groupBox)
self.tabWidget.setObjectName(u"tabWidget")
self.tabWidget.setGeometry(QRect(620, 60, 701, 741))
self.tabWidget.setTabBarAutoHide(False)
self.tab_1 = QWidget()
self.tab_1.setObjectName(u"tab_1")
self.webEngineView = QWebEngineView(self.tab_1)
self.webEngineView.setObjectName(u"webEngineView")
self.webEngineView.setGeometry(QRect(0, 0, 711, 731))
self.webEngineView.setUrl(QUrl(u"https://m.intl.taobao.com/"))
self.webEngineView.setZoomFactor(0.500000000000000)
self.tabWidget.addTab(self.tab_1, "")
self.tab_2 = QWidget()
self.tab_2.setObjectName(u"tab_2")
self.webEngineView_2 = QWebEngineView(self.tab_2)
self.webEngineView_2.setObjectName(u"webEngineView_2")
self.webEngineView_2.setGeometry(QRect(10, 10, 711, 731))
self.webEngineView_2.setUrl(QUrl(u"https://world.taobao.com/"))
self.webEngineView_2.setZoomFactor(0.400000000000000)
self.tabWidget.addTab(self.tab_2, "")
self.cat1 = QLabel(self.groupBox)
self.cat1.setObjectName(u"cat1")
self.cat1.setGeometry(QRect(500, 540, 81, 16))
self.cat1.setWordWrap(False)
self.cat2 = QLabel(self.groupBox)
self.cat2.setObjectName(u"cat2")
self.cat2.setGeometry(QRect(500, 600, 81, 16))
self.cat2.setWordWrap(False)
self.cat3 = QLabel(self.groupBox)
self.cat3.setObjectName(u"cat3")
self.cat3.setGeometry(QRect(500, 660, 81, 16))
self.cat3.setWordWrap(False)
self.cat4 = QLabel(self.groupBox)
self.cat4.setObjectName(u"cat4")
self.cat4.setGeometry(QRect(500, 720, 81, 16))
self.cat4.setWordWrap(False)
self.catbox1 = QLineEdit(self.groupBox)
self.catbox1.setObjectName(u"catbox1")
self.catbox1.setGeometry(QRect(500, 560, 111, 31))
self.catbox1.setClearButtonEnabled(True)
self.catbox2 = QLineEdit(self.groupBox)
self.catbox2.setObjectName(u"catbox2")
self.catbox2.setGeometry(QRect(500, 620, 111, 31))
self.catbox2.setClearButtonEnabled(True)
self.catbox3 = QLineEdit(self.groupBox)
self.catbox3.setObjectName(u"catbox3")
self.catbox3.setGeometry(QRect(500, 680, 111, 31))
self.catbox3.setClearButtonEnabled(True)
self.catbox4 = QLineEdit(self.groupBox)
self.catbox4.setObjectName(u"catbox4")
self.catbox4.setGeometry(QRect(500, 740, 111, 31))
self.catbox4.setClearButtonEnabled(True)
self.catcodebox = QLineEdit(self.groupBox)
self.catcodebox.setObjectName(u"catcodebox")
self.catcodebox.setGeometry(QRect(500, 800, 111, 31))
self.catcodebox.setClearButtonEnabled(True)
self.cat4_2 = QLabel(self.groupBox)
self.cat4_2.setObjectName(u"cat4_2")
self.cat4_2.setGeometry(QRect(500, 780, 81, 16))
self.cat4_2.setWordWrap(False)
self.addmargin_spbox = QSpinBox(self.groupBox)
self.addmargin_spbox.setObjectName(u"addmargin_spbox")
self.addmargin_spbox.setGeometry(QRect(500, 500, 111, 31))
sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.addmargin_spbox.sizePolicy().hasHeightForWidth())
self.addmargin_spbox.setSizePolicy(sizePolicy)
font2 = QFont()
font2.setFamilies([u"Agency FB"])
font2.setPointSize(16)
self.addmargin_spbox.setFont(font2)
self.addmargin_spbox.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter)
self.addmargin_spbox.setButtonSymbols(QAbstractSpinBox.PlusMinus)
self.addmargin_spbox.setCorrectionMode(QAbstractSpinBox.CorrectToPreviousValue)
self.addmargin_spbox.setMinimum(1000)
self.addmargin_spbox.setMaximum(600000)
self.addmargin_spbox.setSingleStep(1000)
self.addmargin_spbox.setStepType(QAbstractSpinBox.DefaultStepType)
self.addmargin_spbox.setValue(5000)
self.addmargin_spbox.setDisplayIntegerBase(10)
self.addpackingfee_spbox = QSpinBox(self.groupBox)
self.addpackingfee_spbox.setObjectName(u"addpackingfee_spbox")
self.addpackingfee_spbox.setGeometry(QRect(500, 440, 111, 31))
sizePolicy.setHeightForWidth(self.addpackingfee_spbox.sizePolicy().hasHeightForWidth())
self.addpackingfee_spbox.setSizePolicy(sizePolicy)
self.addpackingfee_spbox.setFont(font2)
self.addpackingfee_spbox.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter)
self.addpackingfee_spbox.setButtonSymbols(QAbstractSpinBox.PlusMinus)
self.addpackingfee_spbox.setCorrectionMode(QAbstractSpinBox.CorrectToPreviousValue)
self.addpackingfee_spbox.setMinimum(0)
self.addpackingfee_spbox.setMaximum(100000)
self.addpackingfee_spbox.setSingleStep(1000)
self.addpackingfee_spbox.setStepType(QAbstractSpinBox.DefaultStepType)
self.addpackingfee_spbox.setValue(0)
self.addpackingfee_spbox.setDisplayIntegerBase(10)
self.delivfee_spbox = QSpinBox(self.groupBox)
self.delivfee_spbox.setObjectName(u"delivfee_spbox")
self.delivfee_spbox.setGeometry(QRect(500, 380, 111, 31))
sizePolicy.setHeightForWidth(self.delivfee_spbox.sizePolicy().hasHeightForWidth())
self.delivfee_spbox.setSizePolicy(sizePolicy)
self.delivfee_spbox.setFont(font2)
self.delivfee_spbox.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter)
self.delivfee_spbox.setButtonSymbols(QAbstractSpinBox.PlusMinus)
self.delivfee_spbox.setCorrectionMode(QAbstractSpinBox.CorrectToPreviousValue)
self.delivfee_spbox.setMinimum(7000)
self.delivfee_spbox.setMaximum(6000000)
self.delivfee_spbox.setSingleStep(1000)
self.delivfee_spbox.setStepType(QAbstractSpinBox.DefaultStepType)
self.delivfee_spbox.setValue(7000)
self.delivfee_spbox.setDisplayIntegerBase(10)
self.img_searchbtn = QPushButton(self.groupBox)
self.img_searchbtn.setObjectName(u"img_searchbtn")
self.img_searchbtn.setGeometry(QRect(500, 10, 121, 41))
self.current_img = QGraphicsView(self.groupBox)
self.current_img.setObjectName(u"current_img")
self.current_img.setGeometry(QRect(500, 60, 120, 120))
self.backbtn = QPushButton(self.groupBox)
self.backbtn.setObjectName(u"backbtn")
self.backbtn.setGeometry(QRect(950, 10, 61, 41))
self.forwardbtn = QPushButton(self.groupBox)
self.forwardbtn.setObjectName(u"forwardbtn")
self.forwardbtn.setGeometry(QRect(1020, 10, 61, 41))
self.sel_relatedTagbox = QLineEdit(Dialog)
self.sel_relatedTagbox.setObjectName(u"sel_relatedTagbox")
self.sel_relatedTagbox.setGeometry(QRect(720, 20, 571, 31))
self.sel_relatedTagbox.setClearButtonEnabled(True)
self.sel_item12_4 = QLabel(Dialog)
self.sel_item12_4.setObjectName(u"sel_item12_4")
self.sel_item12_4.setGeometry(QRect(640, 20, 81, 31))
self.taourl = QLabel(Dialog)
self.taourl.setObjectName(u"taourl")
self.taourl.setGeometry(QRect(1300, 20, 131, 31))
self.taourlbox = QLineEdit(Dialog)
self.taourlbox.setObjectName(u"taourlbox")
self.taourlbox.setGeometry(QRect(1420, 20, 411, 31))
self.timerStart = QPushButton(Dialog)
self.timerStart.setObjectName(u"timerStart")
self.timerStart.setGeometry(QRect(150, 10, 61, 31))
self.timerStart.setCheckable(False)
self.timerStart.setAutoDefault(True)
self.timerStart.setFlat(False)
self.timerStop = QPushButton(Dialog)
self.timerStop.setObjectName(u"timerStop")
self.timerStop.setGeometry(QRect(450, 10, 51, 31))
self.timerStop.setCheckable(False)
self.timerStop.setAutoDefault(True)
self.timerStop.setFlat(False)
self.timerSet = QPushButton(Dialog)
self.timerSet.setObjectName(u"timerSet")
self.timerSet.setGeometry(QRect(340, 10, 61, 31))
self.timerSet.setCheckable(False)
self.timerSet.setAutoDefault(True)
self.timerSet.setFlat(False)
self.timerMinute = QLineEdit(Dialog)
self.timerMinute.setObjectName(u"timerMinute")
self.timerMinute.setGeometry(QRect(230, 10, 31, 31))
self.timerMinute.setAlignment(Qt.AlignCenter)
self.timerSecond = QLineEdit(Dialog)
self.timerSecond.setObjectName(u"timerSecond")
self.timerSecond.setGeometry(QRect(290, 10, 31, 31))
self.timerSecond.setAlignment(Qt.AlignCenter)
self.matchCount_2 = QLabel(Dialog)
self.matchCount_2.setObjectName(u"matchCount_2")
self.matchCount_2.setGeometry(QRect(260, 10, 31, 31))
self.matchCount_3 = QLabel(Dialog)
self.matchCount_3.setObjectName(u"matchCount_3")
self.matchCount_3.setGeometry(QRect(320, 10, 31, 31))
self.papagoApi = QPushButton(Dialog)
self.papagoApi.setObjectName(u"papagoApi")
self.papagoApi.setGeometry(QRect(520, 10, 101, 28))
self.retranslateUi(Dialog)
self.forwardbtn.clicked.connect(self.webEngineView_2.forward)
self.backbtn.clicked.connect(self.webEngineView_2.back)
self.searchbtn_2.setDefault(True)
self.tabWidget.setCurrentIndex(1)
self.timerStart.setDefault(True)
self.timerStop.setDefault(True)
self.timerSet.setDefault(True)
QMetaObject.connectSlotsByName(Dialog)
# setupUi
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(QCoreApplication.translate("Dialog", u"Dialog", None))
self.inputGroup.setTitle(QCoreApplication.translate("Dialog", u"\uc785\ub825\uc601\uc5ed", None))
self.Excel_btn.setText(QCoreApplication.translate("Dialog", u"\uc5d1\uc140\n"
"\uc5f4\uae30", None))
self.isOverseas.setText(QCoreApplication.translate("Dialog", u"1", None))
self.selkeyword_2.setText(QCoreApplication.translate("Dialog", u"\ud574\uc678\uc5ec\ubd80", None))
self.selkeyword_3.setText(QCoreApplication.translate("Dialog", u"\ucd94\ucd9c\uac2f\uc218", None))
self.sortcount.setText(QCoreApplication.translate("Dialog", u"5", None))
self.db_btn.setText(QCoreApplication.translate("Dialog", u"DB\n"
"\uc5f4\uae30", None))
self.export_btn.setText(QCoreApplication.translate("Dialog", u"XLS\n"
"\uc800\uc7a5", None))
self.matchCount.setText(QCoreApplication.translate("Dialog", u"\ub9e4\uce6d\uac2f\uc218", None))
self.matchCountbox.setText("")
self.matchCount_4.setText(QCoreApplication.translate("Dialog", u"\ud0c0\uc774\uba38", None))
self.timerLabel.setText(QCoreApplication.translate("Dialog", u"60:00", None))
self.matchCount_5.setText(QCoreApplication.translate("Dialog", u"\uc2a4\ud06c\ub798\ud551", None))
self.selkeyword_4.setText(QCoreApplication.translate("Dialog", u"Scraping", None))
self.selkeyword_5.setText(QCoreApplication.translate("Dialog", u"Save Image", None))
self.groupBox.setTitle(QCoreApplication.translate("Dialog", u"\ud45c\uc2dc\uc601\uc5ed", None))
self.selkeyword.setText(QCoreApplication.translate("Dialog", u"\ud604\uc7acitem(\uac00\uc9c0\uce58\uae30)", None))
self.urlbox.setText(QCoreApplication.translate("Dialog", u"http://naver.com", None))
self.deliveryfee.setText(QCoreApplication.translate("Dialog", u"\ubc30\uc1a1\ube44", None))
self.addmargin.setText(QCoreApplication.translate("Dialog", u"\ub354\ud558\uae30\ub9c8\uc9c4", None))
self.addpackingfee.setText(QCoreApplication.translate("Dialog", u"\ucd94\uac00\ud3ec\uc7a5\ube44", None))
self.groupBox_2.setTitle(QCoreApplication.translate("Dialog", u"1\ubc88 \uc0c1\ud488", None))
self.sel_item11_2.setText(QCoreApplication.translate("Dialog", u"\uc774\ub984", None))
self.sel_item12_5.setText(QCoreApplication.translate("Dialog", u"Tag", None))
self.sel_item12_2.setText(QCoreApplication.translate("Dialog", u"\ub9ac\ubdf0\uc218", None))
self.sel_item12_3.setText(QCoreApplication.translate("Dialog", u"\ucc1c\uc218", None))
self.sel_item11.setText(QCoreApplication.translate("Dialog", u"\uac00 \uaca9", None))
self.sel_item12.setText(QCoreApplication.translate("Dialog", u"\uad6c\ub9e4\uac74\uc218", None))
self.groupBox_3.setTitle(QCoreApplication.translate("Dialog", u"2\ubc88 \uc0c1\ud488", None))
self.sel_item11_3.setText(QCoreApplication.translate("Dialog", u"\uc774\ub984", None))
self.sel_item12_6.setText(QCoreApplication.translate("Dialog", u"Tag", None))
self.sel_item12_7.setText(QCoreApplication.translate("Dialog", u"\ub9ac\ubdf0\uc218", None))
self.sel_item12_8.setText(QCoreApplication.translate("Dialog", u"\ucc1c\uc218", None))
self.sel_item11_4.setText(QCoreApplication.translate("Dialog", u"\uac00 \uaca9", None))
self.sel_item12_9.setText(QCoreApplication.translate("Dialog", u"\uad6c\ub9e4\uac74\uc218", None))
self.groupBox_4.setTitle(QCoreApplication.translate("Dialog", u"3\ubc88 \uc0c1\ud488", None))
self.sel_item11_5.setText(QCoreApplication.translate("Dialog", u"\uc774\ub984", None))
self.sel_item12_10.setText(QCoreApplication.translate("Dialog", u"Tag", None))
self.sel_item12_11.setText(QCoreApplication.translate("Dialog", u"\ub9ac\ubdf0\uc218", None))
self.sel_item12_12.setText(QCoreApplication.translate("Dialog", u"\ucc1c\uc218", None))
self.sel_item11_6.setText(QCoreApplication.translate("Dialog", u"\uac00 \uaca9", None))
self.sel_item12_13.setText(QCoreApplication.translate("Dialog", u"\uad6c\ub9e4\uac74\uc218", None))
self.groupBox_5.setTitle(QCoreApplication.translate("Dialog", u"4\ubc88 \uc0c1\ud488", None))
self.sel_item11_7.setText(QCoreApplication.translate("Dialog", u"\uc774\ub984", None))
self.sel_item12_14.setText(QCoreApplication.translate("Dialog", u"Tag", None))
self.sel_item12_15.setText(QCoreApplication.translate("Dialog", u"\ub9ac\ubdf0\uc218", None))
self.sel_item12_16.setText(QCoreApplication.translate("Dialog", u"\ucc1c\uc218", None))
self.sel_item11_8.setText(QCoreApplication.translate("Dialog", u"\uac00 \uaca9", None))
self.sel_item12_17.setText(QCoreApplication.translate("Dialog", u"\uad6c\ub9e4\uac74\uc218", None))
self.groupBox_6.setTitle(QCoreApplication.translate("Dialog", u"5\ubc88 \uc0c1\ud488", None))
self.sel_item11_9.setText(QCoreApplication.translate("Dialog", u"\uc774\ub984", None))
self.sel_item12_18.setText(QCoreApplication.translate("Dialog", u"Tag", None))
self.sel_item12_19.setText(QCoreApplication.translate("Dialog", u"\ub9ac\ubdf0\uc218", None))
self.sel_item12_20.setText(QCoreApplication.translate("Dialog", u"\ucc1c\uc218", None))
self.sel_item11_10.setText(QCoreApplication.translate("Dialog", u"\uac00 \uaca9", None))
self.sel_item12_21.setText(QCoreApplication.translate("Dialog", u"\uad6c\ub9e4\uac74\uc218", None))
self.urlgobtn.setText(QCoreApplication.translate("Dialog", u"GO", None))
self.sel_item12_22.setText(QCoreApplication.translate("Dialog", u"Tag", None))
self.matchbtn.setText(QCoreApplication.translate("Dialog", u"\ub9e4\uce6d", None))
self.searchbtn_2.setText(QCoreApplication.translate("Dialog", u"\ud0a4\uc6cc\ub4dc \uac80\uc0c9", None))
self.switchBtn.setText(QCoreApplication.translate("Dialog", u"PC-\ubaa8\ubc14\uc77c\n"
"\uc804\ud658", None))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_1), QCoreApplication.translate("Dialog", u"\ubaa8\ubc14\uc77c\ud0ed-\ud14d\uc2a4\ud2b8\uac80\uc0c9", None))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), QCoreApplication.translate("Dialog", u"PC\ud0ed-\uc774\ubbf8\uc9c0\uac80\uc0c9", None))
self.cat1.setText(QCoreApplication.translate("Dialog", u"\uce74\ud14c\uace0\ub9ac 1", None))
self.cat2.setText(QCoreApplication.translate("Dialog", u"\uce74\ud14c\uace0\ub9ac 2", None))
self.cat3.setText(QCoreApplication.translate("Dialog", u"\uce74\ud14c\uace0\ub9ac 3", None))
self.cat4.setText(QCoreApplication.translate("Dialog", u"\uce74\ud14c\uace0\ub9ac 4", None))
self.cat4_2.setText(QCoreApplication.translate("Dialog", u"\uce74\ud14c\uace0\ub9ac \ucf54\ub4dc", None))
self.img_searchbtn.setText(QCoreApplication.translate("Dialog", u"\ud604\uc7ac \uc774\ubbf8\uc9c0 \uac80\uc0c9", None))
self.backbtn.setText(QCoreApplication.translate("Dialog", u"\ub4a4\ub85c", None))
self.forwardbtn.setText(QCoreApplication.translate("Dialog", u"\uc55e\uc73c\ub85c", None))
self.sel_item12_4.setText(QCoreApplication.translate("Dialog", u"\uc5f0\uad00\ud0a4\uc6cc\ub4dc", None))
self.taourl.setText(QCoreApplication.translate("Dialog", u"\ud0c0\uc624\ubc14\uc774 PC-URL", None))
self.timerStart.setText(QCoreApplication.translate("Dialog", u"Start", None))
self.timerStop.setText(QCoreApplication.translate("Dialog", u"Stop", None))
self.timerSet.setText(QCoreApplication.translate("Dialog", u"Set", None))
self.timerMinute.setText(QCoreApplication.translate("Dialog", u"60", None))
self.timerSecond.setText(QCoreApplication.translate("Dialog", u"00", None))
self.matchCount_2.setText(QCoreApplication.translate("Dialog", u"\ubd84", None))
self.matchCount_3.setText(QCoreApplication.translate("Dialog", u"\ucd08", None))
self.papagoApi.setText(QCoreApplication.translate("Dialog", u"PAPAGO API", None))
# retranslateUi

6
resources/images.qrc Normal file
View File

@ -0,0 +1,6 @@
<RCC>
<qresource prefix="resources/magician.png">
<file>magician.png</file>
<file>쏘서러.png</file>
</qresource>
</RCC>

BIN
resources/magician.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
resources/쏘서러.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

183
signup.ui Normal file
View File

@ -0,0 +1,183 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>892</width>
<height>684</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<widget class="QGroupBox" name="groupBox">
<property name="geometry">
<rect>
<x>10</x>
<y>240</y>
<width>451</width>
<height>201</height>
</rect>
</property>
<property name="title">
<string/>
</property>
<widget class="QTextBrowser" name="textBrowser">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>451</width>
<height>171</height>
</rect>
</property>
<property name="html">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Gulim'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:12pt; font-weight:600;&quot;&gt;프로그램 이용 약관&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:12pt; font-weight:600;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;1. 아래는 프로그램의 이용을 위한 약관에 &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
<widget class="QCheckBox" name="checkBox">
<property name="geometry">
<rect>
<x>370</x>
<y>180</y>
<width>81</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>동의합니다</string>
</property>
</widget>
</widget>
<widget class="QGroupBox" name="groupBox_2">
<property name="geometry">
<rect>
<x>10</x>
<y>450</y>
<width>451</width>
<height>191</height>
</rect>
</property>
<property name="title">
<string/>
</property>
<widget class="QTextBrowser" name="textBrowser_2">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>451</width>
<height>161</height>
</rect>
</property>
<property name="html">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Gulim'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;개인정보 처리방침&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
<widget class="QCheckBox" name="checkBox_2">
<property name="geometry">
<rect>
<x>360</x>
<y>170</y>
<width>81</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>동의합니다</string>
</property>
</widget>
</widget>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>-10</x>
<y>-50</y>
<width>401</width>
<height>341</height>
</rect>
</property>
<property name="autoFillBackground">
<bool>false</bool>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="resources/images.qrc">:/resources/magician.png/쏘서러.png</pixmap>
</property>
<property name="scaledContents">
<bool>true</bool>
</property>
</widget>
<widget class="QLabel" name="label_2">
<property name="geometry">
<rect>
<x>560</x>
<y>100</y>
<width>81</width>
<height>31</height>
</rect>
</property>
<property name="font">
<font>
<family>굴림</family>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>아이디</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="QLineEdit" name="lineEdit">
<property name="geometry">
<rect>
<x>650</x>
<y>90</y>
<width>201</width>
<height>41</height>
</rect>
</property>
<property name="font">
<font>
<family>맑은 고딕</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="inputMask">
<string>이메일 입력</string>
</property>
<property name="dragEnabled">
<bool>true</bool>
</property>
<property name="clearButtonEnabled">
<bool>true</bool>
</property>
</widget>
</widget>
<resources>
<include location="resources/images.qrc"/>
</resources>
<connections/>
</ui>

272
testDBInput.py Normal file
View File

@ -0,0 +1,272 @@
from pymongo import MongoClient, ASCENDING
from werkzeug.security import generate_password_hash
from datetime import datetime, timedelta
# MongoDB 접속
client = MongoClient('mongodb://root:1234@qcy2.duckdns.org:27017/')
db = client['taobao_project'] # 사용할 데이터베이스 지정
# 이메일 필드에 대한 고유 인덱스 생성
db.users.create_index([("email", ASCENDING)], unique=True)
# 현재 날짜와 시간
now = datetime.now()
# 사용자 데이터 샘플
users_data = [
{
"email": "testMaster1@gmail.com",
"username": "테스트마스터1",
"password": "1234",
"userType": "master",
"userGrade": 1, # 사용자 등급
"joinDate": now.strftime('%Y-%m-%d %H:%M:%S'), # 가입일자
"planStartDate": (now + timedelta(days=1)).strftime('%Y-%m-%d 00:00'), # 유료 플랜 시작일자
"planEndDate": (now + timedelta(days=91)).strftime('%Y-%m-%d 00:00'), # 유료 플랜 종료일자
"planDurationDays": 90, # 유료 플랜 기간
"lastLoginTime": None, # 마지막 로그인 시간
"lastLogoutTime": None, # 마지막 로그아웃 시간
"totalWorkload": 100, # 총 작업량
"weeklyPerformance": { # 주별 성과
"2023-01": 20, # 예시: 2023년 1주차의 작업량
"2023-02": 30, # 예시: 2023년 2주차의 작업량
},
"monthlyPerformance": { # 월별 성과
"2023-01": 50, # 예시: 2023년 1월의 작업량
"2023-02": 50, # 예시: 2023년 2월의 작업량
}
},
# 슬레이브 사용자 데이터 예시 (마스터 사용자 정보 참조)
{
"email": "T1slave1@gmail.com",
"username": "테스트1슬레이브1",
"password": "1234",
"userType": "slave",
"master": "testMaster1@gmail.com", # 마스터 사용자 참조
"lastLoginTime": None, # 마지막 로그인 시간
"lastLogoutTime": None, # 마지막 로그아웃 시간
"totalWorkload": 100, # 총 작업량
"weeklyPerformance": { # 주별 성과
"2023-01": 20, # 예시: 2023년 1주차의 작업량
"2023-02": 30, # 예시: 2023년 2주차의 작업량
},
"monthlyPerformance": { # 월별 성과
"2023-01": 50, # 예시: 2023년 1월의 작업량
"2023-02": 50, # 예시: 2023년 2월의 작업량
}
},
# 슬레이브 사용자 데이터 예시 (마스터 사용자 정보 참조)
{
"email": "T1slave2@gmail.com",
"username": "테스트1슬레이브2",
"password": "1234",
"userType": "slave",
"master": "testMaster1@gmail.com", # 마스터 사용자 참조
"lastLoginTime": None, # 마지막 로그인 시간
"lastLogoutTime": None, # 마지막 로그아웃 시간
"totalWorkload": 100, # 총 작업량
"weeklyPerformance": { # 주별 성과
"2023-01": 20, # 예시: 2023년 1주차의 작업량
"2023-02": 30, # 예시: 2023년 2주차의 작업량
},
"monthlyPerformance": { # 월별 성과
"2023-01": 50, # 예시: 2023년 1월의 작업량
"2023-02": 50, # 예시: 2023년 2월의 작업량
}
},
# 슬레이브 사용자 데이터 예시 (마스터 사용자 정보 참조)
{
"email": "T1Manager@gmail.com",
"username": "테스트1매니저",
"password": "1234",
"userType": "manager",
"master": "testMaster1@gmail.com", # 마스터 사용자 참조
"lastLoginTime": None, # 마지막 로그인 시간
"lastLogoutTime": None, # 마지막 로그아웃 시간
"totalWorkload": 100, # 총 작업량
"weeklyPerformance": { # 주별 성과
"2023-01": 20, # 예시: 2023년 1주차의 작업량
"2023-02": 30, # 예시: 2023년 2주차의 작업량
},
"monthlyPerformance": { # 월별 성과
"2023-01": 50, # 예시: 2023년 1월의 작업량
"2023-02": 50, # 예시: 2023년 2월의 작업량
}
},
{
"email": "testMaster2@gmail.com",
"username": "테스트마스터2",
"password": "1234",
"userType": "master",
"userGrade": 2, # 사용자 등급
"joinDate": now.strftime('%Y-%m-%d %H:%M:%S'), # 가입일자
"planStartDate": (now + timedelta(days=1)).strftime('%Y-%m-%d 00:00'), # 유료 플랜 시작일자
"planEndDate": (now + timedelta(days=31)).strftime('%Y-%m-%d 00:00'), # 유료 플랜 종료일자
"planDurationDays": 30, # 유료 플랜 기간
"lastLoginTime": None, # 마지막 로그인 시간
"lastLogoutTime": None, # 마지막 로그아웃 시간
"totalWorkload": 100, # 총 작업량
"weeklyPerformance": { # 주별 성과
"2023-01": 20, # 예시: 2023년 1주차의 작업량
"2023-02": 30, # 예시: 2023년 2주차의 작업량
},
"monthlyPerformance": { # 월별 성과
"2023-01": 50, # 예시: 2023년 1월의 작업량
"2023-02": 50, # 예시: 2023년 2월의 작업량
}
},
# 슬레이브 사용자 데이터 예시 (마스터 사용자 정보 참조)
{
"email": "T2slave1@gmail.com",
"username": "테스트2슬레이브1",
"password": "1234",
"userType": "slave",
"master": "testMaster2@gmail.com", # 마스터 사용자 참조
"lastLoginTime": None, # 마지막 로그인 시간
"lastLogoutTime": None, # 마지막 로그아웃 시간
"totalWorkload": 100, # 총 작업량
"weeklyPerformance": { # 주별 성과
"2023-01": 20, # 예시: 2023년 1주차의 작업량
"2023-02": 30, # 예시: 2023년 2주차의 작업량
},
"monthlyPerformance": { # 월별 성과
"2023-01": 50, # 예시: 2023년 1월의 작업량
"2023-02": 50, # 예시: 2023년 2월의 작업량
}
},
# 슬레이브 사용자 데이터 예시 (마스터 사용자 정보 참조)
{
"email": "T2slave2@gmail.com",
"username": "테스트2슬레이브2",
"password": "1234",
"userType": "slave",
"master": "testMaster2@gmail.com", # 마스터 사용자 참조
"lastLoginTime": None, # 마지막 로그인 시간
"lastLogoutTime": None, # 마지막 로그아웃 시간
"totalWorkload": 100, # 총 작업량
"weeklyPerformance": { # 주별 성과
"2023-01": 20, # 예시: 2023년 1주차의 작업량
"2023-02": 30, # 예시: 2023년 2주차의 작업량
},
"monthlyPerformance": { # 월별 성과
"2023-01": 50, # 예시: 2023년 1월의 작업량
"2023-02": 50, # 예시: 2023년 2월의 작업량
}
},
# 슬레이브 사용자 데이터 예시 (마스터 사용자 정보 참조)
{
"email": "T2Manager@gmail.com",
"username": "테스트2매니저",
"password": "1234",
"userType": "manager",
"master": "testMaster2@gmail.com", # 마스터 사용자 참조
"lastLoginTime": None, # 마지막 로그인 시간
"lastLogoutTime": None, # 마지막 로그아웃 시간
"totalWorkload": 100, # 총 작업량
"weeklyPerformance": { # 주별 성과
"2023-01": 20, # 예시: 2023년 1주차의 작업량
"2023-02": 30, # 예시: 2023년 2주차의 작업량
},
"monthlyPerformance": { # 월별 성과
"2023-01": 50, # 예시: 2023년 1월의 작업량
"2023-02": 50, # 예시: 2023년 2월의 작업량
}
},
{
"email": "testMaster3@gmail.com",
"username": "테스트마스터3",
"password": "1234",
"userType": "master",
"userGrade": 3, # 사용자 등급
"joinDate": now.strftime('%Y-%m-%d %H:%M:%S'), # 가입일자
"planStartDate": (now + timedelta(days=1)).strftime('%Y-%m-%d 00:00'), # 유료 플랜 시작일자
"planEndDate": (now + timedelta(days=8)).strftime('%Y-%m-%d 00:00'), # 유료 플랜 종료일자
"planDurationDays": 7, # 유료 플랜 기간
"lastLoginTime": None, # 마지막 로그인 시간
"lastLogoutTime": None, # 마지막 로그아웃 시간
"totalWorkload": 100, # 총 작업량
"weeklyPerformance": { # 주별 성과
"2023-01": 20, # 예시: 2023년 1주차의 작업량
"2023-02": 30, # 예시: 2023년 2주차의 작업량
},
"monthlyPerformance": { # 월별 성과
"2023-01": 50, # 예시: 2023년 1월의 작업량
"2023-02": 50, # 예시: 2023년 2월의 작업량
}
},
# 슬레이브 사용자 데이터 예시 (마스터 사용자 정보 참조)
{
"email": "T3slave1@gmail.com",
"username": "테스트3슬레이브1",
"password": "1234",
"userType": "slave",
"master": "testMaster3@gmail.com", # 마스터 사용자 참조
"lastLoginTime": None, # 마지막 로그인 시간
"lastLogoutTime": None, # 마지막 로그아웃 시간
"totalWorkload": 100, # 총 작업량
"weeklyPerformance": { # 주별 성과
"2023-01": 20, # 예시: 2023년 1주차의 작업량
"2023-02": 30, # 예시: 2023년 2주차의 작업량
},
"monthlyPerformance": { # 월별 성과
"2023-01": 50, # 예시: 2023년 1월의 작업량
"2023-02": 50, # 예시: 2023년 2월의 작업량
}
},
# 슬레이브 사용자 데이터 예시 (마스터 사용자 정보 참조)
{
"email": "T3slave2@gmail.com",
"username": "테스트3슬레이브2",
"password": "1234",
"userType": "slave",
"master": "testMaster3@gmail.com", # 마스터 사용자 참조
"lastLoginTime": None, # 마지막 로그인 시간
"lastLogoutTime": None, # 마지막 로그아웃 시간
"totalWorkload": 100, # 총 작업량
"weeklyPerformance": { # 주별 성과
"2023-01": 20, # 예시: 2023년 1주차의 작업량
"2023-02": 30, # 예시: 2023년 2주차의 작업량
},
"monthlyPerformance": { # 월별 성과
"2023-01": 50, # 예시: 2023년 1월의 작업량
"2023-02": 50, # 예시: 2023년 2월의 작업량
}
},
# 슬레이브 사용자 데이터 예시 (마스터 사용자 정보 참조)
{
"email": "T3Manager@gmail.com",
"username": "테스트3매니저",
"password": "1234",
"userType": "manager",
"master": "testMaster3@gmail.com", # 마스터 사용자 참조
"lastLoginTime": None, # 마지막 로그인 시간
"lastLogoutTime": None, # 마지막 로그아웃 시간
"totalWorkload": 100, # 총 작업량
"weeklyPerformance": { # 주별 성과
"2023-01": 20, # 예시: 2023년 1주차의 작업량
"2023-02": 30, # 예시: 2023년 2주차의 작업량
},
"monthlyPerformance": { # 월별 성과
"2023-01": 50, # 예시: 2023년 1월의 작업량
"2023-02": 50, # 예시: 2023년 2월의 작업량
}
}
]
# # 사용자 정보 저장
# for user in users_data:
# user['password'] = generate_password_hash(user['password']) # 비밀번호 해싱
# db.users.insert_one(user)
# 사용자 정보 업데이트 또는 추가
for user in users_data:
user['password'] = generate_password_hash(user['password']) # 비밀번호 해싱
# upsert=True 옵션을 사용하여, 문서가 없으면 추가하고, 있으면 업데이트
db.users.update_one(
{"email": user['email']},
{"$set": user},
upsert=True
)

272
testDBInput_syno.py Normal file
View File

@ -0,0 +1,272 @@
from pymongo import MongoClient, ASCENDING
from werkzeug.security import generate_password_hash
from datetime import datetime, timedelta
# MongoDB 접속
client = MongoClient('mongodb://root:1234@cckb9998.synology.me:27017/')
db = client['taobao_project'] # 사용할 데이터베이스 지정
# 이메일 필드에 대한 고유 인덱스 생성
db.users.create_index([("email", ASCENDING)], unique=True)
# 현재 날짜와 시간
now = datetime.now()
# 사용자 데이터 샘플
users_data = [
{
"email": "testMaster1@gmail.com",
"username": "테스트마스터1",
"password": "1234",
"userType": "master",
"userGrade": 1, # 사용자 등급
"joinDate": now.strftime('%Y-%m-%d %H:%M:%S'), # 가입일자
"planStartDate": (now + timedelta(days=1)).strftime('%Y-%m-%d 00:00'), # 유료 플랜 시작일자
"planEndDate": (now + timedelta(days=91)).strftime('%Y-%m-%d 00:00'), # 유료 플랜 종료일자
"planDurationDays": 90, # 유료 플랜 기간
"lastLoginTime": None, # 마지막 로그인 시간
"lastLogoutTime": None, # 마지막 로그아웃 시간
"totalWorkload": 100, # 총 작업량
"weeklyPerformance": { # 주별 성과
"2023-01": 20, # 예시: 2023년 1주차의 작업량
"2023-02": 30, # 예시: 2023년 2주차의 작업량
},
"monthlyPerformance": { # 월별 성과
"2023-01": 50, # 예시: 2023년 1월의 작업량
"2023-02": 50, # 예시: 2023년 2월의 작업량
}
},
# 슬레이브 사용자 데이터 예시 (마스터 사용자 정보 참조)
{
"email": "T1slave1@gmail.com",
"username": "테스트1슬레이브1",
"password": "1234",
"userType": "slave",
"master": "testMaster1@gmail.com", # 마스터 사용자 참조
"lastLoginTime": None, # 마지막 로그인 시간
"lastLogoutTime": None, # 마지막 로그아웃 시간
"totalWorkload": 100, # 총 작업량
"weeklyPerformance": { # 주별 성과
"2023-01": 20, # 예시: 2023년 1주차의 작업량
"2023-02": 30, # 예시: 2023년 2주차의 작업량
},
"monthlyPerformance": { # 월별 성과
"2023-01": 50, # 예시: 2023년 1월의 작업량
"2023-02": 50, # 예시: 2023년 2월의 작업량
}
},
# 슬레이브 사용자 데이터 예시 (마스터 사용자 정보 참조)
{
"email": "T1slave2@gmail.com",
"username": "테스트1슬레이브2",
"password": "1234",
"userType": "slave",
"master": "testMaster1@gmail.com", # 마스터 사용자 참조
"lastLoginTime": None, # 마지막 로그인 시간
"lastLogoutTime": None, # 마지막 로그아웃 시간
"totalWorkload": 100, # 총 작업량
"weeklyPerformance": { # 주별 성과
"2023-01": 20, # 예시: 2023년 1주차의 작업량
"2023-02": 30, # 예시: 2023년 2주차의 작업량
},
"monthlyPerformance": { # 월별 성과
"2023-01": 50, # 예시: 2023년 1월의 작업량
"2023-02": 50, # 예시: 2023년 2월의 작업량
}
},
# 슬레이브 사용자 데이터 예시 (마스터 사용자 정보 참조)
{
"email": "T1Manager@gmail.com",
"username": "테스트1매니저",
"password": "1234",
"userType": "manager",
"master": "testMaster1@gmail.com", # 마스터 사용자 참조
"lastLoginTime": None, # 마지막 로그인 시간
"lastLogoutTime": None, # 마지막 로그아웃 시간
"totalWorkload": 100, # 총 작업량
"weeklyPerformance": { # 주별 성과
"2023-01": 20, # 예시: 2023년 1주차의 작업량
"2023-02": 30, # 예시: 2023년 2주차의 작업량
},
"monthlyPerformance": { # 월별 성과
"2023-01": 50, # 예시: 2023년 1월의 작업량
"2023-02": 50, # 예시: 2023년 2월의 작업량
}
},
{
"email": "testMaster2@gmail.com",
"username": "테스트마스터2",
"password": "1234",
"userType": "master",
"userGrade": 2, # 사용자 등급
"joinDate": now.strftime('%Y-%m-%d %H:%M:%S'), # 가입일자
"planStartDate": (now + timedelta(days=1)).strftime('%Y-%m-%d 00:00'), # 유료 플랜 시작일자
"planEndDate": (now + timedelta(days=31)).strftime('%Y-%m-%d 00:00'), # 유료 플랜 종료일자
"planDurationDays": 30, # 유료 플랜 기간
"lastLoginTime": None, # 마지막 로그인 시간
"lastLogoutTime": None, # 마지막 로그아웃 시간
"totalWorkload": 100, # 총 작업량
"weeklyPerformance": { # 주별 성과
"2023-01": 20, # 예시: 2023년 1주차의 작업량
"2023-02": 30, # 예시: 2023년 2주차의 작업량
},
"monthlyPerformance": { # 월별 성과
"2023-01": 50, # 예시: 2023년 1월의 작업량
"2023-02": 50, # 예시: 2023년 2월의 작업량
}
},
# 슬레이브 사용자 데이터 예시 (마스터 사용자 정보 참조)
{
"email": "T2slave1@gmail.com",
"username": "테스트2슬레이브1",
"password": "1234",
"userType": "slave",
"master": "testMaster2@gmail.com", # 마스터 사용자 참조
"lastLoginTime": None, # 마지막 로그인 시간
"lastLogoutTime": None, # 마지막 로그아웃 시간
"totalWorkload": 100, # 총 작업량
"weeklyPerformance": { # 주별 성과
"2023-01": 20, # 예시: 2023년 1주차의 작업량
"2023-02": 30, # 예시: 2023년 2주차의 작업량
},
"monthlyPerformance": { # 월별 성과
"2023-01": 50, # 예시: 2023년 1월의 작업량
"2023-02": 50, # 예시: 2023년 2월의 작업량
}
},
# 슬레이브 사용자 데이터 예시 (마스터 사용자 정보 참조)
{
"email": "T2slave2@gmail.com",
"username": "테스트2슬레이브2",
"password": "1234",
"userType": "slave",
"master": "testMaster2@gmail.com", # 마스터 사용자 참조
"lastLoginTime": None, # 마지막 로그인 시간
"lastLogoutTime": None, # 마지막 로그아웃 시간
"totalWorkload": 100, # 총 작업량
"weeklyPerformance": { # 주별 성과
"2023-01": 20, # 예시: 2023년 1주차의 작업량
"2023-02": 30, # 예시: 2023년 2주차의 작업량
},
"monthlyPerformance": { # 월별 성과
"2023-01": 50, # 예시: 2023년 1월의 작업량
"2023-02": 50, # 예시: 2023년 2월의 작업량
}
},
# 슬레이브 사용자 데이터 예시 (마스터 사용자 정보 참조)
{
"email": "T2Manager@gmail.com",
"username": "테스트2매니저",
"password": "1234",
"userType": "manager",
"master": "testMaster2@gmail.com", # 마스터 사용자 참조
"lastLoginTime": None, # 마지막 로그인 시간
"lastLogoutTime": None, # 마지막 로그아웃 시간
"totalWorkload": 100, # 총 작업량
"weeklyPerformance": { # 주별 성과
"2023-01": 20, # 예시: 2023년 1주차의 작업량
"2023-02": 30, # 예시: 2023년 2주차의 작업량
},
"monthlyPerformance": { # 월별 성과
"2023-01": 50, # 예시: 2023년 1월의 작업량
"2023-02": 50, # 예시: 2023년 2월의 작업량
}
},
{
"email": "testMaster3@gmail.com",
"username": "테스트마스터3",
"password": "1234",
"userType": "master",
"userGrade": 3, # 사용자 등급
"joinDate": now.strftime('%Y-%m-%d %H:%M:%S'), # 가입일자
"planStartDate": (now + timedelta(days=1)).strftime('%Y-%m-%d 00:00'), # 유료 플랜 시작일자
"planEndDate": (now + timedelta(days=8)).strftime('%Y-%m-%d 00:00'), # 유료 플랜 종료일자
"planDurationDays": 7, # 유료 플랜 기간
"lastLoginTime": None, # 마지막 로그인 시간
"lastLogoutTime": None, # 마지막 로그아웃 시간
"totalWorkload": 100, # 총 작업량
"weeklyPerformance": { # 주별 성과
"2023-01": 20, # 예시: 2023년 1주차의 작업량
"2023-02": 30, # 예시: 2023년 2주차의 작업량
},
"monthlyPerformance": { # 월별 성과
"2023-01": 50, # 예시: 2023년 1월의 작업량
"2023-02": 50, # 예시: 2023년 2월의 작업량
}
},
# 슬레이브 사용자 데이터 예시 (마스터 사용자 정보 참조)
{
"email": "T3slave1@gmail.com",
"username": "테스트3슬레이브1",
"password": "1234",
"userType": "slave",
"master": "testMaster3@gmail.com", # 마스터 사용자 참조
"lastLoginTime": None, # 마지막 로그인 시간
"lastLogoutTime": None, # 마지막 로그아웃 시간
"totalWorkload": 100, # 총 작업량
"weeklyPerformance": { # 주별 성과
"2023-01": 20, # 예시: 2023년 1주차의 작업량
"2023-02": 30, # 예시: 2023년 2주차의 작업량
},
"monthlyPerformance": { # 월별 성과
"2023-01": 50, # 예시: 2023년 1월의 작업량
"2023-02": 50, # 예시: 2023년 2월의 작업량
}
},
# 슬레이브 사용자 데이터 예시 (마스터 사용자 정보 참조)
{
"email": "T3slave2@gmail.com",
"username": "테스트3슬레이브2",
"password": "1234",
"userType": "slave",
"master": "testMaster3@gmail.com", # 마스터 사용자 참조
"lastLoginTime": None, # 마지막 로그인 시간
"lastLogoutTime": None, # 마지막 로그아웃 시간
"totalWorkload": 100, # 총 작업량
"weeklyPerformance": { # 주별 성과
"2023-01": 20, # 예시: 2023년 1주차의 작업량
"2023-02": 30, # 예시: 2023년 2주차의 작업량
},
"monthlyPerformance": { # 월별 성과
"2023-01": 50, # 예시: 2023년 1월의 작업량
"2023-02": 50, # 예시: 2023년 2월의 작업량
}
},
# 슬레이브 사용자 데이터 예시 (마스터 사용자 정보 참조)
{
"email": "T3Manager@gmail.com",
"username": "테스트3매니저",
"password": "1234",
"userType": "manager",
"master": "testMaster3@gmail.com", # 마스터 사용자 참조
"lastLoginTime": None, # 마지막 로그인 시간
"lastLogoutTime": None, # 마지막 로그아웃 시간
"totalWorkload": 100, # 총 작업량
"weeklyPerformance": { # 주별 성과
"2023-01": 20, # 예시: 2023년 1주차의 작업량
"2023-02": 30, # 예시: 2023년 2주차의 작업량
},
"monthlyPerformance": { # 월별 성과
"2023-01": 50, # 예시: 2023년 1월의 작업량
"2023-02": 50, # 예시: 2023년 2월의 작업량
}
}
]
# # 사용자 정보 저장
# for user in users_data:
# user['password'] = generate_password_hash(user['password']) # 비밀번호 해싱
# db.users.insert_one(user)
# 사용자 정보 업데이트 또는 추가
for user in users_data:
user['password'] = generate_password_hash(user['password']) # 비밀번호 해싱
# upsert=True 옵션을 사용하여, 문서가 없으면 추가하고, 있으면 업데이트
db.users.update_one(
{"email": user['email']},
{"$set": user},
upsert=True
)