Browse Source

1修改微信支付2清理代码

master
tanghong 1 year ago
parent
commit
ab96676cb8
  1. 32
      api/card.js
  2. 8
      api/vxPay.js
  3. 90
      components/geek-xd/components/geek-certificate/geek-certificate.vue
  4. 681
      components/geek-xd/components/geek-color-picker/geek-color-picker.vue
  5. 123
      components/geek-xd/components/geek-commodity/geek-commodity.vue
  6. 72
      components/geek-xd/components/geek-menu/geek-menu.vue
  7. 221
      components/geek-xd/components/geek-order/geek-order.vue
  8. 90
      components/geek-xd/components/geek-qrcode/README.md
  9. 205
      components/geek-xd/components/geek-qrcode/geek-qrcode.vue
  10. 1206
      components/geek-xd/components/geek-qrcode/qrcode.js
  11. 84
      components/geek-xd/components/geek-statistic/geek-statistic.vue
  12. 18
      components/geek-xd/types/index.ts
  13. 6
      config.js
  14. 213
      pages.json
  15. 43
      pages/index.vue
  16. 84
      pages/mine.vue
  17. 131
      pages/template.config.js
  18. 65
      pages/template.vue
  19. 13
      pages/wechat/wxpayUtils.js
  20. 130
      pages_geek/pages/code/index.vue
  21. 120
      pages_geek/pages/index/index.vue
  22. 71
      pages_mine/pages/about/index.vue
  23. 642
      pages_mine/pages/avatar/index.vue
  24. 109
      pages_mine/pages/help/index.vue
  25. 132
      pages_mine/pages/info/edit.vue
  26. 53
      pages_mine/pages/info/index.vue
  27. 91
      pages_mine/pages/pwd/index.vue
  28. 104
      pages_mine/pages/setting/index.vue
  29. 148
      pages_qiun/components/card-swiper/card-swiper.vue
  30. 141
      pages_qiun/components/data-center/user-healthy.vue
  31. 200
      pages_qiun/components/data-center/user-operate.vue
  32. 385
      pages_qiun/components/data-center/user-server.vue
  33. 132
      pages_qiun/components/data-center/wechat.vue
  34. 93
      pages_qiun/components/data-progress/data-progress.vue
  35. 1117
      pages_qiun/components/data-table/senior-table.vue
  36. 218
      pages_qiun/components/drop-down/drop-down.vue
  37. 125
      pages_qiun/components/progress-bar/progress-bar.vue
  38. 93
      pages_qiun/components/ranking-list/ranking-list.vue
  39. 186
      pages_qiun/components/text-block/text-block.vue
  40. 600
      pages_qiun/components/uni-calendar/calendar.js
  41. 170
      pages_qiun/components/uni-calendar/uni-calendar-item.vue
  42. 512
      pages_qiun/components/uni-calendar/uni-calendar.vue
  43. 357
      pages_qiun/components/uni-calendar/util.js
  44. 134
      pages_qiun/components/wuc-tab/wuc-tab.vue
  45. 585
      pages_qiun/pages/finance/index.vue
  46. 348
      pages_qiun/pages/main/index.vue
  47. 259
      pages_qiun/pages/school/index.vue
  48. 762
      pages_qiun/pages/sport/index.vue
  49. 170
      pages_qiun/static/js/common.js
  50. 79
      pages_qiun/static/js/config.js
  51. 68
      pages_qiun/static/json/finance/1.json
  52. 33
      pages_qiun/static/json/finance/2.json
  53. 26
      pages_qiun/static/json/school/1.json
  54. 28
      pages_qiun/static/json/school/2.json
  55. 27
      pages_qiun/static/json/school/3.json
  56. 29
      pages_qiun/static/json/school/4.json
  57. 80
      pages_qiun/static/json/sport/1.json
  58. 38
      pages_qiun/static/json/sport/2.json
  59. 22
      pages_qiun/static/json/sport/3.json
  60. 174
      pages_qiun/static/json/sport/4.json
  61. 21
      pages_qiun/static/json/user-healthy/1.json
  62. 34
      pages_qiun/static/json/user-healthy/2.json
  63. 74
      pages_qiun/static/json/user-healthy/3.json
  64. 26
      pages_qiun/static/json/user-healthy/4.json
  65. 57
      pages_qiun/static/json/user-healthy/5.json
  66. 12
      pages_qiun/static/json/user-healthy/6.json
  67. 89
      pages_qiun/static/json/user-healthy/7.json
  68. 22
      pages_qiun/static/json/user-operate/1.json
  69. 35
      pages_qiun/static/json/user-operate/2.json
  70. 35
      pages_qiun/static/json/user-operate/3.json
  71. 61
      pages_qiun/static/json/user-operate/4.json
  72. 88
      pages_qiun/static/json/user-operate/6.json
  73. 25
      pages_qiun/static/json/user-operate/7.json
  74. 36
      pages_qiun/static/json/user-operate/8.json
  75. 26
      pages_qiun/static/json/user-operate/9.json
  76. 62
      pages_qiun/static/json/user-server/1.json
  77. 29
      pages_qiun/static/json/user-server/2.json
  78. 36
      pages_qiun/static/json/user-server/3.json
  79. 32
      pages_qiun/static/json/user-server/4.json
  80. 32
      pages_qiun/static/json/user-server/5.json
  81. 22
      pages_qiun/static/json/wechat/1.json
  82. 50
      pages_qiun/static/json/wechat/2.json
  83. 33
      pages_qiun/static/json/wechat/3.json
  84. 82
      pages_qiun/static/json/wechat/4.json
  85. 92
      pages_qiun/static/json/wechat/5.json
  86. 57
      pages_qiun/static/json/wechat/6.json
  87. 901
      pages_qiun/static/table/characterToPinyin.js
  88. 23
      pages_qiun/static/table/iconfont.wxss
  89. 36
      pages_qiun/static/table/loader.wxss
  90. 36
      pages_qiun/static/table/objEqual.js
  91. 3
      pages_template/common/api.js
  92. 1087
      pages_template/common/classify.data.js
  93. 3
      pages_template/common/config.js
  94. 45
      pages_template/common/demo.scss
  95. 21
      pages_template/common/locales/en.js
  96. 21
      pages_template/common/locales/zh.js
  97. 7
      pages_template/common/mixin.js
  98. 2
      pages_template/common/props.js
  99. 173
      pages_template/pages/address/addSite.vue
  100. 139
      pages_template/pages/address/index.vue

32
api/card.js

@ -2,24 +2,24 @@ import request from '@/utils/request'
// 用户绑定充值卡 // 用户绑定充值卡
export function userBindRechargeNum(rechargeNum) { export function userBindRechargeNum(iccId) {
return request({ return request({
url: '/app/card/userBindRechargeNum', url: '/app/card/userBindIccId',
method: 'get', method: 'get',
params:{ params:{
rechargeNum, iccId,
} }
}) })
} }
// 获取充值卡信息 // 获取充值卡信息
export function getRechargeNum(rechargeNum) { export function getRechargeNum(iccId) {
return request({ return request({
url: '/app/card/getRechargeNum', url: '/app/card/getIccId',
method: 'get', method: 'get',
params:{ params:{
rechargeNum, iccId,
} }
}) })
} }
@ -36,6 +36,19 @@ export function getRealNameUrl(rechargeNum) {
}) })
} }
// 获取充值卡信息
export function getCardByUserId() {
return request({
url: '/app/card/getCardByUserId',
method: 'get',
params:{
}
})
}
// 获取分组套餐 // 获取分组套餐
export function getGroupPackage(thaliGroupId) { export function getGroupPackage(thaliGroupId) {
return request({ return request({
@ -66,9 +79,12 @@ export function getPackageSort() {
} }
// 获取微信用户基本信息 // 获取微信用户基本信息
export function getUserInfo() { export function getUserInfo(code) {
return request({ return request({
url: '/app/card/getUserInfo', url: '/app/card/getUserInfo',
method: 'get' method: 'get',
params:{
code,
}
}) })
} }

8
api/vxPay.js

@ -1,13 +1,7 @@
import request from '@/utils/request' import request from '@/utils/request'
export function vxPay(totalPrice,goodsName,openId,orderNumber) { export function vxPay(data) {
const data = {
totalPrice,
goodsName,
openId,
orderNumber
}
return request({ return request({
url: '/app/vxPay/vxv3pay', url: '/app/vxPay/vxv3pay',
method: 'post', method: 'post',

90
components/geek-xd/components/geek-certificate/geek-certificate.vue

@ -1,90 +0,0 @@
<template>
<view class="upload">
<view class="imagebox">
<view class="imageborder">
<view class="main">
<slot></slot>
</view>
</view>
</view>
<view class="text">
<text>{{ text }}</text>
</view>
</view>
</template>
<script setup>
import { ref } from 'vue';
const text = ref("")
</script>
<style scoped lang="scss">
.upload {
height: 400rpx;
width: 90%;
border-radius: 20rpx;
overflow: hidden;
.imagebox {
height: 80%;
background-color: #eff8ff;
align-items: center;
justify-content: center;
display: flex;
.imageborder {
border: 5px #319fea solid;
position: relative;
width: 70%;
height: 80%;
border-radius: 30rpx;
&::after {
position: absolute;
content: ' ';
background-color: #eff8ff;
height: 80%;
width: 120%;
top: 10%;
left: -10%;
}
&::before {
position: absolute;
content: ' ';
background-color: #eff8ff;
top: -10%;
left: 10%;
height: 120%;
width: 80%;
}
.main {
position: absolute;
background-color: #eff8ff;
top: 5%;
left: 5%;
height: 90%;
width: 90%;
display: flex;
align-items: center;
justify-content: center;
z-index: 2;
}
}
}
.text {
height: 20%;
background-color: #319fea;
display: flex;
justify-content: center;
align-items: center;
text {
color: #ffffff;
}
}
}
</style>

681
components/geek-xd/components/geek-color-picker/geek-color-picker.vue

@ -1,681 +0,0 @@
<template>
<view v-show="show" class="t-wrapper" @touchmove.stop.prevent="moveHandle">
<view class="t-mask" :class="{ active: active }" @click.stop="close"></view>
<view class="t-box" :class="{ active: active }">
<view class="t-header">
<view class="t-header-button" @click="close">取消</view>
<view class="t-header-button confrim" @click="confirm">确认</view>
</view>
<view class="t-color__box"
:style="{ background: 'rgb(' + bgcolor.r + ',' + bgcolor.g + ',' + bgcolor.b + ')' }">
<view class="t-background boxs" @touchstart="touchstart($event, 0)" @touchmove="touchmove($event, 0)"
@touchend="touchend($event, 0)">
<view class="t-color-mask"></view>
<view class="t-pointer" :style="{ top: site[0].top - 8 + 'px', left: site[0].left - 8 + 'px' }"></view>
</view>
</view>
<view class="t-control__box">
<view class="t-control__color">
<view class="t-control__color-content"
:style="{ background: 'rgba(' + rgba.r + ',' + rgba.g + ',' + rgba.b + ',' + rgba.a + ')' }"></view>
</view>
<view class="t-control-box__item">
<view class="t-controller boxs" @touchstart="touchstart($event, 1)" @touchmove="touchmove($event, 1)"
@touchend="touchend($event, 1)">
<view class="t-hue">
<view class="t-circle" :style="{ left: site[1].left - 12 + 'px' }"></view>
</view>
</view>
<view class="t-controller boxs" @touchstart="touchstart($event, 2)" @touchmove="touchmove($event, 2)"
@touchend="touchend($event, 2)">
<view class="t-transparency">
<view class="t-circle" :style="{ left: site[2].left - 12 + 'px' }"></view>
</view>
</view>
</view>
</view>
<view class="t-result__box">
<view v-if="mode" class="t-result__item">
<view class="t-result__box-input">{{ hex }}</view>
<view class="t-result__box-text">HEX</view>
</view>
<template v-else>
<view class="t-result__item">
<view class="t-result__box-input">{{ rgba.r }}</view>
<view class="t-result__box-text">R</view>
</view>
<view class="t-result__item">
<view class="t-result__box-input">{{ rgba.g }}</view>
<view class="t-result__box-text">G</view>
</view>
<view class="t-result__item">
<view class="t-result__box-input">{{ rgba.b }}</view>
<view class="t-result__box-text">B</view>
</view>
<view class="t-result__item">
<view class="t-result__box-input">{{ rgba.a }}</view>
<view class="t-result__box-text">A</view>
</view>
</template>
<view class="t-result__item t-select" @click="select">
<view class="t-result__box-input">
<view>切换</view>
<view>模式</view>
</view>
</view>
</view>
<view class="t-alternative">
<view class="t-alternative__item" v-for="(item, index) in colorList" :key="index">
<view class="t-alternative__item-content"
:style="{ background: 'rgba(' + item.r + ',' + item.g + ',' + item.b + ',' + item.a + ')' }"
@click="selectColor(item)">
</view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
props: {
color: {
type: Object,
default() {
return { r: 0, g: 0, b: 0, a: 0 }
}
},
spareColor: {
type: Array,
default() {
return []
}
}
},
data() {
return {
show: false,
active: false,
// rgba
rgba: { r: 0, g: 0, b: 0, a: 1 },
// hsb
hsb: { h: 0, s: 0, b: 0 },
site: [{ top: 0, left: 0 }, { left: 0 }, { left: 0 }],
index: 0,
bgcolor: { r: 255, g: 0, b: 0, a: 1 },
hex: '#000000',
mode: true,
colorList: [
{ r: 244, g: 67, b: 54, a: 1 },
{ r: 233, g: 30, b: 99, a: 1 },
{ r: 156, g: 39, b: 176, a: 1 },
{ r: 103, g: 58, b: 183, a: 1 },
{ r: 63, g: 81, b: 181, a: 1 },
{ r: 33, g: 150, b: 243, a: 1 },
{ r: 3, g: 169, b: 244, a: 1 },
{ r: 0, g: 188, b: 212, a: 1 },
{ r: 0, g: 150, b: 136, a: 1 },
{ r: 76, g: 175, b: 80, a: 1 },
{ r: 139, g: 195, b: 74, a: 1 },
{ r: 205, g: 220, b: 57, a: 1 },
{ r: 255, g: 235, b: 59, a: 1 },
{ r: 255, g: 193, b: 7, a: 1 },
{ r: 255, g: 152, b: 0, a: 1 },
{ r: 255, g: 87, b: 34, a: 1 },
{ r: 121, g: 85, b: 72, a: 1 },
{ r: 158, g: 158, b: 158, a: 1 },
{ r: 0, g: 0, b: 0, a: 0.5 },
{ r: 0, g: 0, b: 0, a: 0 },
]
};
},
created() {
this.rgba = this.color;
if (this.spareColor.length !== 0) {
this.colorList = this.spareColor;
}
},
methods: {
/**
* 初始化
*/
init() {
// hsb
this.hsb = this.rgbToHex(this.rgba);
this.setValue(this.rgba);
},
moveHandle() { },
open() {
this.show = true;
this.$nextTick(() => {
this.init();
setTimeout(() => {
this.active = true;
setTimeout(() => {
this.getSelectorQuery();
}, 350)
}, 50)
})
},
close() {
this.active = false;
this.$nextTick(() => {
setTimeout(() => {
this.show = false;
}, 500)
})
},
confirm() {
this.close();
this.$emit('confirm', {
rgba: this.rgba,
hex: this.hex
})
},
//
select() {
this.mode = !this.mode
},
//
selectColor(item) {
this.setColorBySelect(item)
},
touchstart(e, index) {
const { pageX, pageY, clientX, clientY } = e.touches[0];
this.pageX = clientX;
this.pageY = clientY;
this.setPosition(this.pageX, this.pageY, index);
},
touchmove(e, index) {
const { pageX, pageY, clientX, clientY } = e.touches[0];
this.moveX = clientX;
this.moveY = clientY;
this.setPosition(this.moveX, this.moveY, index);
},
touchend(e, index) {
},
/**
* 设置位置
*/
setPosition(x, y, index) {
this.index = index;
const {
top,
left,
width,
height
} = this.position[index];
//
this.site[index].left = Math.max(0, Math.min(parseInt(x - left), width));
if (index === 0) {
this.site[index].top = Math.max(0, Math.min(parseInt(y - top), height));
//
this.hsb.s = parseInt((100 * this.site[index].left) / width);
this.hsb.b = parseInt(100 - (100 * this.site[index].top) / height);
this.setColor();
this.setValue(this.rgba);
} else {
this.setControl(index, this.site[index].left);
}
},
/**
* 设置 rgb 颜色
*/
setColor() {
const rgb = this.HSBToRGB(this.hsb);
this.rgba.r = rgb.r;
this.rgba.g = rgb.g;
this.rgba.b = rgb.b;
},
/**
* 设置二进制颜色
* @param {Object} rgb
*/
setValue(rgb) {
this.hex = '#' + this.rgbToHex(rgb);
},
setControl(index, x) {
const {
top,
left,
width,
height
} = this.position[index];
if (index === 1) {
this.hsb.h = parseInt((360 * x) / width);
this.bgcolor = this.HSBToRGB({
h: this.hsb.h,
s: 100,
b: 100
});
this.setColor()
} else {
this.rgba.a = (x / width).toFixed(1);
}
this.setValue(this.rgba);
},
/**
* rgb 二进制 hex
* @param {Object} rgb
*/
rgbToHex(rgb) {
let hex = [rgb.r.toString(16), rgb.g.toString(16), rgb.b.toString(16)];
hex.map(function (str, i) {
if (str.length == 1) {
hex[i] = '0' + str;
}
});
return hex.join('');
},
setColorBySelect(getrgb) {
const {
r,
g,
b,
a
} = getrgb;
let rgb = {}
rgb = {
r: r ? parseInt(r) : 0,
g: g ? parseInt(g) : 0,
b: b ? parseInt(b) : 0,
a: a ? a : 0,
};
this.rgba = rgb;
this.hsb = this.rgbToHsb(rgb);
this.changeViewByHsb();
},
changeViewByHsb() {
const [a, b, c] = this.position;
this.site[0].left = parseInt(this.hsb.s * a.width / 100);
this.site[0].top = parseInt((100 - this.hsb.b) * a.height / 100);
this.setColor(this.hsb.h);
this.setValue(this.rgba);
this.bgcolor = this.HSBToRGB({
h: this.hsb.h,
s: 100,
b: 100
});
this.site[1].left = this.hsb.h / 360 * b.width;
this.site[2].left = this.rgba.a * c.width;
},
/**
* hsb rgb
* @param {Object} 颜色模式 H(hues)表示色相S(saturation)表示饱和度Bbrightness表示亮度
*/
HSBToRGB(hsb) {
let rgb = {};
let h = Math.round(hsb.h);
let s = Math.round((hsb.s * 255) / 100);
let v = Math.round((hsb.b * 255) / 100);
if (s == 0) {
rgb.r = rgb.g = rgb.b = v;
} else {
let t1 = v;
let t2 = ((255 - s) * v) / 255;
let t3 = ((t1 - t2) * (h % 60)) / 60;
if (h == 360) h = 0;
if (h < 60) {
rgb.r = t1;
rgb.b = t2;
rgb.g = t2 + t3;
} else if (h < 120) {
rgb.g = t1;
rgb.b = t2;
rgb.r = t1 - t3;
} else if (h < 180) {
rgb.g = t1;
rgb.r = t2;
rgb.b = t2 + t3;
} else if (h < 240) {
rgb.b = t1;
rgb.r = t2;
rgb.g = t1 - t3;
} else if (h < 300) {
rgb.b = t1;
rgb.g = t2;
rgb.r = t2 + t3;
} else if (h < 360) {
rgb.r = t1;
rgb.g = t2;
rgb.b = t1 - t3;
} else {
rgb.r = 0;
rgb.g = 0;
rgb.b = 0;
}
}
return {
r: Math.round(rgb.r),
g: Math.round(rgb.g),
b: Math.round(rgb.b)
};
},
rgbToHsb(rgb) {
let hsb = {
h: 0,
s: 0,
b: 0
};
let min = Math.min(rgb.r, rgb.g, rgb.b);
let max = Math.max(rgb.r, rgb.g, rgb.b);
let delta = max - min;
hsb.b = max;
hsb.s = max != 0 ? 255 * delta / max : 0;
if (hsb.s != 0) {
if (rgb.r == max) hsb.h = (rgb.g - rgb.b) / delta;
else if (rgb.g == max) hsb.h = 2 + (rgb.b - rgb.r) / delta;
else hsb.h = 4 + (rgb.r - rgb.g) / delta;
} else hsb.h = -1;
hsb.h *= 60;
if (hsb.h < 0) hsb.h = 0;
hsb.s *= 100 / 255;
hsb.b *= 100 / 255;
return hsb;
},
getSelectorQuery() {
const views = uni.createSelectorQuery().in(this);
views
.selectAll('.boxs')
.boundingClientRect(data => {
if (!data || data.length === 0) {
setTimeout(() => this.getSelectorQuery(), 20)
return
}
this.position = data;
// this.site[0].top = data[0].height;
// this.site[0].left = 0;
// this.site[1].left = data[1].width;
// this.site[2].left = data[2].width;
this.setColorBySelect(this.rgba);
})
.exec();
}
},
watch: {
spareColor(newVal) {
this.colorList = newVal;
}
}
};
</script>
<style lang="scss" scoped>
.t-wrapper {
position: fixed;
top: 0;
bottom: 0;
left: 0;
width: 100%;
box-sizing: border-box;
z-index: 9999;
}
.t-box {
width: 100%;
position: absolute;
bottom: 0;
padding: 30upx 0;
padding-top: 0;
background: #fff;
transition: all 0.3s;
transform: translateY(100%);
&.active {
transform: translateY(0%);
}
}
.t-header {
display: flex;
justify-content: space-between;
width: 100%;
height: 100upx;
border-bottom: 1px #eee solid;
box-shadow: 1px 0 2px rgba(0, 0, 0, 0.1);
background: #fff;
}
.t-header-button {
display: flex;
align-items: center;
width: 150upx;
height: 100upx;
font-size: 30upx;
color: #666;
padding-left: 20upx;
&:last-child {
justify-content: flex-end;
padding-right: 20upx;
}
&.confrim {
color: #007AFF;
}
}
.t-mask {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.6);
z-index: -1;
transition: all 0.3s;
opacity: 0;
&.active {
opacity: 1;
}
}
.t-color__box {
position: relative;
height: 400upx;
background: rgb(255, 0, 0);
overflow: hidden;
box-sizing: border-box;
margin: 0 20upx;
margin-top: 20upx;
box-sizing: border-box;
}
.t-background {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(to right, #fff, rgba(255, 255, 255, 0));
}
.t-color-mask {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
width: 100%;
height: 400upx;
background: linear-gradient(to top, #000, rgba(0, 0, 0, 0));
}
.t-pointer {
position: absolute;
bottom: -8px;
left: -8px;
z-index: 2;
width: 15px;
height: 15px;
border: 1px #fff solid;
border-radius: 50%;
}
.t-show-color {
width: 100upx;
height: 50upx;
}
.t-control__box {
margin-top: 50upx;
width: 100%;
display: flex;
padding-left: 20upx;
box-sizing: border-box;
}
.t-control__color {
flex-shrink: 0;
width: 100upx;
height: 100upx;
border-radius: 50%;
background-color: #fff;
background-image: linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee),
linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee);
background-size: 36upx 36upx;
background-position: 0 0, 18upx 18upx;
border: 1px #eee solid;
overflow: hidden;
}
.t-control__color-content {
width: 100%;
height: 100%;
}
.t-control-box__item {
display: flex;
flex-direction: column;
justify-content: space-between;
width: 100%;
padding: 0 30upx;
}
.t-controller {
position: relative;
width: 100%;
height: 16px;
background-color: #fff;
background-image: linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee),
linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee);
background-size: 32upx 32upx;
background-position: 0 0, 16upx 16upx;
}
.t-hue {
width: 100%;
height: 100%;
background: linear-gradient(to right, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%);
}
.t-transparency {
width: 100%;
height: 100%;
background: linear-gradient(to right, rgba(0, 0, 0, 0) 0%, rgb(0, 0, 0));
}
.t-circle {
position: absolute;
top: -2px;
width: 20px;
height: 20px;
box-sizing: border-box;
border-radius: 50%;
background: #fff;
box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.1);
}
.t-result__box {
margin-top: 20upx;
padding: 10upx;
width: 100%;
display: flex;
box-sizing: border-box;
}
.t-result__item {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 10upx;
width: 100%;
box-sizing: border-box;
}
.t-result__box-input {
padding: 10upx 0;
width: 100%;
font-size: 28upx;
box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.1);
color: #999;
text-align: center;
background: #fff;
}
.t-result__box-text {
margin-top: 10upx;
font-size: 28upx;
line-height: 2;
}
.t-select {
flex-shrink: 0;
width: 150upx;
padding: 0 30upx;
.t-result__box-input {
border-radius: 10upx;
border: none;
color: #999;
box-shadow: 1px 1px 2px 1px rgba(0, 0, 0, 0.1);
background: #fff;
&:active {
box-shadow: 0px 0px 1px 0px rgba(0, 0, 0, 0.1);
}
}
}
.t-alternative {
display: flex;
flex-wrap: wrap;
width: 100%;
padding-right: 10upx;
box-sizing: border-box;
}
.t-alternative__item {
margin-left: 12upx;
margin-top: 10upx;
width: 50upx;
height: 50upx;
border-radius: 10upx;
background-color: #fff;
background-image: linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee),
linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee);
background-size: 36upx 36upx;
background-position: 0 0, 18upx 18upx;
border: 1px #eee solid;
overflow: hidden;
&:active {
transition: all 0.3s;
transform: scale(1.1);
}
}
.t-alternative__item-content {
width: 50upx;
height: 50upx;
background: rgba(255, 0, 0, 0.5);
}
</style>

123
components/geek-xd/components/geek-commodity/geek-commodity.vue

@ -1,123 +0,0 @@
<script setup>
const props = defineProps({
img: {
type: String,
default: ''
},
title: {
type: String,
default: ''
},
subTitle: {
type: String,
default: ''
},
price: {
type: Number,
default: 0
},
type: {
type: String,
default: 'line' // line, rect
}
})
</script>
<template>
<view class="card" :class="type" @click="$emit('click')">
<image class="img" :src="img" />
<view class="content">
<view class="title">{{ title }}</view>
<view class="subTitle">{{ subTitle }}</view>
<view class="price">{{ price }}</view>
</view>
</view>
</template>
<style lang="scss" scoped>
.card {
padding: 0;
border-radius: 10px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
height: 240rpx;
width: 700rpx;
padding: 20rpx;
margin: 10rpx;
position: relative;
.img {
height: 200rpx;
width: 200rpx;
}
}
.line {
display: flex;
.content {
height: 200rpx;
padding-left: 20rpx;
.title {
width: 400rpx;
font-size: 35rpx;
}
.subTitle {
width: 400rpx;
height: 90rpx;
margin-top: 10rpx;
font-size: 20rpx;
color: rgb(87, 87, 87);
}
.price {
font-size: 40rpx;
color: red;
width: 400rpx;
}
}
}
.rect {
border-radius: 10px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
height: 500rpx;
width: 350rpx;
padding: 0;
margin: 10rpx;
display: inline-block;
.img {
border-radius: 10px 10px 0 0;
height: 350rpx;
width: 350rpx;
}
.content {
padding: 0 20rpx;
margin: 0;
height: 140rpx;
width: 100%;
display: flex;
flex-direction: column;
justify-content: space-between;
.title {
width: 330rpx;
font-size: 25rpx;
}
.subTitle {
width: 330rpx;
height: 60rpx;
font-size: 20rpx;
color: rgb(87, 87, 87);
}
.price {
font-size: 30rpx;
color: red;
width: 100%;
}
}
}
</style>

72
components/geek-xd/components/geek-menu/geek-menu.vue

@ -1,72 +0,0 @@
<script setup>
import { computed } from 'vue';
const props = defineProps({
icon: {
type: String,
default: ''
},
size: {
type: Number,
default: 80
},
label: {
type: String,
default: "菜单"
},
labelColor: {
type: String,
default: '#515151'
},
type: {
type: String,
default: 'circle'
}
})
const menuStyle = computed(() => {
return {
width: `${props.size + 40}rpx`,
height: `${props.size + 40}rpx`
}
})
const titleStype = computed(() => {
return {
width: `${props.size + 40}rpx`,
color: props.labelColor
}
})
</script>
<template>
<view class="menu" :class="type" :style="menuStyle" @click="$emit('click')">
<image :src="icon" style="width: 100%;height: 100%"></image>
</view>
<view class="title" :style="titleStype">{{ label }}</view>
</template>
<style lang="scss" scoped>
.menu {
padding: 20rpx;
}
.circle {
padding: 20rpx;
border-radius: 100%;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
&:active {
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.8);
}
}
.rect {
padding: 15rpx;
margin-bottom: -15rpx;
&:active {
opacity: 0.5;
}
}
.title {
text-align: center;
}
</style>

221
components/geek-xd/components/geek-order/geek-order.vue

@ -1,221 +0,0 @@
<template>
<view class="geek-card" @click="$emit('click')">
<view class="geek-header">
<view class="geek-shop">{{ shop }} > </view>
<view class="geek-status">{{ status }}</view>
</view>
<view class="geek-content">
<image class="geek-img" :src="img"></image>
<view class="geek-label">{{ label }}</view>
<view class="geek-sum">
<view class="geek-price">
<view class="geek-sum-1">{{ number.integerPart }}</view>
<view class="geek-sum-2">. {{ number.decimalPart }}</view>
</view>
<view class="geek-sum-3"> {{ num }} </view>
</view>
</view>
<view class="geek-footer">
<view class="geek-more" @click="$emit('more')">更多</view>
<view class="geek-buttonGroup">
<view class="geek-btn" @click="$emit('sell')">卖了换钱</view>
<view class="geek-btn" @click="$emit('return')">退换/售后</view>
<view class="geek-buy" @click="$emit('again')">再次购买</view>
</view>
</view>
</view>
</template>
<script setup>
import { computed } from 'vue';
const props = defineProps({
shop: {
type: String,
default: ''
},
status: {
type: String,
default: ''
},
img: {
type: String,
default: ''
},
label: {
type: String,
default: ''
},
price: {
type: Number,
default: 0
},
num: {
type: Number,
default: 0
},
type: {
type: String,
default: 'line'
}
})
const number = computed(() => {
return formatNumber(props.price, 2)
})
function formatNumber(num, place) {
let fixedNum = Number(num).toFixed(place); //
let parts = fixedNum.split('.'); //
let integerPart = parts[0]; //
let decimalPart = parts[1]; //
// 使padStart0
decimalPart = decimalPart.padStart(place, '0');
return {
integerPart, decimalPart
}
}
</script>
<style lang="scss" scoped>
.geek-card {
display: flex;
flex-direction: column;
justify-content: space-between;
position: relative;
padding: 20rpx;
background-color: white;
border: 1rpx solid rgb(183, 183, 183);
border-radius: 20rpx;
height: 360rpx;
width: 700rpx;
margin: 25rpx;
.geek-header {
display: flex;
justify-content: space-between;
height: 60rpx;
width: 100%;
margin-bottom: 6rpx;
.geek-shop {
font-size: 28rpx;
font-weight: 600;
}
.geek-status {
width: 100rpx;
text-align: center;
opacity: 0.5;
font-size: 25rpx;
text-align: end;
}
}
.geek-content {
position: relative;
height: auto;
width: 664rpx;
.geek-img {
border-radius: 30rpx;
height: 170rpx;
width: 170rpx;
display: inline-block;
}
.geek-label {
position: absolute;
top: 40rpx;
left: 178rpx;
width: 350rpx;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
}
.geek-sum {
position: absolute;
top: 44rpx;
right: 20rpx;
width: 150rpx;
height: 84rpx;
.geek-price {
display: flex;
justify-content: flex-end;
font-weight: bold;
.geek-sum-1 {
font-size: 32rpx;
}
.geek-sum-2 {
padding-top: 20rpx;
font-size: 20rpx;
}
}
.geek-sum-3 {
font-size: 20rpx;
text-align: end;
}
}
}
.geek-footer {
display: flex;
justify-content: space-between;
height: 60rpx;
width: 100%;
font-size: 25rpx;
.geek-more {
height: 60rpx;
margin-right: 110rpx;
text-align: center;
line-height: 60rpx;
display: inline-block;
}
.geek-buttonGroup {
height: 60rpx;
display: inline-block;
.geek-btn {
border: 1rpx solid #E9E9E9;
width: 140rpx;
height: 60rpx;
border-radius: 80rpx;
opacity: 0.8;
padding: 10rpx;
margin-right: 10rpx;
text-align: center;
display: inline-block;
}
.geek-buy {
width: 140rpx;
height: 60rpx;
border-radius: 80rpx;
opacity: 0.8;
padding: 10rpx;
text-align: center;
display: inline-block;
color: #F25E53;
border: 1rpx solid #F4DADA;
}
}
}
}
</style>

90
components/geek-xd/components/geek-qrcode/README.md

@ -1,90 +0,0 @@
# uni-app 二维码生成器
改自作者诗小柒的tki-qrcode二维码生成器
### 作者:董玉可
1. H5、微信小程序、支付宝小程序、APP,其它平台的小程序没有测试
2. 使用canvas生成
3. 可设置二维码背景色,前景色,角标色
4. 可设置二维码logo
## 重要的事情说3遍 重要的事情说3遍 重要的事情说3遍
1. IOS、Android真机都可以正常生成二维码
2. 使用的时候出现无法生成二维码或空白的请先github直接打包下载,问题依旧,请github上直接提出问题并配图
3. 有问题请说明问题原因,这样我才好定位,否则我也无法解决
4. 如果此插件有帮助到你请打5分或赞赏我,你的支持是我更新的动力
+ 图片1 是微信小程序真机实测
+ 图片2 是微信小程序模拟实测
+ 图片3 是支付宝小程序模拟器实测
+ 图片4 是安卓真机实测
+ 图片5 H5
### 使用方法
`template` 中使用
```javascript
<view class="qrimg">
<geek-qrcode
ref="qrcode"
:cid="cid"
:val="val"
:size="size"
:unit="unit"
:background="background"
:foreground="foreground"
:pdground="pdground"
:icon="icon"
:iconSize="iconsize"
:lv="lv"
:onval="onval"
:loadMake="loadMake"
:usingComponents="usingComponents"
:showLoading="showLoading"
:loadingText="loadingText"
@result="qrR" />
</view>
```
### 属性
| 属性名 | 类型 | 默认值 | 可选值 | 说明 |
| :-------------- | :-----: | :---------------: | :----: | :-------------------------------------------------------------------------------------------------- |
| cid | String | tki-qrcode-canvas | | canvasId,页面存在多个二维码组件时需设置不同的ID |
| size | Number | 200 | | 生成的二维码大小 |
| unit | String | upx | px | 大小单位尺寸 |
| show | Boolean | true | | 默认使用组件中的image标签显示二维码 |
| val | String | 二维码 | | 要生成的内容 |
| background | String | #000000 | | 二维码背景色 |
| foreground | String | #ffffff | | 二维码前景色 |
| pdground | String | #ffffff | | 二维码角标色 |
| icon | String | | | 二维码图标URL(必须是本地图片,网络图需要先下载至本地) |
| iconSize | Number | 40 | | 二维码图标大小(注意此大小不会跟随二维码size 动态变化,设置时需要注意大小,不要太大,以免无法识别) |
| lv | Number | 3 | | 容错级别(一般不用设置) |
| onval | Boolean | false | | 监听val值变化自动重新生成二维码 |
| loadMake | Boolean | false | | 组件初始化完成后自动生成二维码,val需要有值 |
| usingComponents | Boolean | true | false | 是否使用了自定义组件模式(主要是为了修复非自定义组件模式时 v-if 无法生成二维码的问题) |
| showLoading | Boolean | true | false | 是否显示loading |
| loadingText | String | 二维码生成中 | | loading文字 |
### 方法
| 方法名 | 参数 | 默认值 | 说明 |
| :----------- | :--: | :----: | :-------------------------------------------------- |
| _makeCode() | | | 生成二维码 |
| _clearCode() | | | 清空二维码(清空二维码会触发result回调 返回值为空) |
| _saveCode() | | | 保存二维码到图库 |
### 事件
| 事件名 | 返回值 | 说明 |
| :----- | :----------------------------: | --------------------------------------: |
| result | 生成的图片base64或图片临时地址 | 返回二维码路径 注:_clearCode()后返回空 |
### 感谢
[uni-app](https://uniapp.dcloud.io/ "uni-app")
[qrcode](https://github.com/aralejs/qrcode "qrcode")

205
components/geek-xd/components/geek-qrcode/geek-qrcode.vue

@ -1,205 +0,0 @@
<template xlang="wxml" minapp="mpvue">
<view class="geek-qrcode">
<canvas class="geek-qrcode-canvas" :canvas-id="cid" :style="{width:cpSize+'px',height:cpSize+'px'}" />
<image v-show="show" :src="result" :style="{width:cpSize+'px',height:cpSize+'px'}" />
</view>
</template>
<script>
import QRCode from "./qrcode.js"
let qrcode
export default {
name: "geek-qrcode",
props: {
cid: {
type: String,
default: 'geek-qrcode-canvas'
},
size: {
type: Number,
default: 200
},
unit: {
type: String,
default: 'upx'
},
show: {
type: Boolean,
default: true
},
val: {
type: String,
default: ''
},
background: {
type: String,
default: '#ffffff'
},
foreground: {
type: String,
default: '#000000'
},
pdground: {
type: String,
default: '#000000'
},
icon: {
type: String,
default: ''
},
iconSize: {
type: Number,
default: 40
},
lv: {
type: Number,
default: 3
},
onval: {
type: Boolean,
default: false
},
loadMake: {
type: Boolean,
default: false
},
usingComponents: {
type: Boolean,
default: true
},
showLoading: {
type: Boolean,
default: true
},
loadingText: {
type: String,
default: '二维码生成中'
},
},
data() {
return {
result: '',
}
},
methods: {
_makeCode() {
let that = this
if (!this._empty(this.val)) {
qrcode = new QRCode({
context: that, //
canvasId:that.cid, // canvas-id
usingComponents: that.usingComponents, //
showLoading: that.showLoading, // loading
loadingText: that.loadingText, // loading
text: that.val, //
size: that.cpSize, //
background: that.background, //
foreground: that.foreground, //
pdground: that.pdground, //
correctLevel: that.lv, //
image: that.icon, //
imageSize: that.iconSize,//
cbResult: function (res) { //
that._result(res)
},
});
} else {
uni.showToast({
title: '二维码内容不能为空',
icon: 'none',
duration: 2000
});
}
},
_clearCode() {
this._result('')
qrcode.clear()
},
_saveCode() {
let that = this;
if (this.result != "") {
uni.saveImageToPhotosAlbum({
filePath: that.result,
success: function () {
uni.showToast({
title: '二维码保存成功',
icon: 'success',
duration: 2000
});
}
});
}
},
_result(res) {
this.result = res;
this.$emit('result', res)
},
_empty(v) {
let tp = typeof v,
rt = false;
if (tp == "number" && String(v) == "") {
rt = true
} else if (tp == "undefined") {
rt = true
} else if (tp == "object") {
if (JSON.stringify(v) == "{}" || JSON.stringify(v) == "[]" || v == null) rt = true
} else if (tp == "string") {
if (v == "" || v == "undefined" || v == "null" || v == "{}" || v == "[]") rt = true
} else if (tp == "function") {
rt = false
}
return rt
}
},
watch: {
size: function (n, o) {
if (n != o && !this._empty(n)) {
this.cSize = n
if (!this._empty(this.val)) {
setTimeout(() => {
this._makeCode()
}, 100);
}
}
},
val: function (n, o) {
if (this.onval) {
if (n != o && !this._empty(n)) {
setTimeout(() => {
this._makeCode()
}, 0);
}
}
}
},
computed: {
cpSize() {
if(this.unit == "upx"){
return uni.upx2px(this.size)
}else{
return this.size
}
}
},
mounted: function () {
if (this.loadMake) {
if (!this._empty(this.val)) {
setTimeout(() => {
this._makeCode()
}, 0);
}
}
},
}
</script>
<style>
.geek-qrcode {
position: relative;
}
.geek-qrcode-canvas {
position: fixed;
top: -99999upx;
left: -99999upx;
z-index: -99999;
}
</style>

1206
components/geek-xd/components/geek-qrcode/qrcode.js

File diff suppressed because it is too large

84
components/geek-xd/components/geek-statistic/geek-statistic.vue

@ -1,84 +0,0 @@
<template>
<view :style="labelStyle" class="title">{{ label }}</view>
<view :style="numberStyle" class="number">{{ formatNumber(number,props.place) }}</view>
</template>
<script setup>
import { computed } from 'vue';
const props = defineProps({
label: {
type: String,
default: "订单数量"
},
width: {
type: Number,
default: 300
},
labelColor: {
type: String,
default: '#white'
},
labelSize: {
type: Number,
default: 16
},
number: {
type: Number,
default: 80
},
numberColor: {
type: String,
default: 'red'
},
numberSize: {
type: Number,
default: 20
},
place: {
type: Number,
default: 2
}
})
const labelStyle = computed(() => {
return {
width: `${props.width}rpx`,
color: props.labelColor,
fontSize: `${props.labelSize}px`
}
})
const numberStyle = computed(() => {
return {
width: `${props.width}rpx`,
color: props.numberColor,
fontSize: `${props.numberSize}px`
}
})
function formatNumber(num,place) {
let fixedNum = Number(num).toFixed(place); //
let parts = fixedNum.split('.'); //
let integerPart = parts[0]; //
let decimalPart = parts[1]; //
// 使padStart0
decimalPart = decimalPart.padStart(place, '0');
return integerPart + '.' + decimalPart;
}
</script>
<style lang="scss" scoped>
.title {
text-align: center;
}
.number {
text-align: center;
}
</style>

18
components/geek-xd/types/index.ts

@ -1,18 +0,0 @@
export interface Menu {
icon: string,
label: string
}
export interface Commodity {
img: string,
title: string,
subTitle?: string,
price: number
}
export interface CommodityOrder extends Commodity {
shop: string,
status: string,
num: number,
label?:string
}

6
config.js

@ -2,13 +2,13 @@
const config = { const config = {
// baseUrl: 'https://vue.ruoyi.vip/prod-api', // baseUrl: 'https://vue.ruoyi.vip/prod-api',
// baseUrl: 'http://localhost/prod-api', // baseUrl: 'http://localhost/prod-api',
// baseUrl: 'https://trade.youpin5g.com/dev-api', baseUrl: 'https://trade.youpin5g.com/dev-api',
//cloud后台网关地址 //cloud后台网关地址
baseUrl: 'http://114.55.234.214:8080', // baseUrl: 'http://114.55.234.214:8080',
// 应用信息 // 应用信息
appInfo: { appInfo: {
// 应用名称 // 应用名称
name: "ruoyi-app-vue3", name: "优品物联网卡",
// 应用版本 // 应用版本
version: "1.1.0", version: "1.1.0",
// 应用logo // 应用logo

213
pages.json

@ -14,7 +14,7 @@
{ {
"path": "pages/index", "path": "pages/index",
"style": { "style": {
"navigationBarTitleText": "若依移动端框架", "navigationBarTitleText": "优品物联",
"navigationStyle": "custom" "navigationStyle": "custom"
} }
}, },
@ -24,18 +24,6 @@
"navigationBarTitleText": "登录" "navigationBarTitleText": "登录"
} }
}, },
{
"path": "pages/work",
"style": {
"navigationBarTitleText": "工作台"
}
},
{
"path": "pages/template",
"style": {
"navigationBarTitleText": "模板"
}
},
{ {
"path": "pages/mine", "path": "pages/mine",
"style": { "style": {
@ -55,191 +43,6 @@
} }
} }
], ],
"subPackages": [
{
"root": "pages_mine/pages",
"pages": [
{
"path": "avatar/index",
"style": {
"navigationBarTitleText": "修改头像"
}
},
{
"path": "info/index",
"style": {
"navigationBarTitleText": "个人信息"
}
},
{
"path": "info/edit",
"style": {
"navigationBarTitleText": "编辑资料"
}
},
{
"path": "pwd/index",
"style": {
"navigationBarTitleText": "修改密码"
}
},
{
"path": "setting/index",
"style": {
"navigationBarTitleText": "应用设置"
}
},
{
"path": "help/index",
"style": {
"navigationBarTitleText": "常见问题"
}
},
{
"path": "about/index",
"style": {
"navigationBarTitleText": "关于我们"
}
}
]
},
{
"root": "pages_template/pages",
"pages": [
{
"path": "wxCenter/index",
"style": {
"navigationBarTitleText": "wxCenter 仿微信个人中心",
"navigationStyle": "custom"
}
},
{
"path": "keyboardPay/index",
"style": {
"navigationBarTitleText": "keyboardPay 自定义键盘支付"
}
},
{
"path": "mallMenu/index2",
"style": {
"navigationBarTitleText": "mallMenu-商城分类"
}
},
{
"path": "mallMenu/index1",
"style": {
"navigationBarTitleText": "mallMenu-商城分类"
}
},
{
"path": "coupon/index",
"style": {
"navigationBarTitleText": "coupon-优惠券"
}
},
{
"path": "login/index1",
"style": {
"navigationBarTitleText": "美团登录"
}
},
{
"path": "login/index2",
"style": {
"navigationBarTitleText": "水滴登录"
}
},
{
"path": "citySelect/index",
"style": {
"navigationBarTitleText": "城市选择"
}
},
{
"path": "submitBar/index",
"style": {
"navigationBarTitleText": "提交订单栏"
}
},
{
"path": "comment/index",
"style": {
"navigationBarTitleText": "评论"
}
},
{
"path": "comment/reply",
"style": {
"navigationBarTitleText": "评论详情"
}
},
{
"path": "order/index",
"style": {
"navigationBarTitleText": "订单"
}
},
{
"path": "login/code",
"style": {
"navigationBarTitleText": "登录获取验证码"
}
},
{
"path": "address/index",
"style": {
"navigationBarTitleText": "用户地址"
}
},
{
"path": "address/addSite",
"style": {
"navigationBarTitleText": "添加用户地址"
}
}
]
},
{
"root": "pages_qiun/pages",
"pages": [
{
"path": "sport/index",
"style": {
"pageOrientation": "auto"
}
},
{
"path": "school/index",
"style": {
"pageOrientation": "auto"
}
},
{
"path": "finance/index",
"style": {
"pageOrientation": "auto"
}
},
{
"path": "main/index",
"style": {
"pageOrientation": "auto"
}
}
]
},
{
"root": "pages_geek/pages",
"pages": [
{
"path": "index/index"
},
{
"path": "code/index"
}
]
}
],
"tabBar": { "tabBar": {
"color": "#000000", "color": "#000000",
"selectedColor": "#000000", "selectedColor": "#000000",
@ -252,18 +55,6 @@
"selectedIconPath": "static/images/tabbar/home_.png", "selectedIconPath": "static/images/tabbar/home_.png",
"text": "首页" "text": "首页"
}, },
{
"pagePath": "pages/work",
"iconPath": "static/images/tabbar/work.png",
"selectedIconPath": "static/images/tabbar/work_.png",
"text": "工作台"
},
{
"pagePath": "pages/template",
"iconPath": "static/images/tabbar/work.png",
"selectedIconPath": "static/images/tabbar/work_.png",
"text": "模板"
},
{ {
"pagePath": "pages/mine", "pagePath": "pages/mine",
"iconPath": "static/images/tabbar/mine.png", "iconPath": "static/images/tabbar/mine.png",
@ -274,7 +65,7 @@
}, },
"globalStyle": { "globalStyle": {
"navigationBarTextStyle": "black", "navigationBarTextStyle": "black",
"navigationBarTitleText": "RuoYi", "navigationBarTitleText": "优品物联",
"navigationBarBackgroundColor": "#FFFFFF" "navigationBarBackgroundColor": "#FFFFFF"
} }
} }

43
pages/index.vue

@ -8,32 +8,27 @@
import { onLoad } from '@dcloudio/uni-app'; import { onLoad } from '@dcloudio/uni-app';
import { getUserInfo} from '@/api/card' import { getUserInfo} from '@/api/card'
onLoad(async (options) => {
// #ifdef H5
// search options 便
new URLSearchParams(location.search).forEach((value, key) => { // 使 uni-app onLoad options
options[key] = value; onLoad(() => {
}); const params = new URLSearchParams(window.location.search);
const event = options.event; const code = params.get('code');
const code = options.code; const state = params.get('state');
const state = options.state; console.log('Code:', code);
console.log('State:', state);
console.log('params:', params);
// API 使 code
if (code) { if (code) {
//
getUserInfo(code).then(res => { getUserInfo(code).then(res => {
console.log(res,9) // openid
uni.setStorageSync('openid', res.data.openid); uni.setStorageSync('openid', res.data.openid);
}) }).catch(error => {
} console.error('用户信息获取失败:', error);
// // H5
// let returnUrl = uni.getStorageSync('returnUrl');
// if (returnUrl) {
// uni.removeStorage({key:'returnUrl'});
// location.replace(returnUrl);
// } else {
// uni.switchTab({
// url: '/',
// });
// }
// #endif
}); });
}
});
</script> </script>

84
pages/mine.vue

@ -126,7 +126,7 @@
import { ref, reactive,onMounted } from 'vue'; import { ref, reactive,onMounted } from 'vue';
import modal from "@/plugins/modal"; import modal from "@/plugins/modal";
import { getToken, setToken, removeToken } from "@/utils/auth"; import { getToken, setToken, removeToken } from "@/utils/auth";
import { userBindRechargeNum,getRechargeNum ,getRealNameUrl, getGroupPackage, recharge, getPackageSort} from '@/api/card' import { userBindRechargeNum,getRechargeNum ,getRealNameUrl, getGroupPackage, recharge, getPackageSort, getCardByUserId} from '@/api/card'
import { vxPay } from '@/api/vxPay' import { vxPay } from '@/api/vxPay'
import config from '@/config.js' import config from '@/config.js'
@ -167,33 +167,14 @@ uni.$on('refresh', () => {
avatar.value = userStore.avatar; avatar.value = userStore.avatar;
}) })
console.log(avatar.value)
function handleToInfo() {
uni.navigateTo({
url: '/pages_mine/pages/info/index'
});
};
function handleToEditInfo() {
uni.navigateTo({
url: '/pages_mine/pages/info/edit'
});
};
function handleToSetting() {
uni.navigateTo({
url: '/pages_mine/pages/setting/index'
});
};
function handleToLogin() { function handleToLogin() {
uni.reLaunch({ uni.reLaunch({
url: '/pages/login' url: '/pages/login'
}); });
}; };
function handleToAvatar() {
uni.navigateTo({
url: '/pages_mine/pages/avatar/index'
});
};
function handleLogout() { function handleLogout() {
}; };
function dialogConfirm() { function dialogConfirm() {
@ -227,11 +208,7 @@ function dialogConfirm() {
function dialogClose() { function dialogClose() {
}; };
function handleHelp() {
uni.navigateTo({
url: '/pages_mine/pages/help/index'
});
};
function handleAbout() { function handleAbout() {
const data = {rechargeNum : '1442212701559'} const data = {rechargeNum : '1442212701559'}
@ -246,11 +223,21 @@ function handleBind() {
// rechargeNum.value = '' // rechargeNum.value = ''
}; };
//
function handleGetCardByUserId() {
getCardByUserId().then(res => {
console.log(res,1999)
iccid.value = res.data.card.iccId
endTime.value = res.data.card.createTime
packageName.value = res.data.card.thaliName
})
};
// //
function handleGetCardInfo() { function handleGetCardInfo() {
// const data = rechargeNum.value const data = rechargeNum.value
const data = '89861591292320027863' // const data = '89861591292320027863'
getRechargeNum(data).then(res => { getRechargeNum(data).then(res => {
console.log(res,19) console.log(res,19)
iccid.value = res.data.card.iccId iccid.value = res.data.card.iccId
@ -281,21 +268,19 @@ function handleJump() {
} }
function handleBuilding() { // function handleBuilding() {
const data = rechargeNum.value // const data = rechargeNum.value
getRechargeNum(data).then(res => { // getRechargeNum(data).then(res => {
console.log(res,91) // })
}) // }
}
// //
function getPackageSortList() { function getPackageSortList() {
// const data = rechargeNum.value const data = rechargeNum.value
const data = '89861591292320027863' // const data = '89861591292320027863'
getPackageSort(data).then(res => { getPackageSort(data).then(res => {
console.log(res,911)
leftTab.value.name = res.rows[0].groupName; leftTab.value.name = res.rows[0].groupName;
leftTab.value.thaliGroupId = res.rows[0].id; leftTab.value.thaliGroupId = res.rows[0].id;
@ -350,16 +335,16 @@ function selectPackage(index) {
// , // ,
function purchasePackage() { function purchasePackage() {
const formData = new FormData(); const formData = new FormData();
formData.append('rechargeNum', rechargeNum.value); formData.append('rechargeNum', rechargeNum.value);
formData.append('thaliId', selectedPackage.value.thaliId); formData.append('thaliId', selectedPackage.value.thaliId);
const data = { const data = {
rechargeNum: rechargeNum.value, rechargeNum: rechargeNum.value,
thaliId: selectedPackage.value.thaliId, thaliId: selectedPackage.value.thaliId
} }
console.log(formData,901) console.log(data,901)
recharge(data).then(res =>{ recharge(data).then(res =>{
orderNumber.value = res.data orderNumber.value = res.data
console.log('创建订单成功:', res); console.log('创建订单成功:', res);
@ -378,7 +363,7 @@ function confirmPurchase() {
}; };
vxPay(paymentData).then(res => { vxPay(paymentData).then(res => {
pay(response.data,()=>{ pay(res.data,()=>{
alert("支付成功!") alert("支付成功!")
}) })
// //
@ -388,13 +373,14 @@ function confirmPurchase() {
} }
onMounted(() => { import { onLoad } from '@dcloudio/uni-app';
// const userToken = getToken();
// if (userToken) {
// token.value = userToken;
// }
// console.log(token,1) onLoad(()=> {
let curPage = getCurrentPages();
let route = curPage[curPage.length - 1].route; //
console.log(route,999)
})
onMounted(() => {
handleGetCardInfo() handleGetCardInfo()
getPackageSortList() getPackageSortList()
@ -403,6 +389,8 @@ onMounted(() => {
handleLeftTab(); handleLeftTab();
}, 1000); }, 1000);
handleGetCardByUserId()
}); });
</script> </script>

131
pages/template.config.js

@ -1,131 +0,0 @@
export default [
{
groupName: 'geek组件',
groupName_en: 'Page',
list: [
{
path: '/pages_geek/pages/index/index',
icon: 'wxCenter',
title: '组件展示',
title_en: 'index',
},
{
path: '/pages_geek/pages/code/index',
icon: 'wxCenter',
title: '二维码',
title_en: 'index',
}
]
},
{
groupName: '部件',
groupName_en: 'Parts',
list: [
{
path: '/pages_template/pages/coupon/index',
icon: 'coupon',
title: 'Coupon 优惠券',
title_en: 'Coupon',
},
{
path: '/pages_template/pages/citySelect/index',
icon: 'citySelect',
title: 'CitySelect 城市选择',
title_en: 'CitySelect',
},
{
path: '/pages_template/pages/submitBar/index',
icon: 'submitBar',
title: 'SubmitBar 提交订单栏',
title_en: 'SubmitBar',
},
{
path: '/pages_template/pages/keyboardPay/index',
icon: 'keyboardPay',
title: 'KeyboardPay 自定义键盘支付模板',
title_en: 'KeyboardPay',
},
]
},
{
groupName: '报表',
groupName_en: 'Parts',
list: [
{
path: '/pages_qiun/pages/finance/index',
icon: 'coupon',
title: '财务报告',
title_en: 'finace',
},
{
path: '/pages_qiun/pages/main/index',
icon: 'coupon',
title: '数据报表中心',
title_en: 'main',
},
{
path: '/pages_qiun/pages/school/index',
icon: 'coupon',
title: '智慧教育报表中心',
title_en: 'school',
},
{
path: '/pages_qiun/pages/sport/index',
icon: 'coupon',
title: '运动报告',
title_en: 'sport',
},
]
},
{
groupName: '页面',
groupName_en: 'Page',
list: [
{
path: '/pages_template/pages/wxCenter/index',
icon: 'wxCenter',
title: 'WxCenter 仿微信个人中心',
title_en: 'WxCenter',
},
{
path: '/pages_template/pages/mallMenu/index1',
icon: 'mall_menu_1',
title: 'MallMenu 垂直分类(左右独立)',
title_en: 'MallMenu 1',
}, {
path: '/pages_template/pages/mallMenu/index2',
icon: 'mall_menu_2',
title: 'MallMenu 垂直分类(左右联动)',
title_en: 'MallMenu 2',
}, {
path: '/pages_template/pages/comment/index',
icon: 'comment',
title: 'Comment 评论列表',
title_en: 'Comment',
}, {
path: '/pages_template/pages/order/index',
icon: 'order',
title: 'Order 订单列表',
title_en: 'Order',
},
{
path: '/pages_template/pages/login/index1',
icon: 'login',
title: 'Login 登录界面',
title_en: 'Login',
},
{
path: '/pages_template/pages/login/index2',
icon: 'login',
title: 'Login 水滴登录',
title_en: 'Login',
},
{
path: '/pages_template/pages/address/index',
icon: 'address',
title: 'Address 收货地址',
title_en: 'Address',
},
]
},
]

65
pages/template.vue

@ -1,65 +0,0 @@
<template>
<view class="wrap">
<view class="list-wrap">
<u-cell-group title-bg-color="rgb(243, 244, 246)" :title="getGroupTitle(item)" v-for="(item, index) in list"
:key="index">
<u-cell :titleStyle="{ fontWeight: 500 }" @click="openPage(item1.path)" :title="getFieldTitle(item1)"
v-for="(item1, index1) in item.list" :key="index1">
<template v-slot:icon>
<image class="u-cell-icon" :src="getIcon(item1.icon)" mode="widthFix"></image>
</template>
</u-cell>
</u-cell-group>
</view>
<u-gap height="70"></u-gap>
<!-- <u-tabbar :list="vuex_tabbar" :mid-button="true"></u-tabbar> -->
</view>
</template>
<script>
import list from "./template.config.js";
export default {
data() {
return {
list: list,
// desc: ''
}
},
computed: {
getIcon() {
return path => {
return '../static/uview/demo/' + path + '.png';
return 'https://cdn.uviewui.com/uview/example/' + path + '.png';
}
},
},
methods: {
openPage(path) {
this.$u.route({
url: path
})
},
getGroupTitle(item) {
return item.groupName
},
getFieldTitle(item) {
return item.title
}
}
}
</script>
<style>
/* page {
background-color: rgb(240, 242, 244);
} */
</style>
<style lang="scss" scoped>
.u-cell-icon {
width: 36rpx;
height: 36rpx;
margin-right: 8rpx;
}
</style>

13
pages/wechat/wxpayUtils.js

@ -1,13 +1,14 @@
let pay; let pay;
export default pay=(data,back,error)=> { export default pay=(data,back,error)=> {
//获取后台传入的数据 //获取后台传入的数据
let appId = data.appId; let appId = data.appid;
let timestamp = data.timestamp; let timestamp = data.timeStamp;
let nonceStr = data.nonce_str; let nonceStr = data.nonceStr;
let paySign = data.sign; let paySign = data.paySign;
let signType = data.signType; let signType = data.signType;
let prepay_id = data.prepay_id; let prepay_id = data.prepayId;
// console.log("开始进行微信支付!") console.log("开始进行微信支付!")
console.log('data',data,)
WeixinJSBridge.invoke( WeixinJSBridge.invoke(
'getBrandWCPayRequest', { 'getBrandWCPayRequest', {

130
pages_geek/pages/code/index.vue

@ -1,130 +0,0 @@
<template xlang="wxml">
<view class="container">
<view class="qrimg">
<view class="qrimg-i">
<geek-qrcode v-if="ifShow" cid="qrcode1" ref="qrcode" :val="val" :size="size" :unit="unit"
:background="background" :foreground="foreground" :pdground="pdground" :icon="icon" :iconSize="iconsize"
:lv="lv" :onval="onval" :loadMake="loadMake" :usingComponents="true" @result="qrR" />
</view>
<view class="qrimg-i">
<geek-qrcode v-if="ifShow" cid="qrcode2" ref="qrcode2" val="第二个二维码" :size="size" :onval="onval"
:loadMake="loadMake" :usingComponents="true" @result="qrR" />
</view>
</view>
<view class="uni-padding-wrap">
<view class="uni-title">请输入要生成的二维码内容</view>
</view>
<view class="uni-list">
<input class="uni-input" placeholder="请输入要生成的二维码内容" v-model="val" />
</view>
<view class="uni-padding-wrap uni-common-mt">
<view class="uni-title">设置二维码大小</view>
</view>
<view class="body-view">
<slider :value="size" @change="sliderchange" min="50" max="500" show-value />
</view>
<view class="uni-padding-wrap">
<view class="btns">
<button type="primary" @tap="selectIcon">选择二维码图标</button>
<button type="primary" @tap="creatQrcode">生成二维码</button>
<button type="primary" @tap="saveQrcode">保存到图库</button>
<button type="warn" @tap="clearQrcode">清除二维码</button>
<button type="warn" @tap="ifQrcode">显示隐藏二维码</button>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
ifShow: true,
val: '二维码', //
size: 200, //
unit: 'upx', //
background: '#b4e9e2', //
foreground: '#309286', //
pdground: '#32dbc6', //
icon: '', //
iconsize: 40, //
lv: 3, //
onval: false, // val
loadMake: true, //
src: '' // base64
}
},
methods: {
sliderchange(e) {
this.size = e.detail.value
},
creatQrcode() {
this.$refs.qrcode._makeCode()
},
saveQrcode() {
this.$refs.qrcode._saveCode()
},
qrR(res) {
this.src = res
},
clearQrcode() {
this.$refs.qrcode._clearCode()
this.val = ''
},
ifQrcode() {
this.ifShow = !this.ifShow
},
selectIcon() {
let that = this
uni.chooseImage({
count: 1, //9
sizeType: ['original', 'compressed'], //
sourceType: ['album'], //
success: function (res) {
that.icon = res.tempFilePaths[0]
setTimeout(() => {
that.creatQrcode()
}, 100);
// console.log(res.tempFilePaths);
}
});
}
}
}
</script>
<style>
/* @import "../../../common/icon.css"; */
.container {
display: flex;
flex-direction: column;
width: 100%;
}
.qrimg {
display: flex;
justify-content: center;
}
.qrimg-i {
margin-right: 10px;
}
slider {
width: 100%;
}
input {
width: 100%;
margin-bottom: 20upx;
}
.btns {
display: flex;
flex-direction: column;
width: 100%;
}
button {
width: 100%;
margin-top: 10upx;
}</style>

120
pages_geek/pages/index/index.vue

@ -1,120 +0,0 @@
<template>
<uni-section class="mb-10" title="数值板" sub-title="statistic" type="line"></uni-section>
<u-row gutter="0">
<u-col span="6">
<geek-statistic label="订单数量(个)" labelColor="#1f1f1f" :number="0" numberColor="red" />
</u-col>
<u-col span="6">
<geek-statistic label="交易金额(元)" labelColor="#1f1f1f" :number="0" numberColor="red" />
</u-col>
</u-row>
<uni-section class="mb-10" title="菜单" sub-title="menu" type="line"></uni-section>
<u-row>
<u-col :span="2.1" :offset="0.3" v-for="menu, index in menus" :key="index">
<geek-menu v-bind=menu :size="60" @click="modal.msg(menu.label)" type="circle" />
</u-col>
</u-row>
<u-row>
<u-col :span="2.1" :offset="0.3" v-for="menu, index in menus" :key="index">
<geek-menu :icon="menu.icon" :label="menu.label" :size="60" @click="modal.msg(menu.label)" type="rect" />
</u-col>
</u-row>
<uni-section class="mb-10" title="商品列表" sub-title="commodity" type="line"></uni-section>
<geek-commodity v-for="item, index in commodityList" :key="index" v-bind="item" type="line"
@click="modal.msg(item.title)" />
<geek-commodity v-for="item, index in commodityList" :key="index" v-bind="item" type="rect"
@click="modal.msg(item.title)" />
<uni-section class="mb-10" title="订单列表" sub-title="order" type="line"></uni-section>
<geek-order v-for="item, index in orderList" :key="index" v-bind="item" @more="modal.msg('更多')"
@again="modal.msg('再次购买')" @return="modal.msg('退换')" @sell="modal.msg('卖了换钱')"></geek-order>
<uni-section class="mb-10" title="颜色选择器" sub-title="order" type="line"></uni-section>
<geek-color-picker ref="gk" @confirm="getcolor"></geek-color-picker>
<button @click="open()">打开颜色选择器</button>
<uni-section class="mb-10" title="二维码" sub-title="order" type="line"></uni-section>
<geek-qrcode cid="qrcode2" ref="qrcode2" val="二维码" :loadMake="true" />
</template>
<script setup lang="ts">
import { ref, reactive } from 'vue';
import modal from '@/plugins/modal'
import { Commodity, CommodityOrder, Menu } from "@/components/geek-xd/types"
const gk = ref(null)
function open() {
//@ts-ignore
gk.value.open()
}
function getcolor(color: { hex: string, rgba: { r: number, g: number, b: number, a: number } }) {
console.log(color)
}
const menus: Array<Menu> = reactive([
{ icon: "/static/images/icon/rocket.png", label: '抢单' },
{ icon: "/static/images/icon/phone.png", label: '回访' },
{ icon: "/static/images/icon/message.png", label: '消息' },
{ icon: "/static/images/icon/dialogue.png", label: '公告' },
{ icon: "/static/images/icon/knowledge.png", label: '知识库' }
]);
const commodityList: Array<Commodity> = reactive([
{
img: '/static/images/banner/banner01.jpg',
title: '商品1',
subTitle: '商品1简介',
price: 100,
},
{
img: '/static/images/banner/banner02.jpg',
title: '商品2',
subTitle: '商品2简介',
price: 300,
},
{
img: '/static/images/banner/banner03.jpg',
title: '商品3',
subTitle: '商品3简介',
price: 200,
}
])
const orderList: Array<CommodityOrder> = [
{
shop: 'geek自营旗舰店',
status: '完成',
img: '/static/images/banner/banner01.jpg',
title: '商品1',
label: '商品1简介',
price: 100.32,
num: 10
},
{
shop: 'geek自营旗舰店',
status: '已取消',
img: '/static/images/banner/banner03.jpg',
title: '商商商商商商商商商商商商商商商商商商商商商商商商商商商商商商商商商商品3',
label: '商品3简介',
price: 2000.67,
num: 10
},
{
shop: 'geek自营旗舰店',
status: '已取消',
img: '/static/images/banner/banner03.jpg',
title: '商商商商商商商商商商商商商商商商商商商商商商商商商商商商商商商商商商品3',
label: '商品3简介',
price: 10.67,
num: 10
}
]
</script>
<style lang="scss" scoped></style>

71
pages_mine/pages/about/index.vue

@ -1,71 +0,0 @@
<template>
<view class="about-container">
<view class="header-section text-center">
<image style="width: 150rpx;height: 150rpx;" src="/static/logo200.png" mode="widthFix">
</image>
<uni-title type="h2" title="若依移动端"></uni-title>
</view>
<view class="content-section">
<view class="menu-list">
<view class="list-cell list-cell-arrow">
<view class="menu-item-box">
<view>版本信息</view>
<view class="text-right">v{{version}}</view>
</view>
</view>
<view class="list-cell list-cell-arrow">
<view class="menu-item-box">
<view>官方邮箱</view>
<view class="text-right">ruoyi@xx.com</view>
</view>
</view>
<view class="list-cell list-cell-arrow">
<view class="menu-item-box">
<view>服务热线</view>
<view class="text-right">400-999-9999</view>
</view>
</view>
<view class="list-cell list-cell-arrow">
<view class="menu-item-box">
<view>公司网站</view>
<view class="text-right">
<uni-link :href="url" :text="url" showUnderLine="false"></uni-link>
</view>
</view>
</view>
</view>
</view>
<view class="copyright">
<view>Copyright &copy; 2022 ruoyi.vip All Rights Reserved.</view>
</view>
</view>
</template>
<script setup>
import config from '@/config.js'
const url=config.appInfo.site_url;
const version=config.appInfo.version;
</script>
<style lang="scss">
page {
background-color: #f8f8f8;
}
.copyright {
margin-top: 50rpx;
text-align: center;
line-height: 60rpx;
color: #999;
}
.header-section {
display: flex;
padding: 30rpx 0 0;
flex-direction: column;
align-items: center;
}
</style>

642
pages_mine/pages/avatar/index.vue

@ -1,642 +0,0 @@
<template>
<view class="container">
<view class="page-body uni-content-info">
<view class='cropper-content'>
<view v-if="isShowImg" class="uni-corpper"
:style="'width:' + cropperInitW + 'px;height:' + cropperInitH + 'px;background:#000'">
<view class="uni-corpper-content"
:style="'width:' + cropperW + 'px;height:' + cropperH + 'px;left:' + cropperL + 'px;top:' + cropperT + 'px'">
<image :src="imageSrc" :style="'width:' + cropperW + 'px;height:' + cropperH + 'px'"></image>
<view class="uni-corpper-crop-box" @touchstart.stop="contentStartMove"
@touchmove.stop="contentMoveing" @touchend.stop="contentTouchEnd"
:style="'left:' + cutL + 'px;top:' + cutT + 'px;right:' + cutR + 'px;bottom:' + cutB + 'px'">
<view class="uni-cropper-view-box">
<view class="uni-cropper-dashed-h"></view>
<view class="uni-cropper-dashed-v"></view>
<view class="uni-cropper-line-t" data-drag="top" @touchstart.stop="dragStart"
@touchmove.stop="dragMove"></view>
<view class="uni-cropper-line-r" data-drag="right" @touchstart.stop="dragStart"
@touchmove.stop="dragMove"></view>
<view class="uni-cropper-line-b" data-drag="bottom" @touchstart.stop="dragStart"
@touchmove.stop="dragMove"></view>
<view class="uni-cropper-line-l" data-drag="left" @touchstart.stop="dragStart"
@touchmove.stop="dragMove"></view>
<view class="uni-cropper-point point-t" data-drag="top" @touchstart.stop="dragStart"
@touchmove.stop="dragMove"></view>
<view class="uni-cropper-point point-tr" data-drag="topTight"></view>
<view class="uni-cropper-point point-r" data-drag="right" @touchstart.stop="dragStart"
@touchmove.stop="dragMove"></view>
<view class="uni-cropper-point point-rb" data-drag="rightBottom"
@touchstart.stop="dragStart" @touchmove.stop="dragMove"></view>
<view class="uni-cropper-point point-b" data-drag="bottom" @touchstart.stop="dragStart"
@touchmove.stop="dragMove" @touchend.stop="dragEnd"></view>
<view class="uni-cropper-point point-bl" data-drag="bottomLeft"></view>
<view class="uni-cropper-point point-l" data-drag="left" @touchstart.stop="dragStart"
@touchmove.stop="dragMove"></view>
<view class="uni-cropper-point point-lt" data-drag="leftTop"></view>
</view>
</view>
</view>
</view>
</view>
<view class='cropper-config'>
<button type="primary reverse" @click="getImage" style='margin-top: 30rpx;'> 选择头像 </button>
<button type="warn" @click="getImageInfo" style='margin-top: 30rpx;'> 提交 </button>
</view>
<canvas canvas-id="myCanvas"
:style="'position:absolute;border: 1px solid red; width:' + imageW + 'px;height:' + imageH + 'px;top:-9999px;left:-9999px;'"></canvas>
</view>
</view>
</template>
<script>
import config from '@/config'
import { uploadAvatar } from "@/api/system/user"
import useUserStore from '@/store/modules/user'
const baseUrl = config.baseUrl
let sysInfo = uni.getSystemInfoSync()
let SCREEN_WIDTH = sysInfo.screenWidth
let PAGE_X, // x
PAGE_Y, // y
PR = sysInfo.pixelRatio, // dpi
T_PAGE_X, // x
T_PAGE_Y, // Y
CUT_L, // left
CUT_T, // top
CUT_R, //
CUT_B, //
CUT_W, //
CUT_H, //
IMG_RATIO, //
IMG_REAL_W, //
IMG_REAL_H, //
DRAFG_MOVE_RATIO = 1, //,
INIT_DRAG_POSITION = 100, //
DRAW_IMAGE_W = sysInfo.screenWidth //
export default {
/**
* 页面的初始数据
*/
data() {
return {
imageSrc: useUserStore().avatar,
isShowImg: false,
//
cropperInitW: SCREEN_WIDTH,
cropperInitH: SCREEN_WIDTH,
//
cropperW: SCREEN_WIDTH,
cropperH: SCREEN_WIDTH,
// left top
cropperL: 0,
cropperT: 0,
transL: 0,
transT: 0,
//
scaleP: 0,
imageW: 0,
imageH: 0,
//
cutL: 0,
cutT: 0,
cutB: SCREEN_WIDTH,
cutR: '100%',
qualityWidth: DRAW_IMAGE_W,
innerAspectRadio: DRAFG_MOVE_RATIO
}
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
this.loadImage()
},
methods: {
setData: function (obj) {
let that = this
Object.keys(obj).forEach(function (key) {
that.$set(that.$data, key, obj[key])
})
},
getImage: function () {
var _this = this
uni.chooseImage({
success: function (res) {
_this.setData({
imageSrc: res.tempFilePaths[0],
})
_this.loadImage()
},
})
},
loadImage: function () {
var _this = this
uni.getImageInfo({
src: _this.imageSrc,
success: function success(res) {
IMG_RATIO = 1 / 1
if (IMG_RATIO >= 1) {
IMG_REAL_W = SCREEN_WIDTH
IMG_REAL_H = SCREEN_WIDTH / IMG_RATIO
} else {
IMG_REAL_W = SCREEN_WIDTH * IMG_RATIO
IMG_REAL_H = SCREEN_WIDTH
}
let minRange = IMG_REAL_W > IMG_REAL_H ? IMG_REAL_W : IMG_REAL_H
INIT_DRAG_POSITION = minRange > INIT_DRAG_POSITION ? INIT_DRAG_POSITION : minRange
//
if (IMG_RATIO >= 1) {
let cutT = Math.ceil((SCREEN_WIDTH / IMG_RATIO - (SCREEN_WIDTH / IMG_RATIO - INIT_DRAG_POSITION)) / 2)
let cutB = cutT
let cutL = Math.ceil((SCREEN_WIDTH - SCREEN_WIDTH + INIT_DRAG_POSITION) / 2)
let cutR = cutL
_this.setData({
cropperW: SCREEN_WIDTH,
cropperH: SCREEN_WIDTH / IMG_RATIO,
// left right
cropperL: Math.ceil((SCREEN_WIDTH - SCREEN_WIDTH) / 2),
cropperT: Math.ceil((SCREEN_WIDTH - SCREEN_WIDTH / IMG_RATIO) / 2),
cutL: cutL,
cutT: cutT,
cutR: cutR,
cutB: cutB,
//
imageW: IMG_REAL_W,
imageH: IMG_REAL_H,
scaleP: IMG_REAL_W / SCREEN_WIDTH,
qualityWidth: DRAW_IMAGE_W,
innerAspectRadio: IMG_RATIO
})
} else {
let cutL = Math.ceil((SCREEN_WIDTH * IMG_RATIO - (SCREEN_WIDTH * IMG_RATIO)) / 2)
let cutR = cutL
let cutT = Math.ceil((SCREEN_WIDTH - INIT_DRAG_POSITION) / 2)
let cutB = cutT
_this.setData({
cropperW: SCREEN_WIDTH * IMG_RATIO,
cropperH: SCREEN_WIDTH,
// left right
cropperL: Math.ceil((SCREEN_WIDTH - SCREEN_WIDTH * IMG_RATIO) / 2),
cropperT: Math.ceil((SCREEN_WIDTH - SCREEN_WIDTH) / 2),
cutL: cutL,
cutT: cutT,
cutR: cutR,
cutB: cutB,
//
imageW: IMG_REAL_W,
imageH: IMG_REAL_H,
scaleP: IMG_REAL_W / SCREEN_WIDTH,
qualityWidth: DRAW_IMAGE_W,
innerAspectRadio: IMG_RATIO
})
}
_this.setData({
isShowImg: true
})
uni.hideLoading()
}
})
},
// touchStart
contentStartMove(e) {
PAGE_X = e.touches[0].pageX
PAGE_Y = e.touches[0].pageY
},
// touchMove
contentMoveing(e) {
var _this = this
var dragLengthX = (PAGE_X - e.touches[0].pageX) * DRAFG_MOVE_RATIO
var dragLengthY = (PAGE_Y - e.touches[0].pageY) * DRAFG_MOVE_RATIO
//
if (dragLengthX > 0) {
if (this.cutL - dragLengthX < 0) dragLengthX = this.cutL
} else {
if (this.cutR + dragLengthX < 0) dragLengthX = -this.cutR
}
if (dragLengthY > 0) {
if (this.cutT - dragLengthY < 0) dragLengthY = this.cutT
} else {
if (this.cutB + dragLengthY < 0) dragLengthY = -this.cutB
}
this.setData({
cutL: this.cutL - dragLengthX,
cutT: this.cutT - dragLengthY,
cutR: this.cutR + dragLengthX,
cutB: this.cutB + dragLengthY
})
PAGE_X = e.touches[0].pageX
PAGE_Y = e.touches[0].pageY
},
contentTouchEnd() {
},
//
getImageInfo() {
var _this = this
uni.showLoading({
title: '图片生成中...',
})
//
const ctx = uni.createCanvasContext('myCanvas')
ctx.drawImage(_this.imageSrc, 0, 0, IMG_REAL_W, IMG_REAL_H)
ctx.draw(true, () => {
// * canvasT = (_this.cutT / _this.cropperH) * (_this.imageH / pixelRatio)
var canvasW = ((_this.cropperW - _this.cutL - _this.cutR) / _this.cropperW) * IMG_REAL_W
var canvasH = ((_this.cropperH - _this.cutT - _this.cutB) / _this.cropperH) * IMG_REAL_H
var canvasL = (_this.cutL / _this.cropperW) * IMG_REAL_W
var canvasT = (_this.cutT / _this.cropperH) * IMG_REAL_H
uni.canvasToTempFilePath({
x: canvasL,
y: canvasT,
width: canvasW,
height: canvasH,
destWidth: canvasW,
destHeight: canvasH,
quality: 0.5,
canvasId: 'myCanvas',
success: function (res) {
uni.hideLoading()
let data = { name: 'avatarfile', filePath: res.tempFilePath }
uploadAvatar(data).then(response => {
// userStore.avatar = response.imgUrl
/*cloud*/
useUserStore().avatar = baseUrl + response.imgUrl
uni.showToast({ title: "修改成功", icon: 'success' })
uni.$emit('refresh');
uni.navigateBack();
})
}
})
})
},
// touchStart
dragStart(e) {
T_PAGE_X = e.touches[0].pageX
T_PAGE_Y = e.touches[0].pageY
CUT_L = this.cutL
CUT_R = this.cutR
CUT_B = this.cutB
CUT_T = this.cutT
},
// touchMove
dragMove(e) {
var _this = this
var dragType = e.target.dataset.drag
switch (dragType) {
case 'right':
var dragLength = (T_PAGE_X - e.touches[0].pageX) * DRAFG_MOVE_RATIO
if (CUT_R + dragLength < 0) dragLength = -CUT_R
this.setData({
cutR: CUT_R + dragLength
})
break
case 'left':
var dragLength = (T_PAGE_X - e.touches[0].pageX) * DRAFG_MOVE_RATIO
if (CUT_L - dragLength < 0) dragLength = CUT_L
if ((CUT_L - dragLength) > (this.cropperW - this.cutR)) dragLength = CUT_L - (this.cropperW - this.cutR)
this.setData({
cutL: CUT_L - dragLength
})
break
case 'top':
var dragLength = (T_PAGE_Y - e.touches[0].pageY) * DRAFG_MOVE_RATIO
if (CUT_T - dragLength < 0) dragLength = CUT_T
if ((CUT_T - dragLength) > (this.cropperH - this.cutB)) dragLength = CUT_T - (this.cropperH - this.cutB)
this.setData({
cutT: CUT_T - dragLength
})
break
case 'bottom':
var dragLength = (T_PAGE_Y - e.touches[0].pageY) * DRAFG_MOVE_RATIO
if (CUT_B + dragLength < 0) dragLength = -CUT_B
this.setData({
cutB: CUT_B + dragLength
})
break
case 'rightBottom':
var dragLengthX = (T_PAGE_X - e.touches[0].pageX) * DRAFG_MOVE_RATIO
var dragLengthY = (T_PAGE_Y - e.touches[0].pageY) * DRAFG_MOVE_RATIO
if (CUT_B + dragLengthY < 0) dragLengthY = -CUT_B
if (CUT_R + dragLengthX < 0) dragLengthX = -CUT_R
let cutB = CUT_B + dragLengthY
let cutR = CUT_R + dragLengthX
this.setData({
cutB: cutB,
cutR: cutR
})
break
default:
break
}
}
}
}
</script>
<style>
/* pages/uni-cropper/index.wxss */
.cropper-config {
padding: 20rpx 40rpx;
}
.cropper-content {
min-height: 750rpx;
width: 100%;
}
.uni-corpper {
position: relative;
overflow: hidden;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-tap-highlight-color: transparent;
-webkit-touch-callout: none;
box-sizing: border-box;
}
.uni-corpper-content {
position: relative;
}
.uni-corpper-content image {
display: block;
width: 100%;
min-width: 0 !important;
max-width: none !important;
height: 100%;
min-height: 0 !important;
max-height: none !important;
image-orientation: 0deg !important;
margin: 0 auto;
}
/* 移动图片效果 */
.uni-cropper-drag-box {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
cursor: move;
background: rgba(0, 0, 0, 0.6);
z-index: 1;
}
/* 内部的信息 */
.uni-corpper-crop-box {
position: absolute;
background: rgba(255, 255, 255, 0.3);
z-index: 2;
}
.uni-corpper-crop-box .uni-cropper-view-box {
position: relative;
display: block;
width: 100%;
height: 100%;
overflow: visible;
outline: 1rpx solid #69f;
outline-color: rgba(102, 153, 255, .75)
}
/* 横向虚线 */
.uni-cropper-dashed-h {
position: absolute;
top: 33.33333333%;
left: 0;
width: 100%;
height: 33.33333333%;
border-top: 1rpx dashed rgba(255, 255, 255, 0.5);
border-bottom: 1rpx dashed rgba(255, 255, 255, 0.5);
}
/* 纵向虚线 */
.uni-cropper-dashed-v {
position: absolute;
left: 33.33333333%;
top: 0;
width: 33.33333333%;
height: 100%;
border-left: 1rpx dashed rgba(255, 255, 255, 0.5);
border-right: 1rpx dashed rgba(255, 255, 255, 0.5);
}
/* 四个方向的线 为了之后的拖动事件*/
.uni-cropper-line-t {
position: absolute;
display: block;
width: 100%;
background-color: #69f;
top: 0;
left: 0;
height: 1rpx;
opacity: 0.1;
cursor: n-resize;
}
.uni-cropper-line-t::before {
content: '';
position: absolute;
top: 50%;
right: 0rpx;
width: 100%;
-webkit-transform: translate3d(0, -50%, 0);
transform: translate3d(0, -50%, 0);
bottom: 0;
height: 41rpx;
background: transparent;
z-index: 11;
}
.uni-cropper-line-r {
position: absolute;
display: block;
background-color: #69f;
top: 0;
right: 0rpx;
width: 1rpx;
opacity: 0.1;
height: 100%;
cursor: e-resize;
}
.uni-cropper-line-r::before {
content: '';
position: absolute;
top: 0;
left: 50%;
width: 41rpx;
-webkit-transform: translate3d(-50%, 0, 0);
transform: translate3d(-50%, 0, 0);
bottom: 0;
height: 100%;
background: transparent;
z-index: 11;
}
.uni-cropper-line-b {
position: absolute;
display: block;
width: 100%;
background-color: #69f;
bottom: 0;
left: 0;
height: 1rpx;
opacity: 0.1;
cursor: s-resize;
}
.uni-cropper-line-b::before {
content: '';
position: absolute;
top: 50%;
right: 0rpx;
width: 100%;
-webkit-transform: translate3d(0, -50%, 0);
transform: translate3d(0, -50%, 0);
bottom: 0;
height: 41rpx;
background: transparent;
z-index: 11;
}
.uni-cropper-line-l {
position: absolute;
display: block;
background-color: #69f;
top: 0;
left: 0;
width: 1rpx;
opacity: 0.1;
height: 100%;
cursor: w-resize;
}
.uni-cropper-line-l::before {
content: '';
position: absolute;
top: 0;
left: 50%;
width: 41rpx;
-webkit-transform: translate3d(-50%, 0, 0);
transform: translate3d(-50%, 0, 0);
bottom: 0;
height: 100%;
background: transparent;
z-index: 11;
}
.uni-cropper-point {
width: 5rpx;
height: 5rpx;
background-color: #69f;
opacity: .75;
position: absolute;
z-index: 3;
}
.point-t {
top: -3rpx;
left: 50%;
margin-left: -3rpx;
cursor: n-resize;
}
.point-tr {
top: -3rpx;
left: 100%;
margin-left: -3rpx;
cursor: n-resize;
}
.point-r {
top: 50%;
left: 100%;
margin-left: -3rpx;
margin-top: -3rpx;
cursor: n-resize;
}
.point-rb {
left: 100%;
top: 100%;
-webkit-transform: translate3d(-50%, -50%, 0);
transform: translate3d(-50%, -50%, 0);
cursor: n-resize;
width: 36rpx;
height: 36rpx;
background-color: #69f;
position: absolute;
z-index: 1112;
opacity: 1;
}
.point-b {
left: 50%;
top: 100%;
margin-left: -3rpx;
margin-top: -3rpx;
cursor: n-resize;
}
.point-bl {
left: 0%;
top: 100%;
margin-left: -3rpx;
margin-top: -3rpx;
cursor: n-resize;
}
.point-l {
left: 0%;
top: 50%;
margin-left: -3rpx;
margin-top: -3rpx;
cursor: n-resize;
}
.point-lt {
left: 0%;
top: 0%;
margin-left: -3rpx;
margin-top: -3rpx;
cursor: n-resize;
}
/* 裁剪框预览内容 */
.uni-cropper-viewer {
position: relative;
width: 100%;
height: 100%;
overflow: hidden;
}
.uni-cropper-viewer image {
position: absolute;
z-index: 2;
}
</style>

109
pages_mine/pages/help/index.vue

@ -1,109 +0,0 @@
<template>
<view class="help-container">
<view v-for="(item, findex) in list" :key="findex" :title="item.title" class="list-title">
<view class="text-title">
<view :class="item.icon"></view>{{ item.title }}
</view>
<view class="childList">
<view v-for="(child, zindex) in item.childList" :key="zindex" class="question" hover-class="hover"
@click="handleText(child)">
<view class="text-item">{{ child.title }}</view>
<view class="line" v-if="zindex !== item.childList.length - 1"></view>
</view>
</view>
</view>
</view>
</template>
<script setup>
import { ref } from "vue";
const list =ref([{
icon: 'iconfont icon-github',
title: '若依问题',
childList: [{
title: '若依开源吗?',
content: '开源'
}, {
title: '若依可以商用吗?',
content: '可以'
}, {
title: '若依官网地址多少?',
content: 'http://ruoyi.vip'
}, {
title: '若依文档地址多少?',
content: 'http://doc.ruoyi.vip'
}]
},
{
icon: 'iconfont icon-help',
title: '其他问题',
childList: [{
title: '如何退出登录?',
content: '请点击[我的] - [应用设置] - [退出登录]即可退出登录',
}, {
title: '如何修改用户头像?',
content: '请点击[我的] - [选择头像] - [点击提交]即可更换用户头像',
}, {
title: '如何修改登录密码?',
content: '请点击[我的] - [应用设置] - [修改密码]即可修改登录密码',
}]
}
])
function handleText(item) {
uni.navigateTo({
url: `/pages/common/textview/index?title=${item.title}&content=${item.content}`
});
}
</script>
<style lang="scss" scoped>
page {
background-color: #f8f8f8;
}
.help-container {
margin-bottom: 100rpx;
padding: 30rpx;
}
.list-title {
margin-bottom: 30rpx;
}
.childList {
background: #ffffff;
box-shadow: 0px 0px 10rpx rgba(193, 193, 193, 0.2);
border-radius: 16rpx;
margin-top: 10rpx;
}
.line {
width: 100%;
height: 1rpx;
background-color: #F5F5F5;
}
.text-title {
color: #303133;
font-size: 32rpx;
font-weight: bold;
margin-left: 10rpx;
.iconfont {
font-size: 16px;
margin-right: 10rpx;
}
}
.text-item {
font-size: 28rpx;
padding: 24rpx;
}
.question {
color: #606266;
font-size: 28rpx;
}
</style>

132
pages_mine/pages/info/edit.vue

@ -1,132 +0,0 @@
<template>
<view class="container">
<view class="example">
<uni-forms ref="form" :model="user" labelWidth="80px">
<uni-forms-item label="用户昵称" name="nickName">
<uni-easyinput v-model="user.nickName" placeholder="请输入昵称" />
</uni-forms-item>
<uni-forms-item label="手机号码" name="phonenumber">
<uni-easyinput v-model="user.phonenumber" placeholder="请输入手机号码" />
</uni-forms-item>
<uni-forms-item label="邮箱" name="email">
<uni-easyinput v-model="user.email" placeholder="请输入邮箱" />
</uni-forms-item>
<uni-forms-item label="性别" name="sex" required>
<uni-data-checkbox v-model="user.sex" :localdata="sexs" />
</uni-forms-item>
</uni-forms>
<button type="primary" @click="submit">提交</button>
</view>
</view>
</template>
<script>
import { getUserProfile } from "@/api/system/user"
import { updateUserProfile } from "@/api/system/user"
export default {
data() {
return {
user: {
nickName: "",
phonenumber: "",
email: "",
sex: ""
},
sexs: [{
text: '男',
value: "0"
}, {
text: '女',
value: "1"
}],
rules: {
nickName: {
rules: [{
required: true,
errorMessage: '用户昵称不能为空'
}]
},
phonenumber: {
rules: [{
required: true,
errorMessage: '手机号码不能为空'
}, {
pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
errorMessage: '请输入正确的手机号码'
}]
},
email: {
rules: [{
required: true,
errorMessage: '邮箱地址不能为空'
}, {
format: 'email',
errorMessage: '请输入正确的邮箱地址'
}]
}
}
}
},
onLoad() {
this.getUser()
},
onReady() {
this.$refs.form.setRules(this.rules)
},
methods: {
getUser() {
getUserProfile().then(response => {
this.user = response.data
})
},
submit(ref) {
this.$refs.form.validate().then(res => {
updateUserProfile(this.user).then(response => {
uni.showToast({
title: '修改成功',
mask: false,
duration: 1000
});
uni.navigateBack();
})
})
}
}
}
</script>
<style lang="scss">
page {
background-color: #ffffff;
}
.example {
padding: 15px;
background-color: #fff;
}
.segmented-control {
margin-bottom: 15px;
}
.button-group {
margin-top: 15px;
display: flex;
justify-content: space-around;
}
.form-item {
display: flex;
align-items: center;
flex: 1;
}
.button {
display: flex;
align-items: center;
height: 35px;
line-height: 35px;
margin-left: 10px;
}
</style>

53
pages_mine/pages/info/index.vue

@ -1,53 +0,0 @@
<template>
<view class="container">
<uni-list>
<uni-list-item showExtraIcon="true" :extraIcon="{ type: 'person-filled' }" title="昵称" :rightText="user.nickName" />
<uni-list-item showExtraIcon="true" :extraIcon="{ type: 'phone-filled' }" title="手机号码"
:rightText="user.phonenumber" />
<uni-list-item showExtraIcon="true" :extraIcon="{ type: 'email-filled' }" title="邮箱" :rightText="user.email" />
<uni-list-item showExtraIcon="true" :extraIcon="{ type: 'auth-filled' }" title="岗位" :rightText="postGroup" />
<uni-list-item showExtraIcon="true" :extraIcon="{ type: 'staff-filled' }" title="角色" :rightText="roleGroup" />
<uni-list-item showExtraIcon="true" :extraIcon="{ type: 'calendar-filled' }" title="创建日期"
:rightText="user.createTime" />
</uni-list>
<u-button @click="register()">绑定微信</u-button>
</view>
</template>
<script setup>
import { getUserProfile } from "@/api/system/user"
import { ref } from "vue";
import modal from "@/plugins/modal"
const user = ref({})
const roleGroup = ref("")
const postGroup = ref("")
function getUser() {
getUserProfile().then(response => {
user.value = response.data
roleGroup.value = response.roleGroup
postGroup.value = response.postGroup
})
}
getUser()
import { wxRegister } from "@/api/oauth"
import { getWxCode } from "@/utils/geek"
function register(){
modal.loading('绑定微信中...')
getWxCode().then(res=>{
wxRegister('miniapp',res).then(res=>{
modal.closeLoading()
})
})
}
</script>
<style lang="scss">
page {
background-color: #ffffff;
}
</style>

91
pages_mine/pages/pwd/index.vue

@ -1,91 +0,0 @@
<template>
<view class="pwd-retrieve-container">
<uni-forms ref="form" :value="user" labelWidth="80px">
<uni-forms-item name="oldPassword" label="旧密码">
<uni-easyinput type="password" v-model="user.oldPassword" placeholder="请输入旧密码" />
</uni-forms-item>
<uni-forms-item name="newPassword" label="新密码">
<uni-easyinput type="password" v-model="user.newPassword" placeholder="请输入新密码" />
</uni-forms-item>
<uni-forms-item name="confirmPassword" label="确认密码">
<uni-easyinput type="password" v-model="user.confirmPassword" placeholder="请确认新密码" />
</uni-forms-item>
<button type="primary" @click="submit">提交</button>
</uni-forms>
</view>
</template>
<script>
import { updateUserPwd } from "@/api/system/user"
export default {
data() {
return {
user: {
oldPassword: undefined,
newPassword: undefined,
confirmPassword: undefined
},
rules: {
oldPassword: {
rules: [{
required: true,
errorMessage: '旧密码不能为空'
}]
},
newPassword: {
rules: [{
required: true,
errorMessage: '新密码不能为空',
},
{
minLength: 6,
maxLength: 20,
errorMessage: '长度在 6 到 20 个字符'
}
]
},
confirmPassword: {
rules: [{
required: true,
errorMessage: '确认密码不能为空'
}, {
validateFunction: (rule, value, data) => data.newPassword === value,
errorMessage: '两次输入的密码不一致'
}
]
}
}
}
},
onReady() {
this.$refs.form.setRules(this.rules)
},
methods: {
submit() {
this.$refs.form.validate().then(res => {
updateUserPwd(this.user.oldPassword, this.user.newPassword).then(response => {
uni.showToast({
title: '修改成功',
mask: false,
duration: 1000
});
uni.navigateBack();
})
})
}
}
}
</script>
<style lang="scss">
page {
background-color: #ffffff;
}
.pwd-retrieve-container {
padding-top: 36rpx;
padding: 15px;
}
</style>

104
pages_mine/pages/setting/index.vue

@ -1,104 +0,0 @@
<template>
<view class="setting-container" :style="{ height: `${windowHeight}px` }">
<view class="menu-list">
<view class="list-cell list-cell-arrow" @click="handleToPwd">
<view class="menu-item-box">
<view class="iconfont icon-password menu-icon"></view>
<view>修改密码</view>
</view>
</view>
<view class="list-cell list-cell-arrow" @click="handleToUpgrade">
<view class="menu-item-box">
<view class="iconfont icon-refresh menu-icon"></view>
<view>检查更新</view>
</view>
</view>
<view class="list-cell list-cell-arrow" @click="handleCleanTmp">
<view class="menu-item-box">
<view class="iconfont icon-clean menu-icon"></view>
<view>清理缓存</view>
</view>
</view>
</view>
<view class="cu-list menu">
<view class="cu-item item-box">
<view class="content text-center" @click="handleLogout">
<text class="text-black">退出登录</text>
</view>
</view>
</view>
</view>
<view>
<uni-popup ref="popup" type="dialog">
<uni-popup-dialog type="info" cancelText="关闭" confirmText="退出" title="通知" content="确定注销并退出系统吗"
@confirm="dialogConfirm" @close="dialogClose">
</uni-popup-dialog>
</uni-popup>
</view>
</template>
<script setup>
import { ref } from "vue";
import useUserStore from '@/store/modules/user'
const userStore = useUserStore()
const windowHeight = ref(uni.getSystemInfoSync().windowHeight);
const popup = ref(null);
function handleToPwd() {
uni.navigateTo({
url: '/pages/mine/pwd/index'
});
};
function handleToUpgrade() {
uni.showToast({
title: '模块建设中~',
mask: false,
icon: "none",
duration: 1000
});
};
function handleCleanTmp() {
uni.showToast({
title: '模块建设中~',
mask: false,
icon: "none",
duration: 1000
});
};
function handleLogout() {
popup.value.open();
};
function dialogConfirm() {
//console.log('----------------------------')
userStore.logOut().then(() => {
uni.reLaunch({
url: '/pages/login'
});
})
};
function dialogClose() {
//console.log('')
};
</script>
<style lang="scss" scoped>
.page {
background-color: #f8f8f8;
}
.item-box {
background-color: #FFFFFF;
margin: 30rpx;
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
padding: 10rpx;
border-radius: 8rpx;
color: #303133;
font-size: 32rpx;
}
</style>

148
pages_qiun/components/card-swiper/card-swiper.vue

@ -1,148 +0,0 @@
<template>
<view>
<view class="top-swiper">
<view class="box">
<view style="height: 44px;"></view>
<swiper class="swiper" :previous-margin="swiper.margin" :next-margin='swiper.margin' :circular="true"
@change="swiperChange">
<swiper-item v-for="(item,index) in card_menu" :key="index" @click="toUrl(item.url)">
<!-- <image class='le-img' :src='item' :class="{'le-active':swiper.index == index}"></image> -->
<view class="le-img" :class="{'le-active':swiper.index == index}">
<view class="img_box">
<image class="card_img" :src="item.img" mode="aspectFill"></image>
</view>
<view class="detail_box">
<view class="title_box">{{item.title}}</view>
<view class="author_box">By:{{item.author}}</view>
</view>
</view>
</swiper-item>
</swiper>
</view>
</view>
</view>
</template>
<script>
import Common from '../../static/js/common'
export default {
props: {
card_menu: {
type: Array,
default: []
}
},
data() {
return {
swiper: {
margin: "150rpx",
index: 0,
list: [
"/static/images/douyin/0.jpg",
"/static/images/douyin/4.jpg",
"/static/images/douyin/7.jpg",
]
}
}
},
components: {
},
mounted() {
},
methods: {
//swiper
swiperChange: function(e) {
this.swiper.index = e.detail.current;
},
toUrl(url){
Common.navigateTo(url);
}
}
}
</script>
<style lang="scss">
.top-swiper {
margin-bottom: 30rpx;
.box {
padding-top: var(--status-bar-height);
box-sizing: content-box;
position: absolute;
z-index: 5;
top: 0;
left: 0;
width: 100%;
height: auto;
}
.swiper {
height: 600rpx;
margin: 0 20rpx;
.le-img {
width: 100%;
height: 100%;
display: block;
transform: scale(0.9);
transition: transform 0.3s ease-in-out 0s;
border-radius: 10px;
background-color: #fff;
overflow: hidden;
&.le-active {
transform: scale(1);
}
.img_box {
width: 100%;
height: 65%;
overflow: hidden;
.card_img {
height: 100%;
width: 100%;
}
}
.detail_box {
width: 100%;
height: 35%;
overflow: hidden;
.title_box {
width: 100%;
text-align: center;
font-size: 40rpx;
margin: 30rpx 0;
}
.author_box {
width: 100%;
text-align: center;
font-size: 30rpx;
position: relative;
height: 80rpx;
line-height: 80rpx;
&::before {
content: "";
height: 1px;
width: 150rpx;
position: absolute;
transform: translateX(-50%);
left: 50%;
top: 0;
background: #000;
}
}
}
}
}
}
</style>

141
pages_qiun/components/data-center/user-healthy.vue

@ -1,141 +0,0 @@
<template>
<view class="content">
<scroll-view v-if="true" scroll-y class="data_body" :style="{height:scrollHeight}">
<!--数据进度条-->
<view class="progress">
<data-progress :progressList="userHealthyLineBar" :borderRadius="20" padMiddle="true"></data-progress>
</view>
<view class="split_line"></view>
<!-- 新增小程序会员趋势-->
<view class="friend_operate">
<text-block :content="baseData"></text-block>
<view class="trend_title">新增小程序会员趋势</view>
<view class="charts-box">
<qiun-data-charts
type="mix"
canvasId="three_a"
:canvas2d="isCanvas2d"
:reshow="delayload"
:opts="{yAxis:{data:[{position: 'left',title: '销售额/万',max:userTrand?userTrand.yAxis[0].max:0,min:userTrand?userTrand.yAxis[0].min:0},{position: 'right',title: '',max:userTrand?userTrand.yAxis[1].max:0,min:userTrand?userTrand.yAxis[1].min:0,unit:'%'}]}}"
:chartData="userTrand"/>
</view>
</view>
<view class="split_line"></view>
<!-- 会员扫码率趋势-->
<view class="friend_operate">
<text-block :content="scanTrand"></text-block>
<view class="trend_title">会员扫码率趋势</view>
<view class="charts-box">
<qiun-data-charts
type="mix"
canvasId="three_b"
:canvas2d="isCanvas2d"
:reshow="delayload"
:opts="{yAxis:{data:[{position: 'left',title: '',max:scanTrandPrecent?scanTrandPrecent.yAxis[0].max:0,min:scanTrandPrecent?scanTrandPrecent.yAxis[0].min:0,unit:'%'}]}}"
:chartData="scanTrandPrecent"/>
</view>
</view>
<view class="split_line"></view>
<!-- 小程序活跃会员占比-->
<view class="friend_operate">
<text-block :content="miniActive"></text-block>
<view class="charts-box">
<qiun-data-charts
type="mix"
canvasId="three_c"
:canvas2d="isCanvas2d"
:reshow="delayload"
:opts="{yAxis:{data:[{position: 'left',title: '销售额/万',max:miniActivePrecent?miniActivePrecent.yAxis[0].max:0,min:miniActivePrecent?miniActivePrecent.yAxis[0].min:0},{position: 'right',title: '',max:miniActivePrecent?miniActivePrecent.yAxis[1].max:0,min:miniActivePrecent?miniActivePrecent.yAxis[1].min:0,unit:'%'}]}}"
:chartData="miniActivePrecent"
/>
</view>
</view>
</scroll-view>
<view v-else class="container padding_stand-big normal_color">
<li class="iconfont icon-cry cry"></li>暂无数据
</view>
</view>
</template>
<script>
import DataProgress from "../data-progress/data-progress.vue"
import userHealthyLineBar from '../../static/json/user-healthy/1.json';
import baseData from '../../static/json/user-healthy/2.json';
import userTrand from '../../static/json/user-healthy/3.json';
import scanTrand from '../../static/json/user-healthy/4.json';
import scanTrandPrecent from '../../static/json/user-healthy/5.json';
import miniActive from '../../static/json/user-healthy/6.json';
import miniActivePrecent from '../../static/json/user-healthy/7.json';
import Config from '../../static/js/config'
var _self;
export default {
name:'user-healthy',
props: {
scrollHeight:{
type:String,
default:"600px"
}
},
components:{
DataProgress
},
data() {
return {
userHealthyLineBar,
baseData,
userTrand,
scanTrand,
scanTrandPrecent,
miniActive,
miniActivePrecent,
delayload:false,
isCanvas2d:Config.ISCANVAS2D,
}
},
mounted() {
this.getData();
},
methods:{
async getData(){
uni.showLoading();
await setTimeout(() => {
this.delayload = true;
uni.hideLoading();
}, 1000)
}
}
}
</script>
<style scoped lang="less">
.content{
padding-top: 10rpx;
.progress,.firend_operate{
padding: 0 10rpx;
}
.progress{
margin-bottom: 20rpx;
}
.friend_operate{
padding: 30rpx 10rpx;
.title{
text-align:left;
margin-bottom: 20rpx;
}
.trend_title{
text-align: right;
font-size: 22rpx;
color: #ff9900;
margin-top: 20rpx;
}
}
}
</style>

200
pages_qiun/components/data-center/user-operate.vue

@ -1,200 +0,0 @@
<template>
<view class="content">
<scroll-view v-if="true" scroll-y class="data_body" :style="{height:scrollHeight}">
<!--数据进度条-->
<view class="progress">
<data-progress :progressList="userOperateLineBar" :borderRadius="20" padMiddle="true"></data-progress>
</view>
<view class="split_line"></view>
<!-- 活跃会员-->
<view class="friend_operate">
<view class="title">活跃会员</view>
<text-block :content="userActive"></text-block>
</view>
<!-- 会员消费 -->
<view class="friend_operate" style="padding-bottom: 30rpx;">
<view class="title">会员消费</view>
<text-block :content="userConsume"></text-block>
</view>
<view class="split_line"></view>
<!-- 会员ARPU -->
<view class="friend_operate">
<view class="title">会员ARPU
<text class="font-small">(会员年度平均销售金额)</text>
<text class="trend_title">目标增量{{userARPU.targetAdd}}</text>
</view>
<view class="charts-box">
<qiun-data-charts type="mix"
:chartData="userARPU"
:reshow="delayload"
:canvas2d="isCanvas2d"
canvasId="two_a"
:opts="{yAxis:{data:[{title: '',max:userARPU?userARPU.yAxis[0].max:0,min:userARPU?userARPU.yAxis[0].min:0},{title: '',unit:'%',max:userARPU?userARPU.yAxis[1].max:0,min:userARPU?userARPU.yAxis[1].min:0,position:'right'}]},extra:{markLine:{data:[{value:userARPU?userARPU.target:'',LineColor:'#ff9900',showLabel:true}]}}}"/>
</view>
</view>
<view class="split_line"></view>
<!-- 会员消费频次 -->
<view class="friend_operate">
<view class="title">会员消费频次
<text class="font-middle">()</text>
<text class="trend_title">目标增量{{userARPU.targetAdd}}</text>
</view>
<view class="charts-box">
<qiun-data-charts type="mix"
:chartData="userARPU"
:reshow="delayload"
:canvas2d="isCanvas2d"
canvasId="two_b"
:opts="{yAxis:{data:[{title: '',max:userARPU?userARPU.yAxis[0].max:0,min:userARPU?userARPU.yAxis[0].min:0},{title: '',unit:'%',max:userARPU?userARPU.yAxis[1].max:0,min:userARPU?userARPU.yAxis[1].min:0,position:'right'}]},extra:{markLine:{data:[{value:userARPU?userARPU.target:'',LineColor:'#ff9900',showLabel:true}]}}}"/>
</view>
</view>
<view class="split_line"></view>
<!-- 微客群运营-->
<view class="friend_operate">
<view class="title">活跃会员分布
<text class="font-middle">(最近活跃时间)</text>
</view>
<senior-table :headers="dataTable.headers" :contents="dataTable.contents" :urlCol="dataTable.urlCol" :firstLineFixed="true" :sortCol="dataTable.sortCol" :computedCol="dataTable.computedCol" :formatCol="dataTable.formatCol"></senior-table>
</view>
<view class="split_line"></view>
<!-- X商品脱落率-->
<view class="friend_operate">
<view class="title">
X慢病 商品脱落率
</view>
<view style="display: flex;justify-content: space-between;">
<view v-for="(item,index) in xProductDropPrecent" class="charts-box" style="height: 130px;width: 45%;">
<qiun-data-charts
type="arcbar"
:chartData="item"
:canvasId="'two_c_'+ index"
:canvas2d="true"
:reshow="delayload"
:opts="{title:{name:item.series[0].data * 100 + '%',color:item.series[0].color,fontSize:25},subtitle:{name:item.series[0].name,color:'#666666',fontSize:12}}" />
</view>
</view>
</view>
<!-- 慢病病种脱落率-->
<view class="friend_operate">
<view class="title">慢病病种脱落率
</view>
<view class="charts-box">
<qiun-data-charts type="mix"
:chartData="illnessDropPrecent"
:reshow="delayload"
:canvas2d="true"
canvasId="two_d"
:opts="{yAxis:{data:[{title: ''}]}}"/>
</view>
</view>
<!-- W商品脱落率-->
<view class="friend_operate">
<view class="title">
W保健 商品脱落率
</view>
<view style="display: flex;justify-content: space-between;">
<view v-for="(item,index) in wProductDropPrecent" class="charts-box" style="height: 130px;width: 45%;">
<qiun-data-charts
type="arcbar"
:chartData="item"
:canvasId="'two_e_'+index"
:canvas2d="true"
:reshow="delayload"
:opts="{title:{name:item.series[0].data * 100 + '%',color:item.series[0].color,fontSize:25},subtitle:{name:item.series[0].name,color:'#666666',fontSize:12}}" />
</view>
</view>
</view>
</scroll-view>
<view v-else class="container padding_stand-big normal_color">
<li class="iconfont icon-cry cry"></li>暂无数据
</view>
</view>
</template>
<script>
import DataProgress from "../data-progress/data-progress.vue"
import SeniorTable from "../data-table/senior-table.vue"
import userOperateLineBar from '../../static/json/user-operate/1.json';
import userActive from '../../static/json/user-operate/2.json';
import userConsume from '../../static/json/user-operate/3.json';
import userARPU from '../../static/json/user-operate/4.json';
import dataTable from "../../static/json/user-operate/6.json"
import xProductDropPrecent from '../../static/json/user-operate/7.json';
import wProductDropPrecent from '../../static/json/user-operate/9.json';
import illnessDropPrecent from '../../static/json/user-operate/8.json';
export default {
name:'user-operate',
props: {
scrollHeight:{
type:String,
default:"600px"
}
},
components:{
DataProgress,SeniorTable
},
data() {
return {
userOperateLineBar,
userActive,
userConsume,
userARPU,
xProductDropPrecent,
wProductDropPrecent,
illnessDropPrecent,
dataTable,
delayload:false,
isCanvas2d:Config.ISCANVAS2D
}
},
mounted() {
this.getData();
},
methods:{
async getData(){
uni.showLoading();
await setTimeout(() => {
this.delayload = true;
uni.hideLoading();
}, 1000)
}
}
}
</script>
<style scoped lang="less">
.content{
padding-top: 10rpx;
.progress,.firend_operate{
padding: 0 10rpx;
}
.progress{
margin-bottom: 20rpx;
}
.friend_operate{
padding: 30rpx 20rpx;
.title{
text-align:left;
margin-bottom: 30rpx;
font-size: 40rpx;
}
.trend_title{
float: right;
font-size: 22rpx;
color: #ff9900;
margin-top: 20rpx;
}
}
}
</style>

385
pages_qiun/components/data-center/user-server.vue

@ -1,385 +0,0 @@
<template>
<view class="content">
<scroll-view class="data_body" scroll-y :style="{height:scrollHeight}">
<template v-if="true">
<!-- 会员成长数据-->
<view class="view_item">
<view class="title">会员成长数据</view>
<view class="progress_circle">
<view v-for="(item,index) in CircleData" :key="index" :class="['progress_block','block_'+index]">
<view class="name">{{item.series[0].name}}</view>
<view class="value">{{item.series[0].value}}</view>
<view class="charts-box arcbar" style="height: 180rpx;width: 60%;">
<qiun-data-charts type="arcbar" :chartData="item" :canvasId="'four_a_'+index" :canvas2d="isCanvas2d"
:resshow="delayload"
:opts="{title:{name:item.series[0].precent,color:item.series[0].color,fontSize:15},subtitle:{name:'',color:'#666666',fontSize:12},extra:{arcbar:{backgroundColor:item.series[0].backgroundColor}}}" />
</view>
<view class="planet">
<view class="planet_shadow"></view>
<view class="crater1"></view>
<view class="crater2"></view>
<view class="crater3"></view>
<view class="crater4"></view>
</view>
<view class="star" :class="['star'+index]"></view>
<view class="star pink" :class="['star'+index]"></view>
<view class="star blue" :class="['star'+index]"></view>
<view class="star yellow" :class="['star'+index]"></view>
</view>
</view>
</view>
<view class="split_line"></view>
<!-- 会员数据来源 -->
<view class="friend_operate">
<view class="title">会员数据来源
<text class="font-small" style="color: #ff9900;">(Top5访问来源)</text>
</view>
<view v-if="delayload" class="charts-box">
<qiun-data-charts
type="ring"
canvasId="four_b"
:canvas2d="isCanvas2d"
:resshow="delayload"
:opts="{legend:{position: 'bottom'},title:{name: '',},subtitle: {name: ''}}"
:chartData="ProductRateData"/>
</view>
</view>
<view class="split_line"></view>
<!-- 服务评价概览-->
<view class="friend_operate">
<view class="title">服务评价概览</view>
<text-block :content="ServiceComment"></text-block>
</view>
<!-- 本周会员访问趋势图 -->
<view class="friend_operate">
<view class="title">本周会员访问趋势图</view>
<view v-if="delayload" class="charts-box" style="height: 300px;">
<qiun-data-charts
type="mix"
canvasId="four_c"
:canvas2d="isCanvas2d"
:resshow="delayload"
:opts="{yAxis:{data:[{position: 'left',title: '',min:0,unit:'万'}]}}"
:chartData="TrendData"
/>
</view>
</view>
<view class="split_line"></view>
<!-- 新增会员排行榜 -->
<view class="friend_operate">
<view class="title">新增会员排行榜</view>
<progress-bar :isRank="isRank" :content="RankData" />
</view>
</template>
<template v-else>
<view class="container padding_stand-big normal_color">
<li class="iconfont icon-cry cry"></li>暂无数据
</view>
</template>
</scroll-view>
</view>
</template>
<script>
import ProgressBar from "../progress-bar/progress-bar.vue"
import CircleData from "../../static/json/user-server/1.json"
import ProductRateData from '../../static/json/user-server/2.json';
import TrendData from '../../static/json/user-server/3.json';
import ServiceComment from '../../static/json/user-server/4.json';
import RankData from '../../static/json/user-server/5.json';
import Config from '../../static/js/config'
export default {
name:"user-server",
props:{
scrollHeight:{
type:String,
default:"600px"
}
},
components:{
ProgressBar
},
data(){
return {
CircleData,
TrendData,
ProductRateData,
ServiceComment,
RankData,
isRank:true,
isCanvas2d:Config.ISCANVAS2D,
delayload: false, //
}
},
methods:{
async getData(){
uni.showLoading();
await setTimeout(() => {
this.delayload = true;
uni.hideLoading();
}, 1000)
}
},
mounted() {
this.getData();
}
}
</script>
<style scoped lang="scss">
.content{
padding-top: 10rpx;
}
.data_body{
height: 100%;
text-align: center;
color: #333333;
background-repeat: repeat;
background-color: #ffffff;
.friend_operate{
padding: 30rpx 20rpx;
.title{
text-align:left;
margin-bottom: 30rpx;
font-size: 40rpx;
}
}
.view_item{
padding: 30rpx 20rpx;
.title{
text-align:left;
margin-bottom: 30rpx;
font-size: 40rpx;
}
}
.progress_circle{
display: flex;
flex-wrap: wrap;
justify-content: space-around;
align-items: center;
height: 450rpx;
.progress_block{
width: 45%;
border-radius: 20rpx;
height: 180rpx;
position: relative;
overflow: hidden;
.name{
color: #fff;
font-size: 24rpx;
position: absolute;
top: 20rpx;
left: 10rpx;
max-width: 144rpx;
}
.value{
color: #fff;
font-size: 40rpx;
position: absolute;
top: 64rpx;
left: 10rpx;
max-width: 144rpx;
}
.circle{
position: absolute;
right: 8rpx;
top: 16rpx;
}
.arcbar{
position: absolute;
right: -4rpx;
top: 8rpx;
}
}
.block_0{
background-color: #0FC3FF;
}
.block_1{
background-color: #FF6B8B;
}
.block_2{
background-color: #FFCB1D;
}
.block_3{
background-color: #3BDCAA;
}
}
}
.planet {
width: 60px;
height: 60px;
border-radius: 50%;
background: #333;
position: absolute;
left: -13px;
bottom: -26px;
overflow: hidden;
opacity: 0.5;
z-index: 0;
}
.planet_shadow {
position: absolute;
border-radius: 50%;
height: 100%;
width: 100%;
top: -40%;
right: -10%;
border: 35px solid rgba(0, 0, 0, .15);
}
.crater1,
.crater2,
.crater3,
.crater4 {
position: absolute;
border-radius: 50%;
background: rgba(0, 0, 0, .3);
box-shadow: inset 3px 3px 0 rgba(0, 0, 0, .2);
}
.crater1 {
width: 20px;
height: 20px;
left: 25%;
top: 20%;
}
.crater2 {
width: 10px;
height: 10px;
left: 50%;
top: 60%;
}
.crater3 {
width: 15px;
height: 15px;
left: 30%;
top: 65%;
}
.crater4 {
width: 15px;
height: 15px;
left: 60%;
top: 35%;
}
.star {
display: block;
width: 5px;
height: 5px;
border-radius: 50%;
background: #FFF;
top: 10px;
left: 50px;
position: relative;
transform-origin: 100% 0;
box-shadow: 0 0 5px 5px rgba(255, 255, 255, .3);
opacity: 0;
z-index: 2;
}
.star0{
animation: star-ani 4s infinite ease-out;
}
.star1{
animation: star-ani 5s infinite ease-out;
}
.star2{
animation: star-ani 6s infinite ease-out;
}
.star3{
animation: star-ani 7s infinite ease-out;
}
.star:after {
content: '';
display: block;
top: 20px;
left: 60px;
border: 0px solid #fff;
border-width: 0px 90px 2px 90px;
border-color: transparent transparent transparent rgba(255, 255, 255, .3);
transform: rotate(-45deg) translate3d(1px, 3px, 0);
box-shadow: 0 0 1px 0 rgba(255, 255, 255, .1);
transform-origin: 0% 100%;
animation: shooting-ani 100s infinite ease-out;
}
.pink {
top: 10px;
left: 60px;
background: #ff5a99;
animation-delay: 5s;
-webkit-animation-delay: 5s;
-moz-animation-delay: 5s;
}
.pink:after {
border-color: transparent transparent transparent #ff5a99;
animation-delay: 5s;
-webkit-animation-delay: 5s;
-moz-animation-delay: 5s;
}
.blue {
top: 15px;
left: 70px;
background: cyan;
animation-delay: 7s;
-webkit-animation-delay: 7s;
-moz-animation-delay: 7s;
}
.blue:after {
border-color: 'transpareanimation-delay: 12s';
-webkit-animation-delay: 7s;
-moz-animation-delay: 7s;
animation-delay: 7s;
}
.yellow {
top: 0px;
left: 80px;
background: #ffcd5c;
animation-delay: 5.8s;
}
.yellow:after {
border-color: transparent transparent transparent #ffcd5c;
animation-delay: 5.8s;
}
@keyframes star-ani {
0% {
opacity: 0;
transform: scale(0) rotate(0) translate3d(0, 0, 0);
-webkit-transform: scale(0) rotate(0) translate3d(0, 0, 0);
-moz-transform: scale(0) rotate(0) translate3d(0, 0, 0);
}
50% {
opacity: 0.5;
transform: scale(1) rotate(0) translate3d(-20px, 20px, 0);
-webkit-transform: scale(1) rotate(0) translate3d(-20px, 20px, 0);
-moz-transform: scale(1) rotate(0) translate3d(-20px, 20px, 0);
}
100% {
opacity: 0;
transform: scale(1) rotate(0) translate3d(-30px, 30px, 0);
-webkit-transform: scale(1) rotate(0) translate3d(-30px, 30px, 0);
-moz-transform: scale(1) rotate(0) translate3d(-30px, 30px, 0);
}
}
</style>

132
pages_qiun/components/data-center/wechat.vue

@ -1,132 +0,0 @@
<template>
<view class="content">
<scroll-view v-if="true" scroll-y class="data_body" :style="{height:scrollHeight}">
<!--数据进度条-->
<view class="progress">
<data-progress :progressList="wechatLineBar" :borderRadius="20" padMiddle="true"></data-progress>
</view>
<view class="split_line"></view>
<!-- 微好友运营-->
<view class="friend_operate">
<view class="title">微好友运营</view>
<text-block :content="friendTextBlock"></text-block>
<view style="display: flex;justify-content: space-around;">
<view v-for="(item,index) in panelData" :key="index" class="charts-box"
style="width: 45%;height: 200px;">
<qiun-data-charts type="gauge"
:opts="{title:{name: item.series[0].data * 100 + '%',color: '#24ABFD',offsetY:30},subtitle: {name: item.series[0].name,color: '#666666',fontSize: 15,offsetY:70},extra:{gauge:{type:'progress',width:20,splitLine:{fixRadius:-10,width:15,},}}}"
:chartData="item" :reshow="delayload" :canvas2d="isCanvas2d" :canvasId="'one_a_' + index" />
</view>
</view>
<view class="trend_title">新增微好友&小程序会员趋势</view>
<view class="charts-box">
<qiun-data-charts type="mix" :chartData="friendTrand" :reshow="delayload"
:canvas2d="isCanvas2d" canvasId="one_b" :opts="{yAxis:{data:[{title: ''}]}}" />
</view>
</view>
<view class="split_line"></view>
<!-- 微客群运营-->
<view class="friend_operate">
<view class="title">微客群运营</view>
<text-block :content="friendTextBlock"></text-block>
<view class="trend_title">新增人群&退群人数趋势</view>
<view class="charts-box">
<qiun-data-charts type="mix" :chartData="teamTrand" :reshow="delayload" :canvas2d="isCanvas2d"
canvasId="one_c" :opts="{yAxis:{data:[{title: '',max:teamTrand?teamTrand.yAxis[0].max:0,min:teamTrand?teamTrand.yAxis[0].min:0}]}}" />
</view>
</view>
<view class="split_line"></view>
<!-- 客户联系-->
<view class="friend_operate">
<view class="title">客户联系1对1运营执行</view>
<senior-table :headers="dataTable.headers" :contents="dataTable.contents" :urlCol="dataTable.urlCol" :firstLineFixed="true" :sortCol="dataTable.sortCol"></senior-table>
</view>
</scroll-view>
<view v-else class="container padding_stand-big normal_color">
<li class="iconfont icon-cry cry"></li>暂无数据
</view>
</view>
</template>
<script>
import DataProgress from "../data-progress/data-progress.vue"
import SeniorTable from "../data-table/senior-table.vue"
import wechatLineBar from '../../static/json/wechat/1.json';
import friendTextBlock from '../../static/json/wechat/2.json';
import panelData from '../../static/json/wechat/3.json';
import friendTrand from '../../static/json/wechat/4.json';
import teamTrand from '../../static/json/wechat/5.json';
import dataTable from "../../static/json/wechat/6.json"
import Config from '../../static/js/config'
export default {
name:'wechat',
props: {
scrollHeight:{
type:String,
default:"600px"
}
},
components:{
DataProgress,
SeniorTable,
},
data() {
return {
wechatLineBar,
friendTextBlock,
friendTrand,
panelData,
teamTrand,
dataTable,
scrollTop: 0,
delayload: false,
isCanvas2d: Config.ISCANVAS2D,
}
},
mounted() {
this.getData();
},
methods:{
async getData() {
uni.showLoading();
await setTimeout(() => {
this.delayload = true;
uni.hideLoading();
}, 1000)
}
}
}
</script>
<style scoped lang="less">
.content{
padding-top: 10rpx;
.progress,.firend_operate{
padding: 0 10rpx;
}
.progress{
margin-bottom: 20rpx;
}
.friend_operate{
padding: 30rpx 20rpx;
.title{
text-align:left;
margin-bottom: 30rpx;
font-size: 40rpx;
}
.trend_title{
text-align: right;
font-size: 22rpx;
color: #ff9900;
margin-top: 50rpx;
}
}
}
</style>

93
pages_qiun/components/data-progress/data-progress.vue

@ -1,93 +0,0 @@
<template>
<view class="column">
<view v-for="(item,index) in progressList" :key="index" :class="['row','font-small','progress',padMiddle?'paddingMiddle':'']">
<text class="title">{{item.name}}</text>
<view class="body">
<view class="number">{{item.now?item.now+"/":""}}{{item.expect}} [{{item.value}}%]</view>
<progress :percent="item.value" backgroundColor="#C9C9C9"
:border-radius="borderRadius?borderRadius+'rpx':'0px'"
:color="time"
stroke-width="16" />
</view>
</view>
</view>
</template>
<script>
export default {
name:'data-progress',
props: {
progressList: {
type: Array,
default: ()=> {
return []
}
},
borderRadius:{
type:Number,
default:0
},
padMiddle:{
type:String,
default:"false"
}
},
data() {
return {
time:0
}
},
watch:{
"progressList":{
deep: true,
handler: function(newVal, oldVal) {
this.time = newVal.filter(x=>x.name=="时间进度")[0].value;
}
}
},
created() {
this.time = this.progressList.filter(x=>x.name=="时间进度")[0].value;
}
}
</script>
<style lang="scss">
.paddingMiddle{
padding: 18rpx 10rpx;
}
.progress{
.title{
font-size: 28rpx;
width: 170rpx;
display: flex;
align-items: center;
}
.body{
position: relative;
flex: 1;
.number{
color: #fff;
position: absolute;
z-index: 2;
left: 26rpx;
height: 100%;
display: flex;
align-items: center;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
height: 44rpx;
}
progress{
padding: 6rpx 0;
}
}
}
</style>

1117
pages_qiun/components/data-table/senior-table.vue

File diff suppressed because it is too large

218
pages_qiun/components/drop-down/drop-down.vue

@ -1,218 +0,0 @@
<template>
<div class="dropdown-item">
<!-- selected -->
<view :class="['dropdown-item__selected',listWidth!='150rpx'?'dropdown-item__right':'dropdown-item__left']"
@click="changePopup" :style="{maxWidth:selectWidth}">
<view class="selected__name">{{selectItem.text}}</view>
<view class="selected__icon"
:class="showClass === 'show'? 'up' : 'down'"
>
<li class="iconfont icon-caretdown"></li>
</view>
</view>
<view class="dropdown-item__content" :style="{top: contentTop + 'rpx'}" v-if="showList">
<!-- dropdown -->
<view :class="['list', showClass]" :style="{left: contentLeft>0?contentLeft + 'rpx':'auto',right: contentRight>0?contentRight + 'rpx':'auto',}">
<view class="list__option"
v-for="(item, index) in list" :key="index"
@click="choose(item)">
<view>{{item.text}}</view>
<icon v-if="item.value === value" type="success_no_circle" size="20"/>
</view>
</view>
<!-- dropdown-mask -->
<view :class="['dropdown-mask', showClass]" v-if="showList" @click="closePopup"></view>
</view>
</div>
</template>
<script>
export default {
components: {
},
props: {
value: [Number, String, Object],
list: {
type: Array,
default: ()=> {
return []
}
},
contentTop:{
type:String,
default:"185"
},
contentLeft:{
type:String,
default:"0"
},
contentRight:{
type:String,
default:"0"
},
listWidth:{
type:String,
default:'150rpx'
},
selectWidth:{
type:String,
default:'150rpx'
}
},
data() {
return {
showList: "",
showClass: '',
selectItem: {},
}
},
watch: {
list(newVal,oldVal){
this.selectItem = newVal[0];
}
},
mounted() {
this.showList = this.active;
this.selectItem = this.list[0];
},
methods: {
choose(item) {
if(item.value != "auto"){
this.selectItem = item
}
this.$emit('changeItem', item);
this.closePopup();
},
selectAuto(){
this.selectItem = {text: '指定日期',value: 'auto'};
},
changePopup() {
if(this.showList) {
this.closePopup()
} else {
this.openPopup()
}
},
openPopup() {
setTimeout(() => {
this.showClass = 'show';
this.showList = true;
}, 100);
},
closePopup() {
this.showClass = ''
setTimeout(() => {
this.showList = false
}, 200);
},
close() {
this.showClass = ''
this.showList = false
},
}
}
</script>
<style lang="scss">
li{
list-style-type:none;
}
.dropdown-item__content{
z-index: 10!important;
}
.dropdown-item {
width: 100%;
flex:1;
position: relative;
&__selected {
position: relative;
padding: 10rpx 0;
box-sizing: border-box;
color: #fff;
.selected__name {
font-size: 28rpx;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
.selected__icon {
margin-left: 20rpx;
&.down {
transition: transform .3s;
transform: rotateZ(0);
}
&.up {
transition: transform .3s;
transform: rotateZ(-180deg);
}
}
}
&__left{
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
}
&__right{
display: flex;
flex-direction: row;
justify-content: flex-end;
align-items: center;
}
&__content {
position: fixed;
left: 0;
right: 0;
overflow: hidden;
top: 0;
bottom: 0;
z-index: 1;
.list {
max-height: 400px;
text-align: center;
overflow-y: auto;
position: absolute;
z-index: 1200;
background: #fff;
transform: translateY(-100%);
transition: all .3s;
&.show {
transform: translateY(0);
}
&__option {
font-size:30rpx;
padding: 18rpx;
display: flex;
justify-content: space-between;
color: #303133;
&:not(:last-child) {
border-bottom: 1rpx solid #DDDDDD;
}
}
}
.dropdown-mask {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
transition: all .3s;
z-index: 1100;
&.show {
background:rgba(0,0,0,0.5);
}
}
}
&:not(:last-child):after {
content: ' ';
position: absolute;
width: 2rpx;
top: 36rpx;
bottom: 36rpx;
right: 0;
background: $uni-border-color;
}
}
</style>

125
pages_qiun/components/progress-bar/progress-bar.vue

@ -1,125 +0,0 @@
<template>
<view>
<view v-if="copyContent.length > 0" class="ranking">
<view class="ranking-item" v-for="(content,index) in copyContent" :key="index" :style="{padding:progressPadding+'rpx'}">
<view class="name">{{content.name}}</view>
<view class="progress" >
<text :style="{background:content.background,width:content.width + '%',height:progressWidth+'rpx'}"></text>
</view>
<view class="num">{{content.num}}</view>
</view>
</view>
</view>
</template>
<script>
export default{
name:'ranking-list',
props:{
content:{
type: Array,
default() {
return []
}
},
isPC:{
type:Boolean,
default:false
},
isRank:{
type:Boolean,
default:false
}
},
data(){
return{
progressWidth:24,
progressPadding:10,
maxNumber:0,
culCount:0,
copyContent:[]
}
},
watch:{
content(newV){
this.init()
}
},
methods:{
init(){
this.copyContent = this.deepClone(this.content)
if(this.copyContent && this.copyContent.length >0){
if(this.isRank){
this.copyContent = this.copyContent.sort((a,b) => b.num - a.num);
this.maxNumber = this.copyContent[0].num;
}else{
this.maxNumber = Math.max.apply(Math,this.copyContent.map(item => { return item.num }));
}
this.copyContent.map((item,index) =>{
item.width = this.computeWidth(this.maxNumber,item.num);
});
}
},
computeWidth(max,current){
let num = (current / max) * 100;
return num.toFixed(2);
},
deepClone(obj) {
var cloneObj = new obj.constructor()
if(obj === null) return obj
if(obj instanceof Date) return new Date(obj)
if(obj instanceof RegExp) return new RegExp(obj)
if (typeof obj !== 'object') return obj
for (var i in obj) {
if (obj.hasOwnProperty(i)) {
cloneObj[i] = this.deepClone(obj[i])
}
}
return cloneObj
}
},
mounted() {
if(this.isPC){
this.progressWidth = 40;
this.progressPadding = 30;
}
this.init();
}
}
</script>
<style scoped lang="scss">
.ranking-item{
display: flex;
margin-bottom: 13rpx;
align-content: center;
height: 50rpx;
.name{
padding-right: 10rpx;
color: #868688;
font-size: 20rpx;
flex: 1;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.progress{
flex:5;
text-align: left;
padding-right: 10rpx;
text{
display: inline-block;
border-radius: 30rpx;
vertical-align:top;
}
}
.num{
font-size: 26rpx;
color: #3EB2F5;
flex: 1;
}
}
</style>

93
pages_qiun/components/ranking-list/ranking-list.vue

@ -1,93 +0,0 @@
<template>
<view>
<view class="ranking">
<view class="ranking-item" v-for="(content,index) in content" :key="index">
<view class="name">{{content.name}}</view>
<view class="progress" >
<text :style="{backgroundImage:'linear-gradient(to top right,'+getColor(0,index)+','+getColor(1,index)+')',width:content.width + '%'}"></text>
</view>
<view class="num">{{content.num}}</view>
</view>
</view>
</view>
</template>
<script>
export default{
name:'ranking-list',
props:{
content:{
type: Array,
default() {
return []
}
}
},
methods:{
init(){
if(this.content && this.content.length >0){
this.content = this.content.sort((a,b) => b.num - a.num);
let max = this.content[0].num;
this.content.map((item,index) =>{
item.width = this.computeWidth(max,item.num);
});
this.$emit("updateRanking",this.content)
}
},
computeWidth(max,current){
let num = (current / max) * 100;
return num.toFixed(2);
},
getColor(id,index){
let color = "";
switch(index){
case 0:
color = id == 0 ? "#fff":"#A80BFC";
break;
case 1:
color = id == 0 ? "#fff":"#740CFF";
break;
case 2:
color = id == 0 ? "#fff":"#4A08DC";
break;
default :
color = id == 0 ? "#fff":"#1936DA";
break;
}
return color;
},
},
mounted() {
this.init();
}
}
</script>
<style scoped lang="scss">
.ranking-item{
display: flex;
margin-bottom: 13rpx;
padding: 10rpx;
align-content: center;
.name{
padding-right: 10rpx;
color: #868688;
}
.progress{
flex:5;
text-align: left;
padding-right: 10rpx;
text{
display: inline-block;
height: 100%;
}
}
.num{
font-size: 26rpx;
color: #3EB2F5;
}
}
</style>

186
pages_qiun/components/text-block/text-block.vue

@ -1,186 +0,0 @@
<template>
<view class="text_block">
<template v-for="(item,index) in content">
<view v-if="item.kind == 1" :key="index" :style="{backgroundImage:'linear-gradient(to top right,'+item.background[0]+','+item.background[1]+')'}" :class="[(index+1)%3==0 ? '':'marginRight','kind','kind_one','breathe-blue']">
<view class="view_100" :style="{fontSize:item.content[0].size,color:item.content[0].colorvalue}">{{item.content[0].value}}</view>
<view class="view_100" :style="{fontSize:item.content[1].size,color:item.content[1].colortext}">{{item.content[1].text}}</view>
</view>
<view v-else-if="item.kind == 2" :class="[(index+1)%3==0 ? '':'marginRight','kind','kind_two','breathe-blue']" :style="{backgroundImage:'linear-gradient(to top right,'+item.background[0]+','+item.background+')' ,marginRight:(index+1)%3==0?'0rpx':'40rpx'}">
<view v-for="(content,i) in item.content" :key="i" class="two_1">
<text :style="{fontSize:content.size,color:content.colortext}">{{content.text}}:</text>
<text :style="{fontSize:content.size,color:content.colorvalue}">{{content.value}}</text>
</view>
</view>
<view v-else-if="item.kind == 3" class="kind kind_three breathe-blue" :style="{backgroundImage:'linear-gradient(to top right,'+item.background[0]+','+item.background+')'}">
<view class="view_100" :style="{fontSize:item.content[0].size,color:item.content[0].colorvalue}">{{item.content[0].value}}</view>
<view class="view_100" :style="{fontSize:item.content[1].size,color:item.content[1].colortext}">{{item.content[1].text}}</view>
<view class="three_3 view_100">
<view v-for="(j,i) in 2" :key="i">
<text :style="{fontSize:item.content[i+2].size,color:item.content[i+2].colortext}">{{item.content[i+2].text}}:</text>
<text :style="{fontSize:item.content[i+2].size,color:item.content[i+2].colorvalue}">{{item.content[i+2].value}}</text>
</view>
</view>
</view>
<view v-else-if="item.kind == 4" :class="[(index+1)%3==0 ? '':'marginRight','kind','kind_four','breathe-blue']" :style="{backgroundImage:'linear-gradient(to top right,'+item.background[0]+','+item.background[1]+')',marginRight:(index+1)%3==0?'0rpx':'40rpx'}">
<view class="view_100" :style="{fontSize:item.content[0].size,color:item.content[0].colortext}">{{item.content[0].text}}</view>
<view class="view_100" :style="{fontSize:item.content[1].size,color:item.content[1].colorvalue}">{{item.content[1].value}}</view>
<view class="four_3" :style="{fontSize:item.content[2].size,color:item.content[2].colorvalue}">
<text :style="{fontSize:item.content[3].size,color:item.content[3].colorvalue}">{{item.content[2].text}}</text>
<li v-if="item.content[3].text == 'up'" class="iconfont icon-up icon li_1" :style="{color:item.content[3].colortext}"></li>
<li v-else class="iconfont icon-down icon li_1" :style="{color:item.content[3].colortext}"></li>
<text :style="{fontSize:item.content[3].size,color:item.content[3].colorvalue}">{{item.content[3].value}}</text>
</view>
</view>
<view v-else-if="item.kind == 5" :class="[(index+1)%3==0 ? '':'marginRight','kind','kind_five','breathe-red']" :style="{backgroundImage:'linear-gradient(to top right,'+item.background[0]+','+item.background[1]+')',marginRight:(index+1)%3==0?'0rpx':'40rpx'}">
<view class="view_100" :style="{fontSize:item.content[0].size,color:item.content[0].colortext}">{{item.content[0].text}}</view>
<view class="view_100" :style="{fontSize:item.content[1].size,color:item.content[1].colorvalue}">{{item.content[1].value}}</view>
<view class="five_3 view_100">
<view v-for="(j,i) in 2" :key="i">
<text :style="{fontSize:item.content[j+2].size,color:item.content[j+2].colortext}">{{item.content[j+2].text}}</text>
<text :style="{fontSize:item.content[j+2].size,color:item.content[j+2].colorvalue}">{{item.content[j+2].value}}</text>
</view>
</view>
<view class="five_4">
<text :style="{fontSize:item.content[4].size,color:item.content[4].colortext}">{{item.content[4].text}}</text>
<text :style="{fontSize:item.content[4].size,color:item.content[4].colorvalue}">{{item.content[4].value}}</text>
</view>
</view>
</template>
</view>
</template>
<script>
export default {
props:{
content: {
type: Array,
default: []
},
},
data() {
return {
}
},
methods: {
},
mounted() {
uni.onWindowResize((res) => {
console.log('变化后的窗口宽度=' + res.size.windowWidth)
console.log('变化后的窗口高度=' + res.size.windowHeight)
})
}
}
</script>
<style lang="scss">
.text_block{
display: flex;
width: 100%;
flex-wrap: wrap;
.marginRight{
margin-right: 36rpx!important;
}
.view_100{
width: 100%;
}
.CPT_DYBG {
overflow: hidden;
position: relative;
}
.kind{
width: 24%;
padding: 10rpx;
margin-bottom: 40rpx;
display: flex;
justify-content: center;
flex-wrap: wrap;
border-radius: 16rpx;
margin-left: 16rpx;
box-shadow: -4px 4px 4px #ccc;
position: relative;
}
.kind_one{
border-radius: 10rpx;
}
.kind_two{
border-radius: 10rpx;
}
.kind_three{
border-radius: 16rpx;
width: 300rpx;
margin: 0 auto;
.three_3{
display: flex;
justify-content: space-around;
}
}
.kind_four{
border-radius: 10rpx;
.four_3{
display: flex;
.li_1 {
list-style-type:none;
}
.icon{
margin-top: -8rpx;
transform: scale(0.8);
}
}
}
.kind_five{
border-radius: 20rpx;
.five_3{
view{
width: 100%;
}
}
}
}
// .breathe-blue {
// position:relative;
// color:#fff;
// text-align:center;
// cursor:pointer;
// box-shadow:0 1px 2px rgba(0,0,0,.3);
// overflow:hidden;
// -webkit-animation-timing-function:ease-in-out;
// -webkit-animation-name:breatheblue;
// -webkit-animation-duration:2000ms;
// -webkit-animation-iteration-count:infinite;
// -webkit-animation-direction:alternate;
// }
// @keyframes breatheblue {
// 0% {
// opacity:.8;
// box-shadow:0 1px 2px rgba(62,178,245,0.5);
// }
// 100% {
// opacity:1;
// box-shadow:0 1px 30px rgba(147,116,247,0.6);
// }
// }
// .breathe-red {
// position:relative;
// color:#fff;
// text-align:center;
// cursor:pointer;
// box-shadow:0 1px 2px rgba(0,0,0,.3);
// overflow:hidden;
// -webkit-animation-timing-function:ease-in-out;
// -webkit-animation-name:breathered;
// -webkit-animation-duration:2000ms;
// -webkit-animation-iteration-count:infinite;
// -webkit-animation-direction:alternate;
// }
// @keyframes breathered {
// 0% {
// opacity:.8;
// box-shadow:0 1px 2px rgba(247,126,137,0.5);
// }
// 100% {
// opacity:1;
// box-shadow:0 1px 30px rgba(247,149,59,0.9);
// }
// }
</style>

600
pages_qiun/components/uni-calendar/calendar.js

@ -1,600 +0,0 @@
/**
* @1900-2100区间内的公历农历互转
* @charset UTF-8
* @github https://github.com/jjonline/calendar.js
* @Author Jea杨(JJonline@JJonline.Cn)
* @Time 2014-7-21
* @Time 2016-8-13 Fixed 2033hexAttribution Annals
* @Time 2016-9-25 Fixed lunar LeapMonth Param Bug
* @Time 2017-7-24 Fixed use getTerm Func Param Error.use solar year,NOT lunar year
* @Version 1.0.3
* @公历转农历calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0]
* @农历转公历calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0]
*/
/* eslint-disable */
var calendar = {
/**
* 农历1900-2100的润大小信息表
* @Array Of Property
* @return Hex
*/
lunarInfo: [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2, // 1900-1909
0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977, // 1910-1919
0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, // 1920-1929
0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950, // 1930-1939
0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, // 1940-1949
0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0, // 1950-1959
0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, // 1960-1969
0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6, // 1970-1979
0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, // 1980-1989
0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x05ac0, 0x0ab60, 0x096d5, 0x092e0, // 1990-1999
0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, // 2000-2009
0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, // 2010-2019
0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, // 2020-2029
0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, // 2030-2039
0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0, // 2040-2049
/** Add By JJonline@JJonline.Cn**/
0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0, // 2050-2059
0x0a2e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4, // 2060-2069
0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0, // 2070-2079
0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160, // 2080-2089
0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252, // 2090-2099
0x0d520], // 2100
/**
* 公历每个月份的天数普通表
* @Array Of Property
* @return Number
*/
solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
/**
* 天干地支之天干速查表
* @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"]
* @return Cn string
*/
Gan: ['\u7532', '\u4e59', '\u4e19', '\u4e01', '\u620a', '\u5df1', '\u5e9a', '\u8f9b', '\u58ec', '\u7678'],
/**
* 天干地支之地支速查表
* @Array Of Property
* @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"]
* @return Cn string
*/
Zhi: ['\u5b50', '\u4e11', '\u5bc5', '\u536f', '\u8fb0', '\u5df3', '\u5348', '\u672a', '\u7533', '\u9149', '\u620c', '\u4ea5'],
/**
* 天干地支之地支速查表<=>生肖
* @Array Of Property
* @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"]
* @return Cn string
*/
Animals: ['\u9f20', '\u725b', '\u864e', '\u5154', '\u9f99', '\u86c7', '\u9a6c', '\u7f8a', '\u7334', '\u9e21', '\u72d7', '\u732a'],
/**
* 24节气速查表
* @Array Of Property
* @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"]
* @return Cn string
*/
solarTerm: ['\u5c0f\u5bd2', '\u5927\u5bd2', '\u7acb\u6625', '\u96e8\u6c34', '\u60ca\u86f0', '\u6625\u5206', '\u6e05\u660e', '\u8c37\u96e8', '\u7acb\u590f', '\u5c0f\u6ee1', '\u8292\u79cd', '\u590f\u81f3', '\u5c0f\u6691', '\u5927\u6691', '\u7acb\u79cb', '\u5904\u6691', '\u767d\u9732', '\u79cb\u5206', '\u5bd2\u9732', '\u971c\u964d', '\u7acb\u51ac', '\u5c0f\u96ea', '\u5927\u96ea', '\u51ac\u81f3'],
/**
* 1900-2100各年的24节气日期速查表
* @Array Of Property
* @return 0x string For splice
*/
sTermInfo: ['9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f',
'97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
'97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa',
'97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f',
'b027097bd097c36b0b6fc9274c91aa', '9778397bd19801ec9210c965cc920e', '97b6b97bd19801ec95f8c965cc920f',
'97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd197c36c9210c9274c91aa',
'97b6b97bd19801ec95f8c965cc920e', '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2',
'9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec95f8c965cc920e', '97bcf97c3598082c95f8e1cfcc920f',
'97bd097bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e',
'97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
'97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722',
'9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f',
'97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
'97bcf97c359801ec95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
'97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd097bd07f595b0b6fc920fb0722',
'9778397bd097c36b0b6fc9210c8dc2', '9778397bd19801ec9210c9274c920e', '97b6b97bd19801ec95f8c965cc920f',
'97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e',
'97b6b97bd19801ec95f8c965cc920f', '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2',
'9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bd07f1487f595b0b0bc920fb0722',
'7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
'97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
'97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
'9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f531b0b0bb0b6fb0722',
'7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
'97bcf7f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
'97b6b97bd19801ec9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
'9778397bd097c36b0b6fc9210c91aa', '97b6b97bd197c36c9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722',
'7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e',
'97b6b7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2',
'9778397bd097c36b0b70c9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722',
'7f0e397bd097c35b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721',
'7f0e27f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
'97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
'9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
'7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721',
'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
'97b6b7f0e47f531b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
'9778397bd097c36b0b6fc9210c91aa', '97b6b7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
'7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '977837f0e37f149b0723b0787b0721',
'7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c35b0b6fc9210c8dc2',
'977837f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722',
'7f0e397bd097c35b0b6fc9210c8dc2', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '977837f0e37f14998082b0787b06bd',
'7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
'977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
'7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd',
'7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
'977837f0e37f14998082b0723b06bd', '7f07e7f0e37f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
'7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b0721',
'7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f595b0b0bb0b6fb0722', '7f0e37f0e37f14898082b0723b02d5',
'7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f531b0b0bb0b6fb0722',
'7f0e37f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
'7f0e37f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd',
'7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35',
'7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
'7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f149b0723b0787b0721',
'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0723b06bd',
'7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e37f0e366aa89801eb072297c35',
'7ec967f0e37f14998082b0723b06bd', '7f07e7f0e37f14998083b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
'7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14898082b0723b02d5', '7f07e7f0e37f14998082b0787b0721',
'7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66aa89801e9808297c35', '665f67f0e37f14898082b0723b02d5',
'7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66a449801e9808297c35',
'665f67f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
'7f0e36665b66a449801e9808297c35', '665f67f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd',
'7f07e7f0e47f531b0723b0b6fb0721', '7f0e26665b66a449801e9808297c35', '665f67f0e37f1489801eb072297c35',
'7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722'],
/**
* 数字转中文速查表
* @Array Of Property
* @trans ['日','一','二','三','四','五','六','七','八','九','十']
* @return Cn string
*/
nStr1: ['\u65e5', '\u4e00', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341'],
/**
* 日期转农历称呼速查表
* @Array Of Property
* @trans ['初','十','廿','卅']
* @return Cn string
*/
nStr2: ['\u521d', '\u5341', '\u5eff', '\u5345'],
/**
* 月份转农历称呼速查表
* @Array Of Property
* @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊']
* @return Cn string
*/
nStr3: ['\u6b63', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341', '\u51ac', '\u814a'],
/**
* 返回农历y年一整年的总天数
* @param lunar Year
* @return Number
* @eg:var count = calendar.lYearDays(1987) ;//count=387
*/
lYearDays: function (y) {
var i;
var sum = 348
for (i = 0x8000; i > 0x8; i >>= 1) {
sum += (this.lunarInfo[y - 1900] & i) ? 1 : 0
}
return (sum + this.leapDays(y))
},
/**
* 返回农历y年闰月是哪个月若y年没有闰月 则返回0
* @param lunar Year
* @return Number (0-12)
* @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6
*/
leapMonth: function (y) { // 闰字编码 \u95f0
return (this.lunarInfo[y - 1900] & 0xf)
},
/**
* 返回农历y年闰月的天数 若该年没有闰月则返回0
* @param lunar Year
* @return Number (02930)
* @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29
*/
leapDays: function (y) {
if (this.leapMonth(y)) {
return ((this.lunarInfo[y - 1900] & 0x10000) ? 30 : 29)
}
return (0)
},
/**
* 返回农历y年m月非闰月的总天数计算m为闰月时的天数请使用leapDays方法
* @param lunar Year
* @return Number (-12930)
* @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29
*/
monthDays: function (y, m) {
if (m > 12 || m < 1) {
return -1
}// 月份参数从1至12,参数错误返回-1
return ((this.lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29)
},
/**
* 返回公历(!)y年m月的天数
* @param solar Year
* @return Number (-128293031)
* @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30
*/
solarDays: function (y, m) {
if (m > 12 || m < 1) {
return -1
} // 若参数错误 返回-1
var ms = m - 1
if (ms == 1) { // 2月份的闰平规律测算后确认返回28或29
return (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)) ? 29 : 28)
} else {
return (this.solarMonth[ms])
}
},
/**
* 农历年份转换为干支纪年
* @param lYear 农历年的年份数
* @return Cn string
*/
toGanZhiYear: function (lYear) {
var ganKey = (lYear - 3) % 10
var zhiKey = (lYear - 3) % 12
if (ganKey == 0) ganKey = 10// 如果余数为0则为最后一个天干
if (zhiKey == 0) zhiKey = 12// 如果余数为0则为最后一个地支
return this.Gan[ganKey - 1] + this.Zhi[zhiKey - 1]
},
/**
* 公历月日判断所属星座
* @param cMonth [description]
* @param cDay [description]
* @return Cn string
*/
toAstro: function (cMonth, cDay) {
var s = '\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf'
var arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22]
return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + '\u5ea7'// 座
},
/**
* 传入offset偏移量返回干支
* @param offset 相对甲子的偏移量
* @return Cn string
*/
toGanZhi: function (offset) {
return this.Gan[offset % 10] + this.Zhi[offset % 12]
},
/**
* 传入公历(!)y年获得该年第n个节气的公历日期
* @param y公历年(1900-2100)n二十四节气中的第几个节气(1~24)从n=1(小寒)算起
* @return day Number
* @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春
*/
getTerm: function (y, n) {
if (y < 1900 || y > 2100) {
return -1
}
if (n < 1 || n > 24) {
return -1
}
var _table = this.sTermInfo[y - 1900]
var _info = [
parseInt('0x' + _table.substr(0, 5)).toString(),
parseInt('0x' + _table.substr(5, 5)).toString(),
parseInt('0x' + _table.substr(10, 5)).toString(),
parseInt('0x' + _table.substr(15, 5)).toString(),
parseInt('0x' + _table.substr(20, 5)).toString(),
parseInt('0x' + _table.substr(25, 5)).toString()
]
var _calday = [
_info[0].substr(0, 1),
_info[0].substr(1, 2),
_info[0].substr(3, 1),
_info[0].substr(4, 2),
_info[1].substr(0, 1),
_info[1].substr(1, 2),
_info[1].substr(3, 1),
_info[1].substr(4, 2),
_info[2].substr(0, 1),
_info[2].substr(1, 2),
_info[2].substr(3, 1),
_info[2].substr(4, 2),
_info[3].substr(0, 1),
_info[3].substr(1, 2),
_info[3].substr(3, 1),
_info[3].substr(4, 2),
_info[4].substr(0, 1),
_info[4].substr(1, 2),
_info[4].substr(3, 1),
_info[4].substr(4, 2),
_info[5].substr(0, 1),
_info[5].substr(1, 2),
_info[5].substr(3, 1),
_info[5].substr(4, 2)
]
return parseInt(_calday[n - 1])
},
/**
* 传入农历数字月份返回汉语通俗表示法
* @param lunar month
* @return Cn string
* @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月'
*/
toChinaMonth: function (m) { // 月 => \u6708
if (m > 12 || m < 1) {
return -1
} // 若参数错误 返回-1
var s = this.nStr3[m - 1]
s += '\u6708'// 加上月字
return s
},
/**
* 传入农历日期数字返回汉字表示法
* @param lunar day
* @return Cn string
* @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一'
*/
toChinaDay: function (d) { // 日 => \u65e5
var s
switch (d) {
case 10:
s = '\u521d\u5341';
break
case 20:
s = '\u4e8c\u5341';
break
break
case 30:
s = '\u4e09\u5341';
break
break
default :
s = this.nStr2[Math.floor(d / 10)]
s += this.nStr1[d % 10]
}
return (s)
},
/**
* 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是立春
* @param y year
* @return Cn string
* @eg:var animal = calendar.getAnimal(1987) ;//animal='兔'
*/
getAnimal: function (y) {
return this.Animals[(y - 4) % 12]
},
/**
* 传入阳历年月日获得详细的公历农历object信息 <=>JSON
* @param y solar year
* @param m solar month
* @param d solar day
* @return JSON object
* @eg:console.log(calendar.solar2lunar(1987,11,01));
*/
solar2lunar: function (y, m, d) { // 参数区间1900.1.31~2100.12.31
// 年份限定、上限
if (y < 1900 || y > 2100) {
return -1// undefined转换为数字变为NaN
}
// 公历传参最下限
if (y == 1900 && m == 1 && d < 31) {
return -1
}
// 未传参 获得当天
if (!y) {
var objDate = new Date()
} else {
var objDate = new Date(y, parseInt(m) - 1, d)
}
var i;
var leap = 0;
var temp = 0
// 修正ymd参数
var y = objDate.getFullYear()
var m = objDate.getMonth() + 1
var d = objDate.getDate()
var offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - Date.UTC(1900, 0, 31)) / 86400000
for (i = 1900; i < 2101 && offset > 0; i++) {
temp = this.lYearDays(i)
offset -= temp
}
if (offset < 0) {
offset += temp;
i--
}
// 是否今天
var isTodayObj = new Date()
var isToday = false
if (isTodayObj.getFullYear() == y && isTodayObj.getMonth() + 1 == m && isTodayObj.getDate() == d) {
isToday = true
}
// 星期几
var nWeek = objDate.getDay()
var cWeek = this.nStr1[nWeek]
// 数字表示周几顺应天朝周一开始的惯例
if (nWeek == 0) {
nWeek = 7
}
// 农历年
var year = i
var leap = this.leapMonth(i) // 闰哪个月
var isLeap = false
// 效验闰月
for (i = 1; i < 13 && offset > 0; i++) {
// 闰月
if (leap > 0 && i == (leap + 1) && isLeap == false) {
--i
isLeap = true;
temp = this.leapDays(year) // 计算农历闰月天数
} else {
temp = this.monthDays(year, i)// 计算农历普通月天数
}
// 解除闰月
if (isLeap == true && i == (leap + 1)) {
isLeap = false
}
offset -= temp
}
// 闰月导致数组下标重叠取反
if (offset == 0 && leap > 0 && i == leap + 1) {
if (isLeap) {
isLeap = false
} else {
isLeap = true;
--i
}
}
if (offset < 0) {
offset += temp;
--i
}
// 农历月
var month = i
// 农历日
var day = offset + 1
// 天干地支处理
var sm = m - 1
var gzY = this.toGanZhiYear(year)
// 当月的两个节气
// bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year`
var firstNode = this.getTerm(y, (m * 2 - 1))// 返回当月「节」为几日开始
var secondNode = this.getTerm(y, (m * 2))// 返回当月「节」为几日开始
// 依据12节气修正干支月
var gzM = this.toGanZhi((y - 1900) * 12 + m + 11)
if (d >= firstNode) {
gzM = this.toGanZhi((y - 1900) * 12 + m + 12)
}
// 传入的日期的节气与否
var isTerm = false
var Term = null
if (firstNode == d) {
isTerm = true
Term = this.solarTerm[m * 2 - 2]
}
if (secondNode == d) {
isTerm = true
Term = this.solarTerm[m * 2 - 1]
}
// 日柱 当月一日与 1900/1/1 相差天数
var dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10
var gzD = this.toGanZhi(dayCyclical + d - 1)
// 该日期所属的星座
var astro = this.toAstro(m, d)
return {
'lYear': year,
'lMonth': month,
'lDay': day,
'Animal': this.getAnimal(year),
'IMonthCn': (isLeap ? '\u95f0' : '') + this.toChinaMonth(month),
'IDayCn': this.toChinaDay(day),
'cYear': y,
'cMonth': m,
'cDay': d,
'gzYear': gzY,
'gzMonth': gzM,
'gzDay': gzD,
'isToday': isToday,
'isLeap': isLeap,
'nWeek': nWeek,
'ncWeek': '\u661f\u671f' + cWeek,
'isTerm': isTerm,
'Term': Term,
'astro': astro
}
},
/**
* 传入农历年月日以及传入的月份是否闰月获得详细的公历农历object信息 <=>JSON
* @param y lunar year
* @param m lunar month
* @param d lunar day
* @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可]
* @return JSON object
* @eg:console.log(calendar.lunar2solar(1987,9,10));
*/
lunar2solar: function (y, m, d, isLeapMonth) { // 参数区间1900.1.31~2100.12.1
var isLeapMonth = !!isLeapMonth
var leapOffset = 0
var leapMonth = this.leapMonth(y)
var leapDay = this.leapDays(y)
if (isLeapMonth && (leapMonth != m)) {
return -1
}// 传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同
if (y == 2100 && m == 12 && d > 1 || y == 1900 && m == 1 && d < 31) {
return -1
}// 超出了最大极限值
var day = this.monthDays(y, m)
var _day = day
// bugFix 2016-9-25
// if month is leap, _day use leapDays method
if (isLeapMonth) {
_day = this.leapDays(y, m)
}
if (y < 1900 || y > 2100 || d > _day) {
return -1
}// 参数合法性效验
// 计算农历的时间差
var offset = 0
for (var i = 1900; i < y; i++) {
offset += this.lYearDays(i)
}
var leap = 0;
var isAdd = false
for (var i = 1; i < m; i++) {
leap = this.leapMonth(y)
if (!isAdd) { // 处理闰月
if (leap <= i && leap > 0) {
offset += this.leapDays(y);
isAdd = true
}
}
offset += this.monthDays(y, i)
}
// 转换闰月农历 需补充该年闰月的前一个月的时差
if (isLeapMonth) {
offset += day
}
// 1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点)
var stmap = Date.UTC(1900, 1, 30, 0, 0, 0)
var calObj = new Date((offset + d - 31) * 86400000 + stmap)
var cY = calObj.getUTCFullYear()
var cM = calObj.getUTCMonth() + 1
var cD = calObj.getUTCDate()
return this.solar2lunar(cY, cM, cD)
}
}
export default calendar

170
pages_qiun/components/uni-calendar/uni-calendar-item.vue

@ -1,170 +0,0 @@
<template>
<view class="uni-calendar-item__weeks-box" :class="{
'uni-calendar-item--disable':weeks.disable,
'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
'uni-calendar-item--checked':(calendar.fullDate === weeks.fullDate && !weeks.isDay) ,
'uni-calendar-item--before-checked':weeks.beforeMultiple,
'uni-calendar-item--multiple': weeks.multiple,
'uni-calendar-item--after-checked':weeks.afterMultiple,
}"
@click="choiceDate(weeks)">
<view class="uni-calendar-item__weeks-box-item">
<text v-if="selected&&weeks.extraInfo" class="uni-calendar-item__weeks-box-circle"></text>
<text class="uni-calendar-item__weeks-box-text" :class="{
'uni-calendar-item--isDay-text': weeks.isDay,
'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay,
'uni-calendar-item--before-checked':weeks.beforeMultiple,
'uni-calendar-item--multiple': weeks.multiple,
'uni-calendar-item--after-checked':weeks.afterMultiple,
'uni-calendar-item--disable':weeks.disable,
}">{{weeks.date}}</text>
<text v-if="!lunar&&!weeks.extraInfo && weeks.isDay" class="uni-calendar-item__weeks-lunar-text" :class="{
'uni-calendar-item--isDay-text':weeks.isDay,
'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay,
'uni-calendar-item--before-checked':weeks.beforeMultiple,
'uni-calendar-item--multiple': weeks.multiple,
'uni-calendar-item--after-checked':weeks.afterMultiple,
}">今天</text>
<text v-if="lunar&&!weeks.extraInfo" class="uni-calendar-item__weeks-lunar-text" :class="{
'uni-calendar-item--isDay-text':weeks.isDay,
'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay,
'uni-calendar-item--before-checked':weeks.beforeMultiple,
'uni-calendar-item--multiple': weeks.multiple,
'uni-calendar-item--after-checked':weeks.afterMultiple,
'uni-calendar-item--disable':weeks.disable,
}">{{weeks.isDay?'今天': (weeks.lunar.IDayCn === '初一'?weeks.lunar.IMonthCn:weeks.lunar.IDayCn)}}</text>
<text v-if="weeks.extraInfo&&weeks.extraInfo.info" class="uni-calendar-item__weeks-lunar-text" :class="{
'uni-calendar-item--extra':weeks.extraInfo.info,
'uni-calendar-item--isDay-text':weeks.isDay,
'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay,
'uni-calendar-item--before-checked':weeks.beforeMultiple,
'uni-calendar-item--multiple': weeks.multiple,
'uni-calendar-item--after-checked':weeks.afterMultiple,
'uni-calendar-item--disable':weeks.disable,
}">{{weeks.extraInfo.info}}</text>
</view>
</view>
</template>
<script>
export default {
props: {
weeks: {
type: Object,
default () {
return {}
}
},
calendar: {
type: Object,
default: () => {
return {}
}
},
selected: {
type: Array,
default: () => {
return []
}
},
lunar: {
type: Boolean,
default: false
}
},
methods: {
choiceDate(weeks) {
this.$emit('change', weeks)
}
}
}
</script>
<style lang="scss" scoped>
.uni-calendar-item__weeks-box {
flex: 1;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: column;
justify-content: center;
align-items: center;
}
.uni-calendar-item__weeks-box-text {
font-size: $uni-font-size-base;
color: $uni-text-color;
}
.uni-calendar-item__weeks-lunar-text {
font-size: $uni-font-size-sm;
color: $uni-text-color;
}
.uni-calendar-item__weeks-box-item {
position: relative;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: column;
justify-content: center;
align-items: center;
width: 100rpx;
height: 100rpx;
}
.uni-calendar-item__weeks-box-circle {
position: absolute;
top: 5px;
right: 5px;
width: 8px;
height: 8px;
border-radius: 8px;
background-color: $uni-color-error;
}
.uni-calendar-item--disable {
background-color: rgba(249, 249, 249, $uni-opacity-disabled);
color: $uni-text-color-disable;
}
.uni-calendar-item--isDay-text {
color: $uni-color-primary;
}
.uni-calendar-item--isDay {
background-color: $uni-color-primary;
opacity: 0.8;
color: #fff;
}
.uni-calendar-item--extra {
color: $uni-color-error;
opacity: 0.8;
}
.uni-calendar-item--checked {
background-color: $uni-color-primary;
color: #fff;
opacity: 0.8;
}
.uni-calendar-item--multiple {
background-color: $uni-color-primary;
color: #fff;
opacity: 0.8;
}
.uni-calendar-item--before-checked {
background-color: #ff5a5f;
color: #fff;
}
.uni-calendar-item--after-checked {
background-color: #ff5a5f;
color: #fff;
}
</style>

512
pages_qiun/components/uni-calendar/uni-calendar.vue

@ -1,512 +0,0 @@
<template>
<view class="uni-calendar">
<view v-if="!insert&&show" class="uni-calendar__mask" :class="{'uni-calendar--mask-show':aniMaskShow}" @click="clean"></view>
<view v-if="insert || show" class="uni-calendar__content" :class="{'uni-calendar--fixed':!insert,'uni-calendar--ani-show':aniMaskShow}">
<view v-if="!insert" class="uni-calendar__header uni-calendar--fixed-top">
<view class="uni-calendar__header-btn-box" @click="close">
<text class="uni-calendar__header-text uni-calendar--fixed-width">取消</text>
</view>
<view class="uni-calendar__header-btn-box" @click="confirm">
<text class="uni-calendar__header-text uni-calendar--fixed-width">确定</text>
</view>
</view>
<view class="uni-calendar__header">
<view class="uni-calendar__header-btn-box" @click.stop="pre">
<view class="uni-calendar__header-btn uni-calendar--left"></view>
</view>
<picker mode="date" :value="date" fields="month" @change="bindDateChange">
<text class="uni-calendar__header-text">{{ (nowDate.year||'') +'年'+( nowDate.month||'') +'月'}}</text>
</picker>
<view class="uni-calendar__header-btn-box" @click.stop="next">
<view class="uni-calendar__header-btn uni-calendar--right"></view>
</view>
<text class="uni-calendar__backtoday" @click="backtoday">回到今天</text>
</view>
<view class="uni-calendar__box">
<view v-if="showMonth" class="uni-calendar__box-bg">
<text class="uni-calendar__box-bg-text">{{nowDate.month}}</text>
</view>
<view class="uni-calendar__weeks">
<view class="uni-calendar__weeks-day">
<text class="uni-calendar__weeks-day-text"></text>
</view>
<view class="uni-calendar__weeks-day">
<text class="uni-calendar__weeks-day-text"></text>
</view>
<view class="uni-calendar__weeks-day">
<text class="uni-calendar__weeks-day-text"></text>
</view>
<view class="uni-calendar__weeks-day">
<text class="uni-calendar__weeks-day-text"></text>
</view>
<view class="uni-calendar__weeks-day">
<text class="uni-calendar__weeks-day-text"></text>
</view>
<view class="uni-calendar__weeks-day">
<text class="uni-calendar__weeks-day-text"></text>
</view>
<view class="uni-calendar__weeks-day">
<text class="uni-calendar__weeks-day-text"></text>
</view>
</view>
<view class="uni-calendar__weeks" v-for="(item,weekIndex) in weeks" :key="weekIndex">
<view class="uni-calendar__weeks-item" v-for="(weeks,weeksIndex) in item" :key="weeksIndex">
<calendar-item :weeks="weeks" :calendar="calendar" :selected="selected" :lunar="lunar" @change="choiceDate"></calendar-item>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
import Calendar from './util.js';
import calendarItem from './uni-calendar-item.vue'
/**
* Calendar 日历
* @description 日历组件可以查看日期选择任意范围内的日期打点操作常用场景如酒店日期预订火车机票选择购买日期上下班打卡等
* @tutorial https://ext.dcloud.net.cn/plugin?id=56
* @property {String} date 自定义当前时间默认为今天
* @property {Boolean} lunar 显示农历
* @property {String} startDate 日期选择范围-开始日期
* @property {String} endDate 日期选择范围-结束日期
* @property {Boolean} range 范围选择
* @property {Boolean} insert = [true|false] 插入模式,默认为false
* @value true 弹窗模式
* @value false 插入模式
* @property {Boolean} clearDate = [true|false] 弹窗模式是否清空上次选择内容
* @property {Array} selected 打点期待格式[{date: '2019-06-27', info: '签到', data: { custom: '自定义信息', name: '自定义消息头',xxx:xxx... }}]
* @property {Boolean} showMonth 是否选择月份为背景
* @event {Function} change 日期改变`insert :ture` 时生效
* @event {Function} confirm 确认选择`insert :false` 时生效
* @event {Function} monthSwitch 切换月份时触发
* @example <uni-calendar :insert="true":lunar="true" :start-date="'2019-3-2'":end-date="'2019-5-20'"@change="change" />
*/
export default {
components: {
calendarItem
},
props: {
date: {
type: String,
default: ''
},
selected: {
type: Array,
default () {
return []
}
},
lunar: {
type: Boolean,
default: false
},
startDate: {
type: String,
default: ''
},
endDate: {
type: String,
default: ''
},
range: {
type: Boolean,
default: false
},
insert: {
type: Boolean,
default: true
},
showMonth: {
type: Boolean,
default: true
},
clearDate: {
type: Boolean,
default: true
}
},
data() {
return {
show: false,
weeks: [],
calendar: {},
nowDate: '',
aniMaskShow: false
}
},
watch: {
date(newVal) {
this.cale.setDate(newVal)
this.init(this.cale.selectDate.fullDate)
},
startDate(val){
this.cale.resetSatrtDate(val)
},
endDate(val){
this.cale.resetEndDate(val)
},
selected(newVal) {
this.cale.setSelectInfo(this.nowDate.fullDate, newVal)
this.weeks = this.cale.weeks
}
},
created() {
//
this.cale = new Calendar({
// date: new Date(),
selected: this.selected,
startDate: this.startDate,
endDate: this.endDate,
range: this.range,
})
//
this.cale.setDate(this.date)
this.init(this.cale.selectDate.fullDate)
// this.setDay
},
methods: {
// 穿
clean() {
this.aniMaskShow = false
this.$nextTick(() => {
setTimeout(() => {
this.show = false
this.$emit('close')
}, 300)
})
},
bindDateChange(e) {
const value = e.detail.value + '-1'
this.cale.setDate(value)
this.init(value)
},
/**
* 初始化日期显示
* @param {Object} date
*/
init(date) {
this.weeks = this.cale.weeks
this.nowDate = this.calendar = this.cale.getInfo(date)
},
/**
* 打开日历弹窗
*/
open() {
//
if (this.clearDate && !this.insert) {
this.cale.cleanMultipleStatus()
this.cale.setDate(this.date)
this.init(this.cale.selectDate.fullDate)
}
this.show = true
this.$nextTick(() => {
setTimeout(() => {
this.aniMaskShow = true
}, 50)
})
},
/**
* 关闭日历弹窗
*/
close() {
this.aniMaskShow = false
this.$nextTick(() => {
setTimeout(() => {
this.show = false
this.$emit('close')
}, 300)
})
},
/**
* 确认按钮
*/
confirm() {
this.setEmit('confirm')
this.close()
},
/**
* 变化触发
*/
change() {
if (!this.insert) return
this.setEmit('change')
},
/**
* 选择月份触发
*/
monthSwitch() {
let {
year,
month
} = this.nowDate
this.$emit('monthSwitch', {
year,
month: Number(month)
})
},
/**
* 派发事件
* @param {Object} name
*/
setEmit(name) {
let {
year,
month,
date,
fullDate,
lunar,
extraInfo
} = this.calendar
this.$emit(name, {
range: this.cale.multipleStatus,
year,
month,
date,
fulldate: fullDate,
lunar,
extraInfo: extraInfo || {}
})
},
/**
* 选择天触发
* @param {Object} weeks
*/
choiceDate(weeks) {
if (weeks.disable) return
this.calendar = weeks
//
this.cale.setMultiple(this.calendar.fullDate)
this.weeks = this.cale.weeks
this.change()
},
/**
* 回到今天
*/
backtoday() {
console.log(this.cale.getDate(new Date()).fullDate);
let date = this.cale.getDate(new Date()).fullDate
this.cale.setDate(date)
this.init(date)
this.change()
},
/**
* 上个月
*/
pre() {
const preDate = this.cale.getDate(this.nowDate.fullDate, -1, 'month').fullDate
this.setDate(preDate)
this.monthSwitch()
},
/**
* 下个月
*/
next() {
const nextDate = this.cale.getDate(this.nowDate.fullDate, +1, 'month').fullDate
this.setDate(nextDate)
this.monthSwitch()
},
/**
* 设置日期
* @param {Object} date
*/
setDate(date) {
this.cale.setDate(date)
this.weeks = this.cale.weeks
this.nowDate = this.cale.getInfo(date)
}
}
}
</script>
<style lang="scss" scoped>
.uni-calendar {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: column;
}
.uni-calendar__mask {
position: fixed;
bottom: 0;
top: 0;
left: 0;
right: 0;
background-color: $uni-bg-color-mask;
transition-property: opacity;
transition-duration: 0.3s;
opacity: 0;
/* #ifndef APP-NVUE */
z-index: 99;
/* #endif */
}
.uni-calendar--mask-show {
opacity: 1
}
.uni-calendar--fixed {
position: fixed;
bottom: 0;
left: 0;
right: 0;
transition-property: transform;
transition-duration: 0.3s;
transform: translateY(460px);
/* #ifndef APP-NVUE */
z-index: 99;
/* #endif */
}
.uni-calendar--ani-show {
transform: translateY(0);
}
.uni-calendar__content {
background-color: #fff;
}
.uni-calendar__header {
position: relative;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
justify-content: center;
align-items: center;
height: 50px;
border-bottom-color: $uni-border-color;
border-bottom-style: solid;
border-bottom-width: 1px;
}
.uni-calendar--fixed-top {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
justify-content: space-between;
border-top-color: $uni-border-color;
border-top-style: solid;
border-top-width: 1px;
}
.uni-calendar--fixed-width {
width: 50px;
// padding: 0 15px;
}
.uni-calendar__backtoday {
position: absolute;
right: 0;
top: 25rpx;
padding: 0 5px;
padding-left: 10px;
height: 25px;
line-height: 25px;
font-size: 12px;
border-top-left-radius: 25px;
border-bottom-left-radius: 25px;
color: $uni-text-color;
background-color: $uni-bg-color-hover;
}
.uni-calendar__header-text {
text-align: center;
width: 100px;
font-size: $uni-font-size-base;
color: $uni-text-color;
}
.uni-calendar__header-btn-box {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
align-items: center;
justify-content: center;
width: 50px;
height: 50px;
}
.uni-calendar__header-btn {
width: 10px;
height: 10px;
border-left-color: $uni-text-color-placeholder;
border-left-style: solid;
border-left-width: 2px;
border-top-color: $uni-color-subtitle;
border-top-style: solid;
border-top-width: 2px;
}
.uni-calendar--left {
transform: rotate(-45deg);
}
.uni-calendar--right {
transform: rotate(135deg);
}
.uni-calendar__weeks {
position: relative;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
}
.uni-calendar__weeks-item {
flex: 1;
}
.uni-calendar__weeks-day {
flex: 1;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: column;
justify-content: center;
align-items: center;
height: 45px;
border-bottom-color: #F5F5F5;
border-bottom-style: solid;
border-bottom-width: 1px;
}
.uni-calendar__weeks-day-text {
font-size: 14px;
}
.uni-calendar__box {
position: relative;
}
.uni-calendar__box-bg {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
justify-content: center;
align-items: center;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
.uni-calendar__box-bg-text {
font-size: 200px;
font-weight: bold;
color: $uni-text-color-grey;
opacity: 0.1;
text-align: center;
/* #ifndef APP-NVUE */
line-height: 1;
/* #endif */
}
</style>

357
pages_qiun/components/uni-calendar/util.js

@ -1,357 +0,0 @@
import CALENDAR from './calendar.js'
class Calendar {
constructor({
date,
selected,
startDate,
endDate,
range
} = {}) {
// 当前日期
this.date = this.getDate(new Date()) // 当前初入日期
// 打点信息
this.selected = selected || [];
// 范围开始
this.startDate = startDate
// 范围结束
this.endDate = endDate
this.range = range
// 多选状态
this.cleanMultipleStatus()
// 每周日期
this.weeks = {}
// this._getWeek(this.date.fullDate)
}
/**
* 设置日期
* @param {Object} date
*/
setDate(date) {
this.selectDate = this.getDate(date)
this._getWeek(this.selectDate.fullDate)
}
/**
* 清理多选状态
*/
cleanMultipleStatus() {
this.multipleStatus = {
before: '',
after: '',
data: []
}
}
/**
* 重置开始日期
*/
resetSatrtDate(startDate) {
// 范围开始
this.startDate = startDate
}
/**
* 重置结束日期
*/
resetEndDate(endDate) {
// 范围结束
this.endDate = endDate
}
/**
* 获取任意时间
*/
getDate(date, AddDayCount = 0, str = 'day') {
if (!date) {
date = new Date()
}
if (typeof date !== 'object') {
date = date.replace(/-/g, '/')
}
const dd = new Date(date)
switch (str) {
case 'day':
dd.setDate(dd.getDate() + AddDayCount) // 获取AddDayCount天后的日期
break
case 'month':
if (dd.getDate() === 31) {
dd.setDate(dd.getDate() + AddDayCount)
} else {
dd.setMonth(dd.getMonth() + AddDayCount) // 获取AddDayCount天后的日期
}
break
case 'year':
dd.setFullYear(dd.getFullYear() + AddDayCount) // 获取AddDayCount天后的日期
break
}
const y = dd.getFullYear()
const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1 // 获取当前月份的日期,不足10补0
const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 获取当前几号,不足10补0
return {
fullDate: y + '-' + m + '-' + d,
year: y,
month: m,
date: d,
day: dd.getDay()
}
}
/**
* 获取上月剩余天数
*/
_getLastMonthDays(firstDay, full) {
let dateArr = []
for (let i = firstDay; i > 0; i--) {
const beforeDate = new Date(full.year, full.month - 1, -i + 1).getDate()
dateArr.push({
date: beforeDate,
month: full.month - 1,
lunar: this.getlunar(full.year, full.month - 1, beforeDate),
disable: true
})
}
return dateArr
}
/**
* 获取本月天数
*/
_currentMonthDys(dateData, full) {
let dateArr = []
let fullDate = this.date.fullDate
for (let i = 1; i <= dateData; i++) {
let isinfo = false
let nowDate = full.year + '-' + (full.month < 10 ?
full.month : full.month) + '-' + (i < 10 ?
'0' + i : i)
// 是否今天
let isDay = fullDate === nowDate
// 获取打点信息
let info = this.selected && this.selected.find((item) => {
if (this.dateEqual(nowDate, item.date)) {
return item
}
})
// 日期禁用
let disableBefore = true
let disableAfter = true
if (this.startDate) {
let dateCompBefore = this.dateCompare(this.startDate, fullDate)
disableBefore = this.dateCompare(dateCompBefore ? this.startDate : fullDate, nowDate)
}
if (this.endDate) {
let dateCompAfter = this.dateCompare(fullDate, this.endDate)
disableAfter = this.dateCompare(nowDate, dateCompAfter ? this.endDate : fullDate)
}
let multiples = this.multipleStatus.data
let checked = false
let multiplesStatus = -1
if (this.range) {
if (multiples) {
multiplesStatus = multiples.findIndex((item) => {
return this.dateEqual(item, nowDate)
})
}
if (multiplesStatus !== -1) {
checked = true
}
}
let data = {
fullDate: nowDate,
year: full.year,
date: i,
multiple: this.range ? checked : false,
beforeMultiple: this.dateEqual(this.multipleStatus.before, nowDate),
afterMultiple: this.dateEqual(this.multipleStatus.after, nowDate),
month: full.month,
lunar: this.getlunar(full.year, full.month, i),
disable: !disableBefore || !disableAfter,
isDay
}
if (info) {
data.extraInfo = info
}
dateArr.push(data)
}
return dateArr
}
/**
* 获取下月天数
*/
_getNextMonthDays(surplus, full) {
let dateArr = []
for (let i = 1; i < surplus + 1; i++) {
dateArr.push({
date: i,
month: Number(full.month) + 1,
lunar: this.getlunar(full.year, Number(full.month) + 1, i),
disable: true
})
}
return dateArr
}
/**
* 获取当前日期详情
* @param {Object} date
*/
getInfo(date) {
if (!date) {
date = new Date()
}
const dateInfo = this.canlender.find(item => item.fullDate === this.getDate(date).fullDate)
return dateInfo
}
/**
* 比较时间大小
*/
dateCompare(startDate, endDate) {
// 计算截止时间
startDate = new Date(startDate.replace('-', '/').replace('-', '/'))
// 计算详细项的截止时间
endDate = new Date(endDate.replace('-', '/').replace('-', '/'))
if (startDate <= endDate) {
return true
} else {
return false
}
}
/**
* 比较时间是否相等
*/
dateEqual(before, after) {
// 计算截止时间
before = new Date(before.replace('-', '/').replace('-', '/'))
// 计算详细项的截止时间
after = new Date(after.replace('-', '/').replace('-', '/'))
if (before.getTime() - after.getTime() === 0) {
return true
} else {
return false
}
}
/**
* 获取日期范围内所有日期
* @param {Object} begin
* @param {Object} end
*/
geDateAll(begin, end) {
var arr = []
var ab = begin.split('-')
var ae = end.split('-')
var db = new Date()
db.setFullYear(ab[0], ab[1] - 1, ab[2])
var de = new Date()
de.setFullYear(ae[0], ae[1] - 1, ae[2])
var unixDb = db.getTime() - 24 * 60 * 60 * 1000
var unixDe = de.getTime() - 24 * 60 * 60 * 1000
for (var k = unixDb; k <= unixDe;) {
k = k + 24 * 60 * 60 * 1000
arr.push(this.getDate(new Date(parseInt(k))).fullDate)
}
return arr
}
/**
* 计算阴历日期显示
*/
getlunar(year, month, date) {
return CALENDAR.solar2lunar(year, month, date)
}
/**
* 设置打点
*/
setSelectInfo(data, value) {
this.selected = value
this._getWeek(data)
}
/**
* 获取多选状态
*/
setMultiple(fullDate) {
let {
before,
after
} = this.multipleStatus
if (!this.range) return
if (before && after) {
this.multipleStatus.before = ''
this.multipleStatus.after = ''
this.multipleStatus.data = []
} else {
if (!before) {
this.multipleStatus.before = fullDate
} else {
this.multipleStatus.after = fullDate
if (this.dateCompare(this.multipleStatus.before, this.multipleStatus.after)) {
this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus.after);
} else {
this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus.before);
}
}
}
this._getWeek(fullDate)
}
/**
* 获取每周数据
* @param {Object} dateData
*/
_getWeek(dateData) {
const {
fullDate,
year,
month,
date,
day
} = this.getDate(dateData)
let firstDay = new Date(year, month - 1, 1).getDay()
let currentDay = new Date(year, month, 0).getDate()
let dates = {
lastMonthDays: this._getLastMonthDays(firstDay, this.getDate(dateData)), // 上个月末尾几天
currentMonthDys: this._currentMonthDys(currentDay, this.getDate(dateData)), // 本月天数
nextMonthDays: [], // 下个月开始几天
weeks: []
}
let canlender = []
const surplus = 42 - (dates.lastMonthDays.length + dates.currentMonthDys.length)
dates.nextMonthDays = this._getNextMonthDays(surplus, this.getDate(dateData))
canlender = canlender.concat(dates.lastMonthDays, dates.currentMonthDys, dates.nextMonthDays)
let weeks = {}
// 拼接数组 上个月开始几天 + 本月天数+ 下个月开始几天
for (let i = 0; i < canlender.length; i++) {
if (i % 7 === 0) {
weeks[parseInt(i / 7)] = new Array(7)
}
weeks[parseInt(i / 7)][i % 7] = canlender[i]
}
this.canlender = canlender
this.weeks = weeks
}
//静态方法
// static init(date) {
// if (!this.instance) {
// this.instance = new Calendar(date);
// }
// return this.instance;
// }
}
export default Calendar

134
pages_qiun/components/wuc-tab/wuc-tab.vue

@ -1,134 +0,0 @@
<template>
<scroll-view class="wuc-tab" :class="tabClass" :style="tabStyle" scroll-with-animation scroll-x :scroll-left="scrollLeft">
<div v-if="!textFlex">
<div class="wuc-tab-item" :class="[index === tabCur ? selectClass + ' cur':'']" v-for="(item,index) in tabList" :key="index" :id="index" @tap="tabSelect(index,$event)">
<text :class="item.icon"></text>
<span>{{item.name}}</span>
</div>
</div>
<div class="flex text-center" v-if="textFlex">
<div class="wuc-tab-item flex-sub" :class="index === tabCur ? selectClass + ' cur':''" v-for="(item,index) in tabList" :key="index" :id="index" @tap="tabSelect(index,$event)">
<text :class="item.icon"></text>
<span>{{item.name}}</span>
</div>
</div>
</scroll-view>
</template>
<script>
export default {
name: 'wuc-tab',
data() {
return {};
},
props: {
tabList: {
type: Array,
default() {
return [];
}
},
tabCur: {
type: Number,
default() {
return 0;
}
},
tabClass: {
type: String,
default() {
return '';
}
},
tabStyle: {
type: String,
default() {
return '';
}
},
textFlex: {
type: Boolean,
default() {
return false;
}
},
selectClass: {
type: String,
default() {
return 'text-blue';
}
}
},
methods: {
tabSelect(index, e) {
if (this.currentTab === index) return false;
this.$emit('update:tabCur', index);
this.$emit('changeTab', this.tabList[index]);
}
},
computed: {
scrollLeft() {
return (this.tabCur - 1) * 60;
}
}
};
</script>
<style>
div,
scroll-view,
swiper {
box-sizing: border-box;
}
.wuc-tab {
white-space: nowrap;
}
.wuc-tab-item {
height: 90rpx;
display: inline-block;
line-height: 90rpx;
margin: 0 10upx;
padding: 0 20upx;
}
.wuc-tab-item.cur {
color: #40A2ED;
background-color: #fff;
}
.wuc-tab.fixed {
position: fixed;
width: 100%;
top: 0;
z-index: 1024;
box-shadow: 0 1upx 6upx rgba(0, 0, 0, 0.1);
}
.flex {
display: flex;
}
.text-center {
text-align: center;
}
.flex-sub {
flex: 1;
}
.text-blue{
color:#40A2ED;
}
.text-white{
color:#ffffff;
}
.bg-white{
background-color: #ffffff;
}
.bg-blue{
background-color: #40A2ED;
}
.text-orange{
color: #f37b1d
}
.text-xl {
font-size: 36upx;
}
</style>

585
pages_qiun/pages/finance/index.vue

@ -1,585 +0,0 @@
<template>
<view class="body">
<!-- <view class="topLine" :style="{height: topBar+'px'}"></view> -->
<view class="nav row_align_center" id="nav">
<li class="li_4" style="color: #fff;z-index: 999;" :class="['iconfont icon-zuojiantou back']" @click="gotoBack()"></li>
</view>
<view class="top_head">
<view class="text_des">
<text class="month_num">{{ nowTime.month }}</text>
<text class="month_text"></text>
<text class="month_year">{{ nowTime.year }}</text>
<text class="point">.</text>
<text class="title">财务报告</text>
</view>
<view class="top_desc">
<view class="text-gray">结余</view>
<view class="remaining">{{ myWallet.remaining }}</view>
<view class="row head_block">
<view class="flex_1">
<text class="text-gray">支出</text>
<text class="text_green">{{ myWallet.expend }}</text>
</view>
<view class="flex_1">
<text class="text-gray">收入</text>
<text class="income">{{ myWallet.income }}</text>
</view>
</view>
</view>
</view>
<view class="main">
<view class="row_block">
<view class="the_title" style="justify-content: space-between;">
<view class="left_title">
<view class="title_icon"></view>
<text class="margin_stand-samll font-big wide">历史趋势</text>
</view>
<view class="right_btn">
<view v-for="(item, index) in historyBtn" :key="index" :class="item.state ? 'active_btn' : ''"
@click="changeHistoryBtn(item.type)">{{ item.name }}</view>
</view>
</view>
<view class="charts-box" style="height: 200px;">
<qiun-data-charts type="line" canvasId="finance_a" :canvas2d="isCanvas2d" :reshow="delayload"
:opts="{ xAxis: { itemCount: 12, disableGrid: true }, yAxis: { disableGrid: true, data: [{ disabled: true }] } }"
:chartData="historyData" />
</view>
</view>
<view class="row_block">
<view class="the_title">
<view class="title_icon"></view>
<text class="margin_stand-samll font-big wide">钱都去哪了</text>
</view>
<view v-if="delayload" class="charts-box">
<qiun-data-charts type="ring" canvasId="finance_b" :canvas2d="isCanvas2d" :reshow="delayload"
:opts="{ padding: [15, 0, 4, 0], legend: { position: 'bottom' }, title: { name: expendCount }, subtitle: { name: '支出', fontSize: '20' } }"
:chartData="expendDetail" />
</view>
<view class="the_title">
<text class="margin_stand-samll font-middle wide">支出单笔最贵</text>
</view>
<view class="extend_rank">
<view class="rank_item" v-for="(item, index) in extendRank" :key="index">
<image :src="getImage(index)" mode="widthFix"></image>
<text class="name">{{ item.name }}</text>
<text class="desc">{{ item.desc }}</text>
<text class="text_green money">{{ item.money }}</text>
</view>
</view>
</view>
<view class="row_block">
<view class="the_title">
<view class="title_icon"></view>
<text class="margin_stand-samll font-big wide">{{ nowTime.month }}月明细</text>
</view>
<view class="detail_list">
<view v-for="(item, index) in detail_list" :key="index" class="detail_item">
<view>
<view class="font-middle">{{ item.date }}</view>
<view class="font-small">{{ item.time }}</view>
</view>
<view class="icon">
<li class="li_2" :class="['iconfont', item.type == 'income' ? 'icon-income' : 'icon-expend']"></li>
</view>
<view class="right_content">
<view class="money">{{ item.type == 'income' ? '+' : '-' }}{{ item.money }}</view>
<view class="text-gray font-middle">{{ item.desc }}</view>
</view>
</view>
</view>
</view>
<view class="end_block">
<view class="the_title" style="margin-bottom: 40rpx;">
<view class="title_icon"></view>
<text class="margin_stand-samll font-big wide">我的支出水平</text>
</view>
<view class="level_bar">
<view v-for="(item, index) in extend_level_bar" :key="index" :style="{ width: item.width }"
:class="item.state ? 'text_green font-middle' : ''">{{ item.name }}</view>
</view>
<view class="level_bar">
<view v-for="(item, index) in extend_level_bar" :key="index" :style="{ width: item.width }"
:class="item.state ? 'active_bar' : 'default_bar'"></view>
</view>
<view class="level_bar">
<view v-for="(item, index) in extend_level_bar" :key="index" :style="{ width: item.width }"
:class="item.state ? 'text_green font-middle' : ''">{{ item.range }}</view>
</view>
<view class="extend_message">
<li style="color: #ccc;" :class="['iconfont icon-message']"></li>
<view>
我的支出水平已超过
<text>{{ extend_morethan }}</text>
的乡镇居民
</view>
</view>
</view>
</view>
</view>
</template>
<script>
import ProgressBar from "../../components/progress-bar/progress-bar.vue"
import dataOne from '../../static/json/finance/1.json';
import expendDetail from '../../static/json/finance/2.json';
import Config from '../../static/js/config'
import Common from '../../static/js/common'
let _now = new Date();
let now_time = {};
now_time.year = _now.getFullYear()
now_time.month = _now.getMonth() + 1
now_time.day = _now.getDay()
export default {
components: {
ProgressBar
},
data() {
return {
info: '大便超人', //
scrollHeight: "600px", //
isCanvas2d: Config.ISCANVAS2D,
historyData: {},
dataOne,
expendDetail,
expendCount: 0,
delayload: false,
nowTime: {
year: now_time.year,
month: now_time.month,
day: now_time.day
},
historyBtn: [{
name: "支出",
state: 1,
type: "expend"
},
{
name: "收入",
state: 0,
type: "income"
},
{
name: "结余",
state: 0,
type: "remaining"
},
],
myWallet: {
remaining: 3000.34,
expend: 5240.32,
income: 8240.66
},
extendRank: [{
name: "腐败聚会",
desc: now_time.month + "月6日12:34-跨界空间轰趴",
money: "422.12"
},
{
name: "沐浴按摩",
desc: now_time.month + "月12日21:34-乔杉沐浴城",
money: "318.00"
},
{
name: "食品酒水",
desc: now_time.month + "月1日21:34-school酒馆",
money: "289.50"
},
],
extend_level_bar: [
{ name: "低消费", range: "<2000元", width: "20%" },
{ name: "中间消费", range: "2000-5000元", width: "35%" },
{ name: "较高消费", range: "5000-8000元", width: "25%", state: 1 },
{ name: "高消费", range: ">8000元", width: "20%" },
],
extend_morethan: "68%",
detail_list: [
{ date: now_time.month + "-01", time: "11:01", "type": "extend", money: "10.00", desc: "银行卡转出" },
{ date: now_time.month + "-01", time: "13:45", "type": "income", money: "18.00", desc: "银行卡收入" },
{ date: now_time.month + "-02", time: "06:21", "type": "extend", money: "123.45", desc: "信用卡转出" },
{ date: now_time.month + "-03", time: "07:38", "type": "income", money: "23.00", desc: "银行卡收入" },
{ date: now_time.month + "-08", time: "16:28", "type": "extend", money: "23.56", desc: "信用卡转出" },
{ date: now_time.month + "-09", time: "15:25", "type": "income", money: "850.12", desc: "银行卡收入" },
{ date: now_time.month + "-09", time: "18:52", "type": "income", money: "1.88", desc: "银行卡收入" },
{ date: now_time.month + "-11", time: "21:12", "type": "extend", money: "220.21", desc: "银行卡转出" },
{ date: now_time.month + "-12", time: "13:08", "type": "income", money: "32.28", desc: "银行卡收入" },
{ date: now_time.month + "-12", time: "12:41", "type": "extend", money: "122.12", desc: "信用卡转出" },
{ date: now_time.month + "-13", time: "17:21", "type": "income", money: "10.00", desc: "银行卡收入" },
]
};
},
watch: {
"historyBtn": {
deep: true,
handler: function (newVal, oldVal) {
this.filterHistoryData();
}
}
},
methods: {
async getData() {
uni.showLoading();
this.filterHistoryData();
for (let i = 0; i < this.expendDetail.series.length; i++) {
this.expendDetail.series[i].format = "pieDemo"
}
let length = this.expendDetail.series[0].data.length
for (let i = 0; i < length; i++) {
this.expendCount += this.expendDetail.series[0].data[i].value
}
await setTimeout(() => {
this.delayload = true;
uni.hideLoading();
}, 1000)
},
changeHistoryBtn(type) {
for (let i = 0; i < this.historyBtn.length; i++) {
if (this.historyBtn[i].type == type) {
this.historyBtn[i].state = 1
} else {
this.historyBtn[i].state = 0
}
}
},
filterHistoryData() {
let type = this.historyBtn.filter(x => x.state == 1)[0].type;
switch (type) {
case "expend":
this.historyData = this.dataOne.expend;
break;
case "income":
this.historyData = this.dataOne.income;
break;
case "remaining":
this.historyData = this.dataOne.remaining;
break;
}
},
gotoBack() {
Common.navigateBack("/index/index");
},
getImage(index) {
switch (index) {
case 0:
return "https://s1.ax1x.com/2023/03/31/ppRYrfP.png";
break;
case 1:
return "https://s1.ax1x.com/2023/03/31/ppRYySf.png";
break;
case 2:
return "https://s1.ax1x.com/2023/03/31/ppRY6l8.png";
break;
}
}
},
onReady() {
//#ifndef H5
uni.showShareMenu();
//#endif
this.getData()
}
}
</script>
<style scoped lang="scss">
.body {
height: 100%;
background-color: #560594;
margin: 0;
padding-bottom: 20rpx;
.li_4 {
list-style-type: none;
}
.nav {
position: fixed;
top: 50rpx;
left: 20rpx;
}
.text_green {
color: #4ECDB6;
}
.main {
width: 100%;
padding: 0 10rpx;
box-sizing: border-box;
margin-top: 20rpx;
.detail_list {
height: 700rpx;
overflow: auto;
color: #9E9E9E;
.detail_item {
display: flex;
margin: 20rpx 0;
align-items: center;
.icon {
width: 30%;
text-align: center;
.li_2 {
font-size: 80rpx;
}
}
.right_content {
width: 50%;
text-align: center;
}
.icon-income {
color: #4AABF9;
}
.icon-expend {
color: #E45521;
}
.money {
color: #000;
}
}
}
.extend_message {
margin-top: 20rpx;
color: #ccc;
display: flex;
text {
color: #ff9900;
}
}
.level_bar {
width: 100%;
height: 40rpx;
border-radius: 40rpx;
overflow: hidden;
display: flex;
color: #ccc;
font-size: 20rpx;
text-align: right;
line-height: 40rpx;
view {
border-right: 2rpx solid #fff;
position: relative;
}
.name {
position: absolute;
top: -30rpx;
right: -40rpx;
}
.range {
position: absolute;
bottom: 30rpx;
right: -40rpx;
}
.default_bar {
background-color: #A0DFCD;
}
.active_bar {
background-color: #02AE7A;
}
}
.right_btn {
float: right;
display: flex;
color: #ccc;
font-size: 22rpx;
view {
line-height: 50rpx;
height: 50rpx;
margin: 0 20rpx;
}
.active_btn {
padding: 0rpx 20rpx;
border: 1px solid #ccc;
border-radius: 40rpx;
}
}
.end_block {
width: 100%;
box-sizing: border-box;
background-color: #fff;
border-radius: 12rpx;
position: relative;
padding: 20rpx;
}
.row_block {
width: 100%;
box-sizing: border-box;
background-color: #fff;
border-radius: 12rpx;
position: relative;
padding: 20rpx;
&::after {
content: "";
height: 0px;
width: 92%;
position: absolute;
transform: translateX(-50%);
left: 50%;
bottom: 0;
border-top: 1px dashed #ccc;
}
}
.the_title {
display: flex;
align-items: center;
.left_title {
display: flex;
align-items: center;
}
.title_icon {
background-color: #7E7E7E;
height: 40rpx;
width: 10rpx;
border-radius: 10rpx;
margin-right: 20rpx;
font-size: 16px;
font-weight: 600;
}
}
.extend_rank {
width: 100%;
background-color: #F5F5F5;
box-sizing: border-box;
padding: 10rpx;
.rank_item {
width: 100%;
margin: 20rpx 0;
box-sizing: border-box;
display: flex;
font-size: 26rpx;
justify-content: space-between;
align-items: center;
image {
width: 10%;
}
text {
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
display: block;
}
.name {
margin: 0 10rpx;
color: #7D7D7D;
width: 20%;
}
.desc {
width: 50%;
color: #ccc;
}
.money {
width: 20%;
text-align: right;
}
}
}
}
.top_head {
height: 435rpx;
width: 100%;
padding: 110rpx 10rpx 0rpx 10rpx;
background: url("https://img1.qunarzz.com/travel/d3/1704/db/34de73c353d44db5.jpg_r_640x426x70_53f464ca.jpg") no-repeat center 0px;
background-size: 100% 100%;
box-sizing: border-box;
.top_desc {
width: 100%;
border-radius: 20rpx;
background-color: #fff;
margin-top: 20rpx;
padding: 20rpx;
box-sizing: border-box;
.text-gray {
font-size: 28rpx;
color: #ccc;
margin-right: 10rpx;
}
.remaining {
font-size: 46rpx;
}
.flex_1 {
flex: 1;
}
.head_block {
margin-top: 20rpx;
.income {
color: #E34B5E;
}
}
}
.text_des {
height: 100rpx;
color: #fff;
font-weight: 900;
position: relative;
margin-left: 60rpx;
text {
display: inline-block;
height: 100%;
}
.month_num {
font-size: 90rpx;
}
.month_text {
font-size: 56rpx;
}
.month_year {
font-size: 22rpx;
position: absolute;
left: 60rpx;
top: 20rpx;
}
.point {
font-size: 40rpx;
}
.title {
font-size: 40rpx;
}
}
}
}
</style>

348
pages_qiun/pages/main/index.vue

@ -1,348 +0,0 @@
<template>
<view class="window">
<!-- #ifndef H5 -->
<view class="topLine" :style="{ height: topBar + 'px' }"></view>
<!-- #endif -->
<view class="nav row_align_center" id="nav">
<li class="li_5" :class="['iconfont icon-zuojiantou back']" @click="gotoBack()"></li>
<text class="title li_5">{{ title ? title : '' }}</text>
<li class="iconfont icon-zuojiantou back hidden"></li>
</view>
<view class="row_align_center head" id="head">
<!-- 日期下拉列表 -->
<drop-down ref="caleDrop" @tap="changDrop(1)" @changeItem="changeTime" :list="timeArray" :contentTop="top"
selectWidth="260rpx" contentLeft="0"></drop-down>
<!-- 日历选择日期 -->
<view v-if="showCalendar"
:class="['dropdown-item__selected', listWidth != '150rpx' ? 'dropdown-item__right' : 'dropdown-item__left']"
@click="openCalendar" class="calendar_drag">
<view class="selected__name">{{ nowDate }}</view>
<li class="iconfont icon-calendar" style="margin-left: 10rpx;"></li>
</view>
<!-- 公司区域下拉列表 -->
<drop-down ref="companyDrop" @tap="changDrop(2)" @changeItem="changeLocation" :list="locationArray"
:contentTop="top" contentRight="10" :selectWidth="showCalendar ? '200rpx' : '300rpx'" listWidth="75%">
</drop-down>
</view>
<uni-calendar ref="calendar" :insert="false" :start-date="startDate" :end-date="endDate" :clearDate="false"
@confirm="confirm">
</uni-calendar>
<!--滑动列表头-->
<wuc-tab id="wuctab" :tab-list="tabList" :tabCur.sync="tabCur" tab-class="text-center text-white bg-blue"
select-class="text-white"></wuc-tab>
<!--主体内容-->
<view class="data_body" :style="{ height: scrollHeight }">
<view v-if="tabCur == 0">
<wechat :scrollHeight="scrollHeight" />
</view>
<view v-else-if="tabCur == 1">
<user-operate :scrollHeight="scrollHeight" />
</view>
<view v-else-if="tabCur == 2">
<user-healthy :scrollHeight="scrollHeight" />
</view>
<view v-else-if="tabCur == 3">
<user-server :scrollHeight="scrollHeight"></user-server>
</view>
</view>
<!--水印-->
<view class="water-mark-mask row_wrap" :style="{ height: scrollHeight }">
<text class="container" v-for="(count, index) in 10" :key="index">{{ info.name }}</text>
</view>
</view>
</template>
<script>
import Wechat from "../../components/data-center/wechat.vue"
import UserOperate from "../../components/data-center/user-operate.vue"
import UserHealthy from "../../components/data-center/user-healthy.vue"
import UserServer from "../../components/data-center/user-server.vue"
import WucTab from '../../components/wuc-tab/wuc-tab.vue'
import DropDown from '../../components/drop-down/drop-down.vue'
import UniCalendar from '../../components/uni-calendar/uni-calendar.vue'
import Config from '../../static/js/config'
import Common from "../../static/js/common"
export default {
components: {
WucTab,
DropDown,
UniCalendar,
Wechat,
UserOperate,
UserHealthy,
UserServer,
},
data() {
return {
tabList: Config.TABLIST, //
timeArray: Config.TIMEARRAY, //
info: '大便超人', //
title: "数据报表中心", //
showDataTime: "today", //
tabCur: 0, //
topBar: 17, //
top: '180', //
scrollHeight: "100%", //
nowDate: Common.getNowDate(), //
endDate: Common.getNowDate(), //
startDate: Common.getPreMonth(Common.getNowDate()), //,
showCalendar: false,
};
},
computed: {
locationArray() {
return [{
value: "GDBJ-ENTRY-1",
text: "天猫"
}, {
value: "GDBJ-ENTRY-201",
text: "京东"
}];
}
},
methods: {
gotoBack() {
Common.navigateBack("/index/index");
},
changDrop(index) {
if (index == 1 && this.$refs.companyDrop.showList) {
this.$refs.companyDrop.closePopup()
} else if (index == 2 && this.$refs.caleDrop.showList) {
this.$refs.caleDrop.closePopup()
}
},
//
openCalendar() {
this.$refs.calendar.open();
},
//
confirm(e) {
if (this.nowDate != e.fulldate || !this.showCalendar) {
this.showCalendar = true;
this.$refs.caleDrop.selectAuto();
this.nowDate = e.fulldate;
this.showDataTime = e.fulldate.replace(/-/g, "");
Common.tipMsg("当前时间:" + this.showDataTime)
}
},
//
changeTime(e) {
if (e.value == "auto") {
this.openCalendar();
} else if (this.showDataTime != e.value) {
this.showDataTime = e.value;
this.showCalendar = false;
Common.tipMsg("当前时间:" + this.showDataTime)
}
},
changeLocation(e) {
Common.tipMsg("当前选中平台:" + e.text)
},
//
async getTelephoneInfo() {
var telephoneInfo = await Common.getTelephoneInfo();
let hasHeight = 0;
if (telephoneInfo.top >= 40) {
this.top = telephoneInfo.statusBarHeight * 2 + 150;
this.topBar = telephoneInfo.statusBarHeight;
}
//
const query = wx.createSelectorQuery();
query.select('#nav').boundingClientRect();
query.select('#head').boundingClientRect();
query.select('#wuctab').boundingClientRect();
query.exec(res => {
res.map((item, index) => {
hasHeight += item.height;
})
this.scrollHeight = (telephoneInfo.screenHeight - hasHeight - this.topBar) + 'px';
})
},
getH5Info() {
uni.getSystemInfo({
success: e => {
let hasHeight = 0;
let element = wx.createSelectorQuery().in(this);
element.select('#nav').boundingClientRect();
element.select('#head').boundingClientRect();
element.select('#wuctab').boundingClientRect();
element.exec(res => {
res.map((item, index) => {
hasHeight += item.height;
})
this.scrollHeight = (e.screenHeight - hasHeight) + 'px';
})
},
fail: (err) => {
reject(err);
}
})
}
},
onReady() {
//#ifndef H5
uni.showShareMenu();
this.getTelephoneInfo();
//#endif
//#ifdef H5
this.getH5Info();
//#endif
}
};
</script>
<style lang="scss">
page,
body {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
}
.li_5 {
list-style-type: none;
}
.window {
height: 100vh;
overflow: hidden;
.topLine {
background-color: #40A2ED;
width: 100%;
}
scroll-view {
box-sizing: border-box;
}
.swiper {
box-sizing: border-box;
}
.nav {
background-image: url(http://photo.gdbjyy.cn/image/BCAI/top_bg.jpg);
background-size: 100% 100%;
.back {
font-size: 54rpx;
padding: 20rpx 14rpx 15rpx 14rpx;
color: #fff;
}
.title {
color: #fff;
font-size: 30rpx;
flex: 1;
text-align: center;
}
.hidden {
visibility: hidden;
}
}
.head {
padding: 0 16rpx 14rpx 16rpx;
color: #fff;
background-color: #40A2ED;
justify-content: space-between;
font-size: 26rpx !important;
.calendar_drag {
width: 340rpx;
display: flex;
justify-content: center;
align-items: center;
.calendar_name {
margin-right: 10rpx;
}
.icon-calendar {
font-size: 26rpx;
margin-top: 4rpx;
}
}
}
.data_body {
overflow: auto;
text-align: center;
color: #333333;
background-repeat: repeat;
background-color: #ffffff;
position: relative;
.item {
padding: 0 20rpx;
margin-bottom: 20rpx;
.name {
font-weight: 600;
font-size: 36rpx;
}
.operate {
view {
padding: 5rpx 12rpx;
color: #fff;
}
.bg-blue {
background-color: #40A2ED;
}
.bg-yellow {
background-color: #FFC300;
}
}
.tip {
margin-bottom: 30rpx;
.update {
color: #C4100A;
margin-left: auto;
font-size: 30rpx;
}
}
}
.cry {
font-size: 96rpx;
margin-bottom: 10rpx;
}
}
}
.water-mark-mask {
width: 100%;
position: fixed;
left: 0;
bottom: 0;
z-index: 1000;
justify-content: space-between;
pointer-events: none; //
flex: 1;
overflow: hidden;
text {
width: 50%;
color: #909399;
opacity: 0.25;
transform: rotate(-15deg);
}
}
.histogram {
height: 100%;
width: 100%;
canvas {
margin-top: 40rpx;
}
}
</style>

259
pages_qiun/pages/school/index.vue

@ -1,259 +0,0 @@
<template>
<view class="body window">
<view class="topLine" :style="{ height: topBar + 'px' }"></view>
<view class="nav row_align_center" id="nav">
<li class="li_6" :class="['iconfont icon-zuojiantou back']" @click="gotoBack()"></li>
<text class="title">{{ title ? title : '' }}</text>
<li class="iconfont icon-zuojiantou back hidden li_6"></li>
</view>
<view class="data_body">
<scroll-view class="scroll_list" scroll-y :style="{ height: scrollHeight }">
<!-- 教学科研情况 -->
<view class="view_block">
<view class="title">教学科研情况</view>
<progress-bar :content="RankData" @updateRanking="updateRanking"></progress-bar>
</view>
<!-- 学历分布状况 -->
<view class="view_block">
<view class="title">学历分布状况
<text class="font-small" style="color: #ccc;">(教职工)</text>
</view>
<view class="charts-box" style="height: 300px;">
<qiun-data-charts type="rose" :chartData="ProductRateData" canvasId="school_a"
:canvas2d="isCanvas2d" :resshow="delayload" />
</view>
</view>
<!-- 学业成绩 -->
<view class="view_block">
<view class="title">学业成绩分布图
<text class="font-small" style="color: #ccc;">(班级)</text>
</view>
<view class="charts-box" style="height: 300px;">
<qiun-data-charts type="radar" :chartData="RadarModel" background="none" canvasId="school_b"
:animation="false" :canvas2d="isCanvas2d" :resshow="delayload" />
</view>
</view>
<!-- 图书借阅情况 -->
<view class="view_block">
<view class="title">图书借阅情况</view>
<view class="charts-box" style="height: 300px;">
<qiun-data-charts type="line" canvasId="school_c" :canvas2d="isCanvas2d" :resshow="delayload"
:ontouch="true"
:opts="{ enableScroll: true, xAxis: { scrollShow: true, itemCount: 4, disableGrid: true }, series: { style: 'curve' } }"
:chartData="friendTrand" />
</view>
</view>
</scroll-view>
</view>
</view>
</template>
<script>
import ProgressBar from "../../components/progress-bar/progress-bar.vue"
import RankData from '../../static/json/school/1.json';
import ProductRateData from '../../static/json/school/2.json';
import RadarModel from '../../static/json/school/3.json';
import friendTrand from '../../static/json/school/4.json';
import Config from '../../static/js/config'
import Common from '../../static/js/common'
export default {
components: {
ProgressBar
},
data() {
return {
info: "大便超人", //
title: "智慧教育报表中心", //
showDataTime: "today", //
tabCur: 0, //
topBar: 17, //
top: '180', //
scrollHeight: "1400rpx", //
friendTrand,
RankData,
ProductRateData,
RadarModel,
isCanvas2d: Config.ISCANVAS2D,
delayload: false, //
};
},
computed: {
locationArray() {
return [{ value: "GDBJ-ENTRY-1", text: "天猫" }, { value: "GDBJ-ENTRY-201", text: "京东" }];
}
},
methods: {
async getData() {
uni.showLoading();
await setTimeout(() => {
this.delayload = true;
uni.hideLoading();
}, 1000)
},
gotoBack() {
Common.navigateBack("/index/index");
},
//
async getTelephoneInfo() {
var telephoneInfo = await Common.getTelephoneInfo();
let hasHeight = 0;
if (telephoneInfo.top >= 40) {
this.top = telephoneInfo.statusBarHeight * 2 + 150;
this.topBar = telephoneInfo.statusBarHeight;
}
//
const query = wx.createSelectorQuery();
query.select('#nav').boundingClientRect();
query.exec(res => {
res.map((item, index) => {
hasHeight += item.height;
})
this.scrollHeight = (telephoneInfo.screenHeight - hasHeight - this.topBar) + 'px';
})
},
updateRanking(nVal) {
this.RankData = nVal;
},
},
onLoad() {
//#ifndef H5
uni.showShareMenu();
//#endif
this.getData()
this.getTelephoneInfo();
}
}
</script>
<style scoped lang="scss">
.body {
height: 100vh;
margin: 0;
padding: 0 20rpx;
font-family: "montserrat";
background-image: linear-gradient(125deg, #CB9FFE, #5894F7, #ABCDFA, #74A3F6, #CB9FFE);
background-size: 400%;
animation: bganimation 15s infinite;
}
.li_6 {
list-style-type: none;
}
page,
body {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
}
.window {
height: 100vh;
overflow: hidden;
.topLine {
width: 100%;
}
scroll-view {
box-sizing: border-box;
}
.swiper {
box-sizing: border-box;
}
.nav {
background-size: 100% 100%;
.back {
font-size: 54rpx;
padding: 20rpx 14rpx 15rpx 14rpx;
color: #fff;
}
.title {
color: #fff;
font-size: 30rpx;
flex: 1;
text-align: center;
}
.hidden {
visibility: hidden;
}
}
.head {
padding: 0 16rpx 14rpx 16rpx;
color: #fff;
background-color: #40A2ED;
justify-content: space-between;
font-size: 26rpx !important;
.calendar_drag {
width: 340rpx;
display: flex;
justify-content: center;
align-items: center;
.calendar_name {
margin-right: 10rpx;
}
.icon-calendar {
font-size: 26rpx;
margin-top: 4rpx;
}
}
}
.data_body {
overflow: auto;
text-align: center;
color: #333333;
background-repeat: repeat;
height: 100%;
.scroll_list {
height: 100%;
.view_block {
background-color: #fff;
padding: 16rpx 20rpx 10rpx 20rpx;
border-radius: 20rpx;
margin-bottom: 40rpx;
.title {
text-align: left;
margin-bottom: 30rpx;
font-size: 30rpx;
}
.trend_title {
text-align: right;
font-size: 22rpx;
color: #ff9900;
margin-top: 50rpx;
}
}
}
}
}
@keyframes bganimation {
0% {
background-position: 0% 50%;
}
50% {
background-position: 100% 50%;
}
100% {
background-position: 0% 50%;
}
}
</style>

762
pages_qiun/pages/sport/index.vue

@ -1,762 +0,0 @@
<template>
<view class="body">
<view class="nav row_align_center" id="nav">
<li class="li_7" style="z-index: 999;font-size: 50rpx;" :class="['iconfont icon-zuojiantou back']" @click="gotoBack()">
</li>
</view>
<view class="head">
<view class="title">运动报告</view>
<view class="customer_img">
<!-- <open-data type="userAvatarUrl" class="img"></open-data> -->
<image class="img" src="https://s1.ax1x.com/2022/11/16/zZUoK1.jpg" mode="widthFix"></image>
</view>
</view>
<view class="score_view">
<view class="title">本次评分</view>
<view class="detail">
<view class="socre">98</view>
<li class="li_7" :class="['iconfont icon-up text-green']" @click="gotoBack()"></li>
<view class="up_socre">0.4</view>
</view>
</view>
<view class="census_view">
<view class="left">
<view class="text_gray small_text">消耗(千卡)</view>
<view class="middle_text text_wide_900">165</view>
</view>
<view class="right">
<view class="text_gray small_text">心率主要集中在</view>
<view style="font-size: 30rpx;">燃烧脂肪</view>
</view>
</view>
<view class="census_view">
<view class="left">
<view class="text_gray small_text">时长(分钟)</view>
<view class="middle_text text_wide_900">75</view>
</view>
<view class="center">
<view class="text_gray small_text">累计打卡()</view>
<view class="middle_text text_wide_900">24</view>
</view>
<view class="right">
<view class="text_gray small_text">平均心率(/分钟)</view>
<view class="middle_text text_wide_900">98</view>
</view>
</view>
<view class="consume_view">
<view class="wrap"><span class="consume_tip">身体消耗</span></view>
<li class="li_7" :class="['iconfont icon-niunai consume_icon']"></li>
<view class="desc">
<view class="small_text">约消耗</view>
<view class="text_wide_900"><text class="left">1000</text><text class="right">毫升牛奶</text></view>
</view>
</view>
<view class="heart_rate_view">
<view class="left">
<li class="li_7" :class="['iconfont icon-zhexiantu']"></li>
<text class="title">心率变化曲线</text>
</view>
<view class="right text_gray">心率变化</view>
</view>
<view v-if="heartRateData.series" class="heart_rate_chart">
<view class="charts-box">
<qiun-data-charts type="tline" canvasId="sport_a" :canvas2d="isCanvas2d" :resshow="delayload"
:opts="{ padding: [0, 20, 10, 0], legend: { position: 'top', lineHeight: 20 }, xAxis: { disableGrid: true, format: 'xAxisDemo3' }, yAxis: { data: [{ min: 0, max: 175 }], gridType: 'solid' }, dataLabel: false, dataPointShape: false }"
:chartData="heartRateData" />
</view>
</view>
<view class="title_view">
<view class="left">
<li class="li_7" :class="['iconfont icon-xinlv']"></li>
<text class="title">心率区间</text>
</view>
</view>
<view class="heart_rate_range">
<view class="top">
<view class="item" v-for="(item, index) in heatRateRange" :key="index">
<view class="name text_gray">{{ item.name }}</view>
<view class="data">{{ item.type }}{{ item.data }}<text class="unit text_gray">分钟</text></view>
</view>
</view>
<view v-if="heartRateRangeData" class="charts-box">
<qiun-data-charts type="ring" canvasId="sport_b" :canvas2d="isCanvas2d" :resshow="delayload"
:opts="{ legend: { position: 'bottom' }, extra: { ring: { border: false, centerColor: '#312C34' } }, title: { name: '' }, subtitle: { name: '' } }"
:chartData="heartRateRangeData" />
</view>
</view>
<view class="title_view">
<view class="left">
<li class="li_7" :class="['iconfont icon-pie']"></li>
<text class="title">运动分析</text>
</view>
</view>
<view class="sport_analysis_view">
<view class="top">
<li class="iconfont icon-feiji li_7"></li>
<text class="title font-s-34">跑步机</text>
</view>
<view class="middle">
<view class="left">
<li class="iconfont icon-clock li_7"></li>
<view>3.24P.M</view>
</view>
<view class="right">
<li class="iconfont icon-huo li_7"></li>
<view>热量消耗(千卡)</view>
</view>
</view>
<view class="bottom">
<view class="left">
<li class="iconfont icon-kongxinyuan li_7"></li>
<view>燃烧脂肪</view>
</view>
<view class="right">
<view class="text_wide_600 font-s-40">637</view>
</view>
</view>
</view>
<view class="box_view speed_rank_view">
<view class="top">
<view class="item" v-for="(item, index) in speedRank" :key="index">
<view class="name text_gray">{{ item.name }}</view>
<view class="data">{{ item.data }}<text class="unit text_gray">{{ item.unit }}</text></view>
</view>
</view>
<view v-if="speedRankData" class="charts-box">
<qiun-data-charts type="bar" canvasId="sport_c" :canvas2d="isCanvas2d" :resshow="delayload"
:chartData="speedRankData" background="none"
:opts="{ xAxis: { disabled: true, disableGrid: true }, extra: { bar: { barBorderCircle: true, width: 20 } }, legend: { show: false } }" />
</view>
</view>
<view class="box_view">
<view v-if="speedAndRateData.series" class="charts-box">
<qiun-data-charts type="tline" canvasId="sport_d" :canvas2d="isCanvas2d" :resshow="delayload"
:opts="{ padding: [0, 20, 10, 0], legend: { position: 'top', lineHeight: 20 }, xAxis: { disableGrid: true, format: 'xAxisDemo3' }, yAxis: { data: [{ position: 'left', min: 0, max: 25 }, { position: 'right', min: 50, max: 175 }], gridType: 'solid' }, dataLabel: false, dataPointShape: false }"
:chartData="speedAndRateData" />
</view>
</view>
</view>
</template>
<script>
import heartRateData from "../../static/json/sport/1.json"
import heartRateRangeData from "../../static/json/sport/2.json"
import speedRankData from "../../static/json/sport/3.json"
import speedAndRateData from "../../static/json/sport/4.json"
import Config from '../../static/js/config'
import Common from '../../static/js/common'
export default {
components: {
},
data() {
return {
info: '大便超人', //
isCanvas2d: Config.ISCANVAS2D,
heartRateData: {},
speedRankData: {},
speedAndRateData: {},
delayload: null,
heartRateRangeData: {},
heatRateRange: [{
name: "激活放松",
data: "5",
type: "≤"
},
{
name: "动态热身",
data: "13",
type: ""
},
{
name: "脂肪燃烧",
data: "24",
type: ""
},
{
name: "糖分消耗",
data: "8",
type: "≤"
},
{
name: "心肺训练",
data: "7",
type: ""
},
{
name: "极限锻炼",
data: "16",
type: ""
},
],
speedRank: [{
name: "距离",
data: "5",
unit: "公里"
},
{
name: "时长",
data: "12",
unit: "分钟"
},
{
name: "平均配速",
data: "6\'05\"",
unit: ""
}
]
};
},
watch: {
},
methods: {
async getData() {
uni.showLoading();
/*将钟点时间随机转成某一天的具体时间戳*/
if (typeof heartRateData.series[0].data[0][0] == 'string') {
for (let i = 0; i < heartRateData.series.length; i++) {
heartRateData.series[i].data.map(x => {
x[0] = "2018/08/08 " + x[0];
x[0] = this.tranTimestamp(x[0]);
return x[0];
})
}
}
if (typeof speedAndRateData.series[0].data[0][0] == 'string') {
for (let i = 0; i < speedAndRateData.series.length; i++) {
speedAndRateData.series[i].data.map(x => {
x[0] = "2018/08/08 " + x[0];
x[0] = this.tranTimestamp(x[0]);
return x[0];
})
}
}
this.heartRateData = heartRateData;
this.heartRateRangeData = heartRateRangeData;
this.speedRankData = speedRankData;
this.speedAndRateData = speedAndRateData;
this.delayload = true;
uni.hideLoading();
},
tranTimestamp(date) {
return new Date(date).getTime()
},
gotoBack() {
Common.navigateBack("/index/index");
},
},
onReady() {
//#ifndef H5
uni.showShareMenu();
//#endif
this.getData()
}
}
</script>
<style scoped lang="scss">
.body {
height: 100%;
background-color: #1C191F;
margin: 0;
color: #fff;
padding: 80rpx 20rpx 0 20rpx;
width: 100%;
box-sizing: border-box;
padding-bottom: 50rpx;
.box_view {
width: 100%;
padding: 20rpx;
position: relative;
background-color: #312C34;
color: #FFFFFF;
box-sizing: border-box;
border-radius: 20rpx;
overflow: hidden;
margin-top: 30rpx;
}
.speed_rank_view {
.top {
width: 100%;
&:after {
content: "";
clear: both;
display: block;
}
.item {
float: left;
width: 33%;
box-sizing: border-box;
padding: 30rpx 20rpx;
text-align: left;
.name {
font-size: 26rpx;
}
.data {
font-size: 40rpx;
margin-top: 10rpx;
.unit {
font-size: 24rpx;
margin-left: 14rpx;
}
}
}
}
}
.sport_analysis_view {
width: 100%;
padding: 20rpx;
position: relative;
background-color: #312C34;
color: #FFFFFF;
box-sizing: border-box;
border-radius: 20rpx;
overflow: hidden;
.top {
width: 100%;
height: 120rpx;
display: flex;
align-items: center;
.icon-feiji {
margin-top: 10rpx;
}
.title {
margin-left: 10rpx;
}
}
.middle {
width: 100%;
display: flex;
justify-content: space-between;
font-size: 28rpx;
.iconfont {
font-size: 28rpx;
margin-right: 10rpx;
margin-top: 4rpx;
}
.left {
width: 50%;
height: 60rpx;
display: flex;
align-items: center;
justify-content: flex-start;
}
.right {
width: 50%;
height: 60rpx;
display: flex;
align-items: center;
justify-content: flex-end;
}
}
.bottom {
width: 100%;
display: flex;
justify-content: space-between;
font-size: 28rpx;
.iconfont {
font-size: 28rpx;
margin-right: 10rpx;
margin-top: 4rpx;
}
.left {
width: 50%;
height: 60rpx;
display: flex;
align-items: center;
justify-content: flex-start;
.icon-kongxinyuan {
color: #6FCEF7;
}
}
.right {
width: 50%;
height: 60rpx;
display: flex;
align-items: center;
justify-content: flex-end;
}
}
}
.heart_rate_range {
width: 100%;
position: relative;
background-color: #312C34;
color: #FFFFFF;
box-sizing: border-box;
border-radius: 20rpx;
overflow: hidden;
.top {
width: 100%;
&:after {
content: "";
clear: both;
display: block;
}
.item {
float: left;
width: 33%;
box-sizing: border-box;
padding: 30rpx 20rpx;
text-align: center;
.name {
font-size: 26rpx;
}
.data {
font-size: 40rpx;
margin-top: 10rpx;
.unit {
font-size: 24rpx;
margin-left: 14rpx;
}
}
}
}
}
.heart_rate_chart {
display: flex;
justify-content: center;
width: 100%;
position: relative;
background-color: #312C34;
color: #FFFFFF;
box-sizing: border-box;
border-radius: 20rpx;
overflow: hidden;
}
.title_view {
display: flex;
width: 100%;
align-items: center;
height: 150rpx;
.left {
display: flex;
align-items: center;
.iconfont {
font-size: 40rpx !important;
}
.title {
font-size: 34rpx;
margin-left: 20rpx;
}
}
}
.heart_rate_view {
display: flex;
width: 100%;
justify-content: space-around;
align-items: center;
height: 150rpx;
.left {
display: flex;
align-items: center;
.icon-zhexiantu {
font-size: 26rpx;
}
.title {
font-size: 34rpx;
margin-left: 20rpx;
}
}
.right {
font-size: 22rpx;
padding: 10rpx 30rpx;
border-radius: 40rpx;
background-color: #342E39;
}
}
.consume_view {
display: flex;
justify-content: center;
width: 100%;
height: 190rpx;
position: relative;
margin-top: 100rpx;
background-color: #312C34;
color: #FFFFFF;
box-sizing: border-box;
border-radius: 10rpx;
.consume_img {
width: 240rpx;
height: auto;
position: absolute;
top: -80rpx;
left: 20rpx;
}
.consume_icon {
font-size: 220rpx;
position: absolute;
top: -80rpx;
left: 20rpx;
}
.desc {
position: absolute;
right: 80rpx;
top: 20rpx;
view {
padding: 10rpx 0;
display: flex;
align-items: center;
}
.left {
font-size: 50rpx;
}
.right {
font-size: 30rpx;
margin-left: 10rpx;
font-weight: 400;
}
}
}
.text-green {
color: #10A764;
}
.text_gray {
color: #8E8B8B;
}
.small_text {
font-size: 24rpx;
}
.font-s-34 {
font-size: 34rpx;
}
.font-s-36 {
font-size: 36rpx;
}
.font-s-38 {
font-size: 38rpx;
}
.font-s-40 {
font-size: 40rpx;
}
.middle_text {
font-size: 36rpx;
}
.text_wide_900 {
font-weight: 900;
}
.text_wide_600 {
font-weight: 600;
}
.census_view {
width: 100%;
display: flex;
justify-content: space-around;
.left {
text-align: left;
view {
padding: 10rpx 0;
}
}
.center {
text-align: center;
view {
padding: 10rpx 0;
}
}
.right {
text-align: right;
view {
padding: 10rpx 0;
}
}
}
.score_view {
width: 100%;
.title {
color: #8E8B8B;
font-size: 24rpx;
}
.detail {
height: 120rpx;
width: 100%;
display: flex;
align-items: flex-end;
.icon-up {
margin-left: 40rpx;
height: 54rpx;
font-weight: 600;
}
.socre {
font-size: 80rpx;
font-weight: 900;
}
.up_socre {
color: #10A764;
height: 50rpx;
font-size: 24rpx;
font-weight: 600;
}
}
}
.head {
height: 140rpx;
line-height: 140rpx;
position: relative;
.title {
font-size: 40rpx;
margin-left: 20rpx;
}
.customer_img {
position: absolute;
bottom: 0rpx;
right: 20rpx;
width: 100rpx;
height: 100rpx;
margin: 0;
padding: 0;
background-size: 100% 100%;
border-radius: 100%;
overflow: hidden;
.img {
height: auto;
width: 100%;
}
}
}
.li_7 {
list-style-type: none;
}
.nav {
position: fixed;
top: 50rpx;
left: 20rpx;
}
}
.consume_view:nth-child(even) {
margin-right: 4%;
}
.consume_tip {
display: inline-block;
text-align: center;
width: 188rpx;
height: 30rpx;
line-height: 30rpx;
position: absolute;
top: 36rpx;
right: -44rpx;
z-index: 2;
overflow: hidden;
transform: rotate(45deg);
-ms-transform: rotate(45deg);
-moz-transform: rotate(45deg);
-webkit-transform: rotate(45deg);
-o-transform: rotate(45deg);
border: 1px dashed;
box-shadow: 0 0 0 3px #10A764, 0px 21px 5px -18px rgba(0, 0, 0, 0.6);
background: #10A764;
font-size: 16rpx;
}
.wrap {
width: 100%;
height: 100%;
position: absolute;
top: -12rpx;
left: 12rpx;
overflow: hidden;
}
.wrap:before {
content: "";
display: block;
border-radius: 8px 8px 0px 0px;
width: 80rpx;
height: 14rpx;
position: absolute;
right: 68rpx;
top: -1px;
background: #4D6530;
}
.wrap:after {
content: "";
display: block;
border-radius: 0px 8px 8px 0px;
width: 14rpx;
height: 80rpx;
position: absolute;
right: -1px;
top: 66rpx;
background: #4D6530;
}</style>

170
pages_qiun/static/js/common.js

@ -1,170 +0,0 @@
let isReadyLogin = 1
let loginFlag = 1
export default {
//提示窗
tipMsg: function (title, icon, time, mask,callback) {
title = title == undefined ? "系统繁忙" : title;
icon = icon == undefined ? "none" : icon;
time = time == undefined ? 1300 : time;
mask = mask == undefined ? true : mask;
uni.showToast({
title: title,
icon: icon,
mask: mask,
duration: time,
success() {
if(callback){
setTimeout(()=>{
callback()
},time);
}
}
})
},
getTelephoneInfo(){
return new Promise((resolve, reject) => {
var data = uni.getStorageSync("telephoneInfo");
if(!data){
// 获取右上角胶囊的位置信息
//#ifndef H5
let btn = wx.getMenuButtonBoundingClientRect();
uni.getSystemInfo({
success: e => {
let info = {
screenHeight:e.screenHeight,
statusBarHeight:e.statusBarHeight,
windowWidth:e.windowWidth,
top:btn.top
}
uni.setStorageSync("telephoneInfo",info);
resolve(info);
},
fail: (err) => {
reject(err);
}
})
//#endif
}else{
resolve(data);
}
})
},
// 获取当前年月日
getNowDate(){
let date = new Date;
let now = date.getFullYear() + "-" + (date.getMonth()+1) + "-" + date.getDate();
return now;
},
// 获取上个月的年月日
getPreMonth(date) {
var arr = date.split('-');
var year = arr[0]; //获取当前日期的年份
var month = arr[1]; //获取当前日期的月份
var day = arr[2]; //获取当前日期的日
var days = new Date(year, month, 0);
days = days.getDate(); //获取当前日期中月的天数
var year2 = year;
var month2 = parseInt(month) - 1;
if (month2 == 0) {
year2 = parseInt(year2) - 1;
month2 = 12;
}
var day2 = day;
var days2 = new Date(year2, month2, 0);
days2 = days2.getDate();
if (day2 > days2) {
day2 = days2;
}
if (month2 < 10) {
month2 = '0' + month2;
}
var t2 = year2 + '-' + month2 + '-' + "01";
return t2;
},
//检测小程序更新
checkUpdateVersion(){
//新版本更新
if (uni.canIUse('getUpdateManager')) {
//判断当前微信版本是否支持版本更新
const updateManager = uni.getUpdateManager();
updateManager.onCheckForUpdate(function (res) {
if (res.hasUpdate) {
// 请求完新版本信息的回调
updateManager.onUpdateReady(function () {
uni.showModal({
title: '更新提示',
content: '已更新版本,是否重启小程序?',
showCancel:false,
cancelColor:'#eeeeee',
confirmColor:'#40A2ED',
success: function (res) {
if (res.confirm) {
// 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
updateManager.applyUpdate();
}
},
});
});
// 新的版本下载失败
updateManager.onUpdateFailed(function () {
uni.showModal({
title: '更新失败',
content: '请检查网络设置,若仍更新失败,重新搜索打开',
success(res) {
if (res.confirm) {
// 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
updateManager.applyUpdate();
}
}
});
});
}
});
} else {
uni.showModal({
// 如果希望用户在最新版本的客户端上体验您的小程序,可以这样子提示
title: '提示',
content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。',
});
}
},
/**
* @param {string} url 目标页面的路由
* @param {Object} param 传递给目标页面的参数
* @description 处理目标页面的参数转成json字符串传递给param字段在目标页面通过JSON.parse(options.param)接收
*/
navigateTo(url, param = {},flag) {
if(isReadyLogin<=0 && !flag){
this.loginTip();
}else{
let part = '';
for(var item in param){
part += '&' + item + '=' + param[item];
}
url = url + part.replace('&','?');
uni.navigateTo({
url: url,
fail:err=> {
this.tipMsg('页面正在火速开发中,敬请期待!');
},
})
}
},
navigateBack(url, param = {}) {
if (loginFlag <= 0) {
this.tipMsg("很抱歉,你没有权限!");
} else {
let part = '';
for (var item in param) {
part += '&' + item + '=' + param[item];
}
url = "/pages" + url + part.replace('&', '?');
uni.navigateBack({
url: url,
fail: err => {
this.tipMsg('暂未开放该功能!');
},
})
}
},
}

79
pages_qiun/static/js/config.js

@ -1,79 +0,0 @@
const COLOR = [
"#EE6A66", "#6BC588", "#FFC300", "#24ABFD"
];
var ISCANVAS2D = true;
switch (uni.getSystemInfoSync().platform) {
case 'android':
ISCANVAS2D = true
break;
case 'ios':
ISCANVAS2D = true
break;
default:
ISCANVAS2D = false
break;
}
const RESPOND = {
success: 0,
warn: 301,
error: 500,
};
const TIMEARRAY = [
{
text: '当天',
value: 'today'
},
{
text: '昨天',
value: 'yesterday'
},
{
text: '本周',
value: 'week'
},
{
text: '上周',
value: 'weeklast'
},
{
text: '本月',
value: 'month'
},
{
text: '上月',
value: 'monthlast'
},
{
text: '指定日期',
value: 'auto'
}
];
const TABLIST = [
{name:"企业微信",type:"WECHAT"},
{name:"会员运营",type:"OPERATE"},
{name:"会员健康",type:"GJJK"},
{name:"会员服务",type:"SERVICE"},
];
const CARD_MENU = [
{title:"会员报表中心",author:"howcode",img:"https://s1.ax1x.com/2023/03/31/ppRp4iV.jpg",url:"/myPackageA/pages/main/index"},
{title:"智慧教育报表中心",author:"howcode",img:"https://s1.ax1x.com/2023/03/31/ppRp5GT.jpg",url:"/myPackageA/pages/school/index"},
{title:"差旅报表中心",author:"秋云",img:"https://s1.ax1x.com/2023/03/31/ppRpfI0.jpg",url:""},
{title:"运动报表中心",author:"howcode",img:"https://s1.ax1x.com/2023/03/31/ppRpWaq.jpg",url:"/myPackageA/pages/sport/index"},
{title:"财务报表中心",author:"howcode",img:"https://s1.ax1x.com/2023/03/31/ppRpozF.jpg",url:"/myPackageA/pages/finance/index"},
]
export default {
COLOR,
TIMEARRAY,
TABLIST,
RESPOND,
ISCANVAS2D,
CARD_MENU
}

68
pages_qiun/static/json/finance/1.json

@ -1,68 +0,0 @@
{
"expend":{
"categories": [
"1月",
"2月",
"2月",
"4月",
"5月"
],
"series": [
{
"name": "支出情况",
"data": [1201,2501.5,985,1760,2013.85],
"type": "line",
"style": "curve",
"color": "#4ECDB6",
"unit":""
}
],
"yAxis":[
{"calibration":true,"position":"left","title":"单位/元","titleFontSize":12,"unit":"","tofix":0,"min":0,"disableGrid":true}
]
},
"income":{
"categories": [
"1月",
"2月",
"2月",
"4月",
"5月"
],
"series": [
{
"name": "收入情况",
"data": [1601,1840.5,1900,1760,1500.85],
"type": "line",
"style": "curve",
"color": "#4ECDB6",
"unit":""
}
],
"yAxis":[
{"calibration":true,"position":"left","title":"单位/元","titleFontSize":12,"unit":"","tofix":0,"min":0,"disableGrid":true}
]
},
"remaining":{
"categories": [
"1月",
"2月",
"2月",
"4月",
"5月"
],
"series": [
{
"name": "结余情况",
"data": [815,712.5,378,450,600.85],
"type": "line",
"style": "curve",
"color": "#4ECDB6",
"unit":""
}
],
"yAxis":[
{"calibration":true,"position":"left","title":"单位/元","titleFontSize":12,"unit":"","tofix":0,"min":0,"disableGrid":true}
]
}
}

33
pages_qiun/static/json/finance/2.json

@ -1,33 +0,0 @@
{
"series": [
{
"data":[
{
"name": "住房相关",
"value": 3200,
"color":"#4DCCB3"
},
{
"name": "食品酒水",
"value": 1020,
"color":"#5A77EC"
},
{
"name": "娱乐休闲",
"value": 500,
"color":"#4E94EC"
},
{
"name": "交流通讯",
"value": 214.5,
"color":"#4FD4EB"
},
{
"name": "其他",
"value": 320.13,
"color":"#B5ED21"
}
]
}
]
}

26
pages_qiun/static/json/school/1.json

@ -1,26 +0,0 @@
[
{
"name":"课题研究",
"num":500,
"width":"",
"background":"#FFBE68"
},
{
"name":"论文发布",
"num":300,
"width":"",
"background":"#0FEBE1"
},
{
"name":"实践研究",
"num":455,
"width":"",
"background":"#BF8DFC"
},
{
"name":"评教",
"num":601,
"width":"",
"background":"#FF859C"
}
]

28
pages_qiun/static/json/school/2.json

@ -1,28 +0,0 @@
{
"series": [
{
"data": [
{
"name": "本科",
"value": 168,
"color": "#FFBF31"
},
{
"name": "大专",
"value": 144,
"color": "#3CEFC4"
},
{
"name": "博士",
"value": 123,
"color": "#FFA9B3"
},
{
"name": "硕士",
"value": 96,
"color": "#3CBBFF"
}
]
}
]
}

27
pages_qiun/static/json/school/3.json

@ -1,27 +0,0 @@
{
"categories":["语文","数学","英语","物理","化学","生物"],
"series":[
{
"name":"一班",
"area":[123.45,234,192.5,245],
"color":"#1890ff",
"data":[90,110,165,195,187,172],
"index":0,
"legendShape":"circle",
"pointShape":"",
"show": true,
"type": "radar"
},
{
"name":"二班",
"area":[192.5,234,261.55,245],
"color":"#2fc25b",
"data":[190,210,105,35,27,102],
"index":0,
"legendShape":"circle",
"pointShape":"",
"show": true,
"type": "radar"
}
]
}

29
pages_qiun/static/json/school/4.json

@ -1,29 +0,0 @@
{
"categories": [
"1",
"2",
"2",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12"
],
"series": [
{
"name": "图书借阅人数",
"data": [6,8,9,8.2,7.5,9,10.3,8,12,6.2,7.2,4.5],
"type": "line",
"style": "curve",
"color": "#A800FB",
"unit":""
}
],
"yAxis":[
{"calibration":true,"position":"left","title":"单位/千","titleFontSize":12,"unit":"","tofix":0,"min":0,"max":20,"disableGrid":true}
]
}

80
pages_qiun/static/json/sport/1.json

@ -1,80 +0,0 @@
{
"series": [{
"name": "激活放松",
"color": "#FDEC9F",
"data": [
["17:24", 75],
["17:26", 83],
["17:28", 88],
["17:30", 92]
]
},
{
"name": "动态热身",
"color": "#FBCD2B",
"data": [
["17:30", 92],
["17:32", 96],
["17:34", 94],
["17:36", 93.5],
["17:38", 94.6],
["17:40", 98]
]
},
{
"name": "糖分消耗",
"color": "#FC9E83",
"data": [
["17:40", 98],
["17:42", 100],
["17:44", 104],
["17:46", 113],
["17:48", 142]
]
},
{
"name": "脂肪燃烧",
"color": "#EF6DCF",
"data": [
["17:48", 142],
["17:50", 130],
["17:52", 134],
["17:54", 150],
["17:56", 148],
["17:58", 142],
["18:00", 132],
["18:02", 136],
["18:04", 136.5]
]
},
{
"name": "心肺训练",
"color": "#BC38E5",
"data": [
["18:04", 136.5],
["18:06", 140],
["18:08", 135],
["18:10", 130],
["18:12", 124],
["18:14", 120],
["18:16", 118],
["18:18", 116.5],
["18:20", 112]
]
}, {
"name": "极限锻炼",
"color": "#8908FA",
"data": [
["18:20", 112],
["18:22", 123],
["18:24", 130],
["18:26", 138],
["18:28", 116],
["18:30", 123],
["18:32", 128],
["18:34", 126],
["18:36", 137]
]
}
]
}

38
pages_qiun/static/json/sport/2.json

@ -1,38 +0,0 @@
{
"series": [
{
"data": [
{
"name": "激活放松",
"value": 5,
"color": "#FDEC9F"
},
{
"name": "动态热身",
"value": 13,
"color": "#FBCD2B"
},
{
"name": "糖分消耗",
"value": 8,
"color": "#FC9E83"
},
{
"name": "脂肪燃烧",
"value": 24,
"color": "#EF6DCF"
},
{
"name": "心肺训练",
"value": 7,
"color": "#BC38E5"
},
{
"name": "极限锻炼",
"value": 16,
"color": "#8908FA"
}
]
}
]
}

22
pages_qiun/static/json/sport/3.json

@ -1,22 +0,0 @@
{
"categories": [
"1",
"2",
"3",
"4",
"5"
],
"series": [
{
"name": "公里配速",
"data": [
5.09,
6.18,
6.38,
7.15,
9.05
],
"color":"#FFD597"
}
]
}

174
pages_qiun/static/json/sport/4.json

@ -1,174 +0,0 @@
{
"series": [
{
"name": "速度",
"color": "#1C9862",
"index":0,
"data": [
[
"17:24",
0
],
[
"17:26",
1
],
[
"17:28",
1.2
],
[
"17:30",
1.6
],
[
"17:32",
1.8
],
[
"17:34",
2
],
[
"17:36",
4
],
[
"17:38",
6.5
],
[
"17:40",
10
],
[
"17:42",
13.4
],
[
"17:44",
13
],
[
"17:46",
12.6
],
[
"17:48",
12.2
],
[
"17:50",
14
],
[
"17:52",
16.8
],
[
"17:54",
20
],
[
"17:56",
25
],
[
"17:58",
23
],
[
"18:00",
16
]
]
},
{
"name": "心率",
"index":1,
"color": "#FBCD2B",
"data": [
[
"17:24",
72
],
[
"17:26",
73
],
[
"17:28",
73.5
],
[
"17:30",
74
],
[
"17:32",
76.5
],
[
"17:34",
78
],
[
"17:36",
80
],
[
"17:38",
76.3
],
[
"17:40",
75
],
[
"17:42",
86
],
[
"17:44",
84
],
[
"17:46",
90
],
[
"17:48",
100
],
[
"17:50",
112
],
[
"17:52",
125
],
[
"17:54",
117
],
[
"17:56",
110
],
[
"17:58",
108
],
[
"18:00",
104
]
]
}
],
"yAxis":[
{"calibration":true,"position":"left","title":"","titleFontSize":12,"unit":"","tofix":0,"min":0,"max":25,"disableGrid":true},
{"calibration":true,"position":"right","title":"","titleFontSize":12,"unit":"","tofix":0,"min":0,"disableGrid":true}
]
}

21
pages_qiun/static/json/user-healthy/1.json

@ -1,21 +0,0 @@
[
{
"expect": "",
"now": "",
"name": "时间进度",
"value": "60.12"
},
{
"expect": "30000",
"now": "36000",
"dataType": "1",
"name": "会员拉新",
"value": "120"
},
{
"expect": "",
"now": "",
"name": "扫码渗透率",
"value": "35"
}
]

34
pages_qiun/static/json/user-healthy/2.json

@ -1,34 +0,0 @@
[
{
"kind":1,
"background":["#B678FD","#4A64F9"],
"content":[
{"text":"","value":"1800","colortext":"","colorvalue":"#fff","size":"44rpx"},
{"text":"日均新增目标","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"}
]
},
{
"kind":1,
"background":["#B678FD","#4A64F9"],
"content":[
{"text":"","value":"1960","colortext":"","colorvalue":"#fff","size":"44rpx"},
{"text":"当日新增会员","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"}
]
},
{
"kind":1,
"background":["#B678FD","#4A64F9"],
"content":[
{"text":"","value":"36050","colortext":"","colorvalue":"#fff","size":"44rpx"},
{"text":"本月新增会员","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"}
]
},
{
"kind":1,
"background":["#B678FD","#4A64F9"],
"content":[
{"text":"","value":"3%","colortext":"","colorvalue":"#fff","size":"44rpx"},
{"text":"日均环比","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"}
]
}
]

74
pages_qiun/static/json/user-healthy/3.json

@ -1,74 +0,0 @@
{
"categories": [
"1月11",
"1月12",
"1月11",
"1月14",
"1月15"
],
"series": [{
"name": "新增会员数",
"data": [{
"value": 5,
"color": "#24ABFD"
},
{
"value": -3,
"color": "#24ABFD"
},
{
"value": 3.5,
"color": "#24ABFD"
},
{
"value": 10,
"color": "#24ABFD"
},
{
"value": 2.8,
"color": "#24ABFD"
}
],
"type": "column",
"color": "#24ABFD",
"unit": "",
"textNoShow": true
},
{
"name": "当日达成率",
"data": [
101,
91,
97,
131,
109
],
"type": "line",
"addPoint": true,
"color": "#DF297D",
"unit": "%",
"index": 1
},
{
"name": "日均达成率",
"data": [
102,
92,
96,
115,
105
],
"type": "line",
"color": "#24ABFD",
"unit": "%",
"index": 1
}
],
"yAxis": [{
"max": 20,
"min": 0
}, {
"max": 200,
"min": 0
}]
}

26
pages_qiun/static/json/user-healthy/4.json

@ -1,26 +0,0 @@
[
{
"kind":1,
"background":["#B678FD","#4A64F9"],
"content":[
{"text":"","value":"42%","colortext":"","colorvalue":"#fff","size":"44rpx"},
{"text":"当日扫码率","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"}
]
},
{
"kind":1,
"background":["#B678FD","#4A64F9"],
"content":[
{"text":"","value":"37%","colortext":"","colorvalue":"#fff","size":"44rpx"},
{"text":"累计扫码率","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"}
]
},
{
"kind":2,
"background":["#B678FD","#4A64F9"],
"content":[
{"text":"环比增长","value":"3.2%","colortext":"#fff","colorvalue":"#fff","size":"24rpx"},
{"text":"同比增长","value":"1.1%","colortext":"#fff","colorvalue":"#fff","size":"24rpx"}
]
}
]

57
pages_qiun/static/json/user-healthy/5.json

@ -1,57 +0,0 @@
{
"categories": [
"1月11",
"1月12",
"1月13",
"1月14",
"1月15"
],
"series": [{
"name": "当天扫码率",
"data": [
39,
34,
36,
45,
38
],
"type": "line",
"addPoint": true,
"color": "#24ABFD",
"unit": "%"
},
{
"name": "累计扫码率",
"data": [
32,
30,
31,
37,
35
],
"type": "line",
"addPoint": true,
"color": "#DF297D",
"unit": "%"
},
{
"name": "目标扫码率",
"data": [
40,
40,
40,
40,
40
],
"type": "line",
"color": "#FF9900",
"textNoShow": true,
"unit": ""
}
],
"yAxis": [{
"max": 60,
"min": 0
}]
}

12
pages_qiun/static/json/user-healthy/6.json

@ -1,12 +0,0 @@
[
{
"kind":3,
"background":["#B678FD","#4A64F9"],
"content":[
{"text":"","value":"38%","colortext":"","colorvalue":"#fff","size":"44rpx"},
{"text":"小程序购买活跃会员占比","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"},
{"text":"同比","value":"2.5%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"},
{"text":"环比","value":"3.2%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"}
]
}
]

89
pages_qiun/static/json/user-healthy/7.json

@ -1,89 +0,0 @@
{
"categories": [
"1月11",
"1月12",
"1月11",
"1月14",
"1月15"
],
"series": [{
"name": "新增会员数",
"data": [{
"value": 5,
"color": "#24ABFD"
},
{
"value": -3,
"color": "#24ABFD"
},
{
"value": 3.5,
"color": "#24ABFD"
},
{
"value": 10,
"color": "#24ABFD"
},
{
"value": 2.8,
"color": "#24ABFD"
}
],
"type": "column",
"color": "#24ABFD",
"unit": "",
"textNoShow": true
},
{
"name": "当日达成率",
"data": [
101,
91,
97,
131,
109
],
"type": "line",
"addPoint": true,
"color": "#DF297D",
"unit": "%",
"index": 1
},
{
"name": "日均达成率",
"data": [
102,
92,
96,
115,
105
],
"type": "line",
"style": "curve",
"color": "#ff9900",
"unit": "%",
"index": 1
},
{
"name": "日均达成率",
"data": [
102,
92,
96,
115,
105
],
"type": "area",
"color": "#ff9900",
"unit": "%",
"index": 1
}
],
"yAxis": [{
"max": 20,
"min": 0
}, {
"max": 200,
"min": 0
}]
}

22
pages_qiun/static/json/user-operate/1.json

@ -1,22 +0,0 @@
[
{
"expect": "",
"now": "",
"name": "时间进度",
"value": "50.88"
},
{
"expect": "54800",
"now": "51000",
"dataType": "1",
"name": "新开会员",
"value": "93.07"
},
{
"expect": "30000",
"now": "25600",
"dataType": "1",
"name": "新增消费会员",
"value": "85.33"
}
]

35
pages_qiun/static/json/user-operate/2.json

@ -1,35 +0,0 @@
[
{
"kind":5,
"background":["#F77E89","#F7953B"],
"content":[
{"text":"扫一扫","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"},
{"text":"","value":"63%","colortext":"","colorvalue":"#fff","size":"44rpx"},
{"text":"环比","value":"81.5%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"},
{"text":"同比","value":"-81.3%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"},
{"text":"平均参考水平","value":"85%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"}
]
},
{
"kind":5,
"background":["#F77E89","#F7953B"],
"content":[
{"text":"二维码识别","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"},
{"text":"","value":"13%","colortext":"","colorvalue":"#fff","size":"44rpx"},
{"text":"环比","value":"2%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"},
{"text":"同比","value":"-0.8%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"},
{"text":"平均参考水平","value":"80%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"}
]
},
{
"kind":5,
"background":["#F77E89","#F7953B"],
"content":[
{"text":"最近使用","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"},
{"text":"","value":"21%","colortext":"","colorvalue":"#fff","size":"44rpx"},
{"text":"环比","value":"1%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"},
{"text":"同比","value":"-0.8%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"},
{"text":"平均参考水平","value":"80%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"}
]
}
]

35
pages_qiun/static/json/user-operate/3.json

@ -1,35 +0,0 @@
[
{
"kind":5,
"background":["#F77E89","#F7953B"],
"content":[
{"text":"会员销售占比","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"},
{"text":"","value":"80%","colortext":"","colorvalue":"#fff","size":"44rpx"},
{"text":"环比","value":"81.5%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"},
{"text":"同比","value":"-81.3%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"},
{"text":"平均参考水平","value":"85%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"}
]
},
{
"kind":5,
"background":["#F77E89","#F7953B"],
"content":[
{"text":"会员客流占比","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"},
{"text":"","value":"79%","colortext":"","colorvalue":"#fff","size":"44rpx"},
{"text":"环比","value":"2%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"},
{"text":"同比","value":"-0.8%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"},
{"text":"平均参考水平","value":"80%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"}
]
},
{
"kind":5,
"background":["#F77E89","#F7953B"],
"content":[
{"text":"会员客单价","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"},
{"text":"","value":"79元","colortext":"","colorvalue":"#fff","size":"44rpx"},
{"text":"环比","value":"1%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"},
{"text":"同比","value":"-0.8%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"},
{"text":"平均参考水平","value":"80%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"}
]
}
]

61
pages_qiun/static/json/user-operate/4.json

@ -1,61 +0,0 @@
{
"categories": [
"1周",
"2周",
"3周",
"4周",
"5周"
],
"series": [{
"name": "同比增长率",
"data": [{
"value": 5,
"color": "#24ABFD"
},
{
"value": -3,
"color": "#24ABFD"
},
{
"value": 3.5,
"color": "#24ABFD"
},
{
"value": 10,
"color": "#24ABFD"
},
{
"value": 2.8,
"color": "#24ABFD"
}
],
"type": "column",
"color": "#24ABFD",
"index": 1,
"unit": "%"
},
{
"name": "消费金额",
"data": [
1850,
1660,
1760,
2360,
1970
],
"type": "line",
"addPoint": true,
"color": "#DF297D",
"unit": ""
}
],
"target": 1800,
"yAxis": [{
"max": 3000,
"min": 0
}, {
"max": 20,
"min": 0
}],
"targetAdd": "9%"
}

88
pages_qiun/static/json/user-operate/6.json

@ -1,88 +0,0 @@
{
"headers":[
{
"label": "最近活跃时间",
"key": "col1"
}, {
"label": "人数",
"key": "col2"
}, {
"label": "人数占比",
"key": "col3"
}, {
"label": "活跃会员环比",
"key": "col4"
}, {
"label": "活跃消费人数占比",
"key": "col5"
}
],
"contents":[
{
"col1": "0-30天",
"col2": "15350",
"col3": "45",
"col4": "9.5",
"col5": "29"
}, {
"col1": "30-60天",
"col2": "15350",
"col3": "13",
"col4": "-2.5",
"col5": "-25"
}, {
"col1": "60-90天",
"col2": "15371",
"col3": "15",
"col4": "-5.2",
"col5": "63"
}, {
"col1": "90-120天",
"col2": "12340",
"col3": "12",
"col4": "2.9",
"col5": "-12"
}, {
"col1": "120-180天",
"col2": "12360",
"col3": "17",
"col4": "3.5",
"col5": "11"
}
],
"sortCol":[
{
"key": "col1",
"isNumber": false
}, {
"key": "col2",
"isNumber": true
},
{
"key": "col3",
"isNumber": true
},
{
"key": "col4",
"isNumber": true
},
{
"key": "col5",
"isNumber": true
}
],
"computedCol":["col2","col3","col4","col5"],
"formatCol":[{
"key": "col3",
"template": "#col3#%",
"bottomComputedFormat": true
}, {
"key": "col4",
"template": "#col4#%",
"bottomComputedFormat": true
}, {
"key": "col5",
"template": "#col5#%",
"bottomComputedFormat": true
}]
}

25
pages_qiun/static/json/user-operate/7.json

@ -1,25 +0,0 @@
[{
"series": [{
"color": "#24ABFD",
"data": 0.18,
"index": 0,
"legendShape": "circle",
"name": "当前脱落率",
"pointShape": "circle",
"show": true,
"type": "arcbar"
}]
},
{
"series": [{
"color": "#F04864",
"data": 0.25,
"index": 0,
"legendShape": "circle",
"name": "脱落率警示线",
"pointShape": "circle",
"show": true,
"type": "arcbar"
}]
}
]

36
pages_qiun/static/json/user-operate/8.json

@ -1,36 +0,0 @@
{
"categories": [
"高血压",
"糖尿病",
"痛风",
"血脂",
"尿酸"
],
"series": [{
"name": "今周脱落率",
"data": [{
"value": 6,
"color": "#24ABFD"
},
{
"value": 3.2,
"color": "#24ABFD"
},
{
"value": 5.5,
"color": "#24ABFD"
},
{
"value": 8,
"color": "#24ABFD"
},
{
"value": 6,
"color": "#24ABFD"
}
],
"type": "column",
"color": "#24ABFD",
"unit": "%"
}]
}

26
pages_qiun/static/json/user-operate/9.json

@ -1,26 +0,0 @@
[{
"series": [{
"color": "#24ABFD",
"data": 0.75,
"index": 0,
"legendShape": "circle",
"name": "当前脱落率",
"pointShape": "circle",
"show": true,
"type": "arcbar"
}]
},
{
"series": [{
"color": "#F04864",
"data": 0.33,
"index": 0,
"legendShape": "circle",
"name": "脱落率警示线",
"pointShape": "circle",
"show": true,
"type": "arcbar"
}]
}
]

62
pages_qiun/static/json/user-server/1.json

@ -1,62 +0,0 @@
[
{
"series": [{
"color": "#fff",
"data": 0.224,
"precent":"22.4%",
"index": 0,
"legendShape": "circle",
"name": "B2C销售额",
"pointShape": "circle",
"show": true,
"type": "arcbar",
"value":"12786",
"backgroundColor":"#00AEF9"
}]
},
{
"series": [{
"color": "#fff",
"data": 0.3717,
"precent":"37.17%",
"index": 0,
"legendShape": "circle",
"name": "B2C毛利率",
"pointShape": "circle",
"show": true,
"type": "arcbar",
"value":"1096",
"backgroundColor":"#F55676"
}]
},
{
"series": [{
"color": "#fff",
"data": 0.0017,
"precent":"0.17%",
"index": 0,
"legendShape": "circle",
"name": "O2O销售额",
"pointShape": "circle",
"show": true,
"type": "arcbar",
"value":"147604",
"backgroundColor":"#FAB215"
}]
},
{
"series": [{
"color": "#fff",
"data": 0.6321,
"precent":"63.21%",
"index": 0,
"legendShape": "circle",
"name": "O2O毛利率",
"pointShape": "circle",
"show": true,
"type": "arcbar",
"value":"173",
"backgroundColor":"#2EC693"
}]
}
]

29
pages_qiun/static/json/user-server/2.json

@ -1,29 +0,0 @@
{
"series": [
{
"name": "任务栏最近使用",
"data": 500,
"color":"#2fc25b"
},
{
"name": "最近使用小程序列表",
"data": 623,
"color":"#facc14"
},
{
"name": "手机系统",
"data": 123,
"color":"#f04864"
},
{
"name": "任务栏我的小程序",
"data": 96,
"color":"#8543e0"
},
{
"name": "其他",
"data": 423,
"color":"#51c2d5"
}
]
}

36
pages_qiun/static/json/user-server/3.json

@ -1,36 +0,0 @@
{
"categories": [
"周一", "周二", "周三", "周四", "周五",
"周六",
"周日"
],
"series": [
{
"name": "老会员", "data": [ 1850, 1660, 1760, 2360, 1560, 1970, 2570 ], "type": "line",
"style": "curve",
"addPoint": true, "color": "#DF297D",
"unit":""
},
{
"name": "新会员",
"data": [
450,
260,
360,
560,
460,
170,
570
],
"type": "line",
"style": "curve",
"addPoint": true,
"color": "#ff9900",
"unit":""
}
],
"yAxis":[
{"calibration":true,"position":"left","min":0,"max":3000,"title":"","titleFontSize":12,"unit":"万","tofix":0}
],
"targetAdd":"9%"
}

32
pages_qiun/static/json/user-server/4.json

@ -1,32 +0,0 @@
[
{
"kind":4,
"background":["#0081ff","#1cbbb4"],
"content":[
{"text":"已评价数","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"},
{"text":"","value":"161","colortext":"","colorvalue":"#fff","size":"44rpx"},
{"text":"增长","value":"","colortext":"#fff","colorvalue":"","size":"20rpx"},
{"text":"up","value":"325","colortext":"#fff","colorvalue":"#fff","size":"20rpx"}
]
},
{
"kind":4,
"background":["#0081ff","#1cbbb4"],
"content":[
{"text":"平均分","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"},
{"text":"","value":"82","colortext":"","colorvalue":"#fff","size":"44rpx"},
{"text":"增长","value":"","colortext":"#fff","colorvalue":"","size":"20rpx"},
{"text":"up","value":"0.7","colortext":"#fff","colorvalue":"#fff","size":"20rpx"}
]
},
{
"kind":4,
"background":["#0081ff","#1cbbb4"],
"content":[
{"text":"好评率","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"},
{"text":"","value":"161","colortext":"","colorvalue":"#fff","size":"44rpx"},
{"text":"增长","value":"","colortext":"#fff","colorvalue":"","size":"20rpx"},
{"text":"down","value":"1.2%","colortext":"#fff","colorvalue":"#fff","size":"20rpx"}
]
}
]

32
pages_qiun/static/json/user-server/5.json

@ -1,32 +0,0 @@
[
{
"name":"华东",
"num":50000,
"width":"",
"background":"#FFBE68"
},
{
"name":"华南",
"num":30000,
"width":"",
"background":"#0FEBE1"
},
{
"name":"华北",
"num":45500,
"width":"",
"background":"#BF8DFC"
},
{
"name":"西北",
"num":60120,
"width":"",
"background":"#FF859C"
},
{
"name":"西南",
"num":26020,
"width":"",
"background":"#51ADCF"
}
]

22
pages_qiun/static/json/wechat/1.json

@ -1,22 +0,0 @@
[
{
"expect": "",
"now": "",
"name": "时间进度",
"value": "37.88"
},
{
"expect": "224.64",
"now": "53.96",
"dataType": "1",
"name": "微好友拉新",
"value": "24.02"
},
{
"expect": "80.17",
"now": "18.82",
"dataType": "1",
"name": "微客群拉新",
"value": "23.48"
}
]

50
pages_qiun/static/json/wechat/2.json

@ -1,50 +0,0 @@
[
{
"kind":1,
"background":["#3EB2F5","#9374F7"],
"content":[
{"text":"","value":"5860","colortext":"","colorvalue":"#fff","size":"44rpx"},
{"text":"新增微好友","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"}
]
},
{
"kind":1,
"background":["#3EB2F5","#9374F7"],
"content":[
{"text":"","value":"3605","colortext":"","colorvalue":"#fff","size":"44rpx"},
{"text":"新增小程序会员","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"}
]
},
{
"kind":1,
"background":["#3EB2F5","#9374F7"],
"content":[
{"text":"","value":"5860","colortext":"","colorvalue":"#fff","size":"44rpx"},
{"text":"删除/拉黑的微好友","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"}
]
},
{
"kind":1,
"background":["#3EB2F5","#9374F7"],
"content":[
{"text":"","value":"605","colortext":"","colorvalue":"#fff","size":"44rpx"},
{"text":"单聊总数","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"}
]
},
{
"kind":1,
"background":["#3EB2F5","#9374F7"],
"content":[
{"text":"","value":"641","colortext":"","colorvalue":"#fff","size":"44rpx"},
{"text":"发送消息数","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"}
]
},
{
"kind":1,
"background":["#3EB2F5","#9374F7"],
"content":[
{"text":"","value":"35分钟","colortext":"","colorvalue":"#fff","size":"44rpx"},
{"text":"平均首次回复时长","value":"","colortext":"#fff","colorvalue":"","size":"24rpx"}
]
}
]

33
pages_qiun/static/json/wechat/3.json

@ -1,33 +0,0 @@
[{
"categories": [{
"value": 0.2,
"color": "#1890ff"
},
{
"value": 0.8,
"color": "#1890ff"
}
],
"series": [{
"name": "新增小程序会员占比",
"data": 0.21,
"color": "#24ABFD"
}]
},
{
"categories": [{
"value": 0.2,
"color": "#1890ff"
},
{
"value": 0.8,
"color": "#1890ff"
}
],
"series": [{
"name": "已回复单聊占比",
"data": 0.65,
"color": "#24ABFD"
}]
}
]

82
pages_qiun/static/json/wechat/4.json

@ -1,82 +0,0 @@
{
"categories": [
"1月11",
"1月12",
"1月13",
"1月14",
"1月15",
"1月16",
"1月17"
],
"series": [{
"name": "新增微好友数",
"data": [{
"value": 1800,
"color": "#24ABFD"
},
{
"value": 1300,
"color": "#24ABFD"
},
{
"value": 1580,
"color": "#24ABFD"
},
{
"value": 1600,
"color": "#24ABFD"
},
{
"value": 1600,
"color": "#24ABFD"
},
{
"value": 1600,
"color": "#24ABFD"
},
{
"value": 1300,
"color": "#24ABFD"
}
],
"type": "column",
"color": "#24ABFD",
"unit": ""
},
{
"name": "新增小程序会员数",
"data": [{
"value": 1580,
"color": "#6BC588"
},
{
"value": 850,
"color": "#6BC588"
},
{
"value": 1100,
"color": "#6BC588"
},
{
"value": 1400,
"color": "#6BC588"
},
{
"value": 1200,
"color": "#6BC588"
},
{
"value": 980,
"color": "#6BC588"
},
{
"value": 560,
"color": "#6BC588"
}
],
"type": "column",
"color": "#6BC588",
"unit": ""
}
]
}

92
pages_qiun/static/json/wechat/5.json

@ -1,92 +0,0 @@
{
"categories": [
"1月11",
"1月12",
"1月13",
"1月14",
"1月15",
"1月16",
"1月17"
],
"series": [{
"name": "新增微好友数",
"data": [{
"value": 1400,
"color": "#24ABFD"
},
{
"value": 1300,
"color": "#24ABFD"
},
{
"value": 1000,
"color": "#24ABFD"
},
{
"value": 1500,
"color": "#24ABFD"
},
{
"value": 1580,
"color": "#24ABFD"
},
{
"value": 1700,
"color": "#24ABFD"
},
{
"value": 1500,
"color": "#24ABFD"
}
],
"type": "column",
"color": "#24ABFD",
"unit": ""
},
{
"name": "新增小程序会员数",
"data": [{
"value": 400,
"color": "#FB8F82"
},
{
"value": 700,
"color": "#FB8F82"
},
{
"value": 500,
"color": "#FB8F82"
},
{
"value": 300,
"color": "#FB8F82"
},
{
"value": 400,
"color": "#FB8F82"
},
{
"value": 350,
"color": "#FB8F82"
},
{
"value": 400,
"color": "#FB8F82"
}
],
"type": "column",
"color": "#FB8F82",
"unit": ""
}
],
"yAxis": [{
"calibration": true,
"position": "left",
"title": "",
"titleFontSize": 12,
"unit": "",
"tofix": 0,
"min": 0,
"max": 2500
}]
}

57
pages_qiun/static/json/wechat/6.json

@ -1,57 +0,0 @@
{
"headers":[
{
"label": "活动名称",
"key": "col1"
}, {
"label": "员工总任务",
"key": "col2"
}, {
"label": "员工完成数",
"key": "col3"
}, {
"label": "完成率",
"key": "col4"
}
],
"contents":[
{
"col1": "周末秒杀",
"col2": "450",
"col3": "420",
"col4": "99%"
}, {
"col1": "摇号活动",
"col2": "430",
"col3": "1390",
"col4": "90%"
}, {
"col1": "早间问候",
"col2": "450",
"col3": "430",
"col4": "95%"
}, {
"col1": "汇总",
"col2": "1330",
"col3": "1240",
"col4": "93%"
}
],
"sortCol":[
{
"key": "col1",
"isNumber": false
}, {
"key": "col2",
"isNumber": true
},
{
"key": "col3",
"isNumber": true
},
{
"key": "col4",
"isNumber": true
}
]
}

901
pages_qiun/static/table/characterToPinyin.js

@ -1,901 +0,0 @@
/*!
author:kooboy_li@163.com
MIT licensed
*/
let base = 19968,
middle = (40896 - base) / 2;
let EMPTY = '';
let COMA = ',';
let chars = (() => {
let a = [];
for (let i = 33; i < 127; i++) {
if (i != 34 && i != 92 && i != 45) {
a.push(String.fromCharCode(i));
}
}
return a.join(EMPTY);
})();
let SDB = {
"a": {
"yi": "!]#R$!$q(3(p)[*2*g+6+d.C.q0[0w1L2<717l8B8E9?:8;V;[;e;{<)<+<S<]=9>.>4??@~A`BbC:CGC^CiDMDjDkF!H/H;JaL?M.M2MoNCN|OgO|P$P)PBPyQ~R%R.S.T;T<TBTqT|UQUXU}V[WCXgYCYDY_YdYuZ9Zs];]j]p]q^.^@^S^w^x_,_T`H`J`ga)a8aQb9budJddgoh9hqi2itj&jEjRj]jzk>k^l$l<mLmdnDoEoMoQoop3p5pWp`qSr.u'uLv]wIxXy_y~{z}`~r-$=-$X-$Y-%!-%0-%j-&^-&s-'t-(<-)2-*n-+6-+f-/M-/N-0.-2|-3u-4b-4c-4m-5E-5N-5Z-5l-6&-6+-7*-70-73-8F-8R-8g-:*-:5",
"ding": "!2%%&_&x'u=:=h@NC`H?LQNkQ3Xo^Gn?osrUsNvAwKxKy9-!T-$6-$v-%O-&b-(+-9%-9(",
"zheng": "!S#(#D/]031$456+=L?OIzYM[']I^g_.eUl}m~qJsHulwuxU-!?-,d-3D",
"kao": "<dLWr5x7-!J-,7-/Y-/s-2'",
"qiao": "#+$4&.&1'7'Y'z($(),B,{0c7y8<:H<8<YE{F0GdKYMCZP]Y_8_zd.d/d{e5fGfHfUmKmrmvp#t>t?uJv$vMyE|R}a-!}-#&-#8-#L-#b-$Q-%?-+q-,6-,8",
"yu": "#V$l%S&9&I('(7(=)))m*#*$*B+2+F+v,0,b,i.W0.1F232L2a3(384>6P8n;';i;y<1>(>)>]@iB<B?BDBEC'C*CoCpELE^HIHJHTIpJIJ`KXL&L1LxMbMqNXNqPdPsQ<RFT?U(URV7WnX:Z?ZT[6[H]!]~_7_J_``Za#eXg;h#hVhuiyj!j#k9kDkMl#lClUlmmUnFoAp(pzqnrSsSt0vJwszp{_|N}!}$}I}t~(~,~.~w-$D-$]-%^-&j-';-'k-(3-(H-(v-*1-*Z-+#-+d-+{-.1-.2-.<-.K-.[-.e-/d-0=-0P-1:-1m-39-3`-3b-3e-41-5e-5}-6/-6;-6p-7:-7Z-:(-:2-:F",
"qi": "!8%&%>&X&m&s'2'X'd'f(9(c(i(j)@)l+'+M.).+1y1{2=3K4c6&6'6)606<6B6`9`9{:a<g>`?`AgCLCuD%D2F2GyH&H1I;K~LkLuM&MYO0O3O9P8PbPcQqR5S2SCU0U~V%XYY&Z}[G^P`7cUc}dEeNgOj$j)l?m:n4p,sOuRv.y'{/|i}1~P-$B-%Y-)|-)}-*K-+G-+H-,m-.@-.M-/|-0y-2D-2c-4W-4`-4h-7a-7p-9c-9i",
"shang": ")Y6V9cJvR8UqXJXa])asbQc,s,uSvz-#+-.;",
"xia": "#Y#w&,&;'''I)1.u/j7=:[<'B[ByCtL'NmNyQOR([0`(cLh[iRkVt/t_u4uezFzM|W|{~d-&)-*4-.}-0a-5;-8S",
"han": "#,.m/h:l<P>MFrGXJqNrOUPCPqPrQ|]@`+`2h1lBlZnXp*r;rWrkz9{4{B}x-#c-#y-$;-$l-$y-%Q-%n-(i-(x-)i-/!-3*-5B-9V",
"wan": "#=$0&o.]0F4@5X5b6*628u9p<K?e?h@IChFqG!G7H2HHJzL=O5Q'RQ`;a:b<bGeHh&h)rMr^s'slu!-$E-%V",
"mo": "!`#$#&#y$%%P'e(T*N3v5$517`8R=6?XA5E6FZF~JLM;MgP+RTRcU6]'](_j`s`x`y`za+qkuDyR|G-!e-'g-($-(U-*R-+k-,(-.U-.k-.{-8/-80-8K-8L",
"zhang": "#~(#.:2o3N>k@,JhR`b$b`knmtujz'z0}<-#+-'I-*Q-16-7m",
"san": "3T3q3w3x7~uJuwzA-'n-([-,s",
"ji": "#r%''l'y)3)d)o*Z+'+9+G+M+T+Z+^+g+x._.c/R090d1S1W2;43484J4R5C5w6)6C6`7f7s878H8t8w9J9X9Z9{;8;<;B;C=(=2>6?YA$B+CHD0D8DbE:EQF2I*I|JEJnKKL)L:LkLzMdN'N5N:NiQ6QyRrUWVcVnWPWQWtX6XEXYXuY(ZAZ|[/]O]e^F^J^U^~`)b#b0c*ckc}dee!e$e9e>eyf+fXfrg)hFhriMjZlrqmr)sRt%uov3vevw|@};}N}g~!~+~F~{-!&-!u-#N-$%-&a-'u-(,-*x-+]-,W-.?-.V-._-.d-.g-/+-0$-0H-1%-1/-10-1^-1o-2/-2@-3'-4)-4o-5>-5H-5U-6,-6J-7/-7P-9e-9g-9h-9i-9j-:l",
"bu": "0$192,FKJgT=UYZ^e+hhjmm8mFoGpGp}sjw]w{-'7-'E-/m-3#-4.-6=",
"fou": "4I:L:O:Q~1-3:",
"mian": "!G!d#4$U$W$]3Y5X6A6_6o9g9w@qB/CkG!H_Q;-!L-!M-!P-/_-7y-7z-8'-8,-8q-8r",
"gai": "):5=5LD,ErI!J1Z'_/`TaYaac!lnpcw[|O}1",
"chou": "!+#n$N+0/y0}2:4e5/6#9jB*B.GNLfUmZ+^3^5_4e%e4fWkan]nbo.o6oU}u~$~*-.X-/>",
"zhuan": "%H'S'V.K0k1B1H1r2?7Z<r@RA7IDRsVk[J]Tb3b<c8gThai'mp-%+-%u-'p-(]-14",
"qie": "%>+7+f,8.#.|0K0p2O>#DNE1P.ccd]eMlpt8y>-0&",
"ju": "!Z$L$w%R*W,c,l/e1~3&3J8#:t=#=`=k@FBGC0DlD}FeGAIaIkJbMrN[OVP`RDTlU|W>Y`[$^Z`Ua*ccc{dWd]dae#e@eFeff8fSg*g<guh~l'lXmIoOq(rps%vXw_x|y;zb|m}o-#/-#:-&4-&Q-)<-)?-)d-*z-+0-/.-/:-3[-48-4S-4k-5.-9H-9K-9x-:@",
"pi": "#M%D'C(5(6)L*F*K+;.n1C4M8}:y;/;2;A<,<{>a@'@2@KA%C|DQO+O]O^PvR!REScU'UfZw]m`l`na'i[l_m;p<pYpyqCqyr*s1s;trx4{8|*|=|p}F-!!-#,-)@-,H-.p-/#-/3-2#-3>-4F-6'-63-91",
"shi": "!E!Q!e#?$p%$&+'$([(](q*^.&/5/n0[1w204z<gBNBQG)I:ISIUJ3NlN{Q>QQR9VYW2W@W^X2XNYxY{ZI[:[<[v]X^l^{^}_p`DaDbmgqi8ixjdk!kNkpl(lkntoMo^ocoeofp5ppq%q&q*q4qbr=t9x/-&^-&_-&}-'<-'@-(*-(8-)!-)H-+,-/<-0?-0d-0o-0p-2:-2O-3+-38-57-6M-9C-9E",
"qiu": "*6*7+a0r3k4D5]6j>7CaCeF`HEJXMhNgNjONP;QMQ_RfSWUUX?XUXqXrajc$d'jpjskXl]n@o.oup:r?-#5-#6-$8-/'-/k-0W-0X-1,-2Z-4v-7&-9U-:Y-:Z-:]",
"bing": "!n)F*4+/,>.75@DsOcZ7l`puqar||>-!:-!q-#,-#G-''-'C-(D-/O",
"ye": "$>$E(0,a6g=;@?HfSb[]_]lUlfn(oip=rmtDtTtevTx?-!O-!R-$5-%N-'F-'e-(T-*o-4Y-61",
"cong": "$'&Y1>8==g=l=p=vDIE=I2JUK0LsRZZk]$a}a~sKtBuKu_-*)-*V-+Y",
"dong": "&&.r0b5D?7?C@JD|G;I#KwQ([&jV~^-)T-/=-0)-4g-5/-6T-9,",
"si": "'?(b)^)g)p*+.</#40415O6i8l9~;.<|<}>+>0KxL+NLP7PiQnReS&W_`tp1pvp{qTqnr8r`tIuzyB-&6-&R-&^-&c-&s-&{-(:-)L-)q-*8-+.-0.-5j-6`-9N-:o",
"cheng": "#0$,$P&W*O*[*w+A+{,O,v/l5[7#:`?}FQOoS(UKZV_#cHcJk#m$nhrxtkuxv@vWx=xB|2-!A-$h-'w-)o-*>-+B-/u",
"diu": "r2xL-&&",
"liang": "3A3D3{6K@0CRF{Q%Up[,_Oe1h!h2hCiBiHojss-!=-)h-.J-.O",
"you": "(r)O*I7o8W;L;f=5=M>VDKFoFsFwG/KaOOOSPSQLY8ZN_;`qh%hMjWjnk6kPlYmEn3n>ncodp~r3x&x<-),-.y-/1-1p-1z-7N-8P-9D",
"yan": "##%F%L&%&F&T&v(Z,j/u1?2$5t7V;!;h?<@@AsCVCYCZD3FmGpH.JlN_PVQAT$UxV9WUX/XkXmXnY?Z3[U^1^C^E_e_~`B`C`RbDbPc;g/g7kIm#mNmsn5nHnsnyoPoVo`x+z7zkzmzn{A{`{e|}}2}b-%'-%,-%B-%v-'0-(#-)~-*$-*F-*j-*s-+C-.4-.H-.Y-0V-3$-3*-3B-3n-5#-5G-5u-7K-7r-8T-8W-8_-8`-8a-8d-8j-9L-9Q-9w-:1-:N",
"sang": "'EVNts-%2-%{",
"gun": "#<&#'U6F6z9dJ>JpTFTwUu]4h<iF-/2-/g-2<",
"jiu": "+E,*42464]8mB:BCBHBMH7cQnGz){Z-#}-#~-,l-./-01-3!-5w-6I-79-7c-:$",
"ge": "&!/30*4?8r>:?B@}AbB3BwECHxJ1NwOrP'U9UPXM[X[hhLhmq`tetlu.xSyUzTzU{W}4-!S-!s-#F-#`-#j-%f-(A-*%-+t-.3-/K-/U-1u-3T-3z-6g",
"ya": "#B%C&{'I*{,a.g=UDEKqO;T1WEWGY.^[g=i!j4lUp=s=v7x;}f-3C-3c-4U-6O-6V-9o-:;",
"pan": "!&!>!?!H!o'L'x2A76=F>R?$AIH<IrRoT{WBY[d[e{f0rvtpw=zx-#E-$J-4D",
"zhong": "#%(n*8+>+m/V2T4{6b99>j@`BnEkK*O:OBP^R2RKSzTKTNTO[@e^f>ohparHtQv5wbyF-3_-9@",
"jie": "#S%@&{(.*d+=.G0e4J5,599D;k=(@/CfD,G#G`J[LzOFP&P:PTQ=SKSQSqT/TITPTlU4U7UPVQXOXSX}Z%ZWZh]/^K^~_5ckdve=j^qGtNtXz,|1}.-!m-!u-$U-%c-&v-+i-.l-/@-2&-4{-5$",
"feng": "!@%N'40m5v7R:3C$FdHnN.PFSaWI[R^c`?b.c5k'n+n;r[u5uXxs-!$-!4-&%-&J-&L-(w-3(-3,-3F-8)",
"guan": "!'$b$j$k(W)B,Y/f0E6:9&:]:gBVFqIEWSW{X+X.a?bifMh?kmsUu>w7zOzS{,{2}{-'K-(N-0q-1N-1j-2e-2z-6D-7A",
"kuang": "!Y!z$Y%1%r%w(G+}/O/z5'538V8vZ<ZG^y_=aNbpgHgRgXg`j+lHlhn/qUrevy-4>-8>",
"chuan": ",40jA7BYB`BhBxEvale[hIkJp%wQ-5+",
"chan": "&6'W)K)q1N6D7$8*8A8[8_:6;xCODJIHKQQ2RGR_R{S1UeW!W`X3ZMZy]B^+^7_N_bfbi|n2n6o@rTr]uWw3xYz%ze{7{g-#Q-%D-%~-(%-(S-+Z",
"lin": "$B&['t0:393O5{8!<WA?B%GsKEMOaWb{fEf]fgfxhlh}iVk{lgn$utzg|9}C~[-*a-1G-2t-7_-7n",
"zhuo": "#'&Q)a+l,%,V,]102E2`8?:J;&=NE.HtJ:L|SJSsZx[+]6_Fd!nArfvLvOy|-4J-5d-:x",
"zhu": "!a$6$h%^%v'f)!)/*h,@.4.S.T.[.w/P/o0]0n141=1a4n4q5.9+:s;W<EBrD/DVDpE_EmFYHtJQKZMMO`O{QTS>S]SrU;V<YLYoZ;[S_$_B`[aCbhdVdjfRggjMjrk1ljq6q{r}vbwExIx`|x-&r-(~-)=-)]-+2-/H-0E-11-3s-6(-7T-7V-8x",
"ba": "%#.a3#:y;2;N<z>sD5E4GTO$WNYk`LdDdNgjozp?wr~~-!a-&.-.D-.`-/&-/0-1t-1v-1}-9=",
"dan": "!K%$%5)r,S0N1h4V8A=A=B=H=~>q@9ATAVH*JDOkPUTLV?VoXGX~ZK_'a|bBc3f{mHn&nKn~~t-$I-'G-'s-)*-)a-,C-3Z-8H-8b-8i",
"wei": "#o$M%}&0'#'D'M6/6p6r7+8y9f;6>n@gC+D!DOE+FCGBH)I&I(I4INJ]K$KJL7LdMDN0PwQ$QDQHR?T3T6V`WkX$Z)[#[^^*^4_I_^e;fefig@hbj>k<k[m}nvs~t4uGzz{G}&}'}7}Y~n-!#-#Z-#a-#i-#q-#v-#z-$T-&7-'J-'X-'z-+a-+b-+c-.P-/,-/F-/P-0N-0O-2(-2W-2p",
"jing": "#C*?*u,2.8.9.A.E.P.R042v3F3Q5(5q6!9@=_>g?:?k@<E;EtExFiG8HlS/Z`]ge(jTjwrhuYyi|+-!=-!@-!C-!D-!F-$N-$m-%b-*m-03-2M-4:-4a-4d-7e-7o-9I",
"li": "!!!0#A#E%7%_%m%q'|(K(L(Q(^)u)y*%*H,&.$.J.{/c1.1:2Z3$303G3b4)5}7T8Q8g:7;4@*C%DPDbEEF%FDFWF[GUI[I`JFKIM1MKN4OWOnP#PNPlQaR[S*S:STSVS_ULU_VWXhYY]&^,`9`}cPdbf`hzh{i5jDk+l7l;m6n=oBoNogokqAqururzs3tludvuxjyU}V}W}X~&~8-!+-!5-*}-+A-,^-.3-/p-/v-07-1W-1b-1k-26-29-2x-2~-3Q-4X-5I-6F-6l-7f-7k-8A-8Z",
"pie": "$2DmW]u~",
"fu": "%8%[(u(v)U)j*k*o+:.'/$///_0$0=1j3C3d4a4j4u5B5k5p6q7B8L939<:0:o:}<&>N?#@!@D@E@nA3C!CWC}D*DFE'E,E]EpFFF|GKHKHjJXKsNSODOGOXOwPIPMQEQIQWTETsTvU.V(V6ViW+WKWMXpYS[C^H`Va4a{b4bXc(c7cRd=dZegh*hPhRiAiLlIm(m*mmnQowo|pFq<q@t#t5{s{t|?-#]-#x-$`-&(-&.-(n-)F-+/-,P-.5-/)-/8-/X-0^-1|-2[-2}-3%-34-3N-4H-4}-7x-7{-8#-8*-8o-8p",
"nai": "<p<q?L@=CcH4R'VHj[o}sk-9'",
"wu": "$A%*&l)+,D,o0a2tAMB]D#D<EPFSKvMVPLQzS#Z>ZYZZ]U_6_9d9fYj6j~lWm)mep)rQrbrctvwkxc{y|U}6~?~C~`~m-!Z-*'-+R-/j-0j-3i-4/-4@-5,-5f-6j-6s-7)-9G-9W-9X",
"tuo": "%U%V&z0L2J4v?{@$F_H6MUTbT~Y'Yc^QdHdQnVq+r`x1{{|;|<-&d-(.-(z-({-)1-)J-)K-*:-*e-*p-+$-+3-.b-/%-/[-0b-3O-4,-6_-8}-9$-9?",
"zhe": "#'%+%E'P2f2|<f=VHtJ~NoP4PKR9RRRSU%VXW<Yq]*]:^%^0_ucKe`h(h0hei@iUj:j{kurAtMy!-({-/f-5W-75",
"ma": "#X%3'8(e)h;0GsK?N}R+RTRUkku/z2-(u-)N-+!-+9-,r-0n-5P-8.-80",
"me": "-8/-80",
"yao": "!T$R'T(g,3,:,=,F,I,J,e,f/C0^4<7o8Q8s<a>_@eB>CADvFAI0I>J:L]M:M~TgWHWfY/Ya[|[}^6_ngmi6k`kll*l9r!tdwhxRzv}!-!j-%=-&9-&T-'(-'=-*&-0u-1I-2f-3;-3]-5F-5Y-7+-9T-:%",
"zhi": "!7!t$s%=(J(i(k(s(y)2)I)Z*2*>*A*T*^*c+(+)+J+Y,G/k4Q4b5T5W5s6~7^7|9(98;(<0=E=Q=b=}>L>|?+?QA<AJB1B2B5B6CzD$D?E8GeM7N/O3P1P]R@RhTQTTTxTyU{W.WgXCX[XcY9ZB^l`@`A`haAb!b=bbbwdAdYdueTeWf,f_fag6glg}i1i:jDlqm6neoyqrr=r_vsxAy3|)|Z}R}[}j-)!-))-)Q-*?-*L-*Y-+O-0:-31-3S-3m-5+-5^-6a-8m-8y",
"zha": "!l%Q0>4^4g=0D{OPOZX]Yb[(]G]W^ng=o;t*xHzI{N~J-&t-/9-/a-1{-22-9]-9`",
"hu": "(1(~.j0Z1M3!3^545r757G?0AMCtCxD<E$GxI+K%K;NGNHNPNWQ^R)T2X`Xd]<]x^^``gVi3mqo)snt+tK}Z}q~B-$4-$k-'O-,j-.s-0<-0c-1`-2v-32-4?-4x-5)-52-5?-65-6n-7!-7?",
"fa": "#k%O/'/N:q;*;3EeKkLvo1oKstzV{V-,F-,J",
"le": "%f.U1_>5C_{u-$*-'1-(A-1!-1d-2i",
"yue": "$S%!(a){0^0|242S2_373H4<8sAlM{O,O.ZaZc_>cid2dCdFfZgApDqBw2whw}zczd{[-,V-6:-6B-8Y-:^-:m",
"lao": "&)'n,71s3<5>9M<b<c=&=3F'HYP3Rvg.g4hin`oDr(v/x8xa-%8-,9-/W",
"yin": "&#&j'a)Q*a,^/B2{5G6{7V?3DJEGEcF=FHIRK4K8MuO2RLRzU=Y$Y*Y2Zu[M^9cXczh'monipNp]qer/xFx^z{{||/|l|w|~}0}@}Q~W~f~p-!b-!r-$&-$2-&m-&q-(6-)^-+:-/I-5h-9p-:!-:?-:E",
"ping": "%b&'.H0W1Q:T=f>~CXE%F$H(JWMaOQP%Yg^jgrh>mAqa-$^-(w-/(-1w",
"pang": "!o'A1+=/>R?$?=A/B|QmWsd@jf~6~|-0k-2g-:K-:M",
"guai": "0,;%",
"sheng": "!D!^...t7*7q859e=[=x?*E(KM]^aMb1q2t2|#|Y|u-4_-9B",
"hao": "*:.,25<x=ZEMJ$L3L5LWLtNYO<SG[0]z`Y`ym,mhu#y]-%>-%|-0i",
"mie": "!`(D1G1dJxL>SNS~W]vt-1e-3M",
"nie": "1&294(4,=G=|B)B0E!GDMlSX^=e)e?eAezforAs$sJu*vfw9wByVyY{&|c}(-%L-%x-:#",
"xi": "!>#6$3$d%/&(&g'J's(!)P)n*l+7,,,n313z434i5j6H7?7W81878g979U;V;n<2<5<6>c>d@>A6BABBB}FUG]HeI9IbIwJ+JVKzL2NdPjQoQqRYRqSiT!U)UzW9WFWiWlX7XfXjXlZH[K[m]5]F_@`.`/`W`_a(cCcGcfcwesf)fulGlplwm&m4m_n:oIokp2p7pbqLqMqvsYu+ufv&w6wSxJy,z[{5{b}9}?}P}U~#~2~q-!%-&?-'2-'`-'r-(1-(C-*C-*O-*{-.)-/x-0_-1+-1J-2X-2q-46-6*-8I-9O",
"xiang": "!;)*+50U5Q6Y8b9u:U;E;J<4APC{HGHvL<N~RbS4T.VgVsZ(_0`PdqmGmYmZmfqiq|v(w4z&zXzt|H-$3-$9-%R-&g-'+-'{-(&-(?-(b-*w-+_-/C-/~-1<-1L-1g-23-7g",
"shu": "*V*x.0.D2B4#4K5%5^6s9/;,@[BPF(GuIBIeK7LUL`MLNePDShT*UHW'W0`=bOc+e%e0gIhOiOjQmSqIs_u[|I}!~Y-/A-1Z-1a-4G-4p-8@-98-99-:e",
"dou": "$#,[,}1E@#FEKCOI_E`5jym%mMnMpCrIwpzH{.{~|]-'9-(F-.%-.&-.*-.,-..",
"nang": "Sd-(&-()-(^-9b",
"jia": "+L/23l=!?)?u@jF+FuI.P5P>TaU4UI`]a$a]bxdRjGl{m/q#qOrXu,x$x>y`-$a-$e-%c-%d-)B-+5-3J-3q-4(-7i",
"mao": "!M#i$i*:/66e:u<eDDE/E2E3HVJOQ9QNRXT}WY`|a&aSbrgPmkn!nJq>qcsVx,y%-,B-,O-4|",
"mai": "?W?XF>K^LgS{aKaxj(l+~g~h-!'-5{-7t-7u",
"luan": ";D?dAzA{L=NDW~o{r7w@-4'-6G-6h-:y",
"ru": "/M7F8G:1>AEgIYJ6KlLhQJSHU:VGW,inlEm`oSr+x_-%E-&!-1]-3)-3K-3x",
"xue": "$?,(A=C@E@IGLKStTnXd[p_[coe,hdibig~/-!_-#M-18-2k-6%-6^",
"sha": "%4&G052u4O8F8~<<<CFaG`H+K<U]t}xPzazi~S-,[-.h-/q-/r-2=",
"na": "*0.u.x4E9#>WIYIuTJU!Zt`m`pgNlNlypHu7wcyZ~0-!d-.x",
"qian": "'K.(/~0A0t1'2*2D2R2p6+7[8J8q:G;h>b@vA~CnD(EIElF:I%IjK>KLNNO&O8P}VR[*[u]u_q`!`&gSh;i~kjk~p9pEpOq;q?r6sPtYukvqwPwgwtwvx+{x-#U-$z-*+-*/-*=-+U-,y-,z-0x-37-4M-6z-8G-8M",
"suo": "#*1Z1^4Z797U:?;cFaFbJ7P{VJcuk)tatju3u9xi-/b",
"gan": "!3%)*1*t.Y/x1*1}3%4s91>GCmE#T>Y^bJbTcAcTcti}nE-+e-.Q-1T-2w-3*-:i",
"gui": "!q#o$.$C%x%})0)s,E/?1K1T?NERJ;N%P/R*RpU<V{WVX0XPZ!_*aHbod<dng>gEi#lilxuyvlzY{P|M~#-#K-*;-.7-.:-.=-/S-1F-1U-2%-2r-34-:Y-:]",
"jue": "$Z$l$o%6,%525S8#9NA^D=KiKtNnO6RwRxU!WWWbX%X5X>XBXZXiY4Zj]N^f_}a0c[chd<fCfDfwpKv)v:wCyo-)0-,$-2r-3<-3=-5g",
"liao": "$:,A,m,x1g7n8%:@:C=OA#ADJcM(RnRv`1b8f$fJizl&mnopv,wNypz.-&@-&G-,)-5t-77",
"er": "3><m<p=8=T?HEyLoS|U8Z6aBaGbjd3gshtjJl2q_x9|L}M-'/-(=-)Y-,Q-,R-/D-2)-3j-6b",
"chu": "$e%s(/)M.%.)114y9=<~=%A_DCG=IdIoMMNOPQS'XRXe[/`E`Oa,cmf=fTfcmaq3rnxlzW|`}p}|-59-8O-9|-:)-:9",
"kui": "#f#o$C'D,Z,p0v1m22=m=o=s={?NAFI6IJKnLyN1N;NbQY[edpf*fvk;mXt;tJ{0}7-$A-$d-%6-'a-'o-(P-(`-*6-+P-.B",
"yun": "!F'N*;/`/|0y4T6z7!7<7C8z9|<y=?@_D@FLG7IAIVIyK_K|L#L0MIM`QcV@a3b)b@bYc=j1kQm!m7mVmgnRo0o8pVrO|'|d}5~7~i-#?-#g-#n-#{-$(-$/-'N-(p-)'-:'-:0",
"sui": "!q#G#J%G&f)$)t+R+h+p5m7>7h7x8D9V:4AQCyFOFPNxV}Zm]c_QazkFkHl.uqv!vF}*}/}G}H}w-#$-#r-+|-,/",
"gen": "CQEHdc",
"xie": "';(f*&3c4k5+595I5h6g6v7&8>8T92:B:M<3>l?T?V?ZA&LRLTM0Q7QKS+S@SBStTRV*V^W4XKXOXS[B[y^<_Z_mflfnl,lU-!i-!v-#1-#D-#h-$#-%c-/S-2%-9Z-9q-9t-9~-:b",
"zhai": "%X)3,92q<?a@b]q=-9c-9d-9i",
"tou": "4G6sMyjqrItA-$b-&r-+h-8;",
"wang": "!664:h:i:j:k:mFvGmO>P*Q,Znh5iGj+jM-.N",
"kang": "%<+U2v3tg1lJpgugwmz={L-17",
"da": "!W.u/(/S84;H=<EsF*LHS0VCYldzi{j0j7j;k?kZt]tqvZ-!g-!|-#R-:S-:U",
"jiao": "$y$}'~+k,A,K.`/I1o5;8?8]9O:J?E?j@hA9AKB(CaEZE[KTM5NZP!RkR|WWWbX%X5X>Xs]Q]fa`d0dhe3gvh_hfi;i?lvnkoHo]p#q]v*xW-'%-(B-*h-+;-/Q-1>-20-3|-5k-5s-78-:a",
"hai": "5L?Aj9l/lnnro<-'!-'~-)Z-)b-+>-+p",
"heng": "?J?mMZT9vc-3o-4$-6e",
"peng": "%c&'&S'+'Z+,.V1+1@5@8P>~AACgE%FdJRMkRiRjU3eSgbh:s9v{zL-$+-$0-):-*A-,X-,b-,q-4K-6y",
"mu": "!1#N%]+V7`7n:@?.C5DeF~G%O=e/qKqPx!~3~G-#9",
"ting": "/s5l<t=j=z>%>&?qC)FnI7PWQ8ZJ[El=rUxKz`~K-!~-$g-%e-9F",
"qin": "$j$k*'*Q.d5c=>>MD1DAGZG^GkMRO8Q}RJS7TVWJWrZQc]pXpkriwix{}c-!]-$~-)f-+E-/c-33-4L",
"qing": "&/&Z'i046+60:ZDaHzQ#Wr[%]%_Agph+i7m<s4vi-!;-!<-!B-$7-%P-/}-2B-8X",
"bo": "%h&^'x(B(U*L+l081c2%2,3~4m:S>;>t?fA!BuC,DrGWH=I'J{L4MmO^U+U,U6VrW5ZL[d]Rd8d_eKf@m3pxq5qFrVtow0wxw|x(yT-'4-'^-(E-(V-(d-(g-).-)[-*^-+)-+~-,$-/0-1=-1}-42-6k",
"lian": "'K+D2+2P2V6w7b8k94;s<T=Y=n=q=t=u@+AZAcG(G,HLJTKDLELOMsMtQtS=U`UaVUW#We]0f2j?k(n0oPsZsyt`u@vKxfy}-,n-0U-0}-27",
"duo": "&U5|:!BtU0Uncrdfdid~eYg!g#g5plvUx5|E|J}*}3}S-&~-(;-(z-)1-,i-4]",
"men": "#{$*+XGRNEsuwVz1z6{>{M-#!",
"ren": "(o*,*e+#4A4U5)5y8x9$>?@AD)E}FGGDTUU2Y!ZC^I^Vg&gFi&p/p;pRqp-!W-![-#[-#w-&i-'#-(2-.^-3{",
"shen": "!U![$8$r$u%j)#)9,12e2g3T3U3q3w4l96:p:~>i>m?t@BFkHwH}JGK!LCPGPHUNX)Y1YHZ*[2^)_%_L_S_VfylPqRrj-$W-)W-.m-/z-0@-0|-1)-2N-4A-8b",
"ze": "#R#}$n(+*p/,0J1I=0BsKAS?Vz[(].a@b7b]c:jO-&t-6.-9s-:,",
"jin": "!#$j$k%M)8)G.U.m/J4W4`6L70:/B6F&F;GcGkJYM!TWW%WzX<X@]9_sb&bIc#j2j<k8olomp>sTwGy2-!^-'m-(Y-)$-7D-88-::",
"pu": "$5*k+j0$8LBTBUFXGGGaH~IsIt[D]]_|bEfInprtupv=xbyqyu|[-/m",
"reng": "(_DGiu|z",
"zong": "&Y'h+?3P3]4$5z6E6Q6n6x7(7M7X7e7t9%9n<J@MI=J=QU`eePeRf1t!v_-)z-*5-+K-,`-,f-.8-09-0G",
"lun": "&n'k*|6:9&='@4D:GLPk[1^`eBhAi)s.|k-04",
"cang": "15B$BpC<DUI~M#R3b/w8-50-6P",
"zi": "!i!j%()R*/*X*b+E/)2l354F4d6I6W8O9s<u>z?!?MB'CwE5E7ENE`F4GHHuJbL;NsXHYOYP[I_caFa[bzb~cZcpd(h3hQiJmbp&pmsGtRtuy=yO-$s-$t-,I-/{-0r-2P-4e-9)-9f-9i-9u-:D",
"zai": "#^7HGHb+g|i9n^",
"ta": "(d)i2~VAZr]wdBe7etfFfOfpkdkiq+sBt]tex1{'{5{;{={R{o-!s-#*-#B-/?-0t-2d",
"xian": "!:!O#5$<&#(F(h)X*3+D/D0V2k3B4%4|5A5c5t6,6]7J7r8Z8c8q90:%;];d;h?&@oAnA~B;BvDSDwFzG,LOM'M*MpOKO_O}PJT+T0V_W:WRX,ZXZo[O]d`>awbKb^cYdgd}f;fhgBhHnfo'oPqvr#r$rFrqs<sps{uww'xJxMy4zBzC{H|K|a|e|s|v}J~v-#T-$!-$$-%.-%H-'D-(M-(o-/T-1l-21-55-5x-5y-6$-6q-7G-7h-8$-9P",
"cha": "'0*049B=C9CjD}EYEdTAYyY}_1enr't7t[vryDz!-!U-'Z-(O",
"hong": "&*&8.*.>0o334=4P4f5i8o8{;z<!<==CDyF?HoHpL*LXNtXtXy^L`'`*`,gUhNhwi+p[q[rGrYt:z?zXzrzt{I~U~e-!n-.(-.a-3v-6i-8<-8?",
"tong": "!r$@%o&>*]+m.?/Q/i345D5N5`9PA@EjJPO1T,Z,cFj|ndq:qYqjxC-')-/L-2*",
"dai": "0,1n4x7%9AC?OMQ]TdW=Yd^xa7aLbqdff'gCgLg[i%jIk4p0~z-!0-)E-/>-3I-8N-8e",
"ling": "%d)D*M++.5/+4p6@9];K;U<.=KBqD[GiJJJmL%M|OiT(TcUjYVdLgZh/n8oWpts0x)zN|q~;~O~]~a~c-!2-$L-%`-)C-/$-05-2C-3L-6Y-7E-7q-9z-9{-:A-:T",
"chao": "!k,h,r2u6?9b;5<wXDY=]?cdh`mlpSwa-7w-8v-9#",
"chang": ">J@mA+DTGMH!UlUqZfs&sWy+z'z(z0zh{1{a-#d-.0-02-1X-2H-2T-92-:d",
"sa": "8g?^HDK{LYY@fnpQuwwS}A-!c-!s-&,-&P-)&",
"fan": "%0(M/1/40i2A2d6R7i8$;o<[AIBcBfE0KNLPM>N!SOVqXva=bcf<gEg_hThkj5p'v#v?wT-&=-&Z-&n-&o-(5-1E-5r",
"miao": "!J#m*=.10s6e6u7n9z:@D`M$l3-4s-6u",
"yang": "!R#!(C)Y*R4t;E;J;P?5OxQ/YX[T_0gahGqDswt,wX{}|.|y~:~}-!p-&8-&M-&k-',-)G-0]-3a-3t-62-6X",
"ang": ">Xo:-+g",
"wo": "#l&A,R,_6}>I@OAlB!G*HQLgP[Qbe:-(p-:4-:I-:L",
"jian": "!%#9#`$<$D$I&N&b','r'}(&(<(X+D.p/9/g0#0/0Q181k262I3_5U6Z788(899v:9<F>$>S@fB4BoCICSCTETE~G<GrHiI{K5K]L!LVLwN=RGSEU5UcVjVlWAWRW}X#X,YT[.[F[c],][]}^!_Y_v`K`Racaybkc|d?dKdye8ecephvp/p;qXrMrZs(tFtHu!ubv4vDvNvovpw.w1w5xwy:zCzD{J}d-!V-#;-#>-#O-#X-'A-'S-(7-(k-,h-0Y-0`-0h-1(-28-2h-37-40-4R-5@-71-7F-7I-7J-7W",
"fen": "#|%A*9./2x3=3r4S9';M;q;~ARD4IxKmO?O@TGY,`^`ff|hjnOpUvY}K~5-'W-'}-(c-(r-.w-1M-2Q-35-85-8n-9.-9:",
"bin": "%A8I::A)AiNc`X`cahailKvjya~l-$p-%G-%k-,'-,1-,E-,_-,p-.!",
"di": "!u#/%W')'.'{)<)_*U.v/*1=2c4+6c:);X<?=b>;@WDXD_FMG9G_ICJMJrJwJ|M6Q+QVR<TtX*X8XIYW[:[A^q_f`dcee_f/gYjKjtjukLkekwldp0qNuIyj|5}#-!X-#=-$H-(y-+n-,>-0>-69",
"fang": "!I!n(l4Y9*>TBjD;O!Y;^ed@lLp@siwn|,-,?-.v-1s-3E-51",
"pei": ">Q?(JBSwUrUsauc2hyiPnBn{s5y7|%|f~M-)#",
"diao": "$#&a,C,k.B1]5FJML|NhOaXxZ8Zv_M`ro~p_r!r:s*s[vawUxExR}v~D-.c-//-0%-2L-2{-3&-4O-9>",
"dun": "!<!A%J'3(%Pxd;eZf?fKfVjikGkvpLw`-$G-%X-*c",
"wen": "+C+`+z4B4C5X7!7<839)9|=d>^?gD'G!O'O(R/RO`ahShWiNu6zlzqzw{<{D{Q{c~4-#?-#{-%(-'f-)(-)4-.r-0g-0z-2V-36-3G-9<",
"xin": "!=(F?zBID7FkLZSyVtY3Y<gBiWlOo[pIrNv1w,xtyn{w-%/-(q-(t-)$",
"ai": "$F$|%l%~&e'M(:5=CbKGL6MN[K]k]{b2g(r9tWv^yK}1}8~s-!.-!3-'U-(m-1[-3l",
"xiu": "**3h5g7u8,9T;Y?i?yB*B7DuQ{ToV0V1`ur%rBtSu=u^uvxp-&K-'l-(X-,@-,U-/Z-13-3}-6d-9^",
"xu": "!$!*!4!Z#j$l%;)W+@+H3[5K5e5x6T6X6s7)8X9[9_=X=e?4D/IeJ)JXJfKrLxM/NQNTNUO[P$Q:UDX|YBYJYs[8[Z]C^^_3_ia^lUmwnLo*qovn~E-$<-$>-%T-%U-*[-,w-.G-.W-1_",
"tang": "$f'@)f0{3V3j3o;l=)@zA4J4LJQSR$RAcMc~eef&g+m]o=tiu)uTv'wDx[yWyd{1}:-#I-']-'h-5:-96",
"huo": "!V$S$^(*)>)S*Y*_*`+|,W10=$=4AuCJG.IhMTSI[g`0a<bacnlTpesrvhwoy6yyz5}y~R-!,-#S-*0",
"hui": "#J#[$G)N*i+s1;5R8.869I9}<9<:<L<^CxEbF1K2KeL8L9MFN,NuO7OtOuPZR*RyT_V:Z$Z2Z_[L]S]n^#^X_!_<`FaXbyh4iEjUk*qouqvI{6{j}3}S-!Q-$c-%C-%l-'R-/V-1#-81",
"kuai": "/w3}?]AWIJIql|n*-)0-1P-2.",
"cui": "'g,w2z3L4[697>:4<%<@?R?U@.AEANAhG{THVmd#uQ}Y-$|",
"che": "$;%I&?&@=JFjP@g<h~jA-$M",
"chen": "#t&M&t'`*[+A+{5{>FA}EKFRFcK:LmRBTDW6Y7Zz[Q[o^;_V`$arb;c`cad>dKeagKimjHmDo@pAt(|C|o~H-5T-7]-9l-9m-:=",
"xun": "!x$Q*p,^4;8MAjEnF:KLKSL[LaMcRzS%XwY#Y)Yt^R^T_+j%jajlkclsmzoTv`-%A-(}-)U-+%-1?-1H-24-5A",
"chi": "!]!y$).X.y/A0+02133,5W<#<$<D<H<|=@>>?2?D@SE9E|GeO%OHORR;U/U0UkVMYFZ9Zq[t`8aRcBc^d+dfeGj@jBkKkfkrkyl7q7q^qusx~9-&l-(4-(|-+&-.R-3Y-4!-4r-4w-4y-5]-6Z-8(-8C-9k-9v-:<",
"xuan": "!m!x#d$['5)k0R5?7J7d7w9K<G<_HMHNJ8K#L/MQMfPEQ?S<T)U$[;[W]_^&_abRgDi$jkl!q,ratLu?x0yl-#'-&2-)U-)k-0f",
"nu": "%a/.?;-)>-+4",
"bai": "+&.;3;3M51L^W3b:b_-#k",
"gu": "!/$J'B)A*~+P.z010?0u3g75:r:v;Q>K@(AfE)G>GhJ,LSOdOjSeXFYR^h`%a]bxgdgehYi,iXk,nYprpws]wwy.}h-%@-%W-'Y-(Q-+`-/;-0'-2I-3^-5?-6S-7%-9*-9+",
"ni": "!h#P*G2m73=i>$>}@pABA{DqLpOLP.Q!XXZt`~d`h.jhmCpnx3}L~X-(e-0,-2J-7`-:+",
"ban": "*E2s5!9;>PBgBkQ*QvVKd[iciipPqEwfzx|$-!h-$F-%Z-.n-35",
"zhou": "!+#U$x&y062.2@2C3+384:777o8p9:<B>B>o?#B^F@GoI$LfY][a]y^r_4_Manc0gkg{h,i0i<k7m>nCqg~Q-);-)`-)t-*r-+[-0(-3~-6f",
"qu": "$L'o(}.2.F/@2U3?4o5#<1<U<~>u?/AxDlG:HhKbM}O[OfOpQdRDRlSkSpT'T:U&WxX!X&X=YeYjZj^tcjcld%d*fqf}g2gWw<zfzu{i|4-)3-)5-*W-+'-,S-.~-1'-1;-3W-4l-6E-6[-7}-7~-8&-8+-8U-8u-9A-:/-:H",
"ci": "'=(A)%353a5579ESEUG6L;OsQpS3Yp^saqc.c_dSiYiZiaij}m-&y-'*-+l-,%-/+-3V-5C-5D-7'-:6",
"beng": "(l5@657k9iGnO*dtf3jYk2uiygz>-#)",
"ga": "g=onsfwH-.A",
"dian": "&p'v,j1iIiKRPXdXeVewq!x%|8~@-!E-%3-%4-%z-*g-8Q-:8",
"tian": "!:#;'1'H,j4w6D>v@:BRBXGvWmX9atnTr#rFsXx%xM{%{n-!>-!G-'$-3f-5J-5S-8:",
"bi": "#L#M'!(w)L*@*C+;.n.o/E/Y0(0)1/1<2r2y4M4m6>7Q8@8};7<,=a>a>r@lA[BlC|E*F.FJG~H:J<JdKHLLPPR!TiUfVhW$W)X^Yh^v`<a!aEaUbMblc/d|e~fPfQi[kBl)l^mjmym{q1truFvQx2z8z9z:zP{B{C|V-#,-#G-#p-&u-'j-(f-)I-*X-+x-,N-.T-/*-0Z-2S-45-4}-5b-5n-8~-9S",
"zhao": "#'$K.e00:V;#;?>*>1>2GdYf^ucScxorp<q.t6wL-)8-/G-3&",
"shao": "#+*y/r4r6%9>C&CqD^FyHSK}Tjh$la-#&-$)-,Z-/`",
"zuo": "(|*S+!+n/,/p4*7{?'D{F^H`HaJ?Th[(nWp||7-&t",
"ti": "!g#e')'?)Z)|*v/8285f6|9Y9y:{DXF!KgLIUzV&V'[qd)d2eJemexf~g8jxk=kLo&rDt)xy-%$-%r-*2-+m-,0-,L-,]-,a-/^-0B-2U-4;-4w-4y-5L-5M-5i-6r",
"zhan": "$H&b.33*6=9oGQLMN2N`NaOeWyYQZ/]h]l^B`#cghUhgiSl0n|zK~V-%~-&*-&N-&e-'|-*b-*l-.Z-1S-2y-37-60-7=-8i-:h",
"he": "&c()*(0z2i3@4?8r<N<ODdFIGFGzJ1R(SMTmV2WOYGYIYw[z^i`x`yaTbtcIloovq0vgzRzU{){X{m}Z-!7-!8-!9-#7-$P-%f-'&-(@-.|-1u-5$-52-58-6?-7#-72-7v-9n-:>-:`",
"she": "'y(`BJBKBLJuNpOgP(S5Y>^dagakc'cDg~{!{^-#h-)u-7l",
"die": "!g!t&w5M9G<k<l>pB5C6D~PmQ`R@V,V]YU[7_WcbdOdXdreigojNz+-#1-0S-2R-3d",
"gou": "/01%2)3g6t:&<h<i<jD>DhO[U#VBWwX;YNY~_(`ob5bgk_pMqHwl}k-#A-#m",
"kou": "!P!Z#r$$,P.2/W1OD+K=KFp$-5K",
"ning": "$P=R>!DpLevm-,~-64",
"yong": "%p&>A]DcIPP=Yre2e]l@mJmio9rHuVyh}n}~-%*-%s-'x-/y-0w-15-2A-2o-5`",
"wa": "%K,),?,E,`=N@r@xOyTuW1lc-#W-#^-#t-8w",
"ka": "?8U@qV",
"bao": ",<.~6h?,DgGYHcK`L4MJN^OJTeUdV4V5Vf`ib*d8q/w%x.zs~>-!6-&x-&|-(9-)/-+j-,M-/7-1~-3/-3A-6Q-9r-:B",
"huai": "=7N3N8VDVSeE-:f",
"ming": "!C!w#zEDJ'R,WuZ0m^n_q}xT-3.-6L",
"hen": "Y|-!y",
"quan": "$b%u/K0B5<6$7:9mEqI3NAP|SlXLZ#_)dkeIgzi=o5qxv%xO{#-#_-%M-&$-)V-*3-,e-0L-2^-9}",
"tiao": "!~(t),,J,g/!3/4.5F=S?PCdD^H0J@JMJNPnWdZ8Zv_McqdwjCr!rdtyxR-#%-,G-/o-1&-2;-9y-:C",
"xing": "!D#Z&$0Y0g6J@YApBFEuF7FhHrP9T#XVX_[_lMluo+pBqZqwrhwZx6|D|S-'V-(/-)p-+D-/5-0D",
"kan": "!N$=$g%?'^.QG&T%h8ho{4{q-%)-.+-:R-:X",
"lai": "#8#F/X0%2/2MG'H%MSW7Zqaob,c&c4k.mBsgxd-$q-$w-)y-0*-4B-4f-8%",
"kua": "50?>B~Z=d9dlq~-+s",
"gong": "'91*44474=8o;z>[OBXQXba6bZfzg$gtrG-!z-,T-:L-:Q-:W-:u",
"mi": "!s#p$A(w)')w*C1d2b2}3p407c;>;F?bClH{J#K'K/L}N#N6PaU*WZW[WcX1Z.[j[l_g_rjXo4oXoYo_r,z/-!K-66-7X-7Y-7j-82-9&",
"an": "!(!.;)?I@XEzGlHWHgJSUxZS[N_d`k`{r1s:x]zy}+~=-!w-!x-$1-(l-/E-4I-4u-6v-8c",
"lu": "!)#Q$_%|&L&d'])E)J*}+[+o071X1v2!2#2G2H3I6S8^9q:f?9A,AtBmBzCFCMCND.G@JcJeJtKcM[N<NINVR>SYXh[~aVb|d$dseCf#gxh^h|i/i>iTk5nwpis2sascu8uMumvGw&w+yr|A|t~x-%J-%_-)+-)r-*N-,3-.q-.t-00-1i-1r-1y-3w-4E-4P-6!-6>-6U-7;-7C-7M-7b-8l",
"mou": "!|7n:@Oq[[_Ue6t=-#9-3y-8!",
"cun": ".N2nA>lS",
"lv": "$()(*r+~0`5Z5~6S7_7j9q:*@wA(A8A;HkM,NKV=VZm'rJw#xDz_{T-*u-+*-5a",
"zhen": "!X!b!c!}%Y'%)5)T)b+I.A0X264N4w5Y7D7L9,:2=I?%B9H5I5IWJ&LnTpUSWaYKZb^pa2afbWc%g^hZi4iqkOnNoxq$r~s`tOu$u%wJyS|0|_~L-)D-,o-1f-3@-6R-8d",
"ce": "/%/U/^/t0G1W36F/H3HPJA",
"chai": ")&>HCjEJNzS9T[Xz`jp4wY",
"nong": ")v*j+q8C?cAXL,V~]iioipoL-,{-9a",
"hou": "#c$t0q3Z<M<UEVHq`MjgltmWq|t@-'T-+r-/B-0C-1O-2!-2,-9Y",
"jiong": ",M4~5uB#B&MeMjVIjFjjqi-$}-%h-)6-)X",
"tui": "+y=N@tJ^MAM^P?PYQkVL^.eof7jb}D-$n-$o-$r-%m-)l-+u-.L",
"nan": "@^G$HOQe[PcEk]}_~'",
"xiao": "#+&4&:+i,N.l/q0!0O0c1(1b1u5a9R<;>@AGFyHCKyL2LtNBNMP<RPR^S!S[Y5YzZUZl[ke*jom9r@xh~I-&3-*`-+8-+q-,!-,+-.I-3X-3p-5Q-6W",
"bian": "%`&}+8,;/=0S2A2W3W6k6y:$:+B/C4DLHUL{QBV+WTW}[5^/aJbfi^idieifihikiliviwkSl4l5oatPzO-##-#<-0I-0J-2`-3R-5&",
"pian": "0l6y:$<I?K@5WX[9_haIaZdtejsq-)O-)v-*(-**-+?-+N-+w-.z-5&",
"cu": "1P3)7S?xK)XAZDcjcvd%d*eOehf%fAfBo$-%<-7O-7R-7T-7s-8t",
"e": "#3%:%B%Z%y'<(9@bDRF}HXKfO#PBQ)WpY+ZF[?]L^2^___`NgMgii(j8kRkUl%mRpJpjrrt&w*xoyCzn{f|!|3|:-$?-$R-$S-%%-%&-%t-%w-'6-'L-(G-)n-.f-0[-0v-1h-2Y-4&-4<-4=-4z-6o-7$-9[-:3",
"guang": "%w?@B#B&EWgwj}r0-89",
"ku": "%,&5*D,@,T5:9E>{DoU1UbVTdPllnm-+o-/R-:p",
"jun": "&].=/`0<0CFlGCI1O/PeTXWhaeg?m1p^qfr&t'wj|Q}^}l-$j-'8-(J-)m-+F-/]-2?-43-44-47-7U-7^-7d-:Y-:]",
"zu": "(x*J+10H4}95GqHbIkYm^kd6eLtdu2u;yk|6-!f",
"hun": "!F#O#W#]F6I8JyXT[=_2hczo{d-'>-(L-.C-9J",
"su": "';+1+3+],X1U3.324X7K7U:?>,>/@{DWFwJsM+M]MiXWYE[r^o_lcyf(k$khksnZrR-':-*_-+L-/i-1@-5p-6~",
"pai": "0'1z1|IOhBjLtV",
"biao": "'c,!1D@3A,A1AoJoM=T@UoVa[3]#b?seuZw$ycz#-&&-&+-&5-&D-&E-&F-&H-&O-&W-&X-*~-+@-+W-,;-2j-7Q",
"fei": "%[//1!6M9a<A>O>e>r>z>{@GDFGjH$KhP_PuRuUtZp_GaObsvEyP|g~T-!/-!H-!I-&Y-&[-&]-'H-(j-*!-*,-0+-2F-9;",
"bei": "&i&r)`0'3f>wA[DfJ9M8PAU'V;ZLZwa1bVgch@iDlbm5mQqWrPv[wd|=-!l-#,-#C-+k-4N-6x",
"dao": ")=)H)x+B+K005F8h<B<`B_C7GwR7T4T7Umeqg9iwkYoq|b}=}O-.]-1n",
"tan": "'/6D8A:_:eBOBSGtM@TkW(WJZ~]Z]a_R_xa.a>bdm?n~o,oJqQsMx#y8-$x",
"chui": "&U0D@8GPsFtny0|n-$u-:_",
"kong": "%.&V,/0@;gg,sA-#(-4[",
"juan": "!{#2#H5J5V7Z9S:|;=?w@7AaG[K3SfUM^&mTrZras6u0vHy5yXzt}^}l-#'-&k-'.-6m-:w",
"luo": "%T&!&='n/>0M2]5>8f9M:n;@@)@UAwF8H9HYJ5N9OrRHS6UvW~X'Z1dbf`g'kAl:uEw>y/yf}s-$f-('-)_-*P-*k-+=-+X-/K-4#-6)",
"song": "&P.@===yGOY0Z]^b_?jcu1-$@-%[-'[-)e-,c",
"leng": "#>&h++L@eD",
"ben": "/&<(DxRuaUblk/sIy&",
"cai": "#T677P8aGSK+U>a5b[dxeQob",
"ying": "!R$v&C&|(P)c+_2K2^6U7/8`9^:>:X:Y:c=?A:ASDzEAF7F9G0G1H@HAHBHZJKLqMwOmQ0QPQiR0S8SgVPWv[i]M]|adbHc@g:j/m2twv8vky?~_-##-$.-$i-%g-%o-%p-1V-3g-4q-5*-53-5o-5~-67-6C-74-7>",
"ruan": "&u(>6^<o@QgQhDi*|(",
"chun": "#_0_4L8|>U?sA7C~G3G}HRITJZQgSUb(hKn}o/sL|T-0#-0Q-4i-4~-6{",
"ruo": "0P1#DnI}mP-0e-0{-5<",
"dang": "!,#s%2'((2/[1f2&CDF3GbKuN(S)UCW&]b^A_kd&kEvWxB{9~A-8[",
"huang": "'w+e0f1q7O>=C1F#H|Q@RtSuYv[V[f_Xd,kWt3txu}yI},-$,-'P-*.-0T-1A-2]-5q-86-87",
"duan": "${'&.I1`2X6a:#<r@kI/V/fdt.tGyG",
"ou": "*$=*@VA*KPM)MG]3^Yu:-3H-5[-6N",
"zan": ")},'1A1t1x3`W?^'^?apbCc<d4d5e}n1n7n<smuaubv2v<-((-4C",
"za": "%k4^4gAvA|Vpj*q8}r}}~)-$'-.u",
"lou": "$(0x1V=+=1C>IMK(QfRI]1a*g3kxu]yN|F~x-#J-+}-,*-5a",
"sou": "#v2BC;IQJ(L_M?Qum[o3t~uAyH-&:-&<-&S-'c-(R-*<",
"yuan": "!9!f)V.i0F6f7':.;m>CD3DYE?I?I_InLGLdO5PRPzQFQXQrT&TYUiUuV3VF[xa3bYh]iQj=k@kgl8lRnPphs'u(|^-%1-)9-*G-.o-30-3U-4V-5%-54-6K-6]-6}-8s-9!-90-95",
"rong": "+Q+S5E7@9C;^>FEFEfF5J/QhQwQxSDVEghthyb-)R",
"jiang": "(43u3|5P8:9L:F<>=.A2EaH^ILK.LAQjRM[w]=^W`6ngo>oF|H-#P-%5-12-2_",
"bang": "&<'A+%5_749B@uC8IcO!O*OvPt[s_olQlVt^y^-#3-,#",
"shan": "#:'m)K)q+W.s7g7}:D;p;r?pALATBaD&DtR}S,TCWjY%[b]r^ObFc?cVd^gGlAn#p!qtvBwRz4z5z;{@|P|X-'q-*J-+V-/l-1C-1D-2s-2y",
"que": "&5&E&g'6'7(1(N:P:RI]O6c}z}{*{l{p}a-4Q-6t",
"nuo": "+<+u3e3y4&<oU/U0[Y_DelkCt<y#}_~'",
"can": "+W1A3ELBO4Q.SjSn]2uJ-&`-'3-*T-+M-8^-8f",
"lei": "$X'F'b(,(H(I)7)~2j4h5H7Y8S8Y8j:=:d;t<s>5JiKWL.M4N*N+N7N@SPZ:^(^zhxnoqls?vPvvw:yz~<-!*-$O-$_-%7-%}-1Y-6<-9R",
"zao": ",y,~1R3sC#LlMPOC]`d1f4fNk%ktoCwA",
"cao": "3m>9C=C[EwJ_R:VbV|n)uc-*D-94",
"ao": "!T'Y<Q<V<Z=wC]DBK&R=T]Vy]7]8g]kom9uBuMuNz*}>}I-*S-+S-0~-2b-5X-8{",
"cou": "@ThJiK",
"chuang": "'_,H,L,q{+{E",
"piao": "$+).1D7a:;<RF|LiRCo?{3-%9-&A-&B-&V-*U-+W-.S-1.",
"man": "#{$*$c5X7]:<JkJzN)P2R6R]SoVw]>_tmuuCuUye-#!-%;-%y-'i-(Z-,t-,u-1*-2m",
"zun": "8':^U5]Pk|qqv+-1B-2u-4n-5|",
"deng": "$7'q.M/H1pCCW|`:f9l>mxv6yx}E",
"tie": "=VH8OhaPbndXq'qzv>vRx'-&z-'Q-*i",
"seng": "-,v",
"zhuang": "3:3nF)F]UBUZ",
"min": "!B%9&`.}/<1l6O6d:,:wDiSSb'pqs7tEzEzZ{K{S-1$-2n-3P-8q-8r",
"sai": "2'@cb6c9-%#-0_-2X",
"tai": "0+27>h>yB8BeD]GeLjdIl[nSpfw^-&/-)E-+7-/6-2$",
"lan": "17212Q4/8K8i9x;+I<JCL~N$N&VVVxW*W;WDWoX(X4]K^:_{fknxw/wFytz~{h-#Y-%K",
"meng": "$/$T$`(?C.CKFgH'IZKONvPgQZRaSFn'n,rKsby<~?~k-!(-!)-%F-(!-,O-/t-08-68-7@-8q-8r-8z",
"qiong": "#@#x,+,.,d,|/:/FB{EBM%MBP,P0cWdolFqs",
"lie": "5}=]?oEOOzU?csf^j`-&0-,x-.#-/J-1c-3r",
"teng": "2>2F7I@sAHM9N?R1Z@[`l1~u-)S-*B-*v-0s-97",
"long": "!p$a%n&=(R(S,u.!.6/;1*162N=P>'?6E<MxS^S`W8`4bSffu`w)|B}%}T~y-!1-*t-6@-:J-:O-:P-:V",
"rang": ")z+t,$8bMn]s^8^Nfm-.$",
"xiong": "?F?GCrY:YiZ4^a^mb'}e",
"chong": "*86b;:;|B@CBEhNfQRS$T5V)f!ohqhxZ||",
"dui": "&k'O(m5nLb]H]vhsj_v0v9ys{v|j})-$[-3h",
"rui": "#h.h6N8+D6E(KUKVKpMWMXO)P~r<rwuqxx",
"ke": "#u%T&5&~'B'Q(*(;*<+.,U,r6[9t<7C3DdHFLFOTQ5S}TmZi_Hd:gni.o2psqds/wyxQy)zM-$Z-${-%i-%q-){-+I-+y",
"tu": "*)*.*x,6/a@dFNG+GVHsIfcbe&j,jvnjp6porIs!s}wO-(h-)j-4*-49-4T-5!-5O-5z-9M",
"nei": "?~@;lNsE-'5-(I-/e-0!",
"liu": "&B&d'>'[,A6;9l;1;;</IgJ*MERWUTe|kbs#tctzuHu{xuy[ym~%~j-&>-&@-&C-&U-'b-(W-)M-)c-*@-*d-+T-.9-0m-5=-5_-7.-76-7[",
"shou": "6.9h@yC2uA-(_-:s",
"ran": "7v>ZDZIFOEOYTST`Tz-,A-,K",
"gang": "%.&q/{639!:N:W:x>Ep+s)ttwe",
"gua": "506}:z;%>xU<V#Z5[>^|cnedr#rFxM-&'-&1-*9-3k-6c",
"zui": "#G)C+15&8d;$KjRdXHi]nInqo!s$s8",
"qia": "%{'I?1HyU4dUnU-!{-+z",
"mei": "!L!_#)#a({)]+X0h3p;I;T?S?r@PE&FfI@QGTZdMg0mOnlrKtUtZyMyQ~N-#^-.>-.F-5(-7(-8V-8h",
"zhun": "+$,56(>UT8YAZ{_Pj.",
"du": "#K#b*f.T.^1,>DCsFBR&SZSmUyWqZd^$^D_E`3b%bNc)mMo(sDs|v}yL{!{^-!Y-#V-#s-#u-*E-,,-8]-8k",
"kai": "II`7gysvtbt{vCxGxvy@z<{({U-&;",
"hua": "%;&K'B3S8/BWD9D:GgIKK[MzR#XKZ&Ze[4[>]A]o_&`0p(p)rbsdunxN-*]-+<-5m-8=",
"bie": "FTNFObRmVuf6-19-2l-8|-:[",
"pao": "%e(@(O,!?|H>M=TeTfV>dDdTgfq/x.-!N-!o-7Q-7S-7|",
"geng": "56575d6m7,9Q;j;u<v=DFVGfavc1m0-%b-+v-/h-25-4j-6|",
"shua": "<nZR",
"cuo": "#1$z'G79?nFpFtImJ2J}NR[(erk0kzn7o7rEs^t[xqy$-7H-7L",
"la": "%_'R<*@>AbArG?HYM3PfQ4Q[SRi_i`l6v|z$-#0-,k-0F",
"pou": "0$UO",
"tuan": "1H4'V8a%u<-5V-6#",
"zuan": "1B2Y808N8U8e:Kb3fjftq)vxw?w~",
"keng": "%t&3&RZOr>t1uOxg|&",
"gao": "#R#g)4)6)e*m+N+O/v0~3i7E:5;O;TA'B,GILrMHZ[_:m+ryu#xny]-#o-'_-,4-,5-5R-5v-93",
"lang": "&7*n/dC(F{IXJ.JHPOQlZEg%lzl~m.rLu&xzz^{]-)h",
"weng": "#q:b;}=rJ0L(Qstg-56-7,-9_",
"tao": ")?58617A7N9W9kG|PoUhX{Yn[{^MdwhXjPjenzs+|r-!k-!t-#@-#l-#|-&w-'d-'y-)P-)x-9/",
"nao": "%z&q'*?a@&@ZAkP6R~YZ]Ju|x@zJ{O-.'",
"zang": ";S?_AmAyB$I,K@M#abambLbUb}rC-)A-++-,.",
"suan": "(z.b/m0;1BI^nn",
"nian": "':*5*P1Y3*C/K6evf5f[h=iCiS-/4-0;-1x-2K-4%-8B",
"shuai": "7>:4RNTH",
"mang": "!5!6&<&D.ZCvEXEiG4G5M_OvRaSAlDp.rsx:-)g",
"rou": "*!2w3X>3?l@aHdQC]tekhEt$-#2-#f-*7-0R-4t",
"cen": "+W.m1A",
"shuang": "(V7;CPuh}z~b-*M-*y-+^-5c-6A-7B",
"po": "%g%i/70I3'7i<,IlK,jLn%n[o1oKotq9uswMwz|=-$K-%a-)7-,N-.E",
"a": "@@s@x}|:",
"tun": "AYAeC~OlVL`G`IgJ~Z-&h-(0-.j-1q-8J",
"hang": ".k/T5*9HBiDHOAT#UAa9j3lJ-$C-%]-.i",
"shun": "!x$&$1$9BZKo-$:-%S-,g",
"ne": "!vY6^]",
"chuo": "'j0^6?8&9bd!e'e<h6iIirisk:narfu;w!-'B-:&-:G",
"wai": ".O-%:",
"guo": "$Y1K3R68=W=c@6@LA.GJK9N]Q&Q1RVUwV!h7j'kTm=pZszvVxm-'?-(K-(a",
"qiang": "%.157p82;G;R;Z;a;g;w@HCEJjKBLDMvPhVd[ndGeuf.tkuPurx~yAyw-50",
"pen": "<XHm",
"pin": "$V%A(8+w=^LcMaSLa;be-%I-%k-&#-(s-*q",
"ha": "4_NyP'QOqdxQ",
"o": "/}",
"huan": "#.#x4!565b6l8;:(:I;b><EoH#H,I_M<^>`Q`b`va/hpj9k3l/lsn9tCvSyJy{{:{r}i}{-*|-,|-/n-0A-0K-2>-3?-4+-7<",
"ken": "&#>8>Y>fUFV$`S`wsh-:?-:E",
"chuai": "A0ACeb",
"pa": "/b<zBdDrI)Trd7wr",
"se": "+b+r,#3688CULD]Ehnr4tauuxVz[{5~2-&I",
"re": "Dn",
"sun": ".f/L0T1rF<J%L$LNt|}]-&f-&p-5A",
"hei": "-8D-8E",
"de": "OMsoy(",
"kuo": "*Y*_/GH[H]O~r#rFxMz|{k~o-#.-#H-#e-$V-,V-,}",
"ceng": ".Lf:-*f",
"ca": "(E(Ykq",
"zeng": "$~'p.L5z7H7z9n:E;9]DbAc>m|roxk-.6-1K",
"nin": "?[",
"kun": "#7&H);*s+*5oGEPpUEUJUgV.`wo%sCy*z]zj{Y-)w-,<-,=-,D-0/-2G-4^-5'-6w",
"qun": "0<;_;`UVU^e.k&-7U",
"ri": "TMp/p;pd-)%-+(",
"lve": "+4rgrlxr",
"zhui": "&U((.h66729r:'@C@|[!b>c6j_o#s>sQvdy1})}Y-)s-+J-4Z",
"sao": "$O7m8<:A:HAdR4-&<-*#-*I-+Q-,:-0l-1R-2a",
"en": "J!",
"zou": "0&6GG=[)_CcNcOlem@mcn.|h-*H-+1-/w-06-2E-83-:.-:7-:n",
"nv": "2h=TSvSxp8wW",
"nuan": "-'M",
"shuo": "$m&+'$0cIvZaZc_>qttmv~x*",
"niu": "4H9.FxpTwq-!`",
"rao": "+i8)9FF,KdVvk}}B-'v-(>",
"niang": "nuoRoZ",
"shui": "#I)7*q*z@1U[ZaZcZg_>_KzG",
"nve": "&ONJ",
"niao": "@%E>K1T^UGVO-2{-6H",
"kuan": ",s,tAqw(-,&-,2",
"cuan": ",',Q,s,t,z1)1[fLfsrZw;yv",
"te": "?vRgr{xe",
"zen": "]V_y",
"zei": "S;a_bv-0M-1Q-2+",
"zhua": "2(AU-,Y",
"shuan": "5<@]z3{?",
"zhuai": "#1dmi'",
"nou": ";v=,tfv;",
"shai": "/Z121J1e2[[K",
"sen": "Ve",
"run": "$1AOz@zQ{F",
"ei": "ZH_@",
"gei": "5C9J",
"miu": "7n:@]+_w",
"neng": "?LR'",
"fiao": "WL",
"shei": "Zg",
"zhei": "j:",
"nun": "-84"
},
"m": {
"yi": "-:~-:<-:;-:4-:3-:#-:!-9~-9T-92-8u-8R-8N-8I-8+-8(-7O-7M-74-6l-6c-6L-5z-5)-40-2U-2Q-2>-11-0o-/_-..-,o-,B-,3-+q-+[-+<-)X-(o-(5-'w-'k-'=-'#-&6-$'-!?~=}E}1|x{Zz|zzxix6x.x%wKw,v%uPs_rurorEr8r)pppdpXojoioVnxn<mLm=l1j{jvjkj/j(i^i]i6h6gYg0g)g&g%fbf2f1f0f/etepd~dpd;c~c`c@bhbbbTaE_T_>_,^g]|]{]`]/[!Z=Y5XVVTTgT_T7T1SxSsR~RyR;QwQ0Q!PDP6NbN^N,MZMSLXLIL6L$J9I}IUIIHMG?EaEHE4D!CwCFBkBTBEB9B5@2?Y?K?I>K>H>'=a=R;m:~:48c8!7,5g4q3&2}2Y1j1f1`1M1/1'0t.O.K,_,,*x*f(c'G&.&&%b%Y%G%$$b$6$/#x#T!9",
"ding": "-:}-8q-)?-%!vipfkGiydzY2Ik6u+B&^&[%_",
"zheng": "-:}-9O-7L-0#{1{,yjuvsRm*lNlIi;eheZe8e4e3d/`x_v]3[+ZSY8Y2XlVFTYT#Q1C@A!4W3w07.),]%*#C",
"kao": "-:|n{k][#TbL>>R3p/,",
"qiao": "-:|-:(-6A-5v-4=-3(-2[-.@-,2-$H-$5-!q-!=y/y$xkx4rSm+m!k]k%j:iSi(hqbvaT_wVuV6V$T%KgGaF^FKFGEpDSBCBBB;8<2b1C1>.}#e",
"yu": "-:|-:p-9^-9P-9J-9H-80-7t-75-6'-5g-5b-5H-4U-3F-2l-20-1F-+K-)O-)+-(J-%a-$p-$K-$9-!7}]}W}5{7zizNzEvyvwv9v3tytjtetcsqsos@rsq|pyp+p%oQn6m%l8kyklk8jfgvguf%eGdWbtb(aLaKa:`1_1^:]e]d]KZOZ!YmXiTDS`SUS7RpQyNvLAKsJKJJJ;IAH|HmHVDVD:D*D#D!CrC[CDC,B*@K=Q<><<<1;h;_:v9G908=7M7I7A535#2{2R1b1:1(0;/q.(.&,1+G+9+7)n)h)F))(+&*%!$M$D$=#V!A!0",
"qi": "-:{-:r-9{-9E-9;-99-82-8$-5f-5(-3D-2{-1:-0G-.j-(Y-(A-(.-'v-'C-&%-%m-%I-%F-%E-%:-$D-#N-!Z-!B}$zvyHwbw;w1u~t[tFn;n3n$m~l^kkiBg/dpdTcKb<aBa&`3`2`'_b_)^K]OYRY@X?W1TgT1SkSjS1RxQ4PbO@N]MyMCL]LZKhKOJ~JcJ]J[J>J4GyGJE<E,CyCkCjC<AEABA6@a@7@$?+>W<Y<N;5;49h9*6f4x3D,m+N+8)a)](`'4&V&1%K!C",
"shang": "-:z-:t-7k-3C-%S{p{*y:oAo@c8aA`@]}Q^G.BxBZ@P:h9>8l1T",
"xia": "-:y-:s-9u-6I-5e-3w-+T-*+-(v-'m-%n-!!}({Mwtwpm/logkeB_3YST)P~M<Jm4X3z2i.L.,,}*C)1%V%J$8",
"han": "-:x-8S-7J-3>-1A-/j-/i-*P-*J-(^-&C-&9-$k}[{Xtrrbp,n8lJl%dqbm_c_L]cZ(VLV%T]R_R^QRQQPOK9IJCH@l@^@?=k=Z=?<l8k7X6'3I3@1Z01.g,t**&{!p",
"wan": "-:w-:E-5=-/S-.f-+)-+&-&1{0z*x=wlwkv6tJt3ptpen%iGf_f?d[b.b,]1Z9Y|YmY=QOQDQ@Q,NVNNK1J%G9B2@h<m:X7}7<5:3]+&)t)Z%z!n!7",
"mo": "-:w-:5-0z-.(-#S-!l~j~b}!yQy#v!r_rMr$qno}o?iji_hR_(^d[cVzVkVjUHTyR$O4M[FrFMC$C#B~?~?o?e8m640`.8,%#m!x",
"zhang": "-:v-8k-8]-8L-3=-1byErnkDimiIh}hsfnfmfXey`Q]hYEPRNeFt<y<p8Z8Y,$(V$`#}#u",
"san": "-:u-8d-7q-5p-3c-*Q-)m-)l-)k-)j-)ix:iHg#T5AeAdAZ7s/%",
"ji": "-:r-:O-:<-9p-99-8x-8w-8'-8$-6t-4W-41-2w-1:-12-10-0*-/l-/^-/W-/#-.d-.^-.0-,9-*z-*`-*U-)d-)P-)0-)#-'6-&c-%s-%d-$V-#x-!{~z|~|f|.zxz?z(z'xlw;v^vJuZuLs$qAp=p;oJnfnEn(l$l#kRjsj0iBhYh!gEf=f<eseMdxdaczbAb*a!_K_)^k^F^C]@ZRYCXHW1V`VBV$UtU^TgT1RnRmRlP]P[PCOAO@O$N9N5K,JNI*HrHhGoGTFfF3ExEXEPE8E'D[BdB:@O@B>y>]=x<`;t;(9.9(857&6{6d5m3D/;.j+?(>(!&8%{%t%4$X$,#H#>#'!w",
"bu": "-:q-7F-,M-*w-*t-(d-'K-&D{B{?{6zPtOm#izh'gfd,bi[rY}Y{YfQHM,C>C;C:'=",
"fou": "-:q-(cvCBj4H",
"mian": "-:o-42-1d-0w-,S-,H-$`tktQsZqpq#aDNWJ^E=D~@p?|;k;,7G/o",
"gai": "-:n-9w-6e-+u-+t|'uYm@dy^AW%T`QYNaHZGNGM:M8|'{&6!,",
"chou": "-:m-:l-8m-5_-4=-2A-(m~{t/r!iKhld$b3aS_%[_Y%W~N?N=LJJkI|E?B_0h/O.s.p&3&!%l#v!m",
"zhuan": "-:k-7o-3G-3+-2y-.I-)n-%+~EzRyPreq<oXoRc0V28t5%)5(f'.",
"qie": "-:j-7Q-/`-+P-*@-#uw1u{iCcpbkaia8`fZoOZL]I~>;<`,E%g#(",
"ju": "-:j-:?-9m-7n-62-5`-5S-4x-4j-2l-19-0%-.Z-.:-,.-+n-)H-'d-$|{/ztx_uct_tNt$o{nvnqnOnMmqmil`jYj9j7g+e%d<d3d(an`}_E^j];[I[C[;Z^Z@YdY$XMUdUVR3M^M9KxJyI{IzIrHSHDF:EcDPDCC8AqAi?b?L?(>:<g<I;[:o7)4L3o3<30/4/..P.A*e)m%5",
"pi": "-:i-8@-7|-7P-2Z-.R-.9-+>-(h-(c-%5-!.-!,~|~X}2|L{2xhvCs<rwnumblFk7hWcibx_U]G[q[eXcUgS+OXN3N2HPB&B%<@8>7*6e4n2x.Q.G,n)Q'(%k%h%@$p#R!U",
"shi": "-:h-:g-9q-9l-9N-9M-8t-8_-7R-6k-6]-1X-0m-,^-,:-+_-+6-++-*>-);-()-'{-',-%.-#t-#7-!W-!>{>z|y{x<wQvqunu<r4pbpap[pVpMp*oun~ninhm;m7l0l/kQi{iuiQg!f}f|eCdodTc_c[aU^*[.ZyXYS6RXRUQ{QzQhMWLxLrLlL5HiH[H,ELBiAJ>n=}:{:s:W:5:'9v7C7?6n4=4%28.3.+.#,0)$&3$}",
"qiu": "-:f-:^-8m-6#-)u-)9-&+~*|FyTsQl4j2j1cFc&]rWkO%KIHeF8BpAn@s@b?J=o;^:l:k:j2D/T.k+D*'([!P!(",
"bing": "-:e-:W-8h-8b-6u-5B-4T-3Y-1;-0a-0[{mp1ngnZhbhah&cm[vY,W5R0QpN/MQLQLLJnJbGXE:@~4E)r%,",
"ye": "-:d-9z-9.-9&-4e-2_-0U-)7-(u-'%-$W-#,-!]{:zIxqxdwgoVm$jxjw[hZzZ!YyY;X:X6UhUcUUUSURQUPxP@P?P,OmOkMYMXIQHsHpCXBh>i<o8q7w753l3M2N1H0M0,0)).(T'b$V!a",
"cong": "-:c-8f-+r-)K}w}ptPq6eUeTeReJdZcnbUbIa3`^`.PTMxJ`HyG2FgF[D?<G9!8v8L8D8#5V3+1n0H)X(e(a",
"dong": "-:b-6R-4n-3,-0`-0P-0>-,u-,G-,/-'I|/{)y&u^tXr*mSm>lKl?eNc3_H^LZhX<QrNILfJGA8A+>L<j:n4#18.0",
"si": "-:a-9B-7T-7R-7N-6H-5f-5X-4,-3y-2+-1[-03-*#-)x-)5-'F-#m-!u-!M~)ugtdsJqDoaj.gUd%cHa2VMSDNOMeL{J~I/H!C'@X?O?8?*>^>J=,7[6?1</R",
"cheng": "-:`-:%-:$-68-4_-2z-0K-0C-(@{H{A{,zYz#ywu*pSlth%eZb^al`(_v^t^U]A[zZFYPXDWQW,VRVQVFQJQ)N}MnLtJPJ@IyF=F<F9EeETA!?0>e=_=G<8:?7f7d6/05/f*6*2)c%x!'",
"diu": "-:_-:[",
"liang": "-:]-:Y-9)-5x-5[-5>-5%-1G-0B-&J-%y-%7-$Ly2bWY7Q*KJIwG%<e:_",
"you": "-:Z-9#-7w-7=-7'-6X-4;-2*-0t-*p-)f-)c-):-'~-&u-&>~n}bvRuAq=pZo8o6m1lyh[hZh(d]d$c|cqbY`,^xXkTaS4OVM;LAKGK=H{GFD}DJ@8@(?V?>=g;C:b976B/j/i/O.b.D,?,>+Z+Q&g&d%O%!",
"yan": "-:X-9d-5]-4]-4O-3;-1u-1Z-1Y-.a-.[-+:-*O-*F-*/-*$-){-)z-'%-&=-&2-%'-$N-$G-!L~~~a~Q~5{GzAydy7xLx@wMw>vPv>uFu@titfrgr?r9qwqfqWpKmhlEl'kuktk0jUjKjJjIjGg<g*f'f&c$a7_5^~^8]w]?Y3Y'XhXPT3R8QZQ.P`P/O}OrJsJ<IFIEI5FeF'E^E.D`D3C_BhBG@,?P>M<V<&;K;D:i:H9R8y8S5O5I56544k4j3u3X3J3B3?3!2~2U1t1E140Q/U,w,g,d*Q*()V'$!3",
"sang": "-:V-$J-#}WgK{KzGV",
"gun": "-:Ub6JY9W93",
"jiu": "-:T-:8-:7-9|-9v-5A-2p-.H-+|-+e-+]-+A-*(-'U-$wvdo(gogdgc`IZ2XkXBXAW9TGRhO#NTM+LsKwFxD;BW@v@Q5$/b+:%X",
"ge": "-:S-9Q-8R-7!-6|-59-.O-+l-)(-)$-(e-(D-'4-&Y-&?-#s-#`-#J}6yhfLaO^^^R^=]_ZkX*WHULTML4GsE!CW9l9`/T.f,C+k%Y!,",
"ya": "-:R-9>-9<-9:-7m-5K-0W-.$-*H-*G-*A-*?-(s-(H-&n-&'-%;}L}@}9{j{5zbxTuBu3t%q2n,lVlUhKh?[`[ZZZY:XLN'KlIsIFA0A,<r9,8//g.^,[,E+/)}'b%h%J$x$K",
"pan": "-:Q-0S-/B-)R|Ys3i1[O[AW]U=MMGu?t>}>k:c9s84684l0$/w&C&/&,!*",
"zhong": "-:P-8A-83-7x-4Z-0j-/C-$Tz8ysx$vMvHs^o)i)eqe0dddYS`MKC2@=?G4w2k.T$F!>",
"jie": "-:N-8i-8<-5$-4~-4W-4!-3j-2]-/@-/?-/)-,r-,a-*j-*i-(e-&c-%d-%H-$m-$8-#q~zzKz7vevOuit>sasVsCs(qSpIoJnpnln*m|lCkvkbjrjqjgjbhihIeEbr^S^;]_[,YZY+X{XwX?W_UmUOUJS9RINXNJL0KxKoI~I1HqHgHfH8EOB,>j>;:z9b882?/'.6+0)H)8&K&J%g%]%M%##D!~",
"feng": "-:M-8:-5L-4N-2Y-0]-0&-0!-/{-/y-%p{Rz9z5w}w9v7odoYl}l|l5W4MkKPI.E[?m?h=S;Y;#:R8e5Z4i3V3*2g1h/1,O)u%C$B",
"guan": "-:L-58-1=-0l-*vphb@b?af`LXqW*SRJ+G*D(B2>w<v<W8G5Q0E)W(4'e$_$0#Y",
"kuang": "-:L-22-0V-,b-+V-+N-*v-&o}&xNwFm_dJcW^z^y]>RWQkP#L)?N>=0X.X.U",
"chuan": "-:K-7o-3G-2t-.K-$]}Tz3jFjDPMIRIDCbA?@i,H+<)7",
"chan": "-:J-91-2y-2R-1~-1/-/:-.k-.J-.*-*~-%$-$F-!n~P~@xBszr>q3l>kJkCkBjXh{hpgWdu^r^lXsX+W;VqVhU#S9RYJsJXDEB#=v:^967o7n71655d5B2V1I,#&v&u",
"lin": "-:I-9U-2g-0e-00-0/-)v-(l-%PxDlbk,gIgHc=bob)_=_6[MVGS?Q+PGN!FIEmED<U7j7H5h3819+u)S(I'+%o$Z#M#K",
"zhuo": "-:H-4t-.`-.<-+#-)X-%U-%T-!G}+y@v,tYeu[BZ,Y~V3UxU[StSHSESBSAS>Q>L#JuJfJ3J,IoGcDh@j=|=h<b<J7%6S5[4}4N3_3#1>.h)e)N",
"zhu": "-:G-:B-9]-7d-7G-7?-6Z-.&-,t-,n-#T-!z~4|=xpx3qVq!ploNnWnIl*i>[[[WT&StS;OqO1O0O.N>M#LzLFGWFmF,DhDbD^D0BH?&>Q;b7t7Z6s5x5>4V4A3y2^2@1+0x0?,K*K%B$J",
"ba": "-:F-8l-7`-1E-)^-)@-(b-&M-&I|_{[x>wCv0mumIj,fq]o]I]6]#[GZ)O+M'D,5?4R0+.m+@%N#/#!",
"dan": "-:D-8~-7{-7H-2r-2J-/V-,,-+G-*~-*{-'f-&2-%C-%B-$v-$F-!m-!b~[vTsjiofTfOfEb$aga>_q_P]4[VXuV@V?UjRiM/BeBSA*@)>r<?7.1I.@+#'O''%f%:$H#`#N!F",
"wei": "-:C-8{-7p-7e-7A-4s-4V-4Q-3~-2x-2$-*h-*b-*O-)O-'q-%q-%k-$s-$S-$@~.}o}m}S}7y1xJueu7u$snsUsHoqoQnxn_m9m2lHl7kskZk=jljTiniEi9gme=e:avaPaM`?_JYnYUXbX1VEV1S^PuO5L*JqIOINHkD@?g>c>C=n=$;S;N;0:N:08?837i6R6G5|4]4>4$2]2O2F1]0u02/$.r,[,P,I*~)h);'f&H%!$N#X#U",
"jing": "-:A-9C-9+-9'-5r-5%-3A-2O-1N-0K-0C-/9-.~-,y-,k-,[|i|g|cyIvQt:t8t+pojAh|fdfZeeeWb/___NUoT+S&S%Q:Q3PIP0KZJpEvBsBn@I@H>m>%=><87]6#,r,'(^(B(<%($u",
"li": "-:@-6_-5u-5k-5Z-3s-2&-1z-08-/Q-/=-.o-.G-.'-.%-,l-,&-*L-*I-*:-*.-*!-)|-)Z-)X-(z-(2-&U-&0-%g-$C~g~`~A~>|`yrxEu+tat#rjqYq,nAmkm5m.lzjag@b]bXbRbB`l^&]q]gWYU@U3TsTlSpP_P>P%O&NmN^MqMSLnLcLYLUK!JoJdJMG1ECDuDjD_D8D.C/C+?k?[?Z=Y=U=/:/8z7@6C6$5H0a0U/>/=/#.z,~,u*V*$)z(t(_'x'u'l'W%R%F$l#P#A!Y",
"pie": "-:>rVV]V[PHAD8>",
"fu": "-:=-9c-8[-8#-7z-73-5y-5m-5j-5U-46-3v-0d-/|-/J-.R-+h-(=-(6-'[-'S-&E-!s|<|!{]wvwWvVvRuru'tDt,sbr5qJq/pmp3oWmgmFi~ifi7hzh;fwfkeje?c{ct^w]l]J]&]%[Y[QZ+YfV7S}SLS)ORN+M]MGM)M'L1KWJ2IYIPHKA:>~>Y=W<w9c7T4S3d3/0.+2*t*!()&m&b&N&G&@#h!)",
"nai": "-::-6v-4iw:vhv)qxq(g6WVV{M$AC;<%`",
"wu": "-:9-:1-9D-97-8>-8%-6;-5|-4k-2k-2:-1q-.T-,|-,C-+y-+/-*V-(U-(T-(J-(?-(+-&)-%K-#v}4|^zLykxvvxv4u%tjthsurTownkn9n+lmkzk_j6hFgQfudbd`d@c'b[bZbKat_]^[]e]d]]Z4WGTTS7RoROQENvNtNoM&K#FLCVC=B3@[@Z@S?{>T>*=V;^:,874(3C322*1w/V/A+3*4*3(|(P')$h",
"tuo": "-:6-8X-77-6h-6.-'a-'G-%[-%$|Sz;v8sNrRmck'gzet]i]`[H[F[EZMYuV1NgN^MTM8ITI+GbFBF0AvA_@d?`?_?^<k.K",
"zhe": "-:6-9[-*K-&L-%9-$o-#T~h{Er^bp`6]H]'W_ViQGQFNgM=JWFwC%=m<E",
"ma": "-:5-9Q-3o-(r-&!-$%-#4-#3vUs1rWqNhR[cVzNQH2:2/&.c,4+5(x$[$Z",
"me": "-:5~t~j~UhR6I",
"yao": "-:5-:,-8;-6D-5@-4?-3_-2q-+m-)&-'7-$b-$2{}zBwUvGu_svs=pro3o,n/m,l,k#j~h^e;e.cqcRa%[oX2WrW@VdV$PkP'NGN#LuI;HBH9G5C!BA:B9J444&1|0f0(.E,;+r*D(~(l%S$%!t",
"zhi": "-:2-9Y-6f-5^-5C-4|-4d-44-3y-2,-/}-/0-.U-.+-,v-*e-*>-)C-(W-'v-'8|||{|T|:z~z{yFy@x$v%uNtsrGp&m7l0j+iridiahyh5h3ggf5eYeKe4e3dmdUcU`6`*_$^{^E]Y]F]E[u[HZtZpZ]Y{XvWpWVW2V{VvVtUKUJU>TjSMRwRgQ`Q/NOMyMcM2LqLhL6K~K7JjIuI]I*H+GHF_D|DnCAC6BiAJ@t@O@N?v?T?3>V>3<L<!9e9S9B8}8@7~6>4`1_/9,x,^(R'w'[&3%c%;%7${$z$k$E",
"zha": "-:0-48-.N-.=-*C-(w-'X-'?-&K-$j-$O-$Aw/pNd6]s[m[XZdX4WIW#O2M7M1M0LvLlI?H4Fv;X:67u5#4@2N/p&d%.!M!H",
"hu": "-:/-:'-9j-9F-5E-0Z-+U-+L-'h-'W-%n-%Z-$_-$4-$1-#>-#2~k}v|;x1x0x,uGt4sEr]r[oxm[iphxfxfgdFd*d)cGa{^V^6^4^3^/^.^,^']y]9[xWWW$SXRFR<OjN(L8I%I$GEGCCR@9@&?f?7=t<.<+;$9E99986Y5s483S2;1a.J,S)b)+']'['I",
"fa": "-:.-8!-6y-3Z-0R-)]|A{vy)uwm4fKL@FO?X?:=z5R*[)L%8#.#+",
"le": "-:,-9R-8r-,J-)2-#1d}]qH`G5@z??/b+A",
"yue": "-:,-1g-1e-1`-/P-&j-&@-%A-!DvAqrn1m^jec,bubS^]]g]8Y_U@OpOoOWN8LcH`G5FTDj?'5e0J+*",
"lao": "-:,-6~-3!-,j-,i-,>-'$-&N-%z-#p-!}uSr`ljk/cY_f_eYtVZO:L=G5F!=O='8%7a3{/^./*<$f#c",
"yin": "-:+-7}-6^-0t-0;-*c-(j-(V-%o-$d-!T-!+~l~+~$}`}$|&{w{YzXz:w_u=t0t&p:n}lnlLl<jdg^g>fya@`i`B_u_t_0SMO[L:KKEkE@E1DKCwC_BYBGA5>l>d>U<5;~:}:i9}9V6^6]4).],|,j*I(U$7#k#_#:",
"ping": "-:*-5i-0]-/z-/s-'u|Qz1u/ngnZmTi[iJi4heh&`0_zMfEU?6>6=A<D3)*v'F';&_",
"pang": "-:)-*B-#ww}r|o2h9h*ere<S2@<?y9p4i",
"guai": "-:&-)_wVcuc>[KMbLw",
"sheng": "-:%-:$-4H-.X-.Q-,?-+0-(9}=x{x7u*k}_VS[RGQJQIOeMuIyG~E{BzBF?%;k;@:q7G2u/M.N*h)i&y&s&`!'",
"hao": "-:!-65-3k-2)-)6-'j-&_-#k-!t-!Y-!#~xxRvacOblRDR'QBPePaPWP7J!A~Ao=]<Q9j9U7S6c5N5@,/,)+}!y!q!h!f!c!_",
"mie": "-9}-),-':-&Hq7hk^uWeDr9m64504!",
"nie": "-9}-%*-#e-!O~m~D~5~2}#q'q&mFkTjujLivZ&YVY5X[WCVsT|T<MVG@DW=@:Z%+",
"xi": "-9y-6&-5l-3i-3#-1B-0,-+?-+*-*n-*R-(P-'x-'>-'6-&/-%]-$X-$:-!p-![~T~8y?xWwnw'tgs;rCr@nsncn`nRnHkgk9jpj`jZiqiOeceOe9djd_dEcscgcZcKc/bqbeb8ay`r`p_s_r^V^6^4^3]_]O]HW%R:QKQ9Q6PEOzNON)MdLZKSIdIGG{GUFkFRE|EjCzCuCmCMCJA4@e>X>S=f<[;i:+9h9)8p8/8,7N3e3R3K343&2Y2+2)2%1q1P1O1N0}0P/E/?/*.{.t.#+p*r)|(#'h$1!k",
"xiang": "-9x-9,-9(-6}-3*-1}-,4-,$-*0-(x-&r-%L~Ww~uXk5j)h7gqe'abQXP5LWH^F1DH;!8:*E'g'T",
"shu": "-9s-61-5g-55-54-1|-1F-)Y-'3yNyGu[tGq4oNoCnWnIg}gxdWchcgcIbt^X].Z.Z#Y>WBU9T'S|PvPtP*OhO1O0O.N[NBMtL`JtFuFYEpBuBKAaA`?c<O8[8H7m7Z6m5q3Q1k)f(i('%h%e%d#O",
"dou": "-9r-61-1T-1P-(~-(N-&&-%|])S]SPN&J}EwAm=d;n6<.$$v",
"nang": "-9o-1s~d~;~1_QWwU{TkOwD+<n5b5;",
"jia": "-9n-8<-7Q-6w-4X-3X-2]-,}-)S-&?-&4-#F|}{MwIwDsrs,pvpImei,e[eBd^cA^J^G]L[d[Z[,ZWZ8UhSYSVM`M_K/ILHNH:G^ENAz?H>&=L/3,E,B*n*d&f%0$8",
"mao": "-9k-1,-1(-0|-0z-*dzLwksLmOkzi?a=_?^(S/QvPrN4M@I'B!AcAW?9;F/Y/#,J)E#$",
"mai": "-9i-7I-,{-,*-*}-#${Kx5",
"luan": "-9h-9Y-9V-*^}C}Bvmu0qXq:q$m)jOZ[TvOuL2D69K5J59#4#3",
"ru": "-9f-6K-2C-1K-(N-#{-!$vkv[s7qyq)jciX]kZgUTP+NzL(E0@W>7;Q9u6b+^",
"xue": "-9e-.x-(Q-!9|Bxbq>q+mmmMjzf=ckT/SlKvFc?!>u9j7>5y1&.B%L%<",
"sha": "-9b-4c-3?-2H-/,-.t-*+-%t-%^-%H-%4-$R-$0iCgkZEZDW<N{NrK`H?FlCaC3BDAl?w6{2P,v$g",
"na": "-9a-1*-*|-(R-(8-&T-#_v=tx]0[LZxZgYWWL",
"qian": "-9`-9Z-9W-8T-8B-7l-7(-5q-4w-4^-3g-31-2<-/r-/[-.u-+4-)}-&4-#u}/}.zaySy4xZvgt7seqtq`q5n'n!k{kVdObgbLaN`f`<]Z]N[J[1ZCYLY=Y!X7WSVgVbVUU,U+U)O_NwJ_IbH3GiGPF%E7DzD'C~CeCZC7@]@M>$<%81806O5S4B2Z/J/B/2+%!l",
"suo": "-9_-9=-3]-&8-%x-$&-#j-#gu&s(as^$ZEZDW:PjKaJz:E9y+|)w)v)!(]",
"gan": "-9Z-8S-7J-5&-0=-/u-'c|Ro'o%o#o!hfh_dqa5U~T]T6R_NuMDKLH6FNEd@??;<:8f7_7/55+;*w'#%?!T",
"gui": "-9X-6q-3{-/(-/&-.7-.5-+Q-+J-+I-+F-*%}3{zv2u;s?rhrIp|k$jpj`iLhLh,gmf;cMVxVVTiThRCQ2O%M9L.KeIeI`GTGAG<G;FWEQE)DXDQC*@v;;:H4t,Q*A(r(D'q#X#0!|",
"jue": "-9S-50-3f-0X-/R-.?-+@-*,-)X-(Q-!a-!R-!9~I{PxbvAqRqQnLnJlPl@k$j}fmf>_k_Z^b]7Z`Y~Y9V^V;TnSgKTF7F6D[CvAG@:?!5P2|1d1>0S0G000/+z+M+)+'*](n(G%L$3",
"liao": "-9R-2|-!rrLovomo<o5o4nKkLk+k*g]gG`/_^W9VaV9S{SZPLO~FxFA8Q8%4f1;0V0R+q(H%[#g",
"er": "-9L-6v-6T-1r-1a-1_-/1-'B-%hoHoGoFmAg$f~NiLCLBK6FaAt>[>90%*F",
"chu": "-9K-5N-3d-3R-2K-2!-0$-/m-/Y-/I-,t-*)-!o{$x!s>n5hjgXcj`g_SWxW$VoTNS=NEIjI&HoHQF|E}EsESE#DsDdCzCG?@9r9q6x4N/+*+(,&;",
"kui": "-9I-3{-/4-+I-+F-$U-$;-!xwow4s/rBo*mQjVjHb]a.a,_y^BXgQdPyI2I0E&BV:S7x2l.q!/",
"yun": "-9G-7r-3q-1p-+}-+x-(0-&^-$^}xwEvsvEqOb}aca4a)`c]2[yRNQTP}MwHWF@BmBaA&A%@0=3=!:!7W2h2:202(2$1b.Y+(&P",
"sui": "-9A-5#-&F-#U{3wytvr1nwn4kpRqEWC1C0Ab=H9[7+6z5}2C1g0~(/'p",
"gen": "-9@-9?-&pX=X'L7",
"xie": "-9=-9!-7[-4J-4A-4/-39-1{-0s-0c-,w-,+-+'-+!-*k-*Z-)7-$(-!C~e{ry_wrw8w1u)sOq]opnenVnNm$jrgJeFcT`z`p_BZ~ZWZ8X9WnWMV*UiUFT}SWRePXMZLIK@JwI,HOH?H/FlC]?K>p>A;P9h7B695{5!4Q4P3b3E2,0w0s0O,C+k+e)8",
"zhai": "-9;-6B-4f-4*-3E-*K-*C-&c~zw{p{os[u[2YxW/UwU>SiSfH#EL#t",
"tou": "-98-4'-4&{$wNv'sqs@aK]*T0SQ",
"wang": "-97-8v-87-1JvYo7o1o0o/eoeiefe[dldJa}]>RTQ(OEODO=N1JD@J6;+E",
"kang": "-96-8)-+X}|rmkKg|dG`8]f](G=8_4d.a",
"da": "-95-.N-+f-'f-'R-&m-#~-!J{hxrw[v*d'ag_q]nWZVJ@f?}:<4Y0p&@&4$#",
"jiao": "-94-6n-6D-2q-2j-2I-.B-.6-,6-)B-(<-$H-#M-#K-#?-#(-!^-!=~IuUu1r=r6qcm+m(k1k%k!e.e+cJbl_~_i_KZjZTZ5X&W9VlVCV(ToTJT?T,SwSuSgSSQbPgP2LOIpG!>!:l:k9Y8w8<7b5[5C443,2b1>1*.9+l*X(5#e!v!^!V",
"hai": "-93-'V-'0-$#-#h~ey]vOq;pL[!A3=N3[,C",
"heng": "-90-&B-%QuJcXcLbaVKL/FiF&<|42*B",
"peng": "-90-5,-3J-.F-+o-!~zgyqyYfUe|cyc+`%[tZ?Z6YkXpWvW4OTKCJLIlIWGGFn?6<R<D8e8]7Y3Z1h$a!u",
"mu": "-9/-8H-/~-,=|Ey9usuSu%m<i&i!`[`Z[TPVPUO7O'I(FrFqB1AwApAX@#4h/a/_/X/L.S&U&Q&E&:&9&(",
"ting": "-9*-68-60-4C-*M-*7-(]}>t}sxk~hVhJh)gBg?g;dzZ<K]KHH~H(@u=6;]6u453`3^*.&^&[",
"qin": "-9%-64-1^-,8-(g-(f-&#-#f-!Q|w{Fshs.p.p(o~oyogkmkVk2k)hOgbdO`C_G_F]N]5YlX,X$V/UlS@R=J|E`Cg@3:$7'6(*J)R)M#l",
"qing": "-9%-4b-3<-2(-0A-.b-,O-*S-%1}V{1wfp7hQgwgeb4`9YLUpUoQ5PsJ'G/EME/DcBnBFA7A.A(<';w;B916X&x",
"bo": "-9$-8Q-7`-73-6,-2v-2f-.e-.]-,Y-*y-*w-&M-%#-!h~oxbq*k3ibeu`s^|[3ZJWyV=V5UgUfMFM'KYHKEVEUDFBj?E?,=e;};W:L2//l.?,9*q'`'^#2#1!Y!8",
"lian": "-8}-34-.;-+E-+D-#V-!XzUwAvusMrKr/iegjd&cS`F_{^fW.T=SrJhI#GiGSE7DfCHBlBP=%;6:C8j8A777$6p5p5l4<2f1y0z)x)3(X",
"duo": "-8|-8X-02-/2-/$-.c-.V-'`-&y-&e-$O~}~S{|{{z}z]xzxywiwhwHvtvlsNo+lOh1ae_oZrZqYJTET>T8T.O)O(NfN^MrMTMSM&KuIRAh?`?^&D$i",
"men": "-8{-8G-53d8bcbCaz_9_&]VYgS^PZIh@>3=1,+((W",
"ren": "-8z-8y-8s-8U-8F-88-/d-/cx;vSu`n:n2d|dwdv]XO,NiLPLMK6J7/]",
"shen": "-8t-7V-6i-6/-5d-1Q-)l-)k-)j-)i-(V-'i-&}z^u|u>ttsys.qmp_pHorn7lui(fp`t`b]b]4WPTFR4P9P3M:J7J(IHHRA9@+=D<0</;f;e9?671?*g&~&w&q&e$G#{",
"ze": "-8p-6B-4*-/M-.{-'X-%d-%2-%.-#9rcl:iAi#hU[~[2Z$UwRKR7G)C.@q?n?A>n:(9U7C5[!e",
"jin": "-8o-8j-8d-7}-6<-35-2^-2=-01-,y-,k-,[-*X-*'-%o-!F~y{Fzkz6y<xPvFt7rfr9q~p(nyj'j!gbb+`CWfSOQaQ_N7HEG8CTB[>E=q=M:I9$6~6g3h2M0i*Y)y)K(z(d(@(*",
"pu": "-8n-3$-+k-!S}^}O}<{BzPy(]p[rY{V0UvTeTdQ;PiPPP&O*M,FZE_AS=`:17k6T614r3a+v(C$m",
"reng": "-8g]m",
"zong": "-8f-5:-4y-43-3KzFpikxkrkNeJcdaraVY^XXX(W&Q|O>MxJQIKG28L8D8#3+1n1c0{,b,R%E#w",
"fo": "-8e-8;-73|IJl",
"lun": "-8c-7i-6S-4u}l}Y{.t*lSlRb9[{YMJa?j<6:3",
"cang": "-8a-89-7h-5;-3e-07-+OkeD<?i9n6J,**{(p",
"zi": "-8`-4m-17-.h-)%-(W-'t-'r-';-%@-#r-#cupuoudu9qTqNqMqHq1q.l;k[c;NnLKK8InH=Ez?s>W<];o:Y9g9_8a7;/G+J(!&Y&7",
"zai": "-8`-3V-2G-1!-&v}8pOl.]j]>L3>f;>:.4|4{3~&Y&7",
"ta": "-8^-6E-3^-#~-!&~Kz$yyy6vep}lc[HZXW`V&HCG}EqA[?}<c:<9w8^7(6w/`.3+d+V",
"xian": "-8Z-8Y-7b-7,-30-2m-2d-2b-1i-0O-)o-'c-'E-'*-&O-&2-%6-#u-#:{`{!ycxXv`v&uKu>u.t`tZs~r~rOrNr9q`pUo;o:nBmylxlhjthhgCfhf+dI_a_X_R_'ZPYQXsWnWiVhVXVSU6U'QlQNPKNFMhGiFFEtDRC~ArA@>S=E=7:]:C7Q6*574*0l.=,s,G+f+c+U+O*|*s*T*,'3$c#b#Z",
"cha": "-8X-6Q-4D-/,-.t-)e-$A-$$~s{yvbu?o|m}kqj3]a]OZ7Z.XZX5WJW1NsM0LvK?I?GjEB@k,<%s",
"hong": "-8W-)w-).-(X-(K-(;-&{-%}-$)~i{kvXu6pqpjn=j[fvfBa*``XeVNQ[@E?y?<>@=b=S;J;B:R8J7U5(3|31+>+4'T",
"tong": "-8V-7/-6R-4Z-2h-,/-(}-&|-#Z}o|/mNm>m3h:f(c%`P`)Z1Q]P<O<K|KUG+F+AV=P7l4C4#18.~.0+s%%$s",
"dai": "-8P-6G-3W-)g-(B-(4|3{(w[m`ikiViMiFg[edd!_/^1PAMJJCC)ByB+5c,2*y)?'!",
"ling": "-8O-7X-0?-/D-)G-(#}h|>wwuqtKqdmdmVlQjhekY<R)OQMRJeJ5DND)?/<77=5'4O0v0=.I*z){'H!z",
"chao": "-8M-8D-.B-.6-,6-(S-!yjQj?j>ffd9]<VlQiOBGFG!C{9+7z4g303#22/v",
"chang": "-8L-8J-7j-5D-5+-5!-3|-2~-26-1b-*P-)~-%i-#8~v}%z=yZtWrdo=iDgReLd>bDaxT:RBQtPcIiAT<T<P2t,`+6)^)4(h'B&z&R%w",
"sa": "-8K-+2W<VPU:Dw?'>X7s5L",
"fan": "-8E-0)-0(-0'-,1-+R-)a-!hy%v_tDr;r:iwhwdi_h]l[ARvRtNpMLKXJrJAG,FD@w@g?4955t5_3n2E15.l.[(A&O&/&,!.",
"miao": "-8D-,m-)v-$?vDscrPh>gtgSX^NP<#;A+K",
"yang": "-8C-7<-6{-3[-15-,f-,@-*g-'Z|J{xwTukswmrl6l3e`d4cEaA`m^}]T[lXRU<T*RVR2PmNRMHL9I7HvG`FpB|A=A2A'>z>`8N6A4y4D4.2B+6*O)4%Q$|$@#F",
"ang": "-8C-*gn.RLQoN0!5",
"wo": "-8?-4s-4L-*l-(/-'&-%q-$atCtBsfi8^TZYYbYSXKV#SRN8I>@1=#<m<h;V;U7!6`3.,N'|",
"jian": "-8=-6J-5W-5P-4g-4:-3g-2s-2i-2L-14-0L-0<-.q-._-.W-.P-.4-.3-./-.,~6~'|bzmzaz2xovfuRuQp4oDiHhcg8fNfHeDaq^Z^Q^<^9[8Z>YqXmXjX7WmV!UGU'R{PpO_MoM(LEK3JgIfIJICI)HEG]FhFCEKE2DLC&BMBLA]>a>$<z;l;a;&;%:Q8T7P6H625k5f5a2a1l1Q/u/Q/2,g+%*W)<)6!2",
"fen": "-86-3}-2n-/a-(`|v|q|]xuw7vpv;n&ithog,dDa0_gR>OYOSN.K&J*J)F)A>@66}5i4v391=16+{+.",
"bin": "-86-3S-2EpAe}W?UNShJnImGXE:B^BO@r9I6q6Q6M6,+.(j((",
"di": "-85-7@-5a-4F-3:-*D-'}-&t-&$-%R-%&-#O-!(}0|h|d|@{Q{L{8zMyFy;x|w?tqsmrimUkIjoi`hBg:fofjeld#`7]g[g[=YFX]XGW2TLT!R[NfN(MrM3KAK:JCHiG7AI=g<};T9f9=3F/K.V+=*5'1%c##",
"fang": "-84-4}-+^|r{Qzcv5er^%TZS:S(RER6N/@<<M/Z'P",
"pei": "-81-7$-5o-'lzyvZvCuCtOs_k7iid7[eU5S5S,M'LyJUAj?u=F<@.`*=)d",
"diao": "-8/-0@-/f-/G-)1-)!w$njfzfYe~]gYHI|@m)U#p!?",
"dun": "-8.-(a-!2}}|sy!x~x}hNdPb2_mVYV.T2HnF>@'8*4c1@/!+m",
"wen": "-8,-/X-(M-(C-(&-%Jy`vNf)dfde]:X.WRSmQsKNHWH)C$B`@>;z;R:*4s+1*8(}(&$;$.",
"xin": "-8*-7f-5d-5G-!3-!0~%v<r,qFgTe$e#dHawa>SCR9N@N%D$C^4a3$",
"ai": "-8&-2W-09-)h-'!-&q-&5-%Y-$'-#]-#E-!;{SzIyfxUtgtUrxr'kaa9_7_,ZNYaT&T$QqP^P.CxClB.:%9t6U3.03(k(;#]!s!j!]",
"xiu": "-7~-5c-5V-''-$/~|p@mfmPh2N~G09~9F8I4+*P*#(N",
"xu": "-7~-7Y-6Y-6!-49-0x-,F-,E-*Y-)T-)+-'p-$e-$Q-#7-!o-!W}7{Wy,x+v&uxspsArFhHeXckcKc:b(`g^YY4XMTKT@RbRZR!QcP{O^OOLGI9GfC|CtCiCOCKBw@5@4>?=t<>;+;):P9r998W8B433W2H0m+t*N*?&;%T",
"tang": "-7y-5+-4M-3l-3U-1v-.2-&.-${-#.|XzpyukdilaA^cW^V~OsJFH%F{F<@P<T:h:G8n5D3i23100A(u",
"huo": "-7v-6r-5T-.Y-.1-(p-'W-'D-$e-!%~V~Fw^vouWf.f,b'^OZ/Y4UPU4RkO|E9@%>/:f8U6y6Y6+525127+_#@",
"hui": "-7u-7#-2u-1{-+H-+.-'/-&j-$[-#=-!f-!U-!D~p~,~&}u}Fz]xztEsgr7q]onn?n>i*gmg7g5f6f4f3e,e*cDcCc<c(bfau`H_x^sZ|ZQX>VEQSQCP|PQO]KeIOI3GRF4EiEZEQDqBVB>B=B7@n?D>h>g=y;+:S9X897x796y6:5,5)3t3q3k2h0y0q+h*9)G(=(2$~$)",
"kuai": "-7u-6@-2M-/p-&f-!8}:|ez&y'jEgMdXUkRrO]Cq=y79.*+g(2",
"cui": "-7s-5?-3N-04-%I-%>y8lYlWkhdSbE`TV|IxH*GHAg<48P6a331g)p(b%I$L!d",
"che": "-7n-5`-4I-,%-'y-&*|?vln|nGene/]QY.XcVsV>V<7`3r3b3E0C",
"chen": "-7h-4_-3e-2'-#|~ZyWyAw]pGoBdRa>[aY]THS~QAP$L[K_K'J(HUG3D]@+@*2n05)l%P$?$$",
"xun": "-7g-6O-4.-,Q-,A-,)-,(-+5-'3-!k-!P~u|y{=yixYxAw#uHqKq9o`oOmEj@j&j#g=ebe>c]`uXUTfRcP(NqL_KbF`BvB@Au@Y>5=r=l8+7y6V583O2h1{1D130j0Y0Q.5+b*H(L&T",
"chi": "-7c-7M-6b-6P-5E-3@-,W-,K-+_-*]-)<-)3-))-(:-&W-$z-$I-#l-!g-!=|@|)yLw/vBs6n|fsf$eweve6cBc9`X`7_|_2]`[f[!ZvZ/W+TxTCSNNcMPM3G1ChC6C4BX@T?Y;:8g4~4;3U1K.O'A$Y$U$E$2#G",
"xuan": "-7b-2N-/.-)o-)'-'(-$Y-$Mz)wsv&sWrqr.p]f[cobMaQaI_I^nX_SyS'RAR,QeQ$Q#PNK@HxHwEf?#;I8d4M3x2e+L*s*)*&)B(Z'~%/#E#<",
"nu": "-7a-3r-,svjq?ilfed1Wo",
"bai": "-7`-6z-(1-&:hJ[?[>ZwYeX}WAUfUCTAMFLN,n'D#*#)",
"gu": "-7_-3T-2e-0F-)I-'s-'N-&<-&;-%G-#y-#@}gzfx#uhrUq@o&lXl=j5j4d*`~]_]9TSNaM.K<JIHFGzF$D{B<@K?R?=<X6P6./P/@$Q!L!G",
"ni": "-7^-7]-7.-4v-2>-27-+8-(%|Nzsznv/v)t<rkqkq0nznbnEcvb5`{_,]0[i[<Y5UQS$QuQ7PSMPJ&E6@y?)<=9x6o.F,l%b",
"ban": "-7Z-.!-+,|z|Yutn0d2]R]M[OW]W[T[ScSbRJOSN;MM:c/x*>'Y'R$*#[",
"zhou": "-7W-6M-2X-0{-'|-'z-'Q-'5-%X-$i-!G~{v.t/pgjCiceIY%QnQLQ<I|>8<S494'*S'9%W!R!I",
"qu": "-7U-7E-7+-/H-,q-+S-+=-+7-)t-)s-)W-'e|Vt^nnm{m]k?e%`&^0[^SzSIOnOOD=D4CzAL>)<3;[5U3G2o0D(K(8#9",
"ci": "-7T-7B-6m-47-17-/+-/'-'t-'r-%@|*q}j3h<`hN|MILHD&C??56Z*p*k'E'6%=!{",
"beng": "-7S-#w-#+{R{#zgyXw!lBkYX0>v)d)[',&k&j$a",
"ga": "-7Q-'M-#A-#/-!4wIwDoEo>o.RaOM+C",
"dian": "-7K-7:-3m-18-**~M|P{lyBxfw6v~t6t!kXj]jNjMh@ao^!YOTrTWT9I_GqG_FPF5B?<a9k764?*u)s&c&`%1$W$$#L#=#6",
"tian": "-7K-56-1>-(7-%`ylybwYvit=nodgc2b:Y#WPQ?LSB{?U<A<$;2)g(q(.&}&|&h&`&L&F$W",
"bi": "-7D-78-73-5F-45-+c-(h-']-&k-%?-#Y|jzVxgwLvnv:u}twt1r3qonrlFi|huhthPgLg'fRfQfJeme!crciaJaF[YT;SqS+OXO!MUM!K;I<HPB)B(B'B$A|Af?x?C:u9Z9D7q6e2`1p.%+y+x*`(:&W&V&G&5%^%H$T$S#'!o",
"zhao": "-7C-1k-)A-%X-%T-!y|#v+j*]B[@S!Q}P8OBM{J,E*?S6S4T2G0r0:09.7(m!F",
"shao": "-7C-,p-+~-*a-)A-&Vu,oIf^Z'R|NhM?K(7v3m2s17*m",
"zuo": "-7>-72-66-4E-'L-&,-#!|lmtmsj;h0d6YTV4R%M7M&)e",
"ti": "-7;-5N-5'-4R-/!-.n-*;-%H-$y-$3~w~rw?smsPnmnYnVl2foeCe6bnbjb#b!aU^)ZHY*X]XGU>OaONL$JxJCCQB]=0;T8O*5)A'r",
"zhan": "-7:-4>-2y-*s-!IrQnamRl>l)kCkBk.j|d+b0^M^?^5W|SJSGS0RsMjLiL<KmJ?HLFCDEAyAQAO?Q:|)q!F!4!$",
"he": "-79-,_-)$-(v-(/-'o-'Y-'W-'&-&R-%<-$Y-$W-$1-#d-!c-!!|,xVuyp6mJb&[jTROiOZMNL8I@CsA^?]<i;M7R3P2m2'2&0k0e.8,C#^!W!<!:!6!1!,",
"she": "-76-*E-*9w/v|oVfP`_`;^h]'ZyZbYjX:WEWCT|EEDACJ?@=<<f;s9Q5Y,W&*&)&$",
"die": "-74-)M-'>-&t-%H-$j{szSmDl/kIi3c}cPa`^IZbX:QwP!M2HsGUBcAK?I0*/}/n'_&#%q%j%i",
"gou": "-71-3p-0y-+z-)H-'p-%W|C{uwdwcuTs0mnfM[CX%VcN6M^Gm?q:925.C*o%2",
"kou": "-71-0f-.C-,g-)J-)DpCp8fId3]^[|VpTV9@",
"ning": "-70-6>-4a-29-0.-'H-!)r%q!p2p)p'p!ot[4UMM5F/E5?17J6k.<+a&i",
"yong": "-7*-5t-3M-,U-,T-'T-$t-$+-!:{Oz!yCxcrlkUg{gAe{ceb{bzapaC`w`n`:[6XTU}M4LaGQ@}>x=9:p947:5T/{/i&p&l%)#S#8",
"wa": "-7)-/n-,e-(/-'P-'&-&x-%h-%A-#y-#nu5tbt3sGnCije[ZaWUTq>.:;8h'V'D'>&A",
"ka": "-7&-*r-'O-'M-'4-$u{g",
"bao": "-7%-5h-21-/>-.e-.]-,!-+{-+s~ozPzOz@sBqBpcpMp$ohoee&d:[w[kPPP1P&M]614J2<0_.u.h*G",
"huai": "-7#-',|mx^xIe_dC_:^oGhDX<25z",
"ming": "-6x-0g-06-(|-'guEs&`aXxR@PhOFH<>0:7,8",
"hen": "-6s-&p-!3eac6[0.:$y",
"quan": "-6p-1H-/.-.#-,5-,#-%%}X}Q{4w5u:t;q[m?jRf`c0b_b%['Y`WKNxJ:I[H_GLFjD>?F>F:a5841/I/H/7.o.n.m.O)2&I%'",
"tiao": "-6o-%Xr#pWmjmWh4cRZfSQRdQjOLO'NYK.Fo",
"xing": "-6j-5.-1<-/U-&g|0{auft{t5qljAh`f*cxb>aZUYR/P4Nl>Z<u9d2d.N,L)@![",
"kan": "-6g-4G-0r-/r-/]-,D|n{!zGyDlkl)k{b7^D]ELRG]E2CeCc",
"lai": "-6d-5Y-5<-%_u!t2lil_h$eSeHU2NUJiJ0DT=&<)6r5v5r,i)k%R#P#J#?",
"kua": "-6a-'.{iwJuGcGZiQcI:",
"gong": "-6`-6N-1D-1?-,~-+g-+d-)w-%}-$)yepTpQj<j8i2g4f{c1a*``[)[(T^N`L?@V7U1u*R",
"mi": "-6[-0v-0n-0b-'9-#'yzqZpmpDp9m6i:i.hrfifafAcb^dVnU_TyTON2HIG$E6E+@L?{?Z?C>G<9;H9<8o6o6l5n5G1z0B,a+T'h",
"an": "-6W-5J-4<-2D-*P-*J-')-%e-$x{b{&z_sYpwn@n8mXm:hXg~ZnXNQ.PnL'L&A1>M.g*w$V",
"lu": "-6V-33-1C-.H-,N-,<-*q-*o-!N~q~_};|G|5yVyUxMtVmChGgZgFf9f8^7XzW)V)UzUAU/O{MpLeJ#G&FyEuDvDaARAM>s<K<;;p9:9'8.7L6@6)4p1m0T+W+H)Y(Q()'m&n!%",
"mou": "-6U-,c-)x-($-&azLcVTTMEKs/a",
"cun": "-6J-/Z-(~x'qLocdn[%Nj7^!O",
"lv": "-6F-63-4#-38-23-,'-*x-(t-(F-&G|+nTnSnPl(e^`A`5ZcZ*YwS.K*HTDsDoAYA)9M6D3A0]+I",
"zhen": "-6C-67-4)},ygybuMs*p5ndiUiRi<fc[nZlZGXWWOSTR*OJN$MhLVKjK_IHHuHLHAG_FVBb=~:y:$8$72,+*_*^({(q'8&Z&<%9",
"ce": "-6B-4*-1%-1#-*=-*2wZgrc!aY_jZ}TQLl={;O&8",
"chai": "-6?-2@-$h~?j3[UL}.i$'",
"nong": "-6=-2S-0p-&b-!Eg.ZmZAElDG=s7#0o#W",
"hou": "-6:-5*-*8-({-(L-(K-'p-$l|%zQi=e]>b._,A$C",
"jiong": "-69-3'-1.-1$-0}}z|K{;]~]}?M=J7e4t4I3c2T2S1W1.",
"tui": "-6.-6(-3&y'tmo$ftfodrY(F>24",
"nan": "-6+-*|-$r~'~#v=tzstrb^e[sXfPqN*M6H}:d29&a&?",
"xiao": "-6*-5v-5R-3a-.x-,d-'j-'1-&l-&P-$}-$1-#D-#?-#&-!|-!v~c~J~CuUtHqGpPpJoKlGh/fFcJ_iX;V:TPT/SoSnQVQ'P;MiMaLOK+DOCYCLBAB4>B===8<Z8E6!5+5*4,3L2&1L,o+r+o$t$o!i!b",
"bian": "-6)-+9-*u-)UwzmKg1eAdVaX^#]=XSR#@A@@4Z26/o,@+`+,':%8",
"pian": "-6)-4P}ysI^#I=Ht/y/0,@+`(j((",
"cu": "-6%-+$-!csFegd(_YEsB},X$I#z!H",
"e": "-6$-4K-2k-+j-*T-*N-(_-(E-(*-'A-')-&X-!j-!A}s{nzhzIzCv$uzuBtotUtTtSn]n)mGm'm&l+gnc'bOata?^+]DWsWdWNUbTMM}DZCEC(>M=5;9*7)`$V$O!r",
"guang": "-5~-2}-1h-'@{~uIhXhTgOZsVKL+>28)5/4b4_4^3s.d+Y*U",
"ku": "-5}-/3-&Q-$6~R}PzrhDh+gN]dZiZ5OPMgL!I%3N.>$9",
"jun": "-5{-2T-0q-(n-(G|u{NuHollq_;Z3U5TzQPKMJH@F=l6V3G1B*1&'!Q!K!J",
"zu": "-5w-5?-+1-+$-&S-%rlYlAd(S#M1Ix0'*e",
"hun": "-5s-4o}_t9t'o9dMaz`oYDR?Q~JYJRBf=u<d<(;=:t:`9{3O36*9)G",
"su": "-5n-3x-2c-$*~9}/{3y}y|wjs#p@a(a'_lVnKKJ2H;G(F~F8DYBo?2>>=4:&9z828&+F*L(F&r",
"lia": "-5[-5>",
"pai": "-5Q-&sg9eP[NY?JU?p>+;j;8/t.w,q",
"biao": "-5O-36-2/yJtIryi%f!VfNhLjFzEG<.9C66511o0c,k#|",
"fei": "-5M-.m-+M-*4-(i-%8w%vZt@t?nXh8gpgPbH]xSdQxQ%P:OPNLLxJVH5FOF)Di?W<C;x6K.`.H,p%3$]#a",
"bei": "-5I-57-4B-4%-3b-37-,Y-+a-+%-(1-&:w|qIh#bdbGajaR`$X3RMNLNKLyK^K5JUJSIq3:/S/).R,y*/)T!@",
"dao": "-52-/g-/e-/6-)E-#K-!5xSo_oLmvlvk;k:jiiKhld{b=YoYcWqUZO'JkIaGZEIE?AA3;0g'd!+!&",
"tan": "-51-3^-3/-2R-)4-%$-#P-#I-!n-!m|o|a|U{'xxxsxaxKtAfTfOfEdtcfb$_p_W_OY/W=UDTuR5PJP=HYF5EnCUAk:w9H7|7{7.5E4K1G(3$}$^#~#7",
"chui": "-5/-(O}T|9{Va|Y[WcKtJ6ItGl4o",
"kong": "-4{{+qPlfcNb;Y)Iv<n",
"juan": "-4z-,h-,P-,0-*[-((}X}Q{Iw<w5uVtut;jpj`j%iYf`byb%`4Z%Y`OGL%K@J:I[=2<^3M.!+j'C",
"luo": "-4r-1y-.|-'4-%(~<~/o^mHZ*YbW(U@U3U/T{TlOvI^D9>q>O>N;y8^6F3{/(,T+P*M#y#5!Y",
"song": "-4q-3I-0D-)'u8pulDk^kOgydYdAb`a3a$`D_MZ#XXW0N<N:MmM>K%J`HyEF<B9!6v",
"leng": "-4p-0T-%uzdz,lQa1J5I!",
"ben": "-4l-$E|q|pwSwPw.w(YXV8O3LQKXI4?B;|8]4v/8&=",
"cai": "-4h-4,-%N{%tLp?f#]t]qY0NkJZA},Y",
"ying": "-4`-3.-%1-$>-#*-!K~Oz%x#s{sXs9s%quqqq_q%kcj[jWhCgDexdha/_AVwV_U0U&R]R.Q:PwO?MHKpK]J{HvHdFbDMDI=_;E:U:K9d9O8K8F6j6i6N6=6&5~5o5j5M5A2w2r2_1x1)0b*:)*(y(S'i'5'%#j#;!B!;",
"ruan": "-4[zJxQsiVWOUE0):'}",
"chun": "-4Y-&7sda^RPR(PlOONDIBGrFQE(=T<,:[9N8u/6)C",
"ruo": "-4S-)[sskPf]Z:YUI8;y3'0^",
"dang": "-4M-2P-1V-/k-!1}*{fx]swpkl6kdf:aAZUUsTpKiEYD5@|8:7E5D*;(J(6'?%}",
"huang": "-4@-1L-/w-$PzDz.xtw&s[pEl9jBi0e@clcQa_a#`dXTQgQfPBOEHbH7D{@9:x9i8)4:2c2.1J0X+w)((E#i!}!g!Z",
"duan": "-4+-.Uz+s`SFS<IMBIB62j)0",
"ou": "-4(-+=-+7-(q-(K-(3-#;yTd?`EDpC}CSBJB8?l8s1Y'M'0",
"zan": "-4$-2.-1x-1o-'2-$c-!e~:p>[$XOVUU8U*TwR1Q&PYKrEy6E5K't'k'c",
"za": "-4$-+Z-'b-'X-'2-$c-!c~B~:~5i}]s[$NyKr?r?a",
"lou": "-4#-38-.}-$7-#ByMu4tRo{n[kjkEg_`5X)W'HaG#:O9&8~1i'2$5#o#n",
"sou": "-3z-0J-)Q-)N-#z-#R-#QgsghZ#YvWlW>W0V:U`UBJ/DgCn:#,5#s",
"yuan": "-3u-1n-1)-0h-.z-*3-*1-)y-(0-&^-$Y-!<}{}t}Z}R}N}M}D{t{_yawlv6v(sSs:s)qhpep<f[cwbyb,`qXoX8NNJ=HxH>H0ErDk@/<m<*;{;v;r;g:e:F:D5]04,M,6)/",
"rong": "-3t-3`-0u|ts8s'qzp~pFlwkokcjj^WX#WwOyLmHGH.H&GQAsAU9|6%3T1v0b.2)#",
"jiang": "-3p-2a-,7-+Y-+Wz/xew~w+vvvru]oToSkMfrfWfVfSfCVyVeKdGDEoDeBQ@U>P>#;L9A8M.|,&&B%y%n%m",
"bang": "-3n{^ypiNi5h~hme|Z?YrWvS2KEJTJSH@=j/m++",
"shan": "-3h-3)-2R-/F-/<-.a-.E-*~-$q-$F-#H}'{Gy+y*ulubr2nDj|i(f+]zZ;Y3XuXsWaVhV?UySvQ8NrL|LlIVFSEhCI@`7|7p7O5F4B2Z211~.4*b%U%1",
"que": "-3f-*_-*W{Pyty$lgbNa+`KX!T8T.JBH$@j4e0|)O#q!N",
"nuo": "-3Q-1w-$ftxa6_#_!ZLXnWoWbWLK0HJF2Am",
"can": "-3P-2F-)l-)k-)j-)i-$D-#H~:r(q3amah`W`V`U_[XsVqVhO_BtBg;/784z1!0L(9",
"lei": "-3O-24-1t-,J-)q-#1|(z0xOx?rrU|U;G'E]DyDxD/?$>I=+<F5X'z%u$)#Q",
"zao": "-3L-/h-&(-%w-$5-!@`JRfMsLkK>JO7F5&2>1#(](7#&#%",
"cao": "-3L-#GnGk@`v`k`^_DVAUqOgOfG:8x",
"ao": "-3H-/n-*&-#X-#W|H|4xnxkv}vyvwsDs2rZmxmakAjnga`O_@]I]![DVuUeTBM*K=?>9;7M741m1^0Z,!+~(Y",
"cou": "-3D-0:Hl;1",
"chuang": "-3B-/b-/K-/5-.s-.i-.L-$T-!dhvhMd=`|W7O<F+0#/r/k%D$+",
"piao": "-36-.D-,;-#Crteze7`]RuO*Br9/.v'Z!X",
"man": "-32{KyKujtlrpn^i'bc`M`=VrOdG9Fs:V9P928b7<701V,(",
"zun": "-3%-!ix}oPk&[%YzVILEFU5k",
"deng": "-2z-/t-!VxwrHk(_v^@E$7d6/5.1A(O#,",
"tie": "-2s-'yigd+",
"seng": "-2o",
"zhuang": "-2hx9x8x2w)vWv@tphvhShE^a^`^_VDKcKBG6:`8X3H.e.Z",
"min": "-2`-0Q-/E-,X-(&|1uumYl]dfded8bJaWaG`S_`[]YhTUTIT(RSRRPzAH>|;z;+:t8(+1*c)o)j)=$R!D",
"sai": "-2V-#b-#)-!/yod%a2XaAxAb",
"tai": "-2B-0_-)=}e|Mw[wXwOvzqvqCdodQdB`e[pU]SpR]MeE>@f@D@C>{:=4G4F1$*f",
"lan": "-2?-1@-)}-%P-!'~3|hx`xXt(qgqaqUmwkwhgb)_8_'^p[5X/UXU(TmSaS_PpLbHXDDD2D1=^9L8i7K6W5`5W5=5<46121%0n0d0I0@0>($'j",
"meng": "-2;-0k-,Lwaw`qEo2hnh*_._+^qXtUaP)O9K$F;EAANAF:A6h,Z+]'/&X#B!#",
"qiong": "-28-*fr.pza]`!K}F(3(3%2L1}*))J(G's'f",
"lie": "-25-0N-/O-,z-,w-,`-'<-&G{D{CuDjaj=djZeZ_YiUEL;JMA{>_=p403f2A1$0a0[.x,h,V+k+[",
"teng": "-2%i+9]8r1e%6%&",
"long": "-2#-'J-&]~^|7|6xHxGo2n=k6j_j^g.e([9U.QmOxO8LgKDGYDU>t:g9T9%5w0N*Z'n#f",
"rang": "-1}-,$~Nx[xC^mU$5b0K+S'X",
"xiong": "-1m-1j-/q-+v-+p-&zwsdLc?Sy@;>42w2r2#2!",
"chong": "-1l-0Y-#L{*p`oflelde0dc`+_dX<W8?z=K=98X0F*@%&",
"dui": "-1g-1e-1`-%L|$zlymobo]oMcc_n_m_*TET>T2NB6[6G5|5u$P",
"rui": "-1g-1e-1`-)LxFas]0M~KVF.@G)'&t",
"ke": "-1f-/*-.w-,]-,R-+;-)>-'o-'0-$!|Dzqx4u#p^oUmomIkvknjqc4bra<a;XJWsT4M%J1G|F}CcBCBBA/;u;G:>6U4U0!/N//*j%>$O",
"tu": "-1c-1]-0H-/o-(y-&3-%?}n}c}J}I}A}?zezZyvxipvnUlskikFh.gVeVc}bsZ.YYX@W2K?EL@R=C=::r7u(i$r$>",
"nei": "-1I-1*-&TtvA<A;=H",
"liu": "-1C-/N-.8~fy^s5qik`gl^vW9S4S*R}L~LpKnKQH'FHF#>(=w::8Q7V631r1[*a)~)%(v(?&S&>&%%r$(#d",
"shou": "-13-)`-)V-%l-!o{ox)x&pxo[]v]uYITcTN<t.1+n+X$e$&",
"ran": "-1+-1&-(!-##umsKMBF'2y1Z1F*i",
"gang": "-1'-0^-/L-.gzjz4mzmplT^a^`^_]fYKWDNZJEGe;L2z2v/W/:.a%Z",
"gua": "-0~-/8-.r-.S-.A-*m-)F-(/-'s-'&-%0|Ooz[/ZuY6LSK[C`2='a",
"zui": "-0i-*6-'d-#U-!w-!*k<jmQ=O`OGLDG[F]EgEbD@6a(%",
"qia": "-0M-+;-*r-'6})m0iZc.a<[j[7YAXJUhBq>,",
"mei": "-0I~j|vz>yRv#sks]sTs4r<p/l&k|e)[bZBU%S3R&M|LoKFHzHjGgDrBfB0B/?~?o?d=I;?;7;32Q2J11,=+$*0)D$w",
"zhun": "-0E-05-%L}5zwpnnFdPRQ<,:@",
"du": "-0+-.`-+B-)p-#0z<vKv1uTqjh1SsQ4PvN_IcDlBRBNB+=(;n;Z6</s/h/5.y..+i)I'y!E",
"kai": "-/x-/v-/%-.M-,I-#J{ey~w0n3kag2dEc#aB`y`r`GXCPfHfCxCu6U4m3}",
"hua": "-/T-.>-+b-+(-(_-(.-&h-#%{@wGuWs}s|rJrDlaWTV}V+NAMvKfIgGKFX9a7c,7&]&+%~",
"bie": "-/A-/;fGe2`#M'M!$!#I",
"pao": "-/>-+i-'^~o|2w=hA]$[P?.4J4H3d06.M'^%A!S",
"geng": "-/7-&A{TzHlrh=ZIOlK4IX=X2p&M",
"shua": "-//-%j",
"cuo": "-.y-.p-*5wukWkSh!ZKY&WuV4(o$j$'",
"kei": "-.woU",
"la": "-.v-%3-$n~L|8[RXFXEWnUEU2R`MOI6DT:T0['o$A",
"pou": "-.l-'_-&[{]twtO]+]&Z+YGJS/<",
"tuan": "-.I~!}~}K}HyPy&f7`>[}XIVmGLE;;.:m8t2[,F%v%p",
"zuan": "-.)XOTt",
"keng": "-,x-([|t|kvIZCXlVgBF/C",
"gao": "-,Z-(I-(>wRlpWjNHGxGwGdG>E~E3Dm,)!y!t",
"lang": "-,V-&J-$~{Jy[r{llgiSeOIOHO;KRHHG4Cp=[3Y,z*%(s",
"weng": "-,@-#oyxv{kfU!Pd9o'N'&",
"tao": "-+m-)E-'+-%DwPwMw*r}i/fl`j[oYBWXL,JkGtE?><=)<t<H9^6_(w",
"nao": "-+`-'n{cz[wqt.rzq8l{jyjSd0b~bPad_QZVW9VOKkFJ<J,D+Z+Q),",
"zang": "-+Oynw)g(/~",
"suan": "-+C,{$n",
"nian": "-+3-&i-%b{9uOhdg3dNbTa~[SYVVHV,U7HL=;<0:C2q",
"shuai": "-*xixiWW3+I&o",
"mang": "-*<-)*-&Zx(u(o2h*dkb|OENdNSAF@c=i8`/[/D.$$q",
"rou": "-)uslpsXdMAHc;d2K)>'v",
"cen": "-)l-)k-)j-)i{Un#kH@?=1",
"shuang": "-)byOqeq^`NDB>t8R5w5^0&",
"po": "-)8-&M-#6~]|ZvztMoZmlmZg9W]TXR+O*E%?E>q>o>D;*:J8;6F3v,9*l!`",
"a": "-(s-'o-%O-$0",
"tun": "-(k-(7-%L-!`}}|snFhNdP_mRQPFOC@x=335",
"hang": "-([{dwSvIj)dGS8NML/@.",
"shun": "-(ZHnF?",
"ne": "-(R-(8-(%-&T]0%a",
"chuo": "-(Q-&@-%=~Hu!t~t.ssqVa|^2Z}UuCC<q<J",
"wai": "-(/-'&-$gwml7C95z",
"guo": "-(/-'&-%)-$e-#<~.}r}k}f}d}a}U{<zTy>lMi@i$fDf@b1`Y_4XyW6TMMzJ$I:GOD{=#<W;U9#7!,c$<",
"qiang": "-(,-%f-%M-$.-#[y=y3xmrXr0k>gKfVfSfC^P^N^>[zWQW!VySKMlIvGkFdEJ:)8{4[1s/|/z,f,.*{(p%m",
"pen": "-('-$E-$=-!6CN;'6}'Q!=",
"pin": "-&~~Yuatnrvq{[AZ{H]@_/c+!)r",
"ha": "-&wvz",
"yo": "-&`-%c-$B",
"o": "-&X-$a-!H-!%",
"n": "-&)-#a",
"huan": "-%v-$Z-$Y~G}D{_zWw@w2r.q[pYp0okm8l!h]bVaH_I^iYpXQUnU1KyK2GBD%CPCB>1=c<~;c8V7D734/3>2I.[.;,3+R*})9(1'b$d$:",
"ken": "-%V{qxjc*_CX~*I",
"chuai": "-%=XIW}Ch",
"pa": "-%/vLisihd.]oX|NC@r8608)P#!",
"se": "-%,-$,yogK_<Z}VnUrLTGJC5C3>W<x;q7h7g6|6t60)p)&(0#r",
"re": "-$fa[YU;y3g1X",
"sun": "-$DqKq9]EYsW{WzW;H1Gv.',:",
"hei": "-#h-!l7r",
"dia": "-#^",
"de": "-#5}0hBeQe5e1c)bFakR[JW<_##",
"dei": "-#5eQ",
"kuo": "-!`g`]W[:[/ZsUI8U6L",
"ceng": "-!_ntnQk4OcObF*",
"ca": "~s~B[UUWU:",
"zeng": "~7y5y._}OcObF*1R(M'*",
"nin": "~(c^bQ[*",
"kun": "}q|Wzoz`x/x*t'l[lZbwZ0RHQMJv=B8C371U,e)_(g",
"qun": "}jwxpRl~iPCT",
"ri": "}iRjA=",
"lve": "}Go^Y1&2&0",
"zhui": "|[y0w#t]aaXIIt?s'<%|",
"sao": "zus+`k_D]UYNXrWtK(AP:8$4",
"en": "wBmBc5WF20",
"zou": "w3s>Y%X`W~J/J.Hl",
"nv": "vkc7OM@!",
"nuan": "vcPo;`:m2X2W",
"shuo": "v]a'WhT'S|OKGnCn>>470W+p",
"niu": "v?q=dKd0]S]![DN?@8@!4u/e/d.W",
"rao": "u2rA]PU?KkFJ",
"niang": "t|r&qb",
"shui": "t]iTZMYuA$A#@{=.=*",
"nve": "t)%S$%",
"nen": "sirarYc^",
"niao": "s!r+qsnwFq9x",
"kuan": "pBp#ooK)CoCfCd",
"cuan": "jPV'U*T~TwDtD7BU@o6E5K1S0<",
"te": "dsdr`R/F/9",
"zen": "d5VU",
"zei": "^H",
"den": "][]C",
"zhua": "],ZYV#ER0:09",
"shuan": "[&L^GL<s",
"zhuai": "Zz",
"nou": "WoGpE0+^",
"shai": "W<TsQWOt",
"sen": "J8ISGI",
"run": "FE<{8'",
"ei": "Cl",
"chua": "Ci"
}
};
let DB = {
sToC: {},
cToS: {}
};
let sToC = DB.sToC,
cToS = DB.cToS,
ungroup = /-?.{2}/g,
rg = /^-/,
fromX = str => {
let result = 0,
temp = 1;
for (let idx = str.length; idx--;) {
result += temp * (chars.indexOf(str.charAt(idx)));
temp *= 91;
}
return result;
},
fn = (a, f) => {
let p, gs, i, ch, num;
for (p in a) {
if (a.hasOwnProperty(p)) {
gs = a[p].match(ungroup);
for (i = 0; i < gs.length; i++) {
ch = gs[i].replace(rg, '#');
num = fromX(ch);
ch = String.fromCharCode(base + middle + (f ? -num : num));
if (sToC.hasOwnProperty(p)) {
sToC[p] += ch;
} else {
sToC[p] = ch;
}
if (cToS.hasOwnProperty(ch)) {
cToS[ch] += COMA + p;
} else {
cToS[ch] = p;
}
}
}
}
};
fn(SDB.m, 1);
fn(SDB.a);
SDB = null;
export default {
getSpell(chars, polyphone, spliter) {
let cToS = DB.cToS;
let res = [],
pp = typeof (polyphone) == 'function'; //判断polyphone是否是函数
chars = String(chars).split(EMPTY);
for (let i = 0, ch, ss; i < chars.length; i++) {
ch = chars[i];
if (cToS.hasOwnProperty(ch)) {
ss = cToS[ch];
if (~ss.indexOf(COMA)) {
ss = ss.split(COMA);
ss = pp ? polyphone(ch, ss) : '[' + ss + ']';
res.push(ss);
} else {
res.push(ss);
}
} else {
res.push(ch);
}
}
return res.join(spliter || COMA);
},
getChars(spell) {
let sToC = DB.sToC;
if (sToC.hasOwnProperty(spell)) {
return sToC[spell].split(EMPTY);
}
return [];
}
};

23
pages_qiun/static/table/iconfont.wxss

@ -1,23 +0,0 @@
@font-face {font-family: "iconfont";
src: url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAMoAAsAAAAABzAAAALaAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDHAqBbIFSATYCJAMQCwoABCAFhG0HRhtCBsgOJUGS2IBhSABBPHyN/f7c3UVEk2hkSKLNE9NNSrBEgkhrJIYS7JuG/v7Pv7cbyBNUBB7u+/D8Cczd0qrAKui2UweV2+2Jz3M5bQIFMr+d5TbWojXpyo96AcZbAxpr0xYuoAS5pXYRBwav/GubCdQbFslkvbiyEawVpFcgLhUyDqx7fkWJUrVC9czEIh5YqE136RTAvf5+/IP4qCWpysjA3eMiEXJ/OnyLyVeVK52SRnqdC9E0MmaAQpzOxveZiYhjpr65uTmgVq3EVTXhP2MqFWvjw2L6l0dIMlGNkBvBrJfI/HTgBMHPcILEzxiSDAjR1faT88CGzx5UBz2+19V1ZP+Ku9i8v3xj0oPb8/DYW/HyOvCSHUz14N7Vleu2waXja7bOy1cOj1ridz1feeqBe5fDdm2dr93ynUqZbj7cXLr14cePR99QnyP4HxIbUmdfHxcc//rLnQ8Udwy/eHERdvFCLbSSeTLhHOI8cZIp+nn9/Hx4LPDc6fx1uum/+27vJ0s30CNb5dvUA0B+MVUAkD+bPkH2b3y7s5Xb45T5z7qhgFfGPmpTAdMCxqRgKWqlwJxSyom1lFzBJZWv6AX1SKhXD4SmafflCl0XOJtQq+uAr8ZQi6zWCL2wZ1ClwSyq1VpCvWkl0xt0oMxEqcOUOQeh1X0kzZ6QtTqjF/ZnVOn2F9VaI6PeXrgt2GAszmwLKHIMRcIPEYWg00rMzmxNZj3K+tQc7co1txmpUREicdGxw1QJapFeMcTYL4tnTCIS1WlIsbMdqtU6oqc6JQosWs6YPj0mRpq7UbSg04CtNRTiMEhE8IYQCgIdLUkWZmxHn6+HZPqocegKZSHaDFFGivqJONFiAfQSjRZE+ZVrjPrJxGMYCSGhdDSIYseF1DSuQ+jn2ykhARNNfiCqly7GyydBNdHP6zR/uAjqkcVLpMhRokrVgRwFla1SwWmZrm9Q6awaMwAAAA==') format('woff2')
}
.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-check:before {
content: "\e60d";
}
.icon-arrow-down:before {
content: "\e62a";
}
.icon-arrow-up:before {
content: "\e62f";
}

36
pages_qiun/static/table/loader.wxss

@ -1,36 +0,0 @@
.loader-one {
width: 50rpx;
height: 50rpx;
position: relative;
-webkit-animation: loading-one 1s infinite linear;
animation: loading-one 1s infinite linear;
}
.loader-one,
.loader-one:after {
border-radius: 50%;
}
@-webkit-keyframes loading-one {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes loading-one {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}

36
pages_qiun/static/table/objEqual.js

@ -1,36 +0,0 @@
export default function isEqual(x, y) {
if (x === y) {
return true
}
if (!(x instanceof Object) || !(y instanceof Object)) {
return false
}
if (x.constructor !== y.constructor) {
return false
}
for (var p in x) {
if (x.hasOwnProperty(p)) {
if (!y.hasOwnProperty(p)) {
return false
}
if (x[p] === y[p]) {
continue
}
if (typeof (x[p]) !== "object") {
return false
}
if (!Object.equals(x[p], y[p])) {
return false
}
}
}
for (p in y) {
if (y.hasOwnProperty(p) && !x.hasOwnProperty(p)) {
return false
}
}
return true
}

3
pages_template/common/api.js

@ -1,3 +0,0 @@
const { http } = uni.$u
// 获取菜单
export const fetchMenu = (params, config = {}) => http.post('/ebapi/public_api/index', params, config)

1087
pages_template/common/classify.data.js

File diff suppressed because it is too large

3
pages_template/common/config.js

@ -1,3 +0,0 @@
export default {
baseUrl: 'https://api.youzixy.com'
}

45
pages_template/common/demo.scss

@ -1,45 +0,0 @@
.u-block{
padding: 14px;
&__section{
margin-bottom:10px;
}
&__title {
margin-top:10px;
font-size: 15px;
color: $u-content-color;
margin-bottom:10px;
}
&__flex{
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
}
}
// 使用了cell组件的icon图片样式
.u-cell-icon {
width: 36rpx;
height: 36rpx;
margin-right: 8rpx;
}
.u-page {
padding: 15px 15px 40px 15px;
}
.u-demo-block {
flex: 1;
margin-bottom: 23px;
&__content {
@include flex(column);
}
&__title {
font-size: 14px;
color: rgb(143, 156, 162);
margin-bottom: 8px;
@include flex;
}
}

21
pages_template/common/locales/en.js

@ -1,21 +0,0 @@
export default {
// 可以以页面为单位来写,比如首页的内容,写在index字段,个人中心写在center,共同部分写在common部分
components: {
desc: 'Numerous components cover the various requirements of the development process, and the components are rich in functions and compatible with multiple terminals. Let you integrate quickly, out of the box'
},
js: {
desc: 'Numerous intimate gadgets are a weapon that you can call upon during the development process, allowing you to dart in your hand and pierce the Yang with a hundred steps'
},
template: {
desc: 'Collection of many commonly used pages and layouts, reducing the repetitive work of developers, allowing you to focus on logic and get twice the result with half the effort'
},
nav: {
components: 'Components',
js: 'JS',
template: 'Template'
},
common: {
intro: 'UI framework for rapid development of multiple platforms',
title: 'uview-plus',
},
}

21
pages_template/common/locales/zh.js

@ -1,21 +0,0 @@
export default {
// 可以以页面为单位来写,比如首页的内容,写在index字段,个人中心写在center,共同部分写在common部分
components: {
desc: '众多组件覆盖开发过程的各个需求,组件功能丰富,多端兼容。让你快速集成,开箱即用'
},
js: {
desc: '众多的贴心小工具,是你开发过程中召之即来的利器,让你飞镖在手,百步穿杨'
},
template: {
desc: '收集众多的常用页面和布局,减少开发者的重复工作,让你专注逻辑,事半功倍'
},
nav: {
components: '组件',
js: '工具',
template: '模板'
},
common: {
intro: '多平台快速开发的UI框架',
title: 'uview-plus',
},
}

7
pages_template/common/mixin.js

@ -1,7 +0,0 @@
export default {
data() {
return {
isWeixin: true
}
}
}

2
pages_template/common/props.js

@ -1,2 +0,0 @@
uni.$u.props.gap.bgColor = '#f3f4f6'
uni.$u.props.gap.height = '10'

173
pages_template/pages/address/addSite.vue

@ -1,173 +0,0 @@
<template>
<view class="wrap">
<view class="top">
<view class="item">
<view class="left">收货人</view>
<input type="text" placeholder-class="line" placeholder="请填写收货人姓名" />
</view>
<view class="item">
<view class="left">手机号码</view>
<input type="text" placeholder-class="line" placeholder="请填写收货人手机号" />
</view>
<view class="item" @tap="showRegionPicker">
<view class="left">所在地区</view>
<input disabled type="text" placeholder-class="line" placeholder="省市区县、乡镇等" />
</view>
<view class="item address">
<view class="left">详细地址</view>
<textarea type="text" placeholder-class="line" placeholder="街道、楼牌等" />
</view>
<!-- <view class="site-clipboard">
<textarea placeholder-class="line" value="" placeholder="粘贴文本,可自动识别姓名和地址等" />
<view class="clipboard">
地址粘贴板
<u-icon name="arrow-down" class="icon" :size="20"></u-icon>
</view>
</view> -->
</view>
<view class="bottom">
<view class="tag">
<view class="left">标签</view>
<view class="right">
<text class="tags"></text>
<text class="tags">公司</text>
<text class="tags">学校</text>
<view class="tags plus"><u-icon size="22" name="plus"></u-icon></view>
</view>
</view>
<view class="default">
<view class="left">
<view class="set">设置默认地址</view>
<view class="tips">提醒每次下单会默认推荐该地址</view>
</view>
<view class="right"><switch color="red" @change="setDefault" /></view>
</view>
</view>
<u-picker mode="region" ref="uPicker" v-model="show" />
</view>
</template>
<script>
export default {
data() {
return {
show: false
};
},
methods: {
setDefault() {},
showRegionPicker() {
this.show = true;
}
}
};
</script>
<style lang="scss" scoped>
:v-deep(.line) {
color: $u-light-color;
font-size: 28rpx;
}
.wrap {
background-color: #f2f2f2;
.top {
background-color: #ffffff;
border-top: solid 2rpx $u-border-color;
padding: 22rpx;
.item {
display: flex;
font-size: 32rpx;
line-height: 100rpx;
align-items: center;
border-bottom: solid 2rpx $u-border-color;
.left {
width: 180rpx;
}
input {
text-align: left;
}
}
.address {
padding: 20rpx 0;
textarea {
// width: 100%;
height: 150rpx;
background-color: #f7f7f7;
line-height: 60rpx;
margin: 40rpx auto;
padding: 20rpx;
}
}
.site-clipboard {
padding-right: 40rpx;
textarea {
// width: 100%;
height: 150rpx;
background-color: #f7f7f7;
line-height: 60rpx;
margin: 40rpx auto;
padding: 20rpx;
}
.clipboard {
display: flex;
justify-content: center;
align-items: center;
font-size: 26rpx;
color: $u-tips-color;
height: 80rpx;
.icon {
margin-top: 6rpx;
margin-left: 10rpx;
}
}
}
}
.bottom {
margin-top: 20rpx;
padding: 40rpx;
padding-right: 0;
background-color: #ffffff;
font-size: 28rpx;
.tag {
display: flex;
.left {
width: 160rpx;
}
.right {
display: flex;
flex-wrap: wrap;
.tags {
width: 140rpx;
padding: 16rpx 8rpx;
border: solid 2rpx $u-border-color;
text-align: center;
border-radius: 50rpx;
margin: 0 10rpx 20rpx;
display: flex;
font-size: 28rpx;
align-items: center;
justify-content: center;
color: $u-content-color;
line-height: 1;
}
.plus {
//padding: 10rpx 0;
}
}
}
.default {
margin-top: 50rpx;
display: flex;
justify-content: space-between;
border-bottom: solid 2rpx $u-border-color;
line-height: 64rpx;
.tips {
font-size: 24rpx;
}
.right {
}
}
}
}
</style>

139
pages_template/pages/address/index.vue

@ -1,139 +0,0 @@
<template>
<view>
<view class="item" v-for="(res, index) in siteList" :key="res.id">
<view class="top">
<view class="name">{{ res.name }}</view>
<view class="phone">{{ res.phone }}</view>
<view class="tag">
<text v-for="(item, index) in res.tag" :key="index" :class="{red:item.tagText=='默认'}">{{ item.tagText }}</text>
</view>
</view>
<view class="bottom">
广东省深圳市宝安区 自由路66号
<u-icon name="edit-pen" :size="40" color="#999999"></u-icon>
</view>
</view>
<view class="addSite" @tap="toAddSite">
<view class="add">
<u-icon name="plus" color="#ffffff" class="icon" :size="30"></u-icon>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
siteList: []
};
},
onLoad() {
this.getData();
},
methods: {
getData() {
this.siteList = [
{
id: 1,
name: '游X',
phone: '183****5523',
tag: [
{
tagText: '默认'
},
{
tagText: '家'
}
],
site: '广东省深圳市宝安区 自由路66号'
},
{
id: 2,
name: '李XX',
phone: '183****5555',
tag: [
{
tagText: '公司'
}
],
site: '广东省深圳市宝安区 翻身路xx号'
},
{
id: 3,
name: '王YY',
phone: '153****5555',
tag: [],
site: '广东省深圳市宝安区 平安路13号'
}
];
},
toAddSite(){
uni.navigateTo({
url: '/pages_template/pages/address/addSite'
});
}
}
};
</script>
<style lang="scss" scoped>
.item {
padding: 40rpx 20rpx;
.top {
display: flex;
font-weight: bold;
font-size: 34rpx;
.phone {
margin-left: 60rpx;
}
.tag {
display: flex;
font-weight: normal;
align-items: center;
text {
display: block;
width: 60rpx;
height: 34rpx;
line-height: 34rpx;
color: #ffffff;
font-size: 20rpx;
border-radius: 6rpx;
text-align: center;
margin-left: 30rpx;
background-color:rgb(49, 145, 253);
}
.red{
background-color:red
}
}
}
.bottom {
display: flex;
margin-top: 20rpx;
font-size: 28rpx;
justify-content: space-between;
color: #999999;
}
}
.addSite {
display: flex;
justify-content: space-around;
width: 600rpx;
line-height: 100rpx;
position: absolute;
bottom: 30rpx;
left: 80rpx;
background-color: red;
border-radius: 60rpx;
font-size: 30rpx;
.add{
display: flex;
align-items: center;
color: #ffffff;
.icon{
margin-right: 10rpx;
}
}
}
</style>

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save