animeic 2 年之前
父節點
當前提交
077c8afa9f

+ 95 - 0
oilseal-train/api/bank.go

@@ -0,0 +1,95 @@
+package api
+
+import (
+	"errors"
+	"oilseal-train/db/model"
+	"oilseal-train/db/repo"
+	"time"
+
+	"github.com/gin-gonic/gin"
+	"go.mongodb.org/mongo-driver/bson"
+	"go.mongodb.org/mongo-driver/bson/primitive"
+)
+
+func Bank(r *GinRouter) {
+	r.POSTJWT("/bank/create", BankAdd)
+	r.GETJWT("/bank/list", BankList)
+	r.POSTJWT("/bank/update", BankEdit)
+	r.POSTJWT("/bank/delete/:id", BankDelete)
+}
+
+func BankAdd(c *gin.Context, apictx *ApiSession) (interface{}, error) {
+	err := IsAdmin(apictx)
+	if err != nil {
+		return nil, err
+	}
+	var form model.Bank
+	err = c.ShouldBindJSON(&form)
+	if err != nil {
+		return nil, errors.New("参数错误")
+	}
+	if form.Name == "" {
+		return nil, errors.New("题库名称不能为空")
+	}
+	if form.State == 0 {
+		form.State = 1
+
+	}
+
+	form.CreateTime = time.Now()
+	form.UpdateTime = time.Now()
+	return repo.RepoAddDoc(apictx.CreateRepoCtx(), repo.CollectionBank, &form)
+}
+
+func BankList(c *gin.Context, apictx *ApiSession) (interface{}, error) {
+	// err := IsAdmin(apictx)
+	// if err != nil {
+	// 	return nil, err
+	// }
+	page, size, query := UtilQueryPageSize(c)
+
+	if _name, ok := query["name"]; ok {
+		query["name"] = bson.M{"$regex": _name.(string)}
+	}
+	return repo.RepoPageSearch(apictx.CreateRepoCtx(), &repo.PageSearchOptions{
+		CollectName: repo.CollectionBank,
+		Page:        page,
+		Size:        size,
+		Query:       query,
+		Project:     []string{"name", "state", "desc", "createTime", "updateTime"},
+		Sort:        bson.M{"_id": -1},
+	})
+}
+
+func BankEdit(c *gin.Context, apictx *ApiSession) (interface{}, error) {
+	// 操作用户为admin
+	err := IsAdmin(apictx)
+	if err != nil {
+		return nil, err
+	}
+	var form model.Bank
+	err = c.ShouldBindJSON(&form)
+	if err != nil {
+		return nil, errors.New("参数错误")
+	}
+	if len(form.Id) != 12 {
+		return nil, errors.New("id不正确")
+	}
+
+	return repo.RepoUpdateSetDoc(apictx.CreateRepoCtx(), repo.CollectionBank, form.Id.Hex(), &form)
+}
+
+// 删除用户
+func BankDelete(c *gin.Context, apictx *ApiSession) (interface{}, error) {
+	// 操作用户为admin
+	err := IsAdmin(apictx)
+	if err != nil {
+		return nil, err
+	}
+	_id := c.Param("id")
+	_, err = primitive.ObjectIDFromHex(_id)
+	if err != nil {
+		return nil, errors.New("id错误")
+	}
+	return repo.RepoDeleteDoc(apictx.CreateRepoCtx(), repo.CollectionBank, _id)
+}

+ 5 - 0
oilseal-train/api/router.go

@@ -13,7 +13,12 @@ func RegRouters(svc *Service) {
 	train.group.Use(Logger())
 	train.GET("/printr", Printr)
 
+	// 用户管理
 	User(train)
+	// 题库管理
+	Bank(train)
+	// 试题管理
+	Test(train)
 
 }
 

+ 123 - 0
oilseal-train/api/test.go

@@ -0,0 +1,123 @@
+package api
+
+import (
+	"errors"
+	"fmt"
+	"oilseal-train/db/model"
+	"oilseal-train/db/repo"
+	"time"
+
+	"github.com/gin-gonic/gin"
+	"go.mongodb.org/mongo-driver/bson"
+	"go.mongodb.org/mongo-driver/bson/primitive"
+)
+
+func Test(r *GinRouter) {
+	r.POSTJWT("/test/create", TestAdd)
+	r.GETJWT("/test/list", TestList)
+	r.POSTJWT("/test/update", TestEdit)
+	r.POSTJWT("/test/delete/:id", TestDelete)
+}
+
+func TestAdd(c *gin.Context, apictx *ApiSession) (interface{}, error) {
+	err := IsAdmin(apictx)
+	if err != nil {
+		return nil, err
+	}
+	var form model.Test
+	err = c.ShouldBindJSON(&form)
+	if err != nil {
+		fmt.Println(err)
+		return nil, errors.New("参数错误")
+	}
+	if len(form.BankId) != 12 {
+		return nil, errors.New("题库Id不正确")
+	}
+	if form.Question == "" {
+		return nil, errors.New("题目不能为空")
+	}
+	if len(form.AnswerItems) < 1 {
+		return nil, errors.New("答题选项不能为空")
+	}
+	if len(form.Answer) < 1 {
+		return nil, errors.New("答案不能为空")
+	}
+	if form.State == 0 {
+		form.State = 1
+
+	}
+	form.CreateTime = time.Now()
+	form.UpdateTime = time.Now()
+	return repo.RepoAddDoc(apictx.CreateRepoCtx(), repo.CollectionTest, &form)
+}
+
+func TestList(c *gin.Context, apictx *ApiSession) (interface{}, error) {
+	// err := IsAdmin(apictx)
+	// if err != nil {
+	// 	return nil, err
+	// }
+	page, size, query := UtilQueryPageSize(c)
+
+	if _question, ok := query["question"]; ok {
+		query["question"] = bson.M{"$regex": _question.(string)}
+	}
+	if _bankId, ok := query["bankId"]; ok {
+		query["bankId"], _ = primitive.ObjectIDFromHex(_bankId.(string))
+	}
+	result, err := repo.RepoPageSearch(apictx.CreateRepoCtx(), &repo.PageSearchOptions{
+		CollectName: repo.CollectionTest,
+		Page:        page,
+		Size:        size,
+		Query:       query,
+	})
+	if len(result.List) == 0 {
+		return result, err
+	}
+
+	// 获取bank信息
+	ctx := apictx.CreateRepoCtx()
+	for _, list := range result.List {
+		bankId := list["bankId"].(primitive.ObjectID)
+		bank := model.Bank{}
+		repo.RepoSeachDoc(ctx, &repo.DocSearchOptions{
+			CollectName: repo.CollectionBank,
+			Query:       repo.Map{"_id": bankId},
+		}, &bank)
+		list["bank"] = bank
+	}
+
+	return result, err
+}
+
+func TestEdit(c *gin.Context, apictx *ApiSession) (interface{}, error) {
+	// 操作用户为admin
+	err := IsAdmin(apictx)
+	if err != nil {
+		return nil, err
+	}
+	var form model.Test
+	err = c.ShouldBindJSON(&form)
+	if err != nil {
+		return nil, errors.New("参数错误")
+	}
+	if len(form.Id) != 12 {
+		return nil, errors.New("id不正确")
+	}
+
+	return repo.RepoUpdateSetDoc(apictx.CreateRepoCtx(), repo.CollectionTest, form.Id.Hex(), &form)
+}
+
+// 删除用户
+func TestDelete(c *gin.Context, apictx *ApiSession) (interface{}, error) {
+	// 操作用户为admin
+	err := IsAdmin(apictx)
+	if err != nil {
+		return nil, err
+	}
+	_id := c.Param("id")
+	_, err = primitive.ObjectIDFromHex(_id)
+	if err != nil {
+		return nil, errors.New("id错误")
+	}
+	return repo.RepoDeleteDoc(apictx.CreateRepoCtx(), repo.CollectionTest, _id)
+}

