mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 15:24:35 +01:00
opt.
This commit is contained in:
@@ -11,14 +11,14 @@ class Backup {
|
||||
final List<PrivateKeyInfo> keys;
|
||||
final Map<String, String> dockerHosts;
|
||||
|
||||
Backup(
|
||||
this.version,
|
||||
this.date,
|
||||
this.spis,
|
||||
this.snippets,
|
||||
this.keys,
|
||||
this.dockerHosts,
|
||||
);
|
||||
Backup({
|
||||
required this.version,
|
||||
required this.date,
|
||||
required this.spis,
|
||||
required this.snippets,
|
||||
required this.keys,
|
||||
required this.dockerHosts,
|
||||
});
|
||||
|
||||
Backup.fromJson(Map<String, dynamic> json)
|
||||
: version = json['version'] as int,
|
||||
|
||||
34
lib/data/model/app/error.dart
Normal file
34
lib/data/model/app/error.dart
Normal file
@@ -0,0 +1,34 @@
|
||||
enum ErrFrom {
|
||||
unknown,
|
||||
apt,
|
||||
docker,
|
||||
sftp,
|
||||
ssh,
|
||||
status;
|
||||
}
|
||||
|
||||
abstract class Err<T> {
|
||||
final ErrFrom from;
|
||||
final T type;
|
||||
final String? message;
|
||||
|
||||
Err({required this.from, required this.type, this.message});
|
||||
}
|
||||
|
||||
enum DockerErrType {
|
||||
unknown,
|
||||
noClient,
|
||||
notInstalled,
|
||||
invalidVersion,
|
||||
cmdNoPrefix
|
||||
}
|
||||
|
||||
class DockerErr extends Err<DockerErrType> {
|
||||
DockerErr({required DockerErrType type, String? message})
|
||||
: super(from: ErrFrom.docker, type: type, message: message);
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'DockerErr<$type>: $message';
|
||||
}
|
||||
}
|
||||
105
lib/data/model/app/menu.dart
Normal file
105
lib/data/model/app/menu.dart
Normal file
@@ -0,0 +1,105 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||
|
||||
enum ServerTabMenuType {
|
||||
sftp,
|
||||
snippet,
|
||||
pkg,
|
||||
docker,
|
||||
edit;
|
||||
|
||||
IconData get icon {
|
||||
switch (this) {
|
||||
case ServerTabMenuType.sftp:
|
||||
return Icons.insert_drive_file;
|
||||
case ServerTabMenuType.snippet:
|
||||
return Icons.code;
|
||||
case ServerTabMenuType.pkg:
|
||||
return Icons.system_security_update;
|
||||
case ServerTabMenuType.docker:
|
||||
return Icons.view_agenda;
|
||||
case ServerTabMenuType.edit:
|
||||
return Icons.edit;
|
||||
}
|
||||
}
|
||||
|
||||
String text(S s) {
|
||||
switch (this) {
|
||||
case ServerTabMenuType.sftp:
|
||||
return 'SFTP';
|
||||
case ServerTabMenuType.snippet:
|
||||
return s.snippet;
|
||||
case ServerTabMenuType.pkg:
|
||||
return s.pkg;
|
||||
case ServerTabMenuType.docker:
|
||||
return 'Docker';
|
||||
case ServerTabMenuType.edit:
|
||||
return s.edit;
|
||||
}
|
||||
}
|
||||
|
||||
PopupMenuItem<ServerTabMenuType> build(S s) => _build(this, icon, text(s));
|
||||
}
|
||||
|
||||
enum DockerMenuType {
|
||||
start,
|
||||
stop,
|
||||
restart,
|
||||
rm,
|
||||
logs;
|
||||
|
||||
static List<DockerMenuType> items(bool running) {
|
||||
if (running) {
|
||||
return [stop, restart, rm, logs];
|
||||
} else {
|
||||
return [start, rm, logs];
|
||||
}
|
||||
}
|
||||
|
||||
IconData get icon {
|
||||
switch (this) {
|
||||
case DockerMenuType.start:
|
||||
return Icons.play_arrow;
|
||||
case DockerMenuType.stop:
|
||||
return Icons.stop;
|
||||
case DockerMenuType.restart:
|
||||
return Icons.restart_alt;
|
||||
case DockerMenuType.rm:
|
||||
return Icons.delete;
|
||||
case DockerMenuType.logs:
|
||||
return Icons.logo_dev;
|
||||
}
|
||||
}
|
||||
|
||||
String text(S s) {
|
||||
switch (this) {
|
||||
case DockerMenuType.start:
|
||||
return s.start;
|
||||
case DockerMenuType.stop:
|
||||
return s.stop;
|
||||
case DockerMenuType.restart:
|
||||
return s.restart;
|
||||
case DockerMenuType.rm:
|
||||
return s.delete;
|
||||
case DockerMenuType.logs:
|
||||
return s.log;
|
||||
}
|
||||
}
|
||||
|
||||
PopupMenuItem<DockerMenuType> build(S s) => _build(this, icon, text(s));
|
||||
}
|
||||
|
||||
PopupMenuItem<T> _build<T>(T t, IconData icon, String text) {
|
||||
return PopupMenuItem<T>(
|
||||
value: t,
|
||||
child: Row(
|
||||
children: [
|
||||
Icon(icon),
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
Text(text),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -1,16 +1,10 @@
|
||||
class PathWithPrefix {
|
||||
late String _prefixPath;
|
||||
final String _prefixPath;
|
||||
String _path = '/';
|
||||
String? _prePath;
|
||||
String get path => _prefixPath + _path;
|
||||
|
||||
PathWithPrefix(String prefixPath) {
|
||||
if (prefixPath.endsWith('/')) {
|
||||
_prefixPath = prefixPath.substring(0, prefixPath.length - 1);
|
||||
} else {
|
||||
_prefixPath = prefixPath;
|
||||
}
|
||||
}
|
||||
PathWithPrefix(String prefixPath) : _prefixPath = _trimSuffix(prefixPath);
|
||||
|
||||
void update(String newPath) {
|
||||
_prePath = _path;
|
||||
@@ -36,3 +30,10 @@ class PathWithPrefix {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
String _trimSuffix(String prefixPath) {
|
||||
if (prefixPath.endsWith('/')) {
|
||||
return prefixPath.substring(0, prefixPath.length - 1);
|
||||
}
|
||||
return prefixPath;
|
||||
}
|
||||
|
||||
@@ -2,26 +2,17 @@ import '../../../core/extension/stringx.dart';
|
||||
import '../../res/misc.dart';
|
||||
|
||||
class ConnStatus {
|
||||
/*
|
||||
{
|
||||
"maxConn": 0,
|
||||
"active": 1,
|
||||
"passive": 2,
|
||||
"fail": 3
|
||||
}
|
||||
*/
|
||||
final int maxConn;
|
||||
final int active;
|
||||
final int passive;
|
||||
final int fail;
|
||||
|
||||
late int maxConn;
|
||||
late int active;
|
||||
late int passive;
|
||||
late int fail;
|
||||
|
||||
ConnStatus(
|
||||
this.maxConn,
|
||||
this.active,
|
||||
this.passive,
|
||||
this.fail,
|
||||
);
|
||||
ConnStatus({
|
||||
required this.maxConn,
|
||||
required this.active,
|
||||
required this.passive,
|
||||
required this.fail,
|
||||
});
|
||||
}
|
||||
|
||||
ConnStatus? parseConn(String raw) {
|
||||
@@ -30,7 +21,12 @@ ConnStatus? parseConn(String raw) {
|
||||
orElse: () => '');
|
||||
if (idx != '') {
|
||||
final vals = idx.split(numReg);
|
||||
return ConnStatus(vals[5].i, vals[6].i, vals[7].i, vals[8].i);
|
||||
return ConnStatus(
|
||||
maxConn: vals[5].i,
|
||||
active: vals[6].i,
|
||||
passive: vals[7].i,
|
||||
fail: vals[8].i,
|
||||
);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
import '../../res/misc.dart';
|
||||
|
||||
class DiskInfo {
|
||||
late String path;
|
||||
late String loc;
|
||||
late int usedPercent;
|
||||
late String used;
|
||||
late String size;
|
||||
late String avail;
|
||||
final String path;
|
||||
final String loc;
|
||||
final int usedPercent;
|
||||
final String used;
|
||||
final String size;
|
||||
final String avail;
|
||||
|
||||
DiskInfo(
|
||||
this.path,
|
||||
this.loc,
|
||||
this.usedPercent,
|
||||
this.used,
|
||||
this.size,
|
||||
this.avail,
|
||||
);
|
||||
DiskInfo({
|
||||
required this.path,
|
||||
required this.loc,
|
||||
required this.usedPercent,
|
||||
required this.used,
|
||||
required this.size,
|
||||
required this.avail,
|
||||
});
|
||||
}
|
||||
|
||||
List<DiskInfo> parseDisk(String raw) {
|
||||
@@ -37,12 +37,12 @@ List<DiskInfo> parseDisk(String raw) {
|
||||
pathCache = '';
|
||||
}
|
||||
list.add(DiskInfo(
|
||||
vals[0],
|
||||
vals[5],
|
||||
int.parse(vals[4].replaceFirst('%', '')),
|
||||
vals[2],
|
||||
vals[1],
|
||||
vals[3],
|
||||
path: vals[0],
|
||||
loc: vals[5],
|
||||
usedPercent: int.parse(vals[4].replaceFirst('%', '')),
|
||||
used: vals[2],
|
||||
size: vals[1],
|
||||
avail: vals[3],
|
||||
));
|
||||
}
|
||||
return list;
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
class Memory {
|
||||
int total;
|
||||
int free;
|
||||
int cache;
|
||||
int avail;
|
||||
final int total;
|
||||
final int free;
|
||||
final int cache;
|
||||
final int avail;
|
||||
|
||||
Memory({
|
||||
required this.total,
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:hive_flutter/hive_flutter.dart';
|
||||
|
||||
part 'private_key_info.g.dart';
|
||||
@@ -31,15 +29,3 @@ class PrivateKeyInfo {
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
List<PrivateKeyInfo> getPrivateKeyInfoList(dynamic data) {
|
||||
List<PrivateKeyInfo> ss = [];
|
||||
if (data is String) {
|
||||
data = json.decode(data);
|
||||
}
|
||||
for (var t in data) {
|
||||
ss.add(PrivateKeyInfo.fromJson(t));
|
||||
}
|
||||
|
||||
return ss;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:hive_flutter/hive_flutter.dart';
|
||||
|
||||
part 'server_private_info.g.dart';
|
||||
@@ -51,15 +49,3 @@ class ServerPrivateInfo {
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
List<ServerPrivateInfo> getServerInfoList(dynamic data) {
|
||||
List<ServerPrivateInfo> ss = [];
|
||||
if (data is String) {
|
||||
data = json.decode(data);
|
||||
}
|
||||
for (var t in data) {
|
||||
ss.add(ServerPrivateInfo.fromJson(t));
|
||||
}
|
||||
|
||||
return ss;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:hive_flutter/hive_flutter.dart';
|
||||
|
||||
part 'snippet.g.dart';
|
||||
@@ -23,15 +21,3 @@ class Snippet {
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
List<Snippet> getSnippetList(dynamic data) {
|
||||
List<Snippet> ss = [];
|
||||
if (data is String) {
|
||||
data = json.decode(data);
|
||||
}
|
||||
for (var t in data) {
|
||||
ss.add(Snippet.fromJson(t));
|
||||
}
|
||||
|
||||
return ss;
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ class VirtualKey {
|
||||
final VirtualKeyFunc? func;
|
||||
|
||||
VirtualKey(this.text,
|
||||
{this.key, this.toggleable = false, this.icon, this.func});
|
||||
{this.key, this.toggleable = false, this.icon, this.func,});
|
||||
}
|
||||
|
||||
enum VirtualKeyFunc { toggleIME, backspace, copy, paste, snippet }
|
||||
|
||||
Reference in New Issue
Block a user