Commit e65e6399 authored by 李宇怀's avatar 李宇怀
Browse files

完成task C

parent 3b79ce5f
package controller
import (
"fmt"
"go-svc-tpl/api/dto"
"go-svc-tpl/internal/dao"
"go-svc-tpl/internal/dao/model"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
)
const USER_ID_KEY = "qwq"
const LinkTable = "Links"
// >>>>>>>>>>>>>>>>>> Interface >>>>>>>>>>>>>>>>>>
type ILinkController interface { //定义tag link 下的操作
Create(*gin.Context, *dto.LinkCreateReq) (*dto.LinkCreateResp, error)
......@@ -30,26 +36,140 @@ type LinkController struct {
}
// create
// 用gorm创建短链接
// short 如果为空字符串,则自动生成链接
// 如果起止时间为 null 则表示不设置起止时间
func (c *LinkController) Create(ctx *gin.Context, req *dto.LinkCreateReq) (*dto.LinkCreateResp, error) {
return nil, nil
userID := ctx.GetUint(USER_ID_KEY)
newLink := &model.Link{
Short: req.Short,
Comment: req.Comment,
Origin: req.Origin,
StartTime: req.StartTime,
EndTime: req.EndTime,
Active: true,
OwnerID: userID,
}
err := dao.DB(ctx).Create(newLink).Error
if err != nil {
return nil, err
}
var link model.Link
err = dao.DB(ctx).First(&link, "Short = ?", newLink.Short).Error
if err != nil {
if err == gorm.ErrRecordNotFound {
fmt.Println("Short is not duplicate. You can insert.")
}
return nil, err
}
return &dto.LinkCreateResp{
Short: newLink.Short,
Origin: newLink.Origin,
Comment: newLink.Comment,
StartTime: newLink.StartTime,
EndTime: newLink.EndTime,
Active: newLink.Active,
}, nil
}
// delete
func (c *LinkController) Delete(ctx *gin.Context, req *dto.LinkDeleteReq) error {
userID := ctx.GetUint(USER_ID_KEY)
deleteLink := &model.Link{
Short: req.Short,
OwnerID: userID,
}
err := dao.DB(ctx).Delete(&deleteLink).Error
if err != nil {
return err
}
var link model.Link
err = dao.DB(ctx).First(&link, "Short = ?", deleteLink.Short).Error
if err != nil {
if err == gorm.ErrRecordNotFound {
fmt.Println("Short is not duplicate. You can insert.")
}
return err
}
return nil
}
// getinfo
func (c *LinkController) GetInfo(ctx *gin.Context, req *dto.GetLinkInfoReq) (*dto.GetLinkInfoResp, error) {
return nil, nil
userID := ctx.GetUint(USER_ID_KEY)
getinfoLink := &model.Link{
Short: req.Short,
OwnerID: userID,
}
var link model.Link
err := dao.DB(ctx).First(&link, "Short = ?", getinfoLink.Short).Error
if err != nil {
if err == gorm.ErrRecordNotFound {
fmt.Println("Short is not duplicate. You can insert.")
}
return nil, err
}
return &dto.GetLinkInfoResp{
Short: link.Short,
Origin: link.Origin,
Comment: link.Comment,
StartTime: link.StartTime,
EndTime: link.EndTime,
Active: link.Active,
}, nil
}
// update
func (c *LinkController) Update(ctx *gin.Context, req *dto.LinkUpdateReq) error {
userID := ctx.GetUint(USER_ID_KEY)
updateLink := &model.Link{
Short: req.Short,
Origin: req.Origin,
Comment: req.Comment,
StartTime: req.StartTime,
EndTime: req.EndTime,
Active: req.Active,
OwnerID: userID,
}
err := dao.DB(ctx).Updates(&updateLink).Error
if err != nil {
return err
}
var link model.Link
err = dao.DB(ctx).First(&link, "Short = ?", updateLink.Short).Error
if err != nil {
if err == gorm.ErrRecordNotFound {
fmt.Println("Short is not duplicate. You can insert.")
}
return err
}
return nil
}
// getlist
func (c *LinkController) GetList(ctx *gin.Context, req *dto.GetLinkListReq) (*dto.GetLinkListResp, error) {
return nil, nil
var links []dto.ShortLinkModel
var total int64
query := dao.DB(ctx).Model(&dto.ShortLinkModel{})
if req.PageNumber > 0 && req.PageSize > 0 {
offset := (req.PageNumber - 1) * req.PageSize
query = query.Offset(int(offset)).Limit(int(req.PageSize))
}
if result := query.Find(&links); result.Error != nil {
return nil, result.Error
}
query.Count(&total)
resp := &dto.GetLinkListResp{
Links: links,
Total: total,
}
return resp, nil
}
......@@ -2,6 +2,8 @@ package controller
import (
"go-svc-tpl/api/dto"
"go-svc-tpl/internal/dao/model"
"net/http"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
......@@ -24,11 +26,30 @@ type ServerController struct {
db *gorm.DB
}
// 重定向到相应链接
// 当出现问题时,会按标准 response 返回,由前端显示相应页面
func (c *ServerController) Link(ctx *gin.Context, req *dto.ServerLinkReq) error {
//不是很懂这个函数要干什么
shortLink := req.Short
// 在数据库中查找对应的长链接
var link model.Link
if err := c.db.Table(model.LinkTable).Where("short = ?", shortLink).First(&link).Error; err != nil {
if err == gorm.ErrRecordNotFound {
// 如果找不到对应的长链接,返回404错误
ctx.JSON(http.StatusNotFound, gin.H{"error": "Link not found"})
} else {
// 如果发生其他错误,返回500错误
ctx.JSON(http.StatusInternalServerError, gin.H{"error": "Internal server error"})
}
return err
}
// 如果找到了对应的长链接,进行重定向
ctx.Redirect(http.StatusMovedPermanently, link.Origin)
return nil
}
func (c *ServerController) Veri(ctx *gin.Context, req *dto.ServerVeriReq) error {
//no
return nil
}
package controller
import (
"fmt"
"go-svc-tpl/api/dto"
"go-svc-tpl/internal/dao"
"go-svc-tpl/internal/dao/model"
"regexp"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
......@@ -29,37 +33,103 @@ type UserController struct {
// Register
func (c *UserController) Register(ctx *gin.Context, req *dto.UserRegisterReq) error {
userID := ctx.GetUint(USER_ID_KEY)
//验证邮箱格式
emailPattern := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$`
_, err := regexp.MatchString(emailPattern, req.Email)
if err != nil {
fmt.Println("wrong email pattern", err)
return err
}
newUser := &model.User{
ID: userID,
Email: req.Email,
Name: req.Name,
Password: req.Password,
}
err = dao.DB(ctx).Create(newUser).Error
if err != nil {
return err
}
//验证邮箱唯一性
var user model.User
err = dao.DB(ctx).First(&user, "Email = ?", newUser.Email).Error
if err != nil {
if err == gorm.ErrRecordNotFound {
fmt.Println("Email is not duplicate. You can insert.")
}
return err
}
return nil
}
// GetVeri
func (c *UserController) GetVeri(ctx *gin.Context) (*dto.GetVeriResp, error) {
//no
return nil, nil
}
// Login
func (c *UserController) Login(ctx *gin.Context, req *dto.UserLoginReq) error {
//no
return nil
}
// GetInfo
func (c *UserController) GetInfo(ctx *gin.Context) (*dto.GetUserInfoResp, error) {
return nil, nil
userID := ctx.GetUint(USER_ID_KEY)
var user model.User
err := dao.DB(ctx).First(&user, "ID = ?", userID).Error
if err != nil {
return nil, err
}
return &dto.GetUserInfoResp{
ID: user.ID,
Name: user.Name,
Email: user.Email,
}, nil
}
// ModifyInfo
func (c *UserController) ModifyInfo(ctx *gin.Context, req *dto.UserModifyInfoReq) error {
userID := ctx.GetUint(USER_ID_KEY)
//验证邮箱格式
emailPattern := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$`
_, err := regexp.MatchString(emailPattern, req.Email)
if err != nil {
fmt.Println("wrong email pattern", err)
return err
}
newUser := &model.User{
ID: userID,
Email: req.Email,
Name: req.Name,
}
err = dao.DB(ctx).Updates(&newUser).Error
if err != nil {
return err
}
return nil
}
// ModifyPwd
func (c *UserController) ModifyPwd(ctx *gin.Context, req *dto.UserModifyPwdReq) error {
userID := ctx.GetUint(USER_ID_KEY)
var user model.User
err := dao.DB(ctx).First(&user, "ID = ?", userID).Error
if err != nil {
return err
}
if user.Password != req.OldPwd {
fmt.Println("wrong password")
}
newUser := &model.User{
Password: req.NewPwd,
}
err = dao.DB(ctx).Updates(&newUser).Error
if err != nil {
return err
}
return nil
}
package model
import "time"
import (
"gopkg.in/guregu/null.v4"
)
const LinkTable = "Links"
type Link struct {
ID uint `json:"id"` // 链接ID
Title string `json:"title"` // 链接标题
URL string `json:"url"` // 链接URL
OwnerID uint `json:"owner_id"` // 拥有者ID
CreatedAt time.Time `json:"created_at"` // 创建时间
UpdatedAt time.Time `json:"updated_at"` // 更新时间
ID uint `json:"ID"` //ID
Active bool `json:"active"`
Comment string `json:"comment"`
EndTime null.Time `json:"end_time"`
Origin string `json:"origin"`
Short string `json:"short"`
StartTime null.Time `json:"start_time"`
OwnerID uint `json:"owner_id"`
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment