合作页面的内容

This commit is contained in:
李琦
2026-01-16 08:29:57 +08:00
parent df10ec9678
commit e99560ba87
14 changed files with 1474 additions and 57 deletions

144
server/handlers/services.go Normal file
View File

@@ -0,0 +1,144 @@
package handlers
import (
"fmt"
"net/http"
"github.com/gin-gonic/gin"
"github.com/niangaodev/art-code/models"
"github.com/niangaodev/art-code/repositories"
)
// GetTestimonials 获取客户评价
func GetTestimonials(c *gin.Context) {
testimonials, err := repositories.GetTestimonials()
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to fetch testimonials"})
return
}
c.JSON(http.StatusOK, testimonials)
}
// GetPartners 获取合作伙伴
func GetPartners(c *gin.Context) {
partners, err := repositories.GetPartners()
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to fetch partners"})
return
}
c.JSON(http.StatusOK, partners)
}
// AdminCreateTestimonial 创建客户评价
func AdminCreateTestimonial(c *gin.Context) {
var t models.Testimonial
if err := c.ShouldBindJSON(&t); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request"})
return
}
if err := repositories.CreateTestimonial(&t); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to create testimonial"})
return
}
c.JSON(http.StatusOK, gin.H{"message": "Testimonial created successfully"})
}
// AdminUpdateTestimonial 更新客户评价
func AdminUpdateTestimonial(c *gin.Context) {
idStr := c.Param("id")
var id uint
if _, err := fmt.Sscanf(idStr, "%d", &id); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid ID"})
return
}
var t models.Testimonial
if err := c.ShouldBindJSON(&t); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request"})
return
}
t.ID = id
if err := repositories.UpdateTestimonial(&t); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to update testimonial"})
return
}
c.JSON(http.StatusOK, gin.H{"message": "Testimonial updated successfully"})
}
// AdminDeleteTestimonial 删除客户评价
func AdminDeleteTestimonial(c *gin.Context) {
idStr := c.Param("id")
var id uint
if _, err := fmt.Sscanf(idStr, "%d", &id); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid ID"})
return
}
if err := repositories.DeleteTestimonial(id); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to delete testimonial"})
return
}
c.JSON(http.StatusOK, gin.H{"message": "Testimonial deleted successfully"})
}
// AdminCreatePartner 创建合作伙伴
func AdminCreatePartner(c *gin.Context) {
var p models.Partner
if err := c.ShouldBindJSON(&p); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request"})
return
}
if err := repositories.CreatePartner(&p); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to create partner"})
return
}
c.JSON(http.StatusOK, gin.H{"message": "Partner created successfully"})
}
// AdminUpdatePartner 更新合作伙伴
func AdminUpdatePartner(c *gin.Context) {
idStr := c.Param("id")
var id uint
if _, err := fmt.Sscanf(idStr, "%d", &id); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid ID"})
return
}
var p models.Partner
if err := c.ShouldBindJSON(&p); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request"})
return
}
p.ID = id
if err := repositories.UpdatePartner(&p); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to update partner"})
return
}
c.JSON(http.StatusOK, gin.H{"message": "Partner updated successfully"})
}
// AdminDeletePartner 删除合作伙伴
func AdminDeletePartner(c *gin.Context) {
idStr := c.Param("id")
var id uint
if _, err := fmt.Sscanf(idStr, "%d", &id); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid ID"})
return
}
if err := repositories.DeletePartner(id); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to delete partner"})
return
}
c.JSON(http.StatusOK, gin.H{"message": "Partner deleted successfully"})
}

View File

@@ -77,6 +77,10 @@ func main() {
// 关于页面路由
api.GET("/about", handlers.GetAboutProfile)
// 合作页面路由
api.GET("/testimonials", handlers.GetTestimonials)
api.GET("/partners", handlers.GetPartners)
}
// 管理员API路由组
@@ -152,6 +156,16 @@ func main() {
authAdmin.POST("/about", middleware.PermissionMiddleware("settings", "create"), handlers.AdminCreateAboutProfile)
authAdmin.PUT("/about/:id", middleware.PermissionMiddleware("settings", "update"), handlers.AdminUpdateAboutProfile)
authAdmin.DELETE("/about/:id", middleware.PermissionMiddleware("settings", "delete"), handlers.AdminDeleteAboutProfile)
// 客户评价管理 (复用 settings 权限)
authAdmin.POST("/testimonials", middleware.PermissionMiddleware("settings", "create"), handlers.AdminCreateTestimonial)
authAdmin.PUT("/testimonials/:id", middleware.PermissionMiddleware("settings", "update"), handlers.AdminUpdateTestimonial)
authAdmin.DELETE("/testimonials/:id", middleware.PermissionMiddleware("settings", "delete"), handlers.AdminDeleteTestimonial)
// 合作伙伴管理 (复用 settings 权限)
authAdmin.POST("/partners", middleware.PermissionMiddleware("settings", "create"), handlers.AdminCreatePartner)
authAdmin.PUT("/partners/:id", middleware.PermissionMiddleware("settings", "update"), handlers.AdminUpdatePartner)
authAdmin.DELETE("/partners/:id", middleware.PermissionMiddleware("settings", "delete"), handlers.AdminDeletePartner)
}
}

30
server/models/services.go Normal file
View File

@@ -0,0 +1,30 @@
package models
import (
"time"
)
// Testimonial 客户评价模型
type Testimonial struct {
ID uint `json:"id"`
Name string `json:"name"`
Role string `json:"role"`
Content string `json:"content"`
Avatar string `json:"avatar"`
Rating uint8 `json:"rating"`
SortOrder uint `json:"sortOrder"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
}
// Partner 合作伙伴模型
type Partner struct {
ID uint `json:"id"`
Name string `json:"name"`
Logo string `json:"logo"`
Description string `json:"description"`
URL string `json:"url"`
SortOrder uint `json:"sortOrder"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
}

View File

@@ -0,0 +1,183 @@
package repositories
import (
"log"
"github.com/niangaodev/art-code/config"
"github.com/niangaodev/art-code/models"
)
// GetTestimonials 获取所有客户评价
func GetTestimonials() ([]models.Testimonial, error) {
query := "SELECT id, name, role, content, avatar, rating, sort_order, created_at, updated_at FROM testimonials ORDER BY sort_order ASC, created_at DESC"
rows, err := config.DB.Query(query)
if err != nil {
log.Printf("Error querying testimonials: %v", err)
return nil, err
}
defer rows.Close()
var testimonials []models.Testimonial
for rows.Next() {
var t models.Testimonial
if err := rows.Scan(
&t.ID,
&t.Name,
&t.Role,
&t.Content,
&t.Avatar,
&t.Rating,
&t.SortOrder,
&t.CreatedAt,
&t.UpdatedAt,
); err != nil {
log.Printf("Error scanning testimonial: %v", err)
continue
}
testimonials = append(testimonials, t)
}
return testimonials, nil
}
// CreateTestimonial 创建客户评价
func CreateTestimonial(t *models.Testimonial) error {
query := `
INSERT INTO testimonials (name, role, content, avatar, rating, sort_order, created_at, updated_at)
VALUES (?, ?, ?, ?, ?, ?, NOW(), NOW())
`
_, err := config.DB.Exec(
query,
t.Name,
t.Role,
t.Content,
t.Avatar,
t.Rating,
t.SortOrder,
)
if err != nil {
log.Printf("Error creating testimonial: %v", err)
return err
}
return nil
}
// UpdateTestimonial 更新客户评价
func UpdateTestimonial(t *models.Testimonial) error {
query := `
UPDATE testimonials SET name = ?, role = ?, content = ?, avatar = ?, rating = ?, sort_order = ?, updated_at = NOW()
WHERE id = ?
`
_, err := config.DB.Exec(
query,
t.Name,
t.Role,
t.Content,
t.Avatar,
t.Rating,
t.SortOrder,
t.ID,
)
if err != nil {
log.Printf("Error updating testimonial: %v", err)
return err
}
return nil
}
// DeleteTestimonial 删除客户评价
func DeleteTestimonial(id uint) error {
query := "DELETE FROM testimonials WHERE id = ?"
_, err := config.DB.Exec(query, id)
if err != nil {
log.Printf("Error deleting testimonial: %v", err)
return err
}
return nil
}
// GetPartners 获取所有合作伙伴
func GetPartners() ([]models.Partner, error) {
query := "SELECT id, name, logo, description, url, sort_order, created_at, updated_at FROM partners ORDER BY sort_order ASC, created_at DESC"
rows, err := config.DB.Query(query)
if err != nil {
log.Printf("Error querying partners: %v", err)
return nil, err
}
defer rows.Close()
var partners []models.Partner
for rows.Next() {
var p models.Partner
if err := rows.Scan(
&p.ID,
&p.Name,
&p.Logo,
&p.Description,
&p.URL,
&p.SortOrder,
&p.CreatedAt,
&p.UpdatedAt,
); err != nil {
log.Printf("Error scanning partner: %v", err)
continue
}
partners = append(partners, p)
}
return partners, nil
}
// CreatePartner 创建合作伙伴
func CreatePartner(p *models.Partner) error {
query := `
INSERT INTO partners (name, logo, description, url, sort_order, created_at, updated_at)
VALUES (?, ?, ?, ?, ?, NOW(), NOW())
`
_, err := config.DB.Exec(
query,
p.Name,
p.Logo,
p.Description,
p.URL,
p.SortOrder,
)
if err != nil {
log.Printf("Error creating partner: %v", err)
return err
}
return nil
}
// UpdatePartner 更新合作伙伴
func UpdatePartner(p *models.Partner) error {
query := `
UPDATE partners SET name = ?, logo = ?, description = ?, url = ?, sort_order = ?, updated_at = NOW()
WHERE id = ?
`
_, err := config.DB.Exec(
query,
p.Name,
p.Logo,
p.Description,
p.URL,
p.SortOrder,
p.ID,
)
if err != nil {
log.Printf("Error updating partner: %v", err)
return err
}
return nil
}
// DeletePartner 删除合作伙伴
func DeletePartner(id uint) error {
query := "DELETE FROM partners WHERE id = ?"
_, err := config.DB.Exec(query, id)
if err != nil {
log.Printf("Error deleting partner: %v", err)
return err
}
return nil
}

View File

@@ -0,0 +1,35 @@
package main
import (
"io/ioutil"
"log"
"strings"
"github.com/niangaodev/art-code/config"
)
func main() {
config.InitDB()
defer config.CloseDB()
// Read SQL file
content, err := ioutil.ReadFile("scripts/create_services_tables.sql")
if err != nil {
log.Fatalf("Failed to read SQL file: %v", err)
}
requests := strings.Split(string(content), ";")
for _, request := range requests {
request = strings.TrimSpace(request)
if request == "" {
continue
}
_, err := config.DB.Exec(request)
if err != nil {
log.Printf("Error executing query: %s\nError: %v", request, err)
} else {
log.Println("Executed query successfully")
}
}
log.Println("Services tables migration completed.")
}