commit
5b66489b61
@ -1 +0,0 @@
|
|||||||
{"access_token":"b_Pc60Dd5eyg_ut3cHbsjQO9EJJdj2Qj5F99o9LH9ltKSme7_FZ3Of22lWLL-K2V0siWzv-bd9PO0Dn-L1PBvIy9LhXa0qPVaFl6vTtZHR2kA8qjo1ps2ancya0t7KmzURGbAFAAXM","expires_in":7200,"got_token_at":1467976842}
|
|
@ -0,0 +1,181 @@
|
|||||||
|
#coding=utf-8
|
||||||
|
|
||||||
|
module Mobile
|
||||||
|
module Apis
|
||||||
|
class Projects < Grape::API
|
||||||
|
|
||||||
|
resources :projects do
|
||||||
|
desc "获取项目列表"
|
||||||
|
params do
|
||||||
|
requires :token, type: String
|
||||||
|
end
|
||||||
|
get do
|
||||||
|
authenticate!
|
||||||
|
|
||||||
|
ps = ProjectsService.new
|
||||||
|
projects = ps.user_projects(current_user)
|
||||||
|
present :data, projects, with: Mobile::Entities::Project,user: current_user
|
||||||
|
present :status, 0
|
||||||
|
end
|
||||||
|
|
||||||
|
desc "返回单个项目"
|
||||||
|
params do
|
||||||
|
requires :id, type: Integer
|
||||||
|
requires :token,type:String
|
||||||
|
end
|
||||||
|
route_param :id do
|
||||||
|
get do
|
||||||
|
# course = Course.find(params[:id])
|
||||||
|
ps = ProjectsService.new
|
||||||
|
project = ps.show_project(params,current_user)
|
||||||
|
|
||||||
|
if project[:status] == 9
|
||||||
|
{status:-1, message: '该项目不存在或已被删除啦' }
|
||||||
|
else
|
||||||
|
present :data, project, with: Mobile::Entities::Project,user: current_user
|
||||||
|
present :status, 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
desc "获取项目动态"
|
||||||
|
params do
|
||||||
|
requires :id, type: Integer
|
||||||
|
requires :token, type: String
|
||||||
|
end
|
||||||
|
post 'activities' do
|
||||||
|
authenticate!
|
||||||
|
|
||||||
|
user = current_user
|
||||||
|
|
||||||
|
project_types = "('Message','Issue','Project')"
|
||||||
|
activities = UserActivity.where("(container_type = 'Project' and container_id = #{params[:id]} and act_type in #{project_types})").order('updated_at desc')
|
||||||
|
|
||||||
|
page = params[:page] ? params[:page] : 0
|
||||||
|
all_count = activities.count
|
||||||
|
activities = activities.limit(10).offset(page * 10)
|
||||||
|
count = activities.count
|
||||||
|
present :data, activities, with: Mobile::Entities::Activity,user: user
|
||||||
|
present :all_count, all_count
|
||||||
|
present :count, count
|
||||||
|
present :page, page
|
||||||
|
present :status, 0
|
||||||
|
end
|
||||||
|
|
||||||
|
desc "获取项目成员"
|
||||||
|
params do
|
||||||
|
requires :id, type: Integer
|
||||||
|
requires :token, type: String
|
||||||
|
end
|
||||||
|
post 'members' do
|
||||||
|
authenticate!
|
||||||
|
|
||||||
|
project = Project.find("#{params[:id]}")
|
||||||
|
members = project.member_principals
|
||||||
|
|
||||||
|
master_members = project.member_principals.includes(:roles, :principal).where("member_roles.role_id=3").all.sort
|
||||||
|
|
||||||
|
master_members.each do |m|
|
||||||
|
if m.user_id == project.user_id
|
||||||
|
master_members.delete(m)
|
||||||
|
master_members.insert(0,m)
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
develop_members = project.member_principals.includes(:roles, :principal).where("member_roles.role_id=4").all.sort
|
||||||
|
report_members = project.member_principals.includes(:roles, :principal).where("member_roles.role_id=5").all.sort
|
||||||
|
|
||||||
|
present :master_members,master_members, with: Mobile::Entities::ProjectMember
|
||||||
|
present :develop_members,develop_members, with: Mobile::Entities::ProjectMember
|
||||||
|
present :report_members,report_members, with: Mobile::Entities::ProjectMember
|
||||||
|
present :status, 0
|
||||||
|
end
|
||||||
|
|
||||||
|
desc "获取项目某成员角色信息"
|
||||||
|
params do
|
||||||
|
requires :id, type: Integer
|
||||||
|
requires :token, type: String
|
||||||
|
requires :user_id, type: Integer
|
||||||
|
end
|
||||||
|
post 'get_member_info' do
|
||||||
|
authenticate!
|
||||||
|
|
||||||
|
project = Project.find("#{params[:id]}")
|
||||||
|
|
||||||
|
my_member = project.member_principals.where("users.id=#{params[:user_id]}").first
|
||||||
|
|
||||||
|
if my_member && my_member.roles[0]
|
||||||
|
present :project_id,params[:id]
|
||||||
|
present :user_id,params[:user_id]
|
||||||
|
present :member_info,my_member, with: Mobile::Entities::ProjectMember
|
||||||
|
present :status, 0
|
||||||
|
else
|
||||||
|
present :status, -1
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
desc "修改项目某成员角色信息"
|
||||||
|
params do
|
||||||
|
requires :id, type: Integer
|
||||||
|
requires :token, type: String
|
||||||
|
requires :user_id, type: Integer
|
||||||
|
requires :role_id, type: Integer
|
||||||
|
end
|
||||||
|
post 'edit_member_role' do
|
||||||
|
authenticate!
|
||||||
|
|
||||||
|
project = Project.find("#{params[:id]}")
|
||||||
|
|
||||||
|
my_member = project.member_principals.where("users.id=#{current_user.id}").first
|
||||||
|
|
||||||
|
#3管理 4开发 5报告
|
||||||
|
if !(my_member && my_member.roles[0] && my_member.roles[0].id == 3 ) || project.user_id == params[:user_id] || !(params[:role_id] == 3 || params[:role_id] == 4 || params[:role_id] == 5)
|
||||||
|
present :status, -1
|
||||||
|
else
|
||||||
|
ps = ProjectsService.new
|
||||||
|
|
||||||
|
status = ps.modify_user_project_role params
|
||||||
|
|
||||||
|
present :status, status
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
desc "新建项目"
|
||||||
|
params do
|
||||||
|
requires :token, type: String
|
||||||
|
requires :name, type: String, desc: '项目名称'
|
||||||
|
end
|
||||||
|
post 'create' do
|
||||||
|
authenticate!
|
||||||
|
|
||||||
|
ps = ProjectsService.new
|
||||||
|
|
||||||
|
status = ps.createNewProject params,current_user
|
||||||
|
|
||||||
|
|
||||||
|
present :status, 0
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
desc "加入项目"
|
||||||
|
params do
|
||||||
|
requires :token, type: String
|
||||||
|
requires :invite_code, type: String, desc: '邀请码'
|
||||||
|
end
|
||||||
|
post "join" do
|
||||||
|
authenticate!
|
||||||
|
|
||||||
|
# ps = ProjectsService.new
|
||||||
|
# status = ps.join_project({role: "5", openid: params[:openid], invite_code: params[:invite_code]}, current_user)
|
||||||
|
#
|
||||||
|
# present :status, status
|
||||||
|
|
||||||
|
{status:-1, message: '该功能将在近日开放,敬请期待!' }
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,32 @@
|
|||||||
|
module Mobile
|
||||||
|
module Entities
|
||||||
|
class Project < Grape::Entity
|
||||||
|
expose :name
|
||||||
|
expose :id
|
||||||
|
expose :user_id
|
||||||
|
# expose :invite_code
|
||||||
|
# expose :qrcode
|
||||||
|
expose :can_setting, if: lambda { |instance, options| options[:user] } do |instance, options|
|
||||||
|
current_user = options[:user]
|
||||||
|
|
||||||
|
my_member = instance.member_principals.where("users.id=#{current_user.id}").first
|
||||||
|
can_setting = false
|
||||||
|
if my_member && my_member.roles[0] && my_member.roles[0].id == 3
|
||||||
|
can_setting = true
|
||||||
|
end
|
||||||
|
can_setting
|
||||||
|
end
|
||||||
|
|
||||||
|
expose :is_creator, if: lambda { |instance, options| options[:user] } do |instance, options|
|
||||||
|
current_user = options[:user]
|
||||||
|
|
||||||
|
current_user.id == instance.user_id
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
expose :member_count, if: lambda { |instance, options| options[:user] } do |instance, options|
|
||||||
|
instance.members.count
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,35 @@
|
|||||||
|
module Mobile
|
||||||
|
module Entities
|
||||||
|
class ProjectMember < Grape::Entity
|
||||||
|
include Redmine::I18n
|
||||||
|
include ApplicationHelper
|
||||||
|
include ApiHelper
|
||||||
|
def self.member_expose(f)
|
||||||
|
expose f do |u,opt|
|
||||||
|
if u.is_a?(Hash) && u.key?(f)
|
||||||
|
u[f]
|
||||||
|
elsif u.is_a?(::Member)
|
||||||
|
if u.respond_to?(f)
|
||||||
|
u.send(f)
|
||||||
|
else
|
||||||
|
case f
|
||||||
|
when :roles_id
|
||||||
|
u.roles[0].id
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
expose :user, using: Mobile::Entities::User do |c, opt|
|
||||||
|
if c.is_a?(::Member)
|
||||||
|
c.user
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
member_expose :roles_id
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,13 @@
|
|||||||
|
#coding=utf-8
|
||||||
|
#
|
||||||
|
module Mobile
|
||||||
|
module Exceptions
|
||||||
|
class AuthException < StandardError
|
||||||
|
attr_reader :err_code, :msg
|
||||||
|
def initialize(code, msg)
|
||||||
|
@err_code = code
|
||||||
|
@msg = msg
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,145 @@
|
|||||||
|
#coding=utf-8
|
||||||
|
|
||||||
|
class ProjectsService
|
||||||
|
|
||||||
|
include ApplicationHelper
|
||||||
|
|
||||||
|
#获取指定用户的项目列表
|
||||||
|
def user_projects(user)
|
||||||
|
projects = user.projects.not_deleted.select("projects.*,(SELECT MAX(updated_at) FROM `forge_activities` WHERE forge_activities.project_id = projects.id) AS updated_at ").order("updated_at desc")
|
||||||
|
projects
|
||||||
|
end
|
||||||
|
|
||||||
|
#显示项目
|
||||||
|
def show_project(params,current_user)
|
||||||
|
project = Project.find(params[:id])
|
||||||
|
# project.generate_invite_code
|
||||||
|
# project.generate_qrcode
|
||||||
|
|
||||||
|
project
|
||||||
|
end
|
||||||
|
|
||||||
|
def send_wechat_create_project_notice user,project
|
||||||
|
count = ShieldWechatMessage.where("container_type='User' and container_id=#{user.id} and shield_type='Project' and shield_id=#{project.id}").count
|
||||||
|
Rails.logger.info "!!!!!!!!!!!!!!!!!!!!!!#{project}"
|
||||||
|
if count == 0
|
||||||
|
ws = WechatService.new
|
||||||
|
title = "恭喜您创建项目成功。"
|
||||||
|
ws.create_project_notice user.id, "create_project_notice", project.id,title, project.name, format_time(project.created_on),"点击查看项目详情。"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
def createNewProject params,user
|
||||||
|
status = -1
|
||||||
|
issue_custom_fields = IssueCustomField.sorted.all
|
||||||
|
trackers = Tracker.sorted.all
|
||||||
|
project = Project.new
|
||||||
|
|
||||||
|
project[:name] = params[:name]
|
||||||
|
project[:description] = ''
|
||||||
|
project[:is_public] = '0' #公开
|
||||||
|
project[:project_type] = 0
|
||||||
|
project[:project_new_type] = 1
|
||||||
|
project[:identifier] = Project.next_identifier if Setting.sequential_project_identifiers?
|
||||||
|
|
||||||
|
project.organization_id = params[:organization_id]
|
||||||
|
project.user_id = user.id
|
||||||
|
|
||||||
|
# if validate_parent_id && @project.save
|
||||||
|
if project.save
|
||||||
|
p = Project.find("#{project.id}")
|
||||||
|
send_wechat_create_project_notice user,p
|
||||||
|
r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first
|
||||||
|
m = Member.new(:user => user, :roles => [r])
|
||||||
|
# project's score
|
||||||
|
if ProjectScore.where("project_id=?", project.id).first.nil?
|
||||||
|
ProjectScore.create(:project_id => project.id, :score => false)
|
||||||
|
end
|
||||||
|
# end
|
||||||
|
project_info = ProjectInfo.new(:user_id => user.id, :project_id => project.id)
|
||||||
|
user_grades = UserGrade.create(:user_id => user.id, :project_id => project.id)
|
||||||
|
project_status = ProjectStatus.create(:project_id => project.id, :watchers_count => 0, :changesets_count => 0, :project_type => project.project_type,:grade => 0)
|
||||||
|
project.members << m
|
||||||
|
project.project_infos << project_info
|
||||||
|
status = 0
|
||||||
|
end
|
||||||
|
status
|
||||||
|
end
|
||||||
|
|
||||||
|
#修改项目成员角色
|
||||||
|
def modify_user_project_role params
|
||||||
|
status = -1
|
||||||
|
|
||||||
|
project = Project.find("#{params[:id]}")
|
||||||
|
|
||||||
|
member = project.member_principals.includes(:roles, :principal).where("user_id=?",params[:user_id]).first
|
||||||
|
|
||||||
|
if member
|
||||||
|
member.member_roles[0].role_id = params[:role_id]
|
||||||
|
|
||||||
|
|
||||||
|
role = Role.find(params[:role_id])
|
||||||
|
if role.allowed_to?(:is_manager)
|
||||||
|
projectInfo = ProjectInfo.new(:user_id => member.user_id, :project_id => project.id)
|
||||||
|
projectInfo.save
|
||||||
|
else
|
||||||
|
user_admin = ProjectInfo.where("user_id = ? and project_id = ?", member.user_id, project.id)
|
||||||
|
if user_admin.size > 0
|
||||||
|
user_admin.each do |user|
|
||||||
|
user.destroy
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if member.member_roles[0].save
|
||||||
|
status = 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
status
|
||||||
|
end
|
||||||
|
|
||||||
|
class JoinProjectError < Errors
|
||||||
|
define_error [
|
||||||
|
0, '加入成功',
|
||||||
|
1, '您的邀请码不正确',
|
||||||
|
2, '您还未登录',
|
||||||
|
3, '您已经是该项目的管理人员',
|
||||||
|
4, '您已经是该项目的开发人员',
|
||||||
|
5, '您已经是该项目的报告人员',
|
||||||
|
6, '该项目不存在或已被删除啦',
|
||||||
|
'未知错误,请稍后再试'
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
def join_project params,current_user
|
||||||
|
status = -1
|
||||||
|
project = project.find_by_invite_code(params[:invite_code]) if params[:invite_code]
|
||||||
|
|
||||||
|
if project
|
||||||
|
if project[:is_delete] == 1
|
||||||
|
status = 6
|
||||||
|
else
|
||||||
|
if current_user.member_of?(project) #如果已经是成员
|
||||||
|
member = project.member_principals.includes(:roles, :principal).where("user_id=?",current_user.id).first
|
||||||
|
status = member.member_roles[0].role_id
|
||||||
|
else
|
||||||
|
if params[:invite_code].present?
|
||||||
|
members = []
|
||||||
|
members << Member.new(:role_ids => [5], :user_id => current_user.id)
|
||||||
|
project.members << members
|
||||||
|
projectInfo = ProjectInfo.new(:user_id => current_user.id, :project_id => project.id)
|
||||||
|
projectInfo.save
|
||||||
|
status = 0
|
||||||
|
else
|
||||||
|
status = 4
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
status = 4
|
||||||
|
end
|
||||||
|
status
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
@ -0,0 +1,55 @@
|
|||||||
|
<%= stylesheet_link_tag 'css/common','css/popup' %>
|
||||||
|
<div class="boxContainer" style="height: auto;">
|
||||||
|
<div class="sendText fl mr10" style="width: auto">更改为</div>
|
||||||
|
<div class="cl"></div>
|
||||||
|
<!--<div class="resourcePopupClose"> <a href="javascript:void(0);" class="resourceClose" onclick="closeModal();"></a></div>-->
|
||||||
|
<div>
|
||||||
|
<!--<input type="text" name="search" placeholder="输入班级ID或者名称搜索" class="subjectSearch fr" />-->
|
||||||
|
<input type="text" id="search_course_input" value="<%= @search %>" name="search" placeholder="输入名称搜索" class="mt10 mb10 course-search" />
|
||||||
|
</div>
|
||||||
|
<div id="schools_list">
|
||||||
|
<%= render :partial => "admin/update_school_form", :locals => {:schools => schools, :edit_id => edit_id} %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script type="text/javascript">
|
||||||
|
function school_submit() {
|
||||||
|
var checkboxs = $("input[name='school_id[]']:checked");
|
||||||
|
if(checkboxs.length == 0) {
|
||||||
|
$("#choose_courses_notice").text("请选择单位");
|
||||||
|
} else{
|
||||||
|
$("#choose_courses_notice").text("");
|
||||||
|
$("#schools_list_form").submit();
|
||||||
|
hideModal();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var lastSearchCondition = '';
|
||||||
|
var count = 0;
|
||||||
|
function search_courses(e){
|
||||||
|
if($(e.target).val().trim() == lastSearchCondition && lastSearchCondition != '')
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
lastSearchCondition = $(e.target).val().trim();
|
||||||
|
$.ajax({
|
||||||
|
url: '<%= url_for(:controller => 'admin', :action => 'all_schools') %>'+'?search='+ e.target.value+'&school_id=<%=edit_id %>',
|
||||||
|
type:'get',
|
||||||
|
data: {is_observe:true},
|
||||||
|
success: function(data){ },
|
||||||
|
beforeSend: function(){ $(this).addClass('ajax-loading'); },
|
||||||
|
complete: function(){ $(this).removeClass('ajax-loading'); }
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function throttle(method,context,e){
|
||||||
|
clearTimeout(method.tId);
|
||||||
|
method.tId=setTimeout(function(){
|
||||||
|
method.call(context,e);
|
||||||
|
},500);
|
||||||
|
}
|
||||||
|
|
||||||
|
//查询项目
|
||||||
|
$("input[name='search']").on('input', function (e) {
|
||||||
|
throttle(search_courses,window,e);
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
@ -0,0 +1,27 @@
|
|||||||
|
<%= form_tag admin_edit_applied_schools_path(:applied_id =>edit_id), :id => 'schools_list_form' %>
|
||||||
|
<div>
|
||||||
|
<%#= hidden_field_tag(:send_id, edit_id) %>
|
||||||
|
<div class="courseReferContainer">
|
||||||
|
<% if !schools.empty? %>
|
||||||
|
<% schools.each do |school| %>
|
||||||
|
<ul class="courseSend">
|
||||||
|
<li class="" style="display:inline-block">
|
||||||
|
<input name="school_id[]" type="radio" value="<%= school.id %>" class="courseSendCheckbox"/>
|
||||||
|
</li>
|
||||||
|
<li class="sendCourseName"><%= truncate(school.name, :lendght => 25)%></li>
|
||||||
|
</ul>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="cl"></div>
|
||||||
|
<span id="choose_courses_notice" class="c_red"></span>
|
||||||
|
<div>
|
||||||
|
<div class="courseSendSubmit">
|
||||||
|
<a href="javascript:void(0);" onfocus='this.blur();' onclick="school_submit();" class="sendSourceText">确定</a>
|
||||||
|
</div>
|
||||||
|
<div class="courseSendCancel">
|
||||||
|
<a href="javascript:void(0);" class="sendSourceText" onclick="hideModal();">取消</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="cl"></div>
|
@ -0,0 +1,11 @@
|
|||||||
|
<% if params[:search].nil? %>
|
||||||
|
$("#ajax-modal").html('<%= escape_javascript( render :partial => 'admin/all_schools', :locals => {:schools => @schools, :edit_id => @edit_id}) %>');
|
||||||
|
showModal('ajax-modal', '452px');
|
||||||
|
$('#ajax-modal').siblings().remove();
|
||||||
|
$('#ajax-modal').before("<a href='javascript:void(0)' onclick='hideModal();' style='margin-left: 435px;' class='resourceClose'></a>");
|
||||||
|
$('#ajax-modal').parent().css("top","50%").css("left","50%");
|
||||||
|
$('#ajax-modal').parent().addClass("popbox").addClass("resourceUploadPopup");
|
||||||
|
$('#ajax-modal').css("padding-left","16px").css("padding-bottom","16px");
|
||||||
|
<% else %>
|
||||||
|
$("#schools_list").html("<%= escape_javascript(render :partial => 'admin/update_school_form', :locals => {:schools => @schools, :edit_id => @edit_id}) %>");
|
||||||
|
<% end %>
|
@ -1,3 +1,3 @@
|
|||||||
var htmlvalue = "<%= escape_javascript(render :partial => 'applied_join_project', locals: {:project_id => @project.id}) %>";
|
var htmlvalue = "<%= escape_javascript(render :partial => 'applied_join_project', locals: {:project_id => (@project.nil? ? nil : @project.id)}) %>";
|
||||||
pop_box_new(htmlvalue,460,40,50);
|
pop_box_new(htmlvalue,460,40,50);
|
||||||
|
|
||||||
|
@ -0,0 +1,5 @@
|
|||||||
|
<% if @flash_message %>
|
||||||
|
alert("<%= @flash_message %>");
|
||||||
|
<% else%>
|
||||||
|
$("#applied_project_<%= @applied_message.id %>").html('<%= render :partial => "users/user_message_applide_action", :locals =>{:ma => @applied_message} %>');
|
||||||
|
<% end%>
|
@ -0,0 +1 @@
|
|||||||
|
$("#applied_project_<%= @applied_message.id %>").html('<%= render :partial => "users/user_message_applide_action", :locals =>{:ma => @applied_message} %>');
|
@ -0,0 +1,9 @@
|
|||||||
|
<% if !User.current.member_of?(@project) && User.current.login? && !User.current.admin %>
|
||||||
|
<span><%= watcher_link_for_project(@project, User.current) %></span>
|
||||||
|
<!--加入项目 -->
|
||||||
|
<% if AppliedProject.where(:user_id => User.current, :project_id => @project_id).first.nil? %>
|
||||||
|
<%= join_in_project_link(@project, User.current) %>
|
||||||
|
<% else %>
|
||||||
|
等待审批
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
@ -0,0 +1,12 @@
|
|||||||
|
<% if allow_to_show(ma) %>
|
||||||
|
<%= link_to "同意", allow_to_join_project_project_memberships_path(:project_id => ma.project_id, :applied_message_id => ma.id), :remote => true, :method => :post, :class => "link-blue"%> |
|
||||||
|
<%= link_to "拒绝", refused_allow_to_join_project_project_memberships_path(:project_id => ma.project_id, :applied_message_id => ma.id), :remote => true, :method => :get, :class => "link-blue" %>
|
||||||
|
<% elsif ma.status == 4 %>
|
||||||
|
<span class="fontGrey3">被拒绝</span>
|
||||||
|
<% elsif ma.status == 5 %>
|
||||||
|
<span class="fontGrey3">您已拒绝</span>
|
||||||
|
<% elsif ma.status == 6 %>
|
||||||
|
<span class="fontGrey3">已通过</span>
|
||||||
|
<% elsif ma.status == 7 %>
|
||||||
|
<span class="fontGrey3">您已同意</span>
|
||||||
|
<% end %>
|
@ -0,0 +1,2 @@
|
|||||||
|
<%=link_to applied_project_users(ma), user_path(applied_project_users(ma)), :class => "newsBlue homepageNewsPublisher", :target => '_blank' %>
|
||||||
|
<span class="homepageNewsType fl"><%= applied_project_tip(ma) %></span>
|
@ -1,34 +1,70 @@
|
|||||||
<% if ma.class == AppliedMessage %>
|
<% if ma.class == AppliedMessage %>
|
||||||
<!--申请加入项目-->
|
<!--申请加入项目-->
|
||||||
<% if ma.applied_type == "ApplyAddSchools" %>
|
<% if ma.applied_type == "ApplyAddSchools" %>
|
||||||
|
<% if ma.status == 1 || ma.status == 2 || ma.status == 3 || ma.status == 4 %>
|
||||||
<ul class="homepageNewsList fl">
|
<ul class="homepageNewsList fl">
|
||||||
<li class="homepageNewsPortrait fl">
|
<li class="homepageNewsPortrait fl">
|
||||||
<a href="javascript:void(0);"><%= link_to image_tag(url_to_avatar(ma.user), :width => "30", :height => "30"), user_path(ma.user), :target => '_blank' %></a>
|
<a href="javascript:void(0);">
|
||||||
|
<% if ma.status == 1 || ma.status == 2 || ma.status == 3 %>
|
||||||
|
<%= image_tag("/images/trustie_logo1.png", width: "30px", height: "30px", class: "mt3") %>
|
||||||
|
<% elsif ma.status == 4 %>
|
||||||
|
<%= link_to image_tag(url_to_avatar(ma.user), :width => "30", :height => "30"), user_path(ma.user), :target => '_blank' %>
|
||||||
|
<% end %>
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="homepageNewsPubType fl">
|
<li class="homepageNewsPubType fl">
|
||||||
<%=link_to ma.user, user_path(ma.user), :class => "newsBlue homepageNewsPublisher", :target => '_blank' %>
|
<% if ma.status == 1 %>
|
||||||
<span class="<%= ma.viewed == 0 ? "homepageNewsTypeNotRead fl" : "homepageNewsType fl" %>">批准你加入项目:</span>
|
<span class="newsBlue homepageNewsPublisher">系统提示</span>
|
||||||
|
<span class="<%= ma.viewed == 0 ? "homepageNewsTypeNotRead fl" : "homepageNewsType fl" %>">您添加新的高校(单位):</span>
|
||||||
|
<li class="homepageNewsContent fl">
|
||||||
|
<a class ="#{ma.viewed == 0 ? 'newsBlack' : 'newsGrey'}" target = '_blank' title="<%= ma.name %>的申请,已通过">“<%= ma.name %>”的申请,已通过</a>
|
||||||
|
</li>
|
||||||
|
<li class="homepageNewsTime fl"><%= time_tag(ma.created_at).html_safe %> </li>
|
||||||
|
<% elsif ma.status == 2 %>
|
||||||
|
<span class="newsBlue homepageNewsPublisher">系统提示</span>
|
||||||
|
<span class="<%= ma.viewed == 0 ? "homepageNewsTypeNotRead fl" : "homepageNewsType fl" %>">您添加新的高校(单位):</span>
|
||||||
|
<li class="homepageNewsContent fl">
|
||||||
|
<a class ="#{ma.viewed == 0 ? 'newsBlack' : 'newsGrey'}" target = '_blank' title="“<%= ma.applied.name %>”的申请,因名称不合法,系统已将其更改为“<%= ma.name %>”">“<%= ma.applied.name %>”的申请,因名称不合法,系统已将其更改为“<%= ma.name %>”</a>
|
||||||
|
</li>
|
||||||
|
<li class="homepageNewsTime fl"><%= time_tag(ma.created_at).html_safe %> </li>
|
||||||
|
<% elsif ma.status == 3 %>
|
||||||
|
<span class="newsBlue homepageNewsPublisher">系统提示</span>
|
||||||
|
<span class="<%= ma.viewed == 0 ? "homepageNewsTypeNotRead fl" : "homepageNewsType fl" %>">您添加新的高校(单位):</span>
|
||||||
|
<li class="homepageNewsContent fl">
|
||||||
|
<%= link_to "“"+ma.name+"”" + "的申请,因名称不合法,已被拒绝,请重新编辑您的基本资料", { :controller=> "my",:action => "account" }, :title => "“#{ma.name}”的申请,因名称不合法,已被拒绝,请重新编辑您的基本资料", :target => '_blank'%>
|
||||||
</li>
|
</li>
|
||||||
|
<li class="homepageNewsTime fl"><%= time_tag(ma.created_at).html_safe %> </li>
|
||||||
|
<% elsif ma.status == 4 %>
|
||||||
|
<%=link_to User.where("id=?", ma.applied_user_id).first.show_name, user_path(ma.user), :class => "newsBlue homepageNewsPublisher", :target => '_blank' %>
|
||||||
|
<span class="<%= ma.viewed == 0 ? "homepageNewsTypeNotRead fl" : "homepageNewsType fl" %>"> 申请了单位:</span>
|
||||||
<li class="homepageNewsContent fl">
|
<li class="homepageNewsContent fl">
|
||||||
<a class ="#{ma.viewed == 0 ? 'newsBlack' : 'newsGrey'}" target = '_blank'><%= ma.applied.name %></a>
|
<a class ="#{ma.viewed == 0 ? 'newsBlack' : 'newsGrey'}" target = '_blank'>
|
||||||
|
<%= link_to User.where("id=?", ma.applied_user_id).first.show_name + "提交了申请:添加新的单位“#{ma.name}”", unapplied_schools_path(), :title => "#{User.where("id=?", ma.applied_user_id).first.show_name}提交了申请:添加新的单位“#{ma.name}”" %></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="homepageNewsTime fl"><%= time_tag(ma.created_at).html_safe %> </li>
|
<li class="homepageNewsTime fl"><%= time_tag(ma.created_at).html_safe %> </li>
|
||||||
|
<% end %>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
<% end %>
|
||||||
<% elsif ma && ma.applied_type == "AppliedProject" %>
|
<% elsif ma && ma.applied_type == "AppliedProject" %>
|
||||||
<ul class="homepageNewsList fl">
|
<ul class="homepageNewsList fl">
|
||||||
<li class="homepageNewsPortrait fl">
|
<li class="homepageNewsPortrait fl">
|
||||||
<a href="javascript:void(0);"><%=link_to image_tag(url_to_avatar(ma.applied.user), :width => "30", :height => "30"), user_path(ma.applied.user), :target => '_blank' %></a>
|
<a href="javascript:void(0);"><%=link_to image_tag(url_to_avatar(applied_project_users(ma)), :width => "30", :height => "30"), user_path(applied_project_users(ma)), :target => '_blank' %></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="homepageNewsPubType fl">
|
<li class="homepageNewsPubType fl">
|
||||||
<%=link_to ma.applied.user, user_path(ma.applied.user), :class => "newsBlue homepageNewsPublisher", :target => '_blank' %>
|
<%= render :partial => "users/user_message_applide_users", :locals =>{:ma => ma} %>
|
||||||
<span class="<%= ma.viewed == 0 ? "homepageNewsTypeNotRead fl" : "homepageNewsType fl" %>">申请加入项目:</span>
|
|
||||||
</li>
|
</li>
|
||||||
<li class="homepageNewsContent fl"><a href="javascript:void(0);" class="newsGrey">
|
<li class="homepageNewsContent fl" style="width:283px;"><a href="javascript:void(0);" class="newsGrey">
|
||||||
以“<%= applied_project_message_type(ma.applied.role) %>”身份加入
|
以“<%= applied_project_message_type(ma.role) %>”身份加入
|
||||||
<%= link_to ma.applied.project, settings_project_path(:id => ma.applied.project.id, :tab => "members"), :class => "link-blue", :target => '_blank' %>
|
<% project = Project.find(ma.project_id) %>
|
||||||
:同意 | 拒绝
|
<%= link_to project.name, project_path(ma.project_id), :class => "link-blue", :target => '_blank', :title => "#{project.name}" %>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li class="fl" style="width:71px; height:49px;">
|
||||||
|
<span id="applied_project_<%= ma.id %>">
|
||||||
|
<%= render :partial => "users/user_message_applide_action", :locals =>{:ma => ma} %>
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
<li class="homepageNewsTime fl"><%= time_tag(ma.created_at).html_safe %> </li>
|
<li class="homepageNewsTime fl"><%= time_tag(ma.created_at).html_safe %> </li>
|
||||||
</ul>
|
</ul>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
@ -0,0 +1,5 @@
|
|||||||
|
class AddNameToAppliedMessage < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
add_column :applied_messages, :name, :string
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,5 @@
|
|||||||
|
class AddAppliedUserIdToAppliedMessage < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
add_column :applied_messages, :applied_user_id, :integer
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,5 @@
|
|||||||
|
class AddRoleToAppliedMessage < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
add_column :applied_messages, :role, :integer
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,5 @@
|
|||||||
|
class AddProjectIdToAppliedMessage < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
add_column :applied_messages, :project_id, :integer
|
||||||
|
end
|
||||||
|
end
|
@ -1 +0,0 @@
|
|||||||
Subproject commit 222a9bdd72014f197baf2131ab71cc41660111ed
|
|
@ -0,0 +1,25 @@
|
|||||||
|
#coding=utf-8
|
||||||
|
#
|
||||||
|
|
||||||
|
module Wechat
|
||||||
|
class CacheFile
|
||||||
|
class << self
|
||||||
|
def cache
|
||||||
|
if defined?(Rails)
|
||||||
|
Rails.cache
|
||||||
|
else
|
||||||
|
File
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def read(key)
|
||||||
|
cache.read(key) || ''
|
||||||
|
end
|
||||||
|
|
||||||
|
def write(key, val)
|
||||||
|
cache.write(key, val)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -1,3 +0,0 @@
|
|||||||
[submodule "app/assets/javascripts/ckeditor-releases"]
|
|
||||||
path = app/assets/javascripts/ckeditor-releases
|
|
||||||
url = git://github.com/ckeditor/ckeditor-releases.git
|
|
@ -0,0 +1,21 @@
|
|||||||
|
<div class="post-container">
|
||||||
|
<div loading-spinner></div>
|
||||||
|
<div ng-show="current_edit_member" class="post-container" style="padding-bottom:50px;">
|
||||||
|
<div class="blue-title">角色变更</div>
|
||||||
|
<div class="class-detail-row f13 c-grey3"><img ng-src="/images/wechat/{{current_edit_member.user.gender==0 ? 'male' : 'female'}}.jpg" width="30" class="fl ml10 img-circle mt4" /><span class="fl mt10 ml10">{{current_edit_member.user.realname == "" ? current_edit_member.user.name : current_edit_member.user.realname}}</span><img ng-src="/images/wechat/{{current_edit_member.user.gender==0 ? 'male' : 'female'}}.png" width="15" class="fl ml10 mt10" /><div class="cl"></div> </div>
|
||||||
|
<div class="course-list-row f13 c-grey3 mt10"><span class="fl ml10">角色</span></div>
|
||||||
|
<ul class="class-list f13 c-grey3">
|
||||||
|
<li><span class="fl ml10 class-list-name hidden">教师</span><span ng-click="selectRole(9)" ng-class="['login-box', 'fr', 'mr10', 'mt12','img-circle', {'checked': current_edit_member.roles_id == 9}]"></span></li>
|
||||||
|
<li><span class="fl ml10 class-list-name hidden">教辅</span><span ng-click="selectRole(7)" ng-class="['login-box', 'fr', 'mr10', 'mt12','img-circle', {'checked': current_edit_member.roles_id == 7}]"></span></li>
|
||||||
|
<li class="border-bottom-none"><span class="fl ml10 class-list-name hidden">学生</span><span ng-click="selectRole(10)" ng-class="['login-box', 'fr', 'mr10', 'mt12','img-circle', {'checked': current_edit_member.roles_id == 10}]"></span></li>
|
||||||
|
</ul>
|
||||||
|
<div class="bottom-tab-wrap mt10">
|
||||||
|
<a href="javascript:void(0);" ng-click="cancel()" class="weixin-tab c-grey border-top">取消</a>
|
||||||
|
<a href="javascript:void(0);" ng-click="edit_member_role()" class="weixin-tab link-blue2 border-top">确定</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<my-alert message="alertService.message" title="alertService.title" visible="alertService.visible" cb="alertService.cb"></my-alert>
|
||||||
|
</div>
|
@ -0,0 +1,21 @@
|
|||||||
|
<div class="post-container">
|
||||||
|
<div loading-spinner></div>
|
||||||
|
<div ng-show="current_edit_member" class="post-container" style="padding-bottom:50px;">
|
||||||
|
<div class="blue-title">角色变更</div>
|
||||||
|
<div class="class-detail-row f13 c-grey3"><img ng-src="/images/wechat/{{current_edit_member.user.gender==0 ? 'male' : 'female'}}.jpg" width="30" class="fl ml10 img-circle mt4" /><span class="fl mt10 ml10">{{current_edit_member.user.real_name == "" ? current_edit_member.user.name : current_edit_member.user.real_name}}</span><img ng-src="/images/wechat/{{current_edit_member.user.gender==0 ? 'male' : 'female'}}.png" width="15" class="fl ml10 mt10" /><div class="cl"></div> </div>
|
||||||
|
<div class="course-list-row f13 c-grey3 mt10"><span class="fl ml10">角色</span></div>
|
||||||
|
<ul class="class-list f13 c-grey3">
|
||||||
|
<li><span class="fl ml10 class-list-name hidden">管理人员</span><span ng-click="selectRole(3)" ng-class="['login-box', 'fr', 'mr10', 'mt12','img-circle', {'checked': current_edit_member.roles_id == 3}]"></span></li>
|
||||||
|
<li><span class="fl ml10 class-list-name hidden">开发人员</span><span ng-click="selectRole(4)" ng-class="['login-box', 'fr', 'mr10', 'mt12','img-circle', {'checked': current_edit_member.roles_id == 4}]"></span></li>
|
||||||
|
<li class="border-bottom-none"><span class="fl ml10 class-list-name hidden">报告人员</span><span ng-click="selectRole(5)" ng-class="['login-box', 'fr', 'mr10', 'mt12','img-circle', {'checked': current_edit_member.roles_id == 5}]"></span></li>
|
||||||
|
</ul>
|
||||||
|
<div class="bottom-tab-wrap mt10">
|
||||||
|
<a href="javascript:void(0);" ng-click="cancel()" class="weixin-tab c-grey border-top">取消</a>
|
||||||
|
<a href="javascript:void(0);" ng-click="edit_member_role()" class="weixin-tab link-blue2 border-top">确定</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<my-alert message="alertService.message" title="alertService.title" visible="alertService.visible" cb="alertService.cb"></my-alert>
|
||||||
|
</div>
|
@ -0,0 +1,26 @@
|
|||||||
|
<div class="post-container">
|
||||||
|
<div loading-spinner></div>
|
||||||
|
|
||||||
|
<div class="blue-title">新建项目</div>
|
||||||
|
<form novalidate name="classForm">
|
||||||
|
<div class="course-list-row f13 c-grey3 mt30"><span class="fl ml15 c-grey3">项目名称</span><input class="new-class-input ml25" ng-model="project.name" required placeholder="如:团队协作方法与机制研究" /></div>
|
||||||
|
<a ng-click="newProject(classForm, project)" ng-class="['finish-btn', {'btn-disabled':!classForm.$valid} ]" >完成</a>
|
||||||
|
<div class="f12 c-grey6 tac">
|
||||||
|
<span class="f13 fb c-grey3">项目功能特性(微信版)</span>
|
||||||
|
<ul class="project-intro mb15 mt5">
|
||||||
|
<li>创建项目、加入项目</li>
|
||||||
|
<li>邀请成员、修改角色</li>
|
||||||
|
<li>浏览、回复项目动态</li>
|
||||||
|
<li>点赞、分享项目动态</li>
|
||||||
|
</ul>
|
||||||
|
<span class="f13 fb c-grey3">更多项目特性(浏览器版)</span>
|
||||||
|
<ul class="project-intro mt5">
|
||||||
|
<li>发布任务、问题跟踪</li>
|
||||||
|
<li>代码托管、质量分析</li>
|
||||||
|
<li>资源分享、交流研讨</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<my-alert message="alertService.message" title="alertService.title" visible="alertService.visible" cb="alertService.cb"></my-alert>
|
||||||
|
</div>
|
@ -0,0 +1,132 @@
|
|||||||
|
<div class="post-container">
|
||||||
|
<div loading-spinner></div>
|
||||||
|
<div class="class-detail-name"><span class="course-name-width hidden inline-block">{{project.name}}</span><span ng-click="invite()" class="f13 blue-title-sub">邀请码</span></div>
|
||||||
|
<div class="tab-wrap">
|
||||||
|
<a ng-click="tab($index+1)" ng-repeat="menu in menus" id="class_tab_1" href="javascript:void(0);" ng-class="['weixin-tab', {'class-tab-active': currentTab == $index+1}]">{{menu}}</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div ng-class="{'undis': currentTab != 1}">
|
||||||
|
<div ng-repeat="act in project_activities">
|
||||||
|
<div ng-if="act.container_type=='Project' ">
|
||||||
|
<div ng-if="act.act_type=='Issue'">
|
||||||
|
<div class="post-container">
|
||||||
|
<div class="post-wrapper">
|
||||||
|
<div class="post-main">
|
||||||
|
<div dataID = "{{act.act_id}}" ng-click="goDetail('issues',act.act_id, act.id)" id="act_{{act.id}}">
|
||||||
|
<div class="post-avatar fl mr10"><img ng-src="{{replaceUrl(act.author.img_url)}}" width="30" height="30" class="border-radius img-circle" /></div>
|
||||||
|
<div class="post-dynamic-author hidden fl">
|
||||||
|
<span ng-if="act.author.realname != ' '">{{act.author.realname}}</span>
|
||||||
|
<span ng-if="act.author.realname == ' '">{{act.author.nickname}}</span>
|
||||||
|
<img ng-if="act.author.gender == '0'" src="images/wechat/male.png" width="14" class="ml5" />
|
||||||
|
<img ng-if="act.author.gender != '0'" src="images/wechat/female.png" width="14" class="ml5" />
|
||||||
|
</div>
|
||||||
|
<div class="post-dynamic-time fr f13">{{act.latest_update}}</div>
|
||||||
|
<div class="cl"></div>
|
||||||
|
<div class="post-dynamic-title c-grey3 hidden mt12 fb">【问题】{{act.subject|safeHtml}}</div>
|
||||||
|
<div class="post-content c-grey3 mt10 mb10">
|
||||||
|
<div class="post-all-content" ng-bind-html="act.description|safeHtml"></div>
|
||||||
|
<span class="mr15 f13 c-grey2">状态:{{act.issue_detail.issue_status}}</span> <span class="mr15 f13 c-grey2">优先级:{{act.issue_detail.issue_priority}}</span> <br />
|
||||||
|
<span class="mr15 f13 c-grey2">指派给:{{act.issue_detail.issue_assigned_to}}</span> <span class="mr15 f13 c-grey2">完成度:{{act.issue_detail.done_ratio}}%</span>
|
||||||
|
</div>
|
||||||
|
<div class="cl"></div>
|
||||||
|
</div>
|
||||||
|
<div class="post-dynamic-from hidden fl c-grey3">来源: <span class="c-blue">{{act.course_project_name}}</span></div>
|
||||||
|
<div class="fr f13">
|
||||||
|
<div ng-if="!act.praise_count" ng-click="addPraise(act);"><img src="/images/wechat/w_praise.png" width="20" style="vertical-align:top; margin-top:2px;" class="mr5" /><span>赞</span></div>
|
||||||
|
<div ng-if="act.praise_count && !act.has_praise" ng-click="addPraise(act);"><img src="/images/wechat/w_praise.png" width="20" style="vertical-align:top; margin-top:2px;" class="mr5" /><span>{{act.praise_count}}</span></div>
|
||||||
|
<div ng-if="act.has_praise" ng-click="decreasePraise(act);"><img src="/images/wechat/w_praised.png" width="20" style="vertical-align:top; margin-top:2px;" class="mr5" /><span>{{act.praise_count}}</span></div>
|
||||||
|
</div>
|
||||||
|
<div class="fr mr25 f13">
|
||||||
|
<a ng-if="!act.reply_count" ng-click="goDetail('issues',act.act_id, act.id)"><img src="/images/wechat/w_reply.png" width="20" style="vertical-align:top; margin-top:2px;" class="mr5" /><span style="vertical-align:top;">回复</span></a>
|
||||||
|
<a ng-if="act.reply_count" ng-click="goDetail('issues',act.act_id, act.id)"><img src="/images/wechat/w_reply.png" width="20" style="vertical-align:top; margin-top:2px;" class="mr5" /><span style="vertical-align:top;">{{act.reply_count}}</span></a>
|
||||||
|
</div>
|
||||||
|
<div class="cl"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div ng-if="act.act_type=='Message'">
|
||||||
|
<div class="post-container">
|
||||||
|
<div class="post-wrapper">
|
||||||
|
<div class="post-main">
|
||||||
|
<div dataID = "{{act.act_id}}" ng-click="goDetail('project_discussion',act.act_id, act.id)" id="act_{{act.id}}">
|
||||||
|
<div class="post-avatar fl mr10"><img ng-src="{{replaceUrl(act.author.img_url)}}" width="30" height="30" class="border-radius img-circle" /></div>
|
||||||
|
<div class="post-dynamic-author hidden fl">
|
||||||
|
<span ng-if="act.author.realname != ' '">{{act.author.realname}}</span>
|
||||||
|
<span ng-if="act.author.realname == ' '">{{act.author.nickname}}</span>
|
||||||
|
<img ng-if="act.author.gender == '0'" src="images/wechat/male.png" width="14" class="ml5" />
|
||||||
|
<img ng-if="act.author.gender != '0'" src="images/wechat/female.png" width="14" class="ml5" />
|
||||||
|
</div>
|
||||||
|
<div class="post-dynamic-time fr f13">{{act.latest_update}}</div>
|
||||||
|
<div class="cl"></div>
|
||||||
|
<div class="post-dynamic-title c-grey3 hidden mt12 fb">【帖子】{{act.subject|safeHtml}}</div>
|
||||||
|
<div class="post-content c-grey3 mt10 mb10">
|
||||||
|
<div class="post-all-content" ng-bind-html="act.description|safeHtml"></div>
|
||||||
|
</div>
|
||||||
|
<div class="cl"></div>
|
||||||
|
</div>
|
||||||
|
<div class="post-dynamic-from hidden fl c-grey3">来源: <span class="c-blue">{{act.course_project_name}}</span></div>
|
||||||
|
<div class="fr f13">
|
||||||
|
<div ng-if="!act.praise_count" ng-click="addPraise(act);"><img src="/images/wechat/w_praise.png" width="20" style="vertical-align:top; margin-top:2px;" class="mr5" /><span>赞</span></div>
|
||||||
|
<div ng-if="act.praise_count && !act.has_praise" ng-click="addPraise(act);"><img src="/images/wechat/w_praise.png" width="20" style="vertical-align:top; margin-top:2px;" class="mr5" /><span>{{act.praise_count}}</span></div>
|
||||||
|
<div ng-if="act.has_praise" ng-click="decreasePraise(act);"><img src="/images/wechat/w_praised.png" width="20" style="vertical-align:top; margin-top:2px;" class="mr5" /><span>{{act.praise_count}}</span></div>
|
||||||
|
</div>
|
||||||
|
<div class="fr mr25 f13">
|
||||||
|
<a ng-if="!act.reply_count" ng-click="goDetail('project_discussion',act.act_id, act.id)"><img src="/images/wechat/w_reply.png" width="20" style="vertical-align:top; margin-top:2px;" class="mr5" /><span style="vertical-align:top;">回复</span></a>
|
||||||
|
<a ng-if="act.reply_count" ng-click="goDetail('project_discussion',act.act_id, act.id)"><img src="/images/wechat/w_reply.png" width="20" style="vertical-align:top; margin-top:2px;" class="mr5" /><span style="vertical-align:top;">{{act.reply_count}}</span></a>
|
||||||
|
</div>
|
||||||
|
<div class="cl"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div ng-if="act.act_type=='Project'">
|
||||||
|
<div class="post-container">
|
||||||
|
<div class="post-wrapper">
|
||||||
|
<div class="post-main">
|
||||||
|
<div class="post-avatar fl mr10"><img ng-src="{{replaceUrl(act.author.img_url)}}" width="30" height="30" class="border-radius img-circle" /></div>
|
||||||
|
<div class="post-title hidden mb5"><span class="c-grey3 f13 fb mr10">{{act.author.realname}}</span>创建了<span class="c-grey3 f13 fb ml10">{{act.course_project_name}} | 项目</span></div>
|
||||||
|
<div class="post-title hidden"><span class="mr10">{{act.latest_update}}</span></div>
|
||||||
|
<div class="cl"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div ng-if="project_has_more">
|
||||||
|
<div id="more_project_activities" class="more-events mt10" ng-click="getActivities(project_activities_page+1);">更多</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div ng-class="{'undis': currentTab != 2}">
|
||||||
|
<div class="class-search-wrap">
|
||||||
|
<div class="class-search-inner"> <img src="/images/wechat/search.png" width="18" class="class-search-icon" />
|
||||||
|
<input class="class-detail-search" ng-model="searchText" placeholder="输入关键词进行搜索" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="member-banner f13 c-grey3">管理人员({{project_master_members.length}})</div>
|
||||||
|
<div class="class-member-row f13 c-grey3" ng-repeat="master in project_master_members|filter:searchText">
|
||||||
|
<img ng-src="/images/wechat/{{master.user.gender==0 ? 'male' : 'female'}}.jpg" width="30" class="fl ml10 img-circle" /><span class="fl ml10 mt5">{{master.user.real_name == "" ? master.user.name : master.user.real_name }}</span><span class="fr mr10 c-grey2">{{teacher.role_name|identify}}</span><img ng-src="/images/wechat/{{master.user.gender==0 ? 'male' : 'female'}}.png" width="15" class="fl ml10 mt5" />
|
||||||
|
<img src="/images/wechat/setting.png" ng-show = "master.user.id != project.user_id && project.can_setting" width="15" class="class-list-setting" ng-click="onSetting(master)" />
|
||||||
|
<div class="cl"></div>
|
||||||
|
</div>
|
||||||
|
<div class="member-banner f13 mt10 c-grey3">开发人员({{project_develop_members.length}})</div>
|
||||||
|
<div class="class-member-row f13 c-grey3" ng-repeat="develop in project_develop_members|filter:searchText">
|
||||||
|
<img ng-src="/images/wechat/{{develop.user.gender==0 ? 'male' : 'female'}}.jpg" width="30" class="fl ml10 img-circle" /><span class="fl ml10 mt5">{{develop.user.real_name == "" ? develop.user.name : develop.user.real_name}}</span><img ng-src="/images/wechat/{{develop.user.gender==0 ? 'male' : 'female'}}.png" width="15" class="fl ml10 mt5" />
|
||||||
|
<img src="/images/wechat/setting.png" ng-show = "master.user.id != project.user_id && project.can_setting " width="15" class="class-list-setting" ng-click="onSetting(develop)" />
|
||||||
|
<div class="cl"></div>
|
||||||
|
</div>
|
||||||
|
<div class="member-banner f13 mt10 c-grey3">报告人员({{project_report_members.length}})</div>
|
||||||
|
<div class="class-member-row f13 c-grey3" ng-repeat="report in project_report_members|filter:searchText">
|
||||||
|
<img ng-src="/images/wechat/{{report.user.gender==0 ? 'male' : 'female'}}.jpg" width="30" class="fl ml10 img-circle" /><span class="fl ml10 mt5">{{report.user.real_name == "" ? report.user.name : report.user.real_name}}</span><img ng-src="/images/wechat/{{report.user.gender==0 ? 'male' : 'female'}}.png" width="15" class="fl ml10 mt5" />
|
||||||
|
<img src="/images/wechat/setting.png" ng-show = "master.user.id != project.user_id && project.can_setting " width="15" class="class-list-setting" ng-click="onSetting(report)" />
|
||||||
|
<div class="cl"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<my-alert message="alertService.message" title="alertService.title" visible="alertService.visible" cb="alertService.cb"></my-alert>
|
||||||
|
</div>
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue