diff --git a/app/controllers/wechats_controller.rb b/app/controllers/wechats_controller.rb
index 60a674446..e9dc03f0e 100644
--- a/app/controllers/wechats_controller.rb
+++ b/app/controllers/wechats_controller.rb
@@ -1,244 +1,256 @@
-#coding=utf-8
-class WechatsController < ActionController::Base
-  wechat_responder
-
-  include ApplicationHelper
-
-  # default text responder when no other match
-  on :text do |request, content|
-    request.reply.text "您的意见已收到" # Just echo
-  end
-
-  # When receive 'help', will trigger this responder
-  on :text, with: 'help' do |request|
-    request.reply.text 'help content'
-  end
-
-  # When receive '<n>news', will match and will got count as <n> as parameter
-  on :text, with: /^(\d+) news$/ do |request, count|
-    # 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" } }
-    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/'
-    end
-  end
-
-  on :event, with: 'subscribe' do |request|
-    default_msg(request)
-  end
-
-  # 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
-  on :scan, with: 'qrscene_xxxxxx' do |request, ticket|
-    request.reply.text "Unsubscribe user #{request[:FromUserName]} Ticket #{ticket}"
-  end
-
-  # When subscribe user scan scene_id in public account
-  on :scan, with: 'scene_id' do |request, ticket|
-    request.reply.text "Subscribe user #{request[:FromUserName]} Ticket #{ticket}"
-  end
-
-  # When no any on :scan responder can match subscribe user scaned scene_id
-  on :event, with: 'scan' do |request|
-    if request[:EventKey].present?
-      request.reply.text "event scan got EventKey #{request[:EventKey]} Ticket #{request[:Ticket]}"
-    end
-  end
-
-  # 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|
-    request.reply.text "User #{request[:FromUserName]} ScanResult #{scan_result} ScanType #{scan_type}"
-  end
-
-  # Except QR code, wechat can also scan CODE_39 bar code in enterprise account
-  on :scan, with: 'BINDING_BARCODE' do |message, scan_result|
-    if scan_result.start_with? 'CODE_39,'
-      message.reply.text "User: #{message[:FromUserName]} scan barcode, result is #{scan_result.split(',')[1]}"
-    end
-  end
-
-  # When user click the menu button
-  on :click, with: 'BOOK_LUNCH' do |request, key|
-    request.reply.text "User: #{request[:FromUserName]} click #{key}"
-  end
-
-  # When user view URL in the menu button
-  on :view, with: 'http://wechat.somewhere.com/view_url' do |request, view|
-    request.reply.text "#{request[:FromUserName]} view #{view}"
-  end
-
-  # When user sent the imsage
-  on :image do |request|
-    request.reply.image(request[:MediaId]) # Echo the sent image to user
-  end
-
-  # When user sent the voice
-  on :voice do |request|
-    request.reply.voice(request[:MediaId]) # Echo the sent voice to user
-  end
-
-  # When user sent the video
-  on :video do |request|
-    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
-  end
-
-  # When user sent location
-  on :location do |request|
-    request.reply.text("Latitude: #{message[:Latitude]} Longitude: #{message[:Longitude]} Precision: #{message[:Precision]}")
-  end
-
-  on :event, with: 'unsubscribe' do |request|
-    request.reply.success # user can not receive this message
-  end
-
-  # When user enter the app / agent app
-  on :event, with: 'enter_agent' do |request|
-    request.reply.text "#{request[:FromUserName]} enter agent app now"
-  end
-
-  # When batch job create/update user (incremental) finished.
-  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]}"
-  end
-
-  # When batch job replace user (full sync) finished.
-  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]}"
-  end
-
-  # When batch job invent user finished.
-  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]}"
-  end
-
-  # When batch job replace department (full sync) finished.
-  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]}"
-  end
-
-  # Any not match above will fail to below
-  on :fallback, respond: 'fallback message'
-
-  on :click, with: 'FEEDBACK' do |request, key|
-    request.reply.text "如有反馈问题,请直接切入至输入框,发微信给我们即可"
-  end
-
-  on :click, with: 'MY_NEWS' do |request, key|
-    default_msg(request)
-  end
-
-  def default_msg(request)
-    uw = user_binded?(request[:FromUserName])
-    if uw && uw.user
-
-      ua = user_activity(uw.user)
-      logo = "http://wechat.trustie.net/images/trustie_logo2.png"
-      i = 0
-      news =[]
-      ua.each do |a|
-        i += 1
-        activity = process_activity(a)
-        if activity
-          news << {title: activity[0],
-                   content: activity[1],
-                   picurl: "#{i == 1 ? logo : 'https://www.trustie.net/'+activity[2]}",
-                   url: activity[3]
-          }
-        end
-
-      end
-
-      request.reply.news(news) do |article, n, index| # article is return object
-        article.item title: "#{n[:content]}",
-                     description: n[:title],
-                     pic_url: "#{n[:picurl]}",
-                     url: n[:url]
-      end
-    else
-      sendBind(request)
-    end
-  end
-
-  def sendBind(request)
-    news = (1..1).each_with_object([]) { |n, memo| memo << { title: '绑定登录', content: "您还未绑定确实的用户,请先绑定." } }
-    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"
-      article.item title: "#{n[:title]}",
-                   description: n[:content],
-                   pic_url: 'http://wechat.trustie.net/images/trustie_logo2.png',
-                   url: url
-    end
-  end
-
-  def bind
-    begin
-       raise "非法操作, code不存在" unless params[:code]
-       openid = get_openid(params[:code])
-       raise "无法获取到openid" unless openid
-       raise "此微信号已绑定用户, 不能得复绑定" if user_binded?(openid)
-
-       user, last_login_on = User.try_to_login(params[:username], params[:password])
-       raise "用户名或密码错误,请重新登录" unless user
-       #补全用户信息
-
-       raise "此用户已经绑定了公众号" if user.user_wechat
-
-       UserWechat.create!(
-           openid: openid,
-           user: user
-       )
-       render :text => {status:0, msg: "绑定成功"}.to_json
-    rescue Exception=>e
-      render :text => {status: -1, msg: e.message}.to_json
-    end
-  end
-
-  def login
-    @code = params[:code] #TODO 安全性
-    render 'wechats/login', layout: 'base_wechat'
-  end
-
-  private
-  def get_openid(code)
-    url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=#{Wechat.config.appid}&secret=#{Wechat.config.secret}&code=#{code}&grant_type=authorization_code"
-    JSON.parse(URI.parse(url).read)["openid"]
-  end
-
-
-  def user_binded?(openid)
-    uw = UserWechat.where(openid: openid).first
-  end
-
-  def user_activity(user)
-    @user = user
-    shield_project_ids = ShieldActivity.where("container_type='User' and container_id=#{@user.id} and shield_type='Project'").map(&:shield_id)
-    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(",") + ")"
-    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')"
-    principal_types = "JournalsForMessage"
-
-    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})" +
-                                              "or (container_type = 'Course' and container_id in #{user_course_ids} and act_type in #{course_types}) "+
-                                              "or (container_type = 'Principal' and act_type= '#{principal_types}' and container_id = #{@user.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
-
-  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
+#coding=utf-8
+class WechatsController < ActionController::Base
+  wechat_responder
+
+  include ApplicationHelper
+
+  # default text responder when no other match
+  on :text do |request, content|
+    request.reply.text "您的意见已收到" # Just echo
+  end
+
+  # When receive 'help', will trigger this responder
+  on :text, with: 'help' do |request|
+    request.reply.text 'help content'
+  end
+
+  # When receive '<n>news', will match and will got count as <n> as parameter
+  on :text, with: /^(\d+) news$/ do |request, count|
+    # 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" } }
+    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/'
+    end
+  end
+
+  on :event, with: 'subscribe' do |request|
+    default_msg(request)
+  end
+
+  # 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
+  on :scan, with: 'qrscene_xxxxxx' do |request, ticket|
+    request.reply.text "Unsubscribe user #{request[:FromUserName]} Ticket #{ticket}"
+  end
+
+  # When subscribe user scan scene_id in public account
+  on :scan, with: 'scene_id' do |request, ticket|
+    request.reply.text "Subscribe user #{request[:FromUserName]} Ticket #{ticket}"
+  end
+
+  # When no any on :scan responder can match subscribe user scaned scene_id
+  on :event, with: 'scan' do |request|
+    if request[:EventKey].present?
+      request.reply.text "event scan got EventKey #{request[:EventKey]} Ticket #{request[:Ticket]}"
+    end
+  end
+
+  # 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|
+    request.reply.text "User #{request[:FromUserName]} ScanResult #{scan_result} ScanType #{scan_type}"
+  end
+
+  # Except QR code, wechat can also scan CODE_39 bar code in enterprise account
+  on :scan, with: 'BINDING_BARCODE' do |message, scan_result|
+    if scan_result.start_with? 'CODE_39,'
+      message.reply.text "User: #{message[:FromUserName]} scan barcode, result is #{scan_result.split(',')[1]}"
+    end
+  end
+
+  # When user click the menu button
+  on :click, with: 'BOOK_LUNCH' do |request, key|
+    request.reply.text "User: #{request[:FromUserName]} click #{key}"
+  end
+
+  # When user view URL in the menu button
+  on :view, with: 'http://wechat.somewhere.com/view_url' do |request, view|
+    request.reply.text "#{request[:FromUserName]} view #{view}"
+  end
+
+  # When user sent the imsage
+  on :image do |request|
+    request.reply.image(request[:MediaId]) # Echo the sent image to user
+  end
+
+  # When user sent the voice
+  on :voice do |request|
+    request.reply.voice(request[:MediaId]) # Echo the sent voice to user
+  end
+
+  # When user sent the video
+  on :video do |request|
+    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
+  end
+
+  # When user sent location
+  on :location do |request|
+    request.reply.text("Latitude: #{message[:Latitude]} Longitude: #{message[:Longitude]} Precision: #{message[:Precision]}")
+  end
+
+  on :event, with: 'unsubscribe' do |request|
+    request.reply.success # user can not receive this message
+  end
+
+  # When user enter the app / agent app
+  on :event, with: 'enter_agent' do |request|
+    request.reply.text "#{request[:FromUserName]} enter agent app now"
+  end
+
+  # When batch job create/update user (incremental) finished.
+  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]}"
+  end
+
+  # When batch job replace user (full sync) finished.
+  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]}"
+  end
+
+  # When batch job invent user finished.
+  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]}"
+  end
+
+  # When batch job replace department (full sync) finished.
+  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]}"
+  end
+
+  # Any not match above will fail to below
+  on :fallback, respond: 'fallback message'
+
+  on :click, with: 'FEEDBACK' do |request, key|
+    request.reply.text "如有反馈问题,请直接切入至输入框,发微信给我们即可"
+  end
+
+  on :click, with: 'MY_NEWS' do |request, key|
+    default_msg(request)
+  end
+
+  def default_msg(request)
+    uw = user_binded?(request[:FromUserName])
+    if uw && uw.user
+
+      ua = user_activity(uw.user)
+      logo = "http://wechat.trustie.net/images/trustie_logo2.png"
+      i = 0
+      news =[]
+      ua.each do |a|
+        i += 1
+        activity = process_activity(a)
+        if activity
+          news << {title: activity[0],
+                   content: activity[1],
+                   picurl: "#{i == 1 ? logo : 'https://www.trustie.net/'+activity[2]}",
+                   url: activity[3]
+          }
+        end
+
+      end
+
+      request.reply.news(news) do |article, n, index| # article is return object
+        article.item title: "#{n[:content]}",
+                     description: n[:title],
+                     pic_url: "#{n[:picurl]}",
+                     url: n[:url]
+      end
+    else
+      sendBind(request)
+    end
+  end
+
+  def sendBind(request)
+    news = (1..1).each_with_object([]) { |n, memo| memo << { title: '绑定登录', content: "您还未绑定确实的用户,请先绑定." } }
+    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"
+      article.item title: "#{n[:title]}",
+                   description: n[:content],
+                   pic_url: 'http://wechat.trustie.net/images/trustie_logo2.png',
+                   url: url
+    end
+  end
+
+
+  def get_open_id
+    begin
+      raise "非法操作, code不存在" unless params[:code]
+      openid = get_openid(params[:code])
+      raise "无法获取到openid" unless openid
+      render :text => {status:0, openid: openid}.to_json
+    rescue Exception=>e
+      render :text => {status: -1, msg: e.message}.to_json
+    end
+  end
+
+  def bind
+    begin
+       raise "非法操作, code不存在" unless params[:code]
+       openid = get_openid(params[:code])
+       raise "无法获取到openid" unless openid
+       raise "此微信号已绑定用户, 不能得复绑定" if user_binded?(openid)
+
+       user, last_login_on = User.try_to_login(params[:username], params[:password])
+       raise "用户名或密码错误,请重新登录" unless user
+       #补全用户信息
+
+       raise "此用户已经绑定了公众号" if user.user_wechat
+
+       UserWechat.create!(
+           openid: openid,
+           user: user
+       )
+       render :text => {status:0, msg: "绑定成功"}.to_json
+    rescue Exception=>e
+      render :text => {status: -1, msg: e.message}.to_json
+    end
+  end
+
+  def login
+    @code = params[:code] #TODO 安全性
+    render 'wechats/login', layout: 'base_wechat'
+  end
+
+  private
+  def get_openid(code)
+    url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=#{Wechat.config.appid}&secret=#{Wechat.config.secret}&code=#{code}&grant_type=authorization_code"
+    JSON.parse(URI.parse(url).read)["openid"]
+  end
+
+
+  def user_binded?(openid)
+    uw = UserWechat.where(openid: openid).first
+  end
+
+  def user_activity(user)
+    @user = user
+    shield_project_ids = ShieldActivity.where("container_type='User' and container_id=#{@user.id} and shield_type='Project'").map(&:shield_id)
+    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(",") + ")"
+    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')"
+    principal_types = "JournalsForMessage"
+
+    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})" +
+                                              "or (container_type = 'Course' and container_id in #{user_course_ids} and act_type in #{course_types}) "+
+                                              "or (container_type = 'Principal' and act_type= '#{principal_types}' and container_id = #{@user.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
+
+  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
diff --git a/config/menu.yml b/config/menu.yml
index 711b087d1..4072f5793 100644
--- a/config/menu.yml
+++ b/config/menu.yml
@@ -1,20 +1,20 @@
-button:
- -
-  type: "view"
-  name: "最新动态"
-  url: "http://wechat.trustie.net/assets/wechat/issue.html"
- -
-  type: "click"
-  name: "意见返馈"
-  key:  "FEEDBACK"
- -
-  name: "更多"
-  sub_button:
-  -
-    type: "view"
-    name: "进入网站"
-    url:  "http://www.trustie.net/"
-  -
-    type: "view"
-    name: "使用手册"
+button:
+ -
+  type: "view"
+  name: "最新动态"
+  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"
+  name: "意见返馈"
+  key:  "FEEDBACK"
+ -
+  name: "更多"
+  sub_button:
+  -
+    type: "view"
+    name: "进入网站"
+    url:  "http://www.trustie.net/"
+  -
+    type: "view"
+    name: "使用手册"
     url:  "https://www.trustie.net/organizations/1/downloads"
