From 679ce82cafc2914f5ec8462b8d0029116c6662ed Mon Sep 17 00:00:00 2001 From: John Date: Thu, 11 Jan 2018 23:28:18 +0800 Subject: [PATCH] README update --- README.MD | 12 ++++++++++++ geg/frame/mvc/controller/demo/upload.go | 4 +--- gf-logo.png | Bin 0 -> 24573 bytes 3 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 gf-logo.png diff --git a/README.MD b/README.MD index b944590e4..3c2b36f46 100644 --- a/README.MD +++ b/README.MD @@ -1,3 +1,15 @@ +
+![GoFrame](./gf-logo.png) +
+ +## 介绍 +gf(Go Frame)是一款为Web服务及网络服务开发设计的,模块化、低耦合、轻量级的Go语言开发框架。 +实现了通用的HTTP/TCP/UDP Server,并提供了Web服务开发的系列核心组件, +包括:MVC、Cookie、Session、模板引擎、路由控制、配置管理、数据校验、数据库操作等等, +并且提供了数十个实用开发模块,包括:缓存模块、日志模块、JSON模块、命令行模块、环境变量模块、并发安全容器等等。 + +gf是开源的,免费的,基于MIT协议进行分发,开源项目地址:https://gitee.com/johng/gf + ## 安装 ``` go get -u gitee.com/johng/gf diff --git a/geg/frame/mvc/controller/demo/upload.go b/geg/frame/mvc/controller/demo/upload.go index e2c988e5b..0432d4cb7 100644 --- a/geg/frame/mvc/controller/demo/upload.go +++ b/geg/frame/mvc/controller/demo/upload.go @@ -1,7 +1,6 @@ package demo import ( - "fmt" "gitee.com/johng/gf/g/os/gfile" "gitee.com/johng/gf/g/net/ghttp" ) @@ -13,7 +12,7 @@ func Upload(r *ghttp.Request) { buffer := make([]byte, h.Size) f.Read(buffer) gfile.PutBinContents("/tmp/" + fname, buffer) - r.Response.WriteString(fmt.Sprintf("%s upload success, input value:%s", fname, r.GetPostString("name"))) + r.Response.WriteString(fname + " uploaded successly")) } else { r.Response.WriteString(e.Error()) } @@ -27,7 +26,6 @@ func UploadShow(r *ghttp.Request) {
-
diff --git a/gf-logo.png b/gf-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ed91f2de597c87ce7a59d1a0e9b1f3e54f933b25 GIT binary patch literal 24573 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

79GzBmd z0@TrSj#8Kjpd|LbJd^QCq6@(-o3rgpJzTA-%s~5KpN~(BT&~!;fbK*OABU7Dn1i17 zPc>~H{&nf7S3M8MAnU5ob{*5}1es1)$}iU)w-4USic)d0#~&)`3boKG4z!(fbI;Cx z-!wXn)_+&f7imrcs?td-1_vet3l2I?JHM<`soYTMMce~&t7}-nuveC$YgKyJKl zkJJn0hVYzYI3YL4}49VyfVPOm|(nv5T5&;N^aQiN}!=ND|b?-brV3pIq7goI)=`1vtcSs(^9 zlNmYx-j>XdFu6r``X=_?Q*C4_iHO@wI0dAwd+RFZkXp6NL;=B%v$Jq1kZgd}!`n>s z1Q*#c<27lhU}!Z-ER!vuFbOp`Yx0VsxtNi5Vn!<0i)+1}?KCtWRDm!5c+Wsz|DmUX z8AQK8Ge0)>Y+4C7OrkLZHG+0gc9J0~NI2#KpUpyVTv4K@A{l5LXPcsYb4stS2jxOq zftw&TqVM{sHo&@_rms6Le=ZXu$fW81E>tUjA3aEd@!()_VMO`YlUA~puOO<22H}{# z(>SwV+25J?*SBOMZBPP>>_#6_3*zVL!kJ%=zx-HS0Ifa`O%7y^i?x)F*#EnSOchtr z7@DO4&EssP!Qzdn09+#~7aCkKJq3Qt-}!bqXl4Ozznjle(iIMWVA3O{*u%UKwZ6K{D;5rO_B>~_6${R) z&Xq7uBYTX2Ka-MnE_Y^LO;i3bNgtzz*tmHba&Sa{m*`c|!joB@+np%gqDwoG!*1MK zJ8kb}dz7cG(RJ9wtwdk{eeCa+d!0HM;lIP)qPu2(`eS`MJc2^5ZW(6>@ZVldyr5{g zP!!Fnbv%jnC*79Xoebti=oK61WTVnqw?hlVUEhPgrEpBh_nxCQezZItgr{Q3W5`2y@%0b3YbI5%Im#(T}>J`EapmbXhfpdbp`#GhvURQJ3 zTuDB#s6nR-chYL4rleZIk7RQaYzfPf*b^(~&&DtpM3%d=vyfaDhjS|#j?$rPWfQDS zV6)Fq?6#u~r-De0gf^Uq`KJ1va~Iz|a{BQaJ#e5&=Ol+2=sM#g9jCNHNN9T#w1CJ7S&hced<*+W;!q8vL)H%GB^g#s-@GWtFSa z>Vkx7`le!X3?%1VJ9x* zL;<=1-GQQCS6gpswcFp8COKV}EWU+NLO506305{Tm6H22 z+&yJOlS$8wkzk7?8r5|Mffn3IE>S{O@>VL-U#0FSd`mj!v5EAQWCJbkaHl#K6tRP_ zN%Wq*^PJ3-CQ>s*mi!j^2!q3-!EBppW zS3@nywxFhz|4-p4e;!VXx_@rsJps4uks6ajMhbO`i2^qMY>UfX&v%Cw{i8J> zcX578mARJ6)R2#Sr0A`;nUJB5kTIE5mU9Z*sEyW+3Q&8nq)JKIh&)Ibqs2;5G4OTQ zKnpCczNhm-wJzeUiNwGTqZ+Z2j3f{716OXYQJV9hh^0e^-GT*uJ!^6g34>7wJ&&ix ziskt7TBS0kDh-7B3iWS&w%$G04{-Uhr7%*mojY?}L2*Lr>v4r_EUPY^;Q#yMVb&Fk ZTZ9I*NJ#lP>7stJNB2$j>vUhl{0~zDREq!r literal 0 HcmV?d00001