Browse Source

change init type

master
godo 9 months ago
parent
commit
af1fedeeef
  1. 13
      CHANGELOG.md
  2. 16
      frontend/src/components/computer/QuickLink.vue
  3. 1
      frontend/src/components/desktop/DeskItem.vue
  4. 4
      frontend/src/components/desktop/Upgrade.vue
  5. 2
      frontend/src/components/store/Store.vue
  6. 2
      frontend/src/components/taskbar/Magnet.vue
  7. 5
      frontend/src/hook/useAppOpen.ts
  8. 55
      frontend/src/stores/upgrade.ts
  9. 2
      frontend/src/system/config.ts
  10. 131
      frontend/src/system/index.ts
  11. 6
      frontend/src/system/initBuiltin.ts
  12. 6
      godo/cmd/main.go
  13. 589
      godo/deps/desktop.json
  14. 126
      godo/files/destop.go
  15. 25
      godo/files/fs.go
  16. 231
      godo/files/init.go
  17. 57
      godo/libs/info.go
  18. 2
      godo/sys/update.go

13
CHANGELOG.md

@ -1,10 +1,13 @@
## 变更记录
- 2024-08-27
1. 优化初始化系统,初始化系统时只请求读写一次
2. 去除浏览器存储
- 2024-08-21
内网聊天增加手工添加ip,跨网段通信在ping通的前提下如果发现不了对方可手工添加对方ip
修复思维导图保存的文件每次打开主题又会变成默认主题
新增webdav客户端
新增远程存储
修改选择文件夹会删除文件夹内的文件
1. 内网聊天增加手工添加ip,跨网段通信在ping通的前提下如果发现不了对方可手工添加对方ip
2. 修复思维导图保存的文件每次打开主题又会变成默认主题
3. 新增webdav客户端
4. 新增远程存储
5. 修改选择文件夹会删除文件夹内的文件
- 2024-08-07
1. 新增web端安装

16
frontend/src/components/computer/QuickLink.vue

@ -34,42 +34,42 @@ const quickLinks = [
{
img: "word",
name: t("document"),
path: "/C/Users/Doc",
path: "/C/Users/Documents/Word",
},
{
img: "excel",
name: t("excel"),
path: "/C/Users/Execl",
path: "/C/Users/Documents/Execl",
},
{
img: "pptexe",
name: t("ppt"),
path: "/C/Users/PPT",
path: "/C/Users/Documents/PPT",
},
{
img: "markdown",
name: t("markdown"),
path: "/C/Users/Markdown",
path: "/C/Users/Documents/Markdown",
},
{
img: "mindexe",
name: t("mindmap"),
path: "/C/Users/Mind",
path: "/C/Users/Documents/Mind",
},
{
img: "baiban",
name: t("whiteBoard"),
path: "/C/Users/Baiban",
path: "/C/Users/Documents/Baiban",
},
{
img: "kanban",
name: t("board"),
path: "/C/Users/Kanban",
path: "/C/Users/Documents/Kanban",
},
{
img: "gallery",
name: t("gallery"),
path: "/C/Users/Photo",
path: "/C/Users/Pictures",
},
{
img: "music",

1
frontend/src/components/desktop/DeskItem.vue

@ -12,7 +12,6 @@ import { mountEvent } from "@/system/event";
import { useSystem } from "@/system/index.ts";
import { useAppOpen } from "@/hook/useAppOpen";
import { onMounted } from "vue";
const { openapp, appList } = useAppOpen("apps");
const props = defineProps({
onChosen: {

4
frontend/src/components/desktop/Upgrade.vue

@ -17,8 +17,8 @@
<div class="upgrade-content">
GodoOS {{ upgradeStore.upgradeDesc }}
<div class="mt5">
<el-link type="primary" class="font12" href="https://gitee.com/ruitao_admin/godoos/blob/master/CHANGELOG.md" target="_black">
CHANGELOG.md
<el-link type="primary" class="font12" href="https://godoos.com/home/blog/godoos/" target="_black">
查看详情
</el-link>
</div>
<div class="upgrade-content-desc mt5">{{ $t('upgrade.desc') }}</div>

2
frontend/src/components/store/Store.vue

@ -53,7 +53,7 @@ async function install(item: any) {
async function uninstall(item: any) {
await store.removeDesktop(item);
if (item.needInstall) {
if (item.haStart) {
const completion = await fetch(store.apiUrl + '/store/uninstall?name=' + item.name)
if (!completion.ok) {
notifyError(t("store.hasSameName"))

2
frontend/src/components/taskbar/Magnet.vue

@ -24,7 +24,7 @@ import { OsFileWithoutContent } from "@/system/core/FileSystem";
import { vGlowing } from "@/util/glowingBorder";
import { t } from "@/i18n";
const { openapp, appList } = useAppOpen("magnet");
const { openapp, appList } = useAppOpen("menulist");
function handle(item: OsFileWithoutContent) {
emitEvent("magnet.item.click", item);
openapp(item);

5
frontend/src/hook/useAppOpen.ts

@ -2,9 +2,12 @@ import { OsFileWithoutContent } from '../system/core/FileSystem';
import { useSystem } from '../system';
function useAppOpen(type: 'apps' | 'magnet' | 'menulist') {
const rootState = useSystem()._rootState;
const system = useSystem();
const rootState = system._rootState;
const appList = rootState[type];
//console.log(appList)
//console.log(appList)
function openapp(item: OsFileWithoutContent) {
//console.log(item)

55
frontend/src/stores/upgrade.ts

@ -9,31 +9,60 @@ export const useUpgradeStore = defineStore('upgradeStore', () => {
const hasNotice = ref(false);
const hasAd = ref(false);
const updateUrl = ref('');
const versionTag = ref(0)
const versionTag = ref('')
const upgradeDesc = ref('')
const currentVersion = ref(0)
const currentVersion = ref('')
const progress = ref(0)
const noticeList:any = ref([])
const adList:any = ref([])
function compareVersions(version1:string, version2:string) {
// 将版本号字符串按"."分割成数组
const parts1 = version1.split('.').map(Number);
const parts2 = version2.split('.').map(Number);
// 确保两个数组长度相同
const maxLength = Math.max(parts1.length, parts2.length);
while (parts1.length < maxLength) parts1.push(0);
while (parts2.length < maxLength) parts2.push(0);
// 比较每个部分
for (let i = 0; i < maxLength; i++) {
if (parts1[i] > parts2[i]) return 1;
if (parts1[i] < parts2[i]) return -1;
}
// 如果所有部分都相等,则返回0
return 0;
}
async function checkUpdate() {
const config = getSystemConfig();
currentVersion.value = config.version;
const releaseRes = await fetch(`${config.apiUrl}/system/updateInfo`)
if (!releaseRes.ok) return;
const releaseData = await releaseRes.json()
versionTag.value = releaseData.version
if(versionTag.value > config.version){
upgradeDesc.value = releaseData.desc ?? t('upgrade.msg')
hasUpgrade.value = true
updateUrl.value = releaseData.url
if(releaseData.code !== 200){
return
}
if (releaseData.noticeList && releaseData.noticeList.length > 0) {
hasNotice.value = true
noticeList.value = releaseData.noticeList
const res = releaseData.data
if(!res.version || res.version == ""){
return
}
if (!hasUpgrade.value && releaseData.adList && releaseData.adList.length > 0) {
hasAd.value = true
adList.value = releaseData.adList
versionTag.value = res.version
if (compareVersions(versionTag.value, config.version) > 0) {
upgradeDesc.value = res.desc ?? t('upgrade.msg')
hasUpgrade.value = true
updateUrl.value = res.url
}
if (res.adList) {
if(res.adList.center && res.adList.center.length > 0){
hasNotice.value = true
noticeList.value = res.adList.center
}
if(res.adList.bottom && res.adList.bottom.length > 0){
hasAd.value = true
adList.value = res.adList.bottom
}
}
}
async function update() {

2
frontend/src/system/config.ts

@ -1,5 +1,5 @@
import { generateRandomString } from "../util/common.ts"
export const configStoreType = localStorage.getItem('GodoOS-storeType') || 'browser';
export const configStoreType = localStorage.getItem('GodoOS-storeType') || 'local';
/**
*
*

131
frontend/src/system/index.ts

@ -10,7 +10,7 @@ import {
} from './type/type';
import { initEventer, Eventer, initEventListener } from './event';
import { OsFileSystem } from './core/FileSystem';
import {useOsFile} from './core/FileOs';
import { useOsFile } from './core/FileOs';
import { version } from '../../package.json';
import { BrowserWindow, BrowserWindowOption } from './window/BrowserWindow';
@ -22,9 +22,7 @@ import { Notify, NotifyConstructorOptions } from './notification/Notification';
import { Dialog } from './window/Dialog';
import { pick } from '../util/modash';
import { Tray, TrayOptions } from './menu/Tary';
import { InitSystemFile, InitUserFile } from './core/SystemFileConfig';
import { createInitFile } from './core/createInitFile';
import { getSystemConfig, getSystemKey, setSystemKey, setSystemConfig, clearSystemConfig } from './config'
import { getSystemConfig, getSystemKey, setSystemKey, setSystemConfig, clearSystemConfig, getFileUrl } from './config'
import { useUpgradeStore } from '@/stores/upgrade';
import { RestartApp } from '@/util/goutil';
@ -64,13 +62,13 @@ export class System {
fs!: any;
constructor(options?: SystemOptions) {
this._options = this.initOptions(options);
this._rootState = this.initRootState();
System.GLOBAL_SYSTEM = this; // 挂载全局系统
Bios._onOpen && Bios._onOpen(this);
this._eventer = this.initEvent();
this.firstRun();
this.firstRun();
this.initSystem();
}
@ -100,8 +98,8 @@ export class System {
await this.initFileSystem(); // 初始化文件系统
await this.initSavedConfig(); // 初始化保存的配置
initBuiltinApp(this); // 初始化内建应用
this.initApp(); // 初始化配置应用到app文件夹中
this.initAppList(); // 刷新app文件夹,展示应用
//this.initApp(); // 初始化配置应用到app文件夹中
//this.initAppList(); // 刷新app文件夹,展示应用
// 判断是否登录
this.isLogin();
initEventListener(); // 初始化事件侦听
@ -110,21 +108,10 @@ export class System {
//this.runPlugin(this); // 运行fs中插件
this.initBackground(); // 初始化壁纸
this.emit('start');
setTimeout(() => {
if (this._rootState.magnet?.length < 1) {
this.refershAppList()
}
setTimeout(() => {
if (this._rootState.magnet?.length < 1) {
//this.recover()
clearSystemConfig();
RestartApp();
return;
}
const upgradeStore = useUpgradeStore();
upgradeStore.checkUpdate()
}, 3000);
const upgradeStore = useUpgradeStore();
upgradeStore.checkUpdate()
}, 6000);
}
@ -164,7 +151,7 @@ export class System {
const background = getSystemKey('background');
if (background.type === 'image') {
this._rootState.options.background = background.url
}else{
} else {
this._rootState.options.background = background.color;
}
// this._rootState.options.background = '/image/bg/bg5.jpg';
@ -179,37 +166,63 @@ export class System {
return initEventer();
}
private initApp() {
this._rootState.options.desktop?.forEach((item) => {
this.addApp(item);
});
this._rootState.options.magnet?.forEach((item) => {
this.addMagnet(item);
});
this._rootState.options.menulist?.forEach((item) => {
this.addMenuList(item);
});
const fileUrl = getFileUrl();
if (!fileUrl) return;
fetch(`${fileUrl}/desktop`).then(res => res.json()).then(res => {
if (res && res.code == 0) {
this._rootState.apps = res.data.apps;
this._rootState.menulist = res.data.menulist;
res.data.apps.forEach((item: any) => {
this._rootState.windowMap['Desktop'].set(item.name, item);
})
res.data.apps.forEach((item: any) => {
this._rootState.windowMap['Menulist'].set(item.name, item);
})
// this._rootState.windowMap[loc].set(options.name, options);
// useSystem()._rootState.apps = res.data.apps;
// useSystem()._rootState.menulist = res.data.menulist;
}
})
// this._rootState.options.desktop?.forEach((item) => {
// this.addApp(item);
// });
// this._rootState.options.menulist?.forEach((item) => {
// this.addMenuList(item);
// });
}
refershAppList() {
const APP_TYPE = ['apps', 'magnet', 'menulist'];
const system = useSystem();
if (!system) return;
const fileUrl = getFileUrl();
if (!fileUrl) return;
fetch(`${fileUrl}/desktop`).then(res => res.json()).then(res => {
if (res && res.code == 0) {
// system._rootState.apps = res.data.apps;
// system._rootState.menulist = res.data.menulist;
system._rootState.apps.splice(0, system._rootState.apps.length, ...res.data.apps);
system._rootState.menulist.splice(0, system._rootState.menulist.length, ...res.data.menulist);
}
})
//const APP_TYPE = ['apps', 'menulist'];
// console.log('refresh')
/*
for (let i = 0; i < APP_TYPE.length; i++) {
const element = APP_TYPE[i];
system?.fs
.readdir(
`${system._options.userLocation}${{
apps: 'Desktop',
magnet: 'Magnet',
menulist: 'Menulist',
}[element]
}`
)
.then((res:any) => {
.then((res: any) => {
if (res) {
const list = res;
const tempList:any = [];
const tempList: any = [];
for (let j = 0; j < list.length; j++) {
const item = list[j];
@ -236,6 +249,7 @@ export class System {
}
});
}
*/
}
isReadyUpdateAppList = false;
@ -250,38 +264,12 @@ export class System {
}
private async initFileSystem() {
const storeType = getSystemKey("storeType")
if(storeType == 'browser'){
this.fs = await new OsFileSystem().initFileSystem(this._options);
(this.fs as OsFileSystem).on('error', (err: string) => {
this.emitError(err);
});
this.fs.registerWatcher(new RegExp(`^${this._options.userLocation}`), () => {
this.initAppList();
});
}else{
//this.fs = this._options.fs;
this.fs = useOsFile();
await this.initOutSystem()
}
this.fs = useOsFile();
// this.fs.registerWatcher(new RegExp(`^${this._options.userLocation}`), () => {
// this.initAppList();
// });
}
async initOutSystem() {
if (!this.isFirstRun) {
return;
}
await this.fs.mkdir('/C');
await this.fs.mkdir('/D');
await this.fs.mkdir('/E');
await this.fs.mkdir('/B');
await createInitFile(this.fs, InitUserFile, this._options.userLocation);
await createInitFile(this.fs, InitSystemFile, this._options.systemLocation);
// await this.fs.chmod('/C', OsFileMode.ReadWrite);
// await this.fs.chmod('/D', OsFileMode.ReadWrite);
// await this.fs.chmod('/E', OsFileMode.ReadWrite);
// await this.fs.chmod('/B', OsFileMode.ReadWrite);
}
replaceFileSystem(fs: OsFileInterface) {
this.fs = fs;
this.initAppList();
@ -293,7 +281,7 @@ export class System {
console.error('自定义文件系统不支持挂载卷');
}
}
/**
* @description:
*/
@ -360,9 +348,6 @@ export class System {
addApp(options: WinAppOptions, force = false) {
this.addWindowSysLink('Desktop', options, force);
}
addMagnet(options: WinAppOptions, force = false) {
this.addWindowSysLink('Magnet', options, force);
}
addMenuList(options: WinAppOptions, force = false) {
this.addWindowSysLink('Menulist', options, force);
}
@ -399,7 +384,7 @@ export class System {
this._rootState.state = SystemStateEnum.close;
this.fs.removeFileSystem().then(() => {
window.indexedDB.deleteDatabase("GodoDatabase");
RestartApp();
})
@ -412,7 +397,7 @@ export class System {
}
emitEvent(event: string, ...args: any[]) {
const eventArray = event.split('.');
eventArray.forEach((_:any, index) => {
eventArray.forEach((_: any, index) => {
const tempEvent = eventArray.slice(0, index + 1).join('.');
this._eventer.emit(tempEvent, event, args);
});

6
frontend/src/system/initBuiltin.ts

@ -35,9 +35,9 @@ export function initBuiltinApp(system: System) {
if (d.isDeskTop) {
system.addApp(addSave);
}
if (d.isMagnet) {
system.addMagnet(addSave);
}
// if (d.isMagnet) {
// system.addMagnet(addSave);
// }
if (d.isMenuList) {
system.addMenuList(addSave);
}

6
godo/cmd/main.go

@ -23,6 +23,11 @@ var srv *http.Server
func OsStart() {
libs.InitServer()
err := files.InitOsSystem()
if err != nil {
log.Fatalf("InitOsSystem error: %v", err)
return
}
webdav.InitWebdav()
router := mux.NewRouter()
router.Use(corsMiddleware())
@ -54,6 +59,7 @@ func OsStart() {
router.HandleFunc("/system/update", sys.UpdateAppHandler).Methods(http.MethodGet)
router.HandleFunc("/system/setting", sys.ConfigHandler).Methods(http.MethodPost)
fileRouter := router.PathPrefix("/file").Subrouter()
fileRouter.HandleFunc("/desktop", files.HandleDesktop).Methods(http.MethodGet)
fileRouter.HandleFunc("/info", files.HandleSystemInfo).Methods(http.MethodGet)
fileRouter.HandleFunc("/read", files.HandleReadDir).Methods(http.MethodGet)
fileRouter.HandleFunc("/stat", files.HandleStat).Methods(http.MethodGet)

589
godo/deps/desktop.json

@ -0,0 +1,589 @@
{
"updatetime": "2024-08-24T10:42:22.086Z",
"apps": [
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 32,
"mtime": "2024-08-24T10:42:22.086Z",
"atime": "2024-08-24T10:42:22.086Z",
"birthtime": "2024-08-24T10:42:22.086Z",
"mode": 511,
"rdev": 0,
"name": "computer.exe",
"path": "/C/Users/Desktop/computer.exe",
"oldPath": "/C/Users/Desktop/computer.exe",
"parentPath": "/C/Users/Desktop",
"content": "link::Desktop::computer::diannao",
"ext": "exe",
"title": "computer",
"isSys": 1,
"id": 28
},
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 30,
"mtime": "2024-08-24T10:42:22.095Z",
"atime": "2024-08-24T10:42:22.095Z",
"birthtime": "2024-08-24T10:42:22.095Z",
"mode": 511,
"rdev": 0,
"name": "appstore.exe",
"path": "/C/Users/Desktop/appstore.exe",
"oldPath": "/C/Users/Desktop/appstore.exe",
"parentPath": "/C/Users/Desktop",
"content": "link::Desktop::appstore::store",
"ext": "exe",
"title": "appstore",
"isSys": 1,
"id": 31
},
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 29,
"mtime": "2024-08-24T10:42:22.101Z",
"atime": "2024-08-24T10:42:22.101Z",
"birthtime": "2024-08-24T10:42:22.101Z",
"mode": 511,
"rdev": 0,
"name": "document.exe",
"path": "/C/Users/Desktop/document.exe",
"oldPath": "/C/Users/Desktop/document.exe",
"parentPath": "/C/Users/Desktop",
"content": "link::Desktop::document::word",
"ext": "exe",
"title": "document",
"isSys": 1,
"id": 38
},
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 27,
"mtime": "2024-08-24T10:42:22.102Z",
"atime": "2024-08-24T10:42:22.102Z",
"birthtime": "2024-08-24T10:42:22.102Z",
"mode": 511,
"rdev": 0,
"name": "excel.exe",
"path": "/C/Users/Desktop/excel.exe",
"oldPath": "/C/Users/Desktop/excel.exe",
"parentPath": "/C/Users/Desktop",
"content": "link::Desktop::excel::excel",
"ext": "exe",
"title": "excel",
"isSys": 1,
"id": 39
},
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 33,
"mtime": "2024-08-24T10:42:22.102Z",
"atime": "2024-08-24T10:42:22.102Z",
"birthtime": "2024-08-24T10:42:22.102Z",
"mode": 511,
"rdev": 0,
"name": "markdown.exe",
"path": "/C/Users/Desktop/markdown.exe",
"oldPath": "/C/Users/Desktop/markdown.exe",
"parentPath": "/C/Users/Desktop",
"content": "link::Desktop::markdown::markdown",
"ext": "exe",
"title": "markdown",
"isSys": 1,
"id": 40
},
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 31,
"mtime": "2024-08-24T10:42:22.104Z",
"atime": "2024-08-24T10:42:22.104Z",
"birthtime": "2024-08-24T10:42:22.104Z",
"mode": 511,
"rdev": 0,
"name": "mindmap.exe",
"path": "/C/Users/Desktop/mindmap.exe",
"oldPath": "/C/Users/Desktop/mindmap.exe",
"parentPath": "/C/Users/Desktop",
"content": "link::Desktop::mindmap::mindexe",
"ext": "exe",
"title": "mindmap",
"isSys": 1,
"id": 41
},
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 26,
"mtime": "2024-08-24T10:42:22.105Z",
"atime": "2024-08-24T10:42:22.105Z",
"birthtime": "2024-08-24T10:42:22.105Z",
"mode": 511,
"rdev": 0,
"name": "ppt.exe",
"path": "/C/Users/Desktop/ppt.exe",
"oldPath": "/C/Users/Desktop/ppt.exe",
"parentPath": "/C/Users/Desktop",
"content": "link::Desktop::ppt::pptexe",
"ext": "exe",
"title": "ppt",
"isSys": 1,
"id": 42
},
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 35,
"mtime": "2024-08-24T10:42:22.105Z",
"atime": "2024-08-24T10:42:22.105Z",
"birthtime": "2024-08-24T10:42:22.105Z",
"mode": 511,
"rdev": 0,
"name": "fileEditor.exe",
"path": "/C/Users/Desktop/fileEditor.exe",
"oldPath": "/C/Users/Desktop/fileEditor.exe",
"parentPath": "/C/Users/Desktop",
"content": "link::Desktop::fileEditor::editorbt",
"ext": "exe",
"title": "fileEditor",
"isSys": 1,
"id": 43
},
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 28,
"mtime": "2024-08-24T10:42:22.105Z",
"atime": "2024-08-24T10:42:22.105Z",
"birthtime": "2024-08-24T10:42:22.105Z",
"mode": 511,
"rdev": 0,
"name": "board.exe",
"path": "/C/Users/Desktop/board.exe",
"oldPath": "/C/Users/Desktop/board.exe",
"parentPath": "/C/Users/Desktop",
"content": "link::Desktop::board::kanban",
"ext": "exe",
"title": "board",
"isSys": 1,
"id": 44
},
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 33,
"mtime": "2024-08-24T10:42:22.106Z",
"atime": "2024-08-24T10:42:22.106Z",
"birthtime": "2024-08-24T10:42:22.106Z",
"mode": 511,
"rdev": 0,
"name": "whiteBoard.exe",
"path": "/C/Users/Desktop/whiteBoard.exe",
"oldPath": "/C/Users/Desktop/whiteBoard.exe",
"parentPath": "/C/Users/Desktop",
"content": "link::Desktop::whiteBoard::baiban",
"ext": "exe",
"title": "whiteBoard",
"isSys": 1,
"id": 45
},
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 30,
"mtime": "2024-08-24T10:42:22.107Z",
"atime": "2024-08-24T10:42:22.107Z",
"birthtime": "2024-08-24T10:42:22.107Z",
"mode": 511,
"rdev": 0,
"name": "localchat.exe",
"path": "/C/Users/Desktop/localchat.exe",
"oldPath": "/C/Users/Desktop/localchat.exe",
"parentPath": "/C/Users/Desktop",
"content": "link::Desktop::localchat::chat",
"ext": "exe",
"title": "localchat",
"isSys": 1,
"id": 46
},
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 33,
"mtime": "2024-08-24T10:42:22.108Z",
"atime": "2024-08-24T10:42:22.108Z",
"birthtime": "2024-08-24T10:42:22.108Z",
"mode": 511,
"rdev": 0,
"name": "piceditor.exe",
"path": "/C/Users/Desktop/piceditor.exe",
"oldPath": "/C/Users/Desktop/piceditor.exe",
"parentPath": "/C/Users/Desktop",
"content": "link::Desktop::piceditor::picedit",
"ext": "exe",
"title": "piceditor",
"isSys": 1,
"id": 47
},
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 26,
"mtime": "2024-08-24T10:42:22.109Z",
"atime": "2024-08-24T10:42:22.109Z",
"birthtime": "2024-08-24T10:42:22.109Z",
"mode": 511,
"rdev": 0,
"name": "gantt.exe",
"path": "/C/Users/Desktop/gantt.exe",
"oldPath": "/C/Users/Desktop/gantt.exe",
"parentPath": "/C/Users/Desktop",
"content": "link::Desktop::gantt::gant",
"ext": "exe",
"title": "gantt",
"isSys": 1,
"id": 48
},
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 30,
"mtime": "2024-08-24T10:42:22.112Z",
"atime": "2024-08-24T10:42:22.112Z",
"birthtime": "2024-08-24T10:42:22.112Z",
"mode": 511,
"rdev": 0,
"name": "browser.exe",
"path": "/C/Users/Desktop/browser.exe",
"oldPath": "/C/Users/Desktop/browser.exe",
"parentPath": "/C/Users/Desktop",
"content": "link::Desktop::browser::brower",
"ext": "exe",
"title": "browser",
"isSys": 1,
"id": 53
}
],
"magnet": [
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 30,
"mtime": "2024-08-24T10:42:22.083Z",
"atime": "2024-08-24T10:42:22.083Z",
"birthtime": "2024-08-24T10:42:22.083Z",
"mode": 511,
"rdev": 0,
"name": "setting.exe",
"path": "/C/Users/Magnet/setting.exe",
"oldPath": "/C/Users/Magnet/setting.exe",
"parentPath": "/C/Users/Magnet",
"content": "link::Magnet::setting::setting",
"ext": "exe",
"title": "setting",
"isSys": 1,
"id": 26
},
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 31,
"mtime": "2024-08-24T10:42:22.090Z",
"atime": "2024-08-24T10:42:22.090Z",
"birthtime": "2024-08-24T10:42:22.090Z",
"mode": 511,
"rdev": 0,
"name": "computer.exe",
"path": "/C/Users/Magnet/computer.exe",
"oldPath": "/C/Users/Magnet/computer.exe",
"parentPath": "/C/Users/Magnet",
"content": "link::Magnet::computer::diannao",
"ext": "exe",
"title": "computer",
"isSys": 1,
"id": 29
},
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 29,
"mtime": "2024-08-24T10:42:22.096Z",
"atime": "2024-08-24T10:42:22.096Z",
"birthtime": "2024-08-24T10:42:22.096Z",
"mode": 511,
"rdev": 0,
"name": "appstore.exe",
"path": "/C/Users/Magnet/appstore.exe",
"oldPath": "/C/Users/Magnet/appstore.exe",
"parentPath": "/C/Users/Magnet",
"content": "link::Magnet::appstore::store",
"ext": "exe",
"title": "appstore",
"isSys": 1,
"id": 32
},
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 34,
"mtime": "2024-08-24T10:42:22.097Z",
"atime": "2024-08-24T10:42:22.097Z",
"birthtime": "2024-08-24T10:42:22.097Z",
"mode": 511,
"rdev": 0,
"name": "system.version.exe",
"path": "/C/Users/Magnet/system.version.exe",
"oldPath": "/C/Users/Magnet/system.version.exe",
"parentPath": "/C/Users/Magnet",
"content": "link::Magnet::system.version::info",
"ext": "exe",
"title": "system.version",
"isSys": 1,
"id": 34
},
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 37,
"mtime": "2024-08-24T10:42:22.099Z",
"atime": "2024-08-24T10:42:22.099Z",
"birthtime": "2024-08-24T10:42:22.099Z",
"mode": 511,
"rdev": 0,
"name": "process.title.exe",
"path": "/C/Users/Magnet/process.title.exe",
"oldPath": "/C/Users/Magnet/process.title.exe",
"parentPath": "/C/Users/Magnet",
"content": "link::Magnet::process.title::progress",
"ext": "exe",
"title": "process.title",
"isSys": 1,
"id": 36
},
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 36,
"mtime": "2024-08-24T10:42:22.110Z",
"atime": "2024-08-24T10:42:22.110Z",
"birthtime": "2024-08-24T10:42:22.110Z",
"mode": 511,
"rdev": 0,
"name": "calculator.exe",
"path": "/C/Users/Magnet/calculator.exe",
"oldPath": "/C/Users/Magnet/calculator.exe",
"parentPath": "/C/Users/Magnet",
"content": "link::Magnet::calculator::calculator",
"ext": "exe",
"title": "calculator",
"isSys": 1,
"id": 49
},
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 32,
"mtime": "2024-08-24T10:42:22.111Z",
"atime": "2024-08-24T10:42:22.111Z",
"birthtime": "2024-08-24T10:42:22.111Z",
"mode": 511,
"rdev": 0,
"name": "calendar.exe",
"path": "/C/Users/Magnet/calendar.exe",
"oldPath": "/C/Users/Magnet/calendar.exe",
"parentPath": "/C/Users/Magnet",
"content": "link::Magnet::calendar::calendar",
"ext": "exe",
"title": "calendar",
"isSys": 1,
"id": 50
},
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 31,
"mtime": "2024-08-24T10:42:22.111Z",
"atime": "2024-08-24T10:42:22.111Z",
"birthtime": "2024-08-24T10:42:22.111Z",
"mode": 511,
"rdev": 0,
"name": "musicStore.exe",
"path": "/C/Users/Magnet/musicStore.exe",
"oldPath": "/C/Users/Magnet/musicStore.exe",
"parentPath": "/C/Users/Magnet",
"content": "link::Magnet::musicStore::music",
"ext": "exe",
"title": "musicStore",
"isSys": 1,
"id": 51
},
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 30,
"mtime": "2024-08-24T10:42:22.112Z",
"atime": "2024-08-24T10:42:22.112Z",
"birthtime": "2024-08-24T10:42:22.112Z",
"mode": 511,
"rdev": 0,
"name": "gallery.exe",
"path": "/C/Users/Magnet/gallery.exe",
"oldPath": "/C/Users/Magnet/gallery.exe",
"parentPath": "/C/Users/Magnet",
"content": "link::Magnet::gallery::gallery",
"ext": "exe",
"title": "gallery",
"isSys": 1,
"id": 52
},
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 29,
"mtime": "2024-08-24T10:42:22.113Z",
"atime": "2024-08-24T10:42:22.113Z",
"birthtime": "2024-08-24T10:42:22.113Z",
"mode": 511,
"rdev": 0,
"name": "browser.exe",
"path": "/C/Users/Magnet/browser.exe",
"oldPath": "/C/Users/Magnet/browser.exe",
"parentPath": "/C/Users/Magnet",
"content": "link::Magnet::browser::brower",
"ext": "exe",
"title": "browser",
"isSys": 1,
"id": 54
}
],
"menulist": [
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 32,
"mtime": "2024-08-24T10:42:22.085Z",
"atime": "2024-08-24T10:42:22.085Z",
"birthtime": "2024-08-24T10:42:22.085Z",
"mode": 511,
"rdev": 0,
"name": "setting.exe",
"path": "/C/Users/Menulist/setting.exe",
"oldPath": "/C/Users/Menulist/setting.exe",
"parentPath": "/C/Users/Menulist",
"content": "link::Menulist::setting::setting",
"ext": "exe",
"title": "setting",
"isSys": 1,
"id": 27
},
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 33,
"mtime": "2024-08-24T10:42:22.094Z",
"atime": "2024-08-24T10:42:22.094Z",
"birthtime": "2024-08-24T10:42:22.094Z",
"mode": 511,
"rdev": 0,
"name": "computer.exe",
"path": "/C/Users/Menulist/computer.exe",
"oldPath": "/C/Users/Menulist/computer.exe",
"parentPath": "/C/Users/Menulist",
"content": "link::Menulist::computer::diannao",
"ext": "exe",
"title": "computer",
"isSys": 1,
"id": 30
},
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 31,
"mtime": "2024-08-24T10:42:22.096Z",
"atime": "2024-08-24T10:42:22.096Z",
"birthtime": "2024-08-24T10:42:22.096Z",
"mode": 511,
"rdev": 0,
"name": "appstore.exe",
"path": "/C/Users/Menulist/appstore.exe",
"oldPath": "/C/Users/Menulist/appstore.exe",
"parentPath": "/C/Users/Menulist",
"content": "link::Menulist::appstore::store",
"ext": "exe",
"title": "appstore",
"isSys": 1,
"id": 33
},
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 36,
"mtime": "2024-08-24T10:42:22.098Z",
"atime": "2024-08-24T10:42:22.098Z",
"birthtime": "2024-08-24T10:42:22.098Z",
"mode": 511,
"rdev": 0,
"name": "system.version.exe",
"path": "/C/Users/Menulist/system.version.exe",
"oldPath": "/C/Users/Menulist/system.version.exe",
"parentPath": "/C/Users/Menulist",
"content": "link::Menulist::system.version::info",
"ext": "exe",
"title": "system.version",
"isSys": 1,
"id": 35
},
{
"isFile": true,
"isDirectory": false,
"isSymlink": false,
"size": 39,
"mtime": "2024-08-24T10:42:22.100Z",
"atime": "2024-08-24T10:42:22.100Z",
"birthtime": "2024-08-24T10:42:22.100Z",
"mode": 511,
"rdev": 0,
"name": "process.title.exe",
"path": "/C/Users/Menulist/process.title.exe",
"oldPath": "/C/Users/Menulist/process.title.exe",
"parentPath": "/C/Users/Menulist",
"content": "link::Menulist::process.title::progress",
"ext": "exe",
"title": "process.title",
"isSys": 1,
"id": 37
}
]
}

