From ba99895b2b732636dd40614ddd50714a7ce61dc6 Mon Sep 17 00:00:00 2001 From: kaizheng <18763216000@163.com> Date: Sun, 11 Aug 2013 17:22:04 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E4=B8=BB=E7=95=8C=E9=9D=A2=E5=9B=BD?= =?UTF-8?q?=E9=99=85=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/welcome/index.html.erb | 14 +++++++------- config/locales/en-GB.yml | 4 ++-- config/locales/en.yml | 19 ++++++++++++------- config/locales/zh.yml | 11 ++++++++++- 4 files changed, 31 insertions(+), 17 deletions(-) diff --git a/app/views/welcome/index.html.erb b/app/views/welcome/index.html.erb index b129db12a..3539f98ef 100644 --- a/app/views/welcome/index.html.erb +++ b/app/views/welcome/index.html.erb @@ -193,7 +193,7 @@
- + @@ -238,11 +238,11 @@ --> - + - + - +
欢迎 <%=User.current.name%> 加入trustie!
<%= l(:label_welcome) %> <%=User.current.name%> <%= l(:label_join) %>
<%= image_tag(url_to_avatar(User.current), :class => 'avatar') %>
<%= l(:label_user_watcher) %> (<%= User.watched_by(User.current).count %>) <%= render :partial => "watchers/fans_num",:locals => {:fans_num => get_fans_num(User.current) }%>

<%= l(:label_create_course) %>

