diff --git a/imports/column.go b/importer/column.go similarity index 99% rename from imports/column.go rename to importer/column.go index 28bfc66d..2a960db2 100644 --- a/imports/column.go +++ b/importer/column.go @@ -1,4 +1,4 @@ -package imports +package importer import ( "fmt" diff --git a/imports/column_test.go b/importer/column_test.go similarity index 99% rename from imports/column_test.go rename to importer/column_test.go index f8c46d69..cbc25e95 100644 --- a/imports/column_test.go +++ b/importer/column_test.go @@ -1,4 +1,4 @@ -package imports +package importer import ( "testing" diff --git a/importer/csv/csv.go b/importer/csv/csv.go new file mode 100644 index 00000000..ed407dd0 --- /dev/null +++ b/importer/csv/csv.go @@ -0,0 +1 @@ +package csv diff --git a/importer/from/source.go b/importer/from/source.go new file mode 100644 index 00000000..9ca9aa84 --- /dev/null +++ b/importer/from/source.go @@ -0,0 +1,20 @@ +package from + +// Source 导入文件接口 +type Source interface { + Data(page int, size int) []map[string]interface{} + Columns() []Column + Bind(mapping Mapping) +} + +// Column 源数据列 +type Column struct { + Name string + Type string + Col int + Row int + Pos string +} + +// Mapping 数值映射表 +type Mapping struct{} diff --git a/importer/importer.go b/importer/importer.go new file mode 100644 index 00000000..59861219 --- /dev/null +++ b/importer/importer.go @@ -0,0 +1,92 @@ +package importer + +import ( + "crypto/sha256" + "fmt" + "path/filepath" + "sort" + "strings" + + jsoniter "github.com/json-iterator/go" + "github.com/yaoapp/kun/exception" + "github.com/yaoapp/xiang/config" + "github.com/yaoapp/xiang/importer/from" + "github.com/yaoapp/xiang/share" +) + +// Importers 导入器 +var Importers = map[string]*Importer{} + +// Load 加载导入器 +func Load(cfg config.Config) { + LoadFrom(filepath.Join(cfg.Root, "imports"), "") +} + +// LoadFrom 从特定目录加载 +func LoadFrom(dir string, prefix string) { + if share.DirNotExists(dir) { + return + } + share.Walk(dir, ".json", func(root, filename string) { + var importer Importer + name := prefix + share.SpecName(root, filename) + content := share.ReadFile(filename) + err := jsoniter.Unmarshal(content, &importer) + if err != nil { + exception.New("%s 导入配置错误. %s", 400, name, err.Error()).Ctx(filename).Throw() + } + Importers[name] = &importer + }) +} + +// Select 选择已加载导入器 +func Select(name string) *Importer { + im, has := Importers[name] + if !has { + exception.New("导入配置: %s 尚未加载", 400, name).Throw() + } + return im +} + +// AutoMapping 根据文件信息获取字段映射表 +func (imp *Importer) AutoMapping(src from.Source) *from.Mapping { + return nil +} + +// Preview 预览数据 +func (imp *Importer) Preview(src from.Source, page int, size int) []map[string]interface{} { + return nil +} + +// DataSetting 预览数据表格配置 +func (imp *Importer) DataSetting(src from.Source) []map[string]interface{} { + return nil +} + +// MappingSetting 预览映射数据表格配置 +func (imp *Importer) MappingSetting(src from.Source) []map[string]interface{} { + return nil +} + +// Fingerprint 导入文件指纹 +func (imp *Importer) Fingerprint(src from.Source) string { + keys := []string{} + columns := src.Columns() + for _, col := range columns { + keys = append(keys, fmt.Sprintf("%s|%s", col.Name, col.Type)) + } + sort.Strings(keys) + hash := sha256.New() + hash.Write([]byte(strings.Join(keys, ""))) + return fmt.Sprintf("%x", hash.Sum(nil)) +} + +// SaveAsTemplate 保存为映射模板 +func (imp *Importer) SaveAsTemplate(src from.Source) { +} + +// Run 运行导入 +func (imp *Importer) Run() {} + +// Start 运行导入(异步) +func (imp *Importer) Start() {} diff --git a/importer/importer_test.go b/importer/importer_test.go new file mode 100644 index 00000000..fcfe0113 --- /dev/null +++ b/importer/importer_test.go @@ -0,0 +1,20 @@ +package importer + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/yaoapp/xiang/importer/xlsx" +) + +func TestLoad(t *testing.T) { + LoadFrom("not a path", "404.") + assert.IsType(t, &Importer{}, Select("manu")) +} +func TestFingerprint(t *testing.T) { + file := xlsx.Open() + imp := Select("manu") + fp := imp.Fingerprint(file) + fmt.Println(fp) +} diff --git a/importer/init_test.go b/importer/init_test.go new file mode 100644 index 00000000..e090849a --- /dev/null +++ b/importer/init_test.go @@ -0,0 +1,20 @@ +package importer + +import ( + "os" + "testing" + + "github.com/yaoapp/xiang/config" + "github.com/yaoapp/xiang/model" + "github.com/yaoapp/xiang/query" + "github.com/yaoapp/xiang/share" +) + +func TestMain(m *testing.M) { + share.DBConnect(config.Conf.Database) + model.Load(config.Conf) + query.Load(config.Conf) + Load(config.Conf) + code := m.Run() + os.Exit(code) +} diff --git a/imports/option.go b/importer/option.go similarity index 98% rename from imports/option.go rename to importer/option.go index 20a38605..8237e8aa 100644 --- a/imports/option.go +++ b/importer/option.go @@ -1,4 +1,4 @@ -package imports +package importer import ( jsoniter "github.com/json-iterator/go" diff --git a/imports/option_test.go b/importer/option_test.go similarity index 98% rename from imports/option_test.go rename to importer/option_test.go index b8be7f58..595ab8eb 100644 --- a/imports/option_test.go +++ b/importer/option_test.go @@ -1,4 +1,4 @@ -package imports +package importer import ( "testing" diff --git a/imports/types.go b/importer/types.go similarity index 95% rename from imports/types.go rename to importer/types.go index b2f698f2..c815f5cf 100644 --- a/imports/types.go +++ b/importer/types.go @@ -1,4 +1,4 @@ -package imports +package importer // PreviewAuto 一直显示 const PreviewAuto = "auto" @@ -9,8 +9,8 @@ const PreviewAlways = "always" // PreviewNever 从不显示 const PreviewNever = "never" -// Imports 数据导入 -type Imports struct { +// Importer 数据导入器 +type Importer struct { Title string `json:"title,omitempty"` // 导入名称 Process string `json:"process"` // 处理器名称 Columns []Column `json:"columns"` // 字段列表 diff --git a/importer/xlsx/xlsx.go b/importer/xlsx/xlsx.go new file mode 100644 index 00000000..044b8b09 --- /dev/null +++ b/importer/xlsx/xlsx.go @@ -0,0 +1,23 @@ +package xlsx + +import "github.com/yaoapp/xiang/importer/from" + +// Xlsx xlsx file +type Xlsx struct{} + +// Open 打开 Xlsx 文件 +func Open() *Xlsx { + return &Xlsx{} +} + +// Data 读取数据 +func (xlsx *Xlsx) Data(page int, size int) []map[string]interface{} { + return nil +} + +// Columns 读取列 +func (xlsx *Xlsx) Columns() []from.Column { return nil } + +// Bind 绑定映射表 +func (xlsx *Xlsx) Bind(mapping from.Mapping) { +} diff --git a/imports/imports.go b/imports/imports.go deleted file mode 100644 index dd3e4a86..00000000 --- a/imports/imports.go +++ /dev/null @@ -1 +0,0 @@ -package imports