提交 d0e1397d 编写于 作者: Z zhaoke

Merge branch 'main' into ztf-35_zhaoke

package main
func main() {
}
...@@ -11,7 +11,6 @@ import ( ...@@ -11,7 +11,6 @@ import (
logUtils "github.com/easysoft/zentaoatf/pkg/lib/log" logUtils "github.com/easysoft/zentaoatf/pkg/lib/log"
stringUtils "github.com/easysoft/zentaoatf/pkg/lib/string" stringUtils "github.com/easysoft/zentaoatf/pkg/lib/string"
"github.com/fatih/color" "github.com/fatih/color"
"log"
"os" "os"
"os/signal" "os/signal"
"strings" "strings"
...@@ -83,58 +82,33 @@ func main() { ...@@ -83,58 +82,33 @@ func main() {
switch os.Args[1] { switch os.Args[1] {
case "set", "-set": case "set", "-set":
flagSet.Parse(os.Args[2:]) flagSet.Parse(os.Args[2:])
if commConsts.Verbose {
log.Println("WorkDir=" + commConsts.WorkDir)
log.Println("ZtfDir=" + commConsts.ZtfDir)
}
action.Set() action.Set()
case "expect": case "expect":
files := fileUtils.GetFilesFromParams(os.Args[2:]) files := fileUtils.GetFilesFromParams(os.Args[2:])
action.GenExpectFiles(files) action.GenExpectFiles(files)
case "extract": case "extract":
files := fileUtils.GetFilesFromParams(os.Args[2:]) files := fileUtils.GetFilesFromParams(os.Args[2:])
action.Extract(files) action.Extract(files)
case "checkout", "co": case "checkout", "co":
if err := flagSet.Parse(os.Args[2:]); err == nil { checkout()
action.Checkout(productId, moduleId, suiteId, taskIdOrName, independentFile, language)
}
case "ci": case "ci":
files := fileUtils.GetFilesFromParams(os.Args[2:]) ci()
if err := flagSet.Parse(os.Args[len(files)+2:]); err == nil {
action.CheckIn(files)
}
case "cr": case "cr":
files := fileUtils.GetFilesFromParams(os.Args[2:]) cr()
if err := flagSet.Parse(os.Args[len(files)+2:]); err == nil {
action.CommitZTFTestResult(files, stringUtils.ParseInt(productId),
taskIdOrName, noNeedConfirm)
}
case "cb": case "cb":
files := fileUtils.GetFilesFromParams(os.Args[2:]) cb()
if err := flagSet.Parse(os.Args[len(files)+2:]); err == nil {
action.CommitBug(files, stringUtils.ParseInt(productId), noNeedConfirm)
}
case "list", "ls", "-l": case "list", "ls", "-l":
files := fileUtils.GetFilesFromParams(os.Args[2:]) list()
if err := flagSet.Parse(os.Args[len(files)+2:]); err == nil {
if len(files) == 0 {
files = append(files, ".")
}
action.List(files, keywords)
}
case "view", "-v": case "view", "-v":
files := fileUtils.GetFilesFromParams(os.Args[2:]) view()
if err := flagSet.Parse(os.Args[len(files)+2:]); err == nil {
action.View(files, keywords)
}
case "clean", "-clean", "-c": case "clean", "-clean", "-c":
action.Clean() action.Clean()
...@@ -160,6 +134,52 @@ func main() { ...@@ -160,6 +134,52 @@ func main() {
} }
} }
func checkout() {
if err := flagSet.Parse(os.Args[2:]); err == nil {
action.Checkout(productId, moduleId, suiteId, taskIdOrName, independentFile, language)
}
}
func ci() {
files := fileUtils.GetFilesFromParams(os.Args[2:])
if err := flagSet.Parse(os.Args[len(files)+2:]); err == nil {
action.CheckIn(files)
}
}
func cr() {
files := fileUtils.GetFilesFromParams(os.Args[2:])
if err := flagSet.Parse(os.Args[len(files)+2:]); err == nil {
action.CommitZTFTestResult(files, stringUtils.ParseInt(productId),
taskIdOrName, noNeedConfirm)
}
}
func cb() {
files := fileUtils.GetFilesFromParams(os.Args[2:])
if err := flagSet.Parse(os.Args[len(files)+2:]); err == nil {
action.CommitBug(files, stringUtils.ParseInt(productId), noNeedConfirm)
}
}
func list() {
files := fileUtils.GetFilesFromParams(os.Args[2:])
if err := flagSet.Parse(os.Args[len(files)+2:]); err == nil {
if len(files) == 0 {
files = append(files, ".")
}
action.List(files, keywords)
}
}
func view() {
files := fileUtils.GetFilesFromParams(os.Args[2:])
if err := flagSet.Parse(os.Args[len(files)+2:]); err == nil {
action.View(files, keywords)
}
}
func run(args []string) { func run(args []string) {
if len(args) >= 3 && stringUtils.FindInArr(args[2], commConsts.UnitTestTypes) { // unit test if len(args) >= 3 && stringUtils.FindInArr(args[2], commConsts.UnitTestTypes) { // unit test
runUnitTest(args) runUnitTest(args)
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
title=with multi groups title=with multi groups
cid=2 cid=2
pid=0 pid=1
step 1 >> expect 1 step 1 >> expect 1
step 2 >> expect 2 step 2 >> expect 2
......
...@@ -72,6 +72,7 @@ func Init() { ...@@ -72,6 +72,7 @@ func Init() {
i118Utils.Init(commConsts.Language, commConsts.AppServer) i118Utils.Init(commConsts.Language, commConsts.AppServer)
langHelper.GetExtToNameMap() langHelper.GetExtToNameMap()
langHelper.GetEditorExtToLangMap()
commConsts.ExecFrom = commConsts.FromCmd commConsts.ExecFrom = commConsts.FromCmd
return return
......
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.27.1
// protoc v3.17.3
// source: greater/greater.proto
package greater
import (
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
reflect "reflect"
sync "sync"
)
const (
// Verify that this generated code is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
// The request message containing the user's name.
type HelloRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
}
func (x *HelloRequest) Reset() {
*x = HelloRequest{}
if protoimpl.UnsafeEnabled {
mi := &file_greater_greater_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *HelloRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*HelloRequest) ProtoMessage() {}
func (x *HelloRequest) ProtoReflect() protoreflect.Message {
mi := &file_greater_greater_proto_msgTypes[0]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use HelloRequest.ProtoReflect.Descriptor instead.
func (*HelloRequest) Descriptor() ([]byte, []int) {
return file_greater_greater_proto_rawDescGZIP(), []int{0}
}
func (x *HelloRequest) GetName() string {
if x != nil {
return x.Name
}
return ""
}
// The response message containing the greetings
type HelloReply struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
}
func (x *HelloReply) Reset() {
*x = HelloReply{}
if protoimpl.UnsafeEnabled {
mi := &file_greater_greater_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *HelloReply) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*HelloReply) ProtoMessage() {}
func (x *HelloReply) ProtoReflect() protoreflect.Message {
mi := &file_greater_greater_proto_msgTypes[1]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use HelloReply.ProtoReflect.Descriptor instead.
func (*HelloReply) Descriptor() ([]byte, []int) {
return file_greater_greater_proto_rawDescGZIP(), []int{1}
}
func (x *HelloReply) GetMessage() string {
if x != nil {
return x.Message
}
return ""
}
var File_greater_greater_proto protoreflect.FileDescriptor
var file_greater_greater_proto_rawDesc = []byte{
0x0a, 0x15, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x2f, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65,
0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72,
0x22, 0x22, 0x0a, 0x0c, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
0x6e, 0x61, 0x6d, 0x65, 0x22, 0x26, 0x0a, 0x0a, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70,
0x6c, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20,
0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x43, 0x0a, 0x07,
0x47, 0x72, 0x65, 0x65, 0x74, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x08, 0x53, 0x61, 0x79, 0x48, 0x65,
0x6c, 0x6c, 0x6f, 0x12, 0x15, 0x2e, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x2e, 0x48, 0x65,
0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x67, 0x72, 0x65,
0x61, 0x74, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22,
0x00, 0x42, 0x0b, 0x5a, 0x09, 0x2e, 0x2f, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x62, 0x06,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
file_greater_greater_proto_rawDescOnce sync.Once
file_greater_greater_proto_rawDescData = file_greater_greater_proto_rawDesc
)
func file_greater_greater_proto_rawDescGZIP() []byte {
file_greater_greater_proto_rawDescOnce.Do(func() {
file_greater_greater_proto_rawDescData = protoimpl.X.CompressGZIP(file_greater_greater_proto_rawDescData)
})
return file_greater_greater_proto_rawDescData
}
var file_greater_greater_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
var file_greater_greater_proto_goTypes = []interface{}{
(*HelloRequest)(nil), // 0: greater.HelloRequest
(*HelloReply)(nil), // 1: greater.HelloReply
}
var file_greater_greater_proto_depIdxs = []int32{
0, // 0: greater.Greeter.SayHello:input_type -> greater.HelloRequest
1, // 1: greater.Greeter.SayHello:output_type -> greater.HelloReply
1, // [1:2] is the sub-list for method output_type
0, // [0:1] is the sub-list for method input_type
0, // [0:0] is the sub-list for extension type_name
0, // [0:0] is the sub-list for extension extendee
0, // [0:0] is the sub-list for field type_name
}
func init() { file_greater_greater_proto_init() }
func file_greater_greater_proto_init() {
if File_greater_greater_proto != nil {
return
}
if !protoimpl.UnsafeEnabled {
file_greater_greater_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*HelloRequest); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_greater_greater_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*HelloReply); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
}
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_greater_greater_proto_rawDesc,
NumEnums: 0,
NumMessages: 2,
NumExtensions: 0,
NumServices: 1,
},
GoTypes: file_greater_greater_proto_goTypes,
DependencyIndexes: file_greater_greater_proto_depIdxs,
MessageInfos: file_greater_greater_proto_msgTypes,
}.Build()
File_greater_greater_proto = out.File
file_greater_greater_proto_rawDesc = nil
file_greater_greater_proto_goTypes = nil
file_greater_greater_proto_depIdxs = nil
}
syntax = "proto3";
package greater;
option go_package="./greater";
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
\ No newline at end of file
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
package greater
import (
context "context"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
)
// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
// Requires gRPC-Go v1.32.0 or later.
const _ = grpc.SupportPackageIsVersion7
// GreeterClient is the client API for Greeter service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
type GreeterClient interface {
// Sends a greeting
SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloReply, error)
}
type greeterClient struct {
cc grpc.ClientConnInterface
}
func NewGreeterClient(cc grpc.ClientConnInterface) GreeterClient {
return &greeterClient{cc}
}
func (c *greeterClient) SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloReply, error) {
out := new(HelloReply)
err := c.cc.Invoke(ctx, "/greater.Greeter/SayHello", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// GreeterServer is the server API for Greeter service.
// All implementations must embed UnimplementedGreeterServer
// for forward compatibility
type GreeterServer interface {
// Sends a greeting
SayHello(context.Context, *HelloRequest) (*HelloReply, error)
mustEmbedUnimplementedGreeterServer()
}
// UnimplementedGreeterServer must be embedded to have forward compatible implementations.
type UnimplementedGreeterServer struct {
}
func (UnimplementedGreeterServer) SayHello(context.Context, *HelloRequest) (*HelloReply, error) {
return nil, status.Errorf(codes.Unimplemented, "method SayHello not implemented")
}
func (UnimplementedGreeterServer) mustEmbedUnimplementedGreeterServer() {}
// UnsafeGreeterServer may be embedded to opt out of forward compatibility for this service.
// Use of this interface is not recommended, as added methods to GreeterServer will
// result in compilation errors.
type UnsafeGreeterServer interface {
mustEmbedUnimplementedGreeterServer()
}
func RegisterGreeterServer(s grpc.ServiceRegistrar, srv GreeterServer) {
s.RegisterService(&Greeter_ServiceDesc, srv)
}
func _Greeter_SayHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(HelloRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(GreeterServer).SayHello(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/greater.Greeter/SayHello",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(GreeterServer).SayHello(ctx, req.(*HelloRequest))
}
return interceptor(ctx, in, info, handler)
}
// Greeter_ServiceDesc is the grpc.ServiceDesc for Greeter service.
// It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy)
var Greeter_ServiceDesc = grpc.ServiceDesc{
ServiceName: "greater.Greeter",
HandlerType: (*GreeterServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "SayHello",
Handler: _Greeter_SayHello_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "greater/greater.proto",
}
...@@ -274,14 +274,10 @@ func GetSuiteFiles(resultDir string, startTime int64, testTool commConsts.TestTo ...@@ -274,14 +274,10 @@ func GetSuiteFiles(resultDir string, startTime int64, testTool commConsts.TestTo
continue continue
} }
if testTool == commConsts.Allure && ext == ".json" { if (testTool == commConsts.Allure && ext == ".json") || ext == ".xml" {
pth := filepath.Join(resultDir, name)
resultFiles = append(resultFiles, pth)
} else if ext == ".xml" {
pth := filepath.Join(resultDir, name) pth := filepath.Join(resultDir, name)
resultFiles = append(resultFiles, pth) resultFiles = append(resultFiles, pth)
} }
} }
} }
} else { } else {
...@@ -344,17 +340,11 @@ func GetTestSuite(xmlFile string, testTool commConsts.TestTool) ( ...@@ -344,17 +340,11 @@ func GetTestSuite(xmlFile string, testTool commConsts.TestTool) (
if err == nil { if err == nil {
testSuite = ConvertRobotResult(robotResult) testSuite = ConvertRobotResult(robotResult)
} }
} else if testTool == commConsts.Cypress { } else if testTool == commConsts.Cypress || testTool == commConsts.Playwright {
cyResult := commDomain.CypressTestsuites{} result := commDomain.CypressTestsuites{}
err = xml.Unmarshal([]byte(content), &cyResult) err = xml.Unmarshal([]byte(content), &result)
if err == nil {
testSuite = ConvertCyResult(cyResult)
}
} else if testTool == commConsts.Playwright {
cyResult := commDomain.CypressTestsuites{}
err = xml.Unmarshal([]byte(content), &cyResult)
if err == nil { if err == nil {
testSuite = ConvertCyResult(cyResult) testSuite = ConvertCyResult(result)
} }
} else if testTool == commConsts.Puppeteer { } else if testTool == commConsts.Puppeteer {
cyResult := commDomain.CypressTestsuites{} cyResult := commDomain.CypressTestsuites{}
...@@ -477,11 +467,7 @@ func GetAllureCaseSuiteName(cs commDomain.AllureCase) (name string) { ...@@ -477,11 +467,7 @@ func GetAllureCaseSuiteName(cs commDomain.AllureCase) (name string) {
if label.Value != "" { if label.Value != "" {
suiteArr = append(suiteArr, label.Value) suiteArr = append(suiteArr, label.Value)
} }
} else if label.Name == "suite" { } else if label.Name == "suite" || label.Name == "subSuite" {
if label.Value != "" && (len(suiteArr) == 0 || label.Value != suiteArr[len(suiteArr)-1]) {
suiteArr = append(suiteArr, label.Value)
}
} else if label.Name == "subSuite" {
if label.Value != "" && (len(suiteArr) == 0 || label.Value != suiteArr[len(suiteArr)-1]) { if label.Value != "" && (len(suiteArr) == 0 || label.Value != suiteArr[len(suiteArr)-1]) {
suiteArr = append(suiteArr, label.Value) suiteArr = append(suiteArr, label.Value)
} }
......
...@@ -25,24 +25,16 @@ func CheckCaseResult(scriptFile string, logs string, report *commDomain.ZtfRepor ...@@ -25,24 +25,16 @@ func CheckCaseResult(scriptFile string, logs string, report *commDomain.ZtfRepor
total int, secs string, pathMaxWidth int, numbMaxWidth int, total int, secs string, pathMaxWidth int, numbMaxWidth int,
wsMsg *websocket.Message, errOutput string) { wsMsg *websocket.Message, errOutput string) {
steps, isOldFormat := scriptHelper.GetStepAndExpectMap(scriptFile) steps := scriptHelper.GetStepAndExpectMap(scriptFile)
isIndependent, expectIndependentContent := scriptHelper.GetDependentExpect(scriptFile) isIndependent, expectIndependentContent := scriptHelper.GetDependentExpect(scriptFile)
if isIndependent { if isIndependent {
if isOldFormat { scriptHelper.GetExpectMapFromIndependentFile(&steps, expectIndependentContent, false)
scriptHelper.GetExpectMapFromIndependentFileObsolete(&steps, expectIndependentContent, false)
} else {
scriptHelper.GetExpectMapFromIndependentFile(&steps, expectIndependentContent, false)
}
} }
skip := false skip := false
actualArr := make([][]string, 0) actualArr := make([][]string, 0)
if isOldFormat { skip, actualArr = scriptHelper.ReadLogArr(logs)
skip, actualArr = scriptHelper.ReadLogArrObsolete(logs)
} else {
skip, actualArr = scriptHelper.ReadLogArr(logs)
}
language := langHelper.GetLangByFile(scriptFile) language := langHelper.GetLangByFile(scriptFile)
ValidateCaseResult(scriptFile, language, steps, skip, actualArr, report, ValidateCaseResult(scriptFile, language, steps, skip, actualArr, report,
......
...@@ -55,20 +55,12 @@ func GenerateScript(cs commDomain.ZtfCase, langType string, independentFile bool ...@@ -55,20 +55,12 @@ func GenerateScript(cs commDomain.ZtfCase, langType string, independentFile bool
targetDir = filepath.Join(targetDir, strconv.Itoa(moduleId)) targetDir = filepath.Join(targetDir, strconv.Itoa(moduleId))
} }
content := ""
isOldFormat := false
scriptPath = cs.ScriptPath scriptPath = cs.ScriptPath
if scriptPath == "" { if scriptPath == "" {
fileUtils.MkDirIfNeeded(targetDir) fileUtils.MkDirIfNeeded(targetDir)
scriptPath = filepath.Join(targetDir, fmt.Sprintf("%d.%s", caseId, commConsts.LangMap[langType]["extName"])) scriptPath = filepath.Join(targetDir, fmt.Sprintf("%d.%s", caseId, commConsts.LangMap[langType]["extName"]))
} }
if fileUtils.FileExist(scriptPath) { // update title and steps
content = fileUtils.ReadFile(scriptPath)
isOldFormat = strings.Index(content, "[esac]") > -1
}
*caseIds = append(*caseIds, strconv.Itoa(caseId)) *caseIds = append(*caseIds, strconv.Itoa(caseId))
info := make([]string, 0) info := make([]string, 0)
...@@ -84,12 +76,8 @@ func GenerateScript(cs commDomain.ZtfCase, langType string, independentFile bool ...@@ -84,12 +76,8 @@ func GenerateScript(cs commDomain.ZtfCase, langType string, independentFile bool
StepWidth := 20 StepWidth := 20
stepDisplayMaxWidth := 0 stepDisplayMaxWidth := 0
computerTestStepWidth(cs.Steps, &stepDisplayMaxWidth, StepWidth) computerTestStepWidth(cs.Steps, &stepDisplayMaxWidth, StepWidth)
generateTestStepAndScript(cs.Steps, &steps, &independentExpects, independentFile)
if isOldFormat {
generateTestStepAndScriptObsolete(cs.Steps, &steps, &independentExpects, independentFile)
} else {
generateTestStepAndScript(cs.Steps, &steps, &independentExpects, independentFile)
}
info = append(info, strings.Join(steps, "\n")) info = append(info, strings.Join(steps, "\n"))
if independentFile { if independentFile {
...@@ -128,108 +116,6 @@ func GenEmptyScript(name, lang, pth string, productId int) { ...@@ -128,108 +116,6 @@ func GenEmptyScript(name, lang, pth string, productId int) {
fileUtils.WriteFile(pth, out) fileUtils.WriteFile(pth, out)
} }
func generateTestStepAndScriptObsolete(testSteps []commDomain.ZtfStep, steps *[]string, independentExpects *[]string, independentFile bool) {
nestedSteps := make([]commDomain.ZtfStep, 0)
currGroup := commDomain.ZtfStep{}
idx := 0
// convert steps to nested
for true {
if idx >= len(testSteps) {
break
}
ts := testSteps[idx]
if ts.Parent == 0 && ts.Type != "group" { // flat step
currGroup = commDomain.ZtfStep{Id: -1, Desc: "group", Children: make([]commDomain.ZtfStep, 0)}
currGroup.Children = append(currGroup.Children, ts)
idx++
mutiLine := false
for true {
if idx >= len(testSteps) {
currGroup.MultiLine = mutiLine
nestedSteps = append(nestedSteps, currGroup)
break
}
child := testSteps[idx]
if child.Type != "group" { // flat step
if !mutiLine {
mutiLine = IsMultiLine(child)
}
currGroup.Children = append(currGroup.Children, child)
} else { // found a group step
currGroup.MultiLine = mutiLine
nestedSteps = append(nestedSteps, currGroup)
break
}
idx++
}
} else if ts.Type == "group" {
currGroup = commDomain.ZtfStep{Desc: ts.Desc, Children: make([]commDomain.ZtfStep, 0)}
idx++
mutiLine := false
for true {
if idx >= len(testSteps) {
nestedSteps = append(nestedSteps, currGroup)
break
}
child := testSteps[idx]
if child.Type != "group" && child.Parent == ts.Id { // child step
if !mutiLine {
mutiLine = IsMultiLine(child)
}
currGroup.Children = append(currGroup.Children, child)
} else { // found a group step
currGroup.MultiLine = mutiLine
nestedSteps = append(nestedSteps, currGroup)
break
}
idx++
}
}
}
stepNumb := 1
// print nested steps, only one level
for _, group := range nestedSteps {
if group.Id == -1 { // [group]
*steps = append(*steps, fmt.Sprintf("\n[group]"))
for _, child := range group.Children {
stepContent, expectContent := GetCaseContent(child, strconv.Itoa(stepNumb), independentFile, group.MultiLine)
*steps = append(*steps, stepContent)
if independentFile && strings.TrimSpace(child.Expect) != "" {
*independentExpects = append(*independentExpects, expectContent)
}
stepNumb++
}
} else { // [1. title]
*steps = append(*steps, "\n"+fmt.Sprintf("[%d. %s]", stepNumb, group.Desc))
for childNo, child := range group.Children {
numbStr := fmt.Sprintf("%d.%d", stepNumb, childNo+1)
stepContent, expectContent := GetCaseContent(child, numbStr, independentFile, group.MultiLine)
*steps = append(*steps, stepContent)
if independentFile && strings.TrimSpace(child.Expect) != "" {
*independentExpects = append(*independentExpects, expectContent)
}
}
stepNumb++
}
}
}
func generateTestStepAndScript(testSteps []commDomain.ZtfStep, steps *[]string, independentExpects *[]string, independentFile bool) { func generateTestStepAndScript(testSteps []commDomain.ZtfStep, steps *[]string, independentExpects *[]string, independentFile bool) {
nestedSteps := make([]commDomain.ZtfStep, 0) nestedSteps := make([]commDomain.ZtfStep, 0)
......
...@@ -34,7 +34,7 @@ func ReplaceCaseDesc(desc, file string) { ...@@ -34,7 +34,7 @@ func ReplaceCaseDesc(desc, file string) {
fileUtils.WriteFile(file, out) fileUtils.WriteFile(file, out)
} }
func GetStepAndExpectMap(file string) (steps []commDomain.ZentaoCaseStep, isOldFormat bool) { func GetStepAndExpectMap(file string) (steps []commDomain.ZentaoCaseStep) {
if !fileUtils.FileExist(file) { if !fileUtils.FileExist(file) {
return return
} }
...@@ -42,63 +42,20 @@ func GetStepAndExpectMap(file string) (steps []commDomain.ZentaoCaseStep, isOldF ...@@ -42,63 +42,20 @@ func GetStepAndExpectMap(file string) (steps []commDomain.ZentaoCaseStep, isOldF
lang := langHelper.GetLangByFile(file) lang := langHelper.GetLangByFile(file)
txt := fileUtils.ReadFile(file) txt := fileUtils.ReadFile(file)
isOldFormat = strings.Index(txt, "[esac]") > -1 _, checkpoints := ReadCaseInfo(txt, lang)
_, checkpoints := ReadCaseInfo(txt, lang, isOldFormat)
lines := strings.Split(checkpoints, "\n") lines := strings.Split(checkpoints, "\n")
if isOldFormat { groupArr := getStepNestedArr(lines)
groupBlockArr := getGroupBlockArr(lines) _, steps = getSortedTextFromNestedSteps(groupArr)
groupArr := getStepNestedArrObsolete(groupBlockArr)
_, steps = getSortedTextFromNestedStepsObsolete(groupArr)
} else {
groupArr := getStepNestedArr(lines)
_, steps = getSortedTextFromNestedSteps(groupArr)
}
isIndependent, expectIndependentContent := GetDependentExpect(file) isIndependent, expectIndependentContent := GetDependentExpect(file)
if isIndependent { if isIndependent {
if isOldFormat { GetExpectMapFromIndependentFile(&steps, expectIndependentContent, false)
GetExpectMapFromIndependentFileObsolete(&steps, expectIndependentContent, false)
} else {
GetExpectMapFromIndependentFile(&steps, expectIndependentContent, false)
}
} }
return return
} }
//func SortFile(file string) {
// stepsTxt := ""
//
// if fileUtils.FileExist(file) {
// txt := fileUtils.ReadFile(file)
// lang := langUtils.GetLangByFile(file)
// isOldFormat := strings.Index(txt, "[esac]") > -1
// info, content := ReadCaseInfo(txt, lang, isOldFormat)
// lines := strings.Split(content, "\n")
//
// groupBlockArr := getGroupBlockArr(lines)
// groupArr := getStepNestedArrObsolete(groupBlockArr)
// stepsTxt, _, _, _ = getSortedTextFromNestedStepsObsolete(groupArr)
//
// // replace info
// from := ""
// to := ""
// if isOldFormat {
// from = `(?s)\[case\].*\[esac\]`
// to = "[case]\n" + info + "\n" + stepsTxt + "\n\n[esac]"
// } else {
// from = fmt.Sprintf(`(?s)%s.*%s`, langUtils.LangCommentsRegxMap[lang][0], langUtils.LangCommentsRegxMap[lang][1])
// to = fmt.Sprintf("%s\n"+info+"\n"+stepsTxt+"\n\n%s",
// langUtils.LangCommentsRegxMap[lang][0], langUtils.LangCommentsRegxMap[lang][1])
// }
// re, _ := regexp.Compile(from)
// script := re.ReplaceAllString(txt, to)
//
// fileUtils.WriteFile(file, script)
// }
//}
func getGroupBlockArr(lines []string) [][]string { func getGroupBlockArr(lines []string) [][]string {
groupBlockArr := make([][]string, 0) groupBlockArr := make([][]string, 0)
...@@ -141,28 +98,6 @@ func getGroupBlockArr(lines []string) [][]string { ...@@ -141,28 +98,6 @@ func getGroupBlockArr(lines []string) [][]string {
return groupBlockArr return groupBlockArr
} }
func getStepNestedArrObsolete(blocks [][]string) (ret []commDomain.ZtfStep) {
for _, block := range blocks {
name := block[0]
group := commDomain.ZtfStep{Desc: name}
if isStepsIdent(block[1]) { // muti line
group.MultiLine = true
childs := loadMultiLineSteps(block[1:])
group.Children = append(group.Children, childs...)
} else {
childs := loadSingleLineSteps(block[1:])
group.Children = append(group.Children, childs...)
}
ret = append(ret, group)
}
return ret
}
func getStepNestedArr(lines []string) (ret []commDomain.ZtfStep) { func getStepNestedArr(lines []string) (ret []commDomain.ZtfStep) {
parent := commDomain.ZtfStep{} parent := commDomain.ZtfStep{}
increase := 0 increase := 0
...@@ -346,125 +281,6 @@ func isGroup(str string) bool { ...@@ -346,125 +281,6 @@ func isGroup(str string) bool {
return ret return ret
} }
func getSortedTextFromNestedStepsObsolete(groups []commDomain.ZtfStep) (stepsText string, steps []commDomain.ZentaoCaseStep) {
ret := make([]string, 0)
groupNumb := 1
for _, group := range groups {
desc := group.Desc
if desc == "[group]" {
ret = append(ret, "\n"+desc)
for idx, child := range group.Children { // level 1 item
step := commDomain.ZentaoCaseStep{}
if group.MultiLine {
// steps
tag := replaceNumb("[steps]", groupNumb, -1, true)
ret = append(ret, " "+tag)
stepTxt := printMutiStepOrExpect(child.Desc)
ret = append(ret, stepTxt)
step.Desc = stepTxt
// expects
tag = replaceNumb("[expects]", groupNumb, -1, true)
ret = append(ret, " "+tag)
expectTxt := printMutiStepOrExpect(child.Expect)
ret = append(ret, expectTxt)
if idx < len(group.Children)-1 {
ret = append(ret, "")
}
step.Expect = expectTxt
} else {
stepTxt := strings.TrimSpace(child.Desc)
stepTxtWithNumb := replaceNumb(stepTxt, groupNumb, -1, false)
step.Desc = stepTxt
expectTxt := child.Expect
expectTxt = strings.TrimSpace(expectTxt)
step.Expect = expectTxt
if expectTxt != "" {
expectTxt = ">> " + expectTxt
}
ret = append(ret, fmt.Sprintf(" %s %s", stepTxtWithNumb, expectTxt))
}
steps = append(steps, step)
groupNumb++
}
} else {
groupStep := commDomain.ZentaoCaseStep{}
desc = replaceNumb(group.Desc, groupNumb, -1, true)
ret = append(ret, "\n"+desc)
groupStep.Type = commConsts.Group
groupStep.Desc = getGroupName(group.Desc)
groupStep.Expect = ""
steps = append(steps, groupStep)
childNumb := 1
for _, child := range group.Children {
itemStep := commDomain.ZentaoCaseStep{}
itemStep.Type = commConsts.Item
if group.MultiLine {
// steps
tag := replaceNumb("[steps]", groupNumb, childNumb, true)
ret = append(ret, " "+tag)
stepTxt := printMutiStepOrExpect(child.Desc)
ret = append(ret, stepTxt)
itemStep.Desc = stepTxt
// expects
tag = replaceNumb("[expects]", groupNumb, childNumb, true)
ret = append(ret, " "+tag)
expectTxt := printMutiStepOrExpect(child.Expect)
ret = append(ret, expectTxt)
itemStep.Expect = expectTxt
} else {
stepTxt := strings.TrimSpace(child.Desc)
itemStep.Desc = stepTxt
expectTxt := child.Expect
expectTxt = strings.TrimSpace(expectTxt)
itemStep.Expect = expectTxt
if expectTxt != "" {
expectTxt = ">> " + expectTxt
}
ret = append(ret, fmt.Sprintf(" %s %s", stepTxt, expectTxt))
}
childNumb++
}
groupNumb++
}
}
stepsText = strings.Join(ret, "\n")
return
}
func getSortedTextFromNestedSteps(groups []commDomain.ZtfStep) (ret string, steps []commDomain.ZentaoCaseStep) { func getSortedTextFromNestedSteps(groups []commDomain.ZtfStep) (ret string, steps []commDomain.ZentaoCaseStep) {
arr := make([]string, 0) arr := make([]string, 0)
...@@ -565,20 +381,6 @@ func printMutiStepOrExpect(str string) string { ...@@ -565,20 +381,6 @@ func printMutiStepOrExpect(str string) string {
return strings.Join(ret, "\r\n") return strings.Join(ret, "\r\n")
} }
func GetExpectMapFromIndependentFileObsolete(steps *[]commDomain.ZentaoCaseStep, content string, withEmptyExpect bool) {
expectArr := ReadExpectIndependentArrObsolete(content)
for idx, step := range *steps {
if len(expectArr) > idx {
step.Expect = strings.Join(expectArr[idx], "\r\n")
} else {
if withEmptyExpect {
step.Expect = ""
}
}
}
}
func GetExpectMapFromIndependentFile(steps *[]commDomain.ZentaoCaseStep, content string, withEmptyExpect bool) { func GetExpectMapFromIndependentFile(steps *[]commDomain.ZentaoCaseStep, content string, withEmptyExpect bool) {
expectArr := ReadExpectIndependentArr(content) expectArr := ReadExpectIndependentArr(content)
...@@ -752,105 +554,6 @@ func GetCaseInfo(file string) (pass bool, caseId, productId int, title string) { ...@@ -752,105 +554,6 @@ func GetCaseInfo(file string) (pass bool, caseId, productId int, title string) {
return return
} }
//func ReadScriptCheckpoints(file string) ([]string, [][]string) {
// _, expectIndependentContent := GetDependentExpect(file)
//
// content := fileUtils.ReadFile(file)
// _, checkpoints := ReadCaseInfo(content)
//
// cpStepArr, expectArr := getCheckpointStepArr(checkpoints, expectIndependentContent)
//
// return cpStepArr, expectArr
//}
//func getCheckpointStepArr(content string, expectIndependentContent string) ([]string, [][]string) {
// cpStepArr := make([]string, 0)
// expectArr := make([][]string, 0)
//
// independentExpect := expectIndependentContent != ""
//
// lines := strings.Split(content, "\n")
// i := 0
// for i < len(lines) {
// step := ""
// expects := make([]string, 0)
//
// line := strings.TrimSpace(lines[i])
//
// regx := regexp.MustCompile(`(?U:[\d\.]*)(.+)>>(.*)`)
// arr := regx.FindStringSubmatch(line)
// if len(arr) > 2 {
// step = arr[1]
// if !independentExpect {
// expects = append(expects, strings.TrimSpace(arr[2]))
// }
// } else {
// regx = regexp.MustCompile(`\[([\d\.]*).*expects\]`)
// arr = regx.FindStringSubmatch(line)
// if len(arr) > 1 {
// step = arr[1]
//
// if !independentExpect {
// for i+1 < len(lines) {
// ln := strings.TrimSpace(lines[i+1])
//
// if strings.Index(ln, "[") == 0 || strings.Index(ln, ">>") > 0 || ln == "" {
// break
// } else {
// expects = append(expects, ln)
// i++
// }
// }
// }
// }
// }
//
// if step != "" && len(expects) > 0 {
// cpStepArr = append(cpStepArr, step)
// if !independentExpect {
// expectArr = append(expectArr, expects)
// }
// }
// i++
// }
//
// if independentExpect {
// expectArr = ReadExpectIndependentArrObsolete(expectIndependentContent)
// }
//
// return cpStepArr, expectArr
//}
func ReadExpectIndependentArrObsolete(content string) [][]string {
lines := strings.Split(content, "\n")
ret := make([][]string, 0)
var cpArr []string
for idx, line := range lines {
line = strings.TrimSpace(line)
if line == ">>" { // more than one line
cpArr = make([]string, 0)
} else if strings.Index(line, ">>") == 0 { // single line
line = strings.Replace(line, ">>", "", -1)
line = strings.TrimSpace(line)
cpArr = append(cpArr, line)
ret = append(ret, cpArr)
cpArr = make([]string, 0)
} else { // under >>
cpArr = append(cpArr, line)
if idx == len(lines)-1 || strings.Index(lines[idx+1], ">>") > -1 {
ret = append(ret, cpArr)
cpArr = make([]string, 0)
}
}
}
return ret
}
func ReadExpectIndependentArr(content string) [][]string { func ReadExpectIndependentArr(content string) [][]string {
//正常显示6 //正常显示6
//E2.16 //E2.16
...@@ -889,8 +592,6 @@ func ReadExpectIndependentArr(content string) [][]string { ...@@ -889,8 +592,6 @@ func ReadExpectIndependentArr(content string) [][]string {
idx += 1 idx += 1
} }
} else if line == ">>" {
continue
} else { } else {
currModel = "single" currModel = "single"
...@@ -907,51 +608,6 @@ func ReadExpectIndependentArr(content string) [][]string { ...@@ -907,51 +608,6 @@ func ReadExpectIndependentArr(content string) [][]string {
return ret return ret
} }
func ReadLogArrObsolete(content string) (isSkip bool, ret [][]string) {
lines := strings.Split(content, "\n")
ret = make([][]string, 0)
var cpArr []string
model := ""
for idx, line := range lines {
line = strings.TrimSpace(line)
if line == "skip" {
isSkip = true
return
}
if line == ">>" { // more than one line
model = "multi"
cpArr = make([]string, 0)
} else if strings.Index(line, ">>") == 0 { // single line
model = "single"
line = strings.Replace(line, ">>", "", -1)
line = strings.TrimSpace(line)
cpArr = append(cpArr, line)
ret = append(ret, cpArr)
cpArr = make([]string, 0)
} else {
if model == "" || model == "single" {
continue
}
// under >>
cpArr = append(cpArr, line)
if idx == len(lines)-1 || strings.Index(lines[idx+1], ">>") > -1 {
ret = append(ret, cpArr)
cpArr = make([]string, 0)
}
}
}
return
}
func ReadLogArr(content string) (isSkip bool, ret [][]string) { func ReadLogArr(content string) (isSkip bool, ret [][]string) {
lines := strings.Split(content, "\n") lines := strings.Split(content, "\n")
...@@ -983,8 +639,6 @@ func ReadLogArr(content string) (isSkip bool, ret [][]string) { ...@@ -983,8 +639,6 @@ func ReadLogArr(content string) (isSkip bool, ret [][]string) {
idx = idx + 1 idx = idx + 1
model = "" model = ""
} }
} else if line == ">>" {
continue
} else { } else {
model = "single" model = "single"
...@@ -1013,14 +667,10 @@ func CheckFileContentIsScript(content string) bool { ...@@ -1013,14 +667,10 @@ func CheckFileContentIsScript(content string) bool {
return pass return pass
} }
func ReadCaseInfo(content, lang string, isOldFormat bool) (info, checkpoints string) { func ReadCaseInfo(content, lang string) (info, checkpoints string) {
regStr := "" regStr := fmt.Sprintf(`(?smU)%s((?U:.*pid.*))\n(.*)%s`,
if isOldFormat { commConsts.LangCommentsRegxMap[lang][0], commConsts.LangCommentsRegxMap[lang][1])
regStr = `(?s)\[case\]((?U:.*pid.*))\n(.*)\[esac\]`
} else {
regStr = fmt.Sprintf(`(?smU)%s((?U:.*pid.*))\n(.*)%s`,
commConsts.LangCommentsRegxMap[lang][0], commConsts.LangCommentsRegxMap[lang][1])
}
myExp := regexp.MustCompile(regStr) myExp := regexp.MustCompile(regStr)
arr := myExp.FindStringSubmatch(content) arr := myExp.FindStringSubmatch(content)
......
...@@ -58,7 +58,7 @@ func PrepareBug(workspacePath, seq string, caseIdStr string, productId int) (bug ...@@ -58,7 +58,7 @@ func PrepareBug(workspacePath, seq string, caseIdStr string, productId int) (bug
} }
for _, cs := range report.FuncResult { for _, cs := range report.FuncResult {
if cs.Id != caseId { if cs.Id != caseId || cs.Status != commConsts.FAIL {
continue continue
} }
......
...@@ -22,8 +22,8 @@ import ( ...@@ -22,8 +22,8 @@ import (
"github.com/kataras/iris/v12" "github.com/kataras/iris/v12"
) )
func CommitCase(caseId int, title string, func CommitCase(caseId int, title string, steps []commDomain.ZentaoCaseStep, script serverDomain.TestScript,
steps []commDomain.ZentaoCaseStep, config commDomain.WorkspaceConf) (err error) { config commDomain.WorkspaceConf) (err error) {
err = Login(config) err = Login(config)
if err != nil { if err != nil {
...@@ -39,9 +39,11 @@ func CommitCase(caseId int, title string, ...@@ -39,9 +39,11 @@ func CommitCase(caseId int, title string,
url := GenApiUrl(uri, nil, config.Url) url := GenApiUrl(uri, nil, config.Url)
requestObj := map[string]interface{}{ requestObj := map[string]interface{}{
"type": "feature", "type": "feature",
"title": title, "title": title,
"steps": steps, "steps": steps,
"script": script.Code,
"lang": script.Lang,
} }
json, err := json.Marshal(requestObj) json, err := json.Marshal(requestObj)
......
...@@ -76,8 +76,9 @@ func SyncToZentao(cases []string, config commDomain.WorkspaceConf) (count int, e ...@@ -76,8 +76,9 @@ func SyncToZentao(cases []string, config commDomain.WorkspaceConf) (count int, e
continue continue
} }
steps, _ := scriptHelper.GetStepAndExpectMap(cs) steps := scriptHelper.GetStepAndExpectMap(cs)
err = CommitCase(id, title, steps, config) script, _ := scriptHelper.GetScriptContent(cs, -1)
err = CommitCase(id, title, steps, script, config)
if err == nil { if err == nil {
count++ count++
......
...@@ -15,6 +15,10 @@ import ( ...@@ -15,6 +15,10 @@ import (
"go.uber.org/zap/zapcore" "go.uber.org/zap/zapcore"
) )
const (
WinFileSchema = "winfile:///"
)
func InitLog() { func InitLog() {
CONFIG.Zap.Director = filepath.Join(commConsts.WorkDir, CONFIG.Zap.Director) CONFIG.Zap.Director = filepath.Join(commConsts.WorkDir, CONFIG.Zap.Director)
if !dir.IsExist(CONFIG.Zap.Director) { // 判断是否有Director文件夹 if !dir.IsExist(CONFIG.Zap.Director) { // 判断是否有Director文件夹
...@@ -50,7 +54,7 @@ func InitExecLog(workspacePath string) { ...@@ -50,7 +54,7 @@ func InitExecLog(workspacePath string) {
// print to test log file // print to test log file
logPath := filepath.Join(commConsts.ExecLogDir, commConsts.LogText) logPath := filepath.Join(commConsts.ExecLogDir, commConsts.LogText)
if commonUtils.IsWin() { if commonUtils.IsWin() {
logPath = filepath.Join("winfile:///", logPath) logPath = filepath.Join(WinFileSchema, logPath)
zap.RegisterSink("winfile", newWinFileSink) zap.RegisterSink("winfile", newWinFileSink)
} }
...@@ -69,7 +73,7 @@ func InitExecLog(workspacePath string) { ...@@ -69,7 +73,7 @@ func InitExecLog(workspacePath string) {
// print to test result file // print to test result file
logPathResult := filepath.Join(commConsts.ExecLogDir, commConsts.ResultText) logPathResult := filepath.Join(commConsts.ExecLogDir, commConsts.ResultText)
if commonUtils.IsWin() { if commonUtils.IsWin() {
logPathResult = filepath.Join("winfile:///", logPathResult) logPathResult = filepath.Join(WinFileSchema, logPathResult)
zap.RegisterSink("winfile", newWinFileSink) zap.RegisterSink("winfile", newWinFileSink)
} }
config.OutputPaths = []string{logPathResult} config.OutputPaths = []string{logPathResult}
...@@ -133,8 +137,8 @@ func getLogConfig() (config zap.Config) { ...@@ -133,8 +137,8 @@ func getLogConfig() (config zap.Config) {
logPathInfo := filepath.Join(CONFIG.Zap.Director, "info.log") logPathInfo := filepath.Join(CONFIG.Zap.Director, "info.log")
logPathErr := filepath.Join(CONFIG.Zap.Director, "err.log") logPathErr := filepath.Join(CONFIG.Zap.Director, "err.log")
if commonUtils.IsWin() { if commonUtils.IsWin() {
logPathInfo = filepath.Join("winfile:///", logPathInfo) logPathInfo = filepath.Join(WinFileSchema, logPathInfo)
logPathErr = filepath.Join("winfile:///", logPathErr) logPathErr = filepath.Join(WinFileSchema, logPathErr)
} }
config = zap.Config{ config = zap.Config{
......
...@@ -81,7 +81,6 @@ func Init(port int) *WebServer { ...@@ -81,7 +81,6 @@ func Init(port int) *WebServer {
close(idleConnClosed) close(idleConnClosed)
}) })
// init grpc
mvc.New(app) mvc.New(app)
// init websocket // init websocket
......
...@@ -7,7 +7,6 @@ import ( ...@@ -7,7 +7,6 @@ import (
"github.com/easysoft/zentaoatf/internal/server/modules/v1/model" "github.com/easysoft/zentaoatf/internal/server/modules/v1/model"
"github.com/fatih/color" "github.com/fatih/color"
"go.uber.org/zap"
"gorm.io/gorm" "gorm.io/gorm"
) )
...@@ -33,7 +32,7 @@ func (r *InterpreterRepo) Get(id uint) (po model.Interpreter, err error) { ...@@ -33,7 +32,7 @@ func (r *InterpreterRepo) Get(id uint) (po model.Interpreter, err error) {
Where("NOT deleted"). Where("NOT deleted").
First(&po).Error First(&po).Error
if err != nil { if err != nil {
logUtils.Errorf(color.RedString("find interpreter by id failed, error: %s.", err.Error())) logUtils.Info(color.RedString("find interpreter by id failed, %s.", err.Error()))
return return
} }
...@@ -48,7 +47,7 @@ func (r *InterpreterRepo) Create(interpreter model.Interpreter) (id uint, err er ...@@ -48,7 +47,7 @@ func (r *InterpreterRepo) Create(interpreter model.Interpreter) (id uint, err er
err = r.DB.Model(&model.Interpreter{}).Create(&interpreter).Error err = r.DB.Model(&model.Interpreter{}).Create(&interpreter).Error
if err != nil { if err != nil {
logUtils.Errorf(color.RedString("create interpreter failed, error: %s.", err.Error())) logUtils.Info(color.RedString("create interpreter failed, %s.", err.Error()))
return 0, err return 0, err
} }
...@@ -65,7 +64,7 @@ func (r *InterpreterRepo) Update(interpreter model.Interpreter) error { ...@@ -65,7 +64,7 @@ func (r *InterpreterRepo) Update(interpreter model.Interpreter) error {
err = r.DB.Model(&model.Interpreter{}).Where("id = ?", interpreter.ID).Updates(&interpreter).Error err = r.DB.Model(&model.Interpreter{}).Where("id = ?", interpreter.ID).Updates(&interpreter).Error
if err != nil { if err != nil {
logUtils.Errorf(color.RedString("update interpreter failed, error: %s.", err.Error())) logUtils.Info(color.RedString("update interpreter failed, %s.", err.Error()))
return err return err
} }
...@@ -76,7 +75,7 @@ func (r *InterpreterRepo) Delete(id uint) (err error) { ...@@ -76,7 +75,7 @@ func (r *InterpreterRepo) Delete(id uint) (err error) {
err = r.DB.Model(&model.Interpreter{}).Where("id = ?", id). err = r.DB.Model(&model.Interpreter{}).Where("id = ?", id).
Updates(map[string]interface{}{"deleted": true}).Error Updates(map[string]interface{}{"deleted": true}).Error
if err != nil { if err != nil {
logUtils.Errorf("delete interpreter by id error", zap.String("error:", err.Error())) logUtils.Info(color.RedString("delete interpreter by id error, %s.", err.Error()))
return return
} }
......
...@@ -36,7 +36,7 @@ func (r *SiteRepo) Paginate(req serverDomain.ReqPaginate) (data domain.PageData, ...@@ -36,7 +36,7 @@ func (r *SiteRepo) Paginate(req serverDomain.ReqPaginate) (data domain.PageData,
err = db.Count(&count).Error err = db.Count(&count).Error
if err != nil { if err != nil {
logUtils.Errorf("count site error", zap.String("error:", err.Error())) logUtils.Info(color.RedString("count site error %s.", err.Error()))
return return
} }
......
...@@ -11,7 +11,6 @@ import ( ...@@ -11,7 +11,6 @@ import (
serverDomain "github.com/easysoft/zentaoatf/internal/server/modules/v1/domain" serverDomain "github.com/easysoft/zentaoatf/internal/server/modules/v1/domain"
"github.com/easysoft/zentaoatf/internal/server/modules/v1/model" "github.com/easysoft/zentaoatf/internal/server/modules/v1/model"
"github.com/fatih/color" "github.com/fatih/color"
"go.uber.org/zap"
"gorm.io/gorm" "gorm.io/gorm"
) )
...@@ -40,7 +39,6 @@ func (r *WorkspaceRepo) Paginate(req serverDomain.WorkspaceReqPaginate) (data do ...@@ -40,7 +39,6 @@ func (r *WorkspaceRepo) Paginate(req serverDomain.WorkspaceReqPaginate) (data do
err = db.Count(&count).Error err = db.Count(&count).Error
if err != nil { if err != nil {
logUtils.Errorf("count site error", zap.String("error:", err.Error()))
return return
} }
...@@ -50,7 +48,7 @@ func (r *WorkspaceRepo) Paginate(req serverDomain.WorkspaceReqPaginate) (data do ...@@ -50,7 +48,7 @@ func (r *WorkspaceRepo) Paginate(req serverDomain.WorkspaceReqPaginate) (data do
Scopes(dao.PaginateScope(req.Page, req.PageSize, req.Order, req.Field)). Scopes(dao.PaginateScope(req.Page, req.PageSize, req.Order, req.Field)).
Find(&pos).Error Find(&pos).Error
if err != nil { if err != nil {
logUtils.Errorf("query site error", zap.String("error:", err.Error())) logUtils.Info(color.RedString("query site error, %s.", err.Error()))
return return
} }
...@@ -65,7 +63,7 @@ func (r *WorkspaceRepo) Get(id uint) (po model.Workspace, err error) { ...@@ -65,7 +63,7 @@ func (r *WorkspaceRepo) Get(id uint) (po model.Workspace, err error) {
Where("NOT deleted"). Where("NOT deleted").
First(&po).Error First(&po).Error
if err != nil { if err != nil {
logUtils.Errorf(color.RedString("find workspace by id failed, error: %s.", err.Error())) logUtils.Info(color.RedString("find workspace by id failed, %s.", err.Error()))
return return
} }
...@@ -80,7 +78,7 @@ func (r *WorkspaceRepo) Create(workspace model.Workspace) (id uint, err error) { ...@@ -80,7 +78,7 @@ func (r *WorkspaceRepo) Create(workspace model.Workspace) (id uint, err error) {
err = r.DB.Model(&model.Workspace{}).Create(&workspace).Error err = r.DB.Model(&model.Workspace{}).Create(&workspace).Error
if err != nil { if err != nil {
logUtils.Errorf(color.RedString("create site failed, error: %s.", err.Error())) logUtils.Info(color.RedString("create site failed, %s.", err.Error()))
return 0, err return 0, err
} }
...@@ -132,7 +130,7 @@ func (r *WorkspaceRepo) DeleteByPath(path string, productId uint) (err error) { ...@@ -132,7 +130,7 @@ func (r *WorkspaceRepo) DeleteByPath(path string, productId uint) (err error) {
Error Error
if err != nil { if err != nil {
logUtils.Errorf(color.RedString("by path, delete workspace failed, error: %s.", err.Error())) logUtils.Info(color.RedString("by path, delete workspace failed, %s.", err.Error()))
return return
} }
...@@ -156,7 +154,7 @@ func (r *WorkspaceRepo) FindByPath(workspacePath string) (po model.Workspace, er ...@@ -156,7 +154,7 @@ func (r *WorkspaceRepo) FindByPath(workspacePath string) (po model.Workspace, er
err = db.First(&po).Error err = db.First(&po).Error
if err != nil { if err != nil {
logUtils.Errorf("find workspace by path error", err.Error()) logUtils.Info(color.RedString("find workspace by path error, %s.", err.Error()))
return return
} }
......
...@@ -18,6 +18,10 @@ import ( ...@@ -18,6 +18,10 @@ import (
"github.com/snowlyg/helper/str" "github.com/snowlyg/helper/str"
) )
const (
UploadFail = "file upload failed, %s."
)
var ( var (
ErrEmpty = errors.New("请上传正确的文件") ErrEmpty = errors.New("请上传正确的文件")
) )
...@@ -39,12 +43,12 @@ func (s *FileService) UploadFile(ctx iris.Context, fh *multipart.FileHeader) (ir ...@@ -39,12 +43,12 @@ func (s *FileService) UploadFile(ctx iris.Context, fh *multipart.FileHeader) (ir
path := filepath.Join(dir.GetCurrentAbPath(), "static", "upload", "images") path := filepath.Join(dir.GetCurrentAbPath(), "static", "upload", "images")
err = dir.InsureDir(path) err = dir.InsureDir(path)
if err != nil { if err != nil {
logUtils.Infof(color.RedString("file upload failed, error: %s.", err.Error())) logUtils.Infof(color.RedString(UploadFail, err.Error()))
return nil, err return nil, err
} }
_, err = ctx.SaveFormFile(fh, filepath.Join(path, filename)) _, err = ctx.SaveFormFile(fh, filepath.Join(path, filename))
if err != nil { if err != nil {
logUtils.Infof(color.RedString("file upload failed, error: %s.", err.Error())) logUtils.Infof(color.RedString(UploadFail, err.Error()))
return nil, err return nil, err
} }
...@@ -104,13 +108,13 @@ func (s *FileService) addDir(pth string, parent *serverDomain.TestAsset) (dirNod ...@@ -104,13 +108,13 @@ func (s *FileService) addDir(pth string, parent *serverDomain.TestAsset) (dirNod
func GetFileName(name string) (string, error) { func GetFileName(name string) (string, error) {
fns := strings.Split(strings.TrimLeft(name, "./"), ".") fns := strings.Split(strings.TrimLeft(name, "./"), ".")
if len(fns) != 2 { if len(fns) != 2 {
logUtils.Infof(color.RedString("file upload failed, error: wrong file name %s.", name)) logUtils.Infof(color.RedString(UploadFail, "wrong file name "+name))
return "", ErrEmpty return "", ErrEmpty
} }
ext := fns[1] ext := fns[1]
md5, err := dir.MD5(name) md5, err := dir.MD5(name)
if err != nil { if err != nil {
logUtils.Errorf(color.RedString("file upload failed, error: %s.", name)) logUtils.Errorf(color.RedString(UploadFail, name))
return "", err return "", err
} }
return str.Join(md5, ".", ext), nil return str.Join(md5, ".", ext), nil
......
...@@ -6,6 +6,10 @@ import ( ...@@ -6,6 +6,10 @@ import (
"time" "time"
) )
const (
BrokerClosed = "broker closed"
)
type Broker interface { type Broker interface {
publish(topic string, msg interface{}) error publish(topic string, msg interface{}) error
subscribe(topic string) (<-chan interface{}, error) subscribe(topic string) (<-chan interface{}, error)
...@@ -50,7 +54,7 @@ func (b *BrokerImpl) close() { ...@@ -50,7 +54,7 @@ func (b *BrokerImpl) close() {
func (b *BrokerImpl) publish(topic string, pub interface{}) error { func (b *BrokerImpl) publish(topic string, pub interface{}) error {
select { select {
case <-b.exit: case <-b.exit:
return errors.New("broker closed") return errors.New(BrokerClosed)
default: default:
} }
...@@ -107,7 +111,7 @@ func (b *BrokerImpl) broadcast(msg interface{}, subscribers []chan interface{}) ...@@ -107,7 +111,7 @@ func (b *BrokerImpl) broadcast(msg interface{}, subscribers []chan interface{})
func (b *BrokerImpl) subscribe(topic string) (<-chan interface{}, error) { func (b *BrokerImpl) subscribe(topic string) (<-chan interface{}, error) {
select { select {
case <-b.exit: case <-b.exit:
return nil, errors.New("broker closed") return nil, errors.New(BrokerClosed)
default: default:
} }
...@@ -121,7 +125,7 @@ func (b *BrokerImpl) subscribe(topic string) (<-chan interface{}, error) { ...@@ -121,7 +125,7 @@ func (b *BrokerImpl) subscribe(topic string) (<-chan interface{}, error) {
func (b *BrokerImpl) unsubscribe(topic string, sub <-chan interface{}) error { func (b *BrokerImpl) unsubscribe(topic string, sub <-chan interface{}) error {
select { select {
case <-b.exit: case <-b.exit:
return errors.New("broker closed") return errors.New(BrokerClosed)
default: default:
} }
......
...@@ -52,14 +52,6 @@ func IsMac() bool { ...@@ -52,14 +52,6 @@ func IsMac() bool {
return GetOs() == "mac" return GetOs() == "mac"
} }
func UpdateUrl(url string) string {
if strings.LastIndex(url, "/") < len(url)-1 {
url += "/"
}
return url
}
func IntToStrArr(intArr []int) (strArr []string) { func IntToStrArr(intArr []int) (strArr []string) {
for _, i := range intArr { for _, i := range intArr {
strArr = append(strArr, strconv.Itoa(i)) strArr = append(strArr, strconv.Itoa(i))
......
...@@ -4,16 +4,13 @@ import ( ...@@ -4,16 +4,13 @@ import (
"bufio" "bufio"
"bytes" "bytes"
"fmt" "fmt"
commonUtils "github.com/easysoft/zentaoatf/pkg/lib/common" commonUtils "github.com/easysoft/zentaoatf/pkg/lib/common"
i118Utils "github.com/easysoft/zentaoatf/pkg/lib/i118" i118Utils "github.com/easysoft/zentaoatf/pkg/lib/i118"
logUtils "github.com/easysoft/zentaoatf/pkg/lib/log" logUtils "github.com/easysoft/zentaoatf/pkg/lib/log"
stringUtils "github.com/easysoft/zentaoatf/pkg/lib/string" stringUtils "github.com/easysoft/zentaoatf/pkg/lib/string"
"github.com/kataras/iris/v12/websocket"
"io" "io"
"os" "os"
"os/exec" "os/exec"
"regexp"
"strings" "strings"
) )
...@@ -31,12 +28,7 @@ func ExecWinCmd(cmdStr string) (string, error) { ...@@ -31,12 +28,7 @@ func ExecWinCmd(cmdStr string) (string, error) {
} }
func ExeSysCmd(cmdStr string) (string, error) { func ExeSysCmd(cmdStr string) (string, error) {
var cmd *exec.Cmd cmd := getCmd(cmdStr)
if commonUtils.IsWin() {
cmd = exec.Command("cmd", "/C", cmdStr)
} else {
cmd = exec.Command("/bin/bash", "-c", cmdStr)
}
var out bytes.Buffer var out bytes.Buffer
cmd.Stdout = &out cmd.Stdout = &out
...@@ -62,12 +54,7 @@ func ExeShellWithPid(cmdStr string) (string, error, int) { ...@@ -62,12 +54,7 @@ func ExeShellWithPid(cmdStr string) (string, error, int) {
} }
func ExeShellInDirWithPid(cmdStr string, dir string) (ret string, err error, pid int) { func ExeShellInDirWithPid(cmdStr string, dir string) (ret string, err error, pid int) {
var cmd *exec.Cmd cmd := getCmd(cmdStr)
if commonUtils.IsWin() {
cmd = exec.Command("cmd", "/C", cmdStr)
} else {
cmd = exec.Command("/bin/bash", "-c", cmdStr)
}
if dir != "" { if dir != "" {
cmd.Dir = dir cmd.Dir = dir
} }
...@@ -94,12 +81,7 @@ func ExeShellWithOutputInDir(cmdStr string, dir string) ([]string, error) { ...@@ -94,12 +81,7 @@ func ExeShellWithOutputInDir(cmdStr string, dir string) ([]string, error) {
} }
func ExeShellWithEnvVarsAndOutputInDir(cmdStr, dir string, envVars []string) ([]string, error) { func ExeShellWithEnvVarsAndOutputInDir(cmdStr, dir string, envVars []string) ([]string, error) {
var cmd *exec.Cmd cmd := getCmd(cmdStr)
if commonUtils.IsWin() {
cmd = exec.Command("cmd", "/C", cmdStr)
} else {
cmd = exec.Command("/bin/bash", "-c", cmdStr)
}
if dir != "" { if dir != "" {
cmd.Dir = dir cmd.Dir = dir
...@@ -139,123 +121,18 @@ func ExeShellWithEnvVarsAndOutputInDir(cmdStr, dir string, envVars []string) ([] ...@@ -139,123 +121,18 @@ func ExeShellWithEnvVarsAndOutputInDir(cmdStr, dir string, envVars []string) ([]
return output, nil return output, nil
} }
func ExeShellCallback(ch chan int, cmdStr, dir string, func getCmd(cmdStr string) (cmd *exec.Cmd) {
fun func(info string, msg websocket.Message), msg websocket.Message) (err error) {
var cmd *exec.Cmd
if commonUtils.IsWin() { if commonUtils.IsWin() {
cmd = exec.Command("cmd", "/C", cmdStr) cmd = getWinCmd(cmdStr)
} else { } else {
cmd = exec.Command("/bin/bash", "-c", cmdStr) cmd = getLinuxCmd(cmdStr)
}
if dir != "" {
cmd.Dir = dir
}
stdout, err := cmd.StdoutPipe()
if err != nil {
fmt.Println(err)
return
}
cmd.Start()
if err != nil {
return
}
reader := bufio.NewReader(stdout)
for {
line, err2 := reader.ReadString('\n')
if err2 != nil || io.EOF == err2 {
break
}
line = strings.Trim(line, "\n")
fun(line, msg)
select {
case <-ch:
fmt.Println("exiting...")
ch <- 1
return
default:
fmt.Println("continue...")
}
} }
cmd.Wait()
return return
} }
func getWinCmd(cmdStr string) (cmd *exec.Cmd) {
func GetProcess(app string) (string, error) { return exec.Command("cmd", "/C", cmdStr)
var cmd *exec.Cmd
tmpl := ""
cmdStr := ""
if commonUtils.IsWin() {
tmpl = `tasklist`
cmdStr = fmt.Sprintf(tmpl)
cmd = exec.Command("cmd", "/C", cmdStr)
} else {
tmpl = `ps -ef | grep "%s" | grep -v "grep" | awk '{print $2}'`
cmdStr = fmt.Sprintf(tmpl, app)
cmd = exec.Command("/bin/bash", "-c", cmdStr)
}
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
output := ""
if commonUtils.IsWin() {
arr := strings.Split(out.String(), "\n")
for _, line := range arr {
if strings.Index(line, app+".exe") > -1 {
arr2 := regexp.MustCompile(`\s+`).Split(line, -1)
output = arr2[1]
break
}
}
} else {
output = out.String()
}
return output, err
}
func KillProcess(app string) (string, error) {
var cmd *exec.Cmd
tmpl := ""
cmdStr := ""
if commonUtils.IsWin() {
// tasklist | findstr ztf.exe
tmpl = `taskkill.exe /f /im %s.exe`
cmdStr = fmt.Sprintf(tmpl, app)
cmd = exec.Command("cmd", "/C", cmdStr)
} else {
tmpl = `ps -ef | grep '%s' | grep -v "grep" | awk '{print $2}' | xargs kill -9`
cmdStr = fmt.Sprintf(tmpl, app)
cmd = exec.Command("/bin/bash", "-c", cmdStr)
}
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
output := out.String()
return output, err
} }
func getLinuxCmd(cmdStr string) (cmd *exec.Cmd) {
func KillProcessById(pid int) { return exec.Command("/bin/bash", "-c", cmdStr)
cmdStr := fmt.Sprintf("kill -9 %d", pid)
ExeShell(cmdStr)
} }
<template>
<Toolbar>
<Button class="rounded pure" icon="panel-left" :hint="t('switch_display_left_side')" />
<Button class="rounded pure" icon="panel-bottom" :hint="t('switch_display_bottom_side')" />
<Button class="rounded pure" icon="panel-right" :hint="t('switch_display_right_side')" />
</Toolbar>
</template>
<script setup lang="ts">
import Button from './Button.vue';
import Toolbar from './Toolbar.vue';
import {useI18n} from "vue-i18n";
const { t } = useI18n();
</script>
...@@ -219,12 +219,12 @@ ...@@ -219,12 +219,12 @@
import {computed, defineComponent, nextTick, onBeforeUpdate, onMounted, reactive, ref, watch,} from "vue"; import {computed, defineComponent, nextTick, onBeforeUpdate, onMounted, reactive, ref, watch,} from "vue";
import {useI18n} from "vue-i18n"; import {useI18n} from "vue-i18n";
interface pageOption { interface PageOption {
value: number; value: number;
text: number | string; text: number | string;
} }
interface tableSetting { interface TableSetting {
isSlotMode: boolean; isSlotMode: boolean;
isCheckAll: boolean; isCheckAll: boolean;
isHidePaging: boolean; isHidePaging: boolean;
...@@ -237,15 +237,15 @@ interface tableSetting { ...@@ -237,15 +237,15 @@ interface tableSetting {
paging: Array<number>; paging: Array<number>;
order: string; order: string;
sort: string; sort: string;
pageOptions: Array<pageOption>; pageOptions: Array<PageOption>;
} }
interface column { interface Column {
isKey: string; isKey: string;
field: string; field: string;
} }
interface pageMessage { interface PageMessage {
pagingInfo: string pagingInfo: string
pageSizeChangeLabel: string pageSizeChangeLabel: string
gotoPageLabel: string gotoPageLabel: string
...@@ -334,7 +334,7 @@ export default defineComponent({ ...@@ -334,7 +334,7 @@ export default defineComponent({
// Display text // Display text
messages: { messages: {
type: Object, type: Object,
default: {} as pageMessage, default: {} as PageMessage,
}, },
// Static mode(no refresh server data) // Static mode(no refresh server data)
isStaticMode: { isStaticMode: {
...@@ -389,11 +389,11 @@ export default defineComponent({ ...@@ -389,11 +389,11 @@ export default defineComponent({
let localTable = ref<HTMLElement | null>(null); let localTable = ref<HTMLElement | null>(null);
// Validate dropdown values have page-size value or not // Validate dropdown values have page-size value or not
let tmpPageOptions = props.pageOptions as Array<pageOption>; let tmpPageOptions = props.pageOptions as Array<PageOption>;
let defaultPageSize = let defaultPageSize =
props.pageOptions.length > 0 ? ref(tmpPageOptions[0].value) : ref(props.pageSize); props.pageOptions.length > 0 ? ref(tmpPageOptions[0].value) : ref(props.pageSize);
if (tmpPageOptions.length > 0) { if (tmpPageOptions.length > 0) {
tmpPageOptions.forEach((v: pageOption) => { tmpPageOptions.forEach((v: PageOption) => {
if ( if (
Object.prototype.hasOwnProperty.call(v, "value") && Object.prototype.hasOwnProperty.call(v, "value") &&
Object.prototype.hasOwnProperty.call(v, "text") && Object.prototype.hasOwnProperty.call(v, "text") &&
...@@ -405,7 +405,7 @@ export default defineComponent({ ...@@ -405,7 +405,7 @@ export default defineComponent({
} }
// Internal set value for components // Internal set value for components
const setting: tableSetting = reactive({ const setting: TableSetting = reactive({
// Enable slot mode // Enable slot mode
isSlotMode: props.isSlotMode, isSlotMode: props.isSlotMode,
// Whether to select all // Whether to select all
...@@ -415,7 +415,7 @@ export default defineComponent({ ...@@ -415,7 +415,7 @@ export default defineComponent({
// KEY field name // KEY field name
keyColumn: computed(() => { keyColumn: computed(() => {
let key = ""; let key = "";
Object.assign(props.columns).forEach((col: column) => { Object.assign(props.columns).forEach((col: Column) => {
if (col.isKey) { if (col.isKey) {
key = col.field; key = col.field;
} }
...@@ -466,11 +466,11 @@ export default defineComponent({ ...@@ -466,11 +466,11 @@ export default defineComponent({
order: props.sortable.order, order: props.sortable.order,
sort: props.sortable.sort, sort: props.sortable.sort,
pageOptions: computed(() => { pageOptions: computed(() => {
const ops: pageOption[] = []; const ops: PageOption[] = [];
props.pageOptions?.forEach((o) => { props.pageOptions?.forEach((o) => {
ops.push({ ops.push({
value: (o as pageOption).value, value: (o as PageOption).value,
text: (o as pageOption).text, text: (o as PageOption).text,
}); });
}); });
return ops; return ops;
...@@ -485,7 +485,7 @@ export default defineComponent({ ...@@ -485,7 +485,7 @@ export default defineComponent({
if (setting.sort === "desc") { if (setting.sort === "desc") {
sort_order = -1; sort_order = -1;
} }
let rows = props.rows as Array<unknown>; let rows = props.rows
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
rows.sort((a: any, b: any): number => { rows.sort((a: any, b: any): number => {
if (a[property] < b[property]) { if (a[property] < b[property]) {
...@@ -642,16 +642,16 @@ export default defineComponent({ ...@@ -642,16 +642,16 @@ export default defineComponent({
/** /**
* Switch page number * Switch page number
* *
* @param page number New page number * @param pageNum number New page number
* @param prevPage number Current page number * @param prevPageNum number Current page number
*/ */
const changePage = (page: number, prevPage: number) => { const changePage = (pageNum: number, prevPageNum: number) => {
setting.isCheckAll = false; setting.isCheckAll = false;
let order = setting.order; let order = setting.order;
let sort = setting.sort; let sort = setting.sort;
let offset = (page - 1) * setting.pageSize; let offset = (pageNum - 1) * setting.pageSize;
let limit = setting.pageSize; let limit = setting.pageSize;
if (!props.isReSearch || page > 1 || page == prevPage) { if (!props.isReSearch || pageNum > 1 || pageNum == prevPageNum) {
// Call query will only be executed if the page number is changed without re-query // Call query will only be executed if the page number is changed without re-query
console.log("do-search", offset, limit) console.log("do-search", offset, limit)
......
...@@ -50,13 +50,6 @@ ...@@ -50,13 +50,6 @@
</div> </div>
</template> </template>
<script lang="ts">
export default {
name: 'TreeNode',
inheritAttrs: false
}
</script>
<script setup lang="ts"> <script setup lang="ts">
import { defineProps, defineEmits, withDefaults, computed, ref } from 'vue'; import { defineProps, defineEmits, withDefaults, computed, ref } from 'vue';
import Toolbar, { ToolbarItemProps } from './Toolbar.vue'; import Toolbar, { ToolbarItemProps } from './Toolbar.vue';
...@@ -65,6 +58,7 @@ import Button from './Button.vue'; ...@@ -65,6 +58,7 @@ import Button from './Button.vue';
export interface TreeNodeData { export interface TreeNodeData {
id: string, id: string,
type: string,
title: string, title: string,
level?: number, level?: number,
indent?: number, indent?: number,
......
...@@ -22,10 +22,10 @@ const i18n = createI18n({ ...@@ -22,10 +22,10 @@ const i18n = createI18n({
* @param locale * @param locale
*/ */
export function setI18nLanguage(locale: string, realReload = false): void { export function setI18nLanguage(locale: string, realReload = false): void {
setLocale(locale,realReload, function() { setLocale(locale, function() {
// i18n.global.locale = locale // legacy: true // i18n.global.locale = locale // legacy: true
i18n.global.locale.value = locale; i18n.global.locale.value = locale;
}) }, realReload)
} }
export default i18n; export default i18n;
import {getCmdHistories, getInitStatus, getOpenedScripts} from "@/utils/cache";
/** /**
* 站点配置 * 站点配置
*/ */
...@@ -102,4 +100,4 @@ const settings: SettingsType = { ...@@ -102,4 +100,4 @@ const settings: SettingsType = {
}; };
export default settings; export default settings;
...@@ -11,7 +11,6 @@ export type WsEvent = { ...@@ -11,7 +11,6 @@ export type WsEvent = {
}; };
export const WsDefaultNameSpace = 'default' export const WsDefaultNameSpace = 'default'
// export const WsDefaultRoom = 'default'
export class WebSocket { export class WebSocket {
static conn: NSConn static conn: NSConn
...@@ -62,10 +61,10 @@ export class WebSocket { ...@@ -62,10 +61,10 @@ export class WebSocket {
static joinRoomAndSend(roomName: string, msg: string): void { static joinRoomAndSend(roomName: string, msg: string): void {
if (WebSocket.conn && WebSocket.conn.room(roomName)) { if (WebSocket.conn && WebSocket.conn.room(roomName)) {
WebSocket.conn.room(roomName).emit('OnChat', msg) WebSocket.conn.room(roomName).emit('OnChat', msg)
return
} else { } else {
WebSocket.init(true).then(() => { WebSocket.init(true).then(() => {
WebSocket.conn.joinRoom(roomName).then((room) => { WebSocket.conn.joinRoom(roomName).then((_room) => {
console.log(`success to join room "${roomName}"`) console.log(`success to join room "${roomName}"`)
WebSocket.conn.room(roomName).emit('OnChat', msg) WebSocket.conn.room(roomName).emit('OnChat', msg)
......
import { Mutation/* , Action */ , Getter} from 'vuex'; import { Mutation/* , Action */ , Getter} from 'vuex';
import { StoreModuleType } from "@/utils/store"; import { StoreModuleType } from "@/utils/store";
import { TabNavItem } from '@/utils/routes';
import settings from '@/config/settings'; import settings from '@/config/settings';
import router from '@/config/routes';
export interface StateType { export interface StateType {
// 左侧展开收起 // 左侧展开收起
...@@ -87,9 +85,9 @@ const StoreModel: ModuleType = { ...@@ -87,9 +85,9 @@ const StoreModel: ModuleType = {
setLogPaneSize(state, payload) { setLogPaneSize(state, payload) {
if (100 == payload) { if (100 == payload) {
state.logPaneMaximized = true; state.logPaneMaximized = true;
return; return;
} }
state.logPaneOriginSize = payload; state.logPaneOriginSize = payload;
state.logPaneMaximized = false; state.logPaneMaximized = false;
}, },
......
...@@ -206,7 +206,6 @@ const TabsModel: TabsModuleType = { ...@@ -206,7 +206,6 @@ const TabsModel: TabsModuleType = {
} }
}, },
close(context, payload: {id: string}) { close(context, payload: {id: string}) {
const {id} = payload;
context.commit('removeTab', payload); context.commit('removeTab', payload);
context.commit('activateLast'); context.commit('activateLast');
}, },
...@@ -214,10 +213,8 @@ const TabsModel: TabsModuleType = { ...@@ -214,10 +213,8 @@ const TabsModel: TabsModuleType = {
context.commit('activateLast', {exceptID: payload.id}); context.commit('activateLast', {exceptID: payload.id});
}, },
update(context, payload: PageTab) { update(context, payload: PageTab) {
const {state} = context;
const {id} = payload;
context.commit('updateTab', payload); context.commit('updateTab', payload);
} }
} }
}; };
......
import { Mutation, Action } from 'vuex'; import {Mutation, Action} from 'vuex';
import { StoreModuleType } from "@/utils/store"; import { StoreModuleType } from "@/utils/store";
import {WebSocket} from "@/services/websocket"; import {WebSocket} from "@/services/websocket";
...@@ -41,9 +41,8 @@ const StoreModel: ModuleType = { ...@@ -41,9 +41,8 @@ const StoreModel: ModuleType = {
} }
}, },
actions: { actions: {
async connect({ commit }, room) { async connect(_ctx, room) {
console.log("connect to websocket") console.log("connect to websocket")
await WebSocket.init(false) await WebSocket.init(false)
const msg = {act: 'init'} const msg = {act: 'init'}
...@@ -53,7 +52,6 @@ const StoreModel: ModuleType = { ...@@ -53,7 +52,6 @@ const StoreModel: ModuleType = {
}, },
async changeStatus({ commit }, status) { async changeStatus({ commit }, status) {
console.log("changeStatus") console.log("changeStatus")
commit('saveConnStatus', status) commit('saveConnStatus', status)
return true; return true;
...@@ -62,4 +60,3 @@ const StoreModel: ModuleType = { ...@@ -62,4 +60,3 @@ const StoreModel: ModuleType = {
} }
export default StoreModel; export default StoreModel;
\ No newline at end of file
...@@ -62,20 +62,16 @@ const StoreModel: ModuleType = { ...@@ -62,20 +62,16 @@ const StoreModel: ModuleType = {
return false; return false;
} }
}, },
async removeWorkspace({ commit }, selectedWorkspacePath) { async removeWorkspace(_ctx, selectedWorkspacePath) {
try { try {
await deleteWorkspace(selectedWorkspacePath); await deleteWorkspace(selectedWorkspacePath);
// const response: ResponseData = await getWorkspace('');
// const { data } = response;
// commit('saveWorkspaces', data || {});
return true; return true;
} catch (error) { } catch (error) {
return false; return false;
} }
}, },
async save({ commit }, payload) { async save(_ctx, payload) {
try { try {
await save(payload); await save(payload);
return true; return true;
...@@ -87,4 +83,4 @@ const StoreModel: ModuleType = { ...@@ -87,4 +83,4 @@ const StoreModel: ModuleType = {
} }
export default StoreModel; export default StoreModel;
export function isInArray(item, arr) { export function isInArray(item, arr) {
for(let i = 0; i < arr.length; i++){ for(const val of arr){
if(item === arr[i]){ if(item === val){
return true; return true;
} }
} }
......
...@@ -12,16 +12,14 @@ export const setExecBy = async (execBy) => { ...@@ -12,16 +12,14 @@ export const setExecBy = async (execBy) => {
} }
export const getInitStatus = async () => { export const getInitStatus = async () => {
const initStatus = await getCache(settings.initStatus); return getCache(settings.initStatus);
return initStatus
} }
export const setInitStatus = async () => { export const setInitStatus = async () => {
await setCache(settings.initStatus, true); await setCache(settings.initStatus, true);
} }
export const getCurrSiteId = async () => { export const getCurrSiteId = async () => {
const currSiteId = await getCache(settings.currSiteId); return getCache(settings.currSiteId);
return currSiteId
} }
export const setCurrSiteId = async (val) => { export const setCurrSiteId = async (val) => {
await setCache(settings.currSiteId, val); await setCache(settings.currSiteId, val);
...@@ -29,8 +27,7 @@ export const setCurrSiteId = async (val) => { ...@@ -29,8 +27,7 @@ export const setCurrSiteId = async (val) => {
export const getCurrProductIdBySite = async (currSiteId) => { export const getCurrProductIdBySite = async (currSiteId) => {
const mp = await getCache(settings.currProductIdBySite); const mp = await getCache(settings.currProductIdBySite);
const currProductId = mp ? mp[currSiteId] : 0 return mp ? mp[currSiteId] : 0
return currProductId
} }
export const setCurrProductIdBySite = async (currSiteId, currProductId) => { export const setCurrProductIdBySite = async (currSiteId, currProductId) => {
if (!currSiteId) return if (!currSiteId) return
...@@ -129,8 +126,7 @@ export const setExpandedKeys = async (siteId, productId, keys) => { ...@@ -129,8 +126,7 @@ export const setExpandedKeys = async (siteId, productId, keys) => {
export const getCmdHistories = async (workspaceId) => { export const getCmdHistories = async (workspaceId) => {
const mp = await getCache(settings.cmdHistories); const mp = await getCache(settings.cmdHistories);
const items = mp && mp[workspaceId] ? mp[workspaceId] : [] return mp && mp[workspaceId] ? mp[workspaceId] : []
return items
} }
export const setCmdHistories = async (workspaceId, items) => { export const setCmdHistories = async (workspaceId, items) => {
console.log('setCmdHistories', workspaceId) console.log('setCmdHistories', workspaceId)
......
import moment, {utc} from "moment"; import moment from "moment";
export function momentUtcDef(dt) { export function momentUtcDef(dt) {
return moment.parseZone(dt).format("YYYY-MM-DD HH:mm:ss") return moment.parseZone(dt).format("YYYY-MM-DD HH:mm:ss")
......
...@@ -9,10 +9,10 @@ export function resizeWidth(mainId: string, leftId: string, resizeId: string, co ...@@ -9,10 +9,10 @@ export function resizeWidth(mainId: string, leftId: string, resizeId: string, co
if (!resize) return false if (!resize) return false
// 鼠标按下事件 // 鼠标按下事件
resize.onmousedown = function (e) { resize.onmousedown = function (event) {
//色彩高亮 //色彩高亮
resize.classList.add('active'); resize.classList.add('active');
const startX = e.clientX; const startX = event.clientX;
// 鼠标拖动事件 // 鼠标拖动事件
document.onmousemove = function (e) { document.onmousemove = function (e) {
...@@ -29,7 +29,7 @@ export function resizeWidth(mainId: string, leftId: string, resizeId: string, co ...@@ -29,7 +29,7 @@ export function resizeWidth(mainId: string, leftId: string, resizeId: string, co
}; };
// 鼠标松开事件 // 鼠标松开事件
document.onmouseup = function (evt) { document.onmouseup = function (_e) {
resize.classList.remove('active'); //色彩复原 resize.classList.remove('active'); //色彩复原
document.onmousemove = null; document.onmousemove = null;
...@@ -56,10 +56,10 @@ export function resizeHeight(contentId: string, topId: string, splitterId: strin ...@@ -56,10 +56,10 @@ export function resizeHeight(contentId: string, topId: string, splitterId: strin
} }
// 鼠标按下事件 // 鼠标按下事件
splitter.onmousedown = function (e) { splitter.onmousedown = function (event) {
//色彩高亮 //色彩高亮
splitter.classList.add('active'); splitter.classList.add('active');
const startY = e.clientY - gap; const startY = event.clientY - gap;
// 鼠标拖动事件 // 鼠标拖动事件
document.onmousemove = function (e) { document.onmousemove = function (e) {
...@@ -76,7 +76,7 @@ export function resizeHeight(contentId: string, topId: string, splitterId: strin ...@@ -76,7 +76,7 @@ export function resizeHeight(contentId: string, topId: string, splitterId: strin
}; };
// 鼠标松开事件 // 鼠标松开事件
document.onmouseup = function (evt) { document.onmouseup = function (_e) {
splitter.classList.remove('active'); //色彩复原 splitter.classList.remove('active'); //色彩复原
document.onmousemove = null; document.onmousemove = null;
...@@ -125,20 +125,19 @@ export function removeClass( elements, cName ){ ...@@ -125,20 +125,19 @@ export function removeClass( elements, cName ){
} }
export function jsonStrDef(obj) { export function jsonStrDef(obj) {
const msg = JSON.stringify(obj) return JSON.stringify(obj)
return msg
} }
export function getContextMenuStyle(x, y, height) { export function getContextMenuStyle(x, y, height) {
let top = y let top = y
if (y + height > document.body.clientHeight) if (y + height > document.body.clientHeight)
top = document.body.clientHeight - height top = document.body.clientHeight - height
const menuStyle = {
return {
zIndex: 9, zIndex: 9,
position: 'fixed', position: 'fixed',
left: `${x + 10}px`, left: `${x + 10}px`,
top: `${top}px`, top: `${top}px`,
} }
return menuStyle
} }
...@@ -9,8 +9,8 @@ export function useForm(modelRef, rulesRef) { ...@@ -9,8 +9,8 @@ export function useForm(modelRef, rulesRef) {
const rules = unref(rulesRef) const rules = unref(rulesRef)
const ruleKeys = unref(Object.keys(rules)) const ruleKeys = unref(Object.keys(rules))
ruleKeys.forEach((key, index) => { ruleKeys.forEach((key) => {
rules[key].forEach((item, index) => { rules[key].forEach((item) => {
if (item.required) validateInfos.value[key] = {required: []} if (item.required) validateInfos.value[key] = {required: []}
}) })
}) })
...@@ -20,11 +20,11 @@ export function useForm(modelRef, rulesRef) { ...@@ -20,11 +20,11 @@ export function useForm(modelRef, rulesRef) {
const model = unref(modelRef) const model = unref(modelRef)
ruleKeys.forEach((key, index) => { ruleKeys.forEach((key) => {
const errorMap = {} const errorMap = {}
let pass = true let pass = true
rules[key].forEach((item, index) => { rules[key].forEach((item) => {
if (item.required) pass &&= checkRequired(key, item, model, errorMap) if (item.required) pass &&= checkRequired(key, item, model, errorMap)
if (pass && item.email) pass &&= checkEmail(key, item, model, errorMap) if (pass && item.email) pass &&= checkEmail(key, item, model, errorMap)
if (pass && item.regex) pass &&= checkRegex(key, item, model, errorMap) if (pass && item.regex) pass &&= checkRegex(key, item, model, errorMap)
......
...@@ -17,7 +17,7 @@ export const defaultLang = 'zh-CN'; ...@@ -17,7 +17,7 @@ export const defaultLang = 'zh-CN';
* @author LiQingSong * @author LiQingSong
*/ */
export const localeNameExp = (lang: string): boolean => { export const localeNameExp = (lang: string): boolean => {
const localeExp = new RegExp(`^([a-z]{2})-?([A-Z]{2})?$`); const localeExp = /^([a-z]{2})-?([A-Z]{2})?$/
return localeExp.test(lang); return localeExp.test(lang);
} }
...@@ -39,8 +39,8 @@ export const setHtmlLang = (lang: string): void => { ...@@ -39,8 +39,8 @@ export const setHtmlLang = (lang: string): void => {
* @returns string * @returns string
* @author LiQingSong * @author LiQingSong
*/ */
export const getLocale = (): string => { export const getLocale = (): string => {
const lang = typeof window.localStorage !== 'undefined' ? window.localStorage.getItem(localeKey) : ''; const lang = typeof window.localStorage !== 'undefined' ? window.localStorage.getItem(localeKey) : '';
const isNavigatorLanguageValid = typeof navigator !== 'undefined' && typeof navigator.language === 'string'; const isNavigatorLanguageValid = typeof navigator !== 'undefined' && typeof navigator.language === 'string';
const browserLang = isNavigatorLanguageValid ? navigator.language.split('-').join('-') : ''; const browserLang = isNavigatorLanguageValid ? navigator.language.split('-').join('-') : '';
return lang || browserLang || defaultLang; return lang || browserLang || defaultLang;
...@@ -52,8 +52,8 @@ export const getLocale = (): string => { ...@@ -52,8 +52,8 @@ export const getLocale = (): string => {
* @param realReload 是否刷新页面,默认刷新 * @param realReload 是否刷新页面,默认刷新
* @author LiQingSong * @author LiQingSong
*/ */
export const setLocale = (lang: string, realReload = true, callback: () => void): void => { export const setLocale = (lang: string, callback: () => void, realReload = true): void => {
if (lang !== undefined && !localeNameExp(lang)) { if (lang !== undefined && !localeNameExp(lang)) {
// for reset when lang === undefined // for reset when lang === undefined
throw new Error('setLocale lang format error'); throw new Error('setLocale lang format error');
...@@ -62,7 +62,7 @@ export const setLocale = (lang: string, realReload = true, callback: () => void) ...@@ -62,7 +62,7 @@ export const setLocale = (lang: string, realReload = true, callback: () => void)
if (typeof window.localStorage !== 'undefined') { if (typeof window.localStorage !== 'undefined') {
window.localStorage.setItem(localeKey, lang || ''); window.localStorage.setItem(localeKey, lang || '');
} }
if (realReload) { if (realReload) {
window.location.reload(); window.location.reload();
} else { } else {
...@@ -84,43 +84,43 @@ export function importAllLocales(): LocaleMessages<VueMessageType> { ...@@ -84,43 +84,43 @@ export function importAllLocales(): LocaleMessages<VueMessageType> {
const modules: LocaleMessages<VueMessageType> = {}; const modules: LocaleMessages<VueMessageType> = {};
try { try {
// 导入 @/views 下文件,包含子目录,文件名为:[/\\]locales[/\\]([a-z]{2})-?([A-Z]{2})?\.ts // 导入 @/views 下文件,包含子目录,文件名为:[/\\]locales[/\\]([a-z]{2})-?([A-Z]{2})?\.ts
const viewsRequireContext: __WebpackModuleApi.RequireContext = require.context('../views', true, /[/\\]locales[/\\]([a-z]{2})-?([A-Z]{2})?\.ts$/); const viewsRequireContext: __WebpackModuleApi.RequireContext = require.context('../views', true, /[/\\]locales[/\\]([a-z]{2})-?([A-Z]{2})?\.ts$/);
viewsRequireContext.keys().forEach(fileName => { viewsRequireContext.keys().forEach(fileName => {
// 获取内容 // 获取内容
const modulesConent = viewsRequireContext(fileName); const modulesConent = viewsRequireContext(fileName);
if(modulesConent.default) { if(modulesConent.default) {
// 获取 PascalCase 命名 // 获取 PascalCase 命名
const modulesName = fileName.replace(/(.*\/)*([^.]+).*/ig,"$2"); const modulesName = fileName.replace(/(.*\/)*([^.]+).*/ig,"$2");
if(modules[modulesName]) { if(modules[modulesName]) {
modules[modulesName] = { modules[modulesName] = {
...modules[modulesName], ...modules[modulesName],
...modulesConent.default ...modulesConent.default
} }
} else { } else {
modules[modulesName] = modulesConent.default; modules[modulesName] = modulesConent.default;
} }
} }
}); });
// 导入 @/layouts 下文件,包含子目录,文件名为:[/\\]locales[/\\]([a-z]{2})-?([A-Z]{2})?\.ts // 导入 @/layouts 下文件,包含子目录,文件名为:[/\\]locales[/\\]([a-z]{2})-?([A-Z]{2})?\.ts
const layoutsRequireContext: __WebpackModuleApi.RequireContext = require.context('../layouts', true, /[/\\]locales[/\\]([a-z]{2})-?([A-Z]{2})?\.ts$/); const layoutsRequireContext: __WebpackModuleApi.RequireContext = require.context('../layouts', true, /[/\\]locales[/\\]([a-z]{2})-?([A-Z]{2})?\.ts$/);
layoutsRequireContext.keys().forEach(fileName => { layoutsRequireContext.keys().forEach(fileName => {
// 获取内容 // 获取内容
const modulesConent = layoutsRequireContext(fileName); const modulesConent = layoutsRequireContext(fileName);
if(modulesConent.default) { if(modulesConent.default) {
// 获取 PascalCase 命名 // 获取 PascalCase 命名
const modulesName = fileName.replace(/(.*\/)*([^.]+).*/ig,"$2"); const modulesName = fileName.replace(/(.*\/)*([^.]+).*/ig,"$2");
if(modules[modulesName]) { if(modules[modulesName]) {
modules[modulesName] = { modules[modulesName] = {
...modules[modulesName], ...modules[modulesName],
...modulesConent.default ...modulesConent.default
} }
} else { } else {
modules[modulesName] = modulesConent.default; modules[modulesName] = modulesConent.default;
} }
} }
...@@ -128,21 +128,21 @@ export function importAllLocales(): LocaleMessages<VueMessageType> { ...@@ -128,21 +128,21 @@ export function importAllLocales(): LocaleMessages<VueMessageType> {
}); });
// 导入 @/components 下文件,包含子目录,文件名为:[/\\]locales[/\\]([a-z]{2})-?([A-Z]{2})?\.ts // 导入 @/components 下文件,包含子目录,文件名为:[/\\]locales[/\\]([a-z]{2})-?([A-Z]{2})?\.ts
const componentsRequireContext: __WebpackModuleApi.RequireContext = require.context('../components', true, /[/\\]locales[/\\]([a-z]{2})-?([A-Z]{2})?\.ts$/); const componentsRequireContext: __WebpackModuleApi.RequireContext = require.context('../components', true, /[/\\]locales[/\\]([a-z]{2})-?([A-Z]{2})?\.ts$/);
componentsRequireContext.keys().forEach(fileName => { componentsRequireContext.keys().forEach(fileName => {
// 获取内容 // 获取内容
const modulesConent = componentsRequireContext(fileName); const modulesConent = componentsRequireContext(fileName);
if(modulesConent.default) { if(modulesConent.default) {
// 获取 PascalCase 命名 // 获取 PascalCase 命名
const modulesName = fileName.replace(/(.*\/)*([^.]+).*/ig,"$2"); const modulesName = fileName.replace(/(.*\/)*([^.]+).*/ig,"$2");
if(modules[modulesName]) { if(modules[modulesName]) {
modules[modulesName] = { modules[modulesName] = {
...modules[modulesName], ...modules[modulesName],
...modulesConent.default ...modulesConent.default
} }
} else { } else {
modules[modulesName] = modulesConent.default; modules[modulesName] = modulesConent.default;
} }
} }
...@@ -150,11 +150,11 @@ export function importAllLocales(): LocaleMessages<VueMessageType> { ...@@ -150,11 +150,11 @@ export function importAllLocales(): LocaleMessages<VueMessageType> {
}); });
// 导入 @/locales 下文件,不包含子目录,文件名为:([a-z]{2})-?([A-Z]{2})?\.ts // 导入 @/locales 下文件,不包含子目录,文件名为:([a-z]{2})-?([A-Z]{2})?\.ts
const localesRequireContext: __WebpackModuleApi.RequireContext = require.context('../locales', false, /([a-z]{2})-?([A-Z]{2})?\.ts$/); const localesRequireContext: __WebpackModuleApi.RequireContext = require.context('../locales', false, /([a-z]{2})-?([A-Z]{2})?\.ts$/);
localesRequireContext.keys().forEach(fileName => { localesRequireContext.keys().forEach(fileName => {
// 获取内容 // 获取内容
const modulesConent = localesRequireContext(fileName); const modulesConent = localesRequireContext(fileName);
if(modulesConent.default) { if(modulesConent.default) {
// 获取 PascalCase 命名 // 获取 PascalCase 命名
const modulesName = fileName.replace(/(.*\/)*([^.]+).*/ig,"$2"); const modulesName = fileName.replace(/(.*\/)*([^.]+).*/ig,"$2");
if(modules[modulesName]) { if(modules[modulesName]) {
...@@ -163,14 +163,14 @@ export function importAllLocales(): LocaleMessages<VueMessageType> { ...@@ -163,14 +163,14 @@ export function importAllLocales(): LocaleMessages<VueMessageType> {
...modulesConent.default ...modulesConent.default
} }
} else { } else {
modules[modulesName] = modulesConent.default; modules[modulesName] = modulesConent.default;
} }
} }
}); });
} catch (error) { } catch (error) {
// eslint-disable-next-line no-console // eslint-disable-next-line no-console
console.log(error); console.log(error);
......
import localforage from 'localforage'; import localforage from 'localforage';
import settings from '@/config/settings';
export const getCache = async (key: string): Promise<any | null> => { export const getCache = async (key: string): Promise<any | null> => {
return await localforage.getItem(key); return localforage.getItem(key);
}; };
export const setCache = async (key: string, val: any): Promise<boolean> => { export const setCache = async (key: string, val: any): Promise<boolean> => {
...@@ -14,12 +13,3 @@ export const setCache = async (key: string, val: any): Promise<boolean> => { ...@@ -14,12 +13,3 @@ export const setCache = async (key: string, val: any): Promise<boolean> => {
return false; return false;
} }
}; };
export const removeCache = async (key: string): Promise<boolean> => {
try {
await localforage.removeItem(settings.siteTokenKey);
return true;
} catch (error) {
return false;
}
};
\ No newline at end of file
...@@ -9,7 +9,7 @@ import settings from '@/config/settings'; ...@@ -9,7 +9,7 @@ import settings from '@/config/settings';
* 获取本地Token * 获取本地Token
*/ */
export const getToken = async (): Promise<string | null> => { export const getToken = async (): Promise<string | null> => {
return await localforage.getItem(settings.siteTokenKey); return localforage.getItem(settings.siteTokenKey);
}; };
/** /**
......
...@@ -83,10 +83,10 @@ export default function mitt(all?: EventHandlerMap): Emitter { ...@@ -83,10 +83,10 @@ export default function mitt(all?: EventHandlerMap): Emitter {
* @memberOf mitt * @memberOf mitt
*/ */
emit<T = any>(type: EventType, evt: T) { emit<T = any>(type: EventType, evt: T) {
((all?.get(type) || []) as EventHandlerList).slice().map((handler) => { ((all?.get(type) || []) as EventHandlerList).slice().forEach((handler) => {
handler(evt); handler(evt);
}); });
((all?.get('*') || []) as WildCardEventHandlerList).slice().map((handler) => { (all?.get('*') || []).slice().forEach((handler) => {
handler(type, evt); handler(type, evt);
}); });
}, },
......
/**
* 自定义 request 网络请求工具,基于axios
* @author LiQingSong
*/
import axios, { AxiosPromise, AxiosRequestConfig, AxiosResponse } from 'axios'; import axios, { AxiosPromise, AxiosRequestConfig, AxiosResponse } from 'axios';
import settings from '@/config/settings'; import settings from '@/config/settings';
import { getCache, setCache } from '@/utils/localCache';
import i18n from "@/config/i18n"; import i18n from "@/config/i18n";
import {getCurrProductIdBySite, getCurrSiteId} from "@/utils/cache"; import {getCurrProductIdBySite, getCurrSiteId} from "@/utils/cache";
import bus from "@/utils/eventBus"; import bus from "@/utils/eventBus";
...@@ -46,9 +41,6 @@ const request = axios.create({ ...@@ -46,9 +41,6 @@ const request = axios.create({
timeout: 0 // 请求超时时间,5000(单位毫秒) / 0 不做限制 timeout: 0 // 请求超时时间,5000(单位毫秒) / 0 不做限制
}); });
// 全局设置 - post请求头
// request.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
/** /**
* 请求拦截器 * 请求拦截器
*/ */
...@@ -72,11 +64,6 @@ request.interceptors.request.use( ...@@ -72,11 +64,6 @@ request.interceptors.request.use(
console.log(`currSiteId=${config.params[settings.currSiteId]}, currProductId=${config.params[settings.currProductId]}`) console.log(`currSiteId=${config.params[settings.currSiteId]}, currProductId=${config.params[settings.currProductId]}`)
// if (!config.params[settings.currWorkspace]) {
// const workspacePath = await getCache(settings.currWorkspace);
// config.params = { ...config.params, [settings.currWorkspace]: workspacePath, lang: i18n.global.locale.value };
// }
console.log('=== request ===', config.url, config) console.log('=== request ===', config.url, config)
return config; return config;
}, },
...@@ -91,7 +78,7 @@ request.interceptors.response.use( ...@@ -91,7 +78,7 @@ request.interceptors.response.use(
console.log('=== response ===', axiosResponse.config.url, axiosResponse) console.log('=== response ===', axiosResponse.config.url, axiosResponse)
const data: ResponseData = axiosResponse.data; const data: ResponseData = axiosResponse.data;
const { code, msg } = data; const { code } = data;
// 自定义状态码验证 // 自定义状态码验证
if (code !== 0) { if (code !== 0) {
......
import { RouteRecordRaw, RouteLocationNormalizedLoaded } from 'vue-router';
/** /**
* Route utils * Route utils
* @author LiQingSong
*/ */
/** /**
* 面包屑类型 * 面包屑类型
...@@ -17,7 +18,6 @@ ...@@ -17,7 +18,6 @@
*/ */
export type TabNavType = 'path' | 'querypath'; export type TabNavType = 'path' | 'querypath';
import 'vue-router'
declare module 'vue-router' { declare module 'vue-router' {
/** /**
* 自定义补充扩展 - 路由 - 类型字段 * 自定义补充扩展 - 路由 - 类型字段
...@@ -31,13 +31,6 @@ declare module 'vue-router' { ...@@ -31,13 +31,6 @@ declare module 'vue-router' {
roles?: string[]; roles?: string[];
// 标题,路由在菜单、浏览器title 或 面包屑中展示的文字,目前可以使用locales // 标题,路由在菜单、浏览器title 或 面包屑中展示的文字,目前可以使用locales
title: string; title: string;
/**
* 面包屑自定义内容:
* 1、默认不配置按照路由自动读取;
* 2、设置为 false , 按照路由自动读取并不读当前自己;
* 3、配置对应的面包屑格式如下:
*/
breadcrumb?: BreadcrumbType[] | false;
/** /**
* 设置tab导航存储规则类型 * 设置tab导航存储规则类型
* 1、默认不配置按照path(route.path)规则 * 1、默认不配置按照path(route.path)规则
...@@ -64,22 +57,12 @@ declare module 'vue-router' { ...@@ -64,22 +57,12 @@ declare module 'vue-router' {
belongTopMenu?: string; belongTopMenu?: string;
} }
} }
import { RouteRecordRaw, RouteLocationNormalizedLoaded } from 'vue-router';
/** /**
* 自定义重命名 - 路由类型 * 自定义重命名 - 路由类型
*/ */
export type RoutesDataItem = RouteRecordRaw; export type RoutesDataItem = RouteRecordRaw;
/**
* 头部tab导航类型
*/
export interface TabNavItem {
route: RouteLocationNormalizedLoaded,
menu: RoutesDataItem
}
import { isExternal } from './validate'; import { isExternal } from './validate';
import { equalObject } from "./object"; import { equalObject } from "./object";
...@@ -99,7 +82,7 @@ export const getRouteItem = (pathname: string, routesData: RoutesDataItem[]): Ro ...@@ -99,7 +82,7 @@ export const getRouteItem = (pathname: string, routesData: RoutesDataItem[]): Ro
item = element; item = element;
break; break;
} else if (element.path.indexOf(':') > 0) { } else if (element.path.indexOf(':') > 0) {
const reg = new RegExp("(:[^/]+)","gmi"); const reg = /(:[^/]+)/gmi
const path = element.path.replaceAll(reg,".+") const path = element.path.replaceAll(reg,".+")
const pass = new RegExp(path).test(pathname) const pass = new RegExp(path).test(pathname)
...@@ -168,7 +151,7 @@ export const setRoutePathForParent = (pathname: string, parentPath = '/', headSt ...@@ -168,7 +151,7 @@ export const setRoutePathForParent = (pathname: string, parentPath = '/', headSt
return pathname; return pathname;
} }
return pathname.substr(0, headStart.length) === headStart return pathname.substring(0, headStart.length) === headStart
? pathname ? pathname
: `${parentPath}/${pathname}`; : `${parentPath}/${pathname}`;
}; };
...@@ -192,26 +175,6 @@ export const getPathsTheRoutes = ( pathname: string[], routesData: RoutesDataIte ...@@ -192,26 +175,6 @@ export const getPathsTheRoutes = ( pathname: string[], routesData: RoutesDataIte
return routeItem; return routeItem;
}; };
/**
* 获取面包屑对应的 route 数组
* @param route route 当前routeItem
* @param pathname path[]
* @param routesData routes
*/
export const getBreadcrumbRoutes = (route: RoutesDataItem, pathname: string[], routesData: RoutesDataItem[]): BreadcrumbType[] => {
if (!route.breadcrumb) {
const routePaths = getPathsTheRoutes(pathname, routesData);
const ret = route.breadcrumb === false ? routePaths : [...routePaths, route]
return ret;
}
return route.breadcrumb;
};
/** /**
* 获取当前路由选中的侧边栏菜单path * 获取当前路由选中的侧边栏菜单path
* @param route route * @param route route
...@@ -242,9 +205,9 @@ export const vueRoutes = (routesData: RoutesDataItem[], parentPath = '/', headSt ...@@ -242,9 +205,9 @@ export const vueRoutes = (routesData: RoutesDataItem[], parentPath = '/', headSt
return routesData.map(item => { return routesData.map(item => {
const { children, ...other } = item; const { children, ...other } = item;
const itemChildren = children || []; const itemChildren = children || [];
const newItem: RoutesDataItem = { ...other }; const newItem: RoutesDataItem = {children: [], ...other };
newItem.path = setRoutePathForParent(newItem.path, parentPath, headStart); newItem.path = setRoutePathForParent(newItem.path, parentPath, headStart);
if (item.children) { if (item.children) {
newItem.children = [ newItem.children = [
...vueRoutes(itemChildren, newItem.path, headStart), ...vueRoutes(itemChildren, newItem.path, headStart),
...@@ -261,20 +224,19 @@ export const vueRoutes = (routesData: RoutesDataItem[], parentPath = '/', headSt ...@@ -261,20 +224,19 @@ export const vueRoutes = (routesData: RoutesDataItem[], parentPath = '/', headSt
*/ */
export const routesSetMeta = (routesData: RoutesDataItem[]): RoutesDataItem[] => { export const routesSetMeta = (routesData: RoutesDataItem[]): RoutesDataItem[] => {
return routesData.map(item => { return routesData.map(item => {
const { children, tabNavType, meta, ...other } = item; const { children, tabNavType, meta, ...other } = item;
const newItem: RoutesDataItem = { const newItem: RoutesDataItem = {
meta: { meta: {
...meta, ...meta,
// 自定义设置的 meta 值 S // 自定义设置的 meta 值 S
tabNavType: tabNavType || 'path',
tabNavType: tabNavType || 'path',
// 自定义设置的 meta 值 E // 自定义设置的 meta 值 E
}, },
children: [],
...other ...other
}; };
if (item.children) { if (item.children) {
const itemChildren = children || []; const itemChildren = children || [];
newItem.children = [ newItem.children = [
...@@ -304,7 +266,7 @@ export const hasPermissionRouteRoles = (userRoles: string[], roles?: string | st ...@@ -304,7 +266,7 @@ export const hasPermissionRouteRoles = (userRoles: string[], roles?: string | st
if (typeof roles === 'string') { if (typeof roles === 'string') {
return userRoles.includes(roles); return userRoles.includes(roles);
} }
if(roles instanceof Array && roles.length > 0) { if(roles instanceof Array && roles.length > 0) {
return roles.some(role => userRoles.includes(role)); return roles.some(role => userRoles.includes(role));
...@@ -325,7 +287,6 @@ export const hasPermission = (roles: string[], route: RoutesDataItem): boolean = ...@@ -325,7 +287,6 @@ export const hasPermission = (roles: string[], route: RoutesDataItem): boolean =
if (route.roles) { if (route.roles) {
return route.roles.some(role => roles.includes(role)); return route.roles.some(role => roles.includes(role));
//return roles.some(role => route.roles?.includes(role));
} }
return true; return true;
...@@ -357,28 +318,24 @@ export const getPermissionMenuData = ( roles: string[], routes: RoutesDataItem[] ...@@ -357,28 +318,24 @@ export const getPermissionMenuData = ( roles: string[], routes: RoutesDataItem[]
* @param route1 vue-route * @param route1 vue-route
* @param route2 vue-route * @param route2 vue-route
* @param type 判断规则 * @param type 判断规则
* @returns * @returns
*/ */
export const equalTabNavRoute = (route1: RouteLocationNormalizedLoaded, export const equalTabNavRoute = (route1: RouteLocationNormalizedLoaded,
route2: RouteLocationNormalizedLoaded, route2: RouteLocationNormalizedLoaded,
type: TabNavType = 'path'): boolean=> { type: TabNavType = 'path'): boolean=> {
let is = false; let is = false;
switch (type) { if (type === 'querypath') { // path + query
case 'querypath': // path + query is = equalObject(route1.query, route2.query) && route1.path === route2.path
is = equalObject(route1.query,route2.query) && route1.path === route2.path } else { // path
break; is = route1.path === route2.path
default: // path
is = route1.path === route2.path
if (!is) { if (!is) {
const arr1 = route1.path.split('/') const arr1 = route1.path.split('/')
const arr2 = route2.path.split('/') const arr2 = route2.path.split('/')
is = arr1[1] == '~' && arr2[1] == '~' && arr1[2] == arr2[2] // 同源高亮 is = arr1[1] == '~' && arr2[1] == '~' && arr1[2] == arr2[2] // 同源高亮
} }
break;
} }
return is; return is;
......
import moment from "moment"; import moment from "moment";
import {AutoTestTools, ScriptLanguages, TestTools, BuildTools} from "@/utils/const"; import {AutoTestTools, TestTools, BuildTools} from "@/utils/const";
import request from "@/utils/request";
function addItems(item, list, map) {
const lowerCase = item.toLowerCase()
list.push(lowerCase)
map[lowerCase] = item
}
export function getUnitTestFrameworks(): any { export function getUnitTestFrameworks(): any {
const list = new Array<string>() const list = new Array<string>()
const map = {} const map = {}
TestTools.forEach((item) => { TestTools.forEach((item) => {
const lowerCase = item.toLowerCase() addItems(item, list, map)
list.push(lowerCase)
map[lowerCase] = item
}) })
return {list: list, map: map} return {list: list, map: map}
...@@ -34,9 +37,7 @@ export function getAutoTestTools(): any { ...@@ -34,9 +37,7 @@ export function getAutoTestTools(): any {
const list = new Array<string>() const list = new Array<string>()
const map = {} const map = {}
AutoTestTools.forEach((item) => { AutoTestTools.forEach((item) => {
const lowerCase = item.toLowerCase() addItems(item, list, map)
list.push(lowerCase)
map[lowerCase] = item
}) })
return {list: list, map: map} return {list: list, map: map}
......
...@@ -10,8 +10,7 @@ export async function getLangSettings() { ...@@ -10,8 +10,7 @@ export async function getLangSettings() {
}) })
if (json.code === 0) { if (json.code === 0) {
const data = json.data return json.data
return data
} }
return {languages: [], languageMap: {}} return {languages: [], languageMap: {}}
...@@ -26,8 +25,7 @@ export async function getLangInterpreter(lang) { ...@@ -26,8 +25,7 @@ export async function getLangInterpreter(lang) {
}) })
if (json.code === 0) { if (json.code === 0) {
const data = json.data return json.data
return data
} }
return {path: '', info: ''} return {path: '', info: ''}
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
import { defineComponent } from 'vue' import { defineComponent } from 'vue'
export default defineComponent({ export default defineComponent({
beforeRouteEnter(to, from, next) { beforeRouteEnter(_to, from, next) {
// 在渲染该组件的对应路由被验证前调用 // 在渲染该组件的对应路由被验证前调用
// 不能获取组件实例 `this` ! // 不能获取组件实例 `this` !
// 因为当守卫执行时,组件实例还没被创建! // 因为当守卫执行时,组件实例还没被创建!
......
...@@ -82,7 +82,7 @@ const StoreModel: ModuleType = { ...@@ -82,7 +82,7 @@ const StoreModel: ModuleType = {
return true; return true;
}, },
async delete({ commit , dispatch, state}, data: any ) { async delete({ dispatch}, data: any ) {
try { try {
await remove(data); await remove(data);
dispatch('list', {}) dispatch('list', {})
......
...@@ -35,13 +35,10 @@ ...@@ -35,13 +35,10 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import {computed, defineComponent, PropType, ref, Ref} from "vue"; import {computed, defineComponent, PropType, ref} from "vue";
import {useI18n} from "vue-i18n"; import {useI18n} from "vue-i18n";
import {useStore} from "vuex"; import {useStore} from "vuex";
import {StateType as GlobalData} from "@/store/global";
import {ZentaoData} from "@/store/zentao";
import {ScriptData} from "@/views/script/store"; import {ScriptData} from "@/views/script/store";
import {WorkspaceData} from "@/store/workspace";
export default defineComponent({ export default defineComponent({
name: 'TreeContextMenu', name: 'TreeContextMenu',
......
...@@ -199,7 +199,6 @@ const selectCasesFromReport = async (): Promise<void> => { ...@@ -199,7 +199,6 @@ const selectCasesFromReport = async (): Promise<void> => {
getCaseIdsFromReport(workspace, seq, scope).then((json) => { getCaseIdsFromReport(workspace, seq, scope).then((json) => {
checkedKeys.value = json.data checkedKeys.value = json.data
router.push(`/script/index`) // remove the params of re-test
}) })
} }
selectCasesFromReport() selectCasesFromReport()
......
此差异已折叠。
<template>
<div class="script-main">
<div id="main">
<div id="left">
<ScriptTreePage></ScriptTreePage>
</div>
<div id="splitter-h"></div>
<div id="right">
<ZtfScriptPage v-if="currWorkspace?.type === 'ztf'"></ZtfScriptPage>
<UnitScriptPage v-if="currWorkspace?.type !== 'ztf'"></UnitScriptPage>
</div>
</div>
</div>
</template>
<script lang="ts">
import {
computed,
defineComponent,
onMounted,
ref,
watch
} from "vue";
import {useStore} from "vuex";
import {useI18n} from "vue-i18n";
import {ScriptData} from "./store";
import {resizeWidth, resizeHeight} from "@/utils/dom";
import {Empty, notification} from "ant-design-vue";
import {ZentaoData} from "@/store/zentao";
import ScriptTreePage from "./component/tree.vue";
import ZtfScriptPage from "./component/ztf.vue"
import UnitScriptPage from "./component/unit.vue"
export default defineComponent({
name: 'ScriptListPage',
components: {
ScriptTreePage,
ZtfScriptPage,
UnitScriptPage,
},
setup() {
const { t } = useI18n();
const zentaoStore = useStore<{ Zentao: ZentaoData }>();
const currSite = computed<any>(() => zentaoStore.state.Zentao.currSite);
const currProduct = computed<any>(() => zentaoStore.state.Zentao.currProduct);
const scriptStore = useStore<{ Script: ScriptData }>();
const currWorkspace = computed<any>(() => scriptStore.state.Script.currWorkspace);
onMounted(() => {
console.log('onMounted')
setTimeout(() => {
resizeWidth('main', 'left', 'splitter-h', 'right', 380, 800)
}, 600)
})
return {
t,
currSite,
currProduct,
currWorkspace,
simpleImage: Empty.PRESENTED_IMAGE_SIMPLE,
}
}
})
</script>
<style lang="less" scoped>
.script-main {
margin: 0px;
height: 100%;
#main {
height: 100%;
width: 100%;
#left {
float: left;
width: 30%;
height: 100%;
padding: 0;
}
#splitter-h {
float: left;
width: 0px;
border: solid 1px #D0D7DE;
height: 100%;
cursor: ew-resize;
&.active {
border-color: #a9aeb4;
}
}
#right {
float: left;
width: calc(70% - 2px);
height: 100%;
}
}
}
</style>
<style lang="less">
.monaco-editor {
padding: 10px 0;
}
</style>
...@@ -218,27 +218,22 @@ export const getFileNodesUnderParent = (node): string[] => { ...@@ -218,27 +218,22 @@ export const getFileNodesUnderParent = (node): string[] => {
getNodeMap(node, nodeMap) getNodeMap(node, nodeMap)
const arr = [] as string[] const arr = [] as string[]
Object.keys(nodeMap).forEach((k, v) => { Object.keys(nodeMap).forEach((k, _v) => {
const node = nodeMap[k] const item = nodeMap[k]
if (node.type === 'file') { if (item.type === 'file') {
node.childrem = null item.childrem = null
arr.push(node) arr.push(item)
} }
}) })
return arr return arr
} }
export function getSyncToInfoFromMenu(key: string, node: any): any {
return
}
export function scriptTreeAddAttr(treeData) { export function scriptTreeAddAttr(treeData) {
if(treeData == undefined){ if(treeData == undefined){
return treeData; return treeData;
} }
treeData = treeData.map((item, index) => { treeData = treeData.map((item) => {
item.id = item.path; item.id = item.path;
item.checkable = item.workspaceType == 'ztf' ? true : false; item.checkable = item.workspaceType == 'ztf' ? true : false;
if (item.isLeaf) { if (item.isLeaf) {
......
...@@ -107,7 +107,7 @@ const StoreModel: ModuleType = { ...@@ -107,7 +107,7 @@ const StoreModel: ModuleType = {
commit('setQueryParams', playload); commit('setQueryParams', playload);
return true; return true;
}, },
async loadChildren({ commit }, treeNode: any ) { async loadChildren(_ctx, treeNode: any ) {
console.log('load node children', treeNode.dataRef.workspaceType) console.log('load node children', treeNode.dataRef.workspaceType)
if (treeNode.dataRef.workspaceType === 'ztf') if (treeNode.dataRef.workspaceType === 'ztf')
return true return true
...@@ -118,19 +118,16 @@ const StoreModel: ModuleType = { ...@@ -118,19 +118,16 @@ const StoreModel: ModuleType = {
}) })
}, },
async getScript({ commit, dispatch }, script: any ) { async getScript({ commit}, script: any ) {
if (!script || script.type !== 'file') { if (!script || script.type !== 'file') {
commit('setItem', null); commit('setItem', null);
return true; } else if (script.path.indexOf('zentao-') === 0) {
}
if (script.path.indexOf('zentao-') === 0) {
commit('setItem', {id: script.caseId, workspaceId: script.workspaceId, code: ScriptFileNotExist}); commit('setItem', {id: script.caseId, workspaceId: script.workspaceId, code: ScriptFileNotExist});
return true; } else {
const response: ResponseData = await get(script.path, script.workspaceId);
commit('setItem', response.data);
} }
const response: ResponseData = await get(script.path, script.workspaceId);
commit('setItem', response.data);
return true; return true;
}, },
...@@ -150,7 +147,7 @@ const StoreModel: ModuleType = { ...@@ -150,7 +147,7 @@ const StoreModel: ModuleType = {
return resp return resp
}, },
async syncToZentao({ commit, dispatch, state }, payload: any ) { async syncToZentao({ dispatch, state }, payload: any ) {
const resp = await syncToZentao(payload) const resp = await syncToZentao(payload)
if (resp.code === 0) { if (resp.code === 0) {
...@@ -170,7 +167,7 @@ const StoreModel: ModuleType = { ...@@ -170,7 +167,7 @@ const StoreModel: ModuleType = {
return data.done return data.done
}, },
async createScript({ commit , dispatch, state}, payload: any) { async createScript({ dispatch, state}, payload: any) {
try { try {
const jsn = await create(payload); const jsn = await create(payload);
const path = jsn.data const path = jsn.data
...@@ -182,7 +179,7 @@ const StoreModel: ModuleType = { ...@@ -182,7 +179,7 @@ const StoreModel: ModuleType = {
return '' return ''
} }
}, },
async updateScript({ commit }, payload: any ) { async updateScript(_ctx, payload: any ) {
try { try {
const { id, ...params } = payload; const { id, ...params } = payload;
await update(id, { ...params }); await update(id, { ...params });
...@@ -192,7 +189,7 @@ const StoreModel: ModuleType = { ...@@ -192,7 +189,7 @@ const StoreModel: ModuleType = {
} }
}, },
async updateCode({ commit, dispatch, state }, payload: any ) { async updateCode({ dispatch, state }, payload: any ) {
try { try {
await updateCode(payload); await updateCode(payload);
await dispatch('listScript', state.queryParams) await dispatch('listScript', state.queryParams)
...@@ -202,7 +199,7 @@ const StoreModel: ModuleType = { ...@@ -202,7 +199,7 @@ const StoreModel: ModuleType = {
} }
}, },
async pasteScript({ commit , dispatch, state}, data: any ) { async pasteScript({ dispatch, state}, data: any ) {
try { try {
await paste(data); await paste(data);
await dispatch('listScript', state.queryParams) await dispatch('listScript', state.queryParams)
...@@ -213,7 +210,7 @@ const StoreModel: ModuleType = { ...@@ -213,7 +210,7 @@ const StoreModel: ModuleType = {
} }
}, },
async moveScript({ commit , dispatch, state}, data: any ) { async moveScript({ dispatch, state}, data: any ) {
try { try {
await move(data); await move(data);
await dispatch('listScript', state.queryParams) await dispatch('listScript', state.queryParams)
...@@ -224,7 +221,7 @@ const StoreModel: ModuleType = { ...@@ -224,7 +221,7 @@ const StoreModel: ModuleType = {
} }
}, },
async deleteScript({ commit , dispatch, state}, path: string ) { async deleteScript({ dispatch, state}, path: string ) {
try { try {
await remove(path); await remove(path);
await dispatch('listScript', state.queryParams) await dispatch('listScript', state.queryParams)
......
...@@ -76,7 +76,7 @@ const StoreModel: ModuleType = { ...@@ -76,7 +76,7 @@ const StoreModel: ModuleType = {
commit('setDetailResult',data); commit('setDetailResult',data);
return true; return true;
}, },
async save({ commit }, payload) { async save(_ctx, payload) {
try { try {
await save(payload); await save(payload);
return true; return true;
...@@ -84,7 +84,7 @@ const StoreModel: ModuleType = { ...@@ -84,7 +84,7 @@ const StoreModel: ModuleType = {
return false; return false;
} }
}, },
async delete({ commit , dispatch, state}, id: number ) { async delete({ dispatch}, id: number ) {
try { try {
await remove(id); await remove(id);
dispatch('list', {}) dispatch('list', {})
......
...@@ -97,7 +97,7 @@ const StoreModel: ModuleType = { ...@@ -97,7 +97,7 @@ const StoreModel: ModuleType = {
commit('setDetailResult',data); commit('setDetailResult',data);
return true; return true;
}, },
async save({ commit }, payload) { async save(_ctx, payload) {
try { try {
await save(payload); await save(payload);
return true; return true;
...@@ -105,7 +105,7 @@ const StoreModel: ModuleType = { ...@@ -105,7 +105,7 @@ const StoreModel: ModuleType = {
return false; return false;
} }
}, },
async delete({ commit , dispatch, state}, id: number ) { async delete({ dispatch}, id: number ) {
try { try {
await remove(id); await remove(id);
dispatch('list', {}) dispatch('list', {})
......
...@@ -61,3 +61,9 @@ sips -z 32 32 ztf.png --out tmp.iconset/icon_32x32.png ...@@ -61,3 +61,9 @@ sips -z 32 32 ztf.png --out tmp.iconset/icon_32x32.png
CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ GOOS=windows GOARCH=amd64 go build -ldflags "-X 'commConsts.appVersion=3.0.0' -X 'commConsts.buildTime=Mon Jul 25 09:31:39 2022 +0800' -X 'commConsts.goVersion=go version go1.17.1 darwin/amd64 CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ GOOS=windows GOARCH=amd64 go build -ldflags "-X 'commConsts.appVersion=3.0.0' -X 'commConsts.buildTime=Mon Jul 25 09:31:39 2022 +0800' -X 'commConsts.goVersion=go version go1.17.1 darwin/amd64
' -X 'commConsts.gitHash=d118c05ae38d76231abfb6430e52ec517e080f50'" -x -v -ldflags "-s -w" -o client/bin/win32/ztf.exe cmd/command/main.go cmd/command/main.syso ' -X 'commConsts.gitHash=d118c05ae38d76231abfb6430e52ec517e080f50'" -x -v -ldflags "-s -w" -o client/bin/win32/ztf.exe cmd/command/main.go cmd/command/main.syso
sonar-scanner \
-Dsonar.projectKey=ztf \
-Dsonar.sources=. \
-Dsonar.host.url=http://localhost:59001 \
-Dsonar.login=sqp_94f2484e50b1cfea719eb791f4e5d544be887f87
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册