Browse Source

增加数据库操作

master
453530270@qq.com 2 years ago
parent
commit
abc565a3df
  1. 53
      fss/core/baseinfo.go
  2. 45
      fss/core/serverinfo.go
  3. 9
      fss/db/dbconst.go
  4. 100
      fss/db/sqliteDb.go
  5. 27
      fss/go.mod
  6. 71
      fss/go.sum
  7. 2
      fss/main.go
  8. BIN
      fss/ups.db
  9. 72
      fss/util/fsutil.go
  10. 6
      fss/www/index.html
  11. BIN
      fssc/ups.db

53
fss/core/baseinfo.go

@ -0,0 +1,53 @@
package core
import (
"encoding/json"
"fss/db"
"fss/util"
"net/http"
"strings"
)
type Brespone struct {
Status string `json:"status"`
Data []db.StFileInfo `json:"data"` //目录下的文件
}
// 输出数据库中的基础文件的结构和hash
func BfsInfo(w http.ResponseWriter, r *http.Request) {
// 监听的目录通过?p=的方式传入
urlpath := r.URL.Query().Get("p")
// 防止逃逸,造成漏洞
if strings.Contains(urlpath, "../") {
// urlpath = "Lg=="
urlpath = "."
}
// 如果根目录
if urlpath == "" || urlpath == "." {
urlpath = util.Bas64end(".")
}
// 链接数据库
db.Init()
// 获取请求的信息
flists := db.Fquery(urlpath)
// fmt.Printf("stfile :%v\n", flist)
//
bfslist := make([]db.StFileInfo, 0)
//
for _, v := range flists {
bfslist = append(bfslist, v)
}
// fmt.Fprintf(w, "%s:sqlite query ...", r.Host)
response := Brespone{
Status: "success",
Data: bfslist,
}
// 开启跨域
uCorsHadler(w, r)
json.NewEncoder(w).Encode(response)
}

45
fss/core/serverinfo.go