126
godo/files/destop.go

@ -0,0 +1,126 @@
package files
import (
"strings"
"time"
)
type AppInfo struct {
Name string `json:"name"`
Path string `json:"path"`
OldPath string `json:"oldPath"`
ParentPath string `json:"parentPath"`
Content string `json:"content"`
Ext string `json:"ext"`
Title string `json:"title"`
IsSys int `json:"isSys"`
ID int `json:"id"`
IsFile bool `json:"isFile"`
IsDirectory bool `json:"isDirectory"`
IsSymlink bool `json:"isSymlink"`
Size int `json:"size"`
Mtime time.Time `json:"mtime"` // Modified time
Atime time.Time `json:"atime"` // Access time
Birthtime time.Time `json:"birthtime"` // Creation time
Mode int `json:"mode"`
Rdev int `json:"rdev"`
}
// RootObject represents the root object in the JSON data.
type RootObject struct {
UpdateTime time.Time `json:"updatetime"`
Desktop []AppInfo `json:"apps"`
Menulist []AppInfo `json:"menulist"`
}
var RootAppList = []map[string]string{
{"name": "computer", "icon": "diannao", "position": "Desktop,Menulist"},
{"name": "appstore", "icon": "store", "position": "Desktop,Menulist"},
{"name": "localchat", "icon": "chat", "position": "Desktop"},
{"name": "document", "icon": "word", "position": "Desktop"},
{"name": "excel", "icon": "excel", "position": "Desktop"},
{"name": "markdown", "icon": "markdown", "position": "Desktop"},
{"name": "mindmap", "icon": "mindexe", "position": "Desktop"},
{"name": "ppt", "icon": "pptexe", "position": "Desktop"},
{"name": "fileEditor", "icon": "editorbt", "position": "Desktop"},
{"name": "board", "icon": "kanban", "position": "Desktop"},
{"name": "whiteBoard", "icon": "baiban", "position": "Desktop"},
{"name": "piceditor", "icon": "picedit", "position": "Desktop"},
{"name": "gantt", "icon": "gant", "position": "Desktop"},
{"name": "browser", "icon": "brower", "position": "Desktop,Menulist"},
{"name": "setting", "icon": "setting", "position": "Menulist"},
{"name": "system.version", "icon": "info", "position": "Menulist"},
{"name": "process.title", "icon": "progress", "position": "Menulist"},
{"name": "calculator", "icon": "calculator", "position": "Menulist"},
{"name": "calendar", "icon": "calendar", "position": "Menulist"},
{"name": "musicStore", "icon": "music", "position": "Menulist"},
{"name": "gallery", "icon": "gallery", "position": "Menulist"},
{"name": "process.title", "icon": "progress", "position": "Menulist"},
}
// GetInitRootList constructs the initial root list.
func GetInitRootList() RootObject {
var desktopApps []AppInfo
var menulistApps []AppInfo
nowtime := time.Now()
var id = 1
for _, app := range RootAppList {
positions := strings.Split(app["position"], ",")
content := "link::Desktop::" + app["name"] + "::" + app["icon"]
for _, pos := range positions {
switch pos {
case "Desktop":
newApp := AppInfo{
Name: app["name"] + ".exe",
Path: "/C/Users/Desktop/" + app["name"] + ".exe",
OldPath: "/C/Users/Desktop/" + app["name"] + ".exe",
ParentPath: "/C/Users/Desktop",
Content: content,
Ext: "exe",
Title: app["name"],
IsSys: 1,
ID: id,
IsFile: true,
IsDirectory: false,
IsSymlink: false,
Size: len(content), // Size can be set to any value
Mtime: nowtime,
Atime: nowtime,
Birthtime: nowtime,
Mode: 511,
Rdev: 0,
}
desktopApps = append(desktopApps, newApp)
case "Menulist":
newApp := AppInfo{
Name: app["name"] + ".exe",
Path: "/C/Users/Menulist/" + app["name"] + ".exe",
OldPath: "/C/Users/Menulist/" + app["name"] + ".exe",
ParentPath: "/C/Users/Menulist",
Content: content,
Ext: "exe",
Title: app["name"],
IsSys: 1,
ID: id,
IsFile: true,
IsDirectory: false,
IsSymlink: false,
Size: len(content),
Mtime: nowtime,
Atime: nowtime,
Birthtime: nowtime,
Mode: 511,
Rdev: 0,
}
menulistApps = append(menulistApps, newApp)
}
}
id++
}
return RootObject{
UpdateTime: nowtime,
Desktop: desktopApps,
Menulist: menulistApps,
}
}