\ No newline at end of file
diff --git a/config/routes.rb b/config/routes.rb
index 396be9c66..2313088cc 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1165,6 +1165,7 @@ RedmineApp::Application.routes.draw do
     collection do
       get :login
       post :bind
+      get :get_open_id
     end
   end
 
diff --git a/public/assets/wechat/issue.html b/public/assets/wechat/issue.html
index 7b6eedde2..4c26551b1 100644
--- a/public/assets/wechat/issue.html
+++ b/public/assets/wechat/issue.html
@@ -1,52 +1,50 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <title>react js</title>
-  <meta charset='utf-8' />
-  <meta name="keywords" content="" />
-  <meta name="description" content="" />
-  <meta name="apple-mobile-web-app-capable" content="no">
-  <meta content='True' name='HandheldFriendly' />
-  <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" />
-
-</head>
-<body>
-<div id="container"></div>
-
-
-
-
-<!-- 模板1开始,可以使用script(type设置为text/html)来存放模板片段,并且用id标示 -->
-<script id="t:result-list" type="text/html">
-
-  <! for(var i =0; i <issues.length; ++i){ !>
-  <div class="post-container">
-    <div class="post-wrapper">
-      <div class="post-main">
-        <div class="post-avatar fl"><img src="<!=issues[i].author.img_url!>" width="45" height="45" class="border-radius" /></div>
-        <div class="post-title hidden mb5"><span class="c-grey3 f15 fb"><!=issues[i].subject!></span></div>
-        <div class="post-title hidden"><a herf="javascript:void(0);" class="mr10"><!=issues[i].author.nickname!></a>项目问题</div>
-        <div class="cl"></div>
-        <div class="post-content c-grey2 mt10">
-          <div class="post-all-content"><!=issues[i].description!></div>
-        </div>
-        <a herf="javascript:void(0);"  class="link-blue f13 fl mt5 post-more " style="text-decoration:underline">点击展开</a>
-        <div class="cl"></div>
-        <span  class="c-grey f13 mt10 fl"><!=issues[i].created_on!></span>
-        <div class="cl"></div>
-      </div>
-    </div>
-  </div>
-  <! } !>
-
-
-
-</script>
-
-<script src="/javascripts/jquery-1.3.2.js"></script>
-<script src="/javascripts/baiduTemplate.js"></script>
-<script src="/javascripts/wechat/wechat-dev.js"></script>
-</body>
+<!DOCTYPE html>
+<html>
+<head>
+  <title>react js</title>
+  <meta charset='utf-8' />
+  <meta name="keywords" content="" />
+  <meta name="description" content="" />
+  <meta name="apple-mobile-web-app-capable" content="no">
+  <meta content='True' name='HandheldFriendly' />
+  <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" />
+
+</head>
+<body>
+<div id="container"></div>
+
+<!-- 模板1开始,可以使用script(type设置为text/html)来存放模板片段,并且用id标示 -->
+<script id="t:result-list" type="text/html">
+
+  <! for(var i =0; i <issues.length; ++i){ !>
+  <div class="post-container">
+    <div class="post-wrapper">
+      <div class="post-main">
+        <div class="post-avatar fl"><img src="<!=issues[i].author.img_url!>" width="45" height="45" class="border-radius" /></div>
+        <div class="post-title hidden mb5"><span class="c-grey3 f15 fb"><!=issues[i].subject!></span></div>
+        <div class="post-title hidden"><a herf="javascript:void(0);" class="mr10"><!=issues[i].author.nickname!></a>项目问题</div>
+        <div class="cl"></div>
+        <div class="post-content c-grey2 mt10">
+          <div class="post-all-content"><!=issues[i].description!></div>
+        </div>
+        <a herf="javascript:void(0);"  class="link-blue f13 fl mt5 post-more " style="text-decoration:underline">点击展开</a>
+        <div class="cl"></div>
+        <span  class="c-grey f13 mt10 fl"><!=issues[i].created_on!></span>
+        <div class="cl"></div>
+      </div>
+    </div>
+  </div>
+  <! } !>
+
+
+
+</script>
+
+<script src="/javascripts/jquery-1.3.2.js"></script>
+<script src="/javascripts/baiduTemplate.js"></script>
+<script src="/javascripts/wechat/auth.js"></script>
+<script src="/javascripts/wechat/wechat-dev.js"></script>
+</body>
 </html>
