vue-cli init

This commit is contained in:
2025-08-15 16:25:44 +08:00
parent e81805b4c0
commit 8e22afd798
590 changed files with 103286 additions and 213 deletions
+50
View File
@@ -0,0 +1,50 @@
<template>
<view>
<view @click="gotoAdd" class="addBtn">
<u-icon name="plus" color="#ffffff" size="40"></u-icon>
</view>
</view>
</template>
<script>
export default {
props: {
url: {
type: String
}
},
data() {
return {
};
},
methods: {
gotoAdd: function() {
if(this.url) {
uni.navigateTo({
url: this.url
})
}
}
}
}
</script>
<style>
.addBtn {
width: 88rpx;
height: 88rpx;
border-radius: 50%;
background-image: linear-gradient(45deg, #007aff, #00aaff);
display: flex;
align-items: center;
justify-content: center;
position: fixed;
bottom: 200rpx;
right: 26rpx;
z-index: 100;
}
.addBtn:active {
background-image: linear-gradient(45deg, #00aaff, #007aff);
}
</style>
+89
View File
@@ -0,0 +1,89 @@
<template>
<view class="myCard" @click="gotoDetailFun">
<view class="cardTopName">排产单号:{{item.ProductWeaveNo}} {{item.WeaveFactoryName}}</view>
<view class="cardRow">
<view>排产日期:</view>
<view>{{item.ProductWeaveDate}}</view>
</view>
<view class="cardRow">
<view>营销部门:</view>
<view>{{item.PlanDepartmentName}}</view>
</view>
<view class="cardRow">
<view>客户名称:</view>
<view>{{item.CustomerName}}</view>
</view>
<view class="cardRow">
<view>销 售 员:</view>
<view>{{item.SaleUserName}}</view>
</view>
<view class="cardRow">
<text class="fzrLeft">单据状态:</text>
<text class="fzrRight">{{item.BillStatusName}} {{item.BillStatusTime}}</text>
</view>
<view class="cardRow">
<view>物流公司:</view>
<view>{{item.ShipCompanyName}}</view>
</view>
<view class="cardRow">
<view>发货地址:</view>
<view>{{item.SaleCustomerAddress}}</view>
</view>
<view class="cardRow">
<view>创 建 人:</view>
<view>{{item.OpName}} {{item.OpDate}}</view>
</view>
<view class="cardRow">
<view>审 核 人:</view>
<view>{{item.CommitName}} {{item.CommitDate}}</view>
</view>
<view v-if="!isDetail && !isSelect" class="lookDetail">
<text>查看详情</text>
<u-icon name="arrow-right" size="36"></u-icon>
</view>
</view>
</template>
<script>
export default {
props: {
item: {
type: Object,
default: () => {}
},
index: {
type: Number,
default: 0
},
isSelect: {
type: Boolean,
default: false
},
isDetail: {
type: Boolean,
default: false
}
},
data() {
return {
}
},
methods: {
gotoDetailFun: function() {
if(this.isSelect) {
return
}
uni.$bjInfo = this.item;
uni.navigateTo({
url: '/pages/saleship/detail?index=' + this.index
})
}
}
}
</script>
<style>
</style>
@@ -0,0 +1,148 @@
<template>
<view>
<view class="card">
<view class="topRow1" @click="">
<view class="name">
<text class="mr26"> {{item.BillTypeName}}</text>
</view>
<view>
<text class="colorGray">单据仓库:</text>
<text>{{item.BillClassName}}</text>
</view>
<view>
<text class="colorGray">单据类型:</text>
<text>{{item.BillBusinessTypeName}}</text>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
props: {
item: {
type: Object,
default: () => {}
},
isSelect: {
type: Boolean,
default: false
},
index: {
type: Number,
default: 0
}
},
data() {
return {
moreShow: false,
allotShow: false,
}
},
methods: {
}
}
</script>
<style>
.card {
width: 698rpx;
padding: 26rpx 26rpx 10rpx;
margin: 32rpx 26rpx;
box-sizing: border-box;
border-radius: 16rpx;
box-shadow: #d8d8d8 0px 0px 16rpx;
position: relative;
background-color: #FFFFFF;
}
.genjinBtn {
position: absolute;
right: 26rpx;
top: 26rpx;
background-color: #007AFF;
color: #FFFFFF;
text-align: center;
padding: 6rpx 16rpx;
border-radius: 6rpx;
font-size: 14px;
}
.genjinBtn:active {
background-color: #13B8FF;
}
.topRow1 {
margin-bottom: 16rpx;
font-size: 15px;
color: #000;
position: relative;
}
.name {
font-size: 16px;
margin-bottom: 8rpx;
color: #000000;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-weight: bold;
}
.bottomRow {
width: 100%;
padding-top: 16rpx;
display: flex;
align-items: center;
justify-content: space-between;
border-top: 1rpx solid #f0f0f0;
font-size: 15px;
color: #007AFF;
}
.lxRow {
display: flex;
align-items: center;
}
.lxRow>image {
width: 52rpx;
height: 52rpx;
margin-right: 26rpx;
}
.bqRow {
display: flex;
align-items: center;
flex-wrap: wrap;
}
.bqRow>text {
font-size: 14px;
color: #888888;
}
.bqRow>view {
padding: 6rpx 16rpx;
font-size: 14px;
background-color: rgba(255, 85, 127, 0.1);
color: #ff5500;
border-radius: 10rpx;
margin: 6rpx 26rpx 20rpx 0;
}
.khJieDuan {
position: absolute;
right: 0;
top: 50rpx;
font-weight: bold;
}
.khType {
position: absolute;
right: 0;
top: 72rpx;
font-weight: bold;
}
</style>
+63
View File
@@ -0,0 +1,63 @@
<template>
<view class="myCard">
<view class="cardTopName">产品名称:{{item.pName}}</view>
<view class="cardRow">
<view>产品价格:</view>
<view>{{item.price}}元/{{item.unit}}</view>
</view>
<view class="flexRow">
<view>
<text>售价:</text>
<text>{{item.sellingPrice}}元</text>
</view>
<view>
<text>折扣:</text>
<text>{{item.discount}}%</text>
</view>
</view>
<view class="cardRow">
<view>产品数量:</view>
<view>{{item.num}}</view>
</view>
<view class="cardRow">
<view>价格合计:</view>
<view>{{item.totalPrice}}</view>
</view>
</view>
</template>
<script>
export default {
props: {
item: {
type: Object,
default: () => {}
}
},
data() {
return {
}
},
methods: {
}
}
</script>
<style>
.flexRow {
display: flex;
font-size: 32rpx;
color: #ADADAD;
margin-bottom: 8rpx;
}
.flexRow>view {
width: 50%;
display: flex;
}
.flexRow>view>text:last-child {
color: #000000;
}
</style>
@@ -0,0 +1,77 @@
<template>
<view class="myCard" @click="gotoDetailFun">
<view class="cardTopName">进仓单号:{{item.BillNo}}</view>
<view class="cardRow">
<view>进仓日期:</view>
<view>{{item.BillDate}}</view>
</view>
<view class="cardRow">
<view>仓库名称:</view>
<view>{{item.StoreName}}</view>
</view>
<view class="cardRow">
<view>染整厂名:</view>
<view>{{item.CustomerName}}</view>
</view>
<view class="cardRow">
<view>创 建 人:</view>
<view>{{item.OpName}} {{item.OpDate}}</view>
</view>
<view class="cardRow">
<view>审 核 人:</view>
<view>{{item.CommitName}} {{item.CommitDate}}</view>
</view>
<view v-if="!isDetail && !isSelect" class="lookDetail">
<text>查看详情</text>
<u-icon name="arrow-right" size="36"></u-icon>
</view>
</view>
</template>
<script>
export default {
props: {
item: {
type: Object,
default: () => {}
},
index: {
type: Number,
default: 0
},
isSelect: {
type: Boolean,
default: false
},
isDetail: {
type: Boolean,
default: false
}
},
data() {
return {
}
},
methods: {
onlaunch(e) {
console.log("---->>>" + item.OpDate);
},
gotoDetailFun: function() {
if(this.isSelect) {
return
}
uni.$bjInfo = this.item;
uni.navigateTo({
url: '/pages/saleship/detail?index=' + this.index
})
}
}
}
</script>
<style>
</style>
+66
View File
@@ -0,0 +1,66 @@
<template>
<view class="myCard">
<view class="statesRight">已完成</view>
<view class="cardTopName">发票编号:FP20210326-0001</view>
<view class="cardRow">
<view>合同名称:</view>
<view>行云办公CRM</view>
</view>
<view class="cardRow">
<view>开票金额:</view>
<view>3650000</view>
</view>
<view class="cardRow">
<view>开票日期:</view>
<view>2021-07-01</view>
</view>
<view class="fzrAbsolute">
<text class="fzrLeft">负责人:</text>
<text class="fzrRight">曹国防</text>
</view>
<view class="lookDetail">
<text>查看详情</text>
<u-icon name="arrow-right" size="36"></u-icon>
</view>
</view>
</template>
<script>
export default {
props: {
item: {
type: Object,
default: () => {}
}
},
data() {
return {
}
},
methods: {
}
}
</script>
<style>
.progress {
width: 200rpx !important;
margin-left: 26rpx;
}
.fzr {
position: absolute;
right: 26rpx;
bottom: 74rpx;
font-size: 15px;
}
.fzrLeft {
color: #ADADAD;
}
.fzrRight {
font-weight: bold;
color: #ff941a;
}
</style>
+102
View File
@@ -0,0 +1,102 @@
<template>
<view class="myCard">
<view class="cardTopName">表单名称:满意度问卷调查</view>
<!-- <view class="cardRow">
<view>表单描述:</view>
<view>软件服务满意度问卷调查表</view>
</view> -->
<view class="cardRow">
<view>表单类型:</view>
<view>市场调查</view>
</view>
<view class="flexJb">
<view class="cardRow1">
<view>阅读人数:</view>
<view>888</view>
</view>
<view class="cardRow1">
<view>提交人数:</view>
<view>666</view>
</view>
</view>
<view class="cardRow">
<view>创建日期:</view>
<view>{{$u.timeFormat(item.date, 'yyyy-mm-dd')}}</view>
</view>
<view v-if="!isDetail" class="fzrAbsolute">
<text class="fzrLeft">负责人:</text>
<text class="fzrRight">{{item.fuZeRen}}</text>
</view>
<view v-else class="cardRow">
<view>负责人:</view>
<view>{{item.fuZeRen}}</view>
</view>
<view v-if="!isDetail" class="lookDetail">
<text>查看详情</text>
<u-icon name="arrow-right" size="36"></u-icon>
</view>
</view>
</template>
<script>
export default {
props: {
item: {
type: Object,
default: () => {}
},
isDetail: {
type: Boolean,
default: false
}
},
data() {
return {
}
},
methods: {
}
}
</script>
<style>
.progress {
width: 200rpx !important;
margin-left: 26rpx;
}
.fzr {
position: absolute;
right: 26rpx;
bottom: 74rpx;
font-size: 15px;
}
.fzrLeft {
color: #ADADAD;
}
.fzrRight {
font-weight: bold;
color: #ff941a;
}
.flexJb {
display: flex;
align-items: center;
}
.flexJb>.cardRow1 {
width: 50%;
}
.cardRow1 {
display: flex;
font-size: 16px;
margin-bottom: 4px;
}
.cardRow1>view:first-child {
width: 88px;
color: #ADADAD;
}
.cardRow1>view:last-child {
color: #000000;
}
</style>
+107
View File
@@ -0,0 +1,107 @@
<template>
<view class="card" @click="gotoDetailFun">
<view class="khName">客户名称:{{item.clientName}}</view>
<view class="lrView">
<view>跟进类型:</view>
<view>{{item.type}}</view>
</view>
<view class="lrView" v-if="item.orderType">
<view>单据类型:</view>
<view>{{item.orderType}}</view>
<!-- <view v-if="item.states == '有需求跟进'" class="yellowColor">{{item.states}}</view>
<view v-if="item.states == '促单'" class="greenColor">{{item.states}}</view>
<view v-if="item.states == '放弃'" class="redColor">{{item.states}}</view> -->
</view>
<view class="lrView">
<view>跟进内容:</view>
<view class="liangHang">{{item.gjContent}}</view>
</view>
<view v-if="item.gjAddr" class="lrView">
<view>跟进地址:</view>
<view>{{item.gjAddr}}</view>
</view>
<view v-if="item.next_gjDate" class="lrView">
<view>下次跟进:</view>
<view>{{$u.timeFormat(item.next_gjDate, 'yyyy-mm-dd hh:MM:ss')}}</view>
</view>
<view v-if="item.genjin_date" class="lrView">
<view>跟进时间:</view>
<view>{{$u.timeFormat(item.genjin_date, 'yyyy-mm-dd hh:MM:ss')}}</view>
</view>
<view class="lrView">
<view>创建人:</view>
<view class="liangHang">{{item.cjRenName}}</view>
</view>
<view class="lookDetail">
<text>查看详情</text>
<u-icon name="arrow-right" size="36"></u-icon>
</view>
</view>
</template>
<script>
export default {
props: {
item: {
type: Object,
default: () => {}
},
index: {
type: Number,
default: 0
}
},
data() {
return {
}
},
methods: {
gotoDetailFun: function() {
uni.$gjInfo = this.item;
uni.navigateTo({
url: '/pages/crm/genJin/detail?index=' + this.index
})
}
}
}
</script>
<style>
.card {
width: 686rpx;
margin: 32rpx;
background-color: #FFFFFF;
padding: 16rpx;
border-radius: 26rpx;
box-sizing: border-box;
box-shadow: #dddddd 0px 0px 32rpx;
}
.bottomRow {
display: flex;
justify-content: space-between;
border-top: 1rpx solid #dddddd;
padding-top: 16rpx;
margin-top: 16rpx;
}
.khName {
font-size: 16px;
font-weight: bold;
margin-bottom: 16rpx;
padding-bottom: 10rpx;
border-bottom: 1rpx solid #e8e8e8;
}
.lrView {
display: flex;
font-size: 16px;
}
.lrView>view:first-child {
width: 176rpx;
color: #ADADAD;
}
.lrView>view:last-child {
width: 466rpx;
color: #000000;
}
</style>
+73
View File
@@ -0,0 +1,73 @@
<template>
<view class="myCard" @click="gotoDetailFun">
<view class="cardTopName">合同名称:{{item.htName}}</view>
<view class="cardRow">
<view>客户名称:</view>
<view>{{item.clientName}}</view>
</view>
<view class="cardRow" v-if="item.htCode">
<view>合同编号:</view>
<view>{{item.htCode}}</view>
</view>
<view class="cardRow">
<view>合同金额:</view>
<view>{{item.htPrice}}</view>
</view>
<view class="cardRow">
<view>签约日期:</view>
<view>{{$u.timeFormat(item.qianYueDateTime, 'yyyy-mm-dd')}}</view>
</view>
<view class="fzrAbsolute" v-if="item.fuZeRenId && !isDetail">
<text class="fzrLeft">负责人:</text>
<text class="fzrRight">{{item.fuZeRenName}}</text>
</view>
<view v-if="!isDetail && !isSelect" class="lookDetail">
<text>查看详情</text>
<u-icon name="arrow-right" size="36"></u-icon>
</view>
</view>
</template>
<script>
export default {
props: {
item: {
type: Object,
default: () => {}
},
index: {
type: Number,
default: 0
},
isSelect: {
type: Boolean,
default: false
},
isDetail: {
type: Boolean,
default: false
}
},
data() {
return {
}
},
methods: {
gotoDetailFun: function() {
if(this.isSelect) {
return
}
uni.$htInfo = this.item;
uni.navigateTo({
url: '/pages/crm/hetong/detail?index=' + this.index
})
}
}
}
</script>
<style>
</style>
+85
View File
@@ -0,0 +1,85 @@
<template>
<view class="myCard" @click="gotoDetailFun">
<view class="cardTopName">计划编号:{{item.hkjhCode}}</view>
<view class="cardRow">
<view>合同名称:</view>
<view>{{item.htName}}</view>
</view>
<view class="cardRow">
<view>回款金额:</view>
<view>{{item.hkPrice}}元</view>
</view>
<view class="cardRow">
<view>回款日期:</view>
<view>{{$u.timeFormat(item.date, 'yyyy-mm-dd')}}</view>
</view>
<view class="fzrAbsolute" v-if="item.fuZeRenId && !isDetail">
<text class="fzrLeft">负责人:</text>
<text class="fzrRight">{{item.fuZeRenName}}</text>
</view>
<view v-if="!isDetail && !isSelect" class="lookDetail">
<text>查看详情</text>
<u-icon name="arrow-right" size="36"></u-icon>
</view>
</view>
</template>
<script>
export default {
props: {
item: {
type: Object,
default: () => {}
},
index: {
type: Number,
default: 0
},
isSelect: {
type: Boolean,
default: false
},
isDetail: {
type: Boolean,
default: false
}
},
data() {
return {
}
},
methods: {
gotoDetailFun: function() {
if(this.isSelect) {
return
}
uni.$hkjhInfo = this.item;
uni.navigateTo({
url: '/pages/crm/huikuanJH/detail?index=' + this.index
})
}
}
}
</script>
<style>
.progress {
width: 200rpx !important;
margin-left: 26rpx;
}
.fzr {
position: absolute;
right: 26rpx;
bottom: 74rpx;
font-size: 15px;
}
.fzrLeft {
color: #ADADAD;
}
.fzrRight {
font-weight: bold;
color: #ff941a;
}
</style>
+456
View File
@@ -0,0 +1,456 @@
<template>
<view>
<u-action-sheet :list="sheetList" v-model="moreShow" @click="sheetFun"></u-action-sheet>
<u-select v-model="allotShow" mode="single-column" confirm-text="确认分配" cancel-text="取消分配" :list="userList" @confirm="allotConfirmFun" value-name="_id" label-name="nickname"></u-select>
<view class="card">
<view class="topRow1" @click="gotoDetailFun">
<view class="name">
<text class="mr26">{{item.CustomerNo}} {{item.CustomerName}}</text>
</view>
<view>
<text class="colorGray">联系方式:</text>
<text>{{item.CustomerLinkName}} {{item.CustomerPhone}}</text>
</view>
<view>
<text class="colorGray">销售群体:</text>
<text>{{item.SalesGroupNames}}</text>
<text class="colorGray">销售区域:</text>
<text>{{item.SalesAreaNames}}</text>
</view>
<view>
<text class="colorGray">联系地址:</text>
<text>{{item.CustomerAddress}}</text>
</view>
<view>
<text class="colorGray">信用额度:</text>
<text>{{item.CreditAmount}}</text>
<text class="colorGray">信用级别:</text>
<text>{{item.CreditGrade}}</text>
</view>
<view>
<text class="colorGray">结算方式:</text>
<text>{{item.PaymentModeName}}</text>
<text class="colorGray">营销部门:</text>
<text>{{item.PlanDepartmentName}}</text>
</view>
<view>
<text class="colorGray">销售员:</text>
<text>{{item.SaleUserName}}</text>
</view>
<view>
<view>创建人:{{item.OpName}} {{item.OpDate}}</view>
</view>
<view>
<view>修改人:{{item.CommitName}} {{item.CommitDate}}</view>
</view>
</view>
</view>
</view>
</template>
<script>
import { crmKeHuApi } from '../../static/utils/api.js'
import { uidUserApi } from '../../static/utils/adminApi.js'
export default {
props: {
item: {
type: Object,
default: () => {}
},
isSelect: {
type: Boolean,
default: false
},
index: {
type: Number,
default: 0
}
},
data() {
return {
sheetList: [{
text: '添加跟进'
},
{
text: '编辑'
},
{
text: '删除'
}
],
moreShow: false,
allotShow: false,
userList: []
}
},
methods: {
moreShowFun: function() {
let status = this.item.status;
if(status == 0) {
if(uni.$userInfo.isDepManager) {
this.sheetList = [
{
text: '领取'
},
{
text: '分配'
},
{
text: '编辑'
},
{
text: '删除'
}
];
} else {
this.sheetList = [
{
text: '领取'
}
];
}
} else {
this.sheetList = [
{
text: '添加跟进'
},
{
text: '放入客户池'
},
{
text: '编辑'
}
// {
// text: '删除'
// }
];
}
this.moreShow = true;
},
gotoDetailFun: function() {
if(this.isSelect) {
return
}
uni.$khInfo = this.item;
uni.navigateTo({
url: './khDetail?index=' + this.index
})
},
sheetFun: function(i) {
console.log(i)
let arr = this.sheetList;
let str = arr[i].text;
if(str == '添加跟进') {
uni.navigateTo({
url: '../genJin/add?clientName=' + this.item.clientName + '&clientId=' + this.item._id
})
} else if(str == '编辑') {
uni.$infoObj = this.item;
uni.navigateTo({
url: './addKeHu?type=update'
})
} else if(str == '删除') {
let that = this;
uni.showModal({
title: '提示',
content: '是否确认删除客户名称为:' + that.item.clientName + '的客户吗?',
success(res) {
if(res.confirm) {
uni.showLoading({
title: '删除中...',
mask: true
})
let reqData = {
action: 'update',
params: {
_id: that.item._id,
req: {
isDelete: 1,
update_date: new Date().getTime()
}
}
}
crmKeHuApi(reqData)
.then(res => {
uni.showToast({
title: '删除成功!',
duration: 1000,
icon: 'none'
})
uni.$emit('deleteKhFun', {index: that.index})
that.addCzjlFun('删除');
})
}
}
})
} else if(str == '领取') {
this.lingquFun()
} else if(str == '分配') {
if(this.userList.length > 0) {
this.allotShow = true;
} else {
this.getUserLisByDepIdtFun();
}
} else if(str == '放入客户池') {
this.putInFun()
}
},
addCzjlFun: function(type, content) {
let czjlObj = {
create_date: new Date().getTime(),
czRen: uni.$userInfo._id,
pageType: 'client',
dataId: this.item._id,
type
}
if(content && content.length > 0) {
czjlObj.content = content;
}
uni.$czjlApiAddFun(czjlObj);
},
// 领取客户
lingquFun: function() {
let that = this;
uni.showModal({
title: '提示',
content: '是否确认领取客户名称为:' + that.item.clientName + '的客户吗?',
success(res) {
if(res.confirm) {
uni.showLoading({
title: '领取中...',
mask: true
})
let reqData = {
action: 'update',
params: {
_id: that.item._id,
req: {
status: 1, // 已领取分配 客户池状态
fuZeRenId: uni.$userInfo._id,
update_date: new Date().getTime()
}
}
}
crmKeHuApi(reqData)
.then(res => {
that.addCzjlFun('领取');
that.$emit('cxGetDataFun');
uni.showToast({
title: '领取成功!',
duration: 1600,
icon: 'none',
mask: true
})
})
}
}
})
},
// 将客户放入客户池
putInFun: function() {
let that = this;
uni.showModal({
title: '提示',
content: '是否确认将客户名称为:' + that.item.clientName + '的客户放入客户池吗?',
success(res) {
let time = new Date().getTime();
if(res.confirm) {
uni.showLoading({
title: '更新中...',
mask: true
})
let reqData = {
action: 'update',
params: {
_id: that.item._id,
req: {
status: 0, // 待分配 客户池状态
fuZeRenId: '',
next_gjDate: '',
awaitFollowUp: 0,
recycle_date: time,
update_date: time
}
}
}
crmKeHuApi(reqData)
.then(res => {
that.addCzjlFun('放入客户池');
that.$emit('cxGetDataFun');
uni.showToast({
title: '更新成功!',
duration: 1600,
icon: 'none',
mask: true
})
})
}
}
})
},
// 分配客户
allotConfirmFun: function(e) {
console.log(e)
let obj = e[0];
let that = this;
uni.showModal({
title: '提示',
content: '是否确认将客户名称为:' + that.item.clientName + '的客户分配给 - ' + obj.label + ' - 吗?',
success(res) {
let time = new Date().getTime();
if(res.confirm) {
uni.showLoading({
title: '分配中...',
mask: true
})
let reqData = {
action: 'update',
params: {
_id: that.item._id,
req: {
status: 1, // 分配
fuZeRenId: obj.value,
update_date: time
}
}
}
crmKeHuApi(reqData)
.then(res => {
let content = [
'修改 ' + ' 负责人为 ' + obj.label
]
that.addCzjlFun('编辑', content);
that.$emit('cxGetDataFun');
uni.showToast({
title: '更新成功!',
duration: 1600,
icon: 'none',
mask: true
})
})
}
}
})
},
// 根据部门id获取用户
getUserLisByDepIdtFun: function() {
uni.showLoading({
title: '加载中...',
mask: true
})
let reqData = {
action: 'getAllUserListByDepID',
params: {
depId: uni.$userInfo.depManager_Id,
status: 0
}
}
uidUserApi(reqData)
.then(res => {
this.userList = res.result.data;
this.allotShow = true;
})
},
}
}
</script>
<style>
.card {
width: 698rpx;
padding: 26rpx 26rpx 10rpx;
margin: 32rpx 26rpx;
box-sizing: border-box;
border-radius: 16rpx;
box-shadow: #d8d8d8 0px 0px 16rpx;
position: relative;
background-color: #FFFFFF;
}
.genjinBtn {
position: absolute;
right: 26rpx;
top: 26rpx;
background-color: #007AFF;
color: #FFFFFF;
text-align: center;
padding: 6rpx 16rpx;
border-radius: 6rpx;
font-size: 14px;
}
.genjinBtn:active {
background-color: #13B8FF;
}
.topRow1 {
margin-bottom: 16rpx;
font-size: 15px;
color: #000;
position: relative;
}
.name {
font-size: 16px;
margin-bottom: 8rpx;
color: #000000;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-weight: bold;
}
.bottomRow {
width: 100%;
padding-top: 16rpx;
display: flex;
align-items: center;
justify-content: space-between;
border-top: 1rpx solid #f0f0f0;
font-size: 15px;
color: #007AFF;
}
.lxRow {
display: flex;
align-items: center;
}
.lxRow>image {
width: 52rpx;
height: 52rpx;
margin-right: 26rpx;
}
.bqRow {
display: flex;
align-items: center;
flex-wrap: wrap;
}
.bqRow>text {
font-size: 14px;
color: #888888;
}
.bqRow>view {
padding: 6rpx 16rpx;
font-size: 14px;
background-color: rgba(255, 85, 127, 0.1);
color: #ff5500;
border-radius: 10rpx;
margin: 6rpx 26rpx 20rpx 0;
}
.khJieDuan {
position: absolute;
right: 0;
top: 50rpx;
font-weight: bold;
}
.khType {
position: absolute;
right: 0;
top: 72rpx;
font-weight: bold;
}
</style>
+262
View File
@@ -0,0 +1,262 @@
<template>
<view>
<u-action-sheet :list="sheetList" v-model="moreShow" @click="sheetFun"></u-action-sheet>
<view class="card">
<view class="topRow" @click="gotoDetailFun">
<view class="txView">
<image class="txViewImg" src="/static/icon/touxiangnan.png" mode="aspectFill"></image>
</view>
<view class="info">
<view class="name">
<text>{{item.lxr_name}}</text>
<text v-if="item.company_zhiWei">—{{item.company_zhiWei}}</text>
</view>
<view>{{item.clientName}}</view>
<!-- <view>来自手动添加 | 最后跟进时间</view> -->
<view v-if="item.genjin_date" class="colorGray">
<text>最后跟进时间:</text>
<text>{{$u.timeFrom(item.genjin_date, 'yyyy年mm月dd日')}}</text>
</view>
<view v-else-if="item.update_date" class="colorGray">
<text>最后更新时间:</text>
<text>{{$u.timeFrom(item.update_date, 'yyyy年mm月dd日')}}</text>
</view>
<view v-else class="colorGray">
<text>创建时间:</text>
<text>{{$u.timeFrom(item.create_date, 'yyyy年mm月dd日')}}</text>
</view>
</view>
</view>
<!--标签-->
<!-- <view class="bqRow" @click="gotoDetailFun">
<view>吸烟</view>
<view>喝酒</view>
<view>烫头</view>
<text>共3个标签</text>
</view> -->
<view v-if="!isSelect" class="bottomRow">
<text v-if="isHideMore" style="color: #333333;">{{item.lxr_phone}}</text>
<view class="lxRow">
<lianxiRow :phone="item.lxr_phone"></lianxiRow>
</view>
<view v-if="!isHideMore" class="lxRow" @click.stop="moreShow = true">
<image src="/static/icon/gengduosz.png" mode="aspectFill"></image>
</view>
</view>
</view>
</view>
</template>
<script>
import { crmLianXiRenApi } from '../../static/utils/api.js'
export default {
props: {
item: {
type: Object,
default: () => {}
},
isSelect: {
type: Boolean,
default: false
},
isHideMore: {
type: Boolean,
default: false
},
index: {
type: Number,
default: 0
}
},
data() {
return {
sheetList: [{
text: '添加跟进'
},
{
text: '编辑'
},
{
text: '删除'
}
],
moreShow: false
}
},
mounted() {
},
methods: {
gotoDetailFun: function() {
if(this.isSelect) {
return
}
uni.$lxrInfo = this.item;
uni.navigateTo({
url: '/pages/crm/lianxiren/detail?index=' + this.index
})
},
sheetFun: function(i) {
if(i == 0) {
uni.navigateTo({
url: '../genJin/add?clientName=' + this.item.clientName + '&clientId=' + this.item._id + '&glkhLxr=' + this.item.lxr_name + '&glkhLxrId=' + this.item._id
})
} else if(i == 1) {
uni.$infoObj = this.item;
uni.navigateTo({
url: './addLxr?type=update'
})
} else if(i == 2) {
let that = this;
uni.showModal({
title: '提示',
content: '是否确认删除姓名为:' + that.item.lxr_name + '的联系人吗?',
success(res) {
if(res.confirm) {
uni.showLoading({
title: '删除中...',
mask: true
})
let reqData = {
action: 'update',
params: {
_id: that.item._id,
req: {
isDelete: 1,
update_date: new Date().getTime()
}
}
}
crmLianXiRenApi(reqData)
.then(res => {
uni.showToast({
title: '删除成功!',
duration: 1000,
icon: 'none'
})
uni.$emit('deleteCardFun', {index: that.index})
that.addCzjlFun();
})
}
}
})
}
},
addCzjlFun: function() {
let czjlObj = {
create_date: new Date().getTime(),
czRen: uni.$userInfo._id,
pageType: 'contact',
dataId: this.item._id,
type: '删除'
}
uni.$czjlApiAddFun(czjlObj);
}
}
}
</script>
<style>
.card {
width: 698rpx;
padding: 26rpx 26rpx 10rpx;
margin: 32rpx 26rpx;
box-sizing: border-box;
border-radius: 16rpx;
box-shadow: #d8d8d8 0px 0px 16rpx;
position: relative;
background-color: #FFFFFF;
}
.genjinBtn {
position: absolute;
right: 26rpx;
top: 26rpx;
background-color: #007AFF;
color: #FFFFFF;
text-align: center;
padding: 6rpx 16rpx;
border-radius: 6rpx;
font-size: 14px;
}
.genjinBtn:active {
background-color: #13B8FF;
}
.topRow {
display: flex;
align-items: center;
margin-bottom: 16rpx;
}
.txView {
width: 128rpx;
height: 128rpx;
border-radius: 50%;
overflow: hidden;
margin-right: 26rpx;
}
.txViewImg {
width: 100%;
height: 100%;
}
.info {
width: 492rpx;
font-size: 15px;
color: #000;
}
.name {
font-size: 16px;
margin-bottom: 8rpx;
color: #000000;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-weight: bold;
}
.bottomRow {
width: 100%;
padding-top: 16rpx;
display: flex;
align-items: center;
justify-content: space-between;
border-top: 1rpx solid #f0f0f0;
font-size: 15px;
color: #007AFF;
}
.lxRow {
display: flex;
align-items: center;
}
.lxRow>image {
width: 52rpx;
height: 52rpx;
margin-right: 26rpx;
}
.bqRow {
display: flex;
align-items: center;
flex-wrap: wrap;
}
.bqRow>text {
font-size: 14px;
color: #888888;
}
.bqRow>view {
padding: 6rpx 16rpx;
font-size: 14px;
background-color: rgba(255, 85, 127, 0.1);
color: #ff5500;
border-radius: 10rpx;
margin: 6rpx 26rpx 20rpx 0;
}
</style>
+93
View File
@@ -0,0 +1,93 @@
<template>
<view class="myCard" @click="gotoDetailFun">
<view class="cardTopName">排产单号:{{item.ProductWeaveNo}} {{item.WeaveFactoryName}}</view>
<view class="cardRow">
<view>排产日期:</view>
<view>{{item.ProductWeaveDate}}</view>
</view>
<view class="cardRow">
<view>商品编码:</view>
<view>{{item.FabricEmbryoNo}}-{{item.EmbryoCodeNo}}#</view>
</view>
<view class="cardRow">
<view>商品名称:</view>
<view>{{item.FabricEmbryoName}}</view>
</view>
<view class="cardRow">
<view>商品颜色:</view>
<view>{{item.EmbryoCodeName}}</view>
</view>
<view class="cardRow">
<text class="fzrLeft">进度状态:</text>
<text class="fzrRight">{{item.WeaveCompleteTypeName}}</text>
</view>
<view class="cardRow">
<view>生产情况:</view>
<view>{{item.WeaveFactoryWeaveRemark}}</view>
</view>
<view class="cardRow">
<view>排产数量:</view>
<text class="fzrRight">{{item.WeaveRoll}}条 {{item.WeaveQty}}Kg</text>
</view>
<view class="cardRow">
<view>已产数量:</view>
<text class="fzrRight">{{item.HasProductRoll}}条 {{item.HasProductQty}}Kg</text>
</view>
<view class="cardRow">
<view>派纱时间:</view>
<view>{{item.WeaveFactorySendYarn}}</view>
</view>
<view class="cardRow">
<view>派纱备注:</view>
<view>{{item.WeaveFactorySendRemark}}</view>
</view>
<view v-if="!isDetail && !isSelect" class="lookDetail">
<text>查看详情</text>
<u-icon name="arrow-right" size="36"></u-icon>
</view>
</view>
</template>
<script>
export default {
props: {
item: {
type: Object,
default: () => {}
},
index: {
type: Number,
default: 0
},
isSelect: {
type: Boolean,
default: false
},
isDetail: {
type: Boolean,
default: false
}
},
data() {
return {
}
},
methods: {
gotoDetailFun: function() {
if(this.isSelect) {
return
}
uni.$bjInfo = this.item;
uni.navigateTo({
url: '/pages/saleship/detail?index=' + this.index
})
}
}
}
</script>
<style>
</style>
+168
View File
@@ -0,0 +1,168 @@
<template>
<view>
<u-action-sheet :list="sheetList" v-model="moreShow"></u-action-sheet>
<view class="card">
<view class="topRow">
<view class="info">
<view class="cardTopName">客户名称:{{item.clientName}}</view>
<view class="cardRow">
<view>客户地址:</view>
<view>{{item.address}}</view>
</view>
<view class="cardRow">
<view>跟进人:</view>
<view>曹国防</view>
</view>
<view class="cardRow">
<view>最后跟进:</view>
<view>2021-03-23 23:01:22</view>
</view>
</view>
</view>
<view class="bottomRow">
<view class="lxRow">
距您:{{item.distance}}米
</view>
<view class="fujinBtn">
<view class="bottomBtn blueBtn" @click="openLocationFun">
<image src="/static/icon/daohang.png" mode="aspectFill"></image>
<text>导航</text>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
props: {
item: {
type: Object,
default: () => {}
},
pageType: ''
},
data() {
return {
sheetList: [{
text: '添加跟进'
},
{
text: '添加标签'
}
],
moreShow: false
}
},
methods: {
// 打开定位
openLocationFun: function() {
uni.openLocation({
latitude: this.item.latitude,
longitude: this.item.longitude,
address: this.item.address,
name: this.item.clientName,
success: function() {
console.log('success');
}
});
}
}
}
</script>
<style>
.card {
width: 698rpx;
padding: 26rpx 26rpx 10rpx;
margin: 32rpx 26rpx;
box-sizing: border-box;
border-radius: 16rpx;
box-shadow: #d8d8d8 0px 0px 16rpx;
position: relative;
background-color: #FFFFFF;
}
.genjinBtn {
position: absolute;
right: 26rpx;
top: 26rpx;
background-color: #007AFF;
color: #FFFFFF;
text-align: center;
padding: 6rpx 16rpx;
border-radius: 6rpx;
font-size: 14px;
}
.genjinBtn:active {
background-color: #13B8FF;
}
.topRow {
display: flex;
align-items: center;
margin-bottom: 16rpx;
}
.txView {
width: 128rpx;
height: 128rpx;
border-radius: 50%;
overflow: hidden;
margin-right: 26rpx;
}
.txViewImg {
width: 100%;
height: 100%;
}
.info {
width: 100%;
font-size: 15px;
color: #000;
}
.bottomRow {
width: 100%;
padding-top: 16rpx;
display: flex;
align-items: center;
justify-content: space-between;
border-top: 1rpx solid #f0f0f0;
font-size: 15px;
}
.fujinBtn {
display: flex;
align-items: center;
}
.bottomBtn {
display: flex;
align-items: center;
padding: 10rpx 26rpx;
border-radius: 30rpx;
margin-left: 26rpx;
font-size: 15px;
}
.blueBtn {
background-image: linear-gradient(45deg, #007aff, #00aaff);
color: #FFFFFF;
}
.blueBtn:active {
background-image: linear-gradient(45deg, #00aaff, #007aff);
}
.bottomBtn>image {
width: 32rpx;
height: 32rpx;
margin-right: 10rpx;
}
.borderBtn {
border: 1rpx solid #888888;
color: #333333;
}
.borderBtn:active {
background-color: #F0F0F0;
}
</style>
+136
View File
@@ -0,0 +1,136 @@
<template>
<view class="myCard" @click="gotoDetailFun">
<view class="cardTopName">商机名称:{{item.sjName}}</view>
<view class="cardRow">
<view>客户名称:</view>
<view>{{item.clientName}}</view>
</view>
<view class="cardRow">
<view>商机阶段:</view>
<view>{{item.sjJieduan}}</view>
<cover-view v-if="item.percent != -1">
<u-line-progress class="progress" :striped="true" :percent="item.percent" :striped-active="true" :show-percent="false" :active-color="activeColor"></u-line-progress>
</cover-view>
</view>
<view class="cardRow">
<view>商机金额:</view>
<view>{{item.sjPrice}}</view>
</view>
<view class="cardRow">
<view>预计成交:</view>
<view>{{$u.timeFormat(item.chengJiao_date, 'yyyy-mm-dd')}}</view>
</view>
<view class="fzr" v-if="item.fuZeRenId && !isDetail">
<text class="fzrLeft">负责人:</text>
<text class="fzrRight">{{item.fuZeRenName}}</text>
</view>
<view v-if="!isDetail && !isSelect" class="lookDetail">
<text>查看详情</text>
<u-icon name="arrow-right" size="36"></u-icon>
</view>
</view>
</template>
<script>
export default {
props: {
item: {
type: Object,
default: () => {}
},
index: {
type: Number,
default: 0
},
isSelect: {
type: Boolean,
default: false
},
isDetail: {
type: Boolean,
default: false
}
},
watch: {
item: function(val, old) {
this.setSjJieduanFun()
}
},
data() {
return {
percent: 70,
activeColor: ''
}
},
created() {
this.setSjJieduanFun()
},
methods: {
setSjJieduanFun: function() {
let str = this.item.sjJieduan;
let str1 = '';
if(str && str.indexOf('(') != -1) {
str = str.split("(")[0]
}
if(str == '初步沟通') {
str1 = '初步沟通(10%)';
this.item.percent = 10;
this.activeColor = '#ffda03'
} else if(str == '需求确定') {
str1 = '需求确定(30%)';
this.item.percent = 30;
this.activeColor = '#ffaa00'
} else if(str == '方案报价') {
str1 = '方案报价(50%)';
this.item.percent = 50;
this.activeColor = '#00ff7f'
} else if(str == '谈判协商') {
str1 = '谈判协商(80%)';
this.activeColor = '#00ff00'
this.item.percent = 80;
} else if(str == '赢单') {
str1 = '赢单(100%)';
this.activeColor = '#00aa00'
this.item.percent = 100;
} else if(str == '输单') {
str1 = '输单(0%)';
this.item.percent = 0;
this.activeColor = '#ff0000'
} else {
this.item.percent = -1;
}
this.item.sjJieduan = str1;
},
gotoDetailFun: function() {
if(this.isSelect) {
return
}
uni.$sjInfo = this.item;
uni.navigateTo({
url: '/pages/crm/shangji/detail?index=' + this.index
})
}
}
}
</script>
<style>
.progress {
width: 200rpx !important;
margin-left: 26rpx;
}
.fzr {
position: absolute;
right: 26rpx;
bottom: 80rpx;
font-size: 15px;
}
.fzrLeft {
color: #ADADAD;
}
.fzrRight {
font-weight: bold;
color: #ff941a;
}
</style>
+93
View File
@@ -0,0 +1,93 @@
<template>
<view class="myCard" @click="gotoDetailFun">
<view class="cardTopName">回款编号:{{item.hkdCode}}</view>
<view class="cardRow">
<view>合同名称:</view>
<view>{{item.htName}}</view>
</view>
<view class="cardRow">
<view>客户名称:</view>
<view>{{item.clientName}}</view>
</view>
<view class="cardRow">
<view>回款方式:</view>
<view>{{item.hkdType}}</view>
</view>
<view class="cardRow">
<view>回款金额:</view>
<view>{{item.hkdPrice}}</view>
</view>
<view class="cardRow">
<view>回款日期:</view>
<view>{{$u.timeFormat(item.hkdDateTime, 'yyyy-mm-dd')}}</view>
</view>
<view class="fzrAbsolute" v-if="item.fuZeRenId && !isDetail">
<text class="fzrLeft">负责人:</text>
<text class="fzrRight">{{item.fuZeRenName}}</text>
</view>
<view v-if="!isDetail && !isSelect" class="lookDetail">
<text>查看详情</text>
<u-icon name="arrow-right" size="36"></u-icon>
</view>
</view>
</template>
<script>
export default {
props: {
item: {
type: Object,
default: () => {}
},
index: {
type: Number,
default: 0
},
isSelect: {
type: Boolean,
default: false
},
isDetail: {
type: Boolean,
default: false
}
},
data() {
return {
}
},
methods: {
gotoDetailFun: function() {
if(this.isSelect) {
return
}
uni.$hkdInfo = this.item;
uni.navigateTo({
url: '/pages/crm/huikuan/detail?index=' + this.index
})
}
}
}
</script>
<style>
.progress {
width: 200rpx !important;
margin-left: 26rpx;
}
.fzr {
position: absolute;
right: 26rpx;
bottom: 74rpx;
font-size: 15px;
}
.fzrLeft {
color: #ADADAD;
}
.fzrRight {
font-weight: bold;
color: #ff941a;
}
</style>
@@ -0,0 +1,77 @@
<template>
<view class="myCard" @click="gotoDetailFun">
<view class="cardTopName">盘点单号:{{item.order_no}}</view>
<view class="cardRow">
<view>盘点日期:</view>
<view>{{item.check_time}}</view>
</view>
<view class="cardRow">
<view>仓库名称:</view>
<view>{{item.warehouse_name}}</view>
</view>
<view class="cardRow">
<view>仓位名称:</view>
<view>{{item.warehouse_bin_name}}</view>
</view>
<view class="cardRow">
<view>创 建 人:</view>
<view>{{item.create_user_name}} {{item.create_time}}</view>
</view>
<view class="cardRow">
<view>审 核 人:</view>
<view>{{item.update_user_name}} {{item.update_time}}</view>
</view>
<view v-if="!isDetail && !isSelect" class="lookDetail">
<text>查看详情</text>
<u-icon name="arrow-right" size="36"></u-icon>
</view>
</view>
</template>
<script>
export default {
props: {
item: {
type: Object,
default: () => {}
},
index: {
type: Number,
default: 0
},
isSelect: {
type: Boolean,
default: false
},
isDetail: {
type: Boolean,
default: false
}
},
data() {
return {
}
},
methods: {
onlaunch(e) {
console.log("---->>>" + item.OpDate);
},
gotoDetailFun: function() {
if(this.isSelect) {
return
}
uni.$bjInfo = this.item;
uni.navigateTo({
url: '/pages/saleship/detail?index=' + this.index
})
}
}
}
</script>
<style>
</style>
@@ -0,0 +1,77 @@
<template>
<view class="myCard" @click="gotoDetailFun">
<view class="cardTopName">进仓单号:{{item.BillNo}} {{item.SaleBillNo}}</view>
<view class="cardRow">
<view>进仓日期:</view>
<view>{{item.BillDate}}</view>
</view>
<view class="cardRow">
<view>仓库名称:</view>
<view>{{item.StoreName}}</view>
</view>
<view class="cardRow">
<view>往来单位:</view>
<view>{{item.CustomerName}}</view>
</view>
<view class="cardRow">
<view>创 建 人:</view>
<view>{{item.OpName}} {{item.OpDate}}</view>
</view>
<view class="cardRow">
<view>审 核 人:</view>
<view>{{item.CommitName}} {{item.CommitDate}}</view>
</view>
<view v-if="!isDetail && !isSelect" class="lookDetail">
<text>查看详情</text>
<u-icon name="arrow-right" size="36"></u-icon>
</view>
</view>
</template>
<script>
export default {
props: {
item: {
type: Object,
default: () => {}
},
index: {
type: Number,
default: 0
},
isSelect: {
type: Boolean,
default: false
},
isDetail: {
type: Boolean,
default: false
}
},
data() {
return {
}
},
methods: {
onlaunch(e) {
console.log("---->>>" + item.OpDate);
},
gotoDetailFun: function() {
if(this.isSelect) {
return
}
uni.$bjInfo = this.item;
uni.navigateTo({
url: '/pages/saleship/detail?index=' + this.index
})
}
}
}
</script>
<style>
</style>
@@ -0,0 +1,93 @@
<template>
<view class="myCard" @click="gotoDetailFun">
<view class="cardTopName">出仓单号:{{item.BillNo}}</view>
<view class="cardRow">
<view>出仓日期:</view>
<view>{{item.BillDate}}</view>
</view>
<view class="cardRow">
<view>单据类型:</view>
<view>{{item.BillTypeName}}</view>
</view>
<view class="cardRow">
<view>仓库名称:</view>
<view>{{item.StoreName}}</view>
</view>
<view class="cardRow">
<view>调至仓库:</view>
<view>{{item.ToStoreName}}</view>
</view>
<view class="cardRow">
<view>营销部门:</view>
<view>{{item.PlanDepartmentName}}</view>
</view>
<view class="cardRow">
<view>往来单位:</view>
<view>{{item.CustomerName}}</view>
</view>
<view class="cardRow">
<view>销售员:</view>
<view>{{item.SaleUserName}}</view>
</view>
<view class="cardRow">
<view>创 建 人:</view>
<view>{{item.OpName}} {{item.OpDate}}</view>
</view>
<view class="cardRow">
<view>审 核 人:</view>
<view>{{item.CommitName}} {{item.CommitDate}}</view>
</view>
<view v-if="!isDetail && !isSelect" class="lookDetail">
<text>查看详情</text>
<u-icon name="arrow-right" size="36"></u-icon>
</view>
</view>
</template>
<script>
export default {
props: {
item: {
type: Object,
default: () => {}
},
index: {
type: Number,
default: 0
},
isSelect: {
type: Boolean,
default: false
},
isDetail: {
type: Boolean,
default: false
}
},
data() {
return {
}
},
methods: {
onlaunch(e) {
console.log("---->>>" + item.OpDate);
},
gotoDetailFun: function() {
if(this.isSelect) {
return
}
uni.$bjInfo = this.item;
uni.navigateTo({
url: '/pages/saleship/detail?index=' + this.index
})
}
}
}
</script>
<style>
</style>
@@ -0,0 +1,76 @@
<template>
<view class="myCard" @click="gotoDetailFun">
<view class="cardTopName">移仓单号:{{item.BillNo}}</view>
<view class="cardRow">
<view>移仓日期:</view>
<view>{{item.BillDate}}</view>
</view>
<view class="cardRow">
<view>仓库名称:</view>
<view>{{item.StoreName}}</view>
</view>
<view class="cardRow">
<view>仓位名称:</view>
<view>{{item.ScanStoreStationName}}</view>
</view>
<view class="cardRow">
<view>创 建 人:</view>
<view>{{item.OpName}} {{item.OpDate}}</view>
</view>
<view class="cardRow">
<view>审 核 人:</view>
<view>{{item.CommitName}} {{item.CommitDate}}</view>
</view>
<view v-if="!isDetail && !isSelect" class="lookDetail">
<text>查看详情</text>
<u-icon name="arrow-right" size="36"></u-icon>
</view>
</view>
</template>
<script>
export default {
props: {
item: {
type: Object,
default: () => {}
},
index: {
type: Number,
default: 0
},
isSelect: {
type: Boolean,
default: false
},
isDetail: {
type: Boolean,
default: false
}
},
data() {
return {
}
},
methods: {
onlaunch(e) {
console.log("---->>>" + item.OpDate);
},
gotoDetailFun: function() {
if(this.isSelect) {
return
}
uni.$bjInfo = this.item;
uni.navigateTo({
url: '/pages/saleship/detail?index=' + this.index
})
}
}
}
</script>
<style>
</style>
@@ -0,0 +1,85 @@
<template>
<view class="myCard" @click="gotoDetailFun">
<view class="cardTopName">盘点单号:{{item.BillNo}}</view>
<view class="cardRow">
<view>盘点类型:</view>
<view>{{item.BillTypeName}}</view>
</view>
<view class="cardRow">
<view>盘点日期:</view>
<view>{{item.BillDate}}</view>
</view>
<view class="cardRow">
<view>仓库名称:</view>
<view>{{item.StoreName}}</view>
</view>
<view class="cardRow">
<view>仓位名称:</view>
<view>{{item.ScanStoreStationName}}</view>
</view>
<view class="cardRow">
<view>往来单位:</view>
<view>{{item.CustomerName}}</view>
</view>
<view class="cardRow">
<view>创 建 人:</view>
<view>{{item.OpName}} {{item.OpDate}}</view>
</view>
<view class="cardRow">
<view>审 核 人:</view>
<view>{{item.CommitName}} {{item.CommitDate}}</view>
</view>
<view v-if="!isDetail && !isSelect" class="lookDetail">
<text>查看详情</text>
<u-icon name="arrow-right" size="36"></u-icon>
</view>
</view>
</template>
<script>
export default {
props: {
item: {
type: Object,
default: () => {}
},
index: {
type: Number,
default: 0
},
isSelect: {
type: Boolean,
default: false
},
isDetail: {
type: Boolean,
default: false
}
},
data() {
return {
}
},
methods: {
onlaunch(e) {
console.log("---->>>" + item.OpDate);
},
gotoDetailFun: function() {
if(this.isSelect) {
return
}
uni.$bjInfo = this.item;
uni.navigateTo({
url: '/pages/saleship/detail?index=' + this.index
})
}
}
}
</script>
<style>
</style>
@@ -0,0 +1,81 @@
<template>
<view class="myCard" @click="gotoDetailFun">
<view class="cardTopName">进仓单号:{{item.BillNo}}</view>
<view class="cardRow">
<view>进仓类型:</view>
<view>{{item.BillTypeName}}</view>
</view>
<view class="cardRow">
<view>进仓日期:</view>
<view>{{item.BillDate}}</view>
</view>
<view class="cardRow">
<view>仓库名称:</view>
<view>{{item.StoreName}}</view>
</view>
<view class="cardRow">
<view>往来单位:</view>
<view>{{item.CustomerName}}</view>
</view>
<view class="cardRow">
<view>创 建 人:</view>
<view>{{item.OpName}} {{item.OpDate}}</view>
</view>
<view class="cardRow">
<view>审 核 人:</view>
<view>{{item.CommitName}} {{item.CommitDate}}</view>
</view>
<view v-if="!isDetail && !isSelect" class="lookDetail">
<text>查看详情</text>
<u-icon name="arrow-right" size="36"></u-icon>
</view>
</view>
</template>
<script>
export default {
props: {
item: {
type: Object,
default: () => {}
},
index: {
type: Number,
default: 0
},
isSelect: {
type: Boolean,
default: false
},
isDetail: {
type: Boolean,
default: false
}
},
data() {
return {
}
},
methods: {
onlaunch(e) {
console.log("---->>>" + item.OpDate);
},
gotoDetailFun: function() {
if(this.isSelect) {
return
}
uni.$bjInfo = this.item;
uni.navigateTo({
url: '/pages/saleship/detail?index=' + this.index
})
}
}
}
</script>
<style>
</style>
@@ -0,0 +1,81 @@
<template>
<view class="myCard" @click="gotoDetailFun">
<view class="cardTopName">出仓单号:{{item.BillNo}}</view>
<view class="cardRow">
<view>出仓类型:</view>
<view>{{item.BillTypeName}}</view>
</view>
<view class="cardRow">
<view>出仓日期:</view>
<view>{{item.BillDate}}</view>
</view>
<view class="cardRow">
<view>仓库名称:</view>
<view>{{item.StoreName}}</view>
</view>
<view class="cardRow">
<view>往来单位:</view>
<view>{{item.CustomerName}}</view>
</view>
<view class="cardRow">
<view>创 建 人:</view>
<view>{{item.OpName}} {{item.OpDate}}</view>
</view>
<view class="cardRow">
<view>审 核 人:</view>
<view>{{item.CommitName}} {{item.CommitDate}}</view>
</view>
<view v-if="!isDetail && !isSelect" class="lookDetail">
<text>查看详情</text>
<u-icon name="arrow-right" size="36"></u-icon>
</view>
</view>
</template>
<script>
export default {
props: {
item: {
type: Object,
default: () => {}
},
index: {
type: Number,
default: 0
},
isSelect: {
type: Boolean,
default: false
},
isDetail: {
type: Boolean,
default: false
}
},
data() {
return {
}
},
methods: {
onlaunch(e) {
console.log("---->>>" + item.OpDate);
},
gotoDetailFun: function() {
if(this.isSelect) {
return
}
uni.$bjInfo = this.item;
uni.navigateTo({
url: '/pages/saleship/detail?index=' + this.index
})
}
}
}
</script>
<style>
</style>
+89
View File
@@ -0,0 +1,89 @@
<template>
<view class="myCard" @click="gotoDetailFun">
<view class="cardTopName">预约单号:{{item.AllocatedBillNo}} {{item.CustomerName}}</view>
<view class="cardRow">
<view>预约日期:</view>
<view>{{item.AllocatedDate}}</view>
</view>
<view class="cardRow">
<view>营销部门:</view>
<view>{{item.PlanDepartmentName}}</view>
</view>
<view class="cardRow">
<view>客户名称:</view>
<view>{{item.CustomerName}}</view>
</view>
<view class="cardRow">
<view>销 售 员:</view>
<view>{{item.SaleUserName}}</view>
</view>
<view class="cardRow">
<text class="fzrLeft">单据状态:</text>
<text class="fzrRight">{{item.BillStatusName}} {{item.BillStatusTime}}</text>
</view>
<view class="cardRow">
<view>物流公司:</view>
<view>{{item.ShipCompanyName}}</view>
</view>
<view class="cardRow">
<view>发货地址:</view>
<view>{{item.SaleCustomerAddress}}</view>
</view>
<view class="cardRow">
<view>创 建 人:</view>
<view>{{item.OpName}} {{item.OpDate}}</view>
</view>
<view class="cardRow">
<view>审 核 人:</view>
<view>{{item.CommitName}} {{item.CommitDate}}</view>
</view>
<view v-if="!isDetail && !isSelect" class="lookDetail">
<text>查看详情</text>
<u-icon name="arrow-right" size="36"></u-icon>
</view>
</view>
</template>
<script>
export default {
props: {
item: {
type: Object,
default: () => {}
},
index: {
type: Number,
default: 0
},
isSelect: {
type: Boolean,
default: false
},
isDetail: {
type: Boolean,
default: false
}
},
data() {
return {
}
},
methods: {
gotoDetailFun: function() {
if(this.isSelect) {
return
}
uni.$bjInfo = this.item;
uni.navigateTo({
url: '/pages/saleship/detail?index=' + this.index
})
}
}
}
</script>
<style>
</style>
+465
View File
@@ -0,0 +1,465 @@
<template>
<view>
<u-action-sheet :list="sheetList" v-model="moreShow" @click="sheetFun"></u-action-sheet>
<u-select v-model="allotShow" mode="single-column" confirm-text="确认分配" cancel-text="取消分配" :list="userList" @confirm="allotConfirmFun" value-name="_id" label-name="nickname"></u-select>
<view class="card">
<view class="topRow1" @click="gotoDetailFun">
<view class="name">
<text>{{item.clientName || '暂无'}}</text>
</view>
<view v-if="item.xingZhi != '个人客户'">
<text class="colorGray">联系人:</text>
<text>{{item.lxRen}}</text>
<text v-if="item.company_zhiWei">{{item.lxRen}}</text>
</view>
<view v-if="item.genjin_date">
<text class="colorGray">最后跟进时间:</text>
<text>{{$u.timeFrom(item.genjin_date, 'yyyy年mm月dd日')}}</text>
</view>
<view v-else-if="item.update_date">
<text class="colorGray">最后更新时间:</text>
<text>{{$u.timeFrom(item.update_date, 'yyyy年mm月dd日')}}</text>
</view>
<view v-else>
<text class="colorGray">创建时间:</text>
<text>{{$u.timeFrom(item.create_date, 'yyyy年mm月dd日')}}</text>
</view>
</view>
<!--标签-->
<view class="bqRow" @click="gotoDetailFun">
<view v-if="item.xingZhi">{{item.xingZhi}}</view>
<view v-if="item.fenJi">{{item.fenJi}}</view>
<view v-if="item.hangYe">{{item.hangYe}}</view>
<view v-if="item.zycdNum">
<text v-if="item.zycdNum == 1">一星</text>
<text v-if="item.zycdNum == 2">二星</text>
<text v-if="item.zycdNum == 3">三星</text>
<text v-if="item.zycdNum == 4">四星</text>
<text v-if="item.zycdNum == 5">五星</text>
</view>
</view>
<view v-if="!isSelect" class="bottomRow">
<view class="lxRow">
<lianxiRow :phone="item.phone"></lianxiRow>
</view>
<view class="lxRow" @click.stop="moreShowFun">
<image src="/static/icon/gengduosz.png" mode="aspectFill"></image>
</view>
</view>
</view>
</view>
</template>
<script>
import { crmKeHuApi, threadApi } from '../../static/utils/api.js'
import { uidUserApi } from '../../static/utils/adminApi.js'
export default {
props: {
item: {
type: Object,
default: () => {}
},
isSelect: {
type: Boolean,
default: false
},
index: {
type: Number,
default: 0
}
},
data() {
return {
sheetList: [{
text: '添加跟进'
},
{
text: '编辑'
},
{
text: '删除'
}
],
moreShow: false,
allotShow: false,
userList: []
}
},
methods: {
moreShowFun: function() {
let status = this.item.status;
if(status == 0) {
if(uni.$userInfo.isDepManager) {
this.sheetList = [
{
text: '领取'
},
{
text: '分配'
},
{
text: '编辑'
},
{
text: '删除'
}
];
} else {
this.sheetList = [
{
text: '领取'
}
];
}
} else {
this.sheetList = [
{
text: '添加跟进'
},
{
text: '转为客户'
},
{
text: '放入线索池'
},
{
text: '编辑'
}
// {
// text: '删除'
// }
];
}
this.moreShow = true;
},
gotoDetailFun: function() {
if(this.isSelect) {
return
}
uni.$khInfo = this.item;
uni.navigateTo({
url: './threadDetail?index=' + this.index
})
},
sheetFun: function(i) {
let arr = this.sheetList;
let str = arr[i].text;
if(str == '添加跟进') {
uni.navigateTo({
url: './addGj?clientName=' + this.item.clientName + '&clientId=' + this.item._id
})
} else if(str == '编辑') {
uni.$infoObj = this.item;
uni.navigateTo({
url: './addThread?type=update'
})
} else if(str == '删除') {
let that = this;
uni.showModal({
title: '提示',
content: '是否确认删除客户名称为:' + that.item.clientName + '的线索吗?',
success(res) {
if(res.confirm) {
uni.showLoading({
title: '删除中...',
mask: true
})
let reqData = {
action: 'update',
params: {
_id: that.item._id,
req: {
isDelete: 1,
update_date: new Date().getTime()
}
}
}
threadApi(reqData)
.then(res => {
uni.showToast({
title: '删除成功!',
duration: 1000,
icon: 'none'
})
uni.$emit('deleteKhFun', {index: that.index})
that.addCzjlFun('删除');
})
}
}
})
} else if(str == '领取') {
this.lingquFun()
} else if(str == '分配') {
if(this.userList.length > 0) {
this.allotShow = true;
} else {
this.getUserLisByDepIdtFun();
}
} else if(str == '放入线索池') {
this.putInFun()
} else if(str == '转为客户') {
uni.$infoObj = this.item;
uni.navigateTo({
url: '../kehu/addKeHu?type=zhuanClient'
})
}
},
addCzjlFun: function(type, content) {
let czjlObj = {
create_date: new Date().getTime(),
czRen: uni.$userInfo._id,
pageType: 'thread',
dataId: this.item._id,
type
}
if(content && content.length > 0) {
czjlObj.content = content;
}
uni.$czjlApiAddFun(czjlObj);
},
// 领取线索
lingquFun: function() {
let that = this;
uni.showModal({
title: '提示',
content: '是否确认领取客户名称为:' + that.item.clientName + '的线索吗?',
success(res) {
if(res.confirm) {
uni.showLoading({
title: '领取中...',
mask: true
})
let reqData = {
action: 'update',
params: {
_id: that.item._id,
req: {
status: 1, // 已领取分配 客户池状态
fuZeRenId: uni.$userInfo._id,
update_date: new Date().getTime()
}
}
}
threadApi(reqData)
.then(res => {
that.addCzjlFun('领取');
that.$emit('cxGetDataFun');
uni.showToast({
title: '领取成功!',
duration: 1600,
icon: 'none',
mask: true
})
})
}
}
})
},
// 将线索放入线索池
putInFun: function() {
let that = this;
uni.showModal({
title: '提示',
content: '是否确认将客户名称为:' + that.item.clientName + '的线索放入线索池吗?',
success(res) {
let time = new Date().getTime();
if(res.confirm) {
uni.showLoading({
title: '更新中...',
mask: true
})
let reqData = {
action: 'update',
params: {
_id: that.item._id,
req: {
status: 0, // 待分配 线索池状态
fuZeRenId: '',
next_gjDate: '',
awaitFollowUp: 0,
recycle_date: time,
update_date: time
}
}
}
threadApi(reqData)
.then(res => {
that.addCzjlFun('放入线索池');
that.$emit('cxGetDataFun');
uni.showToast({
title: '更新成功!',
duration: 1600,
icon: 'none',
mask: true
})
})
}
}
})
},
// 分配客户
allotConfirmFun: function(e) {
console.log(e)
let obj = e[0];
let that = this;
uni.showModal({
title: '提示',
content: '是否确认将客户名称为:' + that.item.clientName + '的线索分配给 - ' + obj.label + ' - 吗?',
success(res) {
let time = new Date().getTime();
if(res.confirm) {
uni.showLoading({
title: '分配中...',
mask: true
})
let reqData = {
action: 'update',
params: {
_id: that.item._id,
req: {
status: 1, // 分配
fuZeRenId: obj.value,
update_date: time
}
}
}
threadApi(reqData)
.then(res => {
let content = [
'修改 ' + ' 负责人为 ' + obj.label
]
that.addCzjlFun('编辑', content);
that.$emit('cxGetDataFun');
uni.showToast({
title: '更新成功!',
duration: 1600,
icon: 'none',
mask: true
})
})
}
}
})
},
// 根据部门id获取用户
getUserLisByDepIdtFun: function() {
uni.showLoading({
title: '加载中...',
mask: true
})
let reqData = {
action: 'getAllUserListByDepID',
params: {
depId: uni.$userInfo.depManager_Id,
status: 0
}
}
uidUserApi(reqData)
.then(res => {
this.userList = res.result.data;
this.allotShow = true;
})
},
}
}
</script>
<style>
.card {
width: 698rpx;
padding: 26rpx 26rpx 10rpx;
margin: 32rpx 26rpx;
box-sizing: border-box;
border-radius: 16rpx;
box-shadow: #d8d8d8 0px 0px 16rpx;
position: relative;
background-color: #FFFFFF;
}
.genjinBtn {
position: absolute;
right: 26rpx;
top: 26rpx;
background-color: #007AFF;
color: #FFFFFF;
text-align: center;
padding: 6rpx 16rpx;
border-radius: 6rpx;
font-size: 14px;
}
.genjinBtn:active {
background-color: #13B8FF;
}
.topRow1 {
margin-bottom: 16rpx;
font-size: 15px;
color: #000;
position: relative;
}
.name {
font-size: 16px;
margin-bottom: 8rpx;
color: #000000;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-weight: bold;
}
.bottomRow {
width: 100%;
padding-top: 16rpx;
display: flex;
align-items: center;
justify-content: space-between;
border-top: 1rpx solid #f0f0f0;
font-size: 15px;
color: #007AFF;
}
.lxRow {
display: flex;
align-items: center;
}
.lxRow>image {
width: 52rpx;
height: 52rpx;
margin-right: 26rpx;
}
.bqRow {
display: flex;
align-items: center;
flex-wrap: wrap;
}
.bqRow>text {
font-size: 14px;
color: #888888;
}
.bqRow>view {
padding: 6rpx 16rpx;
font-size: 14px;
background-color: rgba(255, 85, 127, 0.1);
color: #ff5500;
border-radius: 10rpx;
margin: 6rpx 26rpx 20rpx 0;
}
.khJieDuan {
position: absolute;
right: 0;
top: 50rpx;
font-weight: bold;
}
.khType {
position: absolute;
right: 0;
top: 72rpx;
font-weight: bold;
}
</style>
+107
View File
@@ -0,0 +1,107 @@
<template>
<view class="card" @click="gotoDetailFun">
<view class="khName">客户名称:{{item.clientName}}</view>
<view class="lrView">
<view>跟进类型:</view>
<view>{{item.type}}</view>
</view>
<view class="lrView" v-if="item.orderType">
<view>单据类型:</view>
<view>{{item.orderType}}</view>
<!-- <view v-if="item.states == '有需求跟进'" class="yellowColor">{{item.states}}</view>
<view v-if="item.states == '促单'" class="greenColor">{{item.states}}</view>
<view v-if="item.states == '放弃'" class="redColor">{{item.states}}</view> -->
</view>
<view class="lrView">
<view>跟进内容:</view>
<view class="liangHang">{{item.gjContent}}</view>
</view>
<view v-if="item.gjAddr" class="lrView">
<view>跟进地址:</view>
<view>{{item.gjAddr}}</view>
</view>
<view v-if="item.next_gjDate" class="lrView">
<view>下次跟进:</view>
<view>{{$u.timeFormat(item.next_gjDate, 'yyyy-mm-dd hh:MM:ss')}}</view>
</view>
<view v-if="item.genjin_date" class="lrView">
<view>跟进时间:</view>
<view>{{$u.timeFormat(item.genjin_date, 'yyyy-mm-dd hh:MM:ss')}}</view>
</view>
<view class="lrView">
<view>创建人:</view>
<view class="liangHang">{{item.cjRenName}}</view>
</view>
<view class="lookDetail">
<text>查看详情</text>
<u-icon name="arrow-right" size="36"></u-icon>
</view>
</view>
</template>
<script>
export default {
props: {
item: {
type: Object,
default: () => {}
},
index: {
type: Number,
default: 0
},
},
data() {
return {
}
},
methods: {
gotoDetailFun: function() {
uni.$gjInfo = this.item;
uni.navigateTo({
url: '/pages/crm/thread/gjDetail?index=' + this.index
})
}
}
}
</script>
<style>
.card {
width: 686rpx;
margin: 32rpx;
background-color: #FFFFFF;
padding: 16rpx;
border-radius: 26rpx;
box-sizing: border-box;
box-shadow: #dddddd 0px 0px 32rpx;
}
.bottomRow {
display: flex;
justify-content: space-between;
border-top: 1rpx solid #dddddd;
padding-top: 16rpx;
margin-top: 16rpx;
}
.khName {
font-size: 16px;
font-weight: bold;
margin-bottom: 16rpx;
padding-bottom: 10rpx;
border-bottom: 1rpx solid #e8e8e8;
}
.lrView {
display: flex;
font-size: 16px;
}
.lrView>view:first-child {
width: 176rpx;
color: #ADADAD;
}
.lrView>view:last-child {
width: 466rpx;
color: #000000;
}
</style>
+190
View File
@@ -0,0 +1,190 @@
<template>
<view class="navbar_container">
<view class="navbar_content" :style="navbarStyle">
<!-- 左侧返回按钮 -->
<view class="navbar_left" @click="handleLeftClick">
<slot name="left">
<text v-if="showBack" class="iconfont icon-arrow-left" :style="{ color: iconColor }">返回</text>
</slot>
</view>
<!-- 中间标题 -->
<view class="navbar_center">
<slot name="center">
<text :style="titleStyle">{{ title }}</text>
</slot>
</view>
<!-- 右侧自定义区域 -->
<view class="navbar_right" @click="handleRightClick">
<slot name="right"></slot>
</view>
</view>
<view class="safe_area" :style="safeAreaStyle"></view>
</view>
</template>
<script>
import { getStatusBarHeight } from "@/utils/safeArea";
export default {
props: {
// 标题文字
title: {
type: String,
default: ''
},
// 标题颜色
titleColor: {
type: String,
default: '#333333'
},
// 标题大小
titleSize: {
type: Number,
default: 18
},
// 标题粗细
titleWeight: {
type: [Number, String],
default: 600
},
// 图标颜色(如返回箭头)
iconColor: {
type: String,
default: '#333333'
},
// 是否显示返回按钮
showBack: {
type: Boolean,
default: true
},
// 自定义返回逻辑
customBack: {
type: Function,
default: null
},
// 背景颜色
backgroundColor: {
type: String,
default: '#ffffff'
},
// 是否显示阴影
showShadow: {
type: Boolean,
default: true
},
// 自定义阴影样式
shadowStyle: {
type: String,
default: 'none'
}
},
data() {
return {
getStatusBarHeight: getStatusBarHeight(),
contentHeight: 0,
};
},
computed: {
navbarStyle() {
return {
backgroundColor: this.backgroundColor,
boxShadow: this.showShadow ? this.shadowStyle : 'none',
top: `${this.getStatusBarHeight}px`
}
},
titleStyle() {
return {
color: this.titleColor,
fontSize: `${this.titleSize}px`,
fontWeight: this.titleWeight
}
},
safeAreaStyle() {
const totalHeight = this.getStatusBarHeight + this.contentHeight;
return {
height: `${totalHeight}px`,
backgroundColor: this.backgroundColor
}
}
},
mounted() {
this.$nextTick(() => {
const query = uni.createSelectorQuery().in(this);
query.select('.navbar_content').boundingClientRect(data => {
if (data) {
this.contentHeight = data.height;
}
}).exec();
});
},
methods: {
handleLeftClick() {
if (this.customBack) {
this.customBack();
} else if (this.showBack) {
const pages = getCurrentPages();
if (pages.length > 1) {
uni.navigateBack({
delta: 1
});
}
}
this.$emit('leftClick');
},
handleRightClick() {
this.$emit('rightClick');
}
}
};
</script>
<style lang="scss" scoped>
.navbar_container {
z-index: 999;
.navbar_content {
position: fixed;
left: 0;
right: 0;
z-index: 999;
display: flex;
align-items: center;
justify-content: space-between;
padding: 15px 12px;
.navbar_left {
min-width: 60px;
.icon-arrow-left {
font-size: 16px;
}
}
.navbar_center {
flex: 1;
text-align: center;
// 防止标题过长
padding: 0 60px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.navbar_right {
min-width: 60px;
text-align: right;
font-size: 16px;
}
}
.safe_area {
width: 100%;
}
}
</style>
+49
View File
@@ -0,0 +1,49 @@
<template>
<view class="dataNull">
<image :src="src" mode="aspectFill"></image>
<view class="title">{{title}}</view>
<view class="title1" v-if="title1">{{title1}}</view>
</view>
</template>
<script>
export default {
props: {
src: {
type: String,
default: '/static/img/dataNull.png'
},
title: {
type: String,
default: '暂无内容哦~'
},
title1: {
type: String,
default: ''
}
},
}
</script>
<style>
.dataNull {
display: flex;
align-items: center;
flex-direction: column;
}
.dataNull>image {
max-width: 500rpx;
max-height: 400rpx;
margin: 200rpx 0 66rpx;
}
.title {
color: #555555;
font-size: 16px;
font-weight: bold;
}
.title1 {
margin-top: 16rpx;
color: #555555;
font-size: 15px;
}
</style>
+49
View File
@@ -0,0 +1,49 @@
<template>
<view class="tishi">
<image v-if="isMore" class="loadingIcon" src="../../static/icon/loading.gif" mode="aspectFill"></image>
<text v-if="isMore">正在加载更多哦...</text>
<text v-else>{{nullMsg}}</text>
</view>
</template>
<script>
export default {
name: "getMore",
props: {
isMore:{
type: Boolean,
default: true
},
nullMsg:{
type: String,
default: '我是有底线的人~'
}
}
}
</script>
<style>
/*上拉刷新提示文字*/
.tishi {
flex-direction: row;
width: 750rpx;
justify-content: center;
text-align: center;
flex-direction: column;
align-items: center;
margin: 28rpx 0;
font-size: 26rpx;
}
.tishiT {
font-size: 26rpx;
color: #333;
}
.loadingIcon {
width: 40rpx;
height: 40rpx;
margin-right: 16rpx;
margin-bottom: -10rpx;
}
</style>
+64
View File
@@ -0,0 +1,64 @@
<template>
<view class="wrap wrap-home">
<u-navbar :title="title" height="44" :is-back="false">
<!-- #ifdef APP-PLUS --><!-- #endif -->
<view slot="right">
<view style="color: #22262d;font-size: 20px;" class="iconfont icon-setting-two" @click="navTo('/pages/sys/user/setting')"></view>
</view>
<u-avatar class="home-head" :src="avatarUrl" @click="show = true"></u-avatar>
</u-navbar>
</view>
</template>
<script>
export default {
props: {
title: {
type: String,
required: true
}
},
data() {
return {
src: '',
show: false,
};
},
onLoad() {
},
computed: {
avatarUrl() {
var url = this.vuex_config.baseUrl + this.vuex_user.avatar || '/static/aidex/tabbar/my_2.png';
url = this.replaceAll(url,'\\','/');
return url + '?t=' + new Date().getTime();
}
},
methods: {
showPersonalInfo() {
this.show = true
},
navTo(url) {
uni.navigateTo({
url: url
});
}
}
};
</script>
<style lang="scss">
.slot-wrap {
display: flex;
align-items: center;
/* 如果您想让slot内容占满整个导航栏的宽度 */
/* flex: 1; */
/* 如果您想让slot内容与导航栏左右有空隙 */
/* padding: 0 30rpx; */
}
page {
background-color: #ffffff;
}
</style>
+64
View File
@@ -0,0 +1,64 @@
<template>
<view>
<image class="lxIcon" @click.stop="makePhoneCallFun" src="/static/icon/dianhua.png" mode="aspectFill">
</image>
<image class="lxIcon" @click.stop="sendMsgFun" src="/static/icon/duanxin.png" mode="aspectFill"></image>
<!-- <image class="lxIcon" @click="sendEmailFun" src="/static/icon/youjian.png" mode="aspectFill"></image> -->
</view>
</template>
<script>
export default {
props: {
phone: ''
},
methods: {
sendMsgFun: function() {
if(!this.phone) {
uni.$myModalFun('该客户暂未设置联系方式!')
return
}
// #ifdef APP-PLUS
var msg = plus.messaging.createMessage(plus.messaging.TYPE_SMS);
msg.to = [this.phone];
msg.body = '';
plus.messaging.sendMessage(msg);
// #endif
},
sendEmailFun: function() {
// #ifdef APP-PLUS
var msg = plus.messaging.createMessage(plus.messaging.TYPE_EMAIL);
msg.to = ['test@163.com', 'test@173.com'];
msg.cc = ['test@163.com', 'test@173.com'];
msg.bcc = ['test@163.com', 'test@173.com'];
msg.subject = '测试邮件';
msg.body = 'This is Pandora example test message';
plus.messaging.sendMessage(msg, function() {
alert("Send success!");
}, function() {
alert("Send failed!");
});
// #endif
},
makePhoneCallFun: function() {
if(!this.phone) {
uni.$myModalFun('该客户暂未设置联系方式!')
return
}
// #ifdef APP-PLUS
uni.makePhoneCall({
phoneNumber: this.phone
})
// #endif
}
}
}
</script>
<style>
.lxIcon {
width: 52rpx;
height: 52rpx;
margin-right: 26rpx;
}
</style>
@@ -0,0 +1,819 @@
<template>
<view v-if="isShow" class="picker">
<!-- 日期选择器 -->
<view v-if="type!='time'" class="picker-modal">
<view class="picker-modal-header">
<view class="picker-icon picker-icon-zuozuo" :hover-stay-time="100" hover-class="picker-icon-active" @click="onSetYear('-1')"></view>
<view class="picker-icon picker-icon-zuo" :hover-stay-time="100" hover-class="picker-icon-active" @click="onSetMonth('-1')"></view>
<text class="picker-modal-header-title">{{title}}</text>
<view class="picker-icon picker-icon-you" :hover-stay-time="100" hover-class="picker-icon-active" @click="onSetMonth('+1')"></view>
<view class="picker-icon picker-icon-youyou" :hover-stay-time="100" hover-class="picker-icon-active" @click="onSetYear('+1')"></view>
</view>
<swiper class="picker-modal-body" :circular="true" :duration="200" :skip-hidden-item-layout="true" :current="calendarIndex" @change="onSwiperChange">
<swiper-item class="picker-calendar" v-for="(calendar,calendarIndex2) in calendars" :key="calendarIndex2">
<view class="picker-calendar-view" v-for="(week,index) in weeks" :key="index - 7">
<view class="picker-calendar-view-item">{{week}}</view>
</view>
<view class="picker-calendar-view" v-for="(date,dateIndex) in calendar" :key="dateIndex" @click="onSelectDate(date)">
<!-- 背景样式 -->
<view v-show="date.bgStyle.type" :class="'picker-calendar-view-'+date.bgStyle.type" :style="{background: date.bgStyle.background}"></view>
<!-- 正常和选中样式 -->
<view class="picker-calendar-view-item" :style="{opacity: date.statusStyle.opacity, color: date.statusStyle.color, background: date.statusStyle.background}">
<text>{{date.title}}</text>
</view>
<!-- 小圆点样式 -->
<view class="picker-calendar-view-dot" :style="{opacity: date.dotStyle.opacity, background: date.dotStyle.background}"></view>
<!-- 信息样式 -->
<view v-show="date.tips" class="picker-calendar-view-tips">{{date.tips}}</view>
</view>
</swiper-item>
</swiper>
<view class="picker-modal-footer">
<view class="picker-modal-footer-info">
<block v-if="isMultiSelect">
<view class="picker-display">
<text>{{beginText}}日期</text>
<text class="picker-display-text">{{BeginTitle}}</text>
<view v-if="isContainTime" class="picker-display-link" :hover-stay-time="100" hover-class="picker-display-link-active"
:style="{color}" @click="onShowTimePicker('begin')">{{BeginTimeTitle}}</view>
</view>
<view class="picker-display">
<text>{{endText}}日期</text>
<text class="picker-display-text">{{EndTitle}}</text>
<view v-if="isContainTime" class="picker-display-link" :hover-stay-time="100" hover-class="picker-display-link-active"
:style="{color}" @click="onShowTimePicker('end')">{{EndTimeTitle}}</view>
</view>
</block>
<block v-else>
<view class="picker-display">
<text>当前选择</text>
<text class="picker-display-text">{{BeginTitle}}</text>
<view v-if="isContainTime" class="picker-display-link" :hover-stay-time="100" hover-class="picker-display-link-active"
:style="{color}" @click="onShowTimePicker('begin')">{{BeginTimeTitle}}</view>
</view>
</block>
</view>
<view class="picker-modal-footer-btn">
<view class="picker-btn" :hover-stay-time="100" hover-class="picker-btn-active" @click="onCancel">取消</view>
<view class="picker-btn" :style="{color}" :hover-stay-time="100" hover-class="picker-btn-active" @click="onConfirm">确定</view>
</view>
</view>
</view>
<!-- 时间选择器 -->
<view v-if="showTimePicker" class="picker">
<view class="picker-modal picker-time">
<view class="picker-modal-header">
<text class="picker-modal-header-title">选择日期</text>
</view>
<picker-view class="picker-modal-time" indicator-class="picker-modal-time-item" :value="timeValue" @change="onTimeChange">
<picker-view-column>
<view v-for="(v,i) in 24" :key="i">{{i<10?'0'+i:i}}时</view>
</picker-view-column>
<picker-view-column>
<view v-for="(v,i) in 60" :key="i">{{i<10?'0'+i:i}}分</view>
</picker-view-column>
<picker-view-column v-if="showSeconds">
<view v-for="(v,i) in 60" :key="i">{{i<10?'0'+i:i}}秒</view>
</picker-view-column>
</picker-view>
<view class="picker-modal-footer">
<view class="picker-modal-footer-info">
<view class="picker-display">
<text>当前选择</text>
<text class="picker-display-text">{{PickerTimeTitle}}</text>
</view>
</view>
<view class="picker-modal-footer-btn">
<view class="picker-btn" :hover-stay-time="100" hover-class="picker-btn-active" @click="onCancelTime">取消</view>
<view class="picker-btn" :style="{color}" :hover-stay-time="100" hover-class="picker-btn-active" @click="onConfirmTime">确定</view>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
/**
* 工具函数库
*/
const DateTools = {
/**
* 获取公历节日
* @param date Date对象
*/
getHoliday(date) {
let holidays = {
'0101': '元旦',
'0214': '情人',
'0308': '妇女',
'0312': '植树',
'0401': '愚人',
'0501': '劳动',
'0504': '青年',
'0601': '儿童',
'0701': '建党',
'0801': '建军',
'0903': '抗日',
'0910': '教师',
'1001': '国庆',
'1031': '万圣',
'1224': '平安',
'1225': '圣诞'
};
let value = this.format(date, 'mmdd');
if (holidays[value]) return holidays[value];
return false;
},
/**
* 解析标准日期格式
* @param s 日期字符串
* @return 返回Date对象
*/
parse: s => new Date(s.replace(/(年|月|-)/g, '/').replace(/(日)/g, '')),
/**
* 比较日期是否为同一天
* @param a Date对象
* @param b Date对象
* @return Boolean
*/
isSameDay: (a, b) => a.getMonth() == b.getMonth() && a.getFullYear() == b.getFullYear() && a.getDate() == b.getDate(),
/**
* 格式化Date对象
* @param d 日期对象
* @param f 格式字符串
* @return 返回格式化后的字符串
*/
format(d, f) {
var o = {
"m+": d.getMonth() + 1,
"d+": d.getDate(),
"h+": d.getHours(),
"i+": d.getMinutes(),
"s+": d.getSeconds(),
"q+": Math.floor((d.getMonth() + 3) / 3),
};
if (/(y+)/.test(f))
f = f.replace(RegExp.$1, (d.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(f))
f = f.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return f;
},
/**
* 用于format格式化后的反解析
* @param s 日期字符串
* @param f 格式字符串
* @return 返回Date对象
*/
inverse(s, f) {
var o = {
"y": '',
"m": '',
"d": '',
"h": '',
"i": '',
"s": '',
};
let d = new Date();
if (s.length != f.length) return d;
for (let i in f)
if (o[f[i]] != undefined) o[f[i]] += s[i];
if (o.y) d.setFullYear(o.y.length < 4 ? (d.getFullYear() + '').substr(0, 4 - o.y.length) + o.y : o.y);
o.m && d.setMonth(o.m - 1, 1);
o.d && d.setDate(o.d - 0);
o.h && d.setHours(o.h - 0);
o.i && d.setMinutes(o.i - 0);
o.s && d.setSeconds(o.s - 0);
return d;
},
/**
* 获取日历数组(42天)
* @param date 日期对象或日期字符串
* @param proc 处理日历(和forEach类似),传递一个数组中的item
* @return Array
*/
getCalendar(date, proc) {
let it = new Date(date),
calendars = [];
it.setDate(1);
it.setDate(it.getDate() - ((it.getDay() == 0 ? 7 : it.getDay()) - 1)); //偏移量
for (let i = 0; i < 42; i++) {
let tmp = {
dateObj: new Date(it),
title: it.getDate(),
isOtherMonth: it.getMonth() < date.getMonth() || it.getMonth() > date.getMonth()
};
calendars.push(Object.assign(tmp, proc ? proc(tmp) : {}));
it.setDate(it.getDate() + 1);
}
return calendars;
},
/**
* 获取日期到指定的月份1号(不改变原来的date对象)
* @param d Date对象
* @param v 指定的月份
* @return Date对象
*/
getDateToMonth(d, v) {
let n = new Date(d);
n.setMonth(v, 1);
return n;
},
/**
* 把时间数组转为时间字符串
* @param t Array[时,分,秒]
* @param showSecinds 是否显示秒
* @return 字符串 时:分[:秒]
*/
formatTimeArray(t, s) {
let r = [...t];
if (!s) r.length = 2;
r.forEach((v, k) => r[k] = ('0' + v).slice(-2));
return r.join(':');
}
};
export default {
props: {
//颜色
color: {
type: String,
default: '#409eff'
},
//是否显示秒 针对type为datetime或time时生效
showSeconds: {
type: Boolean,
default: false
},
//初始的值
value: [String, Array],
//类型date time datetime range rangetime
type: {
type: String,
default: 'range'
},
//是否显示
show: {
type: Boolean,
default: false
},
//初始格式
format: {
type: String,
default: ''
},
//显示公历节日
showHoliday: {
type: Boolean,
default: true
},
//显示提示
showTips: {
type: Boolean,
default: false
},
//开始文案 针对type为范围选择时生效
beginText: {
type: String,
default: '开始'
},
//结束文案 针对type为范围选择时生效
endText: {
type: String,
default: '结束'
}
},
data() {
return {
isShow: false, //是否显示
isMultiSelect: false, //是否为多选
isContainTime: false, //是否包含时间
date: {}, //当前日期对象
weeks: ["一", "二", "三", "四", "五", "六", "日"],
title: '初始化', //标题
calendars: [[],[],[]], //日历数组
calendarIndex: 1, //当前日历索引
checkeds: [], //选中的日期对象集合
showTimePicker: false, //是否显示时间选择器
timeValue: [0, 0, 0], //时间选择器的值
timeType: 'begin', //当前时间选择的类型
beginTime: [0, 0, 0], //当前所选的开始时间值
endTime: [0, 0, 0], //当前所选的结束时间值
};
},
methods: {
//设置值
setValue(value) {
this.date = new Date();
this.checkeds = [];
this.isMultiSelect = this.type.indexOf('range') >= 0;
this.isContainTime = this.type.indexOf('time') >= 0;
//将字符串解析为Date对象
let parseDateStr = (str) => (this.format ? DateTools.inverse(str, this.format) : DateTools.parse(str));
if (value) {
if (this.isMultiSelect) {
Array.isArray(value) && value.forEach((dateStr, index) => {
let date = parseDateStr(dateStr);
let time = [date.getHours(), date.getMinutes(), date.getSeconds()];
if (index == 0) this.beginTime = time;
else this.endTime = time;
this.checkeds.push(date);
});
} else {
if (this.type == 'time') {
let date = parseDateStr('2019/1/1 ' + value);
this.beginTime = [date.getHours(), date.getMinutes(), date.getSeconds()];
this.onShowTimePicker('begin');
} else {
this.checkeds.push(parseDateStr(value));
if (this.isContainTime) this.beginTime = [
this.checkeds[0].getHours(),
this.checkeds[0].getMinutes(),
this.checkeds[0].getSeconds()
];
}
}
if (this.checkeds.length) this.date = new Date(this.checkeds[0]);
} else {
if (this.isContainTime) {
this.beginTime = [this.date.getHours(), this.date.getMinutes(), this.date.getSeconds()];
if (this.isMultiSelect) this.endTime = [...this.beginTime];
}
this.checkeds.push(new Date(this.date));
}
if (this.type != 'time') this.refreshCalendars(true);
else this.onShowTimePicker('begin');
},
//改变年份
onSetYear(value) {
this.date.setFullYear(this.date.getFullYear() + parseInt(value));
this.refreshCalendars(true);
},
//改变月份
onSetMonth(value) {
this.date.setMonth(this.date.getMonth() + parseInt(value));
this.refreshCalendars(true);
},
//时间选择变更
onTimeChange(e) {
this.timeValue = e.detail.value;
},
//设置时间选择器的显示状态
onShowTimePicker(type) {
this.showTimePicker = true;
this.timeType = type;
this.timeValue = type == 'begin' ? [...this.beginTime] : [...this.endTime];
},
//处理日历
procCalendar(item) {
//定义初始样式
item.statusStyle = {
opacity: 1,
color: item.isOtherMonth ? '#ddd' : '#000',
background: 'transparent'
};
item.bgStyle = {
type: '',
background: 'transparent'
};
item.dotStyle = {
opacity: 1,
background: 'transparent'
};
item.tips = "";
//标记今天的日期
if (DateTools.isSameDay(new Date(), item.dateObj)) {
item.statusStyle.color = this.color;
if (item.isOtherMonth) item.statusStyle.opacity = 0.3;
}
//标记选中项
this.checkeds.forEach(date => {
if (DateTools.isSameDay(date, item.dateObj)) {
item.statusStyle.background = this.color;
item.statusStyle.color = '#fff';
item.statusStyle.opacity = 1;
if (this.isMultiSelect && this.showTips) item.tips = this.beginText;
}
});
//节假日或今日的日期标点
if (item.statusStyle.background != this.color) {
let holiday = this.showHoliday ? DateTools.getHoliday(item.dateObj) : false;
if (holiday || DateTools.isSameDay(new Date(), item.dateObj)) {
item.title = holiday || item.title;
item.dotStyle.background = this.color;
if (item.isOtherMonth) item.dotStyle.opacity = 0.2;
}
} else {
item.title = item.dateObj.getDate();
}
//有两个日期
if (this.checkeds.length == 2) {
if (DateTools.isSameDay(this.checkeds[0], item.dateObj)) { //开始日期
item.bgStyle.type = 'bgbegin';
}
if (DateTools.isSameDay(this.checkeds[1], item.dateObj)) { //结束日期
if (this.isMultiSelect && this.showTips) item.tips = item.bgStyle.type ? this.beginText + ' / ' + this.endText : this.endText;
if (!item.bgStyle.type) { //开始日期不等于结束日期
item.bgStyle.type = 'bgend';
} else {
item.bgStyle.type = '';
}
}
if (!item.bgStyle.type && (+item.dateObj > +this.checkeds[0] && +item.dateObj < +this.checkeds[1])) { //中间的日期
item.bgStyle.type = 'bg';
item.statusStyle.color = this.color;
}
if (item.bgStyle.type) {
item.bgStyle.background = this.color;
item.dotStyle.opacity = 1;
item.statusStyle.opacity = 1;
}
}
},
//刷新日历
refreshCalendars(refresh = false) {
let date = new Date(this.date);
let before = DateTools.getDateToMonth(date, date.getMonth() - 1);
let after = DateTools.getDateToMonth(date, date.getMonth() + 1);
if (this.calendarIndex == 0) {
if(refresh) this.calendars.splice(0, 1, DateTools.getCalendar(date, this.procCalendar));
this.calendars.splice(1, 1, DateTools.getCalendar(after, this.procCalendar));
this.calendars.splice(2, 1, DateTools.getCalendar(before, this.procCalendar));
} else if (this.calendarIndex == 1) {
this.calendars.splice(0, 1, DateTools.getCalendar(before, this.procCalendar));
if(refresh) this.calendars.splice(1, 1, DateTools.getCalendar(date, this.procCalendar));
this.calendars.splice(2, 1, DateTools.getCalendar(after, this.procCalendar));
} else if (this.calendarIndex == 2) {
this.calendars.splice(0, 1, DateTools.getCalendar(after, this.procCalendar));
this.calendars.splice(1, 1, DateTools.getCalendar(before, this.procCalendar));
if(refresh) this.calendars.splice(2, 1, DateTools.getCalendar(date, this.procCalendar));
}
this.title = DateTools.format(this.date, 'yyyy年mm月');
},
//滑块切换
onSwiperChange(e) {
this.calendarIndex = e.detail.current;
let calendar = this.calendars[this.calendarIndex];
this.date = new Date(calendar[22].dateObj); //取中间一天,保证是当前的月份
this.refreshCalendars();
},
//选中日期
onSelectDate(date) {
if (~this.type.indexOf('range') && this.checkeds.length == 2) this.checkeds = [];
else if (!(~this.type.indexOf('range')) && this.checkeds.length) this.checkeds = [];
this.checkeds.push(new Date(date.dateObj));
this.checkeds.sort((a, b) => a - b); //从小到大排序
this.calendars.forEach(calendar => {
calendar.forEach(this.procCalendar); //重新处理
});
},
//时间选择取消
onCancelTime() {
this.showTimePicker = false;
this.type == 'time' && this.onCancel();
},
//时间选择确定
onConfirmTime() {
if (this.timeType == 'begin') this.beginTime = this.timeValue;
else this.endTime = this.timeValue;
this.showTimePicker = false;
this.type == 'time' && this.onConfirm();
},
//取消
onCancel() {
this.$emit('cancel', false);
},
//确定
onConfirm() {
let result = {
value: null,
date: null
};
//定义默认格式
let defaultFormat = {
'date': 'yyyy/mm/dd',
'time': 'hh:ii' + (this.showSeconds ? ':ss' : ''),
'datetime': ''
};
defaultFormat['datetime'] = defaultFormat.date + ' ' + defaultFormat.time;
let fillTime = (date, timeArr) => {
date.setHours(timeArr[0], timeArr[1]);
if (this.showSeconds) date.setSeconds(timeArr[2]);
};
if (this.type == 'time') {
let date = new Date();
fillTime(date, this.beginTime);
result.value = DateTools.format(date, this.format ? this.format : defaultFormat.time);
result.date = date;
} else {
if (this.isMultiSelect) {
let values = [],
dates = [];
if (this.checkeds.length < 2) return uni.showToast({
icon: 'none',
title: '请选择两个日期'
});
this.checkeds.forEach((date, index) => {
let newDate = new Date(date);
if (this.isContainTime) {
let time = [this.beginTime, this.endTime];
fillTime(newDate, time[index]);
}
values.push(DateTools.format(newDate, this.format ? this.format : defaultFormat[this.isContainTime ?
'datetime' : 'date']));
dates.push(newDate);
});
result.value = values;
result.date = dates;
} else {
let newDate = new Date(this.checkeds[0]);
if (this.isContainTime) {
newDate.setHours(this.beginTime[0], this.beginTime[1]);
if (this.showSeconds) newDate.setSeconds(this.beginTime[2]);
}
result.value = DateTools.format(newDate, this.format ? this.format : defaultFormat[this.isContainTime ?
'datetime' : 'date']);
result.date = newDate;
}
}
this.$emit('confirm', result);
}
},
computed: {
BeginTitle() {
let value = '未选择';
if (this.checkeds.length) value = DateTools.format(this.checkeds[0], 'yy/mm/dd');
return value;
},
EndTitle() {
let value = '未选择';
if (this.checkeds.length == 2) value = DateTools.format(this.checkeds[1], 'yy/mm/dd');
return value;
},
PickerTimeTitle() {
return DateTools.formatTimeArray(this.timeValue, this.showSeconds);
},
BeginTimeTitle() {
return this.BeginTitle != '未选择' ? DateTools.formatTimeArray(this.beginTime, this.showSeconds) : '';
},
EndTimeTitle() {
return this.EndTitle != '未选择' ? DateTools.formatTimeArray(this.endTime, this.showSeconds) : '';
}
},
watch: {
show(newValue, oldValue) {
newValue && this.setValue(this.value);
this.isShow = newValue;
},
value(newValue, oldValue) {
setTimeout(()=>{
this.setValue(newValue);
}, 0);
}
}
}
</script>
<style lang="scss" scoped>
$z-index: 100;
$cell-spacing: 20upx;
$calendar-size: 630upx;
$calendar-item-size: 90upx;
.picker {
position: fixed;
z-index: $z-index;
background: rgba(255, 255, 255, 0);
left: 0;
top: 0;
width: 100%;
height: 100%;
font-size: 28upx;
&-btn {
padding: $cell-spacing*0.5 $cell-spacing;
border-radius: 12upx;
color: #666;
&-active {
background: rgba(0, 0, 0, .1);
}
}
&-display {
color: #666;
&-text {
color: #000;
margin: 0 $cell-spacing*0.5;
}
&-link {
display: inline-block;
&-active {
background: rgba(0, 0, 0, .1);
}
}
}
&-time {
width: $calendar-size - 80upx !important;
left: ((750upx - $calendar-size) / 2 + 40upx) !important;
}
&-modal {
background: #fff;
position: absolute;
top: 50%;
left: (750upx - $calendar-size) / 2;
width: $calendar-size;
transform: translateY(-50%);
box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.1);
border-radius: 12upx;
&-header {
text-align: center;
line-height: 80upx;
font-size: 32upx;
&-title {
display: inline-block;
width: 40%;
}
.picker-icon {
display: inline-block;
line-height: 50upx;
width: 50upx;
height: 50upx;
border-radius: 50upx;
text-align: center;
margin: 10upx;
background: #fff;
font-size: 36upx;
&-active {
background: rgba(0, 0, 0, .1);
}
}
}
&-body {
width: $calendar-size !important;
height: $calendar-size !important;
position: relative;
}
&-time {
width: 100%;
height: 180upx;
text-align: center;
line-height: 60upx;
}
&-footer {
display: flex;
justify-content: space-between;
align-items: center;
padding: $cell-spacing;
&-info {
flex-grow: 1;
}
&-btn {
flex-shrink: 0;
display: flex;
}
}
}
&-calendar {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
display: flex;
align-items: center;
flex-wrap: wrap;
&-view {
position: relative;
width: $calendar-item-size;
height: $calendar-item-size;
text-align: center;
&-bgbegin,
&-bg,
&-bgend,
&-item,
&-dot,
&-tips {
position: absolute;
transition: .2s;
}
&-bgbegin,
&-bg,
&-bgend {
opacity: .15;
height: 80%;
}
&-bg {
left: 0;
top: 10%;
width: 100%;
}
&-bgbegin {
border-radius: $calendar-item-size 0 0 $calendar-item-size;
top: 10%;
left: 10%;
width: 90%;
}
&-bgend {
border-radius: 0 $calendar-item-size $calendar-item-size 0;
top: 10%;
left: 0%;
width: 90%;
}
&-item {
left: 5%;
top: 5%;
width: 90%;
height: 90%;
border-radius: $calendar-item-size;
display: flex;
align-items: center;
justify-content: center;
}
&-dot {
right: 10%;
top: 10%;
width: 12upx;
height: 12upx;
border-radius: 12upx;
}
&-tips {
bottom: 100%;
left: 50%;
transform: translateX(-50%);
background: #4E4B46;
color: #fff;
border-radius: 12upx;
padding: 10upx 20upx;
font-size: 24upx;
width: max-content;
margin-bottom: 5px;
pointer-events: none;
&:after {
content: "";
position: absolute;
top: 100%;
left: 50%;
transform: translateX(-50%);
width: 0;
height: 0;
border-style: solid;
border-width: 5px 5px 0 5px;
border-color: #4E4B46 transparent transparent transparent;
}
}
}
}
}
@font-face {
font-family: "mxdatepickericon";
src: url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAMYAAsAAAAACBgAAALMAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDIgqDRIJiATYCJAMUCwwABCAFhG0HSRvfBsg+QCa3noNAyAQ9w6GDvbwpNp2vloCyn8bD/x+y+/5qDhtj+T4eRVEcbsCoKMFASzCgLdDkmqYDwgxkWQ6YH5L/YnppOlLEjlnter43YRjU7M6vJ3iGADVAgJn5kqjv/wEii23T86UsAQT+04fV+o97VTMx4PPZt4DlorLXwIQiGMA5uhaVrBWqGHfQXcTEiE+PE+g2SUlxWlLVBHwUYFMgrgwSB3wstTKSGzqF1nOyiGeeOtNjV4An/vvxR58PSc3AzrMViyDvPo/7dVEUzn5GROfIWAcU4rLXfMFdhte56y4We9gGNEVIezkBOOaQXUrbTf/hJVkhGpDdCw7dSOEzByMEn3kIic98hMxnAfeFPKWCbjRcA148/HxhCEkaA94eGWFaGolsblpaWz8/Po2WVuNHh1fmBpZHIpqal9fOjizhTteY+RZ9rv02I/pq0W6QVH3pSncBz3m55r9ZIPycHfmenvxe4uyutIgfT5u4bgkDusl9gcF0rnfnz+b2NpSaQWBFeu8GIL1xQj5AH/6FAsEr/50F28e/gA9ny6KjLrxIp0TE+UucmQOl5AFNLXkzZufWamWHYEI39PEP2If97CMdm51N6DSmIekwAVmneXTBr0PVYx+aTgfQbU3p+R4jKHdRurBq0oEw6AKSfm+QDbpGF/w3VOP+oBnMHbqdx409FjP4RRHHkAj5IWgQiBUjHfMTuQ1Icpg5avI4sQVRu8EHdWptM1aKrIjuscfeL+kZwxBTYoElztOQ2UygjRIjEphaZsyWodHgvm9SC8QC/JygEA6DiCDeEMhAQFhhOpvxa/18A0TiYMahIy0L2hYIZWeYH9JR085Al4qts1re5St2/SR6DINBGEVYQCWOETHDMAHZ+pcZIQJGTV4RtMmg8UbhuWL1+VLLA2RFHYC71kiRo0SNpjwQh8pj2EFU3oTNmS1WqgIA') format('woff2');
}
.picker-icon {
font-family: "mxdatepickericon" !important;
}
.picker-icon-you:before {
content: "\e63e";
}
.picker-icon-zuo:before {
content: "\e640";
}
.picker-icon-zuozuo:before {
content: "\e641";
}
.picker-icon-youyou:before {
content: "\e642";
}
</style>
@@ -0,0 +1,166 @@
<template>
<view>
<u-popup :show="show" @close="cancel">
<view class="title">{{popupTitle}}</view>
<view style="padding: 20rpx;">
<u-search v-if="showSearch" @custom="search" @search="search" :placeholder="placeholder"
v-model="keyword"></u-search>
<u-gap v-if="showSearch" height="15"></u-gap>
<scroll-view :scroll-top="scrollTop" scroll-y="true" class="scroll-Y" @scrolltolower="$emit('lower')">
<!--单选-->
<u-radio-group v-if="type == 'radio'" :borderBottom="true" iconPlacement="right" placement="column"
@change="groupChange" v-model="radioValue">
<u-radio :customStyle="{marginBottom: '12px'}" v-for="(item, index) in dataLists" :key="index"
:label="item[name]" :name="index">
</u-radio>
</u-radio-group>
<!--多选-->
<u-checkbox-group v-if="type == 'checkbox'" :borderBottom="true" placement="column"
iconPlacement="right" @change="checkboxChange" v-model="checkboxValue">
<u-checkbox :customStyle="{marginBottom: '12px',paddingBottom:'12px'}"
v-for="(item, index) in dataLists" :key="index" :label="item[name]" :name="index">
</u-checkbox>
</u-checkbox-group>
</scroll-view>
<u-gap height="45"></u-gap>
<view class="bottons">
<u-row>
<u-col customStyle="padding:0 10rpx 20rpx 20rpx" span="6">
<u-button @click="cancel">取消</u-button>
</u-col>
<u-col customStyle="padding:0 20rpx 20rpx 10rpx" span="6">
<u-button @click="submit" type="primary" throttleTime="1000" :disabled="(JSON.stringify(radioData) === '{}') && (checkboxData.length === 0)">确认</u-button>
</u-col>
</u-row>
</view>
</view>
</u-popup>
</view>
</template>
<script>
/**
* 公共选择下拉框,基于uview。支持下拉加载、列表搜索、单选|多选
* @author qianziyu
* @description 弹出层选择器,基于uview中u-popup实现
* @property {Array} dataLists 数据列表
* @property {String} name 列表显示的字段名
* @property {Boolean} show 是否展示弹窗 (默认 false )
* @property {String} type 选择类型 单选|多选 (默认 单选 )
* @property {Boolean} showSearch 是否显示搜索框 (默认 true )
* @property {String} popupTitle 列表标题
* @property {String} placeholder 搜索框placeholder
* @event {Function} search 搜索事件,返回keyword
* @event {Function} lower 滑动到底部触发,用于下拉加载新数据
* @event {Function} cancel 组件关闭事件
* @event {Function} submit 提交按钮,返回选中的列表数据
* @example <common-select :show="show" :popupTitle="popupTitle" @cancel="show=false" @search="selectSearch" name="cworkStationName" @submit="onsubmit"
:dataLists="dataLists" placeholder="输入工站名称搜索"></common-select>
*/
export default {
name: "qianziyu-select",
props: {
dataLists: {
default: {},
type: Array
},
name: {
default: 'name',
},
show: {
default: false,
type: Boolean
},
type: {
default: 'radio',
type: String
},
showSearch: {
default: true,
type: Boolean
},
popupTitle: {
default: '列表选择',
type: String
},
placeholder: {
default: '请输入搜索内容'
}
},
data() {
return {
keyword: '',
scrollTop: 0,
checkboxData: [],
checkboxValue:[],
radioData: {},
radioValue: ''
};
},
methods: {
checkboxChange(n) {
this.checkboxData=[]
n.forEach(key=>{
this.checkboxData.push(this.dataLists[key])
})
},
//选择列表项触发
groupChange(n) {
this.radioData = this.dataLists[n]
},
//点击搜索触发
search() {
this.$emit('search', this.keyword)
},
//点击取消按钮触发
cancel() {
this.$emit('cancel')
},
//提交触发
submit() {
if (this.type == 'radio') {
if (JSON.stringify(this.radioData) == '{}') {
uni.$u.toast('请选择数据')
return;
}
this.$emit('submit', this.radioData)
} else if (this.type == 'checkbox') {
if (this.checkboxData.length == 0) {
uni.$u.toast('请选择数据')
return;
}
this.$emit('submit', this.checkboxData)
}
}
}
}
</script>
<style lang="scss" scoped>
.u-popup {
.title {
border-bottom: 1px solid #f7f7f7;
padding: 20rpx;
text-align: center;
font-weight: bold;
}
}
.scroll-Y {
height: 650rpx;
}
.bottons {
background-color: white;
position: fixed;
left: 0;
bottom: 0;
right: 0;
bottom: constant(safe-area-inset-bottom);
bottom: env(safe-area-inset-bottom);
}
</style>
+129
View File
@@ -0,0 +1,129 @@
<template>
<view style="background-color: #FFFFFF;">
<view class="searchContent">
<view class="searchBox">
<u-icon class="uIcon" name="search"></u-icon>
<u-icon v-if="searchValue" name="close-circle-fill" @click="searchValue = ''" class="uIcon closeSearch"></u-icon>
<input :placeholder="placeholderStr" v-model="searchValue" confirm-type="search" class="searchInput" :focus="inputFocus" @confirm="searchFun"></input>
<view v-if="btnStr != 'AGV'" class="searchBtn searchBtnA" @click="searchFun">{{btnStr}}</view>
<!-- <view v-else class="searchBtn">搜索</view> -->
</view>
</view>
</view>
</template>
<script>
export default {
props: {
placeholderStr: {
type: String,
default: '请输入搜索内容'
},
btnStr: {
type: String,
default: '搜索'
},
inputFocus: {
type: Boolean,
default: false
},
svProp: {
type: String,
default: ''
}
},
data() {
return {
searchValue: ''
}
},
created() {
if(this.svProp) {
this.searchValue = this.svProp;
}
},
methods: {
searchFun: function() {
this.$emit('searchViewClickFun', this.searchValue)
if(this.btnStr == '添加') {
this.searchValue = ''
}
},
scanIconClickFun: function() {
uni.scanCode({
success: (res) => {
this.searchValue = res.result;
this.searchFun();
}
})
}
}
}
</script>
<style>
.searchContent {
display: flex;
align-items: center;
width: 686rpx;
height: 100rpx;
margin-left: 32rpx;
}
.searchBox {
width: 686rpx;
height: 66rpx;
margin: 16rpx 0;
box-sizing: border-box;
border-radius: 31rpx;
background-color: #eeeded;
display: flex;
align-items: center;
font-size: 15px;
overflow: hidden;
position: relative;
}
.closeSearch {
position: absolute;
right: 128rpx;
}
.searchInput {
width: 440rpx;
padding: 0;
height: 50rpx !important;
min-height: 50rpx !important;
line-height: 50rpx !important;
font-size: 14px;
margin-left: 16rpx;
}
.searchBox>.uIcon {
width: 50rpx;
height: 50rpx;
padding: 16rpx;
}
.searchBtn {
position: absolute;
right: 0;
width: 108rpx;
height: 100%;
line-height: 66rpx;
text-align: center;
color: #fff;
background-image: linear-gradient(to right, #a0b1c0, #858891);
}
.searchBtn:active {
background-image: linear-gradient(to right, #858891, #a0b1c0);
}
.searchBtnA {
background-image: linear-gradient(to right, #3b9dec, #4471ed);
}
.searchBtnA:active {
background-image: linear-gradient(to right, #4471ed, #3b9dec);
}
</style>
+231
View File
@@ -0,0 +1,231 @@
<template>
<view class="SkelttionBox">
<!-- 首页的骨架屏 start -->
<view v-if="SkelttionType=='index'" class="SkelttionIndexBox">
<view v-for="(item, index) in 2" :key="index" class="cardList">
<view class="grxinxi">
<view class="tx"></view>
<view class="grms">
<view></view>
<view></view>
</view>
</view>
<view class="wenben"></view>
<view class="wenben"></view>
<view class="imgList">
<view class="imgView" :class="index == 1 ? 'imgView1' : ''" v-for="(ooo, iii) in 4 * (index + 1)" :key="iii"></view>
</view>
<view class="bbList">
<view class="bbbtn" v-for="(item, index) in 4" :key="index"></view>
</view>
</view>
</view>
<!-- 分类 start -->
<view v-else-if="SkelttionType=='classify'" class="SkelttionClassify">
<view class="ClassifyRight">
<view class="htCard" v-for="(items,indexs) in 10" :key="indexs">
<view class="imgCard"></view>
<view class="contentBox">
<view></view>
<view></view>
</view>
<view class="btn"></view>
</view>
</view>
</view>
<!-- 分类 end -->
<!--msg-->
<view v-else-if="SkelttionType == 'msg'" class="SkelttionIndexBox">
<view v-for="(item, index) in 12" :key="index" class="cardList" style="border-width: 0;">
<view class="grxinxi">
<view class="tx"></view>
<view class="grms">
<view></view>
<view></view>
</view>
</view>
<view class="wenben"></view>
<view class="itemWenben"></view>
<view style="border-bottom: 4rpx solid #f2f2f2; margin-top: 12rpx;width: 96%;"></view>
</view>
</view>
</view>
</template>
<script>
export default {
props: {
SkelttionType: {
type: String,
default: 'index'
}
},
data() {
return {
}
},
methods: {
}
}
</script>
<style lang="scss" scoped>
// #f3f4f6
.SkelttionBox,
.SkelttionProuctBox,
.SkelttionMember {
width: 100vw;
display: flex;
flex-direction: column;
align-items: center;
background: #fff;
}
// 首页骨架屏start
.SkelttionIndexBox {
width: 100%;
.cardList {
width: 100%;
padding: 20rpx 26rpx;
box-sizing: border-box;
border-bottom: 16px solid #f2f2f2;
}
.grxinxi {
display: flex;
align-items: center;
margin-bottom: 8px;
position: relative;
}
.tx {
width: 88rpx;
height: 88rpx;
border-radius: 50%;
margin-right: 8px;
background-color: #f2f2f2;
}
.grms {
width: 320rpx;
height: 100%;
display: flex;
flex-direction: column;
justify-content: space-between;
view {
background-color: #F2F2F2;
height: 28rpx;
}
view:last-child {
margin-top: 16rpx;
}
}
.wenben {
width: 96%;
height: 26rpx;
background-color: #F2F2F2;
margin-bottom: 12rpx;
}
.itemWenben {
width: 96%;
height: 88rpx;
background-color: #F2F2F2;
}
.imgList {
width: 100%;
display: flex;
flex-wrap: wrap;
}
.imgView {
width: 224rpx;
height: 224rpx;
margin-right: 10rpx;
border-radius: 10rpx;
background-color: #F2F2F2;
margin-bottom: 10rpx;
}
.imgView1 {
width: 220rpx;
}
.bbList {
margin-top: 20rpx;
display: flex;
justify-content: space-between;
.bbbtn {
width: 81rpx;
height: 44rpx;
border-radius: 4rpx;
background-color: #F2F2F2;
}
}
}
// 首页骨架屏end
// 分类骨架屏 start
.SkelttionClassify {
width: 100vw;
height: 100vh;
display: flex;
justify-content: space-between;
.ClassifyRight {
width: 590rpx;
height: 100%;
background: rgba(244, 244, 245, 0.4);
box-sizing: border-box;
padding: 40rpx 20rpx;
.htCard {
width: 100%;
display: flex;
align-items: center;
border-bottom: 1rpx solid #ececec;
padding: 20rpx 0;
position: relative;
background-color: #FFFFFF;
.imgCard {
width: 100rpx;
height: 100rpx;
overflow: hidden;
border-radius: 12rpx;
background-color: #F2F2F2;
margin-right: 26rpx;
}
.contentBox {
width: 280rpx;
height: 100%;
}
.contentBox>view {
background-color: #F2F2F2;
height: 30rpx;
}
.contentBox>view:last-child {
margin-top: 16rpx;
}
.btn {
width: 100rpx;
height: 56rpx;
background-color: #F2F2F2;
border-radius: 28rpx;
position: absolute;
right: 14rpx;
bottom: 40rpx;
}
}
}
}
// 分类骨架屏 end
</style>
+626
View File
@@ -0,0 +1,626 @@
<template>
<view>
<view class="topSxRow">
<u-dropdown ref="uDropdown" class="bgWhite" duration="200" @open="dropdownOpenFun"
@close="dropdownCloseFun">
<u-dropdown-item v-model="value1" :title="label1" :options="options1"
@change="dropdownChange"></u-dropdown-item>
<u-dropdown-item v-if="dropdown2" v-model="value2" :title="label2" :options="options2" height="666"
@change="dropdownChange" class="whiteNoWrap"></u-dropdown-item>
<u-dropdown-item v-if="isPaiXu" title="排序"></u-dropdown-item>
<u-dropdown-item v-if="isSxShow" title="筛选"></u-dropdown-item>
</u-dropdown>
<navigator v-if="searchUrl" :url="searchUrl" class="topSearchView">
<u-icon name="search" size="36" color="#666666"></u-icon>
</navigator>
<view v-else class="topSearchView" @click="searchShow = true">
<u-icon name="search" size="36" color="#666666"></u-icon>
</view>
</view>
<!--侧边栏弹窗-->
<u-popup v-model="popupShow" width="568rpx" mode="right" border-radius="14" :safe-area-inset-bottom="true"
@close="popupCloseFun">
<view v-if="isKhShow && dropdownNum == 2" class="popupCard">
<view class="popupTitle">客户名称:</view>
<view v-if="selectKhList.length == 0" class="kehuRow" @click="selectKhShowFun">选择客户</view>
<view v-else class="kehuRow" @click="selectKhShowFun">已选<text class="greenColor">{{selectKhList.length}}</text>条数据</view>
</view>
<view class="popupCard" v-for="(obj, index) in sxArr" :key="index">
<view class="popupTitle">{{obj.title}}</view>
<view class="popupItem">
<view v-for="(item, iii) in obj.arr" :key="iii"
:class="{activeClass: obj.current === iii, mr0: (iii+1) % 3 == 0 }" class="itemCard"
@click="sxItemClickFun(index, iii)">
<view v-if="item == '自定义'">{{item}}</view>
<view v-else>{{item}}</view>
</view>
</view>
<view v-if="obj.current === obj.arr.length - 1 && obj.isDate" class="dateRow">
<picker mode="date" :value="obj.startDate" start="1999-01-01" end="2199-12-30"
@change="bindStartDateChange" @click="startIndex = index">
<view class="DateInput">{{obj.startDate}}</view>
</picker>
<view class="marLR16">~</view>
<picker mode="date" :value="obj.endDate" start="1999-01-01" end="2199-12-30"
@change="bindEndDateChange" @click="endIndex = index">
<view class="DateInput">{{obj.endDate}}</view>
</picker>
</view>
<view class="flexJs" v-if="obj.judge">
<text>等于</text>
<u-icon name="arrow-right"></u-icon>
</view>
</view>
<view class="h200"></view>
<view class="popupBottomBtn">
<view class="popupBtn warning" @click="resetFun">重置</view>
<view class="popupBtn primary" @click="confirmFun">确定</view>
</view>
</u-popup>
<!--搜索弹窗-->
<u-popup v-model="searchShow" mode="center" width="666rpx" border-radius="14" :closeable="false">
<view class="searchBox">
<view class="searchTitle">搜索</view>
<u-field v-if="searchLabel1" v-model="searchValue1" :label="searchLabel1" :placeholder="searchPh1"
clear-size="40"></u-field>
<u-field v-if="searchLabel2" v-model="searchValue2" :label="searchLabel2" :placeholder="searchPh2"
clear-size="40"></u-field>
<view class="searchBtnRow">
<u-button type="warning" class="searchBtn" :ripple="true" ripple-bg-color="#909399" :plain="true" size="medium" @click="searchShow = false">取消</u-button>
<u-button type="primary" class="searchBtn" :ripple="true" ripple-bg-color="#909399" :plain="true" size="medium" @click="searchBoxFun">确认</u-button>
</view>
</view>
</u-popup>
<!--客户查询弹窗-->
<u-popup v-model="khPopupShow" width="568rpx" mode="right" border-radius="14" :safe-area-inset-bottom="true"
@close="khPopupShow = false">
<view class="popupCard">
<view class="popupTitle">选择客户(已选
<text v-if="selectKhList.length == 0">0</text>
<text v-else class="greenColor">{{selectKhList.length}}</text>
条)</view>
<u-search placeholder="请输入客户名称搜索" v-model="keyword" :animation="true" @search="searchKhBtnFun" @custom="searchKhBtnFun"></u-search>
</view>
<scroll-view scroll-y="true" class="khScrollView" @scrolltolower="searchKhFun">
<u-checkbox-group @change="checkboxGroupChange" :wrap="true" class="checkBoxGroup">
<u-checkbox class="popupCard" v-model="item.checked" v-for="(item, index) in khList" :key="item._id" :name="item._id">{{item.clientName}}</u-checkbox>
</u-checkbox-group>
</scroll-view>
<view class="popupBottomBtn">
<view class="popupBtn warning" @click="resetKehuFun">重置</view>
<view class="popupBtn primary" @click="khPopupShow = false">确定</view>
</view>
</u-popup>
</view>
</template>
<script>
let that = '';
import {
getDayByNumFun,
getWeekFun,
getDayFun,
getMonthFun,
getSZDateFun,
lastMonthFun
} from '../../static/utils/date.js'
import { crmKeHuApi } from '../../static/utils/api.js'
export default {
props: {
pageType: {
type: String,
default: ''
},
options1: {
type: Array,
default: () => []
},
options2: {
type: Array,
default: () => []
},
optionsSx: {
type: Array,
default: () => []
},
optionsPx: {
type: Array,
default: () => []
},
dropdown1: '',
dropdown2: '',
searchUrl: '',
isSxShow: { // 是否显示筛选
type: Boolean,
default: false
},
isPaiXu: { // 是否是排序
type: Boolean,
default: false
},
isDuoXuan: { // 控制是否多选操作
type: Boolean,
default: false
},
isKhShow: { // 是否显示客户搜索功能
type: Boolean,
default: false
},
searchLabel1: '',
searchLabel2: '',
searchPh1: '',
searchPh2: '',
isDbDate: false
},
watch: {
dropdown1: function(val, oldVal) {
that.label1 = val;
},
dropdown2: function(val, oldVal) {
that.label2 = val;
},
optionsSx: function(val, oldVal) {
this.sxArr = val;
},
optionsPx: function(val, oldVal) {
this.sxArr = val;
},
isDbDate: function(val, oldVal) {
console.log(val, oldVal)
}
},
data() {
return {
label1: '',
label2: '',
value1: 0,
value2: 0,
sxArr: [],
popupShow: false,
searchShow: false,
khPopupShow: false,
dropdownNum: 0,
startIndex: '',
endIndex: '',
myStartDate: '',
myEndDate: '',
mySTime: '',
myETime: '',
searchValue1: '',
searchValue2: '',
clientName: '',
clientId: '',
keyword: '',
khPageIndex: 1,
khList: [],
khIsMore: true,
selectKhList: []
}
},
created() {
that = this;
},
mounted() {
that.label1 = that.dropdown1;
that.label2 = that.dropdown2;
},
methods: {
//下拉菜单被打开时触发
dropdownOpenFun: function(e) {
that.dropdownNum = e;
if (e == 2 && that.isSxShow) {
that.popupShow = true;
that.sxArr = that.optionsSx;
}
if (e == 1 && that.isPaiXu) {
that.popupShow = true;
that.sxArr = that.optionsPx;
}
if (this.pageType == 'fujin') {
this.$emit('clickDropDownFun');
}
},
dropdownCloseFun: function(e) {
if (this.pageType == 'fujin') {
this.$emit('closeDropDownFun');
}
},
//弹出层收起
popupCloseFun: function() {
that.$refs.uDropdown.close();
},
// 下拉菜单选中回调
dropdownChange: function(e) {
console.log(e)
if (that.dropdownNum == 0) {
that.label1 = that.options1[e].label;
that.value1 = e;
that.$emit('dropDownFun1', that.options1[e]);
} else if (that.dropdownNum == 1) {
that.label2 = that.options2[e].label;
that.value2 = e;
that.$emit('dropDownFun2', that.options2[e]);
}
},
// 筛选项点击方法
sxItemClickFun: function(index, iii) {
let item = that.sxArr[index];
let list = that.sxArr;
if (that.dropdownNum == 2 && that.isDuoXuan) {
} else {
for (var i = 0; i < list.length; i++) {
if (i != index) {
list[i].current = '';
}
}
}
if (item.current === iii) {
item.current = '';
} else {
item.current = iii;
if (item.isDate == 1) {
if (item.current == item.arr.length - 1) {
let dateArr = getDayByNumFun(30, true);
item.sTime = dateArr[0];
item.eTime = dateArr[1];
item.startDate = dateArr[2];
item.endDate = dateArr[3];
} else {
let dateArr = that.setDateFun(iii);
item.sTime = dateArr[0];
item.eTime = dateArr[1];
}
} else if(item.isDate == 2) {
if (item.current == item.arr.length - 1) {
let dateArr = getDayByNumFun(-10, true);
item.sTime = dateArr[1];
item.eTime = dateArr[0];
item.startDate = dateArr[3];
item.endDate = dateArr[2];
} else {
let dateArr = that.setDateFun1(iii);
item.sTime = dateArr[1];
item.eTime = dateArr[0];
}
}
}
that.$set(that.sxArr, index, item)
},
// 重置筛选项方法
resetFun: function() {
let list = that.sxArr;
for (var i = 0; i < list.length; i++) {
list[i].current = '';
}
that.sxArr = list;
},
// 确定筛选项方法
confirmFun: function() {
that.popupShow = false;
that.$refs.uDropdown.close();
if (that.dropdownNum == 2) {
if(that.isKhShow) {
that.$emit('optionSxFun', {
arr: that.sxArr,
selectKhList: that.selectKhList
});
} else {
that.$emit('optionSxFun', that.sxArr);
}
} else {
that.$emit('optionPxFun', that.sxArr);
}
},
// 日期回调函数
bindStartDateChange: function(e) {
let item = that.sxArr[that.startIndex];
item.startDate = e.detail.value;
item.sTime = new Date(e.detail.value + ' 00:00:00').getTime();
that.$set(that.sxArr, that.startIndex, item);
},
bindEndDateChange: function(e) {
let item = that.sxArr[that.endIndex];
item.endDate = e.detail.value;
item.eTime = new Date(e.detail.value + ' 00:00:00').getTime();
that.$set(that.sxArr, that.endIndex, item);
},
// 日期处理函数
setDateFun: function(i) {
let dateArr = [];
if (i == 0) {
dateArr = getDayFun();
} else if (i == 1) {
dateArr = getDayByNumFun(1)
} else if (i == 2) {
dateArr = getWeekFun();
} else if (i == 3) {
dateArr = getSZDateFun();
} else if (i == 4) {
dateArr = getMonthFun();
} else if (i == 5) {
dateArr = lastMonthFun();
} else if (i == 6) {
dateArr = getDayByNumFun(7);
} else if (i == 7) {
dateArr = getDayByNumFun(90);
}
return dateArr
},
// 日期处理函数
setDateFun1: function(i) {
let dateArr = [];
if (i == 0) {
dateArr = getDayByNumFun(-1)
} else if (i == 1) {
dateArr = getDayByNumFun(-3)
} else if (i == 2) {
dateArr = getDayByNumFun(-7)
} else if (i == 3) {
dateArr = getDayByNumFun(-15)
} else if (i == 4) {
dateArr = getDayByNumFun(-30)
}
return dateArr
},
// 搜索处理函数
searchBoxFun: function() {
that.searchShow = false;
that.$emit('searchBoxEmitFun', {
searchValue1: that.searchValue1,
searchValue1: that.searchValue1
});
},
// 选择客户展示
selectKhShowFun: function() {
that.khPopupShow = true;
if(that.khList.length == 0) {
that.searchKhFun()
}
},
// 查询客户按钮
searchKhBtnFun: function() {
that.khIsMore = true;
that.khPageIndex = 1;
that.searchKhFun();
},
// 查询客户
searchKhFun: function() {
if (!that.khIsMore) {
return
}
uni.showLoading({
title: '加载中...',
mask: true
})
let reqObj = {
pageIndex: that.khPageIndex,
sortObj: {
update_date: 1
},
searchValue: that.keyword
}
let reqData = {
action: 'selectKhNameId',
params: reqObj
}
crmKeHuApi(reqData)
.then(res => {
let data = res.result.data
if (that.khPageIndex == 1) {
that.khList = [];
}
if (data.length == 20) {
that.khPageIndex += 1;
that.khIsMore = true;
} else {
that.khIsMore = false;
}
that.khList = that.khList.concat(data);
})
},
// 选中任一checkbox时,由checkbox-group触发
checkboxGroupChange: function(e) {
that.selectKhList = e;
},
// 重置客户
resetKehuFun: function() {
let list = that.khList;
for(var i = 0; i < list.length; i++) {
list[i].checked = false;
}
that.selectKhList = [];
that.khList = list;
},
}
}
</script>
<style>
.topSxRow {
display: flex;
align-items: center;
border-bottom: 1rpx solid #F8F8F8;
}
.topSearchView {
width: 100rpx;
background-color: #FFFFFF;
height: 80rpx;
display: flex;
align-items: center;
padding-left: 20rpx;
box-sizing: border-box;
}
/*************************弹窗层******************************/
.popupCard {
width: 100%;
padding: 26rpx 16rpx;
border-bottom: 1rpx solid #efefef;
}
.popupTitle {
font-size: 16px;
font-weight: bold;
margin-bottom: 26rpx;
}
.popupItem {
font-size: 15px;
color: #666666;
display: flex;
align-items: center;
flex-wrap: wrap;
}
.itemCard {
width: 160rpx;
height: 66rpx;
text-align: center;
background-color: #e6e6e6;
margin-bottom: 26rpx;
border-radius: 16rpx;
margin-right: 28rpx;
overflow: hidden;
}
.itemCard>view {
height: 100%;
line-height: 66rpx;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.itemCard:nth-child(3),
.mr0 {
margin-right: 0 !important;
}
.flexJs {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
}
.popupBottomBtn {
width: 100%;
height: 100rpx;
background-color: #FFFFFF;
display: flex;
align-items: center;
position: fixed;
bottom: 0;
font-size: 15px;
}
.settingView {
width: 128rpx;
height: 100% !important;
display: flex;
align-items: center;
justify-content: center;
}
.popupBtn {
width: 50%;
height: 100% !important;
line-height: 100rpx;
text-align: center;
color: #FFFFFF;
border-radius: 0 !important;
}
.activeClass {
background-image: linear-gradient(45deg, #007AFF, #00aaff);
color: #FFFFFF;
}
.u-dropdown__menu__item {
white-space: nowrap !important;
}
.dateRow {
display: flex;
align-items: center;
}
.DateInput {
border: 1rpx solid #DEDEDE;
padding: 10rpx 26rpx;
border-radius: 8rpx;
}
.marLR16 {
margin: 0 16rpx;
}
.uni-picker-container .uni-picker-custom {
z-index: 888888 !important;
}
.u-drawer {
z-index: 998 !important;
}
.searchBox {
padding: 16rpx 26rpx;
}
.searchTitle {
width: 100%;
border-bottom: 1rpx solid #DDDDDD;
font-size: 16px;
font-weight: bold;
text-align: center;
padding-bottom: 16rpx;
}
.searchBtnRow {
margin: 26rpx 0 16rpx 0;
display: flex;
align-items: center;
justify-content: space-around;
}
.searchBtn {
width: 200rpx;
height: 66rpx;
}
.u-field {
font-size: 15px !important;
}
.kehuRow {
width: 100%;
height: 66rpx;
line-height: 66rpx;
text-align: center;
background-color: #e6e6e6;
margin-bottom: 16rpx;
border-radius: 16rpx;
}
.khScrollView {
width: 100%;
height: calc(100vh - 145px);
}
.checkBoxGroup {
margin-bottom: 100rpx;
}
.warning {
background-color: #ff9900;
}
.warning:active {
background-color: #ffaa00;
}
.primary {
background-color: #2979ff;
}
.primary:active {
background-color: #55aaff;
}
</style>
+129
View File
@@ -0,0 +1,129 @@
<template>
<view class="tishi">
<u-popup v-model="show" border-radius="26" mode="center" :mask-close-able="false" length="60%">
<view class="popupClass">
<view class="popupTitle">上传进度:{{percent}}%</view>
<u-image class="popupImg" width="100%" height="300rpx" :src="showImg"></u-image>
<u-line-progress class="progress" height="36" active-color="#2979ff" :percent="percent">
</u-line-progress>
</view>
</u-popup>
</view>
</template>
<script>
let _self = ''
export default {
props: {
ppList: {
type: Array,
default: () => []
},
ppUrls: {
type: Array,
default: () => []
},
imgType: {
type: String,
default: 'product'
}
},
data() {
return {
show: true,
percent: 0,
urls: [],
index: 0,
showImg: ''
}
},
async created() {
_self = this;
let ppUrls = _self.ppUrls;
let ppList = _self.ppList;
let arr = ppUrls;
for (var i = ppUrls.length; i < ppList.length; i++) {
_self.index = i;
_self.showImg = ppList[i].url;
let obj = await _self.uploadImgFun(ppList[i].url)
arr.push(obj);
}
_self.$emit('confirmPopupFun', arr);
},
methods: {
uploadImgFun: function(path) {
return new Promise(reslove => {
let date = new Date();
let typeSrc = '.png';
let xxx = path.lastIndexOf(".");
typeSrc = path.substring(xxx, path.length);
const result = uniCloud.uploadFile({
filePath: path,
cloudPath: 'image/' + _self.imgType + '/' + date.getFullYear() + '/' + (date.getMonth() + 1) + '/' +
date
.getDate() + '/' +
date.getTime() + Math.ceil(Math.random() * 100) + typeSrc,
onUploadProgress: (progressEvent) => {
_self.percent = Math.round(
(progressEvent.loaded * 100) / progressEvent.total
);
}
})
.then(res => {
// 获取图片访问地址
uniCloud.getTempFileURL({
fileList: [res.fileID]
})
.then(ddd => {
let obj = {
url: ddd.fileList[0].tempFileURL,
fileId: ddd.fileList[0].fileID
}
reslove(obj)
})
.catch(err => {
uni.showModal({
title: '错误提示',
content: err.toString(),
showCancel: false
})
})
})
.catch(err => {
uni.hideLoading();
uni.showModal({
title: '错误提示',
content: err.toString(),
showCancel: false
})
})
})
}
}
}
</script>
<style>
.popupClass {
position: relative;
}
.popupTitle {
width: 100%;
text-align: center;
margin-top: 16rpx;
font-weight: bold;
font-size: 30rpx;
}
.popupImg {
width: 80% !important;
margin-left: 10%;
margin: 26rpx 10%;
}
.progress {
width: 80%;
margin: 0 10% 26rpx;
}
</style>
+23
View File
@@ -0,0 +1,23 @@
@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
View File
@@ -0,0 +1,36 @@
.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);
}
}
@@ -0,0 +1,901 @@
/*!
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 [];
}
};
+137
View File
@@ -0,0 +1,137 @@
/*! iNoBounce - v0.2.0
* https://github.com/lazd/iNoBounce/
* Copyright (c) 2013 Larry Davis <lazdnet@gmail.com>; Licensed BSD */
(function(global) {
// Stores the Y position where the touch started
var startY = 0;
// Store enabled status
var enabled = false;
var supportsPassiveOption = false;
try {
var opts = Object.defineProperty({}, 'passive', {
get: function() {
supportsPassiveOption = true;
}
});
window.addEventListener('test', null, opts);
} catch (e) {}
var handleTouchmove = function(evt) {
// Get the element that was scrolled upon
var el = evt.target;
// Allow zooming
var zoom = window.innerWidth / window.document.documentElement.clientWidth;
if (evt.touches.length > 1 || zoom !== 1) {
return;
}
// Check all parent elements for scrollability
while (el !== document.body && el !== document) {
// Get some style properties
var style = window.getComputedStyle(el);
if (!style) {
// If we've encountered an element we can't compute the style for, get out
break;
}
// Ignore range input element
if (el.nodeName === 'INPUT' && el.getAttribute('type') === 'range') {
return;
}
var scrolling = style.getPropertyValue('-webkit-overflow-scrolling');
var overflowY = style.getPropertyValue('overflow-y');
var height = parseInt(style.getPropertyValue('height'), 10);
// Determine if the element should scroll
var isScrollable = scrolling === 'touch' && (overflowY === 'auto' || overflowY === 'scroll');
var canScroll = el.scrollHeight > el.offsetHeight;
if (isScrollable && canScroll) {
// Get the current Y position of the touch
var curY = evt.touches ? evt.touches[0].screenY : evt.screenY;
// Determine if the user is trying to scroll past the top or bottom
// In this case, the window will bounce, so we have to prevent scrolling completely
var isAtTop = (startY <= curY && el.scrollTop === 0);
var isAtBottom = (startY >= curY && el.scrollHeight - el.scrollTop === height);
// Stop a bounce bug when at the bottom or top of the scrollable element
if (isAtTop || isAtBottom) {
evt.preventDefault();
}
// No need to continue up the DOM, we've done our job
return;
}
// Test the next parent
el = el.parentNode;
}
// Stop the bouncing -- no parents are scrollable
evt.preventDefault();
};
var handleTouchstart = function(evt) {
// Store the first Y position of the touch
startY = evt.touches ? evt.touches[0].screenY : evt.screenY;
};
var enable = function() {
// Listen to a couple key touch events
window.addEventListener('touchstart', handleTouchstart, supportsPassiveOption ? { passive : false } : false);
window.addEventListener('touchmove', handleTouchmove, supportsPassiveOption ? { passive : false } : false);
enabled = true;
};
var disable = function() {
// Stop listening
window.removeEventListener('touchstart', handleTouchstart, false);
window.removeEventListener('touchmove', handleTouchmove, false);
enabled = false;
};
var isEnabled = function() {
return enabled;
};
// Enable by default if the browser supports -webkit-overflow-scrolling
// Test this by setting the property with JavaScript on an element that exists in the DOM
// Then, see if the property is reflected in the computed style
var testDiv = document.createElement('div');
document.documentElement.appendChild(testDiv);
testDiv.style.WebkitOverflowScrolling = 'touch';
var scrollSupport = 'getComputedStyle' in window && window.getComputedStyle(testDiv)['-webkit-overflow-scrolling'] === 'touch';
document.documentElement.removeChild(testDiv);
if (scrollSupport) {
enable();
}
// A module to support enabling/disabling iNoBounce
var iNoBounce = {
enable: enable,
disable: disable,
isEnabled: isEnabled
};
if (typeof module !== 'undefined' && module.exports) {
// Node.js Support
module.exports = iNoBounce;
}
if (typeof global.define === 'function') {
// AMD Support
(function(define) {
define('iNoBounce', [], function() { return iNoBounce; });
}(global.define));
}
else {
// Browser support
global.iNoBounce = iNoBounce;
}
}(this));
+40
View File
@@ -0,0 +1,40 @@
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
}
module.exports = {
isEqual
}
File diff suppressed because it is too large Load Diff