1、安装redmine
https://github.com/redmine/redmine
2、插件使用
http://redmine.ossxp.com/redmine/projects/redmine/wiki/%E4%B8%80%E6%AD%A5%E4%B8%80%E6%AD%A5%E5%BC%80%E5%8F%91Redmine%E6%8F%92%E4%BB%B6%E7%9A%84%E6%95%99%E7%A8%8B
3、帮助菜单的代码位置
./lib/redmine/info.rb
def help_url; 'http://www.redmine.org/guide' end
./lib/redmine.rb
menu.push :help, Redmine::Info.help_url, :last => true
其他菜单也在这里可以看到
如可以通过注释
# menu.push :ldap_authentication, {:controller => 'auth_sources', :action => 'index'},
# :html => {:class => 'server_authentication'}
屏蔽管理菜单中的LDAP菜单
4、权限定义
权限定义也在./lib/redmine.rb文件中
map.project_module :files do |map|
map.permission :manage_files, {:files => [:new, :create], :attachments => :upload}, :require => :loggedin
map.permission :view_files, {:files => :index, :versions => :download}, :read => true
end
定义一组权限,在角色权限分配中可以看到。
插件开发时可以在自己的插件中定义相关权限和菜单。
redmine的用户分为管理员用户和非管理员用户,管理员用户可以管理所有项目,非管理员用户和项目相关连
5、代码阅读
redmine有很多页面,开始不知道从哪里入手
找到最简单的页面,查看路由文件后,
从get 'robots.txt', :to => 'welcome#robots' 入手
a、控制器代码
def robots
@projects = Project.all_public.active
render :layout => false, :content_type => 'text/plain'
end
大概意思是取出活动的,公开的project信息
不使用框架,设置文档类型。
使用到模型中的all_public.active等方法,现在理解应该为类方法。
b、视图代码
User-agent: *
<% @projects.each do |p| -%>
Disallow: /projects/<%= p.to_param %>/repository
Disallow: /projects/<%= p.to_param %>/issues
Disallow: /projects/<%= p.to_param %>/activity
<% end -%>
Disallow: /issues/gantt
Disallow: /issues/calendar
Disallow: /activity
Disallow: /search
显示一些固定内容,如果有项目信息,显示项目相关的行,
使用到to_oaram这个对象方法。
c、模型代码
查看./app/model/project.rb
def to_param
# id is used for projects with a numeric identifier (compatibility)
@to_param ||= (identifier.to_s =~ %r{^\d*$} ? id.to_s : identifier)
end
scope :active, lambda { where(:status => STATUS_ACTIVE) }
scope :all_public, lambda { where(:is_public => true) }
这里用到闭包表达式lambda。
另外看到这样的代码
has_many :memberships, :class_name => 'Member'
has_many :member_principals,
lambda { joins(:principal).
where("#{Principal.table_name}.status=#{Principal::STATUS_ACTIVE}")},
:class_name => 'Member'
has_and_belongs_to_many :trackers, lambda {order(:position)}
可以从对象方法中调用:memberships等方法,可以直接读出来
这个也是我之前想找的读取关联数据的方法,看来redmine代码中还是能发现不少金矿的。
除了lambda外,还发现class_name,dependent,through,source,等字样,需要慢慢琢磨是什么意思。
match 'account/register', :to => 'account#register', :via => [:get, :post], :as => 'register'
a、控制器代码片段
if request.get?
session[:auth_source_registration] = nil
@user = User.new(:language => current_language.to_s)
b、视图代码
l(:label_register) 按照用户设置的语言显示该语言的字符串
<%= labelled_form_for @user, :url => register_path do |f| %>
<% unless @user.force_default_language? %>
<p><%= f.select :language, lang_options_for_select %></p>
<% end %>
c、模型代码
“?”被用于标示谓词,即返回Boolean直的方法,如Array.empty?(判断数组中元素是否为空)
“!”出现在方法名尾部的感叹号表明使用该方法是需要多加小心。许多Ruby的核心类都定义了
成对的方法,它们具有同样的名称,只是结尾相差一个“!”,通常情况下,不带感叹号的方法返
调用该方法的一个拷贝,二带感叹号的方法则是一个可变方法,该方法会修改原来的对象,如Array
类中的sort和sort!
settings配置项
目前看到的配置项有
login_required
self_registration
default_language
等,全局配置,在代码中作为开关可用
邮件发送配置使用gmail邮箱
在configration.yml中设置
delivery_method: :smtp
smtp_settings:
enable_starttls_auto: true
address: "smtp.gmail.com"
port: 587
domain: "smtp.gmail.com"
authentication: :plain
user_name: "xx@gmail.com"
password: "passwd"