Merge branch 'weixin_guange' of https://git.trustie.net/jacknudt/trustieforge into weixin_guange

Conflicts:
	public/javascripts/wechat/wechat-dev.js
chenlw_dev
Tim 9 years ago
commit 406bb7930c

@ -1,244 +1,256 @@
#coding=utf-8 #coding=utf-8
class WechatsController < ActionController::Base class WechatsController < ActionController::Base
wechat_responder wechat_responder
include ApplicationHelper include ApplicationHelper
# default text responder when no other match # default text responder when no other match
on :text do |request, content| on :text do |request, content|
request.reply.text "您的意见已收到" # Just echo request.reply.text "您的意见已收到" # Just echo
end end
# When receive 'help', will trigger this responder # When receive 'help', will trigger this responder
on :text, with: 'help' do |request| on :text, with: 'help' do |request|
request.reply.text 'help content' request.reply.text 'help content'
end end
# When receive '<n>news', will match and will got count as <n> as parameter # When receive '<n>news', will match and will got count as <n> as parameter
on :text, with: /^(\d+) news$/ do |request, count| on :text, with: /^(\d+) news$/ do |request, count|
# Wechat article can only contain max 10 items, large than 10 will dropped. # Wechat article can only contain max 10 items, large than 10 will dropped.
news = (1..count.to_i).each_with_object([]) { |n, memo| memo << { title: 'News title', content: "No. #{n} news content" } } news = (1..count.to_i).each_with_object([]) { |n, memo| memo << { title: 'News title', content: "No. #{n} news content" } }
request.reply.news(news) do |article, n, index| # article is return object request.reply.news(news) do |article, n, index| # article is return object
article.item title: "#{index} #{n[:title]}", description: n[:content], pic_url: 'http://www.baidu.com/img/bdlogo.gif', url: 'http://www.baidu.com/' article.item title: "#{index} #{n[:title]}", description: n[:content], pic_url: 'http://www.baidu.com/img/bdlogo.gif', url: 'http://www.baidu.com/'
end end
end end
on :event, with: 'subscribe' do |request| on :event, with: 'subscribe' do |request|
default_msg(request) default_msg(request)
end end
# When unsubscribe user scan qrcode qrscene_xxxxxx to subscribe in public account # When unsubscribe user scan qrcode qrscene_xxxxxx to subscribe in public account
# notice user will subscribe public account at same time, so wechat won't trigger subscribe event any more # notice user will subscribe public account at same time, so wechat won't trigger subscribe event any more
on :scan, with: 'qrscene_xxxxxx' do |request, ticket| on :scan, with: 'qrscene_xxxxxx' do |request, ticket|
request.reply.text "Unsubscribe user #{request[:FromUserName]} Ticket #{ticket}" request.reply.text "Unsubscribe user #{request[:FromUserName]} Ticket #{ticket}"
end end
# When subscribe user scan scene_id in public account # When subscribe user scan scene_id in public account
on :scan, with: 'scene_id' do |request, ticket| on :scan, with: 'scene_id' do |request, ticket|
request.reply.text "Subscribe user #{request[:FromUserName]} Ticket #{ticket}" request.reply.text "Subscribe user #{request[:FromUserName]} Ticket #{ticket}"
end end
# When no any on :scan responder can match subscribe user scaned scene_id # When no any on :scan responder can match subscribe user scaned scene_id
on :event, with: 'scan' do |request| on :event, with: 'scan' do |request|
if request[:EventKey].present? if request[:EventKey].present?
request.reply.text "event scan got EventKey #{request[:EventKey]} Ticket #{request[:Ticket]}" request.reply.text "event scan got EventKey #{request[:EventKey]} Ticket #{request[:Ticket]}"
end end
end end
# When enterprise user press menu BINDING_QR_CODE and success to scan bar code # When enterprise user press menu BINDING_QR_CODE and success to scan bar code
on :scan, with: 'BINDING_QR_CODE' do |request, scan_result, scan_type| on :scan, with: 'BINDING_QR_CODE' do |request, scan_result, scan_type|
request.reply.text "User #{request[:FromUserName]} ScanResult #{scan_result} ScanType #{scan_type}" request.reply.text "User #{request[:FromUserName]} ScanResult #{scan_result} ScanType #{scan_type}"
end end
# Except QR code, wechat can also scan CODE_39 bar code in enterprise account # Except QR code, wechat can also scan CODE_39 bar code in enterprise account
on :scan, with: 'BINDING_BARCODE' do |message, scan_result| on :scan, with: 'BINDING_BARCODE' do |message, scan_result|
if scan_result.start_with? 'CODE_39,' if scan_result.start_with? 'CODE_39,'
message.reply.text "User: #{message[:FromUserName]} scan barcode, result is #{scan_result.split(',')[1]}" message.reply.text "User: #{message[:FromUserName]} scan barcode, result is #{scan_result.split(',')[1]}"
end end
end end
# When user click the menu button # When user click the menu button
on :click, with: 'BOOK_LUNCH' do |request, key| on :click, with: 'BOOK_LUNCH' do |request, key|
request.reply.text "User: #{request[:FromUserName]} click #{key}" request.reply.text "User: #{request[:FromUserName]} click #{key}"
end end
# When user view URL in the menu button # When user view URL in the menu button
on :view, with: 'http://wechat.somewhere.com/view_url' do |request, view| on :view, with: 'http://wechat.somewhere.com/view_url' do |request, view|
request.reply.text "#{request[:FromUserName]} view #{view}" request.reply.text "#{request[:FromUserName]} view #{view}"
end end
# When user sent the imsage # When user sent the imsage
on :image do |request| on :image do |request|
request.reply.image(request[:MediaId]) # Echo the sent image to user request.reply.image(request[:MediaId]) # Echo the sent image to user
end end
# When user sent the voice # When user sent the voice
on :voice do |request| on :voice do |request|
request.reply.voice(request[:MediaId]) # Echo the sent voice to user request.reply.voice(request[:MediaId]) # Echo the sent voice to user
end end
# When user sent the video # When user sent the video
on :video do |request| on :video do |request|
nickname = wechat.user(request[:FromUserName])['nickname'] # Call wechat api to get sender nickname nickname = wechat.user(request[:FromUserName])['nickname'] # Call wechat api to get sender nickname
request.reply.video(request[:MediaId], title: 'Echo', description: "Got #{nickname} sent video") # Echo the sent video to user request.reply.video(request[:MediaId], title: 'Echo', description: "Got #{nickname} sent video") # Echo the sent video to user
end end
# When user sent location # When user sent location
on :location do |request| on :location do |request|
request.reply.text("Latitude: #{message[:Latitude]} Longitude: #{message[:Longitude]} Precision: #{message[:Precision]}") request.reply.text("Latitude: #{message[:Latitude]} Longitude: #{message[:Longitude]} Precision: #{message[:Precision]}")
end end
on :event, with: 'unsubscribe' do |request| on :event, with: 'unsubscribe' do |request|
request.reply.success # user can not receive this message request.reply.success # user can not receive this message
end end
# When user enter the app / agent app # When user enter the app / agent app
on :event, with: 'enter_agent' do |request| on :event, with: 'enter_agent' do |request|
request.reply.text "#{request[:FromUserName]} enter agent app now" request.reply.text "#{request[:FromUserName]} enter agent app now"
end end
# When batch job create/update user (incremental) finished. # When batch job create/update user (incremental) finished.
on :batch_job, with: 'sync_user' do |request, batch_job| on :batch_job, with: 'sync_user' do |request, batch_job|
request.reply.text "sync_user job #{batch_job[:JobId]} finished, return code #{batch_job[:ErrCode]}, return message #{batch_job[:ErrMsg]}" request.reply.text "sync_user job #{batch_job[:JobId]} finished, return code #{batch_job[:ErrCode]}, return message #{batch_job[:ErrMsg]}"
end end
# When batch job replace user (full sync) finished. # When batch job replace user (full sync) finished.
on :batch_job, with: 'replace_user' do |request, batch_job| on :batch_job, with: 'replace_user' do |request, batch_job|
request.reply.text "replace_user job #{batch_job[:JobId]} finished, return code #{batch_job[:ErrCode]}, return message #{batch_job[:ErrMsg]}" request.reply.text "replace_user job #{batch_job[:JobId]} finished, return code #{batch_job[:ErrCode]}, return message #{batch_job[:ErrMsg]}"
end end
# When batch job invent user finished. # When batch job invent user finished.
on :batch_job, with: 'invite_user' do |request, batch_job| on :batch_job, with: 'invite_user' do |request, batch_job|
request.reply.text "invite_user job #{batch_job[:JobId]} finished, return code #{batch_job[:ErrCode]}, return message #{batch_job[:ErrMsg]}" request.reply.text "invite_user job #{batch_job[:JobId]} finished, return code #{batch_job[:ErrCode]}, return message #{batch_job[:ErrMsg]}"
end end
# When batch job replace department (full sync) finished. # When batch job replace department (full sync) finished.
on :batch_job, with: 'replace_party' do |request, batch_job| on :batch_job, with: 'replace_party' do |request, batch_job|
request.reply.text "replace_party job #{batch_job[:JobId]} finished, return code #{batch_job[:ErrCode]}, return message #{batch_job[:ErrMsg]}" request.reply.text "replace_party job #{batch_job[:JobId]} finished, return code #{batch_job[:ErrCode]}, return message #{batch_job[:ErrMsg]}"
end end
# Any not match above will fail to below # Any not match above will fail to below
on :fallback, respond: 'fallback message' on :fallback, respond: 'fallback message'
on :click, with: 'FEEDBACK' do |request, key| on :click, with: 'FEEDBACK' do |request, key|
request.reply.text "如有反馈问题,请直接切入至输入框,发微信给我们即可" request.reply.text "如有反馈问题,请直接切入至输入框,发微信给我们即可"
end end
on :click, with: 'MY_NEWS' do |request, key| on :click, with: 'MY_NEWS' do |request, key|
default_msg(request) default_msg(request)
end end
def default_msg(request) def default_msg(request)
uw = user_binded?(request[:FromUserName]) uw = user_binded?(request[:FromUserName])
if uw && uw.user if uw && uw.user
ua = user_activity(uw.user) ua = user_activity(uw.user)
logo = "http://wechat.trustie.net/images/trustie_logo2.png" logo = "http://wechat.trustie.net/images/trustie_logo2.png"
i = 0 i = 0
news =[] news =[]
ua.each do |a| ua.each do |a|
i += 1 i += 1
activity = process_activity(a) activity = process_activity(a)
if activity if activity
news << {title: activity[0], news << {title: activity[0],
content: activity[1], content: activity[1],
picurl: "#{i == 1 ? logo : 'https://www.trustie.net/'+activity[2]}", picurl: "#{i == 1 ? logo : 'https://www.trustie.net/'+activity[2]}",
url: activity[3] url: activity[3]
} }
end end
end end
request.reply.news(news) do |article, n, index| # article is return object request.reply.news(news) do |article, n, index| # article is return object
article.item title: "#{n[:content]}", article.item title: "#{n[:content]}",
description: n[:title], description: n[:title],
pic_url: "#{n[:picurl]}", pic_url: "#{n[:picurl]}",
url: n[:url] url: n[:url]
end end
else else
sendBind(request) sendBind(request)
end end
end end
def sendBind(request) def sendBind(request)
news = (1..1).each_with_object([]) { |n, memo| memo << { title: '绑定登录', content: "您还未绑定确实的用户,请先绑定." } } news = (1..1).each_with_object([]) { |n, memo| memo << { title: '绑定登录', content: "您还未绑定确实的用户,请先绑定." } }
request.reply.news(news) do |article, n, index| # article is return object request.reply.news(news) do |article, n, index| # article is return object
url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{Wechat.config.appid}&redirect_uri=#{login_wechat_url}&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect" url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{Wechat.config.appid}&redirect_uri=#{login_wechat_url}&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect"
article.item title: "#{n[:title]}", article.item title: "#{n[:title]}",
description: n[:content], description: n[:content],
pic_url: 'http://wechat.trustie.net/images/trustie_logo2.png', pic_url: 'http://wechat.trustie.net/images/trustie_logo2.png',
url: url url: url
end end
end end
def bind
begin def get_open_id
raise "非法操作, code不存在" unless params[:code] begin
openid = get_openid(params[:code]) raise "非法操作, code不存在" unless params[:code]
raise "无法获取到openid" unless openid openid = get_openid(params[:code])
raise "此微信号已绑定用户, 不能得复绑定" if user_binded?(openid) raise "无法获取到openid" unless openid
render :text => {status:0, openid: openid}.to_json
user, last_login_on = User.try_to_login(params[:username], params[:password]) rescue Exception=>e
raise "用户名或密码错误,请重新登录" unless user render :text => {status: -1, msg: e.message}.to_json
#补全用户信息 end
end
raise "此用户已经绑定了公众号" if user.user_wechat
def bind
UserWechat.create!( begin
openid: openid, raise "非法操作, code不存在" unless params[:code]
user: user openid = get_openid(params[:code])
) raise "无法获取到openid" unless openid
render :text => {status:0, msg: "绑定成功"}.to_json raise "此微信号已绑定用户, 不能得复绑定" if user_binded?(openid)
rescue Exception=>e
render :text => {status: -1, msg: e.message}.to_json user, last_login_on = User.try_to_login(params[:username], params[:password])
end raise "用户名或密码错误,请重新登录" unless user
end #补全用户信息
def login raise "此用户已经绑定了公众号" if user.user_wechat
@code = params[:code] #TODO 安全性
render 'wechats/login', layout: 'base_wechat' UserWechat.create!(
end openid: openid,
user: user
private )
def get_openid(code) render :text => {status:0, msg: "绑定成功"}.to_json
url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=#{Wechat.config.appid}&secret=#{Wechat.config.secret}&code=#{code}&grant_type=authorization_code" rescue Exception=>e
JSON.parse(URI.parse(url).read)["openid"] render :text => {status: -1, msg: e.message}.to_json
end end
end
def user_binded?(openid) def login
uw = UserWechat.where(openid: openid).first @code = params[:code] #TODO 安全性
end render 'wechats/login', layout: 'base_wechat'
end
def user_activity(user)
@user = user private
shield_project_ids = ShieldActivity.where("container_type='User' and container_id=#{@user.id} and shield_type='Project'").map(&:shield_id) def get_openid(code)
shield_course_ids = ShieldActivity.where("container_type='User' and container_id=#{@user.id} and shield_type='Course'").map(&:shield_id) url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=#{Wechat.config.appid}&secret=#{Wechat.config.secret}&code=#{code}&grant_type=authorization_code"
@page = params[:page] ? params[:page].to_i + 1 : 0 JSON.parse(URI.parse(url).read)["openid"]
user_project_ids = (@user.projects.visible.map{|project| project.id}-shield_project_ids).empty? ? "(-1)" : "(" + (@user.projects.visible.map{|project| project.id}-shield_project_ids).join(",") + ")" end
user_course_ids = (@user.courses.visible.map{|course| course.id}-shield_course_ids).empty? ? "(-1)" : "(" + (@user.courses.visible.map{|course| course.id}-shield_course_ids).join(",") + ")"
course_types = "('Message','News','HomeworkCommon','Poll','Course')"
project_types = "('Message','Issue','ProjectCreateInfo')" def user_binded?(openid)
principal_types = "JournalsForMessage" uw = UserWechat.where(openid: openid).first
end
blog_ids = "("+@user.blog.id.to_s+","+((User.watched_by(@user.id).count == 0 )? '0' :User.watched_by(@user.id).map{|u| u.blog.id}.join(','))+")"
@user_activities = UserActivity.where("(container_type = 'Project' and container_id in #{user_project_ids} and act_type in #{project_types})" + def user_activity(user)
"or (container_type = 'Course' and container_id in #{user_course_ids} and act_type in #{course_types}) "+ @user = user
"or (container_type = 'Principal' and act_type= '#{principal_types}' and container_id = #{@user.id}) " + shield_project_ids = ShieldActivity.where("container_type='User' and container_id=#{@user.id} and shield_type='Project'").map(&:shield_id)
"or (container_type = 'Blog' and act_type= 'BlogComment' and container_id in #{blog_ids})").order('updated_at desc').limit(10).offset(@page * 10) shield_course_ids = ShieldActivity.where("container_type='User' and container_id=#{@user.id} and shield_type='Course'").map(&:shield_id)
@page = params[:page] ? params[:page].to_i + 1 : 0
user_project_ids = (@user.projects.visible.map{|project| project.id}-shield_project_ids).empty? ? "(-1)" : "(" + (@user.projects.visible.map{|project| project.id}-shield_project_ids).join(",") + ")"
end user_course_ids = (@user.courses.visible.map{|course| course.id}-shield_course_ids).empty? ? "(-1)" : "(" + (@user.courses.visible.map{|course| course.id}-shield_course_ids).join(",") + ")"
course_types = "('Message','News','HomeworkCommon','Poll','Course')"
def process_activity(user_activity) project_types = "('Message','Issue','ProjectCreateInfo')"
act= user_activity.act principal_types = "JournalsForMessage"
case user_activity.container_type.to_s
when 'Course' blog_ids = "("+@user.blog.id.to_s+","+((User.watched_by(@user.id).count == 0 )? '0' :User.watched_by(@user.id).map{|u| u.blog.id}.join(','))+")"
when 'Project' @user_activities = UserActivity.where("(container_type = 'Project' and container_id in #{user_project_ids} and act_type in #{project_types})" +
case user_activity.act_type.to_s "or (container_type = 'Course' and container_id in #{user_course_ids} and act_type in #{course_types}) "+
when 'Issue' "or (container_type = 'Principal' and act_type= '#{principal_types}' and container_id = #{@user.id}) " +
[act.project.name.to_s+" | 项目问题", act.subject.to_s, url_to_avatar(act.author),"http://wechat.trustie.net/app.html#/issue/#{act.id}"] "or (container_type = 'Blog' and act_type= 'BlogComment' and container_id in #{blog_ids})").order('updated_at desc').limit(10).offset(@page * 10)
end
end
end end
end
def process_activity(user_activity)
act= user_activity.act
case user_activity.container_type.to_s
when 'Course'
when 'Project'
case user_activity.act_type.to_s
when 'Issue'
[act.project.name.to_s+" | 项目问题", act.subject.to_s, url_to_avatar(act.author),"http://wechat.trustie.net/app.html#/issue/#{act.id}"]
end
end
end
end

@ -1,20 +1,20 @@
button: button:
- -
type: "view" type: "view"
name: "最新动态" name: "最新动态"
url: "http://wechat.trustie.net/assets/wechat/issue.html" url: "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxc09454f171153c2d&redirect_uri=http://wechat.trustie.net/assets/wechat/issue.html&response_type=code&scope=snsapi_base&state=123#wechat_redirect"
- -
type: "click" type: "click"
name: "意见返馈" name: "意见返馈"
key: "FEEDBACK" key: "FEEDBACK"
- -
name: "更多" name: "更多"
sub_button: sub_button:
- -
type: "view" type: "view"
name: "进入网站" name: "进入网站"
url: "http://www.trustie.net/" url: "http://www.trustie.net/"
- -
type: "view" type: "view"
name: "使用手册" name: "使用手册"
url: "https://www.trustie.net/organizations/1/downloads" url: "https://www.trustie.net/organizations/1/downloads"

@ -1165,6 +1165,7 @@ RedmineApp::Application.routes.draw do
collection do collection do
get :login get :login
post :bind post :bind
get :get_open_id
end end
end end

@ -1,52 +1,50 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>react js</title> <title>react js</title>
<meta charset='utf-8' /> <meta charset='utf-8' />
<meta name="keywords" content="" /> <meta name="keywords" content="" />
<meta name="description" content="" /> <meta name="description" content="" />
<meta name="apple-mobile-web-app-capable" content="no"> <meta name="apple-mobile-web-app-capable" content="no">
<meta content='True' name='HandheldFriendly' /> <meta content='True' name='HandheldFriendly' />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" /> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
<link type="text/css" rel="stylesheet" href="/stylesheets/weui/weixin.css" /> <link type="text/css" rel="stylesheet" href="/stylesheets/weui/weixin.css" />
</head> </head>
<body> <body>
<div id="container"></div> <div id="container"></div>
<!-- 模板1开始可以使用scripttype设置为text/html来存放模板片段并且用id标示 -->
<script id="t:result-list" type="text/html">
<!-- 模板1开始可以使用scripttype设置为text/html来存放模板片段并且用id标示 --> <! for(var i =0; i <issues.length; ++i){ !>
<script id="t:result-list" type="text/html"> <div class="post-container">
<div class="post-wrapper">
<! for(var i =0; i <issues.length; ++i){ !> <div class="post-main">
<div class="post-container"> <div class="post-avatar fl"><img src="<!=issues[i].author.img_url!>" width="45" height="45" class="border-radius" /></div>
<div class="post-wrapper"> <div class="post-title hidden mb5"><span class="c-grey3 f15 fb"><!=issues[i].subject!></span></div>
<div class="post-main"> <div class="post-title hidden"><a herf="javascript:void(0);" class="mr10"><!=issues[i].author.nickname!></a>项目问题</div>
<div class="post-avatar fl"><img src="<!=issues[i].author.img_url!>" width="45" height="45" class="border-radius" /></div> <div class="cl"></div>
<div class="post-title hidden mb5"><span class="c-grey3 f15 fb"><!=issues[i].subject!></span></div> <div class="post-content c-grey2 mt10">
<div class="post-title hidden"><a herf="javascript:void(0);" class="mr10"><!=issues[i].author.nickname!></a>项目问题</div> <div class="post-all-content"><!=issues[i].description!></div>
<div class="cl"></div> </div>
<div class="post-content c-grey2 mt10"> <a herf="javascript:void(0);" class="link-blue f13 fl mt5 post-more " style="text-decoration:underline">点击展开</a>
<div class="post-all-content"><!=issues[i].description!></div> <div class="cl"></div>
</div> <span class="c-grey f13 mt10 fl"><!=issues[i].created_on!></span>
<a herf="javascript:void(0);" class="link-blue f13 fl mt5 post-more " style="text-decoration:underline">点击展开</a> <div class="cl"></div>
<div class="cl"></div> </div>
<span class="c-grey f13 mt10 fl"><!=issues[i].created_on!></span> </div>
<div class="cl"></div> </div>
</div> <! } !>
</div>
</div>
<! } !>
</script>
<script src="/javascripts/jquery-1.3.2.js"></script>
</script> <script src="/javascripts/baiduTemplate.js"></script>
<script src="/javascripts/wechat/auth.js"></script>
<script src="/javascripts/jquery-1.3.2.js"></script> <script src="/javascripts/wechat/wechat-dev.js"></script>
<script src="/javascripts/baiduTemplate.js"></script> </body>
<script src="/javascripts/wechat/wechat-dev.js"></script>
</body>
</html> </html>

@ -0,0 +1,35 @@
$(function(){
//获取url中的参数
function getUrlParam(name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象
var r = window.location.search.substr(1).match(reg); //匹配目标参数
if (r != null) return unescape(r[2]); return null; //返回参数值
}
var debug = false;
var g_openid = "";
if(debug){
g_openid = "填写要调试的openid即可";
}
window.getOpenId = function(cb){
if (g_openid.length>0){
cb(g_openid);
}
var code = getUrlParam("code");
$.ajax({
url: '/wechat/get_open_id?code='+code,
type: 'get',
dataType: 'json',
success: function(data){
g_openid = data.openid;
cb(g_openid);
},
error: function(xhr,err){
alert("认证失败: "+err);
}
});
}
});

@ -11,8 +11,6 @@ $(document).ready(function(){
var apiUrl = '/api/v1/' var apiUrl = '/api/v1/'
var setTemplate = function(data){ var setTemplate = function(data){
console.log(data); console.log(data);
var html=bt('t:result-list',{issues: data}); var html=bt('t:result-list',{issues: data});
$('#container').prepend(html); $('#container').prepend(html);
descToggle(); descToggle();
@ -20,16 +18,20 @@ $(document).ready(function(){
} }
var loadDataFromServer = function(page){ var loadDataFromServer = function(page){
$.ajax({ getOpenId(function(openid){
url: apiUrl + 'activities/' + page + "?openid=", $.ajax({
dataType: 'json', url: apiUrl + 'issues/' + id + "?openid="+openid,
success: function(data){ dataType: 'json',
setTemplate(data.data); success: function(data){
}, setTemplate(data.data);
error: function(xhr,status,err){ },
console.log(err); error: function(xhr,status,err){
} console.log(err);
}
});
}) })
}; };

Loading…
Cancel
Save