<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>微信 on MoeJue&#39;s Blog</title>
    <link>https://en.moejue.cn/zh-hant/tags/%E5%BE%AE%E4%BF%A1/</link>
    <description>Recent content in 微信 on MoeJue&#39;s Blog</description>
    <generator>Hugo -- 0.151.2</generator>
    <language>zh-hant</language>
    <lastBuildDate>Fri, 17 May 2019 06:59:47 +0000</lastBuildDate>
    <atom:link href="https://en.moejue.cn/zh-hant/tags/%E5%BE%AE%E4%BF%A1/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>小程序架構</title>
      <link>https://en.moejue.cn/zh-hant/posts/92/</link>
      <pubDate>Fri, 17 May 2019 06:59:47 +0000</pubDate>
      <guid>https://en.moejue.cn/zh-hant/posts/92/</guid>
      <description>&lt;p&gt;不知道大家們寫小程序是怎麼個寫法的，前幾個月在寫微信小程序，自己整理的一種架構，或者叫框架
微信原生的架構是這樣子&lt;/p&gt;
&lt;p&gt;├── app.js
├── app.json
├── app.wxss
├── pages
│   │── index
│   │   ├── index.wxml
│   │   ├── index.js
│   │   ├── index.json
│   │   └── index.wxss
│   └── logs
│       ├── logs.wxml
│       └── logs.js
└── utils&lt;/p&gt;
&lt;p&gt;為什麼不用微信原生的寫法呢？
小程序就類似手機APP，都會有一個tabBar欄對吧，微信官方的tabBar欄是在app.json中進行的全局配置。做一般的開發是沒有任何問題的，但涉及到一個複雜的tabBar欄時，使用官方原生的就無法實現，也無法動態載入，比如某影片app中間的拍照錄影功能
這意味著，我們不能使用官方給我們提供的tabBar欄，需要我們自己寫
最開始我的做法還是保持原生的結構，只是自己寫tabBar欄，所以頁面程式碼都寫在一個文件中，預設顯示第一屏，其他的都隱藏起來，切換頁面的時候再把相應的頁面顯示，其他的隱藏起來，並且動態渲染資料上去。但是有個問題是，如果是小專案倒沒什麼大問題，但是如果是大專案程式碼量非常龐大，都寫在一個文件中，後期難以維護，所以這個方法最後被pass掉&lt;/p&gt;
&lt;p&gt;再後來將切換頁面的方式改為跳轉（wx.switchTab等），把不同頁面的程式碼放到了不同的文件，但是還有一個問題，切換也會閃爍，每次切換頁面就等於重新打開一個網頁一樣，tabBar都被重新渲染，所以會閃爍。pass&lt;/p&gt;
&lt;p&gt;由此就有了現在的全新架構方式：
將/pages/index/下的文件全部定義為入口文件，js入口，css入口，視圖入口，不同頁面的文件還是放到不同的位置去，為了好管理，新建了一個template的資料夾，用於放不同頁面間的程式碼，結構和官方的單頁面結構是一樣的
根目錄下的app.js用於存放全域函數，其他頁面呼叫只需getApp()即可
js的入口文件&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;app&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;getApp&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_js&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;require&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;../../template/index/index.js&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;types&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_js&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;require&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;../../template/types/types.js&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Global&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_Data&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;[&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Page&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;active&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;show&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;types&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;course&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;user&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;onLoad&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;options&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;setData&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;Global&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_Data&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_js&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getData&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        })
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 底部nav切换
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;tabbar&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_onChange&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;event&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;show&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;types&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;course&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;user&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;console&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;event&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;switch&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;event&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;detail&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;index&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;Global&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_Data&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_js&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getData&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;types&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;Global&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_Data&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;types&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_js&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getData&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;course&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;Global&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_Data&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_js&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getData&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;user&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;Global&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_Data&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_js&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getData&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;show&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;console&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;Global&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_Data&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;setData&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;show&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;show&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;Global&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_Data&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Global&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;_Data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        })
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;wxml入口文件&lt;/p&gt;</description>
    </item>
    <item>
      <title>微信授權登入</title>
      <link>https://en.moejue.cn/zh-hant/posts/88/</link>
      <pubDate>Fri, 05 Apr 2019 09:29:45 +0000</pubDate>
      <guid>https://en.moejue.cn/zh-hant/posts/88/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.wx.qq.com/mpres/htmledition/weui-desktopSkin/svg/buildless/bg_logo_primary4247a9.svg&#34;&gt; 文件：&lt;a href=&#34;https://mp.weixin.qq.com/wiki?t=resource/res_main&amp;amp;id=mp1421135319&#34;&gt;https://mp.weixin.qq.com/wiki?t=resource/res_main&amp;amp;id=mp1421135319&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;微信的授權登入與QQ、新浪等平台的授權登入大同小異，均採用OauthOAuth2.0鑑權方式。&lt;br&gt;
