<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[泛小栈]]></title><description><![CDATA[<coding>]]></description><link>http://www.dev-f.cn/</link><image><url>http://www.dev-f.cn/favicon.png</url><title>泛小栈</title><link>http://www.dev-f.cn/</link></image><generator>Ghost 5.79</generator><lastBuildDate>Tue, 17 Sep 2024 11:06:21 GMT</lastBuildDate><atom:link href="http://www.dev-f.cn/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[k8s批量查看pods cpu request]]></title><description><![CDATA[<pre><code class="language-bash">#!/bin/bash
kubectl get pods -A --field-selector=&apos;status.phase==Running,spec.nodeName=xxx&apos; -o=jsonpath=&apos;console.log([{range .items[*]}{&quot;{&quot;}&quot;name&quot;:&quot;{.metadata.name}&quot;,&quot;containers&quot;:[{range .spec.containers[*]}{&quot;{&quot;}&quot;name&quot;:&quot;{.name}&quot;,&quot;cpu_requests&quot;:&quot;</code></pre>]]></description><link>http://www.dev-f.cn/k8spi-liang-cha-kan-pods-limit/</link><guid isPermaLink="false">66dfb6b08745fb0001cce7d2</guid><dc:creator><![CDATA[fyn]]></dc:creator><pubDate>Tue, 10 Sep 2024 03:02:55 GMT</pubDate><content:encoded><![CDATA[<pre><code class="language-bash">#!/bin/bash
kubectl get pods -A --field-selector=&apos;status.phase==Running,spec.nodeName=xxx&apos; -o=jsonpath=&apos;console.log([{range .items[*]}{&quot;{&quot;}&quot;name&quot;:&quot;{.metadata.name}&quot;,&quot;containers&quot;:[{range .spec.containers[*]}{&quot;{&quot;}&quot;name&quot;:&quot;{.name}&quot;,&quot;cpu_requests&quot;:&quot;{.resources.requests.cpu}&quot;},{end}]},{end}].map(pod=&gt;{&quot;{&quot;} const requests = (pod.containers||[]).map(c=&gt;{&quot;{&quot;} let cpu = c.cpu_requests||&quot;0&quot;; if (cpu[cpu.length-1]===&quot;m&quot;) {&quot;{&quot;} cpu = cpu.substr(0, cpu.length-1)|0;} else {&quot;{&quot;} cpu = 1000 * (cpu|0);} return cpu;});return [pod.name, requests.reduce((a,b)=&gt;a+b), requests.join(&quot;\t&quot;)]}).sort((a,b)=&gt;b[1]-a[1]).map(o=&gt;o.join(&quot;\t&quot;)).join(&quot;\n&quot;))&apos;|sed &apos;s/,]/]/g&apos;|node</code></pre>]]></content:encoded></item><item><title><![CDATA[js监听扫码枪]]></title><description><![CDATA[<pre><code class="language-javascript">/**
 * @property {RegExp[]} patterns
 * @property {function(code:string):void} onScanSuccess
 */
class CodeScanner {

  /**
   * @param {(code:string)=&gt;{}} handler
   * @param {RegExp[]} patterns
   */
  constructor(handler, patterns = []) {
    this.resetScan()
    this.patterns = patterns || []
    this.onScanSuccess = handler || ((code) =&gt; {
      console.log(code)
    })
  }

  /**
   * &#x5F00;&#x59CB;&#x76D1;&#x542C;
   */
  start() {
    this.resetScan()
    const that = this
    this.thatKeyHandler = (e) =&gt; {
      that.</code></pre>]]></description><link>http://www.dev-f.cn/jsjian-ting-sao-ma-qiang/</link><guid isPermaLink="false">66827d1b8745fb0001cce7c5</guid><dc:creator><![CDATA[fyn]]></dc:creator><pubDate>Mon, 01 Jul 2024 09:56:27 GMT</pubDate><content:encoded><![CDATA[<pre><code class="language-javascript">/**
 * @property {RegExp[]} patterns
 * @property {function(code:string):void} onScanSuccess
 */
class CodeScanner {

  /**
   * @param {(code:string)=&gt;{}} handler
   * @param {RegExp[]} patterns
   */
  constructor(handler, patterns = []) {
    this.resetScan()
    this.patterns = patterns || []
    this.onScanSuccess = handler || ((code) =&gt; {
      console.log(code)
    })
  }

  /**
   * &#x5F00;&#x59CB;&#x76D1;&#x542C;
   */
  start() {
    this.resetScan()
    const that = this
    this.thatKeyHandler = (e) =&gt; {
      that._keyHandler(e)
    }
    document.addEventListener(&quot;keypress&quot;, this.thatKeyHandler, { passive: true })
  }

  /**
   * &#x505C;&#x6B62;&#x63A5;&#x542C;
   */
  stop() {
    this.resetScan()
    document.removeEventListener(&quot;keypress&quot;, this.thatKeyHandler)
  }

  /**
   *
   * @param {KeyboardEvent} e
   * @private
   */
  _keyHandler(e) {
    if ([&quot;INPUT&quot;, &quot;TEXTAREA&quot;, &quot;BUTTON&quot;].indexOf(document.activeElement.nodeName) &gt;= 0) {
      return // &#x7126;&#x70B9;&#x5728;&#x5176;&#x5B83;&#x8F93;&#x5165;&#x6846;&#x65F6;&#x4E0D;&#x89E6;&#x53D1;
    }
    if (this.scanLastTimeStamp === 0) {
      this.code = e.key
      this.scanLastTimeStamp = e.timeStamp
      return
    }
    if (e.timeStamp - this.scanLastTimeStamp &gt; 50) {
      return this.resetScan(&quot;&#x8D85;&#x8FC7;&#x626B;&#x63CF;&#x95F4;&#x9694;&#x7684;&#x9608;&#x503C;(&#x6BEB;&#x79D2;)&quot;)
    }
    if (e.key === &quot;Enter&quot;) {
      let ok = this.patterns.length === 0
      for (let i = 0; i &lt; this.patterns.length; i++) {
        if (this.code.match(this.patterns[i])) {
          ok = true
          break
        }
      }
      if (ok) {
        if (this.onScanSuccess !== null) {
          this.onScanSuccess(this.code)
        }
        return this.resetScan(&quot;&#x6B63;&#x5E38;&#x7ED3;&#x675F;&#x626B;&#x63CF;&quot;)
      } else {
        return this.resetScan(&quot;&#x626B;&#x63CF;&#x7801;&#x4E0D;&#x7B26;&#x5408;&#x89C4;&#x5219;&quot;)
      }
    }
    this.code += e.key
    this.scanLastTimeStamp = e.timeStamp
  }

  /**
   * @param {?string} reason
   */
  resetScan(reason = null) {
    if (reason) {
      console.log(reason,this.code)
    }
    this.scanLastTimeStamp = 0
    this.code = &quot;&quot;
  }
}</code></pre>]]></content:encoded></item><item><title><![CDATA[k3s You must be logged in to the server (Unauthorized) 问题解决]]></title><description><![CDATA[<ol><li>&#x66F4;&#x65B0;&#x670D;&#x52A1;&#x7AEF;&#x8BC1;&#x4E66;</li></ol><pre><code class="language-shell">sudo /usr/local/bin/k3s certificate rotate</code></pre><ol start="2"><li>&#x91CD;&#x542F;k3s&#x670D;&#x52A1;</li></ol><pre><code class="language-bash">sudo systemctl restart k3s</code></pre><ol start="3"><li>&#x5C06;&#x65B0;&#x7684;<code>/etc/rancher/k3s/k3s.yaml</code>&#x6587;&#x4EF6;&#x4E0B;&#x8F7D;&#x4E0B;&#x6765;&#x4F7F;&#x7528;</li></ol>]]></description><link>http://www.dev-f.cn/k3s-logged-in-to-server-unauthorized/</link><guid isPermaLink="false">65c31bd88745fb0001cce7b3</guid><dc:creator><![CDATA[fyn]]></dc:creator><pubDate>Wed, 07 Feb 2024 06:09:22 GMT</pubDate><content:encoded><![CDATA[<ol><li>&#x66F4;&#x65B0;&#x670D;&#x52A1;&#x7AEF;&#x8BC1;&#x4E66;</li></ol><pre><code class="language-shell">sudo /usr/local/bin/k3s certificate rotate</code></pre><ol start="2"><li>&#x91CD;&#x542F;k3s&#x670D;&#x52A1;</li></ol><pre><code class="language-bash">sudo systemctl restart k3s</code></pre><ol start="3"><li>&#x5C06;&#x65B0;&#x7684;<code>/etc/rancher/k3s/k3s.yaml</code>&#x6587;&#x4EF6;&#x4E0B;&#x8F7D;&#x4E0B;&#x6765;&#x4F7F;&#x7528;</li></ol>]]></content:encoded></item><item><title><![CDATA[excel分析身份证号公式]]></title><description><![CDATA[<h2 id="%E8%BA%AB%E4%BB%BD%E8%AF%81%E5%8F%B7%E6%98%AF%E5%90%A6%E5%90%88%E6%B3%95">&#x8EAB;&#x4EFD;&#x8BC1;&#x53F7;&#x662F;&#x5426;&#x5408;&#x6CD5;</h2><pre><code class="language-excel">=IF(VLOOKUP(MOD(SUMPRODUCT(MID(A2,ROW($1:$17),1)*{7;9;10;5;8;4;2;1;6;3;7;9;10;5;8;4;2}),11),{0,1;1,0;2,&quot;X&quot;;3,9;4,8;5,7;</code></pre>]]></description><link>http://www.dev-f.cn/excel-id-card-analysis/</link><guid isPermaLink="false">64b63b6ef84d1700017a8418</guid><dc:creator><![CDATA[fyn]]></dc:creator><pubDate>Tue, 18 Jul 2023 07:15:02 GMT</pubDate><content:encoded><![CDATA[<h2 id="%E8%BA%AB%E4%BB%BD%E8%AF%81%E5%8F%B7%E6%98%AF%E5%90%A6%E5%90%88%E6%B3%95">&#x8EAB;&#x4EFD;&#x8BC1;&#x53F7;&#x662F;&#x5426;&#x5408;&#x6CD5;</h2><pre><code class="language-excel">=IF(VLOOKUP(MOD(SUMPRODUCT(MID(A2,ROW($1:$17),1)*{7;9;10;5;8;4;2;1;6;3;7;9;10;5;8;4;2}),11),{0,1;1,0;2,&quot;X&quot;;3,9;4,8;5,7;6,6;7,5;8,4;9,3;10,2},2,0)&amp;&quot;&quot;=RIGHT(A2,1),&quot;&#x5408;&#x6CD5;&quot;,&quot;&#x4E0D;&#x5408;&#x6CD5;&quot;)</code></pre><h2 id="%E8%BA%AB%E4%BB%BD%E8%AF%81%E5%8F%B7%E4%B8%AD%E7%9A%84%E7%94%9F%E6%97%A5">&#x8EAB;&#x4EFD;&#x8BC1;&#x53F7;&#x4E2D;&#x7684;&#x751F;&#x65E5;</h2><pre><code class="language-excel">=--TEXT(MID(A2,7,8),&quot;0-00-00&quot;)</code></pre><h2 id="%E8%BA%AB%E4%BB%BD%E8%AF%81%E5%8F%B7%E4%B8%AD%E7%9A%84%E5%B9%B4%E9%BE%84">&#x8EAB;&#x4EFD;&#x8BC1;&#x53F7;&#x4E2D;&#x7684;&#x5E74;&#x9F84;</h2><pre><code class="language-excel">=DATEDIF( --TEXT(MID(A2,7,8),&quot;0-00-00&quot;), TODAY(), &quot;Y&quot;)</code></pre><h2 id="%E8%BA%AB%E4%BB%BD%E8%AF%81%E5%8F%B7%E4%B8%AD%E7%9A%84%E6%80%A7%E5%88%AB">&#x8EAB;&#x4EFD;&#x8BC1;&#x53F7;&#x4E2D;&#x7684;&#x6027;&#x522B;</h2><pre><code class="language-excel">=IF(MOD(MID(O2,17,1),2)=0,&quot;&#x5973;&quot;,&quot;&#x7537;&quot;)</code></pre>]]></content:encoded></item><item><title><![CDATA[统计端口调用方连接数]]></title><description><![CDATA[<h3 id="%E7%BB%9F%E8%AE%A1%E5%85%B6%E4%BB%96%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8%E8%87%AA%E5%B7%B1%E7%9A%84">&#x7EDF;&#x8BA1;&#x5176;&#x4ED6;&#x670D;&#x52A1;&#x8C03;&#x7528;&#x81EA;&#x5DF1;&#x7684;</h3><pre><code class="language-shell">ss -at -o state established &apos;( sport = :8090 )&apos;|awk &apos;NR !=1 {print $4}&apos;|column -s &apos;:&apos; -t|awk &apos;{print $1}&apos;|sort|uniq -c|sort -n</code></pre><ul><li>-a&#xFF1A;&#x5168;&#x90E8;&#x8FDE;&#x63A5;</li><li>-t&#xFF1A;</li></ul>]]></description><link>http://www.dev-f.cn/tong-ji-duan-kou-diao-yong-fang-lian-jie-shu/</link><guid isPermaLink="false">6498fe73f84d1700017a83ef</guid><dc:creator><![CDATA[fyn]]></dc:creator><pubDate>Mon, 26 Jun 2023 03:01:45 GMT</pubDate><content:encoded><![CDATA[<h3 id="%E7%BB%9F%E8%AE%A1%E5%85%B6%E4%BB%96%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8%E8%87%AA%E5%B7%B1%E7%9A%84">&#x7EDF;&#x8BA1;&#x5176;&#x4ED6;&#x670D;&#x52A1;&#x8C03;&#x7528;&#x81EA;&#x5DF1;&#x7684;</h3><pre><code class="language-shell">ss -at -o state established &apos;( sport = :8090 )&apos;|awk &apos;NR !=1 {print $4}&apos;|column -s &apos;:&apos; -t|awk &apos;{print $1}&apos;|sort|uniq -c|sort -n</code></pre><ul><li>-a&#xFF1A;&#x5168;&#x90E8;&#x8FDE;&#x63A5;</li><li>-t&#xFF1A;&#x4EC5;tcp&#x8FDE;&#x63A5;</li><li>-o state established&#xFF1A;&#x8FC7;&#x6EE4;&#x53EA;&#x4FDD;&#x7559;&#x6D3B;&#x8DC3;&#x8FDE;&#x63A5;</li><li>( sport = :8090 )&#xFF1A;&#x4EC5;&#x4FDD;&#x7559;&#x670D;&#x52A1;&#x7AEF;8090&#x7AEF;&#x53E3;</li><li>awk NR!=1 &#x4E0D;&#x8981;&#x6807;&#x9898;&#x884C;</li><li>{print $4} &#x53EA;&#x4FDD;&#x7559;&#x7B2C;&#x56DB;&#x5217;&#xFF08;&#x5BA2;&#x6237;&#x7AEF;ip&#x548C;&#x7AEF;&#x53E3;&#xFF09;</li><li>column -s &apos;:&apos; -t &#x6309;&#x5192;&#x53F7;&#x5207;&#x5272;&#xFF08;ip:port&#xFF09;</li><li>awk &apos;{print $1}&apos; &#x53EA;&#x4FDD;&#x7559;&#x7B2C;&#x4E00;&#x5217;&#xFF08;&#x53EA;&#x4FDD;&#x7559;ip&#xFF09;</li><li>sort&#xFF1A;&#x6392;&#x5E8F;</li><li>uniq -c&#xFF1A;&#x6C47;&#x603B;&#x6BCF;&#x4E2A;ip&#x7684;&#x6570;&#x91CF;&#xFF08;&#x9700;&#x8981;&#x5148;&#x6392;&#x5E8F;&#x540E;&#x6C47;&#x603B;&#xFF09;</li><li>sort -n &#x6309;count&#x6570;&#x6392;&#x5E8F;</li></ul><h3 id="%E7%BB%9F%E8%AE%A1%E8%87%AA%E5%B7%B1%E8%B0%83%E7%94%A8%E5%85%B6%E4%BB%96%E6%9C%8D%E5%8A%A1%E7%9A%84">&#x7EDF;&#x8BA1;&#x81EA;&#x5DF1;&#x8C03;&#x7528;&#x5176;&#x4ED6;&#x670D;&#x52A1;&#x7684;</h3><pre><code class="language-shell">ss -at -o state established &apos;( sport != :8090 )&apos;|awk &apos;NR !=1 {print $4}&apos;|sort|uniq -c|sort -n</code></pre>]]></content:encoded></item><item><title><![CDATA[k8s中部署acme.sh]]></title><description><![CDATA[<h3 id="%E5%88%9B%E5%BB%BAdeployment">&#x521B;&#x5EFA;Deployment</h3><pre><code class="language-yaml">apiVersion: apps/v1
kind: Deployment
metadata:
  name: acme-sh-deployment
  labels:
    app: acme-sh
spec:
  replicas: 1
  selector:
    matchLabels:
      app: acme-sh
  template:
    metadata:
      labels:
        app: acme-sh
    spec:
      volumes:
      - name: acme-sh # &#x5C06;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x548C;&#x751F;&#x6210;&#x7684;&#x8BC1;&#x4E66;&#x6302;&#x8F7D;&#x5230;&#x5BBF;&#x4E3B;&#x673A;
        hostPath:
          path:</code></pre>]]></description><link>http://www.dev-f.cn/k8szhong-bu-shu-acme-sh/</link><guid isPermaLink="false">637374346c43230001e3d492</guid><dc:creator><![CDATA[fyn]]></dc:creator><pubDate>Tue, 15 Nov 2022 11:21:29 GMT</pubDate><content:encoded><![CDATA[<h3 id="%E5%88%9B%E5%BB%BAdeployment">&#x521B;&#x5EFA;Deployment</h3><pre><code class="language-yaml">apiVersion: apps/v1
kind: Deployment
metadata:
  name: acme-sh-deployment
  labels:
    app: acme-sh
spec:
  replicas: 1
  selector:
    matchLabels:
      app: acme-sh
  template:
    metadata:
      labels:
        app: acme-sh
    spec:
      volumes:
      - name: acme-sh # &#x5C06;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x548C;&#x751F;&#x6210;&#x7684;&#x8BC1;&#x4E66;&#x6302;&#x8F7D;&#x5230;&#x5BBF;&#x4E3B;&#x673A;
        hostPath:
          path: /data/acme.sh
      containers:
      - name: acme-sh
        image: neilpang/acme.sh:latest
        args: [&quot;daemon&quot;] # &#x4EE5;deamon&#x6A21;&#x5F0F;&#x8FD0;&#x884C;
        env:
        - name: &quot;DP_Id&quot; # &#x63A5;&#x5165;DNSPod API
          value: &quot;****&quot;
        - name: &quot;DP_Key&quot; # &#x63A5;&#x5165;DNSPod API
          value: &quot;****&quot;
        volumeMounts:
        - name: acme-sh
          mountPath: /acme.sh
</code></pre><h3 id="%E9%85%8D%E7%BD%AE%E8%B4%A6%E5%8F%B7">&#x914D;&#x7F6E;&#x8D26;&#x53F7;</h3><pre><code class="language-bash">kubectl exec acme-sh-deployment-**********-***** -- acme.sh --register-account -m xxx@example.com</code></pre><h3 id="%E9%85%8D%E7%BD%AE%E5%9F%9F%E5%90%8D">&#x914D;&#x7F6E;&#x57DF;&#x540D;</h3><pre><code class="language-bash">kubectl exec acme-sh-deployment-**********-***** -- acme.sh --issue --dns dns_dp -d &quot;example.com&quot; -d &quot;www.example.com&quot; -d &quot;*.example.com&quot;</code></pre><h3 id="%E6%B7%BB%E5%8A%A0%E5%88%B0k8s-secret%E4%B8%AD">&#x6DFB;&#x52A0;&#x5230;k8s secret&#x4E2D;</h3><pre><code class="language-bash">kubectl create secret tls dev-f-tls --cert=/data/acme.sh/example.com/example.com.cer --key=/data/acme.sh/example.com/example.com.key</code></pre><h3 id="cron%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0">cron&#x81EA;&#x52A8;&#x66F4;&#x65B0;</h3><pre><code class="language-crontab">0 0 * * *  kubectl create secret tls dev-f-tls --cert=/data/acme.sh/example.com/example.com.cer --key=/data/acme.sh/example.com/example.com.key --dry-run=client --save-config=true  -o yaml| kubectl apply -f -  &gt; /dev/null 2&gt;&amp;1 &amp;</code></pre><h3 id="%E9%9B%86%E7%BE%A4">&#x96C6;&#x7FA4;</h3><p>&#x96C6;&#x7FA4;&#x6A21;&#x5F0F;&#x4E0B;&#x5E94;&#x4FEE;&#x6539;vlumes&#xFF0C;&#x6302;&#x8F7D;&#x7F51;&#x76D8;&#x6216;&#x5176;&#x5B83;&#x5B58;&#x50A8;</p>]]></content:encoded></item><item><title><![CDATA[k8s中部署ghost]]></title><description><![CDATA[<h3 id="%E5%88%9B%E5%BB%BAdeployment">&#x521B;&#x5EFA;Deployment</h3><pre><code class="language-yaml">apiVersion: apps/v1
kind: Deployment
metadata:
  name: ghost-deployment
  labels:
    app: ghost
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ghost
  template:
    metadata:
      labels:
        app: ghost
    spec:
      volumes:
        - name: tz
          hostPath:
            path: /etc/localtime
        - name: ghost-content
          hostPath:
            path: /data/ghost-content
        - name: ghost-db # &#x7B2C;&#x4E00;&#x6B21;&#x521B;&#x5EFA;</code></pre>]]></description><link>http://www.dev-f.cn/k8szhong-bu-shu-ghost/</link><guid isPermaLink="false">6373084d6c43230001e3d45c</guid><dc:creator><![CDATA[fyn]]></dc:creator><pubDate>Tue, 15 Nov 2022 08:56:51 GMT</pubDate><content:encoded><![CDATA[<h3 id="%E5%88%9B%E5%BB%BAdeployment">&#x521B;&#x5EFA;Deployment</h3><pre><code class="language-yaml">apiVersion: apps/v1
kind: Deployment
metadata:
  name: ghost-deployment
  labels:
    app: ghost
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ghost
  template:
    metadata:
      labels:
        app: ghost
    spec:
      volumes:
        - name: tz
          hostPath:
            path: /etc/localtime
        - name: ghost-content
          hostPath:
            path: /data/ghost-content
        - name: ghost-db # &#x7B2C;&#x4E00;&#x6B21;&#x521B;&#x5EFA;&#x65F6;&#x4E0D;&#x6302;&#x8F7D;&#x8FD9;&#x4E2A;&#xFF0C;&#x9700;&#x8981;&#x542F;&#x52A8;&#x540E;&#x4ECE;./current/content/data&#x91CC;&#x590D;&#x5236;&#x51FA;&#x6765;&#x4E00;&#x4EFD;
          hostPath:
            path: /data/ghost-dev.db
      containers:
      - name: ghost
        image: ghost:latest
        volumeMounts:
          - name: tz
            mountPath: /etc/localtime
          - name: ghost-content
            mountPath: /var/lib/ghost/content
          - name: ghost-db  # &#x7B2C;&#x4E00;&#x6B21;&#x521B;&#x5EFA;&#x65F6;&#x4E0D;&#x6302;&#x8F7D;&#x8FD9;&#x4E2A;
            mountPath: /var/lib/ghost/current/content/data/ghost-dev.db
        ports:
        - containerPort: 2368
        env:
        - name: NODE_ENV
          value: &quot;development&quot;
        - name: url
          value: &quot;http://www.dev-f.cn&quot;
</code></pre><h3 id="%E5%88%9B%E5%BB%BAservice">&#x521B;&#x5EFA;Service</h3><pre><code class="language-yaml">apiVersion: v1
kind: Service
metadata:
  name: ghost-service
spec:
  selector:
    app: ghost
  ports:
    - protocol: TCP
      port: 80
      targetPort: 2368</code></pre><h3 id="%E5%88%9B%E5%BB%BAingress">&#x521B;&#x5EFA;Ingress</h3><pre><code class="language-yaml">apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ghost-ingress
  annotations:
    # kubernetes.io/ingress.class: traefik
    # traefik.ingress.kubernetes.io/router.middlewares: default-redirect@kubernetescrd
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: &quot;true&quot;
spec:
  # tls: # https&#x914D;&#x7F6E;&#xFF08;&#x9700;&#x8981;&#x6DFB;&#x52A0;secret&#xFF09;
  # - hosts:
  #   - &quot;www.example.com&quot;
  #   secretName: example-tls
  rules:
  - host: &quot;www.example.com&quot;
    http:
      paths:
      - path: &quot;/&quot;
        pathType: Prefix
        backend:
          service:
            name: ghost-service
            port:
              number: 80
</code></pre>]]></content:encoded></item><item><title><![CDATA[解决go build -race在mac上报错的问题]]></title><description><![CDATA[<!--kg-card-begin: html-->
<p>&#x73AF;&#x5883;&#x53D8;&#x91CF;&#x4E2D;&#x589E;&#x52A0; <code>MallocNanoZone=0</code> &#x5373;&#x53EF;</p>
<!--kg-card-end: html-->]]></description><link>http://www.dev-f.cn/go-build-race-on-mac/</link><guid isPermaLink="false">637249606c43230001e3d3bb</guid><dc:creator><![CDATA[fyn]]></dc:creator><pubDate>Mon, 14 Mar 2022 11:50:15 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: html-->
<p>&#x73AF;&#x5883;&#x53D8;&#x91CF;&#x4E2D;&#x589E;&#x52A0; <code>MallocNanoZone=0</code> &#x5373;&#x53EF;</p>
<!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[k8s查看pod重启前的日志]]></title><description><![CDATA[<!--kg-card-begin: html-->
<pre class="wp-block-code"><code lang="bash" class="language-bash">kubectl logs &lt;pod&gt; -n &lt;namespace&gt; --previous=true</code></pre>
<!--kg-card-end: html-->]]></description><link>http://www.dev-f.cn/k8s-pod-log/</link><guid isPermaLink="false">637249606c43230001e3d3b9</guid><dc:creator><![CDATA[fyn]]></dc:creator><pubDate>Fri, 06 Aug 2021 17:12:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: html-->
<pre class="wp-block-code"><code lang="bash" class="language-bash">kubectl logs &lt;pod&gt; -n &lt;namespace&gt; --previous=true</code></pre>
<!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[记一次升级go到1.16时遇到的问题]]></title><description><![CDATA[<!--kg-card-begin: html-->
<p>&#x73AF;&#x5883;&#xFF1A;Centos7 + Jenkins + go1.16</p>



<h2>&#x95EE;&#x9898;1: mission $GOPATH</h2>



<p>&#x6211;&#x5728;Jenkins&#x4E2D;&#x4F7F;&#x7528;go&#x7684;&#x63D2;&#x4EF6;&#xFF08;&#x53EF;&#x4EE5;&#x81EA;&#x52A8;&#x4E0B;&#x8F7D;&#x7279;&#x5B9A;&#x7248;&#x672C;&#xFF09;&#xFF0C;&#x4F46;&#x662F;&#x4E0D;&#x77E5;&#x9053;&#x4E3A;&#x4EC0;&#x4E48;&#x4F7F;&#x7528;1.16&#x7248;&#x672C;&#x662F;</p>]]></description><link>http://www.dev-f.cn/-e8-ae-b0-e4-b8-80-e6-ac-a1-e5-8d-87-e7-ba-a7go-e5-88-b01-16-e6-97-b6-e9-81-87-e5-88-b0-e7-9a-84-e9-97-ae-e9-a2-98/</link><guid isPermaLink="false">637249606c43230001e3d3b8</guid><dc:creator><![CDATA[fyn]]></dc:creator><pubDate>Wed, 30 Jun 2021 19:29:04 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: html-->
<p>&#x73AF;&#x5883;&#xFF1A;Centos7 + Jenkins + go1.16</p>



<h2>&#x95EE;&#x9898;1: mission $GOPATH</h2>



<p>&#x6211;&#x5728;Jenkins&#x4E2D;&#x4F7F;&#x7528;go&#x7684;&#x63D2;&#x4EF6;&#xFF08;&#x53EF;&#x4EE5;&#x81EA;&#x52A8;&#x4E0B;&#x8F7D;&#x7279;&#x5B9A;&#x7248;&#x672C;&#xFF09;&#xFF0C;&#x4F46;&#x662F;&#x4E0D;&#x77E5;&#x9053;&#x4E3A;&#x4EC0;&#x4E48;&#x4F7F;&#x7528;1.16&#x7248;&#x672C;&#x662F;&#x62A5;<code>mission $GOPATH</code>&#x7684;&#x9519;&#x8BEF;&#xFF0C;&#x4F46;&#x662F;1.15&#x4E0D;&#x62A5;&#xFF0C;&#x5E76;&#x4E14;1.15&#x4E5F;&#x6CA1;&#x6709;&#x8BBE;&#x7F6E;GOPATH&#x3002; </p>



<p>&#x7ECF;&#x6392;&#x67E5;&#x540E;&#x53D1;&#x73B0;&#x8FD9;&#x4E2A;&#x670D;&#x52A1;&#x5668;&#x7684;jenkins&#x7528;&#x6237;&#x73AF;&#x5883;&#x53D8;&#x91CF;&#x4E2D;&#x6CA1;&#x6709;HOME&#x8FD9;&#x4E2A;&#x73AF;&#x5883;&#x53D8;&#x91CF;&#x3002;&#x5982;&#x679C;&#x4E0D;&#x914D;&#x7F6E;GOPATH&#x65F6;&#xFF0C;GOPATH&#x9ED8;&#x8BA4;&#x4E3A;<code>~/go</code>&#x3002;</p>



<p>&#x4F30;&#x8BA1;&#x662F;1.16&#x4EE5;&#x540E;&#x7528;&#x6237;HOME&#x67E5;&#x627E;&#x76EE;&#x5F55;&#xFF0C;1.15&#x53CA;&#x4EE5;&#x524D;&#x7528;&#x5176;&#x5B83;&#x65B9;&#x5F0F;&#x67E5;&#x627E;&#x3002; </p>



<p>&#x4E3A;&#x4E86;&#x4E0D;&#x91CD;&#x542F;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x5728;jenkins&#x7684;Configure System&#x4E2D;&#x589E;&#x52A0;&#x4E86;&#x8FD9;&#x4E2A;&#x73AF;&#x5883;&#x53D8;&#x91CF;&#x3002;</p>



<h2>&#x95EE;&#x9898;2: unrecognized relocation (0x2a) in section `.text&#x2019;</h2>



<p>&#x5728;&#x7F51;&#x4E0A;&#x67E5;&#x8FD9;&#x4E2A;&#x9519;&#x8BEF;&#x8BF4;&#x662F;Centos&#x6216;ld&#x7248;&#x672C;&#x592A;&#x4F4E;&#x5BFC;&#x81F4;&#xFF0C;&#x4F46;&#x662F;&#x6211;&#x7528;&#x7684;Centos7&#x7248;&#x672C;&#x4E0D;&#x7B97;&#x592A;&#x8001;&#x3002;</p>



<p>&#x6309;&#x7167;&#x7F51;&#x4E0A;&#x7684;&#x65B9;&#x6CD5;<code>sudo yum -y install binutils</code>&#x5347;&#x7EA7;&#x4E86;ld&#x540E;&#xFF0C;&#x95EE;&#x9898;&#x89E3;&#x51B3;</p>
<!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[找出有限数列中和值最大的连续子数列]]></title><description><![CDATA[<!--kg-card-begin: html-->
<pre class="wp-block-code"><code lang="javascript" class="language-javascript">((list) =&gt; {
    let max = {
        total: 0,
        first: 0,
        last: 0,
    };
    let tmp = {
        total: 0,
        first: 0,
        last: 0,
    };
    let op = 0;//&#x662F;&#x5426;&#x8FDE;&#x7EED;&#xFF0C;0&#x4E0D;&#x8FDE;&#x7EED;&#xFF0C;1&#x9012;&#x589E;&#x8FDE;&#x7EED;&#xFF0C;-1&#x9012;&#x51CF;&#x8FDE;&#x7EED;
    list.forEach((current, i) =&gt; {
        if (i === 0)</code></pre>]]></description><link>http://www.dev-f.cn/-e6-89-be-e5-87-ba-e6-9c-89-e9-99-90-e6-95-b0-e5-88-97-e4-b8-ad-e5-92-8c-e5-80-bc-e6-9c-80-e5-a4-a7-e7-9a-84-e8-bf-9e-e7-bb-ad-e5-ad-90-e6-95-b0-e5-88/</link><guid isPermaLink="false">637249606c43230001e3d3b7</guid><dc:creator><![CDATA[fyn]]></dc:creator><pubDate>Mon, 22 Feb 2021 16:12:53 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: html-->
<pre class="wp-block-code"><code lang="javascript" class="language-javascript">((list) =&gt; {
    let max = {
        total: 0,
        first: 0,
        last: 0,
    };
    let tmp = {
        total: 0,
        first: 0,
        last: 0,
    };
    let op = 0;//&#x662F;&#x5426;&#x8FDE;&#x7EED;&#xFF0C;0&#x4E0D;&#x8FDE;&#x7EED;&#xFF0C;1&#x9012;&#x589E;&#x8FDE;&#x7EED;&#xFF0C;-1&#x9012;&#x51CF;&#x8FDE;&#x7EED;
    list.forEach((current, i) =&gt; {
        if (i === 0) {
            tmp.total = current;
            max.total = current;
            return;
        }
        const prev = list[i - 1];
        if (op === 0) {
            if (current &gt; prev) {
                op = 1;
            } else if (current &lt; prev) {
                op = -1;
            } else {
                op = 0;
            }
        }
        if (op !== 0 &amp;&amp; current - prev === op) {
            tmp.total += current;
        } else {
            if (max.total &lt; tmp.total) {
                max.total = tmp.total;
                max.first = tmp.first;
                max.last = tmp.last;
            }
            op = 0
            tmp.first = i;
            tmp.total = current;
        }
        tmp.last = i;
    });
    if (max.total &lt; tmp.total) {
        max = tmp;
    }
    return [
        &quot;&#x548C;&#x503C;&#xFF1A;&quot; + max.total,
        &quot;&#x503C;&#xFF1A;&quot; + list[max.first] + &quot;&#xFF5E;&quot; + list[max.last],
        &quot;&#x7D22;&#x5F15;&#xFF1A;&quot; + max.first + &quot;&#xFF5E;&quot; + max.last
    ].join(&quot;\n&quot;);
})([1, 2, 3, 4, 3, 2, 5, 6, 7, 8]);</code></pre>
<!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[新项目代码规范]]></title><description><![CDATA[<!--kg-card-begin: html-->
<div id="toc_container" class="toc_white no_bullets"><p class="toc_title">&#x76EE;&#x5F55;</p><ul class="toc_list"><li><a href="#Result"><span class="toc_number toc_depth_1">1</span> Result&#x7C7B;</a><ul><li><a href="#i"><span class="toc_number toc_depth_2">1.1</span> &#x7ED3;&#x6784;</a></li><li><a href="#code"><span class="toc_number toc_depth_2">1.2</span> code&#x7684;&#x5B9A;&#x4E49;</a></li></ul></li><li><a href="#i-2"><span class="toc_number toc_depth_1">2</span> &#x6027;&#x522B;</a></li><li><a href="#i-3"><span class="toc_number toc_depth_1">3</span> &#x7248;&#x672C;&#x53F7;</a><ul><li><a href="#i-4"><span class="toc_number toc_depth_2">3.1</span> &#x5B57;&#x7B26;&#x4E32;&#x683C;&#x5F0F;</a></li><li><a href="#i-5"><span class="toc_number toc_depth_2">3.2</span> &#x6570;&#x5B57;&#x683C;&#x5F0F;</a></li></ul></li></ul></div>
<h2><span id="Result">Result&#x7C7B;</span></h2>



<h3><span id="i">&#x7ED3;&#x6784;</span></h3>



<pre class="wp-block-code"><code lang="json" class="language-json">{
  &quot;code&quot;: 0,
  &quot;msg&quot;: &quot;ok&quot;,
  &quot;</code></pre>]]></description><link>http://www.dev-f.cn/coding-guide/</link><guid isPermaLink="false">637249606c43230001e3d3b6</guid><dc:creator><![CDATA[fyn]]></dc:creator><pubDate>Wed, 18 Nov 2020 10:30:58 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: html-->
<div id="toc_container" class="toc_white no_bullets"><p class="toc_title">&#x76EE;&#x5F55;</p><ul class="toc_list"><li><a href="#Result"><span class="toc_number toc_depth_1">1</span> Result&#x7C7B;</a><ul><li><a href="#i"><span class="toc_number toc_depth_2">1.1</span> &#x7ED3;&#x6784;</a></li><li><a href="#code"><span class="toc_number toc_depth_2">1.2</span> code&#x7684;&#x5B9A;&#x4E49;</a></li></ul></li><li><a href="#i-2"><span class="toc_number toc_depth_1">2</span> &#x6027;&#x522B;</a></li><li><a href="#i-3"><span class="toc_number toc_depth_1">3</span> &#x7248;&#x672C;&#x53F7;</a><ul><li><a href="#i-4"><span class="toc_number toc_depth_2">3.1</span> &#x5B57;&#x7B26;&#x4E32;&#x683C;&#x5F0F;</a></li><li><a href="#i-5"><span class="toc_number toc_depth_2">3.2</span> &#x6570;&#x5B57;&#x683C;&#x5F0F;</a></li></ul></li></ul></div>
<h2><span id="Result">Result&#x7C7B;</span></h2>



<h3><span id="i">&#x7ED3;&#x6784;</span></h3>



<pre class="wp-block-code"><code lang="json" class="language-json">{
  &quot;code&quot;: 0,
  &quot;msg&quot;: &quot;ok&quot;,
  &quot;data&quot;: null
}</code></pre>



<ul><li>code&#xFF1A;&#x4E3A;&#x9519;&#x8BEF;&#x7F16;&#x7801;&#xFF0C;&#x53EA;&#x80FD;&#x662F;int</li><li>msg&#xFF1A;&#x4E3A;&#x9519;&#x8BEF;&#x4FE1;&#x606F;&#xFF0C;&#x53EA;&#x80FD;&#x662F;&#x5B57;&#x7B26;&#x4E32;</li><li>data&#xFF1A;&#x4E3A;&#x6570;&#x636E;&#xFF0C;&#x53EF;&#x4EE5;&#x662F;&#x4EFB;&#x4F55;&#x7C7B;&#x578B;</li></ul>



<h3><span id="code">code&#x7684;&#x5B9A;&#x4E49;</span></h3>



<figure class="wp-block-table is-style-regular"><table><thead><tr><th>&#x503C;</th><th>&#x8BF4;&#x660E;</th></tr></thead><tbody><tr><td>0</td><td>&#x6210;&#x529F;</td></tr><tr><td>&#x5927;&#x4E8E;0</td><td>&#x4E3A;&#x4E1A;&#x52A1;&#x9519;&#x8BEF;&#xFF0C;&#x53EF;&#x76F4;&#x63A5;&#x5C06;msg&#x5C55;&#x793A;&#x7ED9;&#x524D;&#x7AEF;</td></tr><tr><td>&#x5C0F;&#x4E8E;0</td><td>&#x4E3A;&#x7CFB;&#x7EDF;&#x9519;&#x8BEF;&#xFF0C;&#x4E0D;&#x5E94;&#x5C06;msg&#x5C55;&#x793A;&#x7ED9;&#x524D;&#x7AEF;</td></tr></tbody></table></figure>



<h2><span id="i-2">&#x6027;&#x522B;</span></h2>



<ul><li>&#x5B57;&#x6BB5;&#x540D;&#xFF1A;gender</li></ul>



<figure class="wp-block-table is-style-regular"><table><thead><tr><th>&#x503C;</th><th>&#x8BF4;&#x660E;</th></tr></thead><tbody><tr><td>0</td><td>&#x672A;&#x77E5;</td></tr><tr><td>1</td><td>&#x7537;</td></tr><tr><td>2</td><td>&#x5973;</td></tr></tbody></table></figure>



<h2><span id="i-3">&#x7248;&#x672C;&#x53F7;</span></h2>



<h3><span id="i-4">&#x5B57;&#x7B26;&#x4E32;&#x683C;&#x5F0F;</span></h3>



<p>&lt;major&gt;.&lt;minor&gt;.&lt;patch&gt; &#x6216; v&lt;major&gt;.&lt;minor&gt;.&lt;patch&gt;</p>



<p>&#x4E09;&#x6BB5;&#x5FC5;&#x987B;&#x90FD;&#x6709;&#xFF0C;&#x4E0D;&#x80FD;&#x7701;&#x7565;&#xFF0C;&#x5982;&#xFF1A;v1.0.0&#xFF0C;v1.2.3&#xFF0C;2.5.7</p>



<ul><li>major&#x4E3A;&#x5927;&#x7248;&#x672C;&#xFF0C;&#x5347;&#x7EA7;major&#x65F6;&#x53EF;&#x4E0D;&#x5411;&#x4E0B;&#x517C;&#x5BB9;</li><li>minor&#x4E3A;&#x529F;&#x80FD;&#x7248;&#x672C;&#xFF0C;&#x5347;&#x7EA7;minor&#x65F6;&#x5E94;&#x5C3D;&#x53EF;&#x80FD;&#x5411;&#x4E0B;&#x517C;&#x5BB9;</li><li>patch&#x4E3A;&#x8865;&#x4E01;&#x7248;&#x672C;&#xFF0C;&#x5347;&#x7EA7;patch&#x65F6;&#x5FC5;&#x987B;&#x5411;&#x4E0B;&#x517C;&#x5BB9;&#xFF0C;&#x5347;&#x7EA7;patch&#x7248;&#x672C;&#x65F6;&#x4E0D;&#x5E94;&#x63D0;&#x4F9B;&#x65B0;&#x529F;&#x80FD;&#x6216;&#x65B0;&#x63A5;&#x53E3;</li></ul>



<h3><span id="i-5">&#x6570;&#x5B57;&#x683C;&#x5F0F;</span></h3>



<p>&#x6B63;&#x6574;&#x6570;&#xFF0C;&#x6700;&#x540E;&#x4E09;&#x4F4D;&#x4EE3;&#x8868;patch&#xFF0C;&#x4E2D;&#x95F4;&#x4E09;&#x4F4D;&#x4EE3;&#x8868;minor&#xFF0C;&#x6700;&#x524D;&#x9762;&#x7684;&#x82E5;&#x5E72;&#x4F4D;&#x4EE3;&#x8868;major</p>



<p>&#x5982;&#xFF1A;1000000&#x4E3A;v1.0.0&#xFF0C;21001134&#x4EE3;&#x8868;v21.1.134</p>
<!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[在mac中通过shell弹窗或发通知]]></title><description><![CDATA[<!--kg-card-begin: html-->
<p>Mac&#x4E2D;&#x6709;&#x4E2A;AppleScript&#xFF0C;&#x901A;&#x8FC7;&#x5B83;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x5F39;&#x7A97;&#x6216;&#x7CFB;&#x7EDF;&#x901A;&#x77E5;</p>



<h2>&#x5F39;&#x7A97;</h2>



<pre class="wp-block-code"><code lang="bash" class="language-bash">osascript -e &apos;display alert &quot;&#x544A;&#x8B66;&#xFF01;&#xFF01;&quot; as critical&apos;</code></pre>



<ul><li>osascript -e &#x662F;&#x6267;&#x884C;&#x4E00;&#x6BB5;apple script</li><li>display alert&#x662F;&#x5F39;&#x7A97;</li></ul>]]></description><link>http://www.dev-f.cn/-e5-9c-a8mac-e4-b8-ad-e9-80-9a-e8-bf-87shell-e5-bc-b9-e7-aa-97-e6-88-96-e5-8f-91-e9-80-9a-e7-9f-a5/</link><guid isPermaLink="false">637249606c43230001e3d3b4</guid><dc:creator><![CDATA[fyn]]></dc:creator><pubDate>Mon, 18 May 2020 16:38:12 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: html-->
<p>Mac&#x4E2D;&#x6709;&#x4E2A;AppleScript&#xFF0C;&#x901A;&#x8FC7;&#x5B83;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x5F39;&#x7A97;&#x6216;&#x7CFB;&#x7EDF;&#x901A;&#x77E5;</p>



<h2>&#x5F39;&#x7A97;</h2>



<pre class="wp-block-code"><code lang="bash" class="language-bash">osascript -e &apos;display alert &quot;&#x544A;&#x8B66;&#xFF01;&#xFF01;&quot; as critical&apos;</code></pre>



<ul><li>osascript -e &#x662F;&#x6267;&#x884C;&#x4E00;&#x6BB5;apple script</li><li>display alert&#x662F;&#x5F39;&#x7A97;</li><li>as critcal&#x662F;&#x7528;&#x6765;&#x63A7;&#x5236;&#x56FE;&#x6807;&#xFF0C;&#x53EF;&#x4EE5;as&#x4E09;&#x4E2A;&#x503C;&#xFF08;informational&#xFF0C;warning&#xFF0C;critical&#xFF0C;&#x9ED8;&#x8BA4;&#x662F;informational&#xFF09;</li></ul>



<h2>&#x53D1;&#x901A;&#x77E5;</h2>



<pre class="wp-block-code"><code lang="bash" class="language-bash">osascript -e &apos;display notification &quot;&#x901A;&#x77E5;&#x5185;&#x5BB9;&quot; with title &quot;&#x6807;&#x9898;&quot; subtitle &quot;&#x5B50;&#x6807;&#x9898;&quot; sound name &quot;Glass&quot;&apos;</code></pre>



<ul><li>display notification &#x662F;&#x53D1;&#x901A;&#x77E5;&#x7684;&#x547D;&#x4EE4;&#x540E;&#x9762;&#x7D27;&#x8DDF;&#x7740;&#x901A;&#x77E5;&#x5185;&#x5BB9;</li><li>with title &#x53EF;&#x4EE5;&#x4FEE;&#x6539;&#x901A;&#x77E5;&#x6807;&#x9898;&#xFF08;&#x9ED8;&#x8BA4;&#x662F;&#x201C;&#x811A;&#x672C;&#x7F16;&#x8F91;&#x5668;&#x201D;&#xFF09;</li><li>subtitle &#x53EF;&#x4EE5;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A;&#x5B50;&#x6807;&#x9898;&#xFF08;&#x9ED8;&#x8BA4;&#x6CA1;&#x6709;&#xFF09;</li><li>sound name &#x53EF;&#x4EE5;&#x7528;&#x6765;&#x9009;&#x62E9;&#x4E00;&#x79CD;&#x901A;&#x77E5;&#x7684;&#x58F0;&#x97F3;&#xFF0C;&#x58F0;&#x97F3;&#x5B58;&#x653E;&#x5728;<code>/System/Library/Sounds</code>&#x4E2D;</li></ul>



<h2>&#x7ED3;&#x5408;PHP&#x5B9E;&#x6218;</h2>



<pre title="check.php" class="wp-block-code"><code lang="php" class="language-php line-numbers">&lt;?php
ini_set(&apos;date.timezone&apos;,&apos;PRC&apos;);

$host = &apos;mysql.example.org&apos;;
$port = &apos;3306&apos;;
$dbname = &apos;test&apos;;
$username = &apos;root&apos;;
$password = &apos;123456&apos;;
$pdo = new PDO(&quot;mysql:host={$host};port={$port};dbname={$dbname};charset=UTF8&quot;, $username, $password);

$sql = &lt;&lt;&lt;SQL
SELECT u.uid, p.privilege_id, u.updated_at 
FROM user_privilege AS p 
LEFT JOIN user AS u ON u.uid = p.uid
WHERE u.del = 1 and p.del = 0;
SQL;

$statement = $pdo-&gt;query($sql);
$result = $statement-&gt;fetchAll(PDO::FETCH_ASSOC);
$new = [];

$logDir = __DIR__ . &apos;/log/&apos;;
if (!file_exists($logDir)) {
    mkdir($logDir, 0755, true);
}
foreach ($result as $item) {
    $fileName = $logDir . &apos;/&apos; . $item[&apos;uid&apos;] . &apos;.json&apos;;
    if (!file_exists($fileName)) {
        file_put_contents($fileName, json_encode($item, JSON_PRETTY_PRINT));
        $new[] = $item[&apos;uid&apos;];
    }
}
if ($new) {
    $msg = sprintf(&apos;%s&#x53D1;&#x73B0;&#x65B0;&#x5F02;&#x5E38;&#x6570;&#x636E;%d&#x6761;&#xFF01;(%s)&apos;, date(&apos;Y-m-d H:i:s&apos;), count($new), implode(&apos;, &apos;, $new));
    $cmd = &lt;&lt;&lt;CMD
osascript -e &apos;tell application &quot;System Events&quot; to display alert &quot;{$msg}&quot; as critical&apos;
CMD;
    exec($cmd);
}</code></pre>



<p>&#x8FD9;&#x4E2A;&#x811A;&#x672C;&#x8FDE;&#x63A5;&#x4E00;&#x4E2A;&#x8FDC;&#x7A0B;&#x7684;&#x6570;&#x636E;&#x5E93;&#xFF0C;&#x68C0;&#x67E5;&#x662F;&#x5426;&#x51FA;&#x73B0;&#x7528;&#x6237;&#x88AB;&#x5220;&#x9664;&#xFF0C;&#x4F46;&#x662F;&#x6743;&#x9650;&#x6CA1;&#x6709;&#x88AB;&#x5220;&#x9664;&#x7684;&#x60C5;&#x51B5;&#xFF0C;&#x5982;&#x679C;&#x53D1;&#x73B0;&#x5C06;&#x5B83;&#x8BB0;&#x5F55;&#x5230;&#x65E5;&#x5FD7;&#x5E76;&#x5F39;&#x7A97;&#x63D0;&#x793A;&#x3002;&#x8FD9;&#x91CC;&#x589E;&#x52A0;&#x4E86;<code>tell application &quot;System Events&quot; to</code>&#x8FD9;&#x4E48;&#x4E2A;&#x524D;&#x7F00;&#xFF0C;&#x662F;&#x6307;&#x4EE5;&#x201C;System Events&#x201D;&#x8FD9;&#x4E2A;&#x5E94;&#x7528;&#x5F39;&#x8FD9;&#x4E2A;&#x7A97;&#xFF0C;&#x8FD9;&#x662F;&#x56E0;&#x4E3A;&#x597D;&#x50CF;&#x6709;&#x4EC0;&#x4E48;&#x673A;&#x5236;&#x4F1A;&#x963B;&#x6B62;cron&#x4EFB;&#x52A1;&#x4E2D;&#x76F4;&#x63A5;&#x5F39;&#x7A97;&#xFF0C;&#x9700;&#x8981;&#x501F;&#x7528;&#x53E6;&#x4E00;&#x4E2A;&#x5E94;&#x7528;&#x7684;&#x8EAB;&#x4EFD;&#x3002;&#x4E5F;&#x53EF;&#x4EE5;&#x501F;&#x7528;&#x201D;Finder&#x201D;&#xFF0C;&#x53D1;&#x5F39;&#x7A97;&#x65F6;Finder&#x4F1A;&#x8DF3;&#x52A8;&#x4E00;&#x4E0B;&#xFF0C;&#x4F46;&#x662F;&#x5F39;&#x7A97;&#x9700;&#x8981;&#x70B9;Finder&#x624D;&#x80FD;&#x51FA;&#x6765;&#xFF0C;&#x800C;&#x4F7F;&#x7528;System Event&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x5F39;&#x51FA;&#x6765;&#x3002;</p>



<p>&#x63A5;&#x4E0B;&#x6765;&#x53EF;&#x4EE5;&#x5728;&#x6267;&#x884C;<code>crontab -e</code>&#x6765;&#x589E;&#x52A0;&#x4E2A;&#x8BA1;&#x5212;&#x4EFB;&#x52A1;</p>



<pre title="crontab -e" class="wp-block-code"><code class>MAILTO=&quot;&quot;
*/1 * * * * php ~/check.php &gt; /dev/null</code></pre>



<ul><li>MAILTO=&#x201D;&#x201D; &#x662F;&#x6267;&#x884C;crontab&#x4E0D;&#x53D1;&#x6267;&#x884C;&#x7ED3;&#x679C;&#x7684;&#x7CFB;&#x7EDF;&#x90AE;&#x4EF6;</li><li>*/1&#x662F;&#x6307;&#x6BCF;1&#x5206;&#x949F;&#x6267;&#x884C;&#x4E00;&#x6B21;&#xFF0C;&#x5269;&#x4E0B;&#x7684;*&#x5206;&#x522B;&#x4EE3;&#x8868;&#xFF1A;&#x6BCF;&#x5C0F;&#x65F6;(0~23)/&#x6BCF;&#x5929;(1~31)/&#x6BCF;&#x6708;(1~12)/&#x6BCF;&#x5468;&#x51E0;(0~6)</li></ul>
<!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[PHP交换两个值]]></title><description><![CDATA[<!--kg-card-begin: html-->
<pre class="wp-block-code"><code lang="php" class="language-php">$a = 1;
$b = 2;
list($a, $b) = array($b, $a);
[$a, $b] = [$b, $a];</code></pre>
<!--kg-card-end: html-->]]></description><link>http://www.dev-f.cn/php-e4-ba-a4-e6-8d-a2-e4-b8-a4-e4-b8-aa-e5-80-bc/</link><guid isPermaLink="false">637249606c43230001e3d3b3</guid><dc:creator><![CDATA[fyn]]></dc:creator><pubDate>Wed, 15 Apr 2020 17:06:56 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: html-->
<pre class="wp-block-code"><code lang="php" class="language-php">$a = 1;
$b = 2;
list($a, $b) = array($b, $a);
[$a, $b] = [$b, $a];</code></pre>
<!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[优惠券系统设计]]></title><description><![CDATA[<!--kg-card-begin: html-->
<div id="toc_container" class="toc_white no_bullets"><p class="toc_title">&#x76EE;&#x5F55;</p><ul class="toc_list"><li><a href="#i"><span class="toc_number toc_depth_1">1</span> &#x524D;&#x8A00;</a></li><li><a href="#i-2"><span class="toc_number toc_depth_1">2</span> &#x57FA;&#x7840;&#x529F;&#x80FD;&#xFF1A;&#x5EFA;&#x5238;&#x53D1;&#x5238;&#x7528;&#x5238;</a><ul><li><a href="#coupon"><span class="toc_number toc_depth_2">2.1</span> &#x57FA;&#x7840;&#x4FE1;&#x606F;&#xFF1A;coupon&#x8868;</a><ul><li><a href="#i-3"><span class="toc_number toc_depth_3">2.1.1</span> &#x8FC7;&#x671F;&#x7C7B;&#x578B;&#x4E0E;&#x8FC7;&#x671F;&#x65F6;&#x95F4;</a></li><li><a href="#i-4"><span class="toc_number toc_depth_3">2.1.2</span> &#x4F18;&#x60E0;&#x7C7B;&#x578B;&#x4E0E;&#x4F18;&#x60E0;&#x53C2;&#x6570;</a></li></ul></li></ul></li></ul></div>]]></description><link>http://www.dev-f.cn/coupon/</link><guid isPermaLink="false">637249606c43230001e3d3b0</guid><dc:creator><![CDATA[fyn]]></dc:creator><pubDate>Tue, 17 Mar 2020 18:51:41 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: html-->
<div id="toc_container" class="toc_white no_bullets"><p class="toc_title">&#x76EE;&#x5F55;</p><ul class="toc_list"><li><a href="#i"><span class="toc_number toc_depth_1">1</span> &#x524D;&#x8A00;</a></li><li><a href="#i-2"><span class="toc_number toc_depth_1">2</span> &#x57FA;&#x7840;&#x529F;&#x80FD;&#xFF1A;&#x5EFA;&#x5238;&#x53D1;&#x5238;&#x7528;&#x5238;</a><ul><li><a href="#coupon"><span class="toc_number toc_depth_2">2.1</span> &#x57FA;&#x7840;&#x4FE1;&#x606F;&#xFF1A;coupon&#x8868;</a><ul><li><a href="#i-3"><span class="toc_number toc_depth_3">2.1.1</span> &#x8FC7;&#x671F;&#x7C7B;&#x578B;&#x4E0E;&#x8FC7;&#x671F;&#x65F6;&#x95F4;</a></li><li><a href="#i-4"><span class="toc_number toc_depth_3">2.1.2</span> &#x4F18;&#x60E0;&#x7C7B;&#x578B;&#x4E0E;&#x4F18;&#x60E0;&#x53C2;&#x6570;</a></li><li><a href="#i-5"><span class="toc_number toc_depth_3">2.1.3</span> &#x603B;&#x6570;&#x91CF;&#x4E0E;&#x53D1;&#x653E;&#x6570;&#x91CF;</a></li><li><a href="#SN"><span class="toc_number toc_depth_3">2.1.4</span> SN&#x7684;&#x4F5C;&#x7528;&#xFF1A;&#x5B89;&#x5168;&#x65E0;&#x5C0F;&#x4E8B;</a></li></ul></li><li><a href="#user_coupon"><span class="toc_number toc_depth_2">2.2</span> &#x7528;&#x6237;&#x9886;&#x5230;&#x7684;&#x5238;&#xFF1A;user_coupon&#x8868;</a><ul><li><a href="#i-6"><span class="toc_number toc_depth_3">2.2.1</span> &#x6709;&#x6548;&#x671F;</a></li><li><a href="#i-7"><span class="toc_number toc_depth_3">2.2.2</span> &#x9000;&#x6B3E;&#x9000;&#x5238;&#x95EE;&#x9898;&#xFF1A;&#x9000;&#x539F;&#x5238;&#x8FD8;&#x662F;&#x53D1;&#x65B0;&#x5238;</a></li><li><a href="#i-8"><span class="toc_number toc_depth_3">2.2.3</span> &#x9000;&#x6B3E;&#x9000;&#x5238;&#x95EE;&#x9898;&#xFF1A;&#x90E8;&#x5206;&#x9000;&#x6B3E;</a></li><li><a href="#i-9"><span class="toc_number toc_depth_3">2.2.4</span> &#x5783;&#x573E;&#x6570;&#x636E;&#x6E05;&#x7406;</a></li></ul></li><li><a href="#i-10"><span class="toc_number toc_depth_2">2.3</span> &#x63A5;&#x53E3;&#x5B9A;&#x4E49;</a></li></ul></li><li><a href="#i-11"><span class="toc_number toc_depth_1">3</span> &#x8FDB;&#x9636;&#x4E00;&#xFF1A;&#x4F7F;&#x7528;&#x8303;&#x56F4;&#x4E0E;&#x53D1;&#x653E;&#x8303;&#x56F4;</a><ul><li><a href="#coupon_use_range"><span class="toc_number toc_depth_2">3.1</span> &#x62BD;&#x8C61;&#x4F7F;&#x7528;&#x8303;&#x56F4;&#x8868;&#xFF1A;coupon_use_range</a></li><li><a href="#i-12"><span class="toc_number toc_depth_2">3.2</span> &#x5206;&#x8868;&#x5EFA;&#x8BAE;</a></li><li><a href="#i-13"><span class="toc_number toc_depth_2">3.3</span> &#x63A5;&#x53E3;&#x5B9A;&#x4E49;</a></li></ul></li><li><a href="#i-14"><span class="toc_number toc_depth_1">4</span> &#x8FDB;&#x9636;&#x4E8C;&#xFF1A;&#x53D1;&#x653E;&#x6E20;&#x9053;</a><ul><li><a href="#issue_channel"><span class="toc_number toc_depth_2">4.1</span> &#x6E20;&#x9053;&#x5B9A;&#x4E49;&#x8868;&#xFF1A;issue_channel</a></li><li><a href="#coupon_issue_channel"><span class="toc_number toc_depth_2">4.2</span> &#x4E2D;&#x95F4;&#x8868;&#xFF1A;coupon_issue_channel</a></li><li><a href="#i-15"><span class="toc_number toc_depth_2">4.3</span> &#x63A5;&#x53E3;&#x8C03;&#x6574;</a></li></ul></li><li><a href="#i-16"><span class="toc_number toc_depth_1">5</span> &#x8FDB;&#x9636;&#x4E09;&#xFF1A;&#x5238;&#x5305;&#x548C;&#x5238;&#x7801;&#x7EBF;&#x4E0B;&#x53D1;&#x653E;</a><ul><li><a href="#coupon_package"><span class="toc_number toc_depth_2">5.1</span> &#x5238;&#x5305;&#x57FA;&#x7840;&#x4FE1;&#x606F;&#xFF1A;coupon_package</a></li><li><a href="#coupon_package_item"><span class="toc_number toc_depth_2">5.2</span> &#x4F18;&#x60E0;&#x5238;&#x5173;&#x8054;&#x8868;&#xFF1A;coupon_package_item</a></li><li><a href="#coupon_package_code"><span class="toc_number toc_depth_2">5.3</span> &#x7EBF;&#x4E0B;&#x53D1;&#x653E;&#x7684;&#x5238;&#x7801;&#x8868;&#xFF1A;coupon_package_code</a></li><li><a href="#i-17"><span class="toc_number toc_depth_2">5.4</span> &#x63A5;&#x53E3;&#x5B9A;&#x4E49;</a></li></ul></li><li><a href="#i-18"><span class="toc_number toc_depth_1">6</span> &#x5EF6;&#x4F38;&#x4E00;&#xFF1A;&#x65E5;&#x5FD7;&#x3001;&#x76D1;&#x63A7;&#x3001;&#x544A;&#x8B66;</a></li></ul></div>
<h2><span id="i">&#x524D;&#x8A00;</span></h2>



<p>&#x8FD9;&#x662F;&#x4E00;&#x9053;&#x9762;&#x8BD5;&#x9898;&#x4E5F;&#x662F;&#x5BF9;&#x8FC7;&#x53BB;&#x4E00;&#x6BB5;&#x65F6;&#x95F4;&#x505A;&#x4F18;&#x60E0;&#x7684;&#x603B;&#x7ED3;&#x3002;&#x8FD9;&#x91CC;&#x53EA;&#x662F;&#x4E00;&#x4E2A;&#x5927;&#x6982;&#x7684;&#x8BBE;&#x8BA1;&#xFF0C;&#x4E00;&#x4E9B;&#x8868;&#x7ED3;&#x6784;&#xFF0C;&#x4E00;&#x4E9B;&#x4F2A;&#x4EE3;&#x7801;&#x3002;&#x6709;&#x4E9B;&#x5B57;&#x6BB5;&#x7684;&#x5927;&#x5C0F;&#x3001;&#x5B57;&#x7B26;&#x96C6;&#x3001;&#x7D22;&#x5F15;&#x3001;&#x5355;&#x8BCD;&#x547D;&#x540D;&#x9700;&#x8981;&#x8FDB;&#x4E00;&#x6B65;&#x7EC6;&#x8C03;&#xFF0C;&#x4F46;&#x4E0D;&#x5F71;&#x54CD;&#x4E3B;&#x4F53;&#x8BBE;&#x8BA1;&#x601D;&#x8DEF;&#xFF0C;&#x8FD9;&#x91CC;&#x5C31;&#x4E0D;&#x7EC6;&#x7A76;&#x4E86;&#x3002;</p>



<h2><span id="i-2">&#x57FA;&#x7840;&#x529F;&#x80FD;&#xFF1A;&#x5EFA;&#x5238;&#x53D1;&#x5238;&#x7528;&#x5238;</span></h2>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="321" height="201" src="https://fyn.pw/wp-content/uploads/2020/03/coupon-db-1-1.png" alt class="wp-image-683" srcset="http://www.dev-f.cn/content/images/wordpress/2020/03/coupon-db-1-1.png 321w, http://www.dev-f.cn/content/images/wordpress/2020/03/coupon-db-1-1-300x188.png 300w" sizes="(max-width: 321px) 100vw, 321px"></figure></div>



<h3><span id="coupon">&#x57FA;&#x7840;&#x4FE1;&#x606F;&#xFF1A;coupon&#x8868;</span></h3>



<p>coupon&#x8868;&#x7528;&#x6765;&#x5B58;&#x50A8;&#x67D0;&#x4E00;&#x79CD;&#x5238;&#x7684;&#x57FA;&#x672C;&#x4FE1;&#x606F;&#xFF0C;&#x4E0E;&#x7528;&#x6237;&#x65E0;&#x5173;&#x3002;</p>



<pre class="wp-block-code"><code lang="sql" class="language-sql">CREATE TABLE `coupon` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT &apos;&#x81EA;&#x589E;&#x4E3B;&#x952E;&apos;,
  `sn` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT &apos;&#x4F18;&#x60E0;&#x5238;&#x552F;&#x4E00;&#x6807;&#x793A;&#xFF0C;&#x5BF9;&#x5916;&#x7684;&#x53D1;&#x653E;&#x63A5;&#x53E3;&#x4E2D;&#x5E94;&#x5C3D;&#x91CF;&#x7528;&#x8FD9;&#x4E2A;&apos;,
  `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT &apos;&#x4F18;&#x60E0;&#x5238;&#x540D;&#x79F0;&apos;,
  `status` tinyint(4) NOT NULL DEFAULT &apos;0&apos; COMMENT &apos;&#x72B6;&#x6001;&#xFF1A;&#x53EF;&#x7528;1&#xFF0C;&#x505C;&#x7528;2&#xFF0C;&#x4F5C;&#x5E9F;3&#xFF0C;&#x7B49;&#x7B49;&apos;,
  `issue_begin_time` datetime NOT NULL COMMENT &apos;&#x53D1;&#x653E;&#x5F00;&#x59CB;&#x65F6;&#x95F4;&apos;,
  `issue_end_time` datetime NOT NULL COMMENT &apos;&#x53D1;&#x653E;&#x7ED3;&#x675F;&#x65F6;&#x95F4;&apos;,
  `expiry_type` tinyint(1) NOT NULL DEFAULT &apos;0&apos; COMMENT &apos;&#x8FC7;&#x671F;&#x7C7B;&#x578B;&#xFF1A;1&#x7EDD;&#x5BF9;&#x8FC7;&#x671F;&#x65F6;&#x95F4;&#xFF0C;2&#x76F8;&#x5BF9;&#x8FC7;&#x671F;&#x65F6;&#x95F4;&apos;,
  `absolute_begin_time` datetime DEFAULT NULL COMMENT &apos;&#x5982;&#x679C;&#x662F;&#x7EDD;&#x5BF9;&#x8FC7;&#x671F;&#x65F6;&#x95F4;&#xFF0C;&#x5238;&#x7684;&#x6709;&#x6548;&#x671F;&#x5F00;&#x59CB;&#x65F6;&#x95F4;&apos;,
  `absolute_end_time` datetime DEFAULT NULL COMMENT &apos;&#x5982;&#x679C;&#x662F;&#x7EDD;&#x5BF9;&#x8FC7;&#x671F;&#x65F6;&#x95F4;&#xFF0C;&#x5238;&#x7684;&#x6709;&#x6548;&#x671F;&#x7ED3;&#x675F;&#x65F6;&#x95F4;&apos;,
  `relative_begin_days` int(1) DEFAULT NULL COMMENT &apos;&#x5982;&#x679C;&#x662F;&#x76F8;&#x5BF9;&#x8FC7;&#x671F;&#x65F6;&#x95F4;&#xFF0C;&#x9886;&#x53D6;&#x540E;&#x591A;&#x5C11;&#x5929;&#x540E;&#x751F;&#x6548;&apos;,
  `relative_end_days` int(1) DEFAULT NULL COMMENT &apos;&#x5982;&#x679C;&#x662F;&#x76F8;&#x5BF9;&#x8FC7;&#x671F;&#x65F6;&#x95F4;&#xFF0C;&#x751F;&#x6548;&#x540E;&#x591A;&#x5C11;&#x5929;&#x8FC7;&#x671F;&apos;,
  `discount_type` tinyint(1) NOT NULL DEFAULT &apos;0&apos; COMMENT &apos;&#x4F18;&#x60E0;&#x5F62;&#x5F0F;&#xFF1A;1&#x6EE1;&#x51CF;&#xFF0C;2&#x6BCF;&#x6EE1;&#x51CF;&#xFF0C;3&#x6298;&#x6263;&#x5238;&#xFF0C;4&#x9636;&#x68AF;&#x5238;&apos;,
  `discount_value` decimal(10,2) NOT NULL COMMENT &apos;&#x4F18;&#x60E0;&#x529B;&#x5EA6;&#xFF0C;&#x6EE1;&#x51CF;&#x5238;&#x5B58;&#x591A;&#x5C11;&#x5143;&#xFF0C;&#x6298;&#x6263;&#x5238;&#x5B58;&#x51CF;&#x767E;&#x5206;&#x4E4B;&#x591A;&#x5C11;&#xFF08;0.00-1.00&#xFF09;&apos;,
  `threshold_price` decimal(10,2) DEFAULT NULL COMMENT &apos;&#x4F7F;&#x7528;&#x95E8;&#x69DB;&#xFF08;&#x6EE1;&#x591A;&#x5C11;&#x5143;&#xFF0C;&#x6839;&#x636E;&#x516C;&#x53F8;&#x89C4;&#x8303;&#x53EF;&#x6539;&#x6210;int&#xFF0C;&#x6EE1;&#x591A;&#x5C11;&#x5206;&#xFF09;&apos;,
  `ext_params` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT &apos;&#x5982;&#x679C;&#x6709;&#x9636;&#x68AF;&#x5238;&#xFF0C;&#x53EF;&#x5B58;&#x5176;&#x4F59;&#x9636;&#x68AF;&#x95E8;&#x69DB;&#x548C;&#x529B;&#x5EA6;&#xFF0C;&#x5982;&#x679C;&#x6709;&#x6298;&#x6263;&#x5238;&#x53EF;&#x5B58;&#x6700;&#x9AD8;&#x51CF;&#x591A;&#x5C11;&apos;,
  `coupon_type` tinyint(1) NOT NULL COMMENT &apos;&#x4F18;&#x60E0;&#x5238;&#x7C7B;&#x522B;&#xFF1A;1&#x666E;&#x901A;&#x5238;&#xFF0C;2&#x8FD0;&#x8D39;&#x5238;&apos;,
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT &apos;&#x521B;&#x5EFA;&#x65F6;&#x95F4;&apos;,
  `total_num` int(11) NOT NULL COMMENT &apos;&#x4F18;&#x60E0;&#x5238;&#x603B;&#x91CF;&apos;,
  `issued_num` int(11) NOT NULL COMMENT &apos;&#x53D1;&#x653E;&#x6570;&#x91CF;&apos;,
  `user_limit` int(11) NOT NULL DEFAULT &apos;1&apos; COMMENT &apos;&#x5355;&#x7528;&#x6237;&#x6700;&#x591A;&#x9886;&#x591A;&#x5C11;&#x5F20;&apos;,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`),
  UNIQUE KEY `ux_sn` (`sn`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;</code></pre>



<h4><span id="i-3">&#x8FC7;&#x671F;&#x7C7B;&#x578B;&#x4E0E;&#x8FC7;&#x671F;&#x65F6;&#x95F4;</span></h4>



<p>&#x4F18;&#x60E0;&#x5238;&#x4E00;&#x822C;&#x4F1A;&#x5206;&#x4E3A;&#x7EDD;&#x5BF9;&#x6709;&#x6548;&#x671F;&#x548C;&#x76F8;&#x5BF9;&#x6709;&#x6548;&#x671F;&#x3002;<br>&#x6BD4;&#x5982;&#x641E;&#x4E00;&#x6B21;&#x5927;&#x4FC3;&#x6D3B;&#x52A8;&#xFF0C;&#x53EA;&#x5141;&#x8BB8;11&#x6708;11&#x65E5;&#x81F3;11&#x6708;15&#x65E5;&#x4F7F;&#x7528;&#x7684;&#x5C31;&#x662F;&#x7EDD;&#x5BF9;&#x6709;&#x6548;&#x671F;&#x3002;<br>&#x800C;&#x65B0;&#x7528;&#x6237;&#x6CE8;&#x518C;&#x9001;&#x7684;&#x65B0;&#x4EBA;&#x5238;&#xFF0C;&#x6CE8;&#x518C;&#x6210;&#x529F;&#x540E;7&#x5929;&#x5185;&#x6709;&#x6548;&#x5C31;&#x662F;&#x76F8;&#x5BF9;&#x6709;&#x6548;&#x671F;&#x3002;</p>



<ul><li>&#x901A;&#x8FC7;<code>expiry_type</code>&#x5B57;&#x6BB5;&#x6765;&#x533A;&#x5206;&#x662F;&#x54EA;&#x79CD;&#x6709;&#x6548;&#x671F;</li><li>&#x5982;&#x679C;&#x662F;&#x7EDD;&#x5BF9;&#x6709;&#x6548;&#x671F;&#x4F7F;&#x7528;<code>absolute_begin_time</code>,<code>absolute_end_time</code>&#x4E24;&#x4E2A;&#x5B57;&#x6BB5;&#x6765;&#x786E;&#x5B9A;&#x4E00;&#x4E2A;&#x51C6;&#x5238;&#x7684;&#x65F6;&#x95F4;&#x6BB5;&#x3002;</li><li>&#x5982;&#x679C;&#x662F;&#x76F8;&#x5BF9;&#x6709;&#x6548;&#x671F;&#x4F7F;&#x7528;<code>relative_begin_days</code>,<code>relative_end_days</code>&#x4E24;&#x4E2A;&#x5B57;&#x6BB5;&#x786E;&#x5B9A;&#xFF0C;&#x9886;&#x53D6;&#x540E;&#x7B2C;&#x51E0;&#x5929;&#x751F;&#x6548;&#x4EE5;&#x53CA;&#x751F;&#x6548;&#x540E;&#x591A;&#x5C11;&#x5929;&#x8FC7;&#x671F;&#xFF08;&#x4E00;&#x822C;&#x60C5;&#x51B5;&#x4E0B;&#x662F;&#x9886;&#x53D6;&#x540E;&#x7ACB;&#x5373;&#x751F;&#x6548;&#xFF0C;&#x4F46;&#x4E5F;&#x6709;&#x4E9B;&#x62C9;&#x590D;&#x8D2D;&#x7684;&#x5238;&#x4F1A;&#x8981;&#x6C42;&#x8FC7;&#x51E0;&#x5929;&#x540E;&#x624D;&#x80FD;&#x4F7F;&#x7528;&#xFF09;&#x3002;</li></ul>



<p>&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;&#x4E00;&#x822C;&#x76F8;&#x5BF9;&#x6709;&#x6548;&#x671F;&#x7684;&#x5238;&#x90FD;&#x662F;&#x4EE5;&#x67D0;&#x4E00;&#x65E5;23:59:59&#x4E3A;&#x7ED3;&#x675F;&#x65F6;&#x95F4;&#xFF0C;&#x524D;&#x53F0;&#x4E00;&#x822C;&#x4E5F;&#x4E0D;&#x4F1A;&#x663E;&#x793A;&#x8FC7;&#x671F;&#x7684;&#x65F6;&#x5206;&#x79D2;&#xFF0C;&#x6240;&#x4EE5;&#x5982;&#x679C;&#x662F;&#x7ACB;&#x5373;&#x751F;&#x6548;&#xFF0C;&#x9886;&#x53D6;&#x5F53;&#x5929;&#x4E00;&#x822C;&#x4E0D;&#x80FD;&#x7B97;1&#x5929;&#xFF0C;&#x7B97;&#x662F;&#x9001;&#x7ED9;&#x7528;&#x6237;&#x7684;&#x798F;&#x5229;&#x3002;</p>



<p>&#x53E6;&#x5916;&#x5728;&#x4F18;&#x60E0;&#x5238;&#x7CFB;&#x7EDF;&#x4E2D;&#x53D1;&#x653E;&#x65F6;&#x95F4;&#x548C;&#x4F7F;&#x7528;&#x65F6;&#x95F4;&#x662F;&#x4E24;&#x4E2A;&#x6982;&#x5FF5;&#xFF0C;&#x5373;&#x4F7F;&#x662F;&#x7EDD;&#x5BF9;&#x6709;&#x6548;&#x671F;&#x3002;&#x56E0;&#x4E3A;&#x5927;&#x4FC3;&#x4E4B;&#x7C7B;&#x7684;&#x5238;&#x662F;&#x6709;&#x53EF;&#x80FD;&#x63D0;&#x524D;&#x53D1;&#x7684;&#x3002;</p>



<h4><span id="i-4">&#x4F18;&#x60E0;&#x7C7B;&#x578B;&#x4E0E;&#x4F18;&#x60E0;&#x53C2;&#x6570;</span></h4>



<p>&#x4F18;&#x60E0;&#x5238;&#x53EF;&#x80FD;&#x4F1A;&#x6709;&#x591A;&#x79CD;&#x4F18;&#x60E0;&#x5F62;&#x5F0F;&#xFF0C;&#x6BD4;&#x5982;&#x6EE1;&#x51CF;&#x3001;&#x6BCF;&#x6EE1;&#x51CF;&#x3001;&#x6298;&#x6263;&#x5238;&#x3001;&#x9636;&#x68AF;&#x5238;&#x7B49;&#x7B49;&#xFF0C;&#x56E0;&#x6B64;&#x6211;&#x4EEC;&#x901A;&#x8FC7;<code>discount_type</code>,<code>discount_value</code>,<code>threshold_price</code>&#x5BF9;&#x4F18;&#x60E0;&#x7684;&#x529B;&#x5EA6;&#x4E0E;&#x91D1;&#x989D;&#x8FDB;&#x884C;&#x4E00;&#x6B21;&#x62BD;&#x8C61;&#xFF0C;&#x5E76;&#x7528;<code>ext_params</code>&#x505A;&#x4E00;&#x4E9B;&#x5DEE;&#x5F02;&#x5316;&#x7684;&#x53C2;&#x6570;&#x5B58;&#x50A8;&#x3002;</p>



<ul><li>&#x901A;&#x8FC7;<code>discount_type</code>&#x6765;&#x533A;&#x5206;&#x662F;&#x54EA;&#x79CD;&#x4F18;&#x60E0;&#x5F62;&#x5F0F;</li><li><code>discount_value</code>&#x7528;&#x6765;&#x8868;&#x793A;&#x51CF;&#x4EF7;&#x7684;&#x529B;&#x5EA6;&#xFF0C;&#x6BD4;&#x5982;&#x6EE1;&#x51CF;&#x548C;&#x6BCF;&#x6EE1;&#x51CF;&#x7528;&#x6765;&#x8868;&#x793A;&#x591A;&#x5C11;&#x5143;&#x94B1;&#xFF0C;&#x6298;&#x6263;&#x5238;&#x7528;&#x6765;&#x8868;&#x793A;&#x51CF;&#x767E;&#x5206;&#x4E4B;&#x591A;&#x5C11;&#xFF08;&#x4E2A;&#x4EBA;&#x5EFA;&#x8BAE;8.8&#x6298;&#x7684;&#x65F6;&#x5019;&#x5B58;0.12&#x800C;&#x4E0D;&#x662F;8.8&#xFF0C;&#x8FD9;&#x6837;&#x5728;&#x8BA1;&#x7B97;&#x8BA2;&#x5355;&#x91D1;&#x989D;&#x7684;&#x65F6;&#x5019;&#x4E0D;&#x4F1A;&#x51FA;&#x73B0;&#x52A0;&#x51CF;&#x53F7;&#x4E0D;&#x4E00;&#x81F4;&#x7684;&#x95EE;&#x9898;&#xFF09;&#xFF0C;&#x800C;&#x9636;&#x68AF;&#x5238;&#x53EF;&#x4EE5;&#x8003;&#x8651;&#x5B58;&#x6700;&#x9AD8;&#x9636;&#x68AF;&#x7684;&#x51CF;&#x4EF7;&#x91D1;&#x989D;&#xFF08;&#x770B;&#x4E0A;&#x53BB;&#x6548;&#x679C;&#x597D;&#x4E00;&#x4E9B;&#xFF09;&#x3002;</li><li><code>threshold_price</code>&#x7528;&#x6765;&#x8868;&#x793A;&#x6700;&#x4F4E;&#x591A;&#x5C11;&#x5143;&#x53EF;&#x7528;&#x3002;</li><li>&#x4E0D;&#x540C;&#x5F62;&#x5F0F;&#x7684;&#x4F18;&#x60E0;&#x5238;&#x6709;&#x53EF;&#x80FD;&#x6709;&#x81EA;&#x5DF1;&#x7279;&#x5B9A;&#x7684;&#x53C2;&#x6570;&#xFF0C;&#x8FD9;&#x65F6;&#x53EF;&#x4EE5;&#x7528;<code>ext_params</code>&#x53C2;&#x6570;&#x6765;&#x5B58;&#x50A8;&#xFF0C;&#x6BD4;&#x5982;&#x6298;&#x6263;&#x5238;&#x4E00;&#x822C;&#x4F1A;&#x6709;&#x6700;&#x9AD8;&#x4E0A;&#x9650;&#xFF0C;&#x6BD4;&#x5982;96&#x6298;&#x6700;&#x9AD8;&#x51CF;50&#x5143;&#xFF0C;&#x800C;&#x9636;&#x68AF;&#x5238;&#x6709;&#x53EF;&#x80FD;&#x6709;&#x6EE1;300&#x51CF;50&#x6EE1;500&#x51CF;100&#x8FD9;&#x79CD;&#x591A;&#x6BB5;&#x89C4;&#x5219;&#xFF0C;&#x90FD;&#x53EF;&#x4EE5;&#x4EE5;&#x4E00;&#x4E2A;&#x81EA;&#x5B9A;&#x4E49;&#x7684;&#x683C;&#x5F0F;&#x5B58;&#x5230;&#x8FD9;&#x4E2A;&#x5B57;&#x6BB5;&#x91CC;&#x3002;</li></ul>



<h4><span id="i-5">&#x603B;&#x6570;&#x91CF;&#x4E0E;&#x53D1;&#x653E;&#x6570;&#x91CF;</span></h4>



<p>&#x5728;&#x53D1;&#x653E;&#x4F18;&#x60E0;&#x5238;&#x65F6;&#x5E94;&#x5148;&#x66F4;&#x65B0;&#x53D1;&#x653E;&#x6570;&#x91CF;&#xFF0C;&#x5E76;&#x4E14;&#x5728;&#x67E5;&#x8BE2;&#x6761;&#x4EF6;&#x4E2D;&#x52A0;&#x4E50;&#x89C2;&#x9501;&#x3002;&#x6BD4;&#x5982;&#xFF1A;<code>UPDATE coupon SET issued_num = issued_num + 1 WHERE id = ? AND issued_num &lt; total_num;</code>&#xFF0C;&#x8FD9;&#x6837;&#x53EF;&#x4EE5;&#x786E;&#x4FDD;&#x5238;&#x4E0D;&#x8D85;&#x53D1;&#x3002;</p>



<p>&#x4E4B;&#x6240;&#x4EE5;&#x4F7F;&#x7528;issue_num+total_num&#x800C;&#x4E0D;&#x662F;remain_num+total_num&#x662F;&#x56E0;&#x4E3A;&#x5F53;&#x67D0;&#x4E00;&#x79CD;&#x5238;&#x5FEB;&#x8981;&#x53D1;&#x5B8C;&#x65F6;&#xFF0C;&#x6211;&#x4EEC;&#x60F3;&#x53BB;&#x518D;&#x589E;&#x52A0;&#x70B9;&#x513F;&#x91CF;&#x7684;&#x65F6;&#x5019;&#x53EA;&#x9700;&#x8981;&#x6539;total_num&#x8FD9;&#x4E00;&#x4E2A;&#x5B57;&#x6BB5;&#x5C31;&#x53EF;&#x4EE5;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x8981;&#x540C;&#x65F6;&#x6539;remain&#x548C;total&#x4E24;&#x4E2A;&#x5B57;&#x6BB5;&#x3002;</p>



<p>&#x5982;&#x679C;&#x62C5;&#x5FC3;&#x53D1;&#x653E;&#x6570;&#x91CF;&#x4F1A;&#x9891;&#x7E41;&#x66F4;&#x65B0;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x8003;&#x8651;&#x5C06;&#x8FD9;&#x4E24;&#x4E2A;&#x5B57;&#x6BB5;&#x5355;&#x72EC;&#x62C6;&#x6210;&#x4E00;&#x4E2A;&#x8BA1;&#x6570;&#x5668;&#x8868;&#xFF0C;&#x8FD9;&#x6837;coupon&#x8868;&#x7684;&#x5185;&#x5BB9;&#x5C31;&#x57FA;&#x672C;&#x4E0D;&#x4F1A;&#x53D1;&#x751F;&#x9891;&#x7E41;&#x53D8;&#x66F4;&#x4E86;&#x3002;</p>



<h4><span id="SN">SN&#x7684;&#x4F5C;&#x7528;&#xFF1A;&#x5B89;&#x5168;&#x65E0;&#x5C0F;&#x4E8B;</span></h4>



<p>sn&#x662F;&#x4E2A;&#x552F;&#x4E00;&#x952E;&#x6BCF;&#x79CD;&#x5238;&#x7684;sn&#x90FD;&#x4E0D;&#x4E00;&#x6837;&#xFF0C;SN&#x662F;&#x4E00;&#x4E32;<strong>&#x5B8C;&#x5168;&#x968F;&#x673A;</strong>&#x7684;&#x5B57;&#x7B26;&#x4E32;&#x7EC4;&#x6210;&#xFF0C;&#x5343;&#x4E07;&#x4E0D;&#x8981;&#x7528;&#x52A0;&#x5BC6;&#x7B97;&#x6CD5;&#x548C;&#x6458;&#x8981;&#x7B97;&#x6CD5;&#x6765;&#x751F;&#x6210;&#x3002;</p>



<p>&#x6211;&#x4EEC;&#x63D0;&#x4F9B;&#x7ED9;&#x5916;&#x90E8;&#x7684;&#x63A5;&#x53E3;&#x5E94;&#x8BE5;&#x8BA9;&#x522B;&#x4EBA;&#x4F20;sn&#x8FDB;&#x6765;&#x800C;&#x4E0D;&#x662F;id&#x3002;</p>



<p>&#x4F7F;&#x7528;SN&#x4E0D;&#x4F7F;&#x7528;ID&#x662F;&#x56E0;&#x4E3A;ID&#x662F;&#x81EA;&#x589E;&#x7684;&#xFF0C;&#x800C;SN&#x662F;&#x968F;&#x673A;&#x7684;&#xFF0C;&#x6211;&#x4EEC;&#x63D0;&#x4F9B;&#x4F18;&#x60E0;&#x5238;&#x8FD9;&#x79CD;&#x57FA;&#x7840;&#x670D;&#x52A1;&#x65F6;&#x53EF;&#x80FD;&#x65E0;&#x6CD5;&#x638C;&#x63A7;&#x5BF9;&#x63A5;&#x65B9;&#x5982;&#x4F55;&#x4F7F;&#x7528;&#xFF0C;&#x6709;&#x53EF;&#x80FD;&#x6709;&#x4EBA;&#x641E;&#x4E2A;&#x9875;&#x9762;&#x6216;&#x8BF7;&#x6C42;<code>/activity/getCoupon.php?couponId=456</code>&#x6765;&#x8BA9;&#x7528;&#x6237;&#x9886;&#x53D6;&#x4F18;&#x60E0;&#x5238;&#xFF0C;&#x5982;&#x679C;&#x88AB;&#x8585;&#x7F8A;&#x6BDB;&#x7684;&#x53D1;&#x73B0;&#x8FD9;&#x79CD;&#x9875;&#x9762;&#xFF0C;&#x4ED6;&#x4EEC;&#x5C31;&#x53EF;&#x4EE5;&#x4ECE;1&#x4E00;&#x76F4;&#x904D;&#x5386;&#x8BD5;&#x5230;N&#x628A;&#x4F60;&#x6240;&#x6709;&#x80FD;&#x9886;&#x7684;&#x5238;&#x90FD;&#x9886;&#x4E86;&#xFF0C;&#x6709;&#x7684;&#x5238;&#x751A;&#x81F3;&#x662F;&#x975E;&#x516C;&#x5F00;&#x7684;&#x5927;&#x989D;&#x5238;&#x6216;&#x5176;&#x5B83;&#x6D3B;&#x52A8;&#x62BD;&#x5956;&#x7684;&#x5238;&#xFF0C;&#x8FD9;&#x6837;&#x5C31;&#x6709;&#x53EF;&#x80FD;&#x4F1A;&#x4EA7;&#x751F;&#x8D44;&#x635F;&#xFF0C;&#x800C;SN&#x662F;&#x5B8C;&#x5168;&#x968F;&#x673A;&#x5373;&#x4F7F;&#x6709;&#x4EBA;&#x5199;&#x4E86;&#x4E2A;<code>/activity/getCoupon.php?couponSN=aXdj91h</code>&#x4E5F;&#x96BE;&#x4EE5;&#x88AB;&#x904D;&#x5386;&#x3002;</p>



<p>&#x5F53;&#x7136;&#x6700;&#x597D;&#x662F;&#x80FD;&#x63A8;&#x8FDB;&#x4E1A;&#x52A1;&#x65B9;&#x8FDE;SN&#x90FD;&#x4E0D;&#x8981;&#x66B4;&#x9732;&#x7ED9;&#x524D;&#x7AEF;&#xFF0C;&#x53EF;&#x4EE5;&#x6539;&#x9020;&#x4E3A;<code>/activity/getCoupon.php?activityId=12345</code>&#x4E4B;&#x7C7B;&#x7684;&#x3002;</p>



<h3><span id="user_coupon">&#x7528;&#x6237;&#x9886;&#x5230;&#x7684;&#x5238;&#xFF1A;user_coupon&#x8868;</span></h3>



<p>user_coupon&#x8868;&#x662F;&#x7528;&#x6237;&#x9886;&#x5230;&#x7684;&#x5238;&#xFF0C;&#x7528;&#x6237;&#x6BCF;&#x9886;&#x4E00;&#x5F20;&#x5238;&#xFF0C;&#x8FD9;&#x4E2A;&#x8868;&#x4E2D;&#x5C31;&#x4F1A;&#x589E;&#x52A0;&#x4E00;&#x6761;&#x6570;&#x636E;&#xFF08;&#x540C;&#x4E00;&#x79CD;&#x4F18;&#x60E0;&#x5238;&#x6709;&#x53EF;&#x80FD;&#x9886;&#x53D6;&#x4E24;&#x5F20;&#xFF0C;&#x6240;&#x4EE5;uid&#x548C;coupon_id&#x6CA1;&#x6709;&#x52A0;&#x552F;&#x4E00;&#x7D22;&#x5F15;&#xFF09;</p>



<pre class="wp-block-code"><code lang="sql" class="language-sql">CREATE TABLE `user_coupon` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT &apos;&#x81EA;&#x589E;ID&apos;,
  `uid` bigint(20) unsigned NOT NULL COMMENT &apos;&#x7528;&#x6237;ID&apos;,
  `coupon_id` bigint(20) unsigned NOT NULL COMMENT &apos;&#x5238;ID&apos;,
  `issued_time` datetime NOT NULL COMMENT &apos;&#x53D1;&#x653E;&#x65F6;&#x95F4;/&#x9886;&#x53D6;&#x65F6;&#x95F4;&apos;,
  `effective_time` datetime NOT NULL COMMENT &apos;&#x751F;&#x6548;&#x65F6;&#x95F4;&#xFF0C;&#x65E0;&#x8BBA;&#x662F;&#x76F8;&#x5BF9;&#x8FD8;&#x662F;&#x7EDD;&#x5BF9;&#x6709;&#x6548;&#x671F;&#xFF0C;&#x90FD;&#x80FD;&#x5728;&#x9886;&#x53D6;&#x65F6;&#x786E;&#x5B9A;&#x751F;&#x6548;&#x65F6;&#x95F4;&apos;,
  `expiry_time` datetime NOT NULL COMMENT &apos;&#x8FC7;&#x671F;&#x65F6;&#x95F4;&#xFF0C;&#x65E0;&#x8BBA;&#x662F;&#x76F8;&#x5BF9;&#x8FD8;&#x662F;&#x7EDD;&#x5BF9;&#x6709;&#x6548;&#x671F;&#xFF0C;&#x90FD;&#x80FD;&#x5728;&#x9886;&#x53D6;&#x65F6;&#x786E;&#x5B9A;&#x8FC7;&#x671F;&#x65F6;&#x95F4;&apos;,
  `status` tinyint(1) NOT NULL DEFAULT &apos;0&apos; COMMENT &apos;&#x72B6;&#x6001;&#xFF1A;1&#x672A;&#x4F7F;&#x7528;&#xFF0C;2&#x5DF2;&#x4F7F;&#x7528;&#xFF0C;3&#x5DF2;&#x9000;&#x6B3E;&#xFF0C;4&#x8FC7;&#x671F;&#xFF0C;5&#x4F5C;&#x5E9F;&apos;,
  `used_order_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT &apos;&#x8BA2;&#x5355;&#x53F7;&#xFF0C;&#x6570;&#x636E;&#x7C7B;&#x578B;&#x8981;&#x53C2;&#x8003;&#x8BA2;&#x5355;&#x7CFB;&#x7EDF;&apos;,
  `used_time` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT &apos;&#x4F7F;&#x7528;&#x65F6;&#x95F4;&#xFF08;&#x5373;&#x4E0B;&#x5355;&#x65F6;&#x95F4;&#xFF09;&apos;,
  `refund_from` bigint(20) unsigned NOT NULL DEFAULT &apos;0&apos; COMMENT &apos;&#x5982;&#x679C;&#x53D1;&#x751F;&#x9000;&#x6B3E;&#x4E14;&#x9000;&#x5238;&#xFF0C;&#x8BB0;&#x5F55;&#x672C;&#x5238;&#x662F;&#x56E0;&#x4E3A;&#x9000;&#x90A3;&#x5F20;&#x5238;&#x800C;&#x751F;&#x6210;&#x7684;&#x65B0;&#x5238;&apos;,
  `issue_channel_id` bigint(20) unsigned NOT NULL DEFAULT &apos;0&apos; COMMENT &apos;&#x53D1;&#x653E;&#x6E20;&#x9053;ID&#xFF0C;&#x6838;&#x7B97;&#x90E8;&#x95E8;&#x6210;&#x672C;&#x7684;&#x56E0;&#x7D20;&#x4E4B;&#x4E00;&apos;,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`),
  KEY `ix_coupon_id` (`coupon_id`) USING BTREE,
  KEY `ix_uid_status` (`uid`,`status`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;</code></pre>



<h4><span id="i-6">&#x6709;&#x6548;&#x671F;</span></h4>



<p>&#x65E0;&#x8BBA;&#x662F;&#x7EDD;&#x5BF9;&#x6709;&#x6548;&#x671F;&#x8FD8;&#x662F;&#x76F8;&#x5BF9;&#x6709;&#x6548;&#x671F;&#xFF0C;&#x5728;&#x7528;&#x6237;&#x9886;&#x5238;&#x7684;&#x65F6;&#x5019;&#x90FD;&#x80FD;&#x786E;&#x5B9A;&#x4E0B;&#x6765;&#x5F53;&#x524D;&#x7528;&#x6237;&#x7684;&#x8FD9;&#x5F20;&#x5238;&#x6709;&#x6548;&#x671F;&#x7684;&#x5F00;&#x59CB;&#x65F6;&#x95F4;<code>effective_time</code>&#x548C;&#x8FC7;&#x671F;&#x65F6;&#x95F4;<code>expiry_time</code>&#xFF0C;&#x867D;&#x7136;&#x901A;&#x8FC7;coupon&#x8868;&#x7684;&#x5B57;&#x6BB5;&#x52A0;&#x4E0A;&#x8FD9;&#x4E2A;&#x8868;&#x7684;&#x53D1;&#x653E;&#x65F6;&#x95F4;&#x80FD;&#x52A8;&#x6001;&#x7684;&#x8BA1;&#x7B97;&#x51FA;&#x6765;&#x6709;&#x6548;&#x671F;&#xFF0C;&#x597D;&#x50CF;&#x53EF;&#x4EE5;&#x53BB;&#x6389;&#x8FD9;&#x4E24;&#x4E2A;&#x5B57;&#x6BB5;&#xFF0C;&#x4F46;&#x662F;&#x5C06;&#x4ED6;&#x4EEC;&#x5197;&#x4F59;&#x4E0B;&#x6765;&#xFF0C;&#x53EF;&#x4EE5;&#x964D;&#x4F4E;&#x7A0B;&#x5E8F;&#x590D;&#x6742;&#x8BFB;&#x5E76;&#x52A0;&#x5FEB;&#x540E;&#x7EED;&#x7684;&#x4E00;&#x4E9B;&#x64CD;&#x4F5C;&#x901F;&#x5EA6;&#xFF0C;&#x800C;&#x4E14;&#x6839;&#x636E;&#x4EE5;&#x5F80;&#x7684;&#x7ECF;&#x9A8C;coupon&#x8868;&#x4E2D;&#x7684;&#x6709;&#x6548;&#x671F;&#x662F;&#x6709;&#x5C0F;&#x6982;&#x7387;&#x4F1A;&#x53D1;&#x751F;&#x8C03;&#x6574;&#x7684;&#xFF0C;&#x8FD9;&#x65F6;&#x6211;&#x4EEC;&#x539F;&#x5219;&#x662F;&#x53EA;&#x80FD;&#x5F71;&#x54CD;&#x65B0;&#x9886;&#x7684;&#x5238;&#x800C;&#x4E0D;&#x80FD;&#x5F71;&#x54CD;&#x5DF2;&#x7ECF;&#x5230;&#x7528;&#x6237;&#x624B;&#x4E0A;&#x7684;&#x5238;&#xFF0C;&#x6240;&#x4EE5;&#x591A;&#x5B58;&#x4E24;&#x4E2A;&#x5B57;&#x6BB5;&#x8FD8;&#x662F;&#x5229;&#x5927;&#x4E8E;&#x5F0A;&#x7684;&#x3002;</p>



<h4><span id="i-7">&#x9000;&#x6B3E;&#x9000;&#x5238;&#x95EE;&#x9898;&#xFF1A;&#x9000;&#x539F;&#x5238;&#x8FD8;&#x662F;&#x53D1;&#x65B0;&#x5238;</span></h4>



<p>&#x5F53;&#x8BA2;&#x5355;&#x672A;&#x652F;&#x4ED8;&#x53D6;&#x6D88;&#x652F;&#x4ED8;&#x4E86;&#xFF0C;&#x6216;&#x8005;&#x652F;&#x4ED8;&#x6210;&#x529F;&#x53BB;&#x9000;&#x6B3E;&#x4E86;&#xFF0C;&#x8FD9;&#x65F6;&#x6211;&#x4EEC;&#x5E94;&#x5F53;&#x5C06;&#x5238;&#x9000;&#x8FD8;&#x7ED9;&#x7528;&#x6237;&#xFF0C;&#x8BA9;&#x7528;&#x6237;&#x53EF;&#x4EE5;&#x7EE7;&#x7EED;&#x4F7F;&#x7528;&#x8FD9;&#x5F20;&#x5238;&#x3002;&#x8FD9;&#x91CC;&#x4F1A;&#x6709;&#x4E24;&#x79CD;&#x9000;&#x5238;&#x65B9;&#x6848;&#xFF1A;</p>



<ul><li>&#x76F4;&#x63A5;&#x5C06;&#x5238;&#x7684;&#x72B6;&#x6001;&#x6539;&#x4E3A;&#x672A;&#x4F7F;&#x7528;<ul><li>&#x4F18;&#x52BF;&#xFF1A;&#x8DB3;&#x591F;&#x7B80;&#x5355;&#xFF0C;&#x800C;&#x4E14;&#x4E0D;&#x4F1A;&#x4EA7;&#x751F;&#x591A;&#x4F59;&#x6570;&#x636E;</li></ul></li><li>&#x5C06;&#x5238;&#x7684;&#x72B6;&#x6001;&#x6539;&#x4E3A;&#x5DF2;&#x9000;&#xFF0C;&#x540C;&#x65F6;&#x751F;&#x6210;&#x4E00;&#x5F20;&#x65B0;&#x5238;&#x7ED9;&#x7528;&#x6237;<ul><li>&#x4F18;&#x52BF;&#xFF1A;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x786E;&#x4FDD;&#x6BCF;&#x5F20;&#x5238;&#xFF08;&#x6216;&#x8005;&#x8BF4;&#x6BCF;&#x4E2A;id&#xFF09;&#x53EA;&#x4F1A;&#x88AB;&#x7528;&#x5728;&#x4E00;&#x4E2A;&#x8BA2;&#x5355;&#x4E0A;&#xFF0C;&#x6570;&#x636E;&#x4E0D;&#x4F1A;&#x88AB;&#x8986;&#x76D6;&#xFF0C;&#x51FA;&#x73B0;&#x95EE;&#x9898;&#x65F6;&#x6709;&#x8FF9;&#x53EF;&#x5FAA;</li></ul></li></ul>



<p>&#x8FD9;&#x4E24;&#x79CD;&#x65B9;&#x6848;&#x5404;&#x6709;&#x5404;&#x7684;&#x4F18;&#x52BF;&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x60C5;&#x51B5;&#x9009;&#x62E9;&#xFF0C;&#x53EF;&#x4EE5;&#x90FD;&#x7528;&#x7B2C;&#x4E00;&#x79CD;&#x6216;&#x90FD;&#x7528;&#x7B2C;&#x4E8C;&#x79CD;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x53D6;&#x6D88;&#x652F;&#x4ED8;&#x7528;&#x7B2C;&#x4E00;&#x79CD;&#x9000;&#x6B3E;&#x7528;&#x7B2C;&#x4E8C;&#x79CD;&#x3002;</p>



<h4><span id="i-8">&#x9000;&#x6B3E;&#x9000;&#x5238;&#x95EE;&#x9898;&#xFF1A;&#x90E8;&#x5206;&#x9000;&#x6B3E;</span></h4>



<p>&#x5F15;&#x7533;&#x4E00;&#x4E2A;&#x8BA2;&#x5355;&#x90E8;&#x5206;&#x9000;&#x6B3E;&#x7684;&#x95EE;&#x9898;&#xFF1A;&#x9000;&#x6B3E;&#x9000;&#x5238;&#x662F;&#x4E00;&#x4E2A;&#x76F8;&#x5BF9;&#x590D;&#x6742;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x56E0;&#x4E3A;&#x6709;&#x53EF;&#x80FD;&#x6709;&#x8D2D;&#x7269;&#x8F66;&#x6216;&#x8005;&#x4E1A;&#x52A1;&#x5F62;&#x6001;&#x7684;&#x9650;&#x5236;&#xFF0C;&#x4F1A;&#x51FA;&#x73B0;&#x90E8;&#x5206;&#x9000;&#x6B3E;&#x7684;&#x95EE;&#x9898;&#x3002;&#x6BD4;&#x5982;&#x6211;&#x4E70;&#x4E86;5&#x4E2A;2&#x5143;&#x7684;&#x672C;&#xFF0C;&#x4E00;&#x5171;10&#x5143;&#xFF0C;&#x7528;&#x4E86;&#x4E00;&#x5F20;&#x6EE1;5&#x5143;&#x51CF;1&#x5143;&#x7684;&#x4F18;&#x60E0;&#x5238;&#xFF0C;&#x6700;&#x7EC8;&#x652F;&#x4ED8;&#x7684;9&#x5143;&#xFF0C;&#x5F53;&#x6211;&#x9000;&#x6389;&#x4E00;&#x4E2A;&#x672C;&#x7684;&#x65F6;&#x5019;&#x5C31;&#x4F1A;&#x51FA;&#x73B0;&#x95EE;&#x9898;&#x3002;</p>



<ul><li>&#x6709;&#x4EBA;&#x8BA4;&#x4E3A;&#x5E94;&#x8BE5;&#x9000;1&#x5143;&#x94B1;&#xFF0C;&#x5E76;&#x4E14;&#x628A;&#x5238;&#x9000;&#x7ED9;&#x7528;&#x6237;</li><li>&#x6709;&#x4EBA;&#x8BA4;&#x4E3A;&#x5E94;&#x8BE5;&#x9000;2&#x5143;&#x94B1;&#xFF0C;&#x4F46;&#x4E0D;&#x9000;&#x5238;&#x7ED9;&#x7528;&#x6237;</li></ul>



<p>&#x8FD9;&#x4E24;&#x79CD;&#x65B9;&#x5F0F;&#x5176;&#x5B9E;&#x90FD;&#x6709;&#x95EE;&#x9898;&#xFF0C;&#x4E00;&#x4E2A;&#x5BB9;&#x6613;&#x9020;&#x6210;&#x7EA0;&#x7EB7;&#xFF0C;&#x4E00;&#x4E2A;&#x5BB9;&#x6613;&#x9020;&#x6210;&#x8585;&#x7F8A;&#x6BDB;&#xFF0C;&#x800C;&#x4E14;&#x5728;&#x4E00;&#x4E9B;&#x6781;&#x7AEF;&#x7684;&#x5927;&#x6298;&#x6263;&#x5238;&#x5904;&#x7406;&#x4E0A;&#x6709;&#x53EF;&#x80FD;&#x51FA;&#x73B0;&#x591A;&#x6B21;&#x9000;&#x6B3E;&#x6700;&#x540E;&#x4E00;&#x6B21;&#x65E0;&#x94B1;&#x53EF;&#x9000;&#x7684;&#x95EE;&#x9898;&#x3002;</p>



<p>&#x6BD4;&#x8F83;&#x597D;&#x7684;&#x65B9;&#x5F0F;&#x662F;&#x6309;&#x6BD4;&#x4F8B;&#x9000;&#xFF0C;&#x65E2;&#x6211;&#x53EA;&#x9000;&#x7ED9;&#x7528;&#x6237;1.8&#x5143;&#xFF0C;&#x56E0;&#x4E3A;1&#x4E2A;&#x672C;&#x539F;&#x4EF7;2&#x5143;&#xFF0C;&#x5360;&#x603B;&#x539F;&#x4EF7;&#x7684;20%&#xFF0C;&#x90A3;&#x4E48;&#x5728;&#x9000;&#x6B3E;&#x65F6;&#x6211;&#x4E5F;&#x81F3;&#x9000;&#x7ED9;&#x7528;&#x6237;&#x652F;&#x4ED8;&#x91D1;&#x989D;&#x7684;20%&#xFF0C;&#x65E2;9*0.2=1.8&#x5143;&#xFF0C;&#x800C;&#x4F18;&#x60E0;&#x5238;&#x6B64;&#x65F6;&#x4E0D;&#x9000;&#x8FD8;&#x7ED9;&#x7528;&#x6237;&#xFF0C;&#x9664;&#x975E;&#x672C;&#x5355;&#x4F7F;&#x7528;&#x4E86;&#x4F18;&#x60E0;&#x5238;&#x7684;&#x6240;&#x6709;&#x5546;&#x54C1;&#x90FD;&#x5168;&#x989D;&#x9000;&#x6B3E;&#x4E86;&#xFF0C;&#x518D;&#x9000;&#x7ED9;&#x7528;&#x6237;&#x4F18;&#x60E0;&#x5238;&#x3002;</p>



<p>&#x518D;&#x5F15;&#x7533;&#x4E00;&#x4E2A;&#x5BF9;&#x8D26;&#x7684;&#x95EE;&#x9898;&#xFF1A;&#x5F53;&#x53D1;&#x751F;&#x90E8;&#x5206;&#x9000;&#x6B3E;&#x65F6;&#xFF0C;&#x6B64;&#x65F6;&#x5728;&#x5BF9;&#x8D26;&#x6216;&#x8D22;&#x52A1;&#x7CFB;&#x7EDF;&#x4E2D;&#x8BB0;&#x5F55;&#x7684;&#x4F18;&#x60E0;&#x5238;&#x65B9;&#x9762;&#x7684;&#x6210;&#x672C;&#x6216;&#x652F;&#x6301;&#x4E5F;&#x5E94;&#x7B49;&#x6BD4;&#x51CF;&#x5C11;&#x3002;</p>



<h4><span id="i-9">&#x5783;&#x573E;&#x6570;&#x636E;&#x6E05;&#x7406;</span></h4>



<p>&#x6709;&#x4E00;&#x4E2A;&#x4E0D;&#x53EF;&#x5426;&#x8BA4;&#x7684;&#x95EE;&#x9898;&#x5C31;&#x662F;&#x53D1;&#x7684;&#x5238;&#x6BD4;&#x771F;&#x6B63;&#x7528;&#x7684;&#x5238;&#x8981;&#x591A;&#xFF0C;&#x800C;&#x4E14;&#x8981;&#x591A;&#x5F88;&#x591A;&#x3002;&#x5F53;&#x4E00;&#x6BB5;&#x65F6;&#x95F4;&#x540E;user_coupon&#x8868;&#x5C31;&#x4F1A;&#x51FA;&#x73B0;&#x5927;&#x91CF;&#x8FC7;&#x671F;&#x4F18;&#x60E0;&#x5238;&#xFF0C;&#x4F1A;&#x76F8;&#x5F53;&#x5360;&#x7528;&#x8868;&#x7A7A;&#x95F4;&#x3002;&#x8FD9;&#x65F6;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x8003;&#x8651;&#x6E05;&#x7406;&#x6570;&#x636E;&#x6216;&#x5206;&#x8868;&#x3002;</p>



<ul><li>&#x6E05;&#x7406;&#x6570;&#x636E;&#xFF1A;&#x8FD9;&#x91CC;&#x6307;&#x7684;&#x5C31;&#x662F;&#x7269;&#x7406;&#x5220;&#x9664;&#x4E86;&#xFF0C;&#x5176;&#x5B9E;&#x7528;&#x6237;&#x4E00;&#x822C;&#x4E0D;&#x4F1A;&#x592A;&#x5173;&#x5FC3;&#x5F88;&#x4E45;&#x4EE5;&#x524D;&#x5C31;&#x8FC7;&#x671F;&#x4E86;&#x7684;&#x4F18;&#x60E0;&#x5238;&#xFF0C;&#x56E0;&#x6B64;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5B9A;&#x671F;&#x5C06;&#x4E09;&#x4E2A;&#x6708;&#x524D;&#x5C31;&#x8FC7;&#x671F;&#x7684;&#x5238;&#x7269;&#x7406;&#x5220;&#x9664;&#x6389;&#x3002;</li><li>&#x5206;&#x8868;&#xFF1A;&#x5982;&#x679C;&#x4E0D;&#x60F3;&#x7269;&#x7406;&#x5220;&#x9664;&#xFF0C;&#x8FD8;&#x53EF;&#x4EE5;&#x8003;&#x8651;&#x5206;&#x8868;&#x3002;&#x5206;&#x8868;&#x5206;&#x4E3A;&#x4E24;&#x79CD;&#xFF0C;&#x4E00;&#x79CD;&#x662F;&#x6309;uid&#x6765;&#x5206;&#x8868;&#xFF0C;&#x8FD9;&#x6837;&#x53EF;&#x4EE5;&#x51CF;&#x5C11;&#x6BCF;&#x5F20;&#x8868;&#x7684;&#x5927;&#x5C0F;&#xFF0C;&#x53E6;&#x4E00;&#x79CD;&#x53EF;&#x4EE5;&#x6839;&#x636E;&#x72B6;&#x6001;&#x6765;&#x5206;&#xFF0C;&#x6BD4;&#x5982;&#x6211;&#x4EEC;&#x628A;&#x672A;&#x8FC7;&#x671F;&#x7684;&#x653E;&#x4E00;&#x5F20;&#x8868;&#x91CC;&#xFF0C;&#x5DF2;&#x8FC7;&#x671F;&#x7684;&#x653E;&#x53E6;&#x4E00;&#x5F20;&#x8868;&#x91CC;&#x751A;&#x81F3;&#x53E6;&#x4E00;&#x4E2A;&#x5E93;&#x91CC;&#xFF0C;&#x5C31;&#x50CF;&#x51B7;&#x70ED;&#x6570;&#x636E;&#x4E00;&#x6837;&#x3002;&#x5F53;&#x7136;&#x4E24;&#x79CD;&#x5206;&#x8868;&#x4E5F;&#x53EF;&#x4EE5;&#x7ED3;&#x5408;&#x4F7F;&#x7528;&#x3002;</li></ul>



<h3><span id="i-10">&#x63A5;&#x53E3;&#x5B9A;&#x4E49;</span></h3>



<p>&#x57FA;&#x7840;&#x529F;&#x80FD;&#x7684;&#x63A5;&#x53E3;&#x6CA1;&#x6709;&#x592A;&#x591A;&#x53EF;&#x8BF4;&#x7684;&#xFF0C;&#x4E3B;&#x8981;&#x5C31;&#x662F;&#x540E;&#x53F0;&#x7684;&#x589E;&#x5220;&#x6539;&#x67E5;&#xFF0C;&#x548C;&#x524D;&#x53F0;&#x7684;&#x67E5;&#x8BE2;&#x53CA;&#x4E0B;&#x5355;&#x63A5;&#x53E3;&#x3002;</p>



<p>&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;&#x56E0;&#x4E3A;&#x6211;&#x4EEC;&#x8BBE;&#x8BA1;&#x7684;&#x4F18;&#x60E0;&#x5238;&#x7CFB;&#x7EDF;&#x5141;&#x8BB8;&#x4F7F;&#x7528;&#x591A;&#x5F20;&#x4F18;&#x60E0;&#x5238;&#x4E14;&#x6709;&#x591A;&#x79CD;&#x8D39;&#x7528;&#x9879;&#xFF08;&#x5546;&#x54C1;&#x91D1;&#x989D;&#x3001;&#x90AE;&#x8D39;&#xFF09;&#xFF0C;&#x56E0;&#x6B64;&#x4E0B;&#x5355;&#x7684;&#x903B;&#x8F91;&#x4F1A;&#x590D;&#x6742;&#x4E00;&#x4E9B;&#xFF0C;&#x9700;&#x8981;&#x9010;&#x4E2A;&#x8D39;&#x7528;&#x9879;&#x68C0;&#x67E5;&#x662F;&#x5426;&#x7B26;&#x5408;&#x4F20;&#x8FDB;&#x6765;&#x7684;&#x4F18;&#x60E0;&#x5238;&#x662F;&#x5426;&#x53EF;&#x7528;&#x3002;&#x867D;&#x7136;&#x4E0B;&#x5355;&#x9875;&#x4E2D;&#x7684;&#x4F18;&#x60E0;&#x5238;&#x5217;&#x8868;&#x662F;&#x6211;&#x4EEC;&#x8FD4;&#x56DE;&#x7684;&#xFF0C;&#x4F46;&#x5E76;&#x4E0D;&#x610F;&#x5473;&#x7740;&#x63D0;&#x4EA4;&#x8BA2;&#x5355;&#x4F20;&#x8FDB;&#x6765;&#x7684;&#x6570;&#x636E;&#x5C31;&#x4E00;&#x5B9A;&#x662F;&#x6211;&#x4EEC;&#x7ED9;&#x7684;&#xFF0C;&#x8BF7;&#x6C42;&#x6709;&#x53EF;&#x80FD;&#x7BE1;&#x6539;&#x4E5F;&#x6709;&#x53EF;&#x80FD;&#x4EA7;&#x751F;&#x5E76;&#x53D1;&#xFF0C;&#x518D;&#x6B21;&#x5F3A;&#x8C03;&#x4E00;&#x904D;&#xFF1A;<strong>&#x5B89;&#x5168;&#x65E0;&#x5C0F;&#x4E8B;</strong>&#xFF01;</p>



<p>&#x53E6;&#x5916;&#x56E0;&#x4E3A;&#x6211;&#x4EEC;&#x5728;&#x5E95;&#x5C42;&#x6570;&#x636E;&#x7ED3;&#x6784;&#x5C31;&#x5DF2;&#x7ECF;&#x5C06;&#x4F18;&#x60E0;&#x7C7B;&#x578B;&#x548C;&#x4F18;&#x60E0;&#x529B;&#x5EA6;&#x8FDB;&#x884C;&#x4E86;&#x62BD;&#x8C61;&#xFF0C;&#x56E0;&#x6B64;&#x6211;&#x4EEC;&#x5728;&#x5199;&#x4EE3;&#x7801;&#x7684;&#x65F6;&#x5019;&#x4E5F;&#x53EF;&#x4EE5;&#x9762;&#x5411;&#x63A5;&#x53E3;&#x7F16;&#x7A0B;&#x4E86;&#x3002;&#x6BD4;&#x5982;&#x6211;&#x4EEC;&#x5B9A;&#x4E00;&#x4E2A;&#x4E86;&#xFF0C;Discount&#x7684;interface&#xFF0C;&#x63A5;&#x53E3;&#x4E2D;&#x5B9A;&#x4E49;&#x4E86;&#x68C0;&#x67E5;&#x662F;&#x5426;&#x53EF;&#x7528;&#x548C;&#x8BA1;&#x7B97;&#x4F18;&#x60E0;&#x591A;&#x5C11;&#x94B1;&#x3002;&#x90A3;&#x4E48;&#x6211;&#x4EEC;&#x5206;&#x522B;&#x5C06;&#x6EE1;&#x51CF;&#x3001;&#x6BCF;&#x6EE1;&#x51CF;&#x3001;&#x6298;&#x6263;&#x3001;&#x9636;&#x68AF;&#x4F5C;&#x4E3A;&#x56DB;&#x79CD;&#x4E0D;&#x540C;&#x7684;&#x5B9E;&#x73B0;&#x7C7B;&#x53BB;&#x5B9E;&#x73B0;&#x5C31;&#x53EF;&#x4EE5;&#x4E86;&#x3002;&#x8FD9;&#x6837;&#x7684;&#x8BDD;&#x5F53;&#x6211;&#x4EEC;&#x5728;&#x5199;CouponService&#x7684;&#x65F6;&#x5019;&#x5C31;&#x4E0D;&#x9700;&#x8981;&#x8003;&#x8651;&#x6BCF;&#x4E00;&#x79CD;&#x7C7B;&#x578B;&#x8BE5;&#x5982;&#x4F55;&#x8BA1;&#x7B97;&#x4E86;&#xFF0C;&#x6211;&#x4EEC;&#x7684;Service&#x4E5F;&#x53EF;&#x4EE5;&#x548C;&#x5177;&#x4F53;&#x7684;&#x67D0;&#x4E00;&#x79CD;&#x73A9;&#x6CD5;&#x89E3;&#x85D5;&#x4E86;&#xFF0C;&#x5F53;&#x5C06;&#x6765;&#x589E;&#x52A0;&#x65B0;&#x73A9;&#x6CD5;&#x65F6;&#xFF0C;&#x53EA;&#x8981;&#x589E;&#x52A0;&#x65B0;&#x7684;&#x5B9E;&#x73B0;&#x7C7B;&#x5E76;&#x6CE8;&#x518C;&#x5230;&#x5DE5;&#x5382;&#x5373;&#x53EF;&#xFF0C;&#x65E0;&#x9700;&#x4FEE;&#x6539;Service&#x3002;</p>



<pre class="wp-block-code"><code lang="php" class="language-php">/**
 * coupon&#x8868;&#x7684;&#x6A21;&#x578B;&#xFF0C;&#x5B57;&#x6BB5;&#x7701;&#x7565;
 */
class Coupon
{
    public int $id;
    private DiscountFactory $discountFactory;
    private Discount $discount;
    public function getDiscount():Discount {
        if ($this-&gt;discount == null) {
            $this-&gt;discount = $this-&gt;discountFactory-&gt;createDiscount($this-&gt;discountType,$this-&gt;discountValue,$this-&gt;thresholdPrice, $this-&gt;extParams);
        }
        return $this-&gt;discount;
    }
}
/**
 * user_coupon&#x8868;&#x7684;&#x6A21;&#x578B;&#xFF0C;&#x5B57;&#x6BB5;&#x7701;&#x7565;
 */
class UserCoupon
{
    public int $uid;
    /*...&#x6B64;&#x5904;&#x7701;&#x7565;&#x4E00;&#x5927;&#x5806;&#x4EE3;&#x7801;...*/
    public Coupon $coupon;
}

/**
 * &#x4F18;&#x60E0;&#x529B;&#x5EA6;&#x5BF9;&#x8C61;&#x5DE5;&#x5382;
 */
class DiscountFactory {
    private array $conf = [1=&gt;PriceDiscount::class, 2=&gt;PerPriceDiscount::class, 3=&gt;RateDiscount::class, 4=&gt;LadderDiscount::class];
    public function createDiscount($discountType, $discountValue, $thresholdPrice, $extParams=null) {
        if (array_key_exists($discountType, $this-&gt;conf)) {
            return new $this-&gt;conf[$discountType]($discountValue, $thresholdPrice, $extParams);
        }
        throw new RuntimeException(&quot;not implement&quot;);
    }
}

/**
 * &#x51CF;&#x4EF7;&#x89C4;&#x5219;&#x7684;&#x62BD;&#x8C61;&#x63A5;&#x53E3;&#xFF0C;&#x6BCF;&#x4E00;&#x79CD;&#x4F18;&#x60E0;&#x5F62;&#x5F0F;&#x90FD;&#x9700;&#x8981;&#x5B9E;&#x73B0;&#x8FD9;&#x4E2A;&#x63A5;&#x53E3;
 */
interface Discount {
    /**
     * &#x68C0;&#x67E5;&#x5F53;&#x524D;&#x8BA2;&#x5355;&#x662F;&#x5426;&#x53EF;&#x7528;
     * @param OrderInfoDTO $orderInfo
     * @return bool
     */
    public function checkUsable(OrderInfoDTO $orderInfo): bool ;
    /**
     * &#x8BA1;&#x7B97;&#x5F53;&#x524D;&#x8BA2;&#x5355;&#x53EF;&#x952E;&#x591A;&#x5C11;&#x94B1;
     * @param OrderInfoDTO $orderInfo
     * @return float
     */
    public function calculate(OrderInfoDTO $orderInfo): float ;
}
class PriceDiscount implements Discount {/*TODO*/}
class PerPriceDiscount implements Discount {/*TODO*/}
class RateDiscount implements Discount {/*TODO*/}
class LadderDiscount implements Discount {/*TODO*/}

/**
 * &#x8BA2;&#x5355;&#x4E0D;&#x662F;&#x672C;&#x6587;&#x91CD;&#x70B9;&#x53EA;&#x662F;&#x7B80;&#x5355;&#x5217;&#x51E0;&#x4E2A;&#x5B57;&#x6BB5;&#xFF0C;&#x8BA2;&#x5355;&#x4E0E;&#x8865;&#x8D34;&#x5206;&#x644A;&#x53C8;&#x662F;&#x4E00;&#x5927;&#x7BC7;&#x6587;&#x7AE0;&#x4E86;
 */
class OrderInfoDTO
{
    private string $orderId;
    private float $productFee;
    private float $postage;
}

/**
 * &#x4F18;&#x60E0;&#x5238;&#x670D;&#x52A1;
 */
class CouponService
{

    /**
     * &#x53D1;&#x653E;&#x4F18;&#x60E0;&#x5238;
     * @param int $uid
     * @param string $couponSN
     * @return UserCoupon|null
     */
    public function sendCoupon(int $uid, string $couponSN): ?UserCoupon;

    /**
     * &#x4F7F;&#x7528;&#x4F18;&#x60E0;&#x5238;
     * &#x9700;&#x8981;&#x6839;&#x636E;&#x8BA2;&#x5355;&#x4FE1;&#x606F;&#x4E2D;&#x7684;&#x5404;&#x79CD;&#x8D39;&#x7528;&#x9879;&#x6765;&#x5224;&#x65AD;&#x4F20;&#x5165;&#x7684;userCouponIds&#x662F;&#x5426;&#x90FD;&#x53EF;&#x4F7F;&#x7528;
     * &#x8981;&#x6CE8;&#x610F;&#x9700;&#x8981;&#x68C0;&#x67E5;&#x8FD9;&#x4E9B;&#x5238;&#x662F;&#x4E0D;&#x662F;&#x5F53;&#x524D;&#x7528;&#x6237;&#x7684;&#xFF0C;&#x907F;&#x514D;&#x8BE5;&#x8BF7;&#x6C42;&#x4F7F;&#x7528;&#x522B;&#x4EBA;&#x4F18;&#x60E0;&#x5238;&#x7684;&#x6F0F;&#x6D1E;
     * @param int $uid
     * @param array $userCouponIds
     * @param OrderInfoDTO $orderInfo
     * @return bool
     */
    public function useCoupons(int $uid, array $userCouponIds, OrderInfoDTO $orderInfo): bool;

    /**
     * &#x6211;&#x7684;&#x4F18;&#x60E0;&#x5238;&#x5217;&#x8868;
     * @param int $offset
     * @param int $limit
     * @param int $uid
     * @param int $status
     * @return array list:UserCoupon[], total:int
     */
    public function getCouponListByUid(int $offset, int $limit, int $uid, int $status): array ;

    /**
     * &#x6839;&#x636E;&#x4E0B;&#x5355;&#x9875;&#x7684;&#x8BA2;&#x5355;&#x4FE1;&#x606F;&#x8FD4;&#x56DE;&#x53EF;&#x7528;&#x4F18;&#x60E0;&#x5238;&#x5217;&#x8868;
     * @param int $uid
     * @param OrderInfoDTO $orderInfoDTO
     * @return UserCoupon[]
     */
    public function getCouponListByBookingPage(int $uid, OrderInfoDTO $orderInfoDTO): array;

}

class CouponInternalService
{

    public function getUserCoupon(int $id): UserCoupon;
    public function getCouponById(int $id): Coupon;
    public function getCouponBySN(string $sn): Coupon;

    public function create();

    /**
     * &#x66F4;&#x65B0;&#x4F18;&#x60E0;&#x5238;&#x65F6;&#x9700;&#x8981;&#x6CE8;&#x610F;&#x4F18;&#x60E0;&#x529B;&#x5EA6;&#x7B49;&#x5173;&#x952E;&#x4FE1;&#x606F;&#x4E00;&#x65E6;&#x521B;&#x5EFA;&#x4E0D;&#x5141;&#x8BB8;&#x4FEE;&#x6539;&#xFF0C;&#x5982;&#x679C;&#x6CA1;&#x6709;&#x53D1;&#x7ED9;&#x7528;&#x6237;&#xFF0C;&#x53EF;&#x4EE5;&#x4F5C;&#x5E9F;&#x91CD;&#x65B0;&#x521B;&#x5EFA;
     * @return mixed
     */
    public function update();

    /*...&#x6B64;&#x5904;&#x7701;&#x7565;&#x4F18;&#x60E0;&#x5238;&#x65E5;&#x5E38;&#x64CD;&#x4F5C;&#x7684;&#x4E00;&#x7CFB;&#x5217;&#x589E;&#x5220;&#x8BE5;&#x67E5;&#x63A5;&#x53E3;...*/
}</code></pre>



<h2><span id="i-11">&#x8FDB;&#x9636;&#x4E00;&#xFF1A;&#x4F7F;&#x7528;&#x8303;&#x56F4;&#x4E0E;&#x53D1;&#x653E;&#x8303;&#x56F4;</span></h2>



<p>&#x57FA;&#x7840;&#x90E8;&#x5206;&#x8BB2;&#x7684;&#x90FD;&#x662F;&#x4E00;&#x7AD9;&#x901A;&#x7528;&#x7684;&#x4F18;&#x60E0;&#x5238;&#xFF0C;&#x53EA;&#x6709;&#x4F7F;&#x7528;&#x91D1;&#x989D;&#x7684;&#x65B9;&#x9762;&#x7684;&#x9650;&#x5236;&#xFF0C;&#x5F53;&#x4E1A;&#x52A1;&#x89C4;&#x6A21;&#x6269;&#x5927;&#x540E;&#x4F1A;&#x5F00;&#x59CB;&#x52A0;&#x5404;&#x79CD;&#x8303;&#x56F4;&#x7684;&#x9650;&#x5236;&#xFF0C;&#x6BD4;&#x5982;&#x90E8;&#x5206;&#x54C1;&#x7C7B;&#x53EF;&#x7528;&#x3001;&#x90E8;&#x5206;&#x5546;&#x54C1;&#x53EF;&#x7528;&#x3001;&#x5973;&#x751F;&#x4E13;&#x4EAB;&#x3001;&#x6C5F;&#x6D59;&#x6CAA;&#x4E13;&#x4EAB;&#x3002;</p>



<p>&#x603B;&#x4F53;&#x4E0A;&#x5206;&#x4E3A;&#x4E24;&#x5927;&#x7C7B;&#xFF1A;&#x9886;&#x53D6;&#x9650;&#x5236;&#x548C;&#x4F7F;&#x7528;&#x9650;&#x5236;&#xFF0C;&#x4F7F;&#x7528;&#x9650;&#x5236;&#x5B8C;&#x5168;&#x7531;&#x4F18;&#x60E0;&#x5238;&#x7CFB;&#x7EDF;&#x6765;&#x5B9E;&#x73B0;&#xFF0C;&#x800C;&#x9886;&#x53D6;&#x9650;&#x5236;&#x4F18;&#x60E0;&#x5238;&#x7CFB;&#x7EDF;&#x53EA;&#x80FD;&#x505A;&#x4E00;&#x90E8;&#x5206;&#xFF0C;&#x66F4;&#x591A;&#x7684;&#x8981;&#x9760;&#x5BF9;&#x63A5;&#x4E1A;&#x52A1;&#x65B9;&#x6765;&#x505A;&#xFF0C;&#x6BD4;&#x5982;&#x641E;&#x4E2A;&#x62BD;&#x5956;&#x6D3B;&#x52A8;&#xFF0C;&#x7528;&#x6237;&#x662F;&#x5426;&#x80FD;&#x62BD;&#x4E2D;&#x8FD9;&#x5F20;&#x5238;&#x4E5F;&#x7B97;&#x662F;&#x9886;&#x53D6;&#x9650;&#x5236;&#xFF0C;&#x4F46;&#x628A;&#x5B83;&#x653E;&#x5230;&#x4F18;&#x60E0;&#x5238;&#x7CFB;&#x7EDF;&#x660E;&#x663E;&#x4E0D;&#x5408;&#x9002;&#x3002;</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="481" height="201" src="https://fyn.pw/wp-content/uploads/2020/03/coupon-db-2.png" alt class="wp-image-686" srcset="http://www.dev-f.cn/content/images/wordpress/2020/03/coupon-db-2.png 481w, http://www.dev-f.cn/content/images/wordpress/2020/03/coupon-db-2-300x125.png 300w, http://www.dev-f.cn/content/images/wordpress/2020/03/coupon-db-2-360x150.png 360w" sizes="(max-width: 481px) 100vw, 481px"></figure></div>



<h3><span id="coupon_use_range">&#x62BD;&#x8C61;&#x4F7F;&#x7528;&#x8303;&#x56F4;&#x8868;&#xFF1A;coupon_use_range</span></h3>



<pre class="wp-block-code"><code lang="sql" class="language-sql">CREATE TABLE `coupon_use_range` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT &apos;&#x81EA;&#x589E;ID&apos;,
  `coupon_id` bigint(20) unsigned NOT NULL COMMENT &apos;&#x4F18;&#x60E0;&#x5238;ID&apos;,
  `range_type` tinyint(1) DEFAULT NULL COMMENT &apos;&#x8303;&#x56F4;&#x7C7B;&#x578B;&#xFF1A;1&#x5546;&#x54C1;&#xFF0C;2&#x54C1;&#x7C7B;&#xFF0C;3&#x6027;&#x522B;&#xFF0C;4&#x533A;&#x57DF;&#xFF0C;5...&apos;,
  `value` varchar(128) NOT NULL COMMENT &apos;&#x8303;&#x56F4;&#x503C;&#xFF0C;&#x5982;&#x5546;&#x54C1;ID&#x3001;&#x54C1;&#x7C7B;ID&#x3001;&#x6027;&#x522B;&#x3001;&#x533A;&#x57DF;ID&apos;,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`),
  KEY `ix_coupon_id` (`coupon_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;</code></pre>



<p>&#x8FD9;&#x662F;&#x5F20;&#x4E00;&#x5BF9;&#x591A;&#x7684;&#x8868;&#xFF0C;&#x4E00;&#x79CD;&#x4F18;&#x60E0;&#x5238;&#x53EF;&#x4EE5;&#x6709;&#x591A;&#x79CD;&#x4F7F;&#x7528;&#x8303;&#x56F4;&#xFF0C;&#x6BCF;&#x79CD;&#x4F7F;&#x7528;&#x8303;&#x56F4;&#x4E5F;&#x53EF;&#x4EE5;&#x6709;&#x591A;&#x4E2A;&#x4F7F;&#x7528;&#x8303;&#x56F4;&#x7684;&#x89C4;&#x5219;&#x3002;</p>



<ul><li><code>range_type</code>&#x6765;&#x51B3;&#x5B9A;&#x8FD9;&#x4E00;&#x884C;&#x662F;&#x4EC0;&#x4E48;&#x7C7B;&#x578B;&#x7684;&#x9650;&#x5236;&#xFF0C;&#x6BD4;&#x5982;&#x662F;&#x5546;&#x54C1;&#x9650;&#x5236;&#x8FD8;&#x662F;&#x54C1;&#x7C7B;&#x9650;&#x5236;</li><li><code>value</code>&#x5B57;&#x6BB5;&#x9700;&#x8981;&#x6839;&#x636E;<code>range_type</code>&#x6765;&#x770B;&#x662F;&#x4EC0;&#x4E48;&#x542B;&#x4E49;&#xFF0C;&#x53EF;&#x4EE5;&#x662F;&#x5546;&#x54C1;ID&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x662F;&#x54C1;&#x7C7B;ID</li><li>&#x76F8;&#x540C;&#x7684;<code>range_type</code>&#x5728;&#x4F7F;&#x7528;&#x65F6;&#x662F;&#x201C;&#x6216;&#x201D;&#x7684;&#x5173;&#x7CFB;&#xFF0C;&#x6BD4;&#x5982;range_type&#x90FD;&#x662F;&#x5546;&#x54C1;&#xFF0C;value&#x5206;&#x522B;&#x662F;123&#x548C;456&#x7684;&#x4E24;&#x6761;&#x8BB0;&#x5F55;&#x4EE3;&#x8868;123&#x548C;456&#x8FD9;&#x4E24;&#x4E2A;&#x5546;&#x54C1;&#x90FD;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x8FD9;&#x4E2A;&#x4F18;&#x60E0;&#x5238;&#x3002;</li><li>&#x4E0D;&#x540C;&#x7684;<code>range_type</code>&#x5728;&#x4F7F;&#x7528;&#x4E2D;&#x662F;&#x201C;&#x4E14;&#x201D;&#x7684;&#x5173;&#x7CFB;&#xFF0C;&#x6BD4;&#x5982;range_type&#x5206;&#x522B;&#x662F;&#x54C1;&#x7C7B;&#x548C;&#x533A;&#x57DF;&#xFF0C;value&#x662F;123&#x548C;bj&#xFF0C;&#x90A3;&#x4E48;&#x5C31;&#x4EE3;&#x8868;123&#x8FD9;&#x4E2A;&#x5546;&#x54C1;&#x53EA;&#x6709;&#x5728;bj&#x8D2D;&#x4E70;&#x65F6;&#x624D;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x8FD9;&#x5F20;&#x5238;&#x3002;</li></ul>



<p>&#x8FD9;&#x6837;&#x8BBE;&#x8BA1;&#x7684;&#x597D;&#x5904;&#x65F6;&#xFF0C;&#x5C06;&#x6765;&#x518D;&#x589E;&#x52A0;&#x5404;&#x79CD;&#x5947;&#x5947;&#x602A;&#x602A;&#x7684;&#x8303;&#x56F4;&#x65F6;&#x4E0D;&#x7528;&#x9891;&#x7E41;&#x6539;&#x3002;</p>



<p>&#x53D1;&#x653E;&#x8303;&#x56F4;&#x548C;&#x4F7F;&#x7528;&#x8303;&#x56F4;&#x7684;&#x8868;&#x7ED3;&#x6784;&#x57FA;&#x672C;&#x4E00;&#x81F4;&#xFF0C;&#x53EA;&#x662F;&#x4E00;&#x4E2A;&#x5728;&#x53D1;&#x653E;&#x63A5;&#x53E3;&#x7528;&#xFF0C;&#x4E00;&#x4E2A;&#x5728;&#x4E0B;&#x5355;&#x63A5;&#x53E3;&#x7528;&#xFF0C;&#x5C31;&#x4E0D;&#x518D;&#x8D58;&#x8FF0;&#x4E86;&#x3002;</p>



<h3><span id="i-12">&#x5206;&#x8868;&#x5EFA;&#x8BAE;</span></h3>



<p>&#x521D;&#x671F;&#x53EF;&#x4EE5;&#x4E0D;&#x7528;&#x8003;&#x8651;&#x5206;&#x8868;&#xFF0C;&#x5982;&#x679C;&#x91CF;&#x5F88;&#x5927;&#x4E86;&#xFF0C;&#x53EF;&#x4EE5;&#x8003;&#x8651;&#x6309;coupon_id&#x8FDB;&#x884C;&#x5206;&#x8868;&#xFF0C;&#x6216;&#x8005;&#x6309;range_type&#x62C6;&#x8868;&#x540E;&#x518D;&#x6309;value&#x5206;&#x3002;&#x6709;&#x53EF;&#x80FD;&#x4F1A;&#x540C;&#x65F6;&#x51FA;&#x73B0;&#x591A;&#x79CD;&#x5206;&#x8868;&#x65B9;&#x6848;&#xFF0C;&#x4F5C;&#x7528;&#x4E5F;&#x4E0D;&#x540C;&#xFF0C;&#x6709;&#x4E00;&#x5B9A;&#x7684;&#x53EF;&#x73A9;&#x6027;&#x3002;</p>



<h3><span id="i-13">&#x63A5;&#x53E3;&#x5B9A;&#x4E49;</span></h3>



<p>&#x540C;&#x6837;&#x56E0;&#x4E3A;&#x6211;&#x4EEC;&#x5728;&#x6570;&#x636E;&#x5C42;&#x5C31;&#x5F88;&#x597D;&#x7684;&#x62BD;&#x8C61;&#x51FA;&#x4E86;&#x8303;&#x56F4;&#x8FD9;&#x4E2A;&#x6982;&#x5FF5;&#xFF0C;&#x56E0;&#x6B64;&#x6211;&#x4EEC;&#x4E5F;&#x53EF;&#x4EE5;&#x5728;&#x4EE3;&#x7801;&#x4E2D;&#x5C06;&#x8303;&#x56F4;&#x62BD;&#x8C61;&#x4E3A;&#x63A5;&#x53E3;&#xFF0C;&#x5728;Service&#x4E2D;&#x4E4B;&#x95F4;&#x9762;&#x5411;&#x63A5;&#x53E3;&#x7F16;&#x7A0B;&#x800C;&#x4E0D;&#x662F;&#x9762;&#x5411;&#x5B9E;&#x73B0;&#x7F16;&#x7A0B;</p>



<pre class="wp-block-code"><code lang="php" class="language-php">class Coupon
{
    public int $id;
    /**
     * @return UseRange[]
     */
    public function getUseRangeList(): array {
        /*todo*/
    }
}
interface UseRange {
    public function checkUsable(OrderInfoDTO $orderInfo);
}
class ProductUseRange implements UseRange {}
class CategoryUseRange implements UseRange {}
class GenderUseRange implements UseRange {}
class AreaUseRange implements UseRange {}

/**
 * &#x4F18;&#x60E0;&#x5238;&#x670D;&#x52A1;
 */
class CouponService
{
    /**
     * &#x4F7F;&#x7528;&#x4F18;&#x60E0;&#x5238;
     * &#x9700;&#x8981;&#x6839;&#x636E;&#x8BA2;&#x5355;&#x4FE1;&#x606F;&#x4E2D;&#x7684;&#x5404;&#x79CD;&#x8D39;&#x7528;&#x9879;&#x6765;&#x5224;&#x65AD;&#x4F20;&#x5165;&#x7684;userCouponIds&#x662F;&#x5426;&#x90FD;&#x53EF;&#x4F7F;&#x7528;
     * &#x8981;&#x6CE8;&#x610F;&#x9700;&#x8981;&#x68C0;&#x67E5;&#x8FD9;&#x4E9B;&#x5238;&#x662F;&#x4E0D;&#x662F;&#x5F53;&#x524D;&#x7528;&#x6237;&#x7684;&#xFF0C;&#x907F;&#x514D;&#x8BE5;&#x8BF7;&#x6C42;&#x4F7F;&#x7528;&#x522B;&#x4EBA;&#x4F18;&#x60E0;&#x5238;&#x7684;&#x6F0F;&#x6D1E;
     * @param int $uid
     * @param array $userCouponIds
     * @param OrderInfoDTO $orderInfo
     * @return bool
     * @throws CheckException
     */
    public function useCoupons(int $uid, array $userCouponIds, OrderInfoDTO $orderInfo): bool {
        //$userCoupons = getUserCoupons($userCouponIds);
        foreach ($userCoupons as $userCoupon) {
            foreach ($userCoupon-&gt;getUseRangeList() as $useRange) {
                if (!$useRange-&gt;checkUsable($orderInfo)){
                    throw new CheckException(&quot;not usable&quot;);
                }
            }
        }
        // ...&#x7701;&#x7565;&#x4EE3;&#x7801;...
    }
}</code></pre>



<h2><span id="i-14">&#x8FDB;&#x9636;&#x4E8C;&#xFF1A;&#x53D1;&#x653E;&#x6E20;&#x9053;</span></h2>



<p>&#x5F53;&#x4E1A;&#x52A1;&#x518D;&#x53D1;&#x5C55;&#x53D1;&#x5C55;&#x63A5;&#x5165;&#x7684;&#x4E1A;&#x52A1;&#x65B9;&#x8D8A;&#x6765;&#x8D8A;&#x591A;&#xFF0C;&#x8FD9;&#x65F6;&#x6211;&#x4EEC;&#x6709;&#x53EF;&#x80FD;&#x4F1A;&#x9650;&#x5236;&#x67D0;&#x4E00;&#x79CD;&#x5238;&#x53EF;&#x4EE5;&#x5728;&#x4EC0;&#x4E48;&#x6E20;&#x9053;&#x53D1;&#x653E;&#xFF0C;&#x6BD4;&#x5982;&#x67D0;&#x4E2A;&#x6D3B;&#x52A8;&#x9875;&#xFF0C;APP&#x4E13;&#x4EAB;&#x9886;&#x5238;&#xFF0C;&#x5728;&#x5176;&#x5B83;&#x7684;&#x6E20;&#x9053;&#x4E0B;&#x5373;&#x4F7F;&#x62FF;&#x5230;&#x4E86;sn&#x4E5F;&#x65E0;&#x6CD5;&#x9886;&#x53D6;&#x3002;</p>



<p>&#x4E5F;&#x6709;&#x53EF;&#x80FD;&#x51FA;&#x73B0;&#x540C;&#x4E00;&#x6279;&#x5238;&#x5728;&#x4E0D;&#x540C;&#x7684;&#x5730;&#x65B9;&#x53D1;&#x653E;&#xFF0C;&#x4F46;&#x662F;&#x4F1A;&#x6839;&#x636E;&#x7528;&#x6237;&#x9886;&#x53D6;&#x7684;&#x6E20;&#x9053;&#x51B3;&#x5B9A;&#x8425;&#x9500;&#x6210;&#x672C;&#x7531;&#x54EA;&#x5404;&#x90E8;&#x95E8;&#x627F;&#x62C5;&#x3002;</p>



<p>&#x8FD9;&#x65F6;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x5F15;&#x5165;&#x53D1;&#x653E;&#x6E20;&#x9053;&#x7684;&#x6982;&#x5FF5;&#xFF0C;&#x5B83;&#x662F;&#x5B9E;&#x73B0;&#x4EE5;&#x4E0A;&#x4E24;&#x79CD;&#x9700;&#x6C42;&#x7684;&#x57FA;&#x7840;&#x3002;&#xFF08;&#x4F46;&#x4E0D;&#x662F;&#x5168;&#x90E8;&#xFF0C;&#x8FD8;&#x9700;&#x8981;&#x4E1A;&#x52A1;&#x65B9;&#x914D;&#x5408;&#xFF09;&#x3002;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x7ED9;&#x4E0D;&#x540C;&#x7684;&#x4E1A;&#x52A1;&#x4E0D;&#x540C;&#x7684;&#x573A;&#x666F;&#x9884;&#x5148;&#x7533;&#x8BF7;&#x4E0D;&#x540C;&#x7684;&#x6E20;&#x9053;ID&#xFF0C;&#x5F53;&#x5404;&#x4E2A;&#x4E1A;&#x52A1;&#x8C03;&#x7528;&#x4F18;&#x60E0;&#x5238;&#x7684;&#x63A5;&#x53E3;&#x65F6;&#x9700;&#x8981;&#x5C06;&#x6E20;&#x9053;ID&#x4F20;&#x8FDB;&#x6765;&#xFF0C;&#x8FD9;&#x4E2A;&#x6E20;&#x9053;ID&#x53EA;&#x80FD;&#x53D1;&#x653E;&#x548C;&#x641C;&#x7D22;&#x4E0E;&#x4ED6;&#x76F8;&#x5173;&#x7684;&#x5238;&#xFF08;&#x6709;&#x70B9;&#x50CF;&#x4E2A;&#x5C0F;&#x578B;&#x6743;&#x9650;&#x7CFB;&#x7EDF;&#xFF09;&#xFF0C;&#x9664;&#x4E86;&#x6E20;&#x9053;ID&#xFF0C;&#x6211;&#x4EEC;&#x8FD8;&#x53EF;&#x4EE5;&#x7ED9;&#x6BCF;&#x4E2A;&#x6E20;&#x9053;&#x5206;&#x914D;&#x4E00;&#x4E2A;&#x5BC6;&#x94A5;&#xFF0C;&#x66F4;&#x8FDB;&#x4E00;&#x6B65;&#x4FDD;&#x8BC1;&#x7CFB;&#x7EDF;&#x7684;&#x5B89;&#x5168;&#x6027;&#xFF0C;&#x9632;&#x6B62;&#x522B;&#x4EBA;&#x76D7;&#x7528;&#x81EA;&#x5DF1;&#x7684;&#x6E20;&#x9053;ID&#x3002;&#x5982;&#x679C;&#x8FD8;&#x60F3;&#x518D;&#x8FDB;&#x4E00;&#x6B65;&#x786E;&#x4FDD;&#x5B89;&#x5168;&#xFF0C;&#x8FD8;&#x53EF;&#x4EE5;&#x5C06;&#x5BC6;&#x94A5;&#x5B9A;&#x4E49;&#x4E3A;&#x79C1;&#x94A5;&#x7528;&#x5B83;&#x505A;&#x7B7E;&#x540D;&#xFF0C;&#x53EF;&#x4EE5;&#x9632;&#x6B62;&#x6293;&#x5305;&#x76D7;&#x5BC6;&#x94A5;&#x3002;&#x4E0D;&#x8FC7;&#x4E00;&#x822C;&#x6765;&#x8BF4;&#x505A;&#x5230;&#x5BC6;&#x94A5;&#x5C31;&#x53EF;&#x4EE5;&#x4E86;&#xFF0C;&#x79C1;&#x94A5;&#x662F;&#x4E3A;&#x4E86;&#x89E3;&#x51B3;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x4E0D;&#x53EF;&#x4FE1;&#x7684;&#x95EE;&#x9898;&#xFF08;&#x6BD4;&#x5982;&#x652F;&#x4ED8;&#x56DE;&#x8C03;&#x3001;&#x5F00;&#x653E;&#x5E73;&#x53F0;&#xFF09;&#xFF0C;&#x800C;&#x5C40;&#x57DF;&#x7F51;&#x5185;&#x5185;&#x90E8;&#x670D;&#x52A1;&#x95F4;&#x8C03;&#x7528;&#x4E00;&#x822C;&#x4E0D;&#x4F1A;&#x51FA;&#x8FD9;&#x79CD;&#x95EE;&#x9898;&#x3002;</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="641" height="201" src="https://fyn.pw/wp-content/uploads/2020/03/coupon-db-3.png" alt class="wp-image-698" srcset="http://www.dev-f.cn/content/images/wordpress/2020/03/coupon-db-3.png 641w, http://www.dev-f.cn/content/images/wordpress/2020/03/coupon-db-3-300x94.png 300w, http://www.dev-f.cn/content/images/wordpress/2020/03/coupon-db-3-360x113.png 360w" sizes="(max-width: 641px) 100vw, 641px"></figure></div>



<h3><span id="issue_channel">&#x6E20;&#x9053;&#x5B9A;&#x4E49;&#x8868;&#xFF1A;issue_channel</span></h3>



<p>&#x6E20;&#x9053;&#x8868;&#x5F88;&#x7B80;&#x5355;&#x9664;&#x4E86;id&#x3001;&#x540D;&#x79F0;&#x3001;&#x72B6;&#x6001;&#x5C31;&#x5269;&#x4E00;&#x4E2A;secret_key&#x5982;&#x679C;&#x4E0D;&#x505A;&#x5BC6;&#x94A5;&#x9A8C;&#x8BC1;&#x7684;&#x8BDD;&#x8FD9;&#x4E2A;&#x5B57;&#x6BB5;&#x4E5F;&#x53EF;&#x4EE5;&#x53BB;&#x6389;&#x3002;</p>



<pre class="wp-block-code"><code lang="sql" class="language-sql">CREATE TABLE `issue_channel` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT &apos;&#x53D1;&#x653E;&#x6E20;&#x9053;ID&apos;,
  `name` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT &apos;&#x53D1;&#x653E;&#x6E20;&#x9053;&#x540D;&#x79F0;&apos;,
  `secret_key` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT &apos;&#x53D1;&#x653E;&#x5BC6;&#x94A5;&apos;,
  `status` tinyint(11) DEFAULT NULL COMMENT &apos;&#x72B6;&#x6001;&#xFF1A;1&#x6709;&#x6548;&#xFF0C;2&#x4F5C;&#x5E9F;&apos;,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;</code></pre>



<h3><span id="coupon_issue_channel">&#x4E2D;&#x95F4;&#x8868;&#xFF1A;coupon_issue_channel</span></h3>



<p>issue_channel&#x8868;&#x548C;coupon&#x8868;&#x662F;&#x591A;&#x5BF9;&#x591A;&#x7684;&#x5173;&#x7CFB;&#xFF0C;&#x4E00;&#x79CD;&#x5238;&#x53EF;&#x4EE5;&#x5728;&#x591A;&#x4E2A;&#x6E20;&#x9053;&#x53D1;&#x653E;&#xFF0C;&#x4E00;&#x4E2A;&#x6E20;&#x9053;&#x4E5F;&#x53EF;&#x4EE5;&#x53D1;&#x653E;&#x591A;&#x79CD;&#x5238;&#xFF0C;&#x6240;&#x4EE5;&#x9700;&#x8981;&#x5EFA;&#x7ACB;&#x4E00;&#x5F20;&#x4E2D;&#x95F4;&#x8868;&#x6765;&#x5173;&#x8054;&#x5173;&#x7CFB;&#x3002;</p>



<pre class="wp-block-code"><code lang="sql" class="language-sql">CREATE TABLE `coupon_issue_channel` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT &apos;&#x81EA;&#x589E;ID&apos;,
  `coupon_id` bigint(20) unsigned NOT NULL COMMENT &apos;&#x4F18;&#x60E0;&#x5238;ID&apos;,
  `channel_id` bigint(20) unsigned NOT NULL COMMENT &apos;&#x6E20;&#x9053;ID&apos;,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`),
  UNIQUE KEY `ux_coupon_id_channel_id` (`coupon_id`,`channel_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;</code></pre>



<h3><span id="i-15">&#x63A5;&#x53E3;&#x8C03;&#x6574;</span></h3>



<p>&#x63A5;&#x53E3;&#x65B9;&#x9762;&#x6CA1;&#x5565;&#x53EF;&#x8BB2;&#xFF0C;&#x5C31;&#x662F;&#x57FA;&#x7840;&#x7684;&#x589E;&#x5220;&#x6539;&#x67E5;&#xFF0C;&#x65E0;&#x975E;&#x5C31;&#x662F;&#x5728;&#x539F;&#x6709;&#x7684;&#x63A5;&#x53E3;&#x4E0A;&#x589E;&#x52A0;&#x4E00;&#x5230;&#x4E24;&#x4E2A;&#x9A8C;&#x8BC1;&#x6E20;&#x9053;&#x7684;&#x53C2;&#x6570;&#xFF0C;&#x65B9;&#x6CD5;&#x5B9E;&#x73B0;&#x79CD;&#x518D;&#x7528;&#x8FD9;&#x4E24;&#x4E2A;&#x53C2;&#x6570;&#x548C;&#x4F18;&#x60E0;&#x5238;&#x4FE1;&#x606F;&#x6821;&#x9A8C;&#x662F;&#x5426;&#x4E00;&#x76F4;&#x3002;</p>



<pre class="wp-block-code"><code lang="php" class="language-php">/**
 * &#x4F18;&#x60E0;&#x5238;&#x670D;&#x52A1;
 */
class CouponService
{

    /**
     * &#x53D1;&#x653E;&#x4F18;&#x60E0;&#x5238;
     * @param int $uid
     * @param string $couponSN
     * @return UserCoupon|null
     */
    public function sendCoupon(int $uid, string $couponSN, int $channelId, string $channelSecretKey): ?UserCoupon;

}</code></pre>



<h2><span id="i-16">&#x8FDB;&#x9636;&#x4E09;&#xFF1A;&#x5238;&#x5305;&#x548C;&#x5238;&#x7801;&#x7EBF;&#x4E0B;&#x53D1;&#x653E;</span></h2>



<p>&#x5238;&#x5305;&#x548C;&#x548C;&#x7EBF;&#x4E0B;&#x53D1;&#x653E;&#x662F;&#x4E24;&#x79CD;&#x9AD8;&#x7EA7;&#x4E00;&#x70B9;&#x7684;&#x73A9;&#x6CD5;&#xFF0C;&#x4F46;&#x90FD;&#x53EF;&#x4EE5;&#x7528;&#x5238;&#x5305;&#x7684;&#x5F62;&#x5F0F;&#x5B9E;&#x73B0;&#x3002;</p>



<ul><li>&#x5238;&#x5305;&#xFF1A;&#x4E00;&#x4E2A;&#x5238;&#x5305;&#x4E2D;&#x53EF;&#x4EE5;&#x5305;&#x542B;&#x591A;&#x79CD;&#x4F18;&#x60E0;&#x5238;&#xFF0C;&#x4E00;&#x6B21;&#x6027;&#x9886;&#x53D6;&#x6240;&#x6709;&#x4F18;&#x60E0;&#x5238;&#x3002;</li><li>&#x7EBF;&#x4E0B;&#x53D1;&#x653E;&#xFF1A;&#x7EBF;&#x4E0B;&#x53D1;&#x653E;&#x7ED9;&#x7528;&#x6237;&#x4E00;&#x4E2A;&#x5151;&#x6362;&#x7801;&#xFF0C;&#x7528;&#x6237;&#x5728;&#x6211;&#x7684;&#x4F18;&#x60E0;&#x5238;&#x4E2D;&#x6216;&#x6D3B;&#x52A8;&#x9875;&#x4E2D;&#x8F93;&#x5165;&#x4F7F;&#x7528;&#xFF0C;&#x6709;&#x70B9;&#x50CF;&#x50A8;&#x503C;&#x5361;&#x5F00;&#x5361;&#xFF0C;&#x6216;&#x8005;&#x6E38;&#x620F;&#x4E2D;&#x7684;&#x53E3;&#x4EE4;&#x793C;&#x5305;&#x3002;<ul><li>&#x53EF;&#x4EE5;&#x4E00;&#x7801;&#x4E00;&#x5238;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x4E00;&#x7801;&#x591A;&#x5238;&#x3002;</li></ul><ul><li>&#x53EF;&#x4EE5;&#x6BCF;&#x4EBA;&#x4E00;&#x7801;&#xFF08;&#x6BD4;&#x5982;&#x793C;&#x54C1;&#x5361;&#xFF0C;&#x6BCF;&#x5F20;&#x5361;&#x4E0A;&#x7684;&#x7801;&#x90FD;&#x4E0D;&#x4E00;&#x6837;&#xFF09;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x5171;&#x7528;&#x4E00;&#x7801;&#xFF08;&#x6BD4;&#x5982;&#x6D3B;&#x52A8;&#x53E3;&#x4EE4;&#xFF0C;&#x6240;&#x6709;&#x4EBA;&#x8F93;&#x5165;&#x7684;&#x53E3;&#x4EE4;&#x90FD;&#x4E00;&#x6837;&#xFF09;&#x3002;</li></ul></li></ul>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="800" height="200" src="https://fyn.pw/wp-content/uploads/2020/03/coupon-db-4-800x200.png" alt class="wp-image-699" srcset="http://www.dev-f.cn/content/images/wordpress/2020/03/coupon-db-4-800x200.png 800w, http://www.dev-f.cn/content/images/wordpress/2020/03/coupon-db-4-300x75.png 300w, http://www.dev-f.cn/content/images/wordpress/2020/03/coupon-db-4-768x192.png 768w, http://www.dev-f.cn/content/images/wordpress/2020/03/coupon-db-4-360x90.png 360w, http://www.dev-f.cn/content/images/wordpress/2020/03/coupon-db-4.png 803w" sizes="(max-width: 800px) 100vw, 800px"></figure></div>



<h3><span id="coupon_package">&#x5238;&#x5305;&#x57FA;&#x7840;&#x4FE1;&#x606F;&#xFF1A;coupon_package</span></h3>



<p>&#x7531;&#x4E8E;&#x5206;&#x4E3A;&#x7EBF;&#x4E0A;&#x548C;&#x7EBF;&#x4E0B;&#x4E24;&#x79CD;&#x7C7B;&#x578B;&#x7684;&#x5238;&#x5305;&#xFF0C;&#x6211;&#x4EEC;&#x901A;&#x8FC7;type&#x6765;&#x533A;&#x5206;&#xFF0C;&#x7EBF;&#x4E0A;&#x53D1;&#x653E;&#x7684;&#x5238;&#x5305;&#x4F20;sn&#x5373;&#x53EF;&#x53D1;&#x653E;&#x3002;total_num&#x51B3;&#x5B9A;&#x8FD9;&#x4E2A;&#x5238;&#x5305;&#x53EF;&#x4EE5;&#x53D1;&#x653E;&#x591A;&#x5C11;&#x6B21;&#x3002;</p>



<pre class="wp-block-code"><code lang="sql" class="language-sql">CREATE TABLE `coupon_package` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT &apos;&#x81EA;&#x589E;ID&apos;,
  `sn` varchar(32) NOT NULL COMMENT &apos;&#x5238;&#x6807;&#x552F;&#x4E00;&#x6807;&#x8BC6;&#xFF0C;&#x5BF9;&#x5916;&#x63A5;&#x53E3;&#x5E94;&#x4F7F;&#x7528;&#x8FD9;&#x4E2A;&#x5B57;&#x6BB5;&apos;,
  `type` tinyint(1) NOT NULL COMMENT &apos;&#x7801;&#x7684;&#x7C7B;&#x578B;&#xFF1A;1&#x7EBF;&#x4E0A;&#x53D1;&#x653E;&#xFF0C;2&#x7EBF;&#x4E0B;&#x53D1;&#x653E;&apos;,
  `name` varchar(128) NOT NULL COMMENT &apos;&#x5238;&#x5305;&#x540D;&#x79F0;&apos;,
  `status` tinyint(1) NOT NULL COMMENT &apos;&#x72B6;&#x6001;&#xFF1A;1&#x53EF;&#x7528;&#xFF0C;2&#x4F5C;&#x5E9F;&apos;,
  `issue_begin_time` datetime NOT NULL COMMENT &apos;&#x53D1;&#x653E;&#x5F00;&#x59CB;&#x65F6;&#x95F4;&apos;,
  `issue_end_time` datetime NOT NULL COMMENT &apos;&#x53D1;&#x653E;&#x7ED3;&#x675F;&#x65F6;&#x95F4;&apos;,
  `total_num` int(11) NOT NULL COMMENT &apos;&#x603B;&#x6570;&#x91CF;&#xFF0C;&#x4E00;&#x6B21;&#x6027;&#x5151;&#x6362;&#x7801;&#x5E94;&#x4E3A;1&apos;,
  `issued_num` int(11) NOT NULL COMMENT &apos;&#x5DF2;&#x53D1;&#x653E;&#x6570;&#x91CF;&apos;,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`),
  UNIQUE KEY `ux_sn` (`sn`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;</code></pre>



<h3><span id="coupon_package_item">&#x4F18;&#x60E0;&#x5238;&#x5173;&#x8054;&#x8868;&#xFF1A;coupon_package_item</span></h3>



<p>&#x8FD9;&#x4E2A;&#x8868;&#x7528;&#x6765;&#x5173;&#x8054;&#x5238;&#x5305;&#x4E2D;&#x5305;&#x542B;&#x54EA;&#x4E9B;&#x5238;&#xFF0C;&#x56E0;&#x4E3A;&#x6709;&#x53EF;&#x80FD;&#x540C;&#x4E00;&#x79CD;&#x5238;&#x5728;&#x4E00;&#x4E2A;&#x5238;&#x5305;&#x4E2D;&#x51FA;&#x73B0;&#x591A;&#x6B21;&#xFF0C;&#x56E0;&#x6B64;&#x589E;&#x52A0;&#x4E00;&#x4E2A;num&#x5B57;&#x6BB5;&#xFF0C;&#x6700;&#x5C0F;&#x503C;&#x5E94;&#x4E3A;1&#x3002;</p>



<pre class="wp-block-code"><code lang="sql" class="language-sql">CREATE TABLE `coupon_package_item` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `coupon_package_id` bigint(20) unsigned NOT NULL COMMENT &apos;&#x5238;&#x5305;ID&apos;,
  `coupon_id` bigint(20) unsigned NOT NULL COMMENT &apos;&#x5238;ID&apos;,
  `num` tinyint(11) unsigned NOT NULL DEFAULT &apos;1&apos; COMMENT &apos;&#x540C;&#x4E00;&#x79CD;&#x5238;&#x7684;&#x53D1;&#x653E;&#x6570;&#x91CF;&apos;,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;</code></pre>



<h3><span id="coupon_package_code">&#x7EBF;&#x4E0B;&#x53D1;&#x653E;&#x7684;&#x5238;&#x7801;&#x8868;&#xFF1A;coupon_package_code</span></h3>



<p>&#x8FD9;&#x5F20;&#x8868;&#x5B58;&#x7EBF;&#x4E0B;&#x53D1;&#x653E;&#x7684;&#x5151;&#x6362;&#x7801;&#xFF0C;total_num&#x51B3;&#x5B9A;&#x8FD9;&#x4E2A;&#x7801;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x51E0;&#x6B21;&#x3002;code&#x53EF;&#x624B;&#x52A8;&#x6307;&#x5B9A;&#x4E5F;&#x53EF;&#x968F;&#x673A;&#x751F;&#x6210;&#xFF0C;&#x5EFA;&#x8BAE;&#x5728;8-12&#x4F4D;&#x95F4;&#xFF0C;&#x5E76;&#x4E14;&#x968F;&#x673A;&#x751F;&#x6210;&#x65F6;&#x5E94;&#x5C3D;&#x91CF;&#x6392;&#x9664;&#x201C;1lIO0&#x201D;&#x8FD9;&#x7C7B;&#x5728;&#x6253;&#x5370;&#x540E;&#x6709;&#x53EF;&#x80FD;&#x8BA9;&#x4EBA;&#x731C;&#x9519;&#x7684;&#x5B57;&#x7B26;</p>



<pre class="wp-block-code"><code lang="sql" class="language-sql">CREATE TABLE `coupon_package_code` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT &apos;&#x81EA;&#x589E;ID&apos;,
  `coupon_package_id` bigint(20) unsigned NOT NULL COMMENT &apos;&#x5238;&#x5305;ID&apos;,
  `code` varchar(16) NOT NULL COMMENT &apos;&#x5238;&#x7801;&apos;,
  `total_num` int(11) NOT NULL COMMENT &apos;&#x603B;&#x6570;&#x91CF;&#xFF0C;&#x4E00;&#x6B21;&#x6027;&#x5151;&#x6362;&#x7801;&#x5E94;&#x4E3A;1&apos;,
  `issued_num` int(11) NOT NULL COMMENT &apos;&#x5DF2;&#x53D1;&#x653E;&#x6570;&#x91CF;&apos;,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`),
  UNIQUE KEY `ux_code` (`code`),
  KEY `ix_coupon_package_id` (`coupon_package_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;</code></pre>



<h3><span id="i-17">&#x63A5;&#x53E3;&#x5B9A;&#x4E49;</span></h3>



<p>&#x5728;&#x5B9E;&#x73B0;&#x63A5;&#x53E3;&#x7684;&#x65F6;&#x5019;&#x5E94;&#x6CE8;&#x610F;&#xFF0C;&#x5E94;&#x5148;&#x589E;&#x52A0;package&#x4E2D;&#x7684;issued_num&#xFF0C;&#x5982;&#x679C;&#x662F;&#x4E0B;&#x7EBF;&#x7801;&#x8FD8;&#x5E94;&#x5728;&#x53BB;&#x589E;&#x52A0;code&#x8868;&#x5BF9;&#x5E94;&#x7684;issued_num&#x4E24;&#x4E2A;&#x901A;&#x8FC7;&#x4E50;&#x89C2;&#x9501;&#x90FD;&#x4FEE;&#x6539;&#x6210;&#x529F;&#x540E;&#x518D;&#x9010;&#x6B21;&#x8C03;&#x7528;&#x53D1;&#x653E;&#x5355;&#x5F20;&#x4F18;&#x60E0;&#x5238;&#x7684;&#x63A5;&#x53E3;&#x3002;&#x5982;&#x679C;&#x8981;&#x53D1;&#x7684;&#x4F18;&#x60E0;&#x5238;&#x8F83;&#x591A;&#xFF0C;&#x53EF;&#x4EE5;&#x8003;&#x8651;&#x66F4;&#x65B0;&#x5B8C;&#x4E24;&#x4E2A;num&#x540E;&#x629B;&#x5230;&#x961F;&#x5217;&#x4E2D;&#x53D1;&#x653E;&#xFF0C;&#x5E76;&#x7ACB;&#x5373;&#x7ED9;&#x7528;&#x6237;&#x53D1;&#x6325;&#x6210;&#x529F;&#x7684;&#x4FE1;&#x606F;&#x3002;&#x653E;&#x5230;&#x961F;&#x5217;&#x4E2D;&#x4F1A;&#x5BFC;&#x81F4;&#x4E8B;&#x52A1;&#x5272;&#x88C2;&#xFF0C;&#x5373;&#x6570;&#x91CF;&#x52A0;&#x4E0A;&#x53BB;&#x4E86;&#xFF0C;&#x4F46;&#x5238;&#x6CA1;&#x53D1;&#x6210;&#x529F;&#x3002;&#x51FA;&#x73B0;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x65E5;&#x5FD7;&#x544A;&#x8B66;&#x81EA;&#x52A8;&#x4FEE;&#x590D;&#x7B49;&#x7EA7;&#x5236;&#x6765;&#x4FDD;&#x8BC1;&#x6700;&#x7EC8;&#x4E00;&#x81F4;&#x6027;&#x3002;&#x989D;&#x5916;&#x8BF4;&#x4E00;&#x53E5;&#x5728;&#x505A;&#x53D1;&#x653E;&#x7C7B;&#x7684;&#x64CD;&#x4F5C;&#x65F6;&#xFF0C;&#x4E00;&#x5B9A;&#x8981;&#x5148;&#x6263;&#x51CF;&#x6570;&#x91CF;&#xFF0C;&#x518D;&#x53D1;&#x653E;&#x3002;&#x53D1;&#x653E;&#x5931;&#x8D25;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x540E;&#x671F;&#x8865;&#x507F;&#xFF0C;&#x4F46;&#x5982;&#x679C;&#x53D1;&#x653E;&#x6210;&#x529F;&#x6263;&#x51CF;&#x6570;&#x91CF;&#x5931;&#x8D25;&#x5C31;&#x4F1A;&#x9020;&#x6210;&#x8D85;&#x53D1;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x53D1;&#x5230;&#x7528;&#x6237;&#x624B;&#x4E0A;&#x7684;&#x4E1C;&#x897F;&#x518D;&#x8981;&#x56DE;&#x6765;&#x5C31;&#x4F1A;&#x6BD4;&#x8F83;&#x9EBB;&#x70E6;&#x4E86;&#x3002;</p>



<p>&#x53E6;&#x5916;&#x63A5;&#x53E3;&#x4E2D;&#x533A;&#x5206;&#x4E86;&#x7EBF;&#x4E0A;&#x53EF;&#x7EBF;&#x4E0B;&#x4E24;&#x79CD;&#xFF0C;&#x5982;&#x679C;&#x4E0B;&#x7EBF;&#x53D1;&#x653E;&#x7684;&#x586B;&#x5151;&#x6362;&#x7801;&#x7684;&#x5165;&#x53E3;&#x53EF;&#x4EE5;&#x6536;&#x5F52;&#x5230;&#x4E00;&#x5904;&#x7531;&#x4F18;&#x60E0;&#x5238;&#x7CFB;&#x7EDF;&#x6765;&#x7EF4;&#x62A4;&#xFF0C;&#x90A3;&#x4E48;&#x4E0B;&#x7EBF;&#x5238;&#x7684;&#x5151;&#x6362;&#x63A5;&#x53E3;&#x53EF;&#x4EE5;&#x632A;&#x5230;CouponInternalService&#x4E2D;&#x4F5C;&#x4E3A;&#x4E00;&#x4E2A;&#x5185;&#x90E8;&#x63A5;&#x53E3;&#x3002;</p>



<pre class="wp-block-code"><code lang="php" class="language-php">/**
 * &#x4F18;&#x60E0;&#x5238;&#x670D;&#x52A1;
 */
class CouponService
{
    public function useOnlineCouponPackage(int $uid, string $couponPackageSN): bool ;
    public function useOfflineCouponPackage(int $uid, string $couponPackageCode, string $couponPackageSN = null): bool ;
}</code></pre>



<h2><span id="i-18">&#x5EF6;&#x4F38;&#x4E00;&#xFF1A;&#x65E5;&#x5FD7;&#x3001;&#x76D1;&#x63A7;&#x3001;&#x544A;&#x8B66;</span></h2>



<p>&#x56E0;&#x4E3A;&#x4F18;&#x60E0;&#x5238;&#x6D89;&#x53CA;&#x5230;&#x94B1;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x56E0;&#x6B64;&#x5728;&#x4E00;&#x4E9B;&#x5173;&#x952E;&#x6B65;&#x9AA4;&#x5E94;&#x8BB0;&#x5F55;&#x4E0B;&#x65E5;&#x5FD7;&#xFF0C;&#x6BD4;&#x5982;&#x53D1;&#x5238;&#x3001;&#x7528;&#x5238;&#xFF0C;&#x5982;&#x679C;&#x4E00;&#x4E9B;&#x5F02;&#x5E38;&#x7A0B;&#x5E8F;&#x4E2D;&#x65E0;&#x6CD5;&#x81EA;&#x52A8;&#x964D;&#x7EA7;&#x8981;&#x6839;&#x636E;&#x8FD9;&#x79CD;&#x65E5;&#x5FD7;&#x8FDB;&#x884C;&#x544A;&#x8B66;&#x3002;</p>



<p>&#x53E6;&#x5916;&#x4E00;&#x4E9B;&#x8868;&#x4E2D;&#x9700;&#x8981;&#x52A0;&#x4E0A;created_at&#xFF0C;updated_at&#xFF0C;&#x4EE5;&#x53CA;&#x6700;&#x540E;&#x64CD;&#x4F5C;&#x4EBA;uid&#x7B49;&#x7B49;&#xFF0C;&#x8FD9;&#x4E9B;&#x90FD;&#x662F;&#x4E3A;&#x4E86;&#x6392;&#x67E5;&#x95EE;&#x9898;&#x65F6;&#x6709;&#x8FF9;&#x53EF;&#x5FAA;&#x3002;</p>
<!--kg-card-end: html-->]]></content:encoded></item></channel></rss>