#include "sysusermgtv1.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "sysusermgtv1thread.h" SysUserMgtV1::SysUserMgtV1(const QString &iModuleNameStr, const QVariantMap iUrlPars, QWidget *iParent) :TopClassAbs(iParent) { this->appendLanguage("sys-userv1"); this->setLicenseKey("sys_common"); this->initModule(iModuleNameStr, iUrlPars); mCenterSplitter = new TSplitter(this); this->setCentralWidget(mCenterSplitter); initNaviView(); initTableView(); initDetailView(); mCenterSplitter->setStretchFactor(0, 1); this->restoreSizeState(); this->restoreObjectState(mTableView); // 刷新action 同时会执行selectitems iscanmodified refreshActionState(); //页面 刷新 时间0 QTimer::singleShot(0, this, SLOT(refresh())); } SysUserMgtV1::~SysUserMgtV1() { this->saveSizeState(); this->saveObjectState(mTableView); } //ui模块 void SysUserMgtV1::initNaviView() { //设置伸缩部件 TAccordion *accordion = new TAccordion(this); accordion->setObjectName("__navi__"); accordion->setProperty("SS_BG","NAVI"); accordion->setMinimumWidth(TTHEME_DP(config("navi.min_width", 150).toInt())); accordion->setMaximumWidth(TTHEME_DP(config("navi.max_width", 300).toInt())); accordion->setAccordionLocation(TAccordion::AccordionLocation::Left); //设置导航栏伸缩按钮 accordion->expandButton()->setFixedHeight(TTHEME_DP(40)); accordion->expandButton()->setToolTip(ttr("Show Navigation")); accordion->collapseButton()->setToolTip(ttr("Hide Navigation")); accordion->setIsExpanded(true); //设置导航栏主布局开始 包含label spacing空白 naviwidget QVBoxLayout *naviLayout = new QVBoxLayout(accordion); naviLayout->setMargin(0); naviLayout->setSpacing(0); //设置导航栏顶部label 伸缩按钮区域 显示导航栏文本 QLabel *naviLabel = new QLabel(ttr("Navigation")); naviLabel->setProperty("SS_TYPE", "SUBHEADER"); naviLayout->addWidget(naviLabel, 0); naviLayout->addSpacing(TTHEME_DP(4)); //ui界面与按钮窗口 QFrame *naviWidget = new QFrame(this); naviLayout->addWidget(naviWidget); //垂直布局left包含ui解析窗口 与按钮布局 QVBoxLayout *leftLayout = new QVBoxLayout(naviWidget); //新建ui解析窗口 mNaviView = new TUiLoader(this); mNaviView->setSelf(this); mNaviView->setScriptEngine(APP->scriptEngine()); mNaviView->setUiStr(ui("navi").toString()); leftLayout->addWidget(mNaviView); QHBoxLayout *btnsLayout = new QHBoxLayout(); btnsLayout->setMargin(0); btnsLayout->setSpacing(10); leftLayout->addLayout(btnsLayout); //设置取消按钮 QPushButton *resetBtn = new QPushButton(this); connect(resetBtn, SIGNAL(clicked(bool)), this, SLOT(onNaviReset())); resetBtn->setText(ttr("Cancel")); resetBtn->setIcon(TRES->icon("rotate-right")); btnsLayout->addWidget(resetBtn); //设置确定按钮 QPushButton *filterBtn = new QPushButton(this); connect(filterBtn, SIGNAL(clicked(bool)), this, SLOT(refresh())); filterBtn->setText(ttr("Ok")); filterBtn->setIcon(TRES->icon("filter")); btnsLayout->addWidget(filterBtn); //添加弹簧均分 leftLayout->addStretch(config("navi.is_expanded", false).toBool()); //添加进入主窗体 mCenterSplitter->insertWidget(0, accordion); } void SysUserMgtV1::initTableView() { //新建表格窗口mbodywidget mBodyWidget = new QWidget(this); //表格窗口mbodywidget添加垂直布局vboxlayout QVBoxLayout *vboxlayout = new QVBoxLayout(mBodyWidget); //垂直布局设置边距与空白 vboxlayout->setMargin(10); vboxlayout->setSpacing(10); //新加表格视图mtableview mTableView = new TTableView(this); //新建表头 空白无内容 mTableConf = new TopClassTableConf; //把view里面的键值对给到mTableConf TopClassHelper::parseTableConf0(this, "view", mTableConf); //给表格头添加文字 QVariantList headerItem = mTableConf->horizontalHeaders; headerItem.prepend(QVariant()); //将表头添加进表格中 mTableView->setHeaderItem(headerItem); // 给表设置键和主键 mTableView->setDataKeyList(mTableConf->dataKeys); mTableView->setPrimaryKey(mTableConf->primaryKey); //创建连接,当用户点击表头图标时,切换数据的正序反序排列顺序 QHeaderView *horizontaHeaderView = mTableView->horizontalHeader(); //点击表头排序功能 connect(horizontaHeaderView, SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)), this, SLOT(refresh())); //添加 搜索按钮工具TSearchEntry if (QToolBar *toolbar = qobject_cast(uim()->getWidget("MAIN_TOOLBAR"))) { toolbar->setWindowTitle(ttr("ToolBar")); vboxlayout->addWidget(toolbar, 0); mSearchEntry = qobject_cast(uim()->getWidget("MAIN_TOOLBAR/SEARCH_ENTRY")); } //表格窗口mbodywidget添加mTableview vboxlayout->addWidget(mTableView, 1); //添加 翻页按钮工具TpageTool if (QToolBar *toolbar = qobject_cast(uim()->getWidget("BOTTOM_TOOLBAR"))) { vboxlayout->addWidget(toolbar, 2); mPageTool = qobject_cast(uim()->getWidget("BOTTOM_TOOLBAR/PAGE_TOOL")); } //功能 //点击事件切换功能 connect(mTableView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(onSelectionChanged())); //添加 右键弹窗工具 if (QMenu *table_popup = qobject_cast(uim()->getWidget("TABLEVIEW_POPUP"))) { mTableView->setContextMenu(table_popup); } //添加 双击打开功能 关联action的open功能 if (QAction *openAct = this->getAction("open")) { connect(mTableView, SIGNAL(activated(QModelIndex)), openAct, SLOT(trigger())); } //实现翻页按钮的翻页功能 if (mPageTool != nullptr) { mPageTool->setPageSizeVisible(true); connect(mPageTool, SIGNAL(pageChanged(int,int)), this, SLOT(onPageChanged())); } //实现搜索框中的搜索功能 if (mSearchEntry != nullptr) { mSearchEntry->setOptionList(TDataParse::headerItem2searchList(mTableView->headerItem())); mSearchEntry->setPlaceholderText(ttr("Search %1")); connect(mSearchEntry, SIGNAL(search(QString,QVariant)), this, SLOT(refresh())); this->setFocusProxy(mSearchEntry); } //切割界面添加第三窗口mtableview mCenterSplitter->addWidget(mBodyWidget); } void SysUserMgtV1::initDetailView() { //加载配置 QString detailModuleName = config("detail_module_name").toString(); if (detailModuleName.isEmpty()) { //现在给detailModuleName取名为sys-userv1 detailModuleName = "sys-userv1"; } mDetailView = new SysUserV1(detailModuleName, config(), this); //功能 connect(mDetailView, SIGNAL(dataSaved(QVariant)), this, SLOT(onDetailSaved(QVariant))); connect(mDetailView, SIGNAL(windowModifyChanged(bool)), SLOT(onDetailChanged())); mDetailView->resize(TTHEME_DP(config("detail.perfect_size.width", mDetailView->perfectSize().width()).toInt()), mDetailView->height()); mCenterSplitter->addWidget(mDetailView); } //点击事件模块 void SysUserMgtV1::onSelectionChanged() { if (mTableView != nullptr) { //因为Action的State函数中用到getSelectedList, 所以TableView选择更改时, //将其保存至mSelectedLst中 mSelectedLst = mTableView->selectedPrimaryKeys(); int curIdInt = 0; if (!mSelectedLst.isEmpty()) { curIdInt = mSelectedLst.value(0).toInt(); } if (mDetailView->uid().toInt() != curIdInt) { //设置详情模块的上次Uid为当前选择的ID, 这样当如果详情模块处于编辑状态时点取消后显示的当前择的条目内容; mDetailView->setLastUid(curIdInt); if (!mDetailView->isDataModified()) { mDetailView->setUid(curIdInt); } } refreshActionState(); } } //刷新action模块 //detelet也会用到,构造函数,newitem,onselectionchangged,ondetailchangged QVariantList SysUserMgtV1::selectedItems() { return mSelectedLst; } bool SysUserMgtV1::canModify() { //例如 当datamoifed处于修改 则不可切换 取相反 return !mDetailView->isDataModified(); } //页面变化覆盖模块 void SysUserMgtV1::onDetailChanged(){ bool isModified = mDetailView->isDataModified(); mTableView->setEnabled(!isModified); if (isModified) { this->showMaskFrame(mBodyWidget); } else { if (mCenterSplitter->sizes().value(0) < 20) { mCenterSplitter->setWidgetSize(0, mCenterSplitter->getCacheSize(0), true); } this->hideMaskFrame(); } refreshActionState(); } //刷新与搜索模块 触发uidchanged void SysUserMgtV1::refresh(bool iResetPageBol) { t::loading(this); TSqlSelectorV2 selector = getSqlSelector(iResetPageBol); QVariant data = doThreadWork(new TopClassSqlThread(this), TOPSQLTHREAD_SELECT_ARRAYMAP, QVariant::fromValue(selector)); unloading(); TDataResponse dataRes(data.toMap()); if (dataRes.hasError()) { alertError(ttr("Load data failed!")); } else { fillTableData(dataRes); alertOk(ttr("Data loaded")); } mDetailView->setUid(0); } TSqlSelectorV2 SysUserMgtV1::getSqlSelector(bool iResetPageBol) { TSqlSelectorV2 selector; if (!mTableConf->dbSql.isEmpty()) { selector.setTable(QString("(%1) _TEMP_TABLE_").arg(mTableConf->dbSql)); } else { selector.setTable(mTableConf->dbTableName); } selector.setReturnRowCount(true); selector.setField(mTableConf->queryFields); TopClassHelper::handleSearchPageOnQuery(mSearchEntry, mPageTool, iResetPageBol, &selector); if (mNaviView != nullptr && !uiloaderWhere().isEmpty()) { selector.addWhere(uiloaderWhere()); } selector.setOrder("id", Qt::DescendingOrder); QHeaderView *headerView = mTableView->horizontalHeader(); if (headerView != nullptr) { //sortIndicatorSectiond点击表头进行排序 QString orderField = mTableView->columnName(headerView->sortIndicatorSection()); if (!orderField.isEmpty() && orderField != "remark") { TopClassHelper::handleOrderOnQuery(mTableView, mTableConf, &selector); } } return selector; } QString SysUserMgtV1::uiloaderWhere() { //获取搜索限制条件 auto filterDataMap = mNaviView->getAllValues().toVariant().toMap(); QString searchSql; QMapIterator iter(filterDataMap); while (iter.hasNext()) { iter.next(); QString key = iter.key(); QString value = iter.value().toString(); if (value.isEmpty()) { continue; } auto obj = mNaviView->getObject(key); if (obj != nullptr) { QVariantMap userData = obj->property("tui_user_data").toMap(); if (userData.contains("field_name")) { key = userData.value("field_name").toString(); } QString operatorStr = "="; if (userData.contains("operator")) { operatorStr = userData.value("operator").toString(); } if (operatorStr.compare("like", Qt::CaseInsensitive) == 0 || operatorStr.compare("ilike", Qt::CaseInsensitive) == 0) { value = QString("'%%1%'").arg(value); } else if (operatorStr.compare("in", Qt::CaseInsensitive) == 0) { value = QString("(%1)").arg(value); } else { if (iter.value().type() == QVariant::String) { value = QString("'%1'").arg(value); } } QString searchStr = QString("%1 %2 %3").arg(key).arg(operatorStr).arg(value); if (!searchSql.isEmpty()) { searchSql.append(" and "); } searchSql.append(searchStr); } } return searchSql; } void SysUserMgtV1::fillTableData(const TDataResponse &iDataRes) { if (mPageTool != nullptr) { mPageTool->setRowCount(iDataRes.dataCount(), true); } QVariantList dataLst = iDataRes.data().toList(); TopClassHelper::formatTableData(this, mTableConf, dataLst); mTableView->loadData(dataLst); } //新建模块 同时触发内容页变化detailchanged覆盖 void SysUserMgtV1::newItem() { mCenterSplitter->cacheSizes(); mDetailView->create(); mDetailView->refreshActionState(); } //删除模块 void SysUserMgtV1::deleteItem(const QVariantList &iIdLst) { //不能删除当前登陆的用户 if (selectedNames().contains(APP->userName())) { alertError(ttr("Current login user can not be deleted!")); return; } //不能删除admin if (selectedNames().contains("admin",Qt::CaseInsensitive)) { alertError(ttr("Admin can not be deleted!")); return; } QVariant data = doThreadWork(new SysUserMgtV1Thread(this), "DELETE_USER", iIdLst); TDataResponse dataRes(data.toMap()); if (dataRes.hasError()) { alertError(ttr("Delete data failed!"), dataRes.errText()); } else { refresh(true); alertOk(ttr("Data deleted")); } } QStringList SysUserMgtV1::selectedNames() { QStringList retLst; for (QVariant item : mTableView->selectedRowDataMaps()) { retLst << item.toMap().value("username").toString(); } return retLst; } //保存按钮模块 void SysUserMgtV1::onDetailSaved(const QVariant &iUidStr) { this->refresh(false); mTableView->selectRow(iUidStr); } //导航栏取消按钮 void SysUserMgtV1::onNaviReset() { mNaviView->clearValues(); refresh(true); } //翻页功能 void SysUserMgtV1::onPageChanged() { refresh(false); }