DPS_Manage/Page/Tab_personal.qml

603 lines
19 KiB
QML

import QtQuick 2.15
import QtQuick.Window 2.15
import QtGraphicalEffects 1.15
import QtQuick.Shapes 1.15
import QtQuick.Layouts 1.15
import DelegateUI 1.0
import "../MyGlobals" 1.0
import QmlTool 1.0
import "../Component" 1.0
import SSHManager 1.0
Item {
anchors.fill: parent
anchors.leftMargin: 1
//用户名称
property string user_name: "未定名用户XNJASDND"
//用户会员等级
property string user_level: "普通会员"
//用户积分
property int user_points: 0
//用户所有服务器列表
property var user_server_list : []
//当前测试连通性服务器ip
property int testip : -1
//新增服务器窗口
property var addServerWindow: null
Component.onCompleted: {
GlobalVars.tab_personal = this;
SSHManager.connectionSuccess.connect(connectionSuccess)
SSHManager.connectionFailed.connect(connectionFailed)
initAccInfo();
initAccServerList();
}
// 窗口关闭时自动触发清理
Component.onDestruction: {
SSHManager.connectionSuccess.disconnect(connectionSuccess);
SSHManager.connectionFailed.disconnect(connectionFailed);
}
//构造账号信息
function initAccInfo(){
if(GlobalVars.accInfo){
user_name = GlobalVars.accInfo.username
user_level = GlobalVars.accInfo.uservip
user_points = GlobalVars.accInfo.userpoints
}
}
//构造账号服务器列表
function initAccServerList(){
if(GlobalVars.accServerList){
user_server_list = [];
var arrbuf = [];
for(var i = 0; i < GlobalVars.accServerList.length;i++){
var obj = GlobalVars.accServerList[i];
var buf = {
action:i,
state:0,
ip : obj.serverIp,
port : obj.port,
username : obj.userName,
password : obj.password
}
arrbuf.push(buf);
}
user_server_list = arrbuf;
}
}
//监听全局变量的变化 这里需要监听 因为在本页会产生刷新数据
Connections {
target: GlobalVars
//账号基础信息
function onAccInfoChanged(){initAccInfo();}
//账号服务器列表
function onAccServerListChanged(){initAccServerList();}
}
//尝试连接服务器
function testConnect(index){
if(testip === -1){
testip = index;
changeServerValue(index,"state",-1);
var data = user_server_list[index];
SSHManager.connectAndStartShell(data.ip,data.port,data.username,data.password)
}
else{
GlobalVars.msg_control.warning('当前正在测试' + user_server_list[testip].ip + "的连通性,请不要重复操作!");
}
}
//连接成功信号
function connectionSuccess(){
if (addServerWindow)return;
changeServerValue(testip,"state",1);
testip = -1
}
//连接失败信号
function connectionFailed(error){
if (addServerWindow)return;
changeServerValue(testip,"state",2);
testip = -1
}
//更改服务器列表的数据模型
function changeServerValue(index,key,value){
var buf = user_server_list;
buf[index][key] = value;
user_server_list = buf;
}
//打开新增服务器窗口
function openAddServerWindow(index = null){
if (!addServerWindow) {
// 创建新窗口
var component = Qt.createComponent("Window_AddServer.qml");
addServerWindow = component.createObject(parent);
// 绑定关闭时自动销毁
addServerWindow.closing.connect(function() {
addServerWindow.destroy()
addServerWindow = null // 关键:释放引用
})
}
//如果有传入数据
if(index !== null){
var data = user_server_list[index];
addServerWindow.serverIP = data.ip
addServerWindow.serverPort = data.port
addServerWindow.serverUsername = data.username
addServerWindow.serverPassword = data.password
addServerWindow.mode = 1
}
addServerWindow.y = GlobalVars.main_Window.y + 130
addServerWindow.show()
addServerWindow.raise() // 把窗口提到最前面
}
Rectangle{
id: top_rect
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
anchors.topMargin: 15
anchors.leftMargin: 10
anchors.rightMargin: 15
height: 50
radius: 8
border.color: DelTheme.isDark ? "#23272e" : "#f0f4f7"
border.width: 3
color:"transparent"
// 头像部分
DelAvatar {
id: avatarImg
size:parent.height * 0.65
anchors.left: top_rect.left
anchors.leftMargin: 20
anchors.verticalCenter: parent.verticalCenter
iconSource: DelIcon.UserOutlined
}
//用户名
Text {
id:username
anchors.left: avatarImg.right
anchors.leftMargin: 10
anchors.verticalCenter: parent.verticalCenter
text: user_name
font {
pixelSize: 14
family: DelTheme.Primary.fontPrimaryFamily
}
color: DelTheme.Primary.colorTextBase
elide: Text.ElideRight
}
DelButton {
anchors.right: lxkf.left
anchors.rightMargin: 2
anchors.verticalCenter: parent.verticalCenter
type: DelButton.Type_Link
text: qsTr(``)
DelToolTip {
visible: parent.hovered
arrowVisible: true
text: qsTr("扫描赞助码赞助时备注DPS管理工具账号即可(如果长时间未增加贡献点可联系客服)")
position: DelToolTip.Position_Left
}
}
DelButton {
id:lxkf
anchors.right: change_zl.left
anchors.rightMargin: 2
anchors.verticalCenter: parent.verticalCenter
type: DelButton.Type_Link
text: qsTr(``)
onClicked: {
Qt.openUrlExternally("tencent://message/?uin=1713381454")
}
DelToolTip {
visible: parent.hovered
arrowVisible: true
text: qsTr("如无法跳转QQ链接,可手动添加客服QQ:1713381454")
position: DelToolTip.Position_Top
}
}
DelButton {
id:change_zl
anchors.right: top_rect.right
anchors.rightMargin: 10
anchors.verticalCenter: parent.verticalCenter
type: DelButton.Type_Link
text: qsTr(``)
onClicked: {
GlobalVars.msg_control.warning('暂未开放此功能');
}
}
}
Rectangle{
id:middle_rect
anchors.left: parent.left
anchors.leftMargin: 10
anchors.right: parent.right
anchors.rightMargin: 15
anchors.bottomMargin: 10
anchors.bottom:bottom_rect.top
anchors.topMargin: 10
anchors.top:top_rect.bottom
border.color: DelTheme.isDark ? "#23272e" : "#f0f4f7"
border.width: 3
color:"transparent"
radius: 8
Row{
anchors.fill: parent
spacing: 20
anchors.leftMargin: 20
anchors.rightMargin: 20
Card {
id:points_card
width:(parent.width) / 3 - 14
height: parent.height*0.8
anchors.verticalCenter: parent.verticalCenter
isDarkMode: DelTheme.isDark
content: Item {
anchors.fill:parent
DelIconButton {
id:points_icon
type: DelButton.Type_Primary
iconSource: DelIcon.CreditCardOutlined
iconSize: 54
anchors.top:parent.top
anchors.topMargin: 20
anchors.horizontalCenter : parent.horizontalCenter
}
Text {
id:points_text
text: "贡献点: " + user_points
font {
pixelSize: 14
family: DelTheme.Primary.fontPrimaryFamily
}
color: DelTheme.Primary.colorTextBase
elide: Text.ElideRight
anchors.top:points_icon.bottom
anchors.topMargin: 20
anchors.horizontalCenter : parent.horizontalCenter
}
}
}
Card {
id:vip_card
width:(parent.width) / 3 - 14
height: parent.height*0.8
anchors.verticalCenter: parent.verticalCenter
isDarkMode: DelTheme.isDark
content: Item {
anchors.fill:parent
DelIconButton {
id:vip_icon
type: DelButton.Type_Primary
iconSource: DelIcon.SketchOutlined
iconSize: 54
anchors.top:parent.top
anchors.topMargin: 20
anchors.horizontalCenter : parent.horizontalCenter
}
Text {
id:vip_text
text: "VIP等级: " + user_level
font {
pixelSize: 14
family: DelTheme.Primary.fontPrimaryFamily
}
color: DelTheme.Primary.colorTextBase
elide: Text.ElideRight
anchors.top:vip_icon.bottom
anchors.topMargin: 20
anchors.horizontalCenter : parent.horizontalCenter
}
}
}
Card {
id:cash_card
width:(parent.width) / 3 - 14
height: parent.height*0.8
anchors.verticalCenter: parent.verticalCenter
isDarkMode: DelTheme.isDark
content: Item {
anchors.fill:parent
DelIconButton {
id:cash_icon
type: DelButton.Type_Primary
iconSource:DelIcon.WalletOutlined
iconSize: 54
anchors.top:parent.top
anchors.topMargin: 20
anchors.horizontalCenter : parent.horizontalCenter
}
Text {
id:cash_text
text: "暂无代金券"
font {
pixelSize: 14
family: DelTheme.Primary.fontPrimaryFamily
}
color: DelTheme.Primary.colorTextBase
elide: Text.ElideRight
anchors.top:cash_icon.bottom
anchors.topMargin: 20
anchors.horizontalCenter : parent.horizontalCenter
}
}
}
}
}
Rectangle{
id:bottom_rect
height: 400
anchors.left: parent.left
anchors.right: parent.right
anchors.leftMargin: 10
anchors.rightMargin: 15
anchors.bottomMargin: 15
anchors.bottom:parent.bottom
border.color: DelTheme.isDark ? "#23272e" : "#f0f4f7"
border.width: 3
color:"transparent"
radius: 8
Column {
anchors.fill: parent
anchors.margins: 8
spacing: 8
Rectangle{
id:serverlist_header
anchors.left: parent.left
anchors.leftMargin: 6
width:parent.width
height: 20
color:"transparent"
Text {
id:label_serverlist_text
text: "我的服务器"
font {
pixelSize: 14
family: DelTheme.Primary.fontPrimaryFamily
}
color: DelTheme.Primary.colorTextBase
elide: Text.ElideRight
}
DelButton {
type: DelButton.Type_Link
text: qsTr(``)
anchors.right: parent.right
anchors.rightMargin: 6
anchors.verticalCenter: parent.verticalCenter
onClicked: {
if (!addServerWindow) openAddServerWindow();
}
}
}
DelTableView {
width: parent.width
height: parent.height - serverlist_header.height - 1
rowHeaderVisible: false
columns: [
{
title: '服务器IP',
dataIndex: "ip",
key: "ip",
delegate: textDelegate,
width: 150
},
{
title: 'SSH端口',
dataIndex: "port",
key: "port",
delegate: textDelegate,
width: 80
},
{
title: '服务器账号',
dataIndex: 'username',
key: 'username',
delegate: textDelegate,
width: 100
},
{
title: '服务器密码',
key: 'password',
dataIndex: 'password',
delegate: textDelegate,
width: 160
},
{
title: '状态',
key: 'state',
dataIndex: 'state',
delegate: tagsDelegate,
width: 80
},
{
title: '操作',
key: 'action',
dataIndex: 'action',
delegate: actionDelegate,
width: 250
}
]
initModel: user_server_list
}
}
}
Component {
id: textDelegate
Text {
id: displayText
leftPadding: 8
rightPadding: 8
font {
family: DelTheme.Primary.fontPrimaryFamily
pixelSize: DelTheme.Primary.fontPrimarySize
}
text: cellData
color: DelTheme.Primary.colorTextBase
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
TextMetrics {
id: displayWidth
font: displayText.font
text: displayText.text
}
TextMetrics {
id: startWidth
font: displayText.font
text: {
let index = displayText.text.indexOf(filterInput);
if (index !== -1)
return displayText.text.substring(0, index);
else
return '';
}
}
TextMetrics {
id: filterWidth
font: displayText.font
text: filterInput
}
Rectangle {
color: "red"
opacity: 0.1
x: startWidth.advanceWidth + (displayText.width - displayWidth.advanceWidth) * 0.5
width: filterWidth.advanceWidth
height: parent.height
}
}
}
Component {
id: tagsDelegate
Item {
Row {
id: row
anchors.left: parent.left
anchors.leftMargin: 20
anchors.verticalCenter: parent.verticalCenter
spacing: 6
DelTag {
visible: cellData != -1
text: {
switch(cellData)
{
case 0 : return "未知";
case 1 : return "成功";
case 2 : return "失败";
default: return "连接中"
}
}
presetColor: {
switch(cellData)
{
case 0 : return "purple";
case 1 : return "green";
case 2 : return "red";
default: return "transparent"
}
}
}
BusyIndicator {
visible: cellData === -1
anchors.verticalCenter: parent.verticalCenter
color: "#FF5722" // 橙色
size: 18
duration: 12000
}
}
}
}
Component {
id: actionDelegate
Item {
Row {
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
spacing: 4
DelButton {
type: DelButton.Type_Link
text: qsTr(``)
onClicked: {
if (!addServerWindow) testConnect(cellData)
}
}
DelButton {
type: DelButton.Type_Link
text: qsTr(``)
onClicked: {
if (!addServerWindow) openAddServerWindow(cellData)
}
}
DelButton {
type: DelButton.Type_Link
text: qsTr(``)
onClicked: {
if (!addServerWindow) {
var ip = user_server_list[cellData]["ip"];
GlobalVars.removeServer(ip);
}
}
}
}
}
}
}