瀏覽代碼

发票模块

zaijin 2 年之前
父節點
當前提交
02b4754e46

+ 3 - 1
App.vue

@@ -105,10 +105,12 @@ export default {
 </script>
 
 <style lang="scss">
+/*每个页面公共css */
 @import '/static/quill/quill.bubble.scss';
 @import '/static/quill/quill.snow.scss';
 @import '/static/quill/quill.core.scss';
 @import './static/css/iconfont.css';
+@import './static/iconfont/iconfont.css';
 @import 'uview-ui/index.scss';
-/*每个页面公共css */
+@import '/static/css/public.scss';
 </style>

+ 35 - 0
pages.json

@@ -313,6 +313,41 @@
         "navigationBarBackgroundColor": "#008CFF",
         "navigationBarTextStyle": "white"
       }
+    },
+    {
+      "path": "pages/invoiceModule/myInvoice/myInvoice",
+      "style": {
+        "navigationBarTitleText": "我的发票",
+        "enablePullDownRefresh": false,
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/invoiceModule/addInvoice/addInvoice",
+      "style": {
+        "navigationBarTitleText": "开发票",
+        "enablePullDownRefresh": false,
+        "navigationBarBackgroundColor": "#008CFF",
+        "navigationBarTextStyle": "white"
+      }
+    },
+    {
+      "path": "pages/invoiceModule/availableOrder/availableOrder",
+      "style": {
+        "navigationBarTitleText": "可开票订单",
+        "enablePullDownRefresh": false,
+        "navigationBarBackgroundColor": "#008CFF",
+        "navigationBarTextStyle": "white"
+      }
+    },
+    {
+      "path": "pages/invoiceModule/invoiceHeaderList/invoiceHeaderList",
+      "style": {
+        "navigationBarTitleText": "常用发票开头",
+        "enablePullDownRefresh": false,
+        "navigationBarBackgroundColor": "#008CFF",
+        "navigationBarTextStyle": "white"
+      }
     }
   ],
   "globalStyle": {

+ 10 - 7
pages/center/index.vue

@@ -47,6 +47,16 @@
         </u-cell-item>
       </u-cell-group>
     </view>
+    <template v-if="projectFlag !== 'zhenning'">
+      <view class="u-m-t-20">
+        <u-cell-group>
+          <u-cell-item icon="coupon" title="我的优惠券" @click="openPage('/pages/center/coupon/myCoupon/myCoupon')"></u-cell-item>
+          <u-cell-item title="我的发票" @click="openPage('/pages/invoiceModule/myInvoice/myInvoice')">
+            <u-icon slot="icon" custom-prefix="custom-icon" size="35" name="fapiao" />
+          </u-cell-item>
+        </u-cell-group>
+      </view>
+    </template>
     <view class="u-m-t-20 u-m-b-40">
       <u-cell-group>
         <u-cell-item title="拨打客服电话" @click="callPhoneShow = true">
@@ -55,13 +65,6 @@
       </u-cell-group>
     </view>
     <u-select v-model="callPhoneShow" :list="callPhoneList" @confirm="phoneCall"></u-select>
-    <template v-if="projectFlag !== 'zhenning'">
-      <view class="u-m-t-20">
-        <u-cell-group>
-          <u-cell-item icon="coupon" title="我的优惠券" @click="openPage('/pages/center/coupon/myCoupon/myCoupon')"></u-cell-item>
-        </u-cell-group>
-      </view>
-    </template>
     <!-- ===================================== 登出提示 ===================================== -->
     <u-modal
       v-model="logoutPop"

+ 57 - 0
pages/invoiceModule/addInvoice/addInvoice.scss

@@ -0,0 +1,57 @@
+.invoice {
+  background-color: #f9f9f9;
+  height: calc(100vh - 44px);
+  padding: 30rpx;
+
+  &-form {
+    background-color: #fff;
+    padding: 0 30rpx;
+  }
+
+  &-tips {
+    margin-top: 30rpx;
+  }
+
+  &-submit {
+    position: fixed;
+    bottom: 20rpx;
+    width: calc(100% - 60rpx);
+  }
+
+  .popup {
+    padding: 30rpx 0;
+    margin-top: 60rpx;
+    max-height: 50vh;
+    position: relative;
+
+    &-list {
+      border-bottom: 1px solid #e4e7ed;
+      border-top: 1px solid #e4e7ed;
+
+      &-group {
+        width: 100%;
+      }
+
+      &-item {
+        display: flex;
+        width: calc(100% - 60rpx);
+        padding: 0 30rpx;
+        height: 90rpx;
+        line-height: 90rpx;
+        border-bottom: 1px solid #e4e7ed;
+
+        &:last-child {
+          border-bottom: none;
+        }
+      }
+    }
+
+    &-bottom {
+      position: absolute;
+      width: 100%;
+      margin-top: 30rpx;
+      padding: 0 30rpx;
+      bottom: 20rpx;
+    }
+  }
+}

+ 96 - 0
pages/invoiceModule/addInvoice/addInvoice.vue

@@ -0,0 +1,96 @@
+<template>
+  <view class="invoice">
+    <view class="invoice-form">
+      <u-form :model="form" ref="uForm" label-width="150">
+        <u-form-item label="抬头类型">
+          <u-radio-group v-model="form.type">
+            <u-radio name="company">企业</u-radio>
+            <u-radio name="personal">个人/机关事业单位</u-radio>
+          </u-radio-group>
+        </u-form-item>
+        <u-form-item label="公司名称">
+          <u-input v-model="form.companyName" placeholder="请输入公司名称" />
+          <u-icon slot="right" name="list-dot" size="40" color="#606266" @click="moreCompany" />
+        </u-form-item>
+        <u-form-item label="公司税号">
+          <u-input v-model="form.dutyNum" placeholder="" disabled />
+        </u-form-item>
+        <u-form-item label="备注">
+          <u-input v-model="form.remark" placeholder="请输入备注" />
+        </u-form-item>
+        <u-form-item label="发票金额"> ¥{{ form.price }}元 </u-form-item>
+      </u-form>
+    </view>
+    <view class="invoice-tips"> 注:本公司目前只支持开具增值税普通发票 </view>
+    <view class="invoice-submit">
+      <u-button type="primary">提交</u-button>
+    </view>
+    <!-- 公司弹框 -->
+    <u-popup v-model="companyPop.show" mode="bottom" :closeable="true" height="50vh">
+      <view class="popup">
+        <view class="popup-list" v-if="companyPop.list.length">
+          <u-radio-group class="popup-list-group" v-model="form.companyName" :wrap="true">
+            <u-radio
+              class="popup-list-item"
+              v-for="(item, index) in companyPop.list"
+              :key="index"
+              :name="item.name"
+              @change="companyRadioClick(item)"
+            >
+              {{ item.name }}
+            </u-radio>
+          </u-radio-group>
+        </view>
+        <view class="popup-list" v-else>
+          <view class="popup-list-item">暂未添加发票开头</view>
+        </view>
+        <view class="popup-bottom">
+          <u-button type="info" @click="addInvoiceHeader">添加常用发票开头</u-button>
+        </view>
+      </view>
+    </u-popup>
+  </view>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      form: {
+        type: 'company',
+        companyName: '',
+        dutyNum: '',
+        remark: '',
+        price: 100
+      },
+      companyPop: {
+        show: false,
+        list: []
+      }
+    };
+  },
+  methods: {
+    /**
+     * @description: 选择企业
+     * @return {*}
+     */
+    moreCompany() {
+      this.companyPop.show = true;
+    },
+    companyRadioClick(item) {
+      this.companyPop.show = false;
+      this.form.companyName = item.name;
+      this.form.dutyNum = item.no;
+    },
+    addInvoiceHeader() {
+      this.$u.route({
+        url: '/pages/invoiceModule/invoiceHeaderList/invoiceHeaderList'
+      })
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+@import './addInvoice.scss';
+</style>

+ 35 - 0
pages/invoiceModule/availableOrder/availableOrder.scss

@@ -0,0 +1,35 @@
+.order-box {
+  background-color: #f9f9f9;
+  height: calc(100vh - 44px);
+
+  &-list {
+    padding: 30rpx;
+
+    &-item {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      background-color: #fff;
+      padding: 30rpx;
+      margin-bottom: 20rpx;
+      border-radius: 10rpx;
+
+      .left {
+        display: flex;
+        align-items: center;
+
+        &-radio {
+          margin-right: 10rpx;
+        }
+      }
+    }
+  }
+
+  &-bottom {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    background-color: #fff;
+    padding: 10rpx 30rpx;
+  }
+}

+ 100 - 0
pages/invoiceModule/availableOrder/availableOrder.vue

@@ -0,0 +1,100 @@
+<template>
+  <view class="order-box">
+    <z-paging ref="paging" v-model="orderList" @query="queryList">
+      <view class="order-box-list">
+        <view class="order-box-list-item" v-for="(item, index) in orderList" :key="index" @click="radioClick(item)">
+          <view class="left">
+            <view class="left-radio small-radio">
+              <radio value="true" :checked="currentIds.includes(item.id)" />
+            </view>
+            <view class="right-content">
+              <view class="right-content-item">停车订单:{{ item.orderName }}</view>
+              <view class="right-content-item">商户名称:{{ item.shopName }}</view>
+              <view class="right-content-item">订单时间:{{ item.orderTime }}</view>
+            </view>
+          </view>
+          <view class="right"> ¥{{ item.price }} 元 </view>
+        </view>
+      </view>
+      <view class="order-box-bottom" slot="bottom">
+        <view class="order-box-bottom-radio small-radio"> <radio value="true" :checked="checkedAll" @click="checkedChange" />全选 </view>
+        <view class="order-box-bottom-next">
+          <u-button type="primary" size="medium" :disabled="!currentIds.length" @click="nextStep">下一步</u-button>
+        </view>
+      </view>
+    </z-paging>
+    <u-toast ref="uToast" />
+  </view>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      orderList: [
+        { id: 1, orderName: '停车场订单', shopName: '商户名称', orderTime: '2023-06-12 15:00:00', price: 3.0 },
+        { id: 2, orderName: '停车场订单', shopName: '商户名称', orderTime: '2023-06-12 15:00:00', price: 3.0 }
+      ],
+      currentIds: [],
+      checkedAll: false
+    };
+  },
+  watch: {
+    currentIds(val) {
+      this.checkedAll = val.length === this.orderList.length;
+    }
+  },
+  methods: {
+    queryList() {
+      this.$refs.paging.complete([
+        { id: 1, orderName: '停车场订单', shopName: '商户名称', orderTime: '2023-06-12 15:00:00', price: 3.0 },
+        { id: 2, orderName: '停车场订单', shopName: '商户名称', orderTime: '2023-06-12 15:00:00', price: 3.0 }
+      ]);
+    },
+    /**
+     * @description: 单项条目点击
+     * @param {*} item
+     * @return {*}
+     */
+    radioClick(item) {
+      if (this.currentIds.includes(item.id)) {
+        const index = this.currentIds.indexOf(item.id);
+        this.currentIds.splice(index, 1);
+      } else {
+        this.currentIds.push(item.id);
+      }
+    },
+    /**
+     * @description: 全选
+     * @return {*}
+     */
+    checkedChange(item) {
+      this.checkedAll = !this.checkedAll;
+      this.currentIds = this.checkedAll ? this.orderList.map((item) => item.id) : [];
+    },
+    /**
+     * @description: 下一步
+     * @return {*}
+     */
+    nextStep() {
+      if (this.currentIds.length) {
+        this.$u.route({
+          url: '/pages/invoiceModule/addInvoice/addInvoice',
+          params: {
+            orderIds: this.currentIds.join(',')
+          }
+        });
+      } else {
+        this.$refs.uToast.show({
+          title: '请先选择订单',
+          type: 'warning'
+        });
+      }
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+@import './availableOrder.scss';
+</style>

+ 19 - 0
pages/invoiceModule/invoiceHeaderList/invoiceHeaderList.vue

@@ -0,0 +1,19 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			};
+		}
+	}
+</script>
+
+<style lang="scss">
+
+</style>

