0xJacky 3 éve
szülő
commit
27c4b82d54

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
frontend/dist/index.html


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
frontend/dist/js/chunk-2b94df79-legacy.2bf29671.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
frontend/dist/js/chunk-2b94df79.2bf29671.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
frontend/dist/js/chunk-5f8bd6de-legacy.b088830d.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
frontend/dist/js/chunk-5f8bd6de.b088830d.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
frontend/dist/js/chunk-62217c82-legacy.cc165e2d.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
frontend/dist/js/chunk-62217c82.cc165e2d.js


+ 1 - 1
frontend/dist/js/chunk-96068e84-legacy.ce69e34f.js → frontend/dist/js/chunk-96068e84-legacy.05f16d69.js

@@ -1 +1 @@
-(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-96068e84"],{"0d92":function(e,t,a){"use strict";a("e6a6")},"7c22":function(e,t,a){var n=a("24fb");t=n(!1),t.push([e.i,".egg[data-v-0db462a3]{padding:10px 0}.ant-btn[data-v-0db462a3]{margin:10px 10px 0 0}",""]),e.exports=t},e6a6:function(e,t,a){var n=a("7c22");n.__esModule&&(n=n.default),"string"===typeof n&&(n=[[e.i,n,""]]),n.locals&&(e.exports=n.locals);var r=a("499e").default;r("1fb1813a",n,!0,{sourceMap:!1,shadowMode:!1})},f820:function(e,t,a){"use strict";a.r(t);var n=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("a-card",[a("h2",[e._v("Nginx UI")]),a("p",[e._v("Yet another WebUI for Nginx")]),a("p",[e._v("Version: "+e._s(e.version)+" ("+e._s(e.build_id)+")")]),a("h3",[e._v("项目组")]),a("p",[e._v("Designer:"),a("a",{attrs:{href:"https://jackyu.cn/"}},[e._v("@0xJacky")])]),a("h3",[e._v("技术栈")]),a("p",[e._v("Go")]),a("p",[e._v("Gin")]),a("p",[e._v("Vue")]),a("p",[e._v("Websocket")]),a("h3",[e._v("开源协议")]),a("p",[e._v("GNU General Public License v2.0")]),a("p",[e._v("Copyright © 2020 - "+e._s(e.this_year)+" 0xJacky ")])])},r=[],s=a("1da1"),i=(a("96cf"),{name:"About",data:function(){var e,t=new Date;return{this_year:t.getFullYear(),version:"1.0.0",build_id:null!==(e="15")&&void 0!==e?e:"开发模式",api_root:"/api"}},methods:{changeUserPower:function(e){var t=this;return Object(s["a"])(regeneratorRuntime.mark((function a(){return regeneratorRuntime.wrap((function(a){while(1)switch(a.prev=a.next){case 0:return a.next=2,t.$store.dispatch("update_mock_user",{power:e});case 2:return a.next=4,t.$api.user.info();case 4:return a.next=6,t.$message.success("修改成功");case 6:case"end":return a.stop()}}),a)})))()}}}),o=i,c=(a("0d92"),a("2877")),u=Object(c["a"])(o,n,r,!1,null,"0db462a3",null);t["default"]=u.exports}}]);
+(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-96068e84"],{"0d92":function(e,t,a){"use strict";a("e6a6")},"7c22":function(e,t,a){var n=a("24fb");t=n(!1),t.push([e.i,".egg[data-v-0db462a3]{padding:10px 0}.ant-btn[data-v-0db462a3]{margin:10px 10px 0 0}",""]),e.exports=t},e6a6:function(e,t,a){var n=a("7c22");n.__esModule&&(n=n.default),"string"===typeof n&&(n=[[e.i,n,""]]),n.locals&&(e.exports=n.locals);var r=a("499e").default;r("1fb1813a",n,!0,{sourceMap:!1,shadowMode:!1})},f820:function(e,t,a){"use strict";a.r(t);var n=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("a-card",[a("h2",[e._v("Nginx UI")]),a("p",[e._v("Yet another WebUI for Nginx")]),a("p",[e._v("Version: "+e._s(e.version)+" ("+e._s(e.build_id)+")")]),a("h3",[e._v("项目组")]),a("p",[e._v("Designer:"),a("a",{attrs:{href:"https://jackyu.cn/"}},[e._v("@0xJacky")])]),a("h3",[e._v("技术栈")]),a("p",[e._v("Go")]),a("p",[e._v("Gin")]),a("p",[e._v("Vue")]),a("p",[e._v("Websocket")]),a("h3",[e._v("开源协议")]),a("p",[e._v("GNU General Public License v2.0")]),a("p",[e._v("Copyright © 2020 - "+e._s(e.this_year)+" 0xJacky ")])])},r=[],s=a("1da1"),i=(a("96cf"),{name:"About",data:function(){var e,t=new Date;return{this_year:t.getFullYear(),version:"1.0.0",build_id:null!==(e="16")&&void 0!==e?e:"开发模式",api_root:"/api"}},methods:{changeUserPower:function(e){var t=this;return Object(s["a"])(regeneratorRuntime.mark((function a(){return regeneratorRuntime.wrap((function(a){while(1)switch(a.prev=a.next){case 0:return a.next=2,t.$store.dispatch("update_mock_user",{power:e});case 2:return a.next=4,t.$api.user.info();case 4:return a.next=6,t.$message.success("修改成功");case 6:case"end":return a.stop()}}),a)})))()}}}),o=i,c=(a("0d92"),a("2877")),u=Object(c["a"])(o,n,r,!1,null,"0db462a3",null);t["default"]=u.exports}}]);

+ 1 - 1
frontend/dist/js/chunk-96068e84.ce69e34f.js → frontend/dist/js/chunk-96068e84.05f16d69.js

@@ -1 +1 @@
-(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-96068e84"],{"0d92":function(e,t,a){"use strict";a("e6a6")},"7c22":function(e,t,a){var n=a("24fb");t=n(!1),t.push([e.i,".egg[data-v-0db462a3]{padding:10px 0}.ant-btn[data-v-0db462a3]{margin:10px 10px 0 0}",""]),e.exports=t},e6a6:function(e,t,a){var n=a("7c22");n.__esModule&&(n=n.default),"string"===typeof n&&(n=[[e.i,n,""]]),n.locals&&(e.exports=n.locals);var r=a("499e").default;r("1fb1813a",n,!0,{sourceMap:!1,shadowMode:!1})},f820:function(e,t,a){"use strict";a.r(t);var n=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("a-card",[a("h2",[e._v("Nginx UI")]),a("p",[e._v("Yet another WebUI for Nginx")]),a("p",[e._v("Version: "+e._s(e.version)+" ("+e._s(e.build_id)+")")]),a("h3",[e._v("项目组")]),a("p",[e._v("Designer:"),a("a",{attrs:{href:"https://jackyu.cn/"}},[e._v("@0xJacky")])]),a("h3",[e._v("技术栈")]),a("p",[e._v("Go")]),a("p",[e._v("Gin")]),a("p",[e._v("Vue")]),a("p",[e._v("Websocket")]),a("h3",[e._v("开源协议")]),a("p",[e._v("GNU General Public License v2.0")]),a("p",[e._v("Copyright © 2020 - "+e._s(e.this_year)+" 0xJacky ")])])},r=[],s=a("1da1"),i=(a("96cf"),{name:"About",data:function(){var e,t=new Date;return{this_year:t.getFullYear(),version:"1.0.0",build_id:null!==(e="15")&&void 0!==e?e:"开发模式",api_root:"/api"}},methods:{changeUserPower:function(e){var t=this;return Object(s["a"])(regeneratorRuntime.mark((function a(){return regeneratorRuntime.wrap((function(a){while(1)switch(a.prev=a.next){case 0:return a.next=2,t.$store.dispatch("update_mock_user",{power:e});case 2:return a.next=4,t.$api.user.info();case 4:return a.next=6,t.$message.success("修改成功");case 6:case"end":return a.stop()}}),a)})))()}}}),o=i,c=(a("0d92"),a("2877")),u=Object(c["a"])(o,n,r,!1,null,"0db462a3",null);t["default"]=u.exports}}]);
+(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-96068e84"],{"0d92":function(e,t,a){"use strict";a("e6a6")},"7c22":function(e,t,a){var n=a("24fb");t=n(!1),t.push([e.i,".egg[data-v-0db462a3]{padding:10px 0}.ant-btn[data-v-0db462a3]{margin:10px 10px 0 0}",""]),e.exports=t},e6a6:function(e,t,a){var n=a("7c22");n.__esModule&&(n=n.default),"string"===typeof n&&(n=[[e.i,n,""]]),n.locals&&(e.exports=n.locals);var r=a("499e").default;r("1fb1813a",n,!0,{sourceMap:!1,shadowMode:!1})},f820:function(e,t,a){"use strict";a.r(t);var n=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("a-card",[a("h2",[e._v("Nginx UI")]),a("p",[e._v("Yet another WebUI for Nginx")]),a("p",[e._v("Version: "+e._s(e.version)+" ("+e._s(e.build_id)+")")]),a("h3",[e._v("项目组")]),a("p",[e._v("Designer:"),a("a",{attrs:{href:"https://jackyu.cn/"}},[e._v("@0xJacky")])]),a("h3",[e._v("技术栈")]),a("p",[e._v("Go")]),a("p",[e._v("Gin")]),a("p",[e._v("Vue")]),a("p",[e._v("Websocket")]),a("h3",[e._v("开源协议")]),a("p",[e._v("GNU General Public License v2.0")]),a("p",[e._v("Copyright © 2020 - "+e._s(e.this_year)+" 0xJacky ")])])},r=[],s=a("1da1"),i=(a("96cf"),{name:"About",data:function(){var e,t=new Date;return{this_year:t.getFullYear(),version:"1.0.0",build_id:null!==(e="16")&&void 0!==e?e:"开发模式",api_root:"/api"}},methods:{changeUserPower:function(e){var t=this;return Object(s["a"])(regeneratorRuntime.mark((function a(){return regeneratorRuntime.wrap((function(a){while(1)switch(a.prev=a.next){case 0:return a.next=2,t.$store.dispatch("update_mock_user",{power:e});case 2:return a.next=4,t.$api.user.info();case 4:return a.next=6,t.$message.success("修改成功");case 6:case"end":return a.stop()}}),a)})))()}}}),o=i,c=(a("0d92"),a("2877")),u=Object(c["a"])(o,n,r,!1,null,"0db462a3",null);t["default"]=u.exports}}]);

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
frontend/dist/js/chunk-vendors-legacy.b74315d6.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
frontend/dist/js/chunk-vendors.b74315d6.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
frontend/dist/js/index-legacy.e8aba462.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
frontend/dist/js/index.fa8b2c24.js


+ 1 - 1
frontend/dist/version.json

@@ -1 +1 @@
-{"version":"1.0.0","build_id":11,"total_build":15}
+{"version":"1.0.0","build_id":12,"total_build":16}

+ 14 - 6
frontend/src/views/domain_edit/DomainEdit.vue

@@ -3,7 +3,7 @@
         <a-collapse :bordered="false" default-active-key="1">
             <a-collapse-panel key="1" :header="name ? '编辑站点:' + name : '添加站点'">
                 <p>您的配置文件中应当有对应的字段时,下列表单中的设置才能生效,配置文件名称创建后不可修改。</p>
-                <std-data-entry :data-list="columns" v-model="config" @change_support_ssl="change_support_ssl"/>
+                <std-data-entry :data-list="columns" v-model="config" />
                 <cert-info :domain="name" ref="cert-info" v-if="name"/>
                 <br/>
                 <a-space>
@@ -53,7 +53,8 @@ export default {
                 support_ssl: false
             },
             configText: "",
-            ws: null
+            ws: null,
+            ok: false
         }
     },
     watch: {
@@ -65,6 +66,9 @@ export default {
                 this.unparse()
             },
             deep: true
+        },
+        'config.support_ssl'() {
+            if (this.ok) this.change_support_ssl()
         }
     },
     created() {
@@ -80,7 +84,9 @@ export default {
             if (this.name) {
                 this.$api.domain.get(this.name).then(r => {
                     this.configText = r.config
-                    this.parse(r)
+                    this.parse(r).then(()=>{
+                        this.ok = true
+                    })
                 }).catch(r => {
                     console.log(r)
                     this.$message.error("服务器错误")
@@ -99,7 +105,7 @@ export default {
                 this.get_template()
             }
         },
-        parse(r) {
+        async parse(r) {
             const text = r.config
             const reg = {
                 http_listen_port: /listen[\s](.*);/i,
@@ -126,7 +132,7 @@ export default {
                 this.config.support_ssl = true
             }
         },
-        unparse() {
+        async unparse() {
             let text = this.configText
             // http_listen_port: /listen (.*);/i,
             // https_listen_port: /listen (.*) ssl/i,
@@ -182,7 +188,9 @@ export default {
             this.$api.domain.save(this.name ? this.name : this.config.name, {content: this.configText}).then(r => {
                 this.parse(r)
                 this.$message.success("保存成功")
-                this.$refs["cert-info"].get()
+                if (this.name) {
+                    this.$refs["cert-info"].get()
+                }
             }).catch(r => {
                 console.log(r)
                 this.$message.error("保存错误" + r.message !== undefined ? " " + r.message : null, 10)

+ 1 - 1
frontend/version.json

@@ -1 +1 @@
-{"version":"1.0.0","build_id":11,"total_build":15}
+{"version":"1.0.0","build_id":12,"total_build":16}

+ 1 - 1
frontend/vue.config.js

@@ -18,7 +18,7 @@ module.exports = {
         },
     },
     devServer: {
-        proxy: 'https://nginx.jackyu.cn/api'
+        proxy: 'https://hangzhou.jackyu.cn/api'
     },
 
     productionSourceMap: false,

+ 62 - 23
server/api/api.go

@@ -1,15 +1,42 @@
 package api
 
 import (
-	"github.com/gin-gonic/gin"
-	"log"
+    "bytes"
+    "encoding/json"
+    "github.com/gin-gonic/gin"
+    "github.com/gin-gonic/gin/binding"
+    "github.com/go-playground/locales/zh"
+    "log"
 	"net/http"
+    "regexp"
     "strings"
 
     ut "github.com/go-playground/universal-translator"
-	val "github.com/go-playground/validator/v10"
+    val "github.com/go-playground/validator/v10"
+    zhTranslations "github.com/go-playground/validator/v10/translations/zh"
 )
 
+type JsonSnakeCase struct {
+    Value interface{}
+}
+
+func (c JsonSnakeCase) MarshalJSON() ([]byte, error) {
+    // Regexp definitions
+    var keyMatchRegex = regexp.MustCompile(`\"(\w+)\":`)
+    var wordBarrierRegex = regexp.MustCompile(`(\w)([A-Z])`)
+    marshalled, err := json.Marshal(c.Value)
+    converted := keyMatchRegex.ReplaceAllFunc(
+        marshalled,
+        func(match []byte) []byte {
+            return bytes.ToLower(wordBarrierRegex.ReplaceAll(
+                match,
+                []byte(`${1}_${2}`),
+            ))
+        },
+    )
+    return converted, err
+}
+
 func ErrorHandler(c *gin.Context, err error) {
 	log.Println(err)
 	c.JSON(http.StatusInternalServerError, gin.H{
@@ -22,29 +49,41 @@ type ValidError struct {
 	Message string
 }
 
-type ValidErrors gin.H
-
-func BindAndValid(c *gin.Context, v interface{}) (bool, ValidErrors) {
-	errs := make(ValidErrors)
-	err := c.ShouldBind(v)
-	if err != nil {
+func BindAndValid(c *gin.Context, v interface{}) bool {
+    errs := make(map[string]string)
+    err := c.ShouldBindJSON(v)
+    if err != nil {
         log.Println(err)
-		v := c.Value("trans")
-		trans, _ := v.(ut.Translator)
+        uni := ut.New(zh.New())
+        trans, _ := uni.GetTranslator("zh")
+        v, ok := binding.Validator.Engine().(*val.Validate)
+
+        if ok {
+            _ = zhTranslations.RegisterDefaultTranslations(v, trans)
+        }
+
+        verrs, ok := err.(val.ValidationErrors)
+        if !ok {
+            log.Println(verrs)
+            c.JSON(http.StatusNotAcceptable, gin.H{
+                "message": "请求参数错误",
+                "code":    http.StatusNotAcceptable,
+            })
+            return false
+        }
 
-		verrs, ok := err.(val.ValidationErrors)
-		if !ok {
-			return false, errs
-		}
+        for key, value := range verrs.Translate(trans) {
+            errs[key[strings.Index(key, ".")+1:]] = value
+        }
 
-		for key, value := range verrs.Translate(trans) {
-		    k := strings.Split(key, ".")
-		    sub := strings.ToLower(k[1])
-			errs[sub] = value
-		}
+        c.JSON(http.StatusNotAcceptable, gin.H{
+            "errors":  JsonSnakeCase{errs},
+            "message": "请求参数错误",
+            "code":    http.StatusNotAcceptable,
+        })
 
-		return false, errs
-	}
+        return false
+    }
 
-	return true, nil
+    return true
 }

+ 1 - 4
server/api/auth.go

@@ -15,11 +15,8 @@ type LoginUser struct {
 
 func Login(c *gin.Context) {
     var user LoginUser
-    ok, verrs := BindAndValid(c, &user)
+    ok := BindAndValid(c, &user)
     if !ok {
-        c.JSON(http.StatusNotAcceptable, gin.H{
-            "errors": verrs,
-        })
         return
     }
 

+ 0 - 24
server/api/cert.go

@@ -15,30 +15,6 @@ import (
 func CertInfo(c *gin.Context) {
 	domain := c.Param("domain")
 
-	/*sslCertificatePath := tool.GetNginxConfPath("ssl/" + domain +"/fullchain.cer")
-
-	  content, err := ioutil.ReadFile(sslCertificatePath)
-
-	  if err != nil {
-	      ErrorHandler(c, err)
-	      return
-	  }
-
-	  certDERBlock, _ := pem.Decode(content)
-
-	  if certDERBlock == nil {
-	      ErrorHandler(c, errors.New("pem decode error"))
-	      return
-	  }
-
-	  var key *x509.Certificate
-	  key, err = x509.ParseCertificate(certDERBlock.Bytes)
-
-	  if err != nil {
-	      ErrorHandler(c, err)
-	      return
-	  }*/
-
 	ts := &http.Transport{
 		TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
 	}

+ 1 - 4
server/api/install.go

@@ -40,11 +40,8 @@ func InstallNginxUI(c *gin.Context) {
         return
     }
     var json InstallJson
-    ok, verrs := BindAndValid(c, &json)
+    ok := BindAndValid(c, &json)
     if !ok {
-        c.JSON(http.StatusNotAcceptable, gin.H{
-            "errors": verrs,
-        })
         return
     }
 

+ 3 - 8
server/api/user.go

@@ -45,11 +45,8 @@ type UserJson struct {
 
 func AddUser(c *gin.Context) {
 	var json UserJson
-	ok, verrs := BindAndValid(c, &json)
+	ok := BindAndValid(c, &json)
 	if !ok {
-		c.JSON(http.StatusNotAcceptable, gin.H{
-			"errors": verrs,
-		})
         return
 	}
 	curd := model.NewCurd(&model.Auth{})
@@ -79,11 +76,9 @@ func AddUser(c *gin.Context) {
 
 func EditUser(c *gin.Context) {
 	var json UserJson
-	ok, verrs := BindAndValid(c, &json)
+	ok := BindAndValid(c, &json)
 	if !ok {
-		c.JSON(http.StatusNotAcceptable, gin.H{
-			"errors": verrs,
-		})
+        return
 	}
 	curd := model.NewCurd(&model.Auth{})
 

Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott