import QtQuick import QtQuick.Layouts import QtQuick.Window import QtQuick.Controls import QtQuick.Controls.Basic import QtWebEngine 1.2 import FluentUI import AicsKB.FileTransferManager import SignalFileOperation 1.0 import "qrc:///AicsKnowledgeBase/qml/page" import "qrc:///AicsKnowledgeBase/qml/component" import "qrc:///AicsKnowledgeBase/qml/global" FluArea { Popup { id: popup modal: true //模态, 为 true后弹出窗口会叠加一个独特的背景调光效果 focus: true //焦点, 当弹出窗口实际接收到焦点时,activeFocus将为真 padding: 0 closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside property var raiseItem: null background: Rectangle { color: Qt.rgba(0, 0, 0, 0) //背景为无色 } FluArea { width: 350 height: 500 backgroundColor: "#f9f9f9" NoteList { id: noteList //noteListModel: content_page.noteListModel onOpen: function handle(noteId, authorId) { emit: SignalFileOperation.openNote(noteId, authorId) popup.close() } onCreateNote: function handle() { emit: SignalFileOperation.createNote(content_page.fileId, content_area.type, content_page.title) popup.close() } } } } id: content_area paddings: 0 backgroundColor: "#f9f9f9" // visible: false property string type: "MD" property string knowledgeFileId signal back signal clickTags(string tagName) // paddings: { // top: 10 // right: 0 // bottom: 10 // left: 10 // } FluScrollablePage { id: content_page anchors.fill: parent leftPadding: 10 topPadding: 10 rightPadding: 10 bottomPadding: 0 property string fileId property int noteCount: 0 property int favoriteCount: 0 property int shareCount: 0 property int browsCount: 555 property bool isFavorite: false property bool isDownload: UserData.downloadedFiles.indexOf(fileId) != -1 property double fileSize: 0 property string title: "文章标题" property list tags: ["tag 1", "tag 2", "tag 3"] property string publishTime property string brief: "这是一个简介" property string fileUrl: "https://api.hammer-hfut.tk:233/aics/file/" property string suffix: "md" property ListModel noteListModel function getType(suffix) { if (suffix === "md") return "MD" else if (suffix === "mp4" || suffix === "avi" || suffix === "rmvb" || suffix === "rm" || suffix === "wmv" || suffix === "mkv") return "VIDEO" else return "OTHER" } function loadFile(knowledgeFileId) { content_area.knowledgeFileId = knowledgeFileId console.log(knowledgeFileId) Request.get("knowledge/" + knowledgeFileId + "/detailed", function (response) { console.log(response) var data = JSON.parse(response) content_page.publishTime = data.createTime.substring( 0, 10) content_page.title = data.name content_page.fileId = data.knowledgeFileAttribute.id content_page.suffix = data.knowledgeFileAttribute.suffix content_page.fileSize = data.knowledgeFileAttribute.size content_area.type = getType(content_page.suffix) console.log(content_area.type) var tagString = "" for (var j = 0; j < data.knowledgeFileAttribute.tags.length; j++) { if (j != 0) tagString = tagString + "," tagString = tagString + data.knowledgeFileAttribute.tags[j].name } content_page.tags = tagString.split(",") content_page.brief = data.knowledgeFileAttribute.brief content_page.browsCount = data.knowledgeFileAttribute.pageView isFavorite = false var starers = data.knowledgeFileAttribute.starers for (var i = 0; i < starers.length; i++) { if (starers[i].id === UserData.userId) { isFavorite = true } } content_page.favoriteCount = starers.length noteList.setListModel([]) var notes = data.knowledgeFileAttribute.notes noteCount = notes.length console.log(noteCount) var noteItems = [] for (i = 0; i < notes.length; i++) { var note = notes[i] Request.getSearch( "search/note/" + notes[i].id + "/content", response => { noteItems.push({ "uuid": note.id, "title": note.title, "brief": response, "author": note.author.username, "authorId": note.author.id, "pageView": note.pageView, "stars": note.starers.length, "date": note.createTime }) }) } noteList.noteListModel.append(noteItems) if (content_area.type === "MD") { // console.log(content_area.type) FileTransferManager.getMarkdown( content_page.fileId) } else if (content_area.type === "VIDEO") { console.log(fileUrl + "static/" + fileId + "." + suffix) content_view.push(video_view, { "source": fileUrl + "static/" + fileId + "." + suffix }) } else { Request.get("knowledge/" + knowledgeFileId + "/preview/external", function (res) { content_view.push(other_view, { "url": res }) }) } }) } Connections { target: FileTransferManager onMarkdownData: data => { console.log(data) content_view.push(text_view, { "contentMd": data }) } } Component.onCompleted: { loadFile(knowledgeFileId) console.log(content_area.type) } FluText { font.pointSize: 12 Layout.margins: -5 } Item { Layout.fillWidth: true implicitHeight: 50 FluText { id: text_title padding: 10 text: content_page.title.split(".")[0] font { pointSize: 15 bold: true } } ColumnLayout { id: layout_note FluIconButton { id: button_note iconSize: 15 iconSource: FluentIcons.QuickNote text: "笔记" onClicked: { popup.open() } } FluText { text: content_page.noteCount font.pointSize: 8 Layout.alignment: button_note.Center Layout.topMargin: -5 } anchors { verticalCenter: text_title.verticalCenter right: parent.right } } ColumnLayout { id: layout_share FluIconButton { id: button_share iconSize: 15 iconSource: FluentIcons.Share text: content_page.shareCount.toString() } FluText { id: text_share text: content_page.shareCount font.pointSize: 8 Layout.alignment: button_share.Center Layout.topMargin: -5 } anchors { verticalCenter: text_title.verticalCenter right: layout_note.left } } ColumnLayout { id: layout_favorite FluIconButton { id: button_favorite iconSize: 15 iconSource: content_page.isFavorite ? FluentIcons.FavoriteStarFill : FluentIcons.FavoriteStar onClicked: { content_page.isFavorite = !content_page.isFavorite console.log(content_page.isFavorite) content_page.favoriteCount += (content_page.isFavorite ? 1 : -1) Request.put("knowledge/" + knowledgeFileId + "/star", JSON.stringify({ "active": content_page.isFavorite }), response => { console.log(response) }, response => { console.log(response) }) } } FluText { id: text_favorite text: content_page.favoriteCount font.pointSize: 8 Layout.alignment: button_favorite.Center Layout.topMargin: -5 } anchors { verticalCenter: text_title.verticalCenter right: layout_share.left } } FluIconButton { id: button_download iconSize: 25 iconSource: content_page.isDownload ? FluentIcons.OEM : FluentIcons.Download anchors { verticalCenter: text_title.verticalCenter right: layout_favorite.left rightMargin: 20 } onClicked: { if (!content_page.isDownload) FileTransferManager.download(content_page.fileId, content_page.title) else { FileTransferManager.openLocalFile(content_page.title) } } } } FluArea { Layout.fillWidth: true implicitHeight: 100 ColumnLayout { RowLayout { width: parent.width FluText { padding: 10 text: content_page.publishTime.substring(0, 10) } FluText { padding: 10 text: content_page.fileSize > 1024 * 1024 ? (content_page.fileSize / 1024 / 1024).toFixed( 2) + "MB" : (content_page.fileSize / 1024).toFixed( 2) + "KB" } FluText { padding: 10 text: content_page.browsCount.toString() + "浏览量" } } FluText { Layout.topMargin: -2 Layout.leftMargin: 10 text: content_page.brief } RowLayout { Layout.topMargin: 2 Layout.leftMargin: 5 Repeater { model: content_page.tags delegate: Button { Layout.margins: 2 text: "#" + content_page.tags[index] background: Rectangle { implicitHeight: 10 implicitWidth: 10 color: FluColors.Grey20 radius: 10 } onClicked: { emit: content_area.clickTags(text) } } } } } } // WebEngineView { // Layout.fillWidth: true // backgroundColor: "transparent" // implicitHeight: 200 // settings.javascriptEnabled: true // settings.pluginsEnabled: true // url: "https://www.baidu.com" // } StackView { id: content_view Layout.fillWidth: true height: 500 //initialItem: video_view } Component { id: video_view FluMediaPlayer { width: parent.width height: width * 9 / 16. } } Component { id: text_view NoteEditPage { noteId: "255454" width: parent.width height: width * 9 / 16 isEditable: true } } Component { id: other_view WebEngineView { width: parent.width height: width * 9 / 16 backgroundColor: "transparent" settings.javascriptEnabled: true settings.pluginsEnabled: true url: "https://www.baidu.com" } } } }