+ 33 - 0
pages/invoiceModule/myInvoice/myInvoice.scss

@@ -0,0 +1,33 @@
+.invoice {
+  background-color: #f9f9f9;
+  height: calc(100vh - 44px);
+  &-navbar {
+    &-right {
+      color: #fff;
+      margin-right: 30rpx;
+    }
+  }
+
+  &-content {
+    margin-top: 44px;
+  }
+
+  &-list {
+    padding: 30rpx;
+
+    &-item {
+      background-color: #fff;
+      padding: 40rpx 30rpx;
+      margin-bottom: 20rpx;
+      border-radius: 6rpx;
+      
+      &-left {
+        
+        &-item {
+          display: flex;
+          margin-bottom: 10rpx;
+        }
+      }
+    }
+  }
+}

+ 120 - 0
pages/invoiceModule/myInvoice/myInvoice.vue

@@ -0,0 +1,120 @@
+<template>
+  <view class="invoice">
+    <z-paging ref="paging" v-model="invoiceList" @query="queryList">
+      <!-- 导航栏 -->
+      <u-navbar
+        title-color="#fff"
+        :custom-back="customBack"
+        :border-bottom="false"
+        back-icon-color="#CCE8FF"
+        :background="{ background: '#008CFF' }"
+        title="我的发票"
+        class="invoice-navbar"
+        slot="top"
+      >
+        <view slot="right" class="invoice-navbar-right" @click="addInvoice">开发票</view>
+      </u-navbar>
+      <!-- 列表 -->
+      <view class="invoice-list">
+        <view class="invoice-list-item" v-for="(item, index) in invoiceList" :key="index">
+          <view class="invoice-list-item-left">
+            <view class="invoice-list-item-left-item" v-for="(child, childIndex) in invoiceObjectList" :key="childIndex">
+              <view class="left">{{ child.label }}</view>
+              <view class="right">
+                <template v-if="child.type === 'money'">¥{{ item[child.key] }}</template>
+                <template v-else>
+                  {{ item[child.key] }}
+                </template>
+              </view>
+            </view>
+          </view>
+          <view class="invoice-list-item-right"></view>
+        </view>
+      </view>
+    </z-paging>
+    <u-select v-model="chooseRecords.show" :list="chooseRecords.list" @confirm="chooseRecordsConfirm" />
+  </view>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      invoiceList: [
+        { title: '停车服务', price: 0.03, applyTime: '2023-06-12 11:21:30' },
+        { title: '停车服务', price: 0.03, applyTime: '2023-06-12 11:21:30' },
+        { title: '停车服务', price: 0.03, applyTime: '2023-06-12 11:21:30' },
+        { title: '停车服务', price: 0.03, applyTime: '2023-06-12 11:21:30' }
+      ],
+      invoiceObjectList: [
+        { label: '主题:', key: 'title' },
+        { label: '金额:', key: 'price', type: 'money' },
+        { label: '申请开票时间:', key: 'applyTime' }
+      ],
+      chooseRecords: {
+        show: false,
+        list: [
+          {
+            value: 'parkingRecords',
+            label: '停车记录'
+          },
+          {
+            value: 'monthlyRecords',
+            label: '包月记录'
+          }
+        ]
+      }
+    };
+  },
+  methods: {
+    /**
+     * @description: 指定返回上一页
+     * @return {*}
+     */
+    customBack() {
+      this.$u.route({
+        type: 'switchTab',
+        url: 'pages/center/index'
+      });
+    },
+    /**
+     * @description: 开发票
+     * @return {*}
+     */
+    addInvoice() {
+      this.chooseRecords.show = true;
+    },
+    /** 
+     * @description: 开发票选择确认
+     * @param {*} val
+     * @return {*}
+     */
+    chooseRecordsConfirm(list) {
+      this.$u.route({
+        url: '/pages/invoiceModule/availableOrder/availableOrder',
+        params: {
+          type: list[0].value
+        }
+      });
+    },
+    /** 
+     * @description: 分页触发
+     * @param {*} pageNo
+     * @param {*} pageSize
+     * @return {*}
+     */
+    queryList(pageNo, pageSize) {
+      this.$refs.paging.complete([
+        { title: '停车服务', price: 0.03, applyTime: '2023-06-12 11:21:30' },
+        { title: '停车服务', price: 0.03, applyTime: '2023-06-12 11:21:30' },
+        { title: '停车服务', price: 0.03, applyTime: '2023-06-12 11:21:30' },
+        { title: '停车服务', price: 0.03, applyTime: '2023-06-12 11:21:30' }
+      ]);
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+@import './myInvoice.scss';
+</style>

+ 5 - 0
pages/parkexport/parkexport.scss

@@ -50,6 +50,11 @@
       .really-money {
         color: #fa7319 !important;
       }
+      .vehicle-no {
+        color: #f00 !important;
+        font-weight: 500;
+				font-size: 34rpx;
+      }
     }
   }
   .parking-lock-pay-btn {

+ 2 - 2
pages/parkexport/parkexport.vue

@@ -9,7 +9,7 @@
         <view class="parking-lock-info">
           <view class="parking-lock-info-item">
             <view>车牌号</view>
-            <view class="weight">{{ infoData.vehicleNo }}</view>
+            <view class="weight vehicle-no">{{ infoData.vehicleNo }}</view>
           </view>
           <view class="parking-lock-info-item">
             <view>停车场名称</view>
@@ -100,7 +100,7 @@ export default {
         parkNo: '',
         roadwayNo: '',
         polyOrderId: '',
-        isBack: 0
+        isBack: 0,
       },
       payWayPop: false, // 支付弹框
       infoData: undefined, // 订单信息

文件差異過大導致無法顯示
+ 0 - 2
static/css/iconfont.css


+ 9 - 0
static/css/public.scss

@@ -0,0 +1,9 @@
+.small-radio uni-radio .uni-radio-input {
+  width: 30rpx;
+  height: 30rpx;
+  border: 1px solid #c8c9cc;
+}
+.invoice .u-drawer-bottom {
+  border-top-left-radius: 20rpx;
+  border-top-right-radius: 20rpx;
+}

+ 539 - 0
static/iconfont/demo.css

@@ -0,0 +1,539 @@
+/* Logo 字体 */
+@font-face {
+  font-family: "iconfont logo";
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
+}
+
+.logo {
+  font-family: "iconfont logo";
+  font-size: 160px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+/* tabs */
+.nav-tabs {
+  position: relative;
+}
+
+.nav-tabs .nav-more {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  height: 42px;
+  line-height: 42px;
+  color: #666;
+}
+
+#tabs {
+  border-bottom: 1px solid #eee;
+}
+
+#tabs li {
+  cursor: pointer;
+  width: 100px;
+  height: 40px;
+  line-height: 40px;
+  text-align: center;
+  font-size: 16px;
+  border-bottom: 2px solid transparent;
+  position: relative;
+  z-index: 1;
+  margin-bottom: -1px;
+  color: #666;
+}
+
+
+#tabs .active {
+  border-bottom-color: #f00;
+  color: #222;
+}
+
+.tab-container .content {
+  display: none;
+}
+
+/* 页面布局 */
+.main {
+  padding: 30px 100px;
+  width: 960px;
+  margin: 0 auto;
+}
+
+.main .logo {
+  color: #333;
+  text-align: left;
+  margin-bottom: 30px;
+  line-height: 1;
+  height: 110px;
+  margin-top: -50px;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.main .logo a {
+  font-size: 160px;
+  color: #333;
+}
+
+.helps {
+  margin-top: 40px;
+}
+
+.helps pre {
+  padding: 20px;
+  margin: 10px 0;
+  border: solid 1px #e7e1cd;
+  background-color: #fffdef;
+  overflow: auto;
+}
+
+.icon_lists {
+  width: 100% !important;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.icon_lists li {
+  width: 100px;
+  margin-bottom: 10px;
+  margin-right: 20px;
+  text-align: center;
+  list-style: none !important;
+  cursor: default;
+}
+
+.icon_lists li .code-name {
+  line-height: 1.2;
+}
+
+.icon_lists .icon {
+  display: block;
+  height: 100px;
+  line-height: 100px;
+  font-size: 42px;
+  margin: 10px auto;
+  color: #333;
+  -webkit-transition: font-size 0.25s linear, width 0.25s linear;
+  -moz-transition: font-size 0.25s linear, width 0.25s linear;
+  transition: font-size 0.25s linear, width 0.25s linear;
+}
+
+.icon_lists .icon:hover {
+  font-size: 100px;
+}
+
+.icon_lists .svg-icon {
+  /* 通过设置 font-size 来改变图标大小 */
+  width: 1em;
+  /* 图标和文字相邻时,垂直对齐 */
+  vertical-align: -0.15em;
+  /* 通过设置 color 来改变 SVG 的颜色/fill */
+  fill: currentColor;
+  /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
+      normalize.css 中也包含这行 */
+  overflow: hidden;
+}
+
+.icon_lists li .name,
+.icon_lists li .code-name {
+  color: #666;
+}
+
+/* markdown 样式 */
+.markdown {
+  color: #666;
+  font-size: 14px;
+  line-height: 1.8;
+}
+
+.highlight {
+  line-height: 1.5;
+}
+
+.markdown img {
+  vertical-align: middle;
+  max-width: 100%;
+}
+
+.markdown h1 {
+  color: #404040;
+  font-weight: 500;
+  line-height: 40px;
+  margin-bottom: 24px;
+}
+
+.markdown h2,
+.markdown h3,
+.markdown h4,
+.markdown h5,
+.markdown h6 {
+  color: #404040;
+  margin: 1.6em 0 0.6em 0;
+  font-weight: 500;
+  clear: both;
+}
+
+.markdown h1 {
+  font-size: 28px;
+}
+
+.markdown h2 {
+  font-size: 22px;
+}
+
+.markdown h3 {
+  font-size: 16px;
+}
+
+.markdown h4 {
+  font-size: 14px;
+}
+
+.markdown h5 {
+  font-size: 12px;
+}
+
+.markdown h6 {
+  font-size: 12px;
+}
+
+.markdown hr {
+  height: 1px;
+  border: 0;
+  background: #e9e9e9;
+  margin: 16px 0;
+  clear: both;
+}
+
+.markdown p {
+  margin: 1em 0;
+}
+
+.markdown>p,
+.markdown>blockquote,
+.markdown>.highlight,
+.markdown>ol,
+.markdown>ul {
+  width: 80%;
+}
+
+.markdown ul>li {
+  list-style: circle;
+}
+
+.markdown>ul li,
+.markdown blockquote ul>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown>ul li p,
+.markdown>ol li p {
+  margin: 0.6em 0;
+}
+
+.markdown ol>li {
+  list-style: decimal;
+}
+
+.markdown>ol li,
+.markdown blockquote ol>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown code {
+  margin: 0 3px;
+  padding: 0 5px;
+  background: #eee;
+  border-radius: 3px;
+}
+
+.markdown strong,
+.markdown b {
+  font-weight: 600;
+}
+
+.markdown>table {
+  border-collapse: collapse;
+  border-spacing: 0px;
+  empty-cells: show;
+  border: 1px solid #e9e9e9;
+  width: 95%;
+  margin-bottom: 24px;
+}
+
+.markdown>table th {
+  white-space: nowrap;
+  color: #333;
+  font-weight: 600;
+}
+
+.markdown>table th,
+.markdown>table td {
+  border: 1px solid #e9e9e9;
+  padding: 8px 16px;
+  text-align: left;
+}
+
+.markdown>table th {
+  background: #F7F7F7;
+}
+
+.markdown blockquote {
+  font-size: 90%;
+  color: #999;
+  border-left: 4px solid #e9e9e9;
+  padding-left: 0.8em;
+  margin: 1em 0;
+}
+
+.markdown blockquote p {
+  margin: 0;
+}
+
+.markdown .anchor {
+  opacity: 0;
+  transition: opacity 0.3s ease;
+  margin-left: 8px;
+}
+
+.markdown .waiting {
+  color: #ccc;
+}
+
+.markdown h1:hover .anchor,
+.markdown h2:hover .anchor,
+.markdown h3:hover .anchor,
+.markdown h4:hover .anchor,
+.markdown h5:hover .anchor,
+.markdown h6:hover .anchor {
+  opacity: 1;
+  display: inline-block;
+}
+
+.markdown>br,
+.markdown>p>br {
+  clear: both;
+}
+
+
+.hljs {
+  display: block;
+  background: white;
+  padding: 0.5em;
+  color: #333333;
+  overflow-x: auto;
+}
+
+.hljs-comment,
+.hljs-meta {
+  color: #969896;
+}
+
+.hljs-string,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-strong,
+.hljs-emphasis,
+.hljs-quote {
+  color: #df5000;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+  color: #a71d5d;
+}
+
+.hljs-literal,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-attribute {
+  color: #0086b3;
+}
+
+.hljs-section,
+.hljs-name {
+  color: #63a35c;
+}
+
+.hljs-tag {
+  color: #333333;
+}
+
+.hljs-title,
+.hljs-attr,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo {
+  color: #795da3;
+}
+
+.hljs-addition {
+  color: #55a532;
+  background-color: #eaffea;
+}
+
+.hljs-deletion {
+  color: #bd2c00;
+  background-color: #ffecec;
+}
+
+.hljs-link {
+  text-decoration: underline;
+}
+
+/* 代码高亮 */
+/* PrismJS 1.15.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+  color: black;
+  background: none;
+  text-shadow: 0 1px white;
+  font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+  text-align: left;
+  white-space: pre;
+  word-spacing: normal;
+  word-break: normal;
+  word-wrap: normal;
+  line-height: 1.5;
+
+  -moz-tab-size: 4;
+  -o-tab-size: 4;
+  tab-size: 4;
+
+  -webkit-hyphens: none;
+  -moz-hyphens: none;
+  -ms-hyphens: none;
+  hyphens: none;
+}
+
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+@media print {
+
+  code[class*="language-"],
+  pre[class*="language-"] {
+    text-shadow: none;
+  }
+}
+
+/* Code blocks */
+pre[class*="language-"] {
+  padding: 1em;
+  margin: .5em 0;
+  overflow: auto;
+}
+
+:not(pre)>code[class*="language-"],
+pre[class*="language-"] {
+  background: #f5f2f0;
+}
+
+/* Inline code */
+:not(pre)>code[class*="language-"] {
+  padding: .1em;
+  border-radius: .3em;
+  white-space: normal;
+}
+
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+  color: slategray;
+}
+
+.token.punctuation {
+  color: #999;
+}
+
+.namespace {
+  opacity: .7;
+}
+
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+  color: #905;
+}
+
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+  color: #690;
+}
+
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+  color: #9a6e3a;
+  background: hsla(0, 0%, 100%, .5);
+}
+
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+  color: #07a;
+}
+
+.token.function,
+.token.class-name {
+  color: #DD4A68;
+}
+
+.token.regex,
+.token.important,
+.token.variable {
+  color: #e90;
+}
+
+.token.important,
+.token.bold {
+  font-weight: bold;
+}
+
+.token.italic {
+  font-style: italic;
+}
+
+.token.entity {
+  cursor: help;
+}

+ 257 - 0
static/iconfont/demo_index.html

@@ -0,0 +1,257 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8"/>
+  <title>iconfont Demo</title>
+  <link rel="shortcut icon" href="//img.alicdn.com/imgextra/i4/O1CN01Z5paLz1O0zuCC7osS_!!6000000001644-55-tps-83-82.svg" type="image/x-icon"/>
+  <link rel="icon" type="image/svg+xml" href="//img.alicdn.com/imgextra/i4/O1CN01Z5paLz1O0zuCC7osS_!!6000000001644-55-tps-83-82.svg"/>
+  <link rel="stylesheet" href="https://g.alicdn.com/thx/cube/1.3.2/cube.min.css">
+  <link rel="stylesheet" href="demo.css">
+  <link rel="stylesheet" href="iconfont.css">
+  <script src="iconfont.js"></script>
+  <!-- jQuery -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/7bfddb60-08e8-11e9-9b04-53e73bb6408b.js"></script>
+  <!-- 代码高亮 -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/a3f714d0-08e6-11e9-8a15-ebf944d7534c.js"></script>
+  <style>
+    .main .logo {
+      margin-top: 0;
+      height: auto;
+    }
+
+    .main .logo a {
+      display: flex;
+      align-items: center;
+    }
+
+    .main .logo .sub-title {
+      margin-left: 0.5em;
+      font-size: 22px;
+      color: #fff;
+      background: linear-gradient(-45deg, #3967FF, #B500FE);
+      -webkit-background-clip: text;
+      -webkit-text-fill-color: transparent;
+    }
+  </style>
+</head>
+<body>
+  <div class="main">
+    <h1 class="logo"><a href="https://www.iconfont.cn/" title="iconfont 首页" target="_blank">
+      <img width="200" src="https://img.alicdn.com/imgextra/i3/O1CN01Mn65HV1FfSEzR6DKv_!!6000000000514-55-tps-228-59.svg">
+      
+    </a></h1>
+    <div class="nav-tabs">
+      <ul id="tabs" class="dib-box">
+        <li class="dib active"><span>Unicode</span></li>
+        <li class="dib"><span>Font class</span></li>
+        <li class="dib"><span>Symbol</span></li>
+      </ul>
+      
+      <a href="https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=4116838" target="_blank" class="nav-more">查看项目</a>
+      
+    </div>
+    <div class="tab-container">
+      <div class="content unicode" style="display: block;">
+          <ul class="icon_lists dib-box">
+          
+            <li class="dib">
+              <span class="icon custom-icon">&#xe6cb;</span>
+                <div class="name">停车场1</div>
+                <div class="code-name">&amp;#xe6cb;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon custom-icon">&#xe62a;</span>
+                <div class="name">月结</div>
+                <div class="code-name">&amp;#xe62a;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon custom-icon">&#xe98d;</span>
+                <div class="name">发票</div>
+                <div class="code-name">&amp;#xe98d;</div>
+              </li>
+          
+          </ul>
+          <div class="article markdown">
+          <h2 id="unicode-">Unicode 引用</h2>
+          <hr>
+
+          <p>Unicode 是字体在网页端最原始的应用方式,特点是:</p>
+          <ul>
+            <li>支持按字体的方式去动态调整图标大小,颜色等等。</li>
+            <li>默认情况下不支持多色,直接添加多色图标会自动去色。</li>
+          </ul>
+          <blockquote>
+            <p>注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)</p>
+          </blockquote>
+          <p>Unicode 使用步骤如下:</p>
+          <h3 id="-font-face">第一步:拷贝项目下面生成的 <code>@font-face</code></h3>
+<pre><code class="language-css"
+>@font-face {
+  font-family: 'custom-icon';
+  src: url('iconfont.woff2?t=1686550345296') format('woff2'),
+       url('iconfont.woff?t=1686550345296') format('woff'),
+       url('iconfont.ttf?t=1686550345296') format('truetype');
+}
+</code></pre>
+          <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
+<pre><code class="language-css"
+>.custom-icon {
+  font-family: "custom-icon" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3>
+<pre>
+<code class="language-html"
+>&lt;span class="custom-icon"&gt;&amp;#x33;&lt;/span&gt;
+</code></pre>
+          <blockquote>
+            <p>"custom-icon" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+          </blockquote>
+          </div>
+      </div>
+      <div class="content font-class">
+        <ul class="icon_lists dib-box">
+          
+          <li class="dib">
+            <span class="icon custom-icon custom-icon-tingchechang1"></span>
+            <div class="name">
+              停车场1
+            </div>
+            <div class="code-name">.custom-icon-tingchechang1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon custom-icon custom-icon-yuejie"></span>
+            <div class="name">
+              月结
+            </div>
+            <div class="code-name">.custom-icon-yuejie
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon custom-icon custom-icon-fapiao"></span>
+            <div class="name">
+              发票
+            </div>
+            <div class="code-name">.custom-icon-fapiao
+            </div>
+          </li>
+          
+        </ul>
+        <div class="article markdown">
+        <h2 id="font-class-">font-class 引用</h2>
+        <hr>
+
+        <p>font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。</p>
+        <p>与 Unicode 使用方式相比,具有如下特点:</p>
+        <ul>
+          <li>相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。</li>
+          <li>因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。</li>
+        </ul>
+        <p>使用步骤如下:</p>
+        <h3 id="-fontclass-">第一步:引入项目下面生成的 fontclass 代码:</h3>
+<pre><code class="language-html">&lt;link rel="stylesheet" href="./iconfont.css"&gt;
+</code></pre>
+        <h3 id="-">第二步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;span class="custom-icon custom-icon-xxx"&gt;&lt;/span&gt;
+</code></pre>
+        <blockquote>
+          <p>"
+            custom-icon" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+        </blockquote>
+      </div>
+      </div>
+      <div class="content symbol">
+          <ul class="icon_lists dib-box">
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#custom-icon-tingchechang1"></use>
+                </svg>
+                <div class="name">停车场1</div>
+                <div class="code-name">#custom-icon-tingchechang1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#custom-icon-yuejie"></use>
+                </svg>
+                <div class="name">月结</div>
+                <div class="code-name">#custom-icon-yuejie</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#custom-icon-fapiao"></use>
+                </svg>
+                <div class="name">发票</div>
+                <div class="code-name">#custom-icon-fapiao</div>
+            </li>
+          
+          </ul>
+          <div class="article markdown">
+          <h2 id="symbol-">Symbol 引用</h2>
+          <hr>
+
+          <p>这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇<a href="">文章</a>
+            这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:</p>
+          <ul>
+            <li>支持多色图标了,不再受单色限制。</li>
+            <li>通过一些技巧,支持像字体那样,通过 <code>font-size</code>, <code>color</code> 来调整样式。</li>
+            <li>兼容性较差,支持 IE9+,及现代浏览器。</li>
+            <li>浏览器渲染 SVG 的性能一般,还不如 png。</li>
+          </ul>
+          <p>使用步骤如下:</p>
+          <h3 id="-symbol-">第一步:引入项目下面生成的 symbol 代码:</h3>
+<pre><code class="language-html">&lt;script src="./iconfont.js"&gt;&lt;/script&gt;
+</code></pre>
+          <h3 id="-css-">第二步:加入通用 CSS 代码(引入一次就行):</h3>
+<pre><code class="language-html">&lt;style&gt;
+.icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+&lt;/style&gt;
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;svg class="icon" aria-hidden="true"&gt;
+  &lt;use xlink:href="#icon-xxx"&gt;&lt;/use&gt;
+&lt;/svg&gt;
+</code></pre>
+          </div>
+      </div>
+
+    </div>
+  </div>
+  <script>
+  $(document).ready(function () {
+      $('.tab-container .content:first').show()
+
+      $('#tabs li').click(function (e) {
+        var tabContent = $('.tab-container .content')
+        var index = $(this).index()
+
+        if ($(this).hasClass('active')) {
+          return
+        } else {
+          $('#tabs li').removeClass('active')
+          $(this).addClass('active')
+
+          tabContent.hide().eq(index).fadeIn()
+        }
+      })
+    })
+  </script>
+</body>
+</html>

+ 25 - 0
static/iconfont/iconfont.css

@@ -0,0 +1,25 @@
+@font-face {
+  font-family: 'custom-icon'; /* Project id 4116838 */
+  src: url('/static/iconfont/iconfont.woff2?t=1686550345296') format('woff2'), url('/static/iconfont/iconfont.woff?t=1686550345296') format('woff'),
+    url('/static/iconfont/iconfont.ttf?t=1686550345296') format('truetype');
+}
+
+.custom-icon {
+  font-family: 'custom-icon' !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.custom-icon-tingchechang1:before {
+  content: '\e6cb';
+}
+
+.custom-icon-yuejie:before {
+  content: '\e62a';
+}
+
+.custom-icon-fapiao:before {
+  content: '\e98d';
+}

文件差異過大導致無法顯示
+ 0 - 0
static/iconfont/iconfont.js


+ 30 - 0
static/iconfont/iconfont.json

@@ -0,0 +1,30 @@
+{
+  "id": "4116838",
+  "name": "parking-project",
+  "font_family": "custom-icon",
+  "css_prefix_text": "custom-icon-",
+  "description": "",
+  "glyphs": [
+    {
+      "icon_id": "782226",
+      "name": "停车场1",
+      "font_class": "tingchechang1",
+      "unicode": "e6cb",
+      "unicode_decimal": 59083
+    },
+    {
+      "icon_id": "5351377",
+      "name": "月结",
+      "font_class": "yuejie",
+      "unicode": "e62a",
+      "unicode_decimal": 58922
+    },
+    {
+      "icon_id": "18267912",
+      "name": "发票",
+      "font_class": "fapiao",
+      "unicode": "e98d",
+      "unicode_decimal": 59789
+    }
+  ]
+}

二進制
static/iconfont/iconfont.ttf


二進制
static/iconfont/iconfont.woff


二進制
static/iconfont/iconfont.woff2


部分文件因文件數量過多而無法顯示