From aabd25ea19efb085d672734109184df60a417a0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Mon, 24 Apr 2023 00:59:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=AE=8C=E6=88=90step1?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/generate.go | 32 ++++ backend/global/analyze.go | 2 +- backend/global/generate.go | 24 ++- backend/global/question.go | 2 +- backend/question.go | 20 +++ frontend/vben/src/api/page/index.ts | 8 + .../vben/src/views/page/genfile/Step1.vue | 163 +++++++++++++++--- frontend/vben/src/views/page/genfile/data.tsx | 146 +++++++++++----- go.mod | 2 +- go.sum | 4 +- 10 files changed, 326 insertions(+), 77 deletions(-) create mode 100644 backend/generate.go diff --git a/backend/generate.go b/backend/generate.go new file mode 100644 index 0000000..b56a9e3 --- /dev/null +++ b/backend/generate.go @@ -0,0 +1,32 @@ +package backend + +import ( + "encoding/json" + "io" + "net/http" + + "github.com/fumiama/paper-manager/backend/global" +) + +func init() { + apimap["/api/genFile"] = &apihandler{"POST", func(w http.ResponseWriter, r *http.Request) { + user := usertokens.Get(r.Header.Get("Authorization")) + if user == nil { + writeresult(w, codeError, nil, errInvalidToken.Error(), typeError) + return + } + conf := global.GenerateConfig{} + defer r.Body.Close() + err := json.NewDecoder(r.Body).Decode(&conf) + if err != nil { + writeresult(w, codeError, nil, err.Error(), typeError) + return + } + docf, err := global.FileDB.GenerateFile(&conf) + if err != nil { + writeresult(w, codeError, nil, err.Error(), typeError) + return + } + _, _ = io.Copy(w, docf) + }} +} diff --git a/backend/global/analyze.go b/backend/global/analyze.go index b9895e8..9d300dd 100644 --- a/backend/global/analyze.go +++ b/backend/global/analyze.go @@ -235,7 +235,7 @@ func (f *FileDatabase) AddFile(lstid int, reg *Regex, istemp bool, progress func m := md5.Sum(sb.Bytes()) que := &Question{ ID: int64(binary.LittleEndian.Uint64(m[:8])), - FileID: file.ID, + ListID: *lst.ID, Major: majorq.Name, Plain: base14.BytesToString(sb.Bytes()), Images: func() []byte { diff --git a/backend/global/generate.go b/backend/global/generate.go index 7d6f193..0c05492 100644 --- a/backend/global/generate.go +++ b/backend/global/generate.go @@ -2,6 +2,7 @@ package global import ( "errors" + "os" "strconv" sql "github.com/FloatTech/sqlite" @@ -77,7 +78,26 @@ func (f *FileDatabase) GenerateFile(config *GenerateConfig) (*docx.Docx, error) if rate > config.RateLimit { return nil, ErrRateLimitExceeded } - // TODO: 写入question到docf + for i, q := range ques { + lst, err := sql.Find[List](&f.db, FileTableFile, "WHERE ID="+strconv.Itoa(q.ListID)) + if err != nil { + return nil, err + } + quesfile, err := os.Open(q.Path) + if err != nil { + return nil, err + } + stat, err := quesfile.Stat() + if err != nil { + return nil, err + } + docq, err := docx.Parse(quesfile, stat.Size()) + if err != nil { + return nil, err + } + docf.AddParagraph().AddText(strconv.Itoa(i+1) + ". (" + lst.Desc + ")") + docf.AppendFile(docq) + } } - return nil, nil + return docf, nil } diff --git a/backend/global/question.go b/backend/global/question.go index 91852aa..0bb5b8a 100644 --- a/backend/global/question.go +++ b/backend/global/question.go @@ -80,7 +80,7 @@ func (f *FileDatabase) DelQuestion(id int64, istemp bool) error { type Question struct { ID int64 // ID is the first 8 bytes of the Plain's md5 - FileID int64 // FileID is fk to File(ID) + ListID int // ListID is fk to List(ID) Major string // Major is sub's major name Path string // Path is the question's docx position Plain string // Plain is the plain text of the question (like markdown format) diff --git a/backend/question.go b/backend/question.go index e5cfe0b..54fc99b 100644 --- a/backend/question.go +++ b/backend/question.go @@ -4,6 +4,7 @@ import ( "container/heap" "encoding/json" "math" + "net/http" "strconv" "github.com/fumiama/paper-manager/backend/global" @@ -95,3 +96,22 @@ func parseFileQuestions(qb []byte, istemp bool) ([]question, []duplication, floa return qs, ds, sum / float64(cnt), nil } + +func init() { + apimap["/api/getMajors"] = &apihandler{"GET", func(w http.ResponseWriter, r *http.Request) { + user := usertokens.Get(r.Header.Get("Authorization")) + if user == nil { + writeresult(w, codeError, nil, errInvalidToken.Error(), typeError) + return + } + majs := global.FileDB.GetMajors() + type majret struct { + Name string + } + majrets := make([]majret, len(majs)) + for i, s := range majs { + majrets[i].Name = s + } + writeresult(w, codeSuccess, &majrets, messageOk, typeSuccess) + }} +} diff --git a/frontend/vben/src/api/page/index.ts b/frontend/vben/src/api/page/index.ts index e15b896..ab3309e 100644 --- a/frontend/vben/src/api/page/index.ts +++ b/frontend/vben/src/api/page/index.ts @@ -10,6 +10,7 @@ enum Api { AnalyzeFile = '/analyzeFile', DlFile = '/dlFile', GetFileStatus = '/getFileStatus', + GetMajors = '/getMajors', } /** @@ -73,3 +74,10 @@ export const getFileBlob = (url: string) => { export const getFileStatus = (id: number) => { return defHttp.get({ url: Api.GetFileStatus, params: { id: id } }) } + +/** + * @description: Get majors + */ +export const getMajors = () => { + return defHttp.get({ url: Api.GetMajors }) +} diff --git a/frontend/vben/src/views/page/genfile/Step1.vue b/frontend/vben/src/views/page/genfile/Step1.vue index cae25e8..e63381f 100644 --- a/frontend/vben/src/views/page/genfile/Step1.vue +++ b/frontend/vben/src/views/page/genfile/Step1.vue @@ -1,48 +1,82 @@