main
yang.yongquan 2023-07-07 01:46:30 +08:00
commit b6627ccd2c
19 changed files with 566 additions and 117 deletions

View File

@ -6,7 +6,7 @@ set(CMAKE_AUTOMOC ON)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD 20)
find_package(Qt6 COMPONENTS Quick WebEngineQuick REQUIRED) find_package(Qt6 COMPONENTS Gui Quick WebEngineQuick REQUIRED)
#Cpp #Cpp
file(GLOB_RECURSE CPP_FILES src/*.cpp src/*.h) file(GLOB_RECURSE CPP_FILES src/*.cpp src/*.h)

View File

@ -102,6 +102,7 @@ FluWindow {
target: SignalFileOperation target: SignalFileOperation
function onOpen(file) { function onOpen(file) {
stack_view.clear() stack_view.clear()
UserData.viewHistory.push(file)
stack_view.push(file_view, { stack_view.push(file_view, {
"knowledgeFileId": file "knowledgeFileId": file
}) })

View File

@ -117,6 +117,20 @@ Rectangle {
Layout.rightMargin: 10 Layout.rightMargin: 10
iconSource: FluentIcons.PenPalette iconSource: FluentIcons.PenPalette
iconSize: 14 iconSize: 14
onClicked: {
note_menu.open()
}
FluMenu {
id: note_menu
x: parent ? (parent.width - width) / 2 : 0
y: parent ? parent.height : 0
FluMenuItem {
text: "收藏的笔记"
}
FluMenuItem {
text: "我的笔记"
}
}
} }
Text { Text {
@ -218,5 +232,6 @@ Rectangle {
frameless_helper.setHitTestVisible(btn_maximize) frameless_helper.setHitTestVisible(btn_maximize)
frameless_helper.setHitTestVisible(btn_close) frameless_helper.setHitTestVisible(btn_close)
frameless_helper.setHitTestVisible(btn_transfer) frameless_helper.setHitTestVisible(btn_transfer)
frameless_helper.setHitTestVisible(btn_note)
} }
} }

View File

@ -37,12 +37,15 @@ FluArea {
message: fileItem.title message: fileItem.title
onPositiveClicked: text => { onPositiveClicked: text => {
var param = { var param = {
"name": text, "parentId": fileItem.fuuid,
"parentId": fuuid "name": text
} }
Request.post("/knowledge", console.log(JSON.stringify(param))
JSON.stringify(param)) Request.put(
"/knowledge/" + fileItem.uuid,
JSON.stringify(param), () => {
refresh() refresh()
})
} }
} }
} }
@ -63,6 +66,7 @@ FluArea {
"parentId": uuid, "parentId": uuid,
"name": fileItem.title "name": fileItem.title
} }
console.log(JSON.stringify(param))
Request.put( Request.put(
"/knowledge/" + fileItem.uuid, "/knowledge/" + fileItem.uuid,
JSON.stringify(param), () => { JSON.stringify(param), () => {
@ -114,6 +118,7 @@ FluArea {
font.bold: true font.bold: true
font.pointSize: 12 font.pointSize: 12
text: fileItem.title text: fileItem.title
textFormat: Text.RichText
} }
} }

View File

@ -4,6 +4,8 @@ import QtQuick.Window
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Controls.Basic import QtQuick.Controls.Basic
import FluentUI import FluentUI
import QtQml
import "qrc:///AicsKnowledgeBase/qml/global"
Rectangle { Rectangle {
id: input id: input
@ -13,10 +15,32 @@ Rectangle {
radius: 5 radius: 5
clip: true clip: true
border.color: textInput.activeFocus ? "#268CDC":"#979592" //gray100
ListModel { id: tagListModel } ListModel { id: tagListModel }
property ListModel tagList: tagListModel property ListModel tagList: tagListModel
property var tagMap:[]
property var presetsTags:[]
property var presetsTagsItem:[]
Component.onCompleted: {
Request.get("tag?name",
function(result, data){
// console.log("success")
// console.log(result)
// console.log(data.length)
for(var i =0;i<data.length;i++){
tagMap.push([data[i].id,data[i].name])
presetsTags.push(data[i].name)
presetsTagsItem.push({title:data[i].name})
}
// console.log(tagMap)
// console.log(presetsTags)
},function (p1, p2) {
// console.log("failure")
// console.log(p1)
// console.log(p2)
})
}
Row { Row {
x: 5 x: 5
@ -48,23 +72,23 @@ Rectangle {
width: input.width - rowTag.width width: input.width - rowTag.width
height: parent.height height: parent.height
TextField { FluAutoSuggestBox{
id:textInput id:textInput
placeholderText: qsTr("按回车键Enter创建标签") anchors.verticalCenter: parent.verticalCenter
width: parent.width
placeholderText: "按回车键Enter创建标签"
Layout.preferredWidth: 300
//items:[{title:""},{title:""},{title:""}]
items: presetsTagsItem
onFocusChanged: { onFocusChanged: {
text ="" text =""
} }
anchors.verticalCenter: parent.verticalCenter
width: parent.width - 15
clip: true
background: Rectangle {
}
Keys.onReturnPressed: { Keys.onReturnPressed: {
var presetsTags = ["前端","后端","数据库"]
if (text.length === 0) if (text.length === 0)
return return
@ -72,12 +96,10 @@ Rectangle {
text = "" text = ""
return return
} }
tagListModel.append({"tag": text}) tagListModel.append({"tag": text})
//console.log(tagListModel.get(0)) //console.log(tagListModel.get(0))
text = "" text = ""
} }
Keys.onPressed: { Keys.onPressed: {
if (event.key === Qt.Key_Backspace) { if (event.key === Qt.Key_Backspace) {
if (text.length === 0 && tagListModel.count) { if (text.length === 0 && tagListModel.count) {
@ -86,7 +108,6 @@ Rectangle {
} }
} }
} }
} }
} }

View File

@ -5,6 +5,7 @@ import QtQuick.Layouts
import Qt5Compat.GraphicalEffects import Qt5Compat.GraphicalEffects
import FluentUI import FluentUI
import AicsKB.FileTransferManager import AicsKB.FileTransferManager
import "qrc:///AicsKnowledgeBase/qml/global"
Popup { Popup {
id: transfer_popup id: transfer_popup
@ -18,6 +19,15 @@ Popup {
FluShadow {} FluShadow {}
} }
Connections {
target: FileTransferManager
onTransferComplete: (download, fileId, fileName) => {
console.log("onTransferComplete")
UserData.downloadedFiles.push(fileId)
console.log(UserData.downloadedFiles)
}
}
contentItem: FluScrollablePage { contentItem: FluScrollablePage {
anchors.fill: parent anchors.fill: parent
anchors.topMargin: 10 anchors.topMargin: 10
@ -30,21 +40,41 @@ Popup {
Layout.fillWidth: true Layout.fillWidth: true
height: 50 height: 50
ColumnLayout { Item {
anchors.fill: parent anchors.fill: parent
anchors.margins: 5 anchors.topMargin: 5
anchors.bottomMargin: 5
anchors.leftMargin: 0
Image {
id: icon
anchors.verticalCenter: parent.verticalCenter
width: 32
height: 32
source: download ? "qrc:/AicsKnowledgeBase/res/download.png" : "qrc:/AicsKnowledgeBase/res/upload.png"
}
ColumnLayout {
anchors.left: icon.right
anchors.right: parent.right
anchors.leftMargin: 5
spacing: 2 spacing: 2
Text { Text {
text: name text: name
} }
Text {
visible: completedSize >= totalSize
text: "已完成"
color: FluColors.Grey130
}
FluProgressBar { FluProgressBar {
Layout.fillWidth: true Layout.fillWidth: true
progress: completedSize / totalSize progress: completedSize / totalSize
indeterminate: false indeterminate: false
visible: completedSize < totalSize
} }
Text { Text {
visible: completedSize < totalSize
color: FluColors.Grey130 color: FluColors.Grey130
text: formatSize(speed) + "/s - " + formatSize( text: formatSize(speed) + "/s - " + formatSize(
completedSize) + "/" + formatSize( completedSize) + "/" + formatSize(
@ -60,8 +90,10 @@ Popup {
*/ */
function formatSize(size, pointLength, units) { function formatSize(size, pointLength, units) {
var unit var unit
units = units || ['B', 'KB', 'MB', 'GB', 'TB'] units = units
while ((unit = units.shift()) && size > 1024) { || ['B', 'KB', 'MB', 'GB', 'TB']
while ((unit = units.shift())
&& size > 1024) {
size = size / 1024 size = size / 1024
} }
return (unit === 'B' ? size : size.toFixed( return (unit === 'B' ? size : size.toFixed(
@ -69,11 +101,15 @@ Popup {
} }
} }
} }
}
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
hoverEnabled: true hoverEnabled: true
onEntered: file_buttons.visible = true onEntered: {
if (completedSize < totalSize)
file_buttons.visible = true
}
onExited: file_buttons.visible = false onExited: file_buttons.visible = false
LinearGradient { LinearGradient {

View File

@ -6,6 +6,7 @@ QtObject {
id: request id: request
property string baseUrl: "https://api.hammer-hfut.tk:233/aics/main/" property string baseUrl: "https://api.hammer-hfut.tk:233/aics/main/"
property string searchUrl: "https://api.hammer-hfut.tk:233/aics/query"
//property string baseUrl: "http://192.168.156.74:8080/" //property string baseUrl: "http://192.168.156.74:8080/"
// GET // GET
@ -17,7 +18,26 @@ QtObject {
} }
xhr.send() xhr.send()
} }
// GET in searchUrl
function getSearch(url, success, failure) {
var xhr = new XMLHttpRequest
xhr.open("GET", searchUrl + url)
xhr.onreadystatechange = function () {
handleResponse(xhr, success, failure)
}
xhr.send()
}
// PUT in searchUrl
function putSearch(url, arg, success, failure) {
var xhr = new XMLHttpRequest
xhr.open("PUT", searchUrl + url)
xhr.setRequestHeader('Content-Type', 'application/json')
xhr.withCredentials = true
xhr.onreadystatechange = function () {
handleResponse(xhr, success, failure)
}
xhr.send(arg)
}
function getAwait(url) { function getAwait(url) {
var xhr = new XMLHttpRequest var xhr = new XMLHttpRequest
xhr.open("GET", baseUrl + url, false) xhr.open("GET", baseUrl + url, false)

View File

@ -5,4 +5,6 @@ import QtQuick
QtObject { QtObject {
property string username property string username
property string userId property string userId
property var viewHistory: []
property var downloadedFiles: []
} }

View File

@ -4,18 +4,91 @@ import QtQuick.Window
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Controls.Basic import QtQuick.Controls.Basic
import FluentUI import FluentUI
import "qrc:///AicsKnowledgeBase/qml/component"
import "qrc:///AicsKnowledgeBase/qml/global"
FluArea { FluArea {
property string url: '' property string url: ''
backgroundColor: "#f9f9f9" backgroundColor: "#f9f9f9"
Layout.fillWidth: true Layout.fillWidth: true
Layout.fillHeight: true Layout.fillHeight: true
paddings: 10 paddings: 10
Layout.topMargin: 20 Layout.topMargin: 20
FluText { FluText {
id: title
Layout.topMargin: 20 Layout.topMargin: 20
text: "Audio" text: "Audio"
} }
FileList {
anchors.top: title.bottom
disableHeader: true
width: parent.width
dataModel: listModel
}
ListModel {
id: listModel
}
Component.onCompleted: {
Request.get("/knowledge?type=AUDIO", response => {
var files = JSON.parse(response)
listModel.clear()
for (var i = 0; i < files.length; i++) {
var file = files[i]
console.log(file.name)
var modelItem = {
"title": file.name,
"uuid": file.id,
"date"// cut time after 'T'
: file.createTime.substring(0, 10),
"fuuid": "0"
}
if (file.knowledgeFileAttribute === null) {
modelItem.type = "folder"
modelItem.isDir = true
modelItem.size = 0
} else {
modelItem.isDir = false
modelItem.type = getType(
file.knowledgeFileAttribute.suffix)
modelItem.size = file.knowledgeFileAttribute.size
modelItem.brief = file.knowledgeFileAttribute.brief
modelItem.pageView = file.knowledgeFileAttribute.pageView
modelItem.stars = 0
var tagString = ""
for (var j = 0; j < file.knowledgeFileAttribute.tags.length; j++) {
if (j != 0)
tagString = tagString + ","
tagString = tagString + file.knowledgeFileAttribute.tags[j].name
}
modelItem.tags = tagString
}
listModel.append(modelItem)
}
})
}
function getType(suffix) {
if (suffix === "ppt" || suffix === "pptx")
return "PPT"
else if (suffix === "doc" || suffix === "docx")
return "WORD"
else if (suffix === "pdf")
return "PDF"
else if (suffix === "txt")
return "TXT"
else if (suffix === "xls" || suffix === "xlsx")
return "EXCEL"
else if (suffix === "zip" || suffix === "rar")
return "ZIP"
else if (suffix === "png" || suffix === "jpg" || suffix === "jpeg"
|| suffix === "gif")
return "IMAGE"
else if (suffix === "mp3" || suffix === "wav")
return "AUDIO"
else if (suffix === "mp4" || suffix === "avi" || suffix === "rmvb"
|| suffix === "rm" || suffix === "wmv" || suffix === "mkv")
return "VIDEO"
else
return "OTHER"
}
} }

View File

@ -67,7 +67,7 @@ FluArea {
property int shareCount: 0 property int shareCount: 0
property int browsCount: 555 property int browsCount: 555
property bool isFavorite: false property bool isFavorite: false
property bool isDownload: false property bool isDownload: UserData.downloadedFiles.indexOf(fileId) != -1
property double fileSize: 0 property double fileSize: 0
property string title: "文章标题" property string title: "文章标题"
property list<string> tags: ["tag 1", "tag 2", "tag 3"] property list<string> tags: ["tag 1", "tag 2", "tag 3"]
@ -271,7 +271,7 @@ FluArea {
FileTransferManager.download(content_page.fileId, FileTransferManager.download(content_page.fileId,
content_page.title) content_page.title)
else { else {
FileTransferManager.openLocalFile(content_page.title)
} }
} }
} }

View File

@ -4,6 +4,8 @@ import QtQuick.Window
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Controls.Basic import QtQuick.Controls.Basic
import FluentUI import FluentUI
import "qrc:///AicsKnowledgeBase/qml/component"
import "qrc:///AicsKnowledgeBase/qml/global"
FluArea { FluArea {
property string url: '' property string url: ''
@ -14,7 +16,79 @@ FluArea {
Layout.topMargin: 20 Layout.topMargin: 20
FluText { FluText {
id: title
Layout.topMargin: 20 Layout.topMargin: 20
text: "Document" text: "Document"
} }
FileList {
anchors.top: title.bottom
disableHeader: true
width: parent.width
dataModel: listModel
}
ListModel {
id: listModel
}
Component.onCompleted: {
Request.get("/knowledge?type=DOCUMENT", response => {
var files = JSON.parse(response)
listModel.clear()
for (var i = 0; i < files.length; i++) {
var file = files[i]
console.log(file.name)
var modelItem = {
"title": file.name,
"uuid": file.id,
"date"// cut time after 'T'
: file.createTime.substring(0, 10),
"fuuid": "0"
}
if (file.knowledgeFileAttribute === null) {
modelItem.type = "folder"
modelItem.isDir = true
modelItem.size = 0
} else {
modelItem.isDir = false
modelItem.type = getType(
file.knowledgeFileAttribute.suffix)
modelItem.size = file.knowledgeFileAttribute.size
modelItem.brief = file.knowledgeFileAttribute.brief
modelItem.pageView = file.knowledgeFileAttribute.pageView
modelItem.stars = 0
var tagString = ""
for (var j = 0; j < file.knowledgeFileAttribute.tags.length; j++) {
if (j != 0)
tagString = tagString + ","
tagString = tagString + file.knowledgeFileAttribute.tags[j].name
}
modelItem.tags = tagString
}
listModel.append(modelItem)
}
})
}
function getType(suffix) {
if (suffix === "ppt" || suffix === "pptx")
return "PPT"
else if (suffix === "doc" || suffix === "docx")
return "WORD"
else if (suffix === "pdf")
return "PDF"
else if (suffix === "txt")
return "TXT"
else if (suffix === "xls" || suffix === "xlsx")
return "EXCEL"
else if (suffix === "zip" || suffix === "rar")
return "ZIP"
else if (suffix === "png" || suffix === "jpg" || suffix === "jpeg"
|| suffix === "gif")
return "IMAGE"
else if (suffix === "mp3" || suffix === "wav")
return "AUDIO"
else if (suffix === "mp4" || suffix === "avi" || suffix === "rmvb"
|| suffix === "rm" || suffix === "wmv" || suffix === "mkv")
return "VIDEO"
else
return "OTHER"
}
} }

View File

@ -4,6 +4,8 @@ import QtQuick.Window
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Controls.Basic import QtQuick.Controls.Basic
import FluentUI import FluentUI
import "qrc:///AicsKnowledgeBase/qml/component"
import "qrc:///AicsKnowledgeBase/qml/global"
FluArea { FluArea {
property string url: '' property string url: ''
@ -17,4 +19,77 @@ FluArea {
Layout.topMargin: 20 Layout.topMargin: 20
text: "History" text: "History"
} }
FileList {
anchors.top: title.bottom
disableHeader: true
width: parent.width
dataModel: listModel
}
ListModel {
id: listModel
}
Component.onCompleted: {
var history = UserData.viewHistory
console.log(history)
listModel.clear()
for (var i = 0; i < history.length; i++) {
Request.get("/knowledge/" + history[i] + "/detailed", response => {
var file = JSON.parse(response)
var modelItem = {
"title": file.name,
"uuid": file.id,
"date"// cut time after 'T'
: file.createTime.substring(0, 10),
"fuuid": ""
}
if (file.knowledgeFileAttribute === null) {
modelItem.type = "folder"
modelItem.isDir = true
modelItem.size = 0
} else {
modelItem.isDir = false
modelItem.type = getType(
file.knowledgeFileAttribute.suffix)
modelItem.size = file.knowledgeFileAttribute.size
modelItem.brief = file.knowledgeFileAttribute.brief
modelItem.pageView = file.knowledgeFileAttribute.pageView
modelItem.stars = 0
// merge file.knowledgeFileAttribute.tags array to a string
var tagString = ""
for (var j = 0; j < file.knowledgeFileAttribute.tags.length; j++) {
if (j != 0)
tagString = tagString + ","
tagString = tagString + file.knowledgeFileAttribute.tags[j].name
}
modelItem.tags = tagString
}
listModel.append(modelItem)
})
}
}
function getType(suffix) {
if (suffix === "ppt" || suffix === "pptx")
return "PPT"
else if (suffix === "doc" || suffix === "docx")
return "WORD"
else if (suffix === "pdf")
return "PDF"
else if (suffix === "txt")
return "TXT"
else if (suffix === "xls" || suffix === "xlsx")
return "EXCEL"
else if (suffix === "zip" || suffix === "rar")
return "ZIP"
else if (suffix === "png" || suffix === "jpg" || suffix === "jpeg"
|| suffix === "gif")
return "IMAGE"
else if (suffix === "mp3" || suffix === "wav")
return "AUDIO"
else if (suffix === "mp4" || suffix === "avi" || suffix === "rmvb"
|| suffix === "rm" || suffix === "wmv" || suffix === "mkv")
return "VIDEO"
else
return "OTHER"
}
} }

View File

@ -8,6 +8,7 @@ import "qrc:///AicsKnowledgeBase/qml/global"
import "qrc:///AicsKnowledgeBase/qml/component" import "qrc:///AicsKnowledgeBase/qml/component"
FluArea { FluArea {
id: searchPage
property string url: '' property string url: ''
backgroundColor: "#f9f9f9" backgroundColor: "#f9f9f9"
Layout.fillHeight: true Layout.fillHeight: true
@ -19,6 +20,8 @@ FluArea {
// Layout.topMargin: 20 // Layout.topMargin: 20
// text: "Search" // text: "Search"
// } // }
/* /*
*/ */
@ -27,6 +30,7 @@ FluArea {
width: parent.width width: parent.width
RowLayout { RowLayout {
width: parent.width width: parent.width
// FluDropDownButton{ // FluDropDownButton{
// id:select_model // id:select_model
// Layout.alignment: Qt.AlignLeft // Layout.alignment: Qt.AlignLeft
@ -52,11 +56,9 @@ FluArea {
// } // }
// ] // ]
// } // }
FluTextBox { FluTextBox {
placeholderText: "对标题进行搜索……" placeholderText: "对标题进行搜索……"
Layout.fillWidth: true Layout.fillWidth: true
} }
FluIconButton { FluIconButton {
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
@ -70,16 +72,12 @@ FluArea {
var url = "?name=" var url = "?name="
url = url + allTags[i] url = url + allTags[i]
console.log(url) console.log(url)
Request.get(url, Request.get(url, function (result, data) {
function(result, data){
allTagId.push() allTagId.push()
} })
)
} }
} }
} }
} }
FluCheckBox { FluCheckBox {
id: searchTitleAndContent id: searchTitleAndContent
@ -130,7 +128,8 @@ FluArea {
} }
function setAllStatus() { function setAllStatus() {
selectAllFormat.checked = selectVideo.checked && selectDoc.checked && selectAudio.checked selectAllFormat.checked = selectVideo.checked
&& selectDoc.checked && selectAudio.checked
} }
} }
@ -148,9 +147,9 @@ FluArea {
width: 290 width: 290
} }
function getAllTags(tagList) { function getAllTags(tagList) {
var allTags=[]; var allTags = []
for (var i = 0; i < tagList.count; i++) { for (var i = 0; i < tagList.count; i++) {
var item = tagList.get(i); var item = tagList.get(i)
allTags.push(item.tag) allTags.push(item.tag)
} }
return allTags return allTags
@ -200,4 +199,45 @@ FluArea {
} }
} }
} }
function getKnowledgeDetail(uuid, title, brief, tags) {
var raw = Request.getAwait("/knowledget/" + uuid)
var data = JSON.parse(raw)
var item = {
"uuid": uuid,
"title": title,
"brief": brief,
"isDir": false,
"date": data.createTime,
"fuuid": data.parent.id,
"pageView": data.knowledgeFileAttribute.pageView,
"stars": data.knowledgeFileAttribute.stars,
"size": data.knowledgeFileAttribute.size,
"type": getType(data.knowledgeFileAttribute.suffix),
"tags": tags
}
}
function getType(suffix) {
if (suffix === "ppt" || suffix === "pptx")
return "PPT"
else if (suffix === "doc" || suffix === "docx")
return "WORD"
else if (suffix === "pdf")
return "PDF"
else if (suffix === "txt")
return "TXT"
else if (suffix === "xls" || suffix === "xlsx")
return "EXCEL"
else if (suffix === "zip" || suffix === "rar")
return "ZIP"
else if (suffix === "png" || suffix === "jpg" || suffix === "jpeg"
|| suffix === "gif")
return "IMAGE"
else if (suffix === "mp3" || suffix === "wav")
return "AUDIO"
else if (suffix === "mp4" || suffix === "avi" || suffix === "rmvb"
|| suffix === "rm" || suffix === "wmv" || suffix === "mkv")
return "VIDEO"
else
return "OTHER"
}
} }

