|
@@ -0,0 +1,235 @@
|
|
|
+package main
|
|
|
+// Golang - Сила!
|
|
|
+import(
|
|
|
+ "fmt"
|
|
|
+ "os"
|
|
|
+ "github.com/boombuler/barcode"
|
|
|
+ "github.com/boombuler/barcode/qr"
|
|
|
+ "image"
|
|
|
+ "image/png"
|
|
|
+ "log"
|
|
|
+ "net/http"
|
|
|
+ "strings"
|
|
|
+ "gorm.io/gorm"
|
|
|
+ "gorm.io/driver/sqlite"
|
|
|
+ "html/template"
|
|
|
+)
|
|
|
+
|
|
|
+type ViewData struct{
|
|
|
+ Title string
|
|
|
+ PrinterNames []string
|
|
|
+ CartridgeNames []string
|
|
|
+}
|
|
|
+
|
|
|
+type Printers struct{
|
|
|
+ ID uint `gorm:"type:integer"`
|
|
|
+ Name string `gorm:"type:text"`
|
|
|
+}
|
|
|
+
|
|
|
+type Cartridges struct{
|
|
|
+ ID uint `gorm:"type:integer"`
|
|
|
+ Name string `gorm:"type:text"`
|
|
|
+}
|
|
|
+
|
|
|
+type Cartridgeofprinter struct{
|
|
|
+ Cartridgeid uint `gorm:"type:integer"`
|
|
|
+ Printerid uint `gorm:"type:integer"`
|
|
|
+}
|
|
|
+
|
|
|
+func main(){
|
|
|
+ http.HandleFunc("/", PrinterList)
|
|
|
+ http.HandleFunc("/generate", GenerateQR)
|
|
|
+ http.HandleFunc("/addprinter", AddPrinter)
|
|
|
+ http.HandleFunc("/addcartridge", AddCartridge)
|
|
|
+ http.HandleFunc("/cartridgeOfPrinter", AddCartridgeOfPrinter)
|
|
|
+ http.HandleFunc("/compatible", FindCompatibleCartridges)
|
|
|
+ fmt.Println("Server is listening...")
|
|
|
+
|
|
|
+ http.ListenAndServe(":8888", nil)
|
|
|
+}
|
|
|
+
|
|
|
+func FindCompatibleCartridges(w http.ResponseWriter, r *http.Request){
|
|
|
+ db, _ := gorm.Open(sqlite.Open("printer.db"), &gorm.Config{})
|
|
|
+
|
|
|
+ var PrinterList []Printers
|
|
|
+ db.Find(&PrinterList)
|
|
|
+ var PrinterName []string
|
|
|
+ for _, pr := range PrinterList{
|
|
|
+ PrinterName = append(PrinterName, pr.Name)
|
|
|
+ }
|
|
|
+
|
|
|
+ var printer Printers
|
|
|
+ r.ParseForm()
|
|
|
+ selectedPrinter := strings.Join(r.Form["printer"], "")
|
|
|
+ fmt.Println("Selected: " + selectedPrinter)
|
|
|
+
|
|
|
+ if selectedPrinter != ""{
|
|
|
+ db.Where("Name = ?", selectedPrinter).First(&printer)
|
|
|
+ var cops []uint
|
|
|
+ db.Table("CartridgeOfPrinters").Where("PrinterID = ?", printer.ID).Select("CartridgeID").Find(&cops)
|
|
|
+
|
|
|
+ var cartridgeName []string
|
|
|
+
|
|
|
+ for _, cop := range cops{
|
|
|
+ var cart Cartridges
|
|
|
+ db.Where("ID = ?", cop).First(&cart)
|
|
|
+ cartridgeName = append(cartridgeName, cart.Name)
|
|
|
+ }
|
|
|
+ data := ViewData{
|
|
|
+ Title: "Совместимость картриджей",
|
|
|
+ PrinterNames: PrinterName,
|
|
|
+ CartridgeNames: cartridgeName,
|
|
|
+ }
|
|
|
+
|
|
|
+ w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", selectedPrinter + ".png"))
|
|
|
+ var cartText = strings.Join(cartridgeName, "\n")
|
|
|
+ cartridgeQR(cartText, selectedPrinter)
|
|
|
+ http.ServeFile(w, r, selectedPrinter)
|
|
|
+
|
|
|
+ tmpl, _ := template.ParseFiles("compatible.html")
|
|
|
+ tmpl.Execute(w, data)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ data := ViewData{
|
|
|
+ Title: "Совместимость картриджей",
|
|
|
+ PrinterNames: PrinterName,
|
|
|
+ }
|
|
|
+
|
|
|
+ tmpl, _ := template.ParseFiles("compatible.html")
|
|
|
+ tmpl.Execute(w, data)
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+func AddCartridgeOfPrinter(w http.ResponseWriter, r *http.Request){
|
|
|
+ db, _ := gorm.Open(sqlite.Open("printer.db"), &gorm.Config{})
|
|
|
+ r.ParseForm()
|
|
|
+ cartridgeName := strings.Join(r.Form["cartridges"], "")
|
|
|
+ printerName := strings.Join(r.Form["printers"], "")
|
|
|
+ // printerName := strings.Join(r.Form["printers"], "")
|
|
|
+ var cartridge Cartridges
|
|
|
+ db.Where("Name = ?", cartridgeName).First(&cartridge)
|
|
|
+ cartridgeID := cartridge.ID
|
|
|
+ var printer Printers
|
|
|
+ db.Where("Name = ?", printerName).First(&printer)
|
|
|
+ printerID := printer.ID
|
|
|
+ var cop Cartridgeofprinter
|
|
|
+ cop.Cartridgeid = cartridgeID
|
|
|
+ cop.Printerid = printerID
|
|
|
+ db.Create(&cop)
|
|
|
+ http.Redirect(w, r, "/", 302)
|
|
|
+}
|
|
|
+
|
|
|
+func AddCartridge(w http.ResponseWriter, r *http.Request){
|
|
|
+ db, _ := gorm.Open(sqlite.Open("printer.db"), &gorm.Config{})
|
|
|
+ r.ParseForm()
|
|
|
+ text := strings.Join(r.Form["cartridgeName"], "")
|
|
|
+ var newCartridge Cartridges
|
|
|
+ newCartridge.Name = text
|
|
|
+ db.Create(&newCartridge)
|
|
|
+ http.Redirect(w, r, "/", 302)
|
|
|
+}
|
|
|
+
|
|
|
+func AddPrinter(w http.ResponseWriter, r *http.Request){
|
|
|
+ db, _ := gorm.Open(sqlite.Open("printer.db"), &gorm.Config{})
|
|
|
+ r.ParseForm()
|
|
|
+ text := strings.Join(r.Form["printerName"], "")
|
|
|
+ var newPrinter Printers
|
|
|
+ newPrinter.Name = text
|
|
|
+ db.Create(&newPrinter)
|
|
|
+ http.Redirect(w, r, "/", 302)
|
|
|
+}
|
|
|
+
|
|
|
+func GenerateQR(w http.ResponseWriter, r *http.Request){
|
|
|
+ r.ParseForm()
|
|
|
+ text := strings.Join(r.Form["printer"], "")
|
|
|
+ w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", text + ".png"))
|
|
|
+ generateFromText(text)
|
|
|
+ http.ServeFile(w, r, text)
|
|
|
+}
|
|
|
+
|
|
|
+func PrinterList(w http.ResponseWriter, r *http.Request){
|
|
|
+ db, _ := gorm.Open(sqlite.Open("printer.db"), &gorm.Config{})
|
|
|
+
|
|
|
+ var PrinterList []Printers
|
|
|
+ db.Find(&PrinterList)
|
|
|
+ var PrinterName []string
|
|
|
+ for _, pr := range PrinterList{
|
|
|
+ PrinterName = append(PrinterName, pr.Name)
|
|
|
+ }
|
|
|
+
|
|
|
+ var CartridgeList []Cartridges
|
|
|
+ db.Find(&CartridgeList)
|
|
|
+ var CartridgeName []string
|
|
|
+ for _, ca := range CartridgeList{
|
|
|
+ CartridgeName = append(CartridgeName, ca.Name)
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ data := ViewData{
|
|
|
+ Title: "Generate QR",
|
|
|
+ PrinterNames: PrinterName,
|
|
|
+ CartridgeNames: CartridgeName,
|
|
|
+ }
|
|
|
+
|
|
|
+ tmpl, _ := template.ParseFiles("generate.html")
|
|
|
+ tmpl.Execute(w, data)
|
|
|
+}
|
|
|
+
|
|
|
+func generateCompatibleCartridges(printer Printers){
|
|
|
+ db, _ := gorm.Open(sqlite.Open("printer.db"), &gorm.Config{})
|
|
|
+ var cops []Cartridgeofprinter
|
|
|
+ var cartridges []Cartridges
|
|
|
+ db.Where("Printerid = ?", printer.ID).Find(&cops)
|
|
|
+ for _, cop := range cops{
|
|
|
+ var cartridge Cartridges
|
|
|
+ fmt.Println(cop.Cartridgeid)
|
|
|
+ db.Where("ID = ?", cop.Cartridgeid).First(&cartridge)
|
|
|
+ cartridges = append(cartridges, cartridge)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func cartridgeQR(text string, filename string){
|
|
|
+ code, err := qr.Encode(text, qr.L, qr.Auto)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("Something went wrong...")
|
|
|
+ }
|
|
|
+ if text != code.Content() {
|
|
|
+ log.Fatal("data differs")
|
|
|
+ }
|
|
|
+ code, err = barcode.Scale(code, 512, 512)
|
|
|
+ if err != nil {
|
|
|
+ log.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ writePng(filename, code)
|
|
|
+}
|
|
|
+
|
|
|
+func generateFromText(text string){
|
|
|
+ code, err := qr.Encode(text, qr.L, qr.Auto)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("Something went wrong...")
|
|
|
+ }
|
|
|
+ if text != code.Content() {
|
|
|
+ log.Fatal("data differs")
|
|
|
+ }
|
|
|
+ code, err = barcode.Scale(code, 512, 512)
|
|
|
+ if err != nil {
|
|
|
+ log.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ writePng(text, code)
|
|
|
+}
|
|
|
+
|
|
|
+func writePng(filename string, img image.Image) {
|
|
|
+ file, err := os.Create(filename)
|
|
|
+ if err != nil {
|
|
|
+ log.Fatal(err)
|
|
|
+ }
|
|
|
+ err = png.Encode(file, img)
|
|
|
+ if err != nil {
|
|
|
+ log.Fatal(err)
|
|
|
+ }
|
|
|
+ file.Close()
|
|
|
+}
|