diff --git a/README.md b/README.md index 431c9c6431beddc0320c35dc9cc2181f844182b9..6d06d0142a0b5a61a7a15de186d161c192f89983 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # 应用管理器 应用管理器,可查看应用包信息,可卸载和打开应用,可在线或离线提取安装包。支持deepin、uos系统。 ## 构建依赖 -debhelper (>= 11),libdtkwidget-dev,libdtkgui-dev,qtbase5-dev,zlib,libgsettings-qt-dev +debhelper (>= 11),libdtkwidget-dev,libdtkgui-dev,qtbase5-dev,zlib1g-dev,libgsettings-qt-dev ## 构建安装 ``` diff --git a/appmanagerjob.cpp b/appmanagerjob.cpp index 1e0b39b76de2d8c7f1ad4f2ae937cf5f651aba66..9a6420130cd27ce90c30f3da27fba8054fef172e 100644 --- a/appmanagerjob.cpp +++ b/appmanagerjob.cpp @@ -383,6 +383,18 @@ void AppManagerJob::uninstallPkg(const QString &pkgName) Q_EMIT uninstallPkgFinished(pkgName); } +void AppManagerJob::installOhMyDDE() +{ + bool successed = installLocalPkg(OH_MY_DDE_LOCAL_PKG_PATH); + Q_EMIT installOhMyDDEFinished(successed); +} + +void AppManagerJob::installProcInfoPlugin() +{ + bool successed = installLocalPkg(PROC_INFO_PLUGIN_LOCAL_PKG_PATH); + Q_EMIT installProcInfoPluginFinished(successed); +} + QList AppManagerJob::readSourceUrlList(const QString &filePath) { QList sourceUrlList; @@ -430,7 +442,8 @@ void AppManagerJob::reloadSourceUrlList() } // 从包信息列表文件中获取应用信息列表 -bool AppManagerJob::getPkgInfoListFromFile(QList &pkgInfoList, const QString &pkgInfosFilePath) +// isCompact : 是否获取简洁信息 +bool AppManagerJob::getPkgInfoListFromFile(QList &pkgInfoList, const QString &pkgInfosFilePath, bool isCompact) { // 从文件名中获取仓库网址, // 如:/var/lib/apt/lists/pools.uniontech.com_ppa_dde-eagle_dists_eagle_1041_main_binary-amd64_Packages @@ -464,30 +477,105 @@ bool AppManagerJob::getPkgInfoListFromFile(QList &pkgInfoList, const QS PkgInfo pkgInfo; QTextStream txtStrem(&pkgInfosFile); - bool isReadingFirstApp = true; + qint64 lastPkgContentOffset = 0; qint64 contentOffset = 0; - while (!pkgInfosFile.atEnd()) { - if (!isReadingFirstApp && 0 == pkgInfo.contentOffset) { - pkgInfo.contentOffset = contentOffset; - } + bool isReadingDescription = false; - const QByteArray ba = pkgInfosFile.readLine(); - contentOffset += ba.size(); + // 是否获取简洁信息 + if (isCompact) { + while (!pkgInfosFile.atEnd()) { + const QByteArray ba = pkgInfosFile.readLine(); + contentOffset += ba.size(); - QString lineText = QString::fromUtf8(ba).remove("\n"); - if (lineText.startsWith("Package: ")) { - pkgInfo.pkgName = lineText.split(": ").last(); - continue; + QString lineText = QString::fromUtf8(ba).remove("\n"); + if (lineText.startsWith("Package: ")) { + pkgInfo.pkgName = lineText.split(": ").last(); + continue; + } + + // 检测到下一包信息 + if (lineText.isEmpty()) { + pkgInfo.infosFilePath = pkgInfosFilePath; + pkgInfo.depositoryUrl = depositoryUrlStr; + pkgInfo.contentOffset = contentOffset; + pkgInfo.contentSize = contentOffset - lastPkgContentOffset; + lastPkgContentOffset = contentOffset; + pkgInfoList.append(pkgInfo); + pkgInfo = {}; + } } + } else { + while (!pkgInfosFile.atEnd()) { + const QByteArray ba = pkgInfosFile.readLine(); + contentOffset += ba.size(); - // 检测到下一包信息 - if (lineText.isEmpty()) { - pkgInfo.infosFilePath = pkgInfosFilePath; - pkgInfo.depositoryUrl = depositoryUrlStr; - pkgInfo.contentSize = contentOffset - pkgInfo.contentOffset; - pkgInfoList.append(pkgInfo); - pkgInfo = {}; - isReadingFirstApp = false; + QString lineText = QString::fromUtf8(ba).remove("\n"); + if (lineText.startsWith("Package: ")) { + pkgInfo.pkgName = lineText.split(": ").last(); + continue; + } + + if (lineText.startsWith("Installed-Size: ")) { + pkgInfo.installedSize = lineText.split(": ").last().toInt(); + continue; + } + if (lineText.startsWith("Maintainer: ")) { + pkgInfo.maintainer = lineText.split(": ").last(); + continue; + } + if (lineText.startsWith("Architecture: ")) { + pkgInfo.arch = lineText.split(": ").last(); + continue; + } + if (lineText.startsWith("Version: ")) { + pkgInfo.version = lineText.split(": ").last(); + continue; + } + if (lineText.startsWith("Depends: ")) { + pkgInfo.depends = lineText.split(": ").last(); + continue; + } + if (lineText.startsWith("Filename: ")) { + const QString downloadFileName = lineText.split(": ").last(); + pkgInfo.downloadUrl = QString("%1/%2").arg(pkgInfo.depositoryUrl).arg(downloadFileName); + continue; + } + if (lineText.startsWith("Size: ")) { + pkgInfo.pkgSize = lineText.split(": ").last().toInt(); + continue; + } + + if (lineText.startsWith("Homepage: ")) { + pkgInfo.homepage = lineText.split(": ").last(); + continue; + } + + + if (lineText.startsWith("Description: ")) { + pkgInfo.description = lineText.split(": ").last(); + pkgInfo.description.append("\n"); + isReadingDescription = true; + continue; + } + if (lineText.startsWith(" ") && isReadingDescription) { + pkgInfo.description += lineText; + continue; + } + if (lineText.startsWith("Build-Depends: ")) { + isReadingDescription = false; + continue; + } + + // 检测到下一包信息 + if (lineText.isEmpty()) { + pkgInfo.infosFilePath = pkgInfosFilePath; + pkgInfo.depositoryUrl = depositoryUrlStr; + pkgInfo.contentOffset = contentOffset; + pkgInfo.contentSize = contentOffset - lastPkgContentOffset; + lastPkgContentOffset = contentOffset; + pkgInfoList.append(pkgInfo); + pkgInfo = {}; + } } } pkgInfosFile.close(); @@ -500,7 +588,7 @@ bool AppManagerJob::getPkgInfoListFromFile(QList &pkgInfoList, const QS void AppManagerJob::loadSrvAppInfosFromFile(QMap &appInfosMap, const QString &pkgInfosFilePath) { QList pkgInfoList; - getPkgInfoListFromFile(pkgInfoList, pkgInfosFilePath); + getPkgInfoListFromFile(pkgInfoList, pkgInfosFilePath, true); qInfo() << Q_FUNC_INFO << pkgInfosFilePath << pkgInfoList.size(); for (const PkgInfo &pkgInfo : pkgInfoList) { @@ -876,3 +964,29 @@ bool AppManagerJob::buildPkg(const AppInfo &info) return true; } + +bool AppManagerJob::installLocalPkg(const QString &path) +{ + QProcess *proc = new QProcess(this); + proc->start("pkexec", {"dpkg", "-i", path}); + proc->waitForStarted(); + proc->write("Y\n"); + proc->waitForFinished(); + proc->waitForReadyRead(); + + QString error = proc->readAllStandardError(); + if (!error.isEmpty()) { + qInfo() << Q_FUNC_INFO << QString("install %1 failed! ").arg(path) << error; + + proc->close(); + proc->deleteLater(); + proc = nullptr; + return false; + } + + proc->close(); + proc->deleteLater(); + proc = nullptr; + + return true; +} diff --git a/appmanagerjob.h b/appmanagerjob.h index 13de6a276bb47fb77cd91730e808792a6b70cc7c..40f167e0a42b3ba42853a10d1e38af8c54195cae 100644 --- a/appmanagerjob.h +++ b/appmanagerjob.h @@ -13,6 +13,12 @@ class QFile; class QStandardItemModel; QT_END_NAMESPACE +#define OH_MY_DDE_PKG_NAME "top.yzzi.youjian" +#define PROC_INFO_PLUGIN_PKG_NAME "com.github.proc-info-plugin" +// 本地安装包路径 +#define OH_MY_DDE_LOCAL_PKG_PATH "/opt/apps/com.github.ccc-app-manager/files/pkg/top.yzzi.youjian_1.0.3_amd64.deb" +#define PROC_INFO_PLUGIN_LOCAL_PKG_PATH "/opt/apps/com.github.ccc-app-manager/files/pkg/com.github.proc-info-plugin_0.0.1_amd64.deb" + class AppManagerJob : public QObject { Q_OBJECT @@ -45,6 +51,8 @@ public Q_SLOTS: void createListViewMode(const QList &list); void uninstallPkg(const QString &pkgName); + void installOhMyDDE(); + void installProcInfoPlugin(); Q_SIGNALS: void loadAppInfosFinished(); @@ -60,12 +68,14 @@ Q_SIGNALS: void uninstallPkgFinished(const QString &pkgName); // 构建安装包任务完成 void buildPkgTaskFinished(bool successed, const AM::AppInfo &info); + void installOhMyDDEFinished(bool successed); + void installProcInfoPluginFinished(bool successed); private: QList readSourceUrlList(const QString &filePath); void reloadSourceUrlList(); // 从包信息列表文件中获取包信息列表 - bool getPkgInfoListFromFile(QList &pkgInfoList, const QString &pkgInfosFilePath); + bool getPkgInfoListFromFile(QList &pkgInfoList, const QString &pkgInfosFilePath, bool isCompact = false); // 从包信息列表中加载仓库应用信息列表 void loadSrvAppInfosFromFile(QMap &appInfosMap, const QString &pkgInfosFilePath); @@ -82,6 +92,8 @@ private: QStandardItemModel *getItemModelFromAppInfoList(const QList &appInfoList); // 构建安装包任务 bool buildPkg(const AM::AppInfo &info); + // 安全本地软件包 + bool installLocalPkg(const QString &path); private: QMutex m_mutex; diff --git a/appmanagermodel.cpp b/appmanagermodel.cpp index 2695326ccd4367674d0061232dc341115a54e442..8f1086e35907f45da17a79882babcf10e4600928 100644 --- a/appmanagermodel.cpp +++ b/appmanagermodel.cpp @@ -1,5 +1,4 @@ #include "appmanagermodel.h" -#include "appmanagerjob.h" #include #include #include @@ -200,6 +199,27 @@ bool AppManagerModel::extendPkgInfo(PkgInfo &pkgInfo) return true; } +bool AppManagerModel::isPkgInstalled(const QString &pkgName) +{ + const QList &appList = m_appManagerJob->getAppInfosMap().values(); + for (QList::const_iterator iter = appList.cbegin(); + iter != appList.cend(); ++iter) { + if (!iter->isInstalled) { + continue; + } + if (pkgName == iter->pkgName) { + return true; + } + } + + return false; +} + +AppInfo AppManagerModel::getAppInfo(const QString &pkgName) +{ + return m_appManagerJob->getAppInfosMap().value(pkgName); +} + void AppManagerModel::initData() { // 注册结构体 @@ -252,6 +272,14 @@ void AppManagerModel::initConnection() connect(this, &AppManagerModel::notifyThreadBuildPkg, m_appManagerJob, &AppManagerJob::startBuildPkgTask); // 构建安装包任务完成 connect(m_appManagerJob, &AppManagerJob::buildPkgTaskFinished, this, &AppManagerModel::buildPkgTaskFinished); + // 通知安装oh-my-dde + connect(this, &AppManagerModel::notifyThreadInstallOhMyDDE, m_appManagerJob, &AppManagerJob::installOhMyDDE); + // 安装oh-my-dde完成 + connect(m_appManagerJob, &AppManagerJob::installOhMyDDEFinished, this, &AppManagerModel::installOhMyDDEFinished); + // 通知安装proc-info-plugin + connect(this, &AppManagerModel::notifyThreadInstallProcInfoPlugin, m_appManagerJob, &AppManagerJob::installProcInfoPlugin); + // 安装proc-info-plugin完成 + connect(m_appManagerJob, &AppManagerJob::installProcInfoPluginFinished, this, &AppManagerModel::installProcInfoPluginFinished); } void AppManagerModel::postInit() diff --git a/appmanagermodel.h b/appmanagermodel.h index 15a3de20163bebb3508169572cb5ece5eeacb501..8142d7f6f894ba947723e298b4fc67e94e5ad4c9 100644 --- a/appmanagermodel.h +++ b/appmanagermodel.h @@ -1,12 +1,11 @@ #pragma once #include "appmanagercommon.h" +#include "appmanagerjob.h" #include #include -class AppManagerJob; - class QStandardItemModel; #define APP_TYPE_INSTALLED 0 // 应用类型-已安装 @@ -35,6 +34,10 @@ public: QString getPkgBuildDirPath() const; // 拓展包信息 bool extendPkgInfo(AM::PkgInfo &pkgInfo); + // 软件包是否已安装 + bool isPkgInstalled(const QString &pkgName); + // 获取应用信息 + AM::AppInfo getAppInfo(const QString &pkgName); Q_SIGNALS: void notifyThreadreloadAppInfos(); @@ -55,6 +58,14 @@ Q_SIGNALS: void notifyThreadBuildPkg(const AM::AppInfo &info); // 构建安装包任务完成 void buildPkgTaskFinished(bool successed, const AM::AppInfo &info); + // 通知安装oh-my-dde + void notifyThreadInstallOhMyDDE(); + // 安装oh-my-dde完成 + void installOhMyDDEFinished(bool successed); + // 通知安装proc-info-plugin + void notifyThreadInstallProcInfoPlugin(); + // 安装proc-info-plugin完成 + void installProcInfoPluginFinished(bool successed); private: void initData(); diff --git a/appmanagerwidget.cpp b/appmanagerwidget.cpp index ae112cb8c8c2c21f654b187f664019f910a612f5..3569f062acf73a32a5dc76990a31511c61fb6174 100644 --- a/appmanagerwidget.cpp +++ b/appmanagerwidget.cpp @@ -287,9 +287,9 @@ AppManagerWidget::AppManagerWidget(AppManagerModel *model, QWidget *parent) }); connect(openBtn, &QPushButton::clicked, this, [this](bool) { - QString cmd = m_showingAppInfo.desktopInfo.exec; QProcess proc; - proc.startDetached(cmd); + proc.startDetached("dex", {m_showingAppInfo.desktopInfo.desktopPath}); + proc.close(); }); connect(m_infoSwitchBtn, &DButtonBox::buttonClicked, this, [this](QAbstractButton *btn) { @@ -384,13 +384,6 @@ void AppManagerWidget::showAppInfo(const AppInfo &info) { m_showingAppInfo = info; - // 拓展已安装应用信息 - if (m_showingAppInfo.isInstalled) { - if (!m_model->extendPkgInfo(m_showingAppInfo.installedPkgInfo)) { - return; - } - } - // 拓展仓库应用信息 for (PkgInfo &srvPkgInfo : m_showingAppInfo.pkgInfoList) { if (!m_model->extendPkgInfo(srvPkgInfo)) { diff --git a/build-package/build.sh b/build-package/build.sh index 0e172dcb75fbd4b70fc9c7bd5bf14a90c6823273..602f5c1075241e7eb4fe19f1820d42069f999d5d 100755 --- a/build-package/build.sh +++ b/build-package/build.sh @@ -1,7 +1,7 @@ #!/bin/bash ###############设定编译变量 -VERSION="0.0.4-t1" +VERSION="0.0.5-t1" echo "build.sh修改自柚柚的 https://gitee.com/deepin-opensource/one-cuter" @@ -43,7 +43,7 @@ echo "未安装依赖:qtbase5-dev 本脚本退出" exit 0 fi -DEPEND=`dpkg -l | grep zlib` +DEPEND=`dpkg -l | grep zlib1g-dev` if [ "$DEPEND" = "" ] ; then echo "未安装依赖:zlib 本脚本退出" exit 0 @@ -102,7 +102,7 @@ Version: $VERSION Architecture: $ARCH Maintainer: keke <243768648@qq.com> Installed-Size: $SIZE -Depends: libc6 (>= 2.28), libgcc1 (>= 1:3.4) | libgcc-s1(>=12), libgl1, libqt5core5a (>= 5.11.0~rc1), libqt5gui5 (>= 5.8.0), libqt5network5 (>= 5.0.2), libqt5widgets5 (>= 5.0.2), libdtkcore5 (>= 5.4), libdtkgui5 (>= 5.4), libdtkwidget5 (>= 5.4) +Depends: libc6 (>= 2.28), libgcc1 (>= 1:3.4) | libgcc-s1(>=12), libgl1, libqt5core5a (>= 5.11.0~rc1), libqt5gui5 (>= 5.8.0), libqt5network5 (>= 5.0.2), libqt5widgets5 (>= 5.0.2), libdtkcore5 (>= 5.4), libdtkgui5 (>= 5.4), libdtkwidget5 (>= 5.4), dex Description: manage your applications. 应用管理器,可查看应用包信息,可卸载和打开应用,可在线或离线提取安装包。支持deepin、uos系统。 Homepage: https://gitee.com/ct243768648/ccc-app-manager diff --git a/build-package/pkg/opt/apps/com.github.ccc-app-manager/files/pkg/com.github.proc-info-plugin_0.0.1_amd64.deb b/build-package/pkg/opt/apps/com.github.ccc-app-manager/files/pkg/com.github.proc-info-plugin_0.0.1_amd64.deb new file mode 100644 index 0000000000000000000000000000000000000000..b61cba646b3bf19036b1800d5fd193ac45b9476f Binary files /dev/null and b/build-package/pkg/opt/apps/com.github.ccc-app-manager/files/pkg/com.github.proc-info-plugin_0.0.1_amd64.deb differ diff --git a/build-package/pkg/opt/apps/com.github.ccc-app-manager/files/pkg/top.yzzi.youjian_1.0.3_amd64.deb b/build-package/pkg/opt/apps/com.github.ccc-app-manager/files/pkg/top.yzzi.youjian_1.0.3_amd64.deb new file mode 100644 index 0000000000000000000000000000000000000000..356e20c7176c508e18e11d2636f00a2de698564b Binary files /dev/null and b/build-package/pkg/opt/apps/com.github.ccc-app-manager/files/pkg/top.yzzi.youjian_1.0.3_amd64.deb differ diff --git a/ccc-app-manager.pro b/ccc-app-manager.pro index 92f834e69b21caaf5fecc06b76090c4b4aa607ce..ecebfdafbf6160e0d6323b0ecacebc8f55ced83f 100644 --- a/ccc-app-manager.pro +++ b/ccc-app-manager.pro @@ -54,7 +54,10 @@ opt_desktop.path = /opt/apps/com.github.ccc-app-manager/entries usr_desktop.files = ./com.github.ccc-app-manager.desktop usr_desktop.path = /usr/share/applications -INSTALLS += target icon opt_desktop usr_desktop +pkg.files = ./pkg/* +pkg.path = /opt/apps/com.github.ccc-app-manager/files/pkg + +INSTALLS += target icon opt_desktop usr_desktop pkg RESOURCES += \ resources/icons.qrc diff --git a/debian/control b/debian/control index ba79b5666025a3ffa83096dbe90e9c045a69bcd3..6242d8bae25c69bd80b6546e39cc4e118d3e5644 100644 --- a/debian/control +++ b/debian/control @@ -5,12 +5,13 @@ Installed-Size: 3985 Maintainer: keke <243768648@qq.com> Architecture: amd64 Version: 0.0.4 -Depends: libc6 (>= 2.28), libgcc1 (>= 1:3.4), libgl1, libqt5core5a (>= 5.11.0~rc1), libqt5gui5 (>= 5.8.0), libqt5network5 (>= 5.0.2), libqt5widgets5 (>= 5.0.2), libdtkcore5 (>= 5.4), libdtkgui5 (>= 5.4), libdtkwidget5 (>= 5.4) +Depends: libc6 (>= 2.28), libgcc1 (>= 1:3.4), libgl1, libqt5core5a (>= 5.11.0~rc1), libqt5gui5 (>= 5.8.0), libqt5network5 (>= 5.0.2), libqt5widgets5 (>= 5.0.2), libdtkcore5 (>= 5.4), libdtkgui5 (>= 5.4), libdtkwidget5 (>= 5.4), dex Build-Depends: debhelper (>= 11), libdtkwidget-dev, libdtkgui-dev, qtbase5-dev, - zlib1g-dev + zlib1g-dev, + libgsettings-qt-dev Description: manage your applications. 应用管理器,可查看应用包信息,可卸载和打开应用,可在线或离线提取安装包。支持deepin、uos系统。 Homepage: https://gitee.com/ct243768648/ccc-app-manager diff --git a/mainwindow.cpp b/mainwindow.cpp index 43c795a141e329eb4f7ed3948b9f38f3de4849c5..58d8a93863a1d7073acc219d4690978651bbd44f 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -17,7 +18,8 @@ MainWindow::MainWindow(QWidget *parent) , m_centralWidgetBlurBg(nullptr) , m_isDeepin(false) { - setMinimumSize(1000, 600); + setMinimumSize(500, 300); + resize(1000, 600); // 设置背景 setTitlebarShadowEnabled(false); setFocusPolicy(Qt::FocusPolicy::ClickFocus); @@ -34,6 +36,14 @@ MainWindow::MainWindow(QWidget *parent) watchGuiAppListAction->setText("复制启动器中所有应用包名"); menu->addAction(watchGuiAppListAction); + QAction *openOhMyDDEAction = new QAction(this); + openOhMyDDEAction->setText("打开oh-my-dde"); + menu->addAction(openOhMyDDEAction); + + QAction *openProInfoWindowAction = new QAction(this); + openProInfoWindowAction->setText("打开进程信息窗口"); + menu->addAction(openProInfoWindowAction); + m_centralWidgetBlurBg = new DBlurEffectWidget(this); m_centralWidgetBlurBg->setBlendMode(DBlurEffectWidget::BlendMode::BehindWindowBlend); m_centralWidgetBlurBg->setMaskAlpha(100); @@ -87,10 +97,42 @@ MainWindow::MainWindow(QWidget *parent) dlg->addContent(edit); dlg->setWindowOpacity(0.7); - dlg->exec(); dlg->deleteLater(); }); + connect(openOhMyDDEAction, &QAction::triggered, this, [appManagerModel](bool checked) { + Q_UNUSED(checked); + if (appManagerModel->isPkgInstalled(OH_MY_DDE_PKG_NAME)) { + QProcess::startDetached("dex", {appManagerModel->getAppInfo(OH_MY_DDE_PKG_NAME).desktopInfo.desktopPath}); + } else { + // 安装 + DDialog dlg; + dlg.setMessage("是否安装oh-my-dde?"); + dlg.addButton("是", true, DDialog::ButtonType::ButtonRecommend); + dlg.addButton("否", false, DDialog::ButtonType::ButtonNormal); + int ret = dlg.exec(); + if (0 == ret) { + Q_EMIT appManagerModel->notifyThreadInstallOhMyDDE(); + } + } + }); + + connect(openProInfoWindowAction, &QAction::triggered, this, [appManagerModel](bool checked) { + Q_UNUSED(checked); + if (appManagerModel->isPkgInstalled(PROC_INFO_PLUGIN_PKG_NAME)) { + QProcess::startDetached("dex", {appManagerModel->getAppInfo(PROC_INFO_PLUGIN_PKG_NAME).desktopInfo.desktopPath}); + } else { + // 安装 + DDialog dlg; + dlg.setMessage("是否安装dde进程信息插件?"); + dlg.addButton("是", true, DDialog::ButtonType::ButtonRecommend); + dlg.addButton("否", false, DDialog::ButtonType::ButtonNormal); + int ret = dlg.exec(); + if (0 == ret) { + Q_EMIT appManagerModel->notifyThreadInstallProcInfoPlugin(); + } + } + }); // post init if (m_isDeepin) { diff --git a/pkg/com.github.proc-info-plugin_0.0.1_amd64.deb b/pkg/com.github.proc-info-plugin_0.0.1_amd64.deb new file mode 100644 index 0000000000000000000000000000000000000000..b61cba646b3bf19036b1800d5fd193ac45b9476f Binary files /dev/null and b/pkg/com.github.proc-info-plugin_0.0.1_amd64.deb differ diff --git a/pkg/top.yzzi.youjian_1.0.3_amd64.deb b/pkg/top.yzzi.youjian_1.0.3_amd64.deb new file mode 100644 index 0000000000000000000000000000000000000000..356e20c7176c508e18e11d2636f00a2de698564b Binary files /dev/null and b/pkg/top.yzzi.youjian_1.0.3_amd64.deb differ