创建新项目,让我们开启一次神奇的开源之旅!<%= l(:label_create_new_projects_description) %>  为你所想,发布需求,体验答案找上门的兴奋感觉!<%= l(:label_call_for_bids_description) %>  课程小社区,创建新课程,让我们共同分享多到想不到的公共资源!<%= l(:label_create_course_description) %>
@@ -262,11 +262,11 @@ <%= image_tag("/images/welcome/boards.png", weight:"30px", height: "26px") %><%= l(:label_milestone) %> - 七嘴八舌,汇聚众人智慧,为您排忧解难! + <%= l(:label_board_description) %>   - 实时了解项目的最新动态,掌握最新项目咨询! + <%= l(:label_news_description) %>   - 在这里您可以可以看见任何一个版本的工程! + <%= l(:label_milestone_description) %> diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index ceaba1ed5..1f9b3a76b 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -489,7 +489,7 @@ en-GB: label_information: Information label_information_plural: Information label_please_login: Please log in - label_register: Register + label_register: Sign up label_login_with_open_id_option: or login with OpenID label_password_lost: Lost password label_home: Home @@ -498,7 +498,7 @@ en-GB: label_my_projects: My projects label_my_page_block: My page block label_administration: Administration - label_login: Sign in + label_login: Login label_logout: Sign out label_help: Help label_reported_issues: Reported issues diff --git a/config/locales/en.yml b/config/locales/en.yml index 0a7b9e3a5..30f22e5df 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -531,7 +531,7 @@ en: label_information: Information label_information_plural: Information label_please_login: Please log in - label_register: Register + label_register: Sign up label_login_with_open_id_option: or login with OpenID label_password_lost: Lost password label_home: Home @@ -540,7 +540,7 @@ en: label_my_projects: My projects label_my_page_block: My page block label_administration: Administration - label_login: Sign in + label_login: Login label_logout: Sign out label_help: Help label_reported_issues: Reported issues @@ -766,7 +766,8 @@ en: label_disabled: disabled label_show_completed_versions: Show completed versions label_me: me - label_board: Forum + label_board: Forums + label_board_description: Rushes,brought together all wisdom,solve problems for you! label_board_new: New forum label_board_plural: Forums label_board_locked: Locked @@ -1196,11 +1197,13 @@ en: label_cancel_praise: cancel praise label_bid_reason: Please show your reason default_tracker_task: Task - label_create_new_projects: Create projects - label_call_for_bids: Call for bids - label_create_course: Create courses + label_create_new_projects_description: Create a new project,let us open a magical journey of collaborative creation and development! + label_call_for_bids_description: As you might expect,show your requirement,experience the feeling of excitement that find the answer! + label_create_course_description: Curriculum small communities,create new courses,let us share more to think of public resources! label_news: News + label_news_description: Real getting the project's latest developments,obtain the latest project information! label_milestone: Milestone + label_milestone_description: Here you can see any version of the project! label_features: Features label_has_praisers: praisers(%{count}) label_has_watchers: watchers(%{count}) @@ -1216,4 +1219,6 @@ en: label_about_requirement: about requirement: label_about_issue: about issue: label_quote_my_words: quoted my words - label_have_respond: had a respond \ No newline at end of file + label_have_respond: had a respond + label_welcome: Welcome + label_join: join Trustie! \ No newline at end of file diff --git a/config/locales/zh.yml b/config/locales/zh.yml index b90867e20..9d4d1b812 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -1229,4 +1229,13 @@ zh: label_in_issues: 在问题: label_in_bids: 在需求: label_in_users: 在用户: - label_have_respond: 进行了反馈 \ No newline at end of file + label_have_respond: 进行了反馈 + label_create_new_projects_description: 创建项目,让我们开启一次神奇的协同创作和开发之旅! + label_call_for_bids_description: 为你所想,发布需求,体验答案找上门的兴奋感觉! + label_news_description: 实时了解项目的最新动态,掌握最新项目咨询! + label_milestone_description: 在这里您可以看见任何一个版本的工程! + label_have_respond: 进行了反馈 + label_welcome: 欢迎 + label_join: 加入Trustie! + label_board_description: 七嘴八舌,汇聚众人智慧,为您排忧解难! + label_create_course_description: 课程小社区,创建新课程,让我们共同分享多到想不到的公共资源! \ No newline at end of file From 516989b8174e53c7f6fa37e3b0d126ef5c587ff0 Mon Sep 17 00:00:00 2001 From: kaizheng <18763216000@163.com> Date: Sun, 11 Aug 2013 21:42:06 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E7=A8=8D=E5=BE=AE=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/locales/zh.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/zh.yml b/config/locales/zh.yml index 8d9e878a7..1f2d07997 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -1232,7 +1232,7 @@ zh: label_in_bids: 在需求: label_in_users: 在用户: label_have_respond: 进行了反馈 -label_have_respond: 进行了反馈 + label_have_respond: 进行了反馈 label_create_new_projects_description: 创建项目,让我们开启一次神奇的协同创作和开发之旅! label_call_for_bids_description: 为你所想,发布需求,体验答案找上门的兴奋感觉! label_news_description: 实时了解项目的最新动态,掌握最新项目咨询! From 7c9c3a663b624ecd730aa12aa40e34e2114201f8 Mon Sep 17 00:00:00 2001 From: kaizheng <18763216000@163.com> Date: Sun, 11 Aug 2013 22:07:32 +0800 Subject: [PATCH 3/8] =?UTF-8?q?Bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/locales/zh.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/zh.yml b/config/locales/zh.yml index 1f2d07997..576c7a272 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -261,7 +261,7 @@ zh: field_last_login_on: 最后登录 field_language: 语言 field_effective_date: 日期 - field_password: 密码: + field_password: 密码 field_new_password: 新密码 field_password_confirmation: 确认 field_version: 版本 From 7a0db3b3f1d6369c04cb3dfee93318b945497050 Mon Sep 17 00:00:00 2001 From: william Date: Sun, 11 Aug 2013 23:44:12 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E7=BB=99=E9=9C=80=E6=B1=82=E7=9A=84?= =?UTF-8?q?=E7=95=99=E8=A8=80=E6=B7=BB=E5=8A=A0=E4=BA=86=E2=80=9C=E7=A1=AE?= =?UTF-8?q?=E8=AE=A4=E5=88=A0=E9=99=A4=E2=80=9D=E5=BC=B9=E7=AA=97=EF=BC=8C?= =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=BA=86=E8=B5=9E=E5=92=8C=E8=B8=A9=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=EF=BC=8C=E9=92=88=E5=AF=B9=E9=97=AE=E9=A2=98=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E4=BA=86=E8=B5=9E=E5=92=8C=E8=B8=A9=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E3=80=82=E7=B2=89=E4=B8=9D=E6=95=B0=E7=9A=84=E9=93=BE=E6=8E=A5?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E6=9C=AA=E4=BF=AE=E6=94=B9=E7=8E=A9=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/praise_tread_controller.rb | 80 +++++++++++++------ app/helpers/praise_tread_helper.rb | 6 +- app/views/bids/_history.html.erb | 3 +- app/views/issues/show.html.erb | 7 +- app/views/layouts/base_users.html.erb | 5 +- app/views/praise_tread/_praise_tread.html.erb | 35 ++++---- app/views/praise_tread/praise_plus.js.erb | 2 +- config/routes.rb | 6 +- 8 files changed, 88 insertions(+), 56 deletions(-) diff --git a/app/controllers/praise_tread_controller.rb b/app/controllers/praise_tread_controller.rb index 528011102..41b167ed0 100644 --- a/app/controllers/praise_tread_controller.rb +++ b/app/controllers/praise_tread_controller.rb @@ -1,32 +1,10 @@ class PraiseTreadController < ApplicationController - def praise_plus @obj = nil if request.get? - @obj = params[:obj] # 传的是对象,最后变成id了 - - #首先创建或更新praise_tread 表 - @pt = PraiseTread.find_by_user_id_and_praise_tread_object_id(User.current.id,@obj) - @pt = @pt.nil? ? PraiseTread.new : @pt - - @pt.user_id = User.current.id - @pt.praise_tread_object_id = @obj.to_i - @pt.praise_tread_object_type = User.find_by_id(@obj).class.name.underscore - @pt.praise_or_tread = 1 - @pt.save - - #再创建或更新praise_tread_cache表 - @ptc = PraiseTreadCache.find_by_object_id(@obj) - @ptc = @ptc.nil? ? PraiseTreadCache.new : @ptc - @ptc.object_id = @obj.to_i - @ptc.object_type = User.find_by_id(@obj).class.name.underscore - @ptc.plus(1) - @ptc.save - end - @obj = User.find_by_id(@obj) - respond_to do |format| - format.html - format.js + @obj_id = params[:obj_id] + @obj_type = params[:obj_type] + @obj = praise_tread_plus(@obj_type,@obj_id,1) end end @@ -55,7 +33,12 @@ class PraiseTreadController < ApplicationController end def tread_plus - + @obj = nil + if request.get? + @obj_id = params[:obj_id] + @obj_type = params[:obj_type] + @obj = praise_tread_plus(@obj_type,@obj_id,0) + end end def tread_minus @@ -65,4 +48,49 @@ class PraiseTreadController < ApplicationController end end + private + + def find_object_by_type_and_id(type,id) + @obj = nil + case type + when 'User' + @obj = User.find_by_id(id) + when 'Issue' + @obj = Issue.find_by_id(id) + when 'Project' + @obj = Project.find_by_id(id) + when 'Bid' + @obj = Bid.find_by_id(id) + end + return @obj + end + + def praise_tread_plus(type,id,flag) + unless id.nil? and type.nil? + #首先创建或更新praise_tread 表 + @pt = PraiseTread.new + @pt.user_id = User.current.id + @pt.praise_tread_object_id = id.to_i + @pt.praise_tread_object_type = type + @pt.praise_or_tread = flag + @pt.save + # end + + #再创建或更新praise_tread_cache表 + @ptc = PraiseTreadCache.find_by_object_id_and_object_type(id,type) + @ptc = @ptc.nil? ? PraiseTreadCache.new : @ptc + @ptc.object_id = id.to_i + @ptc.object_type = type + @ptc.save + @ptc.plus(1) + end + + @obj = find_object_by_type_and_id(type,id) + + respond_to do |format| + format.html + format.js + end + end + end diff --git a/app/helpers/praise_tread_helper.rb b/app/helpers/praise_tread_helper.rb index 9b2eba969..1aa49d3ab 100644 --- a/app/helpers/praise_tread_helper.rb +++ b/app/helpers/praise_tread_helper.rb @@ -1,10 +1,10 @@ module PraiseTreadHelper #added by william def is_praise_or_tread(object,user_id) - @obj_type = object.class.name.underscore + @obj_type = object.class @obj_id = object.id - @is_praise = PraiseTread.find_by_sql("select * from praise_treads where user_id=#{user_id} and " + - "praise_tread_object_type='#{@obj_type}' and praise_tread_object_id=#{@obj_id} ") + @is_praise = PraiseTread.find_by_sql("select praise_or_tread from praise_treads where user_id=#{user_id} and " + + "praise_tread_object_type='#{@obj_type}' and praise_tread_object_id=#{@obj_id}") return @is_praise end #end diff --git a/app/views/bids/_history.html.erb b/app/views/bids/_history.html.erb index e17b0e2e6..c1a9c3257 100644 --- a/app/views/bids/_history.html.erb +++ b/app/views/bids/_history.html.erb @@ -48,7 +48,8 @@ <%= journal.created_on %> <%= link_to(image_tag('comment.png'), {:controller => 'bids', :action => 'new', :id => bid, :journal_id => journal}, :remote => true, - :method => 'post', :title => l(:button_quote))%><%= link_to(image_tag('delete.png'), {:controller => 'bids', :action => 'destroy', :object_id => journal, :id => bid}, + :method => 'post', :title => l(:button_quote))%> + <%= link_to(image_tag('delete.png'), {:controller => 'bids', :action => 'destroy', :object_id => journal, :id => bid},:confirm => l(:label_delete_confirm), :remote => true, :method => 'delete', :class => "delete", :title => l(:button_delete)) if remove_allowed || journal.user_id == User.current.id %> diff --git a/app/views/issues/show.html.erb b/app/views/issues/show.html.erb index 67035468a..8305cd18d 100644 --- a/app/views/issues/show.html.erb +++ b/app/views/issues/show.html.erb @@ -20,8 +20,6 @@ <% end %> - -
<%= render_issue_subject_with_tree(@issue) %> @@ -36,7 +34,10 @@
<%= render :partial => 'layouts/tag', :locals => {:obj => @issue,:object_flag => "3" }%>
- + + <%= render :partial => "/praise_tread/praise_tread", + :locals => {:obj => @issue,:user_id =>User.current.id}%> + <%= issue_fields_rows do |rows| rows.left l(:field_status), h(@issue.status.name), :class => 'status' diff --git a/app/views/layouts/base_users.html.erb b/app/views/layouts/base_users.html.erb index 6c65e1507..1d668117a 100644 --- a/app/views/layouts/base_users.html.erb +++ b/app/views/layouts/base_users.html.erb @@ -44,15 +44,12 @@
- - <%= render :partial => "/praise_tread/praise_tread",:locals => {:obj => @user,:show_flag => false,:user_id =>User.current.id}%> -
<%= l(:label_user_watcher) %> (<%=link_to User.watched_by(@user.id).count ,:controller=>"users", :action=>"user_watchlist"%>)   <%= render :partial => "watchers/fans_num",:locals => {:fans_num => get_fans_num(@user) }%> - +
diff --git a/app/views/praise_tread/_praise_tread.html.erb b/app/views/praise_tread/_praise_tread.html.erb index c5a427a61..ebd48bf6b 100644 --- a/app/views/praise_tread/_praise_tread.html.erb +++ b/app/views/praise_tread/_praise_tread.html.erb @@ -1,17 +1,22 @@ - - <% if is_praise_or_tread(obj,user_id).size > 0 %> - <%= image_tag("/images/praise.png") %> - <%= link_to "#{l(:label_cancel_praise)}",:controller=>"praise_tread",:action=>"praise_minus",:remote=>true,:obj => obj %> - (<%= get_praise_num(obj)%>) - <% else %> - <%= image_tag("/images/tread.png") %> - <%= link_to "#{l(:label_praise)}",:controller=>"praise_tread",:action=>"praise_plus",:remote=>true,:obj => obj %> - (<%= get_praise_num(obj)%>) + + <% @is_valuate = is_praise_or_tread(obj,user_id)%> + + <% if @is_valuate.size > 0 %> + + <% @flag = @is_valuate.first.praise_or_tread %> + <% if @flag == 1 %> + <%= image_tag("/images/praise_tread/praise_true.png") %> <%= get_praise_num(obj)%> <%= image_tag("/images/praise_tread/tread_false.png") %> + + <% elsif @flag == 0 %> + <%= image_tag("/images/praise_tread/praise_false.png") %> <%= get_praise_num(obj)%> <%= image_tag("/images/praise_tread/tread_true.png") %> <% end %> + + <% else %> + + <%= link_to image_tag("/images/praise_tread/praise_false.png"), + :controller=>"praise_tread",:action=>"praise_plus",:remote=>true,:obj_id => obj.id,:obj_type => obj.class %> <%= get_praise_num(obj)%> <%= link_to image_tag("/images/praise_tread/tread_false.png"),:controller=>"praise_tread", + :action=>"tread_plus",:remote=>true,:obj_id => obj.id,:obj_type => obj.class %> + + <% end %> -<% if show_flag %> - - <%= link_to image_tag("/images/tread.png"),:controller=>"praise_tread", - :action=>"tread_minus",:remote=>true,:obj => obj %>踩 - -<% end %> + diff --git a/app/views/praise_tread/praise_plus.js.erb b/app/views/praise_tread/praise_plus.js.erb index 74f7d6bfe..5020bb3c9 100644 --- a/app/views/praise_tread/praise_plus.js.erb +++ b/app/views/praise_tread/praise_plus.js.erb @@ -1,3 +1,3 @@ $('#praise_tread').html('<%= j( -render :partial => "/praise_tread/praise_tread",:locals => {:obj => @obj,:show_flag => false,:user_id => User.current.id} +render :partial => "/praise_tread/praise_tread",:locals => {:obj => @obj,:user_id => User.current.id} )%>'); diff --git a/config/routes.rb b/config/routes.rb index 72e8ca27c..5a024082c 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -23,8 +23,8 @@ RedmineApp::Application.routes.draw do get "tags/show" get "praise_tread/praise_plus" - get "praise_tread/praise_minus" - get "praise_tread/tread_minus" + + get "praise_tread/tread_plus" root :to => 'welcome#index', :as => 'home' @@ -442,7 +442,7 @@ RedmineApp::Application.routes.draw do match 'tags/delete_tag',:to => 'tags#delete_tag',:as=>"add_tag" match 'tags/show_all',:to => 'tags#show_all' match 'parise_tread/praise_plus',:to => 'parise_tread#praise_plus',:as=>"praise" - match 'parise_tread/tread_minus',:to => 'parise_tread#tread_minus',:as=>"tread" + match 'parise_tread/tread_plus',:to => 'parise_tread#tread_plus',:as=>"tread" end From 4bc217b52cb9872497e64f4c0697c3a6f76d4653 Mon Sep 17 00:00:00 2001 From: huangjingquan Date: Mon, 12 Aug 2013 10:25:23 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=B8=BB=E9=A1=B5=20?= =?UTF-8?q?=E9=97=A8=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/layouts/_base_header.html.erb | 4 +- app/views/welcome/index.html.erb | 453 +++++++++--------- public/stylesheets/application.css | 16 +- .../stylesheets/application.css | 2 +- 4 files changed, 239 insertions(+), 236 deletions(-) diff --git a/app/views/layouts/_base_header.html.erb b/app/views/layouts/_base_header.html.erb index a64767f98..892be7e42 100644 --- a/app/views/layouts/_base_header.html.erb +++ b/app/views/layouts/_base_header.html.erb @@ -1,6 +1,6 @@
-
- <%=link_to image_tag("/images/logo.png",weight:"39px", height: "39px"), home_path %> +
<%= render_menu :account_menu -%> diff --git a/app/views/welcome/index.html.erb b/app/views/welcome/index.html.erb index 34e1be806..f61eb01f5 100644 --- a/app/views/welcome/index.html.erb +++ b/app/views/welcome/index.html.erb @@ -1,44 +1,44 @@ - - -
-
- - - -
Trustie - 是一个社交化的项目管理、软件开发和众包平台。
Trustieforge is a socialized collaboration platform for project management, - software development and software crowdsourcing.
-
+
+
+ + + + + + + +
Trustie是一个社交化的项目管理、软件开发和众包平台。
Trustieforge is a socialized collaboration platform for project management, + software development and software crowdsourcing.
+
- -
- <%= call_hook :view_account_login_top %> -
- <%= form_tag(signin_path) do %> - <%= back_url_hidden_field_tag %> - <% unless User.current.logged? %> - - - - - - - - - - <% if Setting.openid? %> - - - - - <% end %> - - - - - - - -
<%= text_field_tag 'username', params[:username], :tabindex => '1' %>
<%= password_field_tag 'password', nil, :tabindex => '2' %>
<%= text_field_tag "openid_url", nil, :tabindex => '3' %>
- <% if Setting.autologin? %> - - <% end %> -
- <% if Setting.lost_password? %> - <%= link_to l(:label_password_lost), lost_password_path %> - <% end %> - - -
- <% else %> -
- - - - - - - -
<%= l(:label_welcome) %> <%=User.current.name%> <%= l(:label_join) %>
<%= image_tag(url_to_avatar(User.current), :class => 'avatar') %>
<%= l(:label_user_watcher) %> (<%= User.watched_by(User.current).count %>) - <%= render :partial => "watchers/fans_num",:locals => {:fans_num => get_fans_num(User.current) }%>
<% unless User.current.memberships.empty? %> - <%= l(:label_contribute_to, :project_count => "#{User.current.memberships.count}") %> - <% for member in User.current.memberships %> - <%= link_to_project(member.project) %><%= (User.current.memberships.last == member) ? '' : ',' %> - <% end %> - <% end %>
-
- <% end %> -<% end %> -
-<%= call_hook :view_account_login_bottom %> - -<% if params[:username].present? %> -<%= javascript_tag "$('#password').focus();" %> -<% else %> -<%= javascript_tag "$('#username').focus();" %> -<% end %> - -
- -
- - - - - - - - + + +
<%= link_to image_tag("/images/welcome/1.png", weight:"200px", height:"200px"), :controller => 'projects', :action => 'index' %> <%= link_to image_tag("/images/welcome/2.png", weight:"200px", height:"200px"), :controller => 'bids', :action => 'index' %> <%= link_to image_tag("/images/welcome/3.png", weight:"200px", height:"200px") %> <%= call_hook :view_account_login_top %> +
+ <%= form_tag(signin_path) do %> + <%= back_url_hidden_field_tag %> + <% unless User.current.logged? %> + + + + + + + + + + <% if Setting.openid? %> + + + + + <% end %> + + + + + + + + +
<%= text_field_tag 'username', params[:username], :tabindex => '1' %>
<%= password_field_tag 'password', nil, :tabindex => '2' %>
<%= text_field_tag "openid_url", nil, :tabindex => '3' %>
<% if Setting.autologin? %> <% end %>
<% if Setting.lost_password? %> + <%= link_to l(:label_password_lost), lost_password_path %> + <% end %> + +
+ <% else %> +
+ + + + - - - - - - - + + + + + +
<%= l(:label_welcome) %> <%= User.current.name%> <%= l(:label_join) %>
<%= l(:label_create_new_projects_description) %> <%= l(:label_call_for_bids_description) %> <%= l(:label_create_course_description) %>
<%= image_tag(url_to_avatar(User.current), :class => 'avatar') %><%= l(:label_user_watcher) %> (<%= link_to User.watched_by(User.current).count %>)  + <%= render :partial => "watchers/fans_num",:locals => {:fans_num => get_fans_num(User.current) }%>
<% unless User.current.memberships.empty? %> + <%= l(:label_contribute_to, :project_count => "#{User.current.memberships.count}") %> <% end %>
+ +
+ <% end %> + <% end %> +
<%= call_hook :view_account_login_bottom %> + + <% if params[:username].present? %> + <%= javascript_tag "$('#password').focus();" %> + <% else %> + <%= javascript_tag "$('#username').focus();" %> + <% end %>
+ +
+ + + + + + + - -
-
<%= l(:label_features) %> -
-
-
-
<%= link_to image_tag("/images/welcome/1.png", weight:"190px", height:"190px"), :controller => 'projects', :action => 'index' %><%= link_to image_tag("/images/welcome/2.png", weight:"190px", height:"190px"), :controller => 'bids', :action => 'index' %><%= link_to image_tag("/images/welcome/3.png", weight:"190px", height:"190px") %>
- - - - - - + + + + + + + + + + + + + + + + + + - - - - - - -
<%= image_tag("/images/welcome/discuss.png", weight:"30px", height: "26px") %><%= l(:label_board) %> <%= image_tag("/images/welcome/news.png", weight:"30px", height: "26px") %><%= l(:label_news) %> <%= image_tag("/images/welcome/boards.png", weight:"30px", height: "26px") %><%= l(:label_milestone) %>
<%= l(:label_create_new_projects_description) %><%= l(:label_call_for_bids_description) %><%= l(:label_create_course_description) %>
+
+ <%= l(:label_features) %>
+
+
<%= image_tag("/images/welcome/discuss.png", weight:"30px", height: "26px") %><%= l(:label_board) %> <%= image_tag("/images/welcome/news.png", weight:"30px", height: "26px") %><%= l(:label_news) %> <%= image_tag("/images/welcome/boards.png", weight:"30px", height: "26px") %><%= l(:label_milestone) %>
<%= l(:label_board_description) %> <%= l(:label_news_description) %> <%= l(:label_milestone_description) %>
-
-
+ <%= l(:label_board_description) %> + + <%= l(:label_news_description) %> + + <%= l(:label_milestone_description) %> + +
- +
diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css index fe008c51c..5ff2458c5 100644 --- a/public/stylesheets/application.css +++ b/public/stylesheets/application.css @@ -11,6 +11,11 @@ h4 {border-bottom: 1px dotted #bbb;} /*new by huang*/ /**/ +.welcome_logo{ + float: left; + padding-left: 5px; + padding-top: 2px; +} .welcome_images{ width: 200px; height: 200px; @@ -154,7 +159,7 @@ ul.tool li{list-style-type:none; .font_lighter2{ font-family:微软雅黑; color:#9a9a9a; - font-size:12px; + font-size:14px; } .font_lighter_welcome{ @@ -191,7 +196,7 @@ ul.tool li{list-style-type:none; .spaceright{float:left; width:620px;} .welcone_left{ - margin-top: 70px; + margin-top: 50px; margin-left: 90px; float:left; width: 49%; @@ -224,6 +229,11 @@ ul.tool li{list-style-type:none; padding-bottom: 8px; } .inf_user_image img.avatar2{ + background: rgb(245, 245, 245); + padding: 4px; + border: 1px solid #e5dfc7; + float: left; + display: block; height:80px; width: 80px; @@ -545,7 +555,7 @@ ul.newprojects2 li{ padding: 0px 0px 0px 0px; white-space:nowrap; } -#top-menu a {color: #000000; margin-right: 8px; font-weight: bold;} +#top-menu a {color: #fff; margin-right: 8px; font-weight: bold;} #top-menu #loggedas { float: right; margin-right: 0.5em; color: #fff; } #account {float:right;} diff --git a/public/themes/redpenny-master/stylesheets/application.css b/public/themes/redpenny-master/stylesheets/application.css index 125c25076..032ba732a 100644 --- a/public/themes/redpenny-master/stylesheets/application.css +++ b/public/themes/redpenny-master/stylesheets/application.css @@ -376,7 +376,7 @@ ul.projects li.root #top-menu ul { - margin-left: 60px; /*add by huang*/ + margin-left: 0px; /*add by huang*/ padding-right: 1px; } From cf9aa1272721debb1434af3ff0a1ef41dfbb00cf Mon Sep 17 00:00:00 2001 From: william Date: Mon, 12 Aug 2013 14:50:54 +0800 Subject: [PATCH 6/8] =?UTF-8?q?1.=E9=87=8D=E6=96=B0=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E4=BA=86=E9=A1=B6=E5=92=8C=E8=B8=A9=E5=BE=97=E8=A7=84=E5=88=99?= =?UTF-8?q?=EF=BC=9A=20=E5=AF=B9=E4=BA=8E=E4=B8=BA=E8=AF=84=E4=BB=B7?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C=E5=90=8C=E6=97=B6=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E9=A1=B6=E5=92=8C=E8=B8=A9=E7=9A=84=E6=95=B0=E5=AD=97?= =?UTF-8?q?=EF=BC=8C=E5=B9=B6=E4=B8=94=E6=95=B0=E5=AD=97=E7=9A=84=E2=80=9C?= =?UTF-8?q?+=E2=80=9D=E2=80=9C-=E2=80=9D=E6=A0=87=E6=88=90=E9=BB=91?= =?UTF-8?q?=E8=89=B2=EF=BC=9B=20=E5=AF=B9=E4=BA=8E=E8=AF=84=E4=BB=B7?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C=E5=A6=82=E6=9E=9C=E8=AF=84?= =?UTF-8?q?=E4=BB=B7=E6=98=AF=E9=A1=B6=EF=BC=8C=E5=88=99=E5=8F=AA=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E6=89=80=E6=9C=89=E9=A1=B6=E7=9A=84=E6=AC=A1=E6=95=B0?= =?UTF-8?q?=EF=BC=9B=E5=8F=8D=E4=B9=8B=EF=BC=8C=E4=BA=A6=E7=84=B6=EF=BC=9B?= =?UTF-8?q?=202.=E5=9C=A8=E9=97=AE=E9=A2=98=E5=88=97=E8=A1=A8=E4=B8=AD?= =?UTF-8?q?=E4=B9=9F=E6=B7=BB=E5=8A=A0=E4=BA=86=E9=A1=B6=E5=92=8C=E8=B8=A9?= =?UTF-8?q?=E7=9A=84=E5=8A=9F=E8=83=BD=EF=BC=9B=203.=E5=AF=B9=E4=BA=8E?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E5=88=97=E8=A1=A8=E7=9A=84=E6=8F=8F=E8=BF=B0?= =?UTF-8?q?=EF=BC=8C=E5=9C=A8=E6=8F=8F=E8=BF=B0=E5=86=85=E5=AE=B9=E5=89=8D?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E2=80=9C=E6=8F=8F=E8=BF=B0=EF=BC=9A?= =?UTF-8?q?=E2=80=9D=EF=BC=8C=20=E6=89=80=E4=BB=A5=E4=B8=BA=E7=A9=BA?= =?UTF-8?q?=E7=9A=84=E6=83=85=E5=86=B5=E4=B8=8B=EF=BC=8C=E8=AF=A5=E5=A4=84?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=8D=A0=E4=BD=8D=E4=BE=9D=E7=84=B6=E5=AD=98?= =?UTF-8?q?=E5=9C=A8=EF=BC=8C=E4=BD=BF=E5=88=97=E8=A1=A8=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E7=BB=9F=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/praise_tread_controller.rb | 25 ++++--- app/controllers/users_controller.rb | 4 +- app/helpers/praise_tread_helper.rb | 15 ++-- app/models/praise_tread_cache.rb | 9 ++- app/views/issues/_list.html.erb | 20 ++++-- app/views/issues/show.html.erb | 11 +-- app/views/praise_tread/_praise_tread.html.erb | 71 ++++++++++++++----- app/views/praise_tread/praise_plus.js.erb | 3 +- 8 files changed, 109 insertions(+), 49 deletions(-) diff --git a/app/controllers/praise_tread_controller.rb b/app/controllers/praise_tread_controller.rb index 41b167ed0..48574bcad 100644 --- a/app/controllers/praise_tread_controller.rb +++ b/app/controllers/praise_tread_controller.rb @@ -1,10 +1,17 @@ class PraiseTreadController < ApplicationController + + accept_api_auth :tread_plus,:praise_plus + before_filter :require_login,:only => [:praise_plus,:tread_plus] + def praise_plus @obj = nil + # @is_in_list = nil if request.get? @obj_id = params[:obj_id] @obj_type = params[:obj_type] - @obj = praise_tread_plus(@obj_type,@obj_id,1) + @obj = find_object_by_type_and_id(@obj_type,@obj_id) + # @is_in_list = params[:is_in_list] + praise_tread_plus(@obj_type,@obj_id,1) end end @@ -34,10 +41,13 @@ class PraiseTreadController < ApplicationController def tread_plus @obj = nil + # @is_in_list = nil if request.get? @obj_id = params[:obj_id] @obj_type = params[:obj_type] - @obj = praise_tread_plus(@obj_type,@obj_id,0) + @obj = find_object_by_type_and_id(@obj_type,@obj_id) + # @is_in_list = params[:is_in_list] + praise_tread_plus(@obj_type,@obj_id,0) end end @@ -79,14 +89,11 @@ class PraiseTreadController < ApplicationController #再创建或更新praise_tread_cache表 @ptc = PraiseTreadCache.find_by_object_id_and_object_type(id,type) @ptc = @ptc.nil? ? PraiseTreadCache.new : @ptc - @ptc.object_id = id.to_i - @ptc.object_type = type - @ptc.save - @ptc.plus(1) + @ptc.object_id = id.to_i + @ptc.object_type = type + @ptc.save + @ptc.plus(flag,1) end - - @obj = find_object_by_type_and_id(type,id) - respond_to do |format| format.html format.js diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 0e005690e..02d23e174 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -28,10 +28,10 @@ class UsersController < ApplicationController before_filter :require_admin, :except => [:show, :index,:tag_save, :user_projects, :user_newfeedback, :user_comments, :watch_bids, :info, :user_watchlist, :user_fanslist,:edit] before_filter :find_user, :only => [:user_fanslist, :user_watchlist, :show, :edit, :update, :destroy, :edit_membership, :destroy_membership, :user_activities, :user_projects, :user_newfeedback, :user_comments, :watch_bids, :info] - accept_api_auth :index, :show, :create, :update, :destroy + accept_api_auth :index, :show, :create, :update, :destroy,:tag_save #william - before_filter :require_login,:only=>[:tag_save] + before_filter :require_login,:only => :tag_save helper :sort diff --git a/app/helpers/praise_tread_helper.rb b/app/helpers/praise_tread_helper.rb index 1aa49d3ab..26e4e5f4c 100644 --- a/app/helpers/praise_tread_helper.rb +++ b/app/helpers/praise_tread_helper.rb @@ -9,14 +9,19 @@ module PraiseTreadHelper end #end - def get_praise_num(object) - @obj_type = object.class.name.underscore + def get_praise_num(object,flag) + @obj_type = object.class @obj_id = object.id @record = PraiseTreadCache.find_by_object_id_and_object_type(@obj_id,@obj_type) if @record - return @record.praise_num - else - return 0 + case flag + when 1 + return @record.praise_num.nil? ? 0 : @record.praise_num + when 0 + return @record.tread_num.nil? ? 0 : @record.tread_num + end + else + return 0 end end diff --git a/app/models/praise_tread_cache.rb b/app/models/praise_tread_cache.rb index 330e197cf..739b45876 100644 --- a/app/models/praise_tread_cache.rb +++ b/app/models/praise_tread_cache.rb @@ -1,8 +1,13 @@ class PraiseTreadCache < ActiveRecord::Base attr_accessible :object_id,:object_type,:praise_num,:tread_num - def plus(num) - self.update_attribute(:praise_num, self.praise_num.to_i + num) + def plus(flag,num) + case flag + when 0 + self.update_attribute(:tread_num, self.tread_num.to_i + num) + when 1 + self.update_attribute(:praise_num, self.praise_num.to_i + num) + end end def minus(num) diff --git a/app/views/issues/_list.html.erb b/app/views/issues/_list.html.erb index e174b01bc..53a6681db 100644 --- a/app/views/issues/_list.html.erb +++ b/app/views/issues/_list.html.erb @@ -72,23 +72,27 @@
  • "> <% column_content = ( query.inline_columns.map {|column| "#{column_content_new(column, issue)}"}) %> + + <%= render :partial => "/praise_tread/praise_tread", + :locals => {:obj => issue,:user_id =>User.current.id}%> + <% if issue.tracker.name == 'Bug' %> <%= image_tag("/images/task.png", :class => "img-tag-issues") %> <% end %> <% if issue.tracker.name == '任务'%> <%= image_tag("/images/issues.png", :class => "img-tag-issues") %> <% end %> +
        - <%= link_to issue.author.name, user_path(issue.author), :class => "bid_user_u" %><%= l(:label_post_on)%> - <% a = [] %> - <% a << column_content[1] %> - <% a << "##{column_content[0]}" << "(#{raw column_content[2]}):" << column_content[4] %> - <%= link_to a.join(' '), issue_path(issue) %> + <%= link_to issue.author.name, user_path(issue.author), :class => "bid_user_u" %><%= l(:label_post_on)%> <% a = [] %> + <% a << column_content[1] %> + <% a << "##{column_content[0]}" << "(#{raw column_content[2]}):" << column_content[4] %> + <%= link_to a.join(' '), issue_path(issue) %>
        - <%= issue.description %> + <%= l(:field_description)%>:<%= issue.description %>
        @@ -97,7 +101,9 @@ <% end %> <%= l(:label_updated_time_on, format_date(issue.updated_on)).html_safe %> -
        <%= link_to l(:label_find_all_comments), issue_path(issue) %><%= l(:label_comments_count, :count => issue.journals.all.count) %>
        +
        + <%= link_to l(:label_find_all_comments), issue_path(issue) %><%= l(:label_comments_count, :count => issue.journals.all.count) %> +
  • diff --git a/app/views/issues/show.html.erb b/app/views/issues/show.html.erb index 8305cd18d..2917bdf4a 100644 --- a/app/views/issues/show.html.erb +++ b/app/views/issues/show.html.erb @@ -23,7 +23,12 @@
    <%= render_issue_subject_with_tree(@issue) %> -
    +
    + + +<%= render :partial => "/praise_tread/praise_tread", + :locals => {:obj => @issue,:user_id =>User.current.id}%> +

    <%= authoring @issue.created_on, @issue.author %>. <% if @issue.created_on != @issue.updated_on %> @@ -34,10 +39,6 @@

    <%= render :partial => 'layouts/tag', :locals => {:obj => @issue,:object_flag => "3" }%>
    - - <%= render :partial => "/praise_tread/praise_tread", - :locals => {:obj => @issue,:user_id =>User.current.id}%> - <%= issue_fields_rows do |rows| rows.left l(:field_status), h(@issue.status.name), :class => 'status' diff --git a/app/views/praise_tread/_praise_tread.html.erb b/app/views/praise_tread/_praise_tread.html.erb index ebd48bf6b..4ed2328cf 100644 --- a/app/views/praise_tread/_praise_tread.html.erb +++ b/app/views/praise_tread/_praise_tread.html.erb @@ -1,22 +1,57 @@ - - <% @is_valuate = is_praise_or_tread(obj,user_id)%> - - <% if @is_valuate.size > 0 %> - - <% @flag = @is_valuate.first.praise_or_tread %> - <% if @flag == 1 %> - <%= image_tag("/images/praise_tread/praise_true.png") %> <%= get_praise_num(obj)%> <%= image_tag("/images/praise_tread/tread_false.png") %> + +
    - <% elsif @flag == 0 %> - <%= image_tag("/images/praise_tread/praise_false.png") %> <%= get_praise_num(obj)%> <%= image_tag("/images/praise_tread/tread_true.png") %> - <% end %> + <% @is_valuate = is_praise_or_tread(obj,user_id)%> + <% if @is_valuate.size > 0 %> + <% @flag = @is_valuate.first.praise_or_tread %> + <% if @flag == 1 %> +
    + + + + + + + + + + +
    <%= image_tag("/images/praise_tread/praise_true.png") %>
    +<%= get_praise_num(obj,1)%>
    <%= image_tag("/images/praise_tread/tread_false.png") %>
    + <% elsif @flag == 0 %> + + + + + + + + + + + +
    <%= image_tag("/images/praise_tread/praise_false.png") %>
    -<%= get_praise_num(obj,0)%>
    <%= image_tag("/images/praise_tread/tread_true.png") %>
    + <% end %> - <% else %> + <% else %> + + + + + + + + + + + + + + + +
    <%= link_to image_tag("/images/praise_tread/praise_false.png"), + :controller=>"praise_tread",:action=>"praise_plus",:remote=>true,:obj_id => obj.id,:obj_type => obj.class%>
    +<%= get_praise_num(obj,1)%>
    ---
    -<%= get_praise_num(obj,0)%>
    <%= link_to image_tag("/images/praise_tread/tread_false.png"),:controller=>"praise_tread", + :action=>"tread_plus",:remote=>true,:obj_id => obj.id,:obj_type => obj.class %>
    - <%= link_to image_tag("/images/praise_tread/praise_false.png"), - :controller=>"praise_tread",:action=>"praise_plus",:remote=>true,:obj_id => obj.id,:obj_type => obj.class %> <%= get_praise_num(obj)%> <%= link_to image_tag("/images/praise_tread/tread_false.png"),:controller=>"praise_tread", - :action=>"tread_plus",:remote=>true,:obj_id => obj.id,:obj_type => obj.class %> - - <% end %> - + <% end %> +
    diff --git a/app/views/praise_tread/praise_plus.js.erb b/app/views/praise_tread/praise_plus.js.erb index 5020bb3c9..c2584dcd2 100644 --- a/app/views/praise_tread/praise_plus.js.erb +++ b/app/views/praise_tread/praise_plus.js.erb @@ -1,3 +1,4 @@ -$('#praise_tread').html('<%= j( + +$('#praise_tread_<%= @obj.id %>').html('<%= j( render :partial => "/praise_tread/praise_tread",:locals => {:obj => @obj,:user_id => User.current.id} )%>'); From be35324bbca95ae7efc397d180cb33c8fb7079e7 Mon Sep 17 00:00:00 2001 From: william Date: Mon, 12 Aug 2013 15:08:44 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E6=8B=BF=E6=8E=89=E4=BA=86=E5=AF=B9?= =?UTF-8?q?=E4=BA=BA=E3=80=81=E9=97=AE=E9=A2=98=E3=80=81=E9=9C=80=E6=B1=82?= =?UTF-8?q?=E3=80=81=E9=A1=B9=E7=9B=AE=E7=9A=84=E8=B5=9E=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=EF=BC=8C=E5=8E=BB=E6=8E=89=E4=BA=86=E4=B8=80=E4=BA=9B=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E8=BF=99=E4=BA=9B=E5=8A=9F=E8=83=BD=E7=9A=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 2 +- app/helpers/application_helper.rb | 4 ++-- app/views/users/index.html.erb | 6 ++---- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 02d23e174..0a1775c5c 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -31,7 +31,7 @@ class UsersController < ApplicationController accept_api_auth :index, :show, :create, :update, :destroy,:tag_save #william - before_filter :require_login,:only => :tag_save + before_filter :need_login,:only => :tag_save helper :sort diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 789861fad..75484a227 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1317,8 +1317,8 @@ module ApplicationHelper # end #added by william - def get_fans_num(user) - user.watcher_users.count + def need_login + redirect_to signin_path end #end end diff --git a/app/views/users/index.html.erb b/app/views/users/index.html.erb index 0bf0642dd..d82d3dc9d 100644 --- a/app/views/users/index.html.erb +++ b/app/views/users/index.html.erb @@ -87,8 +87,7 @@
    <% for user in @users -%> -
    - +
    <%= content_tag "p", "#{format_date(user.created_on)}#{l(:label_member_since)}", :class => "float_right member_since" %> <%= image_tag "/images/time_member.png", :class => "img_member_time"%> @@ -99,9 +98,8 @@
    <%= l(:label_has_fans,:count=>user.watcher_users.count)%> <%= l(:label_has_watchers,:count=>User.watched_by(user.id).count) %> - <%= l(:label_has_praisers,:count=>get_praise_num(user))%>
    - +
    <% unless user.memberships.empty? %> <%= l(:label_contribute_to, :project_count => "#{user.memberships.count}") %> From f675083251e2d99b86fff8c8f47075f28c6acaa8 Mon Sep 17 00:00:00 2001 From: william Date: Mon, 12 Aug 2013 15:36:10 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E9=A1=B6?= =?UTF-8?q?=E5=92=8C=E8=B8=A9=E7=9A=84=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/images/praise_tread/praise_false.png | Bin 0 -> 3736 bytes public/images/praise_tread/praise_true.png | Bin 0 -> 3739 bytes public/images/praise_tread/tread_false.png | Bin 0 -> 3740 bytes public/images/praise_tread/tread_true.png | Bin 0 -> 3741 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/images/praise_tread/praise_false.png create mode 100644 public/images/praise_tread/praise_true.png create mode 100644 public/images/praise_tread/tread_false.png create mode 100644 public/images/praise_tread/tread_true.png diff --git a/public/images/praise_tread/praise_false.png b/public/images/praise_tread/praise_false.png new file mode 100644 index 0000000000000000000000000000000000000000..ed63e619d998a6a53d76bdea0e4b4fa52db5f1ca GIT binary patch literal 3736 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 literal 0 HcmV?d00001 diff --git a/public/images/praise_tread/praise_true.png b/public/images/praise_tread/praise_true.png new file mode 100644 index 0000000000000000000000000000000000000000..e3ca14b5ab79c60db40d3aea3621d8dc912b6ce1 GIT binary patch literal 3739 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 Ykry)sA2+QUxH}*%`R!A&xQ@?%0Jw(cTL1t6 literal 0 HcmV?d00001 diff --git a/public/images/praise_tread/tread_false.png b/public/images/praise_tread/tread_false.png new file mode 100644 index 0000000000000000000000000000000000000000..26f146083d98e39d526510cde557c0caf30f21a6 GIT binary patch literal 3740 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 Wco#3eO>lwx1JaUm5~X6gKK}!+`RP0W literal 0 HcmV?d00001