25
godo/files/fs.go

@ -192,16 +192,21 @@ func HandleUnlink(w http.ResponseWriter, r *http.Request) {
// HandleClear removes the entire filesystem (Caution: Use with care!)
func HandleClear(w http.ResponseWriter, r *http.Request) {
basePath, err := libs.GetOsDir()
// basePath, err := libs.GetOsDir()
// if err != nil {
// libs.HTTPError(w, http.StatusInternalServerError, err.Error())
// return
// }
// err = Clear(basePath)
// if err != nil {
// libs.HTTPError(w, http.StatusConflict, err.Error())
// return
// }
err := RecoverOsSystem()
if err != nil {
libs.HTTPError(w, http.StatusInternalServerError, err.Error())
return
}
err = Clear(basePath)
if err != nil {
libs.HTTPError(w, http.StatusConflict, err.Error())
return
}
res := libs.APIResponse{Message: "FileSystem successfully cleared."}
json.NewEncoder(w).Encode(res)
}
@ -457,3 +462,11 @@ func parseMode(modeStr string) (os.FileMode, error) {
}
return os.FileMode(mode), nil
}
func HandleDesktop(w http.ResponseWriter, r *http.Request) {
rootInfo, err := GetDesktop()
if err != nil {
libs.HTTPError(w, http.StatusInternalServerError, err.Error())
return
}
libs.SuccessMsg(w, rootInfo, "success")
}

