代码拉取完成,页面将自动刷新
package jsweb
import (
"errors"
"net/http"
"os"
"strings"
"time"
"gitee.com/haodreams/golib/autoroute/controller"
"gitee.com/haodreams/golib/js/jstask"
"gitee.com/haodreams/golib/logs"
"github.com/dop251/goja"
)
var jsDir = "js/"
var initJs func(vm *goja.Runtime) any
func SetJsDir(dir string) {
if !strings.HasSuffix(dir, "/") {
dir += "/"
}
jsDir = dir
}
func SetInitJs(f jstask.CallBack) {
initJs = f
}
// JsController 授权相关的操作
type JsController struct {
controller.Controller
}
func (m *JsController) check(script string) (err error) {
vm := goja.New()
if initJs != nil {
initJs(vm)
}
_, err = vm.RunString(script)
if err != nil {
logs.Warn(err)
return
}
return err
}
// Tasks 同步任务
func (m *JsController) Tasks() {
typ := m.GetParam().GetTrimString("type")
if m.IsPost() {
boss := jstask.GetTasks()
if boss == nil {
m.Error("没有有效的数据")
}
if typ == "async" {
tasks := boss.AsyncTask.GetTasks()
m.Page(tasks, nil)
} else {
tasks := boss.SyncTask.GetTasks()
m.Page(tasks, nil)
}
return
}
m.Display()
}
// Check 检查代码
func (m *JsController) Check() {
param := m.GetParam()
script := param.GetTrimString("js")
err := m.check(script)
if err != nil {
m.Error(err.Error())
return
}
m.Msg("OK")
}
// Test 测试代码
func (m *JsController) Test() {
now := time.Now()
param := m.GetParam()
script := param.GetTrimString("js")
vm := goja.New()
var jsthis any
if initJs != nil {
jsthis = initJs(vm)
}
vm.Set("SetRunTimeout", func(timeout int64) {
logs.Info("SetRunTimeout", timeout)
})
_, err := vm.RunString(script)
if err != nil {
logs.Warn(err)
m.Error(err.Error())
return
}
run, ok := goja.AssertFunction(vm.Get("run"))
if !ok {
err = errors.New("run not a function")
logs.Warn(err)
return
}
runTime := time.Now()
data, err := run(vm.ToValue(jsthis))
if err != nil {
logs.Warn(err)
m.Error(err.Error())
return
}
logs.Info("总耗时:", time.Since(now), "运行耗时:", time.Since(runTime))
m.Msg(data.String())
}
// Test 测试代码
func (m *JsController) Download() {
param := m.GetParam()
script := param.GetTrimString("js")
vm := goja.New()
var jsthis any
if initJs != nil {
jsthis = initJs(vm)
}
vm.Set("SetRunTimeout", func(timeout int64) {
logs.Info("SetRunTimeout", timeout)
})
_, err := vm.RunString(script)
if err != nil {
logs.Warn(err)
m.Error(err.Error())
return
}
if err != nil {
logs.Warn(err)
m.Error(err.Error())
return
}
run, ok := goja.AssertFunction(vm.Get("run"))
if !ok {
err = errors.New("run not a function")
logs.Warn(err)
return
}
rv, err := run(vm.ToValue(jsthis))
if err != nil {
logs.Warn(err)
m.Error(err.Error())
return
}
m.Writer.Header().Add("Content-Disposition", "attachment; filename=result.csv") //fmt.Sprintf("attachment; filename=%s", filename)对下载的文件重命名
m.Writer.Header().Add("Content-Type", "application/octet-stream")
m.Writer.WriteString(rv.String())
}
// Save 保存代码
func (m *JsController) Save() {
fileName := m.GetParam().GetTrimString("name")
if fileName == "" {
m.Error("无效的文件名")
return
}
script := m.GetParam().GetTrimString("js")
err := m.check(script)
if err != nil {
m.Error(err.Error())
return
}
err = os.WriteFile(jsDir+fileName, []byte(script), 0644)
if err != nil {
m.Error(err.Error())
return
}
m.Msg("OK")
}
// File .
func (m *JsController) File() {
path := jsDir + m.GetParam().GetString("path")
data, err := os.ReadFile(path)
if err != nil {
m.Error(err.Error())
} else {
m.Msg(string(data))
}
}
// Tree 标签
type Tree struct {
ID string `json:"id"`
Label string `json:"label"`
Icon string `json:"icon"`
Children []*Tree `json:"children"`
}
// List 列出所有文件
func (m *JsController) List() {
path := jsDir + m.GetParam().GetString("path")
fi, err := os.ReadDir(path)
if err != nil {
m.Error(err.Error())
return
}
ifs := make([]*Tree, 0, len(fi))
for _, f := range fi {
if f.IsDir() {
continue
}
inf := new(Tree)
inf.Label = f.Name()
inf.ID = f.Name()
ifs = append(ifs, inf)
}
m.JSON(http.StatusOK, ifs)
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。