@ -1,12 +1,10 @@
package core
import (
"crypto/sha256"
"encoding/base64"
"encoding/json"
"fmt"
"fss/config"
"io"
"fss/util"
"net/http"
"os"
"path/filepath"
@ -47,7 +45,7 @@ func SerInfo(w http.ResponseWriter, r *http.Request) {
}
// urlpath 进行base64 解码
dsrpath := base64dec(urlpath)
dsrpath := util.Base64dec(urlpath)
// 监听的根目录
realFilePath := filepath.Join(config.G.FilePath, dsrpath)
// 时间目录的情况
@ -83,7 +81,7 @@ func SerInfo(w http.ResponseWriter, r *http.Request) {
} else {
// 计算文件的hash
funame := filepath.Join(realFilePath, v.Name())
fhash := CalacHash(funame)
fhash := util.CalacHash(funame)
// 文件大小
// 获取文件大小(以字节为单位)
sizeInBytes := fileInfo.Size()
@ -126,40 +124,3 @@ func uCorsHadler(w http.ResponseWriter, r *http.Request) {
return
}
}
// base64 encode
// url safe
func bas64end(str string) string {
// bdata:=
return base64.URLEncoding.EncodeToString([]byte(str))
}
// base64 url safe uneconde
func base64dec(bsstr string) string {
dedc, _ := base64.URLEncoding.DecodeString(bsstr)
return string(dedc)
}
// 计算文件的hash
func CalacHash(rfile string) string {
// 获取到真实地址
//
file, err := os.Open(rfile)
if err != nil {
panic(err)
}
defer file.Close()
// initlize hash object
hash := sha256.New()
// write file into hash object
if _, err := io.Copy(hash, file); err != nil {
panic(err)
}
// get hash value
hashBytes := hash.Sum(nil)
//converto to hash string
hastString := fmt.Sprintf("%x", hashBytes)
return hastString
}

9
fss/db/dbconst.go

@ -0,0 +1,9 @@
package db
// 定义数据库中用的模型
type StFileInfo struct {
Id string `json:"id"`
Fpath string `json:"fpath"`
Fhash string `json:"fhash"`
Fname string `json:"fname"`
}

100
fss/db/sqliteDb.go

@ -0,0 +1,100 @@
package db
import (
"fmt"
// 导入包,导入前缀为下划线,则init函数被执行,然后注册驱动。
"github.com/jmoiron/sqlx"
_ "github.com/logoove/sqlite"
)
var db *sqlx.DB
var err error
func Init() {
fmt.Printf("hey,I am initilize function in SqliteDb\n")
//
// Open() 函数指定驱动名称和数据源名称
db, err = sqlx.Open("sqlite", "ups.db")
if err != nil {
fmt.Printf("Database creation failed: %v\n", err)
return
}
// 调用db.Close() 函数,确保关闭数据库并阻止启动新的查询
// defer db.Close()
//
connectDB()
}
// 连接数据库
func connectDB() {
var version string
// QueryRow() 执行查询,返回版本号
err = db.QueryRow("SELECT SQLITE_VERSION()").Scan(&version)
if err != nil {
fmt.Printf("Database creation failed: %v\n", err)
return
}
// 连接成功,打印出"database connected:版本号"
fmt.Printf("Database creation successful: %v\n", version)
}
// 创建数据库表
func CreateTable() {
// 建表语句
sts := `
CREATE TABLE f_info (
id INTEGER PRIMARY KEY NOT NULL,
fname TEXT NOT NULL,
fpath TEXT NOT NULL,
fhash TEXT NOT NULL
);`
// 使用db.Exec() 函数来执行 SQL 语句
_, err = db.Exec(sts)
if err != nil {
fmt.Printf("Failed to create database table: %v\n", err)
return
}
fmt.Printf("Successfully created database table! \n")
}
// 插入数据
func InsertStf(sf StFileInfo) {
// 插入语句
res, err := db.Exec("INSERT INTO f_info(fname, fpath,fhash) VALUES(?,?,?)", sf.Fname, sf.Fpath, sf.Fhash)
if err != nil {
fmt.Printf("Insert data failed: %v\n", err)
return
}
// 获取自增ID
lastInsertId, _ := res.LastInsertId()
fmt.Printf("Successfully inserted data, lastInsertId = %v\n", lastInsertId)
}
// 查询数据
func Fquery(fpbs string) (stlist []StFileInfo) {
// 结果重量集合
stlist = make([]StFileInfo, 0)
// 查询语句
rows, err := db.Query("SELECT fname,fpath,fhash FROM f_info WHERE fpbs = ?", fpbs)
//
if err != nil {
fmt.Printf("Failed to query data: %v\n", err)
return
}
// FOR loop
for rows.Next() {
// var weight float64
var st StFileInfo
err = rows.Scan(&st.Fname, &st.Fpath, &st.Fhash)
if err != nil {
fmt.Printf("Failed to read data: %v\n", err)
continue
}
stlist = append(stlist, st)
}
return stlist
}

27
fss/go.mod

@ -1,3 +1,30 @@
module fss
go 1.22.1
require (
github.com/jmoiron/sqlx v1.4.0
github.com/logoove/sqlite v1.16.1
)
require (
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/ncruces/go-strftime v0.1.9 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
golang.org/x/mod v0.16.0 // indirect
golang.org/x/sys v0.22.0 // indirect
golang.org/x/tools v0.19.0 // indirect
lukechampine.com/uint128 v1.2.0 // indirect
modernc.org/cc/v3 v3.41.0 // indirect
modernc.org/ccgo/v3 v3.17.0 // indirect
modernc.org/libc v1.54.4 // indirect
modernc.org/mathutil v1.6.0 // indirect
modernc.org/memory v1.8.0 // indirect
modernc.org/opt v0.1.3 // indirect
modernc.org/sqlite v1.30.1 // indirect
modernc.org/strutil v1.2.0 // indirect
modernc.org/token v1.1.0 // indirect
)

71
fss/go.sum

@ -0,0 +1,71 @@
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o=
github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/logoove/sqlite v1.16.1 h1:O67OSZ6Fnn1cfW8MT36G58RTAIqMGSDlvXEOirDnYqE=
github.com/logoove/sqlite v1.16.1/go.mod h1:mMaqL4e4znHBmvlMeJzwpVzEVsJ0oD6DAjjblkfdRpw=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic=
golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw=
golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc=
lukechampine.com/uint128 v1.2.0 h1:mBi/5l91vocEN8otkC5bDLhi2KdCticRiwbdB0O+rjI=
lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
modernc.org/cc/v3 v3.41.0 h1:QoR1Sn3YWlmA1T4vLaKZfawdVtSiGx8H+cEojbC7v1Q=
modernc.org/cc/v3 v3.41.0/go.mod h1:Ni4zjJYJ04CDOhG7dn640WGfwBzfE0ecX8TyMB0Fv0Y=
modernc.org/cc/v4 v4.21.4 h1:3Be/Rdo1fpr8GrQ7IVw9OHtplU4gWbb+wNgeoBMmGLQ=
modernc.org/cc/v4 v4.21.4/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ=
modernc.org/ccgo/v3 v3.17.0 h1:o3OmOqx4/OFnl4Vm3G8Bgmqxnvxnh0nbxeT5p/dWChA=
modernc.org/ccgo/v3 v3.17.0/go.mod h1:Sg3fwVpmLvCUTaqEUjiBDAvshIaKDB0RXaf+zgqFu8I=
modernc.org/ccgo/v4 v4.19.2 h1:lwQZgvboKD0jBwdaeVCTouxhxAyN6iawF3STraAal8Y=
modernc.org/ccgo/v4 v4.19.2/go.mod h1:ysS3mxiMV38XGRTTcgo0DQTeTmAO4oCmJl1nX9VFI3s=
modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk=
modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ=
modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE=
modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ=
modernc.org/gc/v2 v2.4.1 h1:9cNzOqPyMJBvrUipmynX0ZohMhcxPtMccYgGOJdOiBw=
modernc.org/gc/v2 v2.4.1/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU=
modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM=
modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM=
modernc.org/libc v1.54.4 h1:eDr4WnANZv+aRBKNCDo4khJbaHpxoTNOxeXqpznSZyY=
modernc.org/libc v1.54.4/go.mod h1:CH8KSvv67UxcGCOLizggw3Zi3yT+sUjLWysK/YeUnqk=
modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4=
modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo=
modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E=
modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU=
modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4=
modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc=
modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss=
modernc.org/sqlite v1.30.1 h1:YFhPVfu2iIgUf9kuA1CR7iiHdcEEsI2i+yjRYHscyxk=
modernc.org/sqlite v1.30.1/go.mod h1:DUmsiWQDaAvU4abhc/N+djlom/L2o8f7gZ95RCvyoLU=
modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA=
modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0=
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=

2
fss/main.go

@ -17,6 +17,8 @@ func startWeb() {
http.Handle("/", fileServer)
//扫描指定的目录
http.HandleFunc("/sc", core.SerInfo)
// 数据库基础信息
http.HandleFunc("/bs", core.BfsInfo)
fmt.Printf("Starting server at port 9099\n")
// 启动HTTP服务器并监听端口 80,如果出现错误,则打印错误信息并退出

BIN
fss/ups.db

Binary file not shown.

72
fss/util/fsutil.go

@ -0,0 +1,72 @@
package util
import (
"crypto/sha256"
"encoding/base64"
"fmt"
"io"
"os"
"path/filepath"
)
// 遍历目录下的文件
// 是否只扫相对路径下
func GetDirFilePaths(dirPath string, relativeOnly bool) ([]string, error) {
var filePaths []string
err := filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if !info.IsDir() {
if relativeOnly {
fileName := filepath.Base(path)
relativePath := filepath.ToSlash(filepath.Join(filepath.Base(dirPath), fileName))
filePaths = append(filePaths, relativePath)
} else {
filePaths = append(filePaths, filepath.ToSlash(path))
}
}
return nil
})
if err != nil {
return nil, err
}
return filePaths, nil
}
// base64 encode
// url safe
func Bas64end(str string) string {
// bdata:=
return base64.URLEncoding.EncodeToString([]byte(str))
}
// base64 url safe uneconde
func Base64dec(bsstr string) string {
dedc, _ := base64.URLEncoding.DecodeString(bsstr)
return string(dedc)
}
// 计算文件的hash
func CalacHash(rfile string) string {
// 获取到真实地址
//
file, err := os.Open(rfile)
if err != nil {
panic(err)
}
defer file.Close()
// initlize hash object
hash := sha256.New()
// write file into hash object
if _, err := io.Copy(hash, file); err != nil {
panic(err)
}
// get hash value
hashBytes := hash.Sum(nil)
//converto to hash string
hastString := fmt.Sprintf("%x", hashBytes)
return hastString
}

6
fss/www/index.html

@ -250,8 +250,8 @@
html += "<span class=\"icon folder-icon\"></span>" + v.fname + "</div>";
} else {
html += "<span class=\"icon file-icon\"></span>" +
"<a hsval='"+v.hash+"'>"+v.fname + "</a>"+
"<span class=\"hsval\">HASH:" + v.hash + "</span></div>";
"<a href=\"javascript:void(0);\" hsval='"+v.hash+"'>"+v.fname + "</a></div>";
}
if (v.isbackup == 1) {
@ -269,8 +269,6 @@
// 客户端监控目录
$(elemnt).parent().find(".sc01").text(res.workdir)
$(elemnt).parent().find(".sc02").text(dbsresp(res.curdir))
// $("#sc01").text(res.workdir);
// $("#sc02").text(dbsresp(res.curdir));
});
}

BIN
fssc/ups.db

Binary file not shown.
Loading…
Cancel
Save