\ No newline at end of file
diff --git a/public/javascripts/wechat/auth.js b/public/javascripts/wechat/auth.js
new file mode 100644
index 000000000..1d9682720
--- /dev/null
+++ b/public/javascripts/wechat/auth.js
@@ -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);
+            }
+        });
+    }
+});
\ No newline at end of file
diff --git a/public/javascripts/wechat/wechat-dev.js b/public/javascripts/wechat/wechat-dev.js
index 56a95ac72..c19a6058d 100644
--- a/public/javascripts/wechat/wechat-dev.js
+++ b/public/javascripts/wechat/wechat-dev.js
@@ -11,8 +11,6 @@ $(document).ready(function(){
     var apiUrl = '/api/v1/'
     var setTemplate = function(data){
         console.log(data);
-
-
         var html=bt('t:result-list',{issues: data});
         $('#container').prepend(html);
         descToggle();
@@ -20,16 +18,20 @@ $(document).ready(function(){
     }
 
     var loadDataFromServer = function(page){
-        $.ajax({
-            url: apiUrl + 'activities/' + page + "?openid=",
-            dataType: 'json',
-            success: function(data){
-                setTemplate(data.data);
-            },
-            error: function(xhr,status,err){
-                console.log(err);
-            }
+        getOpenId(function(openid){
+            $.ajax({
+                url: apiUrl + 'issues/' + id + "?openid="+openid,
+                dataType: 'json',
+                success: function(data){
+                    setTemplate(data.data);
+                },
+                error: function(xhr,status,err){
+                    console.log(err);
+                }
+            });
         })
+
+
     };