+ 13 - 0
oilseal-train/api/tmp.json

@@ -0,0 +1,13 @@
+{
+  "_id": "6397fa6b642328e50ebf0c03",
+  "analyze": "CRF没有HMM那样严格的独立性假设条件,因而可以容纳任意的上下文信息。特征设计灵活与ME一样",
+  "answer": [
+    "C"
+  ],
+  "answerItems": {
+    "A": "特征灵活",
+    "B": "可容纳较多上下文信息",
+    "C": "速度快",
+    "D": "全局最优"
+  }
+}

+ 32 - 13
oilseal-train/api/user.go

@@ -5,6 +5,7 @@ import (
 	"fmt"
 	"oilseal-train/db/model"
 	"oilseal-train/db/repo"
+	"oilseal-train/log"
 	"os"
 	"strings"
 	"time"
@@ -87,7 +88,10 @@ func Register(c *gin.Context, apictx *ApiSession) (interface{}, error) {
 		return nil, errors.New("密码为空")
 	}
 	form.Role = "admin"
-	form.State = 1
+	if form.State == 0 {
+		form.State = 1
+
+	}
 	form.Password = UtilMd5(form.Password)
 	form.CreateTime = time.Now()
 	form.UpdateTime = time.Now()
@@ -114,7 +118,10 @@ func UserAdd(c *gin.Context, apictx *ApiSession) (interface{}, error) {
 	if form.Role == "" {
 		return nil, errors.New("角色为空")
 	}
-	form.State = 1
+	if form.State == 0 {
+		form.State = 1
+
+	}
 	form.Password = UtilMd5(form.Password)
 	form.CreateTime = time.Now()
 	form.UpdateTime = time.Now()
@@ -124,9 +131,9 @@ func UserAdd(c *gin.Context, apictx *ApiSession) (interface{}, error) {
 // 用户列表 模糊匹配
 func UserList(c *gin.Context, apictx *ApiSession) (interface{}, error) {
 	// 操作用户为admin
-	if apictx.User.Role != "admin" {
-		return nil, errors.New("当前用户不是管理员")
-	}
+	// if apictx.User.Role != "admin" {
+	// 	return nil, errors.New("当前用户不是管理员")
+	// }
 	page, size, query := UtilQueryPageSize(c)
 	if _name, ok := query["name"]; ok {
 		query["name"] = bson.M{"$regex": _name.(string)}
@@ -329,21 +336,22 @@ func UserImportXls(c *gin.Context, apictx *ApiSession) (interface{}, error) {
 	if err != nil {
 		return nil, err
 	}
-	errors := []error{}
+	errors := []string{}
 	if len(users) > 0 {
 		for index, user := range users {
 			if index == 0 {
 				continue
 			}
-			addUser, err := formatUser(user, index)
+			rowNum := index + 1
+			addUser, err := formatUser(user, rowNum)
 			if err != nil {
-				errors = append(errors, err)
+				errors = append(errors, err.Error())
 				continue
 			}
 			_, err = repo.RepoAddDoc(apictx.CreateRepoCtx(), repo.CollectionUser, addUser)
 			if err != nil {
-				errf := fmt.Errorf("第%d行%s", index, err.Error())
-				errors = append(errors, errf)
+				errors = append(errors, fmt.Sprintf("第%d行错误: %s", rowNum, "保存数据失败"))
+				log.Error(err)
 			}
 
 		}
@@ -353,6 +361,7 @@ func UserImportXls(c *gin.Context, apictx *ApiSession) (interface{}, error) {
 }
 
 func formatUser(u []string, rowNum int) (*model.User, error) {
+	fmt.Println(u)
 	user := &model.User{
 		LoginName: u[0],
 		Name:      u[1],
@@ -361,17 +370,27 @@ func formatUser(u []string, rowNum int) (*model.User, error) {
 	}
 
 	if user.LoginName == "" {
-		return nil, fmt.Errorf("第%d行%s", rowNum, "登录名为空")
+		return nil, fmt.Errorf("第%d行错误: %s", rowNum, "登录名为空")
 	}
 
 	if user.Role == "" {
-		return nil, fmt.Errorf("第%d行%s", rowNum, "角色为空")
+		return nil, fmt.Errorf("第%d行错误: %s", rowNum, "角色为空")
 	}
 	if user.Password == "" {
-		return nil, fmt.Errorf("第%d行%s", rowNum, "角色为空")
+		return nil, fmt.Errorf("第%d行错误: %s", rowNum, "角色为空")
 	}
 	user.State = 1
 	user.CreateTime = time.Now()
 	user.UpdateTime = time.Now()
 	return user, nil
 }
+
+// 是否为admin
+func IsAdmin(apictx *ApiSession) error {
+	// 操作用户为admin
+	if apictx.User.Role != "admin" {
+		return errors.New("当前用户不是管理员")
+	} else {
+		return nil
+	}
+}

+ 17 - 0
oilseal-train/db/model/Bank.go

@@ -0,0 +1,17 @@
+package model
+
+import (
+	"time"
+
+	"go.mongodb.org/mongo-driver/bson/primitive"
+)
+
+// 题库
+type Bank struct {
+	Id         primitive.ObjectID `bson:"_id,omitempty" json:"_id"`
+	Name       string             `bson:"name,omitempty" json:"name,omitempty"`
+	Desc       string             `bson:"desc,omitempty" json:"desc,omitempty"`
+	State      int                `bson:"state,omitempty" json:"state,omitempty"` //-1 禁用 1 正常
+	CreateTime time.Time          `bson:"createTime,omitempty" json:"createTime,omitempty"`
+	UpdateTime time.Time          `bson:"updateTime,omitempty" json:"updateTime,omitempty"`
+}

+ 25 - 0
oilseal-train/db/model/Test.go

@@ -0,0 +1,25 @@
+package model
+
+import (
+	"time"
+
+	"go.mongodb.org/mongo-driver/bson/primitive"
+)
+
+// 试题
+type Test struct {
+	Id       primitive.ObjectID `bson:"_id,omitempty" json:"_id"`
+	BankId   primitive.ObjectID `bson:"bankId,omitempty" json:"bankId"`
+	Question string             `bson:"question,omitempty" json:"question,omitempty"`
+	// {"A":"DDD","B":"DDD","C":"DDD","D":"DDD"}
+	// ["A"]
+	// {"true":"正确","false":"错误"}
+	// ["true"]
+	AnswerItems map[string]string `bson:"answerItems,omitempty" json:"answerItems,omitempty"`
+	Answer      []string          `bson:"answer,omitempty" json:"answer,omitempty"`
+	Analyze     string            `bson:"analyze,omitempty" json:"analyze,omitempty"` // 解析
+	Type        int               `bson:"type,omitempty" json:"type,omitempty"`       // 1 选择题 2 判断题
+	State       int               `bson:"state,omitempty" json:"state,omitempty"`     //-1 禁用 1 正常
+	CreateTime  time.Time         `bson:"createTime,omitempty" json:"createTime,omitempty"`
+	UpdateTime  time.Time         `bson:"updateTime,omitempty" json:"updateTime,omitempty"`
+}

+ 2 - 0
oilseal-train/db/repo/repo.go

@@ -19,6 +19,8 @@ type RepoSession struct {
 
 const (
 	CollectionUser = "users"
+	CollectionBank = "banks"
+	CollectionTest = "tests"
 )
 
 type Map map[string]interface{}