mirror of
https://gitee.com/spark-store-project/spark-store
synced 2026-06-22 14:13:49 +08:00
Compare commits
69 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e5f48b9f37 | |||
| 36a3a9eb5d | |||
| b9c21e1640 | |||
| 0d823d5dc7 | |||
| 08da84e67d | |||
| d283d3f346 | |||
| 1e04500382 | |||
| 28ea231170 | |||
| 4f600f3ec7 | |||
| bf5d0cb75f | |||
| 4ca292bd34 | |||
| 12cf0a3515 | |||
| 18279ec00d | |||
| e415798ee0 | |||
| 89740ad953 | |||
| 3eddb4ce71 | |||
| 239a788019 | |||
| dc6210b545 | |||
| 94d6a566ca | |||
| c66c5c6ca3 | |||
| c974349c9f | |||
| 42362fd0ca | |||
| 63bc01c43d | |||
| 280cd983cb | |||
| 05e95b42e0 | |||
| 2614b4ae05 | |||
| e8d55cadb6 | |||
| 3534b815cc | |||
| ef75e89916 | |||
| e4daffd052 | |||
| 9c29ca2e38 | |||
| 733751db8e | |||
| db739181f2 | |||
| 0bd87eb100 | |||
| 8b690e8dea | |||
| 9329c939d7 | |||
| 232fe777e5 | |||
| 000fcf8c9d | |||
| 30bc12a8b6 | |||
| a7385aff1e | |||
| c5b786d9e6 | |||
| 55d254e147 | |||
| cccad380a4 | |||
| afe5c00af7 | |||
| 55e7fd836c | |||
| 2959d72d1c | |||
| 95b4608e82 | |||
| edef44eea8 | |||
| a4b9bd6a17 | |||
| a165cd7d67 | |||
| 387d21b29f | |||
| 63b8ae5ae7 | |||
| 9ae4fa8372 | |||
| 1eb2f8df91 | |||
| ce1de9c367 | |||
| 80284b22cb | |||
| ad1b69493a | |||
| 7ca5e9b0d0 | |||
| 873a83e6b9 | |||
| da8ee30fbd | |||
| 6d84fa0fe5 | |||
| 41d6272526 | |||
| 0f7bdf484f | |||
| bc67bcb6f0 | |||
| 134586b580 | |||
| d645b26c62 | |||
| fdc818cdb4 | |||
| 1f493a8aca | |||
| 463a8d0c04 |
@@ -0,0 +1,35 @@
|
|||||||
|
version: '1.0'
|
||||||
|
name: dtk-build-commit-20220425
|
||||||
|
displayName: dtk-build-commit
|
||||||
|
triggers:
|
||||||
|
trigger: manual
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
prefix:
|
||||||
|
- master
|
||||||
|
tags:
|
||||||
|
prefix:
|
||||||
|
- ''
|
||||||
|
stages:
|
||||||
|
- name: stage-4e566164
|
||||||
|
displayName: build
|
||||||
|
strategy: naturally
|
||||||
|
trigger: auto
|
||||||
|
executor: []
|
||||||
|
steps:
|
||||||
|
- step: execute@docker
|
||||||
|
name: execute_by_docker
|
||||||
|
displayName: 基于镜像的脚本执行
|
||||||
|
certificate: d3a72e50-a6b5-013a-3031-5e77c3ac149e
|
||||||
|
image: hub.docker.com/r/shenmo7192/uos-21-dtk5.4
|
||||||
|
command:
|
||||||
|
- git clone https://gitee.com/deepin-community-store/spark-store
|
||||||
|
- mkdir debs
|
||||||
|
- cd spark-store
|
||||||
|
- dpkg-buildpackage
|
||||||
|
- mv *.deb ../debs
|
||||||
|
- cd ../debs
|
||||||
|
- curl -s --url "smtp://smtp.163.com" --mail-from "sparkstorefeedback@163.com" --mail-rcpt "shenmo@spark-app.store" --upload-file ./*.deb --user "sparkstorefeedback@163.com:YWYGLQNOPLWNNJJY"
|
||||||
|
permissions:
|
||||||
|
- role: admin
|
||||||
|
members: []
|
||||||
@@ -0,0 +1,328 @@
|
|||||||
|
|
||||||
|
#### 说明
|
||||||
|
|
||||||
|
当前服务器线路列表(项目中包含):
|
||||||
|
|
||||||
|
```
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
```
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
#### 调用参数(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 |
|
||||||
Vendored
+3
-6
@@ -4,12 +4,11 @@ pipeline {
|
|||||||
stage('build') {
|
stage('build') {
|
||||||
agent {
|
agent {
|
||||||
docker {
|
docker {
|
||||||
image 'jerry979/dtke:5.11.1'
|
image 'sparkstore/qt-build-image:5.11-1'
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
steps {
|
steps {
|
||||||
sh 'mkdir build && cd build && qmake .. && make '
|
sh 'mkdir build && cd build && qmake .. && make && cd ..'
|
||||||
archiveArtifacts(artifacts: 'build/src/spark-store', allowEmptyArchive: true, defaultExcludes: true)
|
archiveArtifacts(artifacts: 'build/src/spark-store', allowEmptyArchive: true, defaultExcludes: true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -19,15 +18,13 @@ pipeline {
|
|||||||
dockerfile {
|
dockerfile {
|
||||||
filename '.gitee/Dockerfile'
|
filename '.gitee/Dockerfile'
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
environment {
|
environment {
|
||||||
gitee_token = credentials('1')
|
gitee_token = credentials('1')
|
||||||
}
|
}
|
||||||
steps {
|
steps {
|
||||||
sh "python3 .gitee/callback.py"
|
sh 'python3 .gitee/callback.py'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,388 +1,41 @@
|
|||||||
# 星火应用商店
|
# 星火应用商店
|
||||||
|
[](https://gitee.com/deepin-community-store/spark-store/stargazers) [](https://gitee.com/deepin-community-store/spark-store/members)
|
||||||
|
|
||||||
众所周知,国内的Linux应用比较少,wine应用难以获取,优质工具分散在民间各大论坛,无法形成合力,难以改善生态
|
众所周知,国内的Linux应用比较少,wine应用难以获取,优质工具分散在民间各大论坛,无法形成合力,难以改善生态
|
||||||
|
|
||||||
生态构建需要的不是某一方的单打独斗,而是人人行动起来,汇聚星火,产生燎原之势
|
生态构建需要的不是某一方的单打独斗,而是人人行动起来,汇聚星火,产生燎原之势
|
||||||
|
|
||||||
我们创建了这个应用商店,广泛收录大家需要的软件包,搜集优质小工具,主动适配wine应用,存放到储存库供大家获取
|
我们创建了这个应用商店,广泛收录大家需要的软件包,搜集优质小工具,主动适配wine应用,存放到储存库供大家获取
|
||||||
|
我们支持:Deepin 20 ; Ubuntu 22.04 LTS / Ubuntu 20.04 LTS(将会逐渐停止支持) ; UOS Home 21
|
||||||
我们支持:Deepin 20 ; Ubuntu 20.04 LTS ; UOS Home 20
|
|
||||||
|
|
||||||
希望看到这里的人也可以加入我们的队伍,开发或者投递应用都很欢迎,共同构建Linux应用生态
|
希望看到这里的人也可以加入我们的队伍,开发或者投递应用都很欢迎,共同构建Linux应用生态
|
||||||
|
|
||||||
### [在这里投稿](https://upload.deepinos.org/index)
|
如果有想要提交的软件包,请 [在这里投稿](https://upload.deepinos.org/index)
|
||||||
|
|
||||||
web页面部分正在开发当中,详情请见[web仓库](https://gitee.com/deepin-community-store/DCSAPP_WEB)
|
|
||||||
|
|
||||||
|
|
||||||
#### 说明
|
## 🙌 简单的开始
|
||||||
|
|
||||||
当前服务器线路列表(项目中包含):
|
如果想安装 `星火应用商店` ,请打开右侧的 [Release] 页面,找到最新版本,并选择适用于当前系统的安装包下载。
|
||||||
|
|
||||||
```
|
---
|
||||||
https://d.store.deepinos.org.cn/
|
#### 编译安装
|
||||||
https://store.deepinos.org.cn/
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 调用参数(spk规则)
|
|
||||||
|
|
||||||
参数只有一个Url,该url应当遵循这种格式:`spk://<任意合法字符>/web分类/包名`
|
|
||||||
|
|
||||||
例如:
|
|
||||||
|
|
||||||
[spk://abcdefg/games/store.spark-app.hmcl](spk://abcdefg/games/store.spark-app.hmcl)
|
|
||||||
|
|
||||||
|
|
||||||
可选的web分类:
|
Deepin V20/UOS 21/ Ubuntu 22.04 系统下, 安装依赖
|
||||||
|
|
||||||
| 分类名称 | web分类 |
|
|
||||||
| -------- | -------------- |
|
|
||||||
| 网络应用 | network |
|
|
||||||
| 社交沟通 | chat |
|
|
||||||
| 音乐欣赏 | music |
|
|
||||||
| 视频播放 | video |
|
|
||||||
| 图形图像 | graphics |
|
|
||||||
| 游戏娱乐 | games |
|
|
||||||
| 办公学习 | office |
|
|
||||||
| 阅读翻译 | reading |
|
|
||||||
| 编程开发 | development |
|
|
||||||
| 系统工具 | tools |
|
|
||||||
| 主题美化 | beautify |
|
|
||||||
| 其他应用 | others |
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#### 如何编译
|
|
||||||
|
|
||||||
Deepin V20/UOS 系统下, 安装依赖
|
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
sudo apt install qt5-default libdtkcore-dev libdtkgui-dev libdtkwidget-dev qtwebengine5-dev libnotify-dev
|
sudo apt install debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev
|
||||||
```
|
|
||||||
|
|
||||||
|
```
|
||||||
|
然后
|
||||||
```shell
|
```shell
|
||||||
git clone https://gitee.com/deepin-community-store/spark-store.git
|
git clone https://gitee.com/deepin-community-store/spark-store.git
|
||||||
cd spark-store
|
cd spark-store
|
||||||
mkdir build && cd build
|
dpkg-buildpackage
|
||||||
qmake ..
|
|
||||||
make -j
|
|
||||||
```
|
|
||||||
|
|
||||||
./build 文件夹下的 spark-store 即为可执行文件
|
|
||||||
|
|
||||||
P.S. 安装依赖后直接运行 build.sh 即可编译并打包
|
|
||||||
|
|
||||||
# 星火应用商店文档
|
|
||||||
|
|
||||||
# 目录结构
|
|
||||||
几个目录结构
|
|
||||||
```
|
|
||||||
/
|
|
||||||
/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);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
Vendored
+9
@@ -1,3 +1,12 @@
|
|||||||
|
spark-store (3.0.3-14) stable; urgency=medium
|
||||||
|
|
||||||
|
* Add pkexec policy: ssinstall
|
||||||
|
* Modify ssinistall script: Now will refuse run when no args are given or 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
|
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
|
* Update the ssinstall script. Now support apt-fast and will temporarily increase the spark store source priority to 500 to make depends install correctly
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
<?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="org.maicss.dnf">
|
||||||
|
<description>运行ssinstall需要权限</description>
|
||||||
|
<message>要使用ssinstall需要权限</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">/usr/local/bin/ssinstall</annotate>
|
||||||
|
<annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
|
||||||
|
</action>
|
||||||
|
</policyconfig>
|
||||||
@@ -33,6 +33,9 @@ desktop.path = /usr/share/applications
|
|||||||
service.files += pkg/usr/lib/systemd/system/spark-update-notifier.service
|
service.files += pkg/usr/lib/systemd/system/spark-update-notifier.service
|
||||||
service.path = /usr/lib/systemd/system/
|
service.path = /usr/lib/systemd/system/
|
||||||
|
|
||||||
|
polkit-1.files +=pkg/usr/share/polkit-1/actions/store.spark-app.ssinstall.policy
|
||||||
|
polkit-1.path = /usr/share/polkit-1/actions/
|
||||||
|
|
||||||
|
|
||||||
icon.files += pkg/usr/share/icons/hicolor/scalable/apps/spark-store.svg
|
icon.files += pkg/usr/share/icons/hicolor/scalable/apps/spark-store.svg
|
||||||
icon.path = /usr/share/icons/hicolor/scalable/apps
|
icon.path = /usr/share/icons/hicolor/scalable/apps
|
||||||
@@ -49,3 +52,5 @@ INSTALLS += \
|
|||||||
preferences \
|
preferences \
|
||||||
tmp \
|
tmp \
|
||||||
service
|
service
|
||||||
|
# polkit-1
|
||||||
|
# 暂时不添加
|
||||||
|
|||||||
+2
-2
@@ -30,7 +30,7 @@ int main(int argc, char *argv[])
|
|||||||
DAboutDialog dialog;
|
DAboutDialog dialog;
|
||||||
a.setAboutDialog(&dialog);
|
a.setAboutDialog(&dialog);
|
||||||
dialog.setLicense(QObject::tr("We publish this program under GPL V3"));
|
dialog.setLicense(QObject::tr("We publish this program under GPL V3"));
|
||||||
dialog.setVersion(DApplication::buildVersion("Version 3.0.3-13"));
|
dialog.setVersion(DApplication::buildVersion("Version 3.1"));
|
||||||
dialog.setProductIcon(QIcon::fromTheme("spark-store")); // 设置Logo
|
dialog.setProductIcon(QIcon::fromTheme("spark-store")); // 设置Logo
|
||||||
dialog.setProductName(QLabel::tr("Spark Store"));
|
dialog.setProductName(QLabel::tr("Spark Store"));
|
||||||
dialog.setDescription(
|
dialog.setDescription(
|
||||||
@@ -51,7 +51,7 @@ int main(int argc, char *argv[])
|
|||||||
a.setOrganizationName("spark-union");
|
a.setOrganizationName("spark-union");
|
||||||
a.setOrganizationDomain("https://www.deepinos.org/");
|
a.setOrganizationDomain("https://www.deepinos.org/");
|
||||||
a.setApplicationName("Spark Store"); //不需要翻译,否则 ~/.local/share/ 下文件夹名称也被翻译为中文
|
a.setApplicationName("Spark Store"); //不需要翻译,否则 ~/.local/share/ 下文件夹名称也被翻译为中文
|
||||||
a.setApplicationVersion(DApplication::buildVersion("3.0.3-13"));
|
a.setApplicationVersion(DApplication::buildVersion("3.1"));
|
||||||
a.setApplicationAcknowledgementPage("https://gitee.com/deepin-community-store/spark-store");
|
a.setApplicationAcknowledgementPage("https://gitee.com/deepin-community-store/spark-store");
|
||||||
a.setApplicationDescription(
|
a.setApplicationDescription(
|
||||||
QObject::tr(
|
QObject::tr(
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
uname=`whoami`
|
||||||
|
echo "Now input the password of $uname"
|
||||||
|
read upass
|
||||||
|
passcheck=`echo "$upass" | sudo -S echo "i love amber forever"`
|
||||||
|
if [ "$passcheck" != "i love amber forever" ];then
|
||||||
|
echo "114514首"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo "go go Baron Bunny"
|
||||||
|
fi
|
||||||
@@ -3,8 +3,83 @@
|
|||||||
|
|
||||||
echo "Spark Store Install script.星火商店安装脚本"
|
echo "Spark Store Install script.星火商店安装脚本"
|
||||||
|
|
||||||
|
#################检测文件是否存在
|
||||||
|
if [ $# -eq 0 ];then
|
||||||
|
echo "没有接收到参数,退出"
|
||||||
|
echo "用法:$0 deb路径"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f "$1" ]
|
||||||
|
then
|
||||||
|
echo "文件不存在"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
#################root校验+要密码
|
||||||
|
if [ "$(id -u)" != "0" ]
|
||||||
|
then
|
||||||
|
echo "ssinstall需要在root下运行";
|
||||||
|
uname=`whoami`
|
||||||
|
echo "Now input the password of $uname"
|
||||||
|
read upass
|
||||||
|
################检查密码对不对
|
||||||
|
echo "$upass" | sudo -S echo "i love amber forever"
|
||||||
|
passcheck=`echo "$upass" | sudo -S echo "i love amber forever"`
|
||||||
|
if [ "$passcheck" != "i love amber forever" ];then
|
||||||
|
echo "-----------------------------------------------------"
|
||||||
|
echo "E:密码错误,退出脚本!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
##################apt-fast/metalink测试
|
||||||
DEPEND=`which apt-fast`
|
DEPEND=`which apt-fast`
|
||||||
isuos=`cat /etc/os-release | grep UnionTech`
|
isuos=`cat /etc/os-release | grep UnionTech`
|
||||||
|
|
||||||
|
|
||||||
|
##############判断是否是root运行,如果是,则正常走;如果不是,则代输密码
|
||||||
|
if [ "$(id -u)" != "0" ];then
|
||||||
|
#############################无root权限时
|
||||||
|
#临时提升星火源的优先级
|
||||||
|
echo "$upass" | sudo -S sed -i 's/400/500/g' /etc/apt/preferences.d/sparkstore
|
||||||
|
|
||||||
|
if [ "$DEPEND" = "" ] ; then
|
||||||
|
echo "没有检测到apt-fast组件,将会使用单线程下载依赖"
|
||||||
|
echo "你可以安装apt-fast来加速下载(对UOS无效)"
|
||||||
|
echo "若要使用apt-fast加速下载,请在安装apt-fast时选择使用apt并选择略过确认对话框"
|
||||||
|
echo ----------------------------------------------------------------------------------
|
||||||
|
echo "$upass" | sudo -S dpkg -i $1 || apt install -yf || dpkg -P $1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ "$DEPEND" != "" ] && [ "$isuos" != "" ]; then
|
||||||
|
echo "UOS中系统依赖无法使用第三方下载工具,放弃使用apt-fast"
|
||||||
|
echo ----------------------------------------------------------------------------------
|
||||||
|
dpkg -i $1 || apt install -yf || dpkg -P $1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$DEPEND" != "" ] && [ "$isuos" = "" ]; then
|
||||||
|
echo "检测到apt-fast,使用apt-fast进行多线程下载加速"
|
||||||
|
echo ----------------------------------------------------------------------------------
|
||||||
|
echo "$upass" | sudo -S dpkg -i $1 || apt-fast install -yf || dpkg -P $1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$upass" | sudo -S sed -i 's/500/400/g' /etc/apt/preferences.d/sparkstore
|
||||||
|
#恢复优先级
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
else
|
||||||
|
###########################有root权限时
|
||||||
|
|
||||||
#临时提升星火源的优先级
|
#临时提升星火源的优先级
|
||||||
sed -i 's/400/500/g' /etc/apt/preferences.d/sparkstore
|
sed -i 's/400/500/g' /etc/apt/preferences.d/sparkstore
|
||||||
|
|
||||||
@@ -31,3 +106,7 @@ fi
|
|||||||
|
|
||||||
sed -i 's/500/400/g' /etc/apt/preferences.d/sparkstore
|
sed -i 's/500/400/g' /etc/apt/preferences.d/sparkstore
|
||||||
#恢复优先级
|
#恢复优先级
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
fi
|
||||||
|
|||||||
@@ -1,4 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -e
|
DEPEND=`which apt-fast`
|
||||||
|
if [ "$DEPEND" = "" ] ; then
|
||||||
|
echo "没有安装apt-fast,使用apt运行"
|
||||||
sudo apt upgrade -o Dir::Etc::sourcelist="sources.list.d/sparkstore.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
|
sudo apt upgrade -o Dir::Etc::sourcelist="sources.list.d/sparkstore.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
|
||||||
|
else
|
||||||
|
echo "已安装apt-fast,使用apt-fast加速运行"
|
||||||
|
sudo apt-fast upgrade -o Dir::Etc::sourcelist="sources.list.d/sparkstore.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
|
||||||
|
fi
|
||||||
@@ -18,10 +18,20 @@ read
|
|||||||
reset
|
reset
|
||||||
|
|
||||||
endloop=0
|
endloop=0
|
||||||
|
|
||||||
|
|
||||||
while [ $endloop -eq 0 ] ;do
|
while [ $endloop -eq 0 ] ;do
|
||||||
|
|
||||||
|
if [ -f /etc/xdg/autostart/spark-update-notifier.desktop ];then
|
||||||
|
textupdateopen="关闭"
|
||||||
|
#已经开启了就显示关闭
|
||||||
|
else
|
||||||
|
textupdateopen="开启"
|
||||||
|
fi
|
||||||
|
|
||||||
echo "欢迎使用星火更新工具 脚本版 "
|
echo "欢迎使用星火更新工具 脚本版 "
|
||||||
echo "请在以下操作中选择一个进行~"
|
echo "请在以下操作中选择一个进行~"
|
||||||
echo "输入1 开启或关闭星火更新检测工具(如果开启则会在系统启动后自动检测更新。如有更新则会弹出通知)"
|
echo "输入1 $textupdateopen星火更新检测工具(如果开启则会在系统启动后自动检测更新。如有更新则会弹出通知)"
|
||||||
echo "输入2 查看可更新软件包列表并决定是否更新"
|
echo "输入2 查看可更新软件包列表并决定是否更新"
|
||||||
echo "输入3 退出脚本"
|
echo "输入3 退出脚本"
|
||||||
read option
|
read option
|
||||||
|
|||||||
Reference in New Issue
Block a user