diff --git a/DOCS/.keep b/DOCS/.keep
deleted file mode 100644
index e69de29..0000000
diff --git a/DOCS/code-analyze.md b/DOCS/code-analyze.md
deleted file mode 100644
index 4bad78a..0000000
--- a/DOCS/code-analyze.md
+++ /dev/null
@@ -1,328 +0,0 @@
-
-#### 说明
-
-当前服务器线路列表(项目中包含):
-
-```
-https://d.store.deepinos.org.cn/
-https://store.deepinos.org.cn/
-```
-
-
-
-
-
-
-# 星火应用商店文档
-
-# 目录结构
-几个目录结构
-```
-/
-/icons 图标文件夹       
-/tags 首页图标      
-/tras 多语言翻译        
-```
-
-主要的文件分析
-```js
-spark-store.pro Qt工程配置文件
-ssinstall 调用包安装器的脚本
-icons.qrc 图标资源文件  
-main.cpp 入口文件
-widget.h widget.cpp widget.ui 主要窗口控件
-downloadlist.h downloadlist.cpp downloadlist.ui 单个软件的下载安装展示控件      
-progressload.h progressload.cpp 网页加载显示? 得在deepin上编译运行才能搞清楚   
-workerthreads.h workerthreads.cpp 应用信息加载线程      
-image_show.h image_show.cpp 应用页面截图预览控件    
-big_image.h big_image.cpp 大图查看控件      
-```
-
-# 使用的开源库及第三方工具
-* GDebi 一个 Ubuntu 软件中心的轻量级替代品 https://linux.cn/article-4982-1.html
-* libnotify 系统通知 https://developer.gnome.org/libnotify/unstable/
-
-
-# 源码分析
-## 应用的组成部分
-左侧应用分类菜单
-主窗口的下拉菜单
-应用列表页面
-应用详情页面
-应用首页,有几个链接跳转        
-商店设置页面
-下载列表页面    
-
-## 应用初始化,及主控件加载
-初始化 `DApplication` 进入事件循环。        
-设置关于我们弹窗 `DAboutDialog`。       
-主控件 Widget 根据不同屏幕大小自适应。  
-首页打开webview页面,如果传入了`spk://`参数,会打开应用详情页。 
-```cpp
-// main.cpp
-QString arg1=argv[1];
-if(arg1.left(6)=="spk://"){
-    w.openUrl(QUrl(argv[1]));
-}
-
-// widget.cpp
-void Widget::openUrl(QUrl u)
-{
-    QString app=serverUrl + "store"+u.path()+"/app.json";
-    ui->webEngineView->setUrl(app); // 会触发 webEngineView 的
-}
-
-```
-## Tags处理方式
-
-**Tags处理方式**
-```cpp
-// widget.cpp
-QString tags=json["Tags"].toString(); //Read the Tags
-        QStringList tagList=tags.split(";");
-        for (int i=0;i<tagList.size();i++) {
-            if(tagList[i]=="community")
-                ui->tag_community->show();//Tags icon shows like this
-            if(tagList[i]=="ubuntu")
-                ui->tag_ubuntu->show();
-            if(tagList[i]=="deepin")
-                ui->tag_deepin->show();
-            if(tagList[i]=="uos")
-                ui->tag_uos->show();
-            if(tagList[i]=="dtk5")
-                ui->tag_dtk5->show();
-            if(tagList[i]=="dwine2")
-                ui->tag_dwine2->show();
-            if(tagList[i]=="dwine5")
-                ui->tag_dwine5->show();
-            if(tagList[i]=="a2d")
-                ui->tag_a2d->show();
-        }
-```
-
-**Widget 初始化**
-```cpp
-void Widget::initConfig()
-{
-    ...
-    // 读取服务器URL并初始化菜单项的链接
-    QSettings readConfig(QDir::homePath()+"/.config/spark-store/config.ini",QSettings::IniFormat);
-    if(readConfig.value("server/choose").toString()!=""){
-        ui->comboBox_server->setCurrentText(readConfig.value("server/choose").toString());
-        appinfoLoadThread.setServer(serverUrl=readConfig.value("server/choose").toString());
-    }else {
-        appinfoLoadThread.setServer(serverUrl="http://sucdn.jerrywang.top/");  // 默认URL
-    }
-    configCanSave=true;   // 防止触发保存配置信号
-    menuUrl[0]=serverUrl + "store/#/"; // 首页
-    // 下面是各个应用分类页面,直接加载的webview的
-    // 每个连接对应一个左侧的菜单项,在构造函数用连接到 chooseLeftMenu 槽函数
-    menuUrl[1]=serverUrl + "store/#/network";
-    ...
-    menuUrl[12]=serverUrl + "store/#/others";
-    ...
-    ui->webfoot->hide();
-
-    //初始化首页
-    ui->webEngineView->setUrl(menuUrl[0]);
-}
-/**
- * 菜单切换逻辑
- * 
- */ 
-void Widget::chooseLeftMenu(int index)
-{
-    nowMenu=index;
-    updateUI();
-    left_list[index]->setStyleSheet("color:#FFFFFF;background-color:"+main_color.name()+";border-radius:8;border:0px");
-    // index <=12 加载某个分类的应用列表的webviejw
-    // index == 13 加载下载列表页面
-    if(index<=12){
-        if(themeIsDark){
-            darkurl = 夜间模式的URL
-            ui->webEngineView->setUrl(darkurl);
-        }else {
-            ui->webEngineView->setUrl(menuUrl[index]);
-        }
-        ui->stackedWidget->setCurrentIndex(0);
-    }else if (index==13) {
-        ui->stackedWidget->setCurrentIndex(1);
-    }
-}
-```
-
-## 应用下载安装卸载分析
-**应用详情页面加载**
-```cpp
-/**
- * 加载单个应用的信息
- */ 
-void Widget::on_webEngineView_urlChanged(const QUrl &arg1)
-{
-    //分析出服务器中的分类名称
-    ...
-    //如果是app.json就打开详情页
-    if(arg1.path().right(8)=="app.json"){
-        ...
-        // 读取相应的应用信息
-        appinfoLoadThread.requestInterruption();
-        appinfoLoadThread.wait(100);
-        appinfoLoadThread.setUrl(arg1);
-        appinfoLoadThread.start();
-    }
-}
-// 设置详情页的APP信息 
-SpkAppInfoLoaderThread::requestSetAppInformation() -> Widget::sltAppinfoDetails()
-// 设置详情页的APP图标
-SpkAppInfoLoaderThread::finishedIconLoad() -> Widget::sltAppinfoIcon()
-// 设置详情页的APP截图
-SpkAppInfoLoaderThread::finishedScreenshotLoad() -> Widget::sltAppinfoScreenshot()
-
-// 下载APP详情信息线程
-void SpkAppInfoLoaderThread::run()
-{
-    QProcess get_json;
-    get_json.start("curl -o app.json " + targetUrl.toString());
-    QFile app_json("app.json");
-    读取 app.json 里的信息,提取应用名、描述、图标、截图  
-    处理完毕后发射相应的信号    
-}
-```
-
-
-**应用下载**		
-Widget::on_pushButton_download_clicked() 是点击下载的安装方法。     
-最终使用的是 `QNetwrokAccessManager` 进行GET请求获取数据写入文件。             
-```cpp
-void Widget::on_pushButton_download_clicked()
-{
-    if(!isBusy){
-        file = new QFile(fileName);
-        ...
-        nowDownload+=1;
-        startRequest(urList.at(nowDownload-1)); // 进行链接请求
-    }
-}
-void Widget::startRequest(QUrl url)
-{
-    reply = manager->get(QNetworkRequest(url));
-    // 请求响应完成,关闭文件,清理下载队列
-    connect(reply,SIGNAL(finished()),this,SLOT(httpFinished())); 
-    // 接收应用下载数据
-    connect(reply,SIGNAL(readyRead()),this,SLOT(httpReadyRead())); 
-    // 更新应用下载进度
-    connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(updateDataReadProgress(qint64,qint64)));
-}
-```
-
-使用 QSettings 来读取配置,更换服务源
-```cpp
-void Widget::on_comboBox_server_currentIndexChanged(const QString &arg1)
-{
-    appinfoLoadThread.setServer(arg1); // 服务器信息更新
-    if(configCanSave){
-        ui->label_setting1->show();
-        QSettings *setConfig=new QSettings(QDir::homePath()+"/.config/spark-store/config.ini",QSettings::IniFormat);
-        setConfig->setValue("server/choose",arg1);
-    }
-}
-```
-使用 `QProcess` 来调用各种小文件下载、包安装卸载的命令。    
-
-**应用安装**        
-```cpp
-void Widget::httpFinished() // 完成下载
-{
-    ...清理资源
-    download_list[nowDownload-1].readyInstall();
-    download_list[nowDownload-1].free=true;
-    if(nowDownload<allDownload){    // 如果有排队则下载下一个
-        ...队列的下一个下载请求
-    }
-}
-void downloadlist::readyInstall()
-{
-    ...将安装按钮设置为允许点击
-    ui->pushButton_install->setEnabled(true);
-    ui->pushButton_install->show();
-    ui->pushButton_2->hide();
-    Widget::sendNotification(tr("Finished downloading %1, awaiting to install").arg(ui->label->text()), 5000,
-                                    "/tmp/spark-store/icon_"+QString::number(num).toUtf8()+".png");
-}
-void downloadlist::on_pushButton_install_clicked()
-{
-    //弹出菜单
-    menu_install->exec(cursor().pos());
-}
-在 downloadlist 构造函数里将三种安装方式的按钮按条件放入了 menu_install 菜单里  
-用户点击时,downloadlist::install() 方法
-三种安装方式为: gdebi, dpkg, deepin-deb-installer  
-void downloadlist::install(int t)
-{
-    QtConcurrent::run([=](){
-        QProcess installer;
-        installer.start("pkexec gdebi -n /tmp/spark-store/"+ui->label_filename->text().toUtf8());
-        installer.start("pkexec ssinstall /tmp/spark-store/"+ui->label_filename->text().toUtf8());
-        installer.start("deepin-deb-installer /tmp/spark-store/"+ui->label_filename->text().toUtf8());
-    });
-}
-```
-
-**应用卸载**
-```cpp
-void Widget::on_pushButton_uninstall_clicked()
-{
-    QtConcurrent::run([=](){
-        uninstall.start("pkexec apt purge -y "+pkgName);
-    });
-}
-```
-
-**仓库源更新**      
-```cpp
-// 更新源列表
-void Widget::on_pushButton_updateServer_clicked()
-{
-    QtConcurrent::run([=](){
-        ...
-        QFile::remove(QDir::homePath().toUtf8()+"/.config/spark-store/server.list");
-        system("curl -o "+QDir::homePath().toUtf8()+"/.config/spark-store/server.list http://dcstore.shenmo.tech/store/server.list");
-        server.open(QDir::homePath().toUtf8()+"/.config/spark-store/server.list",std::ios::in);
-        ...
-        while (getline(server,lineTmp)) {
-            ui->comboBox_server->addItem(QString::fromStdString(lineTmp));
-        }
-    });
-}
-// 更新星火商店apt源    
-void Widget::on_pushButton_updateApt_clicked()
-{
-    QtConcurrent::run([=](){
-        读取 comboBox_server 的内容,写入 /tmp/spark-store/sparkstore.list 文件
-        创建bash脚本,内容为将 sparkstore.list 移动到  /etc/apt/sources.list.d/ 目录下
-        使用QProcess 执行命令 pkexec update.sh
-    }):
-}
-```
-
-## 发送系统通知     
-```cpp
-#include <libnotify/notify.h>
-
-static NotifyNotification *_notify = nullptr; // 初始化
-notify_init(tr("Spark\\ Store").toLocal8Bit()); // 构造函数初始化
-notify_uninit(); // 析构函数调用 
-
-void Widget::sendNotification(const QString &message, const int msTimeout, const QString &icon)
-{
-    if(_notify == nullptr)
-    {
-        _notify = notify_notification_new(tr("Spark\\ Store").toLocal8Bit(), message.toLocal8Bit(), icon.toLocal8Bit());
-        notify_notification_set_timeout(_notify, msTimeout);
-    }
-    else
-        notify_notification_update(_notify, tr("Spark\\ Store").toLocal8Bit(), message.toLocal8Bit(), icon.toLocal8Bit());
-
-    notify_notification_show(_notify, nullptr);
-}
-```
diff --git a/DOCS/spk-doc.md b/DOCS/spk-doc.md
deleted file mode 100644
index a3c4e6d..0000000
--- a/DOCS/spk-doc.md
+++ /dev/null
@@ -1,25 +0,0 @@
-#### 调用参数(spk规则)
-
-参数只有一个Url,该url应当遵循这种格式:`spk://<任意合法字符>/web分类/包名`
-
-例如:
-
-[spk://abcdefg/games/store.spark-app.hmcl](spk://abcdefg/games/store.spark-app.hmcl)
-
-
-可选的web分类:
-
-| 分类名称 | web分类        |
-| -------- | -------------- |
-| 网络应用 | network        |
-| 社交沟通 | chat           |
-| 音乐欣赏 | music          |
-| 视频播放 | video          |
-| 图形图像 | graphics       |
-| 游戏娱乐 | games          |
-| 办公学习 | office         |
-| 阅读翻译 | reading        |
-| 编程开发 | development    |
-| 系统工具 | tools          |
-| 主题美化 | beautify       |
-| 其他应用 | others         |
diff --git a/LICENSE b/LICENSE
index 94a9ed0..818433e 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,674 +1,674 @@
-                    GNU GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                            Preamble
-
-  The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
-  The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works.  By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users.  We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors.  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
-  To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights.  Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received.  You must make sure that they, too, receive
-or can get the source code.  And you must show them these terms so they
-know their rights.
-
-  Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
-  For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software.  For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
-  Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so.  This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software.  The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable.  Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products.  If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
-  Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary.  To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-                       TERMS AND CONDITIONS
-
-  0. Definitions.
-
-  "This License" refers to version 3 of the GNU General Public License.
-
-  "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
-  "The Program" refers to any copyrightable work licensed under this
-License.  Each licensee is addressed as "you".  "Licensees" and
-"recipients" may be individuals or organizations.
-
-  To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy.  The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
-  A "covered work" means either the unmodified Program or a work based
-on the Program.
-
-  To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy.  Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
-  To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies.  Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
-  An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License.  If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
-  1. Source Code.
-
-  The "source code" for a work means the preferred form of the work
-for making modifications to it.  "Object code" means any non-source
-form of a work.
-
-  A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
-  The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form.  A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
-  The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities.  However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work.  For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
-  The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
-  The Corresponding Source for a work in source code form is that
-same work.
-
-  2. Basic Permissions.
-
-  All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met.  This License explicitly affirms your unlimited
-permission to run the unmodified Program.  The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work.  This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
-  You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force.  You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright.  Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
-  Conveying under any other circumstances is permitted solely under
-the conditions stated below.  Sublicensing is not allowed; section 10
-makes it unnecessary.
-
-  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
-  No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
-  When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
-  4. Conveying Verbatim Copies.
-
-  You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
-  You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
-  5. Conveying Modified Source Versions.
-
-  You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
-    a) The work must carry prominent notices stating that you modified
-    it, and giving a relevant date.
-
-    b) The work must carry prominent notices stating that it is
-    released under this License and any conditions added under section
-    7.  This requirement modifies the requirement in section 4 to
-    "keep intact all notices".
-
-    c) You must license the entire work, as a whole, under this
-    License to anyone who comes into possession of a copy.  This
-    License will therefore apply, along with any applicable section 7
-    additional terms, to the whole of the work, and all its parts,
-    regardless of how they are packaged.  This License gives no
-    permission to license the work in any other way, but it does not
-    invalidate such permission if you have separately received it.
-
-    d) If the work has interactive user interfaces, each must display
-    Appropriate Legal Notices; however, if the Program has interactive
-    interfaces that do not display Appropriate Legal Notices, your
-    work need not make them do so.
-
-  A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit.  Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
-  6. Conveying Non-Source Forms.
-
-  You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
-    a) Convey the object code in, or embodied in, a physical product
-    (including a physical distribution medium), accompanied by the
-    Corresponding Source fixed on a durable physical medium
-    customarily used for software interchange.
-
-    b) Convey the object code in, or embodied in, a physical product
-    (including a physical distribution medium), accompanied by a
-    written offer, valid for at least three years and valid for as
-    long as you offer spare parts or customer support for that product
-    model, to give anyone who possesses the object code either (1) a
-    copy of the Corresponding Source for all the software in the
-    product that is covered by this License, on a durable physical
-    medium customarily used for software interchange, for a price no
-    more than your reasonable cost of physically performing this
-    conveying of source, or (2) access to copy the
-    Corresponding Source from a network server at no charge.
-
-    c) Convey individual copies of the object code with a copy of the
-    written offer to provide the Corresponding Source.  This
-    alternative is allowed only occasionally and noncommercially, and
-    only if you received the object code with such an offer, in accord
-    with subsection 6b.
-
-    d) Convey the object code by offering access from a designated
-    place (gratis or for a charge), and offer equivalent access to the
-    Corresponding Source in the same way through the same place at no
-    further charge.  You need not require recipients to copy the
-    Corresponding Source along with the object code.  If the place to
-    copy the object code is a network server, the Corresponding Source
-    may be on a different server (operated by you or a third party)
-    that supports equivalent copying facilities, provided you maintain
-    clear directions next to the object code saying where to find the
-    Corresponding Source.  Regardless of what server hosts the
-    Corresponding Source, you remain obligated to ensure that it is
-    available for as long as needed to satisfy these requirements.
-
-    e) Convey the object code using peer-to-peer transmission, provided
-    you inform other peers where the object code and Corresponding
-    Source of the work are being offered to the general public at no
-    charge under subsection 6d.
-
-  A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
-  A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling.  In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage.  For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product.  A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
-  "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source.  The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
-  If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information.  But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
-  The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed.  Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
-  Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
-  7. Additional Terms.
-
-  "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law.  If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
-  When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it.  (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.)  You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
-  Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
-    a) Disclaiming warranty or limiting liability differently from the
-    terms of sections 15 and 16 of this License; or
-
-    b) Requiring preservation of specified reasonable legal notices or
-    author attributions in that material or in the Appropriate Legal
-    Notices displayed by works containing it; or
-
-    c) Prohibiting misrepresentation of the origin of that material, or
-    requiring that modified versions of such material be marked in
-    reasonable ways as different from the original version; or
-
-    d) Limiting the use for publicity purposes of names of licensors or
-    authors of the material; or
-
-    e) Declining to grant rights under trademark law for use of some
-    trade names, trademarks, or service marks; or
-
-    f) Requiring indemnification of licensors and authors of that
-    material by anyone who conveys the material (or modified versions of
-    it) with contractual assumptions of liability to the recipient, for
-    any liability that these contractual assumptions directly impose on
-    those licensors and authors.
-
-  All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10.  If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term.  If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
-  If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
-  Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
-  8. Termination.
-
-  You may not propagate or modify a covered work except as expressly
-provided under this License.  Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
-  However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
-  Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
-  Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License.  If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
-  9. Acceptance Not Required for Having Copies.
-
-  You are not required to accept this License in order to receive or
-run a copy of the Program.  Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance.  However,
-nothing other than this License grants you permission to propagate or
-modify any covered work.  These actions infringe copyright if you do
-not accept this License.  Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
-  10. Automatic Licensing of Downstream Recipients.
-
-  Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License.  You are not responsible
-for enforcing compliance by third parties with this License.
-
-  An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations.  If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
-  You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License.  For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
-  11. Patents.
-
-  A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based.  The
-work thus licensed is called the contributor's "contributor version".
-
-  A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version.  For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
-  Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
-  In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement).  To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
-  If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients.  "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
-  If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
-  A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License.  You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
-  Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
-  12. No Surrender of Others' Freedom.
-
-  If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all.  For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
-  13. Use with the GNU Affero General Public License.
-
-  Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work.  The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
-  14. Revised Versions of this License.
-
-  The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-  Each version is given a distinguishing version number.  If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation.  If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
-  If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
-  Later license versions may give you additional or different
-permissions.  However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
-  15. Disclaimer of Warranty.
-
-  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. Limitation of Liability.
-
-  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
-  17. Interpretation of Sections 15 and 16.
-
-  If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
-                     END OF TERMS AND CONDITIONS
-
-            How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-Also add information on how to contact you by electronic and paper mail.
-
-  If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
-    <program>  Copyright (C) <year>  <name of author>
-    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
-  You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-<http://www.gnu.org/licenses/>.
-
-  The GNU General Public License does not permit incorporating your program
-into proprietary programs.  If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library.  If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.  But first, please read
-<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/README.en.md b/README.en.md
new file mode 100644
index 0000000..478bed6
--- /dev/null
+++ b/README.en.md
@@ -0,0 +1,39 @@
+<p align="center">
+<img src="/raw/master/pkg/usr/share/icons/hicolor/scalable/apps/spark-store.svg" height=200 width=200/>
+</p>
+
+<div align="center">
+
+# Spark App Store
+
+The `Spark App Store` is now designed for Linux!
+
+
+</div>
+
+---
+
+As we all know, there are few Linux applications in our country, wine applications are hard to get, high-quality tools are scattered in various folk forums, unable to form synergy, difficult to improve the ecology
+Ecological construction does not need one party to fight alone, but everyone to act, gather sparks, resulting in a prairie fire
+
+We created this app store, which includes a wide range of software packages we need, a collection of quality widgets, an active adaptation of wine apps, and a repository for everyone to access
+
+We support: Deepin 20; Ubuntu 20.04LTS; UOS Home 20
+
+We’d love to see some of you join us as well, and we’d love to help build the Linux application ecosystem
+
+
+
+## 🙌 A simple start
+
+
+If you want to install the `Spark App Store`, open the [Release] page on the right, find the latest version, and select the installation package that works for your current system.
+
+
+
+**Watch** project to get updates on the application.
+
+
+## 🚀 Collaboration
+
+Many thanks to interested developers or enthusiasts for participating in the Spark App Store project and sharing your insights and ideas.
\ No newline at end of file
diff --git a/README.md b/README.md
index a713d35..51be455 100644
--- a/README.md
+++ b/README.md
@@ -1,73 +1,36 @@
-#  Spark App Store
-[![star](https://gitee.com/deepin-community-store/spark-store/badge/star.svg?theme=gvp)](https://gitee.com/deepin-community-store/spark-store/stargazers)  [![fork](https://gitee.com/deepin-community-store/spark-store/badge/fork.svg?theme=gvp)](https://gitee.com/deepin-community-store/spark-store/members)
-
-Spark Store aims to collect Linux apps for the convieniece of Linux new comers
-
-The collecting process needs everyone's help
-
-We set up this APP Store and collect APPs/tools that everyone need widely. Also we pack Windows apps with wine. 
-
-All packages will be shared in our repository for users to get freely. 
-
-Distrobution supported:Deepin 20 ; Ubuntu 22.04 LTS / Ubuntu 20.04 LTS(May stop support in the future) ; UniontechOS Home 21
-
-*About OpenKylin and deepin 23*
-
-The adaptation work is scheduled after their official release.
-
-You can track our Issue resoving progress here  https://gitee.com/deepin-community-store/spark-store/board
-
-
-We hope people who see here can also join our team,development help or submit applications are welcomed
-
-If you want to submit an APP to share with others,Please [Click here](https://upload.deepinos.org/index)
-
-
-## 🙌 A simple start
-
-If you simply want to install the Spark Store,just enter the  [Release] page, find the version you want and install.
-
-If you are using Debian11/Ubuntu 20.04, you will need extra dependency package. Available [here](https://code.gitlink.org.cn/shenmo7192/spark-store-dependencies/raw/branch/master/spark-store-dependencies-kylin.zip)
-
----
-#### Compile and developement
-
-
-For Deepin V20/UOS 21/ Debian 11
-
-```shell
-sudo apt install git qt5-default debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev  libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev
-
-```
-
-Ubuntu 22.04
-```shell
-sudo apt install git qtbase5-dev debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev  libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev
-
-```
-
-Then
-
-```shell
-git clone https://gitee.com/deepin-community-store/spark-store.git
-cd spark-store
-dpkg-buildpackage
-```
-
-
-
-## 🚀 Coorperation
-
-We use Gitee as our code hosting platform. Please click here to contact us. 
-
-https://gitee.com/deepin-community-store/spark-store
-
-### Rocket Chat
-
-https://chat.shenmo.tech/
-
-PWA Client:
-
-spk://store/chat/store.spark-app.feedback
-
-(Copy and paste to search bar or in browser address bar after installing Spark Store)
\ No newline at end of file
+<p align="center">
+<img src="/raw/master/pkg/usr/share/icons/hicolor/scalable/apps/spark-store.svg" height=200 width=200/>
+</p>
+
+<div align="center">
+
+# 星火应用商店
+
+`星火应用商店` 现在为 Linux 设计!
+  
+
+</div>
+
+---
+
+众所周知,国内的Linux应用比较少,wine应用难以获取,优质工具分散在民间各大论坛,无法形成合力,难以改善生态
+
+生态构建需要的不是某一方的单打独斗,而是人人行动起来,汇聚星火,产生燎原之势
+
+我们创建了这个应用商店,广泛收录大家需要的软件包,搜集优质小工具,主动适配wine应用,存放到储存库供大家获取
+
+我们支持:Deepin 20 ; Ubuntu 20.04 LTS ; UOS Home 20
+
+希望看到这里的人也可以加入我们的队伍,开发或者投递应用都很欢迎,共同构建Linux应用生态
+
+
+## 🙌 简单的开始
+
+如果想安装 `星火应用商店` ,请打开右侧的 [Release] 页面,找到最新版本,并选择适用于当前系统的安装包下载。
+
+
+**Watch** 项目,以获取应用的更新动态。
+
+## 🚀 协作
+
+非常感谢有兴趣的开发者或爱好者参与 `星火应用商店` 项目,分享你的见解与思路。
\ No newline at end of file
diff --git a/README.zh.md b/README.zh.md
deleted file mode 100644
index 4a452df..0000000
--- a/README.zh.md
+++ /dev/null
@@ -1,66 +0,0 @@
-#  星火应用商店
-[![star](https://gitee.com/deepin-community-store/spark-store/badge/star.svg?theme=gvp)](https://gitee.com/deepin-community-store/spark-store/stargazers)  [![fork](https://gitee.com/deepin-community-store/spark-store/badge/fork.svg?theme=gvp)](https://gitee.com/deepin-community-store/spark-store/members)
-
-众所周知,国内的Linux应用比较少,wine应用难以获取,优质工具分散在民间各大论坛,无法形成合力,难以改善生态
-
-生态构建需要的不是某一方的单打独斗,而是人人行动起来,汇聚星火,产生燎原之势
-
-我们创建了这个应用商店,广泛收录大家需要的软件包,搜集优质小工具,主动适配wine应用,存放到储存库供大家获取
-我们支持:Deepin 20 ; Ubuntu 22.04 LTS / Ubuntu 20.04 LTS(将会逐渐停止支持) ; UOS Home 21
-
-*关于OpenKylin和deepin 23*
-
-支持计划将会在对应系统发布正式版之后开始评估和执行
-
-希望看到这里的人也可以加入我们的队伍,开发或者投递应用都很欢迎,共同构建Linux应用生态
-
-在这里追踪我们的Issue处理情况 https://gitee.com/deepin-community-store/spark-store/board
-
-如果有想要提交的软件包,请 [在这里投稿](https://upload.deepinos.org/index)
-
-
-## 🙌 简单的开始
-
-如果想安装 `星火应用商店` ,请打开右侧的 [Release] 页面,找到最新版本,并选择适用于当前系统的安装包下载。
-
-如果你在使用 `Debian 11/Ubuntu 20.04`,你需要额外下载[依赖补充包](https://code.gitlink.org.cn/shenmo7192/spark-store-dependencies/raw/branch/master/spark-store-dependencies-kylin.zip)
-
----
-#### 编译安装
-
-
-Deepin V20/UOS 21 系统下, 安装依赖
-
-```shell
-sudo apt install git qt5-default debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev  libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev fakeroot
-
-```
-
-Ubuntu 22.04 系统下, 安装依赖
-```shell
-sudo apt install git qtbase5-dev debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev  libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev
-
-```
-
-然后
-```shell
-git clone https://gitee.com/deepin-community-store/spark-store.git
-cd spark-store
-dpkg-buildpackage
-```
-
-
-
-## 🚀 协作
-
-非常感谢有兴趣的开发者或爱好者参与 `星火应用商店` 项目,分享你的见解与思路。
-
-### 交流平台
-
-https://chat.shenmo.tech/
-
-客户端PWA:
-
-spk://store/chat/store.spark-app.feedback
-
-(安装星火商店后在浏览器打开或复制到搜索栏打开)
\ No newline at end of file
diff --git a/assets/fonts/Yukarimobile.ttf b/assets/fonts/Yukarimobile.ttf
deleted file mode 100644
index 2e6b6b1..0000000
Binary files a/assets/fonts/Yukarimobile.ttf and /dev/null differ
diff --git a/assets/fonts/hksnzt.ttf b/assets/fonts/hksnzt.ttf
deleted file mode 100644
index 9550d5c..0000000
Binary files a/assets/fonts/hksnzt.ttf and /dev/null differ
diff --git a/assets/icons.qrc b/assets/icons.qrc
deleted file mode 100644
index 6014540..0000000
--- a/assets/icons.qrc
+++ /dev/null
@@ -1,61 +0,0 @@
-<RCC>
-    <qresource prefix="/icons">
-        <file>icons/category_chat_dark.svg</file>
-        <file>icons/category_chat.svg</file>
-        <file>icons/category_develop_dark.svg</file>
-        <file>icons/category_develop.svg</file>
-        <file>icons/category_game_dark.svg</file>
-        <file>icons/category_game.svg</file>
-        <file>icons/category_graphic_dark.svg</file>
-        <file>icons/category_graphic.svg</file>
-        <file>icons/category_music_dark.svg</file>
-        <file>icons/category_music.svg</file>
-        <file>icons/category_network_dark.svg</file>
-        <file>icons/category_network.svg</file>
-        <file>icons/category_office_dark.svg</file>
-        <file>icons/category_office.svg</file>
-        <file>icons/category_others_dark.svg</file>
-        <file>icons/category_others.svg</file>
-        <file>icons/category_reading_dark.svg</file>
-        <file>icons/category_reading.svg</file>
-        <file>icons/category_system_dark.svg</file>
-        <file>icons/category_system.svg</file>
-        <file>icons/category_video_dark.svg</file>
-        <file>icons/category_video.svg</file>
-        <file>icons/downloads-symbolic_dark.svg</file>
-        <file>icons/downloads-symbolic.svg</file>
-        <file>icons/theme-symbolic_dark.svg</file>
-        <file>icons/theme-symbolic.svg</file>
-        <file>icons/homepage.svg</file>
-        <file>icons/homepage_dark.svg</file>
-        <file>icons/category_active_dark.svg</file>
-        <file>icons/category_active.svg</file>
-        <file>icons/refresh-page-dark.svg</file>
-        <file>icons/refresh-page.svg</file>
-        <file>icons/upgrades-symbolic_dark.svg</file>
-        <file>icons/upgrades-symbolic.svg</file>
-    </qresource>
-    <qresource prefix="/">
-        <file>tags/a2d.png</file>
-        <file>tags/community.svg</file>
-        <file>tags/deepin.svg</file>
-        <file>tags/logo_icon.svg</file>
-        <file>tags/uos-authorize.svg</file>
-        <file>tags/a2d-small.png</file>
-        <file>tags/community-small.png</file>
-        <file>tags/deepin-small.png</file>
-        <file>tags/dtk-small.png</file>
-        <file>tags/uos-small.png</file>
-        <file>tags/community.png</file>
-        <file>tags/ubuntu-small.png</file>
-        <file>tags/ubuntu.png</file>
-        <file>tags/dwine5-small.png</file>
-        <file>tags/dwine5.svg</file>
-        <file>tags/dwine2-small.png</file>
-        <file>spark-store.png</file>
-        <file>spark-logo.svg</file>
-    </qresource>
-    <qresource prefix="/fonts">
-        <file>fonts/hksnzt.ttf</file>
-    </qresource>
-</RCC>
diff --git a/assets/icons/category_active.svg b/assets/icons/category_active.svg
deleted file mode 100644
index a21fda9..0000000
--- a/assets/icons/category_active.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-  <path fill="#536076" d="M10.138807,3.52000025 L10.138,12.5230002 L14.6066017,8.05523757 L15.3137085,8.76234435 L9.65685425,14.4191986 L4,8.76234435 L4.70710678,8.05523757 L9.138,12.4870002 L9.138807,3.52000025 L10.138807,3.52000025 Z" transform="rotate(90 9.657 11.518)"/>
-</svg>
diff --git a/assets/icons/category_active_dark.svg b/assets/icons/category_active_dark.svg
deleted file mode 100644
index a21fda9..0000000
--- a/assets/icons/category_active_dark.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-  <path fill="#536076" d="M10.138807,3.52000025 L10.138,12.5230002 L14.6066017,8.05523757 L15.3137085,8.76234435 L9.65685425,14.4191986 L4,8.76234435 L4.70710678,8.05523757 L9.138,12.4870002 L9.138807,3.52000025 L10.138807,3.52000025 Z" transform="rotate(90 9.657 11.518)"/>
-</svg>
diff --git a/assets/icons/category_chat.svg b/assets/icons/category_chat.svg
deleted file mode 100644
index e7c8d01..0000000
--- a/assets/icons/category_chat.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
-  <path fill-rule="evenodd" d="M0.09791679,7.31479943 C0.09791679,3.53173257 3.65198565,0.5 8,0.5 C12.3485596,0.5 15.9020832,3.53150012 15.9020832,7.31479943 C15.9020832,11.0972813 12.3485704,14.127954 8,14.127954 C7.06316558,14.127954 6.1471898,13.9862478 5.28311727,13.7134084 L2.55321759,15.327403 C2.15529088,15.5626687 1.67860204,15.1782665 1.82419813,14.7395213 L2.62951677,12.3127412 C1.03368368,11.0385392 0.09791679,9.24513974 0.09791679,7.31479943 Z M4.7455,6.9148 C4.7455,6.2248 4.1855,5.6648 3.4955,5.6648 C2.8055,5.6648 2.2455,6.2248 2.2455,6.9148 C2.2455,7.6048 2.8055,8.1648 3.4955,8.1648 C4.1855,8.1648 4.7455,7.6048 4.7455,6.9148 Z M9.2504,6.9148 C9.2504,6.2248 8.6904,5.6648 8.0004,5.6648 C7.3104,5.6648 6.7504,6.2248 6.7504,6.9148 C6.7504,7.6048 7.3104,8.1648 8.0004,8.1648 C8.6904,8.1648 9.2504,7.6048 9.2504,6.9148 Z M13.766,6.9148 C13.766,6.2248 13.206,5.6648 12.516,5.6648 C11.826,5.6648 11.266,6.2248 11.266,6.9148 C11.266,7.6048 11.826,8.1648 12.516,8.1648 C13.206,8.1648 13.766,7.6048 13.766,6.9148 Z"/>
-</svg>
diff --git a/assets/icons/category_chat_dark.svg b/assets/icons/category_chat_dark.svg
deleted file mode 100644
index af65c4c..0000000
--- a/assets/icons/category_chat_dark.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
-  <path fill="#FFF" fill-opacity=".6" fill-rule="evenodd" d="M0.09791679,7.31479943 C0.09791679,3.53173257 3.65198565,0.5 8,0.5 C12.3485596,0.5 15.9020832,3.53150012 15.9020832,7.31479943 C15.9020832,11.0972813 12.3485704,14.127954 8,14.127954 C7.06316558,14.127954 6.1471898,13.9862478 5.28311727,13.7134084 L2.55321759,15.327403 C2.15529088,15.5626687 1.67860204,15.1782665 1.82419813,14.7395213 L2.62951677,12.3127412 C1.03368368,11.0385392 0.09791679,9.24513974 0.09791679,7.31479943 Z M4.7455,6.9148 C4.7455,6.2248 4.1855,5.6648 3.4955,5.6648 C2.8055,5.6648 2.2455,6.2248 2.2455,6.9148 C2.2455,7.6048 2.8055,8.1648 3.4955,8.1648 C4.1855,8.1648 4.7455,7.6048 4.7455,6.9148 Z M9.2504,6.9148 C9.2504,6.2248 8.6904,5.6648 8.0004,5.6648 C7.3104,5.6648 6.7504,6.2248 6.7504,6.9148 C6.7504,7.6048 7.3104,8.1648 8.0004,8.1648 C8.6904,8.1648 9.2504,7.6048 9.2504,6.9148 Z M13.766,6.9148 C13.766,6.2248 13.206,5.6648 12.516,5.6648 C11.826,5.6648 11.266,6.2248 11.266,6.9148 C11.266,7.6048 11.826,8.1648 12.516,8.1648 C13.206,8.1648 13.766,7.6048 13.766,6.9148 Z"/>
-</svg>
diff --git a/assets/icons/category_develop.svg b/assets/icons/category_develop.svg
deleted file mode 100644
index d2e646b..0000000
--- a/assets/icons/category_develop.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
-  <path fill-rule="evenodd" d="M3,2 L13,2 C14.1045695,2 15,2.8954305 15,4 L15,12 C15,13.1045695 14.1045695,14 13,14 L3,14 C1.8954305,14 1,13.1045695 1,12 L1,4 C1,2.8954305 1.8954305,2 3,2 Z M3.76776695,5.35355339 L6.03553391,7.62132034 L3.76776695,9.8890873 L4.47487373,10.5961941 L7.44974747,7.62132034 L4.47487373,4.64644661 L3.76776695,5.35355339 Z M5.91666667,12 L11.0833333,12 L11.0833333,11 L5.91666667,11 L5.91666667,12 Z"/>
-</svg>
diff --git a/assets/icons/category_develop_dark.svg b/assets/icons/category_develop_dark.svg
deleted file mode 100644
index 0d40bfe..0000000
--- a/assets/icons/category_develop_dark.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
-  <path fill="#FFF" fill-opacity=".6" fill-rule="evenodd" d="M3,2 L13,2 C14.1045695,2 15,2.8954305 15,4 L15,12 C15,13.1045695 14.1045695,14 13,14 L3,14 C1.8954305,14 1,13.1045695 1,12 L1,4 C1,2.8954305 1.8954305,2 3,2 Z M3.76776695,5.35355339 L6.03553391,7.62132034 L3.76776695,9.8890873 L4.47487373,10.5961941 L7.44974747,7.62132034 L4.47487373,4.64644661 L3.76776695,5.35355339 Z M5.91666667,12 L11.0833333,12 L11.0833333,11 L5.91666667,11 L5.91666667,12 Z"/>
-</svg>
diff --git a/assets/icons/category_game.svg b/assets/icons/category_game.svg
deleted file mode 100644
index 9271fa9..0000000
--- a/assets/icons/category_game.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
-  <path fill-rule="evenodd" d="M11.3114315,3 C13.357501,3 15.0067163,5.17017281 15.7133188,8.05794777 C16.4086522,10.8996678 15.9150863,13.3535714 14.0872428,13.3535714 C13.3629901,13.3535714 12.7141246,13.0969142 11.9239825,12.5819693 C11.7832522,12.4902536 11.638281,12.3909224 11.461347,12.2660165 C11.3686071,12.200547 11.0517692,11.9743261 11.0062924,11.9420563 C9.76649639,11.0623107 9.01108239,10.715 8.00430016,10.715 C6.77138366,10.715 5.99921712,11.0762729 4.96661589,11.9397238 C4.93060093,11.9698391 4.48571222,12.3483964 4.35343872,12.4563717 C3.49008067,13.1611339 2.80601727,13.4628505 1.87123269,13.3869162 C0.0836355556,13.241098 -0.391076934,10.7851693 0.309935396,7.98500253 C1.02394135,5.13293317 2.67988585,3 4.7263796,3 C5.07581055,3 5.40379038,3.09122326 5.76942208,3.26509058 C5.87841375,3.31691894 5.98930228,3.37514875 6.12219409,3.44909841 C6.19628024,3.49032478 6.44963239,3.6346061 6.45727206,3.63892075 C7.10277068,4.00347855 7.50182674,4.14857143 8.01851079,4.14857143 C8.51588602,4.14857143 8.90120605,4.00650828 9.55466919,3.63859493 C9.69986269,3.55637602 9.78224829,3.50972827 9.84835639,3.47295723 C9.96412339,3.40856473 10.0609743,3.35696675 10.1556729,3.31001061 C10.567507,3.10580322 10.9247171,3 11.3114315,3 Z M5.07357978,10.107 C6.56572905,10.107 7.78410609,8.9267355 7.78410609,7.46414286 C7.78410609,6.00155021 6.56572905,4.82128571 5.07357978,4.82128571 C3.57990894,4.82128571 2.36305346,6.00089051 2.36305346,7.46414286 C2.36305346,8.9273952 3.57990894,10.107 5.07357978,10.107 Z M5.07357978,9.107 C4.12535588,9.107 3.36305346,8.36803337 3.36305346,7.46414286 C3.36305346,6.56025235 4.12535588,5.82128571 5.07357978,5.82128571 C6.02043115,5.82128571 6.78410609,6.56107184 6.78410609,7.46414286 C6.78410609,8.36721388 6.02043115,9.107 5.07357978,9.107 Z M5.03983241,8.37864286 C5.54751662,8.37864286 5.9601482,7.97792857 5.9601482,7.48935714 C5.9601482,6.99292857 5.54751662,6.59364286 5.03983241,6.59364286 C4.53067452,6.59364286 4.11804294,6.99292857 4.11804294,7.48935714 C4.11804294,7.97792857 4.53067452,8.37864286 5.03983241,8.37864286 Z M9.65408509,8.38564286 C10.1617693,8.38564286 10.5744008,7.9835 10.5744008,7.49135714 C10.5744008,6.99135714 10.1617693,6.58992857 9.65408509,6.58992857 C9.14492719,6.58992857 8.73229557,6.99135714 8.73229557,7.49135714 C8.73229557,7.9835 9.14492719,8.38564286 9.65408509,8.38564286 Z M11.3288535,9.99071429 C11.8365377,9.99071429 12.2491693,9.58928571 12.2491693,9.09214286 C12.2491693,8.59571429 11.8365377,8.19357143 11.3288535,8.19357143 C10.8196956,8.19357143 10.407064,8.59571429 10.407064,9.09214286 C10.407064,9.58928571 10.8196956,9.99071429 11.3288535,9.99071429 Z M11.3281166,6.77357143 C11.8372745,6.77357143 12.2491693,6.37142857 12.2491693,5.87357143 C12.2491693,5.37714286 11.8372745,4.97428571 11.3281166,4.97428571 C10.8174851,4.97428571 10.407064,5.37714286 10.407064,5.87357143 C10.407064,6.37142857 10.8174851,6.77357143 11.3281166,6.77357143 Z M12.9731166,8.38421429 C13.4852219,8.38421429 13.8971166,7.98135714 13.8971166,7.48921429 C13.8971166,6.98992857 13.4852219,6.5885 12.9731166,6.5885 C12.4676429,6.5885 12.0550114,6.98992857 12.0550114,7.48921429 C12.0550114,7.98135714 12.4676429,8.38421429 12.9731166,8.38421429 Z"/>
-</svg>
diff --git a/assets/icons/category_game_dark.svg b/assets/icons/category_game_dark.svg
deleted file mode 100644
index a783c5d..0000000
--- a/assets/icons/category_game_dark.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
-  <path fill="#FFF" fill-opacity=".6" fill-rule="evenodd" d="M11.3114315,3 C13.357501,3 15.0067163,5.17017281 15.7133188,8.05794777 C16.4086522,10.8996678 15.9150863,13.3535714 14.0872428,13.3535714 C13.3629901,13.3535714 12.7141246,13.0969142 11.9239825,12.5819693 C11.7832522,12.4902536 11.638281,12.3909224 11.461347,12.2660165 C11.3686071,12.200547 11.0517692,11.9743261 11.0062924,11.9420563 C9.76649639,11.0623107 9.01108239,10.715 8.00430016,10.715 C6.77138366,10.715 5.99921712,11.0762729 4.96661589,11.9397238 C4.93060093,11.9698391 4.48571222,12.3483964 4.35343872,12.4563717 C3.49008067,13.1611339 2.80601727,13.4628505 1.87123269,13.3869162 C0.0836355556,13.241098 -0.391076934,10.7851693 0.309935396,7.98500253 C1.02394135,5.13293317 2.67988585,3 4.7263796,3 C5.07581055,3 5.40379038,3.09122326 5.76942208,3.26509058 C5.87841375,3.31691894 5.98930228,3.37514875 6.12219409,3.44909841 C6.19628024,3.49032478 6.44963239,3.6346061 6.45727206,3.63892075 C7.10277068,4.00347855 7.50182674,4.14857143 8.01851079,4.14857143 C8.51588602,4.14857143 8.90120605,4.00650828 9.55466919,3.63859493 C9.69986269,3.55637602 9.78224829,3.50972827 9.84835639,3.47295723 C9.96412339,3.40856473 10.0609743,3.35696675 10.1556729,3.31001061 C10.567507,3.10580322 10.9247171,3 11.3114315,3 Z M5.07357978,10.107 C6.56572905,10.107 7.78410609,8.9267355 7.78410609,7.46414286 C7.78410609,6.00155021 6.56572905,4.82128571 5.07357978,4.82128571 C3.57990894,4.82128571 2.36305346,6.00089051 2.36305346,7.46414286 C2.36305346,8.9273952 3.57990894,10.107 5.07357978,10.107 Z M5.07357978,9.107 C4.12535588,9.107 3.36305346,8.36803337 3.36305346,7.46414286 C3.36305346,6.56025235 4.12535588,5.82128571 5.07357978,5.82128571 C6.02043115,5.82128571 6.78410609,6.56107184 6.78410609,7.46414286 C6.78410609,8.36721388 6.02043115,9.107 5.07357978,9.107 Z M5.03983241,8.37864286 C5.54751662,8.37864286 5.9601482,7.97792857 5.9601482,7.48935714 C5.9601482,6.99292857 5.54751662,6.59364286 5.03983241,6.59364286 C4.53067452,6.59364286 4.11804294,6.99292857 4.11804294,7.48935714 C4.11804294,7.97792857 4.53067452,8.37864286 5.03983241,8.37864286 Z M9.65408509,8.38564286 C10.1617693,8.38564286 10.5744008,7.9835 10.5744008,7.49135714 C10.5744008,6.99135714 10.1617693,6.58992857 9.65408509,6.58992857 C9.14492719,6.58992857 8.73229557,6.99135714 8.73229557,7.49135714 C8.73229557,7.9835 9.14492719,8.38564286 9.65408509,8.38564286 Z M11.3288535,9.99071429 C11.8365377,9.99071429 12.2491693,9.58928571 12.2491693,9.09214286 C12.2491693,8.59571429 11.8365377,8.19357143 11.3288535,8.19357143 C10.8196956,8.19357143 10.407064,8.59571429 10.407064,9.09214286 C10.407064,9.58928571 10.8196956,9.99071429 11.3288535,9.99071429 Z M11.3281166,6.77357143 C11.8372745,6.77357143 12.2491693,6.37142857 12.2491693,5.87357143 C12.2491693,5.37714286 11.8372745,4.97428571 11.3281166,4.97428571 C10.8174851,4.97428571 10.407064,5.37714286 10.407064,5.87357143 C10.407064,6.37142857 10.8174851,6.77357143 11.3281166,6.77357143 Z M12.9731166,8.38421429 C13.4852219,8.38421429 13.8971166,7.98135714 13.8971166,7.48921429 C13.8971166,6.98992857 13.4852219,6.5885 12.9731166,6.5885 C12.4676429,6.5885 12.0550114,6.98992857 12.0550114,7.48921429 C12.0550114,7.98135714 12.4676429,8.38421429 12.9731166,8.38421429 Z"/>
-</svg>
diff --git a/assets/icons/category_graphic.svg b/assets/icons/category_graphic.svg
deleted file mode 100644
index 07c4b4e..0000000
--- a/assets/icons/category_graphic.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
-  <path fill-rule="evenodd" d="M13,2 C14.1045695,2 15,2.8954305 15,4 L15,12 C15,13.1045695 14.1045695,14 13,14 L3,14 C1.8954305,14 1,13.1045695 1,12 L1,4 C1,2.8954305 1.8954305,2 3,2 L13,2 Z M9.38816736,7.22265239 L7.95626236,10.0443009 C7.82854357,10.2959779 7.59618367,10.3016397 7.44581474,10.0701011 L6.5212474,8.6464491 C6.2918509,8.42797452 5.91137533,8.45796439 5.72281255,8.70938339 L3.09783322,12.2093834 C2.84963451,12.5403176 3.0980227,13 3.52503993,13 L12.9749655,13 C13.3830419,13 13.6350993,12.5760169 13.4251458,12.2427546 L10.2751706,7.24275461 C10.0768804,6.92800582 9.60195261,6.91724249 9.38816736,7.22265239 Z M4.5,4 C3.67157288,4 3,4.67157288 3,5.5 C3,6.32842712 3.67157288,7 4.5,7 C5.32842712,7 6,6.32842712 6,5.5 C6,4.67157288 5.32842712,4 4.5,4 Z"/>
-</svg>
diff --git a/assets/icons/category_graphic_dark.svg b/assets/icons/category_graphic_dark.svg
deleted file mode 100644
index 904d02f..0000000
--- a/assets/icons/category_graphic_dark.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
-  <path fill="#FFF" fill-opacity=".6" fill-rule="evenodd" d="M13,2 C14.1045695,2 15,2.8954305 15,4 L15,12 C15,13.1045695 14.1045695,14 13,14 L3,14 C1.8954305,14 1,13.1045695 1,12 L1,4 C1,2.8954305 1.8954305,2 3,2 L13,2 Z M9.38816736,7.22265239 L7.95626236,10.0443009 C7.82854357,10.2959779 7.59618367,10.3016397 7.44581474,10.0701011 L6.5212474,8.6464491 C6.2918509,8.42797452 5.91137533,8.45796439 5.72281255,8.70938339 L3.09783322,12.2093834 C2.84963451,12.5403176 3.0980227,13 3.52503993,13 L12.9749655,13 C13.3830419,13 13.6350993,12.5760169 13.4251458,12.2427546 L10.2751706,7.24275461 C10.0768804,6.92800582 9.60195261,6.91724249 9.38816736,7.22265239 Z M4.5,4 C3.67157288,4 3,4.67157288 3,5.5 C3,6.32842712 3.67157288,7 4.5,7 C5.32842712,7 6,6.32842712 6,5.5 C6,4.67157288 5.32842712,4 4.5,4 Z"/>
-</svg>
diff --git a/assets/icons/category_music.svg b/assets/icons/category_music.svg
deleted file mode 100644
index c544799..0000000
--- a/assets/icons/category_music.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
-  <path fill-rule="evenodd" d="M13.9529472,2.53458892 C13.9842218,2.67532449 14,2.81906015 14,2.9632288 L14,11.5 C14,12.6045695 13.1045695,13.5 12,13.5 C10.8954305,13.5 10,12.6045695 10,11.5 C10,10.3954305 10.8954305,9.5 12,9.5 C12.364732,9.5 12.7066608,9.5976323 13.0010775,9.76818814 L13,3.81473429 C13,3.45097522 12.705115,3.15609023 12.3413559,3.15609023 C12.2949677,3.15609023 12.2487093,3.16099086 12.2033508,3.17071053 L6.52063898,4.38843451 C6.21695744,4.45350912 6,4.7218827 6,5.03245826 L6,13.5 C6,14.6045695 5.1045695,15.5 4,15.5 C2.8954305,15.5 2,14.6045695 2,13.5 C2,12.3954305 2.8954305,11.5 4,11.5 C4.364732,11.5 4.70666076,11.5976323 5.0010775,11.7681881 L5,4.08503671 C5,3.15891996 5.64322914,2.35706019 6.54729233,2.15615726 L11.5954279,1.03434935 C12.6607186,0.797618084 13.716216,1.46929822 13.9529472,2.53458892 Z"/>
-</svg>
diff --git a/assets/icons/category_music_dark.svg b/assets/icons/category_music_dark.svg
deleted file mode 100644
index 8541c83..0000000
--- a/assets/icons/category_music_dark.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
-  <path fill="#FFF" fill-opacity=".6" fill-rule="evenodd" d="M13.9529472,2.53458892 C13.9842218,2.67532449 14,2.81906015 14,2.9632288 L14,11.5 C14,12.6045695 13.1045695,13.5 12,13.5 C10.8954305,13.5 10,12.6045695 10,11.5 C10,10.3954305 10.8954305,9.5 12,9.5 C12.364732,9.5 12.7066608,9.5976323 13.0010775,9.76818814 L13,3.81473429 C13,3.45097522 12.705115,3.15609023 12.3413559,3.15609023 C12.2949677,3.15609023 12.2487093,3.16099086 12.2033508,3.17071053 L6.52063898,4.38843451 C6.21695744,4.45350912 6,4.7218827 6,5.03245826 L6,13.5 C6,14.6045695 5.1045695,15.5 4,15.5 C2.8954305,15.5 2,14.6045695 2,13.5 C2,12.3954305 2.8954305,11.5 4,11.5 C4.364732,11.5 4.70666076,11.5976323 5.0010775,11.7681881 L5,4.08503671 C5,3.15891996 5.64322914,2.35706019 6.54729233,2.15615726 L11.5954279,1.03434935 C12.6607186,0.797618084 13.716216,1.46929822 13.9529472,2.53458892 Z"/>
-</svg>
diff --git a/assets/icons/category_network.svg b/assets/icons/category_network.svg
deleted file mode 100644
index 0cc2948..0000000
--- a/assets/icons/category_network.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
-  <path fill-rule="evenodd" d="M7.99960993,0.9998 C11.8598496,0.9998 15,4.13995046 15,7.99940993 C15,11.8596496 11.8598496,14.9998 7.99960993,14.9998 C4.14015046,14.9998 1,11.8596496 1,7.99940993 C1,4.13995046 4.14015046,0.9998 7.99960993,0.9998 Z M8.86971986,11.9145 C8.56971986,12.747 8.22071986,13.122 7.99971986,13.122 C7.78521986,13.122 7.44971986,12.768 7.15571986,11.9845 C6.86571986,12.132 6.61521986,12.2485 6.36971986,12.354 C6.75321986,13.3495 7.29871986,14 7.99971986,14 C8.71921986,14 9.27521986,13.314 9.66021986,12.274 C9.41771986,12.1735 9.16171986,12.0585 8.86971986,11.9145 Z M12.0962199,3.61 C10.8027199,3.61 9.05121986,4.5085 7.94421986,5.19 C6.85371986,4.547 5.16021986,3.717 3.90321986,3.717 C3.19571986,3.717 2.85321986,4 2.69121986,4.238 C2.46021986,4.576 2.34571986,5.1655 2.90071986,6.1455 C2.82221986,6.286 2.77771986,6.448 2.77771986,6.6205 C2.77771986,7.154 3.20271986,7.5865 3.72621986,7.5865 C4.24971986,7.5865 4.67471986,7.154 4.67471986,6.6205 C4.67471986,6.087 4.25021986,5.6545 3.72621986,5.6545 L3.72621986,5.6545 L3.62121986,5.6605 C3.32971986,5.131 3.33321986,4.8355 3.39871986,4.7395 C3.46021986,4.6485 3.64921986,4.595 3.90321986,4.595 C4.30121986,4.595 4.82071986,4.7155 5.41071986,4.9325 C5.98671986,5.145 6.57721986,5.43 7.11871986,5.728 C5.99421986,6.502 5.13171986,7.25 4.36621986,8.027 C4.02471986,8.379 3.68871986,8.7615 3.39771986,9.1515 C2.30221986,10.6215 2.40671986,11.433 2.68771986,11.8555 C3.25671986,12.71 4.68721986,12.3665 5.64571986,12.014 C7.99371986,11.151 11.0597199,8.9165 12.6017199,6.848 C13.6972199,5.3785 13.5927199,4.567 13.3117199,4.1445 C13.1492199,3.9005 12.8067199,3.61 12.0962199,3.61 Z M12.2647199,8.445 C11.7407199,8.445 11.3162199,8.8775 11.3162199,9.411 C11.3162199,9.9445 11.7407199,10.377 12.2647199,10.377 L12.3937199,10.368 C12.6702199,10.88 12.6657199,11.167 12.6012199,11.2615 C12.5392199,11.352 12.3507199,11.4055 12.0967199,11.4055 C11.2957199,11.4055 10.1802199,10.933 9.46171986,10.5765 C9.22171986,10.7475 8.92321986,10.9505 8.63221986,11.136 C9.59521986,11.6545 11.0112199,12.2835 12.0967199,12.2835 C12.8042199,12.2835 13.1467199,12.0005 13.3087199,11.7625 C13.5392199,11.4255 13.6537199,10.8375 13.1032199,9.8625 C13.1737199,9.7275 13.2132199,9.574 13.2132199,9.411 C13.2132199,8.8775 12.7887199,8.445 12.2647199,8.445 Z M12.0962199,4.4875 C12.3517199,4.4875 12.5347199,4.542 12.5977199,4.6365 C12.6907199,4.776 12.6677199,5.3075 11.9147199,6.317 C10.9462199,7.6165 9.40121986,8.8925 8.04671986,9.7805 C6.94321986,10.504 5.07821986,11.5125 3.90321986,11.5125 C3.64771986,11.5125 3.46471986,11.458 3.40171986,11.3635 C3.21521986,11.083 3.61221986,10.04 5.02121986,8.601 C5.54371986,9.0665 6.10721986,9.5115 6.67921986,9.917 L6.67921986,9.917 C6.98671986,9.7555 7.25071986,9.597 7.51171986,9.4315 C6.82921986,8.9695 6.18871986,8.4705 5.65121986,7.995 C6.36621986,7.3465 7.16221986,6.738 7.95271986,6.2195 C8.64121986,6.6515 9.30521986,7.133 9.90271986,7.625 C10.1212199,7.429 10.3347199,7.226 10.5382199,7.0195 C9.99971986,6.5705 9.40971986,6.1295 8.77721986,5.711 C9.63321986,5.217 11.1197199,4.4875 12.0962199,4.4875 Z M7.99971986,2 C7.28021986,2 6.72421986,2.686 6.33921986,3.726 C6.58321986,3.827 6.83971986,3.9425 7.12971986,4.0855 C7.42971986,3.253 7.77871986,2.878 7.99971986,2.878 C8.21471986,2.878 8.54971986,3.232 8.84371986,4.0155 C9.13071986,3.8695 9.38371986,3.7515 9.62971986,3.646 C9.24671986,2.6505 8.70071986,2 7.99971986,2 Z"/>
-</svg>
diff --git a/assets/icons/category_network_dark.svg b/assets/icons/category_network_dark.svg
deleted file mode 100644
index a8368b4..0000000
--- a/assets/icons/category_network_dark.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
-  <path fill="#FFF" fill-opacity=".6" fill-rule="evenodd" d="M7.99960993,0.9998 C11.8598496,0.9998 15,4.13995046 15,7.99940993 C15,11.8596496 11.8598496,14.9998 7.99960993,14.9998 C4.14015046,14.9998 1,11.8596496 1,7.99940993 C1,4.13995046 4.14015046,0.9998 7.99960993,0.9998 Z M8.86971986,11.9145 C8.56971986,12.747 8.22071986,13.122 7.99971986,13.122 C7.78521986,13.122 7.44971986,12.768 7.15571986,11.9845 C6.86571986,12.132 6.61521986,12.2485 6.36971986,12.354 C6.75321986,13.3495 7.29871986,14 7.99971986,14 C8.71921986,14 9.27521986,13.314 9.66021986,12.274 C9.41771986,12.1735 9.16171986,12.0585 8.86971986,11.9145 Z M12.0962199,3.61 C10.8027199,3.61 9.05121986,4.5085 7.94421986,5.19 C6.85371986,4.547 5.16021986,3.717 3.90321986,3.717 C3.19571986,3.717 2.85321986,4 2.69121986,4.238 C2.46021986,4.576 2.34571986,5.1655 2.90071986,6.1455 C2.82221986,6.286 2.77771986,6.448 2.77771986,6.6205 C2.77771986,7.154 3.20271986,7.5865 3.72621986,7.5865 C4.24971986,7.5865 4.67471986,7.154 4.67471986,6.6205 C4.67471986,6.087 4.25021986,5.6545 3.72621986,5.6545 L3.72621986,5.6545 L3.62121986,5.6605 C3.32971986,5.131 3.33321986,4.8355 3.39871986,4.7395 C3.46021986,4.6485 3.64921986,4.595 3.90321986,4.595 C4.30121986,4.595 4.82071986,4.7155 5.41071986,4.9325 C5.98671986,5.145 6.57721986,5.43 7.11871986,5.728 C5.99421986,6.502 5.13171986,7.25 4.36621986,8.027 C4.02471986,8.379 3.68871986,8.7615 3.39771986,9.1515 C2.30221986,10.6215 2.40671986,11.433 2.68771986,11.8555 C3.25671986,12.71 4.68721986,12.3665 5.64571986,12.014 C7.99371986,11.151 11.0597199,8.9165 12.6017199,6.848 C13.6972199,5.3785 13.5927199,4.567 13.3117199,4.1445 C13.1492199,3.9005 12.8067199,3.61 12.0962199,3.61 Z M12.2647199,8.445 C11.7407199,8.445 11.3162199,8.8775 11.3162199,9.411 C11.3162199,9.9445 11.7407199,10.377 12.2647199,10.377 L12.3937199,10.368 C12.6702199,10.88 12.6657199,11.167 12.6012199,11.2615 C12.5392199,11.352 12.3507199,11.4055 12.0967199,11.4055 C11.2957199,11.4055 10.1802199,10.933 9.46171986,10.5765 C9.22171986,10.7475 8.92321986,10.9505 8.63221986,11.136 C9.59521986,11.6545 11.0112199,12.2835 12.0967199,12.2835 C12.8042199,12.2835 13.1467199,12.0005 13.3087199,11.7625 C13.5392199,11.4255 13.6537199,10.8375 13.1032199,9.8625 C13.1737199,9.7275 13.2132199,9.574 13.2132199,9.411 C13.2132199,8.8775 12.7887199,8.445 12.2647199,8.445 Z M12.0962199,4.4875 C12.3517199,4.4875 12.5347199,4.542 12.5977199,4.6365 C12.6907199,4.776 12.6677199,5.3075 11.9147199,6.317 C10.9462199,7.6165 9.40121986,8.8925 8.04671986,9.7805 C6.94321986,10.504 5.07821986,11.5125 3.90321986,11.5125 C3.64771986,11.5125 3.46471986,11.458 3.40171986,11.3635 C3.21521986,11.083 3.61221986,10.04 5.02121986,8.601 C5.54371986,9.0665 6.10721986,9.5115 6.67921986,9.917 L6.67921986,9.917 C6.98671986,9.7555 7.25071986,9.597 7.51171986,9.4315 C6.82921986,8.9695 6.18871986,8.4705 5.65121986,7.995 C6.36621986,7.3465 7.16221986,6.738 7.95271986,6.2195 C8.64121986,6.6515 9.30521986,7.133 9.90271986,7.625 C10.1212199,7.429 10.3347199,7.226 10.5382199,7.0195 C9.99971986,6.5705 9.40971986,6.1295 8.77721986,5.711 C9.63321986,5.217 11.1197199,4.4875 12.0962199,4.4875 Z M7.99971986,2 C7.28021986,2 6.72421986,2.686 6.33921986,3.726 C6.58321986,3.827 6.83971986,3.9425 7.12971986,4.0855 C7.42971986,3.253 7.77871986,2.878 7.99971986,2.878 C8.21471986,2.878 8.54971986,3.232 8.84371986,4.0155 C9.13071986,3.8695 9.38371986,3.7515 9.62971986,3.646 C9.24671986,2.6505 8.70071986,2 7.99971986,2 Z"/>
-</svg>
diff --git a/assets/icons/category_office.svg b/assets/icons/category_office.svg
deleted file mode 100644
index dec8fdd..0000000
--- a/assets/icons/category_office.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
-  <path fill-rule="evenodd" d="M14.6796875,1 C15.1667188,1 15.5,1.316 15.5,1.66666667 L15.5,2.33333333 C15.5,2.684 15.1667188,3 14.6796875,3 L14,3 L14,9.0952381 C14,10.147209 13.1045695,11 12,11 L10.223,11 L12.2674534,13.0443466 C12.4627155,13.2396088 12.4627155,13.5561912 12.2674534,13.7514534 C12.0721912,13.9467155 11.7556088,13.9467155 11.5603466,13.7514534 L8.9995,11.1905 L9,14.5 C9,14.7761424 8.77614237,15 8.5,15 C8.24358208,15 8.03224642,14.8069799 8.00336387,14.5583106 L8,14.5 L7.9995,11.191 L5.43965339,13.7514534 C5.25941141,13.9316954 4.97579588,13.9455601 4.77965028,13.7930477 L4.73254661,13.7514534 C4.55230463,13.5712114 4.53843986,13.2875959 4.69095231,13.0914503 L4.73254661,13.0443466 L6.776,11 L4,11 C2.8954305,11 2,10.147209 2,9.0952381 L2,3 L1.3203125,3 C0.83328125,3 0.5,2.684 0.5,2.33333333 L0.5,1.66666667 C0.5,1.316 0.83328125,1 1.3203125,1 L14.6796875,1 Z M13,3 L3,3 L3,9.05882353 C3,9.57862094 3.44771525,10 4,10 L12,10 C12.5522847,10 13,9.57862094 13,9.05882353 L13,3 Z M8,4.5 L8,6.5 L10,6.5 C10,7.6045695 9.1045695,8.5 8,8.5 C6.8954305,8.5 6,7.6045695 6,6.5 C6,5.3954305 6.8954305,4.5 8,4.5 Z M9,3.5 C10.1045695,3.5 11,4.3954305 11,5.5 L9,5.5 L9,3.5 Z"/>
-</svg>
diff --git a/assets/icons/category_office_dark.svg b/assets/icons/category_office_dark.svg
deleted file mode 100644
index 872cb0e..0000000
--- a/assets/icons/category_office_dark.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
-  <path fill="#FFF" fill-opacity=".6" fill-rule="evenodd" d="M14.6796875,1 C15.1667188,1 15.5,1.316 15.5,1.66666667 L15.5,2.33333333 C15.5,2.684 15.1667188,3 14.6796875,3 L14,3 L14,9.0952381 C14,10.147209 13.1045695,11 12,11 L10.223,11 L12.2674534,13.0443466 C12.4627155,13.2396088 12.4627155,13.5561912 12.2674534,13.7514534 C12.0721912,13.9467155 11.7556088,13.9467155 11.5603466,13.7514534 L8.9995,11.1905 L9,14.5 C9,14.7761424 8.77614237,15 8.5,15 C8.24358208,15 8.03224642,14.8069799 8.00336387,14.5583106 L8,14.5 L7.9995,11.191 L5.43965339,13.7514534 C5.25941141,13.9316954 4.97579588,13.9455601 4.77965028,13.7930477 L4.73254661,13.7514534 C4.55230463,13.5712114 4.53843986,13.2875959 4.69095231,13.0914503 L4.73254661,13.0443466 L6.776,11 L4,11 C2.8954305,11 2,10.147209 2,9.0952381 L2,3 L1.3203125,3 C0.83328125,3 0.5,2.684 0.5,2.33333333 L0.5,1.66666667 C0.5,1.316 0.83328125,1 1.3203125,1 L14.6796875,1 Z M13,3 L3,3 L3,9.05882353 C3,9.57862094 3.44771525,10 4,10 L12,10 C12.5522847,10 13,9.57862094 13,9.05882353 L13,3 Z M8,4.5 L8,6.5 L10,6.5 C10,7.6045695 9.1045695,8.5 8,8.5 C6.8954305,8.5 6,7.6045695 6,6.5 C6,5.3954305 6.8954305,4.5 8,4.5 Z M9,3.5 C10.1045695,3.5 11,4.3954305 11,5.5 L9,5.5 L9,3.5 Z"/>
-</svg>
diff --git a/assets/icons/category_others.svg b/assets/icons/category_others.svg
deleted file mode 100644
index 0d57844..0000000
--- a/assets/icons/category_others.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
-  <path fill-rule="evenodd" d="M8.00031808,0.99950155 C11.8603458,0.99950155 14.9999738,4.1390565 14.9999738,7.99950155 C14.9999738,11.8599466 11.8603458,14.9995015 8.00031808,14.9995015 C4.13971544,14.9995015 0.999973754,11.8600603 0.999973754,7.99950155 C0.999973754,4.13894278 4.13971544,0.99950155 8.00031808,0.99950155 Z M11.4999738,8.99950155 C12.0526404,8.99950155 12.4999738,8.55150155 12.4999738,7.99950155 C12.4999738,7.44683488 12.0526404,6.99950155 11.4999738,6.99950155 C10.9473071,6.99950155 10.4999738,7.44683488 10.4999738,7.99950155 C10.4999738,8.55150155 10.9473071,8.99950155 11.4999738,8.99950155 Z M7.99997375,8.99950155 C8.55264042,8.99950155 8.99997375,8.55150155 8.99997375,7.99950155 C8.99997375,7.44683488 8.55264042,6.99950155 7.99997375,6.99950155 C7.44797375,6.99950155 6.99997375,7.44683488 6.99997375,7.99950155 C6.99997375,8.55150155 7.44797375,8.99950155 7.99997375,8.99950155 Z M4.49997375,8.99950155 C5.05264042,8.99950155 5.49997375,8.55150155 5.49997375,7.99950155 C5.49997375,7.44683488 5.05264042,6.99950155 4.49997375,6.99950155 C3.94797375,6.99950155 3.49997375,7.44683488 3.49997375,7.99950155 C3.49997375,8.55150155 3.94797375,8.99950155 4.49997375,8.99950155 Z"/>
-</svg>
diff --git a/assets/icons/category_others_dark.svg b/assets/icons/category_others_dark.svg
deleted file mode 100644
index a9a36c5..0000000
--- a/assets/icons/category_others_dark.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
-  <path fill="#FFF" fill-opacity=".6" fill-rule="evenodd" d="M8.00031808,0.99950155 C11.8603458,0.99950155 14.9999738,4.1390565 14.9999738,7.99950155 C14.9999738,11.8599466 11.8603458,14.9995015 8.00031808,14.9995015 C4.13971544,14.9995015 0.999973754,11.8600603 0.999973754,7.99950155 C0.999973754,4.13894278 4.13971544,0.99950155 8.00031808,0.99950155 Z M11.4999738,8.99950155 C12.0526404,8.99950155 12.4999738,8.55150155 12.4999738,7.99950155 C12.4999738,7.44683488 12.0526404,6.99950155 11.4999738,6.99950155 C10.9473071,6.99950155 10.4999738,7.44683488 10.4999738,7.99950155 C10.4999738,8.55150155 10.9473071,8.99950155 11.4999738,8.99950155 Z M7.99997375,8.99950155 C8.55264042,8.99950155 8.99997375,8.55150155 8.99997375,7.99950155 C8.99997375,7.44683488 8.55264042,6.99950155 7.99997375,6.99950155 C7.44797375,6.99950155 6.99997375,7.44683488 6.99997375,7.99950155 C6.99997375,8.55150155 7.44797375,8.99950155 7.99997375,8.99950155 Z M4.49997375,8.99950155 C5.05264042,8.99950155 5.49997375,8.55150155 5.49997375,7.99950155 C5.49997375,7.44683488 5.05264042,6.99950155 4.49997375,6.99950155 C3.94797375,6.99950155 3.49997375,7.44683488 3.49997375,7.99950155 C3.49997375,8.55150155 3.94797375,8.99950155 4.49997375,8.99950155 Z"/>
-</svg>
diff --git a/assets/icons/category_reading.svg b/assets/icons/category_reading.svg
deleted file mode 100644
index 7c87ac1..0000000
--- a/assets/icons/category_reading.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
-  <g fill="none" fill-rule="evenodd">
-    <path fill="#000" d="M1.85789238,2.64258737 C4.86313703,2.21112969 6.5771729,2.75883866 7,4.28571429 L7,13.7857143 C6.27058294,12.8374721 4.43450345,12.3388115 1.49176152,12.2897326 C1.2188519,12.2852804 1,12.062748 1,11.7898021 L1,3.63241367 C1.00002467,3.13504017 1.36556687,2.71326968 1.85789238,2.64258737 Z"/>
-    <path fill="#000" d="M9.85789238,2.64258737 C12.863137,2.21112969 14.5771729,2.75883866 15,4.28571429 L15,13.7857143 C14.2705829,12.8374721 12.4345034,12.3388115 9.49176152,12.2897326 C9.2188519,12.2852804 9,12.062748 9,11.7898021 L9,3.63241367 C9.00002467,3.13504017 9.36556687,2.71326968 9.85789238,2.64258737 Z" transform="matrix(-1 0 0 1 24 0)"/>
-  </g>
-</svg>
diff --git a/assets/icons/category_reading_dark.svg b/assets/icons/category_reading_dark.svg
deleted file mode 100644
index 4736cb4..0000000
--- a/assets/icons/category_reading_dark.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
-  <g fill="none" fill-opacity=".6" fill-rule="evenodd">
-    <path fill="#FFF" d="M1.85789238,2.64258737 C4.86313703,2.21112969 6.5771729,2.75883866 7,4.28571429 L7,13.7857143 C6.27058294,12.8374721 4.43450345,12.3388115 1.49176152,12.2897326 C1.2188519,12.2852804 1,12.062748 1,11.7898021 L1,3.63241367 C1.00002467,3.13504017 1.36556687,2.71326968 1.85789238,2.64258737 Z"/>
-    <path fill="#FFF" d="M9.85789238,2.64258737 C12.863137,2.21112969 14.5771729,2.75883866 15,4.28571429 L15,13.7857143 C14.2705829,12.8374721 12.4345034,12.3388115 9.49176152,12.2897326 C9.2188519,12.2852804 9,12.062748 9,11.7898021 L9,3.63241367 C9.00002467,3.13504017 9.36556687,2.71326968 9.85789238,2.64258737 Z" transform="matrix(-1 0 0 1 24 0)"/>
-  </g>
-</svg>
diff --git a/assets/icons/category_system.svg b/assets/icons/category_system.svg
deleted file mode 100644
index 7655669..0000000
--- a/assets/icons/category_system.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
-  <path fill-rule="evenodd" d="M3,14 C1.8954305,14 1,13.1045695 1,12 L1,4 C1,2.8954305 1.8954305,2 3,2 L13,2 C14.1045695,2 15,2.8954305 15,4 L15,12 C15,13.0543618 14.1841222,13.9181651 13.1492623,13.9945143 L13,14 L13,14 L3,14 Z M14,5 L2,5 L2,12 C2,12.5522847 2.44771525,13 3,13 L8.01233301,13.0001639 C8.01943442,12.9772458 8.02824971,12.9546419 8.0388094,12.9325301 L8.30383017,12.3775926 C8.34459502,12.2912196 8.34695846,12.1917404 8.30983658,12.1028011 C8.27399122,12.0159757 8.20318605,11.9486684 8.11444707,11.9170901 L7.53244707,11.7100901 C7.33313205,11.6391997 7.19999981,11.4505463 7.19999981,11.2389998 L7.19999981,10.1609998 C7.19999981,9.9491733 7.33347927,9.7603339 7.53316619,9.6896543 L8.11249002,9.4846101 C8.20258302,9.4521442 8.27390085,9.3842428 8.31058669,9.2953916 C8.34695846,9.2082592 8.34459502,9.10878 8.3048094,9.0244696 L8.0388094,8.46746956 C7.94749917,8.2762673 7.98662009,8.04827275 8.13644642,7.89844642 L8.89844642,7.13644642 C9.04827275,6.98662009 9.2762673,6.94749917 9.46746956,7.0388094 L10.022407,7.30383017 C10.10878,7.34459502 10.2082592,7.34695846 10.2971985,7.30983658 C10.3842159,7.27391194 10.4518724,7.202745 10.4837447,7.11391109 L10.6897447,6.53291109 C10.7604992,6.33335606 10.9492726,6.19999981 11.1609998,6.19999981 L12.2389998,6.19999981 C12.450727,6.19999981 12.6395004,6.33335606 12.7102549,6.53291109 L12.9156316,7.11216331 C12.9481272,7.202745 13.0157837,7.27391194 13.104608,7.31058669 C13.1917404,7.34695846 13.2912196,7.34459502 13.3755301,7.3048094 L13.9325301,7.0388094 L14,7.013 L14,5 Z M11.6999998,9.1999998 C10.8729998,9.1999998 10.1999998,9.8729998 10.1999998,10.6999998 C10.1999998,11.5269998 10.8729998,12.1999998 11.6999998,12.1999998 C12.5269998,12.1999998 13.1999998,11.5269998 13.1999998,10.6999998 C13.1999998,9.8729998 12.5269998,9.1999998 11.6999998,9.1999998 Z M13,3 L12,3 L12,4 L13,4 L13,3 Z M9,3 L8,3 L8,4 L9,4 L9,3 Z M11,3 L10,3 L10,4 L11,4 L11,3 Z"/>
-</svg>
diff --git a/assets/icons/category_system_dark.svg b/assets/icons/category_system_dark.svg
deleted file mode 100644
index fdccd06..0000000
--- a/assets/icons/category_system_dark.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
-  <path fill="#FFF" fill-opacity=".6" fill-rule="evenodd" d="M3,14 C1.8954305,14 1,13.1045695 1,12 L1,4 C1,2.8954305 1.8954305,2 3,2 L13,2 C14.1045695,2 15,2.8954305 15,4 L15,12 C15,13.0543618 14.1841222,13.9181651 13.1492623,13.9945143 L13,14 L13,14 L3,14 Z M14,5 L2,5 L2,12 C2,12.5522847 2.44771525,13 3,13 L8.01233301,13.0001639 C8.01943442,12.9772458 8.02824971,12.9546419 8.0388094,12.9325301 L8.30383017,12.3775926 C8.34459502,12.2912196 8.34695846,12.1917404 8.30983658,12.1028011 C8.27399122,12.0159757 8.20318605,11.9486684 8.11444707,11.9170901 L7.53244707,11.7100901 C7.33313205,11.6391997 7.19999981,11.4505463 7.19999981,11.2389998 L7.19999981,10.1609998 C7.19999981,9.9491733 7.33347927,9.7603339 7.53316619,9.6896543 L8.11249002,9.4846101 C8.20258302,9.4521442 8.27390085,9.3842428 8.31058669,9.2953916 C8.34695846,9.2082592 8.34459502,9.10878 8.3048094,9.0244696 L8.0388094,8.46746956 C7.94749917,8.2762673 7.98662009,8.04827275 8.13644642,7.89844642 L8.89844642,7.13644642 C9.04827275,6.98662009 9.2762673,6.94749917 9.46746956,7.0388094 L10.022407,7.30383017 C10.10878,7.34459502 10.2082592,7.34695846 10.2971985,7.30983658 C10.3842159,7.27391194 10.4518724,7.202745 10.4837447,7.11391109 L10.6897447,6.53291109 C10.7604992,6.33335606 10.9492726,6.19999981 11.1609998,6.19999981 L12.2389998,6.19999981 C12.450727,6.19999981 12.6395004,6.33335606 12.7102549,6.53291109 L12.9156316,7.11216331 C12.9481272,7.202745 13.0157837,7.27391194 13.104608,7.31058669 C13.1917404,7.34695846 13.2912196,7.34459502 13.3755301,7.3048094 L13.9325301,7.0388094 L14,7.013 L14,5 Z M11.6999998,9.1999998 C10.8729998,9.1999998 10.1999998,9.8729998 10.1999998,10.6999998 C10.1999998,11.5269998 10.8729998,12.1999998 11.6999998,12.1999998 C12.5269998,12.1999998 13.1999998,11.5269998 13.1999998,10.6999998 C13.1999998,9.8729998 12.5269998,9.1999998 11.6999998,9.1999998 Z M13,3 L12,3 L12,4 L13,4 L13,3 Z M9,3 L8,3 L8,4 L9,4 L9,3 Z M11,3 L10,3 L10,4 L11,4 L11,3 Z"/>
-</svg>
diff --git a/assets/icons/category_video.svg b/assets/icons/category_video.svg
deleted file mode 100644
index 7fcebeb..0000000
--- a/assets/icons/category_video.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
-  <path fill-rule="evenodd" d="M12,2 C13.1045695,2 14,2.8954305 14,4 L14,13 C14,14.1045695 13.1045695,15 12,15 L4,15 C2.8954305,15 2,14.1045695 2,13 L2,4 C2,2.8954305 2.8954305,2 4,2 L12,2 Z M4.5,12 L3.5,12 C3.22385763,12 3,12.2238576 3,12.5 L3,12.5 L3,13 C3,13.5522847 3.44771525,14 4,14 L4,14 L4.5,14 C4.77614237,14 5,13.7761424 5,13.5 L5,13.5 L5,12.5 C5,12.2238576 4.77614237,12 4.5,12 L4.5,12 Z M12.5,12 L11.5,12 C11.2238576,12 11,12.2238576 11,12.5 L11,12.5 L11,13.5 C11,13.7761424 11.2238576,14 11.5,14 L11.5,14 L12,14 C12.5522847,14 13,13.5522847 13,13 L13,13 L13,12.5 C13,12.2238576 12.7761424,12 12.5,12 L12.5,12 Z M4.5,9 L3.5,9 C3.22385763,9 3,9.22385763 3,9.5 L3,9.5 L3,10.5 C3,10.7761424 3.22385763,11 3.5,11 L3.5,11 L4.5,11 C4.77614237,11 5,10.7761424 5,10.5 L5,10.5 L5,9.5 C5,9.22385763 4.77614237,9 4.5,9 L4.5,9 Z M12.5,9 L11.5,9 C11.2238576,9 11,9.22385763 11,9.5 L11,9.5 L11,10.5 C11,10.7761424 11.2238576,11 11.5,11 L11.5,11 L12.5,11 C12.7761424,11 13,10.7761424 13,10.5 L13,10.5 L13,9.5 C13,9.22385763 12.7761424,9 12.5,9 L12.5,9 Z M4.5,6 L3.5,6 C3.22385763,6 3,6.22385763 3,6.5 L3,6.5 L3,7.5 C3,7.77614237 3.22385763,8 3.5,8 L3.5,8 L4.5,8 C4.77614237,8 5,7.77614237 5,7.5 L5,7.5 L5,6.5 C5,6.22385763 4.77614237,6 4.5,6 L4.5,6 Z M12.5,6 L11.5,6 C11.2238576,6 11,6.22385763 11,6.5 L11,6.5 L11,7.5 C11,7.77614237 11.2238576,8 11.5,8 L11.5,8 L12.5,8 C12.7761424,8 13,7.77614237 13,7.5 L13,7.5 L13,6.5 C13,6.22385763 12.7761424,6 12.5,6 L12.5,6 Z M4.5,3 L4,3 C3.44771525,3 3,3.44771525 3,4 L3,4 L3,4.5 C3,4.77614237 3.22385763,5 3.5,5 L3.5,5 L4.5,5 C4.77614237,5 5,4.77614237 5,4.5 L5,4.5 L5,3.5 C5,3.22385763 4.77614237,3 4.5,3 L4.5,3 Z M12,3 L11.5,3 C11.2238576,3 11,3.22385763 11,3.5 L11,3.5 L11,4.5 C11,4.77614237 11.2238576,5 11.5,5 L11.5,5 L12.5,5 C12.7761424,5 13,4.77614237 13,4.5 L13,4.5 L13,4 C13,3.44771525 12.5522847,3 12,3 L12,3 Z"/>
-</svg>
diff --git a/assets/icons/category_video_dark.svg b/assets/icons/category_video_dark.svg
deleted file mode 100644
index 0c90fad..0000000
--- a/assets/icons/category_video_dark.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
-  <path fill="#FFF" fill-opacity=".6" fill-rule="evenodd" d="M12,2 C13.1045695,2 14,2.8954305 14,4 L14,13 C14,14.1045695 13.1045695,15 12,15 L4,15 C2.8954305,15 2,14.1045695 2,13 L2,4 C2,2.8954305 2.8954305,2 4,2 L12,2 Z M4.5,12 L3.5,12 C3.22385763,12 3,12.2238576 3,12.5 L3,12.5 L3,13 C3,13.5522847 3.44771525,14 4,14 L4,14 L4.5,14 C4.77614237,14 5,13.7761424 5,13.5 L5,13.5 L5,12.5 C5,12.2238576 4.77614237,12 4.5,12 L4.5,12 Z M12.5,12 L11.5,12 C11.2238576,12 11,12.2238576 11,12.5 L11,12.5 L11,13.5 C11,13.7761424 11.2238576,14 11.5,14 L11.5,14 L12,14 C12.5522847,14 13,13.5522847 13,13 L13,13 L13,12.5 C13,12.2238576 12.7761424,12 12.5,12 L12.5,12 Z M4.5,9 L3.5,9 C3.22385763,9 3,9.22385763 3,9.5 L3,9.5 L3,10.5 C3,10.7761424 3.22385763,11 3.5,11 L3.5,11 L4.5,11 C4.77614237,11 5,10.7761424 5,10.5 L5,10.5 L5,9.5 C5,9.22385763 4.77614237,9 4.5,9 L4.5,9 Z M12.5,9 L11.5,9 C11.2238576,9 11,9.22385763 11,9.5 L11,9.5 L11,10.5 C11,10.7761424 11.2238576,11 11.5,11 L11.5,11 L12.5,11 C12.7761424,11 13,10.7761424 13,10.5 L13,10.5 L13,9.5 C13,9.22385763 12.7761424,9 12.5,9 L12.5,9 Z M4.5,6 L3.5,6 C3.22385763,6 3,6.22385763 3,6.5 L3,6.5 L3,7.5 C3,7.77614237 3.22385763,8 3.5,8 L3.5,8 L4.5,8 C4.77614237,8 5,7.77614237 5,7.5 L5,7.5 L5,6.5 C5,6.22385763 4.77614237,6 4.5,6 L4.5,6 Z M12.5,6 L11.5,6 C11.2238576,6 11,6.22385763 11,6.5 L11,6.5 L11,7.5 C11,7.77614237 11.2238576,8 11.5,8 L11.5,8 L12.5,8 C12.7761424,8 13,7.77614237 13,7.5 L13,7.5 L13,6.5 C13,6.22385763 12.7761424,6 12.5,6 L12.5,6 Z M4.5,3 L4,3 C3.44771525,3 3,3.44771525 3,4 L3,4 L3,4.5 C3,4.77614237 3.22385763,5 3.5,5 L3.5,5 L4.5,5 C4.77614237,5 5,4.77614237 5,4.5 L5,4.5 L5,3.5 C5,3.22385763 4.77614237,3 4.5,3 L4.5,3 Z M12,3 L11.5,3 C11.2238576,3 11,3.22385763 11,3.5 L11,3.5 L11,4.5 C11,4.77614237 11.2238576,5 11.5,5 L11.5,5 L12.5,5 C12.7761424,5 13,4.77614237 13,4.5 L13,4.5 L13,4 C13,3.44771525 12.5522847,3 12,3 L12,3 Z"/>
-</svg>
diff --git a/assets/icons/downloads-symbolic.svg b/assets/icons/downloads-symbolic.svg
deleted file mode 100644
index f386246..0000000
--- a/assets/icons/downloads-symbolic.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
-  <path fill-rule="evenodd" d="M8,1 C11.8659932,1 15,4.13400675 15,8 C15,11.8659932 11.8659932,15 8,15 C4.13400675,15 1,11.8659932 1,8 C1,4.13400675 4.13400675,1 8,1 Z M9.5,8 L6.5,8 C6.22385763,8 6,8.22385763 6,8.5 C6,8.77614237 5.77614237,9 5.5,9 L5.5,9 L5,9 C4.89014373,9 4.78478689,9.04364023 4.70710678,9.12132034 C4.54534632,9.2830808 4.54534632,9.54534632 4.70710678,9.70710678 L4.70710678,9.70710678 L7.64644661,12.6464466 C7.84170876,12.8417088 8.15829124,12.8417088 8.35355339,12.6464466 L8.35355339,12.6464466 L11.2928932,9.70710678 C11.3705733,9.62942667 11.4142136,9.52406983 11.4142136,9.41421356 C11.4142136,9.18544973 11.2287638,9 11,9 L11,9 L10.5,9 C10.2238576,9 10,8.77614237 10,8.5 C10,8.22385763 9.77614237,8 9.5,8 L9.5,8 Z M9.5,6 L6.5,6 C6.22385763,6 6,6.22385763 6,6.5 C6,6.77614237 6.22385763,7 6.5,7 L6.5,7 L9.5,7 C9.77614237,7 10,6.77614237 10,6.5 C10,6.22385763 9.77614237,6 9.5,6 L9.5,6 Z M9.5,4 L6.5,4 C6.22385763,4 6,4.22385763 6,4.5 C6,4.77614237 6.22385763,5 6.5,5 L6.5,5 L9.5,5 C9.77614237,5 10,4.77614237 10,4.5 C10,4.22385763 9.77614237,4 9.5,4 L9.5,4 Z"/>
-</svg>
diff --git a/assets/icons/downloads-symbolic_dark.svg b/assets/icons/downloads-symbolic_dark.svg
deleted file mode 100644
index 8cb7209..0000000
--- a/assets/icons/downloads-symbolic_dark.svg
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="16"
-   height="16"
-   viewBox="0 0 16 16"
-   version="1.1"
-   id="svg4"
-   sodipodi:docname="downloads-symbolic_dark.svg"
-   inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
-  <metadata
-     id="metadata10">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <defs
-     id="defs8" />
-  <sodipodi:namedview
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1"
-     objecttolerance="10"
-     gridtolerance="10"
-     guidetolerance="10"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:window-width="1920"
-     inkscape:window-height="982"
-     id="namedview6"
-     showgrid="false"
-     inkscape:zoom="14.75"
-     inkscape:cx="8"
-     inkscape:cy="8"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="1"
-     inkscape:current-layer="svg4" />
-  <path
-     fill="#FFF"
-     fill-opacity=".8"
-     fill-rule="evenodd"
-     d="M8,1 C11.8659932,1 15,4.13400675 15,8 C15,11.8659932 11.8659932,15 8,15 C4.13400675,15 1,11.8659932 1,8 C1,4.13400675 4.13400675,1 8,1 Z M9.5,8 L6.5,8 C6.22385763,8 6,8.22385763 6,8.5 C6,8.77614237 5.77614237,9 5.5,9 L5.5,9 L5,9 C4.89014373,9 4.78478689,9.04364023 4.70710678,9.12132034 C4.54534632,9.2830808 4.54534632,9.54534632 4.70710678,9.70710678 L4.70710678,9.70710678 L7.64644661,12.6464466 C7.84170876,12.8417088 8.15829124,12.8417088 8.35355339,12.6464466 L8.35355339,12.6464466 L11.2928932,9.70710678 C11.3705733,9.62942667 11.4142136,9.52406983 11.4142136,9.41421356 C11.4142136,9.18544973 11.2287638,9 11,9 L11,9 L10.5,9 C10.2238576,9 10,8.77614237 10,8.5 C10,8.22385763 9.77614237,8 9.5,8 L9.5,8 Z M9.5,6 L6.5,6 C6.22385763,6 6,6.22385763 6,6.5 C6,6.77614237 6.22385763,7 6.5,7 L6.5,7 L9.5,7 C9.77614237,7 10,6.77614237 10,6.5 C10,6.22385763 9.77614237,6 9.5,6 L9.5,6 Z M9.5,4 L6.5,4 C6.22385763,4 6,4.22385763 6,4.5 C6,4.77614237 6.22385763,5 6.5,5 L6.5,5 L9.5,5 C9.77614237,5 10,4.77614237 10,4.5 C10,4.22385763 9.77614237,4 9.5,4 L9.5,4 Z"
-     id="path2"
-     style="fill:#ffffff;fill-opacity:0.60000002" />
-</svg>
diff --git a/assets/icons/homepage.svg b/assets/icons/homepage.svg
deleted file mode 100644
index d9e8144..0000000
--- a/assets/icons/homepage.svg
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="16px"
-   height="16px"
-   viewBox="0 0 16 16"
-   version="1.1"
-   id="svg8"
-   sodipodi:docname="homepage.svg"
-   inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
-  <metadata
-     id="metadata14">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <defs
-     id="defs12" />
-  <sodipodi:namedview
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1"
-     objecttolerance="10"
-     gridtolerance="10"
-     guidetolerance="10"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:window-width="1920"
-     inkscape:window-height="982"
-     id="namedview10"
-     showgrid="false"
-     inkscape:zoom="14.75"
-     inkscape:cx="8"
-     inkscape:cy="8"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="1"
-     inkscape:current-layer="svg8" />
-  <!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
-  <title
-     id="title2">category_recommend</title>
-  <desc
-     id="desc4">Created with Sketch.</desc>
-  <g
-     id="category_recommend"
-     stroke="none"
-     stroke-width="1"
-     fill="none"
-     fill-rule="evenodd"
-     style="fill:#000000;fill-opacity:0.86666667">
-    <path
-       d="M8,12.6085145 L4.54924088,14.5160472 C4.06572729,14.783327 3.74708518,14.5504931 3.83503048,14.0113448 L4.5,9.93475242 L1.69148737,7.05624503 C1.30958944,6.6648293 1.44637232,6.27932454 1.97881505,6.19797453 L5.83688104,5.60851449 L7.5726373,1.91049416 C7.8086632,1.40764212 8.19196238,1.40897492 8.4273627,1.91049416 L10.163119,5.60851449 L14.0211849,6.19797453 C14.5617696,6.28056851 14.6893983,6.66586674 14.3085126,7.05624503 L11.5,9.93475242 L12.1649695,14.0113448 C12.2540356,14.557364 11.9269904,14.7793014 11.4507591,14.5160472 L8,12.6085145 Z"
-       id="Star"
-       fill="#536076"
-       style="fill:#000000;fill-opacity:0.86666667" />
-  </g>
-</svg>
diff --git a/assets/icons/homepage_dark.svg b/assets/icons/homepage_dark.svg
deleted file mode 100644
index d69bc55..0000000
--- a/assets/icons/homepage_dark.svg
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="16px"
-   height="16px"
-   viewBox="0 0 16 16"
-   version="1.1"
-   id="svg8"
-   sodipodi:docname="homepage_dark.svg"
-   inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
-  <metadata
-     id="metadata14">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <defs
-     id="defs12" />
-  <sodipodi:namedview
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1"
-     objecttolerance="10"
-     gridtolerance="10"
-     guidetolerance="10"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:window-width="1920"
-     inkscape:window-height="982"
-     id="namedview10"
-     showgrid="false"
-     inkscape:zoom="14.75"
-     inkscape:cx="-15.932203"
-     inkscape:cy="2.5762712"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="1"
-     inkscape:current-layer="svg8" />
-  <!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
-  <title
-     id="title2">category_recommend</title>
-  <desc
-     id="desc4">Created with Sketch.</desc>
-  <g
-     id="category_recommend"
-     stroke="none"
-     stroke-width="1"
-     fill="none"
-     fill-rule="evenodd"
-     style="fill:#ffffff;fill-opacity:0.60000002">
-    <path
-       d="M8,12.6085145 L4.54924088,14.5160472 C4.06572729,14.783327 3.74708518,14.5504931 3.83503048,14.0113448 L4.5,9.93475242 L1.69148737,7.05624503 C1.30958944,6.6648293 1.44637232,6.27932454 1.97881505,6.19797453 L5.83688104,5.60851449 L7.5726373,1.91049416 C7.8086632,1.40764212 8.19196238,1.40897492 8.4273627,1.91049416 L10.163119,5.60851449 L14.0211849,6.19797453 C14.5617696,6.28056851 14.6893983,6.66586674 14.3085126,7.05624503 L11.5,9.93475242 L12.1649695,14.0113448 C12.2540356,14.557364 11.9269904,14.7793014 11.4507591,14.5160472 L8,12.6085145 Z"
-       id="Star"
-       fill="#C5CFE0"
-       style="fill:#ffffff;fill-opacity:0.60000002" />
-  </g>
-</svg>
diff --git a/assets/icons/refresh-page-dark.svg b/assets/icons/refresh-page-dark.svg
deleted file mode 100644
index 38b924c..0000000
--- a/assets/icons/refresh-page-dark.svg
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
-   height="16"
-   width="16"
-   sodipodi:docname="refresh-page-dark.svg"
-   xml:space="preserve"
-   viewBox="0 0 16 16"
-   y="0px"
-   x="0px"
-   id="Layer_1"
-   version="1.1"><metadata
-   id="metadata9"><rdf:RDF><cc:Work
-       rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
-         rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
-   id="defs7" /><sodipodi:namedview
-   inkscape:current-layer="Layer_1"
-   inkscape:window-maximized="1"
-   inkscape:window-y="0"
-   inkscape:window-x="0"
-   inkscape:cy="8.8351119"
-   inkscape:cx="12.452215"
-   inkscape:zoom="34.711876"
-   showgrid="true"
-   id="namedview5"
-   inkscape:window-height="958"
-   inkscape:window-width="1920"
-   inkscape:pageshadow="2"
-   inkscape:pageopacity="0"
-   guidetolerance="10"
-   gridtolerance="10"
-   objecttolerance="10"
-   borderopacity="1"
-   bordercolor="#666666"
-   pagecolor="#ffffff"><inkscape:grid
-     id="grid834"
-     type="xygrid" /></sodipodi:namedview>
-<g
-   style="fill:#ffffff;fill-opacity:0.60000002"
-   transform="scale(0.03125,0.0312082)"
-   id="XMLID_2_">
-	<path
-   style="fill:#ffffff;fill-opacity:0.60000002"
-   d="M 436.6,75.4 C 390.1,28.9 326.7,0 256,0 114.5,0 0,114.5 0,256 0,397.5 114.5,512 256,512 375.2,512 474.8,430.1 503.6,320.2 h -67 C 410.5,394.7 339.8,447.7 256,447.7 149.9,447.7 64.2,362.1 64.2,255.9 64.2,149.7 149.9,64.2 256,64.2 c 53.1,0 100.5,22.3 135,56.8 L 287.7,224.3 H 512 V 0 Z"
-   id="XMLID_4_" />
-</g>
-</svg>
diff --git a/assets/icons/refresh-page.svg b/assets/icons/refresh-page.svg
deleted file mode 100644
index bab5516..0000000
--- a/assets/icons/refresh-page.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
-   height="16"
-   width="16"
-   sodipodi:docname="refresh-page.svg"
-   xml:space="preserve"
-   viewBox="0 0 16 16"
-   y="0px"
-   x="0px"
-   id="Layer_1"
-   version="1.1"><metadata
-   id="metadata9"><rdf:RDF><cc:Work
-       rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
-         rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
-   id="defs7" /><sodipodi:namedview
-   inkscape:current-layer="Layer_1"
-   inkscape:window-maximized="1"
-   inkscape:window-y="0"
-   inkscape:window-x="0"
-   inkscape:cy="8.8351119"
-   inkscape:cx="12.452215"
-   inkscape:zoom="34.711876"
-   showgrid="true"
-   id="namedview5"
-   inkscape:window-height="958"
-   inkscape:window-width="1920"
-   inkscape:pageshadow="2"
-   inkscape:pageopacity="0"
-   guidetolerance="10"
-   gridtolerance="10"
-   objecttolerance="10"
-   borderopacity="1"
-   bordercolor="#666666"
-   pagecolor="#ffffff"><inkscape:grid
-     id="grid834"
-     type="xygrid" /></sodipodi:namedview>
-<g
-   transform="scale(0.03125,0.0312082)"
-   id="XMLID_2_">
-	<path
-   d="M 436.6,75.4 C 390.1,28.9 326.7,0 256,0 114.5,0 0,114.5 0,256 0,397.5 114.5,512 256,512 375.2,512 474.8,430.1 503.6,320.2 h -67 C 410.5,394.7 339.8,447.7 256,447.7 149.9,447.7 64.2,362.1 64.2,255.9 64.2,149.7 149.9,64.2 256,64.2 c 53.1,0 100.5,22.3 135,56.8 L 287.7,224.3 H 512 V 0 Z"
-   id="XMLID_4_" />
-</g>
-</svg>
diff --git a/assets/icons/theme-symbolic.svg b/assets/icons/theme-symbolic.svg
deleted file mode 100644
index d3a6344..0000000
--- a/assets/icons/theme-symbolic.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
-  <path fill-rule="evenodd" d="M3.5,14 C3.22385763,14 3,13.7761424 3,13.5 C3,13.2238576 3.22385763,13 3.5,13 L7,13 L7,12 L2,12 C1.44771525,12 1,11.5522847 1,11 L15,11 C15,11.5522847 14.5522847,12 14,12 L9,12 L9,13 L12.5,13 C12.7761424,13 13,13.2238576 13,13.5 C13,13.7761424 12.7761424,14 12.5,14 L3.5,14 Z M13,2 C14.1045695,2 15,2.8954305 15,4 L15,10 L1,10 L1,4 C1,2.8954305 1.8954305,2 3,2 L13,2 Z"/>
-</svg>
diff --git a/assets/icons/theme-symbolic_dark.svg b/assets/icons/theme-symbolic_dark.svg
deleted file mode 100644
index 57352c4..0000000
--- a/assets/icons/theme-symbolic_dark.svg
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="16"
-   height="16"
-   viewBox="0 0 16 16"
-   version="1.1"
-   id="svg4"
-   sodipodi:docname="theme-symbolic_dark.svg"
-   inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
-  <metadata
-     id="metadata10">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <defs
-     id="defs8" />
-  <sodipodi:namedview
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1"
-     objecttolerance="10"
-     gridtolerance="10"
-     guidetolerance="10"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:window-width="1920"
-     inkscape:window-height="982"
-     id="namedview6"
-     showgrid="false"
-     inkscape:zoom="14.75"
-     inkscape:cx="8"
-     inkscape:cy="8"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="1"
-     inkscape:current-layer="svg4" />
-  <path
-     fill="#FFF"
-     fill-opacity=".8"
-     fill-rule="evenodd"
-     d="M3.5,14 C3.22385763,14 3,13.7761424 3,13.5 C3,13.2238576 3.22385763,13 3.5,13 L7,13 L7,12 L2,12 C1.44771525,12 1,11.5522847 1,11 L15,11 C15,11.5522847 14.5522847,12 14,12 L9,12 L9,13 L12.5,13 C12.7761424,13 13,13.2238576 13,13.5 C13,13.7761424 12.7761424,14 12.5,14 L3.5,14 Z M13,2 C14.1045695,2 15,2.8954305 15,4 L15,10 L1,10 L1,4 C1,2.8954305 1.8954305,2 3,2 L13,2 Z"
-     id="path2"
-     style="opacity:1;fill:#ffffff;fill-opacity:0.60000002" />
-</svg>
diff --git a/assets/icons/upgrades-symbolic.svg b/assets/icons/upgrades-symbolic.svg
deleted file mode 100644
index b25d370..0000000
--- a/assets/icons/upgrades-symbolic.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg" stroke="null" style="vector-effect: non-scaling-stroke;">
-
- <g stroke="null">
-  <title stroke="null">Layer 1</title>
-  <path transform="rotate(-180 8 8)" stroke="null" id="svg_1" d="m8,1c3.86599,0 7,3.13401 7,7c0,3.86599 -3.13401,7 -7,7c-3.86599,0 -7,-3.13401 -7,-7c0,-3.86599 3.13401,-7 7,-7zm1.5,7l-3,0c-0.27614,0 -0.5,0.22386 -0.5,0.5c0,0.27614 -0.22386,0.5 -0.5,0.5l0,0l-0.5,0c-0.10986,0 -0.21521,0.04364 -0.29289,0.12132c-0.16176,0.16176 -0.16176,0.42403 0,0.58579l0,0l2.93934,2.93934c0.19526,0.19526 0.51184,0.19526 0.7071,0l0,0l2.93934,-2.93934c0.07768,-0.07768 0.12132,-0.18304 0.12132,-0.2929c0,-0.22876 -0.18545,-0.41421 -0.41421,-0.41421l0,0l-0.5,0c-0.27614,0 -0.5,-0.22386 -0.5,-0.5c0,-0.27614 -0.22386,-0.5 -0.5,-0.5l0,0zm0,-2l-3,0c-0.27614,0 -0.5,0.22386 -0.5,0.5c0,0.27614 0.22386,0.5 0.5,0.5l0,0l3,0c0.27614,0 0.5,-0.22386 0.5,-0.5c0,-0.27614 -0.22386,-0.5 -0.5,-0.5l0,0zm0,-2l-3,0c-0.27614,0 -0.5,0.22386 -0.5,0.5c0,0.27614 0.22386,0.5 0.5,0.5l0,0l3,0c0.27614,0 0.5,-0.22386 0.5,-0.5c0,-0.27614 -0.22386,-0.5 -0.5,-0.5l0,0z" fill-rule="evenodd"/>
- </g>
-</svg>
\ No newline at end of file
diff --git a/assets/icons/upgrades-symbolic_dark.svg b/assets/icons/upgrades-symbolic_dark.svg
deleted file mode 100644
index 01a3901..0000000
--- a/assets/icons/upgrades-symbolic_dark.svg
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="16"
-   height="16"
-   viewBox="0 0 16 16"
-   version="1.1"
-   id="svg4"
-   sodipodi:docname="downloads-symbolic_dark.svg"
-   inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
-  <metadata
-     id="metadata10">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <defs
-     id="defs8" />
-  <sodipodi:namedview
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1"
-     objecttolerance="10"
-     gridtolerance="10"
-     guidetolerance="10"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:window-width="1920"
-     inkscape:window-height="982"
-     id="namedview6"
-     showgrid="false"
-     inkscape:zoom="14.75"
-     inkscape:cx="8"
-     inkscape:cy="8"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="1"
-     inkscape:current-layer="svg4" />
-  <path
-     transform="rotate(-180 8 8)"
-     fill="#FFF"
-     fill-opacity=".8"
-     fill-rule="evenodd"
-     d="M8,1 C11.8659932,1 15,4.13400675 15,8 C15,11.8659932 11.8659932,15 8,15 C4.13400675,15 1,11.8659932 1,8 C1,4.13400675 4.13400675,1 8,1 Z M9.5,8 L6.5,8 C6.22385763,8 6,8.22385763 6,8.5 C6,8.77614237 5.77614237,9 5.5,9 L5.5,9 L5,9 C4.89014373,9 4.78478689,9.04364023 4.70710678,9.12132034 C4.54534632,9.2830808 4.54534632,9.54534632 4.70710678,9.70710678 L4.70710678,9.70710678 L7.64644661,12.6464466 C7.84170876,12.8417088 8.15829124,12.8417088 8.35355339,12.6464466 L8.35355339,12.6464466 L11.2928932,9.70710678 C11.3705733,9.62942667 11.4142136,9.52406983 11.4142136,9.41421356 C11.4142136,9.18544973 11.2287638,9 11,9 L11,9 L10.5,9 C10.2238576,9 10,8.77614237 10,8.5 C10,8.22385763 9.77614237,8 9.5,8 L9.5,8 Z M9.5,6 L6.5,6 C6.22385763,6 6,6.22385763 6,6.5 C6,6.77614237 6.22385763,7 6.5,7 L6.5,7 L9.5,7 C9.77614237,7 10,6.77614237 10,6.5 C10,6.22385763 9.77614237,6 9.5,6 L9.5,6 Z M9.5,4 L6.5,4 C6.22385763,4 6,4.22385763 6,4.5 C6,4.77614237 6.22385763,5 6.5,5 L6.5,5 L9.5,5 C9.77614237,5 10,4.77614237 10,4.5 C10,4.22385763 9.77614237,4 9.5,4 L9.5,4 Z"
-     id="path2"
-     style="fill:#ffffff;fill-opacity:0.60000002" />
-</svg>
diff --git a/assets/spark-logo.svg b/assets/spark-logo.svg
deleted file mode 100644
index 217bd06..0000000
--- a/assets/spark-logo.svg
+++ /dev/null
@@ -1,253 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   sodipodi:docname="spark-logo.svg"
-   inkscape:version="1.1 (c4e8f9e, 2021-05-24)"
-   id="svg8"
-   version="1.1"
-   viewBox="0 0 180.00012 48.251057"
-   height="48.251057mm"
-   width="180.00012mm"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:dc="http://purl.org/dc/elements/1.1/">
-  <defs
-     id="defs2">
-    <linearGradient
-       id="linearGradient1200"
-       inkscape:collect="always">
-      <stop
-         id="stop1196"
-         offset="0"
-         style="stop-color:#000000;stop-opacity:0.1299435" />
-      <stop
-         id="stop1198"
-         offset="1"
-         style="stop-color:#dadada;stop-opacity:0.81960785" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient1138">
-      <stop
-         style="stop-color:#99e7ea;stop-opacity:1"
-         offset="0"
-         id="stop1134" />
-      <stop
-         style="stop-color:#007ffc;stop-opacity:1"
-         offset="1"
-         id="stop1136" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient1128"
-       inkscape:collect="always">
-      <stop
-         id="stop1124"
-         offset="0"
-         style="stop-color:#99e7ea;stop-opacity:1" />
-      <stop
-         id="stop1126"
-         offset="1"
-         style="stop-color:#007ffc;stop-opacity:1" />
-    </linearGradient>
-    <inkscape:path-effect
-       only_selected="false"
-       apply_with_weight="true"
-       apply_no_weight="true"
-       helper_size="0"
-       steps="2"
-       weight="33.333333"
-       is_visible="true"
-       id="path-effect960"
-       effect="bspline"
-       lpeversion="0" />
-    <radialGradient
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.98112945,0,3.7714702)"
-       r="90.135414"
-       fy="199.86011"
-       fx="100.35268"
-       cy="199.86011"
-       cx="100.35268"
-       id="radialGradient1130"
-       xlink:href="#linearGradient1128"
-       inkscape:collect="always" />
-    <radialGradient
-       r="90.135414"
-       fy="199.86011"
-       fx="100.35268"
-       cy="199.86011"
-       cx="100.35268"
-       gradientTransform="matrix(1,0,0,0.98112945,0,3.7714702)"
-       gradientUnits="userSpaceOnUse"
-       id="radialGradient1132"
-       xlink:href="#linearGradient1138"
-       inkscape:collect="always" />
-    <radialGradient
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.98112945,0,3.7714702)"
-       r="90.135414"
-       fy="199.86011"
-       fx="100.35268"
-       cy="199.86011"
-       cx="100.35268"
-       id="radialGradient1202"
-       xlink:href="#linearGradient1200"
-       inkscape:collect="always" />
-    <filter
-       id="filter1448"
-       inkscape:label="Drop Shadow"
-       style="color-interpolation-filters:sRGB">
-      <feFlood
-         id="feFlood1438"
-         result="flood"
-         flood-color="rgb(145,145,145)"
-         flood-opacity="0.372549" />
-      <feComposite
-         id="feComposite1440"
-         result="composite1"
-         operator="in"
-         in2="SourceGraphic"
-         in="flood" />
-      <feGaussianBlur
-         id="feGaussianBlur1442"
-         result="blur"
-         stdDeviation="5.2918"
-         in="composite1" />
-      <feOffset
-         id="feOffset1444"
-         result="offset"
-         dy="0"
-         dx="0" />
-      <feComposite
-         id="feComposite1446"
-         result="composite2"
-         operator="over"
-         in2="offset"
-         in="SourceGraphic" />
-    </filter>
-    <filter
-       id="filter2201"
-       inkscape:label="Drop Shadow"
-       style="color-interpolation-filters:sRGB">
-      <feFlood
-         id="feFlood2191"
-         result="flood"
-         flood-color="rgb(145,145,145)"
-         flood-opacity="0.372549" />
-      <feComposite
-         id="feComposite2193"
-         result="composite1"
-         operator="in"
-         in2="SourceGraphic"
-         in="flood" />
-      <feGaussianBlur
-         id="feGaussianBlur2195"
-         result="blur"
-         stdDeviation="3.76995"
-         in="composite1" />
-      <feOffset
-         id="feOffset2197"
-         result="offset"
-         dy="0"
-         dx="0" />
-      <feComposite
-         id="feComposite2199"
-         result="composite2"
-         operator="over"
-         in2="offset"
-         in="SourceGraphic" />
-    </filter>
-  </defs>
-  <sodipodi:namedview
-     inkscape:document-rotation="0"
-     inkscape:window-maximized="1"
-     inkscape:window-y="0"
-     inkscape:window-x="0"
-     inkscape:window-height="946"
-     inkscape:window-width="1920"
-     showgrid="false"
-     inkscape:current-layer="layer2"
-     inkscape:document-units="mm"
-     inkscape:cy="332.14286"
-     inkscape:cx="520.71429"
-     inkscape:zoom="0.7"
-     inkscape:pageshadow="2"
-     inkscape:pageopacity="0.0"
-     borderopacity="1.0"
-     bordercolor="#666666"
-     pagecolor="#ffffff"
-     id="base"
-     inkscape:pagecheckerboard="0" />
-  <metadata
-     id="metadata5">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="translate(-34.291348,-63.035531)"
-     id="layer1"
-     inkscape:groupmode="layer"
-     inkscape:label="Layer 1" />
-  <g
-     inkscape:label="Layer 2"
-     id="layer2"
-     inkscape:groupmode="layer"
-     transform="translate(-34.291348,33.964469)">
-    <path
-       inkscape:connector-curvature="0"
-       id="path1002"
-       d="m 50.895965,-25.80076 c 0,0 3.210258,-0.04536 6.509677,1.995776 3.299426,2.041135 5.216663,3.991553 5.840878,5.261592 0.624212,1.270041 2.67521,3.492613 2.630628,7.574884 -0.04461,4.0822665 -0.98091,6.8037874 -2.586039,9.0717077 -1.605128,2.26792732 -4.503272,3.9915518 -7.981044,4.0822737 -3.477778,0.090717 -5.707121,-2.17720666 -6.465096,-3.4472534 -0.757975,-1.270036 -1.070084,-3.9915518 -0.133761,-5.9419619 0.936325,-1.9504282 2.40769,-1.9504282 2.898147,-1.7689877 0.490455,0.181438 0.624213,0.4535811 0.891735,0.9525256 0.26752,0.4989447 0.44587,0.4082311 0.847161,0.1360795 0.401275,-0.2721541 0.535033,-0.5896654 0.445866,-0.9978916 -0.08917,-0.408231 -0.62422,-0.9071732 -1.070092,-1.0432502 -0.445865,-0.1360747 -1.070085,-0.5443017 -1.961822,-0.4082167 -0.891736,0.136065 -2.630623,0.5896548 -4.101988,2.585427 -1.471365,1.9957744 -1.29302,5.0801606 -0.401281,6.5316309 0.891737,1.45147531 2.586035,4.1729873 6.331332,5.1255217 3.745301,0.9525364 9.809105,-1.8597006 11.904684,-6.2141209 2.095577,-4.3544229 2.140168,-6.3955562 2.051001,-9.9788777 -0.08917,-3.583335 -3.254842,-8.935643 -6.777199,-10.886061 -3.522357,-1.950419 -6.152982,-3.084383 -8.872787,-2.630797 z"
-       style="fill:#ffc344;fill-opacity:1;stroke:none;stroke-width:0.0890379px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path1012"
-       d="m 52.759546,-7.6807986 c 0,0 -0.882776,-0.833911 -1.670967,0.6414663 -0.788192,1.4753675 -1.166523,2.790373 -0.378332,4.3940472 0.78819,1.6036647 2.427624,2.56586017 4.949854,2.53379165 2.522203,-0.0321084 4.382334,-0.64146726 5.485801,-2.46964635 1.103472,-1.8281836 1.954712,-3.1752577 2.049297,-3.8487984 0.09459,-0.6735444 0.599029,0.096216 0.441394,0.6735407 -0.15764,0.5773125 -0.126112,1.6998816 0.315273,1.4753653 0.441388,-0.2245063 0.788195,-0.5773163 0.851243,-0.4169509 0.06306,0.1603616 -0.50444,1.154644 -0.772422,1.6517766 -0.267993,0.4971326 -1.103472,1.699893 -1.592156,2.16494892 -0.488669,0.46506666 -1.166517,1.1225704 -1.970475,1.6036691 C 59.664103,1.2035109 58.418766,1.7647989 57.725156,1.893092 57.031546,2.0213857 55.644328,2.2940039 54.856131,2.2619316 54.067946,2.2298548 53.059055,2.0855246 51.939826,1.5242442 50.820592,0.96296626 49.606778,0.0969782 49.133864,-0.76900099 48.66095,-1.6349808 47.935815,-2.4207789 48.093452,-4.6017617 c 0.15764,-2.1809854 0.86701,-3.3035574 1.40298,-3.8167243 0.53597,-0.5131766 1.32416,-0.7376922 1.844369,-0.6254295 0.520205,0.1122529 0.851246,0.4169555 0.977357,0.6414613 0.126107,0.224512 0.331042,0.6414675 0.441388,0.7216556 z"
-       style="fill:#f06767;fill-opacity:1;stroke:none;stroke-width:0.0890379px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path1014"
-       d="m 60.767575,3.8655962 c 0,0 3.783317,-2.2130621 5.548864,-5.7090499 1.765551,-3.4959942 2.522214,-5.7411261 2.30152,-9.1729813 -0.220695,-3.431843 -0.756663,-1.731959 -0.157641,-3.207334 0.599026,-1.475377 -0.378328,-4.394049 0.03152,-4.586488 0.409861,-0.19244 1.292637,1.282934 1.544859,2.469649 0.252214,1.186712 1.355684,4.843067 0.472911,9.4937107 -0.882773,4.6506303 -2.963589,6.51088559 -4.350812,7.76175223 C 64.77157,2.1657114 61.618812,4.3467019 61.145898,4.314627 60.67298,4.2825186 60.609928,4.2825186 60.76756,3.8655962 Z"
-       style="fill:#3f62eb;fill-opacity:1;stroke:none;stroke-width:0.0890379px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path1016"
-       d="m 53.957602,-2.8698091 c 0,0 2.017773,0.4490302 3.562621,-0.5131634 1.544859,-0.9622063 2.742913,-2.5337986 2.932073,-3.1431917 0.189165,-0.6093954 0.220697,0.5452465 0.441386,-0.032045 0.220692,-0.5773293 1.10347,-1.7319649 0.662081,-4.4261318 -0.441389,-2.694157 -0.472916,-2.822457 -1.292627,-4.265758 -0.819727,-1.443301 -2.774446,-3.431845 -3.972493,-4.073313 -1.198047,-0.641466 -2.86901,-1.603666 -5.170538,-1.53952 -2.301517,0.06415 -1.544853,-0.09622 -3.751788,0.288661 -2.206938,0.384879 -4.193179,1.4433 -4.855258,2.02062 -0.66208,0.577321 -2.427629,2.148917 -3.058183,3.014896 -0.630554,0.865981 -2.364573,2.822454 -3.278875,5.5486918 -0.914302,2.7262327 -1.292635,3.0148925 -1.35569,4.8109998 -0.06306,1.7961094 0.157637,2.2772018 -0.220692,2.4375779 -0.378332,0.1603616 -0.315277,-1.3470823 -0.283751,-2.4055093 0.03153,-1.0584128 0.03153,-3.8167249 1.418745,-6.8957642 1.387216,-3.079043 3.846373,-5.644912 5.23359,-6.575039 1.387216,-0.930126 2.995127,-2.180987 5.485811,-2.790382 2.490685,-0.609392 4.981368,-0.513172 6.526228,-0.224513 1.544859,0.288661 3.94096,1.282935 5.23359,2.277208 1.292636,0.994275 2.711385,2.213062 3.78332,4.20161 1.07194,1.988545 1.355684,4.522341 1.324159,5.5807587 -0.03152,1.0584266 -0.567498,3.4960027 -1.387216,4.6827127 -0.819721,1.186715 -1.923185,2.597942 -3.05818,3.1111149 -1.135,0.5131697 -2.522222,0.6735396 -3.657204,0.1603641 C 54.08371,-2.132102 54.146768,-2.3245385 53.957602,-2.869785 Z"
-       style="fill:#fce102;fill-opacity:1;stroke:none;stroke-width:0.0890379px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path1018"
-       d="m 53.957602,-2.8698091 c 0,0 1.597697,0.4513829 2.946439,-0.1609516 1.348754,-0.6123403 1.850358,-1.2020043 2.173613,-1.5535277 0.323251,-0.3515343 0.936324,-1.0092338 1.103526,-1.3154017 0.167198,-0.3061663 0.345542,-0.4876031 0.345542,-0.6009978 0,-0.1133983 -0.312104,-0.3855536 -0.01112,-1.043249 0.300955,-0.6576966 0.568485,-2.1658733 0.434721,-2.8462471 -0.133762,-0.680377 -0.445868,-4.456482 -3.121079,-6.973885 -2.675203,-2.517401 -5.328127,-2.81223 -5.328127,-2.81223 0,0 4.235756,1.338077 6.219869,5.397669 1.984117,4.059596 1.337601,6.66771 0.06688,8.2552586 -1.270724,1.5875487 -3.076491,1.7689868 -3.566953,1.3607558 -0.490444,-0.4082292 -1.501077,1.8641068 -1.26328,2.2928065 z"
-       style="fill:#5ed938;fill-opacity:1;stroke:none;stroke-width:0.0890379px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path1020"
-       d="m 48.800383,-17.432105 c 0,0 -2.853557,-0.02267 -5.01602,1.406112 -2.16246,1.428797 -3.210252,2.585441 -3.812175,3.492612 -0.601919,0.907174 -1.293016,2.154531 -1.203842,2.131854 0.08917,-0.0227 2.60833,-3.53797 4.57015,-4.445139 1.961822,-0.907173 3.923641,-2.177213 6.621146,-1.247366 2.697505,0.929857 3.968232,2.222571 4.547859,1.905065 0.579629,-0.31751 0.691101,-0.70306 0.356697,-1.133966 -0.334399,-0.430906 -2.697508,-2.540081 -6.063815,-2.109172 z"
-       style="fill:#8fdbe9;fill-opacity:1;stroke:none;stroke-width:0.0890379px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path1022"
-       d="m 44.530829,0.69033794 c 0.189165,0.0962163 1.607908,2.56586906 2.742905,2.98282056 1.134994,0.4169541 1.891657,0.4490201 2.017767,0.6414685 0.126111,0.192439 0.09459,1.1546409 1.103469,1.5716019 1.008886,0.4169522 5.738036,1.7319552 7.09372,1.8602476 1.355695,0.1282956 0.2207,0.9301201 1.040416,1.2187811 0.819723,0.2886654 4.319291,0.4490282 5.170539,0.096218 0.851247,-0.3528 0.851247,0.3207371 -0.630553,0.8980604 -1.481799,0.577316 -5.391228,1.956476 -7.944967,1.635743 C 52.570379,11.274546 49.543723,10.729296 47.84123,9.5105098 46.138737,8.2917237 45.413601,7.7464765 46.044154,7.6502577 c 0.630553,-0.096225 2.30152,1.6998841 3.026654,1.8923257 0.725137,0.1924358 1.324162,0.1924358 0.882773,-0.2565932 C 49.512197,8.8369677 46.64318,6.8484212 46.359433,6.9446376 46.075682,7.0408596 45.476656,7.1050004 44.972214,6.4314646 44.467772,5.7579276 41.819449,2.0374171 41.977086,0.04887194 42.134727,-1.9396732 42.63917,-1.4265066 43.238195,-0.6888129 c 0.599024,0.73768484 1.292634,1.37915084 1.292634,1.37915084 z"
-       style="fill:#fd7aff;fill-opacity:1;stroke:none;stroke-width:0.0890379px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:1.28957px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0322394"
-       x="80.617455"
-       y="4.5832744"
-       id="text24207"><tspan
-         sodipodi:role="line"
-         id="tspan24205"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:49.4338px;font-family:Yukarimobile;-inkscape-font-specification:'Yukarimobile, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1d2129;fill-opacity:1;stroke-width:0.0322394"
-         x="80.617455"
-         y="4.5832744">spark</tspan></text>
-  </g>
-</svg>
diff --git a/assets/spark-store.png b/assets/spark-store.png
deleted file mode 100644
index 6cef7d1..0000000
Binary files a/assets/spark-store.png and /dev/null differ
diff --git a/assets/spark-store.xcf b/assets/spark-store.xcf
deleted file mode 100644
index 7927d70..0000000
Binary files a/assets/spark-store.xcf and /dev/null differ
diff --git a/debian/changelog b/debian/changelog
index ede3d6a..c062988 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,369 +1,5 @@
-spark-store (3.4~test1) stable; urgency=medium
+spark-store (3.1.0~pre1) unstable; urgency=medium
 
-  * feat: aptss不再尝试安装apt-fast,转而自带
-  * chore:  删除password-check模块
+  * Initial commit for dpkg-buildpackage scripts
 
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.3.3) stable; urgency=medium
-
-  * feat: 首页链接调用浏览器打开 
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-0spark-store (3.3.3~test5) stable; urgency=medium
-
-  * 修复可能的内存泄漏问题
-  * 修复应用搜索为空但仍显示上一次搜索结果的问题
-  * 修复动画加载延后的问题
-  * 修复统计下载量卡主渲染线程的问题
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-
-spark-store (3.3.3~test4) stable; urgency=medium
-
-  * Enable i386 arch support by default
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.3.3~test3) stable; urgency=medium
-
-  * Now use ss-apt-fast instead of apt-fast
-  * 修复:右上角 更新和安装设置 菜单中进入更新列表失效
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.3.3~test2) stable; urgency=medium
-
-  * bug fix: 更新和检查更新出错时不报错.此更新需要一个推送
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.3.3~test1) stable; urgency=medium
-
-  * 3.3.3将会是修复大部分bug后的最终版本
-  * 图形环境中所有root权限的组件剥离到cli(可用于deepin 23 daily,只保证商店本体正常运作,不处理安装依赖不满足)
-  * 文案更改:更新检查-->检查更新
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.3.1~test1) stable; urgency=medium
-
-  * 安装时不再需要联网
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.3.0.4) stable; urgency=medium
-
-  * 为减轻服务器压力,不再单独更新某一个应用,而是作为整体更新
-
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.3.0.3) stable; urgency=medium
-
-  * 回滚 更新中行为到进度条而不是实时输出
-  * 更新应用时显示正在更新哪个应用
-
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.3.0.2) stable; urgency=medium
-
-  * 修复 pkexec未执行
-
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.3.0.1) stable; urgency=medium
-
-  * 修复 检查更新的更新进程未实际运行
-
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.3) stable; urgency=medium
-
-  * 修复 检查更新 未刷新软件源
-  * 把检查更新单独拿出作为左列
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.3~test3) stable; urgency=medium
-
-  * 把检查更新加入免密码
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.3~test2) stable; urgency=medium
-
-  * 更新检测功能全部更改到zenity
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.3~test1) stable; urgency=medium
-
-  * zenity,选择可更新应用
-  * 自动更新检测现在会跳过hold
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.2.4) stable; urgency=medium
-
-  * 修改tag相关的文案内容:wine相关环境已可自动配置了
-  * 准备发版
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.2.4~test4) stable; urgency=medium
-
-  * 现在在商店启动后点击spk链接仍会正常启动 https://gitee.com/deepin-community-store/spark-store/commit/dd6780d636042bf12d77414e6f1552cc7d1ed24c
-  
-
-
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.2.4~test3) stable; urgency=medium
-
-  * 发版,合入到master
-  * 翻译完毕
-  * 合入先前的各项改动,为:客户端集成投稿器入口和支持,修复:安装依赖时间较长时错误地返回“安装完毕”结果,现在客户端版本更新时不关闭免密码登录,UOS安装进程合并正常aptss中
-
-
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.2.4~test2) stable; urgency=medium
-
-  * 客户端集成投稿器入口和支持
-  * 修复:安装依赖时间较长时错误地返回“安装完毕”结果
-
-
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.2.4~test1) stable; urgency=medium
-
-  * 客户端更新时不关闭免密码登录
-  * UOS合并正常aptss中
-
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.2.3) stable; urgency=medium
-
-  * 客户端异常退出时仍然占用资源问题修复
-  * 降低dtk依赖版本,Debian 11 stable可直接安装
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.2.2) stable; urgency=medium
-
-  * aptss will now refresh the system source before doing install,  policy....etc
-  * 启动客户端GPU加速支持
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.2.1) stable; urgency=medium
-
-  * 更改刷新系统源的功能
-
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.2) stable; urgency=medium
-
-  * 新增 下载量统计功能
-  * 新增 显示下载量
-  * 修复 spk链接生成错误
-  * 调整 启动时检测商店applist源
-  * 新增 applist cdn加速
-  * 调整 ssupdate不再更新/etc/aptss下的cache,如要如此,请使用aptss update
-  * 修复 在更新检测设置中的是否开启自动更新检测设置项的显示不随开启或关闭状态改变
-  * 修复 在检测更新时临时降低优先级到100,防止系统中有且版本一致的包被反复来回更新 
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.1.6) stable; urgency=medium
-
-  * 修复部分情况下无法选中正确的镜像源的问题
-  * 合入3.1.5以来的各项修改
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.1.5-5) stable; urgency=medium
-
-  * 从所有镜像源中选取最快镜像源高速下载
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-
-spark-store (3.1.5-4) stable; urgency=medium
-
-  * 更改ss-apt-fast策略,现在只会在update,ssupdate和没有检测到配置文件的时候更新配置文件
-  * 新增ss-apt-fast别名:aptss 
-  * 更新检测服务优化:从分体改为一体
-  * aptss 支持自动补全
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.1.5-3) stable; urgency=medium
-
-  * 包内自带密钥
-
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.1.5-2) stable; urgency=medium
-
-  * 下载软件时跳过获取大小,修复部分软件无法下载的问题
-  * 修复 获取key时出错,指定使用http1.1
-
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.1.5-1) stable; urgency=medium
-
-  * 改变更新策略,UOS也下载加速,但是安装不加速
-
-
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.1.5) stable; urgency=medium
-
-  * 改变更新策略,现在支持应用在更新时引入新依赖
-  * ss-apt-fast现在默认允许降级,以与apt使用体验一致
-
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.1.4-2) stable; urgency=medium
-
-  * 客户端下载使用metalink来支持bt下载加速
-  * 修复使用更新和安装设置更新商店本体时出错
-
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.1.4-1) stable; urgency=medium
-
-  * 安装脚本和检测更新脚本检查网络时间超时时间延长至5s  
-  * 修复:ssinstall在没有安装apt-fast的情况下首次安装需要依赖的软件时安装失败 
-
--- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.1.4) stable; urgency=medium
-
-  * 发布正式版,同步到官网
-  * 修复安装时使用wget的问题
-  * 合并3.1.3-1和3.1.3-2的更改
-  * 屏蔽了ssinstall之外的安装方式
-  * 调整了报错框的形式
-  * 修复pkexec下ssinstall不处理依赖
-
- -- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.1.3-2) stable; urgency=medium
-
-  * 调整 现在与系统更新分开,不再导致更新失败
-  * 支持直接更新软件源文件,不再让d.吃全部更新流量
-  * ss-apt-fast不再强制root权限
-  * 修改ss-apt-fast的策略,现在除了安装,下载和更新都改用apt
-  * ssinstall 现在也会在不适用ss-apt-fast的时候模拟源了(针对UOS)
-
-
- -- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.1.3-1) stable; urgency=medium
-
-  * 修复 下载提前退出
-  * 移除 下载量显示
-
-
- -- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.1.3) stable; urgency=medium
-
-  * Now uses aria2 to download softwares form all mirrors
-  * 新增:ssinstall现在会在没有apt-fast的时候自动安装
-  * 新增:ss-apt-fast现在会在没有apt-fast的时候自动安装
-  * 修改:删除ssinstall中无用的 || dpkg -P $1
-  * 新增:ss-apt-fast会先下载云上的conf以确保mirror是最新的
-  * 修复:去除wget指令
-
- -- shenmo <shenmo@spark-app.store>  Fri, 30 Jan 2022 00:00:00 +0800
-
-spark-store (3.1.2) stable; urgency=medium
-
-  * Now let apt-fast method support all mirrors
-  * Now will download dependencies and upgrade with all mirrors
-
- -- shenmo <shenmo@spark-app.store>  Mon, 17 Jan 2022 00:00:00 +0800
-
-
-
-
-spark-store (3.1.1) stable; urgency=medium
-
-  * Now will delete the link of policy file after uninstall or upgrade
-  * Now ss-update-controler will create symbol link instead of hard link
-
- -- shenmo <shenmo@spark-app.store>  Mon, 17 Jan 2022 00:00:00 +0800
-
-
-
-
-spark-store (3.1.0) stable; urgency=medium
-
-  * Add pkexec policy: ssinstall. Only will be enabled after permitted.
-  * Modify ssinistall script: Now will ask for password when not run as root
-
- -- shenmo <shenmo@spark-app.store>  Mon, 17 Jan 2022 00:00:00 +0800
-
-
-
-spark-store (3.0.3-13) stable; urgency=medium
-
-  * Update the ssinstall script. Now support apt-fast and will temporarily increase the spark store source priority to 500 to make depends install correctly
-  * Change the style of About Dialog
-  * Modified depends to avoid Deb installers can not handle "Provides"
-
- -- shenmo <shenmo@spark-app.store>  Mon, 17 Jan 2022 00:00:00 +0800
-
-
-
-spark-store (3.0.3-12) stable; urgency=medium
-
-  * Rollback to use DApplication::loadDXcbPlugin() to make titlebar behave normally in ubuntu
-  * Now can run on Debian 11
-  * Now can run on Ubuntu 22.04
-
- -- shenmo <shenmo@spark-app.store>  Mon, 17 Jan 2022 00:00:00 +0800
-
-
-
-
-spark-store (3.0.3-11) stable; urgency=medium
-
-  * Now support autoupdate
-
- -- shenmo <shenmo@spark-app.store>  Mon, 17 Jan 2022 00:00:00 +0800
-
-
-
-
-spark-store (3.0.3-10) stable; urgency=medium
-
-  * Now also compile dstore patch
-
- -- shenmo <shenmo@spark-app.store>  Mon, 17 Jan 2022 00:00:00 +0800
-
-
-spark-store (3.0.3-9) stable; urgency=medium
-
-  * Support dpkg-buildpackage
-
- -- shenmo <shenmo@spark-app.store>  Mon, 17 Jan 2022 00:00:00 +0800
+ -- shenmo <shenmo@spark-app.store>  Wed, 12 Jan 2022 02:00:00 +0800
diff --git a/debian/control b/debian/control
index db6434c..b6670ac 100644
--- a/debian/control
+++ b/debian/control
@@ -3,44 +3,42 @@ Maintainer: shenmo <shenmo@spark-app.store>
 Section: utils
 Priority: optional
 Build-Depends:
- debhelper (>= 9),
- pkg-config,
- qtchooser (>= 55-gc9562a1-1~),
- libqt5core5a,
- libqt5gui5,
- libqt5widgets5,
- libqt5network5,
- libqt5concurrent5,
- libdtkcore-dev(>=5.0),
- libdtkgui-dev(>=5.0),
- libdtkwidget-dev(>=5.0),
- qttools5-private-dev,
- libnotify-dev,
- qtwebengine5-dev
-Standards-Version: 3.0
+    debhelper (>= 9),
+    pkg-config,
+    qtchooser (>= 55-gc9562a1-1~),
+    libqt5core5a,
+    libqt5gui5,
+    libqt5widgets5,
+    libqt5network5,
+    libqt5concurrent5,
+    libdtkcore-dev,
+    libdtkgui-dev,
+    libdtkwidget-dev,
+    qttools5-private-dev,
+    libnotify-dev
+Standards-Version: 3.1.0
 Homepage: https://www.spark-app.store/
 
 
 Package: spark-store
 Architecture: any
 Depends:${shlibs:Depends}, ${misc:Depends},
- libqt5core5a,
- libqt5gui5,
- libqt5widgets5,
- libqt5network5,
- libqt5concurrent5,
- libdtkcore5,
- libdtkgui5,
- libdtkwidget5,
- libnotify4,
- curl,
- openssl,
- libssl-dev,
- dde-qt5integration,
- bubblewrap,
- aria2,
- gcc,
- zenity
+    libqt5core5a,
+    libqt5gui5,
+    libqt5widgets5,
+    libqt5network5,
+    libqt5concurrent5,
+    libdtkcore5,
+    libdtkgui5,
+    libdtkwidget5,
+    libnotify4,
+    curl,
+    openssl,
+    libssl-dev,
+    dde-qt5integration,
+    bubblewrap,
+    aria2,
+    gcc,
+    zenity
 Description: Spark Store
  A community powered app store, based on DTK.
-Recommends: apt-fast
diff --git a/debian/copyright b/debian/copyright
index e212ce7..a2577b2 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -1,9 +1,9 @@
 Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
 Upstream-Name: spark-store
-Source: https://gitee.com/deepin-community-store/spark-store
+Source: https://gitee.com/deepin-community-store/spark-store-new
 
 Files: *
-Copyright: The Spark Project Developers
+Copyright: yzzi
  
 License: GPL-3+
  This package is free software; you can redistribute it and/or modify
diff --git a/debian/rules b/debian/rules
index c7846f5..6b25651 100755
--- a/debian/rules
+++ b/debian/rules
@@ -17,12 +17,11 @@ override_dh_auto_clean:
 
 override_dh_auto_configure:
 	mkdir -p $(CURDIR)/build
-	
-	dh_auto_configure MAKEFLAGS=-j$(JOBS) -- spark-store-project.pro \
+
+	dh_auto_configure MAKEFLAGS=-j$(JOBS) -- spark-store.pro \
 	-spec linux-g++ CONFIG+=qtquickcompiler \
 	-o $(CURDIR)/build/
 
-
 override_dh_auto_build:
 	make -C $(CURDIR)/build -j$(JOBS)
 
@@ -30,7 +29,6 @@ override_dh_auto_install:
 	make -C $(CURDIR)/build install \
 	INSTALL_ROOT=$(CURDIR)/debian/spark-store
 
-
 # Ignore the dpkg-shlibdeps: warning (it uses none of the library's symbols)
 # Qt Mutidedia lib will ref to network libraray.
 override_dh_shlibdeps:
diff --git a/debian/source/format b/debian/source/format
index 9f8e9b6..163aaf8 100644
--- a/debian/source/format
+++ b/debian/source/format
@@ -1 +1 @@
-1.0
\ No newline at end of file
+3.0 (quilt)
diff --git a/debian/spark-store.postinst b/debian/spark-store.postinst
index f00831e..5383e1e 100755
--- a/debian/spark-store.postinst
+++ b/debian/spark-store.postinst
@@ -2,21 +2,6 @@
 
 case "$1" in
 	configure)
-
-	# Enable i386 arch
-	echo "Enable i386 arch..."
-	dpkg --add-architecture i386
-
-        # config for aptss
-        mkdir -p /etc/aptss/sources.list.d
-        ln -s -f /etc/apt/sources.list /etc/aptss/sources.list
-
-	#  Remove the sources.list file
-	if [ -e /etc/apt/sources.list.d/sparkstore.list ];then
-	rm /etc/apt/sources.list.d/sparkstore.list
-	fi
-        
-
 		# Check if /usr/local/bin existed
 		mkdir -p /usr/local/bin
 
@@ -26,31 +11,11 @@ case "$1" in
 		ln -s -f /opt/durapps/spark-store/bin/spark-store /usr/local/bin/spark-store
 		ln -s -f /opt/durapps/spark-store/bin/ssinstall /usr/local/bin/ssinstall
 		ln -s -f /opt/durapps/spark-store/bin/spark-dstore-patch /usr/local/bin/spark-dstore-patch
-		ln -s -f /opt/durapps/spark-store/bin/aptss /usr/local/bin/ss-apt-fast
-		
-     	       ln -s -f /opt/durapps/spark-store/bin/aptss /usr/bin/aptss
 
-		# Compile the Sender module
-
-		gcc /opt/durapps/spark-store/bin/ss-feedback/sender-d.sh.c -o /opt/durapps/spark-store/bin/ss-feedback/sender-d
-
-		# Install key
-		mkdir -p /tmp/spark-store-install/
-		cp -f /opt/durapps/spark-store/bin/spark-store.asc  /tmp/spark-store-install/spark-store.asc
-		gpg --dearmor /tmp/spark-store-install/spark-store.asc
-		cp -f /tmp/spark-store-install/spark-store.asc.gpg /etc/apt/trusted.gpg.d/spark-store.gpg
-
-
-
-        	# Run apt update to avoid users being fucked up by the non-exist dependency problem
-		# Now abandoned as aptss now run ssupdate everytime
-		#aptss ssupdate
-
-
-		# Start upgrade detect service
-		systemctl enable spark-update-notifier
-		service spark-update-notifier start
-		
+		# Download and install 
+		cd /tmp/spark-store-install
+		wget https://d.store.deepinos.org.cn/dcs-repo.gpg-key.asc
+		apt-key add dcs-repo.gpg-key.asc
 
 		# Update certain caches
 		update-icon-caches /usr/share/icons/hicolor || true
@@ -60,26 +25,20 @@ case "$1" in
 
 		# Send email for statistics
 		# /tmp/spark-store-install/feedback.sh
-
-		# Remove temp dir
-		rm -rf /tmp/spark-store-install
-
-
 	;;
 
 	triggered)
-		# Quit if deepin-app-store-tool existed
-		if [ -x "/usr/bin/deepin-app-store-tool" ] ; then 
+		# Trigger for UOS debs installation
+		echo '-----------星火应用商店现已集成 UOS 包补丁工具--------------'
+		if [ -x "/usr/bin/deepin-app-store-tool" ] ; then
+			echo '----------检测到已安装深度应用商店,不运行补丁---------------'
 			exit 0
 		fi
 
-		# Trigger for UOS debs installation
-		echo '--------检测到Uniontech标准软件包,运行补丁以修正安装--------'
 		if [ -x "/usr/local/bin/spark-dstore-patch" ] ; then
-			/usr/local/bin/spark-dstore-patch
-			echo '-----------spark-dstore-patch补丁工具已运行完毕-----------'
-		else
-			echo '------------spark-dstore-patch补丁工具运行失败------------'
+  			echo '-------检测到 Uniontech 标准软件包,运行补丁以修正安装-------'
+    			/usr/local/bin/spark-dstore-patch
+  			echo '---------- spark-dstore-patch 补丁工具已运行完毕----------'
 		fi
 	;;
 esac
diff --git a/debian/spark-store.postrm b/debian/spark-store.postrm
old mode 100755
new mode 100644
diff --git a/debian/spark-store.preinst b/debian/spark-store.preinst
deleted file mode 100755
index 1eae804..0000000
--- a/debian/spark-store.preinst
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/bash
-#检测网络链接畅通
-function network-check()
-{
-    #超时时间
-    local timeout=15
-
-    #目标网站
-    local target=www.baidu.com
-
-    #获取响应状态码
-    local ret_code=`curl -I -s --connect-timeout ${timeout} ${target} -w %{http_code} | tail -n1`
-
-    if [ "x$ret_code" = "x200" ]; then
-        echo "Network Checked successful ! Continue..."
-	 echo "网络通畅,继续安装"
-    else
-        #网络不畅通
-	echo "Network failed ! Cancel the installation"
-	echo "网络不畅,终止安装"
-	exit -1
-    fi
-
-}
-
-
-#network-check
-echo "不再检测网络"
\ No newline at end of file
diff --git a/debian/spark-store.prerm b/debian/spark-store.prerm
index 8c44924..fc931fa 100755
--- a/debian/spark-store.prerm
+++ b/debian/spark-store.prerm
@@ -1,47 +1,8 @@
 #!/bin/sh
 
-if [ "$1" = "remove" ] || [ "$1" = "purge" ];then
 # Remove residual symbol links
 rm /usr/local/bin/spark-store
 rm /usr/local/bin/ssinstall
 rm /usr/local/bin/spark-dstore-patch
 rm /usr/local/bin/ussinstall
 rm /usr/local/bin/ussremove
-rm /usr/local/bin/ss-apt-fast
-rm /usr/bin/aptss
-
-rm -rf /etc/aptss/
-
-# Remove Sender module
-rm /opt/durapps/spark-store/bin/ss-feedback/sender-d
-
-# Remove residual symbol links to stop upgrade detect if exist
-if [ -e /etc/xdg/autostart/spark-update-notifier.desktop ];then
-rm /etc/xdg/autostart/spark-update-notifier.desktop
-fi
-
-# Shutdown services 
-service spark-update-notifier stop
-
-# Stop update detect service
-systemctl disable spark-update-notifier
-
-
-
-# Clean the auto install polkit file if exist
-if [ -f "/usr/share/polkit-1/actions/store.spark-app.ssinstall.policy" ] ; then
-	rm /usr/share/polkit-1/actions/store.spark-app.ssinstall.policy
-fi
-
-# Remove gpg key file
-if [ -f "/etc/apt/trusted.gpg.d/spark-store.gpg" ] ; then
-	rm /etc/apt/trusted.gpg.d/spark-store.gpg
-fi
-
-apt-key del '9D9A A859 F750 24B1 A1EC  E16E 0E41 D354 A29A 440C'
-
-else
-
-echo "非卸载操作,不进行配置清理"
-
-fi
diff --git a/pkg/etc/apt/preferences.d/sparkstore b/pkg/etc/apt/preferences.d/sparkstore
new file mode 100644
index 0000000..8c9cac3
--- /dev/null
+++ b/pkg/etc/apt/preferences.d/sparkstore
@@ -0,0 +1,3 @@
+Package: *
+Pin: origin *.deepinos.org.cn
+Pin-Priority: 400
diff --git a/pkg/etc/aptss/sources.list.d/sparkstore.list b/pkg/etc/apt/sources.list.d/sparkstore.list
similarity index 100%
rename from pkg/etc/aptss/sources.list.d/sparkstore.list
rename to pkg/etc/apt/sources.list.d/sparkstore.list
diff --git a/pkg/tmp/spark-store-install/feedback.sh b/pkg/tmp/spark-store-install/feedback.sh
index 007f976..e668d77 100755
--- a/pkg/tmp/spark-store-install/feedback.sh
+++ b/pkg/tmp/spark-store-install/feedback.sh
@@ -6,4 +6,4 @@ Subject: spark-store_3.0.2: $(lsb_release -a | grep "Description" | sed -e "s#\t
 
 $(uname -a)" | tee /tmp/spark-store-install/feedback.txt > /dev/null
 
-curl -s --url "smtp://smtp.163.com" --mail-from "${MAIL_FEEDBACK}" --mail-rcpt "${MAIL_FEEDBACK}" --upload-file /tmp/spark-store-install/feedback.txt --user "${MAIL_FEEDBACK}:${M}AIL_AUTH"
+curl -s --url "smtp://smtp.163.com" --mail-from "sparkstorefeedback@163.com" --mail-rcpt "sparkstorefeedback@163.com" --upload-file /tmp/spark-store-install/feedback.txt --user "sparkstorefeedback@163.com:YWYGLQNOPLWNNJJY"
diff --git a/pkg/usr/lib/systemd/system/spark-update-notifier.service b/pkg/usr/lib/systemd/system/spark-update-notifier.service
deleted file mode 100644
index de8f8fa..0000000
--- a/pkg/usr/lib/systemd/system/spark-update-notifier.service
+++ /dev/null
@@ -1,14 +0,0 @@
-[Unit]
-Description=Spark Store update notifier
-After=apt-daily.service network.target network-online.target systemd-networkd.service NetworkManager.service connman.service
-
-
-[Service]
-Type=simple
-RemainAfterExit=yes 
-ExecStart=/opt/durapps/spark-store/bin/update-upgrade/ss-update-notifier.sh
-Restart=on-failure
-RestartSec=10
-
-[Install]
-WantedBy=multi-user.target
\ No newline at end of file
diff --git a/pkg/usr/share/bash-completion/completions/aptss b/pkg/usr/share/bash-completion/completions/aptss
deleted file mode 100644
index 4afc938..0000000
--- a/pkg/usr/share/bash-completion/completions/aptss
+++ /dev/null
@@ -1,228 +0,0 @@
-# Debian apt(8) completion                             -*- shell-script -*-
-
-_aptss()
-{
-    local sourcesdir="/etc/apt/sources.list.d"
-    local cur prev words cword
-    _init_completion || return
-
-    local GENERIC_APT_GET_OPTIONS='
-        -d --download-only
-        -y --assume-yes
-        --assume-no
-        -u --show-upgraded
-        -m --ignore-missing
-        -t --target-release
-        --download
-        --fix-missing
-        --ignore-hold
-        --upgrade
-        --only-upgrade
-        --allow-change-held-packages
-        --allow-remove-essential
-        --allow-downgrades
-        --print-uris
-        --trivial-only
-        --remove
-        --arch-only
-        --allow-unauthenticated
-        --allow-insecure-repositories
-        --install-recommends
-        --install-suggests
-        --no-install-recommends
-        --no-install-suggests
-        --fix-policy
-    '
-
-    # see if the user selected a command already
-    local COMMANDS=(
-        "ssupdate"
-        "list"
-        "search"
-        "show" "showsrc"
-        "install" "remove" "purge" "autoremove"
-        "update"
-        "upgrade" "full-upgrade" "dist-upgrade"
-        "edit-sources"
-        "help"
-        "source" "build-dep"
-        "clean" "autoclean"
-        "download" "changelog"
-        "moo"
-        "depends" "rdepends"
-        "policy")
-
-    local command i
-    for (( i=0; i < ${#words[@]}-1; i++ )); do
-        if [[ ${COMMANDS[@]} =~ ${words[i]} ]]; then
-            command=${words[i]}
-            break
-        fi
-    done
-
-    # Complete a -t<SPACE><TAB>
-    case $prev in
-        -t|--target-release)
-            COMPREPLY=( $( compgen -W "$( apt-cache policy -o Dir::Cache="/etc/aptss/" | egrep -o 'a=[^,]*|n=[^,]*' | cut -f2- -d= | sort -u)" -- "$cur" ) )
-            return 0
-            ;;
-    esac
-
-    # supported options per command
-    if [[ "$cur" == -* ]]; then
-        case $command in
-            install|remove|purge|upgrade|dist-upgrade|full-upgrade|autoremove)
-                COMPREPLY=( $( compgen -W '--show-progress
-                  --fix-broken --purge --verbose-versions --auto-remove
-                  -s --simulate --dry-run
-                  --download
-                  --fix-missing
-                  --fix-policy
-                  --ignore-hold
-                  --force-yes
-                  --trivial-only
-                  --reinstall --solver
-                  -t --target-release'"$GENERIC_APT_GET_OPTIONS" -- "$cur" ) )
-                return 0
-                ;;
-            update)
-                COMPREPLY=( $( compgen -W '--list-cleanup
-                  --print-uris
-                  --allow-insecure-repositories
-                  ' -- "$cur" ) )
-                return 0
-                ;;
-            list)
-                COMPREPLY=( $( compgen -W '--installed --upgradable 
-                  --manual-installed
-                  -v --verbose
-                  -a --all-versions
-                  -t --target-release
-                  ' -- "$cur" ) )
-                return 0
-                ;;
-            show)
-                COMPREPLY=( $( compgen -W '-a --all-versions
-                  ' -- "$cur" ) )
-                return 0
-                ;;
-            depends|rdepends)
-                COMPREPLY=( $( compgen -W '-i
-                    --important
-                    --installed
-                    --pre-depends
-                    --depends
-                    --recommends
-                    --suggests
-                    --replaces
-                    --breaks
-                    --conflicts
-                    --enhances
-                    --recurse
-                    --implicit' -- "$cur" ) )
-                return 0
-                ;;
-            search)
-                COMPREPLY=( $( compgen -W '
-                    -n --names-only
-                    -f --full' -- "$cur" ) )
-                return 0
-                ;;
-            showsrc)
-                COMPREPLY=( $( compgen -W '
-                    --only-source' -- "$cur" ) )
-                return 0
-                ;;
-            source)
-                COMPREPLY=( $( compgen -W '
-                    -s --simulate --dry-run
-                    -b --compile --build
-                    -P --build-profiles
-                    --diff-only --debian-only
-                    --tar-only
-                    --dsc-only
-                    -t --target-release
-                    '"$GENERIC_APT_GET_OPTIONS" -- "$cur" ) )
-                return 0
-                ;;
-            build-dep)
-                COMPREPLY=( $( compgen -W '
-                    -a --host-architecture
-                    -s --simulate --dry-run
-                    -P --build-profiles
-                    -t --target-release
-                    --purge --solver
-                    '"$GENERIC_APT_GET_OPTIONS" -- "$cur" ) )
-                return 0
-                ;;
-            moo)
-                COMPREPLY=( $( compgen -W '
-                    --color
-                    ' -- "$cur" ) )
-                return 0
-                ;;
-            clean|autoclean)
-                COMPREPLY=( $( compgen -W '
-                    -s --simulate --dry-run
-                    ' -- "$cur" ) )
-                return 0
-                ;;
-        esac
-    fi
-
-    # specific command arguments
-    if [[ -n $command ]]; then
-        case $command in
-            remove|purge|autoremove)
-                if [[ -f /etc/debian_version ]]; then
-                    # Debian system
-                    COMPREPLY=( $( \
-                        _xfunc dpkg _comp_dpkg_installed_packages $cur ) )
-                else
-                    # assume RPM based
-                    _xfunc rpm _rpm_installed_packages
-                fi
-                return 0
-                ;;
-            show|list|download|changelog|depends|rdepends)
-                    COMPREPLY=( $(  apt-cache --no-generate pkgnames "$cur" -o Dir::Cache="/etc/aptss/"  \
-                    2> /dev/null ) )
-                return 0
-                ;;
-            install)
-                COMPREPLY=( $(  apt-cache --no-generate pkgnames "$cur" -o Dir::Cache="/etc/aptss/"  \
-                    2> /dev/null ) )
-                if [[ "$cur" == ./* || "$cur" == /* ]]; then
-                    _filedir "deb"
-                fi
-                return 0
-                ;;
-            source|build-dep|showsrc|policy)
-                COMPREPLY=( $(  apt-cache --no-generate pkgnames "$cur" -o Dir::Cache="/etc/aptss/"  \
-                    2> /dev/null ) $(  apt-cache dumpavail -o Dir::Cache="/etc/aptss/"  | \
-                    command grep "^Source: $cur" | sort -u | cut -f2 -d" " ) )
-                return 0
-                ;;
-            edit-sources)
-                COMPREPLY=( $( compgen -W '$( command ls $sourcesdir )' \
-                    -- "$cur" ) )
-                return 0
-                ;;
-            moo)
-                COMPREPLY=( $( compgen -W 'moo' \
-                    -- "$cur" ) )
-                return 0
-                ;;
-        esac
-    fi
-
-    # no command yet, show what commands we have
-    if [ "$command" = "" ]; then
-        COMPREPLY=( $( compgen -W '${COMMANDS[@]}' -- "$cur" ) )
-    fi
-
-    return 0
-} &&
-complete -F _aptss aptss
-
-# ex: ts=4 sw=4 et filetype=sh
diff --git a/pkg/usr/share/polkit-1/actions/store.spark-app.ss-do-upgrade-worker.policy b/pkg/usr/share/polkit-1/actions/store.spark-app.ss-do-upgrade-worker.policy
deleted file mode 100644
index 49c5000..0000000
--- a/pkg/usr/share/polkit-1/actions/store.spark-app.ss-do-upgrade-worker.policy
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE policyconfig PUBLIC "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
- "http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
-<policyconfig>
-    <vendor>Spark Store</vendor>
-    <icon_name>x-package-repository</icon_name>
-    <action id="store.spark-app.ss-do-upgrade-worker">
-        <description>运行ss-do-upgrade-worker需要权限</description>
-        <message>要使用ss-do-upgrade-worker需要权限</message>
-        <defaults>
-            <allow_any>yes</allow_any>
-            <allow_inactive>yes</allow_inactive>
-            <allow_active>yes</allow_active>
-        </defaults>
-        <annotate key="org.freedesktop.policykit.exec.path">/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh</annotate>
-        <annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
-    </action>
-</policyconfig>
diff --git a/spark-store-project.pro b/spark-store-project.pro
deleted file mode 100644
index 973747e..0000000
--- a/spark-store-project.pro
+++ /dev/null
@@ -1,58 +0,0 @@
-TARGET = spark-store
-TEMPLATE = subdirs
-
-CONFIG += ordered
-
-SUBDIRS += \
-    src/spark-dstore-patch \
-    third-party/QtNetworkService \
-    src/spark-store.pro
-
-spark-store.depends = third-party/QtNetworkService
-
-# Update translation files
-CONFIG(release, debug|release): system(bash $${PWD}/translate_generation.sh)
-
-# Rules for deployment
-tool.files += tool/*
-tool.path = /opt/durapps/$${TARGET}/bin
-
-qm.files += translations/*.qm
-qm.path = /usr/share/spark-store/translations
-
-#preferences.files += pkg/etc/apt/preferences.d/sparkstore
-#preferences.path = /etc/apt/preferences.d
-
-#sourceslist.files += pkg/etc/apt/sources.list.d/sparkstore.list
-#sourceslist.path = /etc/apt/sources.list.d
-
-bash_completion.files += pkg/usr/share/bash-completion/completions/aptss
-bash_completion.path = /usr/share/bash-completion/completions
-
-desktop.files += pkg/usr/share/applications/spark-store.desktop
-desktop.path = /usr/share/applications
-
-service.files += pkg/usr/lib/systemd/system/spark-update-notifier.service
-service.path = /usr/lib/systemd/system/
-
-polkit-1.files +=pkg/usr/share/polkit-1/actions/store.spark-app.ss-do-upgrade-worker.policy
-polkit-1.path = /usr/share/polkit-1/actions/
-
-icon.files += pkg/usr/share/icons/hicolor/scalable/apps/spark-store.svg
-icon.path = /usr/share/icons/hicolor/scalable/apps
-
-tmp.files += pkg/tmp/spark-store-install/feedback.sh
-tmp.path = /tmp/spark-store-install
-
-INSTALLS += \
-    tool \
-    qm \
-    desktop \
-    icon \
-#    preferences \
-#    sourceslist \
-    tmp \
-    service \
-    bash_completion \
-    polkit-1 
-#   暂时不添加
diff --git a/spark-store.pro b/spark-store.pro
new file mode 100644
index 0000000..724db21
--- /dev/null
+++ b/spark-store.pro
@@ -0,0 +1,52 @@
+#-------------------------------------------------
+#
+# Project created by QtCreator 2022-01-12T04:00:00
+#
+#-------------------------------------------------
+
+TARGET = spark-store
+TEMPLATE = subdirs
+
+CONFIG += ordered
+
+SUBDIRS += \
+        src/spark-store.pro
+
+TRANSLATIONS += \
+        translations/spark-store_fr.ts \
+        translations/spark-store_en.ts \
+        translations/spark-store_zh_CN.ts
+
+# Update translation files
+CONFIG(release, debug|release): system(bash $${PWD}/translate_generation.sh)
+
+# Rules for deployment
+tool.files += tool/*
+tool.path = /opt/durapps/$${TARGET}/bin
+
+qm.files += translations/*.qm
+qm.path = /usr/share/spark-store/translations
+
+preferences.files += pkg/etc/apt/preferences.d/sparkstore
+preferences.path = /etc/apt/preferences.d
+
+sourceslist.files += pkg/etc/apt/sources.list.d/sparkstore.list
+sourceslist.path = /etc/apt/sources.list.d
+
+desktop.files += pkg/usr/share/applications/spark-store.desktop
+desktop.path = /usr/share/applications
+
+icon.files += pkg/usr/share/icons/hicolor/scalable/apps/spark-store.svg
+icon.path = /usr/share/icons/hicolor/scalable/apps
+
+tmp.files += pkg/tmp/spark-store-install/feedback.sh
+tmp.path = /tmp/spark-store-install
+
+INSTALLS += \
+        tool \
+        qm \
+        desktop \
+        icon \
+        sourceslist \
+        preferences \
+        tmp
diff --git a/src/appitem.cpp b/src/appitem.cpp
deleted file mode 100644
index ed18e0a..0000000
--- a/src/appitem.cpp
+++ /dev/null
@@ -1,102 +0,0 @@
-#include "appitem.h"
-#include "ui_appitem.h"
-#include <QtConcurrent>
-#include <QNetworkAccessManager>
-#include <QNetworkReply>
-#include <QNetworkRequest>
-#include <QEventLoop>
-#include <QPainter>
-#include <QGraphicsDropShadowEffect>
-
-AppItem::AppItem(QWidget *parent) :
-    QWidget(parent),
-    ui(new Ui::AppItem)
-{
-    ui->setupUi(this);
-
-    // auto shadow = new QGraphicsDropShadowEffect();
-    // shadow->setXOffset(0);
-    // shadow->setYOffset(1);
-    // shadow->setBlurRadius(2);
-    // shadow->setColor(QColor::fromRgba(qRgba(0, 0, 0, 180)));
-    // ui->container->setGraphicsEffect(shadow);
-}
-
-AppItem::~AppItem()
-{
-    delete ui;
-}
-
-void AppItem::setTitle(QString title)
-{
-    m_title = title;
-    ui->lbl_title->setText(title);
-}
-
-void AppItem::setDescription(QString description)
-{
-    m_description = description;
-    QString elidedText = ui->lbl_desc->fontMetrics().elidedText(
-                description, Qt::ElideRight,
-                ui->lbl_desc->width(), Qt::TextShowMnemonic);
-    ui->lbl_desc->setText(elidedText);
-    ui->lbl_desc->setAlignment(Qt::AlignTop);
-}
-
-void AppItem::setIcon(QString icon)
-{
-    m_icon = icon;
-    if(!icon.isEmpty())
-    {
-        downloadIcon(icon);
-    }
-}
-
-void AppItem::setUrl(QString url)
-{
-    m_url = url;
-}
-
-void AppItem::mousePressEvent(QMouseEvent *event)
-{
-    Q_UNUSED(event)
-
-    emit clicked(QUrl(m_url));
-}
-
-/**
- * @brief 下载图标
- * @param icon
- */
-void AppItem::downloadIcon(QString icon)
-{
-    QtConcurrent::run([=]()
-    {
-        auto reqManager = new QNetworkAccessManager();
-
-        QUrl url(icon);
-        QNetworkReply *reply = reqManager->get(QNetworkRequest(url));
-        QEventLoop loop;
-        connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
-        connect(reply, &QNetworkReply::finished, this, [=] () { emit finished(); });
-        loop.exec();
-        reqManager->deleteLater();
-
-        QPixmap pixmap;
-        pixmap.loadFromData(reply->readAll());
-        pixmap = pixmap.scaled(78, 78, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
-        if (reply->error() == QNetworkReply::NoError)
-        {
-            QMetaObject::invokeMethod(this, "loadIcon", Qt::QueuedConnection, Q_ARG(QPixmap, pixmap));
-        }
-        else
-        {
-            qDebug() << reply->errorString();
-        }
-    });
-}
-
-void AppItem::loadIcon(QPixmap pic)
-{
-    ui->lbl_icon->setPixmap(pic);
-}
diff --git a/src/appitem.h b/src/appitem.h
deleted file mode 100644
index 3d30c66..0000000
--- a/src/appitem.h
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef APPITEM_H
-#define APPITEM_H
-
-#include <QWidget>
-#include <QUrl>
-
-namespace Ui {
-class AppItem;
-}
-
-class AppItem : public QWidget
-{
-    Q_OBJECT
-
-public:
-    explicit AppItem(QWidget *parent = nullptr);
-    ~AppItem() override;
-
-    void setTitle(QString title);
-    void setDescription(QString description);
-    void setIcon(QString icon);
-    void setUrl(QString url);
-
-protected:
-    void mousePressEvent(QMouseEvent *event) override;
-
-private:
-    Ui::AppItem *ui;
-
-    QString m_title;
-    QString m_description;
-    QString m_icon;
-    QString m_url;
-
-public slots:
-    void downloadIcon(QString icon);
-    void loadIcon(QPixmap pic);
-
-signals:
-    void clicked(QUrl url);
-    void finished();
-
-};
-
-#endif // APPITEM_H
diff --git a/src/appitem.ui b/src/appitem.ui
deleted file mode 100644
index 718e1e7..0000000
--- a/src/appitem.ui
+++ /dev/null
@@ -1,160 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>AppItem</class>
- <widget class="QWidget" name="AppItem">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>333</width>
-    <height>133</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Form</string>
-  </property>
-  <property name="styleSheet">
-   <string notr="true">QWidget#AppItem {
-	width: 300px;
-	height: 100px;
-	margin: 15px;
-	color: #6d6d6d;
-    border-radius: 18px;
-     background-color: 	width: 300px;
-	height: 100px;
-	margin: 15px;
-	color: #6d6d6d;
-    border-radius: 18px;
-     background-color: #F4F4F6;
-}
-
-QWidget#container {
-     background-color: #F4F4F6;
-}
-
-QLabel#lbl_icon {
-    background: transparent;
-    border-radius: 10px;
-}
-
-QLabel#lbl_title {
-    text-align: left;
-    white-space: nowrap;
-    padding-right: 10px;
-   font-size: 19px;
-  
-}
-
-QLabel#lbl_desc {
-	text-align: left;
-    font-weight: lighter;
-    white-space: nowrap;
-   font-size: 12px;
-	color: grey;
-}</string>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout_2">
-   <property name="spacing">
-    <number>0</number>
-   </property>
-   <property name="leftMargin">
-    <number>0</number>
-   </property>
-   <property name="topMargin">
-    <number>0</number>
-   </property>
-   <property name="rightMargin">
-    <number>0</number>
-   </property>
-   <property name="bottomMargin">
-    <number>0</number>
-   </property>
-   <item>
-    <widget class="QWidget" name="container" native="true">
-     <layout class="QHBoxLayout" name="horizontalLayout">
-      <property name="spacing">
-       <number>0</number>
-      </property>
-      <property name="leftMargin">
-       <number>0</number>
-      </property>
-      <property name="topMargin">
-       <number>0</number>
-      </property>
-      <property name="rightMargin">
-       <number>0</number>
-      </property>
-      <property name="bottomMargin">
-       <number>0</number>
-      </property>
-      <item>
-       <widget class="QLabel" name="lbl_icon">
-        <property name="minimumSize">
-         <size>
-          <width>100</width>
-          <height>100</height>
-         </size>
-        </property>
-        <property name="styleSheet">
-         <string notr="true">width: 78px;
-height: 70px;
-padding: 10px;</string>
-        </property>
-        <property name="text">
-         <string/>
-        </property>
-        <property name="scaledContents">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <layout class="QVBoxLayout" name="verticalLayout">
-        <item>
-         <widget class="QLabel" name="lbl_title">
-          <property name="minimumSize">
-           <size>
-            <width>200</width>
-            <height>50</height>
-           </size>
-          </property>
-          <property name="maximumSize">
-           <size>
-            <width>200</width>
-            <height>50</height>
-           </size>
-          </property>
-          <property name="text">
-           <string/>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QLabel" name="lbl_desc">
-          <property name="minimumSize">
-           <size>
-            <width>200</width>
-            <height>50</height>
-           </size>
-          </property>
-          <property name="maximumSize">
-           <size>
-            <width>200</width>
-            <height>50</height>
-           </size>
-          </property>
-          <property name="text">
-           <string/>
-          </property>
-         </widget>
-        </item>
-       </layout>
-      </item>
-     </layout>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>
diff --git a/src/assets/assets.qrc b/src/assets/assets.qrc
new file mode 100644
index 0000000..59fad20
--- /dev/null
+++ b/src/assets/assets.qrc
@@ -0,0 +1,42 @@
+<RCC>
+    <qresource prefix="/">
+        <file>icon/logo.svg</file>
+        <file>tags/a2d-small.png</file>
+        <file>tags/a2d.png</file>
+        <file>tags/community-small.png</file>
+        <file>tags/community.png</file>
+        <file>tags/community.svg</file>
+        <file>tags/deepin-small.png</file>
+        <file>tags/deepin.svg</file>
+        <file>tags/dtk-small.png</file>
+        <file>tags/dwine2-small.png</file>
+        <file>tags/dwine5-small.png</file>
+        <file>tags/dwine5.svg</file>
+        <file>tags/logo_icon.svg</file>
+        <file>tags/ubuntu-small.png</file>
+        <file>tags/ubuntu.png</file>
+        <file>tags/uos-authorize.svg</file>
+        <file>tags/uos-small.png</file>
+        <file>tags/uos.svg</file>
+        <file>icon/light/back.svg</file>
+        <file>icon/light/download.svg</file>
+        <file>icon/light/leftbutton_0.svg</file>
+        <file>icon/light/leftbutton_1.svg</file>
+        <file>icon/light/leftbutton_2.svg</file>
+        <file>icon/light/leftbutton_3.svg</file>
+        <file>icon/light/leftbutton_4.svg</file>
+        <file>icon/light/leftbutton_5.svg</file>
+        <file>icon/light/leftbutton_6.svg</file>
+        <file>icon/light/leftbutton_7.svg</file>
+        <file>icon/light/leftbutton_8.svg</file>
+        <file>icon/light/leftbutton_9.svg</file>
+        <file>icon/light/leftbutton_10.svg</file>
+        <file>icon/light/leftbutton_11.svg</file>
+        <file>icon/light/leftbutton_12.svg</file>
+        <file>icon/light/box.svg</file>
+        <file>icon/light/calendar.svg</file>
+        <file>icon/light/globe.svg</file>
+        <file>icon/light/folder.svg</file>
+        <file>icon/light/text.svg</file>
+    </qresource>
+</RCC>
diff --git a/src/assets/icon/Logo-Spark.png b/src/assets/icon/Logo-Spark.png
new file mode 100644
index 0000000..941a4a6
Binary files /dev/null and b/src/assets/icon/Logo-Spark.png differ
diff --git a/src/assets/icon/light/back.svg b/src/assets/icon/light/back.svg
new file mode 100644
index 0000000..7c6cbfb
--- /dev/null
+++ b/src/assets/icon/light/back.svg
@@ -0,0 +1,3 @@
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M44 24C44 24.6904 43.4404 25.25 42.75 25.25H10.3041L23.1264 37.8586C23.6187 38.3426 23.6253 39.134 23.1413 39.6263C22.6572 40.1185 21.8658 40.1252 21.3736 39.6411L6.38563 24.903C6.37656 24.8943 6.36759 24.8854 6.35872 24.8764C6.14696 24.6611 6.02911 24.3884 6.00476 24.1094C5.99775 24.029 5.99848 23.9481 6.00696 23.8679C6.03557 23.5967 6.15267 23.333 6.35872 23.1234C6.37242 23.1095 6.38611 23.096 6.39982 23.0829L21.3736 8.35872C21.8658 7.87468 22.6572 7.88134 23.1413 8.37358C23.6253 8.86582 23.6187 9.65724 23.1264 10.1413L10.304 22.75H42.75C43.4404 22.75 44 23.3096 44 24Z" fill="#212121"/>
+</svg>
diff --git a/src/assets/icon/light/box.svg b/src/assets/icon/light/box.svg
new file mode 100644
index 0000000..034168c
--- /dev/null
+++ b/src/assets/icon/light/box.svg
@@ -0,0 +1,3 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M11.2999 2.4808C10.4654 2.14702 9.53457 2.14702 8.70013 2.4808L2.94291 4.78369C2.37343 5.01148 2 5.56305 2 6.1764V13.8223C2 14.4357 2.37343 14.9873 2.94291 15.2151L8.70013 17.5179C9.53457 17.8517 10.4654 17.8517 11.2999 17.5179L17.0571 15.2151C17.6266 14.9873 18 14.4357 18 13.8223V6.1764C18 5.56305 17.6266 5.01148 17.0571 4.78369L11.2999 2.4808ZM9.07152 3.40928C9.66755 3.17087 10.3324 3.17087 10.9285 3.40928L16.1538 5.49941L13.8751 6.41088L7.72133 3.94935L9.07152 3.40928ZM6.37504 4.48787L12.5289 6.94939L10.0001 7.96088L3.84633 5.49935L6.37504 4.48787ZM10.5001 8.83791L17 6.23797V13.8223C17 14.0268 16.8755 14.2106 16.6857 14.2866L10.9285 16.5895C10.7889 16.6453 10.6455 16.6881 10.5001 16.7177V8.83791ZM9.50015 8.83791V16.7178C9.35467 16.6881 9.21121 16.6453 9.07152 16.5895L3.3143 14.2866C3.12448 14.2106 3 14.0268 3 13.8223V6.23785L9.50015 8.83791Z" fill="#212121"/>
+</svg>
diff --git a/src/assets/icon/light/calendar.svg b/src/assets/icon/light/calendar.svg
new file mode 100644
index 0000000..7bc6f35
--- /dev/null
+++ b/src/assets/icon/light/calendar.svg
@@ -0,0 +1,3 @@
+<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M21.75 3C23.5449 3 25 4.45507 25 6.25V21.75C25 23.5449 23.5449 25 21.75 25H6.25C4.45507 25 3 23.5449 3 21.75V6.25C3 4.45507 4.45507 3 6.25 3H21.75ZM23.5 9.503H4.5V21.75C4.5 22.7165 5.2835 23.5 6.25 23.5H21.75C22.7165 23.5 23.5 22.7165 23.5 21.75V9.503ZM8.74878 17.5014C9.43913 17.5014 9.99878 18.0611 9.99878 18.7514C9.99878 19.4418 9.43913 20.0014 8.74878 20.0014C8.05842 20.0014 7.49878 19.4418 7.49878 18.7514C7.49878 18.0611 8.05842 17.5014 8.74878 17.5014ZM14.0033 17.5014C14.6936 17.5014 15.2533 18.0611 15.2533 18.7514C15.2533 19.4418 14.6936 20.0014 14.0033 20.0014C13.3129 20.0014 12.7533 19.4418 12.7533 18.7514C12.7533 18.0611 13.3129 17.5014 14.0033 17.5014ZM8.74878 12.5014C9.43913 12.5014 9.99878 13.0611 9.99878 13.7514C9.99878 14.4418 9.43913 15.0014 8.74878 15.0014C8.05842 15.0014 7.49878 14.4418 7.49878 13.7514C7.49878 13.0611 8.05842 12.5014 8.74878 12.5014ZM14.0033 12.5014C14.6936 12.5014 15.2533 13.0611 15.2533 13.7514C15.2533 14.4418 14.6936 15.0014 14.0033 15.0014C13.3129 15.0014 12.7533 14.4418 12.7533 13.7514C12.7533 13.0611 13.3129 12.5014 14.0033 12.5014ZM19.2577 12.5014C19.9481 12.5014 20.5077 13.0611 20.5077 13.7514C20.5077 14.4418 19.9481 15.0014 19.2577 15.0014C18.5674 15.0014 18.0077 14.4418 18.0077 13.7514C18.0077 13.0611 18.5674 12.5014 19.2577 12.5014ZM21.75 4.5H6.25C5.2835 4.5 4.5 5.2835 4.5 6.25V8.003H23.5V6.25C23.5 5.2835 22.7165 4.5 21.75 4.5Z" fill="#212121"/>
+</svg>
diff --git a/src/assets/icon/light/download.svg b/src/assets/icon/light/download.svg
new file mode 100644
index 0000000..d088fb3
--- /dev/null
+++ b/src/assets/icon/light/download.svg
@@ -0,0 +1,3 @@
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M12.25 39.5H35.75C36.4404 39.5 37 40.0596 37 40.75C37 41.3972 36.5081 41.9295 35.8778 41.9935L35.75 42H12.25C11.5596 42 11 41.4404 11 40.75C11 40.1028 11.4919 39.5705 12.1222 39.5065L12.25 39.5H35.75H12.25ZM23.6222 6.00645L23.75 6C24.3972 6 24.9295 6.49187 24.9935 7.12219L25 7.25V31.54L30.6467 25.8943C31.1348 25.4061 31.9263 25.4061 32.4144 25.8943C32.9026 26.3824 32.9026 27.1739 32.4144 27.6621L24.6363 35.4402C24.1481 35.9284 23.3567 35.9284 22.8685 35.4402L15.0903 27.6621C14.6022 27.1739 14.6022 26.3824 15.0903 25.8943C15.5785 25.4061 16.3699 25.4061 16.8581 25.8943L22.5 31.536V7.25C22.5 6.60279 22.9919 6.07047 23.6222 6.00645L23.75 6L23.6222 6.00645Z" fill="#212121"/>
+</svg>
diff --git a/src/assets/icon/light/folder.svg b/src/assets/icon/light/folder.svg
new file mode 100644
index 0000000..f5b0f89
--- /dev/null
+++ b/src/assets/icon/light/folder.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M2 5V11C2 12.1046 2.89543 13 4 13H12C13.1046 13 14 12.1046 14 11V6C14 4.89543 13.1046 4 12 4H7.17539L6.06235 3.10957C5.97369 3.03864 5.86354 3 5.75 3H4C2.89543 3 2 3.89543 2 5ZM3 5C3 4.44772 3.44772 4 4 4H5.57461L6.44274 4.6945L5.5567 5.49998H3V5ZM7.5933 5H12C12.5523 5 13 5.44772 13 6V11C13 11.5523 12.5523 12 12 12H4C3.44772 12 3 11.5523 3 11V6.49998H5.75C5.87438 6.49998 5.9943 6.45362 6.08634 6.36995L7.5933 5Z" fill="#212121"/>
+</svg>
diff --git a/src/assets/icon/light/globe.svg b/src/assets/icon/light/globe.svg
new file mode 100644
index 0000000..94d7ff8
--- /dev/null
+++ b/src/assets/icon/light/globe.svg
@@ -0,0 +1,3 @@
+<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M16 30C23.732 30 30 23.732 30 16C30 8.26801 23.732 2 16 2C8.26801 2 2 8.26801 2 16C2 23.732 8.26801 30 16 30ZM16 4C17.0317 4 18.283 4.94804 19.3347 7.22667C19.7084 8.03639 20.0331 8.9697 20.2941 10H11.7059C11.9669 8.9697 12.2916 8.03639 12.6653 7.22667C13.717 4.94804 14.9683 4 16 4ZM10.8494 6.38855C10.36 7.44883 9.95424 8.66735 9.64867 10H5.60539C6.97928 7.62495 9.1438 5.76448 11.7391 4.77849C11.4088 5.27683 11.1118 5.81994 10.8494 6.38855ZM9.27878 12C9.0968 13.2705 9 14.6141 9 16C9 17.3859 9.0968 18.7295 9.27878 20H4.68282C4.24062 18.7489 4 17.4025 4 16C4 14.5975 4.24062 13.2511 4.68282 12H9.27878ZM9.64867 22C9.95424 23.3327 10.36 24.5512 10.8494 25.6114C11.1118 26.1801 11.4088 26.7232 11.7391 27.2215C9.1438 26.2355 6.97928 24.375 5.60539 22H9.64867ZM11.7059 22H20.2941C20.0331 23.0303 19.7084 23.9636 19.3347 24.7733C18.283 27.052 17.0317 28 16 28C14.9683 28 13.717 27.052 12.6653 24.7733C12.2916 23.9636 11.9669 23.0303 11.7059 22ZM20.6991 20H11.3009C11.1068 18.7518 11 17.4068 11 16C11 14.5932 11.1068 13.2482 11.3009 12H20.6991C20.8932 13.2482 21 14.5932 21 16C21 17.4068 20.8932 18.7518 20.6991 20ZM22.3513 22H26.3946C25.0207 24.375 22.8562 26.2355 20.2609 27.2215C20.5912 26.7232 20.8882 26.1801 21.1506 25.6114C21.64 24.5512 22.0458 23.3327 22.3513 22ZM27.3172 20H22.7212C22.9032 18.7295 23 17.3859 23 16C23 14.6141 22.9032 13.2705 22.7212 12H27.3172C27.7594 13.2511 28 14.5975 28 16C28 17.4025 27.7594 18.7489 27.3172 20ZM20.2609 4.77849C22.8562 5.76448 25.0207 7.62495 26.3946 10H22.3513C22.0458 8.66735 21.64 7.44883 21.1506 6.38855C20.8882 5.81994 20.5912 5.27683 20.2609 4.77849Z" fill="#212121"/>
+</svg>
diff --git a/src/assets/icon/light/leftbutton_0.svg b/src/assets/icon/light/leftbutton_0.svg
new file mode 100644
index 0000000..a99113d
--- /dev/null
+++ b/src/assets/icon/light/leftbutton_0.svg
@@ -0,0 +1,3 @@
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M21.6062 5.85517C23.0048 4.71494 24.9952 4.71494 26.3938 5.85517L39.5688 16.5966C40.4736 17.3342 41 18.4492 41 19.628V39.1134C41 41.2599 39.2875 43 37.175 43H32.075C29.9625 43 28.25 41.2599 28.25 39.1134V29.7492C28.25 29.0337 27.6792 28.4536 26.975 28.4536H21.025C20.3208 28.4536 19.75 29.0337 19.75 29.7492V39.1134C19.75 41.2599 18.0375 43 15.925 43H10.825C8.71251 43 7 41.2599 7 39.1134V19.628C7 18.4493 7.52645 17.3342 8.43124 16.5966L21.6062 5.85517ZM24.7979 7.87612C24.3317 7.49604 23.6683 7.49604 23.2021 7.87612L10.0271 18.6175C9.72548 18.8634 9.55 19.2351 9.55 19.628V39.1134C9.55 39.8289 10.1208 40.4089 10.825 40.4089H15.925C16.6292 40.4089 17.2 39.8289 17.2 39.1134V29.7492C17.2 27.6027 18.9125 25.8626 21.025 25.8626H26.975C29.0875 25.8626 30.8 27.6027 30.8 29.7492V39.1134C30.8 39.8289 31.3708 40.4089 32.075 40.4089H37.175C37.8792 40.4089 38.45 39.8289 38.45 39.1134V19.628C38.45 19.2351 38.2745 18.8634 37.9729 18.6175L24.7979 7.87612Z" fill="#212121"/>
+</svg>
diff --git a/src/assets/icon/light/leftbutton_1.svg b/src/assets/icon/light/leftbutton_1.svg
new file mode 100644
index 0000000..94d7ff8
--- /dev/null
+++ b/src/assets/icon/light/leftbutton_1.svg
@@ -0,0 +1,3 @@
+<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M16 30C23.732 30 30 23.732 30 16C30 8.26801 23.732 2 16 2C8.26801 2 2 8.26801 2 16C2 23.732 8.26801 30 16 30ZM16 4C17.0317 4 18.283 4.94804 19.3347 7.22667C19.7084 8.03639 20.0331 8.9697 20.2941 10H11.7059C11.9669 8.9697 12.2916 8.03639 12.6653 7.22667C13.717 4.94804 14.9683 4 16 4ZM10.8494 6.38855C10.36 7.44883 9.95424 8.66735 9.64867 10H5.60539C6.97928 7.62495 9.1438 5.76448 11.7391 4.77849C11.4088 5.27683 11.1118 5.81994 10.8494 6.38855ZM9.27878 12C9.0968 13.2705 9 14.6141 9 16C9 17.3859 9.0968 18.7295 9.27878 20H4.68282C4.24062 18.7489 4 17.4025 4 16C4 14.5975 4.24062 13.2511 4.68282 12H9.27878ZM9.64867 22C9.95424 23.3327 10.36 24.5512 10.8494 25.6114C11.1118 26.1801 11.4088 26.7232 11.7391 27.2215C9.1438 26.2355 6.97928 24.375 5.60539 22H9.64867ZM11.7059 22H20.2941C20.0331 23.0303 19.7084 23.9636 19.3347 24.7733C18.283 27.052 17.0317 28 16 28C14.9683 28 13.717 27.052 12.6653 24.7733C12.2916 23.9636 11.9669 23.0303 11.7059 22ZM20.6991 20H11.3009C11.1068 18.7518 11 17.4068 11 16C11 14.5932 11.1068 13.2482 11.3009 12H20.6991C20.8932 13.2482 21 14.5932 21 16C21 17.4068 20.8932 18.7518 20.6991 20ZM22.3513 22H26.3946C25.0207 24.375 22.8562 26.2355 20.2609 27.2215C20.5912 26.7232 20.8882 26.1801 21.1506 25.6114C21.64 24.5512 22.0458 23.3327 22.3513 22ZM27.3172 20H22.7212C22.9032 18.7295 23 17.3859 23 16C23 14.6141 22.9032 13.2705 22.7212 12H27.3172C27.7594 13.2511 28 14.5975 28 16C28 17.4025 27.7594 18.7489 27.3172 20ZM20.2609 4.77849C22.8562 5.76448 25.0207 7.62495 26.3946 10H22.3513C22.0458 8.66735 21.64 7.44883 21.1506 6.38855C20.8882 5.81994 20.5912 5.27683 20.2609 4.77849Z" fill="#212121"/>
+</svg>
diff --git a/src/assets/icon/light/leftbutton_10.svg b/src/assets/icon/light/leftbutton_10.svg
new file mode 100644
index 0000000..430da5e
--- /dev/null
+++ b/src/assets/icon/light/leftbutton_10.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M13.4089 2.51203C12.5053 2.14573 11.4947 2.14573 10.5911 2.51203L3.09252 5.552C2.43211 5.81973 2 6.46118 2 7.1738V16.8265C2 17.5391 2.43211 18.1806 3.09252 18.4483L10.5911 21.4883C10.7263 21.5431 10.8639 21.5897 11.0032 21.6281C11.0011 21.5857 11 21.543 11 21.5V20.0355L3.65607 17.0582C3.56173 17.0199 3.5 16.9283 3.5 16.8265V7.7493L11.2503 10.7633V15.4082C11.5487 14.7947 12.0906 14.3215 12.7503 14.1143V10.7647L20.5 7.77243V11.5498C21.3872 12.0033 21.9955 12.9245 22 13.9882V7.1738C22 6.46118 21.5679 5.81973 20.9075 5.552L13.4089 2.51203ZM11.1547 3.90214C11.6968 3.68236 12.3032 3.68236 12.8453 3.90214L19.4376 6.57469L16.7684 7.60531L9.24097 4.67796L11.1547 3.90214ZM7.21472 5.49941L14.6917 8.40714L12.0013 9.44593L4.58967 6.56362L7.21472 5.49941ZM14 15H13.5C12.6716 15 12 15.6716 12 16.5V18H14.5V17.75C14.5 17.3358 14.8358 17 15.25 17C15.6642 17 16 17.3358 16 17.75V18H19V17.75C19 17.3358 19.3358 17 19.75 17C20.1642 17 20.5 17.3358 20.5 17.75V18H23V16.5C23 15.6716 22.3284 15 21.5 15H21V14C21 13.0335 20.2165 12.25 19.25 12.25H15.75C14.7835 12.25 14 13.0335 14 14V15ZM15.5 14C15.5 13.8619 15.6119 13.75 15.75 13.75H19.25C19.3881 13.75 19.5 13.8619 19.5 14V15H15.5V14ZM12 21.5V19.5H14.5V20.25C14.5 20.6642 14.8358 21 15.25 21C15.6642 21 16 20.6642 16 20.25V19.5H19V20.25C19 20.6642 19.3358 21 19.75 21C20.1642 21 20.5 20.6642 20.5 20.25V19.5H23V21.5C23 22.3284 22.3284 23 21.5 23H13.5C12.6716 23 12 22.3284 12 21.5Z" fill="#212121"/>
+</svg>
diff --git a/src/assets/icon/light/leftbutton_11.svg b/src/assets/icon/light/leftbutton_11.svg
new file mode 100644
index 0000000..9adc870
--- /dev/null
+++ b/src/assets/icon/light/leftbutton_11.svg
@@ -0,0 +1,6 @@
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M37.75 6C38.4403 6 39 6.55964 39 7.25V9H40.75C41.4403 9 42 9.55964 42 10.25C42 10.9404 41.4403 11.5 40.75 11.5H39V13.25C39 13.9404 38.4403 14.5 37.75 14.5C37.0596 14.5 36.5 13.9404 36.5 13.25V11.5H34.75C34.0596 11.5 33.5 10.9404 33.5 10.25C33.5 9.55964 34.0596 9 34.75 9H36.5V7.25C36.5 6.55964 37.0596 6 37.75 6Z" fill="#212121"/>
+<path d="M15 11.25C15 10.5596 14.4403 10 13.75 10C13.0596 10 12.5 10.5596 12.5 11.25V13H10.75C10.0596 13 9.49999 13.5596 9.49999 14.25C9.49999 14.9404 10.0596 15.5 10.75 15.5H12.5V17.25C12.5 17.9404 13.0596 18.5 13.75 18.5C14.4403 18.5 15 17.9404 15 17.25V15.5H16.75C17.4403 15.5 18 14.9404 18 14.25C18 13.5596 17.4403 13 16.75 13H15V11.25Z" fill="#212121"/>
+<path d="M33.75 30C34.4403 30 35 30.5596 35 31.25V33H36.75C37.4403 33 38 33.5596 38 34.25C38 34.9404 37.4403 35.5 36.75 35.5H35V37.25C35 37.9404 34.4403 38.5 33.75 38.5C33.0596 38.5 32.5 37.9404 32.5 37.25V35.5H30.75C30.0596 35.5 29.5 34.9404 29.5 34.25C29.5 33.5596 30.0596 33 30.75 33H32.5V31.25C32.5 30.5596 33.0596 30 33.75 30Z" fill="#212121"/>
+<path d="M25.8895 15.4044C27.7445 13.5494 30.7521 13.5494 32.607 15.4044C34.462 17.2594 34.462 20.2669 32.607 22.1219L12.1132 42.6158C10.2582 44.4707 7.25069 44.4707 5.3957 42.6158C3.54071 40.7608 3.54071 37.7532 5.3957 35.8982L25.8895 15.4044ZM24.5309 20.2986L7.16347 37.666C6.28479 38.5447 6.28479 39.9693 7.16347 40.848C8.04215 41.7267 9.46677 41.7267 10.3454 40.848L27.7129 23.4806L24.5309 20.2986ZM29.4806 21.7128L30.8393 20.3542C31.718 19.4755 31.718 18.0509 30.8393 17.1722C29.9606 16.2935 28.536 16.2935 27.6573 17.1722L26.2987 18.5308L29.4806 21.7128Z" fill="#212121"/>
+</svg>
diff --git a/src/assets/icon/light/leftbutton_12.svg b/src/assets/icon/light/leftbutton_12.svg
new file mode 100644
index 0000000..5f7dc51
--- /dev/null
+++ b/src/assets/icon/light/leftbutton_12.svg
@@ -0,0 +1,3 @@
+<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M10 18C11.1046 18 12 17.1046 12 16C12 14.8954 11.1046 14 10 14C8.89543 14 8 14.8954 8 16C8 17.1046 8.89543 18 10 18ZM16 18C17.1046 18 18 17.1046 18 16C18 14.8954 17.1046 14 16 14C14.8954 14 14 14.8954 14 16C14 17.1046 14.8954 18 16 18ZM24 16C24 17.1046 23.1046 18 22 18C20.8954 18 20 17.1046 20 16C20 14.8954 20.8954 14 22 14C23.1046 14 24 14.8954 24 16ZM30 16C30 23.732 23.732 30 16 30C8.26801 30 2 23.732 2 16C2 8.26801 8.26801 2 16 2C23.732 2 30 8.26801 30 16ZM28 16C28 9.37258 22.6274 4 16 4C9.37258 4 4 9.37258 4 16C4 22.6274 9.37258 28 16 28C22.6274 28 28 22.6274 28 16Z" fill="#212121"/>
+</svg>
diff --git a/src/assets/icon/light/leftbutton_2.svg b/src/assets/icon/light/leftbutton_2.svg
new file mode 100644
index 0000000..e4e7d62
--- /dev/null
+++ b/src/assets/icon/light/leftbutton_2.svg
@@ -0,0 +1,5 @@
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M15.9958 20.2505C15.9958 19.5601 16.5555 19.0005 17.2458 19.0005H30.7503C31.4406 19.0005 32.0003 19.5601 32.0003 20.2505C32.0003 20.9408 31.4406 21.5005 30.7503 21.5005H17.2458C16.5555 21.5005 15.9958 20.9408 15.9958 20.2505Z" fill="#212121"/>
+<path d="M17.2502 26.4755C16.5599 26.4755 16.0002 27.0351 16.0002 27.7255C16.0002 28.4158 16.5599 28.9755 17.2502 28.9755H26.7502C27.4406 28.9755 28.0002 28.4158 28.0002 27.7255C28.0002 27.0351 27.4406 26.4755 26.7502 26.4755H17.2502Z" fill="#212121"/>
+<path d="M16.5358 5.45151C33.8238 -1.46711 50.882 16.8873 41.5929 33.6076C37.3737 41.2022 26.8909 47.318 14.6846 41.5336L6.20039 43.9576C4.88396 44.3338 3.66741 43.1222 4.03682 41.8046C4.54321 39.9986 5.74306 35.7407 6.44459 33.4333C1.18328 24.045 4.73099 10.1758 16.5358 5.45151ZM39.4076 32.3935C47.4934 17.839 32.6847 1.68154 17.4647 7.77254C6.98817 11.9652 3.9394 24.4657 8.87032 32.6319L9.16123 33.1136L8.99336 33.6508C8.46122 35.3537 7.45649 38.8846 6.80827 41.1839L14.922 38.8657L15.3554 39.0806C26.3618 44.5367 35.6773 39.1079 39.4076 32.3935Z" fill="#212121"/>
+</svg>
diff --git a/src/assets/icon/light/leftbutton_3.svg b/src/assets/icon/light/leftbutton_3.svg
new file mode 100644
index 0000000..320ac66
--- /dev/null
+++ b/src/assets/icon/light/leftbutton_3.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M19.6977 2.14829C19.8879 2.28981 20 2.51293 20 2.75001V16.25C20 16.2767 19.9986 16.303 19.9959 16.329C19.9986 16.3856 20 16.4427 20 16.5C20 18.433 18.433 20 16.5 20C14.567 20 13 18.433 13 16.5C13 14.567 14.567 13 16.5 13C17.2436 13 17.9331 13.2319 18.5 13.6273V7.75803L10 10.308V18.25C10 18.2766 9.99861 18.303 9.99589 18.3289C9.99862 18.3856 10 18.4426 10 18.5C10 20.433 8.433 22 6.5 22C4.567 22 3 20.433 3 18.5C3 16.567 4.567 15 6.5 15C7.24362 15 7.93308 15.2319 8.5 15.6273V5.75001C8.5 5.4188 8.71725 5.12681 9.03449 5.03164L19.0345 2.03164C19.2616 1.96351 19.5075 2.00677 19.6977 2.14829ZM10 8.74198L18.5 6.19198V3.75803L10 6.30803V8.74198ZM6.5 16.5C5.39543 16.5 4.5 17.3954 4.5 18.5C4.5 19.6046 5.39543 20.5 6.5 20.5C7.60457 20.5 8.5 19.6046 8.5 18.5C8.5 17.3954 7.60457 16.5 6.5 16.5ZM14.5 16.5C14.5 17.6046 15.3954 18.5 16.5 18.5C17.6046 18.5 18.5 17.6046 18.5 16.5C18.5 15.3954 17.6046 14.5 16.5 14.5C15.3954 14.5 14.5 15.3954 14.5 16.5Z" fill="#212121"/>
+</svg>
diff --git a/src/assets/icon/light/leftbutton_4.svg b/src/assets/icon/light/leftbutton_4.svg
new file mode 100644
index 0000000..430e96b
--- /dev/null
+++ b/src/assets/icon/light/leftbutton_4.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M6.25 4H17.75C19.483 4 20.8992 5.35645 20.9949 7.06558L21 7.25V16.75C21 18.483 19.6435 19.8992 17.9344 19.9949L17.75 20H6.25C4.51697 20 3.10075 18.6435 3.00514 16.9344L3 16.75V7.25C3 5.51697 4.35645 4.10075 6.06558 4.00514L6.25 4H17.75H6.25ZM17.75 5.5H6.25C5.33183 5.5 4.57881 6.20711 4.5058 7.10647L4.5 7.25V16.75C4.5 17.6682 5.20711 18.4212 6.10647 18.4942L6.25 18.5H17.75C18.6682 18.5 19.4212 17.7929 19.4942 16.8935L19.5 16.75V7.25C19.5 6.33183 18.7929 5.57881 17.8935 5.5058L17.75 5.5ZM10.0528 9.58541C10.1626 9.36586 10.4121 9.26237 10.6396 9.32882L10.7236 9.3618L15.1056 11.5528C15.2023 11.6012 15.2808 11.6796 15.3292 11.7764C15.439 11.9959 15.372 12.2576 15.1824 12.3998L15.1056 12.4472L10.7236 14.6382C10.6542 14.6729 10.5776 14.691 10.5 14.691C10.2545 14.691 10.0504 14.5141 10.0081 14.2809L10 14.191V9.80902C10 9.73139 10.0181 9.65484 10.0528 9.58541Z" fill="#212121"/>
+</svg>
diff --git a/src/assets/icon/light/leftbutton_5.svg b/src/assets/icon/light/leftbutton_5.svg
new file mode 100644
index 0000000..baac32e
--- /dev/null
+++ b/src/assets/icon/light/leftbutton_5.svg
@@ -0,0 +1,3 @@
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M30.9968 12C33.7582 12 35.9968 14.2386 35.9968 17C35.9968 19.7614 33.7582 22 30.9968 22C28.2354 22 25.9968 19.7614 25.9968 17C25.9968 14.2386 28.2354 12 30.9968 12ZM28.4968 17C28.4968 18.3807 29.6161 19.5 30.9968 19.5C32.3775 19.5 33.4968 18.3807 33.4968 17C33.4968 15.6193 32.3775 14.5 30.9968 14.5C29.6161 14.5 28.4968 15.6193 28.4968 17ZM6 10.75C6 8.12665 8.12665 6 10.75 6H37.25C39.8734 6 42 8.12665 42 10.75V37.25C42 38.4377 41.5641 39.5236 40.8435 40.3565C40.7898 40.4531 40.7223 40.5441 40.641 40.6268C40.5548 40.7144 40.4589 40.7866 40.3566 40.8434C39.5238 41.564 38.4378 42 37.25 42H10.75C9.55998 42 8.47218 41.5624 7.63873 40.8393C7.53919 40.7832 7.44575 40.7123 7.36158 40.6268C7.28258 40.5466 7.21664 40.4583 7.16373 40.3648C6.43884 39.5309 6 38.4417 6 37.25V10.75ZM39.5 37.25V10.75C39.5 9.50736 38.4926 8.5 37.25 8.5H10.75C9.50736 8.5 8.5 9.50736 8.5 10.75V37.25C8.5 37.4065 8.51598 37.5592 8.54639 37.7067L21.3697 25.0851C22.8291 23.6486 25.171 23.6485 26.6306 25.0849L39.454 37.7048C39.4842 37.5579 39.5 37.4058 39.5 37.25ZM10.75 39.5H37.25C37.3948 39.5 37.5364 39.4863 37.6736 39.4602L24.877 26.8668C24.3905 26.388 23.6099 26.388 23.1234 26.8668L10.3284 39.4606C10.465 39.4865 10.6059 39.5 10.75 39.5Z" fill="#212121"/>
+</svg>
diff --git a/src/assets/icon/light/leftbutton_6.svg b/src/assets/icon/light/leftbutton_6.svg
new file mode 100644
index 0000000..e2be803
--- /dev/null
+++ b/src/assets/icon/light/leftbutton_6.svg
@@ -0,0 +1,3 @@
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M16.25 18C16.9404 18 17.5 18.5596 17.5 19.25V23H20.75C21.4404 23 22 23.5596 22 24.25C22 24.9404 21.4404 25.5 20.75 25.5H17.5V28.75C17.5 29.4404 16.9404 30 16.25 30C15.5596 30 15 29.4404 15 28.75V25.5H11.25C10.5596 25.5 10 24.9404 10 24.25C10 23.5596 10.5596 23 11.25 23H15V19.25C15 18.5596 15.5596 18 16.25 18ZM32 27.5C32 28.8807 30.8807 30 29.5 30C28.1193 30 27 28.8807 27 27.5C27 26.1193 28.1193 25 29.5 25C30.8807 25 32 26.1193 32 27.5ZM33.5 23C34.8807 23 36 21.8807 36 20.5C36 19.1193 34.8807 18 33.5 18C32.1193 18 31 19.1193 31 20.5C31 21.8807 32.1193 23 33.5 23ZM4 23.9998C4 16.2679 10.268 9.99985 18 9.99985H30C37.732 9.99985 44 16.2679 44 23.9998C44 31.7318 37.732 37.9998 30 37.9998H18C10.268 37.9998 4 31.7318 4 23.9998ZM18 12.4998C11.6487 12.4998 6.5 17.6486 6.5 23.9998C6.5 30.3511 11.6487 35.4998 18 35.4998H30C36.3513 35.4998 41.5 30.3511 41.5 23.9998C41.5 17.6486 36.3513 12.4998 30 12.4998H18Z" fill="#212121"/>
+</svg>
diff --git a/src/assets/icon/light/leftbutton_7.svg b/src/assets/icon/light/leftbutton_7.svg
new file mode 100644
index 0000000..017fafd
--- /dev/null
+++ b/src/assets/icon/light/leftbutton_7.svg
@@ -0,0 +1,6 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M17.7499 2.00098C18.9407 2.00098 19.9155 2.92614 19.9947 4.09693L19.9999 4.25098V19.749C19.9999 20.9399 19.0747 21.9147 17.9039 21.9939L17.7499 21.999H6.25C5.05914 21.999 4.08436 21.0739 4.00519 19.9031L4 19.749V4.25098C4 3.06011 4.92516 2.08533 6.09595 2.00617L6.25 2.00098H17.7499ZM17.7499 3.50098H6.25C5.8703 3.50098 5.55651 3.78313 5.50685 4.14921L5.5 4.25098V19.749C5.5 20.1287 5.78215 20.4425 6.14823 20.4922L6.25 20.499H17.7499C18.1296 20.499 18.4434 20.2169 18.493 19.8508L18.4999 19.749V4.25098C18.4999 3.87128 18.2177 3.55749 17.8516 3.50782L17.7499 3.50098Z" fill="#212121"/>
+<path d="M6.99994 15.75C6.99994 15.3358 7.33572 15 7.74994 15H16.2499C16.6642 15 16.9999 15.3358 16.9999 15.75C16.9999 16.1642 16.6642 16.5 16.2499 16.5H7.74994C7.33572 16.5 6.99994 16.1642 6.99994 15.75Z" fill="#212121"/>
+<path d="M6.99994 7.75001C6.99994 7.3358 7.33572 7.00001 7.74994 7.00001H16.2499C16.6642 7.00001 16.9999 7.3358 16.9999 7.75001C16.9999 8.16422 16.6642 8.50001 16.2499 8.50001H7.74994C7.33572 8.50001 6.99994 8.16422 6.99994 7.75001Z" fill="#212121"/>
+<path d="M6.99994 11.75C6.99994 11.3358 7.33572 11 7.74994 11H16.2499C16.6642 11 16.9999 11.3358 16.9999 11.75C16.9999 12.1642 16.6642 12.5 16.2499 12.5H7.74994C7.33572 12.5 6.99994 12.1642 6.99994 11.75Z" fill="#212121"/>
+</svg>
diff --git a/src/assets/icon/light/leftbutton_8.svg b/src/assets/icon/light/leftbutton_8.svg
new file mode 100644
index 0000000..e542fd5
--- /dev/null
+++ b/src/assets/icon/light/leftbutton_8.svg
@@ -0,0 +1,4 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M10.5416 8.60759L11.642 6.37799C11.8907 5.874 12.6094 5.874 12.8581 6.37799L13.9585 8.60759L16.419 8.96512C16.9752 9.04594 17.1972 9.72944 16.7948 10.1217L15.0143 11.8572L15.4347 14.3078C15.5297 14.8617 14.9482 15.2842 14.4508 15.0226L12.25 13.8656L10.0493 15.0226C9.55182 15.2842 8.9704 14.8617 9.06541 14.3078L9.48571 11.8572L7.70527 10.1217C7.30281 9.72944 7.5249 9.04594 8.08108 8.96512L10.5416 8.60759ZM11.6 9.52747C11.5012 9.72761 11.3103 9.86633 11.0894 9.89842L9.6358 10.1096L10.6876 11.1349C10.8474 11.2907 10.9204 11.5152 10.8826 11.7351L10.6343 13.1829L11.9345 12.4993C12.132 12.3955 12.368 12.3955 12.5656 12.4993L13.8657 13.1829L13.6174 11.7351C13.5797 11.5152 13.6526 11.2907 13.8124 11.1349L14.8643 10.1096L13.4107 9.89842C13.1898 9.86633 12.9989 9.72761 12.9001 9.52747L12.25 8.21029L11.6 9.52747Z" fill="#212121"/>
+<path d="M6.5 2C5.11929 2 4 3.11929 4 4.5V19.5C4 20.8807 5.11929 22 6.5 22H19.75C20.1642 22 20.5 21.6642 20.5 21.25C20.5 20.8358 20.1642 20.5 19.75 20.5H6.5C5.94772 20.5 5.5 20.0523 5.5 19.5H19.75C20.1642 19.5 20.5 19.1642 20.5 18.75V4.5C20.5 3.11929 19.3807 2 18 2H6.5ZM19 18H5.5V4.5C5.5 3.94772 5.94772 3.5 6.5 3.5H18C18.5523 3.5 19 3.94772 19 4.5V18Z" fill="#212121"/>
+</svg>
diff --git a/src/assets/icon/light/leftbutton_9.svg b/src/assets/icon/light/leftbutton_9.svg
new file mode 100644
index 0000000..827e68c
--- /dev/null
+++ b/src/assets/icon/light/leftbutton_9.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M2 5.25C2 3.45507 3.45507 2 5.25 2H16.75C18.5449 2 20 3.45507 20 5.25V8.00934C19.4951 7.95675 18.9878 7.99076 18.5 8.10566V7H3.5V16.75C3.5 17.7165 4.2835 18.5 5.25 18.5H13.2347L12.7935 19.2641C12.6577 19.4994 12.5652 19.7477 12.5135 20H5.25C3.45507 20 2 18.5449 2 16.75V5.25ZM5.25 3.5C4.2835 3.5 3.5 4.2835 3.5 5.25V5.5H18.5V5.25C18.5 4.2835 17.7165 3.5 16.75 3.5H5.25ZM19.8565 9C19.6411 8.98005 19.4255 8.9803 19.2123 9C18.1194 9.10098 17.0907 9.71296 16.5002 10.7357C15.7915 11.9632 15.9109 13.4415 16.685 14.5239L13.6595 19.7641C13.6153 19.8407 13.5788 19.9196 13.5499 20C13.3149 20.6516 13.5724 21.3977 14.1933 21.7562C14.8908 22.1589 15.7828 21.9199 16.1855 21.2224L19.2166 15.9724C20.5321 16.0903 21.8586 15.4548 22.5624 14.2357C23.3244 12.916 23.1291 11.3063 22.1921 10.2105L20.5417 13.0691C20.2195 13.6271 19.506 13.8183 18.948 13.4961C18.39 13.1739 18.1988 12.4604 18.521 11.9024L20.1714 9.04377C20.0667 9.0243 19.9616 9.00974 19.8565 9ZM10.3029 9.2432C10.5828 9.54854 10.5621 10.023 10.2568 10.3029L7.85992 12.5L10.2568 14.6971C10.5621 14.977 10.5828 15.4515 10.3029 15.7568C10.023 16.0621 9.54855 16.0828 9.24321 15.8029L6.24321 13.0529C6.08823 12.9108 6 12.7102 6 12.5C6 12.2898 6.08823 12.0892 6.24321 11.9471L9.24321 9.19713C9.54855 8.91724 10.023 8.93786 10.3029 9.2432ZM13.2568 15.8029L15.2766 13.9514C14.9587 13.0273 14.9412 12.0035 15.2685 11.0412L13.2568 9.19714C12.9515 8.91724 12.477 8.93787 12.1971 9.24321C11.9172 9.54855 11.9379 10.023 12.2432 10.3029L14.6401 12.5L12.2432 14.6971C11.9379 14.977 11.9172 15.4515 12.1971 15.7568C12.477 16.0621 12.9515 16.0828 13.2568 15.8029Z" fill="#212121"/>
+</svg>
diff --git a/src/assets/icon/light/text.svg b/src/assets/icon/light/text.svg
new file mode 100644
index 0000000..6185b6a
--- /dev/null
+++ b/src/assets/icon/light/text.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M5.5 5C5.22386 5 5 5.22386 5 5.5C5 5.77614 5.22386 6 5.5 6H10.5C10.7761 6 11 5.77614 11 5.5C11 5.22386 10.7761 5 10.5 5H5.5ZM5.5 7C5.22386 7 5 7.22386 5 7.5C5 7.77614 5.22386 8 5.5 8H8.5C8.77614 8 9 7.77614 9 7.5C9 7.22386 8.77614 7 8.5 7H5.5ZM5.5 9C5.22386 9 5 9.22386 5 9.5C5 9.77614 5.22386 10 5.5 10H10.5C10.7761 10 11 9.77614 11 9.5C11 9.22386 10.7761 9 10.5 9H5.5ZM4.5 2C3.11929 2 2 3.11929 2 4.5V11.5C2 12.8807 3.11929 14 4.5 14H11.5C12.8807 14 14 12.8807 14 11.5V4.5C14 3.11929 12.8807 2 11.5 2H4.5ZM3 4.5C3 3.67157 3.67157 3 4.5 3H11.5C12.3284 3 13 3.67157 13 4.5V11.5C13 12.3284 12.3284 13 11.5 13H4.5C3.67157 13 3 12.3284 3 11.5V4.5Z" fill="#212121"/>
+</svg>
diff --git a/src/assets/icon/logo.svg b/src/assets/icon/logo.svg
new file mode 100644
index 0000000..0306cc0
--- /dev/null
+++ b/src/assets/icon/logo.svg
@@ -0,0 +1,268 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="200mm"
+   height="200mm"
+   viewBox="0 0 200 200"
+   version="1.1"
+   id="svg8"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
+   sodipodi:docname="deepin-community-store.svg">
+  <defs
+     id="defs2">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient1200">
+      <stop
+         style="stop-color:#000000;stop-opacity:0.1299435"
+         offset="0"
+         id="stop1196" />
+      <stop
+         style="stop-color:#dadada;stop-opacity:0.81960785"
+         offset="1"
+         id="stop1198" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1138"
+       inkscape:collect="always">
+      <stop
+         id="stop1134"
+         offset="0"
+         style="stop-color:#99e7ea;stop-opacity:1" />
+      <stop
+         id="stop1136"
+         offset="1"
+         style="stop-color:#007ffc;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient1128">
+      <stop
+         style="stop-color:#99e7ea;stop-opacity:1"
+         offset="0"
+         id="stop1124" />
+      <stop
+         style="stop-color:#007ffc;stop-opacity:1"
+         offset="1"
+         id="stop1126" />
+    </linearGradient>
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect960"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1128"
+       id="radialGradient1130"
+       cx="100.35268"
+       cy="199.86011"
+       fx="100.35268"
+       fy="199.86011"
+       r="90.135414"
+       gradientTransform="matrix(1,0,0,0.98112945,0,3.7714702)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1138"
+       id="radialGradient1132"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.98112945,0,3.7714702)"
+       cx="100.35268"
+       cy="199.86011"
+       fx="100.35268"
+       fy="199.86011"
+       r="90.135414" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1200"
+       id="radialGradient1202"
+       cx="100.35268"
+       cy="199.86011"
+       fx="100.35268"
+       fy="199.86011"
+       r="90.135414"
+       gradientTransform="matrix(1,0,0,0.98112945,0,3.7714702)"
+       gradientUnits="userSpaceOnUse" />
+    <filter
+       style="color-interpolation-filters:sRGB;"
+       inkscape:label="Drop Shadow"
+       id="filter1448">
+      <feFlood
+         flood-opacity="0.372549"
+         flood-color="rgb(145,145,145)"
+         result="flood"
+         id="feFlood1438" />
+      <feComposite
+         in="flood"
+         in2="SourceGraphic"
+         operator="in"
+         result="composite1"
+         id="feComposite1440" />
+      <feGaussianBlur
+         in="composite1"
+         stdDeviation="5.2918"
+         result="blur"
+         id="feGaussianBlur1442" />
+      <feOffset
+         dx="0"
+         dy="0"
+         result="offset"
+         id="feOffset1444" />
+      <feComposite
+         in="SourceGraphic"
+         in2="offset"
+         operator="over"
+         result="composite2"
+         id="feComposite1446" />
+    </filter>
+    <filter
+       style="color-interpolation-filters:sRGB;"
+       inkscape:label="Drop Shadow"
+       id="filter2201">
+      <feFlood
+         flood-opacity="0.372549"
+         flood-color="rgb(145,145,145)"
+         result="flood"
+         id="feFlood2191" />
+      <feComposite
+         in="flood"
+         in2="SourceGraphic"
+         operator="in"
+         result="composite1"
+         id="feComposite2193" />
+      <feGaussianBlur
+         in="composite1"
+         stdDeviation="3.76995"
+         result="blur"
+         id="feGaussianBlur2195" />
+      <feOffset
+         dx="0"
+         dy="0"
+         result="offset"
+         id="feOffset2197" />
+      <feComposite
+         in="SourceGraphic"
+         in2="offset"
+         operator="over"
+         result="composite2"
+         id="feComposite2199" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.35"
+     inkscape:cx="120.33119"
+     inkscape:cy="507.94585"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1040"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata5">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-97)">
+    <rect
+       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ebebeb;stroke-width:2.87003541;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter2201)"
+       id="rect2119"
+       width="162.54665"
+       height="170.16383"
+       x="20.431099"
+       y="112.51035"
+       rx="30"
+       ry="30" />
+    <circle
+       style="opacity:1;fill:#959595;fill-opacity:1;stroke:#e9e9e9;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="path2121"
+       cx="58.208336"
+       cy="131.8244"
+       r="6.0476193" />
+    <circle
+       style="opacity:1;fill:#9c9c9c;fill-opacity:1;stroke:#eaeaea;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="path2121-5"
+       cx="143.63095"
+       cy="133.71429"
+       r="6.0476193" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Layer 2">
+    <path
+       style="fill:#ffc344;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 94.205599,42.389243 c 0,0 11.145081,-0.157476 22.599701,6.928753 11.45465,7.086223 18.11074,13.857508 20.27783,18.266716 2.16708,4.409209 9.28755,12.125332 9.13277,26.297795 -0.15488,14.172433 -3.40543,23.620763 -8.97797,31.494323 -5.57254,7.87359 -15.63405,13.85751 -27.70786,14.17247 -12.073829,0.31494 -19.813453,-7.55863 -22.444927,-11.96786 -2.631469,-4.4092 -3.715019,-13.85751 -0.464377,-20.62877 3.250645,-6.77132 8.358796,-6.77132 10.061513,-6.14141 1.702724,0.6299 2.167092,1.5747 3.095852,3.30689 0.928749,1.73219 1.547929,1.41726 2.941089,0.47243 1.39311,-0.94484 1.85748,-2.04715 1.54792,-3.46439 -0.30958,-1.417253 -2.16711,-3.149433 -3.71505,-3.621853 -1.547909,-0.47241 -3.715016,-1.88966 -6.810869,-1.41721 -3.095848,0.47238 -9.132757,2.04711 -14.240906,8.975843 -5.108153,6.92875 -4.488988,17.63684 -1.393134,22.67593 3.095849,5.0391 8.977962,14.48739 21.980539,17.79431 13.00259,3.30693 34.05435,-6.45633 41.32959,-21.57361 7.27524,-15.1173 7.43004,-22.20352 7.12048,-34.643764 C 148.22821,76.875544 137.23793,58.293884 125.00933,51.522601 112.78073,44.751315 103.64797,40.814522 94.205599,42.389243 Z"
+       id="path1002"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#f06767;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 100.67541,105.29647 c 0,0 -3.06474,-2.8951 -5.801108,2.22698 -2.736373,5.12205 -4.049827,9.68737 -1.313459,15.25486 2.736367,5.56745 8.428007,8.90792 17.184447,8.79659 8.75636,-0.11148 15.21419,-2.22699 19.0451,-8.5739 3.83094,-6.34692 6.7862,-11.02357 7.11457,-13.36191 0.32839,-2.33835 2.07965,0.33404 1.53239,2.33834 -0.54728,2.00426 -0.43783,5.9015 1.09454,5.12204 1.53237,-0.77942 2.73637,-2.00427 2.95526,-1.44753 0.21893,0.55673 -1.75127,4.00859 -2.68162,5.73449 -0.93039,1.7259 -3.83094,5.90153 -5.5275,7.51607 -1.69652,1.61458 -4.04981,3.89724 -6.84092,5.56747 -2.79109,1.67024 -7.11454,3.61887 -9.52255,4.06427 -2.40801,0.44539 -7.22403,1.39184 -9.96042,1.2805 -2.73635,-0.11137 -6.23892,-0.61243 -10.124558,-2.56104 -3.885645,-1.94859 -8.099657,-4.95505 -9.741479,-7.96148 -1.641825,-3.00643 -4.159283,-5.73449 -3.61201,-13.30623 0.547277,-7.57175 3.010008,-11.46899 4.870741,-13.25056 1.860731,-1.7816 4.597103,-2.56105 6.403105,-2.17131 1.806004,0.38971 2.955282,1.44755 3.393102,2.22697 0.43781,0.77944 1.149279,2.22699 1.532369,2.50538 z"
+       id="path1012"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#3f62eb;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 128.47695,145.38219 c 0,0 13.13457,-7.6831 19.26404,-19.82016 6.12948,-12.13707 8.7564,-19.93152 7.99021,-31.84592 -0.76619,-11.914358 -2.62692,-6.012854 -0.54728,-11.134928 2.07964,-5.122074 -1.31345,-15.254857 0.10943,-15.922949 1.42292,-0.668097 4.48765,4.453971 5.3633,8.573903 0.87562,4.119922 4.70654,16.813721 1.64181,32.959394 -3.06472,16.14564 -10.28872,22.60391 -15.10475,26.94655 -4.81603,4.34261 -15.7615,11.91437 -17.40332,11.80302 -1.64183,-0.11148 -1.86073,-0.11148 -1.31348,-1.55891 z"
+       id="path1014"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#fce102;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 104.83471,121.99883 c 0,0 7.00512,1.5589 12.36838,-1.78156 5.3633,-3.3405 9.5226,-8.79661 10.17931,-10.91225 0.65672,-2.11564 0.76619,1.89294 1.53236,-0.11125 0.76618,-2.00432 3.83093,-6.01288 2.29855,-15.366239 -1.53237,-9.35333 -1.64182,-9.798747 -4.48762,-14.809463 -2.84586,-5.010719 -9.63207,-11.91437 -13.79134,-14.141359 -4.15927,-2.226986 -9.96037,-5.567464 -17.950594,-5.344766 -7.990202,0.222699 -5.363286,-0.334048 -13.025124,1.002146 -7.661836,1.336187 -14.557491,5.010717 -16.856041,7.015006 -2.298552,2.004286 -8.428023,7.460405 -10.61712,10.46684 -2.189098,3.00643 -8.209113,9.798741 -11.383303,19.263442 -3.174189,9.464683 -4.487646,10.466823 -4.706555,16.702393 -0.21891,6.23557 0.547274,7.90578 -0.766185,8.46256 -1.31346,0.55673 -1.094547,-4.67668 -0.985094,-8.35123 0.109463,-3.6745 0.109463,-13.25056 4.925468,-23.940084 4.816015,-10.689538 13.353489,-19.597489 18.169503,-22.826622 4.816009,-3.229128 10.398208,-7.571752 19.045135,-9.687392 8.646933,-2.115635 17.293863,-1.781586 22.65716,-0.779443 5.3633,1.002145 13.68187,4.453974 18.1695,7.905802 4.48766,3.45183 9.41314,7.683099 13.13459,14.586765 3.72146,6.903648 4.70654,15.700251 4.59709,19.374771 -0.10943,3.674543 -1.97019,12.137103 -4.81601,16.257013 -2.84583,4.11993 -6.67674,9.0193 -10.61711,10.80089 -3.94039,1.78157 -8.75642,2.33833 -12.69675,0.55674 -3.94039,-1.78161 -3.72147,-2.44969 -4.3782,-4.34263 z"
+       id="path1016"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#5ed938;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 104.83471,121.99883 c 0,0 5.54674,1.56707 10.22918,-0.55878 4.68248,-2.12587 6.4239,-4.17301 7.54615,-5.3934 1.12223,-1.22042 3.25064,-3.50376 3.83112,-4.56669 0.58046,-1.06292 1.19962,-1.69282 1.19962,-2.08649 0,-0.39369 -1.08353,-1.33853 -0.0386,-3.62186 1.04482,-2.28333 1.97361,-7.519273 1.50922,-9.881333 -0.46438,-2.362073 -1.54792,-15.471616 -10.83547,-24.211303 -9.28753,-8.739678 -18.497709,-9.763242 -18.497709,-9.763242 0,0 14.705309,4.645415 21.593569,18.739134 6.88828,14.093741 4.64376,23.148344 0.23218,28.659854 -4.41158,5.51151 -10.68068,6.14141 -12.38342,4.72415 -1.70268,-1.41725 -5.2113,6.47164 -4.38574,7.95996 z"
+       id="path1018"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#8fdbe9;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 86.930353,71.44277 c 0,0 -9.906718,-0.07875 -17.414156,4.881616 -7.507436,4.960371 -11.14506,8.975903 -13.23476,12.125332 -2.089697,3.149446 -4.488981,7.479909 -4.179395,7.401179 0.309585,-0.0788 9.055364,-12.2828 15.866229,-15.432236 6.81087,-3.149436 13.621741,-7.558644 22.986687,-4.330482 9.364952,3.228184 13.776542,7.716118 15.788842,6.613829 2.0123,-1.1023 2.3993,-2.440824 1.23835,-3.936804 -1.16094,-1.495979 -9.364961,-8.818417 -21.051797,-7.322434 z"
+       id="path1020"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#fd7aff;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 72.107699,134.35862 c 0.65673,0.33404 5.58219,8.90795 9.522571,10.35548 3.940372,1.44755 6.567286,1.55888 7.005104,2.227 0.437821,0.66809 0.328367,4.00858 3.830921,5.45614 3.502555,1.44753 19.920785,6.01284 24.627325,6.45824 4.70658,0.4454 0.76621,3.22911 3.61202,4.23125 2.84584,1.00217 14.99532,1.5589 17.95061,0.33405 2.95527,-1.22483 2.95527,1.1135 -2.1891,3.1178 -5.14437,2.00427 -18.71677,6.79231 -27.58261,5.67882 -8.86586,-1.1135 -19.373526,-3.00644 -25.284086,-7.23772 -5.910565,-4.23126 -8.42802,-6.1242 -6.238924,-6.45824 2.189096,-0.33407 7.990199,5.9015 10.507662,6.56959 2.517463,0.66809 4.597103,0.66809 3.064735,-0.8908 -1.532366,-1.55888 -11.492755,-8.46253 -12.477849,-8.1285 -0.985092,0.33405 -3.064737,0.55674 -4.816012,-1.78159 -1.751278,-2.33832 -10.945484,-15.25485 -10.39821,-22.1585 0.547273,-6.90365 2.298552,-5.12208 4.378195,-2.56103 2.079641,2.56103 4.487648,4.78801 4.487648,4.78801 z"
+       id="path1022"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#939393;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 56.889259,34.981831 c 0,0 16.252976,26.08036 43.845241,26.83631 27.59226,0.75596 42.33333,-23.8125 42.33333,-23.8125"
+       id="path2138"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/assets/tags/a2d-small.png b/src/assets/tags/a2d-small.png
similarity index 100%
rename from assets/tags/a2d-small.png
rename to src/assets/tags/a2d-small.png
diff --git a/assets/tags/a2d.png b/src/assets/tags/a2d.png
similarity index 100%
rename from assets/tags/a2d.png
rename to src/assets/tags/a2d.png
diff --git a/assets/tags/community-small.png b/src/assets/tags/community-small.png
similarity index 100%
rename from assets/tags/community-small.png
rename to src/assets/tags/community-small.png
diff --git a/assets/tags/community.png b/src/assets/tags/community.png
similarity index 100%
rename from assets/tags/community.png
rename to src/assets/tags/community.png
diff --git a/assets/tags/community.svg b/src/assets/tags/community.svg
similarity index 100%
rename from assets/tags/community.svg
rename to src/assets/tags/community.svg
diff --git a/assets/tags/deepin-small.png b/src/assets/tags/deepin-small.png
similarity index 100%
rename from assets/tags/deepin-small.png
rename to src/assets/tags/deepin-small.png
diff --git a/assets/tags/deepin.svg b/src/assets/tags/deepin.svg
similarity index 100%
rename from assets/tags/deepin.svg
rename to src/assets/tags/deepin.svg
diff --git a/assets/tags/dtk-small.png b/src/assets/tags/dtk-small.png
similarity index 100%
rename from assets/tags/dtk-small.png
rename to src/assets/tags/dtk-small.png
diff --git a/assets/tags/dwine2-small.png b/src/assets/tags/dwine2-small.png
similarity index 100%
rename from assets/tags/dwine2-small.png
rename to src/assets/tags/dwine2-small.png
diff --git a/assets/tags/dwine5-small.png b/src/assets/tags/dwine5-small.png
similarity index 100%
rename from assets/tags/dwine5-small.png
rename to src/assets/tags/dwine5-small.png
diff --git a/assets/tags/dwine5.svg b/src/assets/tags/dwine5.svg
similarity index 100%
rename from assets/tags/dwine5.svg
rename to src/assets/tags/dwine5.svg
diff --git a/assets/tags/logo_icon.svg b/src/assets/tags/logo_icon.svg
similarity index 100%
rename from assets/tags/logo_icon.svg
rename to src/assets/tags/logo_icon.svg
diff --git a/assets/tags/ubuntu-small.png b/src/assets/tags/ubuntu-small.png
similarity index 100%
rename from assets/tags/ubuntu-small.png
rename to src/assets/tags/ubuntu-small.png
diff --git a/assets/tags/ubuntu.png b/src/assets/tags/ubuntu.png
similarity index 100%
rename from assets/tags/ubuntu.png
rename to src/assets/tags/ubuntu.png
diff --git a/assets/tags/uos-authorize.svg b/src/assets/tags/uos-authorize.svg
similarity index 100%
rename from assets/tags/uos-authorize.svg
rename to src/assets/tags/uos-authorize.svg
diff --git a/assets/tags/uos-small.png b/src/assets/tags/uos-small.png
similarity index 100%
rename from assets/tags/uos-small.png
rename to src/assets/tags/uos-small.png
diff --git a/assets/tags/uos.svg b/src/assets/tags/uos.svg
similarity index 100%
rename from assets/tags/uos.svg
rename to src/assets/tags/uos.svg
diff --git a/src/downloadworker.cpp b/src/backend/downloadworker.cpp
similarity index 96%
rename from src/downloadworker.cpp
rename to src/backend/downloadworker.cpp
index 18db546..f468e88 100644
--- a/src/downloadworker.cpp
+++ b/src/backend/downloadworker.cpp
@@ -1,248 +1,248 @@
-#include "downloadworker.h"
-#include <QEventLoop>
-#include <QProcess>
-#include <QRegularExpression>
-#include <QDir>
-#include <QtConcurrent>
-
-DownloadController::DownloadController(QObject *parent)
-{
-    Q_UNUSED(parent)
-
-    // 初始化默认域名
-    domains.clear();
-    domains.append("d.store.deepinos.org.cn");
-
-    /*
-    domains = {
-        "d1.store.deepinos.org.cn",
-        "d2.store.deepinos.org.cn",
-        "d3.store.deepinos.org.cn",
-        "d4.store.deepinos.org.cn",
-        "d5.store.deepinos.org.cn"
-    };
-    */
-    this->threadNum = domains.size();
-}
-
-void DownloadController::setFilename(QString filename)
-{
-    this->filename = filename;
-}
-
-
-bool checkMeatlink(QString metaUrl)
-{
-    QFile metaStatus("/tmp/spark-store/metaStatus.txt");
-    if (metaStatus.exists())
-    {
-        metaStatus.remove();
-    }
-    system("curl -I -s --connect-timeout 5 " + metaUrl.toUtf8() + " -w  %{http_code}  |tail -n1 > /tmp/spark-store/metaStatus.txt");
-    if (metaStatus.open(QFile::ReadOnly) && QString(metaStatus.readAll()).toUtf8() == "200")
-    {
-        metaStatus.remove();
-        return true;
-    }
-    return false;
-}
-
-void gennerateDomain(QVector<QString> &domains)
-{
-    QFile serverList(QDir::homePath().toUtf8() + "/.config/spark-store/server.list");
-    if (serverList.open(QFile::ReadOnly))
-    {
-        QStringList list = QString(serverList.readAll()).trimmed().split("\n");
-        qDebug() << list << list.size();
-        domains.clear();
-
-        for (int i = 0; i < list.size(); i++)
-        {
-            if (list.at(i).contains("镜像源 Download only") && i + 1 < list.size())
-            {
-                for (int j = i + 1; j < list.size(); j++)
-                {
-                    domains.append(list.at(j));
-                }
-                break;
-            }
-        }
-        if (domains.size() == 0)
-        {
-            domains.append("d.store.deepinos.org.cn");
-        }
-    }
-}
-
-/**
- * @brief 开始下载
- */
-void DownloadController::startDownload(const QString &url)
-{
-    // 获取下载任务信息
-    fileSize = getFileSize(url);
-    if (fileSize == 0)
-    {
-        emit errorOccur("文件大小获取失败");
-        return;
-    }
-
-    QtConcurrent::run([=]()
-                      {
-        QString metaUrl = url + ".metalink";
-        qDebug() << "metalink" << metaUrl;
-        bool useMetalink = false;
-        if (checkMeatlink(metaUrl)){
-            useMetalink = true;
-            qDebug() << "useMetalink:" << useMetalink;
-        }else{
-            gennerateDomain(domains);
-            // qDebug() << domains << domains.size();
-        }
-
-        QString aria2Command = "-d";
-        QString aria2Urls = "";
-        QString aria2Verbose = "--summary-interval=1";
-        QString aria2SizePerThreads = "--min-split-size=1M"; 
-        QString aria2NoConfig = "--no-conf";
-        QString aria2NoSeeds = "--seed-time=0";
-        QStringList command;
-        QString downloadDir = "/tmp/spark-store/";
-        QString aria2ConnectionPerServer = "--max-connection-per-server=1";
-        QString aria2ConnectionMax = "--max-concurrent-downloads=16";
-        QString aria2DNSCommand = "--async-dns-server=119.29.29.29,223.5.5.5";
-
-        if (useMetalink){
-            command.append(metaUrl.toUtf8());
-        }
-        else{
-            for (int i = 0; i < domains.size(); i++)
-            {
-                command.append(replaceDomain(url, domains.at(i)).replace("+","%2B").toUtf8()); //对+进行转译,避免oss出错
-            }
-        }
-
-
-        qint64 downloadSizeRecord = 0;
-        QString speedInfo = "";
-        QString percentInfo = "";
-        command.append(aria2Command.toUtf8());
-        command.append(downloadDir.toUtf8());
-        command.append(aria2Verbose.toUtf8());
-        command.append(aria2NoConfig.toUtf8());
-        command.append(aria2SizePerThreads.toUtf8());
-        command.append(aria2ConnectionPerServer.toUtf8());
-        command.append(aria2ConnectionMax.toUtf8());
-        command.append(aria2DNSCommand.toUtf8());
-        if (useMetalink){
-            command.append(aria2NoSeeds.toUtf8());
-        }
-        qDebug() << command;
-        auto cmd = new QProcess();
-        cmd->setProcessChannelMode(QProcess::MergedChannels);
-        cmd->setProgram("aria2c");
-        cmd->setArguments(command);
-        cmd->start();
-        cmd->waitForStarted(); //等待启动完成
-
-        QObject::connect(cmd, &QProcess::readyReadStandardOutput,
-        [&]()
-        {
-            //通过读取输出计算下载速度
-            QString message = cmd->readAllStandardOutput().data();
-            // qDebug() << message;
-            message = message.replace(" ", "");
-            QStringList list;
-            qint64 downloadSize = 0;
-            int downloadSizePlace1 = message.indexOf("(");
-            int downloadSizePlace2 = message.indexOf(")");
-            int speedPlace1 = message.indexOf("DL:");
-            int speedPlace2 = message.indexOf("ETA");
-            if (downloadSizePlace1 != -1 && downloadSizePlace2 != -1)
-            {
-                percentInfo = message.mid(downloadSizePlace1 + 1, downloadSizePlace2 - downloadSizePlace1 - 1).replace("%", "");
-                if (percentInfo != "s")
-                {
-                    int percentInfoNumber = percentInfo.toUInt();
-
-                    downloadSize = percentInfoNumber * fileSize / 100;
-                }
-            }
-            if (speedPlace1 != -1 && speedPlace2 != -1 && speedPlace2 - speedPlace1 <= 15)
-            {
-                speedInfo = message.mid(speedPlace1 + 3, speedPlace2 - speedPlace1 - 3);
-                speedInfo += "/s";
-            }
-            // qDebug() << percentInfo << speedInfo;
-            if (downloadSize >= downloadSizeRecord)
-            {
-                downloadSizeRecord = downloadSize;
-            }
-            if (percentInfo == "OK")
-            {
-                finished = true;
-                emit downloadProcess("", fileSize, fileSize);
-                qDebug() << "finished:" << finished;
-            }
-            else
-            {
-                emit downloadProcess(speedInfo, downloadSizeRecord, fileSize);
-            }
-        });
-        QObject::connect(cmd, &QProcess::readyReadStandardError,
-        [&]()
-        {
-            emit errorOccur(cmd->readAllStandardError().data());
-            return;
-        });
-
-        auto pidNumber = cmd->processId();
-        this->pidNumber = pidNumber;
-        while (cmd->waitForFinished(-1))
-        {
-            continue;
-        }
-
-        // 统计下载量
-        QString SenderdPath = "/opt/durapps/spark-store/bin/ss-feedback/sender-d";
-        /*
-        * https://en.wikipedia.org/wiki/HD_70642
-        * HD 70642 is a star with an exoplanetary companion in the southern constellation of Puppis. 
-        */
-        QProcess mailProcess;
-        mailProcess.start(SenderdPath.toUtf8() + " " + metaUrl.toUtf8() + " " + "HD70642");
-        mailProcess.waitForStarted();
-        mailProcess.waitForFinished(3);
-        mailProcess.deleteLater();
-
-
-        emit downloadFinished(); });
-}
-
-/**
- * @brief 停止下载
- */
-void DownloadController::stopDownload()
-{
-    // 实现下载进程退出
-    QString killCmd = QString("kill -9 %1").arg(pidNumber);
-    system(killCmd.toUtf8());
-    qDebug() << "kill aria2!";
-}
-
-qint64 DownloadController::getFileSize(const QString &url)
-{
-    // 已经无需使用 qtnetwork 再获取 filesize,完全交给 aria2 来计算进度。 为保证兼容性,故保留此函数。
-    qint64 fileSize = 10000;
-    return fileSize;
-}
-
-QString DownloadController::replaceDomain(const QString &url, const QString domain)
-{
-    QRegularExpression regex(R"((?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9])");
-    if (regex.match(url).hasMatch())
-    {
-        return QString(url).replace(regex.match(url).captured(), domain);
-    }
-    return url;
-}
+#include "downloadworker.h"
+#include <QEventLoop>
+#include <QProcess>
+#include <QRegularExpression>
+#include <QDir>
+#include <QtConcurrent>
+
+DownloadController::DownloadController(QObject *parent)
+{
+    Q_UNUSED(parent)
+
+    // 初始化默认域名
+    domains.clear();
+    domains.append("d.store.deepinos.org.cn");
+
+    /*
+    domains = {
+        "d1.store.deepinos.org.cn",
+        "d2.store.deepinos.org.cn",
+        "d3.store.deepinos.org.cn",
+        "d4.store.deepinos.org.cn",
+        "d5.store.deepinos.org.cn"
+    };
+    */
+    this->threadNum = domains.size();
+}
+
+void DownloadController::setFilename(QString filename)
+{
+    this->filename = filename;
+}
+
+
+bool checkMeatlink(QString metaUrl)
+{
+    QFile metaStatus("/tmp/spark-store/metaStatus.txt");
+    if (metaStatus.exists())
+    {
+        metaStatus.remove();
+    }
+    system("curl -I -s --connect-timeout 5 " + metaUrl.toUtf8() + " -w  %{http_code}  |tail -n1 > /tmp/spark-store/metaStatus.txt");
+    if (metaStatus.open(QFile::ReadOnly) && QString(metaStatus.readAll()).toUtf8() == "200")
+    {
+        metaStatus.remove();
+        return true;
+    }
+    return false;
+}
+
+void gennerateDomain(QVector<QString> &domains)
+{
+    QFile serverList(QDir::homePath().toUtf8() + "/.config/spark-store/server.list");
+    if (serverList.open(QFile::ReadOnly))
+    {
+        QStringList list = QString(serverList.readAll()).trimmed().split("\n");
+        qDebug() << list << list.size();
+        domains.clear();
+
+        for (int i = 0; i < list.size(); i++)
+        {
+            if (list.at(i).contains("镜像源 Download only") && i + 1 < list.size())
+            {
+                for (int j = i + 1; j < list.size(); j++)
+                {
+                    domains.append(list.at(j));
+                }
+                break;
+            }
+        }
+        if (domains.size() == 0)
+        {
+            domains.append("d.store.deepinos.org.cn");
+        }
+    }
+}
+
+/**
+ * @brief 开始下载
+ */
+void DownloadController::startDownload(const QString &url)
+{
+    // 获取下载任务信息
+    fileSize = getFileSize(url);
+    if (fileSize == 0)
+    {
+        emit errorOccur("文件大小获取失败");
+        return;
+    }
+
+    QtConcurrent::run([=]()
+                      {
+        QString metaUrl = url + ".metalink";
+        qDebug() << "metalink" << metaUrl;
+        bool useMetalink = false;
+        if (checkMeatlink(metaUrl)){
+            useMetalink = true;
+            qDebug() << "useMetalink:" << useMetalink;
+        }else{
+            gennerateDomain(domains);
+            // qDebug() << domains << domains.size();
+        }
+
+        QString aria2Command = "-d";
+        QString aria2Urls = "";
+        QString aria2Verbose = "--summary-interval=1";
+        QString aria2SizePerThreads = "--min-split-size=1M"; 
+        QString aria2NoConfig = "--no-conf";
+        QString aria2NoSeeds = "--seed-time=0";
+        QStringList command;
+        QString downloadDir = "/tmp/spark-store/";
+        QString aria2ConnectionPerServer = "--max-connection-per-server=1";
+        QString aria2ConnectionMax = "--max-concurrent-downloads=16";
+        QString aria2DNSCommand = "--async-dns-server=119.29.29.29,223.5.5.5";
+
+        if (useMetalink){
+            command.append(metaUrl.toUtf8());
+        }
+        else{
+            for (int i = 0; i < domains.size(); i++)
+            {
+                command.append(replaceDomain(url, domains.at(i)).replace("+","%2B").toUtf8()); //对+进行转译,避免oss出错
+            }
+        }
+
+
+        qint64 downloadSizeRecord = 0;
+        QString speedInfo = "";
+        QString percentInfo = "";
+        command.append(aria2Command.toUtf8());
+        command.append(downloadDir.toUtf8());
+        command.append(aria2Verbose.toUtf8());
+        command.append(aria2NoConfig.toUtf8());
+        command.append(aria2SizePerThreads.toUtf8());
+        command.append(aria2ConnectionPerServer.toUtf8());
+        command.append(aria2ConnectionMax.toUtf8());
+        command.append(aria2DNSCommand.toUtf8());
+        if (useMetalink){
+            command.append(aria2NoSeeds.toUtf8());
+        }
+        qDebug() << command;
+        auto cmd = new QProcess();
+        cmd->setProcessChannelMode(QProcess::MergedChannels);
+        cmd->setProgram("aria2c");
+        cmd->setArguments(command);
+        cmd->start();
+        cmd->waitForStarted(); //等待启动完成
+
+        QObject::connect(cmd, &QProcess::readyReadStandardOutput,
+        [&]()
+        {
+            //通过读取输出计算下载速度
+            QString message = cmd->readAllStandardOutput().data();
+            // qDebug() << message;
+            message = message.replace(" ", "");
+            QStringList list;
+            qint64 downloadSize = 0;
+            int downloadSizePlace1 = message.indexOf("(");
+            int downloadSizePlace2 = message.indexOf(")");
+            int speedPlace1 = message.indexOf("DL:");
+            int speedPlace2 = message.indexOf("ETA");
+            if (downloadSizePlace1 != -1 && downloadSizePlace2 != -1)
+            {
+                percentInfo = message.mid(downloadSizePlace1 + 1, downloadSizePlace2 - downloadSizePlace1 - 1).replace("%", "");
+                if (percentInfo != "s")
+                {
+                    int percentInfoNumber = percentInfo.toUInt();
+
+                    downloadSize = percentInfoNumber * fileSize / 100;
+                }
+            }
+            if (speedPlace1 != -1 && speedPlace2 != -1 && speedPlace2 - speedPlace1 <= 15)
+            {
+                speedInfo = message.mid(speedPlace1 + 3, speedPlace2 - speedPlace1 - 3);
+                speedInfo += "/s";
+            }
+            // qDebug() << percentInfo << speedInfo;
+            if (downloadSize >= downloadSizeRecord)
+            {
+                downloadSizeRecord = downloadSize;
+            }
+            if (percentInfo == "OK")
+            {
+                finished = true;
+                emit downloadProcess("", fileSize, fileSize);
+                qDebug() << "finished:" << finished;
+            }
+            else
+            {
+                emit downloadProcess(speedInfo, downloadSizeRecord, fileSize);
+            }
+        });
+        QObject::connect(cmd, &QProcess::readyReadStandardError,
+        [&]()
+        {
+            emit errorOccur(cmd->readAllStandardError().data());
+            return;
+        });
+
+        auto pidNumber = cmd->processId();
+        this->pidNumber = pidNumber;
+        while (cmd->waitForFinished(-1))
+        {
+            continue;
+        }
+
+        // 统计下载量
+        QString SenderdPath = "/opt/durapps/spark-store/bin/ss-feedback/sender-d";
+        /*
+        * https://en.wikipedia.org/wiki/HD_70642
+        * HD 70642 is a star with an exoplanetary companion in the southern constellation of Puppis. 
+        */
+        QProcess mailProcess;
+        mailProcess.start(SenderdPath.toUtf8() + " " + metaUrl.toUtf8() + " " + "HD70642");
+        mailProcess.waitForStarted();
+        mailProcess.waitForFinished(3);
+        mailProcess.deleteLater();
+
+
+        emit downloadFinished(); });
+}
+
+/**
+ * @brief 停止下载
+ */
+void DownloadController::stopDownload()
+{
+    // 实现下载进程退出
+    QString killCmd = QString("kill -9 %1").arg(pidNumber);
+    system(killCmd.toUtf8());
+    qDebug() << "kill aria2!";
+}
+
+qint64 DownloadController::getFileSize(const QString &url)
+{
+    // 已经无需使用 qtnetwork 再获取 filesize,完全交给 aria2 来计算进度。 为保证兼容性,故保留此函数。
+    qint64 fileSize = 10000;
+    return fileSize;
+}
+
+QString DownloadController::replaceDomain(const QString &url, const QString domain)
+{
+    QRegularExpression regex(R"((?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9])");
+    if (regex.match(url).hasMatch())
+    {
+        return QString(url).replace(regex.match(url).captured(), domain);
+    }
+    return url;
+}
diff --git a/src/downloadworker.h b/src/backend/downloadworker.h
similarity index 95%
rename from src/downloadworker.h
rename to src/backend/downloadworker.h
index bc01f95..d04290b 100644
--- a/src/downloadworker.h
+++ b/src/backend/downloadworker.h
@@ -1,41 +1,41 @@
-#ifndef DOWNLOADWORKER_H
-#define DOWNLOADWORKER_H
-
-#include <QObject>
-#include <QList>
-#include <QFile>
-#include <QNetworkReply>
-
-class DownloadController : public QObject
-{
-    Q_OBJECT
-
-public:
-    explicit DownloadController(QObject *parent = nullptr);
-
-    void setFilename(QString filename);
-    void startDownload(const QString &url);
-    void stopDownload();
-    qint64 getFileSize(const QString& url);
-    QString replaceDomain(const QString& url, const QString domain);
-
-private:
-    int threadNum;
-    int pidNumber;
-    QString filename;
-    qint64 fileSize;
-    QVector<QPair<qint64, qint64>> ranges;
-    QFile *file;
-    bool finished = false;
-    QVector<QString> domains;
-
-
-
-signals:
-    void errorOccur(const QString& msg);
-    void downloadProcess(QString, qint64, qint64);
-    void downloadFinished();
-
-};
-
-#endif // FILEDOWNLOADWORKER_H
+#ifndef DOWNLOADWORKER_H
+#define DOWNLOADWORKER_H
+
+#include <QObject>
+#include <QList>
+#include <QFile>
+#include <QNetworkReply>
+
+class DownloadController : public QObject
+{
+    Q_OBJECT
+
+public:
+    explicit DownloadController(QObject *parent = nullptr);
+
+    void setFilename(QString filename);
+    void startDownload(const QString &url);
+    void stopDownload();
+    qint64 getFileSize(const QString& url);
+    QString replaceDomain(const QString& url, const QString domain);
+
+private:
+    int threadNum;
+    int pidNumber;
+    QString filename;
+    qint64 fileSize;
+    QVector<QPair<qint64, qint64>> ranges;
+    QFile *file;
+    bool finished = false;
+    QVector<QString> domains;
+
+
+
+signals:
+    void errorOccur(const QString& msg);
+    void downloadProcess(QString, qint64, qint64);
+    void downloadFinished();
+
+};
+
+#endif // FILEDOWNLOADWORKER_H
diff --git a/src/image_show.cpp b/src/backend/image_show.cpp
similarity index 92%
rename from src/image_show.cpp
rename to src/backend/image_show.cpp
index 54ebf70..f67b340 100644
--- a/src/image_show.cpp
+++ b/src/backend/image_show.cpp
@@ -13,6 +13,7 @@ image_show::image_show(QWidget *parent) :
     layout->addWidget(m_label);
     setLayout(layout);
     m_label->setText("layout");
+    m_label->setScaledContents(true);
 }
 
 void image_show::setImage(QPixmap image)
@@ -49,3 +50,8 @@ void image_show::mousePressEvent(QMouseEvent *)
 
     m_dialog->move(0,0);
 }
+image_show::~image_show()
+{
+    delete m_dialog;
+    delete m_label;
+}
diff --git a/src/image_show.h b/src/backend/image_show.h
similarity index 90%
rename from src/image_show.h
rename to src/backend/image_show.h
index a851dd7..0812e77 100644
--- a/src/image_show.h
+++ b/src/backend/image_show.h
@@ -4,7 +4,7 @@
 #include <QWidget>
 #include <QMouseEvent>
 
-#include "big_image.h"
+#include "widgets/big_image.h"
 
 class image_show : public QWidget
 {
@@ -17,6 +17,7 @@ public:
     int desktop_h;
 
     void setImage(QPixmap);
+    ~image_show();
 
 protected:
     void mousePressEvent(QMouseEvent *event) override;
@@ -26,7 +27,6 @@ private:
     QLabel *m_label;
     QLabel image;
     QPixmap m_image;
-
 };
 
 #endif // IMAGE_SHOW_H
diff --git a/src/backend/sparkapi.cpp b/src/backend/sparkapi.cpp
new file mode 100644
index 0000000..93daf03
--- /dev/null
+++ b/src/backend/sparkapi.cpp
@@ -0,0 +1,49 @@
+#include "sparkapi.h"
+
+#include <QDebug>
+SparkAPI::SparkAPI(QObject *parent) : QObject(parent)
+{
+
+}
+void SparkAPI::get(QUrl url)
+{
+    QNetworkRequest request;
+    HttpRequest *httprequest=new HttpRequest;
+    request.setUrl(url);
+    connect(httprequest,&HttpRequest::finished,[=](QString data){
+        QByteArray arr = data.toUtf8();
+            //解析Json
+            QJsonParseError error;
+            if(QJsonDocument::fromJson(arr,&error).isArray())
+            {
+                auto doc = QJsonDocument::fromJson(arr,&error).array();
+                emit finished(doc);
+            }else {
+                auto doc = QJsonDocument::fromJson(arr,&error).object();
+                emit finishedObject(doc);
+            }
+
+            httprequest->deleteLater();
+    });
+    httprequest->getRequest(request);
+}
+void SparkAPI::getAppList(QString type)
+{
+    get(QUrl(getServerUrl()+"store/"+type+"/applist.json"));
+}
+void SparkAPI::getSearchList(QString keyword)
+{
+    get(QUrl("https://search.deepinos.org.cn/appinfo/search?keyword="+keyword));
+}
+void SparkAPI::getAppInfo(QUrl spk)
+{
+    get(QUrl(getServerUrl()+"store"+spk.path() + "/app.json"));
+}
+QString SparkAPI::getServerUrl()
+{
+    return "https://cdn.d.store.deepinos.org.cn/";
+}
+QString SparkAPI::getImgServerUrl()
+{
+    return "https://cdn.d.store.deepinos.org.cn/";
+}
diff --git a/src/backend/sparkapi.h b/src/backend/sparkapi.h
new file mode 100644
index 0000000..4db40f8
--- /dev/null
+++ b/src/backend/sparkapi.h
@@ -0,0 +1,27 @@
+#ifndef SPARKAPI_H
+#define SPARKAPI_H
+#include <QObject>
+#include <QJsonObject>
+#include <QJsonArray>
+#include <QJsonParseError>
+#include "utils/httprequest.h"
+
+class SparkAPI : public QObject
+{
+    Q_OBJECT
+public:
+    static QString getServerUrl();
+    static QString getImgServerUrl();
+    void getSearchList(QString keyword);
+    void get(QUrl url);
+    void getAppList(QString type);
+    void getAppInfo(QUrl spk);
+    explicit SparkAPI(QObject *parent = nullptr);
+signals:
+    void finished(QJsonArray);
+    void finishedObject(QJsonObject);
+
+public slots:
+};
+
+#endif // SPARKAPI_H
diff --git a/src/dbus/dbussparkstore.cpp b/src/dbus/dbussparkstore.cpp
deleted file mode 100644
index 09b584f..0000000
--- a/src/dbus/dbussparkstore.cpp
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "dbussparkstore.h"
-#include <QDebug>
-DBusSparkStoreService::DBusSparkStoreService(QObject *parent)
-    : QDBusAbstractAdaptor(parent)
-{
-
-}
-
-void DBusSparkStoreService::activeWindow(const QString & arg)
-{
-    emit sigOpenUrl(arg);
-}
diff --git a/src/dbus/dbussparkstore.h b/src/dbus/dbussparkstore.h
deleted file mode 100644
index a2c447d..0000000
--- a/src/dbus/dbussparkstore.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef DBUSSPARKSTORE_H
-#define DBUSSPARKSTORE_H
-
-#include <QObject>
-#include <QUrl>
-#include <QtDBus/QtDBus>
-
-class Wallpaper;
-class DBusSparkStoreService : public QDBusAbstractAdaptor
-{
-    Q_OBJECT
-    Q_CLASSINFO("D-Bus Interface", "com.gitee.spark.store")
-public:
-    explicit DBusSparkStoreService(QObject *parent);
-
-signals :
-    void sigOpenUrl(const QString &url);
-public Q_SLOTS:
-
-    void activeWindow(const QString &arg);
-
-};
-
-#endif // DBUSSPARKSTORE_H
diff --git a/src/flowlayout.cpp b/src/flowlayout.cpp
deleted file mode 100644
index b60335c..0000000
--- a/src/flowlayout.cpp
+++ /dev/null
@@ -1,223 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-**   * Redistributions of source code must retain the above copyright
-**     notice, this list of conditions and the following disclaimer.
-**   * Redistributions in binary form must reproduce the above copyright
-**     notice, this list of conditions and the following disclaimer in
-**     the documentation and/or other materials provided with the
-**     distribution.
-**   * Neither the name of The Qt Company Ltd nor the names of its
-**     contributors may be used to endorse or promote products derived
-**     from this software without specific prior written permission.
-**
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtWidgets>
-
-#include "flowlayout.h"
-//! [1]
-FlowLayout::FlowLayout(QWidget *parent, int margin, int hSpacing, int vSpacing)
-    : QLayout(parent), m_hSpace(hSpacing), m_vSpace(vSpacing)
-{
-    setContentsMargins(margin, margin, margin, margin);
-}
-
-FlowLayout::FlowLayout(int margin, int hSpacing, int vSpacing)
-    : m_hSpace(hSpacing), m_vSpace(vSpacing)
-{
-    setContentsMargins(margin, margin, margin, margin);
-}
-//! [1]
-
-//! [2]
-FlowLayout::~FlowLayout()
-{
-    QLayoutItem *item;
-    while ((item = takeAt(0)))
-        delete item;
-}
-//! [2]
-
-//! [3]
-void FlowLayout::addItem(QLayoutItem *item)
-{
-    itemList.append(item);
-}
-//! [3]
-
-//! [4]
-int FlowLayout::horizontalSpacing() const
-{
-    if (m_hSpace >= 0) {
-        return m_hSpace;
-    } else {
-        return smartSpacing(QStyle::PM_LayoutHorizontalSpacing);
-    }
-}
-
-int FlowLayout::verticalSpacing() const
-{
-    if (m_vSpace >= 0) {
-        return m_vSpace;
-    } else {
-        return smartSpacing(QStyle::PM_LayoutVerticalSpacing);
-    }
-}
-//! [4]
-
-//! [5]
-int FlowLayout::count() const
-{
-    return itemList.size();
-}
-
-QLayoutItem *FlowLayout::itemAt(int index) const
-{
-    return itemList.value(index);
-}
-
-QLayoutItem *FlowLayout::takeAt(int index)
-{
-    if (index >= 0 && index < itemList.size())
-        return itemList.takeAt(index);
-    else
-        return nullptr;
-}
-//! [5]
-
-//! [6]
-Qt::Orientations FlowLayout::expandingDirections() const
-{
-    return nullptr;
-}
-//! [6]
-
-//! [7]
-bool FlowLayout::hasHeightForWidth() const
-{
-    return true;
-}
-
-int FlowLayout::heightForWidth(int width) const
-{
-    int height = doLayout(QRect(0, 0, width, 0), true);
-    return height;
-}
-//! [7]
-
-//! [8]
-void FlowLayout::setGeometry(const QRect &rect)
-{
-    QLayout::setGeometry(rect);
-    doLayout(rect, false);
-}
-
-QSize FlowLayout::sizeHint() const
-{
-    return minimumSize();
-}
-
-QSize FlowLayout::minimumSize() const
-{
-    QSize size;
-    QLayoutItem *item;
-    foreach (item, itemList)
-        size = size.expandedTo(item->minimumSize());
-
-    size += QSize(2*margin(), 2*margin());
-    return size;
-}
-//! [8]
-
-//! [9]
-int FlowLayout::doLayout(const QRect &rect, bool testOnly) const
-{
-    int left, top, right, bottom;
-    getContentsMargins(&left, &top, &right, &bottom);
-    QRect effectiveRect = rect.adjusted(+left, +top, -right, -bottom);
-    int x = effectiveRect.x();
-    int y = effectiveRect.y();
-    int lineHeight = 0;
-//! [9]
-
-//! [10]
-    QLayoutItem *item;
-    foreach (item, itemList) {
-        QWidget *wid = item->widget();
-        int spaceX = horizontalSpacing();
-        if (spaceX == -1)
-            spaceX = wid->style()->layoutSpacing(
-                QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Horizontal);
-        int spaceY = verticalSpacing();
-        if (spaceY == -1)
-            spaceY = wid->style()->layoutSpacing(
-                QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Vertical);
-//! [10]
-//! [11]
-        int nextX = x + item->sizeHint().width() + spaceX;
-        if (nextX - spaceX > effectiveRect.right() && lineHeight > 0) {
-            x = effectiveRect.x();
-            y = y + lineHeight + spaceY;
-            nextX = x + item->sizeHint().width() + spaceX;
-            lineHeight = 0;
-        }
-
-        if (!testOnly)
-            item->setGeometry(QRect(QPoint(x, y), item->sizeHint()));
-
-        x = nextX;
-        lineHeight = qMax(lineHeight, item->sizeHint().height());
-    }
-    return y + lineHeight - rect.y() + bottom;
-}
-//! [11]
-//! [12]
-int FlowLayout::smartSpacing(QStyle::PixelMetric pm) const
-{
-    QObject *parent = this->parent();
-    if (!parent) {
-        return -1;
-    } else if (parent->isWidgetType()) {
-        QWidget *pw = static_cast<QWidget *>(parent);
-        return pw->style()->pixelMetric(pm, nullptr, pw);
-    } else {
-        return static_cast<QLayout *>(parent)->spacing();
-    }
-}
-//! [12]
diff --git a/src/flowlayout.h b/src/flowlayout.h
deleted file mode 100644
index 8aa4603..0000000
--- a/src/flowlayout.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-**   * Redistributions of source code must retain the above copyright
-**     notice, this list of conditions and the following disclaimer.
-**   * Redistributions in binary form must reproduce the above copyright
-**     notice, this list of conditions and the following disclaimer in
-**     the documentation and/or other materials provided with the
-**     distribution.
-**   * Neither the name of The Qt Company Ltd nor the names of its
-**     contributors may be used to endorse or promote products derived
-**     from this software without specific prior written permission.
-**
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef FLOWLAYOUT_H
-#define FLOWLAYOUT_H
-
-#include <QLayout>
-#include <QRect>
-#include <QStyle>
-//! [0]
-class FlowLayout : public QLayout
-{
-public:
-    explicit FlowLayout(QWidget *parent, int margin = -1, int hSpacing = -1, int vSpacing = -1);
-    explicit FlowLayout(int margin = -1, int hSpacing = -1, int vSpacing = -1);
-    ~FlowLayout() override;
-
-    void addItem(QLayoutItem *item) override;
-    int horizontalSpacing() const;
-    int verticalSpacing() const;
-    Qt::Orientations expandingDirections() const override;
-    bool hasHeightForWidth() const override;
-    int heightForWidth(int) const override;
-    int count() const override;
-    QLayoutItem *itemAt(int index) const override;
-    QSize minimumSize() const override;
-    void setGeometry(const QRect &rect) override;
-    QSize sizeHint() const override;
-    QLayoutItem *takeAt(int index) override;
-
-private:
-    int doLayout(const QRect &rect, bool testOnly) const;
-    int smartSpacing(QStyle::PixelMetric pm) const;
-
-    QList<QLayoutItem *> itemList;
-    int m_hSpace;
-    int m_vSpace;
-};
-//! [0]
-
-#endif // FLOWLAYOUT_H
diff --git a/src/main.cpp b/src/main.cpp
index 972aee9..e9f4aa0 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,156 +1,59 @@
-#include <DApplication>
-#include <DApplicationSettings>
-#include <DWidgetUtil>      // Dtk::Widget::moveToCenter(&w); 要调用它,就得引用 DWidgetUtil
-#include <DAboutDialog>
-#include <QVector>
-#include <QScreen>
-#include <QDir>
-#include <QSettings>
-//新增dbus
-#include <QDBusInterface>
-#include <QDBusPendingCall>
-
-// build time
-#include <QDate>
-#include <QTime>
-
-#include "widget.h"
-
-DWIDGET_USE_NAMESPACE
-int main(int argc, char *argv[])
-{
-    // Get build time
-    static const QString version = "Version 3.4~test1";
-    static const QDate buildDate = QLocale( QLocale::English ).toDate( QString(__DATE__).replace("  ", " 0"), "MMM dd yyyy");
-    static const QTime buildTime = QTime::fromString(__TIME__, "hh:mm:ss");
-
-
-    DApplication::loadDXcbPlugin();  // 已废弃,但是对于非deepin桌面可以正常使用标题栏
-    DApplication::setAttribute(Qt::AA_EnableHighDpiScaling);    // 开启 Hidpi 支持
-    // 程序内强制添加"-platformtheme deepin"参数喂给Qt让Qt正确使用Deepin主题修复各种奇怪样式问题
-
-    // 浏览器开启 GPU 支持
-    qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--ignore-gpu-blocklist --enable-gpu-rasterization --enable-native-gpu-memory-buffers --enable-accelerated-video-decode");
-    
-    QVector<char*> fakeArgs(argc + 2);
-    fakeArgs[0] = argv[0];
-    fakeArgs[1] = "-platformtheme";
-    fakeArgs[2] = "deepin";
-    for(int i = 1; i < argc; i++) fakeArgs[i + 2] = argv[i];
-    int fakeArgc = argc + 2; // 为啥DApplication的argc要用引用啊?
-    DApplication a(fakeArgc, fakeArgs.data());
-
-
-    a.setAttribute(Qt::AA_UseHighDpiPixmaps);
-    a.loadTranslator();     // 载入翻译
-
-    QSettings readConfig(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat);
-
-    if (readConfig.value("build/version").toString() != version){
-        qDebug() << "Spark Store has been updated!";
-        QSettings *setConfig = new QSettings(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat);
-        setConfig->setValue("build/version", version);
-        setConfig->setValue("build/time", buildDate.toString("yyyy.MM.dd")+"-"+buildTime.toString());
-        setConfig->deleteLater();
-    }
-
-
-
-
-    //Customized DAboutDialog 
-     
-     DAboutDialog dialog;
-      a.setAboutDialog(&dialog);
-      dialog.setLicense(QObject::tr("We publish this program under GPL V3"));
-      dialog.setVersion(DApplication::buildVersion(readConfig.value("build/version").toString()+"-"+readConfig.value("build/time").toString()));
-      dialog.setProductIcon(QIcon::fromTheme("spark-store"));  // 设置Logo
-      dialog.setProductName(QLabel::tr("Spark Store"));
-      dialog.setDescription(
-                  QObject::tr(
-                      "<span style=' font-size:10pt;font-weight:60;'>An appstore powered by  community</span><br/>"
-                      "<a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/>"
-                      "<span style=' font-size:12pt;'>Spark developers</span>"
-                      )
-                  );
-      dialog.setProductName(QLabel::tr("Spark Store"));
-      dialog.setCompanyLogo(QPixmap(":/spark-store.png"));
-      dialog.setWebsiteName(QObject::tr("The Spark Project"));
-      dialog.setWebsiteLink("https://gitee.com/deepin-community-store");
-     
-
-    a.setProductName(QLabel::tr("Spark Store"));
-    a.setProductIcon(QIcon::fromTheme("spark-store"));  //设置Logo
-    a.setOrganizationName("spark-union");
-    a.setOrganizationDomain("https://www.deepinos.org/");
-    a.setApplicationName("Spark Store");    //不需要翻译,否则 ~/.local/share/ 下文件夹名称也被翻译为中文
-    a.setApplicationVersion(DApplication::buildVersion(readConfig.value("build/version").toString()));
-    a.setApplicationAcknowledgementPage("https://gitee.com/deepin-community-store/spark-store");
-    a.setApplicationDescription(
-                QObject::tr(
-                    "<span style='font-size:10pt;font-weight:60;'>An appstore powered by deepin community</span><br/>"
-                    "<a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/>"
-                    "<span style='font-size:12pt;'>Spark developers</span><br/><br/>"
-                    "Published under GPL V3"
-                    )
-                );
-
-    // 限制单实例运行
-    if(!a.setSingleInstance("spark-store"))
-    {
-        qDebug() << "The application is already running!";
-        QDBusInterface iface("com.gitee.spark.store",
-                             "/com/gitee/spark/store",
-                             "com.gitee.spark.store",
-                             QDBusConnection::sessionBus());
-
-        QString arg1 = argv[1];
-
-        iface.asyncCall("activeWindow",arg1);
-
-
-        return -1;
-    }
-
-    // 保存窗口主题设置
-    DApplicationSettings settings;
-
-    Widget w;
-    QScreen *s = DApplication::primaryScreen();
-    int d_w = s->geometry().width();
-    int d_h = s->geometry().height();
-
-    if(d_w <= 1366)
-    {
-        w.setMinimumWidth(925);
-        w.resize(925,650);
-    }
-    else
-    {
-        w.setMinimumWidth(1180);
-        w.resize(1180,760);
-    }
-
-    if(d_h <= 768)
-    {
-        w.setMinimumHeight(650);
-        w.resize(925,650);
-    }
-    else
-    {
-        w.setMinimumHeight(760);
-        w.resize(1180,760);
-    }
-
-    QString arg1 = argv[1];
-    if(arg1.left(6)=="spk://")
-    {
-        w.openUrl(QUrl(argv[1]));
-    }
-
-    // 让打开时界面显示在正中
-    Dtk::Widget::moveToCenter(&w);
-
-    w.show();
-
-    return a.exec();
-}
+#include "mainwindow-dtk.h"
+
+#include <DApplication>
+#include <DLog>
+#include <DPlatformWindowHandle>
+#include <DApplicationSettings>
+
+DCORE_USE_NAMESPACE
+DWIDGET_USE_NAMESPACE
+
+int main(int argc, char *argv[])
+{
+    //设置桌面环境环境变量
+    if (!QString(qgetenv("XDG_CURRENT_DESKTOP")).toLower().startsWith("deepin")) {
+        setenv("XDG_CURRENT_DESKTOP", "Deepin", 1);
+    }
+    DApplication::setAttribute(Qt::AA_EnableHighDpiScaling); // 开启 Hidpi 支持
+#ifndef DSTORE_NO_DXCBs
+    DApplication::loadDXcbPlugin(); // 加载 DXCB 插件
+#endif
+
+    //初始化日志模块 (默认日志位置 ~/.cache/deepin/spark-store)
+    DLogManager::registerConsoleAppender();
+    DLogManager::registerFileAppender();
+
+    DApplication a(argc, argv);
+
+    //Wayland 环境下使用,防止子控件 Native 化
+    if (!DPlatformWindowHandle::pluginVersion().isEmpty()) {
+        a.setAttribute(Qt::AA_DontCreateNativeWidgetSiblings, true);
+    }
+    a.setAttribute(Qt::AA_UseHighDpiPixmaps);
+    a.loadDXcbPlugin();
+
+    a.loadTranslator(); // 载入翻译
+
+    a.setOrganizationName("spark-union");
+    a.setProductName(QObject::tr("Spark Store"));
+    a.setApplicationName("Spark Store"); // 不用翻译,影响 ~/.local/share/spark-union 下文件夹名称
+    a.setApplicationDisplayName(QObject::tr("Spark Store")); // 设置窗口显示标题 (Wayland 下会显示 Qt 原生标题栏)
+    a.setWindowIcon(QIcon::fromTheme("spark-store"));
+
+    // 限制单实例运行
+    if (!a.setSingleInstance("spark-store")) {
+        return -1;
+    }
+
+    DGuiApplicationHelper::instance()->setPaletteType(DGuiApplicationHelper::LightType); //固定主题为浅色主题
+    DApplicationSettings settings; // 定义 DApplicationSettings,自动保存主题设置
+
+    MainWindow w;
+    QString arg1 = argv[1];
+    if (arg1.startsWith("spk://")) {
+        w.openUrl(QUrl(argv[1]));
+    }
+    w.show();
+
+    return a.exec();
+}
diff --git a/src/mainwindow-dtk.cpp b/src/mainwindow-dtk.cpp
new file mode 100644
index 0000000..dd8c32f
--- /dev/null
+++ b/src/mainwindow-dtk.cpp
@@ -0,0 +1,195 @@
+#include "mainwindow-dtk.h"
+#include "ui_mainwindow-dtk.h"
+
+#include <DWidgetUtil>
+#include <DGuiApplicationHelper>
+#include <QSizePolicy>
+
+MainWindow::MainWindow(QWidget *parent)
+    : DBlurEffectWidget(parent)
+    , ui(new Ui::MainWindow)
+{
+    ui->setupUi(this);
+
+    moveToCenter(this); //让窗口居中显示
+
+    downloadlistwidget = new DownloadListWidget;
+    downloadButton = new QPushButton(ui->titlebar);
+    backButtom = new QPushButton(ui->titlebar);
+    ui->appintopage->setDownloadWidget(downloadlistwidget);
+    ui->stackedWidget->setCurrentIndex(0);
+    ui->titlebar->setBackgroundTransparent(true);
+    //ui->titlebar->setSwitchThemeMenuVisible(false); // 去除 dtk 标题栏主题切换菜单
+    setMaskAlpha(240);
+    setMaskColor(QColor("#f3f7f8"));
+
+    initConfig();
+    updateUi(0);
+
+    //主题切换
+    connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, [=](DGuiApplicationHelper::ColorType themeType) {
+        if (themeType == DGuiApplicationHelper::DarkType) {
+            //深色模式
+
+        } else {
+            //亮色模式
+            this->setStyleSheet("#mainpage{background-color: transparent;border-radius:14px;}\
+                                QLabel#cardtitle,QLabel#title,QLabel#title_1,QLabel#title_2,QLabel#title_3 {color:#000000}\
+                                ");
+            backButtom->setIcon(QIcon(":/icon/light/back.svg"));
+            downloadButton->setIcon(QIcon(":/icon/light/download.svg"));
+            int i = 0;
+            while (i < ui->buttonGroup->buttons().size()) {
+                ui->buttonGroup->buttons()[i]->setIcon(QIcon(":/icon/light/leftbutton_" + QString::number(i) + ".svg"));
+                if (QLocale::system().name() == "zh_CN") {
+                    ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{background-color:transparent;}\
+                                                                  QPushButton:hover{background-color:#eAeAeA;border:0px;border-radius:8px;}\
+                                                                  QPushButton:checked{background-color:#dddddd;border:0px;border-radius:8px;}");
+                } else {
+                    ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{background-color:transparent;text-align: left; padding-left: 15px;}\
+                                                                  QPushButton:hover{background-color:#eAeAeA;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}\
+                                                                  QPushButton:checked{background-color:#dddddd;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}");
+                }
+                i++;
+            }
+        }
+        ui->applistpage->setTheme(themeType == DGuiApplicationHelper::DarkType);
+        ui->applistpage_1->setTheme(themeType == DGuiApplicationHelper::DarkType);
+        ui->appintopage->setTheme(themeType == DGuiApplicationHelper::DarkType);
+    });
+
+    //初始化标题栏控件
+    connect(downloadButton, &QPushButton::clicked, [=]() {
+        QPoint pos;
+        pos.setX(downloadButton->mapToGlobal(QPoint(0, 0)).x() + downloadButton->width() / 2 - downloadlistwidget->width() / 2);
+        pos.setY(downloadButton->mapToGlobal(QPoint(0, 0)).y() + downloadButton->height() + 5);
+        downloadlistwidget->m_move(pos.x(), pos.y());
+        downloadlistwidget->show();
+    });
+
+    connect(backButtom, &QPushButton::clicked, [=]() {
+        ui->stackedWidget->setCurrentIndex(pageHistory.at(pageHistory.count() - 2));
+        if (pageHistory.at(pageHistory.count() - 1) == 3) {
+            ui->appintopage->clear();
+        }
+
+        pageHistory.removeLast();
+        if (pageHistory.count() > 1) {
+            backButtom->show();
+        } else {
+            backButtom->hide();
+        }
+    });
+    downloadlistwidget->hide();
+    backButtom->hide();
+    ui->titlebar->setIcon(QIcon::fromTheme(":/icon/logo.svg"));
+    QWidget *w_titlebar = new QWidget(ui->titlebar);
+    QHBoxLayout *ly_titlebar = new QHBoxLayout(w_titlebar);
+    QLabel *title = new QLabel(this);
+    title->setText(tr("Spark Store"));
+    searchEdit->setPlaceholderText(tr("Search or enter spk://"));
+    ly_titlebar->addWidget(title);
+    ly_titlebar->addWidget(backButtom);
+    ly_titlebar->addStretch(2.5);
+    ly_titlebar->addWidget(searchEdit);
+    ly_titlebar->addWidget(downloadButton);
+    ly_titlebar->addStretch(1);
+    ui->titlebar->setCustomWidget(w_titlebar);
+    //侧边栏按钮
+    int i = 0;
+    while (i < ui->buttonGroup->buttons().size()) {
+        ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{qproperty-icon: url(data/images/userMangaer/teacher.png);}");
+        connect(ui->buttonGroup->buttons()[i], &QPushButton::toggled, [=](bool checked) {
+            if (checked == true) {
+                ui->appintopage->clear();
+                updateUi(i);
+            }
+        });
+        i++;
+    }
+
+    // 搜索事件
+    connect(searchEdit, &DSearchEdit::returnPressed, this, [=]() {
+        QString searchtext = searchEdit->text();
+        if (!searchtext.isEmpty()) {
+            if (searchtext.startsWith("spk://")) {
+                openUrl(QUrl(searchtext));
+                searchEdit->clearEdit();
+            } else {
+                ui->applistpage_1->getSearchList(searchtext);
+                switchPage(2);
+                searchEdit->clearEdit();
+            }
+        }
+        this->setFocus();
+    });
+
+    // 列表点击事件
+    connect(ui->applistpage, &AppListPage::clicked, this, [=](QUrl spk) {
+        openUrl(spk);
+    });
+    connect(ui->applistpage_1, &AppListPage::clicked, this, [=](QUrl spk) {
+        openUrl(spk);
+    });
+
+    emit DGuiApplicationHelper::instance()->themeTypeChanged(DGuiApplicationHelper::instance()->themeType());
+}
+
+MainWindow::~MainWindow()
+{
+    delete searchEdit;
+    delete downloadlistwidget;
+    delete ui;
+}
+
+void MainWindow::openUrl(QUrl url)
+{
+    if (url.toString().startsWith("spk://")) {
+        ui->appintopage->openUrl(url);
+        switchPage(3);
+    } else {
+        QDesktopServices::openUrl(url);
+    }
+}
+
+void MainWindow::initConfig()
+{
+    // 新建临时文件夹
+    QDir dir;
+    dir.mkpath("/tmp/spark-store");
+}
+
+void MainWindow::switchPage(int now) //临时方案,回家后修改
+{
+    qDebug() << pageHistory.count();
+    if (pageHistory.count() >= 1) {
+        backButtom->show();
+    } else {
+        backButtom->hide();
+    }
+    ui->stackedWidget->setCurrentIndex(now);
+    pageHistory << now;
+}
+
+//刷新界面
+void MainWindow::updateUi(int now)
+{
+    pageHistory.clear();
+        QStringList itemlist;
+        itemlist << ""
+                 << "network"
+                 << "relations"
+                 << "musicandsound"
+                 << "videos"
+                 << "photos"
+                 << "games"
+                 << "office"
+                 << "reading"
+                 << "programming"
+                 << "tools"
+                 << "themes"
+                 << "others";
+        ui->applistpage->getAppList(itemlist[now]);
+        qDebug() << itemlist[now];
+        switchPage(1);
+}
diff --git a/src/mainwindow-dtk.h b/src/mainwindow-dtk.h
new file mode 100644
index 0000000..98141a2
--- /dev/null
+++ b/src/mainwindow-dtk.h
@@ -0,0 +1,48 @@
+#ifndef MAINWINDOWDTK_H
+#define MAINWINDOWDTK_H
+
+#include <DMainWindow>
+#include <DBlurEffectWidget>
+#include <DTitlebar>
+#include <DSearchEdit>
+#include <QGraphicsDropShadowEffect>
+#include <DGuiApplicationHelper>
+
+#include <QPushButton>
+#include <QDir>
+#include <QDesktopServices>
+
+#include "widgets/downloadlistwidget.h"
+
+DWIDGET_USE_NAMESPACE
+
+namespace Ui {
+class MainWindow;
+}
+
+class MainWindow : public DBlurEffectWidget
+{
+    Q_OBJECT
+
+public:
+    explicit MainWindow(QWidget *parent = nullptr);
+    ~MainWindow();
+
+    void openUrl(QUrl);
+
+private:
+    void initConfig();
+    void switchPage(int now);
+    void updateUi(int now);
+
+private:
+    QList<int> pageHistory;
+
+    DownloadListWidget *downloadlistwidget;
+    QPushButton *downloadButton;
+    QPushButton *backButtom;
+    DSearchEdit *searchEdit = new DSearchEdit;
+    Ui::MainWindow *ui;
+};
+
+#endif // MAINWINDOWDTK_H
diff --git a/src/mainwindow-dtk.ui b/src/mainwindow-dtk.ui
new file mode 100644
index 0000000..3e0b6cb
--- /dev/null
+++ b/src/mainwindow-dtk.ui
@@ -0,0 +1,595 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QWidget" name="MainWindow">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>1190</width>
+    <height>651</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>MainWindow</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
+    <number>0</number>
+   </property>
+   <property name="spacing">
+    <number>0</number>
+   </property>
+   <item row="0" column="0" colspan="2">
+    <widget class="DTitlebar" name="titlebar" native="true">
+     <property name="minimumSize">
+      <size>
+       <width>0</width>
+       <height>50</height>
+      </size>
+     </property>
+     <property name="maximumSize">
+      <size>
+       <width>16777215</width>
+       <height>50</height>
+      </size>
+     </property>
+     <layout class="QHBoxLayout" name="horizontalLayout">
+      <property name="leftMargin">
+       <number>0</number>
+      </property>
+      <property name="topMargin">
+       <number>0</number>
+      </property>
+      <property name="rightMargin">
+       <number>0</number>
+      </property>
+      <property name="bottomMargin">
+       <number>0</number>
+      </property>
+     </layout>
+    </widget>
+   </item>
+   <item row="1" column="0">
+    <widget class="QWidget" name="leftbar" native="true">
+     <property name="minimumSize">
+      <size>
+       <width>150</width>
+       <height>0</height>
+      </size>
+     </property>
+     <property name="maximumSize">
+      <size>
+       <width>150</width>
+       <height>16777215</height>
+      </size>
+     </property>
+     <layout class="QVBoxLayout" name="verticalLayout">
+      <item>
+       <widget class="QPushButton" name="pushButton">
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>36</height>
+         </size>
+        </property>
+        <property name="text">
+         <string>主页</string>
+        </property>
+        <property name="checkable">
+         <bool>true</bool>
+        </property>
+        <property name="checked">
+         <bool>true</bool>
+        </property>
+        <property name="autoRepeat">
+         <bool>true</bool>
+        </property>
+        <property name="autoExclusive">
+         <bool>true</bool>
+        </property>
+        <property name="autoDefault">
+         <bool>true</bool>
+        </property>
+        <property name="default">
+         <bool>true</bool>
+        </property>
+        <property name="flat">
+         <bool>true</bool>
+        </property>
+        <attribute name="buttonGroup">
+         <string notr="true">buttonGroup</string>
+        </attribute>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="pushButton_2">
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>36</height>
+         </size>
+        </property>
+        <property name="text">
+         <string>网络</string>
+        </property>
+        <property name="checkable">
+         <bool>true</bool>
+        </property>
+        <property name="autoRepeat">
+         <bool>true</bool>
+        </property>
+        <property name="autoExclusive">
+         <bool>true</bool>
+        </property>
+        <property name="flat">
+         <bool>true</bool>
+        </property>
+        <attribute name="buttonGroup">
+         <string notr="true">buttonGroup</string>
+        </attribute>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="pushButton_3">
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>36</height>
+         </size>
+        </property>
+        <property name="text">
+         <string>社交</string>
+        </property>
+        <property name="checkable">
+         <bool>true</bool>
+        </property>
+        <property name="autoRepeat">
+         <bool>true</bool>
+        </property>
+        <property name="autoExclusive">
+         <bool>true</bool>
+        </property>
+        <property name="flat">
+         <bool>true</bool>
+        </property>
+        <attribute name="buttonGroup">
+         <string notr="true">buttonGroup</string>
+        </attribute>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="pushButton_4">
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>36</height>
+         </size>
+        </property>
+        <property name="text">
+         <string>音乐</string>
+        </property>
+        <property name="checkable">
+         <bool>true</bool>
+        </property>
+        <property name="autoRepeat">
+         <bool>true</bool>
+        </property>
+        <property name="autoExclusive">
+         <bool>true</bool>
+        </property>
+        <property name="flat">
+         <bool>true</bool>
+        </property>
+        <attribute name="buttonGroup">
+         <string notr="true">buttonGroup</string>
+        </attribute>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="pushButton_5">
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>36</height>
+         </size>
+        </property>
+        <property name="text">
+         <string>视频</string>
+        </property>
+        <property name="checkable">
+         <bool>true</bool>
+        </property>
+        <property name="autoRepeat">
+         <bool>true</bool>
+        </property>
+        <property name="autoExclusive">
+         <bool>true</bool>
+        </property>
+        <property name="flat">
+         <bool>true</bool>
+        </property>
+        <attribute name="buttonGroup">
+         <string notr="true">buttonGroup</string>
+        </attribute>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="pushButton_6">
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>36</height>
+         </size>
+        </property>
+        <property name="text">
+         <string>图像</string>
+        </property>
+        <property name="checkable">
+         <bool>true</bool>
+        </property>
+        <property name="autoRepeat">
+         <bool>true</bool>
+        </property>
+        <property name="autoExclusive">
+         <bool>true</bool>
+        </property>
+        <property name="flat">
+         <bool>true</bool>
+        </property>
+        <attribute name="buttonGroup">
+         <string notr="true">buttonGroup</string>
+        </attribute>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="pushButton_7">
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>36</height>
+         </size>
+        </property>
+        <property name="text">
+         <string>游戏</string>
+        </property>
+        <property name="checkable">
+         <bool>true</bool>
+        </property>
+        <property name="autoRepeat">
+         <bool>true</bool>
+        </property>
+        <property name="autoExclusive">
+         <bool>true</bool>
+        </property>
+        <property name="flat">
+         <bool>true</bool>
+        </property>
+        <attribute name="buttonGroup">
+         <string notr="true">buttonGroup</string>
+        </attribute>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="pushButton_8">
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>36</height>
+         </size>
+        </property>
+        <property name="text">
+         <string>办公</string>
+        </property>
+        <property name="checkable">
+         <bool>true</bool>
+        </property>
+        <property name="autoRepeat">
+         <bool>true</bool>
+        </property>
+        <property name="autoExclusive">
+         <bool>true</bool>
+        </property>
+        <property name="flat">
+         <bool>true</bool>
+        </property>
+        <attribute name="buttonGroup">
+         <string notr="true">buttonGroup</string>
+        </attribute>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="pushButton_9">
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>36</height>
+         </size>
+        </property>
+        <property name="text">
+         <string>阅读</string>
+        </property>
+        <property name="checkable">
+         <bool>true</bool>
+        </property>
+        <property name="autoRepeat">
+         <bool>true</bool>
+        </property>
+        <property name="autoExclusive">
+         <bool>true</bool>
+        </property>
+        <property name="flat">
+         <bool>true</bool>
+        </property>
+        <attribute name="buttonGroup">
+         <string notr="true">buttonGroup</string>
+        </attribute>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="pushButton_10">
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>36</height>
+         </size>
+        </property>
+        <property name="text">
+         <string>开发</string>
+        </property>
+        <property name="checkable">
+         <bool>true</bool>
+        </property>
+        <property name="autoRepeat">
+         <bool>true</bool>
+        </property>
+        <property name="autoExclusive">
+         <bool>true</bool>
+        </property>
+        <property name="flat">
+         <bool>true</bool>
+        </property>
+        <attribute name="buttonGroup">
+         <string notr="true">buttonGroup</string>
+        </attribute>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="pushButton_11">
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>36</height>
+         </size>
+        </property>
+        <property name="text">
+         <string>工具</string>
+        </property>
+        <property name="checkable">
+         <bool>true</bool>
+        </property>
+        <property name="autoRepeat">
+         <bool>true</bool>
+        </property>
+        <property name="autoExclusive">
+         <bool>true</bool>
+        </property>
+        <property name="flat">
+         <bool>true</bool>
+        </property>
+        <attribute name="buttonGroup">
+         <string notr="true">buttonGroup</string>
+        </attribute>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="pushButton_12">
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>36</height>
+         </size>
+        </property>
+        <property name="text">
+         <string>主题</string>
+        </property>
+        <property name="checkable">
+         <bool>true</bool>
+        </property>
+        <property name="autoRepeat">
+         <bool>true</bool>
+        </property>
+        <property name="autoExclusive">
+         <bool>true</bool>
+        </property>
+        <property name="flat">
+         <bool>true</bool>
+        </property>
+        <attribute name="buttonGroup">
+         <string notr="true">buttonGroup</string>
+        </attribute>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="pushButton_13">
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>36</height>
+         </size>
+        </property>
+        <property name="text">
+         <string>其他</string>
+        </property>
+        <property name="checkable">
+         <bool>true</bool>
+        </property>
+        <property name="autoRepeat">
+         <bool>true</bool>
+        </property>
+        <property name="autoExclusive">
+         <bool>true</bool>
+        </property>
+        <property name="flat">
+         <bool>true</bool>
+        </property>
+        <attribute name="buttonGroup">
+         <string notr="true">buttonGroup</string>
+        </attribute>
+       </widget>
+      </item>
+      <item>
+       <spacer name="verticalSpacer">
+        <property name="orientation">
+         <enum>Qt::Vertical</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>20</width>
+          <height>40</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item row="1" column="1">
+    <widget class="QWidget" name="mainpage" native="true">
+     <property name="autoFillBackground">
+      <bool>true</bool>
+     </property>
+     <layout class="QGridLayout" name="gridLayout_2">
+      <property name="leftMargin">
+       <number>0</number>
+      </property>
+      <property name="topMargin">
+       <number>0</number>
+      </property>
+      <property name="rightMargin">
+       <number>0</number>
+      </property>
+      <property name="bottomMargin">
+       <number>0</number>
+      </property>
+      <item row="0" column="0">
+       <widget class="QStackedWidget" name="stackedWidget">
+        <property name="currentIndex">
+         <number>1</number>
+        </property>
+        <widget class="QWidget" name="page">
+         <layout class="QGridLayout" name="gridLayout_3">
+          <property name="leftMargin">
+           <number>0</number>
+          </property>
+          <property name="topMargin">
+           <number>0</number>
+          </property>
+          <property name="rightMargin">
+           <number>0</number>
+          </property>
+          <property name="bottomMargin">
+           <number>0</number>
+          </property>
+         </layout>
+        </widget>
+        <widget class="QWidget" name="page_1">
+         <layout class="QVBoxLayout" name="verticalLayout_2">
+          <property name="leftMargin">
+           <number>0</number>
+          </property>
+          <property name="topMargin">
+           <number>0</number>
+          </property>
+          <property name="rightMargin">
+           <number>0</number>
+          </property>
+          <property name="bottomMargin">
+           <number>0</number>
+          </property>
+          <item>
+           <widget class="AppListPage" name="applistpage" native="true"/>
+          </item>
+         </layout>
+        </widget>
+        <widget class="QWidget" name="page_3">
+         <layout class="QVBoxLayout" name="verticalLayout_3">
+          <property name="leftMargin">
+           <number>0</number>
+          </property>
+          <property name="topMargin">
+           <number>0</number>
+          </property>
+          <property name="rightMargin">
+           <number>0</number>
+          </property>
+          <property name="bottomMargin">
+           <number>0</number>
+          </property>
+          <item>
+           <widget class="AppListPage" name="applistpage_1" native="true"/>
+          </item>
+         </layout>
+        </widget>
+        <widget class="QWidget" name="page_2">
+         <layout class="QVBoxLayout" name="verticalLayout_4">
+          <property name="leftMargin">
+           <number>0</number>
+          </property>
+          <property name="topMargin">
+           <number>0</number>
+          </property>
+          <property name="rightMargin">
+           <number>0</number>
+          </property>
+          <property name="bottomMargin">
+           <number>0</number>
+          </property>
+          <item>
+           <widget class="AppIntoPage" name="appintopage" native="true"/>
+          </item>
+         </layout>
+        </widget>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <customwidgets>
+  <customwidget>
+   <class>DTitlebar</class>
+   <extends>QWidget</extends>
+   <header>DTitlebar</header>
+   <container>1</container>
+  </customwidget>
+  <customwidget>
+   <class>AppListPage</class>
+   <extends>QWidget</extends>
+   <header>pages/applistpage.h</header>
+   <container>1</container>
+  </customwidget>
+  <customwidget>
+   <class>AppIntoPage</class>
+   <extends>QWidget</extends>
+   <header>pages/appintopage.h</header>
+   <container>1</container>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+ <buttongroups>
+  <buttongroup name="buttonGroup"/>
+ </buttongroups>
+</ui>
diff --git a/src/pages/appintopage.cpp b/src/pages/appintopage.cpp
new file mode 100644
index 0000000..69846dd
--- /dev/null
+++ b/src/pages/appintopage.cpp
@@ -0,0 +1,295 @@
+#include "appintopage.h"
+#include "ui_appintopage.h"
+AppIntoPage::AppIntoPage(QWidget *parent) :
+    QWidget(parent),
+    ui(new Ui::AppIntoPage)
+{
+    ui->setupUi(this);
+    ui->listWidget->setViewMode(QListView::IconMode);
+    ui->listWidget->setMovement(QListView::Static);
+    ui->listWidget->setMaximumHeight(200);
+    ui->listWidget->setFlow(QListView::TopToBottom);
+    clear();
+}
+
+void AppIntoPage::clear()
+{
+    ui->tag_a2d->hide();
+    ui->tag_uos->hide();
+    ui->tag_dtk5->hide();
+    ui->tag_deepin->hide();
+    ui->tag_dwine2->hide();
+    ui->tag_dwine5->hide();
+    ui->tag_ubuntu->hide();
+    ui->tag_community->hide();
+    ui->icon->clear();
+    ui->title->clear();
+    ui->author->clear();
+    ui->label_2->clear();
+    ui->downloadButton->hide();
+    ui->pushButton_3->hide();
+    int n=ui->listWidget->count();
+    for(int i=0;i<n;i++)
+    {
+        QListWidgetItem *item = ui->listWidget->takeItem(0);
+        QWidget *card = ui->listWidget->itemWidget(item);
+        delete card;
+        card  = NULL;
+        delete item;
+        item  = NULL;
+    }
+    ui->listWidget->clear();
+}
+void AppIntoPage::setDownloadWidget(DownloadListWidget *w)
+{
+    dw=w;
+}
+void AppIntoPage::openUrl(QUrl url)
+{
+    spk=url;
+    SparkAPI *api=new SparkAPI(this);
+    connect(api,&SparkAPI::finishedObject,[=](QJsonObject appinfo){
+
+        info = appinfo;
+        qDebug()<<url;
+        //获取图标
+        QNetworkAccessManager *naManager;
+        QNetworkRequest request;
+        naManager=new QNetworkAccessManager(this);
+        request.setUrl(QUrl(api->getImgServerUrl()+"store"+url.path() + "/icon.png"));
+        request.setRawHeader("User-Agent", "Mozilla/5.0");
+        request.setRawHeader("Content-Type", "charset='utf-8'");
+        naManager->get(request);
+        QObject::connect(naManager,&QNetworkAccessManager::finished,[=](QNetworkReply *reply){
+                QByteArray jpegData = reply->readAll();
+                iconpixmap.loadFromData(jpegData);
+                iconpixmap.scaled(210, 200, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
+                ui->icon->setPixmap(iconpixmap);
+                ui->icon->setScaledContents(true);
+            });
+        ui->title->setText(info["Name"].toString());
+        ui->author->setText(info["Author"].toString());
+        ui->d_author->setText(info["Author"].toString());
+        ui->d_size->setText(info["Size"].toString());
+        ui->d_update->setText(info["Update"].toString());
+        ui->d_pkgname->setText(info["Pkgname"].toString());
+        ui->d_website->setText("<a href=\""+info["Website"].toString()+"\">"+tr("Click Open"));
+        ui->d_contributor->setText(info["Contributor"].toString());
+        ui->label_2->setText(info["More"].toString());
+
+        QProcess isInstall;
+        bool isInstalled;
+        bool isUpdated;
+        QString packagename = info["Pkgname"].toString();
+        isInstall.start("dpkg -s " + info["Pkgname"].toString());
+        isInstall.waitForFinished();
+        int error = QString::fromStdString(isInstall.readAllStandardError().toStdString()).length();
+        if(error == 0)
+        {
+            isInstalled = true;
+
+            QProcess isUpdate;
+            isUpdate.start("dpkg-query --showformat='${Version}' --show " + info["Pkgname"].toString());
+            isUpdate.waitForFinished();
+            QString localVersion = isUpdate.readAllStandardOutput();
+            localVersion.replace("'", "");
+
+            isUpdate.start("dpkg --compare-versions " + localVersion + " ge " + info["Version"].toString());
+            isUpdate.waitForFinished();
+            if(!isUpdate.exitCode())
+            {
+                isUpdated = true;
+            }
+            else
+            {
+                isUpdated = false;
+            }
+        }
+        else
+        {
+            isInstalled = false;
+            isUpdated = false;
+        }
+
+        if(isInstalled)
+        {
+            if(isUpdated)
+            {
+                ui->downloadButton->setText(tr("Reinstall"));
+                ui->pushButton_3->show();
+            }
+            else
+            {
+                ui->downloadButton->setText(tr("Upgrade"));
+                ui->pushButton_3->show();
+            }
+        }
+        else
+        {
+            ui->downloadButton->setText(tr("Install"));
+            ui->downloadButton->setEnabled(true);
+            ui->downloadButton->show();
+        }
+        isDownloading();
+
+        QStringList taglist = info["Tags"].toString().split(";");
+        QString tmp=info["img_urls"].toString();
+        qDebug()<<tmp;
+        if(tmp.left(2)=="[\"")
+        {
+            tmp.remove(0,2);
+        }
+        if(tmp.right(2)=="\"]")
+        {
+            tmp.remove(tmp.size()-2,tmp.size());
+        }
+        QStringList imglist = tmp.split("\",\"");
+        qDebug()<<imglist;
+        for(int i=0;i < imglist.size();i++)
+        {
+            QNetworkAccessManager *naManager;
+            QNetworkRequest request;
+            naManager=new QNetworkAccessManager(this);
+            request.setUrl(QUrl(imglist[i]));
+            request.setRawHeader("User-Agent", "Mozilla/5.0");
+            request.setRawHeader("Content-Type", "charset='utf-8'");
+            naManager->get(request);
+            QObject::connect(naManager,&QNetworkAccessManager::finished,[=](QNetworkReply *reply){
+                    QByteArray jpegData = reply->readAll();
+                    QPixmap pixmap;
+                    pixmap.loadFromData(jpegData);
+                    pixmap.scaled(100, 100, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
+                    image_show *img=new image_show(this);
+                    img->setImage(pixmap);
+                    //img->setScaledContents(true);
+                    QListWidgetItem* pItem = new QListWidgetItem();
+                    pItem->setSizeHint(QSize(280, 200));
+                    ui->listWidget->addItem(pItem);
+                    ui->listWidget->setItemWidget(pItem, img);
+                });
+        }
+        this->sltAppinfoTags(&taglist);
+        disconnect(api,&SparkAPI::finished,nullptr,nullptr);
+        api->deleteLater();
+    });
+    api->getAppInfo(url);
+}
+
+void AppIntoPage::isDownloading()
+{
+    switch (dw->isDownloading(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString())) {
+        case 3:{
+            ui->downloadButton->setEnabled(true);
+            ui->downloadButton->setText(tr("Install"));
+            break;
+        }
+        case 1:{
+            ui->downloadButton->setEnabled(false);
+            ui->downloadButton->setText(tr("Downloading"));
+            break;
+        }
+        case 2:{
+            ui->downloadButton->setEnabled(false);
+            ui->downloadButton->setText(tr("Downloaded"));
+            break;
+        }
+    }
+}
+
+void AppIntoPage::sltAppinfoTags(QStringList *tagList)
+{
+    foreach(const QString &tag, *tagList)
+    {
+        if(tag=="community")
+        {
+            ui->tag_community->show();
+        }
+        else if(tag=="ubuntu")
+        {
+            ui->tag_ubuntu->show();
+        }
+        else if(tag=="deepin")
+        {
+            ui->tag_deepin->show();
+        }
+        else if(tag=="uos")
+        {
+            ui->tag_uos->show();
+        }
+        else if(tag=="dtk5")
+        {
+            ui->tag_dtk5->show();
+        }
+        else if(tag=="dwine2")
+        {
+            ui->tag_dwine2->show();
+        }
+        else if(tag=="dwine5")
+        {
+            ui->tag_dwine5->show();
+        }
+        else if(tag=="a2d")
+        {
+            ui->tag_a2d->show();
+        }
+    }
+}
+void AppIntoPage::setTheme(bool dark)
+{
+    if(dark)
+    {}else {
+        //亮色模式
+        QString frameStyleSheet ="#frame,#frame_2,#frame_3,#frame_4{background-color: #fbfbfb;border-radius:14px;border:1px solid rgb(229,229,229);}";
+        ui->frame->setStyleSheet(frameStyleSheet);
+        ui->frame_2->setStyleSheet(frameStyleSheet);
+        ui->frame_3->setStyleSheet(frameStyleSheet);
+        ui->frame_4->setStyleSheet(frameStyleSheet);
+
+        ui->icon_1->setPixmap(QPixmap(":/icon/light/box.svg"));
+        ui->icon_2->setPixmap(QPixmap(":/icon/light/box.svg"));
+        ui->icon_3->setPixmap(QPixmap(":/icon/light/calendar.svg"));
+        ui->icon_4->setPixmap(QPixmap(":/icon/light/text.svg"));
+        ui->icon_5->setPixmap(QPixmap(":/icon/light/folder.svg"));
+        ui->icon_6->setPixmap(QPixmap(":/icon/light/globe.svg"));
+
+    }
+}
+AppIntoPage::~AppIntoPage()
+{
+    delete ui;
+}
+
+void AppIntoPage::on_downloadButton_clicked()
+{
+    dw->addItem(info["Name"].toString(),info["Filename"].toString(),info["Pkgname"].toString(),iconpixmap,SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString());
+    isDownloading();
+}
+
+void AppIntoPage::on_pushButton_3_clicked()
+{
+    QtConcurrent::run([=]()
+    {
+                                    ui->downloadButton->setEnabled(false);
+                                    ui->pushButton_3->setEnabled(false);
+
+                                    QProcess uninstall;
+                                    uninstall.start("pkexec", QStringList() << "apt" << "purge" << "-y" << info["Pkgname"].toString().toLower());
+                                    uninstall.waitForFinished();
+
+                                    QProcess check;
+                                    check.start("dpkg", QStringList() << "-s" << info["Pkgname"].toString().toLower());
+                                    check.waitForFinished();
+
+                                    if (check.readAllStandardOutput().isEmpty())
+                                    {
+                                        ui->downloadButton->setText(tr("Install"));
+                                        ui->pushButton_3->hide();
+
+                                        updatesEnabled();
+                                        //sendNotification(tr("Uninstall succeeded"));
+                                    }
+
+                                    ui->downloadButton->setEnabled(true);
+                                    ui->pushButton_3->setEnabled(true);
+    });
+}
diff --git a/src/pages/appintopage.h b/src/pages/appintopage.h
new file mode 100644
index 0000000..993251c
--- /dev/null
+++ b/src/pages/appintopage.h
@@ -0,0 +1,42 @@
+#ifndef APPINTOPAGE_H
+#define APPINTOPAGE_H
+
+#include <QWidget>
+#include <QUrl>
+#include <QString>
+#include <QtConcurrent>
+#include "backend/sparkapi.h"
+#include "backend/image_show.h"
+#include "widgets/downloadlistwidget.h"
+namespace Ui {
+class AppIntoPage;
+}
+
+class AppIntoPage : public QWidget
+{
+    Q_OBJECT
+
+public:
+    void clear();
+    void setDownloadWidget(DownloadListWidget *w);
+    void setTheme(bool dark);
+    void openUrl(QUrl url);
+    explicit AppIntoPage(QWidget *parent = nullptr);
+    ~AppIntoPage();
+
+private slots:
+    void on_downloadButton_clicked();
+
+    void on_pushButton_3_clicked();
+
+private:
+    QJsonObject info;
+    QPixmap iconpixmap;
+    QUrl spk;
+    void isDownloading();
+    void sltAppinfoTags(QStringList *tagList);
+    DownloadListWidget *dw;
+    Ui::AppIntoPage *ui;
+};
+
+#endif // APPINTOPAGE_H
diff --git a/src/pages/appintopage.ui b/src/pages/appintopage.ui
new file mode 100644
index 0000000..a9ce5c4
--- /dev/null
+++ b/src/pages/appintopage.ui
@@ -0,0 +1,1287 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>AppIntoPage</class>
+ <widget class="QWidget" name="AppIntoPage">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>806</width>
+    <height>601</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QHBoxLayout" name="horizontalLayout" stretch="1,3">
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
+    <number>0</number>
+   </property>
+   <item>
+    <widget class="QWidget" name="widget_2" native="true">
+     <layout class="QVBoxLayout" name="verticalLayout_3">
+      <property name="leftMargin">
+       <number>0</number>
+      </property>
+      <property name="topMargin">
+       <number>0</number>
+      </property>
+      <property name="rightMargin">
+       <number>0</number>
+      </property>
+      <item>
+       <widget class="QFrame" name="frame">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>0</height>
+         </size>
+        </property>
+        <property name="maximumSize">
+         <size>
+          <width>16777215</width>
+          <height>16777215</height>
+         </size>
+        </property>
+        <property name="frameShape">
+         <enum>QFrame::StyledPanel</enum>
+        </property>
+        <property name="frameShadow">
+         <enum>QFrame::Raised</enum>
+        </property>
+        <layout class="QVBoxLayout" name="verticalLayout_4">
+         <item>
+          <spacer name="verticalSpacer_3">
+           <property name="orientation">
+            <enum>Qt::Vertical</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>20</width>
+             <height>74</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <layout class="QHBoxLayout" name="horizontalLayout_2">
+           <item>
+            <spacer name="horizontalSpacer">
+             <property name="orientation">
+              <enum>Qt::Horizontal</enum>
+             </property>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>40</width>
+               <height>20</height>
+              </size>
+             </property>
+            </spacer>
+           </item>
+           <item>
+            <widget class="QLabel" name="icon">
+             <property name="sizePolicy">
+              <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
+               <horstretch>0</horstretch>
+               <verstretch>0</verstretch>
+              </sizepolicy>
+             </property>
+             <property name="minimumSize">
+              <size>
+               <width>100</width>
+               <height>100</height>
+              </size>
+             </property>
+             <property name="maximumSize">
+              <size>
+               <width>100</width>
+               <height>100</height>
+              </size>
+             </property>
+             <property name="text">
+              <string/>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <spacer name="horizontalSpacer_2">
+             <property name="orientation">
+              <enum>Qt::Horizontal</enum>
+             </property>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>40</width>
+               <height>20</height>
+              </size>
+             </property>
+            </spacer>
+           </item>
+          </layout>
+         </item>
+         <item>
+          <spacer name="verticalSpacer_4">
+           <property name="orientation">
+            <enum>Qt::Vertical</enum>
+           </property>
+           <property name="sizeType">
+            <enum>QSizePolicy::Fixed</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>20</width>
+             <height>8</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QLabel" name="title">
+           <property name="font">
+            <font>
+             <pointsize>14</pointsize>
+             <weight>75</weight>
+             <bold>true</bold>
+            </font>
+           </property>
+           <property name="text">
+            <string/>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignCenter</set>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QLabel" name="author">
+           <property name="text">
+            <string/>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignCenter</set>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="verticalSpacer_5">
+           <property name="orientation">
+            <enum>Qt::Vertical</enum>
+           </property>
+           <property name="sizeType">
+            <enum>QSizePolicy::Fixed</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>20</width>
+             <height>10</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <layout class="QHBoxLayout" name="horizontalLayout_3">
+           <property name="topMargin">
+            <number>0</number>
+           </property>
+           <item>
+            <spacer name="horizontalSpacer_3">
+             <property name="orientation">
+              <enum>Qt::Horizontal</enum>
+             </property>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>40</width>
+               <height>20</height>
+              </size>
+             </property>
+            </spacer>
+           </item>
+           <item>
+            <widget class="QPushButton" name="downloadButton">
+             <property name="text">
+              <string>Download</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <spacer name="horizontalSpacer_4">
+             <property name="orientation">
+              <enum>Qt::Horizontal</enum>
+             </property>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>40</width>
+               <height>20</height>
+              </size>
+             </property>
+            </spacer>
+           </item>
+          </layout>
+         </item>
+         <item>
+          <layout class="QHBoxLayout" name="horizontalLayout_11">
+           <property name="topMargin">
+            <number>0</number>
+           </property>
+           <item>
+            <spacer name="horizontalSpacer_11">
+             <property name="orientation">
+              <enum>Qt::Horizontal</enum>
+             </property>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>40</width>
+               <height>20</height>
+              </size>
+             </property>
+            </spacer>
+           </item>
+           <item>
+            <widget class="QPushButton" name="pushButton_3">
+             <property name="text">
+              <string>Uninstall</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <spacer name="horizontalSpacer_12">
+             <property name="orientation">
+              <enum>Qt::Horizontal</enum>
+             </property>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>40</width>
+               <height>20</height>
+              </size>
+             </property>
+            </spacer>
+           </item>
+          </layout>
+         </item>
+         <item>
+          <spacer name="verticalSpacer_6">
+           <property name="orientation">
+            <enum>Qt::Vertical</enum>
+           </property>
+           <property name="sizeType">
+            <enum>QSizePolicy::Fixed</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>20</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <layout class="QHBoxLayout" name="horizontalLayout_4">
+           <property name="topMargin">
+            <number>0</number>
+           </property>
+           <item>
+            <spacer name="horizontalSpacer_5">
+             <property name="orientation">
+              <enum>Qt::Horizontal</enum>
+             </property>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>40</width>
+               <height>20</height>
+              </size>
+             </property>
+            </spacer>
+           </item>
+           <item>
+            <widget class="QLabel" name="tag_community">
+             <property name="maximumSize">
+              <size>
+               <width>30</width>
+               <height>16777215</height>
+              </size>
+             </property>
+             <property name="toolTip">
+              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This app is developed by community user,we give this tag to honor those who contribute to the Linux Ecology&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+             </property>
+             <property name="whatsThis">
+              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This app is developed by community user,we give this tag to honor those who contribute to the Linux Ecology&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+             </property>
+             <property name="text">
+              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/community-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QLabel" name="tag_ubuntu">
+             <property name="maximumSize">
+              <size>
+               <width>30</width>
+               <height>16777215</height>
+              </size>
+             </property>
+             <property name="toolTip">
+              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to Ubuntu 20.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+             </property>
+             <property name="whatsThis">
+              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to Ubuntu 20.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+             </property>
+             <property name="text">
+              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/ubuntu-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QLabel" name="tag_uos">
+             <property name="maximumSize">
+              <size>
+               <width>30</width>
+               <height>16777215</height>
+              </size>
+             </property>
+             <property name="toolTip">
+              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to UOS home 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+             </property>
+             <property name="whatsThis">
+              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to UOS home 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+             </property>
+             <property name="text">
+              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/uos-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QLabel" name="tag_dwine2">
+             <property name="maximumSize">
+              <size>
+               <width>30</width>
+               <height>16777215</height>
+              </size>
+             </property>
+             <property name="toolTip">
+              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine2 app.If you are using ubuntu or other non-deepin distro,you should deploy deepin-wine2 by your self.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+             </property>
+             <property name="whatsThis">
+              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine2 app.If you are using ubuntu or other non-deepin distro,you should deploy deepin-wine2 by your self.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+             </property>
+             <property name="text">
+              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine2-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QLabel" name="tag_dtk5">
+             <property name="maximumSize">
+              <size>
+               <width>30</width>
+               <height>16777215</height>
+              </size>
+             </property>
+             <property name="toolTip">
+              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This is a  DTK5 app,which means it would have better effect on Deepin Desktop Environment&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+             </property>
+             <property name="whatsThis">
+              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This is a  DTK5 app,which means it would have better effect on Deepin Desktop Environment&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+             </property>
+             <property name="text">
+              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dtk-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QLabel" name="tag_deepin">
+             <property name="maximumSize">
+              <size>
+               <width>30</width>
+               <height>16777215</height>
+              </size>
+             </property>
+             <property name="toolTip">
+              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to deepin 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+             </property>
+             <property name="whatsThis">
+              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to deepin 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+             </property>
+             <property name="text">
+              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/deepin-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QLabel" name="tag_a2d">
+             <property name="maximumSize">
+              <size>
+               <width>30</width>
+               <height>16777215</height>
+              </size>
+             </property>
+             <property name="toolTip">
+              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;An Appimage to deb app.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+             </property>
+             <property name="whatsThis">
+              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;An Appimage to deb app.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+             </property>
+             <property name="text">
+              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/a2d-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QLabel" name="tag_dwine5">
+             <property name="maximumSize">
+              <size>
+               <width>30</width>
+               <height>16777215</height>
+              </size>
+             </property>
+             <property name="toolTip">
+              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine5 app.If you are using ubuntu or other non-deepin distro,you should deploy deepin-wine5 by your self.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+             </property>
+             <property name="whatsThis">
+              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine5 app.If you are using ubuntu or other non-deepin distro,you should deploy deepin-wine5 by your self.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+             </property>
+             <property name="text">
+              <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine5-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <spacer name="horizontalSpacer_6">
+             <property name="orientation">
+              <enum>Qt::Horizontal</enum>
+             </property>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>40</width>
+               <height>20</height>
+              </size>
+             </property>
+            </spacer>
+           </item>
+          </layout>
+         </item>
+         <item>
+          <spacer name="verticalSpacer_8">
+           <property name="orientation">
+            <enum>Qt::Vertical</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>20</width>
+             <height>40</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <layout class="QHBoxLayout" name="horizontalLayout_10">
+           <property name="topMargin">
+            <number>0</number>
+           </property>
+           <item>
+            <spacer name="horizontalSpacer_9">
+             <property name="orientation">
+              <enum>Qt::Horizontal</enum>
+             </property>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>40</width>
+               <height>20</height>
+              </size>
+             </property>
+            </spacer>
+           </item>
+           <item>
+            <widget class="QPushButton" name="pushButton">
+             <property name="text">
+              <string>PushButton</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QPushButton" name="pushButton_2">
+             <property name="text">
+              <string>PushButton</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <spacer name="horizontalSpacer_10">
+             <property name="orientation">
+              <enum>Qt::Horizontal</enum>
+             </property>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>40</width>
+               <height>20</height>
+              </size>
+             </property>
+            </spacer>
+           </item>
+          </layout>
+         </item>
+         <item>
+          <spacer name="verticalSpacer_2">
+           <property name="orientation">
+            <enum>Qt::Vertical</enum>
+           </property>
+           <property name="sizeType">
+            <enum>QSizePolicy::Fixed</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>20</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <widget class="QWidget" name="widget" native="true">
+     <layout class="QVBoxLayout" name="verticalLayout">
+      <property name="topMargin">
+       <number>0</number>
+      </property>
+      <property name="bottomMargin">
+       <number>0</number>
+      </property>
+      <item>
+       <widget class="QScrollArea" name="scrollArea">
+        <property name="styleSheet">
+         <string notr="true">QScrollArea,QWidget#viewport,QWidget#scrollAreaWidgetContents
+{
+    background-color:transparent;
+    margin:0px;
+}</string>
+        </property>
+        <property name="frameShape">
+         <enum>QFrame::NoFrame</enum>
+        </property>
+        <property name="widgetResizable">
+         <bool>true</bool>
+        </property>
+        <widget class="QWidget" name="scrollAreaWidgetContents">
+         <property name="geometry">
+          <rect>
+           <x>0</x>
+           <y>0</y>
+           <width>480</width>
+           <height>601</height>
+          </rect>
+         </property>
+         <property name="autoFillBackground">
+          <bool>false</bool>
+         </property>
+         <layout class="QVBoxLayout" name="verticalLayout_2">
+          <property name="leftMargin">
+           <number>0</number>
+          </property>
+          <property name="topMargin">
+           <number>0</number>
+          </property>
+          <property name="rightMargin">
+           <number>0</number>
+          </property>
+          <property name="bottomMargin">
+           <number>0</number>
+          </property>
+          <item>
+           <widget class="QFrame" name="frame_2">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="frameShape">
+             <enum>QFrame::StyledPanel</enum>
+            </property>
+            <property name="frameShadow">
+             <enum>QFrame::Raised</enum>
+            </property>
+            <layout class="QVBoxLayout" name="verticalLayout_5">
+             <property name="spacing">
+              <number>0</number>
+             </property>
+             <property name="leftMargin">
+              <number>0</number>
+             </property>
+             <property name="topMargin">
+              <number>0</number>
+             </property>
+             <property name="rightMargin">
+              <number>0</number>
+             </property>
+             <property name="bottomMargin">
+              <number>0</number>
+             </property>
+             <item>
+              <layout class="QHBoxLayout" name="horizontalLayout_5">
+               <property name="leftMargin">
+                <number>16</number>
+               </property>
+               <property name="rightMargin">
+                <number>16</number>
+               </property>
+               <item>
+                <widget class="QLabel" name="title_1">
+                 <property name="sizePolicy">
+                  <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+                   <horstretch>0</horstretch>
+                   <verstretch>0</verstretch>
+                  </sizepolicy>
+                 </property>
+                 <property name="minimumSize">
+                  <size>
+                   <width>0</width>
+                   <height>40</height>
+                  </size>
+                 </property>
+                 <property name="maximumSize">
+                  <size>
+                   <width>16777215</width>
+                   <height>16777215</height>
+                  </size>
+                 </property>
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>75</weight>
+                   <bold>true</bold>
+                  </font>
+                 </property>
+                 <property name="text">
+                  <string>Description</string>
+                 </property>
+                 <property name="alignment">
+                  <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+                 </property>
+                 <property name="wordWrap">
+                  <bool>false</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </item>
+             <item>
+              <widget class="Line" name="line">
+               <property name="minimumSize">
+                <size>
+                 <width>0</width>
+                 <height>1</height>
+                </size>
+               </property>
+               <property name="maximumSize">
+                <size>
+                 <width>16777215</width>
+                 <height>1</height>
+                </size>
+               </property>
+               <property name="orientation">
+                <enum>Qt::Horizontal</enum>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <layout class="QHBoxLayout" name="horizontalLayout_6">
+               <property name="leftMargin">
+                <number>16</number>
+               </property>
+               <property name="topMargin">
+                <number>8</number>
+               </property>
+               <property name="rightMargin">
+                <number>16</number>
+               </property>
+               <property name="bottomMargin">
+                <number>8</number>
+               </property>
+               <item>
+                <widget class="QLabel" name="label_2">
+                 <property name="sizePolicy">
+                  <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+                   <horstretch>0</horstretch>
+                   <verstretch>0</verstretch>
+                  </sizepolicy>
+                 </property>
+                 <property name="text">
+                  <string/>
+                 </property>
+                 <property name="alignment">
+                  <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+                 </property>
+                 <property name="wordWrap">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </item>
+            </layout>
+           </widget>
+          </item>
+          <item>
+           <widget class="QFrame" name="frame_3">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="frameShape">
+             <enum>QFrame::StyledPanel</enum>
+            </property>
+            <property name="frameShadow">
+             <enum>QFrame::Raised</enum>
+            </property>
+            <layout class="QVBoxLayout" name="verticalLayout_6">
+             <property name="spacing">
+              <number>0</number>
+             </property>
+             <property name="leftMargin">
+              <number>0</number>
+             </property>
+             <property name="topMargin">
+              <number>0</number>
+             </property>
+             <property name="rightMargin">
+              <number>0</number>
+             </property>
+             <property name="bottomMargin">
+              <number>0</number>
+             </property>
+             <item>
+              <layout class="QHBoxLayout" name="horizontalLayout_7">
+               <property name="leftMargin">
+                <number>16</number>
+               </property>
+               <property name="rightMargin">
+                <number>16</number>
+               </property>
+               <item>
+                <widget class="QLabel" name="title_2">
+                 <property name="sizePolicy">
+                  <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+                   <horstretch>0</horstretch>
+                   <verstretch>0</verstretch>
+                  </sizepolicy>
+                 </property>
+                 <property name="minimumSize">
+                  <size>
+                   <width>0</width>
+                   <height>40</height>
+                  </size>
+                 </property>
+                 <property name="maximumSize">
+                  <size>
+                   <width>16777215</width>
+                   <height>16777215</height>
+                  </size>
+                 </property>
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>75</weight>
+                   <bold>true</bold>
+                  </font>
+                 </property>
+                 <property name="text">
+                  <string>Screen capture</string>
+                 </property>
+                 <property name="alignment">
+                  <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+                 </property>
+                 <property name="wordWrap">
+                  <bool>false</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </item>
+             <item>
+              <widget class="Line" name="line_2">
+               <property name="minimumSize">
+                <size>
+                 <width>0</width>
+                 <height>1</height>
+                </size>
+               </property>
+               <property name="maximumSize">
+                <size>
+                 <width>16777215</width>
+                 <height>1</height>
+                </size>
+               </property>
+               <property name="orientation">
+                <enum>Qt::Horizontal</enum>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <layout class="QHBoxLayout" name="horizontalLayout_8">
+               <property name="leftMargin">
+                <number>8</number>
+               </property>
+               <property name="rightMargin">
+                <number>8</number>
+               </property>
+               <property name="bottomMargin">
+                <number>4</number>
+               </property>
+               <item>
+                <widget class="QListWidget" name="listWidget">
+                 <property name="sizePolicy">
+                  <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+                   <horstretch>0</horstretch>
+                   <verstretch>0</verstretch>
+                  </sizepolicy>
+                 </property>
+                 <property name="minimumSize">
+                  <size>
+                   <width>0</width>
+                   <height>205</height>
+                  </size>
+                 </property>
+                 <property name="maximumSize">
+                  <size>
+                   <width>16777215</width>
+                   <height>205</height>
+                  </size>
+                 </property>
+                 <property name="styleSheet">
+                  <string notr="true">QListView,QScrollArea,QWidget#viewport,QWidget#scrollAreaWidgetContents
+{
+    background-color:transparent;
+    margin:0px;
+}
+/**列表项选中*/
+QListWidget::item::selected
+{ 
+    background-color:transparent;
+}</string>
+                 </property>
+                 <property name="frameShape">
+                  <enum>QFrame::StyledPanel</enum>
+                 </property>
+                 <property name="verticalScrollBarPolicy">
+                  <enum>Qt::ScrollBarAlwaysOff</enum>
+                 </property>
+                 <property name="horizontalScrollBarPolicy">
+                  <enum>Qt::ScrollBarAlwaysOn</enum>
+                 </property>
+                 <property name="autoScroll">
+                  <bool>true</bool>
+                 </property>
+                 <property name="autoScrollMargin">
+                  <number>5</number>
+                 </property>
+                 <property name="resizeMode">
+                  <enum>QListView::Fixed</enum>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </item>
+            </layout>
+           </widget>
+          </item>
+          <item>
+           <widget class="QFrame" name="frame_4">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="frameShape">
+             <enum>QFrame::StyledPanel</enum>
+            </property>
+            <property name="frameShadow">
+             <enum>QFrame::Raised</enum>
+            </property>
+            <layout class="QVBoxLayout" name="verticalLayout_7">
+             <property name="spacing">
+              <number>0</number>
+             </property>
+             <property name="leftMargin">
+              <number>0</number>
+             </property>
+             <property name="topMargin">
+              <number>0</number>
+             </property>
+             <property name="rightMargin">
+              <number>0</number>
+             </property>
+             <property name="bottomMargin">
+              <number>0</number>
+             </property>
+             <item>
+              <layout class="QHBoxLayout" name="horizontalLayout_9">
+               <property name="leftMargin">
+                <number>16</number>
+               </property>
+               <property name="rightMargin">
+                <number>16</number>
+               </property>
+               <item>
+                <widget class="QLabel" name="title_3">
+                 <property name="sizePolicy">
+                  <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+                   <horstretch>0</horstretch>
+                   <verstretch>0</verstretch>
+                  </sizepolicy>
+                 </property>
+                 <property name="minimumSize">
+                  <size>
+                   <width>0</width>
+                   <height>40</height>
+                  </size>
+                 </property>
+                 <property name="maximumSize">
+                  <size>
+                   <width>16777215</width>
+                   <height>16777215</height>
+                  </size>
+                 </property>
+                 <property name="font">
+                  <font>
+                   <pointsize>12</pointsize>
+                   <weight>75</weight>
+                   <bold>true</bold>
+                  </font>
+                 </property>
+                 <property name="text">
+                  <string>Description</string>
+                 </property>
+                 <property name="alignment">
+                  <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+                 </property>
+                 <property name="wordWrap">
+                  <bool>false</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </item>
+             <item>
+              <widget class="Line" name="line_3">
+               <property name="minimumSize">
+                <size>
+                 <width>0</width>
+                 <height>1</height>
+                </size>
+               </property>
+               <property name="maximumSize">
+                <size>
+                 <width>16777215</width>
+                 <height>1</height>
+                </size>
+               </property>
+               <property name="orientation">
+                <enum>Qt::Horizontal</enum>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <layout class="QGridLayout" name="gridLayout">
+               <property name="leftMargin">
+                <number>16</number>
+               </property>
+               <property name="topMargin">
+                <number>8</number>
+               </property>
+               <property name="rightMargin">
+                <number>16</number>
+               </property>
+               <property name="bottomMargin">
+                <number>8</number>
+               </property>
+               <property name="horizontalSpacing">
+                <number>6</number>
+               </property>
+               <item row="1" column="4">
+                <widget class="QLabel" name="d_contributor">
+                 <property name="text">
+                  <string/>
+                 </property>
+                </widget>
+               </item>
+               <item row="1" column="1">
+                <widget class="QLabel" name="d_author">
+                 <property name="text">
+                  <string/>
+                 </property>
+                </widget>
+               </item>
+               <item row="2" column="4">
+                <spacer name="verticalSpacer_7">
+                 <property name="orientation">
+                  <enum>Qt::Vertical</enum>
+                 </property>
+                 <property name="sizeType">
+                  <enum>QSizePolicy::Fixed</enum>
+                 </property>
+                 <property name="sizeHint" stdset="0">
+                  <size>
+                   <width>20</width>
+                   <height>8</height>
+                  </size>
+                 </property>
+                </spacer>
+               </item>
+               <item row="0" column="7">
+                <widget class="QLabel" name="label_12">
+                 <property name="text">
+                  <string>Update</string>
+                 </property>
+                </widget>
+               </item>
+               <item row="0" column="0">
+                <widget class="QLabel" name="icon_1">
+                 <property name="minimumSize">
+                  <size>
+                   <width>16</width>
+                   <height>16</height>
+                  </size>
+                 </property>
+                 <property name="maximumSize">
+                  <size>
+                   <width>16</width>
+                   <height>16</height>
+                  </size>
+                 </property>
+                 <property name="text">
+                  <string/>
+                 </property>
+                 <property name="scaledContents">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+               <item row="0" column="4">
+                <widget class="QLabel" name="label_9">
+                 <property name="text">
+                  <string>Contributor</string>
+                 </property>
+                </widget>
+               </item>
+               <item row="3" column="1">
+                <widget class="QLabel" name="label_15">
+                 <property name="text">
+                  <string>Pkgname</string>
+                 </property>
+                </widget>
+               </item>
+               <item row="0" column="3">
+                <widget class="QLabel" name="icon_2">
+                 <property name="minimumSize">
+                  <size>
+                   <width>16</width>
+                   <height>16</height>
+                  </size>
+                 </property>
+                 <property name="maximumSize">
+                  <size>
+                   <width>16</width>
+                   <height>16</height>
+                  </size>
+                 </property>
+                 <property name="scaledContents">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+               <item row="0" column="5">
+                <spacer name="horizontalSpacer_8">
+                 <property name="orientation">
+                  <enum>Qt::Horizontal</enum>
+                 </property>
+                 <property name="sizeType">
+                  <enum>QSizePolicy::Preferred</enum>
+                 </property>
+                 <property name="sizeHint" stdset="0">
+                  <size>
+                   <width>40</width>
+                   <height>20</height>
+                  </size>
+                 </property>
+                </spacer>
+               </item>
+               <item row="1" column="7">
+                <widget class="QLabel" name="d_update"/>
+               </item>
+               <item row="3" column="0">
+                <widget class="QLabel" name="icon_4">
+                 <property name="minimumSize">
+                  <size>
+                   <width>16</width>
+                   <height>16</height>
+                  </size>
+                 </property>
+                 <property name="maximumSize">
+                  <size>
+                   <width>16</width>
+                   <height>16</height>
+                  </size>
+                 </property>
+                 <property name="scaledContents">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+               <item row="0" column="2">
+                <spacer name="horizontalSpacer_7">
+                 <property name="orientation">
+                  <enum>Qt::Horizontal</enum>
+                 </property>
+                 <property name="sizeType">
+                  <enum>QSizePolicy::Preferred</enum>
+                 </property>
+                 <property name="sizeHint" stdset="0">
+                  <size>
+                   <width>40</width>
+                   <height>20</height>
+                  </size>
+                 </property>
+                </spacer>
+               </item>
+               <item row="0" column="6">
+                <widget class="QLabel" name="icon_3">
+                 <property name="minimumSize">
+                  <size>
+                   <width>16</width>
+                   <height>16</height>
+                  </size>
+                 </property>
+                 <property name="maximumSize">
+                  <size>
+                   <width>16</width>
+                   <height>16</height>
+                  </size>
+                 </property>
+                 <property name="scaledContents">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+               <item row="0" column="1">
+                <widget class="QLabel" name="label_6">
+                 <property name="text">
+                  <string>Author</string>
+                 </property>
+                </widget>
+               </item>
+               <item row="4" column="1">
+                <widget class="QLabel" name="d_pkgname"/>
+               </item>
+               <item row="3" column="3">
+                <widget class="QLabel" name="icon_5">
+                 <property name="minimumSize">
+                  <size>
+                   <width>16</width>
+                   <height>16</height>
+                  </size>
+                 </property>
+                 <property name="maximumSize">
+                  <size>
+                   <width>16</width>
+                   <height>16</height>
+                  </size>
+                 </property>
+                 <property name="scaledContents">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+               <item row="3" column="4">
+                <widget class="QLabel" name="label_18">
+                 <property name="text">
+                  <string>Size</string>
+                 </property>
+                </widget>
+               </item>
+               <item row="4" column="4">
+                <widget class="QLabel" name="d_size"/>
+               </item>
+               <item row="3" column="6">
+                <widget class="QLabel" name="icon_6">
+                 <property name="minimumSize">
+                  <size>
+                   <width>16</width>
+                   <height>16</height>
+                  </size>
+                 </property>
+                 <property name="maximumSize">
+                  <size>
+                   <width>16</width>
+                   <height>16</height>
+                  </size>
+                 </property>
+                 <property name="scaledContents">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+               <item row="3" column="7">
+                <widget class="QLabel" name="label_21">
+                 <property name="text">
+                  <string>Website</string>
+                 </property>
+                </widget>
+               </item>
+               <item row="4" column="7">
+                <widget class="QLabel" name="d_website">
+                 <property name="openExternalLinks">
+                  <bool>true</bool>
+                 </property>
+                </widget>
+               </item>
+              </layout>
+             </item>
+            </layout>
+           </widget>
+          </item>
+          <item>
+           <spacer name="verticalSpacer">
+            <property name="orientation">
+             <enum>Qt::Vertical</enum>
+            </property>
+            <property name="sizeHint" stdset="0">
+             <size>
+              <width>20</width>
+              <height>40</height>
+             </size>
+            </property>
+           </spacer>
+          </item>
+         </layout>
+        </widget>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/pages/applistpage.cpp b/src/pages/applistpage.cpp
new file mode 100644
index 0000000..2e4113b
--- /dev/null
+++ b/src/pages/applistpage.cpp
@@ -0,0 +1,76 @@
+#include "applistpage.h"
+#include "ui_applistpage.h"
+
+AppListPage::AppListPage(QWidget *parent) :
+    QWidget(parent),
+    ui(new Ui::AppListPage)
+{
+    ui->setupUi(this);
+    ui->webEngineView->page()->setBackgroundColor(Qt::transparent);
+}
+void AppListPage::setTheme(bool dark)
+{
+    isDark=dark;
+    if(dark)
+    {
+
+    }else {
+        //亮色模式
+        this->setStyleSheet("#frame{background-color: #ffffff;border-radius:14px;border:1px solid rgb(229,229,229);}#webEngineView{border-radius:14px;}");
+    }
+    if(isSearch)
+    {
+        getSearchList(nowType);
+    }else{
+        getAppList(nowType);
+    }
+}
+void AppListPage::getAppList(QString type)
+{
+    isSearch=false;
+    nowType=type;
+    SparkAPI *api=new SparkAPI(this);
+    QString url;
+    if(isDark)
+    {
+        url=api->getServerUrl()+"store/#/dark"+type;
+    }else{
+        url=api->getServerUrl()+"store/#/"+type;
+    }
+    ui->webEngineView->setUrl(url);
+}
+
+void AppListPage::getSearchList(QString keyword)
+{
+    isSearch=true;
+    nowType=keyword;
+    SparkAPI *api=new SparkAPI(this);
+    QString url;
+    if(isDark)
+    {
+        url=api->getServerUrl()+"store/#/darksearch?keywords="+keyword;
+    }else{
+        url=api->getServerUrl()+"store/#/search?keywords="+keyword;
+    }
+    ui->webEngineView->setUrl(url);
+}
+
+AppListPage::~AppListPage()
+{
+    delete ui;
+}
+
+void AppListPage::on_webEngineView_urlChanged(const QUrl &arg1)
+{
+    if(arg1.path().right(8) == "app.json")
+        {
+            QString url = arg1.toString();
+            url = url.mid(url.indexOf("/store/"));
+            url = "spk:/"+url;
+            url = url.mid(0,url.indexOf("/app.json"));
+            qDebug() << "程序跳转链接地址:" << url;
+            ui->webEngineView->back();
+            emit clicked(url);
+        }
+}
+
diff --git a/src/pages/applistpage.h b/src/pages/applistpage.h
new file mode 100644
index 0000000..9715088
--- /dev/null
+++ b/src/pages/applistpage.h
@@ -0,0 +1,34 @@
+#ifndef APPLISTPAGE_H
+#define APPLISTPAGE_H
+#include <QMutex>
+#include <QWidget>
+#include <QListWidgetItem>
+#include "backend/sparkapi.h"
+namespace Ui {
+class AppListPage;
+}
+
+class AppListPage : public QWidget
+{
+    Q_OBJECT
+
+public:
+    void setTheme(bool dark);
+    void getSearchList(QString keyword);
+    void getAppList(QString type);
+    explicit AppListPage(QWidget *parent = nullptr);
+    ~AppListPage();
+
+private:
+    QMutex mutex; // 禁止多次搜索事件同时发生
+    bool isDark;
+    bool isSearch;
+    QString nowType;
+    Ui::AppListPage *ui;
+signals:
+    void clicked(QUrl spk);
+private slots:
+    void on_webEngineView_urlChanged(const QUrl &arg1);
+};
+
+#endif // APPLISTPAGE_H
diff --git a/src/pages/applistpage.ui b/src/pages/applistpage.ui
new file mode 100644
index 0000000..3fee099
--- /dev/null
+++ b/src/pages/applistpage.ui
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>AppListPage</class>
+ <widget class="QWidget" name="AppListPage">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>645</width>
+    <height>409</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
+    <number>0</number>
+   </property>
+   <item>
+    <widget class="QFrame" name="frame">
+     <property name="frameShape">
+      <enum>QFrame::StyledPanel</enum>
+     </property>
+     <property name="frameShadow">
+      <enum>QFrame::Raised</enum>
+     </property>
+     <layout class="QVBoxLayout" name="verticalLayout_2">
+      <property name="leftMargin">
+       <number>4</number>
+      </property>
+      <property name="topMargin">
+       <number>4</number>
+      </property>
+      <property name="rightMargin">
+       <number>4</number>
+      </property>
+      <property name="bottomMargin">
+       <number>0</number>
+      </property>
+      <item>
+       <widget class="WebEngineView" name="webEngineView">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="url">
+         <url>
+          <string>about:blank</string>
+         </url>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>QWebEngineView</class>
+   <extends>QWidget</extends>
+   <header location="global">QtWebEngineWidgets/QWebEngineView</header>
+  </customwidget>
+  <customwidget>
+   <class>WebEngineView</class>
+   <extends>QWebEngineView</extends>
+   <header>widgets/common/webengineview.h</header>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/progressload.cpp b/src/progressload.cpp
deleted file mode 100644
index c2fac28..0000000
--- a/src/progressload.cpp
+++ /dev/null
@@ -1,44 +0,0 @@
-#include "progressload.h"
-
-#include <DApplicationHelper>
-
-ProgressLoad::ProgressLoad(QWidget *parent) :
-    QWidget(parent),
-    m_progess(new QWidget(this)),
-    timer(new QTimer),
-    value(0)
-{
-    m_progess->move(0,0);
-    m_progess->show();
-
-    timer->setInterval(10);
-    timer->start();
-    connect(timer, &QTimer::timeout, [=]()
-    {
-        m_progess->setFixedWidth(width() / 100 * value);
-        m_progess->setFixedHeight(height());
-    });
-}
-
-void ProgressLoad::setValue(int v)
-{
-    value = v;
-    m_progess->setFixedWidth(width() / 100 * value);
-}
-
-void ProgressLoad::setTheme(bool dark, QColor color)
-{
-    if(dark)
-    {
-        plt.setColor(QPalette::Background, QColor(40, 40, 40));
-        setAutoFillBackground(true);
-        setPalette(plt);
-    }
-    else
-    {
-        plt.setColor(QPalette::Background, QColor(255, 255, 255));
-        setAutoFillBackground(true);
-        setPalette(plt);
-    }
-    m_progess->setStyleSheet("background-color: " + color.name() + ";");
-}
diff --git a/src/progressload.h b/src/progressload.h
deleted file mode 100644
index b1bb0ff..0000000
--- a/src/progressload.h
+++ /dev/null
@@ -1,26 +0,0 @@
-#ifndef PROGRESSLOAD_H
-#define PROGRESSLOAD_H
-
-#include <QWidget>
-#include <QTimer>
-#include <QPalette>
-
-class ProgressLoad : public QWidget
-{
-    Q_OBJECT
-
-public:
-    explicit ProgressLoad(QWidget *parent = nullptr);
-
-    void setValue(int v);
-    void setTheme(bool dark, QColor color);
-
-private:
-    QWidget *m_progess;
-    QTimer *timer;
-    int value;
-    QPalette plt;
-
-};
-
-#endif // PROGRESSLOAD_H
diff --git a/src/spark-dstore-patch/spark-dstore-patch.pro b/src/spark-dstore-patch/spark-dstore-patch.pro
deleted file mode 100644
index 841f15e..0000000
--- a/src/spark-dstore-patch/spark-dstore-patch.pro
+++ /dev/null
@@ -1,9 +0,0 @@
-TARGET = spark-dstore-patch
-TEMPLATE += app
-QT +=  widgets
-SOURCES += spark-dstore-tool.cpp
-
-# Default rules for deployment.
-qnx: target.path = /tmp/spark-store/bin
-else: unix:!android: target.path = /opt/durapps/spark-store/bin
-!isEmpty(target.path): INSTALLS += target
\ No newline at end of file
diff --git a/src/spark-dstore-patch/spark-dstore-tool.cpp b/src/spark-dstore-patch/spark-dstore-tool.cpp
deleted file mode 100644
index dbf3881..0000000
--- a/src/spark-dstore-patch/spark-dstore-tool.cpp
+++ /dev/null
@@ -1,195 +0,0 @@
-#include <QCoreApplication>
-#include <QDir>
-#include <QJsonObject>
-#include <QJsonDocument>
-#include <QDebug>
-#include <QDirIterator>
-#include <QProcess>
-
-#include <unistd.h>
-
-QList<QJsonObject> enumAppInfoList()
-{
-    QList<QJsonObject> appInfoList;
-    QDir apps("/opt/apps");
-    auto list = apps.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
-    for (auto &appID : list) {
-        auto infoPath = apps.absoluteFilePath(appID + "/info");
-        QFile infoFile(infoPath);
-        if (!infoFile.open(QIODevice::ReadOnly)) {
-            continue;
-        }
-        auto doc = QJsonDocument::fromJson(infoFile.readAll());
-        appInfoList.push_back(doc.object());
-    }
-    return appInfoList;
-}
-//这段是去找appid和info,没看懂用来干啥的,在此之后info文件也没再用过
-//可能以后版本的实现会用到,等官方加功能再说
-void linkDir(const QString &source, const QString &target)
-{
-    auto ensureTargetDir = [](const QString &targetFile) {
-        QFileInfo t(targetFile);
-        QDir tDir(t.dir());
-        tDir.mkpath(".");
-    };
-
-    QDir sourceDir(source);
-    QDir targetDir(target);
-    QDirIterator iter(source, QDir::Files | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
-    while (iter.hasNext()) {
-        auto sourceFile = iter.next();
-        auto targetFile = targetDir.absoluteFilePath(sourceDir.relativeFilePath(sourceFile));
-
-        QFileInfo tfi(targetFile);
-        //        if (tfi.isSymLink() && (tfi.canonicalFilePath() == sourceFile)) {
-	//这里官方应该是写错了,否则会每触发一次就把所有软链接都删了重新创建一次
-        if (tfi.isSymLink() && (tfi.symLinkTarget() == sourceFile)) {
-            continue;
-        } else {
-            QFile::remove(targetFile);
-        }
-
-        ensureTargetDir(targetFile);
-        auto ret = symlink(sourceFile.toStdString().c_str(), targetFile.toStdString().c_str());
-        if (0 != ret) {
-            qDebug() << "link failed" << sourceFile << "=>" << targetFile << ret;
-        }
-    }
-}
-
-//reset Dynamic library rpath
-void setRpath(const QString &file, const QString &path)
-{
-    if (!QFileInfo::exists(path))
-        return;
-    QProcess p;
-    auto cmd = "patchelf " + file + " --set-rpath " + path;
-    p.start("bash", QStringList {"-c", cmd});
-    p.waitForFinished();
-}
-
-QString getGlic()
-{
-    //get arch & glibc
-    QProcess p;
-    auto cmd = "gcc -dumpmachine";
-    p.start("bash", QStringList {"-c", cmd});
-    p.waitForFinished();
-    return p.readAll();
-}
-
-void linkApp(const QJsonObject &app)
-{
-    auto appID = app.value("appid").toString();
-    auto appEntriesDir = QDir("/opt/apps/" + appID + "/entries");
-    auto appLibsDir = QDir("/opt/apps/" + appID + "/files/lib");
-    auto autoStartDir = QDir(appEntriesDir.absoluteFilePath("autostart"));
-
-    bool autoStart = app.value("permissions").toObject().value("autostart").toBool();
-    if (autoStart) {
-        linkDir(appEntriesDir.absoluteFilePath("autostart"), "/etc/xdg/autostart");
-    }
-
-    // link application
-    auto sysShareDir = QDir("/usr/share");
-    linkDir(appEntriesDir.absoluteFilePath("applications"), sysShareDir.absoluteFilePath("applications"));
-    linkDir(appEntriesDir.absoluteFilePath("icons"), sysShareDir.absoluteFilePath("icons"));
-    linkDir(appEntriesDir.absoluteFilePath("mime"), sysShareDir.absoluteFilePath("mime"));
-    linkDir(appEntriesDir.absoluteFilePath("glib-2.0"), sysShareDir.absoluteFilePath("glib-2.0"));
-    linkDir(appEntriesDir.absoluteFilePath("services"), sysShareDir.absoluteFilePath("dbus-1/services"));
-    linkDir(appEntriesDir.absoluteFilePath("GConf"), sysShareDir.absoluteFilePath("GConf"));
-    linkDir(appEntriesDir.absoluteFilePath("help"), sysShareDir.absoluteFilePath("help"));
-    linkDir(appEntriesDir.absoluteFilePath("locale"), sysShareDir.absoluteFilePath("locale"));
-    linkDir(appEntriesDir.absoluteFilePath("fcitx"), sysShareDir.absoluteFilePath("fcitx"));
-    linkDir(appEntriesDir.absoluteFilePath("polkit"), sysShareDir.absoluteFilePath("polkit-1"));
-    linkDir(appEntriesDir.absoluteFilePath("fonts/conf"), "/etc/fonts/conf.d");
-    linkDir(appEntriesDir.absoluteFilePath("fonts/files"), sysShareDir.absoluteFilePath("fonts"));
-
-
-//原来会导致Gtk相关应用翻译缺失,补足了
-
-
-    auto pluginDir = QDir(appEntriesDir.absoluteFilePath("plugins"));
-    if (pluginDir.exists()) {
-        QString arch = getGlic();
-        //        if (pluginDir.exists()) {
-        //            QDirIterator iter(pluginDir.absolutePath(), QDir::Files | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
-        //            while (iter.hasNext()) {
-        //                auto sourceFile = iter.next();
-        //                setRpath(sourceFile, appLibsDir.absolutePath()); //set rpath
-        //            }
-        //        }
-
-        linkDir(appEntriesDir.absoluteFilePath("plugins/fcitx"), "/usr/lib/" + arch + "/fcitx");
-        linkDir(appEntriesDir.absoluteFilePath("plugins/browser"), "/usr/lib/mozilla/plugins");
-    }
-}
-
-void cleanLink()
-{
-    auto cleanDirBrokenLink = [](const QString &dir) {
-        QProcess p;
-        auto cmd = "find " + dir + " -xtype l -delete";
-        p.start("bash", QStringList {"-c", cmd});
-        p.waitForFinished();
-    };
-
-    QString arch = getGlic();
-    auto sysShareDir = QDir("/usr/share");
-    cleanDirBrokenLink(sysShareDir.absoluteFilePath("applications"));
-    cleanDirBrokenLink(sysShareDir.absoluteFilePath("icons"));
-    cleanDirBrokenLink(sysShareDir.absoluteFilePath("mime/packages"));
-    cleanDirBrokenLink(sysShareDir.absoluteFilePath("glib-2.0"));
-    cleanDirBrokenLink(sysShareDir.absoluteFilePath("dbus-1/services"));
-    cleanDirBrokenLink("/etc/xdg/autostart");
-    cleanDirBrokenLink(sysShareDir.absoluteFilePath("fcitx"));
-    cleanDirBrokenLink(sysShareDir.absoluteFilePath("help"));
-    cleanDirBrokenLink(sysShareDir.absoluteFilePath("locale"));
-    cleanDirBrokenLink("/usr/lib/" + arch + "/fcitx");
-    cleanDirBrokenLink("/usr/lib/mozilla/plugins");
-    cleanDirBrokenLink(sysShareDir.absoluteFilePath("polkit-1/actions"));
-    cleanDirBrokenLink(sysShareDir.absoluteFilePath("fonts"));
-    cleanDirBrokenLink("/etc/fonts/conf.d");
-}
-
-void update()
-{
-    QProcess p;
-    auto cmd = "glib-compile-schemas /usr/share/glib-2.0/schemas/";
-    p.start("bash", QStringList {"-c", cmd});
-    p.waitForFinished();
-
-    cmd = "update-icon-caches /usr/share/icons/*";
-    p.start("bash", QStringList {"-c", cmd});
-    p.waitForFinished();
-
-    cmd = "update-desktop-database -q";
-    p.start("bash", QStringList {"-c", cmd});
-    p.waitForFinished();
-
-    cmd = "update-mime-database -V /usr/share/mime";
-    p.start("bash", QStringList {"-c", cmd});
-    p.waitForFinished();
-
-    
-}
-
-
-
-int main(int argc, char **argv)
-{
-    QCoreApplication app(argc, argv);
-
-    cleanLink();
-
-    for (auto &a : enumAppInfoList()) {
-        linkApp(a);
-    }
-    qInfo()<<"Spark dstore patch (c) The Spark Project 2022-Now. Modified from deepin-app-store-tool";
-
-    // trigger
-    update();
-
-    return 0;
-}
diff --git a/src/spark-store.pro b/src/spark-store.pro
index 2dd7dbe..c39cdb6 100644
--- a/src/spark-store.pro
+++ b/src/spark-store.pro
@@ -1,10 +1,10 @@
 #-------------------------------------------------
 #
-# Project created by QtCreator 2019-06-30T12:53:03
+# Project created by QtCreator 2021-10-29T16:58:36
 #
 #-------------------------------------------------
 
-QT       += core gui network concurrent webenginewidgets dbus
+QT       += core gui network concurrent webenginewidgets
 
 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 
@@ -23,70 +23,55 @@ DEFINES += QT_DEPRECATED_WARNINGS
 #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
 
 DEFINES += QT_APP_DEBUG
-include(../third-party/QtNetworkService/QtNetworkService.pri)
 
 CONFIG += c++11 link_pkgconfig
 PKGCONFIG += dtkcore dtkgui dtkwidget libnotify
 
-# 禁止输出 qWarning / qDebug 信息
-#CONFIG(release, debug|release): DEFINES += QT_NO_WARNING_OUTPUT QT_NO_DEBUG_OUTPUT
+# Disable qWarning / qDebug output in Release
+CONFIG(release, debug|release): DEFINES += QT_NO_WARNING_OUTPUT QT_NO_DEBUG_OUTPUT
 
 SOURCES += \
-    appitem.cpp \
-    big_image.cpp \
-    downloadlist.cpp \
-    downloadworker.cpp \
-    flowlayout.cpp \
-    image_show.cpp \
-    main.cpp \
-    progressload.cpp \
-    widget.cpp \
-    workerthreads.cpp \
-    dbus/dbussparkstore.cpp \
-    webengine/webenginepage.cpp \
-    webengine/webengineview.cpp
+        main.cpp \
+        mainwindow-dtk.cpp \
+        backend/sparkapi.cpp \
+        widgets/common/webenginepage.cpp \
+        widgets/common/webengineview.cpp \
+        widgets/downloadlistwidget.cpp \
+        widgets/common/downloaditem.cpp \
+        widgets/common/smoothlistwidget.cpp \
+        widgets/common/smoothscrollbar.cpp \
+        utils/httprequest.cpp \
+        pages/applistpage.cpp \
+        backend/downloadworker.cpp \
+        pages/appintopage.cpp \
+        widgets/big_image.cpp \
+        backend/image_show.cpp
 
 HEADERS += \
-    appitem.h \
-    big_image.h \
-    downloadlist.h \
-    downloadworker.h \
-    flowlayout.h \
-    image_show.h \
-    progressload.h \
-    widget.h \
-    workerthreads.h \
-    dbus/dbussparkstore.h \
-    webengine/webenginepage.h \
-    webengine/webengineview.h
+        mainwindow-dtk.h \
+        backend/sparkapi.h \
+        widgets/common/webenginepage.h \
+        widgets/common/webengineview.h \
+        widgets/downloadlistwidget.h \
+        widgets/common/downloaditem.h \
+        widgets/common/smoothlistwidget.h \
+        widgets/common/smoothscrollbar.h \
+        utils/httprequest.h \
+        pages/applistpage.h \
+        backend/downloadworker.h \
+        pages/appintopage.h \
+        widgets/big_image.h \
+        backend/image_show.h
 
 FORMS += \
-    appitem.ui \
-    downloadlist.ui \
-    widget.ui
+        mainwindow-dtk.ui \
+        widgets/downloadlistwidget.ui \
+        widgets/common/downloaditem.ui \
+        pages/applistpage.ui \
+        pages/appintopage.ui
 
 RESOURCES += \
-    ../assets/icons.qrc
-
-DISTFILES += \
-    ../assets/tags/a2d-small.png \
-    ../assets/tags/a2d.png \
-    ../assets/tags/community-small.png \
-    ../assets/tags/community.png \
-    ../assets/tags/deepin-small.png \
-    ../assets/tags/dtk-small.png \
-    ../assets/tags/ubuntu-small.png \
-    ../assets/tags/ubuntu.png \
-    ../assets/tags/uos-small.png \
-    ../assets/tags/community.svg \
-    ../assets/tags/deepin.svg \
-    ../assets/tags/logo_icon.svg \
-    ../assets/tags/uos.svg
-
-TRANSLATIONS += \
-    ../translations/spark-store_en.ts \
-    ../translations/spark-store_fr.ts \
-    ../translations/spark-store_zh_CN.ts
+        assets/assets.qrc
 
 # Default rules for deployment.
 qnx: target.path = /tmp/$${TARGET}/bin
diff --git a/src/utils/httprequest.cpp b/src/utils/httprequest.cpp
new file mode 100644
index 0000000..ef2ca87
--- /dev/null
+++ b/src/utils/httprequest.cpp
@@ -0,0 +1,43 @@
+#include "httprequest.h"
+
+
+
+HttpRequest::HttpRequest()
+{
+
+}
+
+void HttpRequest::getRequest(QNetworkRequest request)
+{
+    QNetworkAccessManager *naManager=new QNetworkAccessManager(this);
+
+    request.setRawHeader("User-Agent", "Mozilla/5.0");
+    request.setRawHeader("Content-Type", "charset='utf-8'");
+    request.setRawHeader("Content-Type", "application/json");
+
+    naManager->get(request);
+    QObject::connect(naManager,&QNetworkAccessManager::finished,this,&HttpRequest::readdata_slot);
+}
+void HttpRequest::readdata_slot(QNetworkReply *reply)
+{
+    emit finished(reply->readAll());
+}
+QString HttpRequest::postRequest(QString url, QString jsondata)
+{
+    QByteArray array= jsondata.toLatin1();
+    QNetworkRequest request;
+    QNetworkAccessManager *naManager=new QNetworkAccessManager(this);
+    QUrl strUrl = url;
+    request.setUrl(strUrl);
+    request.setRawHeader("Content-Type", "charset='utf-8'");
+    request.setRawHeader("Content-Type", "application/json");
+
+    QNetworkReply* reply = naManager->post(request, array);
+    QEventLoop eventLoop;
+    connect(naManager, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()));
+    eventLoop.exec();
+    QTextCodec* codec = QTextCodec::codecForName("utf8");
+    QString strReply = codec->toUnicode(reply->readAll());
+    reply->deleteLater();
+    return strReply;
+}
diff --git a/src/utils/httprequest.h b/src/utils/httprequest.h
new file mode 100644
index 0000000..2637f03
--- /dev/null
+++ b/src/utils/httprequest.h
@@ -0,0 +1,26 @@
+#ifndef HTTPREQUEST_H
+#define HTTPREQUEST_H
+
+#include <QObject>
+#include <QNetworkAccessManager>
+#include <QNetworkReply>
+#include <QNetworkRequest>
+#include <QEventLoop>
+#include <QTextCodec>
+class HttpRequest : public QObject
+{
+    Q_OBJECT
+public:
+    HttpRequest();
+
+    void getRequest(QNetworkRequest request);
+
+    QString postRequest(QString url,  QString jsondata);
+signals:
+    void finished(QString);
+private slots:
+    void readdata_slot(QNetworkReply *reply);
+};
+
+#endif // HTTPREQUEST_H
+
diff --git a/src/widget.cpp b/src/widget.cpp
deleted file mode 100644
index b7c592a..0000000
--- a/src/widget.cpp
+++ /dev/null
@@ -1,1441 +0,0 @@
-#include <fstream>
-#include <libnotify/notify.h>
-
-#include "widget.h"
-#include "ui_widget.h"
-
-#include <QVBoxLayout>
-#include <QClipboard>
-#include <QJsonDocument>
-#include <QJsonObject>
-#include <QFile>
-#include <QFileInfo>
-#include <QDir>
-#include <QDesktopServices>
-#include <QNetworkReply>
-#include <QNetworkAccessManager>
-#include <QProcess>
-#include <QSettings>
-#include <QGraphicsOpacityEffect>
-#include <QtConcurrent> // 并发
-#include <QCloseEvent>  // close event
-
-#include <DApplication>
-#include <DGuiApplicationHelper>
-#include <DDialog>
-#include <DSettingsDialog>
-#include <DSettingsOption>
-#include <DStyle>
-
-#include "appitem.h"
-#include "flowlayout.h"
-
-#include "HttpClient.h"
-#include "downloadworker.h"
-
-#include "./dbus/dbussparkstore.h"
-DWIDGET_USE_NAMESPACE
-
-Widget::Widget(DBlurEffectWidget *parent) :
-    DBlurEffectWidget(parent),
-    ui(new Ui::Widget)
-{
-    ui->setupUi(this);
-
-    initUI();
-    initConfig();
-
-    manager = new QNetworkAccessManager(this);  // 下载管理
-
-    httpClient = new AeaQt::HttpClient;
-    
-
-    connect(ui->menu_main, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(0);});
-    connect(ui->menu_network, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(1);});
-    connect(ui->menu_chat, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(2);});
-    connect(ui->menu_music, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(3);});
-    connect(ui->menu_video, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(4);});
-    connect(ui->menu_photo, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(5);});
-    connect(ui->menu_game, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(6);});
-    connect(ui->menu_office, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(7);});
-    connect(ui->menu_read, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(8);});
-    connect(ui->menu_dev, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(9);});
-    connect(ui->menu_system, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(10);});
-    connect(ui->menu_theme, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(11);});
-    connect(ui->menu_other, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(12);});
-    connect(ui->menu_upgrade, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(13);});
-    connect(ui->menu_download, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(14);});
-
-    connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, [=](DGuiApplicationHelper::ColorType themeType)
-    {
-        // 获取系统活动色
-        main_color = DGuiApplicationHelper::instance()->applicationPalette().highlight().color();
-
-        if(themeType == DGuiApplicationHelper::DarkType)
-        {
-            qDebug() << "Dark";
-            themeIsDark = true;
-        }
-        else if(themeType == DGuiApplicationHelper::LightType)
-        {
-            qDebug() << "Light";
-            themeIsDark = false;
-        }
-
-        // 设置 UI 主题
-        setTheme(themeIsDark, main_color);
-    });
-
-    connect(&appinfoLoadThread, SIGNAL(requestResetUi()), this, SLOT(sltAppinfoResetUi()), Qt::ConnectionType::BlockingQueuedConnection);
-    connect(&appinfoLoadThread, &SpkAppInfoLoaderThread::requestSetTags, this, &Widget::sltAppinfoTags, Qt::ConnectionType::BlockingQueuedConnection);
-    connect(&appinfoLoadThread, &SpkAppInfoLoaderThread::requestSetAppInformation, this, &Widget::sltAppinfoDetails, Qt::ConnectionType::BlockingQueuedConnection);
-    connect(&appinfoLoadThread, &SpkAppInfoLoaderThread::finishedIconLoad, this, &Widget::sltAppinfoIcon, Qt::ConnectionType::BlockingQueuedConnection);
-    connect(&appinfoLoadThread, &SpkAppInfoLoaderThread::finishedScreenshotLoad, this, &Widget::sltAppinfoScreenshot, Qt::ConnectionType::BlockingQueuedConnection);
-    connect(&appinfoLoadThread, &SpkAppInfoLoaderThread::finishAllLoading, this, &Widget::sltAppinfoFinish, Qt::ConnectionType::BlockingQueuedConnection);
-
-    // 搜索事件
-    connect(searchEdit, &DSearchEdit::returnPressed, this, [=]()
-    {
-        qDebug() << "触发了搜索,呜啦啦啦!";
-        QString searchtext = searchEdit->text().replace("\r","");
-        if(!searchtext.isEmpty())
-        {
-            qDebug() << searchEdit->text();
-            searchApp(searchtext);
-        }
-        this->setFocus();
-    });
-
-    // 计算显示下载速度
-    download_speed.setInterval(1000);
-    download_speed.start();
-    connect(&download_speed,&QTimer::timeout,[=]()
-    {
-        if(isdownload && theSpeed == "")
-        {
-            size1 = download_size;
-            double bspeed;
-            bspeed = size1 - size2;
-            if(bspeed < 1024)
-            {
-                theSpeed = QString::number(bspeed) + "B/s";
-            }
-            else if(bspeed < 1024 * 1024)
-            {
-                theSpeed = QString::number(0.01 * int(100 * (bspeed / 1024))) + "KB/s";
-            }
-            else if(bspeed < 1024 * 1024 * 1024)
-            {
-                theSpeed = QString::number(0.01 * int(100 * (bspeed / (1024 * 1024)))) + "MB/s";
-            }
-            else
-            {
-                theSpeed = QString::number(0.01 * int(100 * (bspeed / (1024 * 1024 * 1024)))) + "GB/s";
-            }          
-            size2 = download_size;
-        }
-        if(isdownload){
-        download_list[nowDownload - 1].setSpeed(theSpeed);
-        }
-    });
-
-    notify_init(tr("Spark\\ Store").toLocal8Bit());
-
-    //初始化dbus服务
-    initDbus();
-}
-
-Widget::~Widget()
-{
-    notify_uninit();
-
-    // delete httpFinished;
-    delete ui;
-
-    qDebug() << "exit";
-    DApplication::quit();
-}
-
-void Widget::initUI()
-{
-    // ui初始化
-    setMaskAlpha(200);
-    // ui->webfoot->setFixedHeight(0);
-    ui->stackedWidget->setCurrentIndex(0);
-    ui->listWidget->hide();
-    ui->label_setting1->hide();
-    ui->pushButton_uninstall->hide();
-    ui->line1_widget->setStyleSheet("background-color:#808080");
-    ui->icon->setPixmap(QIcon::fromTheme("spark-store").pixmap(36,36));
-    ui->titlebar->setFixedHeight(48);
-
-    m_loadweb = ui->progressload;
-
-    label_screen << ui->screen_0 << ui->screen_1 << ui->screen_2 << ui->screen_3 << ui->screen_4;
-
-    // 初始化分界线
-    QGraphicsOpacityEffect *opacityEffect_1 = new QGraphicsOpacityEffect;
-    opacityEffect_1->setOpacity(0.1);
-    ui->line1_widget->setGraphicsEffect(opacityEffect_1);
-
-    // 搜索框
-    QWidget *w_titlebar = new QWidget;
-    QHBoxLayout *ly_titlebar = new QHBoxLayout;
-    w_titlebar->setLayout(ly_titlebar);
-    // ly_titlebar->addWidget(ui->pushButton_return);
-    ly_titlebar->addStretch();
-    ly_titlebar->addSpacing(50);
-    ly_titlebar->addWidget(searchEdit);
-    ly_titlebar->addStretch();
-    titlebar = ui->titlebar;
-    titlebar->setCustomWidget(w_titlebar);
-    // titlebar->setIcon(QIcon::fromTheme("spark-store"));
-    titlebar->setTitle(tr("Spark Store"));
-    searchEdit->setPlaceholderText(tr("Search or enter spk://"));
-    searchEdit->setFixedWidth(300);
-    titlebar->setSeparatorVisible(false);
-    // titlebar->setAutoHideOnFullscreen(true);
-
-    // 添加菜单项
-    QAction *actionSubmission = new QAction(tr("Submit App"), this);
-    QAction *actionSubmissionWithClient = new QAction(tr("Submit App with client(Recommanded)"), this);
-    QAction *setting = new QAction(tr("Settings"));
-    QAction *upgrade = new QAction(tr("APP Upgrade and Install Settings"));
-
-    QMenu *menu = new QMenu;
-    menu->addAction(setting);
-    menu->addAction(upgrade);
-    menu->addAction(actionSubmission);
-    menu->addAction(actionSubmissionWithClient);
-
-    titlebar->setMenu(menu);
-
-    connect(actionSubmission, &QAction::triggered, this, [=]{QDesktopServices::openUrl(QUrl("https://upload.deepinos.org/"));});
-    connect(setting, &QAction::triggered, this, &Widget::opensetting);
-    connect(upgrade, &QAction::triggered, this, [=]{QProcess::startDetached("/opt/durapps/spark-store/bin/update-upgrade/ss-update-controler.sh");});
-
-    // 投稿器
-    connect(actionSubmissionWithClient, &QAction::triggered, this, [=]
-        {
-            QString submitterSpk = "spk://store/tools/spark-store-submitter";
-            QFile actionSubmissionClientStatus("/opt/spark-store-submitter/bin/spark-store-submitter");
-            if (actionSubmissionClientStatus.exists())
-            {
-                qDebug() << "投稿器存在";
-                QProcess::startDetached("/opt/spark-store-submitter/bin/spark-store-submitter"); 
-            }
-            else{
-                qDebug() << "投稿器不存在,跳转页面";
-                openUrl(submitterSpk);
-            }
-                
-        });
-
-    // 载入自定义字体
-    // int loadedFontID = QFontDatabase::addApplicationFont(":/fonts/fonts/hksnzt.ttf");
-    // QStringList loadedFontFamilies = QFontDatabase::applicationFontFamilies(loadedFontID);
-    // if(!loadedFontFamilies.isEmpty())
-    // {
-    //     font = loadedFontFamilies.at(0);
-    // }
-    /* 全局字体设置
-     * DApplication::setFont(font);
-     */
-
-    // 初始化菜单数组
-    left_list[0] = ui->menu_main;
-    left_list[1] = ui->menu_network;
-    left_list[2] = ui->menu_chat;
-    left_list[3] = ui->menu_music;
-    left_list[4] = ui->menu_video;
-    left_list[5] = ui->menu_photo;
-    left_list[6] = ui->menu_game;
-    left_list[7] = ui->menu_office;
-    left_list[8] = ui->menu_read;
-    left_list[9] = ui->menu_dev;
-    left_list[10] = ui->menu_system;
-    left_list[11] = ui->menu_theme;
-    left_list[12] = ui->menu_other;
-    left_list[13] = ui->menu_upgrade;
-    left_list[14] = ui->menu_download;
-
-    ui->label_show->hide();
-
-    // 搜索列表页
-    applist_grid = new FlowLayout;
-    main = new QHBoxLayout;
-    main->setAlignment(Qt::AlignHCenter);
-    main->setMargin(0);
-    main->addWidget(spinner);
-    ui->applist_scrollAreaWidget->setLayout(main);
-    spinner->setFixedSize(80, 80);
-
-    // 初始化系统活动色和主题颜色
-    main_color = DGuiApplicationHelper::instance()->applicationPalette().highlight().color();
-    if(DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::DarkType)
-    {
-        themeIsDark = true;
-    }
-    else
-    {
-        themeIsDark = false;
-    }
-    setTheme(themeIsDark, main_color);
-}
-
-void Widget::initConfig()
-{
-    // 读取服务器列表并初始化
-    std::fstream serverList;
-    serverList.open(QDir::homePath().toUtf8() + "/.config/spark-store/server.list", std::ios::in);
-    std::string lineTmp;
-    if(serverList)
-    {
-        while(getline(serverList, lineTmp))
-        {
-            ui->comboBox_server->addItem(QString::fromStdString(lineTmp));
-        }
-        for(int i = 0; i < ui->comboBox_server->count(); i++)
-        {
-            if(ui->comboBox_server->itemText(i) == "开发者模式 Dev only")
-            {
-                ui->comboBox_server->model()->setData(ui->comboBox_server->model()->index(i, 0), QVariant(0), Qt::UserRole - 1);
-            }
-            if(ui->comboBox_server->itemText(i) == "镜像源 Download only")
-            {
-                for(int j = i; j < ui->comboBox_server->count(); j++)
-                {
-                    ui->comboBox_server->model()->setData(ui->comboBox_server->model()->index(j, 0), QVariant(0), Qt::UserRole - 1);
-                }
-                break;
-            }
-        }
-    }
-    else
-    {
-        ui->comboBox_server->addItem("https://d.store.deepinos.org.cn/");
-    }
-
-    // 读取服务器URL并初始化菜单项的链接
-    QSettings readConfig(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat);
-    if(!readConfig.value("server/choose").toString().isEmpty() && readConfig.value("server/updated").toString() == "TRUE")
-    {
-        ui->comboBox_server->setCurrentText(readConfig.value("server/choose").toString());
-        appinfoLoadThread.setServer(serverUrl = readConfig.value("server/choose").toString());
-    }
-    else
-    {
-        this->cdnSeverUrl = "https://cdn.d.store.deepinos.org.cn/";
-        appinfoLoadThread.setServer(serverUrl = this->cdnSeverUrl);  // 默认URL
-    }
-    configCanSave = true;   // 防止触发保存配置信号
-
-    // menuUrl[0] = "http://127.0.0.1:8000/#/darkprogramming";
-    qDebug() << "serverUrl: " << serverUrl;
-    menuUrl[0] = serverUrl + "store/#/";
-    menuUrl[1] = serverUrl + "store/#/network";
-    menuUrl[2] = serverUrl + "store/#/relations";
-    menuUrl[3] = serverUrl + "store/#/musicandsound";
-    menuUrl[4] = serverUrl + "store/#/videos";
-    menuUrl[5] = serverUrl + "store/#/photos";
-    menuUrl[6] = serverUrl + "store/#/games";
-    menuUrl[7] = serverUrl + "store/#/office";
-    menuUrl[8] = serverUrl + "store/#/reading";
-    menuUrl[9] = serverUrl + "store/#/programming";
-    menuUrl[10] = serverUrl + "store/#/tools";
-    menuUrl[11] = serverUrl + "store/#/themes";
-    menuUrl[12] = serverUrl + "store/#/others";
-
-    // web控件初始化
-    // ui->webView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);    // 用来激活接受 linkClicked 信号
-    // ui->webView->page()->settings()->setAttribute(QWebSettings::JavascriptEnabled, true);
-    // ui->webfoot->hide();
-
-    // 初始化首页
-    // ui->webEngineView->setUrl(menuUrl[0]);
-    chooseLeftMenu(0);
-
-    // 给下载列表赋值到数组,方便调用
-    for(int i = 0; i < LIST_MAX; i++)
-    {
-        download_list[i].num = i;
-    }
-
-    // 初始化 apt 源显示
-    QFile aptserver("/etc/apt/sources.list.d/sparkstore.list");
-    aptserver.open(QIODevice::ReadOnly);
-    if(aptserver.isOpen())
-    {
-        ui->label_aptserver->setText(aptserver.readAll());
-    }
-    else
-    {
-        ui->label_aptserver->setText(tr("Not Exist"));
-    }
-    aptserver.close();
-
-    // 新建临时文件夹
-    QDir dir("/tmp");
-    dir.mkdir("spark-store");
-}
-
-void Widget::setTheme(bool isDark, QColor color)
-{
-    // 菜单图标
-    if(isDark)
-    {
-        // 黑色模式
-        themeIsDark = true;
-        ui->webEngineView->setStyleSheet("background-color: #252525;");
-        // ui->webfoot->setStyleSheet("background-color: #252525;");
-        ui->btn_openDir->setStyleSheet("color: #AFAFAF; background-color: #2C2C2C; border: 0px;");
-        ui->label->setStyleSheet("background-color: #252525;");
-        // ui->scrollArea->setStyleSheet("background-color: #2C2C2C;");
-        ui->label_show->setStyleSheet("background-color: #2C2C2C;");
-        ui->pushButton_return->setIcon(DStyle().standardIcon(DStyle::SP_ArrowLeft));
-        ui->pushButton_refresh->setIcon(QIcon(":/icons/icons/refresh-page-dark.svg"));
-    }
-    else
-    {
-        // 亮色模式
-        themeIsDark = false;
-        ui->webEngineView->setStyleSheet("background-color: #FFFFFF;");
-        // ui->webfoot->setStyleSheet("background-color: #FFFFFF;");
-        ui->btn_openDir->setStyleSheet("color: #505050; background-color: #F8F8F8; border: 0px;");
-        ui->label->setStyleSheet("background-color: #FFFFFF;");
-        // ui->scrollArea->setStyleSheet("background-color: #F8F8F8;");
-        ui->label_show->setStyleSheet("background-color: #F8F8F8;");
-        ui->pushButton_return->setIcon(DStyle().standardIcon(DStyle::SP_ArrowLeft));
-        ui->pushButton_refresh->setIcon(QIcon(":/icons/icons/refresh-page.svg"));
-    }
-
-    // 刷新系统活动色
-    main_color = color;
-    m_loadweb->setTheme(themeIsDark, color);
-    updateUI();
-
-    // 刷新网页主题颜色
-    if(ui->stackedWidget->currentIndex() == 0)
-    {
-        chooseLeftMenu(nowMenu);
-    }
-}
-
-DTitlebar* Widget::getTitlebar()
-{
-    return ui->titlebar;
-}
-
-static NotifyNotification *_notify = nullptr;
-
-void Widget::sendNotification(const QString &message, const int msTimeout, const QString &icon)
-{
-    if(_notify == nullptr)
-    {
-        _notify = notify_notification_new(tr("Spark\\ Store").toLocal8Bit(), message.toLocal8Bit(), icon.toLocal8Bit());
-        notify_notification_set_timeout(_notify, msTimeout);
-    }
-    else
-    {
-        notify_notification_update(_notify, tr("Spark\\ Store").toLocal8Bit(), message.toLocal8Bit(), icon.toLocal8Bit());
-    }
-
-    notify_notification_show(_notify, nullptr);
-}
-
-void Widget::sendNotification(const char *message, const int msTimeout, const QString &icon)
-{
-    if(_notify == nullptr)
-    {
-        _notify = notify_notification_new(tr("Spark\\ Store").toLocal8Bit(), message, icon.toLocal8Bit());
-        notify_notification_set_timeout(_notify, msTimeout);
-    }
-    else
-    {
-        notify_notification_update(_notify, tr("Spark\\ Store").toLocal8Bit(), message, icon.toLocal8Bit());
-    }
-
-    notify_notification_show(_notify, nullptr);
-}
-
-void Widget::initDbus()
-{
-    DBusSparkStoreService *dbusInter = new DBusSparkStoreService(this);
-
-    QDBusConnection::sessionBus().registerService("com.gitee.spark.store");
-    QDBusConnection::sessionBus().registerObject("/com/gitee/spark/store", "com.gitee.spark.store", this);
-    connect(dbusInter,&DBusSparkStoreService::sigOpenUrl,this,&Widget::onGetUrl);
-}
-
-void Widget::updateUI()
-{
-    if(themeIsDark)
-    {
-        left_list[0]->setIcon(QIcon(":/icons/icons/homepage_dark.svg"));
-        left_list[1]->setIcon(QIcon(":/icons/icons/category_network_dark.svg"));
-        left_list[2]->setIcon(QIcon(":/icons/icons/category_chat_dark.svg"));
-        left_list[3]->setIcon(QIcon(":/icons/icons/category_music_dark.svg"));
-        left_list[4]->setIcon(QIcon(":/icons/icons/category_video_dark.svg"));
-        left_list[5]->setIcon(QIcon(":/icons/icons/category_graphic_dark.svg"));
-        left_list[6]->setIcon(QIcon(":/icons/icons/category_game_dark.svg"));
-        left_list[7]->setIcon(QIcon(":/icons/icons/category_office_dark.svg"));
-        left_list[8]->setIcon(QIcon(":/icons/icons/category_reading_dark.svg"));
-        left_list[9]->setIcon(QIcon(":/icons/icons/category_develop_dark.svg"));
-        left_list[10]->setIcon(QIcon(":/icons/icons/category_system_dark.svg"));
-        left_list[11]->setIcon(QIcon(":/icons/icons/theme-symbolic_dark.svg"));
-        left_list[12]->setIcon(QIcon(":/icons/icons/category_others_dark.svg"));
-        left_list[13]->setIcon(QIcon(":/icons/icons/upgrades-symbolic_dark.svg"));
-        left_list[14]->setIcon(QIcon(":/icons/icons/downloads-symbolic_dark.svg"));
-    }
-    else
-    {
-        left_list[0]->setIcon(QIcon(":/icons/icons/homepage.svg"));
-        left_list[1]->setIcon(QIcon(":/icons/icons/category_network.svg"));
-        left_list[2]->setIcon(QIcon(":/icons/icons/category_chat.svg"));
-        left_list[3]->setIcon(QIcon(":/icons/icons/category_music.svg"));
-        left_list[4]->setIcon(QIcon(":/icons/icons/category_video.svg"));
-        left_list[5]->setIcon(QIcon(":/icons/icons/category_graphic.svg"));
-        left_list[6]->setIcon(QIcon(":/icons/icons/category_game.svg"));
-        left_list[7]->setIcon(QIcon(":/icons/icons/category_office.svg"));
-        left_list[8]->setIcon(QIcon(":/icons/icons/category_reading.svg"));
-        left_list[9]->setIcon(QIcon(":/icons/icons/category_develop.svg"));
-        left_list[10]->setIcon(QIcon(":/icons/icons/category_system.svg"));
-        left_list[11]->setIcon(QIcon(":/icons/icons/theme-symbolic.svg"));
-        left_list[12]->setIcon(QIcon(":/icons/icons/category_others.svg"));
-        left_list[13]->setIcon(QIcon(":/icons/icons/upgrades-symbolic.svg"));
-        left_list[14]->setIcon(QIcon(":/icons/icons/downloads-symbolic.svg"));
-    }
-
-    for(int i = 0; i < 15; i++)
-    {
-        /* 设置左侧菜单字体
-         * QFont temp = font;
-         * temp.setPixelSize(15);
-         * left_list[i]->setFont(temp);
-         */
-
-        QFont temp;
-        temp.setFamily(temp.defaultFamily());
-        left_list[i]->setFont(temp);
-        left_list[i]->setFixedHeight(38);
-        if(themeIsDark)
-        {
-            // 中文环境菜单文字居中,其他则左对齐
-            if(QLocale::system().name() == "zh_CN")
-            {
-                left_list[i]->setStyleSheet("color: #FFFFFF; border: 0px;");
-            }
-            else
-            {
-                left_list[i]->setStyleSheet("color: #FFFFFF; border: 0px; text-align: left; padding-left: 15px;");
-            }
-        }
-        else
-        {
-            if(QLocale::system().name() == "zh_CN")
-            {
-                left_list[i]->setStyleSheet("color: #252525; border: 0px;");
-            }
-            else
-            {
-                left_list[i]->setStyleSheet("color: #252525; border: 0px; text-align: left; padding-left: 15px;");
-            }
-        }
-    }
-
-    if(QLocale::system().name() == "zh_CN")
-    {
-        left_list[nowMenu]->setStyleSheet("color: #FFFFFF; background-color: " + main_color.name() + "; border-radius: 8; border: 0px;");
-    }
-    else
-    {
-        left_list[nowMenu]->setStyleSheet("color: #FFFFFF; background-color: " + main_color.name() + "; border-radius: 8; border: 0px; text-align: left; padding-left: 15px;");
-    }
-
-    switch (nowMenu)
-    {
-    case 0:
-        left_list[0]->setIcon(QIcon(":/icons/icons/homepage_dark.svg"));
-        break;
-    case 1:
-        left_list[1]->setIcon(QIcon(":/icons/icons/category_network_dark.svg"));
-        break;
-    case 2:
-        left_list[2]->setIcon(QIcon(":/icons/icons/category_chat_dark.svg"));
-        break;
-    case 3:
-        left_list[3]->setIcon(QIcon(":/icons/icons/category_music_dark.svg"));
-        break;
-    case 4:
-        left_list[4]->setIcon(QIcon(":/icons/icons/category_video_dark.svg"));
-        break;
-    case 5:
-        left_list[5]->setIcon(QIcon(":/icons/icons/category_graphic_dark.svg"));
-        break;
-    case 6:
-        left_list[6]->setIcon(QIcon(":/icons/icons/category_game_dark.svg"));
-        break;
-    case 7:
-        left_list[7]->setIcon(QIcon(":/icons/icons/category_office_dark.svg"));
-        break;
-    case 8:
-        left_list[8]->setIcon(QIcon(":/icons/icons/category_reading_dark.svg"));
-        break;
-    case 9:
-        left_list[9]->setIcon(QIcon(":/icons/icons/category_develop_dark.svg"));
-        break;
-    case 10:
-        left_list[10]->setIcon(QIcon(":/icons/icons/category_system_dark.svg"));
-        break;
-    case 11:
-        left_list[11]->setIcon(QIcon(":/icons/icons/theme-symbolic_dark.svg"));
-        break;
-    case 12:
-        left_list[12]->setIcon(QIcon(":/icons/icons/category_others_dark.svg"));
-        break;
-    case 13:
-        left_list[13]->setIcon(QIcon(":/icons/icons/upgrades-symbolic_dark.svg"));
-        break;
-    case 14:
-        left_list[14]->setIcon(QIcon(":/icons/icons/downloads-symbolic_dark.svg"));
-        break;
-    }
-}
-
-// 菜单切换逻辑
-void Widget::chooseLeftMenu(int index)
-{
-    nowMenu = index;
-
-    // 菜单切换时,清除搜索栏的内容
-    if(!searchEdit->text().isEmpty())
-    {
-        searchEdit->clear();
-    }
-
-    updateUI();
-
-    if (index <= 12)
-    {
-        if (themeIsDark)
-        {
-            QString darkurl = menuUrl[index].toString();
-            QStringList list = darkurl.split("/");
-            darkurl.clear();
-            for (int i = 0; i < list.size() - 1; i++)
-            {
-                darkurl += list[i] + "/";
-            }
-            darkurl += "dark" + list[list.size() - 1];
-            ui->webEngineView->setUrl(darkurl);
-            qDebug() << darkurl;
-        }
-        else
-        {
-            ui->webEngineView->setUrl(menuUrl[index]);
-        }
-
-        ui->stackedWidget->setCurrentIndex(0);
-    }
-    else if (index == 13){
-        QFile upgradeStatus("/tmp/spark-store/upgradeStatus.txt");
-        if (!upgradeStatus.exists()){
-            QtConcurrent::run([=]{
-                auto upgradeP = new QProcess();
-                upgradeP->startDetached("/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade.sh");
-                upgradeP->waitForStarted();
-                upgradeP->waitForFinished(-1);
-            });
-        }
-        ui->stackedWidget->setCurrentIndex(0);
-    }
-    else
-    {
-        ui->stackedWidget->setCurrentIndex(1);
-    }
-}
-
-void Widget::setfoot(int h)
-{
-    foot = h;
-}
-
-//void Widget::updatefoot()
-//{
-//    int allh = ui->stackedWidget->height();
-//    ui->webfoot->setFixedHeight(allh - foot);
-//}
-
-void Widget::on_pushButton_download_clicked()
-{
-    chooseLeftMenu(14);
-
-    allDownload += 1;
-
-    QFileInfo info(url.path());
-    QString fileName(info.fileName());  // 获取文件名
-    download_list[allDownload - 1].pkgName = pkgName;
-    if(fileName.isEmpty())
-    {
-        sendNotification(tr("Failed to get the name to the file to be downloaded."));
-        return;
-    }
-
-    download_list[allDownload - 1].setParent(ui->listWidget);
-    QListWidgetItem *item = new QListWidgetItem(ui->listWidget);
-    item->setSizeHint(download_list[allDownload - 1].size());
-    item->setFlags(item->flags() & ~Qt::ItemIsEnabled & ~Qt::ItemIsSelectable);
-    ui->listWidget->setItemWidget(item, &download_list[allDownload - 1]);
-    urList.append(url);
-    download_list[allDownload - 1].setName(appName);
-    download_list[allDownload - 1].setFileName(fileName);
-
-    QPixmap icon;
-    icon.load("/tmp/spark-store/icon.png", "PNG");
-    system("cp /tmp/spark-store/icon.png /tmp/spark-store/icon_" + QString::number(allDownload - 1).toUtf8() + ".png");
-    download_list[allDownload - 1].seticon(icon);
-
-    if(!isBusy)
-    {
-        /*
-        file = new QFile(fileName);
-        if(!file->open(QIODevice::WriteOnly))
-        {
-            delete file;
-            file = nullptr;
-            return;
-        }
-        */
-
-        nowDownload += 1;
-        startRequest(urList.at(nowDownload - 1), fileName);     // 进行链接请求
-    }
-
-    if(ui->pushButton_download->text() == tr("Reinstall"))
-    {
-        download_list[allDownload - 1].reinstall = true;
-    }
-}
-
-void Widget::startRequest(QUrl url, QString fileName)
-{
-    ui->listWidget->show();
-    ui->label->hide();
-    isBusy = true;
-    isdownload = true;
-    download_list[allDownload - 1].free = false;
-
-    downloadController = new DownloadController(this);  // 并发下载,在点击下载按钮的时候才会初始化
-    connect(downloadController, &DownloadController::downloadProcess, this, &Widget::updateDataReadProgress);
-    connect(downloadController, &DownloadController::downloadFinished, this, &Widget::httpFinished);
-    connect(downloadController, &DownloadController::errorOccur, this, [=](QString msg){this->sendNotification(msg);});
-    downloadController->setFilename(fileName);
-    downloadController->startDownload(url.toString());
-}
-
-void Widget::searchApp(QString text)
-{
-    if(text.left(6) == "spk://")
-    {
-        openUrl(text);
-        searchEdit->clearEdit();
-    }
-    else
-    {
-        // 禁止同时进行多次搜索
-        if (!mutex.tryLock())
-        {
-            qDebug() << "Do not repeat searches!";
-            sendNotification(tr("Do not repeat searches!"));
-            return;
-        }
-
-        //加载动画
-//        spinner->show();
-//        spinner->start();
-
-//        // 关键字搜索处理
-//        httpClient->get("https://search.deepinos.org.cn/appinfo/search")
-//            .header("content-type", "application/json")
-//            .queryParam("keyword", text)
-//            .onResponse([this](QByteArray result)
-//                        {
-//            auto json = QJsonDocument::fromJson(result).array();
-//            if (json.empty())
-//            {
-//                qDebug() << "相关应用未找到!";
-//                sendNotification(tr("Relative apps Not Found!"));
-//                mutex.unlock();
-//                clearSearchApp();
-//                spinner->stop();
-//                spinner->hide();
-//                ui->stackedWidget->setCurrentIndex(0);
-//                ui->webEngineView->setUrl(QUrl("https://wayou.github.io/t-rex-runner"));
-//                return;
-//            }
-//            clearSearchApp();
-//            displaySearchApp(json); })
-//            .onError([this](QString errorStr)
-//                     {
-//            qDebug()  << "请求出错:" << errorStr;
-//            sendNotification(QString(tr("Request Error: %1")).arg(errorStr));
-//            mutex.unlock();
-//            return; })
-//            .timeout(10 * 1000)
-//            .exec();
-
-        if (!themeIsDark){
-            ui->webEngineView->setUrl(serverUrl + "store/#/search?keywords=" + text);
-        }else{
-            ui->webEngineView->setUrl(serverUrl + "store/#/darksearch?keywords=" + text);
-        }
-//        spinner->stop();
-//        spinner->hide();
-        mutex.unlock();
-
-
-    }
-}
-
-void Widget::closeEvent(QCloseEvent *event)
-{
-    mutex.unlock();
-    httpClient->deleteLater();
-}
-
-/**
- * @brief 清除搜索的APP信息
- */
-void Widget::clearSearchApp()
-{
-    ui->stackedWidget->setCurrentIndex(4);
-
-    // 清除原有的搜索结果
-    QLayoutItem *item = nullptr;
-    while((item = applist_grid->takeAt(0)) != nullptr)
-    {
-        applist_grid->removeWidget(item->widget());
-        item->widget()->disconnect();
-        item->widget()->setParent(nullptr);
-        delete item;
-    }
-
-    main->removeItem(applist_grid);
-}
-/**
- * @brief 展示搜索的APP信息
- */
-void Widget::displaySearchApp(QJsonArray array)
-{
-    
-    
-
-    for(int i = 0; i < array.size(); i++)
-    {
-        QJsonObject appInfo = array.at(i).toObject();
-        AppItem *appItem = new AppItem(this);
-        appItem->setAttribute(Qt::WA_DeleteOnClose);
-        QString url = QString("spk://store/%1/%2")
-                .arg(appInfo["category_slug"].toString())
-                .arg(appInfo["pkgname"].toString());
-        appItem->setTitle(appInfo["name"].toString());
-        appItem->setDescription(appInfo["more"].toString());
-        appItem->setIcon(appInfo["icon"].toString());
-        appItem->setUrl(url);
-        applist_grid->addWidget(appItem);
-        qDebug() << "应用链接为:" << url;
-
-        connect(appItem, &AppItem::clicked, this, &Widget::openUrl);
-        connect(appItem, &AppItem::clicked, this, [=](){prePage = ui->stackedWidget->currentIndex();});
-        connect(appItem, &AppItem::finished, this, [=]()
-        {
-            count++;
-            downloadIconsFinished(array.size());
-        });
-    }
-}
-
-void Widget::downloadIconsFinished(int arraysize)
-{
-    // 当前搜索列表图标全部加载完成后才允许下一次搜索
-    if(count == arraysize)
-    {
-        spinner->stop();
-        spinner->hide();
-        main->addLayout(applist_grid, 1);
-        count = 0;
-        mutex.unlock();
-    }
-}
-
-void Widget::httpReadyRead()
-{
-    if(file)
-    {
-        file->write(reply->readAll());
-    }
-}
-
-void Widget::updateDataReadProgress(QString speedInfo, qint64 bytesRead, qint64 totalBytes)
-{
-    if(totalBytes <= 0)
-    {
-        return;
-    }
-    theSpeed = speedInfo;
-    download_list[nowDownload - 1].setMax(10000);   // 最大值
-    download_list[nowDownload - 1].setValue(int(bytesRead * 100 / totalBytes) * 100);  // 当前值
-    download_size = bytesRead;
-    if(download_list[nowDownload - 1].close)
-    {
-        // 随时检测下载是否被取消
-        downloadController->disconnect();
-        downloadController->stopDownload();
-        download_list[nowDownload - 1].closeDownload();
-        httpFinished();
-    }
-}
-
-void Widget::sltAppinfoResetUi()
-{
-    // 先隐藏详情页负责显示截图的 label
-    ui->screen_0->hide();
-    ui->screen_1->hide();
-    ui->screen_2->hide();
-    ui->screen_3->hide();
-    ui->screen_4->hide();
-    ui->label_appicon->clear();
-    ui->tag_community->hide();
-    ui->tag_ubuntu->hide();
-    ui->tag_deepin->hide();
-    ui->tag_uos->hide();
-    ui->tag_dtk5->hide();
-    ui->tag_dwine2->hide();
-    ui->tag_dwine5->hide();
-    ui->tag_a2d->hide();
-
-    // 重置 UI 状态
-    ui->pushButton_uninstall->hide();
-    ui->pushButton_website->setEnabled(false);
-    ui->pushButton->setEnabled(false);
-    ui->pushButton_update->setEnabled(false);
-    ui->label_show->setText("Loading...");
-    ui->label_show->show();
-}
-
-void Widget::sltAppinfoTags(QStringList *tagList)
-{
-    foreach(const QString &tag, *tagList)
-    {
-        if(tag=="community")
-        {
-            ui->tag_community->show();
-        }
-        else if(tag=="ubuntu")
-        {
-            ui->tag_ubuntu->show();
-        }
-        else if(tag=="deepin")
-        {
-            ui->tag_deepin->show();
-        }
-        else if(tag=="uos")
-        {
-            ui->tag_uos->show();
-        }
-        else if(tag=="dtk5")
-        {
-            ui->tag_dtk5->show();
-        }
-        else if(tag=="dwine2")
-        {
-            ui->tag_dwine2->show();
-        }
-        else if(tag=="dwine5")
-        {
-            ui->tag_dwine5->show();
-        }
-        else if(tag=="a2d")
-        {
-            ui->tag_a2d->show();
-        }
-    }
-}
-
-void Widget::sltAppinfoDetails(QString *name, QString *details, QString *info,
-                               QString *website, QString *packageName, QUrl *fileUrl,
-                               bool isInstalled, bool isUpdated)
-{
-    ui->label_appname->setText(appName = *name);
-    ui->label_appname->show();
-    ui->label_info->setText(*details);
-    ui->label_info->show();
-    ui->label_more->setText(*info);
-    ui->label_more->show();
-
-    pkgName = *packageName;
-    url = *fileUrl;
-    appweb = *website;
-
-    if(isInstalled)
-    {
-        if(isUpdated)
-        {
-            ui->pushButton_download->setText(tr("Reinstall"));
-            ui->pushButton_uninstall->show();
-        }
-        else
-        {
-            ui->pushButton_download->setText(tr("Upgrade"));
-            ui->pushButton_uninstall->show();
-        }
-    }
-    else
-    {
-        ui->pushButton_download->setText(tr("Install"));
-    }
-}
-
-void Widget::sltAppinfoIcon(QPixmap *icon)
-{
-    ui->label_appicon->setPixmap(*icon);
-    ui->label_appicon->show();
-    ui->pushButton_download->setEnabled(true);
-    ui->pushButton->setEnabled(true);
-    ui->pushButton_update->setEnabled(true);
-    ui->pushButton_website->setEnabled(true);
-}
-
-void Widget::sltAppinfoScreenshot(QPixmap *picture, int index)
-{
-    if(picture != nullptr)
-    {
-        screen[index] = *picture;
-        label_screen[index]->setImage(*picture);
-        label_screen[index]->show();
-
-        switch(index)
-        {
-        // 故意为之,为了清除多余截图
-        case 0:
-            label_screen[1]->hide();
-        case 1:
-            label_screen[2]->hide();
-        case 2:
-            label_screen[3]->hide();
-        case 3:
-            label_screen[4]->hide();
-        }
-    }
-}
-
-void Widget::sltAppinfoFinish()
-{
-    ui->label_show->clear();
-    ui->label_show->hide();
-}
-
-void Widget::httpFinished() // 完成下载
-{
-    isdownload = false;
-    isBusy = false;
-    download_list[nowDownload - 1].readyInstall();
-    download_list[nowDownload - 1].free = true;
-    if(nowDownload < allDownload)
-    {
-
-        // 如果有排队则下载下一个
-        qDebug() << "切换下一个下载...";
-        nowDownload += 1;
-        while(download_list[nowDownload - 1].close)
-        {
-            nowDownload += 1;
-        }
-        QString fileName = download_list[nowDownload - 1].getName();
-        startRequest(urList.at(nowDownload-1), fileName);
-    }
-}
-
-void Widget::on_pushButton_return_clicked()
-{
-    appinfoLoadThread.requestInterruption();
-
-    // 检测是否是从搜索页面进入到应用详情页的,根据搜索栏是否有关键词判断
-    if (searchEdit->text().isEmpty())
-    {
-        if(ui->stackedWidget->currentIndex() == 2)
-        {
-            ui->webEngineView->back();
-            ui->stackedWidget->setCurrentIndex(0);
-        }
-        else
-        {
-            ui->stackedWidget->setCurrentIndex(prePage);
-        }
-    }
-    else
-    {
-        if (ui->stackedWidget->currentIndex() == 4)
-        {
-            searchEdit->clear();
-            chooseLeftMenu(nowMenu);
-        }
-        else if(ui->stackedWidget->currentIndex() == 2)
-        {
-            ui->stackedWidget->setCurrentIndex(4);
-        }
-        else
-        {
-            ui->stackedWidget->setCurrentIndex(prePage);
-        }
-
-        if(ui->stackedWidget->currentIndex() == 4)
-        {
-            searchApp(searchEdit->text());
-        }
-    }
-}
-
-void Widget::on_pushButton_refresh_clicked()
-{
-    // 如果在详情页面要重新触发 UrlChanged
-    if(ui->stackedWidget->currentIndex() == 2)
-    {
-        emit ui->webEngineView->urlChanged(ui->webEngineView->url());
-    }
-    else
-    {
-        ui->webEngineView->reload();
-    }
-}
-
-void Widget::on_comboBox_server_currentIndexChanged(const QString &arg1)
-{
-    appinfoLoadThread.setServer(arg1);  // 服务器信息更新
-
-    const QString updatedInfo = "TRUE";
-    if(configCanSave)
-    {
-        // ui->label_setting1->show();
-        QSettings *setConfig = new QSettings(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat);
-        setConfig->setValue("server/choose", arg1);
-        setConfig->setValue("server/updated", updatedInfo);
-        setConfig->deleteLater();
-    }
-}
-
-void Widget::on_pushButton_updateServer_clicked()
-{
-    QtConcurrent::run([=]()
-    {
-        ui->pushButton_updateServer->setEnabled(false);
-        ui->comboBox_server->clear();
-
-        QFile::remove(QDir::homePath().toUtf8() + "/.config/spark-store/server.list");
-        system("curl -o " + QDir::homePath().toUtf8() + "/.config/spark-store/server.list https://d.store.deepinos.org.cn/store/server-and-mirror.list");
-        std::fstream server;
-        server.open(QDir::homePath().toUtf8() + "/.config/spark-store/server.list", std::ios::in);
-        std::string lineTmp;
-        if(server)
-        {
-            while(getline(server, lineTmp))
-            {
-                ui->comboBox_server->addItem(QString::fromStdString(lineTmp));
-            }
-        }
-        else
-        {
-            ui->comboBox_server->addItem("https://d.store.deepinos.org.cn/");
-        }
-
-        ui->pushButton_updateServer->setEnabled(true);
-        ui->comboBox_server->setCurrentIndex(0);
-
-        for(int i = 0; i < ui->comboBox_server->count(); i++)
-        {
-            if(ui->comboBox_server->itemText(i) == "开发者模式 Dev only")
-            {
-                ui->comboBox_server->model()->setData(ui->comboBox_server->model()->index(i, 0), QVariant(0), Qt::UserRole - 1);
-            }
-            if(ui->comboBox_server->itemText(i) == "镜像源 Download only")
-            {
-                for(int j = i; j < ui->comboBox_server->count(); j++)
-                {
-                    ui->comboBox_server->model()->setData(ui->comboBox_server->model()->index(j, 0), QVariant(0), Qt::UserRole - 1);
-                }
-                break;
-            }
-        }
-    });
-}
-
-void Widget::on_pushButton_updateApt_clicked()
-{
-    QtConcurrent::run([=]()
-    {
-        ui->pushButton_updateApt->setEnabled(false);
-        ui->label_aptserver->setText(tr("Updating, please wait..."));
-
-        QString storeSpk = "spk://store/tools/spark-store";
-        openUrl(storeSpk);
-        ui->label_aptserver->setText(tr(""));
-
-        ui->pushButton_updateApt->setEnabled(true);
-      });
-
-}
-
-void Widget::on_pushButton_uninstall_clicked()
-{
-    QtConcurrent::run([=]()
-    {
-        ui->pushButton_download->setEnabled(false);
-        ui->pushButton_uninstall->setEnabled(false);
-
-        QProcess uninstall;
-        uninstall.start("pkexec", QStringList() << "apt" << "purge" << "-y" << pkgName.toLower());
-        uninstall.waitForFinished(-1); // 默认无限时长
-
-        QProcess check;
-        check.start("dpkg", QStringList() << "-s" << pkgName.toLower());
-        check.waitForFinished(180); // 默认超时 3 分钟
-
-        if (check.readAllStandardOutput().isEmpty())
-        {
-            ui->pushButton_download->setText(tr("Install"));
-            ui->pushButton_uninstall->hide();
-
-            updatesEnabled();
-            sendNotification(tr("Uninstall succeeded"));
-        }
-
-        ui->pushButton_download->setEnabled(true);
-        ui->pushButton_uninstall->setEnabled(true);
-    });
-}
-
-void Widget::on_pushButton_clear_clicked()  // 清空临时缓存目录
-{
-    QtConcurrent::run([=]()
-    {
-        ui->pushButton_clear->setEnabled(false);
-
-        QDir tmpdir("/tmp/spark-store");
-        tmpdir.setFilter(QDir::Files);
-        int quantity = int(tmpdir.count());
-        for(int i = 0; i < quantity; i++)
-        {
-            tmpdir.remove(tmpdir[i]);
-        }
-
-        sendNotification(tr("Temporary cache was cleaned"));
-        ui->pushButton_clear->setEnabled(true);
-        Widget::opensetting();
-    });
-}
-
-void Widget::on_pushButton_clearWebCache_clicked()
-{
-    QtConcurrent::run([=]()
-                      {
-
-        QString dataLocal = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation);
-        QDir cacheDir(dataLocal );
-        cacheDir.removeRecursively(); });
-}
-
-quint64 Widget::dirFileSize(const QString &path)
-{
-    QDir dir(path);
-    quint64 size = 0;
-    // dir.entryInfoList(QDir::Files);  // 返回文件信息
-    foreach(QFileInfo fileInfo, dir.entryInfoList(QDir::Files))
-    {
-        // 计算文件大小
-        size += quint64(fileInfo.size());
-    }
-    // dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot);  // 返回所有子目录,并进行过滤
-    foreach(QString subDir, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot))
-    {
-        // 若存在子目录,则递归调用 dirFileSize() 函数
-        size += dirFileSize(path + QDir::separator() + subDir);
-    }
-    return size;
-}
-
-void Widget::opensetting()
-{
-    // 防止下载时文件被删除
-    if(isdownload)
-    {
-        ui->pushButton_clear->setEnabled(false);
-    }
-    else
-    {
-        ui->pushButton_clear->setEnabled(true);
-    }
-
-    // 显示缓存占用空间
-    quint64 tmp_size = dirFileSize(QString::fromUtf8(TMP_PATH));
-    QString tmp_size_str;
-    if(tmp_size < 1024)
-    {
-        tmp_size_str = QString::number(tmp_size) + "B";
-    }
-    else if(tmp_size < (1024 * 1024))
-    {
-        tmp_size_str = QString::number(0.01 * int(100 * (tmp_size / 1024))) + "KB";
-    }
-    else if(tmp_size<(1024*1024*1024))
-    {
-        tmp_size_str = QString::number(0.01 * int(100 * (tmp_size / (1024 * 1024)))) + "MB";
-    }
-    else
-    {
-        tmp_size_str = QString::number(0.01 * int(100 * (tmp_size / (1024 * 1024 * 1024)))) + "GB";
-    }
-
-    ui->tmp_size_ui->setText(tmp_size_str);
-    prePage = ui->stackedWidget->currentIndex();
-    ui->stackedWidget->setCurrentIndex(3);
-}
-
-void Widget::openUrl(QUrl url)
-{
-    QString app = serverUrl + "store" + url.path() + "/app.json";
-    // ui->webEngineView->setUrl(app);
-    emit ui->webEngineView->urlChanged(app);
-}
-
-void Widget::on_pushButton_website_clicked()
-{
-    QDesktopServices::openUrl(QUrl(appweb));
-}
-
-void Widget::on_pushButton_clicked()
-{
-    QString share_url;
-    share_url = "spk://store/" + type_name + "/" + pkgName;
-    qDebug() << "Share" << share_url;
-
-    QClipboard *clipboard = QApplication::clipboard();
-    clipboard->setText(share_url);
-    sendNotification(tr("The URL has been copied to the clipboard"));
-}
-
-void Widget::on_btn_openDir_clicked()
-{
-    QDesktopServices::openUrl(QUrl("file:///tmp/spark-store", QUrl::TolerantMode));
-}
-
-void Widget::on_stackedWidget_currentChanged(int arg1)
-{
-    qDebug() << arg1;
-    if(arg1 == 0 || arg1 == 1)
-    {
-        ui->pushButton_return->setEnabled(false);
-    }
-    else
-    {
-        ui->pushButton_return->setEnabled(true);
-    }
-}
-
-void Widget::on_webEngineView_urlChanged(const QUrl &arg1)
-{
-    //分析出服务器中的分类名称
-    QStringList url_ = arg1.path().replace("//", "/").split("/");
-    QString pname;
-    qDebug() << "URL size:" << url_.size();
-    if (url_.size() > 3)
-    {
-        type_name = url_[2];
-        pname = url_[3];
-    }
-    qDebug() << "type_name:" << type_name << ";pname" << pname;
-
-    //如果是app.json就打开详情页
-    if(arg1.path().right(8) == "app.json")
-    {
-        prePage = ui->stackedWidget->currentIndex();
-
-        load.cancel();  // 打开并发加载线程前关闭正在执行的线程
-        m_loadweb->setValue(0);
-
-        ui->label_more->clear();    // 清空详情介绍
-        ui->label_info->clear();
-        ui->label_appname->clear();
-        ui->pushButton_download->setEnabled(false);
-        ui->stackedWidget->setCurrentIndex(2);
-        
-        qDebug() << "程序跳转链接地址:" << arg1;
-        QString url = arg1.toString();
-
-        /*
-        load.cancel();  // 打开并发加载线程前关闭正在执行的线程
-        load = QtConcurrent::run([=]()
-        {
-            int loadresult = loadappinfo(arg1);
-        });
-        */
-        appinfoLoadThread.requestInterruption();
-        appinfoLoadThread.wait(100);
-        appinfoLoadThread.setUrl(url.replace("+","%2B")); //对+进行转译,避免oss出错
-        appinfoLoadThread.start();
-    }
-}
-
-void Widget::on_webEngineView_loadStarted()
-{
-    m_loadweb->setValue(0);
-    m_loadweb->show();
-    m_loaderror->hide();
-    ui->label_show->hide();
-}
-
-void Widget::on_webEngineView_loadProgress(int progress)
-{
-    m_loadweb->setValue(progress);
-    if(progress >= 90)
-    {
-        m_loadweb->setValue(0);
-    }
-}
-
-void Widget::on_webEngineView_loadFinished(bool arg1)
-{
-    if(arg1)
-    {
-        m_loadweb->setValue(0);
-    }
-    else
-    {
-        m_loadweb->setValue(0);
-        m_loaderror->show();
-    }
-}
-
-void Widget::on_pushButton_update_clicked()
-{
-    QString feedbackSpk = "spk://store/chat/store.spark-app.feedback";
-    QFile actionSubmissionClientStatus("/opt/durapps/store.spark-app.feedback");
-    if (actionSubmissionClientStatus.exists())
-    {
-        qDebug() << "反馈器存在";
-        QProcess::startDetached("sh /opt/durapps/store.spark-app.feedback/launch.sh");
-    }
-    else{
-        qDebug() << "反馈器不存在,跳转页面";
-        openUrl(feedbackSpk);
-    }
-}
-
-void Widget::onGetUrl(const QString &url)
-{
-    if(url.left(6)=="spk://")
-    {
-        openUrl(QUrl(url));
-    }
-    activateWindow();
-}
-
diff --git a/src/widget.h b/src/widget.h
deleted file mode 100644
index 1d3be50..0000000
--- a/src/widget.h
+++ /dev/null
@@ -1,177 +0,0 @@
-#ifndef WIDGET_H
-#define WIDGET_H
-
-#include <QWidget>
-#include <QFile>
-#include <QNetworkReply>
-#include <QNetworkAccessManager>
-
-#include <QJsonObject>
-#include <QProcess>
-#include <QFuture>
-#include <QFutureWatcher>
-#include <QToolButton>
-#include <QTimer>
-#include <QJsonArray>
-#include <QFontDatabase>
-#include <QMutex>
-
-#include <DBlurEffectWidget>
-#include <DTitlebar>
-#include <DSearchEdit>
-#include <DSettings>
-#include <DSpinner>
-#include <DWaterProgress>
-
-#include "image_show.h"
-#include "downloadlist.h"
-#include "progressload.h"
-#include "workerthreads.h"
-
-#define LIST_MAX 99 // 一次最多下载数量
-#define TMP_PATH "/tmp/spark-store"
-
-DWIDGET_USE_NAMESPACE
-
-namespace Ui {
-class Widget;
-}
-
-class FlowLayout;
-class DownloadController;
-
-namespace AeaQt {
-class HttpClient;
-}
-class Widget : public DBlurEffectWidget
-{
-    Q_OBJECT
-
-public:
-    explicit Widget(DBlurEffectWidget *parent = nullptr);
-    ~Widget();
-
-    void startRequest(QUrl url, QString fileName);
-    void searchApp(QString);
-    int nowDownload = 0;
-    int allDownload = 0;
-    int isdownload = false;
-    void opensetting(); //打开设置页面
-    void openUrl(QUrl);
-    void setTheme(bool,QColor);
-    DTitlebar* getTitlebar();
-
-    static void sendNotification(const QString &message, const int msTimeout = 5000, const QString &icon = "spark-store");
-    static void sendNotification(const char *message, const int msTimeout = 5000, const QString &icon = "spark-store");
-
-    void initDbus();
-private slots:
-
-    void httpFinished();
-    void httpReadyRead();
-    void updateDataReadProgress(QString, qint64, qint64);
-
-    // SpkAppInfoLoaderThread的槽函数
-    void sltAppinfoResetUi();
-    void sltAppinfoTags(QStringList *tagList);
-    void sltAppinfoDetails(QString *name, QString *details, QString *info,
-                           QString *website, QString *packageName,
-                           QUrl *fileUrl, bool isInstalled,
-                           bool isUpdated);
-    void sltAppinfoIcon(QPixmap *icon);
-    void sltAppinfoScreenshot(QPixmap *picture, int index);
-    void sltAppinfoFinish();
-
-    void clearSearchApp(); // 清除搜索的APP信息
-    void displaySearchApp(QJsonArray array); // 展示搜索的APP信息
-    void downloadIconsFinished(int arraysize); // 当前搜索列表图标是否下载完成
-
-    void on_pushButton_download_clicked();
-    void on_pushButton_return_clicked();
-    void on_comboBox_server_currentIndexChanged(const QString &arg1);
-    void on_pushButton_updateServer_clicked();
-    void on_pushButton_updateApt_clicked();
-    void on_pushButton_uninstall_clicked();
-    void on_pushButton_clear_clicked();
-    void on_pushButton_clearWebCache_clicked();
-    void on_pushButton_website_clicked();
-    void on_pushButton_clicked();
-    void on_btn_openDir_clicked();
-    void on_stackedWidget_currentChanged(int arg1);
-    void on_webEngineView_urlChanged(const QUrl &arg1);
-    void on_webEngineView_loadStarted();
-    void on_webEngineView_loadProgress(int progress);
-    void on_webEngineView_loadFinished(bool arg1);
-    void on_pushButton_refresh_clicked();
-    void on_pushButton_update_clicked();
-
-    //接受来自dbus的url
-    void onGetUrl(const QString &url);
-
-  public:
-    QUrl url;
-    QString cdnSeverUrl;
-
-    downloadlist download_list[LIST_MAX];
-    Ui::Widget *ui;
-    QNetworkAccessManager *manager;
-    QNetworkReply *reply;
-    QList<QUrl> urList;
-    QFile *file;
-    QString appName;
-    QString urladdress;
-    QString pkgName;
-    QString appweb;
-    bool themeIsDark;
-
-    QFont font;
-
-private:
-    void initUI();
-    void initConfig();
-    void chooseLeftMenu(int index);
-    void setfoot(int);
-    // void updatefoot();
-    void updateUI();
-    void closeEvent(QCloseEvent *event);
-
-    quint64 dirFileSize(const QString &path);
-
-private:
-    QPushButton * left_list[15];
-    QUrl menuUrl[13];
-    ProgressLoad *m_loadweb;
-    QLabel *m_loaderror = new QLabel;
-    QString serverUrl;
-    bool configCanSave = false;
-    bool isBusy = false;
-    int nowMenu = 0;    // 定位当前菜单
-    int prePage = 0;    // 定位前一个页面
-    long download_size = 0;
-    long size1 = 0;
-    long size2 = 0;
-    QPixmap screen[5];
-    QFuture<void> load;
-    QFutureWatcher<void> watchScreenshotLoad;
-    QTimer download_speed;
-    QString theSpeed;
-    QString type_name;
-    QColor main_color;
-    int foot;
-    DSearchEdit *searchEdit = new DSearchEdit;
-    DTitlebar *titlebar;
-    DSpinner *spinner = new DSpinner;
-
-    int count = 0;  // 记录当前搜索列表下载图标完成的个数
-    QMutex mutex;   // 禁止多次搜索事件同时发生
-
-    QList<image_show*> label_screen;
-    SpkAppInfoLoaderThread appinfoLoadThread;
-
-    AeaQt::HttpClient *httpClient;
-    FlowLayout *applist_grid;
-    QHBoxLayout *main;
-    DownloadController *downloadController;
-};
-
-#endif // WIDGET_H
diff --git a/src/widget.ui b/src/widget.ui
deleted file mode 100644
index df4d437..0000000
--- a/src/widget.ui
+++ /dev/null
@@ -1,1483 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Widget</class>
- <widget class="QWidget" name="Widget">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>1053</width>
-    <height>754</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Form</string>
-  </property>
-  <layout class="QGridLayout" name="gridLayout_2">
-   <property name="leftMargin">
-    <number>0</number>
-   </property>
-   <property name="topMargin">
-    <number>0</number>
-   </property>
-   <property name="rightMargin">
-    <number>0</number>
-   </property>
-   <property name="bottomMargin">
-    <number>0</number>
-   </property>
-   <property name="spacing">
-    <number>0</number>
-   </property>
-   <item row="1" column="1">
-    <widget class="ProgressLoad" name="progressload" native="true">
-     <property name="minimumSize">
-      <size>
-       <width>0</width>
-       <height>3</height>
-      </size>
-     </property>
-     <property name="maximumSize">
-      <size>
-       <width>16777215</width>
-       <height>3</height>
-      </size>
-     </property>
-     <property name="toolTipDuration">
-      <number>-1</number>
-     </property>
-     <property name="styleSheet">
-      <string notr="true"/>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="1">
-    <widget class="QStackedWidget" name="stackedWidget">
-     <property name="styleSheet">
-      <string notr="true"/>
-     </property>
-     <property name="lineWidth">
-      <number>0</number>
-     </property>
-     <property name="currentIndex">
-      <number>0</number>
-     </property>
-     <widget class="QWidget" name="page">
-      <layout class="QVBoxLayout" name="verticalLayout_4">
-       <property name="spacing">
-        <number>0</number>
-       </property>
-       <property name="leftMargin">
-        <number>0</number>
-       </property>
-       <property name="topMargin">
-        <number>0</number>
-       </property>
-       <property name="rightMargin">
-        <number>0</number>
-       </property>
-       <property name="bottomMargin">
-        <number>0</number>
-       </property>
-       <item>
-        <layout class="QVBoxLayout" name="page1MainLayout">
-         <property name="spacing">
-          <number>0</number>
-         </property>
-         <item>
-          <widget class="WebEngineView" name="webEngineView" native="true"/>
-         </item>
-        </layout>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="page_2">
-      <layout class="QVBoxLayout" name="verticalLayout_2">
-       <property name="spacing">
-        <number>0</number>
-       </property>
-       <property name="leftMargin">
-        <number>0</number>
-       </property>
-       <property name="topMargin">
-        <number>0</number>
-       </property>
-       <property name="rightMargin">
-        <number>0</number>
-       </property>
-       <property name="bottomMargin">
-        <number>0</number>
-       </property>
-       <item>
-        <widget class="QLabel" name="label">
-         <property name="font">
-          <font>
-           <pointsize>14</pointsize>
-          </font>
-         </property>
-         <property name="styleSheet">
-          <string notr="true"/>
-         </property>
-         <property name="lineWidth">
-          <number>0</number>
-         </property>
-         <property name="text">
-          <string>The list is currently empty. Go and download some softwares!</string>
-         </property>
-         <property name="alignment">
-          <set>Qt::AlignCenter</set>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <widget class="QListWidget" name="listWidget">
-         <property name="frameShape">
-          <enum>QFrame::NoFrame</enum>
-         </property>
-         <property name="frameShadow">
-          <enum>QFrame::Sunken</enum>
-         </property>
-         <property name="lineWidth">
-          <number>0</number>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <widget class="QPushButton" name="btn_openDir">
-         <property name="maximumSize">
-          <size>
-           <width>16777215</width>
-           <height>30</height>
-          </size>
-         </property>
-         <property name="focusPolicy">
-          <enum>Qt::NoFocus</enum>
-         </property>
-         <property name="text">
-          <string>Open download directory</string>
-         </property>
-        </widget>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="page_3">
-      <layout class="QVBoxLayout" name="verticalLayout_16">
-       <property name="spacing">
-        <number>0</number>
-       </property>
-       <property name="leftMargin">
-        <number>0</number>
-       </property>
-       <property name="topMargin">
-        <number>0</number>
-       </property>
-       <property name="rightMargin">
-        <number>0</number>
-       </property>
-       <property name="bottomMargin">
-        <number>0</number>
-       </property>
-       <item>
-        <widget class="QScrollArea" name="scrollArea">
-         <property name="styleSheet">
-          <string notr="true"/>
-         </property>
-         <property name="frameShape">
-          <enum>QFrame::NoFrame</enum>
-         </property>
-         <property name="frameShadow">
-          <enum>QFrame::Raised</enum>
-         </property>
-         <property name="lineWidth">
-          <number>0</number>
-         </property>
-         <property name="widgetResizable">
-          <bool>true</bool>
-         </property>
-         <widget class="QWidget" name="scrollAreaWidgetContents">
-          <property name="geometry">
-           <rect>
-            <x>0</x>
-            <y>0</y>
-            <width>889</width>
-            <height>853</height>
-           </rect>
-          </property>
-          <layout class="QVBoxLayout" name="verticalLayout_17">
-           <property name="spacing">
-            <number>0</number>
-           </property>
-           <item>
-            <widget class="QWidget" name="widget_3" native="true">
-             <property name="maximumSize">
-              <size>
-               <width>16777215</width>
-               <height>350</height>
-              </size>
-             </property>
-             <property name="autoFillBackground">
-              <bool>true</bool>
-             </property>
-             <layout class="QGridLayout" name="gridLayout">
-              <item row="3" column="0">
-               <spacer name="horizontalSpacer">
-                <property name="orientation">
-                 <enum>Qt::Horizontal</enum>
-                </property>
-                <property name="sizeType">
-                 <enum>QSizePolicy::Maximum</enum>
-                </property>
-                <property name="sizeHint" stdset="0">
-                 <size>
-                  <width>70</width>
-                  <height>20</height>
-                 </size>
-                </property>
-               </spacer>
-              </item>
-              <item row="3" column="2">
-               <spacer name="horizontalSpacer_2">
-                <property name="orientation">
-                 <enum>Qt::Horizontal</enum>
-                </property>
-                <property name="sizeType">
-                 <enum>QSizePolicy::Maximum</enum>
-                </property>
-                <property name="sizeHint" stdset="0">
-                 <size>
-                  <width>60</width>
-                  <height>20</height>
-                 </size>
-                </property>
-               </spacer>
-              </item>
-              <item row="5" column="1">
-               <widget class="QPushButton" name="pushButton_download">
-                <property name="text">
-                 <string>Install</string>
-                </property>
-               </widget>
-              </item>
-              <item row="0" column="3" colspan="2">
-               <widget class="QLabel" name="label_appname">
-                <property name="font">
-                 <font>
-                  <family>Bitstream Charter</family>
-                  <pointsize>22</pointsize>
-                 </font>
-                </property>
-                <property name="text">
-                 <string>Name</string>
-                </property>
-                <property name="textInteractionFlags">
-                 <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
-                </property>
-               </widget>
-              </item>
-              <item row="3" column="3" rowspan="5" colspan="8">
-               <widget class="QLabel" name="label_info">
-                <property name="font">
-                 <font>
-                  <kerning>true</kerning>
-                 </font>
-                </property>
-                <property name="text">
-                 <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-                </property>
-                <property name="alignment">
-                 <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
-                </property>
-                <property name="wordWrap">
-                 <bool>true</bool>
-                </property>
-                <property name="textInteractionFlags">
-                 <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
-                </property>
-               </widget>
-              </item>
-              <item row="3" column="1">
-               <widget class="QLabel" name="label_appicon">
-                <property name="minimumSize">
-                 <size>
-                  <width>128</width>
-                  <height>128</height>
-                 </size>
-                </property>
-                <property name="maximumSize">
-                 <size>
-                  <width>128</width>
-                  <height>128</height>
-                 </size>
-                </property>
-                <property name="styleSheet">
-                 <string notr="true">border-radius:10px;</string>
-                </property>
-                <property name="text">
-                 <string>ICON</string>
-                </property>
-                <property name="scaledContents">
-                 <bool>true</bool>
-                </property>
-                <property name="alignment">
-                 <set>Qt::AlignCenter</set>
-                </property>
-               </widget>
-              </item>
-              <item row="0" column="10">
-               <spacer name="horizontalSpacer_6">
-                <property name="orientation">
-                 <enum>Qt::Horizontal</enum>
-                </property>
-                <property name="sizeHint" stdset="0">
-                 <size>
-                  <width>40</width>
-                  <height>20</height>
-                 </size>
-                </property>
-               </spacer>
-              </item>
-              <item row="7" column="1" rowspan="2">
-               <spacer name="verticalSpacer_2">
-                <property name="orientation">
-                 <enum>Qt::Vertical</enum>
-                </property>
-                <property name="sizeHint" stdset="0">
-                 <size>
-                  <width>20</width>
-                  <height>40</height>
-                 </size>
-                </property>
-               </spacer>
-              </item>
-              <item row="4" column="1">
-               <spacer name="verticalSpacer_3">
-                <property name="orientation">
-                 <enum>Qt::Vertical</enum>
-                </property>
-                <property name="sizeType">
-                 <enum>QSizePolicy::Fixed</enum>
-                </property>
-                <property name="sizeHint" stdset="0">
-                 <size>
-                  <width>20</width>
-                  <height>20</height>
-                 </size>
-                </property>
-               </spacer>
-              </item>
-              <item row="6" column="1">
-               <widget class="QPushButton" name="pushButton_uninstall">
-                <property name="text">
-                 <string>Uninstall</string>
-                </property>
-               </widget>
-              </item>
-              <item row="0" column="6">
-               <widget class="QPushButton" name="pushButton_website">
-                <property name="maximumSize">
-                 <size>
-                  <width>70</width>
-                  <height>16777215</height>
-                 </size>
-                </property>
-                <property name="styleSheet">
-                 <string notr="true"/>
-                </property>
-                <property name="text">
-                 <string>Site</string>
-                </property>
-               </widget>
-              </item>
-              <item row="2" column="3">
-               <spacer name="verticalSpacer_6">
-                <property name="orientation">
-                 <enum>Qt::Vertical</enum>
-                </property>
-                <property name="sizeType">
-                 <enum>QSizePolicy::Fixed</enum>
-                </property>
-                <property name="sizeHint" stdset="0">
-                 <size>
-                  <width>20</width>
-                  <height>20</height>
-                 </size>
-                </property>
-               </spacer>
-              </item>
-              <item row="0" column="5">
-               <spacer name="horizontalSpacer_7">
-                <property name="orientation">
-                 <enum>Qt::Horizontal</enum>
-                </property>
-                <property name="sizeType">
-                 <enum>QSizePolicy::Fixed</enum>
-                </property>
-                <property name="sizeHint" stdset="0">
-                 <size>
-                  <width>10</width>
-                  <height>20</height>
-                 </size>
-                </property>
-               </spacer>
-              </item>
-              <item row="0" column="8">
-               <widget class="QPushButton" name="pushButton">
-                <property name="text">
-                 <string>Share</string>
-                </property>
-               </widget>
-              </item>
-              <item row="1" column="3" colspan="8">
-               <widget class="QWidget" name="widget" native="true">
-                <property name="minimumSize">
-                 <size>
-                  <width>0</width>
-                  <height>30</height>
-                 </size>
-                </property>
-                <layout class="QHBoxLayout" name="horizontalLayout_2">
-                 <property name="leftMargin">
-                  <number>0</number>
-                 </property>
-                 <property name="topMargin">
-                  <number>0</number>
-                 </property>
-                 <property name="rightMargin">
-                  <number>0</number>
-                 </property>
-                 <property name="bottomMargin">
-                  <number>0</number>
-                 </property>
-                 <item>
-                  <widget class="QLabel" name="tag_community">
-                   <property name="maximumSize">
-                    <size>
-                     <width>30</width>
-                     <height>16777215</height>
-                    </size>
-                   </property>
-                   <property name="toolTip">
-                    <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This app is developed by community user,we give this tag to honor those who contribute to the Linux Ecology&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-                   </property>
-                   <property name="whatsThis">
-                    <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This app is developed by community user,we give this tag to honor those who contribute to the Linux Ecology&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-                   </property>
-                   <property name="text">
-                    <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/community-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-                   </property>
-                  </widget>
-                 </item>
-                 <item>
-                  <widget class="QLabel" name="tag_ubuntu">
-                   <property name="maximumSize">
-                    <size>
-                     <width>30</width>
-                     <height>16777215</height>
-                    </size>
-                   </property>
-                   <property name="toolTip">
-                    <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to Ubuntu 22.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-                   </property>
-                   <property name="whatsThis">
-                    <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to Ubuntu 22.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-                   </property>
-                   <property name="text">
-                    <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/ubuntu-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-                   </property>
-                  </widget>
-                 </item>
-                 <item>
-                  <widget class="QLabel" name="tag_deepin">
-                   <property name="maximumSize">
-                    <size>
-                     <width>30</width>
-                     <height>16777215</height>
-                    </size>
-                   </property>
-                   <property name="toolTip">
-                    <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to deepin 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-                   </property>
-                   <property name="whatsThis">
-                    <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to deepin 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-                   </property>
-                   <property name="text">
-                    <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/deepin-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-                   </property>
-                  </widget>
-                 </item>
-                 <item>
-                  <widget class="QLabel" name="tag_uos">
-                   <property name="maximumSize">
-                    <size>
-                     <width>30</width>
-                     <height>16777215</height>
-                    </size>
-                   </property>
-                   <property name="toolTip">
-                    <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to UOS home 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-                   </property>
-                   <property name="whatsThis">
-                    <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to UOS home 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-                   </property>
-                   <property name="text">
-                    <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/uos-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-                   </property>
-                  </widget>
-                 </item>
-                 <item>
-                  <widget class="QLabel" name="tag_dtk5">
-                   <property name="maximumSize">
-                    <size>
-                     <width>30</width>
-                     <height>16777215</height>
-                    </size>
-                   </property>
-                   <property name="toolTip">
-                    <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This is a  DTK5 app,which means it would have better effect on Deepin Desktop Environment&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-                   </property>
-                   <property name="whatsThis">
-                    <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This is a  DTK5 app,which means it would have better effect on Deepin Desktop Environment&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-                   </property>
-                   <property name="text">
-                    <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dtk-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-                   </property>
-                  </widget>
-                 </item>
-                 <item>
-                  <widget class="QLabel" name="tag_dwine2">
-                   <property name="maximumSize">
-                    <size>
-                     <width>30</width>
-                     <height>16777215</height>
-                    </size>
-                   </property>
-                   <property name="toolTip">
-                    <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine2 app. Spark Store will configure the wine environment for you, so don‘t worry.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-                   </property>
-                   <property name="whatsThis">
-                    <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine2 app.If you are using ubuntu or other non-deepin distro,you should deploy deepin-wine2 by your self.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-                   </property>
-                   <property name="text">
-                    <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine2-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-                   </property>
-                  </widget>
-                 </item>
-                 <item>
-                  <widget class="QLabel" name="tag_dwine5">
-                   <property name="maximumSize">
-                    <size>
-                     <width>30</width>
-                     <height>16777215</height>
-                    </size>
-                   </property>
-                   <property name="toolTip">
-                    <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine5 app.Spark Store will configure the wine environment for you, so don‘t worry.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-                   </property>
-                   <property name="whatsThis">
-                    <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine5 app.If you are using ubuntu or other non-deepin distro,you should deploy deepin-wine5 by your self.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-                   </property>
-                   <property name="text">
-                    <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine5-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-                   </property>
-                  </widget>
-                 </item>
-                 <item>
-                  <widget class="QLabel" name="tag_a2d">
-                   <property name="maximumSize">
-                    <size>
-                     <width>30</width>
-                     <height>16777215</height>
-                    </size>
-                   </property>
-                   <property name="toolTip">
-                    <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;An Appimage to deb app.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-                   </property>
-                   <property name="whatsThis">
-                    <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;An Appimage to deb app.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-                   </property>
-                   <property name="text">
-                    <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/a2d-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-                   </property>
-                  </widget>
-                 </item>
-                 <item>
-                  <spacer name="horizontalSpacer_10">
-                   <property name="orientation">
-                    <enum>Qt::Horizontal</enum>
-                   </property>
-                   <property name="sizeHint" stdset="0">
-                    <size>
-                     <width>40</width>
-                     <height>20</height>
-                    </size>
-                   </property>
-                  </spacer>
-                 </item>
-                </layout>
-               </widget>
-              </item>
-              <item row="0" column="9">
-               <widget class="QPushButton" name="pushButton_update">
-                <property name="text">
-                 <string>Request Update</string>
-                </property>
-               </widget>
-              </item>
-             </layout>
-            </widget>
-           </item>
-           <item>
-            <widget class="QWidget" name="widget_5" native="true">
-             <layout class="QVBoxLayout" name="verticalLayout_19">
-              <item>
-               <widget class="QLabel" name="label_10">
-                <property name="font">
-                 <font>
-                  <pointsize>14</pointsize>
-                 </font>
-                </property>
-                <property name="text">
-                 <string>Info</string>
-                </property>
-               </widget>
-              </item>
-              <item>
-               <widget class="QLabel" name="label_more">
-                <property name="text">
-                 <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;An app store developed by community enthusiasts&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-                </property>
-                <property name="alignment">
-                 <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
-                </property>
-                <property name="wordWrap">
-                 <bool>true</bool>
-                </property>
-                <property name="textInteractionFlags">
-                 <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
-                </property>
-               </widget>
-              </item>
-             </layout>
-            </widget>
-           </item>
-           <item>
-            <widget class="QWidget" name="widget_4" native="true">
-             <property name="minimumSize">
-              <size>
-               <width>0</width>
-               <height>370</height>
-              </size>
-             </property>
-             <property name="maximumSize">
-              <size>
-               <width>16777215</width>
-               <height>370</height>
-              </size>
-             </property>
-             <layout class="QVBoxLayout" name="verticalLayout_18">
-              <property name="bottomMargin">
-               <number>0</number>
-              </property>
-              <item>
-               <widget class="QLabel" name="label_9">
-                <property name="font">
-                 <font>
-                  <pointsize>14</pointsize>
-                 </font>
-                </property>
-                <property name="text">
-                 <string>Screenshots</string>
-                </property>
-               </widget>
-              </item>
-              <item>
-               <widget class="QScrollArea" name="scrollArea_appicture">
-                <property name="lineWidth">
-                 <number>0</number>
-                </property>
-                <property name="widgetResizable">
-                 <bool>true</bool>
-                </property>
-                <widget class="QWidget" name="scrollAreaWidgetContents_2">
-                 <property name="geometry">
-                  <rect>
-                   <x>0</x>
-                   <y>0</y>
-                   <width>851</width>
-                   <height>324</height>
-                  </rect>
-                 </property>
-                 <layout class="QHBoxLayout" name="horizontalLayout_4">
-                  <item>
-                   <widget class="image_show" name="screen_0" native="true">
-                    <property name="minimumSize">
-                     <size>
-                      <width>0</width>
-                      <height>0</height>
-                     </size>
-                    </property>
-                    <property name="maximumSize">
-                     <size>
-                      <width>400</width>
-                      <height>16777215</height>
-                     </size>
-                    </property>
-                   </widget>
-                  </item>
-                  <item>
-                   <widget class="image_show" name="screen_1" native="true">
-                    <property name="maximumSize">
-                     <size>
-                      <width>400</width>
-                      <height>16777215</height>
-                     </size>
-                    </property>
-                   </widget>
-                  </item>
-                  <item>
-                   <widget class="image_show" name="screen_2" native="true">
-                    <property name="maximumSize">
-                     <size>
-                      <width>400</width>
-                      <height>16777215</height>
-                     </size>
-                    </property>
-                   </widget>
-                  </item>
-                  <item>
-                   <widget class="image_show" name="screen_3" native="true">
-                    <property name="maximumSize">
-                     <size>
-                      <width>400</width>
-                      <height>16777215</height>
-                     </size>
-                    </property>
-                   </widget>
-                  </item>
-                  <item>
-                   <widget class="image_show" name="screen_4" native="true">
-                    <property name="maximumSize">
-                     <size>
-                      <width>400</width>
-                      <height>16777215</height>
-                     </size>
-                    </property>
-                   </widget>
-                  </item>
-                 </layout>
-                </widget>
-               </widget>
-              </item>
-             </layout>
-            </widget>
-           </item>
-           <item>
-            <spacer name="verticalSpacer_5">
-             <property name="orientation">
-              <enum>Qt::Vertical</enum>
-             </property>
-             <property name="sizeHint" stdset="0">
-              <size>
-               <width>20</width>
-               <height>40</height>
-              </size>
-             </property>
-            </spacer>
-           </item>
-          </layout>
-         </widget>
-        </widget>
-       </item>
-       <item>
-        <widget class="QLabel" name="label_show">
-         <property name="text">
-          <string/>
-         </property>
-         <property name="alignment">
-          <set>Qt::AlignCenter</set>
-         </property>
-        </widget>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="page_4">
-      <layout class="QVBoxLayout" name="verticalLayout">
-       <property name="leftMargin">
-        <number>0</number>
-       </property>
-       <property name="topMargin">
-        <number>0</number>
-       </property>
-       <property name="rightMargin">
-        <number>0</number>
-       </property>
-       <property name="bottomMargin">
-        <number>0</number>
-       </property>
-       <item>
-        <widget class="QScrollArea" name="scrollArea_2">
-         <property name="styleSheet">
-          <string notr="true"/>
-         </property>
-         <property name="frameShape">
-          <enum>QFrame::NoFrame</enum>
-         </property>
-         <property name="lineWidth">
-          <number>0</number>
-         </property>
-         <property name="widgetResizable">
-          <bool>true</bool>
-         </property>
-         <widget class="QWidget" name="scrollAreaWidgetContents_3">
-          <property name="geometry">
-           <rect>
-            <x>0</x>
-            <y>0</y>
-            <width>743</width>
-            <height>839</height>
-           </rect>
-          </property>
-          <layout class="QVBoxLayout" name="verticalLayout_23">
-           <item>
-            <widget class="QWidget" name="widget_6" native="true">
-             <layout class="QVBoxLayout" name="verticalLayout_22">
-              <item>
-               <widget class="QLabel" name="label_2">
-                <property name="font">
-                 <font>
-                  <pointsize>18</pointsize>
-                 </font>
-                </property>
-                <property name="text">
-                 <string>Line Settings</string>
-                </property>
-               </widget>
-              </item>
-              <item>
-               <widget class="QWidget" name="widget_7" native="true">
-                <layout class="QHBoxLayout" name="horizontalLayout">
-                 <item>
-                  <widget class="QLabel" name="label_3">
-                   <property name="maximumSize">
-                    <size>
-                     <width>100</width>
-                     <height>16777215</height>
-                    </size>
-                   </property>
-                   <property name="text">
-                    <string>Choose Line:</string>
-                   </property>
-                  </widget>
-                 </item>
-                 <item>
-                  <widget class="QComboBox" name="comboBox_server">
-                   <property name="minimumSize">
-                    <size>
-                     <width>300</width>
-                     <height>0</height>
-                    </size>
-                   </property>
-                   <property name="maximumSize">
-                    <size>
-                     <width>300</width>
-                     <height>16777215</height>
-                    </size>
-                   </property>
-                  </widget>
-                 </item>
-                 <item>
-                  <widget class="QPushButton" name="pushButton_updateServer">
-                   <property name="text">
-                    <string>Refresh</string>
-                   </property>
-                  </widget>
-                 </item>
-                 <item>
-                  <widget class="QLabel" name="label_setting1">
-                   <property name="maximumSize">
-                    <size>
-                     <width>160</width>
-                     <height>16777215</height>
-                    </size>
-                   </property>
-                   <property name="text">
-                    <string>Take effect when restart</string>
-                   </property>
-                  </widget>
-                 </item>
-                 <item>
-                  <spacer name="horizontalSpacer_3">
-                   <property name="orientation">
-                    <enum>Qt::Horizontal</enum>
-                   </property>
-                   <property name="sizeHint" stdset="0">
-                    <size>
-                     <width>40</width>
-                     <height>20</height>
-                    </size>
-                   </property>
-                  </spacer>
-                 </item>
-                </layout>
-               </widget>
-              </item>
-              <item>
-               <widget class="QWidget" name="widget_8" native="true">
-                <layout class="QGridLayout" name="gridLayout_3">
-                 <item row="1" column="0" colspan="4">
-                  <widget class="QLabel" name="label_7">
-                   <property name="styleSheet">
-                    <string notr="true">color:#808080</string>
-                   </property>
-                   <property name="text">
-                    <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Check update for Spark Store. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-                   </property>
-                   <property name="wordWrap">
-                    <bool>true</bool>
-                   </property>
-                  </widget>
-                 </item>
-                 <item row="0" column="2">
-                  <widget class="QPushButton" name="pushButton_updateApt">
-                   <property name="text">
-                    <string>Update</string>
-                   </property>
-                  </widget>
-                 </item>
-                 <item row="0" column="0">
-                  <widget class="QLabel" name="label_6">
-                   <property name="text">
-                    <string>Spark Store Update</string>
-                   </property>
-                  </widget>
-                 </item>
-                 <item row="0" column="3">
-                  <spacer name="horizontalSpacer_4">
-                   <property name="orientation">
-                    <enum>Qt::Horizontal</enum>
-                   </property>
-                   <property name="sizeHint" stdset="0">
-                    <size>
-                     <width>40</width>
-                     <height>20</height>
-                    </size>
-                   </property>
-                  </spacer>
-                 </item>
-                 <item row="0" column="1">
-                  <widget class="QLabel" name="label_aptserver">
-                   <property name="text">
-                    <string>Server</string>
-                   </property>
-                  </widget>
-                 </item>
-                </layout>
-               </widget>
-              </item>
-             </layout>
-            </widget>
-           </item>
-           <item>
-            <widget class="QWidget" name="widget_9" native="true">
-             <layout class="QVBoxLayout" name="verticalLayout_26">
-              <item>
-               <widget class="QLabel" name="label_8">
-                <property name="font">
-                 <font>
-                  <pointsize>18</pointsize>
-                 </font>
-                </property>
-                <property name="text">
-                 <string>Temp</string>
-                </property>
-               </widget>
-              </item>
-              <item>
-               <widget class="QWidget" name="widget_10" native="true">
-                <layout class="QGridLayout" name="gridLayout_4">
-                 <item row="2" column="0" colspan="5">
-                  <widget class="QLabel" name="label_12">
-                   <property name="styleSheet">
-                    <string notr="true">color:#808080</string>
-                   </property>
-                   <property name="text">
-                    <string>Since the dictionary is at /tmp,It would be cleaned automatically when  system reboot.</string>
-                   </property>
-                  </widget>
-                 </item>
-                 <item row="1" column="1">
-                  <widget class="QLabel" name="tmp_size_ui">
-                   <property name="text">
-                    <string>0B</string>
-                   </property>
-                  </widget>
-                 </item>
-                 <item row="0" column="0" colspan="2">
-                  <widget class="QLabel" name="label_11">
-                   <property name="text">
-                    <string>Location:/tmp/spark-store</string>
-                   </property>
-                  </widget>
-                 </item>
-                 <item row="0" column="4">
-                  <spacer name="horizontalSpacer_5">
-                   <property name="orientation">
-                    <enum>Qt::Horizontal</enum>
-                   </property>
-                   <property name="sizeHint" stdset="0">
-                    <size>
-                     <width>40</width>
-                     <height>20</height>
-                    </size>
-                   </property>
-                  </spacer>
-                 </item>
-                 <item row="0" column="2">
-                  <widget class="QPushButton" name="pushButton_clear">
-                   <property name="text">
-                    <string>Clean</string>
-                   </property>
-                  </widget>
-                 </item>
-                 <item row="1" column="0">
-                  <widget class="QLabel" name="label_13">
-                   <property name="maximumSize">
-                    <size>
-                     <width>80</width>
-                     <height>16777215</height>
-                    </size>
-                   </property>
-                   <property name="text">
-                    <string>Size:</string>
-                   </property>
-                  </widget>
-                 </item>
-                 <item row="0" column="3">
-                  <widget class="QPushButton" name="pushButton_clearWebCache">
-                   <property name="text">
-                    <string>Clear Web Cache</string>
-                   </property>
-                  </widget>
-                 </item>
-                </layout>
-               </widget>
-              </item>
-             </layout>
-            </widget>
-           </item>
-           <item>
-            <widget class="QWidget" name="widget_2" native="true">
-             <layout class="QVBoxLayout" name="verticalLayout_25">
-              <item>
-               <widget class="QLabel" name="label_4">
-                <property name="font">
-                 <font>
-                  <pointsize>18</pointsize>
-                 </font>
-                </property>
-                <property name="text">
-                 <string>About us</string>
-                </property>
-               </widget>
-              </item>
-              <item>
-               <widget class="QLabel" name="label_5">
-                <property name="text">
-                 <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;We are &lt;span style=&quot; font-weight:600;&quot;&gt;NOT&lt;/span&gt; the official team, just like you, we are just one of the many Linux/deepin system enthusiasts and users, we develop and run the &amp;quot;Spark Store&amp;quot;! &amp;quot;, is to bring the community together to share useful software, or to participate in development together, so that we all use the latest and greatest software. &lt;/p&gt;&lt;p&gt;We don't make a profit from this, all developers and maintainers don't get paid, and we rely on the community's donations to us for most of our expenses, which we are grateful for and which allow us not to spend too much energy worrying about funding. &lt;/p&gt;&lt;p&gt;Our service and software are free for everyone to use, communicate, and learn, but you must comply with local laws and regulations in the process of your use, otherwise any problems have nothing to do with us. &lt;/p&gt;&lt;p&gt;If any part of the store infringes your rights, please tell us &amp;lt;jifengshenmo@outlook.com&amp;gt; we will remove the infringing content as soon as possible. &lt;/p&gt;&lt;p&gt;If you'd like to get involved with us too, whether you're involved in development, design, pitching or submitting work, we welcome you to join us. &lt;/p&gt;&lt;p&gt;Connect us on Spark IM: https://chat.shenmo.tech&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-                </property>
-                <property name="wordWrap">
-                 <bool>true</bool>
-                </property>
-               </widget>
-              </item>
-             </layout>
-            </widget>
-           </item>
-           <item>
-            <spacer name="verticalSpacer_4">
-             <property name="orientation">
-              <enum>Qt::Vertical</enum>
-             </property>
-             <property name="sizeHint" stdset="0">
-              <size>
-               <width>20</width>
-               <height>40</height>
-              </size>
-             </property>
-            </spacer>
-           </item>
-          </layout>
-         </widget>
-        </widget>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="applist_page">
-      <layout class="QVBoxLayout" name="verticalLayout_3">
-       <property name="spacing">
-        <number>0</number>
-       </property>
-       <property name="leftMargin">
-        <number>0</number>
-       </property>
-       <property name="topMargin">
-        <number>0</number>
-       </property>
-       <property name="rightMargin">
-        <number>0</number>
-       </property>
-       <property name="bottomMargin">
-        <number>0</number>
-       </property>
-       <item>
-        <widget class="QScrollArea" name="applist_scrollarea">
-         <property name="enabled">
-          <bool>true</bool>
-         </property>
-         <property name="frameShape">
-          <enum>QFrame::NoFrame</enum>
-         </property>
-         <property name="widgetResizable">
-          <bool>true</bool>
-         </property>
-         <widget class="QWidget" name="applist_scrollAreaWidget">
-          <property name="geometry">
-           <rect>
-            <x>0</x>
-            <y>0</y>
-            <width>100</width>
-            <height>30</height>
-           </rect>
-          </property>
-         </widget>
-        </widget>
-       </item>
-      </layout>
-     </widget>
-    </widget>
-   </item>
-   <item row="0" column="0" rowspan="4">
-    <widget class="QWidget" name="widget_menuList" native="true">
-     <property name="minimumSize">
-      <size>
-       <width>150</width>
-       <height>0</height>
-      </size>
-     </property>
-     <property name="maximumSize">
-      <size>
-       <width>150</width>
-       <height>16777215</height>
-      </size>
-     </property>
-     <property name="font">
-      <font>
-       <pointsize>11</pointsize>
-      </font>
-     </property>
-     <property name="accessibleDescription">
-      <string>background-color:#FFFFFF</string>
-     </property>
-     <property name="styleSheet">
-      <string notr="true"/>
-     </property>
-     <layout class="QGridLayout" name="gridLayout_5">
-      <property name="leftMargin">
-       <number>5</number>
-      </property>
-      <property name="rightMargin">
-       <number>5</number>
-      </property>
-      <item row="13" column="0" colspan="6">
-       <widget class="QPushButton" name="menu_theme">
-        <property name="text">
-         <string>Beautify</string>
-        </property>
-       </widget>
-      </item>
-      <item row="4" column="0" colspan="6">
-       <widget class="QPushButton" name="menu_chat">
-        <property name="text">
-         <string>Chat</string>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="0">
-       <spacer name="verticalSpacer_7">
-        <property name="orientation">
-         <enum>Qt::Vertical</enum>
-        </property>
-        <property name="sizeType">
-         <enum>QSizePolicy::Fixed</enum>
-        </property>
-        <property name="sizeHint" stdset="0">
-         <size>
-          <width>20</width>
-          <height>20</height>
-         </size>
-        </property>
-       </spacer>
-      </item>
-      <item row="3" column="0" colspan="6">
-       <widget class="QPushButton" name="menu_network">
-        <property name="text">
-         <string>Network</string>
-        </property>
-       </widget>
-      </item>
-      <item row="18" column="0">
-       <spacer name="verticalSpacer">
-        <property name="orientation">
-         <enum>Qt::Vertical</enum>
-        </property>
-        <property name="sizeHint" stdset="0">
-         <size>
-          <width>20</width>
-          <height>40</height>
-         </size>
-        </property>
-       </spacer>
-      </item>
-      <item row="8" column="0" colspan="6">
-       <widget class="QPushButton" name="menu_game">
-        <property name="text">
-         <string>Games</string>
-        </property>
-       </widget>
-      </item>
-      <item row="9" column="0" colspan="6">
-       <widget class="QPushButton" name="menu_office">
-        <property name="text">
-         <string>Office</string>
-        </property>
-       </widget>
-      </item>
-      <item row="17" column="0" colspan="6">
-       <widget class="QPushButton" name="menu_download">
-        <property name="text">
-         <string>Download</string>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="3">
-       <widget class="QPushButton" name="pushButton_refresh">
-        <property name="maximumSize">
-         <size>
-          <width>40</width>
-          <height>16777215</height>
-         </size>
-        </property>
-        <property name="toolTip">
-         <string>Reload</string>
-        </property>
-        <property name="text">
-         <string/>
-        </property>
-        <property name="icon">
-         <iconset resource="../assets/icons.qrc">
-          <normaloff>:/icons/icons/refresh-page.svg</normaloff>:/icons/icons/refresh-page.svg</iconset>
-        </property>
-       </widget>
-      </item>
-      <item row="6" column="0" colspan="6">
-       <widget class="QPushButton" name="menu_video">
-        <property name="text">
-         <string>Video</string>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="4">
-       <widget class="QPushButton" name="pushButton_return">
-        <property name="maximumSize">
-         <size>
-          <width>40</width>
-          <height>16777215</height>
-         </size>
-        </property>
-        <property name="toolTip">
-         <string>Back to category</string>
-        </property>
-        <property name="text">
-         <string/>
-        </property>
-        <property name="icon">
-         <iconset resource="../assets/icons.qrc">
-          <normaloff>:/icons/icons/category_active.svg</normaloff>:/icons/icons/category_active.svg</iconset>
-        </property>
-       </widget>
-      </item>
-      <item row="12" column="0" colspan="6">
-       <widget class="QPushButton" name="menu_system">
-        <property name="text">
-         <string>Tools</string>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="0" colspan="6">
-       <widget class="QPushButton" name="menu_main">
-        <property name="styleSheet">
-         <string notr="true">font: 11pt &quot;Zeniq&quot;;</string>
-        </property>
-        <property name="text">
-         <string>Home</string>
-        </property>
-        <property name="flat">
-         <bool>false</bool>
-        </property>
-       </widget>
-      </item>
-      <item row="10" column="0" colspan="6">
-       <widget class="QPushButton" name="menu_read">
-        <property name="text">
-         <string>Reading</string>
-        </property>
-       </widget>
-      </item>
-      <item row="14" column="0" colspan="6">
-       <widget class="QPushButton" name="menu_other">
-        <property name="text">
-         <string>Others</string>
-        </property>
-       </widget>
-      </item>
-      <item row="7" column="0" colspan="6">
-       <widget class="QPushButton" name="menu_photo">
-        <property name="text">
-         <string>Graphics</string>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="0" colspan="2">
-       <widget class="QLabel" name="icon">
-        <property name="minimumSize">
-         <size>
-          <width>0</width>
-          <height>36</height>
-         </size>
-        </property>
-        <property name="maximumSize">
-         <size>
-          <width>16777215</width>
-          <height>36</height>
-         </size>
-        </property>
-        <property name="text">
-         <string>icon</string>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="2">
-       <spacer name="horizontalSpacer_9">
-        <property name="orientation">
-         <enum>Qt::Horizontal</enum>
-        </property>
-        <property name="sizeHint" stdset="0">
-         <size>
-          <width>40</width>
-          <height>20</height>
-         </size>
-        </property>
-       </spacer>
-      </item>
-      <item row="11" column="0" colspan="6">
-       <widget class="QPushButton" name="menu_dev">
-        <property name="text">
-         <string>Development</string>
-        </property>
-       </widget>
-      </item>
-      <item row="15" column="0" colspan="6">
-       <widget class="QWidget" name="line1_widget" native="true">
-        <property name="minimumSize">
-         <size>
-          <width>0</width>
-          <height>1</height>
-         </size>
-        </property>
-        <property name="maximumSize">
-         <size>
-          <width>16777215</width>
-          <height>4</height>
-         </size>
-        </property>
-        <property name="styleSheet">
-         <string notr="true">background-color:#808080</string>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="5">
-       <spacer name="horizontalSpacer_8">
-        <property name="orientation">
-         <enum>Qt::Horizontal</enum>
-        </property>
-        <property name="sizeType">
-         <enum>QSizePolicy::Fixed</enum>
-        </property>
-        <property name="sizeHint" stdset="0">
-         <size>
-          <width>3</width>
-          <height>20</height>
-         </size>
-        </property>
-       </spacer>
-      </item>
-      <item row="5" column="0" colspan="6">
-       <widget class="QPushButton" name="menu_music">
-        <property name="text">
-         <string>Music</string>
-        </property>
-       </widget>
-      </item>
-      <item row="16" column="0" colspan="6">
-       <widget class="QPushButton" name="menu_upgrade">
-        <property name="text">
-         <string>Upgrade</string>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item row="0" column="1">
-    <widget class="DTitlebar" name="titlebar" native="true">
-     <property name="minimumSize">
-      <size>
-       <width>0</width>
-       <height>20</height>
-      </size>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <customwidgets>
-  <customwidget>
-   <class>image_show</class>
-   <extends>QWidget</extends>
-   <header location="global">image_show.h</header>
-   <container>1</container>
-  </customwidget>
-  <customwidget>
-   <class>DTitlebar</class>
-   <extends>QWidget</extends>
-   <header location="global">dtitlebar.h</header>
-   <container>1</container>
-  </customwidget>
-  <customwidget>
-   <class>ProgressLoad</class>
-   <extends>QWidget</extends>
-   <header location="global">progressload.h</header>
-   <container>1</container>
-  </customwidget>
-  <customwidget>
-   <class>WebEngineView</class>
-   <extends>QWidget</extends>
-   <header location="global">webengine/webengineview.h</header>
-   <container>1</container>
-  </customwidget>
- </customwidgets>
- <resources>
-  <include location="../assets/icons.qrc"/>
- </resources>
- <connections/>
-</ui>
diff --git a/src/big_image.cpp b/src/widgets/big_image.cpp
similarity index 100%
rename from src/big_image.cpp
rename to src/widgets/big_image.cpp
diff --git a/src/big_image.h b/src/widgets/big_image.h
similarity index 100%
rename from src/big_image.h
rename to src/widgets/big_image.h
diff --git a/src/downloadlist.cpp b/src/widgets/common/downloaditem.cpp
similarity index 81%
rename from src/downloadlist.cpp
rename to src/widgets/common/downloaditem.cpp
index 8e6c7dc..903816f 100644
--- a/src/downloadlist.cpp
+++ b/src/widgets/common/downloaditem.cpp
@@ -1,230 +1,226 @@
-#include "downloadlist.h"
-#include "ui_downloadlist.h"
-
-#include <QtConcurrent>
-#include <QProcess>
-
-#include "widget.h"
-
-bool downloadlist::isInstall = false;
-
-downloadlist::downloadlist(QWidget *parent) :
-    QWidget(parent),
-    reinstall(false),
-    close(false),
-    ui(new Ui::downloadlist),
-    menu_install(new QMenu),
-    action_dpkg(new QAction),
-    action_deepin(new QAction),
-    action_gdebi(new QAction),
-    output_w(new DDialog),
-    textbrowser(new QTextBrowser)
-{
-    ui->setupUi(this);
-
-    ui->pushButton_install->setEnabled(false);
-    ui->progressBar->setValue(0);
-    ui->label_filename->hide();
-    ui->pushButton_install->hide();
-    ui->pushButton_3->hide();
-    ui->widget_spinner->start();
-    ui->widget_spinner->hide();
-    action_dpkg->setText(tr("Spark Store App Installer"));
-    action_deepin->setText(tr("deepin deb installer"));
-    action_gdebi->setText(tr("gdebi"));
-
-    connect(action_dpkg,&QAction::triggered,[=](){downloadlist::install(0);});
-    connect(action_deepin,&QAction::triggered,[=](){downloadlist::install(1);});
-    connect(action_gdebi,&QAction::triggered,[=](){downloadlist::install(2);});
-
-    // ssinstall 命令存在时再加入该选项
-    QFile ssinstall("/usr/local/bin/ssinstall");
-    ssinstall.open(QIODevice::ReadOnly);
-    if(ssinstall.isOpen())
-    {
-        menu_install->addAction(action_dpkg);
-    }
-
-//    QFile deepin("/usr/bin/deepin-deb-installer");
-//    deepin.open(QIODevice::ReadOnly);
-//    if(deepin.isOpen())
-//    {
-//        menu_install->addAction(action_deepin);
-//    }
-//    QFile gdebi("/usr/bin/gdebi");
-//    gdebi.open(QIODevice::ReadOnly);
-//    if(gdebi.isOpen())
-//    {
-//        menu_install->addAction(action_gdebi);
-//    }
-    
-}
-
-downloadlist::~downloadlist()
-{
-    delete ui;
-}
-
-void downloadlist::setValue(qint64 value)
-{
-    ui->progressBar->setValue(qint32(value));
-    ui->label_2->setText(QString::number(double(value) / 100) + "% (" + speed + ")");
-    if(ui->label_2->text().left(4) == "100%")
-    {
-        ui->label_2->setText(tr("Downloaded. Open APP Upgrade and Install Settings to enable password-free installation"));
-    }
-}
-
-void downloadlist::setMax(qint64 max)
-{
-    ui->progressBar->setMaximum(qint32(max));
-}
-
-void downloadlist::setName(QString name)
-{
-    ui->label->setText(name);
-}
-
-QString downloadlist::getName()
-{
-    return ui->label_filename->text();
-}
-
-void downloadlist::readyInstall()
-{
-    if(!close)
-    {
-        ui->progressBar->hide();
-        ui->pushButton_install->setEnabled(true);
-        ui->pushButton_install->show();
-        ui->pushButton_2->hide();
-        Widget::sendNotification(tr("Finished downloading %1, awaiting to install").arg(ui->label->text()), 5000,
-                                 "/tmp/spark-store/icon_" + QString::number(num).toUtf8() + ".png");
-    }
-}
-
-void downloadlist::setFileName(QString fileName)
-{
-    ui->label_filename->setText(fileName);
-}
-
-void downloadlist::seticon(const QPixmap icon)
-{
-    ui->label_3->setPixmap(icon);
-}
-
-void downloadlist::closeDownload()
-{
-    on_pushButton_2_clicked();
-}
-
-void downloadlist::setSpeed(QString s)
-{
-    speed = s;
-}
-
-void downloadlist::install(int t)
-{
-    if(!isInstall)
-    {
-        isInstall = true;
-        ui->pushButton_install->hide();
-        ui->widget_spinner->show();
-        qDebug() << "/tmp/spark-store/" + ui->label_filename->text().toUtf8();
-        ui->label_2->setText(tr("Installing"));
-
-        QtConcurrent::run([=]()
-        {
-            QProcess installer;
-            switch(t)
-            {
-            case 0:
-                installer.start("pkexec", QStringList() << "ssinstall" << "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
-                break;
-            case 1:
-                installer.start("deepin-deb-installer", QStringList() << "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
-                break;
-            case 2:
-                installer.start("pkexec", QStringList() << "gdebi" << "-n" << "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
-                break;
-            }
-
-            bool haveError = false;
-            bool notRoot = false;
-            installer.waitForFinished(-1); // 不设置超时
-            out = installer.readAllStandardOutput();
-
-            QStringList everyOut = out.split("\n");
-            for(int i=0;i<everyOut.size();i++)
-            {
-                if(everyOut[i].left(2) == "E:")
-                {
-                    haveError = true;
-                }
-                if(everyOut[i].right(14) == "Not authorized")
-                {
-                    notRoot = true;
-                }
-            }
-
-            QProcess isInstall;
-            isInstall.start("dpkg -s " + pkgName);
-            isInstall.waitForFinished(180); // 默认超时 3 分钟
-            int error = QString::fromStdString(isInstall.readAllStandardError().toStdString()).length();
-            if(error == 0)
-            {
-                ui->pushButton_install->hide();
-                ui->label_2->setText(tr("Finish"));
-                ui->pushButton_3->show();
-            }
-            else
-            {
-                ui->pushButton_install->show();
-                ui->pushButton_install->setText(tr("Retry"));
-                ui->label_2->setText(tr("Error happened in dpkg progress , you can try it again"));
-                ui->pushButton_3->show();
-            }
-
-            if(notRoot)
-            {
-                ui->label_2->setText(tr("dpkg progress had been aborted,you can retry installation"));
-                ui->pushButton_install->show();
-                ui->pushButton_3->hide();
-            }
-
-            ui->widget_spinner->hide();
-            downloadlist::isInstall = false;
-        });
-
-        qDebug()<<ui->label_filename->text().toUtf8();
-    }
-
-}
-
-void downloadlist::on_pushButton_install_clicked()
-{
-    // 弹出菜单
-    menu_install->exec(cursor().pos());
-}
-
-void downloadlist::on_pushButton_2_clicked()
-{
-    ui->label_2->setText(tr("Download canceled"));
-    ui->pushButton_2->setEnabled(false);
-    ui->progressBar->hide();
-    close = true;
-}
-
-void downloadlist::on_pushButton_3_clicked()
-{
-    textbrowser->setLineWidth(0);
-    textbrowser->setText(out);
-    textbrowser->setMinimumHeight(500);
-
-    output_w->setMinimumHeight(600);
-    output_w->setAttribute(Qt::WA_TranslucentBackground);
-    output_w->setTitle(ui->label->text());
-    output_w->layout()->setMargin(20);
-    output_w->layout()->addWidget(textbrowser);
-    output_w->show();
-}
+#include "downloaditem.h"
+#include "ui_downloaditem.h"
+
+#include <QtConcurrent>
+#include <QProcess>
+
+bool DownloadItem::isInstall = false;
+
+DownloadItem::DownloadItem(QWidget *parent) :
+    QWidget(parent),
+    reinstall(false),
+    close(false),
+    ui(new Ui::DownloadItem),
+    menu_install(new QMenu),
+    action_dpkg(new QAction),
+    action_deepin(new QAction),
+    action_gdebi(new QAction),
+    output_w(new DDialog),
+    textbrowser(new QTextBrowser)
+{
+    ui->setupUi(this);
+
+    ui->pushButton_install->setEnabled(false);
+    ui->progressBar->setValue(0);
+    ui->label_filename->hide();
+    ui->pushButton_install->hide();
+    ui->pushButton_3->hide();
+    ui->widget_spinner->start();
+    ui->widget_spinner->hide();
+    action_dpkg->setText(tr("Spark Store App Installer"));
+    action_deepin->setText(tr("deepin deb installer"));
+    action_gdebi->setText(tr("gdebi"));
+
+    connect(action_dpkg,&QAction::triggered,[=](){DownloadItem::install(0);});
+    connect(action_deepin,&QAction::triggered,[=](){DownloadItem::install(1);});
+    connect(action_gdebi,&QAction::triggered,[=](){DownloadItem::install(2);});
+
+    // ssinstall 命令存在时再加入该选项
+    QFile ssinstall("/usr/local/bin/ssinstall");
+    ssinstall.open(QIODevice::ReadOnly);
+    if(ssinstall.isOpen())
+    {
+        menu_install->addAction(action_dpkg);
+    }
+
+//    QFile deepin("/usr/bin/deepin-deb-installer");
+//    deepin.open(QIODevice::ReadOnly);
+//    if(deepin.isOpen())
+//    {
+//        menu_install->addAction(action_deepin);
+//    }
+//    QFile gdebi("/usr/bin/gdebi");
+//    gdebi.open(QIODevice::ReadOnly);
+//    if(gdebi.isOpen())
+//    {
+//        menu_install->addAction(action_gdebi);
+//    }
+    
+}
+
+DownloadItem::~DownloadItem()
+{
+    delete ui;
+}
+
+void DownloadItem::setValue(qint64 value)
+{
+    ui->progressBar->setValue(qint32(value));
+    ui->label_2->setText(QString::number(double(value) / 100) + "% (" + speed + ")");
+    if(ui->label_2->text().left(4) == "100%")
+    {
+        ui->label_2->setText(tr("Downloaded. Open APP Upgrade and Install Settings to enable password-free installation"));
+    }
+}
+
+void DownloadItem::setMax(qint64 max)
+{
+    ui->progressBar->setMaximum(qint32(max));
+}
+
+void DownloadItem::setName(QString name)
+{
+    ui->label->setText(name);
+}
+
+QString DownloadItem::getName()
+{
+    return ui->label_filename->text();
+}
+
+void DownloadItem::readyInstall()
+{
+    if(!close)
+    {
+        ui->progressBar->hide();
+        ui->pushButton_install->setEnabled(true);
+        ui->pushButton_install->show();
+        ui->pushButton_2->hide();
+    }
+}
+
+void DownloadItem::setFileName(QString fileName)
+{
+    ui->label_filename->setText(fileName);
+}
+
+void DownloadItem::seticon(const QPixmap icon)
+{
+    ui->label_3->setPixmap(icon);
+}
+
+void DownloadItem::closeDownload()
+{
+    on_pushButton_2_clicked();
+}
+
+void DownloadItem::setSpeed(QString s)
+{
+    speed = s;
+}
+
+void DownloadItem::install(int t)
+{
+    if(!isInstall)
+    {
+        isInstall = true;
+        ui->pushButton_install->hide();
+        ui->widget_spinner->show();
+        qDebug() << "/tmp/spark-store/" + ui->label_filename->text().toUtf8();
+        ui->label_2->setText(tr("Installing"));
+
+        QtConcurrent::run([=]()
+        {
+            QProcess installer;
+            switch(t)
+            {
+            case 0:
+                installer.start("pkexec", QStringList() << "ssinstall" << "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
+                break;
+            case 1:
+                installer.start("deepin-deb-installer", QStringList() << "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
+                break;
+            case 2:
+                installer.start("pkexec", QStringList() << "gdebi" << "-n" << "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
+                break;
+            }
+
+            bool haveError = false;
+            bool notRoot = false;
+            installer.waitForFinished(-1); // 不设置超时
+            out = installer.readAllStandardOutput();
+
+            QStringList everyOut = out.split("\n");
+            for(int i=0;i<everyOut.size();i++)
+            {
+                if(everyOut[i].left(2) == "E:")
+                {
+                    haveError = true;
+                }
+                if(everyOut[i].right(14) == "Not authorized")
+                {
+                    notRoot = true;
+                }
+            }
+
+            QProcess isInstall;
+            isInstall.start("dpkg -s " + pkgName);
+            isInstall.waitForFinished(180); // 默认超时 3 分钟
+            int error = QString::fromStdString(isInstall.readAllStandardError().toStdString()).length();
+            if(error == 0)
+            {
+                ui->pushButton_install->hide();
+                ui->label_2->setText(tr("Finish"));
+                ui->pushButton_3->show();
+            }
+            else
+            {
+                ui->pushButton_install->show();
+                ui->pushButton_install->setText(tr("Retry"));
+                ui->label_2->setText(tr("Error happened in dpkg progress , you can try it again"));
+                ui->pushButton_3->show();
+            }
+
+            if(notRoot)
+            {
+                ui->label_2->setText(tr("dpkg progress had been aborted,you can retry installation"));
+                ui->pushButton_install->show();
+                ui->pushButton_3->hide();
+            }
+
+            ui->widget_spinner->hide();
+            DownloadItem::isInstall = false;
+        });
+
+        qDebug()<<ui->label_filename->text().toUtf8();
+    }
+
+}
+
+void DownloadItem::on_pushButton_install_clicked()
+{
+    // 弹出菜单
+    menu_install->exec(cursor().pos());
+}
+
+void DownloadItem::on_pushButton_2_clicked()
+{
+    ui->label_2->setText(tr("Download canceled"));
+    ui->pushButton_2->setEnabled(false);
+    ui->progressBar->hide();
+    close = true;
+}
+
+void DownloadItem::on_pushButton_3_clicked()
+{
+    textbrowser->setLineWidth(0);
+    textbrowser->setText(out);
+    textbrowser->setMinimumHeight(500);
+
+    output_w->setMinimumHeight(600);
+    output_w->setAttribute(Qt::WA_TranslucentBackground);
+    output_w->setTitle(ui->label->text());
+    output_w->layout()->setMargin(20);
+    output_w->layout()->addWidget(textbrowser);
+    output_w->show();
+}
diff --git a/src/downloadlist.h b/src/widgets/common/downloaditem.h
similarity index 77%
rename from src/downloadlist.h
rename to src/widgets/common/downloaditem.h
index e9a8b8a..f5a7d86 100644
--- a/src/downloadlist.h
+++ b/src/widgets/common/downloaditem.h
@@ -1,5 +1,5 @@
-#ifndef DOWNLOADLIST_H
-#define DOWNLOADLIST_H
+#ifndef DOWNLOADITEM_H
+#define DOWNLOADITEM_H
 
 #include <QWidget>
 #include <QTextBrowser>
@@ -7,20 +7,19 @@
 #include <QAction>
 
 #include <DDialog>
-
 DWIDGET_USE_NAMESPACE
 
 namespace Ui {
-class downloadlist;
+class DownloadItem;
 }
 
-class downloadlist : public QWidget
+class DownloadItem : public QWidget
 {
     Q_OBJECT
 
 public:
-    explicit downloadlist(QWidget *parent = nullptr);
-    ~downloadlist();
+    explicit DownloadItem(QWidget *parent = nullptr);
+    ~DownloadItem();
 
     int num;
     bool free;
@@ -45,7 +44,7 @@ public:
     void install(int);
 
 private:
-    Ui::downloadlist *ui;
+    Ui::DownloadItem *ui;
 
     QMenu *menu_install;
     QAction *action_dpkg;
@@ -60,6 +59,8 @@ private slots:
     void on_pushButton_2_clicked();
     void on_pushButton_3_clicked();
 
+signals:
+    void finished();
 };
 
-#endif // DOWNLOADLIST_H
+#endif // DOWNLOADITEM_H
diff --git a/src/downloadlist.ui b/src/widgets/common/downloaditem.ui
similarity index 94%
rename from src/downloadlist.ui
rename to src/widgets/common/downloaditem.ui
index 9274e04..0054477 100644
--- a/src/downloadlist.ui
+++ b/src/widgets/common/downloaditem.ui
@@ -1,294 +1,294 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>downloadlist</class>
- <widget class="QWidget" name="downloadlist">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>666</width>
-    <height>54</height>
-   </rect>
-  </property>
-  <property name="maximumSize">
-   <size>
-    <width>16777215</width>
-    <height>54</height>
-   </size>
-  </property>
-  <property name="windowTitle">
-   <string>Form</string>
-  </property>
-  <property name="styleSheet">
-   <string notr="true"/>
-  </property>
-  <layout class="QHBoxLayout" name="horizontalLayout">
-   <property name="spacing">
-    <number>2</number>
-   </property>
-   <property name="leftMargin">
-    <number>4</number>
-   </property>
-   <property name="topMargin">
-    <number>4</number>
-   </property>
-   <property name="rightMargin">
-    <number>4</number>
-   </property>
-   <property name="bottomMargin">
-    <number>4</number>
-   </property>
-   <item>
-    <widget class="QLabel" name="label_3">
-     <property name="maximumSize">
-      <size>
-       <width>48</width>
-       <height>16777215</height>
-      </size>
-     </property>
-     <property name="text">
-      <string>icon</string>
-     </property>
-     <property name="scaledContents">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <spacer name="horizontalSpacer">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="sizeType">
-      <enum>QSizePolicy::Fixed</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>20</width>
-       <height>20</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item>
-    <widget class="QLabel" name="label_filename">
-     <property name="maximumSize">
-      <size>
-       <width>0</width>
-       <height>16777215</height>
-      </size>
-     </property>
-     <property name="text">
-      <string>TextLabel</string>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QLabel" name="label">
-     <property name="minimumSize">
-      <size>
-       <width>80</width>
-       <height>0</height>
-      </size>
-     </property>
-     <property name="maximumSize">
-      <size>
-       <width>16777215</width>
-       <height>16777215</height>
-      </size>
-     </property>
-     <property name="font">
-      <font>
-       <pointsize>13</pointsize>
-      </font>
-     </property>
-     <property name="text">
-      <string>Name</string>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <spacer name="horizontalSpacer_2">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="sizeType">
-      <enum>QSizePolicy::Expanding</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>20</width>
-       <height>20</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item>
-    <widget class="QWidget" name="widget" native="true">
-     <property name="minimumSize">
-      <size>
-       <width>280</width>
-       <height>0</height>
-      </size>
-     </property>
-     <property name="maximumSize">
-      <size>
-       <width>500</width>
-       <height>16777215</height>
-      </size>
-     </property>
-     <layout class="QVBoxLayout" name="verticalLayout">
-      <property name="spacing">
-       <number>2</number>
-      </property>
-      <property name="leftMargin">
-       <number>0</number>
-      </property>
-      <property name="rightMargin">
-       <number>0</number>
-      </property>
-      <property name="bottomMargin">
-       <number>0</number>
-      </property>
-      <item>
-       <widget class="QProgressBar" name="progressBar">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="minimumSize">
-         <size>
-          <width>300</width>
-          <height>0</height>
-         </size>
-        </property>
-        <property name="maximumSize">
-         <size>
-          <width>500</width>
-          <height>10</height>
-         </size>
-        </property>
-        <property name="value">
-         <number>24</number>
-        </property>
-        <property name="textVisible">
-         <bool>false</bool>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QLabel" name="label_2">
-        <property name="font">
-         <font>
-          <pointsize>9</pointsize>
-         </font>
-        </property>
-        <property name="text">
-         <string>Waiting to download</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignCenter</set>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
-    <spacer name="horizontalSpacer_3">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="sizeType">
-      <enum>QSizePolicy::Fixed</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>20</width>
-       <height>20</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item>
-    <widget class="DSpinner" name="widget_spinner" native="true">
-     <property name="minimumSize">
-      <size>
-       <width>30</width>
-       <height>0</height>
-      </size>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QPushButton" name="pushButton_install">
-     <property name="minimumSize">
-      <size>
-       <width>60</width>
-       <height>0</height>
-      </size>
-     </property>
-     <property name="maximumSize">
-      <size>
-       <width>60</width>
-       <height>16777215</height>
-      </size>
-     </property>
-     <property name="text">
-      <string>Install</string>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QPushButton" name="pushButton_2">
-     <property name="minimumSize">
-      <size>
-       <width>60</width>
-       <height>0</height>
-      </size>
-     </property>
-     <property name="maximumSize">
-      <size>
-       <width>60</width>
-       <height>16777215</height>
-      </size>
-     </property>
-     <property name="text">
-      <string>Cancel</string>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QPushButton" name="pushButton_3">
-     <property name="minimumSize">
-      <size>
-       <width>60</width>
-       <height>0</height>
-      </size>
-     </property>
-     <property name="maximumSize">
-      <size>
-       <width>60</width>
-       <height>16777215</height>
-      </size>
-     </property>
-     <property name="text">
-      <string>Info</string>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <customwidgets>
-  <customwidget>
-   <class>DSpinner</class>
-   <extends>QWidget</extends>
-   <header location="global">dspinner.h</header>
-   <container>1</container>
-  </customwidget>
- </customwidgets>
- <resources/>
- <connections/>
-</ui>
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>DownloadItem</class>
+ <widget class="QWidget" name="DownloadItem">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>666</width>
+    <height>54</height>
+   </rect>
+  </property>
+  <property name="maximumSize">
+   <size>
+    <width>16777215</width>
+    <height>54</height>
+   </size>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <property name="styleSheet">
+   <string notr="true"/>
+  </property>
+  <layout class="QHBoxLayout" name="horizontalLayout">
+   <property name="spacing">
+    <number>2</number>
+   </property>
+   <property name="leftMargin">
+    <number>4</number>
+   </property>
+   <property name="topMargin">
+    <number>4</number>
+   </property>
+   <property name="rightMargin">
+    <number>4</number>
+   </property>
+   <property name="bottomMargin">
+    <number>4</number>
+   </property>
+   <item>
+    <widget class="QLabel" name="label_3">
+     <property name="maximumSize">
+      <size>
+       <width>48</width>
+       <height>16777215</height>
+      </size>
+     </property>
+     <property name="text">
+      <string>icon</string>
+     </property>
+     <property name="scaledContents">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <spacer name="horizontalSpacer">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="sizeType">
+      <enum>QSizePolicy::Fixed</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>20</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item>
+    <widget class="QLabel" name="label_filename">
+     <property name="maximumSize">
+      <size>
+       <width>0</width>
+       <height>16777215</height>
+      </size>
+     </property>
+     <property name="text">
+      <string>TextLabel</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QLabel" name="label">
+     <property name="minimumSize">
+      <size>
+       <width>80</width>
+       <height>0</height>
+      </size>
+     </property>
+     <property name="maximumSize">
+      <size>
+       <width>16777215</width>
+       <height>16777215</height>
+      </size>
+     </property>
+     <property name="font">
+      <font>
+       <pointsize>13</pointsize>
+      </font>
+     </property>
+     <property name="text">
+      <string>Name</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <spacer name="horizontalSpacer_2">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="sizeType">
+      <enum>QSizePolicy::Expanding</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>20</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item>
+    <widget class="QWidget" name="widget" native="true">
+     <property name="minimumSize">
+      <size>
+       <width>280</width>
+       <height>0</height>
+      </size>
+     </property>
+     <property name="maximumSize">
+      <size>
+       <width>500</width>
+       <height>16777215</height>
+      </size>
+     </property>
+     <layout class="QVBoxLayout" name="verticalLayout">
+      <property name="spacing">
+       <number>2</number>
+      </property>
+      <property name="leftMargin">
+       <number>0</number>
+      </property>
+      <property name="rightMargin">
+       <number>0</number>
+      </property>
+      <property name="bottomMargin">
+       <number>0</number>
+      </property>
+      <item>
+       <widget class="QProgressBar" name="progressBar">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="minimumSize">
+         <size>
+          <width>300</width>
+          <height>0</height>
+         </size>
+        </property>
+        <property name="maximumSize">
+         <size>
+          <width>500</width>
+          <height>10</height>
+         </size>
+        </property>
+        <property name="value">
+         <number>24</number>
+        </property>
+        <property name="textVisible">
+         <bool>false</bool>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QLabel" name="label_2">
+        <property name="font">
+         <font>
+          <pointsize>9</pointsize>
+         </font>
+        </property>
+        <property name="text">
+         <string>Waiting to download</string>
+        </property>
+        <property name="alignment">
+         <set>Qt::AlignCenter</set>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <spacer name="horizontalSpacer_3">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="sizeType">
+      <enum>QSizePolicy::Fixed</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>20</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item>
+    <widget class="DSpinner" name="widget_spinner" native="true">
+     <property name="minimumSize">
+      <size>
+       <width>30</width>
+       <height>0</height>
+      </size>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QPushButton" name="pushButton_install">
+     <property name="minimumSize">
+      <size>
+       <width>60</width>
+       <height>0</height>
+      </size>
+     </property>
+     <property name="maximumSize">
+      <size>
+       <width>60</width>
+       <height>16777215</height>
+      </size>
+     </property>
+     <property name="text">
+      <string>Install</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QPushButton" name="pushButton_2">
+     <property name="minimumSize">
+      <size>
+       <width>60</width>
+       <height>0</height>
+      </size>
+     </property>
+     <property name="maximumSize">
+      <size>
+       <width>60</width>
+       <height>16777215</height>
+      </size>
+     </property>
+     <property name="text">
+      <string>Cancel</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QPushButton" name="pushButton_3">
+     <property name="minimumSize">
+      <size>
+       <width>60</width>
+       <height>0</height>
+      </size>
+     </property>
+     <property name="maximumSize">
+      <size>
+       <width>60</width>
+       <height>16777215</height>
+      </size>
+     </property>
+     <property name="text">
+      <string>Info</string>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>DSpinner</class>
+   <extends>QWidget</extends>
+   <header location="global">dspinner.h</header>
+   <container>1</container>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/widgets/common/smoothlistwidget.cpp b/src/widgets/common/smoothlistwidget.cpp
new file mode 100644
index 0000000..aa84496
--- /dev/null
+++ b/src/widgets/common/smoothlistwidget.cpp
@@ -0,0 +1,25 @@
+#include "smoothlistwidget.h"
+#include <QVBoxLayout>
+#include <QLabel>
+#include <QWheelEvent>
+#include <QDebug>
+SmoothListWidget::SmoothListWidget(QWidget *parent) : QListWidget(parent)
+{
+    vScrollBar->setOrientation(Qt::Orientation::Vertical); //将滚动条设置为纵向
+    setVerticalScrollBar(vScrollBar); //设置纵向滚动条
+    connect(vScrollBar, SIGNAL(valueChanged(int)), this, SLOT(onSliderChanged(int)));
+}
+void SmoothListWidget::wheelEvent(QWheelEvent *e)
+{
+    //当捕获到事件后,调用相对滚动的槽函数
+    vScrollBar->scroll(e->angleDelta().y());
+}
+void SmoothListWidget::onSliderChanged(int p)
+{
+    int startRow = count();
+    if (p == vScrollBar->maximum())
+    {
+        emit reachedBottom(); // 1
+    }
+    emit msliderChanged(p);  // 2
+}
diff --git a/src/widgets/common/smoothlistwidget.h b/src/widgets/common/smoothlistwidget.h
new file mode 100644
index 0000000..8c58c03
--- /dev/null
+++ b/src/widgets/common/smoothlistwidget.h
@@ -0,0 +1,24 @@
+#ifndef SMOOTHLISTWIDGET_H
+#define SMOOTHLISTWIDGET_H
+
+#include <QWidget>
+#include <QPushButton>
+#include <QListWidget>
+#include "smoothscrollbar.h"
+class SmoothListWidget: public QListWidget
+{
+    Q_OBJECT
+public:
+    explicit SmoothListWidget(QWidget *parent = nullptr);
+    SmoothScrollBar* vScrollBar=new SmoothScrollBar(); //纵向滚动条
+private:
+    void wheelEvent(QWheelEvent* e); //捕获鼠标滚轮事件
+signals:
+    void msliderChanged(int p);
+    void reachedBottom();
+
+private slots:
+    void onSliderChanged(int p);
+};
+
+#endif // SMOOTHLISTWIDGET_H
diff --git a/src/widgets/common/smoothscrollbar.cpp b/src/widgets/common/smoothscrollbar.cpp
new file mode 100644
index 0000000..8759124
--- /dev/null
+++ b/src/widgets/common/smoothscrollbar.cpp
@@ -0,0 +1,56 @@
+#include "smoothscrollbar.h"
+#include <QWheelEvent>
+#include <QDebug>
+SmoothScrollBar::SmoothScrollBar(QWidget* parent):QScrollBar(parent)
+{
+    m_scrollAni=new QPropertyAnimation(this);
+    m_scrollAni->setTargetObject(this);
+    m_scrollAni->setPropertyName("value");
+    m_scrollAni->setEasingCurve(QEasingCurve::OutQuint); //设置动画曲线,在Qt文档中有详细的介绍
+    m_scrollAni->setDuration(500); //设置动画时间,数值越小播放越快
+    m_targetValue_v=value(); //将m_targetValue_v初始化
+}
+
+void SmoothScrollBar::setValue(int value)
+{
+    m_scrollAni->stop();//停止现在的动画,防止出现冲突
+    m_scrollAni->setStartValue(this->value()); //设置动画滚动的初始值为当前位置
+    m_scrollAni->setEndValue(value); //设置动画的结束位置为目标值
+    m_scrollAni->start(); //开始动画
+}
+void SmoothScrollBar::scrollTop()
+{
+    setValue(-m_targetValue_v); //开始动画
+    m_targetValue_v=0;
+}
+void SmoothScrollBar::scroll(int value)
+{
+    //这里推荐评论区中大佬优化的写法
+    if(m_targetValue_v-value>=0)
+    {
+        m_targetValue_v-=value; //将目标值和相对位置进行运算
+        setValue(m_targetValue_v); //开始动画
+    }
+}
+
+void SmoothScrollBar::mousePressEvent(QMouseEvent *e)
+{
+    //当使用鼠标操作滚动条时,不会刷新m_targetValue_v的值,因而需要重写事件,对其进行刷新。
+    m_scrollAni->stop();
+    QScrollBar::mousePressEvent(e);
+    m_targetValue_v=value();
+}
+
+void SmoothScrollBar::mouseReleaseEvent(QMouseEvent *e)
+{
+    m_scrollAni->stop();
+    QScrollBar::mouseReleaseEvent(e);
+    m_targetValue_v=value();
+}
+
+void SmoothScrollBar::mouseMoveEvent(QMouseEvent *e)
+{
+    m_scrollAni->stop();
+    QScrollBar::mouseMoveEvent(e);
+    m_targetValue_v=value();
+}
diff --git a/src/widgets/common/smoothscrollbar.h b/src/widgets/common/smoothscrollbar.h
new file mode 100644
index 0000000..91c0d4b
--- /dev/null
+++ b/src/widgets/common/smoothscrollbar.h
@@ -0,0 +1,27 @@
+#ifndef SMOOTHSCROLLBAR_H
+#define SMOOTHSCROLLBAR_H
+
+#include <QScrollBar>
+#include <QPropertyAnimation>
+class SmoothScrollBar : public QScrollBar
+{
+    Q_OBJECT
+public:
+    SmoothScrollBar(QWidget *parent=nullptr);
+private:
+    //这里重写鼠标事件的目的是在手动点击或拖动滚动条时更新m_targetValue_v变量,并且在拖动时立即结束滚动的动画。
+    //这里如果不明白作用,可以先注释掉看看手动拖动滚动条时对动画有什么影响。
+    void mousePressEvent(QMouseEvent *) override;
+    void mouseReleaseEvent(QMouseEvent *) override;
+    void mouseMoveEvent(QMouseEvent *) override;
+
+    QPropertyAnimation *m_scrollAni; //用来实现动画
+    int m_targetValue_v; //用来记录目标位置的变量
+public slots:
+    void scrollTop();
+    void setValue(int value); //重写的setValue槽函数,实现动画效果
+    void scroll(int value); //新增相对滚动的槽函数,value为滚动距离的矢量表示
+signals:
+};
+
+#endif // SMOOTHSCROLLBAR_H
diff --git a/src/webengine/webenginepage.cpp b/src/widgets/common/webenginepage.cpp
similarity index 100%
rename from src/webengine/webenginepage.cpp
rename to src/widgets/common/webenginepage.cpp
diff --git a/src/webengine/webenginepage.h b/src/widgets/common/webenginepage.h
similarity index 100%
rename from src/webengine/webenginepage.h
rename to src/widgets/common/webenginepage.h
diff --git a/src/webengine/webengineview.cpp b/src/widgets/common/webengineview.cpp
similarity index 100%
rename from src/webengine/webengineview.cpp
rename to src/widgets/common/webengineview.cpp
diff --git a/src/webengine/webengineview.h b/src/widgets/common/webengineview.h
similarity index 100%
rename from src/webengine/webengineview.h
rename to src/widgets/common/webengineview.h
diff --git a/src/widgets/downloadlistwidget.cpp b/src/widgets/downloadlistwidget.cpp
new file mode 100644
index 0000000..7149e25
--- /dev/null
+++ b/src/widgets/downloadlistwidget.cpp
@@ -0,0 +1,201 @@
+#include "downloadlistwidget.h"
+#include "ui_downloadlistwidget.h"
+#include <QGraphicsOpacityEffect>
+#include <QPropertyAnimation>
+#include <QDebug>
+DownloadListWidget::DownloadListWidget(QWidget *parent) :
+    DBlurEffectWidget(parent),
+    ui(new Ui::DownloadListWidget)
+{
+    ui->setupUi(this);
+    installEventFilter(this);
+    this->setAttribute(Qt::WA_Hover,true);
+    setFocus();
+    setFixedSize(500,400);
+
+    // 计算显示下载速度
+    download_speed.setInterval(1000);
+    download_speed.start();
+    connect(&download_speed,&QTimer::timeout,[=]()
+    {
+        if(isdownload && theSpeed == "")
+        {
+            size1 = download_size;
+            double bspeed;
+            bspeed = size1 - size2;
+            if(bspeed < 1024)
+            {
+                theSpeed = QString::number(bspeed) + "B/s";
+            }
+            else if(bspeed < 1024 * 1024)
+            {
+                theSpeed = QString::number(0.01 * int(100 * (bspeed / 1024))) + "KB/s";
+            }
+            else if(bspeed < 1024 * 1024 * 1024)
+            {
+                theSpeed = QString::number(0.01 * int(100 * (bspeed / (1024 * 1024)))) + "MB/s";
+            }
+            else
+            {
+                theSpeed = QString::number(0.01 * int(100 * (bspeed / (1024 * 1024 * 1024)))) + "GB/s";
+            }
+            size2 = download_size;
+        }
+        if(isdownload){
+        downloaditemlist[nowDownload - 1]->setSpeed(theSpeed);
+        }
+    });
+}
+
+DownloadListWidget::~DownloadListWidget()
+{
+    delete ui;
+}
+void DownloadListWidget::clearItem()
+{
+    ui->listWidget->vScrollBar->scrollTop();
+    int n=ui->listWidget->count();
+    for(int i=0;i<n;i++)
+    {
+        QListWidgetItem *item = ui->listWidget->takeItem(0);
+        QWidget *card = ui->listWidget->itemWidget(item);
+        delete card;
+        card  = NULL;
+        delete item;
+        item  = NULL;
+    }
+    ui->listWidget->clear();
+}
+void DownloadListWidget::addItem(QString name,QString fileName,QString pkgName,const QPixmap icon,QString downloadurl)
+{
+    allDownload += 1;
+    urList.append(downloadurl);
+    if(dlist.contains(downloadurl))
+    {
+        return;
+    }
+    if(fileName.isEmpty())
+    {
+        return;
+    }
+    DownloadItem *di=new DownloadItem(this);
+    dlist<<downloadurl;
+    downloaditemlist<<di;
+    di->setName(name);
+    di->setFileName(fileName);
+    di->pkgName=pkgName;
+    di->seticon(icon);
+    QListWidgetItem* pItem = new QListWidgetItem();
+    pItem->setSizeHint(QSize(240, 50));
+    ui->listWidget->addItem(pItem);
+    ui->listWidget->setItemWidget(pItem, di);
+    if(!isBusy)
+    {
+        nowDownload += 1;
+        startRequest(urList.at(nowDownload - 1), fileName);     // 进行链接请求
+    }
+}
+
+void DownloadListWidget::startRequest(QUrl url, QString fileName)
+{
+    ui->listWidget->show();
+    isBusy = true;
+    isdownload = true;
+    downloaditemlist[allDownload - 1]->free = false;
+
+    downloadController = new DownloadController(this);  // 并发下载,在点击下载按钮的时候才会初始化
+    connect(downloadController, &DownloadController::downloadProcess, this, &DownloadListWidget::updateDataReadProgress);
+    connect(downloadController, &DownloadController::downloadFinished, this, &DownloadListWidget::httpFinished);
+    //connect(downloadController, &DownloadController::errorOccur, this, [=](QString msg){this->sendNotification(msg);});
+    downloadController->setFilename(fileName);
+    downloadController->startDownload(url.toString());
+}
+
+void DownloadListWidget::httpFinished() // 完成下载
+{
+    isdownload = false;
+    isBusy = false;
+    downloaditemlist[nowDownload - 1]->readyInstall();
+    downloaditemlist[nowDownload - 1]->free = true;
+    if(nowDownload < allDownload)
+    {
+
+        // 如果有排队则下载下一个
+        qDebug() << "切换下一个下载...";
+        nowDownload += 1;
+        while(downloaditemlist[nowDownload - 1]->close)
+        {
+            nowDownload += 1;
+        }
+        QString fileName = downloaditemlist[nowDownload - 1]->getName();
+        startRequest(urList.at(nowDownload-1), fileName);
+    }
+}
+
+int DownloadListWidget::isDownloading(QString url)
+{
+    int i = urList.indexOf(QUrl(url),0);
+    if(i == -1){
+        return 3;
+    }else if(i==nowDownload-1 && isdownload)
+    {
+        return 1;
+    }else if(i==nowDownload-1 && !isdownload)
+    {
+        return 2;
+    }else if(i<nowDownload-1)
+    {
+        return 2;
+    }
+    return 0;
+}
+
+void DownloadListWidget::updateDataReadProgress(QString speedInfo, qint64 bytesRead, qint64 totalBytes)
+{
+    if(totalBytes <= 0)
+    {
+        return;
+    }
+    theSpeed = speedInfo;
+    downloaditemlist[nowDownload - 1]->setMax(10000);   // 最大值
+    downloaditemlist[nowDownload - 1]->setValue(int(bytesRead * 100 / totalBytes) * 100);  // 当前值
+    download_size = bytesRead;
+    if(downloaditemlist[nowDownload - 1]->close)
+    {
+        // 随时检测下载是否被取消
+        downloadController->disconnect();
+        downloadController->stopDownload();
+        downloaditemlist[nowDownload - 1]->closeDownload();
+        httpFinished();
+    }
+}
+
+
+void DownloadListWidget::m_move(int x,int y)
+{
+    m_rect.setX(x);
+    m_rect.setY(y);
+    move(x,y);
+    return;
+}
+bool DownloadListWidget::eventFilter(QObject *watched, QEvent *event)
+{
+    if (Q_NULLPTR == watched) {
+        return false;
+    }
+    if (QEvent::ActivationChange == event->type()) {
+        if(QApplication::activeWindow() != this){
+            this->close();
+        }
+    }
+    return QWidget::eventFilter(watched, event);
+}
+void DownloadListWidget::mouseMoveEvent(QMouseEvent *event)
+{
+    setGeometry(m_rect);
+}
+
+void DownloadListWidget::on_pushButton_clicked()
+{
+    QDesktopServices::openUrl(QUrl("file:///tmp/spark-store", QUrl::TolerantMode));
+}
diff --git a/src/widgets/downloadlistwidget.h b/src/widgets/downloadlistwidget.h
new file mode 100644
index 0000000..0f4766b
--- /dev/null
+++ b/src/widgets/downloadlistwidget.h
@@ -0,0 +1,56 @@
+#ifndef DOWNLOADLISTWIDGET_H
+#define DOWNLOADLISTWIDGET_H
+
+#include <QWidget>
+#include <QTimer>
+#include <DBlurEffectWidget>
+#include <QNetworkAccessManager>
+#include <QDesktopServices>
+#include "widgets/common/downloaditem.h"
+#include "backend/sparkapi.h"
+#include "backend/downloadworker.h"
+
+DWIDGET_USE_NAMESPACE
+namespace Ui {
+class DownloadListWidget;
+}
+
+class DownloadListWidget : public DBlurEffectWidget
+{
+    Q_OBJECT
+
+public:
+    void addItem(QString name, QString fileName, QString pkgName, const QPixmap icon, QString downloadurl);
+    int isDownloading(QString url);
+    void m_move(int x, int y);
+    explicit DownloadListWidget(QWidget *parent = nullptr);
+    ~DownloadListWidget();
+
+private:
+    int nowDownload = 0;
+    int allDownload = 0;
+    int isdownload = false;
+    bool isBusy = false;
+    QStringList dlist;
+    QList<QUrl> urList;
+    QList<DownloadItem *> downloaditemlist;
+    DownloadController *downloadController;
+    int nowdownload = 0;
+    QString theSpeed;
+    QTimer download_speed;
+    long download_size = 0;
+    long size1 = 0;
+    long size2 = 0;
+    void startRequest(QUrl url, QString fileName);
+    void httpFinished();
+    void updateDataReadProgress(QString speedInfo, qint64 bytesRead, qint64 totalBytes);
+    void clearItem();
+    QRect m_rect;
+    Ui::DownloadListWidget *ui;
+private slots:
+    bool eventFilter(QObject *, QEvent *);
+    void mouseMoveEvent(QMouseEvent *event);
+    void on_pushButton_clicked();
+};
+
+#endif // DOWNLOADLISTWIDGET_H
diff --git a/src/widgets/downloadlistwidget.ui b/src/widgets/downloadlistwidget.ui
new file mode 100644
index 0000000..39fa984
--- /dev/null
+++ b/src/widgets/downloadlistwidget.ui
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>DownloadListWidget</class>
+ <widget class="QWidget" name="DownloadListWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>547</width>
+    <height>416</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="SmoothListWidget" name="listWidget">
+     <property name="minimumSize">
+      <size>
+       <width>0</width>
+       <height>0</height>
+      </size>
+     </property>
+     <property name="styleSheet">
+      <string notr="true">QListView,QScrollArea,QWidget#viewport,QWidget#scrollAreaWidgetContents
+{
+    background-color:transparent;
+    margin:0px;
+}
+/**列表项选中*/
+QListWidget::item::selected
+{ 
+    background-color:transparent;
+}</string>
+     </property>
+     <property name="frameShape">
+      <enum>QFrame::StyledPanel</enum>
+     </property>
+     <property name="verticalScrollBarPolicy">
+      <enum>Qt::ScrollBarAsNeeded</enum>
+     </property>
+     <property name="horizontalScrollBarPolicy">
+      <enum>Qt::ScrollBarAlwaysOff</enum>
+     </property>
+     <property name="autoScroll">
+      <bool>true</bool>
+     </property>
+     <property name="autoScrollMargin">
+      <number>10</number>
+     </property>
+     <property name="resizeMode">
+      <enum>QListView::Fixed</enum>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QPushButton" name="pushButton">
+     <property name="text">
+      <string>Open download directory</string>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>SmoothListWidget</class>
+   <extends>QListWidget</extends>
+   <header>widgets/common/smoothlistwidget.h</header>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/workerthreads.cpp b/src/workerthreads.cpp
deleted file mode 100644
index 99d40c7..0000000
--- a/src/workerthreads.cpp
+++ /dev/null
@@ -1,238 +0,0 @@
-#include "workerthreads.h"
-
-#include <QProcess>
-#include <QDir>
-#include <QFile>
-#include <QJsonDocument>
-
-#include "widget.h"
-#include "HttpClient.h"
-
-void SpkAppInfoLoaderThread::run()
-{
-    emit requestResetUi();
-
-    httpClient = new AeaQt::HttpClient;
-    QString oriSeverUrl = "https://d.store.deepinos.org.cn";
-    QString cdnSeverUrl = "https://cdn.d.store.deepinos.org.cn";
-
-    QString downloadTimesUrl = targetUrl.toString();
-    downloadTimesUrl = downloadTimesUrl.replace(oriSeverUrl, cdnSeverUrl);
-    downloadTimesUrl = downloadTimesUrl.replace("app.json", "download-times.txt");
-    httpClient->get(downloadTimesUrl)
-            .onResponse([this](QString downloadTimesFeedback)
-    {
-        qDebug() << "请求应用下载量信息 " << downloadTimesFeedback;
-        this->downloadTimes = downloadTimesFeedback.replace("\n","");
-    })
-    .onError([this](QString errorStr)
-    {
-        qDebug() << "请求下载量失败:" << errorStr;
-        this->downloadTimes  = "0";
-    })
-    .block()
-            .timeout(3*1000)
-            .exec();
-
-
-    httpClient->get(targetUrl.toString().replace(oriSeverUrl, cdnSeverUrl))
-            .header("content-type", "application/json")
-            .onResponse([this](QByteArray json_array)
-    {
-        qDebug() << "请求应用信息 " << json_array;
-        QString urladdress, deatils, more, packagename, appweb;
-        bool isInstalled;
-        bool isUpdated;
-
-        // 将路径转化为相应源的下载路径
-        urladdress = targetUrl.toString().left(targetUrl.toString().length() - 8);
-        QStringList downloadurl = urladdress.split("/");
-
-        QString deburl = serverUrl;
-        deburl = deburl.left(urladdress.length() - 1);
-        
-        QStringList url_ = targetUrl.toString().replace("//", "/").split("/");
-        urladdress = "https://" + url_[1];
-        // 使用 cdn 服务器
-        urladdress = "https://cdn.d.store.deepinos.org.cn";  // 使用图片专用服务器请保留这行,删除后将使用源服务器
-
-
-        for(int i = 3; i < downloadurl.size(); i++)
-        {
-            urladdress += "/" + downloadurl[i];
-            deburl += "/" + downloadurl[i];
-        }
-
-        // 路径转化完成
-        QJsonObject json = QJsonDocument::fromJson(json_array).object();
-        QString appName = json["Name"].toString();
-        QUrl fileUrl = deburl + json["Filename"].toString();
-
-        // 软件信息加载
-        QString details;
-        details = tr("PkgName: ") + json["Pkgname"].toString() + "\n";
-        details += tr("Version: ") + json["Version"].toString() + "\n";
-        if(!json["Author"].toString().trimmed().isEmpty())
-        {
-            details += tr("Author: ") + json["Author"].toString() + "\n";
-        }
-
-        if(!json["Website"].toString().trimmed().isEmpty())
-        {
-            details += tr("Official Site: ") + json["Website"].toString() + "\n";
-            // ui->pushButton_website->show();  // move to setinfo slot
-            appweb = json["Website"].toString();
-        }
-        details += tr("Contributor: ") + json["Contributor"].toString() + "\n";
-        details += tr("Update Time: ") + json["Update"].toString() + "\n";
-        details += tr("Installed Size: ") + json["Size"].toString() + "\n\n";
-        details += tr("Download Times: ") + this->downloadTimes + "\n";
-        more = json["More"].toString();
-
-        QProcess isInstall;
-        packagename = json["Pkgname"].toString();
-        isInstall.start("dpkg -s " + json["Pkgname"].toString());
-        isInstall.waitForFinished(180); // 默认超时 3 分钟
-        int error = QString::fromStdString(isInstall.readAllStandardError().toStdString()).length();
-        if(error == 0)
-        {
-            isInstalled = true;
-
-            QProcess isUpdate;
-            isUpdate.start("dpkg-query --showformat='${Version}' --show " + json["Pkgname"].toString());
-            isUpdate.waitForFinished(180); // 默认超时 3 分钟
-            QString localVersion = isUpdate.readAllStandardOutput();
-            localVersion.replace("'", "");
-
-            isUpdate.start("dpkg --compare-versions " + localVersion + " ge " + json["Version"].toString());
-            isUpdate.waitForFinished(180); // 默认超时 3 分钟
-            if(!isUpdate.exitCode())
-            {
-                isUpdated = true;
-            }
-            else
-            {
-                isUpdated = false;
-            }
-        }
-        else
-        {
-            isInstalled = false;
-            isUpdated = false;
-        }
-
-        emit requestSetAppInformation(&appName, &details, &more, &appweb, &packagename, &fileUrl, isInstalled, isUpdated);
-
-        // tag 加载
-        QString tags = json["Tags"].toString();
-        QStringList tagList = tags.split(";");
-        emit requestSetTags(&tagList);
-
-        // 图标加载
-        httpClient->get(urladdress+"icon.png")
-                .onResponse([this](QByteArray imgData)
-        {
-            QPixmap appicon;
-            appicon.loadFromData(imgData);
-            emit finishedIconLoad(&appicon);
-
-            QFile icon("/tmp/spark-store/icon.png");
-            icon.open(QFile::WriteOnly);
-            appicon.save(&icon, "PNG");
-            icon.close();
-        })
-        .onError([this](QString errorStr)
-        {
-            Q_UNUSED(this)
-            Q_UNUSED(errorStr)
-
-            Widget::sendNotification(tr("Failed to load application icon."));
-        })
-        .block()
-                .timeout(-1)
-                .exec();
-
-
-        // 截图展示加载
-        QPixmap screenshotCache[5];
-        for(int i = 0; i < 5; i++)
-        {
-            httpClient->get(urladdress + "screen_" + QString::number(i + 1) + ".png")
-                    .onResponse([this, i, &screenshotCache](QByteArray imgData)
-            {
-                bool s = screenshotCache[i].loadFromData(imgData);
-                if(s)
-                {
-                    emit finishedScreenshotLoad(&screenshotCache[i], i);
-                }
-                else
-                {
-                    emit finishedScreenshotLoad(nullptr, i);
-                }
-            })
-                    .onError([this](QString errorStr)
-            {
-                Q_UNUSED(this)
-                Q_UNUSED(errorStr)
-
-                qDebug() << "截图下载失败";
-                // Widget::sendNotification(tr("Failed to load application screenshot."));
-            })
-            .block()
-                    .timeout(-1)
-                    .exec();
-        }
-        emit finishAllLoading();
-
-        httpClient->deleteLater();
-    })
-    .onError([](QString errorStr)
-    {
-        Q_UNUSED(errorStr)
-
-        Widget::sendNotification(tr("Failed to download app info. Please check internet connection."));
-    })
-    .block()
-            .timeout(-1)
-            .exec();
-}
-
-
-void SpkAppInfoLoaderThread::setUrl(const QUrl &url)
-{
-    targetUrl = url;
-}
-
-void SpkAppInfoLoaderThread::setServer(const QString &server)
-{
-    serverUrl = server;
-}
-
-void SpkAppInfoLoaderThread::downloadFinished(int exitcode, QProcess::ExitStatus status)
-{
-    Q_UNUSED(exitcode)
-    Q_UNUSED(status)
-
-    qDebug() << "Finish one download";
-    finishedDownload = true;
-}
-
-int SpkAppInfoLoaderThread::waitDownload(QProcess& downloader)
-{
-    while(!downloader.waitForFinished(100))
-    {
-        if(downloader.state() == QProcess::NotRunning)
-        {
-            return -1;
-        }
-
-        if(this->isInterruptionRequested())
-        {
-            downloader.terminate();
-            downloader.waitForFinished(-1);
-            qDebug() << "Appinfo loader thread was forcefully terminated";
-            return -1;
-        }
-    }
-    return 0;
-}
diff --git a/src/workerthreads.h b/src/workerthreads.h
deleted file mode 100644
index 52b38da..0000000
--- a/src/workerthreads.h
+++ /dev/null
@@ -1,52 +0,0 @@
-#ifndef WORKERTHREADS_H
-#define WORKERTHREADS_H
-
-#include <QThread>
-#include <QPixmap>
-#include <QUrl>
-#include <QProcess>
-
-namespace AeaQt {
-class HttpClient;
-}
-
-class SpkAppInfoLoaderThread Q_DECL_FINAL : public QThread
-{
-    Q_OBJECT
-
-public:
-    // explicit SpkAppInfoLoaderThread() = default;
-
-protected:
-    void run() Q_DECL_OVERRIDE;
-
-private:
-    QUrl targetUrl;
-    QString serverUrl;
-    QString downloadTimes;
-    bool finishedDownload = false;
-    int downloaderRetval = 0;
-
-    AeaQt::HttpClient *httpClient;
-
-    int waitDownload(QProcess& downloader);
-
-public slots:
-    void setUrl(const QUrl &url);
-    void setServer(const QString &server);
-    void downloadFinished(int exitcode, QProcess::ExitStatus status);
-
-signals:
-    void requestResetUi();
-    void requestSetTags(QStringList *tagList);
-    void requestSetAppInformation(QString *name, QString *details, QString *info,
-                                  QString *website, QString *packageName,
-                                  QUrl *fileUrl, bool isInstalled,
-                                  bool isUpdated);
-    void finishedIconLoad(QPixmap *icon);
-    void finishedScreenshotLoad(QPixmap *icon, int index);  // 该信号必须以 BlockingQueued 方式连接
-    void finishAllLoading();                                // 该信号必须以 BlockingQueued 方式连接
-
-};
-
-#endif // WORKERTHREADS_H
diff --git a/third-party/QtNetworkService/HttpClient.cpp b/third-party/QtNetworkService/HttpClient.cpp
deleted file mode 100644
index 1a70b89..0000000
--- a/third-party/QtNetworkService/HttpClient.cpp
+++ /dev/null
@@ -1,42 +0,0 @@
-/**********************************************************
-Author: Qt君
-微信公众号: Qt君(文章首发)
-Website: qtbig.com(后续更新)
-Email:  2088201923@qq.com
-QQ交流群: 732271126
-LISCENSE: MIT
-**********************************************************/
-#include "HttpClient.h"
-#include <QJsonObject>
-#include <QJsonDocument>
-#include <QBuffer>
-
-using namespace AeaQt;
-
-HttpClient::HttpClient()
-{
-}
-
-HttpClient::~HttpClient()
-{
-}
-
-HttpRequest HttpClient::get(const QString &url)
-{
-    return HttpRequest(QNetworkAccessManager::GetOperation, this).url(url);
-}
-
-HttpRequest HttpClient::post(const QString &url)
-{
-    return HttpRequest(QNetworkAccessManager::PostOperation, this).url(url);
-}
-
-HttpRequest HttpClient::put(const QString &url)
-{
-    return HttpRequest(QNetworkAccessManager::PutOperation, this).url(url);
-}
-
-HttpRequest HttpClient::send(const QString &url, QNetworkAccessManager::Operation op)
-{
-    return HttpRequest(op, this).url(url);
-}
diff --git a/third-party/QtNetworkService/HttpClient.h b/third-party/QtNetworkService/HttpClient.h
deleted file mode 100644
index 1102a23..0000000
--- a/third-party/QtNetworkService/HttpClient.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/**********************************************************
-Author: Qt君
-微信公众号: Qt君(文章首发)
-Website: qtbig.com(后续更新)
-Email:  2088201923@qq.com
-QQ交流群: 732271126
-LISCENSE: MIT
-**********************************************************/
-#ifndef HTTP_CLIENT_H
-#define HTTP_CLIENT_H
-
-#include "HttpRequest.h"
-#include "HttpResponse.h"
-#include <QNetworkRequest>
-#include <QNetworkReply>
-
-namespace AeaQt {
-
-class HttpClient : public QNetworkAccessManager
-{
-    Q_OBJECT
-public:
-    friend class HttpRequest;
-
-    HttpClient();
-    ~HttpClient();
-
-    HttpRequest get(const QString &url);
-    HttpRequest post(const QString &url);
-    HttpRequest put(const QString &url);
-
-    HttpRequest send(const QString &url, Operation op = GetOperation);
-};
-
-}
-#endif
diff --git a/third-party/QtNetworkService/HttpRequest.cpp b/third-party/QtNetworkService/HttpRequest.cpp
deleted file mode 100644
index f34b147..0000000
--- a/third-party/QtNetworkService/HttpRequest.cpp
+++ /dev/null
@@ -1,268 +0,0 @@
-/**********************************************************
-Author: Qt君
-微信公众号: Qt君(文章首发)
-Website: qtbig.com(后续更新)
-Email:  2088201923@qq.com
-QQ交流群: 732271126
-LISCENSE: MIT
-**********************************************************/
-#include "HttpRequest.h"
-#include "HttpClient.h"
-
-#include <QJsonDocument>
-#include <QUrlQuery>
-#include <QBuffer>
-#include <QMetaEnum>
-
-using namespace AeaQt;
-
-static const char *s_httpOperation[] = {
-    "UnknownOperation",
-    "HeadOperation",
-    "GetOperation",
-    "PutOperation",
-    "PostOperation",
-    "DeleteOperation",
-    "CustomOperation"
-};
-
-HttpRequest::HttpRequest()
-{
-
-}
-
-HttpRequest::~HttpRequest()
-{
-}
-
-HttpRequest::HttpRequest(QNetworkAccessManager::Operation op, HttpClient *jsonHttpClient) :
-    m_body(QByteArray()),
-    m_op(op),
-    m_httpService(jsonHttpClient),
-    m_timeout(-1)
-{
-}
-
-HttpRequest &HttpRequest::url(const QString &url)
-{
-    m_networkRequest.setUrl(QUrl(url));
-    return *this;
-}
-
-HttpRequest &HttpRequest::header(const QString &key, const QVariant &value)
-{
-    m_networkRequest.setRawHeader(QByteArray(key.toStdString().data()), QByteArray(value.toString().toStdString().data()));
-
-    return *this;
-}
-
-HttpRequest &HttpRequest::headers(const QMap<QString, QVariant> &headers)
-{
-   QMapIterator<QString, QVariant> iter(headers);
-   while (iter.hasNext()) {
-       iter.next();
-       header(iter.key(), iter.value());
-   }
-
-   return *this;
-}
-
-HttpRequest &HttpRequest::body(const QVariantMap &content)
-{
-    m_body = QJsonDocument(QJsonObject::fromVariantMap(content)).toJson();
-    return *this;
-}
-
-HttpRequest &HttpRequest::body(const QJsonObject &content)
-{
-    m_body = QJsonDocument(QJsonObject::fromVariantMap(content.toVariantMap())).toJson();
-    return *this;
-}
-
-HttpRequest &HttpRequest::body(const QByteArray &content)
-{
-    m_body = content;
-    return *this;
-}
-
-#if 0
-HttpRequest &HttpRequest::body(const QVariant &body)
-{
-    /// clear m_jsonBody
-    m_jsonBody = QJsonObject();
-
-    if (type == X_Www_Form_Urlencoded) {
-        QUrl url;
-        QUrlQuery urlQuery(url);
-
-        if (body.type() == QVariant::Map
-            || body.typeName() ==  QMetaType::typeName(QMetaType::QJsonObject)) {
-
-            QMapIterator<QString, QVariant> i(body.toMap());
-            while (i.hasNext()) {
-                i.next();
-                urlQuery.addQueryItem(i.key(), i.value().toString());
-            }
-
-            url.setQuery(urlQuery);
-            m_body = url.toString(QUrl::FullyEncoded).toUtf8().remove(0, 1);
-        }
-        else {
-            m_body = body.toByteArray();
-        }
-    }
-    else if (type == Raw_Text_Json) {
-        if (body.type() == QVariant::Map
-            || body.typeName() ==  QMetaType::typeName(QMetaType::QJsonObject)) {
-
-            m_body = QJsonDocument(QJsonObject::fromVariantMap(body.toMap())).toJson();
-        }
-        else {
-            log_warning << "This is not data in JSON format(QVariantMap or QJsonObject).";
-            m_body = QByteArray();
-            // warning output
-        }
-    }
-    else {
-        m_body = QByteArray();
-        log_warning << "Disable body.";
-    }
-
-    log_debugger << "Body Content:" << m_body;
-    return *this;
-}
-#endif
-
-HttpRequest &HttpRequest::onResponse(const QObject *receiver, const char *slot, HttpResponse::SupportMethod type)
-{
-    m_slotsMap.insert(type, {slot, QVariant::fromValue((QObject *)receiver)});
-    return *this;
-}
-
-HttpRequest &HttpRequest::onResponse(std::function<void (QNetworkReply *)> lambda)
-{
-    return onResponse(QVariant::fromValue(lambda));
-}
-
-HttpRequest &HttpRequest::onResponse(std::function<void (QVariantMap)> lambda)
-{
-    return onResponse(QVariant::fromValue(lambda));
-}
-
-HttpRequest &HttpRequest::onResponse(std::function<void (QByteArray)> lambda)
-{
-    return onResponse(QVariant::fromValue(lambda));
-}
-
-HttpRequest &HttpRequest::onResponse(std::function<void (qint64, qint64)> lambda)
-{
-    return onResponse(QVariant::fromValue(lambda));
-}
-
-HttpRequest &HttpRequest::onError(const QObject *receiver, const char *slot)
-{
-    return onResponse(receiver, slot, HttpResponse::AutoInfer);
-}
-
-HttpRequest &HttpRequest::onError(std::function<void (QNetworkReply::NetworkError)> lambda)
-{
-    return onResponse(QVariant::fromValue(lambda));
-}
-
-HttpRequest &HttpRequest::onError(std::function<void (QString)> lambda)
-{
-    return onResponse(QVariant::fromValue(lambda));
-}
-
-HttpRequest &HttpRequest::onError(std::function<void (QNetworkReply::NetworkError, QNetworkReply *)> lambda)
-{
-    return onResponse(QVariant::fromValue(lambda));
-}
-
-HttpRequest &HttpRequest::onError(std::function<void (QString, QNetworkReply *)> lambda)
-{
-    return onResponse(QVariant::fromValue(lambda));
-}
-
-HttpRequest &HttpRequest::timeout(const int &msec)
-{
-    m_timeout = msec;
-    return *this;
-}
-
-HttpRequest &HttpRequest::block()
-{
-    m_isBlock = true;
-    return *this;
-}
-
-HttpRequest &HttpRequest::onResponse(QVariant lambda)
-{
-    m_slotsMap.insert(HttpResponse::AutoInfer, {lambda.typeName(), lambda});
-
-    return *this;
-}
-
-HttpResponse *HttpRequest::exec()
-{
-    QNetworkReply* reply = NULL;
-    QBuffer* sendBuffer = new QBuffer();
-    if (! m_body.isEmpty()) {
-        sendBuffer->setData(m_body);
-    }
-
-    log_debugger << "Http Client info: ";
-    log_debugger << "Type: " << s_httpOperation[m_op];
-    log_debugger << "Url: " << m_networkRequest.url().toString();
-    QString headers;
-    for (int i = 0; i < m_networkRequest.rawHeaderList().count(); i++) {
-        QString each = m_networkRequest.rawHeaderList().at(i);
-        QString header = m_networkRequest.rawHeader(each.toUtf8());
-        headers += QString("%1: %2;").arg(each)
-                                     .arg(header);
-    }
-    log_debugger << "Header: " << headers;
-    log_debugger << "Send buffer(Body):\r\n" << m_body;
-
-    reply = m_httpService->createRequest(m_op, m_networkRequest, sendBuffer);
-
-    if (reply == NULL) {
-        sendBuffer->deleteLater();
-        return NULL;
-    }
-    else {
-        sendBuffer->setParent(reply);
-    }
-
-    return new HttpResponse(reply, m_slotsMap, m_timeout, m_isBlock);
-}
-
-HttpRequest &HttpRequest::queryParam(const QString &key, const QVariant &value)
-{
-    QUrl url(m_networkRequest.url());
-    QUrlQuery urlQuery(url);
-
-    urlQuery.addQueryItem(key, value.toString());
-    url.setQuery(urlQuery);
-
-    m_networkRequest.setUrl(url);
-
-    return *this;
-}
-
-HttpRequest &HttpRequest::queryParams(const QMap<QString, QVariant> &params)
-{
-    QMapIterator<QString, QVariant> iter(params);
-    while (iter.hasNext()) {
-        iter.next();
-        queryParam(iter.key(), iter.value());
-    }
-
-    return *this;
-}
-
-HttpRequest &HttpRequest::userAttribute(const QVariant &value)
-{
-    m_networkRequest.setAttribute(QNetworkRequest::User, value);
-    return *this;
-}
diff --git a/third-party/QtNetworkService/HttpRequest.h b/third-party/QtNetworkService/HttpRequest.h
deleted file mode 100644
index b7358c3..0000000
--- a/third-party/QtNetworkService/HttpRequest.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/**********************************************************
-Author: Qt君
-微信公众号: Qt君(文章首发)
-Website: qtbig.com(后续更新)
-Email:  2088201923@qq.com
-QQ交流群: 732271126
-LISCENSE: MIT
-**********************************************************/
-#ifndef HTTP_REQUEST_H
-#define HTTP_REQUEST_H
-
-#include "HttpResponse.h"
-
-#include <QNetworkRequest>
-#include <QNetworkAccessManager>
-#include <QJsonObject>
-#include <QDebug>
-
-namespace AeaQt {
-
-#ifdef QT_APP_DEBUG
-#define log_debugger qDebug().noquote().nospace() \
-                          << "[AeaQt::Network] Debug: -> " \
-                          << "function: " << __func__ << "; " \
-                          << "line: " << __LINE__ << "; "
-#else
-#define log_debugger QString()
-#endif
-
-#define log_warning qWarning().noquote().nospace() \
-                           << "[AeaQt::Network] Warning: -> " \
-                           << "function: " << __func__ << "; " \
-                           << "line: " << __LINE__ << "; "
-
-class HttpClient;
-
-class HttpRequest
-{
-public:
-    enum BodyType {
-        None = 0, // This request does not have a body.
-        X_Www_Form_Urlencoded, // x-www-form-urlencoded
-        Raw_Text_Json, // application/json
-    };
-
-    explicit HttpRequest(QNetworkAccessManager::Operation op, HttpClient *jsonHttpClient);
-    virtual ~HttpRequest();
-
-    HttpRequest &url(const QString &url);
-    HttpRequest &header(const QString &key, const QVariant &value);
-    HttpRequest &headers(const QMap<QString, QVariant> &headers);
-
-    HttpRequest &queryParam(const QString &key, const QVariant &value);
-    HttpRequest &queryParams(const QMap<QString, QVariant> &params);
-
-    /* Mainly used for identification */
-    HttpRequest &userAttribute(const QVariant &value);
-
-    HttpRequest &body(const QVariantMap &content);
-    HttpRequest &body(const QJsonObject &content);
-    HttpRequest &body(const QByteArray &content);
-
-    /*
-     * @onRespone slot support type: void function(QVariantMap resultMap) OR
-     *                               void function(QByteArray resultData) OR
-     *                               void function(QNetworkReply* reply)
-     * note: The same type is only triggered once
-     */
-    HttpRequest &onResponse(const QObject *receiver, const char *slot, HttpResponse::SupportMethod type = HttpResponse::AutoInfer);
-    HttpRequest &onResponse(std::function<void (QNetworkReply*)> lambda);
-    HttpRequest &onResponse(std::function<void (QVariantMap)> lambda);
-    HttpRequest &onResponse(std::function<void (QByteArray)> lambda);
-    HttpRequest &onResponse(std::function<void (qint64, qint64)> lambda);
-    /*
-     * @onError slot support type: void function(QNetworkReply::NetworkError error)
-     *                             void function(QString errorString);
-     *                             void function(QNetworkReply::NetworkError error, QNetworkReply* reply);
-     *                             void function(QString errorString, QNetworkReply* reply);
-     * note: The same type is only triggered once
-     */
-    HttpRequest &onError(const QObject *receiver, const char *slot);
-    HttpRequest &onError(std::function<void (QNetworkReply::NetworkError)> lambda);
-    HttpRequest &onError(std::function<void (QString)> lambda);
-    HttpRequest &onError(std::function<void (QNetworkReply::NetworkError, QNetworkReply*)> lambda);
-    HttpRequest &onError(std::function<void (QString, QNetworkReply*)> lambda);
-
-    /**
-     * @brief msec <= 0, disable timeout
-     *        msec >  0, enable timeout
-     */
-    HttpRequest &timeout(const int &msec = -1);
-
-    /**
-     * @brief Block current thread, entering an event loop.
-     */
-    HttpRequest &block();
-
-    HttpResponse *exec();
-
-private:
-    HttpRequest();
-    HttpRequest &onResponse(QVariant lambda);
-
-private:
-    QNetworkRequest                  m_networkRequest;
-    QByteArray                       m_body;
-    QNetworkAccessManager::Operation m_op;
-    HttpClient                      *m_httpService;
-    int                              m_timeout;
-    bool                             m_isBlock;
-    QMultiMap<HttpResponse::SupportMethod, QPair<QString, QVariant>> m_slotsMap;
-};
-
-}
-#endif // HTTP_REQUEST_H
diff --git a/third-party/QtNetworkService/HttpResponse.cpp b/third-party/QtNetworkService/HttpResponse.cpp
deleted file mode 100644
index 7c54915..0000000
--- a/third-party/QtNetworkService/HttpResponse.cpp
+++ /dev/null
@@ -1,331 +0,0 @@
-/**********************************************************
-Author: Qt君
-微信公众号: Qt君(文章首发)
-Website: qtbig.com(后续更新)
-Email:  2088201923@qq.com
-QQ交流群: 732271126
-LISCENSE: MIT
-**********************************************************/
-#include "HttpResponse.h"
-
-#include <QRegExp>
-#include <QStringList>
-#include <QByteArray>
-#include <QNetworkConfigurationManager>
-#include <QMetaEnum>
-#include <QEventLoop>
-#include <QJsonDocument>
-#include <QJsonObject>
-
-#define T2S(t) (QString(#t).remove(QRegExp("\\s"))) //type to string
-
-#define _exec(target, type, arg) \
-        if (target.canConvert<std::function<void (type)> >()) { \
-            std::function<void (type)> func = target.value<std::function<void (type)> >(); func(arg); \
-        } \
-        else
-
-#define _exec2(target, type1, type2, arg1, arg2) \
-        if (target.canConvert<std::function<void (type1, type2)> >()) { \
-            std::function<void (type1, type2)> func = target.value<std::function<void (type1, type2)> >(); func(arg1, arg2); \
-        } else
-
-using namespace AeaQt;
-
-static const QMap<HttpResponse::SupportMethod, QMap<QString, QVariant>> methodParams =
-{
-    {
-        HttpResponse::onResponse_QNetworkReply_A_Pointer,
-        {
-            {"types", QStringList({T2S(QNetworkReply*)})},
-            {"lambda", T2S(std::function<void (QNetworkReply*)>)},
-            {"signal", SIGNAL(finished(QNetworkReply*))},
-            {"isAutoInfer", true}
-        }
-    },
-    {
-        HttpResponse::onResponse_QByteArray,
-        {
-            {"types", QStringList({T2S(QByteArray)})},
-            {"lambda", T2S(std::function<void (QByteArray)>)},
-            {"signal", SIGNAL(finished(QByteArray))},
-            {"isAutoInfer", true}
-        }
-    },
-    {
-        HttpResponse::onResponse_QVariantMap,
-        {
-            {"types", QStringList({T2S(QVariantMap)})},
-            {"lambda", T2S(std::function<void (QVariantMap)>)},
-            {"signal", SIGNAL(finished(QVariantMap))},
-            {"isAutoInfer", true}
-        }
-    },
-    {
-        HttpResponse::onDownloadProgress_qint64_qint64,
-        {
-            {"types", QStringList({T2S(qint64), T2S(qint64)})},
-            {"lambda", T2S(std::function<void (qint64, qint64)>)},
-            {"signal", SIGNAL(downloadProgress(qint64, qint64))},
-            {"isAutoInfer", true}
-        }
-    },
-    {
-        HttpResponse::onError_QNetworkReply_To_NetworkError,
-        {
-            {"types", QStringList({T2S(QNetworkReply::NetworkError)})},
-            {"lambda", T2S(std::function<void (QNetworkReply::NetworkError)>)},
-            {"signal", SIGNAL(error(QNetworkReply::NetworkError))},
-            {"isAutoInfer", true}
-        }
-    },
-    {
-        HttpResponse::onError_QString,
-        {
-            {"types", QStringList({T2S(QString)})},
-            {"lambda", T2S(std::function<void (QString)>)},
-            {"signal", SIGNAL(error(QString))},
-            {"isAutoInfer", true}
-        }
-    },
-    {
-        HttpResponse::onError_QNetworkReply_To_NetworkError_QNetworkReply_A_Pointer,
-        {
-            {"types", QStringList({T2S(QNetworkReply::NetworkError), T2S(QNetworkReply*)})},
-            {"lambda", T2S(std::function<void (QNetworkReply::NetworkError, QNetworkReply*)>)},
-            {"signal", SIGNAL(error(QNetworkReply::NetworkError, QNetworkReply*))},
-            {"isAutoInfer", true}
-        }
-    },
-    {
-        HttpResponse::onError_QString_QNetworkReply_A_Poniter,
-        {
-            {"types", QStringList({T2S(QString), T2S(QNetworkReply*)})},
-            {"lambda", T2S(std::function<void (QString, QNetworkReply*)>)},
-            {"signal", SIGNAL(error(QString, QNetworkReply*))},
-            {"isAutoInfer", true}
-        }
-    },
-};
-
-static int extractCode(const char *member)
-{
-    /* extract code, ensure QMETHOD_CODE <= code <= QSIGNAL_CODE */
-    return (((int)(*member) - '0') & 0x3);
-}
-
-HttpResponse::HttpResponse(QNetworkReply *networkReply,
-                           const QMultiMap<SupportMethod, QPair<QString, QVariant> > &slotsMap,
-                           const int &timeout,
-                           bool isBlock)
-    : m_networkReply(networkReply),
-      m_slotsMap(slotsMap),
-      QObject(networkReply)
-{
-    slotsMapOperation(m_slotsMap);
-    new HttpResponseTimeout(networkReply, timeout);
-
-    connect(m_networkReply, SIGNAL(finished()), this, SLOT(onFinished()));
-    connect(m_networkReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onError(QNetworkReply::NetworkError)));
-    connect(m_networkReply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(onDownloadProgress(qint64, qint64)));
-
-    if (isBlock) {
-        QEventLoop loop;
-        QObject::connect(m_networkReply, SIGNAL(finished()), &loop, SLOT(quit()));
-        loop.exec();
-    }
-}
-
-HttpResponse::~HttpResponse()
-{
-}
-
-QNetworkReply *HttpResponse::networkReply()
-{
-    return m_networkReply;
-}
-
-void HttpResponse::onFinished()
-{
-    QNetworkReply *reply = m_networkReply;
-    if (reply->error() != QNetworkReply::NoError)
-        return;
-
-    if (m_slotsMap.contains(onResponse_QNetworkReply_A_Pointer)) {
-        _exec(m_slotsMap.value(onResponse_QNetworkReply_A_Pointer).second, QNetworkReply*, reply) {
-            emit finished(reply);
-        }
-    }
-    else if (m_slotsMap.contains((onResponse_QByteArray))) {
-        QByteArray result = reply->readAll();
-
-        _exec(m_slotsMap.value((onResponse_QByteArray)).second, QByteArray, result) {
-            emit finished(result);
-        }
-
-        reply->deleteLater();
-    }
-    else if (m_slotsMap.contains((onResponse_QVariantMap))) {
-        QByteArray result = reply->readAll();
-        QVariantMap resultMap = QJsonDocument::fromJson(result).object().toVariantMap();
-
-        _exec(m_slotsMap.value((onResponse_QVariantMap)).second, QVariantMap, resultMap){
-            emit finished(resultMap);
-        }
-
-        reply->deleteLater();
-    }
-}
-
-void HttpResponse::onError(QNetworkReply::NetworkError error)
-{
-    QNetworkReply *reply = m_networkReply;
-    const QMetaObject & metaObject = QNetworkReply::staticMetaObject;
-    QMetaEnum metaEnum = metaObject.enumerator(metaObject.indexOfEnumerator("NetworkError"));
-    QString errorString = reply->errorString().isEmpty() ? metaEnum.valueToKey(error) : reply->errorString();
-
-    if (m_slotsMap.contains((onError_QString_QNetworkReply_A_Poniter))) {
-        _exec2(m_slotsMap.value((onError_QString_QNetworkReply_A_Poniter)).second, QString, QNetworkReply*, errorString, reply) {
-            emit this->error(errorString, reply);
-        }
-    }
-    else if (m_slotsMap.contains((onError_QNetworkReply_To_NetworkError_QNetworkReply_A_Pointer))) {
-        _exec2(m_slotsMap.value((onError_QNetworkReply_To_NetworkError_QNetworkReply_A_Pointer)).second,
-              QNetworkReply::NetworkError, QNetworkReply*,
-              error, reply) {
-            emit this->error(error, reply);
-        }
-    }
-    else if (m_slotsMap.contains((onError_QString))) {
-        _exec(m_slotsMap.value((onError_QString)).second, QString, errorString) {
-            emit this->error(errorString);
-        }
-
-        reply->deleteLater();
-    }
-    else if (m_slotsMap.contains((onError_QNetworkReply_To_NetworkError))) {
-        _exec(m_slotsMap.value((onError_QNetworkReply_To_NetworkError)).second, QNetworkReply::NetworkError, error) {
-            emit this->error(error);
-        }
-
-        reply->deleteLater();
-    }
-}
-
-void HttpResponse::onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal)
-{
-    if (m_slotsMap.contains((onDownloadProgress_qint64_qint64))) {
-        _exec2(m_slotsMap.value((onDownloadProgress_qint64_qint64)).second, qint64, qint64, bytesReceived, bytesTotal) {
-            emit downloadProgress(bytesReceived, bytesTotal);
-        }
-    }
-}
-
-static void extractSlot(const QString &respReceiverSlot, QString &extractSlot, QStringList &extractSlotTypes)
-{
-    QString slot(respReceiverSlot);
-    if (extractCode(respReceiverSlot.toStdString().data()) == QSLOT_CODE && !slot.isEmpty()) {
-        slot.remove(0, 1);
-
-        QString unconvertedSlotType = slot;
-        int startIndex = slot.indexOf('(');
-        int endIndex = slot.indexOf(')');
-        Q_ASSERT(startIndex != -1 && endIndex != -1);
-
-        extractSlot = slot.remove(startIndex, endIndex-startIndex+1);
-
-        extractSlotTypes = unconvertedSlotType.mid(startIndex+1, endIndex-startIndex-1)
-                .remove(QRegExp("\\s"))
-                .split(',');
-    }
-}
-
-/* from slotMap get [SupportMethod] */
-static HttpResponse::SupportMethod getSupportMethod(const QPair<QString, QVariant> &slotMap) {
-
-    QMapIterator<HttpResponse::SupportMethod, QMap<QString, QVariant>> iter(methodParams);
-
-    QString receiverSlot = slotMap.first;
-    QString slot;
-    QStringList slotTypes;
-    extractSlot(receiverSlot, slot, slotTypes);
-
-    while (iter.hasNext()) {
-        iter.next();
-        HttpResponse::SupportMethod supportMethod = iter.key();
-        QMap<QString, QVariant> value = iter.value();
-        if (slotTypes == value.value("types").toStringList()) {
-            return supportMethod;
-        }
-        else if (receiverSlot == value.value("lambda").toString()) {
-            return supportMethod;
-        }
-    }
-
-    return HttpResponse::Invalid;
-}
-
-static void autoInfterConvertedSupportMethod(QMultiMap<HttpResponse::SupportMethod, QPair<QString, QVariant> > &unconvertedSlotsMap)
-{
-    QMultiMap<HttpResponse::SupportMethod, QPair<QString, QVariant> > convertedSlotsMap;
-    QMapIterator<HttpResponse::SupportMethod, QPair<QString, QVariant> > iter(unconvertedSlotsMap);
-
-    while (iter.hasNext()) {
-        iter.next();
-        const HttpResponse::SupportMethod supportMethod = iter.key();
-        const QPair<QString, QVariant> slotMap = iter.value();
-
-        if (supportMethod == HttpResponse::AutoInfer) {
-            HttpResponse::SupportMethod supportMethod  = getSupportMethod(slotMap);
-            if (supportMethod == HttpResponse::Invalid) {
-                qDebug()<<"Not find support Method!"<<slotMap.first;
-            }
-            else {
-                if (methodParams[supportMethod].value("isAutoInfer").toBool())
-                    convertedSlotsMap.insert(supportMethod, slotMap);
-                else
-                    qDebug()<<"This type["<<methodParams[supportMethod].value("types").toString()<<"] does not support automatic derivation";
-            }
-        }
-        else {
-            if (methodParams[supportMethod].value("isAutoInfer").toBool())
-                convertedSlotsMap.insert(supportMethod, slotMap);
-            else
-                qDebug()<<"This type["<<methodParams[supportMethod].value("types").toString()<<"] does not support automatic derivation";
-        }
-    }
-
-    unconvertedSlotsMap = convertedSlotsMap;
-
-}
-
-void HttpResponse::slotsMapOperation(QMultiMap<SupportMethod, QPair<QString, QVariant> > &slotsMap)
-{
-    autoInfterConvertedSupportMethod(slotsMap);
-
-    QMapIterator<SupportMethod, QPair<QString, QVariant> > iter(slotsMap);
-    while (iter.hasNext()) {
-        iter.next();
-        SupportMethod supportMethod = iter.key();
-        const QPair<QString, QVariant> &slotMap = iter.value();
-
-        const QString &receiverSlot = slotMap.first;
-        QVariant target = slotMap.second;
-        const QObject *receiver = target.value<QObject*>();
-
-        if (receiver) {
-            if (methodParams.contains(supportMethod)) {
-                connect(this,
-                        methodParams[supportMethod].value("signal").toString().toStdString().data(),
-                        receiver,
-                        receiverSlot.toStdString().data(),
-                        Qt::QueuedConnection);
-            }
-        }
-    }
-}
-
-HttpResponse::HttpResponse()
-{
-
-}
diff --git a/third-party/QtNetworkService/HttpResponse.h b/third-party/QtNetworkService/HttpResponse.h
deleted file mode 100644
index c6ed225..0000000
--- a/third-party/QtNetworkService/HttpResponse.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/**********************************************************
-Author: Qt君
-微信公众号: Qt君(文章首发)
-Website: qtbig.com(后续更新)
-Email:  2088201923@qq.com
-QQ交流群: 732271126
-LISCENSE: MIT
-**********************************************************/
-#ifndef HTTP_RESPONSE_H
-#define HTTP_RESPONSE_H
-
-#include <QNetworkReply>
-#include <QMultiMap>
-#include <functional>
-#include <QTimer>
-
-namespace AeaQt {
-
-class HttpResponseTimeout : public QObject {
-    Q_OBJECT
-public:
-    HttpResponseTimeout(QNetworkReply *parent = NULL, const int timeout = -1) : QObject(parent) {
-        if (timeout > 0)
-            QTimer::singleShot(timeout, this, SLOT(onTimeout()));
-    }
-
-private slots:
-    void onTimeout() {
-        QNetworkReply *reply = static_cast<QNetworkReply*>(parent());
-        if (reply->isRunning()) {
-            reply->abort();
-            reply->deleteLater();
-        }
-    }
-};
-
-class HttpResponse : public QObject
-{
-    Q_OBJECT
-public:
-    /*
-     * Support Reflex Method
-     * default: AutoInfer
-     * AutoInfer: Automatic derivation based on type
-     */
-    enum SupportMethod {
-        Invalid = 0,
-        AutoInfer,
-        onResponse_QNetworkReply_A_Pointer,    /* method: void function(QNetworkReply* reply); Is_AutoInfer: true */
-        onResponse_QByteArray,                 /* method: void function(QByteArray data); Is_AutoInfer: true */
-        onResponse_QVariantMap,                /* method: void function(QVariantMap map); Is_AutoInfer: true */
-        onDownloadProgress_qint64_qint64,      /* method: void function(qint64 bytesReceived, qint64 bytesTotal); Is_AutoInfer: true */
-        onError_QNetworkReply_To_NetworkError, /* method: void function(QNetworkReply::NetworkError error); Is_AutoInfer: true */
-        onError_QString,                       /* method: void function(QString errorString); Is_AutoInfer: true */
-        onError_QNetworkReply_To_NetworkError_QNetworkReply_A_Pointer, /* method: void function(QNetworkReply::NetworkError error, QNetworkReply* reply); Is_AutoInfer: true */
-        onError_QString_QNetworkReply_A_Poniter/* method: void function(QString errorString, QNetworkReply* reply); Is_AutoInfer: true */
-    };
-
-    explicit HttpResponse(QNetworkReply *networkReply,
-                          const QMultiMap<SupportMethod, QPair<QString, QVariant> > &slotsMap,
-                          const int &timeout,
-                          bool isBlock);
-
-    virtual ~HttpResponse();
-
-    QNetworkReply *networkReply();
-
-protected:
-    void slotsMapOperation(QMultiMap<SupportMethod, QPair<QString, QVariant> > &slotsMap);
-
-signals:
-    void finished(QNetworkReply *reply);
-    void finished(QByteArray data);
-    void finished(QVariantMap map);
-    void error(QString errorString);
-    void error(QNetworkReply::NetworkError error);
-    void error(QString errorString, QNetworkReply *reply);
-    void error(QNetworkReply::NetworkError error, QNetworkReply *reply);
-    void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);
-
-private slots:
-    void onFinished();
-    void onError(QNetworkReply::NetworkError error);
-    void onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal);
-
-private:
-    HttpResponse();
-
-private:
-   QMultiMap<SupportMethod, QPair<QString, QVariant> > m_slotsMap;
-   QNetworkReply *m_networkReply;
-};
-
-}
-
-Q_DECLARE_METATYPE(std::function<void (QNetworkReply*)>)
-Q_DECLARE_METATYPE(std::function<void (QByteArray)>)
-Q_DECLARE_METATYPE(std::function<void (QVariantMap)>)
-
-Q_DECLARE_METATYPE(std::function<void (QString)>)
-Q_DECLARE_METATYPE(std::function<void (QNetworkReply::NetworkError)>)
-Q_DECLARE_METATYPE(std::function<void (QNetworkReply::NetworkError, QNetworkReply *)>)
-Q_DECLARE_METATYPE(std::function<void (QString, QNetworkReply *)>)
-
-Q_DECLARE_METATYPE(std::function<void (qint64, qint64)>)
-
-#endif // HTTP_RESPONSE_H
diff --git a/third-party/QtNetworkService/LICENSE b/third-party/QtNetworkService/LICENSE
deleted file mode 100644
index 26b4c3d..0000000
--- a/third-party/QtNetworkService/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2019 Qt君
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/third-party/QtNetworkService/QtNetworkService.pri b/third-party/QtNetworkService/QtNetworkService.pri
deleted file mode 100644
index 1d01eb2..0000000
--- a/third-party/QtNetworkService/QtNetworkService.pri
+++ /dev/null
@@ -1,15 +0,0 @@
-#**********************************************************
-#Author: Qt君
-#微信公众号: Qt君(文章首发)
-#Website: qtbig.com(后续更新)
-#Email:  2088201923@qq.com
-#QQ交流群: 732271126
-#LISCENSE: MIT
-#**********************************************************
-INCLUDEPATH += $$PWD/ 
-
-QT += network
-
-!CONFIG(QT_APP_MODE) {
-    LIBS += -L$$OUT_PWD/../third-party/QtNetworkService/Lib -lQtNetworkService
-}
diff --git a/third-party/QtNetworkService/QtNetworkService.pro b/third-party/QtNetworkService/QtNetworkService.pro
deleted file mode 100644
index 47bbcf9..0000000
--- a/third-party/QtNetworkService/QtNetworkService.pro
+++ /dev/null
@@ -1,37 +0,0 @@
-#**********************************************************
-#Author: Qt君
-#微信公众号: Qt君(文章首发)
-#Website: qtbig.com(后续更新)
-#Email:  2088201923@qq.com
-#QQ交流群: 732271126
-#LISCENSE: MIT
-#**********************************************************
-CONFIG += c++11
-
-#CONFIG += QT_APP_MODE
-DEFINES += QT_APP_DEBUG
-
-QT += network
-
-TEMPLATE = lib
-CONFIG += staticlib
-unix:TARGET = $$OUT_PWD/Lib/QtNetworkService
-
-win32: {
-DESTDIR = $$OUT_PWD/Lib/
-TARGET = QtNetworkService
-}
-
-message(" ================ QtNetworkService Library ================ ")
-
-SOURCES += \
-    $$PWD/HttpResponse.cpp \
-    $$PWD/HttpRequest.cpp \
-    $$PWD/HttpClient.cpp
-
-HEADERS += \
-    $$PWD/HttpResponse.h \
-    $$PWD/HttpRequest.h \
-    $$PWD/HttpClient.h
-
-include(QtNetworkService.pri)
diff --git a/third-party/QtNetworkService/README.md b/third-party/QtNetworkService/README.md
deleted file mode 100644
index db8aa0a..0000000
--- a/third-party/QtNetworkService/README.md
+++ /dev/null
@@ -1,83 +0,0 @@
-# 示例
-(1) 简单示例
-* 使用lambda特性
-```cpp
-static HttpClient http;
-http.post("https://example.com")
-    .header("content-type", "application/json")
-    .queryParam("key", "Hello world!")
-    .body(R"({"user": "test"})")
-    .onResponse([](QByteArray result) { /* 接收数据 */
-        qDebug() << "Result: " << result;
-     })
-    .onResponse([](qint64 recv, qint64 total) { /* 接收进度 */
-        qDebug() << "Total: " << total << "; Received: " << recv;
-     })
-    .onError([](QString errorStr) { /* 错误处理 */
-        qDebug()<<"Error: "<<errorStr;
-     })
-    .timeout(30 * 1000) /* 超时操作(30s) */
-    .block() /* 阻塞操作 */
-    .exec();
-```
-
-* 使用Qt信号与槽特性
-```cpp
-http.post("https://example.com")
-    .header("content-type", "application/json")
-    .queryParam("key", "Hello world!")
-    .body(R"({"user": "test"})")
-    .onResponse(this, SLOT(finish(QByteArray)))
-    .onResponse(this, SLOT(downloadProgress(qint64, qint64)))
-    .onError(this, SLOT(error(QString)))
-    .timeout(30 * 1000) /* 超时操作(30s) */
-    .block() /* 阻塞操作 */
-    .exec();
-```
-
-(2) 复杂示例
-```cpp
-/* 获取音乐url功能,请求嵌套请求 */
-static HttpService http;
-http.get("http://mobilecdn.kugou.com/api/v3/search/song")
-    .queryParam("format", "json")
-    .queryParam("keyword", "稻香")
-    .queryParam("page", 1)
-    .queryParam("pagesize", 3)
-    .queryParam("showtype", 1)
-    .onResopnse([](QVariantMap result){
-        QVariantMap data;
-        QList<QVariant> infos;
-        if (!result.isEmpty())
-            data = result.value("data").toMap();
-
-        if (!data.isEmpty())
-            infos = data.value("info").toList();
-
-        static HttpService http;
-        foreach (QVariant each, infos) {
-            http.get("http://m.kugou.com/app/i/getSongInfo.php")
-                .queryParam("cmd", "playInfo")
-                .queryParam("hash", each.toMap()["hash"])
-                .onResopnse([](QVariantMap result){
-                    qDebug()<<"mp3: "<<result["url"].toString();
-                 })
-                .onError([](QString errorStr){ qDebug()<<"Error: "<<errorStr; })
-                .exec();
-        }
-    })
-    .onError([](QString errorStr){ qDebug()<<"Error: "<<errorStr; })
-    .exec();
-```
-## 1.如何使用?
-* 以Qt子工程使用.再在其他子工程包含pri文件即可使用;
-* 通过引用库的方式使用.
-
-## 2.如何启用demo测试?
-* 在QtNetworkService.pro文件中将"#CONFIG += QT_APP_MODE"这一行的#去除即可转为可执行文件形式,在Demo目录的main.cpp为主执行文件,如需要测试接口编辑便可。
-
-## 3.扫码关注,第一时间获取推送
-<p align="center">
-  <img src="http://www.qtbig.com/about/index/my_qrcode.jpg" alt="微信公众号:Qt君">
-  <p align="center"><em>Qt君</em></p>
-</p>
diff --git a/translations/spark-store_en.ts b/translations/spark-store_en.ts
index 1e0e8cc..795374c 100644
--- a/translations/spark-store_en.ts
+++ b/translations/spark-store_en.ts
@@ -1,638 +1,436 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
 <TS version="2.1" language="en">
+<context>
+    <name>AppIntoPage</name>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="14"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="216"/>
+        <source>Download</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="256"/>
+        <source>Uninstall</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="318"/>
+        <location filename="../src/pages/appintopage.ui" line="321"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This app is developed by community user,we give this tag to honor those who contribute to the Linux Ecology&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="324"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/community-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="337"/>
+        <location filename="../src/pages/appintopage.ui" line="340"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to Ubuntu 20.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="343"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/ubuntu-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="356"/>
+        <location filename="../src/pages/appintopage.ui" line="359"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to UOS home 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="362"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/uos-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="375"/>
+        <location filename="../src/pages/appintopage.ui" line="378"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine2 app.If you are using ubuntu or other non-deepin distro,you should deploy deepin-wine2 by your self.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="381"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine2-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="394"/>
+        <location filename="../src/pages/appintopage.ui" line="397"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This is a  DTK5 app,which means it would have better effect on Deepin Desktop Environment&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="400"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dtk-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="413"/>
+        <location filename="../src/pages/appintopage.ui" line="416"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to deepin 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="419"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/deepin-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="432"/>
+        <location filename="../src/pages/appintopage.ui" line="435"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;An Appimage to deb app.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="438"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/a2d-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="451"/>
+        <location filename="../src/pages/appintopage.ui" line="454"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine5 app.If you are using ubuntu or other non-deepin distro,you should deploy deepin-wine5 by your self.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="457"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine5-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="510"/>
+        <location filename="../src/pages/appintopage.ui" line="517"/>
+        <source>PushButton</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="673"/>
+        <location filename="../src/pages/appintopage.ui" line="973"/>
+        <source>Description</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="808"/>
+        <source>Screen capture</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="1054"/>
+        <source>Update</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="1083"/>
+        <source>Contributor</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="1090"/>
+        <source>Pkgname</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="1189"/>
+        <source>Author</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="1218"/>
+        <source>Size</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="1247"/>
+        <source>Website</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.cpp" line="76"/>
+        <source>Click Open</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.cpp" line="118"/>
+        <source>Reinstall</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.cpp" line="123"/>
+        <source>Upgrade</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.cpp" line="129"/>
+        <location filename="../src/pages/appintopage.cpp" line="258"/>
+        <source>Install</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
 <context>
     <name>AppItem</name>
     <message>
-        <location filename="../src/appitem.ui" line="14"/>
+        <location filename="../src/widgets/common/appitem.ui" line="26"/>
         <source>Form</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
-    <name>QLabel</name>
+    <name>AppListPage</name>
     <message>
-        <location filename="../src/main.cpp" line="67"/>
-        <location filename="../src/main.cpp" line="75"/>
-        <location filename="../src/main.cpp" line="81"/>
+        <location filename="../src/pages/applistpage.ui" line="14"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/applistpage.ui" line="62"/>
+        <source>推荐</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/applistpage.cpp" line="47"/>
+        <source>搜索 </source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>DownloadItem</name>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.ui" line="20"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.ui" line="50"/>
+        <source>icon</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.ui" line="66"/>
+        <source>TextLabel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.ui" line="90"/>
+        <source>Name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.ui" line="157"/>
+        <source>Waiting to download</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.ui" line="182"/>
+        <source>Install</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.ui" line="201"/>
+        <source>Cancel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.ui" line="220"/>
+        <source>Info</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="29"/>
+        <source>Spark Store App Installer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="30"/>
+        <source>ussinstall</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="31"/>
+        <source>deepin deb installer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="32"/>
+        <source>gdebi</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="76"/>
+        <source>Downloaded, waiting to install</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="104"/>
+        <source>Download Failed,Check Your Connection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="149"/>
+        <source>Installing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="195"/>
+        <source>Finish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="201"/>
+        <source>Retry</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="202"/>
+        <source>Error happened in dpkg progress , you can try it again</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="208"/>
+        <source>dpkg progress had been aborted,you can retry installation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="297"/>
+        <source>Download canceled</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>DownloadListWidget</name>
+    <message>
+        <location filename="../src/widgets/downloadlistwidget.ui" line="14"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/downloadlistwidget.ui" line="60"/>
+        <source>Open download directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>HomePage</name>
+    <message>
+        <location filename="../src/pages/homepage.ui" line="16"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>MainWindow</name>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="14"/>
+        <source>MainWindow</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="82"/>
+        <source>导航</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="95"/>
+        <source>主页</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="132"/>
+        <source>网络</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="160"/>
+        <source>社交</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="188"/>
+        <source>音乐</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="216"/>
+        <source>视频</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="244"/>
+        <source>图像</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="272"/>
+        <source>游戏</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="300"/>
+        <source>办公</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="328"/>
+        <source>阅读</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="356"/>
+        <source>开发</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="384"/>
+        <source>工具</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="412"/>
+        <source>主题</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="440"/>
+        <source>其他</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.cpp" line="87"/>
         <source>Spark Store</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.cpp" line="88"/>
+        <source>Search or enter spk://</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QObject</name>
     <message>
-        <location filename="../src/main.cpp" line="64"/>
-        <source>We publish this program under GPL V3</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/main.cpp" line="69"/>
-        <source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by  community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/main.cpp" line="77"/>
-        <source>The Spark Project</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/main.cpp" line="89"/>
-        <source>&lt;span style=&apos;font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by deepin community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos;font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;Published under GPL V3</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>SpkAppInfoLoaderThread</name>
-    <message>
-        <location filename="../src/workerthreads.cpp" line="193"/>
-        <source>Failed to download app info. Please check internet connection.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/workerthreads.cpp" line="73"/>
-        <source>PkgName: </source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/workerthreads.cpp" line="74"/>
-        <source>Version: </source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/workerthreads.cpp" line="77"/>
-        <source>Author: </source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/workerthreads.cpp" line="82"/>
-        <source>Official Site: </source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/workerthreads.cpp" line="86"/>
-        <source>Contributor: </source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/workerthreads.cpp" line="87"/>
-        <source>Update Time: </source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/workerthreads.cpp" line="88"/>
-        <source>Installed Size: </source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/workerthreads.cpp" line="89"/>
-        <source>Download Times: </source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/workerthreads.cpp" line="149"/>
-        <source>Failed to load application icon.</source>
+        <location filename="../src/main.cpp" line="38"/>
+        <location filename="../src/main.cpp" line="40"/>
+        <source>Spark Store</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
     <name>Widget</name>
     <message>
-        <location filename="../src/widget.ui" line="14"/>
-        <source>Form</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1179"/>
-        <source>background-color:#FFFFFF</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1312"/>
-        <source>Tools</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1194"/>
-        <source>Beautify</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1427"/>
-        <source>Music</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1251"/>
-        <source>Office</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1339"/>
-        <source>Others</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1244"/>
-        <source>Games</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="270"/>
-        <source>Name</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="316"/>
-        <source>ICON</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="257"/>
-        <location filename="../src/widget.cpp" line="984"/>
-        <location filename="../src/widget.cpp" line="1194"/>
-        <source>Install</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="371"/>
-        <source>Uninstall</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="387"/>
-        <source>Site</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="460"/>
-        <location filename="../src/widget.ui" line="463"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This app is developed by community user,we give this tag to honor those who contribute to the Linux Ecology&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="466"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/community-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="485"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/ubuntu-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="523"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/uos-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="498"/>
-        <location filename="../src/widget.ui" line="501"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to deepin 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1285"/>
-        <source>Video</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1258"/>
-        <source>Download</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1298"/>
-        <source>Back to category</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1332"/>
-        <source>Reading</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1201"/>
-        <source>Chat</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1271"/>
-        <source>Reload</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="125"/>
-        <source>The list is currently empty. Go and download some softwares!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="157"/>
-        <source>Open download directory</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="504"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/deepin-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="517"/>
-        <location filename="../src/widget.ui" line="520"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to UOS home 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="536"/>
-        <location filename="../src/widget.ui" line="539"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This is a  DTK5 app,which means it would have better effect on Deepin Desktop Environment&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="542"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dtk-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="577"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine5 app.If you are using ubuntu or other non-deepin distro,you should deploy deepin-wine5 by your self.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="593"/>
-        <location filename="../src/widget.ui" line="596"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;An Appimage to deb app.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="599"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/a2d-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="426"/>
         <source>Share</source>
-        <translation type="unfinished">Spk share link</translation>
+        <translation type="obsolete">Spk share link</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1385"/>
-        <source>Development</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1322"/>
-        <source>Home</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1346"/>
-        <source>Graphics</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1224"/>
-        <source>Network</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="479"/>
-        <location filename="../src/widget.ui" line="482"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to Ubuntu 22.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="555"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine2 app. Spark Store will configure the wine environment for you, so don‘t worry.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="558"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine2 app.If you are using ubuntu or other non-deepin distro,you should deploy deepin-wine2 by your self.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="561"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine2-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="574"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine5 app.Spark Store will configure the wine environment for you, so don‘t worry.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="580"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine5-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="640"/>
-        <source>Info</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="647"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;An app store developed by community enthusiasts&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="689"/>
-        <source>Screenshots</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="852"/>
-        <source>Line Settings</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="868"/>
-        <source>Choose Line:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="891"/>
-        <source>Refresh</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="943"/>
-        <source>Update</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="950"/>
-        <source>Spark Store Update</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="970"/>
-        <source>Server</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="991"/>
-        <source>Temp</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1038"/>
-        <source>Clean</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1004"/>
-        <source>Since the dictionary is at /tmp,It would be cleaned automatically when  system reboot.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1051"/>
-        <source>Size:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1018"/>
-        <source>Location:/tmp/spark-store</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1058"/>
-        <source>Clear Web Cache</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1079"/>
-        <source>About us</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1086"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;We are &lt;span style=&quot; font-weight:600;&quot;&gt;NOT&lt;/span&gt; the official team, just like you, we are just one of the many Linux/deepin system enthusiasts and users, we develop and run the &amp;quot;Spark Store&amp;quot;! &amp;quot;, is to bring the community together to share useful software, or to participate in development together, so that we all use the latest and greatest software. &lt;/p&gt;&lt;p&gt;We don&apos;t make a profit from this, all developers and maintainers don&apos;t get paid, and we rely on the community&apos;s donations to us for most of our expenses, which we are grateful for and which allow us not to spend too much energy worrying about funding. &lt;/p&gt;&lt;p&gt;Our service and software are free for everyone to use, communicate, and learn, but you must comply with local laws and regulations in the process of your use, otherwise any problems have nothing to do with us. &lt;/p&gt;&lt;p&gt;If any part of the store infringes your rights, please tell us &amp;lt;jifengshenmo@outlook.com&amp;gt; we will remove the infringing content as soon as possible. &lt;/p&gt;&lt;p&gt;If you&apos;d like to get involved with us too, whether you&apos;re involved in development, design, pitching or submitting work, we welcome you to join us. &lt;/p&gt;&lt;p&gt;Connect us on Spark IM: https://chat.shenmo.tech&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1365"/>
-        <source>icon</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="285"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="622"/>
-        <source>Request Update</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="904"/>
-        <source>Take effect when restart</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="933"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Check update for Spark Store. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1011"/>
         <source>0B</source>
-        <translation type="unfinished">0B</translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="193"/>
-        <source>Spark Store</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="194"/>
-        <source>Search or enter spk://</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="200"/>
-        <source>Submit App</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="201"/>
-        <source>Submit App with client(Recommanded)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="202"/>
-        <source>Settings</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="203"/>
-        <source>APP Upgrade and Install Settings</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="373"/>
-        <source>Not Exist</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="142"/>
-        <location filename="../src/widget.cpp" line="435"/>
-        <location filename="../src/widget.cpp" line="440"/>
-        <location filename="../src/widget.cpp" line="450"/>
-        <location filename="../src/widget.cpp" line="455"/>
-        <source>Spark\ Store</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="714"/>
-        <location filename="../src/widget.cpp" line="973"/>
-        <source>Reinstall</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="680"/>
-        <source>Failed to get the name to the file to be downloaded.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1434"/>
-        <location filename="../src/widget.cpp" line="978"/>
-        <source>Upgrade</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="1166"/>
-        <source>Updating, please wait...</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="1198"/>
-        <source>Uninstall succeeded</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="767"/>
-        <source>Relative apps Not Found!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="749"/>
-        <source>Do not repeat searches!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="781"/>
-        <source>Request Error: %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="1220"/>
-        <source>Temporary cache was cleaned</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="1312"/>
-        <source>The URL has been copied to the clipboard</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>downloadlist</name>
-    <message>
-        <location filename="../src/downloadlist.ui" line="20"/>
-        <source>Form</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.ui" line="50"/>
-        <source>icon</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.ui" line="82"/>
-        <source>TextLabel</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.ui" line="106"/>
-        <source>Name</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.ui" line="189"/>
-        <source>Waiting to download</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.ui" line="240"/>
-        <source>Install</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.ui" line="259"/>
-        <source>Cancel</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.ui" line="278"/>
-        <source>Info</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.cpp" line="32"/>
-        <source>Spark Store App Installer</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.cpp" line="34"/>
-        <source>gdebi</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.cpp" line="33"/>
-        <source>deepin deb installer</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.cpp" line="74"/>
-        <source>Downloaded. Open APP Upgrade and Install Settings to enable password-free installation</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.cpp" line="101"/>
-        <source>Finished downloading %1, awaiting to install</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.cpp" line="134"/>
-        <source>Installing</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.cpp" line="177"/>
-        <source>Finish</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.cpp" line="183"/>
-        <source>Retry</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.cpp" line="184"/>
-        <source>Error happened in dpkg progress , you can try it again</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.cpp" line="190"/>
-        <source>dpkg progress had been aborted,you can retry installation</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.cpp" line="212"/>
-        <source>Download canceled</source>
-        <translation type="unfinished"></translation>
+        <translation type="obsolete">0B</translation>
     </message>
 </context>
 </TS>
diff --git a/translations/spark-store_fr.ts b/translations/spark-store_fr.ts
index bf80c0f..5102f6a 100644
--- a/translations/spark-store_fr.ts
+++ b/translations/spark-store_fr.ts
@@ -1,638 +1,632 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
 <TS version="2.1" language="fr">
+<context>
+    <name>AppIntoPage</name>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="14"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="216"/>
+        <source>Download</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="256"/>
+        <source>Uninstall</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="318"/>
+        <location filename="../src/pages/appintopage.ui" line="321"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This app is developed by community user,we give this tag to honor those who contribute to the Linux Ecology&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="324"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/community-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="337"/>
+        <location filename="../src/pages/appintopage.ui" line="340"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to Ubuntu 20.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="343"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/ubuntu-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="356"/>
+        <location filename="../src/pages/appintopage.ui" line="359"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to UOS home 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="362"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/uos-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="375"/>
+        <location filename="../src/pages/appintopage.ui" line="378"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine2 app.If you are using ubuntu or other non-deepin distro,you should deploy deepin-wine2 by your self.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="381"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine2-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="394"/>
+        <location filename="../src/pages/appintopage.ui" line="397"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This is a  DTK5 app,which means it would have better effect on Deepin Desktop Environment&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="400"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dtk-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="413"/>
+        <location filename="../src/pages/appintopage.ui" line="416"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to deepin 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="419"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/deepin-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="432"/>
+        <location filename="../src/pages/appintopage.ui" line="435"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;An Appimage to deb app.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="438"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/a2d-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="451"/>
+        <location filename="../src/pages/appintopage.ui" line="454"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine5 app.If you are using ubuntu or other non-deepin distro,you should deploy deepin-wine5 by your self.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="457"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine5-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="510"/>
+        <location filename="../src/pages/appintopage.ui" line="517"/>
+        <source>PushButton</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="673"/>
+        <location filename="../src/pages/appintopage.ui" line="973"/>
+        <source>Description</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="808"/>
+        <source>Screen capture</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="1054"/>
+        <source>Update</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="1083"/>
+        <source>Contributor</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="1090"/>
+        <source>Pkgname</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="1189"/>
+        <source>Author</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="1218"/>
+        <source>Size</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="1247"/>
+        <source>Website</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.cpp" line="76"/>
+        <source>Click Open</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.cpp" line="118"/>
+        <source>Reinstall</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.cpp" line="123"/>
+        <source>Upgrade</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.cpp" line="129"/>
+        <location filename="../src/pages/appintopage.cpp" line="258"/>
+        <source>Install</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
 <context>
     <name>AppItem</name>
     <message>
-        <location filename="../src/appitem.ui" line="14"/>
+        <location filename="../src/widgets/common/appitem.ui" line="26"/>
         <source>Form</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
+<context>
+    <name>AppListPage</name>
+    <message>
+        <location filename="../src/pages/applistpage.ui" line="14"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/applistpage.ui" line="62"/>
+        <source>推荐</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/applistpage.cpp" line="47"/>
+        <source>搜索 </source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>DownloadItem</name>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.ui" line="20"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.ui" line="50"/>
+        <source>icon</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.ui" line="66"/>
+        <source>TextLabel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.ui" line="90"/>
+        <source>Name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.ui" line="157"/>
+        <source>Waiting to download</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.ui" line="182"/>
+        <source>Install</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.ui" line="201"/>
+        <source>Cancel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.ui" line="220"/>
+        <source>Info</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="29"/>
+        <source>Spark Store App Installer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="30"/>
+        <source>ussinstall</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="31"/>
+        <source>deepin deb installer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="32"/>
+        <source>gdebi</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="76"/>
+        <source>Downloaded, waiting to install</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="104"/>
+        <source>Download Failed,Check Your Connection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="149"/>
+        <source>Installing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="195"/>
+        <source>Finish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="201"/>
+        <source>Retry</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="202"/>
+        <source>Error happened in dpkg progress , you can try it again</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="208"/>
+        <source>dpkg progress had been aborted,you can retry installation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="297"/>
+        <source>Download canceled</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>DownloadListWidget</name>
+    <message>
+        <location filename="../src/widgets/downloadlistwidget.ui" line="14"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/downloadlistwidget.ui" line="60"/>
+        <source>Open download directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>HomePage</name>
+    <message>
+        <location filename="../src/pages/homepage.ui" line="16"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>MainWindow</name>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="14"/>
+        <source>MainWindow</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="82"/>
+        <source>导航</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="95"/>
+        <source>主页</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="132"/>
+        <source>网络</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="160"/>
+        <source>社交</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="188"/>
+        <source>音乐</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="216"/>
+        <source>视频</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="244"/>
+        <source>图像</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="272"/>
+        <source>游戏</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="300"/>
+        <source>办公</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="328"/>
+        <source>阅读</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="356"/>
+        <source>开发</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="384"/>
+        <source>工具</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="412"/>
+        <source>主题</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="440"/>
+        <source>其他</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.cpp" line="87"/>
+        <source>Spark Store</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.cpp" line="88"/>
+        <source>Search or enter spk://</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
 <context>
     <name>QLabel</name>
     <message>
-        <location filename="../src/main.cpp" line="67"/>
-        <location filename="../src/main.cpp" line="75"/>
-        <location filename="../src/main.cpp" line="81"/>
-        <source>Spark Store</source>
-        <translation type="unfinished"></translation>
+        <source>Spark应用商店</source>
+        <translation type="vanished">Spark Store</translation>
+    </message>
+    <message>
+        <source>社区驱动的一款为第三方应用商店,为改变而生
+本程序按GPL第三版开源</source>
+        <translation type="vanished">Un app store tier alimenté par la communauté Deepin
+Spark Store est publié sous licence GPL V3
+Nous sommes nés pour le changement.</translation>
     </message>
 </context>
 <context>
     <name>QObject</name>
     <message>
-        <location filename="../src/main.cpp" line="64"/>
-        <source>We publish this program under GPL V3</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/main.cpp" line="69"/>
-        <source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by  community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/main.cpp" line="77"/>
-        <source>The Spark Project</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/main.cpp" line="89"/>
-        <source>&lt;span style=&apos;font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by deepin community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos;font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;Published under GPL V3</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>SpkAppInfoLoaderThread</name>
-    <message>
-        <location filename="../src/workerthreads.cpp" line="193"/>
-        <source>Failed to download app info. Please check internet connection.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/workerthreads.cpp" line="73"/>
-        <source>PkgName: </source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/workerthreads.cpp" line="74"/>
-        <source>Version: </source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/workerthreads.cpp" line="77"/>
-        <source>Author: </source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/workerthreads.cpp" line="82"/>
-        <source>Official Site: </source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/workerthreads.cpp" line="86"/>
-        <source>Contributor: </source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/workerthreads.cpp" line="87"/>
-        <source>Update Time: </source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/workerthreads.cpp" line="88"/>
-        <source>Installed Size: </source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/workerthreads.cpp" line="89"/>
-        <source>Download Times: </source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/workerthreads.cpp" line="149"/>
-        <source>Failed to load application icon.</source>
+        <location filename="../src/main.cpp" line="38"/>
+        <location filename="../src/main.cpp" line="40"/>
+        <source>Spark Store</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
     <name>Widget</name>
     <message>
-        <location filename="../src/widget.ui" line="14"/>
-        <source>Form</source>
-        <translation type="unfinished"></translation>
+        <source>视频播放</source>
+        <translatorcomment>Lecteurs vidéo et créateurs vidéo</translatorcomment>
+        <translation type="vanished">Vidéo</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1179"/>
-        <source>background-color:#FFFFFF</source>
-        <translation type="unfinished"></translation>
+        <source>下载列表</source>
+        <translation type="vanished">Liste de téléchargement</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1285"/>
-        <source>Video</source>
-        <translation type="unfinished"></translation>
+        <source>系统工具</source>
+        <translation type="vanished">Outils</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1258"/>
-        <source>Download</source>
-        <translation type="unfinished"></translation>
+        <source>主题美化</source>
+        <translatorcomment>Thème des icônes et autres </translatorcomment>
+        <translation type="vanished">Thèmes</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1312"/>
-        <source>Tools</source>
-        <translation type="unfinished"></translation>
+        <source>音乐欣赏</source>
+        <translation type="vanished">Musique</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1194"/>
-        <source>Beautify</source>
-        <translation type="unfinished"></translation>
+        <source>编程开发</source>
+        <translation type="vanished">Développement</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1427"/>
-        <source>Music</source>
-        <translation type="unfinished"></translation>
+        <source>办公学习</source>
+        <translation type="vanished">Bureau</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1385"/>
-        <source>Development</source>
-        <translation type="unfinished"></translation>
+        <source>阅读翻译</source>
+        <translation type="vanished">Traduire</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1251"/>
-        <source>Office</source>
-        <translation type="unfinished"></translation>
+        <source>其他应用</source>
+        <translation type="vanished">Autres</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1298"/>
-        <source>Back to category</source>
-        <translation type="unfinished"></translation>
+        <source>商店首页</source>
+        <translation type="vanished">Accueil</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1332"/>
-        <source>Reading</source>
-        <translation type="unfinished"></translation>
+        <source>图形图像</source>
+        <translation type="vanished">Images</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1339"/>
-        <source>Others</source>
-        <translation type="unfinished"></translation>
+        <source>游戏娱乐</source>
+        <translation type="vanished">Jeux</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1322"/>
-        <source>Home</source>
-        <translation type="unfinished"></translation>
+        <source>社交沟通</source>
+        <translation type="vanished">Chat</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1346"/>
-        <source>Graphics</source>
-        <translation type="unfinished"></translation>
+        <source>网络应用</source>
+        <translation type="vanished">Réseau</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1244"/>
-        <source>Games</source>
-        <translation type="unfinished"></translation>
+        <source>当前下载列表为空</source>
+        <translation type="vanished">La liste de téléchargement est vide</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1201"/>
-        <source>Chat</source>
-        <translation type="unfinished"></translation>
+        <source>打开文件夹</source>
+        <translation type="vanished">Ouvrir dans le gestionnaire de fichiers</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1224"/>
-        <source>Network</source>
-        <translation type="unfinished"></translation>
+        <source>安装</source>
+        <translation type="vanished">Installer</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1271"/>
-        <source>Reload</source>
-        <translation type="unfinished"></translation>
+        <source>卸载</source>
+        <translation type="vanished">Supprimer</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="125"/>
-        <source>The list is currently empty. Go and download some softwares!</source>
-        <translation type="unfinished"></translation>
+        <source>官网</source>
+        <translation type="vanished">Site</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="157"/>
-        <source>Open download directory</source>
-        <translation type="unfinished"></translation>
+        <source>软件名</source>
+        <translation type="vanished">Nom</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="257"/>
-        <location filename="../src/widget.cpp" line="984"/>
-        <location filename="../src/widget.cpp" line="1194"/>
-        <source>Install</source>
-        <translation type="unfinished"></translation>
+        <source>图标</source>
+        <translation type="vanished">Icon</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="270"/>
-        <source>Name</source>
-        <translation type="unfinished"></translation>
+        <source>分享</source>
+        <translation type="vanished">Partager</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="316"/>
-        <source>ICON</source>
-        <translation type="unfinished"></translation>
+        <source>详细介绍</source>
+        <translation type="vanished">Détails</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="371"/>
-        <source>Uninstall</source>
-        <translation type="unfinished"></translation>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;由社区爱好者开发的软件商店&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="vanished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;magasin de logiciels développé par des passionnés de la communauté&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="387"/>
-        <source>Site</source>
-        <translation type="unfinished"></translation>
+        <source>软件截图</source>
+        <translation type="vanished">Captures d&apos;écran</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="426"/>
-        <source>Share</source>
-        <translation type="unfinished"></translation>
+        <source>线路设置</source>
+        <translation type="vanished">Line Settings</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="460"/>
-        <location filename="../src/widget.ui" line="463"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This app is developed by community user,we give this tag to honor those who contribute to the Linux Ecology&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
+        <source>线路选择:</source>
+        <translation type="vanished">Choisissez: </translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="466"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/community-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
+        <source>刷新</source>
+        <translation type="vanished">Mise à jour</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="479"/>
-        <location filename="../src/widget.ui" line="482"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to Ubuntu 22.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
+        <source> 重启商店后生效</source>
+        <translation type="vanished">Redémarrez pour prendre effet</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="485"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/ubuntu-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;源服务器的作用是保证软件更新,并且支持使用apt工具获取软件。通常我们更建议你使用第一个线路作为更新源,一般是最稳定的。&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="vanished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Le rôle du serveur source est de s&apos;assurer que le logiciel est mis à jour et prend en charge l&apos;utilisation de l&apos;outil apt pour obtenir le logiciel. Nous préférons généralement que vous utilisiez la première ligne comme source de mise à jour, qui est généralement la plus stable. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="498"/>
-        <location filename="../src/widget.ui" line="501"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to deepin 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
+        <source>更新源</source>
+        <translation type="vanished">Mettre à jour la source APT</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="504"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/deepin-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
+        <source>更新源服务器:</source>
+        <translation type="vanished">Source APT: </translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="517"/>
-        <location filename="../src/widget.ui" line="520"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to UOS home 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
+        <source>服务器</source>
+        <translation type="vanished">serveur</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="523"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/uos-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
+        <source>缓存目录</source>
+        <translation type="vanished">Temp</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="536"/>
-        <location filename="../src/widget.ui" line="539"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This is a  DTK5 app,which means it would have better effect on Deepin Desktop Environment&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
+        <source>清空</source>
+        <translation type="vanished">Nettoyer</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="542"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dtk-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
+        <source>因为这个目录位于/tmp下,所以即使你不手动清空的话,其也将在系统重启时自动清空。</source>
+        <translation type="vanished">Étant donné que ce répertoire se trouve sous /tmp, même si vous ne l&apos;effacez pas manuellement, il sera effacé automatiquement au redémarrage du système.</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="555"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine2 app. Spark Store will configure the wine environment for you, so don‘t worry.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
+        <source>目录大小:</source>
+        <translation type="vanished">Taille: </translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="558"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine2 app.If you are using ubuntu or other non-deepin distro,you should deploy deepin-wine2 by your self.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="561"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine2-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="574"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine5 app.Spark Store will configure the wine environment for you, so don‘t worry.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="577"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine5 app.If you are using ubuntu or other non-deepin distro,you should deploy deepin-wine5 by your self.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="580"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine5-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="593"/>
-        <location filename="../src/widget.ui" line="596"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;An Appimage to deb app.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="599"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/a2d-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="622"/>
-        <source>Request Update</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="640"/>
-        <source>Info</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="647"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;An app store developed by community enthusiasts&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="689"/>
-        <source>Screenshots</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="852"/>
-        <source>Line Settings</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="868"/>
-        <source>Choose Line:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="891"/>
-        <source>Refresh</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="904"/>
-        <source>Take effect when restart</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="933"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Check update for Spark Store. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="943"/>
-        <source>Update</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="950"/>
-        <source>Spark Store Update</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="970"/>
-        <source>Server</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="991"/>
-        <source>Temp</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1038"/>
-        <source>Clean</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1004"/>
-        <source>Since the dictionary is at /tmp,It would be cleaned automatically when  system reboot.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1051"/>
-        <source>Size:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1018"/>
-        <source>Location:/tmp/spark-store</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1058"/>
-        <source>Clear Web Cache</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1079"/>
-        <source>About us</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1086"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;We are &lt;span style=&quot; font-weight:600;&quot;&gt;NOT&lt;/span&gt; the official team, just like you, we are just one of the many Linux/deepin system enthusiasts and users, we develop and run the &amp;quot;Spark Store&amp;quot;! &amp;quot;, is to bring the community together to share useful software, or to participate in development together, so that we all use the latest and greatest software. &lt;/p&gt;&lt;p&gt;We don&apos;t make a profit from this, all developers and maintainers don&apos;t get paid, and we rely on the community&apos;s donations to us for most of our expenses, which we are grateful for and which allow us not to spend too much energy worrying about funding. &lt;/p&gt;&lt;p&gt;Our service and software are free for everyone to use, communicate, and learn, but you must comply with local laws and regulations in the process of your use, otherwise any problems have nothing to do with us. &lt;/p&gt;&lt;p&gt;If any part of the store infringes your rights, please tell us &amp;lt;jifengshenmo@outlook.com&amp;gt; we will remove the infringing content as soon as possible. &lt;/p&gt;&lt;p&gt;If you&apos;d like to get involved with us too, whether you&apos;re involved in development, design, pitching or submitting work, we welcome you to join us. &lt;/p&gt;&lt;p&gt;Connect us on Spark IM: https://chat.shenmo.tech&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1365"/>
-        <source>icon</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="285"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1011"/>
         <source>0B</source>
-        <translation type="unfinished">0B</translation>
+        <translation type="obsolete">0B</translation>
     </message>
     <message>
-        <location filename="../src/widget.cpp" line="142"/>
-        <location filename="../src/widget.cpp" line="435"/>
-        <location filename="../src/widget.cpp" line="440"/>
-        <location filename="../src/widget.cpp" line="450"/>
-        <location filename="../src/widget.cpp" line="455"/>
-        <source>Spark\ Store</source>
-        <translation type="unfinished"></translation>
+        <source>目录位置:/tmp/spark-store</source>
+        <translation type="vanished">Emplacement:/tmp/spark-store</translation>
     </message>
     <message>
-        <location filename="../src/widget.cpp" line="193"/>
-        <source>Spark Store</source>
-        <translation type="unfinished"></translation>
+        <source>关于我们</source>
+        <translation type="vanished">À propos de nous</translation>
     </message>
     <message>
-        <location filename="../src/widget.cpp" line="194"/>
-        <source>Search or enter spk://</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="200"/>
-        <source>Submit App</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="201"/>
-        <source>Submit App with client(Recommanded)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="202"/>
-        <source>Settings</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="203"/>
-        <source>APP Upgrade and Install Settings</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="373"/>
-        <source>Not Exist</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="714"/>
-        <location filename="../src/widget.cpp" line="973"/>
-        <source>Reinstall</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="680"/>
-        <source>Failed to get the name to the file to be downloaded.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="749"/>
-        <source>Do not repeat searches!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="767"/>
-        <source>Relative apps Not Found!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="781"/>
-        <source>Request Error: %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1434"/>
-        <location filename="../src/widget.cpp" line="978"/>
-        <source>Upgrade</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="1166"/>
-        <source>Updating, please wait...</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="1198"/>
-        <source>Uninstall succeeded</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="1220"/>
-        <source>Temporary cache was cleaned</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="1312"/>
-        <source>The URL has been copied to the clipboard</source>
-        <translation type="unfinished"></translation>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;我们并不是官方团队,和你一样,我们也只是众多Linux/deepin系统爱好者和用户之中的一员,我们开发并且运营这个“Spark应用商店”,是为了让社区的朋友们一起分享好用的软件,或者一起参与开发,让大家都用到最新的,最优秀的软件。&lt;/p&gt;&lt;p&gt;我们并没有因此盈利,所有开发和维护人员都不会获得报酬,我们的主要支出大部分依赖于社区对我们的捐助,很感谢大家,这部分捐助让我们并不需要耗费太多精力去担心资金问题。&lt;/p&gt;&lt;p&gt;我们的服务和开发的软件都是免费供给大家使用,交流,学习的,但是在您的使用过程中一定要遵守当地的法律法规,否则出现任何问题和我们无关。&lt;/p&gt;&lt;p&gt;如果商店中任何一部分有侵犯您权益的行为,请告知我们&amp;lt;jifengshenmo@outlook.com&amp;gt;,我们会第一时间删除侵权内容。&lt;/p&gt;&lt;p&gt;如果你也想参与我们,不管是参与开发,设计,投递还是投稿作品,我们都欢迎你的加入。&lt;/p&gt;&lt;p&gt;QQ群:872690351&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="vanished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Nous ne sommes pas l&apos;équipe officielle, tout comme vous, nous ne sommes qu&apos;un des nombreux passionnés et utilisateurs de systèmes Linux / deepin, nous développons et gérons le &quot;Spark Store&quot;! &quot;, est de rassembler la communauté pour partager des logiciels utiles, ou pour participer au développement ensemble, afin que nous utilisions tous les derniers et meilleurs logiciels. &lt;/p&gt;&lt;p&gt; Nous n&apos;en tirons aucun profit, tous les développeurs et mainteneurs ne sont pas payés, et nous comptons sur les dons de la communauté pour la plupart de nos dépenses, dont nous sommes reconnaissants et qui nous permettent de ne pas dépenser trop d&apos;énergie se soucier du financement. &lt;/p&gt;&lt;p&gt;Notre service et nos logiciels sont gratuits pour tout le monde à utiliser, à communiquer et à apprendre, mais vous devez vous conformer aux lois et réglementations locales dans le processus de votre utilisation, sinon tout problème n&apos;a rien à voir avec nous. &lt;/p&gt;&lt;p&gt;Si une partie du magasin enfreint vos droits, veuillez nous en informer &amp;lt;jifengshenmo@outlook.com&amp;gt; nous retirerons le contenu en infraction dès que possible. &lt;/p&gt;&lt;p&gt;Si vous souhaitez également vous impliquer avec nous, que vous soyez impliqué dans le développement, la conception, le pitching ou la soumission de travaux, nous vous invitons à nous rejoindre. &lt;/p&gt;&lt;p&gt;QQ group:872690351&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
     </message>
 </context>
 <context>
     <name>downloadlist</name>
     <message>
-        <location filename="../src/downloadlist.ui" line="20"/>
-        <source>Form</source>
-        <translation type="unfinished"></translation>
+        <source>名称</source>
+        <translation type="vanished">Nom</translation>
     </message>
     <message>
-        <location filename="../src/downloadlist.ui" line="50"/>
-        <source>icon</source>
-        <translation type="unfinished"></translation>
+        <source>等待开始下载</source>
+        <translatorcomment>Attendez pour téléchargerd</translatorcomment>
+        <translation type="vanished">Attendez pour télécharger</translation>
     </message>
     <message>
-        <location filename="../src/downloadlist.ui" line="82"/>
-        <source>TextLabel</source>
-        <translation type="unfinished"></translation>
+        <source>安装</source>
+        <translation type="vanished">Installer</translation>
     </message>
     <message>
-        <location filename="../src/downloadlist.ui" line="106"/>
-        <source>Name</source>
-        <translation type="unfinished"></translation>
+        <source>取消</source>
+        <translation type="vanished">Annuler</translation>
     </message>
     <message>
-        <location filename="../src/downloadlist.ui" line="189"/>
-        <source>Waiting to download</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.ui" line="240"/>
-        <source>Install</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.ui" line="259"/>
-        <source>Cancel</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.ui" line="278"/>
-        <source>Info</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.cpp" line="34"/>
-        <source>gdebi</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.cpp" line="33"/>
-        <source>deepin deb installer</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.cpp" line="32"/>
-        <source>Spark Store App Installer</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.cpp" line="74"/>
-        <source>Downloaded. Open APP Upgrade and Install Settings to enable password-free installation</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.cpp" line="101"/>
-        <source>Finished downloading %1, awaiting to install</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.cpp" line="134"/>
-        <source>Installing</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.cpp" line="177"/>
-        <source>Finish</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.cpp" line="183"/>
-        <source>Retry</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.cpp" line="184"/>
-        <source>Error happened in dpkg progress , you can try it again</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.cpp" line="190"/>
-        <source>dpkg progress had been aborted,you can retry installation</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.cpp" line="212"/>
-        <source>Download canceled</source>
-        <translation type="unfinished"></translation>
+        <source>详情</source>
+        <translation type="vanished">Détail</translation>
     </message>
 </context>
 </TS>
diff --git a/translations/spark-store_zh_CN.ts b/translations/spark-store_zh_CN.ts
index 7023e73..ed09c2a 100644
--- a/translations/spark-store_zh_CN.ts
+++ b/translations/spark-store_zh_CN.ts
@@ -1,638 +1,972 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
 <TS version="2.1" language="zh_CN">
+<context>
+    <name>AppIntoPage</name>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="14"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="216"/>
+        <source>Download</source>
+        <translation type="unfinished">下载列表</translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="256"/>
+        <source>Uninstall</source>
+        <translation type="unfinished">卸载</translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="318"/>
+        <location filename="../src/pages/appintopage.ui" line="321"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This app is developed by community user,we give this tag to honor those who contribute to the Linux Ecology&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;这款应用是社区开发者开发的,我们为社区开发者颁发这款勋章以表彰他们对Linux生态的贡献&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="324"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/community-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="337"/>
+        <location filename="../src/pages/appintopage.ui" line="340"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to Ubuntu 20.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;支持Ubuntu 20.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="343"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/ubuntu-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="356"/>
+        <location filename="../src/pages/appintopage.ui" line="359"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to UOS home 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;支持UOS家庭版 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="362"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/uos-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="375"/>
+        <location filename="../src/pages/appintopage.ui" line="378"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine2 app.If you are using ubuntu or other non-deepin distro,you should deploy deepin-wine2 by your self.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;这是一款 deepin-wine2 应用,如果你并没有在使用深度系列发行版(比如您在使用ubuntu),你需要自行配置 deepin-wine2 环境&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="381"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine2-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="394"/>
+        <location filename="../src/pages/appintopage.ui" line="397"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This is a  DTK5 app,which means it would have better effect on Deepin Desktop Environment&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;这是一款DTK5应用,请使用深度桌面环境来获得最完美的体验&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="400"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dtk-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="413"/>
+        <location filename="../src/pages/appintopage.ui" line="416"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to deepin 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;支持deepin 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="419"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/deepin-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="432"/>
+        <location filename="../src/pages/appintopage.ui" line="435"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;An Appimage to deb app.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;这是一款Appimage转制应用.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="438"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/a2d-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="451"/>
+        <location filename="../src/pages/appintopage.ui" line="454"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine5 app.If you are using ubuntu or other non-deepin distro,you should deploy deepin-wine5 by your self.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;这是一款deepin-wine5应用,如果你并没有在使用深度系列发行版(比如您在使用ubuntu),你需要自行配置deepin-wine5环境&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="457"/>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine5-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="510"/>
+        <location filename="../src/pages/appintopage.ui" line="517"/>
+        <source>PushButton</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="673"/>
+        <location filename="../src/pages/appintopage.ui" line="973"/>
+        <source>Description</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="808"/>
+        <source>Screen capture</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="1054"/>
+        <source>Update</source>
+        <translation type="unfinished">更新源</translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="1083"/>
+        <source>Contributor</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="1090"/>
+        <source>Pkgname</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="1189"/>
+        <source>Author</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="1218"/>
+        <source>Size</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.ui" line="1247"/>
+        <source>Website</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.cpp" line="76"/>
+        <source>Click Open</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.cpp" line="118"/>
+        <source>Reinstall</source>
+        <translation type="unfinished">重新安装</translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.cpp" line="123"/>
+        <source>Upgrade</source>
+        <translation type="unfinished">升级</translation>
+    </message>
+    <message>
+        <location filename="../src/pages/appintopage.cpp" line="129"/>
+        <location filename="../src/pages/appintopage.cpp" line="258"/>
+        <source>Install</source>
+        <translation type="unfinished">安装</translation>
+    </message>
+</context>
 <context>
     <name>AppItem</name>
     <message>
-        <location filename="../src/appitem.ui" line="14"/>
+        <location filename="../src/widgets/common/appitem.ui" line="26"/>
         <source>Form</source>
         <translation></translation>
     </message>
 </context>
+<context>
+    <name>AppListPage</name>
+    <message>
+        <location filename="../src/pages/applistpage.ui" line="14"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/applistpage.ui" line="62"/>
+        <source>推荐</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/pages/applistpage.cpp" line="47"/>
+        <source>搜索 </source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>DownloadItem</name>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.ui" line="20"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.ui" line="50"/>
+        <source>icon</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.ui" line="66"/>
+        <source>TextLabel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.ui" line="90"/>
+        <source>Name</source>
+        <translation type="unfinished">软件名</translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.ui" line="157"/>
+        <source>Waiting to download</source>
+        <translation type="unfinished">正在等待下载</translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.ui" line="182"/>
+        <source>Install</source>
+        <translation type="unfinished">安装</translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.ui" line="201"/>
+        <source>Cancel</source>
+        <translation type="unfinished">取消</translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.ui" line="220"/>
+        <source>Info</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="29"/>
+        <source>Spark Store App Installer</source>
+        <translation type="unfinished">星火内置安装器</translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="30"/>
+        <source>ussinstall</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="31"/>
+        <source>deepin deb installer</source>
+        <translation type="unfinished">深度软件包安装器</translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="32"/>
+        <source>gdebi</source>
+        <translation type="unfinished">gdebi</translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="76"/>
+        <source>Downloaded, waiting to install</source>
+        <translation type="unfinished">已完成,等待安装</translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="104"/>
+        <source>Download Failed,Check Your Connection</source>
+        <translation type="unfinished">下载失败,请检查网络连接</translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="149"/>
+        <source>Installing</source>
+        <translation type="unfinished">正在安装</translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="195"/>
+        <source>Finish</source>
+        <translation type="unfinished">完成</translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="201"/>
+        <source>Retry</source>
+        <translation type="unfinished">重试</translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="202"/>
+        <source>Error happened in dpkg progress , you can try it again</source>
+        <translation type="unfinished">dpkg出现错误,可重新安装</translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="208"/>
+        <source>dpkg progress had been aborted,you can retry installation</source>
+        <translation type="unfinished">安装被中止,可重新安装</translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/common/downloaditem.cpp" line="297"/>
+        <source>Download canceled</source>
+        <translation type="unfinished">下载已取消</translation>
+    </message>
+</context>
+<context>
+    <name>DownloadListWidget</name>
+    <message>
+        <location filename="../src/widgets/downloadlistwidget.ui" line="14"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/widgets/downloadlistwidget.ui" line="60"/>
+        <source>Open download directory</source>
+        <translation type="unfinished">打开下载文件夹</translation>
+    </message>
+</context>
+<context>
+    <name>HomePage</name>
+    <message>
+        <location filename="../src/pages/homepage.ui" line="16"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>MainWindow</name>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="14"/>
+        <source>MainWindow</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="82"/>
+        <source>导航</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="95"/>
+        <source>主页</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="132"/>
+        <source>网络</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="160"/>
+        <source>社交</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="188"/>
+        <source>音乐</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="216"/>
+        <source>视频</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="244"/>
+        <source>图像</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="272"/>
+        <source>游戏</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="300"/>
+        <source>办公</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="328"/>
+        <source>阅读</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="356"/>
+        <source>开发</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="384"/>
+        <source>工具</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="412"/>
+        <source>主题</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.ui" line="440"/>
+        <source>其他</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.cpp" line="87"/>
+        <source>Spark Store</source>
+        <translation type="unfinished">Spark 应用商店</translation>
+    </message>
+    <message>
+        <location filename="../src/mainwindow-dtk.cpp" line="88"/>
+        <source>Search or enter spk://</source>
+        <translation type="unfinished">搜索或打开链接</translation>
+    </message>
+</context>
 <context>
     <name>QLabel</name>
     <message>
-        <location filename="../src/main.cpp" line="67"/>
-        <location filename="../src/main.cpp" line="75"/>
-        <location filename="../src/main.cpp" line="81"/>
         <source>Spark Store</source>
-        <translation>Spark 应用商店</translation>
+        <translation type="vanished">Spark 应用商店</translation>
     </message>
 </context>
 <context>
     <name>QObject</name>
     <message>
-        <location filename="../src/main.cpp" line="64"/>
         <source>We publish this program under GPL V3</source>
-        <translation>本程序按GPL V3开源</translation>
+        <translation type="vanished">本程序按GPL V3开源</translation>
     </message>
     <message>
-        <location filename="../src/main.cpp" line="69"/>
-        <source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by  community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
-        <translation>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;一款社区维护的应用商店&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;星火计划开发者&lt;/span&gt;</translation>
+        <source>Version 2.0+2</source>
+        <translation type="vanished">版本: 2.0+2</translation>
+    </message>
+    <message>
+        <source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by deepin community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
+        <translation type="vanished">&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;deepin 社区驱动的一款第三方应用商店&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</translation>
     </message>
     <message>
-        <location filename="../src/main.cpp" line="77"/>
         <source>The Spark Project</source>
-        <translation>星火计划 The Spark Project</translation>
+        <translation type="vanished">星火项目组</translation>
+    </message>
+    <message>
+        <source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by deepin community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;&lt;br/&gt;We publish this program under GPL V3</source>
+        <translation type="vanished">&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;一款由 深度社区 出品的应用商店&lt;/span&gt;&lt;br/&gt;&quot;&quot;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&quot;&quot;&lt;span style=&apos; font-size:12pt;&apos;&gt;星火开发者联盟&lt;/span&gt;&lt;br/&gt;本程序遵循 GPL V3 协议发布</translation>
     </message>
     <message>
-        <location filename="../src/main.cpp" line="89"/>
         <source>&lt;span style=&apos;font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by deepin community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos;font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;Published under GPL V3</source>
-        <translation>&lt;span style=&apos;font-size:10pt;font-weight:60;&apos;&gt;由 Deepin 社区出品的应用商店&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos;font-size:12pt;&apos;&gt;星火商店开发组&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;遵循 GPL V3 协议发布</translation>
+        <translation type="vanished">&lt;span style=&apos;font-size:10pt;font-weight:60;&apos;&gt;由 Deepin 社区出品的应用商店&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos;font-size:12pt;&apos;&gt;星火商店开发组&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;遵循 GPL V3 协议发布</translation>
+    </message>
+    <message>
+        <location filename="../src/main.cpp" line="38"/>
+        <location filename="../src/main.cpp" line="40"/>
+        <source>Spark Store</source>
+        <translation type="unfinished">Spark 应用商店</translation>
     </message>
 </context>
 <context>
     <name>SpkAppInfoLoaderThread</name>
     <message>
-        <location filename="../src/workerthreads.cpp" line="193"/>
         <source>Failed to download app info. Please check internet connection.</source>
-        <translation>下载应用程序详细信息失败,请检查网络连接。</translation>
+        <translation type="vanished">下载应用程序详细信息失败,请检查网络连接。</translation>
     </message>
     <message>
-        <location filename="../src/workerthreads.cpp" line="73"/>
         <source>PkgName: </source>
-        <translation>包名: </translation>
+        <translation type="vanished">包名: </translation>
     </message>
     <message>
-        <location filename="../src/workerthreads.cpp" line="74"/>
         <source>Version: </source>
-        <translation>版本: </translation>
+        <translation type="vanished">版本: </translation>
     </message>
     <message>
-        <location filename="../src/workerthreads.cpp" line="77"/>
         <source>Author: </source>
-        <translation>作者: </translation>
+        <translation type="vanished">作者: </translation>
     </message>
     <message>
-        <location filename="../src/workerthreads.cpp" line="82"/>
         <source>Official Site: </source>
-        <translation>官网: </translation>
+        <translation type="vanished">官网: </translation>
     </message>
     <message>
-        <location filename="../src/workerthreads.cpp" line="86"/>
         <source>Contributor: </source>
-        <translation>投稿者: </translation>
+        <translation type="vanished">投稿者: </translation>
     </message>
     <message>
-        <location filename="../src/workerthreads.cpp" line="87"/>
         <source>Update Time: </source>
-        <translation>更新时间: </translation>
+        <translation type="vanished">更新时间: </translation>
     </message>
     <message>
-        <location filename="../src/workerthreads.cpp" line="88"/>
         <source>Installed Size: </source>
-        <translation>大小: </translation>
+        <translation type="vanished">大小: </translation>
     </message>
     <message>
-        <location filename="../src/workerthreads.cpp" line="89"/>
-        <source>Download Times: </source>
-        <translation>下载量: </translation>
-    </message>
-    <message>
-        <location filename="../src/workerthreads.cpp" line="149"/>
         <source>Failed to load application icon.</source>
-        <translation>加载应用程序图标失败。</translation>
+        <translation type="vanished">加载应用程序图标失败。</translation>
     </message>
 </context>
 <context>
     <name>Widget</name>
     <message>
-        <location filename="../src/widget.ui" line="14"/>
-        <source>Form</source>
-        <translation></translation>
+        <source>Videos</source>
+        <translation type="vanished">视频播放</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1179"/>
-        <source>background-color:#FFFFFF</source>
-        <translation></translation>
+        <source>Download List</source>
+        <translation type="vanished">下载列表</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1312"/>
         <source>Tools</source>
-        <translation>系统工具</translation>
+        <translation type="vanished">系统工具</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1194"/>
         <source>Beautify</source>
-        <translation>主题美化</translation>
+        <translation type="vanished">主题美化</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1427"/>
         <source>Music</source>
-        <translation>音乐欣赏</translation>
+        <translation type="vanished">音乐欣赏</translation>
+    </message>
+    <message>
+        <source>Coding</source>
+        <translation type="vanished">编程开发</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1251"/>
         <source>Office</source>
-        <translation>办公学习</translation>
+        <translation type="vanished">办公学习</translation>
+    </message>
+    <message>
+        <source>Translate</source>
+        <translation type="vanished">阅读翻译</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1339"/>
         <source>Others</source>
-        <translation>其他应用</translation>
+        <translation type="vanished">其他应用</translation>
+    </message>
+    <message>
+        <source>FrontPage</source>
+        <translation type="vanished">商店首页</translation>
+    </message>
+    <message>
+        <source>Images</source>
+        <translation type="vanished">图形图像</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1244"/>
         <source>Games</source>
-        <translation>游戏娱乐</translation>
+        <translation type="vanished">游戏娱乐</translation>
+    </message>
+    <message>
+        <source>Chatting</source>
+        <translation type="vanished">社交沟通</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1224"/>
         <source>Network</source>
-        <translation>网络应用</translation>
+        <translation type="vanished">网络应用</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="125"/>
         <source>The list is currently empty. Go and download some softwares!</source>
-        <translation>当前下载列表为空。去下载些软件吧!</translation>
+        <translation type="vanished">当前下载列表为空。去下载些软件吧!</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="157"/>
         <source>Open download directory</source>
-        <translation>打开下载文件夹</translation>
+        <translation type="vanished">打开下载文件夹</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="270"/>
         <source>Name</source>
-        <translation>软件名</translation>
+        <translation type="vanished">软件名</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="316"/>
-        <source>ICON</source>
-        <translation></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="257"/>
-        <location filename="../src/widget.cpp" line="984"/>
-        <location filename="../src/widget.cpp" line="1194"/>
         <source>Install</source>
-        <translation>安装</translation>
+        <translation type="vanished">安装</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1285"/>
         <source>Video</source>
-        <translation>视频播放</translation>
+        <translation type="vanished">视频播放</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1258"/>
         <source>Download</source>
-        <translation>下载列表</translation>
+        <translation type="vanished">下载列表</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1332"/>
         <source>Reading</source>
-        <translation>阅读翻译</translation>
+        <translation type="vanished">阅读翻译</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1201"/>
         <source>Chat</source>
-        <translation>社交沟通</translation>
+        <translation type="vanished">社交沟通</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="371"/>
         <source>Uninstall</source>
-        <translation>卸载</translation>
+        <translation type="vanished">卸载</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="387"/>
         <source>Site</source>
-        <translation>官网</translation>
+        <translation type="vanished">官网</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="460"/>
-        <location filename="../src/widget.ui" line="463"/>
         <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This app is developed by community user,we give this tag to honor those who contribute to the Linux Ecology&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;这款应用是社区开发者开发的,我们为社区开发者颁发这款勋章以表彰他们对Linux生态的贡献&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+        <translation type="vanished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;这款应用是社区开发者开发的,我们为社区开发者颁发这款勋章以表彰他们对Linux生态的贡献&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="466"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/community-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation></translation>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to Ubuntu 20.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="vanished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;支持Ubuntu 20.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="479"/>
-        <location filename="../src/widget.ui" line="482"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to Ubuntu 22.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;支持Ubuntu 22.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="498"/>
-        <location filename="../src/widget.ui" line="501"/>
         <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to deepin 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;支持deepin 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+        <translation type="vanished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;支持deepin 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="504"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/deepin-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="517"/>
-        <location filename="../src/widget.ui" line="520"/>
         <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to UOS home 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;支持UOS家庭版 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+        <translation type="vanished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;支持UOS家庭版 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="536"/>
-        <location filename="../src/widget.ui" line="539"/>
         <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This is a  DTK5 app,which means it would have better effect on Deepin Desktop Environment&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;这是一款DTK5应用,请使用深度桌面环境来获得最完美的体验&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+        <translation type="vanished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;这是一款DTK5应用,请使用深度桌面环境来获得最完美的体验&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="542"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dtk-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="555"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine2 app. Spark Store will configure the wine environment for you, so don‘t worry.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation>这是一个deepin-wine2应用。星火商店将会为你配置好wine环境,无需担心。</translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="574"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine5 app.Spark Store will configure the wine environment for you, so don‘t worry.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation>这是一个deepin-wine5应用。星火商店将会为你配置好wine环境,无需担心。</translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="577"/>
         <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine5 app.If you are using ubuntu or other non-deepin distro,you should deploy deepin-wine5 by your self.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;这是一款deepin-wine5应用,如果你并没有在使用深度系列发行版(比如您在使用ubuntu),你需要自行配置deepin-wine5环境&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+        <translation type="vanished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;这是一款deepin-wine5应用,如果你并没有在使用深度系列发行版(比如您在使用ubuntu),你需要自行配置deepin-wine5环境&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="593"/>
-        <location filename="../src/widget.ui" line="596"/>
         <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;An Appimage to deb app.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;这是一款Appimage转制应用.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+        <translation type="vanished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;这是一款Appimage转制应用.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="599"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/a2d-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="426"/>
         <source>Share</source>
-        <translation>Spk分享链接</translation>
+        <translation type="vanished">Spk分享链接</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1385"/>
         <source>Development</source>
-        <translation>编程开发</translation>
+        <translation type="vanished">编程开发</translation>
+    </message>
+    <message>
+        <source>Home  </source>
+        <translation type="vanished">商店首页</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1346"/>
         <source>Graphics</source>
-        <translation>图形图像</translation>
+        <translation type="vanished">图形图像</translation>
+    </message>
+    <message>
+        <source>Communication</source>
+        <translation type="vanished">社交沟通</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="558"/>
         <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine2 app.If you are using ubuntu or other non-deepin distro,you should deploy deepin-wine2 by your self.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;这是一款 deepin-wine2 应用,如果你并没有在使用深度系列发行版(比如您在使用ubuntu),你需要自行配置 deepin-wine2 环境&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+        <translation type="vanished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;这是一款 deepin-wine2 应用,如果你并没有在使用深度系列发行版(比如您在使用ubuntu),你需要自行配置 deepin-wine2 环境&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="561"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine2-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation></translation>
+        <source>Contribute translation</source>
+        <translation type="vanished">贡献翻译/应用反馈</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="580"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine5-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="640"/>
         <source>Info</source>
-        <translation>详细</translation>
+        <translation type="vanished">详细</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="647"/>
         <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;An app store developed by community enthusiasts&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;由社区爱好者开发的一款应用商店&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+        <translation type="vanished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;由社区爱好者开发的一款应用商店&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="689"/>
         <source>Screenshots</source>
-        <translation>屏幕截图</translation>
+        <translation type="vanished">屏幕截图</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="852"/>
         <source>Line Settings</source>
-        <translation>线路设置</translation>
+        <translation type="vanished">线路设置</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="868"/>
         <source>Choose Line:</source>
-        <translation>线路选择:</translation>
+        <translation type="vanished">线路选择:</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="891"/>
         <source>Refresh</source>
-        <translation>刷新</translation>
+        <translation type="vanished">刷新</translation>
+    </message>
+    <message>
+        <source>Take effect when restart </source>
+        <translation type="vanished">重启商店后生效</translation>
+    </message>
+    <message>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The role of the source server is to ensure that the software is updated, and supports the use of the apt tool to get the software. We usually prefer that you use the first line as the update source, which is generally the most stable. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="vanished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;源服务器的作用是保证软件更新,并且支持使用apt工具获取软件。通常我们更建议你使用第一个线路作为更新源,一般是最稳定的。&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="943"/>
         <source>Update</source>
-        <translation>跳转更新</translation>
+        <translation type="vanished">更新源</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="950"/>
-        <source>Spark Store Update</source>
-        <translation>星火应用商店更新检测</translation>
+        <source>Source Server</source>
+        <translation type="vanished">更新源服务器</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="970"/>
-        <source>Server</source>
-        <translation></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="991"/>
         <source>Temp</source>
-        <translation>缓存目录</translation>
+        <translation type="vanished">缓存目录</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1038"/>
         <source>Clean</source>
-        <translation>清空</translation>
+        <translation type="vanished">清空</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1004"/>
         <source>Since the dictionary is at /tmp,It would be cleaned automatically when  system reboot.</source>
-        <translation>因为这个目录位于/tmp下,所以即使你不手动清空的话,其也将在系统重启时自动清空。</translation>
+        <translation type="vanished">因为这个目录位于/tmp下,所以即使你不手动清空的话,其也将在系统重启时自动清空。</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1051"/>
         <source>Size:</source>
-        <translation>目录大小:</translation>
+        <translation type="vanished">目录大小:</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1018"/>
         <source>Location:/tmp/spark-store</source>
-        <translation>目录位置:/tmp/spark-store</translation>
+        <translation type="vanished">目录位置:/tmp/spark-store</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1058"/>
-        <source>Clear Web Cache</source>
-        <translation>清理网页缓存</translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1079"/>
         <source>About us</source>
-        <translation>关于我们</translation>
+        <translation type="vanished">关于我们</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1086"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;We are &lt;span style=&quot; font-weight:600;&quot;&gt;NOT&lt;/span&gt; the official team, just like you, we are just one of the many Linux/deepin system enthusiasts and users, we develop and run the &amp;quot;Spark Store&amp;quot;! &amp;quot;, is to bring the community together to share useful software, or to participate in development together, so that we all use the latest and greatest software. &lt;/p&gt;&lt;p&gt;We don&apos;t make a profit from this, all developers and maintainers don&apos;t get paid, and we rely on the community&apos;s donations to us for most of our expenses, which we are grateful for and which allow us not to spend too much energy worrying about funding. &lt;/p&gt;&lt;p&gt;Our service and software are free for everyone to use, communicate, and learn, but you must comply with local laws and regulations in the process of your use, otherwise any problems have nothing to do with us. &lt;/p&gt;&lt;p&gt;If any part of the store infringes your rights, please tell us &amp;lt;jifengshenmo@outlook.com&amp;gt; we will remove the infringing content as soon as possible. &lt;/p&gt;&lt;p&gt;If you&apos;d like to get involved with us too, whether you&apos;re involved in development, design, pitching or submitting work, we welcome you to join us. &lt;/p&gt;&lt;p&gt;Connect us on Spark IM: https://chat.shenmo.tech&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;我们并&lt;span style=&quot; font-weight:600;&quot;&gt;不是&lt;/span&gt;官方团队,和你一样,我们也只是众多Linux/deepin系统爱好者和用户之中的一员,我们开发并且运营这个“Spark应用商店”,是为了让社区的朋友们一起分享好用的软件,或者一起参与开发,让大家都用到最新的,最优秀的软件。&lt;/p&gt;&lt;p&gt;我们并没有因此盈利,所有开发和维护人员都不会获得报酬,我们的主要支出大部分依赖于社区对我们的捐助,很感谢大家,这部分捐助让我们并不需要耗费太多精力去担心资金问题。&lt;/p&gt;&lt;p&gt;我们的服务和开发的软件都是免费供给大家使用,交流,学习的,但是在您的使用过程中一定要遵守当地的法律法规,否则出现任何问题和我们无关。&lt;/p&gt;&lt;p&gt;如果商店中任何一部分有侵犯您权益的行为,请告知我们 &amp;lt;jifengshenmo@outlook.com&amp;gt;,我们会第一时间删除侵权内容。&lt;/p&gt;&lt;p&gt;如果你也想参与我们,不管是参与开发,设计,投递还是投稿作品,我们都欢迎你的加入。&lt;/p&gt;&lt;p&gt;在 Spark IM 联系我们: https://chat.shenmo.tech&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;We are &lt;span style=&quot; font-weight:600;&quot;&gt;NOT&lt;/span&gt; the official team, just like you, we are just one of the many Linux/deepin system enthusiasts and users, we develop and run the &amp;quot;Spark Store&amp;quot;! &amp;quot;, is to bring the community together to share useful software, or to participate in development together, so that we all use the latest and greatest software. &lt;/p&gt;&lt;p&gt;We don&apos;t make a profit from this, all developers and maintainers don&apos;t get paid, and we rely on the community&apos;s donations to us for most of our expenses, which we are grateful for and which allow us not to spend too much energy worrying about funding. &lt;/p&gt;&lt;p&gt;Our service and software are free for everyone to use, communicate, and learn, but you must comply with local laws and regulations in the process of your use, otherwise any problems have nothing to do with us. &lt;/p&gt;&lt;p&gt;If any part of the store infringes your rights, please tell us &amp;lt;jifengshenmo@outlook.com&amp;gt; we will remove the infringing content as soon as possible. &lt;/p&gt;&lt;p&gt;If you&apos;d like to get involved with us too, whether you&apos;re involved in development, design, pitching or submitting work, we welcome you to join us. &lt;/p&gt;&lt;p&gt;QQ group:872690351&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+        <translation type="vanished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;我们并&lt;span style=&quot; font-weight:600;&quot;&gt;不是&lt;/span&gt;官方团队,和你一样,我们也只是众多Linux/deepin系统爱好者和用户之中的一员,我们开发并且运营这个“Spark应用商店”,是为了让社区的朋友们一起分享好用的软件,或者一起参与开发,让大家都用到最新的,最优秀的软件。&lt;/p&gt;&lt;p&gt;我们并没有因此盈利,所有开发和维护人员都不会获得报酬,我们的主要支出大部分依赖于社区对我们的捐助,很感谢大家,这部分捐助让我们并不需要耗费太多精力去担心资金问题。&lt;/p&gt;&lt;p&gt;我们的服务和开发的软件都是免费供给大家使用,交流,学习的,但是在您的使用过程中一定要遵守当地的法律法规,否则出现任何问题和我们无关。&lt;/p&gt;&lt;p&gt;如果商店中任何一部分有侵犯您权益的行为,请告知我们 &amp;lt;jifengshenmo@outlook.com&amp;gt;,我们会第一时间删除侵权内容。&lt;/p&gt;&lt;p&gt;如果你也想参与我们,不管是参与开发,设计,投递还是投稿作品,我们都欢迎你的加入。&lt;/p&gt;&lt;p&gt;QQ 群:872690351&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1365"/>
-        <source>icon</source>
-        <translation></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1298"/>
         <source>Back to category</source>
-        <translation>返回分类</translation>
+        <translation type="vanished">返回分类</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1322"/>
         <source>Home</source>
-        <translation>商店首页</translation>
+        <translation type="vanished">商店首页</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1271"/>
         <source>Reload</source>
-        <translation>刷新</translation>
+        <translation type="vanished">刷新</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="285"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="485"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/ubuntu-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="523"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/uos-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="622"/>
-        <source>Request Update</source>
-        <translation>软件催更/应用反馈</translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="904"/>
         <source>Take effect when restart</source>
-        <translation>重启商店后生效</translation>
+        <translation type="vanished">重启商店后生效</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="933"/>
-        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Check update for Spark Store. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation>检查星火应用商店更新</translation>
-    </message>
-    <message>
-        <location filename="../src/widget.ui" line="1011"/>
-        <source>0B</source>
-        <translation></translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="193"/>
         <source>Spark Store</source>
-        <translation>Spark 应用商店</translation>
+        <translation type="vanished">Spark 应用商店</translation>
     </message>
     <message>
-        <location filename="../src/widget.cpp" line="194"/>
         <source>Search or enter spk://</source>
-        <translation>搜索或打开链接</translation>
+        <translation type="vanished">搜索或打开链接</translation>
     </message>
     <message>
-        <location filename="../src/widget.cpp" line="200"/>
         <source>Submit App</source>
-        <translation>投递应用</translation>
+        <translation type="vanished">投递应用</translation>
     </message>
     <message>
-        <location filename="../src/widget.cpp" line="201"/>
-        <source>Submit App with client(Recommanded)</source>
-        <translation>使用本地投稿器投递应用(推荐)</translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="202"/>
         <source>Settings</source>
-        <translation>设置</translation>
+        <translation type="vanished">设置</translation>
     </message>
     <message>
-        <location filename="../src/widget.cpp" line="203"/>
-        <source>APP Upgrade and Install Settings</source>
-        <translation>应用更新和安装设置</translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="373"/>
         <source>Not Exist</source>
-        <translation>不存在</translation>
+        <translation type="vanished">不存在</translation>
     </message>
     <message>
-        <location filename="../src/widget.cpp" line="142"/>
-        <location filename="../src/widget.cpp" line="435"/>
-        <location filename="../src/widget.cpp" line="440"/>
-        <location filename="../src/widget.cpp" line="450"/>
-        <location filename="../src/widget.cpp" line="455"/>
         <source>Spark\ Store</source>
-        <translation>星火应用商店</translation>
+        <translation type="vanished">星火应用商店</translation>
+    </message>
+    <message>
+        <source>Failed to download app info. Please check internet connection.</source>
+        <translation type="vanished">下载应用程序详细信息失败,请检查网络连接。</translation>
+    </message>
+    <message>
+        <source>PkgName: </source>
+        <translation type="vanished">包名: </translation>
+    </message>
+    <message>
+        <source>Version: </source>
+        <translation type="vanished">版本: </translation>
+    </message>
+    <message>
+        <source>Author: </source>
+        <translation type="vanished">作者: </translation>
+    </message>
+    <message>
+        <source>Official Site: </source>
+        <translation type="vanished">官网: </translation>
+    </message>
+    <message>
+        <source>Contributor: </source>
+        <translation type="vanished">投稿者: </translation>
+    </message>
+    <message>
+        <source>Update Time: </source>
+        <translation type="vanished">更新时间: </translation>
+    </message>
+    <message>
+        <source>Installed Size: </source>
+        <translation type="vanished">大小: </translation>
     </message>
     <message>
-        <location filename="../src/widget.cpp" line="714"/>
-        <location filename="../src/widget.cpp" line="973"/>
         <source>Reinstall</source>
-        <translation>重新安装</translation>
+        <translation type="vanished">重新安装</translation>
+    </message>
+    <message>
+        <source>Failed to load application icon.</source>
+        <translation type="vanished">加载应用程序图标失败。</translation>
     </message>
     <message>
-        <location filename="../src/widget.cpp" line="680"/>
         <source>Failed to get the name to the file to be downloaded.</source>
-        <translation>获取安装包文件名失败。</translation>
+        <translation type="vanished">获取安装包文件名失败。</translation>
     </message>
     <message>
-        <location filename="../src/widget.cpp" line="749"/>
-        <source>Do not repeat searches!</source>
-        <translation>请勿频繁搜索!</translation>
-    </message>
-    <message>
-        <location filename="../src/widget.cpp" line="767"/>
         <source>Relative apps Not Found!</source>
-        <translation>相关应用未找到!</translation>
+        <translation type="vanished">相关应用未找到!</translation>
     </message>
     <message>
-        <location filename="../src/widget.cpp" line="781"/>
         <source>Request Error: %1</source>
-        <translation>请求错误:%1</translation>
+        <translation type="vanished">请求错误:%1</translation>
+    </message>
+    <message>
+        <source>Spark store could only process spk:// links for now. The search feature is coming soon!</source>
+        <translation type="vanished">目前仅支持商店专用链接的打开,搜索功能正在开发,请期待以后的版本!</translation>
     </message>
     <message>
-        <location filename="../src/widget.ui" line="1434"/>
-        <location filename="../src/widget.cpp" line="978"/>
         <source>Upgrade</source>
-        <translation>软件升级</translation>
+        <translation type="vanished">升级</translation>
     </message>
     <message>
-        <location filename="../src/widget.cpp" line="1166"/>
         <source>Updating, please wait...</source>
-        <translation>正在更新,请稍候……</translation>
+        <translation type="vanished">正在更新,请稍候……</translation>
+    </message>
+    <message>
+        <source>Apt has reported an error. Please use apt update in terminal to locate the problem.</source>
+        <translation type="vanished">更新中发生错误,请在终端使用apt update来查看错误原因。</translation>
+    </message>
+    <message>
+        <source>Unknown error!</source>
+        <translation type="vanished">未知错误!</translation>
+    </message>
+    <message>
+        <source>Yes</source>
+        <translation type="vanished">是</translation>
+    </message>
+    <message>
+        <source>No</source>
+        <translation type="vanished">否</translation>
+    </message>
+    <message>
+        <source>Information for Contributors</source>
+        <translation type="vanished">贡献者须知</translation>
+    </message>
+    <message>
+        <source>Currently the translation contribution is limited to English,
+and you will be redirected to our Gitee repository at which you are
+supposed to be creating pull requests to contribute app info
+translations.
+Tips:You can simply click the file to edit to create a flat pull request without create a full pull request
+Tips:You can use github account to login to Gitee
+Click yes to continue.</source>
+        <translation type="vanished">目前商店仅支持应用程序英文详细信息的贡献。
+在你确认后你会被导向到我们的 Gitee 页面,
+请在此创建 Pull Request 以进行翻译贡献。
+备注:你可以直接在页面编辑以快速创建轻量级pr
+你也可以使用github账户直接登陆Gitee
+
+单击“是”以继续。</translation>
+    </message>
+    <message>
+        <source>Currently the translation contribution is limited to English,
+and you will be redirected to our Gitee repository at which you are
+supposed to be creating pull requests to contribute app info
+translations.
+
+Click yes to continue.</source>
+        <translation type="obsolete">目前商店仅支持应用程序英文详细信息的贡献。
+在你确认后你会被导向到我们的 Gitee 页面,
+请在此创建 Pull Request 以进行翻译贡献。
+备注:你可以直接在页面编辑以快速创建轻量级pr
+你也可以使用github账户直接登陆Gitee
+
+单击“是”以继续。.</translation>
+    </message>
+    <message>
+        <source>Unknown server error!</source>
+        <translation type="vanished">服务器未知错误</translation>
     </message>
     <message>
-        <location filename="../src/widget.cpp" line="1198"/>
         <source>Uninstall succeeded</source>
-        <translation>卸载成功</translation>
+        <translation type="vanished">卸载成功</translation>
     </message>
     <message>
-        <location filename="../src/widget.cpp" line="1220"/>
         <source>Temporary cache was cleaned</source>
-        <translation>缓存目录已清空</translation>
+        <translation type="vanished">缓存目录已清空</translation>
     </message>
     <message>
-        <location filename="../src/widget.cpp" line="1312"/>
         <source>The URL has been copied to the clipboard</source>
-        <translation>链接已复制到剪贴板</translation>
+        <translation type="vanished">链接已复制到剪贴板</translation>
     </message>
 </context>
 <context>
     <name>downloadlist</name>
     <message>
-        <location filename="../src/downloadlist.ui" line="20"/>
-        <source>Form</source>
-        <translation></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.ui" line="50"/>
-        <source>icon</source>
-        <translation></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.ui" line="82"/>
-        <source>TextLabel</source>
-        <translation></translation>
-    </message>
-    <message>
-        <location filename="../src/downloadlist.ui" line="106"/>
         <source>Name</source>
-        <translation>软件名</translation>
+        <translation type="vanished">软件名</translation>
     </message>
     <message>
-        <location filename="../src/downloadlist.ui" line="189"/>
         <source>Waiting to download</source>
-        <translation>正在等待下载</translation>
+        <translation type="vanished">正在等待下载</translation>
     </message>
     <message>
-        <location filename="../src/downloadlist.ui" line="240"/>
         <source>Install</source>
-        <translation>安装</translation>
+        <translation type="vanished">安装</translation>
     </message>
     <message>
-        <location filename="../src/downloadlist.ui" line="259"/>
         <source>Cancel</source>
-        <translation>取消</translation>
+        <translation type="vanished">取消</translation>
     </message>
     <message>
-        <location filename="../src/downloadlist.ui" line="278"/>
         <source>Info</source>
-        <translation>详情</translation>
+        <translation type="vanished">详情</translation>
+    </message>
+    <message>
+        <source>dpkg</source>
+        <translation type="vanished">dpkg</translation>
     </message>
     <message>
-        <location filename="../src/downloadlist.cpp" line="32"/>
         <source>Spark Store App Installer</source>
-        <translation>星火内置安装器</translation>
+        <translation type="vanished">星火内置安装器</translation>
     </message>
     <message>
-        <location filename="../src/downloadlist.cpp" line="34"/>
         <source>gdebi</source>
-        <translation>gdebi</translation>
+        <translation type="vanished">gdebi</translation>
     </message>
     <message>
-        <location filename="../src/downloadlist.cpp" line="33"/>
         <source>deepin deb installer</source>
-        <translation>深度软件包安装器</translation>
+        <translation type="vanished">深度软件包安装器</translation>
+    </message>
+    <message>
+        <source>Downloaded, waiting to install</source>
+        <translation type="vanished">已完成,等待安装</translation>
+    </message>
+    <message>
+        <source>Failed to download %1</source>
+        <translation type="vanished">下载 %1 失败</translation>
+    </message>
+    <message>
+        <source>Download Failed,Check Your Connection</source>
+        <translation type="vanished">下载失败,请检查网络连接</translation>
     </message>
     <message>
-        <location filename="../src/downloadlist.cpp" line="101"/>
         <source>Finished downloading %1, awaiting to install</source>
-        <translation>%1 下载完成,等待安装</translation>
+        <translation type="vanished">%1 下载完成,等待安装</translation>
     </message>
     <message>
-        <location filename="../src/downloadlist.cpp" line="134"/>
         <source>Installing</source>
-        <translation>正在安装</translation>
+        <translation type="vanished">正在安装</translation>
     </message>
     <message>
-        <location filename="../src/downloadlist.cpp" line="74"/>
-        <source>Downloaded. Open APP Upgrade and Install Settings to enable password-free installation</source>
-        <translation>下载完成 可进入应用更新和安装设置来启动免密码安装</translation>
+        <source>Installing...</source>
+        <translation type="obsolete">正在安装</translation>
     </message>
     <message>
-        <location filename="../src/downloadlist.cpp" line="177"/>
         <source>Finish</source>
-        <translation>完成</translation>
+        <translation type="vanished">完成</translation>
     </message>
     <message>
-        <location filename="../src/downloadlist.cpp" line="183"/>
         <source>Retry</source>
-        <translation>重试</translation>
+        <translation type="vanished">重试</translation>
     </message>
     <message>
-        <location filename="../src/downloadlist.cpp" line="184"/>
         <source>Error happened in dpkg progress , you can try it again</source>
-        <translation>dpkg出现错误,可重新安装</translation>
+        <translation type="vanished">dpkg出现错误,可重新安装</translation>
     </message>
     <message>
-        <location filename="../src/downloadlist.cpp" line="190"/>
         <source>dpkg progress had been aborted,you can retry installation</source>
-        <translation>安装被中止,可重新安装</translation>
+        <translation type="vanished">安装被中止,可重新安装</translation>
     </message>
     <message>
-        <location filename="../src/downloadlist.cpp" line="212"/>
         <source>Download canceled</source>
-        <translation>下载已取消</translation>
+        <translation type="vanished">下载已取消</translation>
     </message>
 </context>
 </TS>