View File

@ -4,6 +4,8 @@ import QtQuick.Window
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Controls.Basic import QtQuick.Controls.Basic
import FluentUI import FluentUI
import "qrc:///AicsKnowledgeBase/qml/component"
import "qrc:///AicsKnowledgeBase/qml/global"
FluArea { FluArea {
property string url: '' property string url: ''
@ -14,7 +16,79 @@ FluArea {
Layout.topMargin: 20 Layout.topMargin: 20
FluText { FluText {
id: title
Layout.topMargin: 20 Layout.topMargin: 20
text: "Video" text: "Video"
} }
FileList {
anchors.top: title.bottom
disableHeader: true
width: parent.width
dataModel: listModel
}
ListModel {
id: listModel
}
Component.onCompleted: {
Request.get("/knowledge?type=VIDEO", response => {
var files = JSON.parse(response)
listModel.clear()
for (var i = 0; i < files.length; i++) {
var file = files[i]
console.log(file.name)
var modelItem = {
"title": file.name,
"uuid": file.id,
"date"// cut time after 'T'
: file.createTime.substring(0, 10),
"fuuid": "0"
}
if (file.knowledgeFileAttribute === null) {
modelItem.type = "folder"
modelItem.isDir = true
modelItem.size = 0
} else {
modelItem.isDir = false
modelItem.type = getType(
file.knowledgeFileAttribute.suffix)
modelItem.size = file.knowledgeFileAttribute.size
modelItem.brief = file.knowledgeFileAttribute.brief
modelItem.pageView = file.knowledgeFileAttribute.pageView
modelItem.stars = 0
var tagString = ""
for (var j = 0; j < file.knowledgeFileAttribute.tags.length; j++) {
if (j != 0)
tagString = tagString + ","
tagString = tagString + file.knowledgeFileAttribute.tags[j].name
}
modelItem.tags = tagString
}
listModel.append(modelItem)
}
})
}
function getType(suffix) {
if (suffix === "ppt" || suffix === "pptx")
return "PPT"
else if (suffix === "doc" || suffix === "docx")
return "WORD"
else if (suffix === "pdf")
return "PDF"
else if (suffix === "txt")
return "TXT"
else if (suffix === "xls" || suffix === "xlsx")
return "EXCEL"
else if (suffix === "zip" || suffix === "rar")
return "ZIP"
else if (suffix === "png" || suffix === "jpg" || suffix === "jpeg"
|| suffix === "gif")
return "IMAGE"
else if (suffix === "mp3" || suffix === "wav")
return "AUDIO"
else if (suffix === "mp4" || suffix === "avi" || suffix === "rmvb"
|| suffix === "rm" || suffix === "wmv" || suffix === "mkv")
return "VIDEO"
else
return "OTHER"
}
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -10,6 +10,8 @@ FileTransferListModel::FileTransferListModel(QObject *parent)
m_roleName.insert(kTotalSizeRole, "totalSize"); m_roleName.insert(kTotalSizeRole, "totalSize");
m_roleName.insert(kSpeedRole, "speed"); m_roleName.insert(kSpeedRole, "speed");
m_roleName.insert(kPausedRole, "paused"); m_roleName.insert(kPausedRole, "paused");
m_data.append({true, "id", "name", 30, 100, 30});
} }

View File

@ -8,6 +8,7 @@
#include <QJsonDocument> #include <QJsonDocument>
#include <QtConcurrent/QtConcurrent> #include <QtConcurrent/QtConcurrent>
#include <fstream> #include <fstream>
#include <QDesktopServices>
static const std::string baseUrl = "https://api.hammer-hfut.tk:233/aics/file/"; static const std::string baseUrl = "https://api.hammer-hfut.tk:233/aics/file/";
//static const std::string baseUrl = "http://127.0.0.1:4523/m1/2914957-0-6e5f2db1/"; //static const std::string baseUrl = "http://127.0.0.1:4523/m1/2914957-0-6e5f2db1/";
@ -73,8 +74,8 @@ static int xferinfo(void *p, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ul
fileTrans->completedSize += dlnow; fileTrans->completedSize += dlnow;
fileTrans->speed = speed; fileTrans->speed = speed;
qDebug() << std::format("Downloading: {} / {}, Speed: {}", fileTrans->completedSize, fileTrans->totalSize, //qDebug() << std::format("Downloading: {} / {}, Speed: {}", fileTrans->completedSize, fileTrans->totalSize,
speed).c_str(); // speed).c_str();
auto item = static_cast<FileItem>(*fileTrans); auto item = static_cast<FileItem>(*fileTrans);
QTimer::singleShot(0, qApp, [item]() { QTimer::singleShot(0, qApp, [item]() {
@ -96,8 +97,8 @@ static int uploadInfo(void *p, curl_off_t dltotal, curl_off_t dlnow, curl_off_t
curl_easy_getinfo(fileTrans->curlHandle, CURLINFO_SPEED_UPLOAD_T, &speed); curl_easy_getinfo(fileTrans->curlHandle, CURLINFO_SPEED_UPLOAD_T, &speed);
fileTrans->completedSize += ulnow; fileTrans->completedSize += ulnow;
fileTrans->speed = speed; fileTrans->speed = speed;
qDebug() << std::format("Uploading: {} / {}, Speed: {}", fileTrans->completedSize, fileTrans->totalSize, //qDebug() << std::format("Uploading: {} / {}, Speed: {}", fileTrans->completedSize, fileTrans->totalSize,
speed).c_str(); // speed).c_str();
auto item = static_cast<FileItem>(*fileTrans); auto item = static_cast<FileItem>(*fileTrans);
QTimer::singleShot(0, qApp, [item]() { QTimer::singleShot(0, qApp, [item]() {
@ -359,6 +360,10 @@ void FileTransferManager::download(const QString &fileId, const QString &fileNam
auto fileUrl = std::format("File/{}?rangeStart={}&rangeEnd={}", fileId.toStdString(), completedSize, size); auto fileUrl = std::format("File/{}?rangeStart={}&rangeEnd={}", fileId.toStdString(), completedSize, size);
auto res = httpDownload(fileUrl, savePath, item); auto res = httpDownload(fileUrl, savePath, item);
if (QFileInfo(QString::fromLocal8Bit(savePath.c_str())).size() == size)
emit transferComplete(true, fileId, fileName);
qDebug() << "End Get" << res; qDebug() << "End Get" << res;
}); });
} }
@ -398,8 +403,6 @@ QString FileTransferManager::getFileName(const QUrl &fileUrl)
} }
void FileTransferManager::getMarkdown(const QString &fileId) void FileTransferManager::getMarkdown(const QString &fileId)
{ {
QtConcurrent::run([fileId, this] { QtConcurrent::run([fileId, this] {
@ -424,3 +427,8 @@ void FileTransferManager::getMarkdown(const QString &fileId)
}); });
} }
void FileTransferManager::openLocalFile(const QString &fileName)
{
QDesktopServices::openUrl(QUrl::fromLocalFile("D:\\Downloads\\"+ fileName));
}

View File

@ -32,7 +32,10 @@ public:
Q_INVOKABLE void getMarkdown(const QString &fileId); Q_INVOKABLE void getMarkdown(const QString &fileId);
Q_INVOKABLE void openLocalFile(const QString &fileName);
signals: signals:
void transferComplete(bool download, QString fileId, QString fileName);
void markdownData(QString data); void markdownData(QString data);
private: private: