mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-22 14:23:56 +01:00
Fix #348
This commit is contained in:
parent
033a7f0224
commit
ab7206d6b7
13 changed files with 121 additions and 59 deletions
|
@ -59,7 +59,7 @@ There are 5 ways to install Gogs:
|
|||
- [Install from binary](http://gogs.io/docs/installation/install_from_binary.md): **STRONGLY RECOMMENDED**
|
||||
- [Install from source](http://gogs.io/docs/installation/install_from_source.md)
|
||||
- [Install from packages](http://gogs.io/docs/installation/install_from_packages.md)
|
||||
- [Ship with Docker](https://github.com/gogits/gogs/tree/master/dockerfiles)
|
||||
- [Ship with Docker](https://github.com/gogits/gogs/tree/master/docker)
|
||||
- [Install with Vagrant](https://github.com/geerlingguy/ansible-vagrant-examples/tree/master/gogs)
|
||||
|
||||
## Acknowledgments
|
||||
|
@ -70,7 +70,6 @@ There are 5 ways to install Gogs:
|
|||
- Usage and modification from [beego](http://beego.me) modules.
|
||||
- Thanks [lavachen](http://www.lavachen.cn/) and [Rocker](http://weibo.com/rocker1989) for designing Logo.
|
||||
- Thanks [gobuild.io](http://gobuild.io) for providing binary compile and download service.
|
||||
- Thanks [Docker China](http://www.dockboard.org/) for providing [dockerfiles](https://github.com/gogits/gogs/tree/master/dockerfiles).
|
||||
|
||||
## Contributors
|
||||
|
||||
|
|
|
@ -50,7 +50,7 @@ Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自
|
|||
- [二进制安装](http://gogs.io/docs/installation/install_from_binary.md): **强烈推荐**
|
||||
- [源码安装](http://gogs.io/docs/installation/install_from_source.md)
|
||||
- [包管理安装](http://gogs.io/docs/installation/install_from_packages.md)
|
||||
- [采用 Docker 部署](https://github.com/gogits/gogs/tree/master/dockerfiles)
|
||||
- [采用 Docker 部署](https://github.com/gogits/gogs/tree/master/docker)
|
||||
- [通过 Vagrant 安装](https://github.com/geerlingguy/ansible-vagrant-examples/tree/master/gogs)
|
||||
|
||||
## 特别鸣谢
|
||||
|
@ -61,7 +61,6 @@ Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自
|
|||
- [martini](http://martini.codegangsta.io/) 的路由与中间件机制。
|
||||
- 感谢 [gobuild.io](http://gobuild.io) 提供二进制编译与下载服务。
|
||||
- 感谢 [lavachen](http://www.lavachen.cn/) 和 [Rocker](http://weibo.com/rocker1989) 设计的 Logo。
|
||||
- 感谢 [Docker 中文社区](http://www.dockboard.org/) 提供的 [dockerfiles](https://github.com/gogits/gogs/tree/master/dockerfiles)。
|
||||
|
||||
## 贡献成员
|
||||
|
||||
|
|
|
@ -124,6 +124,7 @@ func runWeb(*cli.Context) {
|
|||
|
||||
// Routers.
|
||||
m.Get("/", ignSignIn, routers.Home)
|
||||
m.Get("/explore", routers.Explore)
|
||||
m.Get("/install", bindIgnErr(auth.InstallForm{}), routers.Install)
|
||||
m.Post("/install", bindIgnErr(auth.InstallForm{}), routers.InstallPost)
|
||||
m.Group("", func(r *macaron.Router) {
|
||||
|
|
|
@ -47,6 +47,9 @@ collaborative_repos = Collaborative Repositories
|
|||
my_orgs = My Organizations
|
||||
my_mirrors = My Mirrors
|
||||
|
||||
[explore]
|
||||
repos = Repositories
|
||||
|
||||
[auth]
|
||||
create_new_account = Create New Account
|
||||
register_hepler_msg = Already have an account? Sign in now!
|
||||
|
|
|
@ -47,6 +47,9 @@ collaborative_repos = 参与协作的仓库
|
|||
my_orgs = 我的组织
|
||||
my_mirrors = 我的镜像
|
||||
|
||||
[explore]
|
||||
repos = 探索仓库
|
||||
|
||||
[auth]
|
||||
create_new_account = 创建帐户
|
||||
register_hepler_msg = 已经注册?立即登录!
|
||||
|
|
2
gogs.go
2
gogs.go
|
@ -17,7 +17,7 @@ import (
|
|||
"github.com/gogits/gogs/modules/setting"
|
||||
)
|
||||
|
||||
const APP_VER = "0.4.9.0902 Beta"
|
||||
const APP_VER = "0.4.9.0905 Beta"
|
||||
|
||||
func init() {
|
||||
runtime.GOMAXPROCS(runtime.NumCPU())
|
||||
|
|
|
@ -972,8 +972,8 @@ func GetRepositories(uid int64, private bool) ([]*Repository, error) {
|
|||
}
|
||||
|
||||
// GetRecentUpdatedRepositories returns the list of repositories that are recently updated.
|
||||
func GetRecentUpdatedRepositories() (repos []*Repository, err error) {
|
||||
err = x.Where("is_private=?", false).Limit(5).Desc("updated").Find(&repos)
|
||||
func GetRecentUpdatedRepositories(num int) (repos []*Repository, err error) {
|
||||
err = x.Where("is_private=?", false).Limit(num).Desc("updated").Find(&repos)
|
||||
return repos, err
|
||||
}
|
||||
|
||||
|
|
|
@ -5,6 +5,9 @@
|
|||
package routers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/gogits/gogs/models"
|
||||
"github.com/gogits/gogs/modules/base"
|
||||
"github.com/gogits/gogs/modules/middleware"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
|
@ -12,7 +15,8 @@ import (
|
|||
)
|
||||
|
||||
const (
|
||||
HOME base.TplName = "home"
|
||||
HOME base.TplName = "home"
|
||||
EXPLORE_REPOS base.TplName = "explore/repos"
|
||||
)
|
||||
|
||||
func Home(ctx *middleware.Context) {
|
||||
|
@ -42,6 +46,26 @@ func Home(ctx *middleware.Context) {
|
|||
ctx.HTML(200, HOME)
|
||||
}
|
||||
|
||||
func Explore(ctx *middleware.Context) {
|
||||
ctx.Data["Title"] = ctx.Tr("explore")
|
||||
ctx.Data["PageIsExploreRepositories"] = true
|
||||
|
||||
repos, err := models.GetRecentUpdatedRepositories(20)
|
||||
if err != nil {
|
||||
ctx.Handle(500, "GetRecentUpdatedRepositories", err)
|
||||
return
|
||||
}
|
||||
for _, repo := range repos {
|
||||
if err = repo.GetOwner(); err != nil {
|
||||
ctx.Handle(500, "GetOwner", fmt.Errorf("%d: %v", repo.Id, err))
|
||||
return
|
||||
}
|
||||
}
|
||||
ctx.Data["Repos"] = repos
|
||||
|
||||
ctx.HTML(200, EXPLORE_REPOS)
|
||||
}
|
||||
|
||||
func NotFound(ctx *middleware.Context) {
|
||||
ctx.Data["Title"] = "Page Not Found"
|
||||
ctx.Handle(404, "home.NotFound", nil)
|
||||
|
|
|
@ -1 +1 @@
|
|||
0.4.9.0902 Beta
|
||||
0.4.9.0905 Beta
|
8
templates/explore/nav.tmpl
Normal file
8
templates/explore/nav.tmpl
Normal file
|
@ -0,0 +1,8 @@
|
|||
<div id="setting-menu" class="grid-1-5 panel panel-radius left">
|
||||
<p class="panel-header"><strong>{{.i18n.Tr "explore"}}</strong></p>
|
||||
<div class="panel-body">
|
||||
<ul class="menu menu-vertical switching-list grid-1-5 left">
|
||||
<li {{if .PageIsExploreRepositories}}class="current"{{end}}><a href="/explore">{{.i18n.Tr "explore.repos"}}</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
25
templates/explore/repos.tmpl
Normal file
25
templates/explore/repos.tmpl
Normal file
|
@ -0,0 +1,25 @@
|
|||
{{template "ng/base/head" .}}
|
||||
{{template "ng/base/header" .}}
|
||||
<div id="setting-wrapper" class="main-wrapper">
|
||||
<div id="org-setting" class="container clear">
|
||||
{{template "explore/nav" .}}
|
||||
<div class="grid-4-5 left">
|
||||
<div class="setting-content">
|
||||
<div id="org-repo-list">
|
||||
{{range .Repos}}
|
||||
<div class="org-repo-item">
|
||||
<ul class="org-repo-status right">
|
||||
<li><i class="octicon octicon-star"></i> {{.NumStars}}</li>
|
||||
<li><i class="octicon octicon-git-branch"></i> {{.NumForks}}</li>
|
||||
</ul>
|
||||
<h2><a href="/{{.Owner.Name}}/{{.Name}}">{{.Name}}</a></h2>
|
||||
<p class="org-repo-description">{{.Description}}</p>
|
||||
<p class="org-repo-updated">{{$.i18n.Tr "org.repo_updated"}} {{TimeSince .Updated $.i18n.Lang}}</p>
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{template "ng/base/footer" .}}
|
|
@ -3,54 +3,54 @@
|
|||
{{template "org/base/header" .}}
|
||||
<div id="setting-wrapper" class="main-wrapper">
|
||||
<div id="org-setting" class="container clear">
|
||||
{{template "org/settings/nav" .}}
|
||||
<div class="grid-4-5 left">
|
||||
<div class="setting-content">
|
||||
{{template "ng/base/alert" .}}
|
||||
<div id="setting-content">
|
||||
<div id="user-profile-setting-content" class="panel panel-radius">
|
||||
<div class="panel-header">
|
||||
<strong>{{.i18n.Tr "org.settings.options"}}</strong>
|
||||
</div>
|
||||
<form class="form form-align panel-body" id="org-setting-form" action="/org/{{.Org.LowerName}}/settings" method="post">
|
||||
{{.CsrfTokenHtml}}
|
||||
<input type="hidden" name="action" value="update">
|
||||
<div class="field">
|
||||
<label class="req" for="orgname">{{.i18n.Tr "username"}}</label>
|
||||
<input class="ipt ipt-large ipt-radius {{if .Err_UserName}}ipt-error{{end}}" id="orgname" name="uname" value="{{.Org.Name}}" data-orgname="{{.Org.Name}}" required />
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="full-name">{{.i18n.Tr "org.settings.full_name"}}</label>
|
||||
<input class="ipt ipt-large ipt-radius {{if .Err_FullName}}ipt-error{{end}}" id="full-name" name="fullname" value="{{.Org.FullName}}" />
|
||||
</div>
|
||||
<div class="field">
|
||||
<label class="req" for="email">{{.i18n.Tr "email"}}</label>
|
||||
<input class="ipt ipt-large ipt-radius {{if .Err_Email}}ipt-error{{end}}" id="email" name="email" type="email" value="{{.Org.Email}}" required />
|
||||
</div>
|
||||
<div class="field clear">
|
||||
<label class="left" for="desc">{{.i18n.Tr "org.org_desc"}}</label>
|
||||
<textarea class="ipt ipt-large ipt-radius {{if .Err_Description}}ipt-error{{end}}" id="desc" name="desc">{{.Org.Description}}</textarea>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="website">{{.i18n.Tr "org.settings.website"}}</label>
|
||||
<input class="ipt ipt-large ipt-radius {{if .Err_Website}}ipt-error{{end}}" id="website" name="website" type="url" value="{{.Org.Website}}" />
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="location">{{.i18n.Tr "org.settings.location"}}</label>
|
||||
<input class="ipt ipt-large ipt-radius {{if .Err_Location}}ipt-error{{end}}" id="location" name="location" type="text" value="{{.Org.Location}}" />
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="gravatar-email">Gravatar {{.i18n.Tr "email"}}</label>
|
||||
<input class="ipt ipt-large ipt-radius {{if .Err_Avatar}}ipt-error{{end}}" id="gravatar-email" name="avatar" type="text" value="{{.Org.AvatarEmail}}" />
|
||||
</div>
|
||||
<div class="field">
|
||||
<span class="form-label"></span>
|
||||
<button class="btn btn-green btn-large btn-radius">{{.i18n.Tr "org.settings.update_settings"}}</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{template "org/settings/nav" .}}
|
||||
<div class="grid-4-5 left">
|
||||
<div class="setting-content">
|
||||
{{template "ng/base/alert" .}}
|
||||
<div id="setting-content">
|
||||
<div id="user-profile-setting-content" class="panel panel-radius">
|
||||
<div class="panel-header">
|
||||
<strong>{{.i18n.Tr "org.settings.options"}}</strong>
|
||||
</div>
|
||||
<form class="form form-align panel-body" id="org-setting-form" action="/org/{{.Org.LowerName}}/settings" method="post">
|
||||
{{.CsrfTokenHtml}}
|
||||
<input type="hidden" name="action" value="update">
|
||||
<div class="field">
|
||||
<label class="req" for="orgname">{{.i18n.Tr "username"}}</label>
|
||||
<input class="ipt ipt-large ipt-radius {{if .Err_UserName}}ipt-error{{end}}" id="orgname" name="uname" value="{{.Org.Name}}" data-orgname="{{.Org.Name}}" required />
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="full-name">{{.i18n.Tr "org.settings.full_name"}}</label>
|
||||
<input class="ipt ipt-large ipt-radius {{if .Err_FullName}}ipt-error{{end}}" id="full-name" name="fullname" value="{{.Org.FullName}}" />
|
||||
</div>
|
||||
<div class="field">
|
||||
<label class="req" for="email">{{.i18n.Tr "email"}}</label>
|
||||
<input class="ipt ipt-large ipt-radius {{if .Err_Email}}ipt-error{{end}}" id="email" name="email" type="email" value="{{.Org.Email}}" required />
|
||||
</div>
|
||||
<div class="field clear">
|
||||
<label class="left" for="desc">{{.i18n.Tr "org.org_desc"}}</label>
|
||||
<textarea class="ipt ipt-large ipt-radius {{if .Err_Description}}ipt-error{{end}}" id="desc" name="desc">{{.Org.Description}}</textarea>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="website">{{.i18n.Tr "org.settings.website"}}</label>
|
||||
<input class="ipt ipt-large ipt-radius {{if .Err_Website}}ipt-error{{end}}" id="website" name="website" type="url" value="{{.Org.Website}}" />
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="location">{{.i18n.Tr "org.settings.location"}}</label>
|
||||
<input class="ipt ipt-large ipt-radius {{if .Err_Location}}ipt-error{{end}}" id="location" name="location" type="text" value="{{.Org.Location}}" />
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="gravatar-email">Gravatar {{.i18n.Tr "email"}}</label>
|
||||
<input class="ipt ipt-large ipt-radius {{if .Err_Avatar}}ipt-error{{end}}" id="gravatar-email" name="avatar" type="text" value="{{.Org.AvatarEmail}}" />
|
||||
</div>
|
||||
<div class="field">
|
||||
<span class="form-label"></span>
|
||||
<button class="btn btn-green btn-large btn-radius">{{.i18n.Tr "org.settings.update_settings"}}</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
{{template "ng/base/head" .}}
|
||||
{{template "ng/base/header" .}}
|
||||
<div id="body" class="container text-center">
|
||||
<div class="container text-center">
|
||||
<p style="margin-top: 100px"><img src="/img/404.png" alt="404"/></p>
|
||||
<hr/>
|
||||
<br>
|
||||
<p>Application Version: {{AppVer}}</p>
|
||||
<p>If you think this is an error, please open an issue on <a href="https://github.com/gogits/gogs/issues/new">GitHub</a>.</p>
|
||||
<h3>We're currently working on 0.5 beta version, many pages may be missing at this time. Sorry for confusion!</h3>
|
||||
<!-- <p>We're currently working on 0.5 beta version, many pages may be missing at this time. Sorry for confusion!</p> -->
|
||||
</div>
|
||||
{{template "ng/base/footer" .}}
|
||||
|
|
Loading…
Reference in a new issue