Browse Source

change update

master
godo 9 months ago
parent
commit
18f55e8386
  1. 1
      frontend/components.d.ts
  2. 2
      frontend/src/components/desktop/DesktopBackground.vue
  3. 64
      frontend/src/stores/localchat.ts
  4. 34
      frontend/src/stores/message.ts
  5. 20
      frontend/src/stores/upgrade.ts
  6. 5
      frontend/src/system/config.ts
  7. 16
      frontend/src/system/index.ts
  8. 1
      godo/localchat/server.go
  9. 53
      godo/sys/update.go

1
frontend/components.d.ts

@ -53,6 +53,7 @@ declare module 'vue' {
ElColorPicker: typeof import('element-plus/es')['ElColorPicker'] ElColorPicker: typeof import('element-plus/es')['ElColorPicker']
ElDatePicker: typeof import('element-plus/es')['ElDatePicker'] ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
ElDialog: typeof import('element-plus/es')['ElDialog'] ElDialog: typeof import('element-plus/es')['ElDialog']
ElDrawer: typeof import('element-plus/es')['ElDrawer']
ElEmpty: typeof import('element-plus/es')['ElEmpty'] ElEmpty: typeof import('element-plus/es')['ElEmpty']
ElForm: typeof import('element-plus/es')['ElForm'] ElForm: typeof import('element-plus/es')['ElForm']
ElFormItem: typeof import('element-plus/es')['ElFormItem'] ElFormItem: typeof import('element-plus/es')['ElFormItem']

2
frontend/src/components/desktop/DesktopBackground.vue

@ -32,7 +32,7 @@ watch(rootState.options, (nv) => {
}); });
function refershBack(val: string | undefined) { function refershBack(val: string | undefined) {
background.value = val || "#3A98CE"; background.value = val || "#3A98CE";
console.log(background.value) //console.log(background.value)
if (background.value || background.value.startsWith("/image/")) { if (background.value || background.value.startsWith("/image/")) {
backgroundType.value = "image"; backgroundType.value = "image";
} else { } else {

64
frontend/src/stores/localchat.ts

@ -2,12 +2,11 @@ import { defineStore } from 'pinia'
import emojiList from "@/assets/emoji.json" import emojiList from "@/assets/emoji.json"
import { ref, toRaw } from "vue"; import { ref, toRaw } from "vue";
import { db } from './db' import { db } from './db'
import { fetchPost, getChatUrl, getUrl, setSystemKey } from "@/system/config"; import { getSystemConfig, setSystemKey } from "@/system/config";
import { isValidIP } from "@/util/common"; import { isValidIP } from "@/util/common";
import { notifyError, notifySuccess } from "@/util/msg"; import { notifyError, notifySuccess } from "@/util/msg";
export const useLocalChatStore = defineStore('localChatStore', () => { export const useLocalChatStore = defineStore('localChatStore', () => {
//const config = getSystemConfig(); const config = getSystemConfig();
const chatUrl = getChatUrl();
//const sys = inject<System>("system"); //const sys = inject<System>("system");
const userList: any = ref([]) const userList: any = ref([])
const msgList: any = ref([]) const msgList: any = ref([])
@ -39,6 +38,7 @@ export const useLocalChatStore = defineStore('localChatStore', () => {
setUserList(ips); setUserList(ips);
} }
if(data.messages){ if(data.messages){
const apiUrl = `${config.apiUrl}/localchat/viewimage?img=`
for(let ip in data.messages){ for(let ip in data.messages){
const msgList:any = data.messages[ip] const msgList:any = data.messages[ip]
if(!msgList || msgList.length < 1)return; if(!msgList || msgList.length < 1)return;
@ -50,10 +50,7 @@ export const useLocalChatStore = defineStore('localChatStore', () => {
addText(msg) addText(msg)
} }
else if (msg.type === "image"){ else if (msg.type === "image"){
msg.message = msg.message.map((d: any) => { msg.message = msg.message.map((d: any) => `${apiUrl}${encodeURIComponent(d)}`)
const url = `/localchat/viewimage?img=${encodeURIComponent(d)}`
return getUrl(url)
})
//console.log(msg) //console.log(msg)
addText(msg) addText(msg)
} }
@ -321,27 +318,24 @@ export const useLocalChatStore = defineStore('localChatStore', () => {
return return
} }
const content = toRaw(sendInfo.value) const content = toRaw(sendInfo.value)
let saveContent:any let saves:any
if (type === 'image') { if (type === 'image') {
saveContent = content.map((d: any) => { const apiUrl = `${config.apiUrl}/localchat/viewimage?img=`
const url = `/localchat/viewimage?img=${encodeURIComponent(d)}` saves = content.map((d: any) => `${apiUrl}${encodeURIComponent(d)}`)
return getUrl(url)
})
}else{ }else{
saveContent = content saves = content
} }
console.log(saveContent)
const saveMsg: any = { const saveMsg: any = {
type: type, type: type,
targetId: chatTargetId.value, targetId: chatTargetId.value,
targetIp: chatTargetIp.value, targetIp: chatTargetIp.value,
content: saveContent, content: saves,
createdAt: Date.now(), createdAt: Date.now(),
isMe: true, isMe: true,
isRead: false, isRead: false,
status: 'sending' status: 'sending'
} }
console.log(saveMsg) //console.log(saveMsg)
const msgId = await db.addOne('chatmsg', saveMsg) const msgId = await db.addOne('chatmsg', saveMsg)
//await getMsgList() //await getMsgList()
@ -353,20 +347,23 @@ export const useLocalChatStore = defineStore('localChatStore', () => {
ip: saveMsg.targetIp ip: saveMsg.targetIp
} }
if (targetUser.isOnline) { if (targetUser.isOnline) {
let postUrl = `${chatUrl}/message` let postUrl = `${config.apiUrl}/localchat/message`
if(type === 'applyfile'){ if(type === 'applyfile'){
messages.message = { messages.message = {
fileList: messages.message, fileList: messages.message,
msgId: msgId, msgId: msgId,
status: 'apply' status: 'apply'
} }
postUrl = `${chatUrl}/applyfile` postUrl = `${config.apiUrl}/localchat/applyfile`
} }
if(type === 'image'){ if(type === 'image'){
postUrl = `${chatUrl}/sendimage` postUrl = `${config.apiUrl}/localchat/sendimage`
} }
const completion = await fetchPost(postUrl, JSON.stringify(messages)) const completion = await fetch(postUrl, {
method: "POST",
body: JSON.stringify(messages),
})
//console.log(completion) //console.log(completion)
if (!completion.ok) { if (!completion.ok) {
console.log(completion) console.log(completion)
@ -393,8 +390,11 @@ export const useLocalChatStore = defineStore('localChatStore', () => {
message: item.content.msgId, message: item.content.msgId,
ip: item.targetIp ip: item.targetIp
} }
const postUrl = `${chatUrl}/cannelfile` const postUrl = `${config.apiUrl}/localchat/cannelfile`
const coms = await fetchPost(postUrl, JSON.stringify(messages)) const coms = await fetch(postUrl, {
method: "POST",
body: JSON.stringify(messages),
})
if (!coms.ok) { if (!coms.ok) {
console.log(coms) console.log(coms)
notifyError("确认失败!") notifyError("确认失败!")
@ -421,8 +421,11 @@ export const useLocalChatStore = defineStore('localChatStore', () => {
message: item.content, message: item.content,
ip: item.targetIp ip: item.targetIp
} }
const postUrl = `${chatUrl}/accessfile` const postUrl = `${config.apiUrl}/localchat/accessfile`
const coms = await fetchPost(postUrl, JSON.stringify(messages)) const coms = await fetch(postUrl, {
method: "POST",
body: JSON.stringify(messages),
})
if (!coms.ok) { if (!coms.ok) {
//console.log(coms) //console.log(coms)
notifyError("确认失败!") notifyError("确认失败!")
@ -439,18 +442,16 @@ export const useLocalChatStore = defineStore('localChatStore', () => {
}else{ }else{
notifyError(res.message) notifyError(res.message)
} }
// item.content.status = 'accessing'
// //console.log(item)
// await db.update('chatmsg', item.id, toRaw(item))
// await getMsgList()
//notifySuccess("确认成功!")
} }
} }
async function saveConfig(conf:any){ async function saveConfig(conf:any){
conf = toRaw(conf) conf = toRaw(conf)
//console.log(conf) //console.log(conf)
const postUrl = `${chatUrl}/setting` const postUrl = `${config.apiUrl}/localchat/setting`
const coms = await fetchPost(postUrl, JSON.stringify(conf)) const coms = await fetch(postUrl, {
method: "POST",
body: JSON.stringify(conf),
})
if (!coms.ok) { if (!coms.ok) {
//console.log(coms) //console.log(coms)
notifyError("保存失败!") notifyError("保存失败!")
@ -461,7 +462,6 @@ export const useLocalChatStore = defineStore('localChatStore', () => {
} }
} }
return { return {
userList, userList,
navList, navList,

34
frontend/src/stores/message.ts

@ -0,0 +1,34 @@
import { getUrl } from "@/system/config";
import { defineStore } from "pinia";
import { useUpgradeStore } from "./upgrade";
export const useMessageStore = defineStore('messageStore', () => {
const upgradeStore = useUpgradeStore();
function systemMessage(){
const url = getUrl('/system/message',false);
const source = new EventSource(url);
source.onmessage = function(event) {
const data = JSON.parse(event.data);
//console.log(data)
handleMessage(data);
};
source.onerror = function(event) {
console.error('EventSource error:', event);
};
}
async function handleMessage(message:any) {
switch (message.type) {
case 'update':
upgradeStore.checkUpdate(message.data)
break;
case 'chat':
break;
default:
console.warn('Unknown message type:', message.type);
}
}
return {
systemMessage
}
})

20
frontend/src/stores/upgrade.ts

@ -1,6 +1,6 @@
import { defineStore } from "pinia"; import { defineStore } from "pinia";
import { ref } from "vue"; import { ref } from "vue";
import { setSystemKey, parseJson, getSystemConfig, getUrl } from '@/system/config' import { setSystemKey, parseJson, getSystemConfig } from '@/system/config'
import { RestartApp } from '@/util/goutil'; import { RestartApp } from '@/util/goutil';
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { t } from '@/i18n'; import { t } from '@/i18n';
@ -37,9 +37,8 @@ export const useUpgradeStore = defineStore('upgradeStore', () => {
return 0; return 0;
} }
function systemMessage(){ function systemMessage(){
//const config = getSystemConfig(); const config = getSystemConfig();
const apiUrl = getUrl('/system/message',false) const source = new EventSource(`${config.apiUrl}/system/message`);
const source = new EventSource(apiUrl);
source.onmessage = function(event) { source.onmessage = function(event) {
const data = JSON.parse(event.data); const data = JSON.parse(event.data);
@ -97,24 +96,19 @@ export const useUpgradeStore = defineStore('upgradeStore', () => {
} }
} }
function changeUrl(list : any){ function changeUrl(list : any){
const config = getSystemConfig();
list.forEach((item:any) => { list.forEach((item:any) => {
if(item.img && item.img.indexOf('http') == -1){ if(item.img && item.img.indexOf('http') == -1){
if(config.userType === 'person'){
item.img = `https://godoos.com${item.img}` item.img = `https://godoos.com${item.img}`
}else{
item.img = `${config.userInfo.url}${item.img}`
}
} }
}); });
return list return list
} }
async function update() { async function update() {
//const apiUrl = getApiUrl() const config = getSystemConfig();
const upUrl = `/system/update?url=${updateUrl.value}` const upUrl = `${config.apiUrl}/system/update?url=${updateUrl.value}`
const apiUrl = getUrl(upUrl,true)
const upRes = await fetch(apiUrl) const upRes = await fetch(upUrl)
if (!upRes.ok) return; if (!upRes.ok) return;
const reader: any = upRes.body?.getReader(); const reader: any = upRes.body?.getReader();
if (!reader) { if (!reader) {

5
frontend/src/system/config.ts

@ -101,6 +101,9 @@ export const getSystemConfig = (ifset = false) => {
password: '', password: '',
}; };
} }
if(config.userType == 'member'){
config.account.ad = false
}
if (!config.storenet) { if (!config.storenet) {
config.storenet = { config.storenet = {
url: '', url: '',
@ -183,7 +186,7 @@ export function getChatUrl() {
if (config.userType == 'person') { if (config.userType == 'person') {
return config.apiUrl + '/localchat' return config.apiUrl + '/localchat'
} else { } else {
return config.userInfo.url + '/localchat' return config.userInfo.url + '/chat'
} }
} }
export function getUrl(url: string, islast = true) { export function getUrl(url: string, islast = true) {

16
frontend/src/system/index.ts

@ -24,6 +24,7 @@ import { pick } from '../util/modash';
import { Tray, TrayOptions } from './menu/Tary'; import { Tray, TrayOptions } from './menu/Tary';
import { getSystemConfig, getSystemKey, setSystemKey, setSystemConfig, clearSystemConfig, getFileUrl, fetchGet, getClientId } from './config' import { getSystemConfig, getSystemKey, setSystemKey, setSystemConfig, clearSystemConfig, getFileUrl, fetchGet, getClientId } from './config'
import { useUpgradeStore } from '@/stores/upgrade'; import { useUpgradeStore } from '@/stores/upgrade';
import { useMessageStore } from '@/stores/message';
import { RestartApp } from '@/util/goutil'; import { RestartApp } from '@/util/goutil';
import { notifyError } from '@/util/msg'; import { notifyError } from '@/util/msg';
@ -103,13 +104,24 @@ export class System {
this.initBackground(); // 初始化壁纸 this.initBackground(); // 初始化壁纸
this.refershAppList(); this.refershAppList();
this.checkMessages();
this.emit('start');
this._ready && this._ready(this);
}
private checkMessages() {
const config = getSystemConfig();
if (config.userType == 'member') {
setTimeout(() => {
const messageStore = useMessageStore();
messageStore.systemMessage()
}, 3000);
}
setTimeout(() => { setTimeout(() => {
const upgradeStore = useUpgradeStore(); const upgradeStore = useUpgradeStore();
upgradeStore.systemMessage() upgradeStore.systemMessage()
}, 6000); }, 6000);
this.emit('start');
this._ready && this._ready(this);
} }
/** /**

1
godo/localchat/server.go

@ -48,6 +48,7 @@ type UserStatus struct {
Hostname string `json:"hostname"` Hostname string `json:"hostname"`
IP string `json:"ip"` IP string `json:"ip"`
Time time.Time `json:"time"` Time time.Time `json:"time"`
Avatar string `json:"avatar"`
} }
var OnlineUsers = make(map[string]UserStatus) var OnlineUsers = make(map[string]UserStatus)

53
godo/sys/update.go

@ -26,10 +26,12 @@ package sys
import ( import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"godo/files"
"godo/libs" "godo/libs"
"io" "io"
"log" "log"
"net/http" "net/http"
"os"
"path/filepath" "path/filepath"
"time" "time"
@ -95,13 +97,25 @@ func (pr *ProgressReader) Read(p []byte) (n int, err error) {
} }
func UpdateAppHandler(w http.ResponseWriter, r *http.Request) { func UpdateAppHandler(w http.ResponseWriter, r *http.Request) {
url := r.URL.Query().Get("url") url := r.URL.Query().Get("url")
if url == "" {
libs.ErrorMsg(w, "url is empty")
return
}
downloadDir := libs.GetCacheDir()
filePath := filepath.Join(downloadDir, filepath.Base(url))
resp, err := http.Get(url) resp, err := http.Get(url)
if err != nil { if err != nil {
return return
} }
defer resp.Body.Close() defer resp.Body.Close()
pr := &ProgressReader{reader: resp.Body} pr := &ProgressReader{reader: resp.Body}
// 打开文件
out, err := os.Create(filePath)
if err != nil {
libs.ErrorMsg(w, "open file error")
return
}
defer out.Close()
ticker := time.NewTicker(200 * time.Millisecond) ticker := time.NewTicker(200 * time.Millisecond)
defer ticker.Stop() defer ticker.Stop()
flusher, ok := w.(http.Flusher) flusher, ok := w.(http.Flusher)
@ -142,10 +156,26 @@ func UpdateAppHandler(w http.ResponseWriter, r *http.Request) {
} }
} }
}() }()
// 复制数据
var updateFile io.Reader = pr if _, err := io.Copy(out, pr); err != nil {
libs.ErrorMsg(w, "copy error")
return
}
// 解压缩文件
unzippedFilePath, err := files.Unzip(filePath, downloadDir)
if err != nil {
libs.ErrorMsg(w, "unzip error")
return
}
// 将解压缩后的文件读取为 io.Reader
unzipFile, err := os.Open(unzippedFilePath)
if err != nil {
libs.ErrorMsg(w, "open unzip file error")
return
}
defer unzipFile.Close()
// apply update // apply update
err = selfupdate.Apply(updateFile, selfupdate.Options{}) err = selfupdate.Apply(unzipFile, selfupdate.Options{})
if err != nil { if err != nil {
if rerr := selfupdate.RollbackError(err); rerr != nil { if rerr := selfupdate.RollbackError(err); rerr != nil {
http.Error(w, "update error:"+rerr.Error(), http.StatusInternalServerError) http.Error(w, "update error:"+rerr.Error(), http.StatusInternalServerError)
@ -156,33 +186,34 @@ func UpdateAppHandler(w http.ResponseWriter, r *http.Request) {
// 更新完成后发送响应给前端 // 更新完成后发送响应给前端
json.NewEncoder(w).Encode(map[string]bool{"updateCompleted": true}) json.NewEncoder(w).Encode(map[string]bool{"updateCompleted": true})
} }
func GetUpdateInfo() (ServerRes, error) { func GetUpdateInfo() (UpdateVersionReq, error) {
var errs UpdateVersionReq
var updateInfo ServerRes var updateInfo ServerRes
info, err := libs.GetSystemInfo() info, err := libs.GetSystemInfo()
if err != nil { if err != nil {
return updateInfo, fmt.Errorf("update error get info:" + err.Error()) return errs, fmt.Errorf("update error get info:" + err.Error())
} }
updateUrl := "https://godoos.com/version?info=" + info updateUrl := "https://godoos.com/version?info=" + info
//log.Printf("updateUrl:%v", updateUrl) //log.Printf("updateUrl:%v", updateUrl)
res, err := http.Get(updateUrl) res, err := http.Get(updateUrl)
if err != nil { if err != nil {
return updateInfo, fmt.Errorf("update error get url:" + err.Error()) return errs, fmt.Errorf("update error get url:" + err.Error())
} }
defer res.Body.Close() defer res.Body.Close()
if res.StatusCode != 200 { if res.StatusCode != 200 {
return updateInfo, fmt.Errorf("update error get url") return errs, fmt.Errorf("update error get url")
} }
body, err := io.ReadAll(res.Body) body, err := io.ReadAll(res.Body)
if err != nil { if err != nil {
return updateInfo, fmt.Errorf("update error read body:" + err.Error()) return errs, fmt.Errorf("update error read body:" + err.Error())
} }
err = json.Unmarshal(body, &updateInfo) err = json.Unmarshal(body, &updateInfo)
//log.Printf("updateInfo:%v", updateInfo) //log.Printf("updateInfo:%v", updateInfo)
if err != nil { if err != nil {
fmt.Println("Error unmarshalling JSON:", err) fmt.Println("Error unmarshalling JSON:", err)
return updateInfo, fmt.Errorf("update error unmarshal:" + err.Error()) return errs, fmt.Errorf("update error unmarshal:" + err.Error())
} }
return updateInfo, nil return updateInfo.Data, nil
} }
func GetUpdateUrlHandler(w http.ResponseWriter, r *http.Request) { func GetUpdateUrlHandler(w http.ResponseWriter, r *http.Request) {
updateInfo, err := GetUpdateInfo() updateInfo, err := GetUpdateInfo()

Loading…
Cancel
Save