微信授權分為兩種：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;靜默授權&lt;/li&gt;
&lt;li&gt;彈窗授權，需要用戶手動同意&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;兩種scope的區別說明&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;以snsapi_base為scope發起的網頁授權，是用來獲取進入頁面的用戶openid的，並且是靜默授權並自動跳轉到回調頁的。用戶感知的就是直接進入了回調頁（往往是業務頁面）&lt;/li&gt;
&lt;li&gt;以snsapi_userinfo為scope發起的網頁授權，是用來獲取用戶的基本資訊的。但這種授權需要用戶手動同意，並且由於用戶同意過，所以無須關注，就可在授權後獲取該用戶的基本資訊。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;用戶管理類介面中的「獲取用戶基本資訊介面」，是在用戶和公眾號產生訊息交互或關注後事件推送後，才能根據用戶OpenID來獲取用戶基本資訊。這個介面，包括其他微信介面，都是需要該用戶（即openid）關注了公眾號後，才能呼叫成功的。&lt;/p&gt;
&lt;p&gt;具體而言，網頁授權流程分為四步：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;引導用戶進入授權頁面同意授權，獲取code&lt;/li&gt;
&lt;li&gt;透過code換取網頁授權access_token（與基礎支援中的access_token不同）&lt;/li&gt;
&lt;li&gt;如果需要，開發者可以重新整理網頁授權access_token，避免過期&lt;/li&gt;
&lt;li&gt;透過網頁授權access_token和openid獲取用戶基本資訊（支援UnionID機制）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以下是封裝的微信操作類，需要用到兩個資料表，用於保存access_token、ticket，由於它們具有一定有效期，且每天請求數有上限，所以開發者需自行保存&lt;/p&gt;
&lt;?php
/\*\*
\*   微信操作表
\*   wxtoken 表結構
\*   id
\*   access\_token
\*   addtime
\*   wxticket 表結構
\*   id
\*   ticket
\*   addtime
\*/
class WX {
	private $appid;
	private $appserect;
	private $curl;
	private $msg;
	protected $errs = array(
		&#39;-1&#39; =&gt; &#39;系統繁忙，此時請開發者稍候再試&#39;,
		&#39;0&#39; =&gt; &#39;請求成功&#39;,
		&#39;40001&#39; =&gt; &#39;AppSecret錯誤或者AppSecret不屬於這個公眾號，請開發者確認AppSecret的正確性&#39;,
		&#39;40002&#39; =&gt; &#39;請確保grant\_type字段值為client\_credential&#39;,
		&#39;40164&#39; =&gt; &#39;呼叫介面的IP地址不在白名單中，請在介面IP白名單中進行設定。&#39;,
	);
	function \_\_construct($appid, $appserect) {
		$this-&gt;appid = $appid;
		$this-&gt;appserect = $appserect;
		$this-&gt;curl = new Curl();
	}
	/\*
	微信網頁授權登入  需要在公眾號設定 - 功能設定 - 網頁授權域名
	第一步：用戶同意授權，獲取code
	scope : snsapi\_base 只能獲取openid 直接跳轉
	snsapi\_userinfo
	\*/
	public function getCode($redirect\_uri, $scope = &#39;snsapi\_userinfo&#39;,$state = &#39;1&#39;) {
		$url = &#34;https://open.weixin.qq.com/connect/oauth2/authorize?appid={$this-&gt;appid}&amp;redirect\_uri={$redirect\_uri}&amp;response\_type=code&amp;scope={$scope}&amp;state={$state}#wechat\_redirect&#34;;
		header(&#34;Location:{$url}&#34;);
		exit;
	}
	/\*
	第二步：透過code換取網頁授權access\_token
	\*/
	public function getAccessTokenByCode($code) {
		$url = &#34;https://api.weixin.qq.com/sns/oauth2/access\_token?appid={$this-&gt;appid}&amp;secret={$this-&gt;appserect}&amp;code={$code}&amp;grant\_type=authorization\_code&#34;;
		// exit($url);
		// $curl = new Curl();
		$result = $this-&gt;curl-&gt;doGet($url);
		if (!$result) {
			// $this-&gt;curl-&gt;getError()
			$this-&gt;msg = &#34;獲取token失敗&#34;;
			return false;
		}
		$result = json\_decode($result, true);
		if ($result\[&#39;errcode&#39;\]) {
			$this-&gt;msg = $result\[&#39;errmsg&#39;\];
			return false;
		}
		return $result;
	}
	// 第三步：重新整理access\_token（如果需要） 透過code 獲取openid $type 0靜默授權 1彈窗授權
	public function getUserInfo($code, $type = 0, $lang = &#39;zh\_CN &#39;) {
		$result = $this-&gt;getAccessTokenByCode($code);
			if (!$result) {
			return false;
		}
		$member = C::t(PT\_USER)-&gt;getByOpenid($result\[&#39;openid&#39;\]);
	if ($member) {
		return $member;
	} else {
		if ($type) {
			$url = &#34;https://api.weixin.qq.com/sns/userinfo?access\_token={$result\[&#39;access\_token&#39;\]}&amp;openid={$result\[&#39;openid&#39;\]}&amp;lang={$lang}&#34;;
			// $return = $this-&gt;curl-&gt;doGet($url);
			// 這介面有病 強制顯示文件頭
			$return = file\_get\_contents($url);
			if (!$return) {
				$this-&gt;msg = &#39;獲取用戶資訊失敗&#39;;
				return false;
			}
			$return = json\_decode($return, true);
			if (!$return) {
				$this-&gt;msg = &#39;獲取用戶資訊返回失敗&#39;;
				return false;
			}
			// file\_put\_contents(&#39;ccc.txt&#39;,print\_r($return,true),FILE\_APPEND);
			$data = array(
				&#39;openid&#39; =&gt; $return\[&#39;openid&#39;\],
				&#39;name&#39; =&gt; $return\[&#39;nickname&#39;\],
				&#39;sex&#39; =&gt; $return\[&#39;sex&#39;\],
				&#39;province&#39; =&gt; $return\[&#39;province&#39;\],
				&#39;city&#39; =&gt; $return\[&#39;city&#39;\],
				&#39;country&#39; =&gt; $return\[&#39;country&#39;\],
				&#39;img&#39; =&gt; $return\[&#39;headimgurl&#39;\],
				&#39;bindtel&#39; =&gt; 0,
			);
		} else {
			$data = array(
				&#39;openid&#39; =&gt; $result\[&#39;openid&#39;\],
				&#39;username&#39; =&gt; &#34;微信用戶\_&#34; . random(6,1)
			);
		}
		$name = rand(100000, 1000000000);
		$e = $name . &#34;@qq.com&#34;;
		$password = $e;
		$id = UserAddEdit(0, $data\[&#39;username&#39;\], $password, $e,10,0,&#34;&#34;, $msg);
		if ($id &lt;= 0) {
			$this-&gt;msg = $msg;
			return false;
		}
		C::t(PT\_USER)-&gt;update($data, $id);
		$member = C::t(PT\_USER)-&gt;get($id);
		return $member;
		}
	}
	/\*
	公眾號 安全中心 設定IP白名單
	公眾號的全局唯一介面呼叫憑據，公眾號呼叫各介面時都需使用access\_token。開發者需要進行妥善保存。access\_token的儲存至少要保留512個字符空間。access\_token的有效期目前為2個小時，需定時重新整理，重複獲取將導致上次獲取的access\_token失效。
	\*/
	public function getAccessToken($type) {
		$addtime = TIMESTAMP - 7200;
		$url = &#34;https://api.weixin.qq.com/cgi-bin/token?grant\_type=client\_credential&amp;appid={$this-&gt;appid}&amp;secret={$this-&gt;appserect}&#34;;
		$row = C::t(PT\_WXTOKEN)-&gt;getNew($addtime, $type);
		if ($row) {
			return $row\[&#39;access\_token&#39;\];
		} else {
			$result = $this-&gt;curl-&gt;doGet($url);
			if (!$result) {
				$this-&gt;msg = &#34;無法獲取令牌內容&#34;;
				return false;
			}
			$result = json\_decode($result, true);
			if (!$result) {
				$this-&gt;msg = &#34;解析令牌內容失敗&#34;;
				return false;
			}
			if ($result\[&#39;access\_token&#39;\]) {
				C::t(PT\_WXTOKEN)-&gt;addToken($result\[&#39;access\_token&#39;\], $type);
				return $result\[&#39;access\_token&#39;\];
			} else {
				$this-&gt;msg = &#34;獲取令牌失敗&#34;;
				return false;
			}
		}
	}
	// 獲取js票據  需要在公眾號設定 - 功能設定 - JS介面安全域名設定
	public function getJsTicket() {
		$addtime = TIMESTAMP - 7200;
		$row = C::t(PT\_WXTICKET)-&gt;getNew($addtime);
		if ($row) {
			return $row\[&#39;ticket&#39;\];
		} else {
			$token = $this-&gt;getAccessToken();
			if (!$token) {
				return false;
			}
			$url = &#34;https://api.weixin.qq.com/cgi-bin/ticket/getticket?access\_token={$token}&amp;type=jsapi&#34;;
			$result = $this-&gt;curl-&gt;doGet($url);
			if (!$result) {
				$this-&gt;msg = &#34;無法獲取js票據&#34;;
				return false;
			}
			$result = json\_decode($result, true);
			if (!$result) {
				$this-&gt;msg = &#34;解析js票據內容失敗&#34;;
				return false;
			}
			if ($result\[&#39;ticket&#39;\]) {
				C::t(PT\_WXTICKET)-&gt;addTicket($result\[&#39;ticket&#39;\]);
				return $result\[&#39;ticket&#39;\];
			} else {
				$this-&gt;msg = &#34;獲取js票據失敗&#34;;
				return false;
			}
		}
	}
	// js sdk 票據簽名 當前網頁的URL，不包含#及其後面部分
	public function jsSign($data) {
		// 1.所有待簽名參數按照字段名的ASCII 碼從小到大排序（字典序）
		ksort($data);
		// 2.URL鍵值對的格式（即key1=value1&amp;key2=value2…）拼接成字符串string1 採用原始值，不進行URL 轉義
		$string1 = $this-&gt;ToUrlParams($data);
		// echo &#34;string1:{$string1}&lt;br/&gt;&#34;;
		// 3.對string1做sha1加密
		$sign = sha1($string1);
		// echo &#34;signature:{$sign}&lt;br/&gt;&#34;;
		return $sign;
	}
	// 獲取訊息內容
	public function getMsg() {
		return $this-&gt;msg;
	}
	/\*\*
	\* 格式化參數格式化成url參數
	\*/
	public function ToUrlParams($data) {
		$buff = &#34;&#34;;
		foreach ($data as $k =&gt; $v) {
			if ($k != &#34;sign&#34; &amp;&amp; $v != &#34;&#34; &amp;&amp; !is\_array($v)) {
				$buff .= $k . &#34;=&#34; . $v . &#34;&amp;&#34;;
			}
		}
		$buff = trim($buff, &#34;&amp;&#34;);
		return $buff;
	}
}
?&gt;
&lt;p&gt;// 微信登入
function wxlogin() {
global $_G,$identifier,$config,$wx;
if (!$_G[&amp;lsquo;uid&amp;rsquo;]) {
if ($_GET[&amp;lsquo;state&amp;rsquo;]) {
// 回調
$member = $wx-&amp;gt;getUserInfo($_GET[&amp;lsquo;code&amp;rsquo;]);
if (!$member) {
exit($wx-&amp;gt;getMsg());
}
if (!function_exists(&amp;ldquo;setloginstatus&amp;rdquo;)) {
include_once libfile(&amp;lsquo;function/member&amp;rsquo;);
}
// 設定登入狀態$wx
setloginstatus($member, 2592000);
checkfollowfeed();
$_G[&amp;lsquo;uid&amp;rsquo;] = $member[&amp;lsquo;uid&amp;rsquo;];
$_G[&amp;lsquo;member&amp;rsquo;] = $member;
} else {
// 請求授權 對參數編碼
$redirect = urlencode(getProtocol() . $_SERVER[&amp;lsquo;HTTP_HOST&amp;rsquo;] . $_SERVER[&amp;lsquo;REQUEST_URI&amp;rsquo;]);
$wx-&amp;gt;getCode($redirect, &amp;lsquo;snsapi_base&amp;rsquo;);
}
}
}
function getProtocol() {
return is_HTTPS() ? &amp;lsquo;https://&amp;rsquo; : &amp;lsquo;http://&amp;rsquo;;
}
function is_HTTPS() {  if ($_SERVER[&amp;lsquo;HTTPS&amp;rsquo;] === 1 || $_SERVER[&amp;lsquo;HTTPS&amp;rsquo;] === &amp;lsquo;on&amp;rsquo; || $_SERVER[&amp;lsquo;SERVER_PORT&amp;rsquo;] == 443) {
return true;
}
return false;
}&lt;/p&gt;</description>
    </item>
    <item>
      <title>微信JSAPI支付</title>
      <link>https://en.moejue.cn/zh-hant/posts/89/</link>
      <pubDate>Sat, 30 Mar 2019 09:30:21 +0000</pubDate>
      <guid>https://en.moejue.cn/zh-hant/posts/89/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://image.baidu.com/search/down?url=https://tva1.sinaimg.cn//large/0072Vf1pgy1g1l3k211blj30ia04x74e.jpg&#34;&gt; 前陣子一直在做微信相關的業務，雖說不是什麼新技術，但之前一直沒有機會接觸到，然後踩了些坑，抽空整理記錄下。
微信支付一共分為7種，分別是：付款碼支付、JSAPI支付、Native支付、APP支付、H5支付、小程序支付、人臉支付。
此次業務中使用到的是微信JSAPI支付：用戶透過微信掃碼、關注公眾號等方式進入商家H5頁面，並在&lt;strong&gt;微信內&lt;/strong&gt;呼叫 JSSDK完成支付&lt;/p&gt;
&lt;p&gt;文件：&lt;a href=&#34;https://pay.weixin.qq.com/wiki/doc/api/index.html&#34;&gt;https://pay.weixin.qq.com/wiki/doc/api/index.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;SDK：[https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=11_1&lt;/p&gt;
&lt;p&gt;](&lt;a href=&#34;https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=11_1%29JSAPI&#34;&gt;https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=11_1)JSAPI&lt;/a&gt;支付需要在微信中的瀏覽器打開才能喚起微信支付，效果如下圖
&lt;img loading=&#34;lazy&#34; src=&#34;https://image.baidu.com/search/down?url=https://tva1.sinaimg.cn//large/0072Vf1pgy1g1l36yn1sej30p91hc40b.jpg&#34;&gt;
附上介面程式碼
程式碼中使用了模板引擎
html：&lt;/p&gt;
&lt;div class=&#34;am-modal-bd&#34;&gt;
	&lt;img src=&#34;{$competition\[&#39;avatar&#39;\]}&#34; alt=&#34;&#34;&gt;&lt;br&gt;
	&lt;span style=&#34;font-size: 13px;color: #72c6ef&#34;&gt;{$competition\[&#39;username&#39;\]}&lt;/span&gt;&lt;br&gt;
	&lt;span id=&#34;tips&#34; style=&#34;font-size: 13px&#34;&gt;&lt;/span&gt;
  &lt;ul class=&#34;ul\_box&#34;&gt;
	&lt;li&gt;
		&lt;div&gt;&lt;/div&gt;
		&lt;div class=&#34;label\_box&#34;&gt;
			&lt;label&gt;
				&lt;input type=&#34;radio&#34; name=&#34;price&#34; value=&#34;{$prices\[0\]}&#34; checked=&#34;&#34;&gt;
				&lt;div class=&#34;active&#34;&gt;&lt;span class=&#34;am-icon-diamond&#34;&gt;&lt;/span&gt; {$prices\[0\]}鑽&lt;/div&gt;
			&lt;/label&gt;
			&lt;label&gt;
				&lt;input type=&#34;radio&#34; name=&#34;price&#34; value=&#34;{$prices\[1\]}&#34;&gt;
				&lt;div&gt;&lt;span class=&#34;am-icon-diamond&#34;&gt;&lt;/span&gt; {$prices\[1\]}鑽&lt;/div&gt;
			&lt;/label&gt;
			&lt;label&gt;
				&lt;input type=&#34;radio&#34; name=&#34;price&#34; value=&#34;{$prices\[2\]}&#34;&gt;
				&lt;div&gt;&lt;span class=&#34;am-icon-diamond&#34;&gt;&lt;/span&gt; {$prices\[2\]}鑽&lt;/div&gt;
			&lt;/label&gt;
		&lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div&gt;&lt;/div&gt;
		&lt;div class=&#34;label\_box&#34;&gt;
			&lt;label&gt;
				&lt;input type=&#34;radio&#34; name=&#34;price&#34; value=&#34;{$prices\[3\]}&#34;&gt;
				&lt;div&gt;&lt;span class=&#34;am-icon-diamond&#34;&gt;&lt;/span&gt; {$prices\[3\]}鑽&lt;/div&gt;
			&lt;/label&gt;
			&lt;label&gt;
				&lt;input type=&#34;radio&#34; name=&#34;price&#34; value=&#34;{$prices\[4\]}&#34;&gt;
				&lt;div&gt;&lt;span class=&#34;am-icon-diamond&#34;&gt;&lt;/span&gt; {$prices\[4\]}鑽&lt;/div&gt;
			&lt;/label&gt;
			&lt;label&gt;
				&lt;input type=&#34;number&#34; name=&#34;price&#34; id=&#34;price&#34; class=&#34;input&#34; placeholder=&#34;自定義&#34;&gt;
			&lt;/label&gt;
		&lt;/div&gt;
	&lt;/li&gt;
  &lt;/ul&gt;
  &lt;span style=&#34;font-size: 13px&#34;&gt;註：1鑽=1元，1鑽={$activity\[&#39;offset&#39;\]}票&lt;/span&gt;&lt;br&gt;
  &lt;button type=&#34;button&#34; class=&#34;am-btn am-btn-primary  am-radius&#34; onclick=&#34;callpay()&#34; style=&#34;margin-top: 5px;&#34;&gt;立即微信支付&lt;/button&gt;
&lt;/div&gt;
&lt;p&gt;JavaScript：&lt;/p&gt;
&lt;p&gt;// 投票
var offset = {$activity[&amp;lsquo;offset&amp;rsquo;]};
$(&amp;rsquo;#tips&amp;rsquo;).html(&amp;lsquo;正在給{$competition[&amp;lsquo;code&amp;rsquo;]}號贈送{$prices[0]}鑽=&amp;rsquo;+({$prices[0]}*offset)+&amp;lsquo;票&amp;rsquo;);
$(&amp;rsquo;#vote&amp;rsquo;).click(function(){
$.post(&amp;rsquo;/index/index/detailed.html?cid={$cid}&amp;amp;aid={$aid}&amp;rsquo;,{
formhash :&amp;rsquo;{FORMHASH}&amp;rsquo;,
submit:&amp;lsquo;1&amp;rsquo;,
type:1,
openid:&amp;rsquo;{$_G[&amp;lsquo;member&amp;rsquo;][&amp;lsquo;openid&amp;rsquo;]}&amp;rsquo;
},function(res){
alert(res.msg);
if (res.code == 0) {
$(&amp;rsquo;.box-1 span&amp;rsquo;).text(res.data.all);
$(&amp;rsquo;.box-2 span&amp;rsquo;).text(res.data.rank);
$(&amp;rsquo;.box-3 span&amp;rsquo;).text(res.data.up + &amp;lsquo;票&amp;rsquo;);
}
});
})
/* jQuery物件級別外掛程式擴展 */
$.fn.extend({
/* 單選框 */
hlRadio:function () {
var radioEl=$(this);
radioEl.click(function () {
var price = 0;
price = $(&amp;lsquo;input:radio:checked&amp;rsquo;).val();
$(&amp;rsquo;#price&amp;rsquo;).val(&amp;rsquo;&amp;rsquo;);
$(&amp;rsquo;#tips&amp;rsquo;).html(&amp;lsquo;正在給{$competition[&amp;lsquo;code&amp;rsquo;]}號贈送&amp;rsquo;+price+&amp;lsquo;鑽=&amp;rsquo;+(price*offset)+&amp;lsquo;票&amp;rsquo;);
radioEl.siblings(&amp;ldquo;div&amp;rdquo;).removeClass(&amp;ldquo;active&amp;rdquo;);
$(this).siblings(&amp;ldquo;div&amp;rdquo;).addClass(&amp;ldquo;active&amp;rdquo;);
});
},
});
$(&amp;ldquo;input[name=&amp;lsquo;price&amp;rsquo;]&amp;rdquo;).hlRadio();
$(&amp;rsquo;#price&amp;rsquo;).bind(&amp;lsquo;input propertychange&amp;rsquo;, function(){
var price = 0;
price = $(&amp;rsquo;#price&amp;rsquo;).val();
$(&amp;rsquo;#tips&amp;rsquo;).html(&amp;lsquo;正在給{$competition[&amp;lsquo;code&amp;rsquo;]}號贈送&amp;rsquo;+price+&amp;lsquo;鑽=&amp;rsquo;+(price*offset)+&amp;lsquo;票&amp;rsquo;);
})&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
