From 5ac59d00add5c7982bc3eefa9145bfe676044734 Mon Sep 17 00:00:00 2001 From: Andrew Guschin Date: Tue, 24 May 2022 12:57:09 +0400 Subject: =?UTF-8?q?=D0=91=D0=B0=D0=B7=D0=BE=D0=B2=D0=B0=D1=8F=20=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D1=81=D0=B8=D1=8F=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80?= =?UTF-8?q?=D1=84=D0=B5=D0=B9=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- interface/database.go | 116 +++++++++++++++++++++++++++++++++++++++++ interface/go.mod | 29 +++++++++++ interface/main.go | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 285 insertions(+) create mode 100644 interface/database.go create mode 100644 interface/go.mod create mode 100644 interface/main.go (limited to 'interface') diff --git a/interface/database.go b/interface/database.go new file mode 100644 index 0000000..446b015 --- /dev/null +++ b/interface/database.go @@ -0,0 +1,116 @@ +package main + +import ( + "database/sql" + "fmt" + _ "github.com/denisenkom/go-mssqldb" +) + +type SQLConnection struct { + db *sql.DB +} + +func (conn *SQLConnection) init() error { + //query := url.Values{} + //query.Add("app name", "MyAppName") + // + //u := &url.URL{ + // Scheme: "sqlserver", + // User: url.UserPassword("sa", "Datab@sed1337"), + // Host: fmt.Sprintf("%s:%d", "", 1431), + // // Path: instance, // if connecting to an instance instead of a port + // RawQuery: query.Encode(), + //} + //var err error + //conn.db, err = sql.Open("sqlserver", u.String()) + //return err + var err error + conn.db, err = sql.Open("sqlserver", "server=localhost;user id=sa;password=Datab@sed1337;") + return err +} + +type Box struct { + id int + orderId int + warehouseId int + wrappingId int + volume float32 + weight float32 +} + +func (conn *SQLConnection) getTables() ([]string, error) { + result, err := conn.db.Query( + `SELECT TABLE_CATALOG + '.' + TABLE_SCHEMA + '.' + TABLE_NAME as TABLE_NAME + FROM shipping.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'`) + if err != nil { + return nil, err + } + + var tables []string + for result.Next() { + var row string + _ = result.Scan(&row) + tables = append(tables, row) + } + + return tables, nil +} + +func (conn *SQLConnection) getViews() ([]string, error) { + result, err := conn.db.Query( + `select name from sys.views where is_ms_shipped=0;`) + if err != nil { + return nil, err + } + + var tables []string + for result.Next() { + var row string + _ = result.Scan(&row) + tables = append(tables, row) + } + + return tables, nil +} + +func (conn *SQLConnection) getColumns(table string) ([]string, error) { + result, err := conn.db.Query(fmt.Sprintf("SELECT TOP 1 * FROM %s", table)) + if err != nil { + return nil, nil + } + return result.Columns() +} + +func (conn *SQLConnection) getTable(table string) ([][]string, error) { + var err error + var msg [][]string + + result, err := conn.db.Query(fmt.Sprintf("SELECT * FROM %s", table)) + if err != nil { + return msg, err + } + + cols, _ := result.Columns() + for result.Next() { + boxes := make([]string, len(cols)) + dest := make([]interface{}, len(cols)) + for i, _ := range dest { + dest[i] = &boxes[i] + } + _ = result.Scan(dest...) + msg = append(msg, boxes) + } + + //for result.Next() { + // var box Box + // err = result.Scan( + // &box.id, &box.orderId, + // &box.warehouseId, + // &box.wrappingId, + // &box.volume, &box.weight) + // msg = append(msg, box) + //} + _ = result.Close() + + return msg, err +} diff --git a/interface/go.mod b/interface/go.mod new file mode 100644 index 0000000..9c6e871 --- /dev/null +++ b/interface/go.mod @@ -0,0 +1,29 @@ +module interface + +go 1.18 + +require fyne.io/fyne/v2 v2.1.4 + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/denisenkom/go-mssqldb v0.12.2 // indirect + github.com/fredbi/uri v0.0.0-20181227131451-3dcfdacbaaf3 // indirect + github.com/fsnotify/fsnotify v1.4.9 // indirect + github.com/go-gl/gl v0.0.0-20210813123233-e4099ee2221f // indirect + github.com/go-gl/glfw/v3.3/glfw v0.0.0-20211024062804-40e447a793be // indirect + github.com/godbus/dbus/v5 v5.0.4 // indirect + github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff // indirect + github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe // indirect + github.com/golang-sql/sqlexp v0.1.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564 // indirect + github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9 // indirect + github.com/stretchr/testify v1.7.0 // indirect + github.com/yuin/goldmark v1.3.8 // indirect + golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 // indirect + golang.org/x/image v0.0.0-20200430140353-33d19683fad8 // indirect + golang.org/x/net v0.0.0-20210610132358-84b48f89b13b // indirect + golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect + golang.org/x/text v0.3.6 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect +) diff --git a/interface/main.go b/interface/main.go new file mode 100644 index 0000000..8f7566d --- /dev/null +++ b/interface/main.go @@ -0,0 +1,140 @@ +package main + +import ( + "fmt" + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/app" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/layout" + "fyne.io/fyne/v2/widget" + "image/color" +) + +type DBInterface struct { + window fyne.Window + db SQLConnection +} + +func insertView(window fyne.Window, db SQLConnection, table string) { + window.SetTitle(fmt.Sprintf("Insert into table %s", table)) + columns, _ := db.getColumns(table) + + var elements []fyne.CanvasObject + for _, val := range columns { + label := canvas.NewText(val, color.White) + input := widget.NewEntry() + elements = append(elements, container.New( + layout.NewBorderLayout(nil, nil, label, nil), + label, input)) + } + elements = append(elements, widget.NewButton("Вставить", func() {})) + elements = append(elements, widget.NewButton("Назад", func() { + showTable(window, db, table) + })) + + mainContainer := container.NewVBox(elements...) + window.SetContent(mainContainer) +} + +func showTable(window fyne.Window, db SQLConnection, table string) { + data, err := db.getTable(table) + if err != nil { + fmt.Println(err) + return + } + columns, err := db.getColumns(table) + + list := widget.NewTable( + func() (int, int) { + return len(data), len(columns) + }, + func() fyne.CanvasObject { + return widget.NewLabel("wide content") + }, + func(i widget.TableCellID, o fyne.CanvasObject) { + o.(*widget.Label).SetText(fmt.Sprintf("%v", data[i.Row][i.Col])) + }) + + signup := widget.NewButton("Вставить", func() { + insertView(window, db, table) + }) + + back := widget.NewButton("Назад", func() { + adminView(window, db) + }) + + window.SetContent(container.NewBorder(nil, container.NewHBox(signup, back), nil, nil, list)) +} + +func adminView(window fyne.Window, db SQLConnection) { + tables, _ := db.getTables() + + var tableBtns []fyne.CanvasObject + tableBtns = append(tableBtns, container.NewCenter(widget.NewLabel("Таблицы"))) + for _, val := range tables { + e := val + tableBtns = append( + tableBtns, widget.NewButton( + fmt.Sprintf("Показать %s", val), + func() { + showTable(window, db, e) + })) + } + + views, _ := db.getViews() + var viewsBtns []fyne.CanvasObject + viewsBtns = append(viewsBtns, container.NewCenter(widget.NewLabel("Представления"))) + for _, val := range views { + e := val + viewsBtns = append( + viewsBtns, widget.NewButton( + fmt.Sprintf("Показать %s", val), + func() { + showTable(window, db, e) + })) + } + + tablesScroll := container.NewVScroll(container.NewVBox(tableBtns...)) + viewsScroll := container.NewVScroll(container.NewVBox(viewsBtns...)) + + dataBox := container.NewHBox(tablesScroll, viewsScroll) + menuBtn := widget.NewButton("В меню", func() { + menu(window, db) + }) + + window.SetContent(container.NewBorder(nil, menuBtn, nil, nil, dataBox)) +} + +func userView(window fyne.Window, db SQLConnection) { + +} + +func menu(window fyne.Window, db SQLConnection) { + window.SetContent(container.NewCenter( + container.NewVBox( + widget.NewButton("Режим Администратора", func() { + adminView(window, db) + }), + widget.NewButton("Режим Пользователя", func() { + userView(window, db) + }), + ), + )) +} + +func main() { + myApp := app.New() + window := myApp.NewWindow("Table Widget") + window.Resize(fyne.NewSize(700, 480)) + + db := SQLConnection{} + err := db.init() + if err != nil { + fmt.Println(err) + return + } + + menu(window, db) + window.ShowAndRun() +} -- cgit v1.2.3