浏览代码

fix: Clean up excess files

chris 2 年之前
父节点
当前提交
ebaaabf157
共有 3 个文件被更改,包括 2 次插入666 次删除
  1. 0 150
      .nunu/coverage.out
  2. 2 2
      Makefile
  3. 0 514
      coverage.html

+ 0 - 150
.nunu/coverage.out

@@ -1,150 +0,0 @@
-mode: set
-github.com/go-nunu/nunu-layout-advanced/internal/handler/handler.go:13.46,17.2 1 1
-github.com/go-nunu/nunu-layout-advanced/internal/handler/handler.go:18.48,20.13 2 1
-github.com/go-nunu/nunu-layout-advanced/internal/handler/handler.go:20.13,22.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/handler/handler.go:23.2,23.46 1 1
-github.com/go-nunu/nunu-layout-advanced/internal/handler/user.go:23.84,28.2 1 1
-github.com/go-nunu/nunu-layout-advanced/internal/handler/user.go:30.50,32.48 2 1
-github.com/go-nunu/nunu-layout-advanced/internal/handler/user.go:32.48,35.3 2 0
-github.com/go-nunu/nunu-layout-advanced/internal/handler/user.go:37.2,37.57 1 1
-github.com/go-nunu/nunu-layout-advanced/internal/handler/user.go:37.57,40.3 2 0
-github.com/go-nunu/nunu-layout-advanced/internal/handler/user.go:42.2,42.30 1 1
-github.com/go-nunu/nunu-layout-advanced/internal/handler/user.go:45.47,47.49 2 1
-github.com/go-nunu/nunu-layout-advanced/internal/handler/user.go:47.49,50.3 2 0
-github.com/go-nunu/nunu-layout-advanced/internal/handler/user.go:52.2,53.16 2 1
-github.com/go-nunu/nunu-layout-advanced/internal/handler/user.go:53.16,56.3 2 0
-github.com/go-nunu/nunu-layout-advanced/internal/handler/user.go:58.2,60.4 1 1
-github.com/go-nunu/nunu-layout-advanced/internal/handler/user.go:63.52,65.18 2 1
-github.com/go-nunu/nunu-layout-advanced/internal/handler/user.go:65.18,68.3 2 0
-github.com/go-nunu/nunu-layout-advanced/internal/handler/user.go:70.2,71.16 2 1
-github.com/go-nunu/nunu-layout-advanced/internal/handler/user.go:71.16,74.3 2 0
-github.com/go-nunu/nunu-layout-advanced/internal/handler/user.go:76.2,76.31 1 1
-github.com/go-nunu/nunu-layout-advanced/internal/handler/user.go:79.55,83.49 3 1
-github.com/go-nunu/nunu-layout-advanced/internal/handler/user.go:83.49,86.3 2 0
-github.com/go-nunu/nunu-layout-advanced/internal/handler/user.go:88.2,88.71 1 1
-github.com/go-nunu/nunu-layout-advanced/internal/handler/user.go:88.71,91.3 2 0
-github.com/go-nunu/nunu-layout-advanced/internal/handler/user.go:93.2,93.30 1 1
-github.com/go-nunu/nunu-layout-advanced/internal/repository/repository.go:20.84,26.2 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/repository.go:28.40,30.16 2 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/repository.go:30.16,31.13 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/repository.go:33.2,33.11 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/repository.go:35.48,46.16 5 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/repository.go:46.16,47.53 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/repository.go:50.2,50.12 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:21.54,25.2 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:26.78,27.48 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:27.48,29.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:30.2,30.12 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:33.78,34.46 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:34.46,36.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:38.2,38.12 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:41.91,43.77 2 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:43.77,46.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:48.2,48.19 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:51.99,53.80 2 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:53.80,54.36 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:54.36,56.4 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:57.3,57.65 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:60.2,60.19 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/service.go:15.81,21.2 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:48.87,53.2 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:55.81,57.89 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:57.89,59.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:61.2,62.16 2 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:62.16,64.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:66.2,67.16 2 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:67.16,69.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:71.2,77.52 2 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:77.52,79.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:81.2,81.12 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:84.85,86.31 2 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:86.31,88.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:90.2,91.16 2 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:91.16,93.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:95.2,96.16 2 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:96.16,98.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:100.2,100.19 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:103.91,105.16 2 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:105.16,107.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:109.2,109.18 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:112.106,114.16 2 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:114.16,116.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:118.2,121.52 3 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:121.52,123.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:125.2,125.12 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:128.89,135.16 3 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:135.16,137.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:139.2,139.19 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/repository.go:20.84,26.2 1 1
-github.com/go-nunu/nunu-layout-advanced/internal/repository/repository.go:28.40,30.16 2 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/repository.go:30.16,31.13 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/repository.go:33.2,33.11 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/repository.go:35.48,46.16 5 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/repository.go:46.16,47.53 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/repository.go:50.2,50.12 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:21.54,25.2 1 1
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:26.78,27.48 1 1
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:27.48,29.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:30.2,30.12 1 1
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:33.78,34.46 1 1
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:34.46,36.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:38.2,38.12 1 1
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:41.91,43.77 2 1
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:43.77,46.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:48.2,48.19 1 1
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:51.99,53.80 2 1
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:53.80,54.36 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:54.36,56.4 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:57.3,57.65 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:60.2,60.19 1 1
-github.com/go-nunu/nunu-layout-advanced/internal/repository/repository.go:20.84,26.2 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/repository.go:28.40,30.16 2 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/repository.go:30.16,31.13 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/repository.go:33.2,33.11 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/repository.go:35.48,46.16 5 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/repository.go:46.16,47.53 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/repository.go:50.2,50.12 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:21.54,25.2 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:26.78,27.48 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:27.48,29.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:30.2,30.12 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:33.78,34.46 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:34.46,36.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:38.2,38.12 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:41.91,43.77 2 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:43.77,46.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:48.2,48.19 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:51.99,53.80 2 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:53.80,54.36 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:54.36,56.4 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:57.3,57.65 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go:60.2,60.19 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/service.go:15.81,21.2 1 1
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:48.87,53.2 1 1
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:55.81,57.89 1 1
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:57.89,59.3 1 1
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:61.2,62.16 2 1
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:62.16,64.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:66.2,67.16 2 1
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:67.16,69.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:71.2,77.52 2 1
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:77.52,79.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:81.2,81.12 1 1
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:84.85,86.31 2 1
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:86.31,88.3 1 1
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:90.2,91.16 2 1
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:91.16,93.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:95.2,96.16 2 1
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:96.16,98.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:100.2,100.19 1 1
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:103.91,105.16 2 1
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:105.16,107.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:109.2,109.18 1 1
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:112.106,114.16 2 1
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:114.16,116.3 1 1
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:118.2,121.52 3 1
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:121.52,123.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:125.2,125.12 1 1
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:128.89,135.16 3 1
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:135.16,137.3 1 0
-github.com/go-nunu/nunu-layout-advanced/internal/service/user.go:139.2,139.19 1 1

+ 2 - 2
Makefile

@@ -10,6 +10,6 @@ mock:
 
 .PHONY: test
 test:
-	go test -coverpkg=./internal/handler,./internal/service,./internal/repository -coverprofile=./.nunu/coverage.out ./test/server/...
-	go tool cover -html=./.nunu/coverage.out -o coverage.html
+	go test -coverpkg=./internal/handler,./internal/service,./internal/repository -coverprofile=./coverage.out ./test/server/...
+	go tool cover -html=./coverage.out -o coverage.html
 

+ 0 - 514
coverage.html

@@ -1,514 +0,0 @@
-
-<!DOCTYPE html>
-<html>
-	<head>
-		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-		<title>handler: Go Coverage Report</title>
-		<style>
-			body {
-				background: black;
-				color: rgb(80, 80, 80);
-			}
-			body, pre, #legend span {
-				font-family: Menlo, monospace;
-				font-weight: bold;
-			}
-			#topbar {
-				background: black;
-				position: fixed;
-				top: 0; left: 0; right: 0;
-				height: 42px;
-				border-bottom: 1px solid rgb(80, 80, 80);
-			}
-			#content {
-				margin-top: 50px;
-			}
-			#nav, #legend {
-				float: left;
-				margin-left: 10px;
-			}
-			#legend {
-				margin-top: 12px;
-			}
-			#nav {
-				margin-top: 10px;
-			}
-			#legend span {
-				margin: 0 5px;
-			}
-			.cov0 { color: rgb(192, 0, 0) }
-.cov1 { color: rgb(128, 128, 128) }
-.cov2 { color: rgb(116, 140, 131) }
-.cov3 { color: rgb(104, 152, 134) }
-.cov4 { color: rgb(92, 164, 137) }
-.cov5 { color: rgb(80, 176, 140) }
-.cov6 { color: rgb(68, 188, 143) }
-.cov7 { color: rgb(56, 200, 146) }
-.cov8 { color: rgb(44, 212, 149) }
-.cov9 { color: rgb(32, 224, 152) }
-.cov10 { color: rgb(20, 236, 155) }
-
-		</style>
-	</head>
-	<body>
-		<div id="topbar">
-			<div id="nav">
-				<select id="files">
-				
-				<option value="file0">github.com/go-nunu/nunu-layout-advanced/internal/handler/handler.go (80.0%)</option>
-				
-				<option value="file1">github.com/go-nunu/nunu-layout-advanced/internal/handler/user.go (55.6%)</option>
-				
-				<option value="file2">github.com/go-nunu/nunu-layout-advanced/internal/repository/repository.go (8.3%)</option>
-				
-				<option value="file3">github.com/go-nunu/nunu-layout-advanced/internal/repository/user.go (64.7%)</option>
-				
-				<option value="file4">github.com/go-nunu/nunu-layout-advanced/internal/service/service.go (100.0%)</option>
-				
-				<option value="file5">github.com/go-nunu/nunu-layout-advanced/internal/service/user.go (80.0%)</option>
-				
-				</select>
-			</div>
-			<div id="legend">
-				<span>not tracked</span>
-			
-				<span class="cov0">not covered</span>
-				<span class="cov8">covered</span>
-			
-			</div>
-		</div>
-		<div id="content">
-		
-		<pre class="file" id="file0" style="display: none">package handler
-
-import (
-        "github.com/gin-gonic/gin"
-        "github.com/go-nunu/nunu-layout-advanced/internal/middleware"
-        "github.com/go-nunu/nunu-layout-advanced/pkg/log"
-)
-
-type Handler struct {
-        logger *log.Logger
-}
-
-func NewHandler(logger *log.Logger) *Handler <span class="cov8" title="1">{
-        return &amp;Handler{
-                logger: logger,
-        }
-}</span>
-func GetUserIdFromCtx(ctx *gin.Context) string <span class="cov8" title="1">{
-        v, exists := ctx.Get("claims")
-        if !exists </span><span class="cov0" title="0">{
-                return ""
-        }</span>
-        <span class="cov8" title="1">return v.(*middleware.MyCustomClaims).UserId</span>
-}
-</pre>
-		
-		<pre class="file" id="file1" style="display: none">package handler
-
-import (
-        "github.com/gin-gonic/gin"
-        "github.com/go-nunu/nunu-layout-advanced/internal/service"
-        "github.com/go-nunu/nunu-layout-advanced/pkg/helper/resp"
-        "github.com/pkg/errors"
-        "net/http"
-)
-
-type UserHandler interface {
-        Register(ctx *gin.Context)
-        Login(ctx *gin.Context)
-        GetProfile(ctx *gin.Context)
-        UpdateProfile(ctx *gin.Context)
-}
-
-type userHandler struct {
-        *Handler
-        userService service.UserService
-}
-
-func NewUserHandler(handler *Handler, userService service.UserService) UserHandler <span class="cov8" title="1">{
-        return &amp;userHandler{
-                Handler:     handler,
-                userService: userService,
-        }
-}</span>
-
-func (h *userHandler) Register(ctx *gin.Context) <span class="cov8" title="1">{
-        req := new(service.RegisterRequest)
-        if err := ctx.ShouldBindJSON(req); err != nil </span><span class="cov0" title="0">{
-                resp.HandleError(ctx, http.StatusBadRequest, 1, errors.Wrap(err, "invalid request").Error(), nil)
-                return
-        }</span>
-
-        <span class="cov8" title="1">if err := h.userService.Register(ctx, req); err != nil </span><span class="cov0" title="0">{
-                resp.HandleError(ctx, http.StatusBadRequest, 1, errors.Wrap(err, "invalid request").Error(), nil)
-                return
-        }</span>
-
-        <span class="cov8" title="1">resp.HandleSuccess(ctx, nil)</span>
-}
-
-func (h *userHandler) Login(ctx *gin.Context) <span class="cov8" title="1">{
-        var req service.LoginRequest
-        if err := ctx.ShouldBindJSON(&amp;req); err != nil </span><span class="cov0" title="0">{
-                resp.HandleError(ctx, http.StatusBadRequest, 1, errors.Wrap(err, "invalid request").Error(), nil)
-                return
-        }</span>
-
-        <span class="cov8" title="1">token, err := h.userService.Login(ctx, &amp;req)
-        if err != nil </span><span class="cov0" title="0">{
-                resp.HandleError(ctx, http.StatusUnauthorized, 1, err.Error(), nil)
-                return
-        }</span>
-
-        <span class="cov8" title="1">resp.HandleSuccess(ctx, gin.H{
-                "accessToken": token,
-        })</span>
-}
-
-func (h *userHandler) GetProfile(ctx *gin.Context) <span class="cov8" title="1">{
-        userId := GetUserIdFromCtx(ctx)
-        if userId == "" </span><span class="cov0" title="0">{
-                resp.HandleError(ctx, http.StatusUnauthorized, 1, "unauthorized", nil)
-                return
-        }</span>
-
-        <span class="cov8" title="1">user, err := h.userService.GetProfile(ctx, userId)
-        if err != nil </span><span class="cov0" title="0">{
-                resp.HandleError(ctx, http.StatusBadRequest, 1, err.Error(), nil)
-                return
-        }</span>
-
-        <span class="cov8" title="1">resp.HandleSuccess(ctx, user)</span>
-}
-
-func (h *userHandler) UpdateProfile(ctx *gin.Context) <span class="cov8" title="1">{
-        userId := GetUserIdFromCtx(ctx)
-
-        var req service.UpdateProfileRequest
-        if err := ctx.ShouldBindJSON(&amp;req); err != nil </span><span class="cov0" title="0">{
-                resp.HandleError(ctx, http.StatusBadRequest, 1, errors.Wrap(err, "invalid request").Error(), nil)
-                return
-        }</span>
-
-        <span class="cov8" title="1">if err := h.userService.UpdateProfile(ctx, userId, &amp;req); err != nil </span><span class="cov0" title="0">{
-                resp.HandleError(ctx, http.StatusBadRequest, 1, err.Error(), nil)
-                return
-        }</span>
-
-        <span class="cov8" title="1">resp.HandleSuccess(ctx, nil)</span>
-}
-</pre>
-		
-		<pre class="file" id="file2" style="display: none">package repository
-
-import (
-        "context"
-        "fmt"
-        "github.com/go-nunu/nunu-layout-advanced/pkg/log"
-        "github.com/redis/go-redis/v9"
-        "github.com/spf13/viper"
-        "gorm.io/driver/mysql"
-        "gorm.io/gorm"
-        "time"
-)
-
-type Repository struct {
-        db     *gorm.DB
-        rdb    *redis.Client
-        logger *log.Logger
-}
-
-func NewRepository(db *gorm.DB, rdb *redis.Client, logger *log.Logger) *Repository <span class="cov8" title="1">{
-        return &amp;Repository{
-                db:     db,
-                rdb:    rdb,
-                logger: logger,
-        }
-}</span>
-
-func NewDB(conf *viper.Viper) *gorm.DB <span class="cov0" title="0">{
-        db, err := gorm.Open(mysql.Open(conf.GetString("data.mysql.user")), &amp;gorm.Config{})
-        if err != nil </span><span class="cov0" title="0">{
-                panic(err)</span>
-        }
-        <span class="cov0" title="0">return db</span>
-}
-func NewRedis(conf *viper.Viper) *redis.Client <span class="cov0" title="0">{
-        rdb := redis.NewClient(&amp;redis.Options{
-                Addr:     conf.GetString("data.redis.addr"),
-                Password: conf.GetString("data.redis.password"),
-                DB:       conf.GetInt("data.redis.db"),
-        })
-
-        ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
-        defer cancel()
-
-        _, err := rdb.Ping(ctx).Result()
-        if err != nil </span><span class="cov0" title="0">{
-                panic(fmt.Sprintf("redis error: %s", err.Error()))</span>
-        }
-
-        <span class="cov0" title="0">return rdb</span>
-}
-</pre>
-		
-		<pre class="file" id="file3" style="display: none">package repository
-
-import (
-        "context"
-        "github.com/go-nunu/nunu-layout-advanced/internal/model"
-        "github.com/pkg/errors"
-        "gorm.io/gorm"
-)
-
-type UserRepository interface {
-        Create(ctx context.Context, user *model.User) error
-        Update(ctx context.Context, user *model.User) error
-        GetByID(ctx context.Context, id string) (*model.User, error)
-        GetByUsername(ctx context.Context, username string) (*model.User, error)
-}
-
-type userRepository struct {
-        *Repository
-}
-
-func NewUserRepository(r *Repository) UserRepository <span class="cov8" title="1">{
-        return &amp;userRepository{
-                Repository: r,
-        }
-}</span>
-func (r *userRepository) Create(ctx context.Context, user *model.User) error <span class="cov8" title="1">{
-        if err := r.db.Create(user).Error; err != nil </span><span class="cov0" title="0">{
-                return errors.Wrap(err, "failed to create user")
-        }</span>
-        <span class="cov8" title="1">return nil</span>
-}
-
-func (r *userRepository) Update(ctx context.Context, user *model.User) error <span class="cov8" title="1">{
-        if err := r.db.Save(user).Error; err != nil </span><span class="cov0" title="0">{
-                return errors.Wrap(err, "failed to update user")
-        }</span>
-
-        <span class="cov8" title="1">return nil</span>
-}
-
-func (r *userRepository) GetByID(ctx context.Context, userId string) (*model.User, error) <span class="cov8" title="1">{
-        var user model.User
-        if err := r.db.Where("user_id = ?", userId).First(&amp;user).Error; err != nil </span><span class="cov0" title="0">{
-
-                return nil, errors.Wrap(err, "failed to get user by ID")
-        }</span>
-
-        <span class="cov8" title="1">return &amp;user, nil</span>
-}
-
-func (r *userRepository) GetByUsername(ctx context.Context, username string) (*model.User, error) <span class="cov8" title="1">{
-        var user model.User
-        if err := r.db.Where("username = ?", username).First(&amp;user).Error; err != nil </span><span class="cov0" title="0">{
-                if err == gorm.ErrRecordNotFound </span><span class="cov0" title="0">{
-                        return nil, nil
-                }</span>
-                <span class="cov0" title="0">return nil, errors.Wrap(err, "failed to get user by username")</span>
-        }
-
-        <span class="cov8" title="1">return &amp;user, nil</span>
-}
-</pre>
-		
-		<pre class="file" id="file4" style="display: none">package service
-
-import (
-        "github.com/go-nunu/nunu-layout-advanced/internal/middleware"
-        "github.com/go-nunu/nunu-layout-advanced/pkg/helper/sid"
-        "github.com/go-nunu/nunu-layout-advanced/pkg/log"
-)
-
-type Service struct {
-        logger *log.Logger
-        sid    *sid.Sid
-        jwt    *middleware.JWT
-}
-
-func NewService(logger *log.Logger, sid *sid.Sid, jwt *middleware.JWT) *Service <span class="cov8" title="1">{
-        return &amp;Service{
-                logger: logger,
-                sid:    sid,
-                jwt:    jwt,
-        }
-}</span>
-</pre>
-		
-		<pre class="file" id="file5" style="display: none">package service
-
-import (
-        "context"
-        "github.com/go-nunu/nunu-layout-advanced/internal/model"
-        "github.com/go-nunu/nunu-layout-advanced/internal/repository"
-        "github.com/golang-jwt/jwt/v5"
-        "github.com/pkg/errors"
-        "golang.org/x/crypto/bcrypt"
-        "time"
-)
-
-type RegisterRequest struct {
-        Username string `json:"username" binding:"required"`
-        Password string `json:"password" binding:"required"`
-        Email    string `json:"email" binding:"required,email"`
-}
-
-type LoginRequest struct {
-        Username string `json:"username" binding:"required"`
-        Password string `json:"password" binding:"required"`
-}
-
-type UpdateProfileRequest struct {
-        Nickname string `json:"nickname"`
-        Email    string `json:"email" binding:"required,email"`
-        Avatar   string `json:"avatar"`
-}
-
-type ChangePasswordRequest struct {
-        OldPassword string `json:"oldPassword" binding:"required"`
-        NewPassword string `json:"newPassword" binding:"required"`
-}
-
-type UserService interface {
-        Register(ctx context.Context, req *RegisterRequest) error
-        Login(ctx context.Context, req *LoginRequest) (string, error)
-        GetProfile(ctx context.Context, userId string) (*model.User, error)
-        UpdateProfile(ctx context.Context, userId string, req *UpdateProfileRequest) error
-        GenerateToken(ctx context.Context, userId string) (string, error)
-}
-
-type userService struct {
-        userRepo repository.UserRepository
-        *Service
-}
-
-func NewUserService(service *Service, userRepo repository.UserRepository) UserService <span class="cov8" title="1">{
-        return &amp;userService{
-                userRepo: userRepo,
-                Service:  service,
-        }
-}</span>
-
-func (s *userService) Register(ctx context.Context, req *RegisterRequest) error <span class="cov8" title="1">{
-        // 检查用户名是否已存在
-        if user, err := s.userRepo.GetByUsername(ctx, req.Username); err == nil &amp;&amp; user != nil </span><span class="cov8" title="1">{
-                return errors.New("username already exists")
-        }</span>
-
-        <span class="cov8" title="1">hashedPassword, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)
-        if err != nil </span><span class="cov0" title="0">{
-                return errors.Wrap(err, "failed to hash password")
-        }</span>
-        // 生成用户ID
-        <span class="cov8" title="1">userId, err := s.sid.GenString()
-        if err != nil </span><span class="cov0" title="0">{
-                return errors.Wrap(err, "failed to generate user ID")
-        }</span>
-        // 创建用户
-        <span class="cov8" title="1">user := &amp;model.User{
-                UserId:   userId,
-                Username: req.Username,
-                Password: string(hashedPassword),
-                Email:    req.Email,
-        }
-        if err = s.userRepo.Create(ctx, user); err != nil </span><span class="cov0" title="0">{
-                return errors.Wrap(err, "failed to create user")
-        }</span>
-
-        <span class="cov8" title="1">return nil</span>
-}
-
-func (s *userService) Login(ctx context.Context, req *LoginRequest) (string, error) <span class="cov8" title="1">{
-        user, err := s.userRepo.GetByUsername(ctx, req.Username)
-        if err != nil || user == nil </span><span class="cov8" title="1">{
-                return "", errors.Wrap(err, "failed to get user by username")
-        }</span>
-
-        <span class="cov8" title="1">err = bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(req.Password))
-        if err != nil </span><span class="cov0" title="0">{
-                return "", errors.Wrap(err, "failed to hash password")
-        }</span>
-        // 生成JWT token
-        <span class="cov8" title="1">token, err := s.GenerateToken(ctx, user.UserId)
-        if err != nil </span><span class="cov0" title="0">{
-                return "", errors.Wrap(err, "failed to generate JWT token")
-        }</span>
-
-        <span class="cov8" title="1">return token, nil</span>
-}
-
-func (s *userService) GetProfile(ctx context.Context, userId string) (*model.User, error) <span class="cov8" title="1">{
-        user, err := s.userRepo.GetByID(ctx, userId)
-        if err != nil </span><span class="cov0" title="0">{
-                return nil, errors.Wrap(err, "failed to get user by ID")
-        }</span>
-
-        <span class="cov8" title="1">return user, nil</span>
-}
-
-func (s *userService) UpdateProfile(ctx context.Context, userId string, req *UpdateProfileRequest) error <span class="cov8" title="1">{
-        user, err := s.userRepo.GetByID(ctx, userId)
-        if err != nil </span><span class="cov8" title="1">{
-                return errors.Wrap(err, "failed to get user by ID")
-        }</span>
-
-        <span class="cov8" title="1">user.Email = req.Email
-        user.Nickname = req.Nickname
-
-        if err = s.userRepo.Update(ctx, user); err != nil </span><span class="cov0" title="0">{
-                return errors.Wrap(err, "failed to update user")
-        }</span>
-
-        <span class="cov8" title="1">return nil</span>
-}
-
-func (s *userService) GenerateToken(ctx context.Context, userId string) (string, error) <span class="cov8" title="1">{
-        // 生成JWT token
-        s.jwt.GenToken(userId, time.Now().Add(time.Hour*24*90))
-        token, err := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
-                "userId": userId,
-                "exp":    time.Now().Add(time.Hour * 24).Unix(),
-        }).SignedString([]byte("secret"))
-        if err != nil </span><span class="cov0" title="0">{
-                return "", errors.Wrap(err, "failed to generate JWT token")
-        }</span>
-
-        <span class="cov8" title="1">return token, nil</span>
-}
-</pre>
-		
-		</div>
-	</body>
-	<script>
-	(function() {
-		var files = document.getElementById('files');
-		var visible;
-		files.addEventListener('change', onChange, false);
-		function select(part) {
-			if (visible)
-				visible.style.display = 'none';
-			visible = document.getElementById(part);
-			if (!visible)
-				return;
-			files.value = part;
-			visible.style.display = 'block';
-			location.hash = part;
-		}
-		function onChange() {
-			select(files.value);
-			window.scrollTo(0, 0);
-		}
-		if (location.hash != "") {
-			select(location.hash.substr(1));
-		}
-		if (!visible) {
-			select("file0");
-		}
-	})();
-	</script>
-</html>