231
godo/files/init.go

@ -0,0 +1,231 @@
package files
import (
"encoding/json"
"fmt"
"godo/libs"
"os"
"path/filepath"
"time"
)
func RecoverOsSystem() error {
basePath, err := libs.GetOsDir()
if err != nil {
return fmt.Errorf("GetOsDir error: %v", err)
}
osCpath := filepath.Join(basePath, "C")
if libs.PathExists(osCpath) {
err := os.RemoveAll(osCpath)
if err != nil {
return fmt.Errorf("RemoveAll error: %v", err)
}
}
err = InitOsSystem()
if err != nil {
return fmt.Errorf("InitOsSystem error: %v", err)
}
return nil
}
func InitOsSystem() error {
basePath, err := libs.GetOsDir()
if err != nil {
return fmt.Errorf("GetOsDir error: %v", err)
}
if !libs.PathExists(basePath) {
if err := os.MkdirAll(basePath, 0755); err != nil {
return fmt.Errorf("Mkdir error: %v", err)
}
}
osCpath := filepath.Join(basePath, "C")
if !libs.PathExists(osCpath) {
if err := os.MkdirAll(osCpath, 0755); err != nil {
return fmt.Errorf("Mkdir error: %v", err)
}
baseOsDir := []string{
"D",
"E",
"B",
}
for _, dir := range baseOsDir {
dirPath := filepath.Join(basePath, dir)
if !libs.PathExists(dirPath) {
if err := os.MkdirAll(dirPath, 0755); err != nil {
return fmt.Errorf("Mkdir error: %v", err)
}
}
}
systemPath := filepath.Join(osCpath, "System")
if !libs.PathExists(systemPath) {
if err := os.MkdirAll(systemPath, 0755); err != nil {
return fmt.Errorf("Mkdir error: %v", err)
}
}
userPath := filepath.Join(osCpath, "Users")
if !libs.PathExists(userPath) {
if err := os.MkdirAll(userPath, 0755); err != nil {
return fmt.Errorf("Mkdir error: %v", err)
}
InitPaths := []string{
"Desktop",
"Menulist",
"Documents",
"Downloads",
"Music",
"Pictures",
"Videos",
"Schedule",
"Reciv",
}
for _, dir := range InitPaths {
dirPath := filepath.Join(userPath, dir)
if !libs.PathExists(dirPath) {
if err := os.MkdirAll(dirPath, 0755); err != nil {
return fmt.Errorf("Mkdir error: %v", err)
}
}
}
InitDocPath := []string{
"Word",
"Markdown",
"PPT",
"Baiban",
"Kanban",
"Execl",
"Mind",
"Screenshot",
"ScreenRecording",
}
docpath := filepath.Join(userPath, "Documents")
for _, dir := range InitDocPath {
dirPath := filepath.Join(docpath, dir)
if !libs.PathExists(dirPath) {
if err := os.MkdirAll(dirPath, 0755); err != nil {
return fmt.Errorf("Mkdir error: %v", err)
}
}
}
applist := GetInitRootList()
desktopPath := filepath.Join(userPath, "Desktop")
for _, app := range applist.Desktop {
appPath := filepath.Join(desktopPath, app.Name)
if !libs.PathExists(appPath) {
if err := os.WriteFile(appPath, []byte(app.Content), 0644); err != nil {
return fmt.Errorf("failed to write to file: %w", err)
}
}
}
menulistPath := filepath.Join(userPath, "Menulist")
for _, app := range applist.Menulist {
appPath := filepath.Join(menulistPath, app.Name)
if !libs.PathExists(appPath) {
if err := os.WriteFile(appPath, []byte(app.Content), 0644); err != nil {
return fmt.Errorf("failed to write to file: %w", err)
}
}
}
content, err := json.MarshalIndent(applist, "", " ")
if err != nil {
return fmt.Errorf("failed to marshal reqBodies to JSON: %w", err)
}
appPath, err := libs.GetAppDir()
if err != nil {
return fmt.Errorf("GetAppDir error: %v", err)
}
desktopFilePath := filepath.Join(appPath, "desktop.json")
if err := os.WriteFile(desktopFilePath, content, 0644); err != nil {
return fmt.Errorf("failed to write to file: %w", err)
}
}
}
return nil
}
func GetDesktop() (RootObject, error) {
var applist RootObject
desktoppath, err := GetDeskTopPath()
if err != nil || !libs.PathExists(desktoppath) {
return applist, fmt.Errorf("desktop.json not found")
}
content, err := os.ReadFile(desktoppath)
if err != nil {
return applist, fmt.Errorf("failed to read file: %w", err)
}
err = json.Unmarshal(content, &applist)
if err != nil {
return applist, fmt.Errorf("failed to unmarshal JSON: %w", err)
}
return applist, nil
}
func GetDeskTopPath() (string, error) {
appPath, err := libs.GetAppDir()
if err != nil {
return "", fmt.Errorf("GetAppDir error: %v", err)
}
return filepath.Join(appPath, "desktop.json"), nil
}
func WriteDesktop(rootInfo RootObject) error {
rootInfo.UpdateTime = time.Now()
content, err := json.MarshalIndent(rootInfo, "", " ")
if err != nil {
return fmt.Errorf("failed to marshal reqBodies to JSON: %w", err)
}
basePath, err := libs.GetOsDir()
if err != nil {
return fmt.Errorf("GetOsDir error: %v", err)
}
desktoppath := filepath.Join(basePath, "C", "System", "desktop.json")
return os.WriteFile(desktoppath, content, 0644)
}
func AddDesktop(app AppInfo, position string) error {
applist, err := GetDesktop()
if err != nil {
return fmt.Errorf("GetDesktop error: %v", err)
}
if position == "Desktop" {
if !checkHasApp(applist.Desktop, app) {
applist.Desktop = append(applist.Desktop, app)
}
} else if position == "Menulist" {
if !checkHasApp(applist.Menulist, app) {
applist.Menulist = append(applist.Menulist, app)
}
} else {
return fmt.Errorf("position error")
}
return WriteDesktop(applist)
}
func DeleteDesktop(name string) error {
rootInfo, err := GetDesktop()
if err != nil {
return fmt.Errorf("GetDesktop error: %v", err)
}
indexToDelete := -1
for i, item := range rootInfo.Desktop {
if item.Name == name {
indexToDelete = i
break
}
}
// 如果找到了要删除的元素
if indexToDelete >= 0 {
// 使用 append 删除元素
rootInfo.Desktop = append(rootInfo.Desktop[:indexToDelete], rootInfo.Desktop[indexToDelete+1:]...)
} else {
return fmt.Errorf("item with name '%s' not found", name)
}
return WriteDesktop(rootInfo)
}
func checkHasApp(list []AppInfo, app AppInfo) bool {
for _, item := range list {
if item.Name == app.Name {
return true
}
}
return false
}

57
godo/libs/info.go

@ -59,23 +59,52 @@ func GenerateSystemInfo() UserOsInfo {
// GetIPAddress 获取本机IP地址
func GetIPAddress() (string, error) {
addrs, err := net.InterfaceAddrs()
ips, err := GetValidIPAddresses()
//log.Printf("ips: %v", ips)
if err != nil {
return "", err
}
for _, addr := range addrs {
var ip net.IP
switch v := addr.(type) {
case *net.IPNet:
ip = v.IP
case *net.IPAddr:
ip = v.IP
for _, ipStr := range ips {
ip := net.ParseIP(ipStr)
if ip != nil && ip.To4() != nil && ip.String()[:7] == "192.168" {
return ipStr, nil
}
if ip != nil && !ip.IsLoopback() && ip.To4() != nil {
return ip.String(), nil
}
return "", fmt.Errorf("no valid IP addresses found")
}
// GetValidIPAddresses 获取所有有效 IP 地址
func GetValidIPAddresses() ([]string, error) {
var validIPs []string
ifaces, err := net.Interfaces()
if err != nil {
return nil, err
}
for _, iface := range ifaces {
addrs, err := iface.Addrs()
if err != nil {
continue
}
for _, addr := range addrs {
var ip net.IP
switch v := addr.(type) {
case *net.IPNet:
ip = v.IP
case *net.IPAddr:
ip = v.IP
}
if ip != nil && !ip.IsLoopback() && ip.To4() != nil {
// 过滤链路本地地址
if !ip.IsLinkLocalUnicast() {
validIPs = append(validIPs, ip.String())
}
}
}
}
return "", fmt.Errorf("no valid IP address found")
if len(validIPs) == 0 {
return nil, fmt.Errorf("no valid non-private and non-link-local IP address found")
}
return validIPs, nil
}
// getMACAddress 获取MAC地址
@ -107,12 +136,8 @@ func GetSystemInfo() (string, error) {
if !ok {
return "", fmt.Errorf("未找到osInfo配置")
}
systemInfo, ok := lineseInfo.(UserOsInfo)
if !ok {
return "", fmt.Errorf("osInfo配置错误")
}
// 将系统信息序列化为JSON字符串
jsonBytes, err := json.Marshal(systemInfo)
jsonBytes, err := json.Marshal(lineseInfo)
if err != nil {
return "", err
}

2
godo/sys/update.go

@ -134,7 +134,7 @@ func GetUpdateUrlHandler(w http.ResponseWriter, r *http.Request) {
http.Error(w, "update error:"+err.Error(), http.StatusInternalServerError)
return
}
updateUrl := "https://godocms.com/version?info=" + info
updateUrl := "https://godoos.com/version?info=" + info
res, err := http.Get(updateUrl)
if err != nil {
libs.ErrorMsg(w, err.Error())

Loading…
Cancel
Save