Compare commits

...

179 Commits

Author SHA1 Message Date
msb_39367 550ea9ddf9 feature: 添加打包资源
6 months ago
王景 a83f41c883 feat: update package-lock
2 years ago
王景 0237f70511 docs: 添加Node版本描述
2 years ago
ch 24df19af14 Merge branch 'fix/0714-ch'
2 years ago
ch fad9ff6ccb fix:修改服务启动名
2 years ago
ch f360233caa Merge branch 'fix/0714-ch' of https://internel-git.mashibing.cn/yanxuan-frontend/shop-app
2 years ago
ch 0508a6d9df pref:固定端口号
2 years ago
ch 041e15495d fix:下架商品
2 years ago
ch 2a42d55fb6 fix:static地址
2 years ago
ch d1f0e5fbd4 支付回调页面
2 years ago
ch 874340f948 修改打包方式
2 years ago
ch 39f379875b pay
2 years ago
ch 5d8a42f48c pay
2 years ago
ch b59d0698ae clear
3 years ago
ch 194587ba1b fix: 商品已下架
3 years ago
ch 9f195f09b7 fix: 商品已下架
3 years ago
ch a35cb72501 fix:点赞提示,已够吗问题
3 years ago
ch c010790f96 Merge branch 'feature/comment-0620-ch' into msb_test
3 years ago
ch f20ced40ad 分页最后一页判断修改
3 years ago
ch 03dab5bd96 Merge branch 'feature/comment-0620-ch' into msb_test
3 years ago
ch 314f79f2ae 分页最后一页判断修改
3 years ago
ch 24ba55fa25 Merge branch 'feature/comment-0620-ch' into msb_test
3 years ago
ch 7e7ab987b1 分页最后一页判断修改
3 years ago
ch 5832a43169 Merge branch 'feature/comment-0620-ch' into msb_test
3 years ago
ch b3cd9615ca 分页最后一页判断修改
3 years ago
ch fb70e2306f 修改分页判断
3 years ago
ch 0ce97eb86b Merge branch 'feature/comment-0620-ch' into msb_test
3 years ago
ch 460ba55458 提交
3 years ago
ch 325bee7e80 Merge branch 'feature/comment-0620-ch' into msb_test
3 years ago
ch ffc9769565 修改评论跳转
3 years ago
ch 0ce7d20886 Merge branch 'feature/comment-0620-ch' into msb_test
3 years ago
ch 4011d2d49c 上传预览
3 years ago
ch 774b4f4064 Merge branch 'feature/comment-0620-ch' into msb_test
3 years ago
ch 4880836a27 产品验收问题
3 years ago
ch 251d091312 Merge branch 'feature/alipay-0629-ch' into msb_test
3 years ago
ch 987566558d 增长支付订单状态查询
3 years ago
ch ffdb3e549f Merge branch 'feature/comment-0620-ch' into msb_test
3 years ago
ch e0b48c9ea6 fix:修改产品验收问题
3 years ago
ch 1e6de755bd APP支付
3 years ago
ch d4a93fed3d Merge branch 'feature/comment-0620-ch' into msb_test
3 years ago
ch b198706159 取消商家回复
3 years ago
ch 6cc4720315 Merge branch 'feature/comment-0620-ch' into msb_test
3 years ago
ch 71f9e086d7 评论回复实时显示顺序问题
3 years ago
ch df1a27323d Merge branch 'feature/comment-0620-ch' into msb_test
3 years ago
ch 4490d1af99 追评
3 years ago
ch f278d52028 修改标签统计接口Token
3 years ago
ch 0391e24745 Merge branch 'feature/comment-0620-ch' into msb_test
3 years ago
ch 3e9f8e617e fix:回复长英文显示问题
3 years ago
ch 907bcabad2 Merge branch 'feature/comment-0620-ch' into msb_test
3 years ago
ch 3739301d83 fix:修改页面刷新全局样式丢失问题
3 years ago
ch 5dc332c05f Merge branch 'feature/comment-0620-ch' into msb_test
3 years ago
ch 3d61ca3c1e 修改回复自己用户名
3 years ago
ch 410a721436 Merge branch 'feature/comment-0620-ch' into msb_test
3 years ago
ch 588a41d196 修改
3 years ago
ch 03e27975b4 Merge branch 'feature/comment-0620-ch' into msb_test
3 years ago
ch 9722f26b90 fix:评论
3 years ago
ch b2d1f2d9c0 Merge branch 'feature/comment-0620-ch' into msb_test
3 years ago
ch f6c4182e68 纯空格不让提交
3 years ago
ch efdf803082 纯空格不让提交
3 years ago
ch e5634eeacb 配置支付宝支付
3 years ago
ch d1ba4b1842 Merge branch 'feature/comment-0620-ch' into msb_test
3 years ago
ch 2b3e4a954b config
3 years ago
ch 46a6767afb Merge branch 'feature/comment-0620-ch' into msb_test
3 years ago
ch f11b0ee085 config
3 years ago
ch 96def57eaa Merge branch 'feature/comment-0620-ch' into msb_test
3 years ago
ch 6b2adcaf6a config
3 years ago
ch 2f1332b05d Merge branch 'feature/alipay-0629-ch' into msb_test
3 years ago
ch ec932a429b 支付宝支付
3 years ago
ch 5b6e2d46d2 评论统计不做TK校验
3 years ago
ch a27ce47f65 评论统计不做TK校验
3 years ago
ch 6892041093 修改评论数量
3 years ago
ch a75e6b163c fix:去追评报错
3 years ago
ch 98f910dbe9 fix:评论商品信息跳转到详情
3 years ago
ch 1d3fa277b2 fix:其他评价的页面点击事件
3 years ago
ch ac0fc976ed fix:其他评价的页面点击事件
3 years ago
ch 4e65eeb11a fix: 修复预览相关BUg
3 years ago
ch dd0b6345d5 修改BUg
3 years ago
ch 8f0bc44425 fix:修改点赞
3 years ago
ch 5c62b79812 修改图标
3 years ago
ch 925d13cc40 fix:个人中心添加待评价按钮
3 years ago
ch 90e514436b 修改预览页面
3 years ago
ch 8891cc6734 评价
3 years ago
ch e814e1aa0c Merge branch 'fix/0614-ch' into msb_prod
3 years ago
ch 5aff24319d fix:修改?
3 years ago
ch 47c4d8c11c Merge branch 'fix/0614-ch' into msb_prod
3 years ago
ch c2d0857ca1 fix:消息不显示
3 years ago
ch eacb092b13 feat:修改微信支付参数
3 years ago
ch 017b4da59a fix:会话最后一条消息内容英文强制换行
3 years ago
ch c62a4ec0c9 fix:会话最后一条消息内容英文强制换行
3 years ago
ch c9aa0198ff fix:英文换行
3 years ago
ch bbfb4e3108 fix:英文换行
3 years ago
ch f6fb143a69 解决uui 冲突
3 years ago
ch 226109cdbf fix:update sdk
3 years ago
ch 0d24392296 fix:英文强制换行
3 years ago
ch cdceda6747 fix:退出页面清除当前选中
3 years ago
ch 07f0f61983 fix: 客服转移消息
3 years ago
ch d694741ee1 pref:客服转移提示
3 years ago
ch 9067de54da fix:修改提示消息
3 years ago
ch ae4a4284c9 fix: 在当前会话页面刷新报错问题
3 years ago
ch 99f950804b fix:update im SDK
3 years ago
ch 118282854d fix:update IM SDK
3 years ago
ch e3fd51b216 fix:修改SKD
3 years ago
ch 653bbf90f7 fix: imSdk
3 years ago
ch ecd5c60430 头像 昵称
3 years ago
ch d5ec34c4da fix:删除xxx
3 years ago
ch 71e6293742 fix: IM退出数据清空问题
3 years ago
ch 58657621d9 打包命令退回
3 years ago
ch a29f1065e4 fix: 修改发送商品不显示问题
3 years ago
ch e7c43936f1 添加uuid
3 years ago
ch 5e79d78bfc pref:打包测试
3 years ago
ch c474aa0d26 修改
3 years ago
ch 4ca27cdf8a fix:创建会话未设置当前会话ID
3 years ago
ch daac64b0c9 fix:判断socket打开才创建会话
3 years ago
ch 2df056765f fix: 会话列表展示
3 years ago
ch 0df5bbcc18 fix: 会话ID取错修改
3 years ago
ch 5d795b11b4 取消创建会话调已读
3 years ago
ch 536067e197 添加uuid
3 years ago
ch 51ee94d573 修改SDK
3 years ago
ch 0bdab1c4bf im升级
3 years ago
ch e891706f3d im
3 years ago
ch 317cf6225d fix:分类广告
3 years ago
ch f6bdf195c0 fix: 修复虚拟商品优化问题
3 years ago
ch 02552acb69 fix:调整广告跳转方式判断
3 years ago
ch d6516bbfcf 广告跳转
3 years ago
ch 7e4dd1b9ca pref:页面路由组件文件夹重命名
3 years ago
ch 34852eeec8 Merge branch 'fix/0523-ch' into msb_test
3 years ago
ch debe46ebfb 正常消息
3 years ago
ch 75b09e3653 Merge branch 'fix/0523-ch' into msb_test
3 years ago
ch 048171750a 修改消息组展示
3 years ago
ch f29f120e0c Merge branch 'fix/0523-ch' into msb_test
3 years ago
ch 9bd1c4ba50 打开客服
3 years ago
ch 73f29f9490 Merge branch 'fix/0523-ch' into msb_test
3 years ago
ch 46aa9ad5e7 链接跳转
3 years ago
ch 9ec2ca4f1b Merge branch 'fix/0523-ch' into msb_test
3 years ago
ch 502f445666 发货消息
3 years ago
ch 5575d46da0 Merge branch 'fix/0523-ch' into msb_test
3 years ago
ch b0f9249b5b 修改支付跳转
3 years ago
ch d586378092 Merge branch 'fix/0523-ch' into msb_test
3 years ago
ch 5a2d4195b6 修改支付跳转
3 years ago
ch 99e2219f92 Merge branch 'fix/0523-ch' into msb_test
3 years ago
ch 3dc6c233af 虚拟商品订单详情
3 years ago
ch 02127626e3 Merge branch 'fix/0523-ch' into msb_test
3 years ago
ch c4b9f8a4a2 打包问题解决
3 years ago
ch b82d29807f Merge branch 'msb_test' of http://internel-git.mashibing.cn/yanxuan-frontend/shop-app into msb_test
3 years ago
ch b2f9127904 Merge branch 'fix/0523-ch' into msb_test
3 years ago
覃昌波 ea1b0e80cc 更新 Dockerfile
3 years ago
ch a40aa558e1 添加文件
3 years ago
ch 693cc0417a 预订单下单加参数
3 years ago
ch 7df16f45ca 修改打包命令
3 years ago
ch 2734b3c272 pref:提交订单时,虚拟商品不传地址Id
3 years ago
ch 1173416e6c pref:购物车不允许多类型商品同时结算
3 years ago
ch 742b847a45 系统消息跳转
3 years ago
ch 5100284312 pref:IM消息重发
3 years ago
ch 29b6ff483c perf:工作流程改成cli
3 years ago
ch 7477feaf3b perf:环境变量
3 years ago
ch abe6b4f405 perf:删除unpackage目录
3 years ago
ch 567ee059a1 perf:增加js-util-all库引用
3 years ago
ch 3f3b164c64 fix:删除多余im图标
3 years ago
陈辉 86f6c2afeb Merge branch 'msb_test' into 'msb_prod'
3 years ago
ch 5fec7cde3b 打包
3 years ago
ch 8164a9cd76 Merge branch 'fix/0521-ch' into msb_test
3 years ago
ch f1dbd2bca7 修改if
3 years ago
ch 07d765b228 Merge branch 'fix/0521-ch' into msb_test
3 years ago
ch 0bdeb7e67e 修改地区选择控件
3 years ago
ch 462a98ed19 打包
3 years ago
ch bf72b62c13 修改未读
3 years ago
ch 34738ab641 选择
3 years ago
ch c07059595a 添加banner广告图
3 years ago
ch b696bd7b00 banner
3 years ago
ch bd2ccede25 打包
3 years ago
ch f5a52891a9 处理商品发送显示空的问题
3 years ago
ch ae7a2e8400 打包
3 years ago
ch 9750bd2740 解决重商品跳进来没历史消息的问题,创建会话后SessionID没辅助导致
3 years ago
ch bf798aa12b 地区
3 years ago
ch 188e746404 打包
3 years ago
ch 598ab73781 修改Im
3 years ago
ch 649b91d8a1 第一版IM封装
3 years ago
ch 990cd56690 IM 封装
3 years ago
ch 0cf30a999f IM封装
3 years ago

@ -0,0 +1,3 @@
VUE_APP_BASE_URL = https://k8s-horse-gateway.mashibing.cn
VUE_APP_STATIC_URL = https://k8s-shop-app.mashibing.cn
VUE_APP_IM_URL = wss://k8s-horse-gateway.mashibing.cn

@ -0,0 +1,3 @@
VUE_APP_BASE_URL = https://you-gateway.mashibing.com
VUE_APP_STATIC_URL = https://you-app.mashibing.com
VUE_APP_IM_URL = wss://you-gateway.mashibing.com

@ -0,0 +1,3 @@
VUE_APP_BASE_URL = https://you-gateway.mashibing.com
VUE_APP_STATIC_URL = https://you-app.mashibing.com
VUE_APP_IM_URL = wss://you-gateway.mashibing.com

@ -0,0 +1,3 @@
VUE_APP_BASE_URL = https://k8s-horse-gateway.mashibing.com
VUE_APP_STATIC_URL = https://k8s-shop-app.mashibing.com
VUE_APP_IM_URL = wss://k8s-horse-gateway.mashibing.cn

32
.gitignore vendored

@ -1,8 +1,28 @@
.hbuilderx/
.DS_Store
node_modules/
unpackage/
dist/
.history/
.hbuilderx/
env.js
node_moudel/
package-lock.json
unpackage/dist/build/.automator/
unpackage/dist/dev
unpackage/cache
yarn.lock
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Editor directories and files
.project
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw*

@ -1,4 +1,4 @@
FROM nginx
COPY unpackage/dist/build/h5 /usr/share/nginx/html
COPY dist/build/h5 /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80

@ -2,21 +2,31 @@
* @Author: ch
* @Date: 2022-03-17 11:30:06
* @LastEditors: ch
* @LastEditTime: 2022-03-22 18:07:54
* @LastEditTime: 2022-05-23 21:18:34
* @Description: file content
-->
# shopping-app
严选移动端
## 前置环境
由于项目依赖问题,开发 `node` 版本必须是 `14` or `16`
如果想安装多个版本,可以通过使用 `nvm` 进行版本管理。然具体安装可以参考下面教程
[window install nvm](https://juejin.cn/post/7074108351524634655)
[mac install nvm](https://juejin.cn/post/7206882855200047161)
## 公共方法utils
- 公共方法统一放置utils文件夹内可以按分类建方法文件 如验证类verify.js 请求类request.js
## 公共方法 utils
- 公共方法统一放置 utils 文件夹内,可以按分类建方法文件 如:验证类 verify.js 请求类 request.js
- 所有公共方法采用大驼峰命名法
- 所有的方法都从index.js输出引入时统一引入index不允许直接引入方法文件
- 所有的方法都从 index.js 输出,引入时统一引入 index不允许直接引入方法文件
- 所有方法文件如果导出的是多个方法,不允许在定义方法时导出,必须在文件底部一一导出,并附上方法简单的注释
``` js
```js
// 正确
import {Req, IsPhone} from '@/common/utils';
@ -39,17 +49,20 @@ export const IsPhone = (str) => {....}
export const IsEmail = (str) => {....}
```
## 组件
- 请务必使用easycom模式引入第三方组件
- 根目录的components 只放置真正的组件某个页面的业务模块应该在pages的相应目录下新建components目录放置
- 所有的自定义组件文件名以大驼峰命名且在templet中使用也用大驼峰形式使用
- 请务必使用 easycom 模式引入第三方组件
- 根目录的 components 只放置真正的组件,某个页面的业务模块应该在 pages 的相应目录下新建 components 目录放置
- 所有的自定义组件文件名以大驼峰命名,且在 templet 中使用也用大驼峰形式使用
## 请求
- 所有请求方法命名以Api+请求类型+具体方) 法命名
- 所有请求使用ToAsyncAwait 包裹
- 不允许使用try catch 和 then 处理返回结果
``` js
- 所有请求使用 ToAsyncAwait 包裹
- 不允许使用 try catch 和 then 处理返回结果
```js
// 使用示例
// xxapi.js
import {ToAsyncAwait, ReqestTk} from '@/common/utils'
@ -60,7 +73,7 @@ export const IsEmail = (str) => {....}
}
// user.vue
improt {ApiGetUserInfo} from '@/common/api/xxapi.js';
const getUserInfo = async () =>{
const {error, result} = await ApiGetUserInfo();
if(error){
@ -71,6 +84,8 @@ export const IsEmail = (str) => {....}
}
```
## 图片
- 按pages目录结果放置图片
- 有公共使用的图片请放到static/common文件夹内
- 按 pages 目录结果放置图片
- 有公共使用的图片请放到 static/common 文件夹内

@ -0,0 +1,63 @@
const plugins = []
if (process.env.UNI_OPT_TREESHAKINGNG) {
plugins.push(require('@dcloudio/vue-cli-plugin-uni-optimize/packages/babel-plugin-uni-api/index.js'))
}
if (
(
process.env.UNI_PLATFORM === 'app-plus' &&
process.env.UNI_USING_V8
) ||
(
process.env.UNI_PLATFORM === 'h5' &&
process.env.UNI_H5_BROWSER === 'builtin'
)
) {
const path = require('path')
const isWin = /^win/.test(process.platform)
const normalizePath = path => (isWin ? path.replace(/\\/g, '/') : path)
const input = normalizePath(process.env.UNI_INPUT_DIR)
try {
plugins.push([
require('@dcloudio/vue-cli-plugin-hbuilderx/packages/babel-plugin-console'),
{
file (file) {
file = normalizePath(file)
if (file.indexOf(input) === 0) {
return path.relative(input, file)
}
return false
}
}
])
} catch (e) {}
}
process.UNI_LIBRARIES = process.UNI_LIBRARIES || ['@dcloudio/uni-ui']
process.UNI_LIBRARIES.forEach(libraryName => {
plugins.push([
'import',
{
'libraryName': libraryName,
'customName': (name) => {
return `${libraryName}/lib/${name}/${name}`
}
}
])
})
module.exports = {
presets: [
[
'@vue/app',
{
modules: 'commonjs',
useBuiltIns: process.env.UNI_PLATFORM === 'h5' ? 'usage' : 'entry'
}
]
],
plugins
}

File diff suppressed because one or more lines are too long

@ -1,85 +0,0 @@
/**
* 枚举类
* Enum.IMAGE.name => "图片"
* Enum.getNameByKey('IMAGE') => "图片"
* Enum.getValueByKey('IMAGE') => 10
* Enum.getNameByValue(10) => "图片"
* Enum.getData() => [{key: "IMAGE", name: "图片", value: 10}]
*/
class Enum {
constructor (param) {
const keyArr = []
const valueArr = []
if (!Array.isArray(param)) {
throw new Error('param is not an array!')
}
param.map(element => {
if (!element.key || !element.name) {
return
}
// 保存key值组成的数组方便A.getName(name)类型的调用
keyArr.push(element.key)
valueArr.push(element.value)
// 根据key生成不同属性值以便A.B.name类型的调用
this[element.key] = element
if (element.key !== element.value) {
this[element.value] = element
}
})
// 保存源数组
this.data = param
this.keyArr = keyArr
this.valueArr = valueArr
// 防止被修改
// Object.freeze(this)
}
// 根据key得到对象
keyOf (key) {
return this.data[this.keyArr.indexOf(key)]
}
// 根据key得到对象
valueOf (key) {
return this.data[this.valueArr.indexOf(key)]
}
// 根据key获取name值
getNameByKey (key) {
const prop = this.keyOf(key)
if (!prop) {
throw new Error('No enum constant' + key)
}
return prop.name
}
// 根据value获取name值
getNameByValue (value) {
const prop = this.valueOf(value)
if (!prop) {
throw new Error('No enum constant' + value)
}
return prop.name
}
// 根据key获取value值
getValueByKey (key) {
const prop = this.keyOf(key)
if (!prop) {
throw new Error('No enum constant' + key)
}
return prop.key
}
// 返回源数组
getData () {
return this.data
}
}
export default Enum

@ -1,62 +0,0 @@
/*
* @Author: ch
* @Date: 2022-03-22 18:28:52
* @LastEditors: ch
* @LastEditTime: 2022-04-29 14:13:05
* @Description: file content
*/
import Vue from 'vue'
import Vuex from 'vuex';
Vue.use(Vuex);
const
// token
TOKEN = 'tk',
// 用户信息
USER_INFO = 'ui',
// 地址列表
ADDRESS = 'ads',
// oppenId
OPPED_ID = 'oi';
export default new Vuex.Store({
state : {
token : uni.getStorageSync(TOKEN) || '',
userInfo : JSON.parse(uni.getStorageSync(USER_INFO) || '{}'),
address : JSON.parse(uni.getStorageSync(ADDRESS) || '[]'),
sessionData : [],
sessionMsgCount : 0,
sessionMsgId : '',
openId : uni.getStorageSync(OPPED_ID) || ''
},
mutations:{
SET_TOKEN (state, token = ''){
state.token = token;
uni.setStorageSync(TOKEN, token);
},
SET_USER_INFO (state, userInfo = {}){
state.userInfo = userInfo;
uni.setStorageSync(USER_INFO, JSON.stringify(userInfo));
},
SET_ADDRESS (state, address = []){
state.address = address;
uni.setStorageSync(ADDRESS, JSON.stringify(address));
},
SET_SESSION_DATA (state, data){
state.sessionData = data ;
},
SET_SESSION_MSG_COUNT (state, data){
state.sessionMsgCount = data;
},
SET_OPEN_ID (state, data){
state.openId = data;
uni.setStorageSync(OPPED_ID, data);
},
SET_SESSION_MSG_ID (state, data){
state.sessionMsgId = data;
}
},
actions : {
}
})

@ -1,18 +0,0 @@
/*
* @Author: ch
* @Date: 2022-03-22 16:52:28
* @LastEditors: ch
* @LastEditTime: 2022-05-06 21:06:14
* @Description: 所有工具类统一在这输出
*/
import * as util from './utils';
import * as requset from './requset';
import * as websocket from './requset';
import * as wxpay from './wxpay';
export * from './utils';
export * from './requset';
export * from './websocket';
export * from './wxpay';
export default { ...util, ...requset, ...websocket, ...wxpay}

@ -1,57 +0,0 @@
/*
* @Author: ch
* @Date: 2022-05-06 15:33:55
* @LastEditors: ch
* @LastEditTime: 2022-05-06 21:02:39
* @Description: file content
*/
import { ApiPostWxH5Pay, ApiPostWxJsApiPay } from '@/common/api/wx';
import { Wxpay } from './wxpay';
export const pay = ({orderId, openId, payType})=>{
if(payType === 'wxpay'){
Wxpay({orderId, openId});
}
// #ifdef H5
if(openId) {
// 微信JSAPI
const {error, result} = await ApiPostWxJsApiPay({orderId,openId});
if(error){
uni.$u.toast(error.message);
return false;
}
/*
* 公众号id appId String(16) wx8888888888888888
时间戳 timeStamp String(32) 1414561699 当前的时间
随机字符串 nonceStr String(32) 5K8264ILTKCH16CQ2502SI8ZNMTM67VS 随机字符串不长于32位推荐随机数生成算法
订单详情扩展字符串 package String(128) prepay_id=123456789 统一下单接口返回的prepay_id参数值提交格式如prepay_id=***
签名方式 signType String(32) MD5 签名类型默认为MD5支持HMAC-SHA256和MD5注意此处需与统一下单的签名类型一致
签名 paySign String(64) C380BEC2BFD727A4B6845133519F3AD6 签名
*/
const par = result.dataInfo;
WeixinJSBridge.invoke('getBrandWCPayRequest', {
appId : par.appId,
timeStamp : par.timeStamp,
nonceStr : par.nonceStr,
package : par.packageValue,
signType : par.signType,
paySign : par.paySign
}, res => {
if(res.err_msg !== 'get_brand_wcpay_request:cancel'){
uni.navigateTo({
url : `/payResult?orderId=${orderId}&payType=wxjsapi`
});
}
})
}else{
// h5支付
const {error, result} = await ApiPostWxH5Pay({orderId});
if(error){
uni.$u.toast(error.message);
return false;
}
const redirect_url = decodeURIComponent(`https://you-app.mashibing.com/payResult?orderId=${orderId}&payType=wxh5`);
window.location.href = `${result.dataInfo.payUrl}&redirect_url=${redirect_url}`;
}
// #ednif
}

@ -1,176 +0,0 @@
/*
* @Author: ch
* @Date: 2022-03-17 19:15:10
* @LastEditors: ch
* @LastEditTime: 2022-05-07 17:18:50
* @Description: 一些无法归类的公共方法容器
*/
/**
* 处理async await 标识结果处理
*
* @param {*} promise promise对象
* @param {*} isFromatResult 是否处理结果
* @returns {error,result} error有错为错误对象没错为null result正确的返回结果
* isFromatResult 为false时直接返回promise对象不做任何处理
*
*/
const ToAsyncAwait = (promise, isFromatResult = true) => {
if(!isFromatResult){
return promise;
}else{
return promise.then((res) => ({error:null,result:res})).catch((err) => ({error:err,result:null}));
}
}
/**
* 首次运行时把定时器赋值给一个变量 第二次执行时
* 如果间隔没超过定时器设定的时间则会清除掉定时器
* 重新设定定时器 依次反复 当我们停止下来时
* 没有执行清除定时器 超过一定时间后触发回调函数
*/
const Debounce = (fn, delay) => {
let timer
return function() {
const that = this
const _args = arguments // 存一下传入的参数
if (timer) {
clearTimeout(timer)
}
timer = setTimeout(function() {
fn.apply(that, _args)
}, delay)
}
}
/**
* 匹配phone
*/
const IsPhone = (str) => /^(1[3-9]\d{9})$/.test(str);
/**
* 判断数值类型包括整数和浮点数
*/
const IsNumber = (str) => (isDouble(str) || isInteger(str)) ? true : false;
/**
* 匹配integer
*/
const IsInteger = (str) => {
if (str == null || str == "") return false
var result = str.match(/^[-\+]?\d+$/)
if (result == null) return false
return true
}
/**
* 匹配double或float
*/
const IsDouble = (str) => {
if (str == null || str == "") return false
var result = str.match(/^[-\+]?\d+(\.\d+)?$/)
if (result == null) return false
return true
}
/**
*
* 时间格式化
* @param {number|string|Date} d 时间参数能被new Date识别的数字字符串日期
* @param {string} fmt 时间格式参数 字符串类型 默认'yyyy/mm/dd'
*/
const formatDate = (date, fmt = 'yyyy/mm/dd' ) =>{
// 处理不识别的时间表示字符串如2020年01月01日00时00分00秒
if(date.constructor === String){
date = date.replace(/\D+/ig,'/');
let arr = date.split('/');
// 长度大于3说明带了时分秒信息 特殊时间处理格式
if(arr.length > 3){
let time = ` ${arr[3]}:${arr[4]}:${arr[5]}`
arr.length = 3;
date = arr.join('/') + time;
}
};
try{
date = date ? date.constructor === Date ? date : new Date(date) : new Date();
} catch(e){
throw new Error('不能识别的时间格式');
}
const o = {
'm+': date.getMonth() + 1, //月份
'd+': date.getDate(), //日
'h+': date.getHours(), //小时
'i+': date.getMinutes(), //分
's+': date.getSeconds(), //秒ji“
'q+': Math.floor((date.getMonth() + 3) / 3), //季度
'l+': date.getMilliseconds() //毫秒
};
if (/(y+)/i.test(fmt)) {
fmt = fmt.replace(RegExp.$1, (date.getFullYear().toString()).substr(4 - RegExp.$1.length));
}
for (let k in o) {
if (new RegExp(`(${k})`, 'i').test(fmt)) {
const str = o[k].toString();
fmt = fmt.replace(RegExp.$1, RegExp.$1.length === 1 ? str : (`0${str}`).substr(str.length-1));
}
}
return fmt;
}
const createUUID = (len,radix) => {
const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
let uuid = [],
i=0;
radix = radix || chars.length;
if(len){
for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];
}else{
let r = 0;
uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
uuid[14] = '4';
for (i = 0; i < 36; i++) {
if (!uuid[i]) {
r = 0 | Math.random()*16;
uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
}
}
}
return uuid.join('');
}
const toSearchJson = (search)=>{
search = search.replace(/\?/g,'&');
let searchArr = search.split('&'),
obj = {};
searchArr.forEach(i =>{
const me = i.split('=');
if(me[0]){
obj[me[0]] = decodeURIComponent(me[1]);
}
});
return obj;
}
const getPlatform = ()=>{
}
// 工具类的文件需要把文件提供的工具类统一放最下方做一个统一输出
export {
// async await 标识结果处理
ToAsyncAwait,
// 防抖函数
Debounce,
// 判断是否为手机号
IsPhone,
// 判断是否为数字
IsNumber,
// 判断是否为整数
IsInteger,
// 判断是否double或float
IsDouble,
// 时间格式化
formatDate,
createUUID,
toSearchJson
}

@ -1,156 +0,0 @@
/*
* @Author: ch
* @Date: 2022-04-25 14:39:19
* @LastEditors: ch
* @LastEditTime: 2022-05-17 18:14:57
* @Description: file content
*/
import store from "../store";
import {createUUID, formatDate} from '@/common/utils';
let sessionListFlag = false;
const sessionList = (ctx) => {
sessionListFlag = true;
// 来新消息先查会话列表是否一存在,存在则加消息数。不存在则向会话列表加一个会话框
ctx.sessionVOS.forEach(item => {
if (item.lastMessage) {
item.lastMessage.createTimeStamp = formatDate(item.lastMessage.createTimeStamp, 'mm-dd hh:ii')
item.lastMessage.payload = JSON.parse(item.lastMessage.payload || {});
}
let historyData = store.state.sessionData;
let hisIndex = historyData.findIndex(i => i.id === item.id);
if(hisIndex >= 0){
historyData[hisIndex].lastMessage = item.lastMessage;
historyData[hisIndex].unreadCount++;
store.commit('SET_SESSION_DATA', historyData);
}else{
item.messageList = [];
store.commit('SET_SESSION_DATA',[...historyData, item]);
}
});
// 消息总数
store.commit('SET_SESSION_MSG_COUNT', ctx.totalUnreadCount);
}
const historyMsg = (ctx) => {
if(!ctx.length){
return false;
}
// ctx.reverse();
let newData = store.state.sessionData;
const hisIdx = newData.findIndex(i => i.id === ctx[0].sessionId);
ctx.forEach(item => {
item.createTimeStamp = formatDate(item.createTimeStamp, 'mm-dd hh:ii');
item.payload = JSON.parse(item.payload)
})
// newData[hisIdx].messageList = ctx.concat(newData[hisIdx].messageList);
newData[hisIdx].messageList = newData[hisIdx].messageList.concat(ctx);
store.commit('SET_SESSION_DATA', newData);
}
/**
* 收到某个会话的信息
* @param {*} ctx
*/
const sessionMsg = (ctx)=>{
// 没接到会话列表时接到的消息不做处理
if(!sessionListFlag){
return
}
ctx.payload = JSON.parse(ctx.payload || {});
ctx.createTimeStamp = formatDate(ctx.createTimeStamp || new Date(), 'mm-dd hh:ii')
let historyData = store.state.sessionData;
const hisIndex = historyData.findIndex(i => i.id === ctx.sessionId);
// 不在当前会话框则全局消息加1
if(ctx.sessionId !== store.state.sessionMsgId){
store.commit('SET_SESSION_MSG_COUNT', store.state.sessionMsgCount + 1);
}
if(hisIndex >= 0){
// 存在会话往现有会话增加一条消息
const curHisData = historyData[hisIndex];
// curHisData.messageList = [ ctx, ...(curHisData.messageList || [])]
curHisData.messageList.push(ctx); //= [ ctx, ...(curHisData.messageList || [])]
// 不在当前会话框则会话框消息加1
if(ctx.sessionId !== store.state.sessionMsgId){
curHisData.unreadCount++;
}
store.commit('SET_SESSION_DATA', historyData);
}else{
// 会话列表不存在,则创建一个会话
store.commit('SET_SESSION_DATA',[...historyData, {
fromAvatar : ctx.fromAvatar,
fromId : ctx.fromId,
fromNickname : ctx.fromNickname,
id : ctx.id,
lastMessage : ctx,
messageList : [ctx],
unreadCount : 1
}]);
}
}
// 用户自己创建了一个会话
const createSessionMain = (ctx) => {
let historyData = store.state.sessionData;
const curHis = historyData.find(i => i.id === ctx.id);
store.commit('SET_SESSION_MSG_ID', ctx.id);
if (curHis) {
return false;
}
store.commit('SET_SESSION_DATA',[...historyData, {
...ctx,
unreadCount : 0,
messageList : []
}]);
}
export let MsbWebSkt = null;
const token = 'eyJhbGciOiJSUzI1NiJ9.eyJleHAiOjQwNzA4ODAwMDAsImlkIjo5LCJ0aW1lIjoxNjUyNTAwMDUyNTgwfQ.VAMmJTU1FAcw-vD39E_7EHoDaEdKD3A53L-kdcF6Hj_ygs1urs7xfTNsE2Z_Tb5wXRkS_j-qm0pGnRgfD2EQebc8Pcd28-Rp2W8o-CmCw2_uZUZbfUGeFRZ_ihsFCCpsepU7uEkA9L--cI_u3jw9xdNqzkiXYAVeAXsJ2j570bk'
export const MsbWebSktInit = () => {
return new Promise((resolve, reject) => {
MsbWebSkt = uni.connectSocket({
url : `wss://you-gateway.mashibing.com/ws?client=${store.state.token}&type=1`, // url是websocket连接ip
// url : `wss://k8s-horse-gateway.mashibing.cn/ws?client=${store.state.token}&type=1`, // url是websocket连接ip
// url : `ws://192.168.10.93:8090/ws?client=${token}&type=1`, // url是websocket连接ip
fail: e => {
reject(e)
}
});
MsbWebSkt.onOpen(() => {
MsbWebSkt.onMessage((res) => {
const data = JSON.parse(res.data || {});
if (data.code === 200) {
const ctx = data.content;
switch (data.traceType) {
// 会话列表
case 1:
sessionList(ctx);
break;
// 历史消息
case 2:
case 23:
historyMsg(ctx);
break;
// 创建会话
case 21:
createSessionMain(ctx);
break;
// 会话消息
case 25:
case 20:
case 7:
sessionMsg(ctx)
break;
default:
break;
}
}
})
resolve();
});
MsbWebSkt.onClose(() => {
console.log('断开。。。。。');
})
})
}

@ -1,39 +0,0 @@
/*
* @Author: ch
* @Date: 2022-04-19 16:14:03
* @LastEditors: ch
* @LastEditTime: 2022-04-19 17:20:08
* @Description: file content
*/
import Confirm from '../UiConfirm.vue';
export default {
install (Vue) {
// 创建构造类
const ConfirmConstructor = Vue.extend(Confirm)
const showNextConfirm = function (options) {
// 实例化组件
const instance = new ConfirmConstructor({
el: document.createElement('div')
})
// 处理参数
for (const prop in options) {
instance[prop] = options[prop];
}
// 插入Body
document.body.appendChild(instance.$el)
Vue.nextTick(() => {
instance.show = true
})
}
const confirmFn = (options) => {
return showNextConfirm(options);
}
Vue.prototype.$msb ?
Vue.prototype.$msb.confirm = confirmFn :
Vue.prototype.$msb={confirm : confirmFn }
}
}

@ -1,27 +0,0 @@
<!--
* @Author: ch
* @Date: 2022-05-05 10:57:05
* @LastEditors: ch
* @LastEditTime: 2022-05-05 16:53:23
* @Description: file content
-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<script>
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
CSS.supports('top: constant(a)'))
document.write(
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
(coverSupport ? ', viewport-fit=cover' : '') + '" />')
</script>
<title></title>
<!--preload-links-->
<!--app-context-->
</head>
<body>
<div id="app"><!--app-html--></div>
<script type="module" src="/main.js"></script>
</body>
</html>

23183
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -1,27 +1,123 @@
{
"name": "shopping-app",
"version": "1.0.0",
"description": "严选",
"main": "main.js",
"name": "shop-app",
"version": "0.1.0",
"private": true,
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
"server": "npm run dev:h5",
"server:test": "npm run dev:h5-test",
"server:bate": "npm run dev:h5-bate",
"server:prod": "npm run dev:h5-prod",
"build:test": "npm run build:h5-test",
"build:bate": "npm run build:h5-bate",
"build:prod": "npm run build:h5-prod",
"build:app-plus": "cross-env NODE_ENV=production UNI_PLATFORM=app-plus vue-cli-service uni-build",
"build:custom": "cross-env NODE_ENV=production uniapp-cli custom",
"build:h5-test": "cross-env NODE_ENV=production UNI_PLATFORM=h5 vue-cli-service uni-build --mode test",
"build:h5-bate": "cross-env NODE_ENV=production UNI_PLATFORM=h5 vue-cli-service uni-build --mode bate",
"build:h5-prod": "cross-env NODE_ENV=production UNI_PLATFORM=h5 vue-cli-service uni-build --mode prod",
"build:mp-360": "cross-env NODE_ENV=production UNI_PLATFORM=mp-360 vue-cli-service uni-build",
"build:mp-alipay": "cross-env NODE_ENV=production UNI_PLATFORM=mp-alipay vue-cli-service uni-build",
"build:mp-baidu": "cross-env NODE_ENV=production UNI_PLATFORM=mp-baidu vue-cli-service uni-build",
"build:mp-jd": "cross-env NODE_ENV=production UNI_PLATFORM=mp-jd vue-cli-service uni-build",
"build:mp-kuaishou": "cross-env NODE_ENV=production UNI_PLATFORM=mp-kuaishou vue-cli-service uni-build",
"build:mp-lark": "cross-env NODE_ENV=production UNI_PLATFORM=mp-lark vue-cli-service uni-build",
"build:mp-qq": "cross-env NODE_ENV=production UNI_PLATFORM=mp-qq vue-cli-service uni-build",
"build:mp-toutiao": "cross-env NODE_ENV=production UNI_PLATFORM=mp-toutiao vue-cli-service uni-build",
"build:mp-weixin": "cross-env NODE_ENV=production UNI_PLATFORM=mp-weixin vue-cli-service uni-build",
"build:mp-xhs": "cross-env NODE_ENV=production UNI_PLATFORM=mp-xhs vue-cli-service uni-build",
"build:quickapp-native": "cross-env NODE_ENV=production UNI_PLATFORM=quickapp-native vue-cli-service uni-build",
"build:quickapp-webview": "cross-env NODE_ENV=production UNI_PLATFORM=quickapp-webview vue-cli-service uni-build",
"build:quickapp-webview-huawei": "cross-env NODE_ENV=production UNI_PLATFORM=quickapp-webview-huawei vue-cli-service uni-build",
"build:quickapp-webview-union": "cross-env NODE_ENV=production UNI_PLATFORM=quickapp-webview-union vue-cli-service uni-build",
"dev:app-plus": "cross-env NODE_ENV=development UNI_PLATFORM=app-plus vue-cli-service uni-build --watch",
"dev:custom": "cross-env NODE_ENV=development uniapp-cli custom",
"dev:h5": "cross-env NODE_ENV=development UNI_PLATFORM=h5 vue-cli-service uni-serve",
"dev:h5-test": "cross-env NODE_ENV=development UNI_PLATFORM=h5 vue-cli-service uni-serve --mode test",
"dev:h5-bate": "cross-env NODE_ENV=development UNI_PLATFORM=h5 vue-cli-service uni-serve --mode bate",
"dev:h5-prod": "cross-env NODE_ENV=development UNI_PLATFORM=h5 vue-cli-service uni-serve --mode prod",
"dev:mp-360": "cross-env NODE_ENV=development UNI_PLATFORM=mp-360 vue-cli-service uni-build --watch",
"dev:mp-alipay": "cross-env NODE_ENV=development UNI_PLATFORM=mp-alipay vue-cli-service uni-build --watch",
"dev:mp-baidu": "cross-env NODE_ENV=development UNI_PLATFORM=mp-baidu vue-cli-service uni-build --watch",
"dev:mp-jd": "cross-env NODE_ENV=development UNI_PLATFORM=mp-jd vue-cli-service uni-build --watch",
"dev:mp-kuaishou": "cross-env NODE_ENV=development UNI_PLATFORM=mp-kuaishou vue-cli-service uni-build --watch",
"dev:mp-lark": "cross-env NODE_ENV=development UNI_PLATFORM=mp-lark vue-cli-service uni-build --watch",
"dev:mp-qq": "cross-env NODE_ENV=development UNI_PLATFORM=mp-qq vue-cli-service uni-build --watch",
"dev:mp-toutiao": "cross-env NODE_ENV=development UNI_PLATFORM=mp-toutiao vue-cli-service uni-build --watch",
"dev:mp-weixin": "cross-env NODE_ENV=development UNI_PLATFORM=mp-weixin vue-cli-service uni-build --watch",
"dev:mp-xhs": "cross-env NODE_ENV=development UNI_PLATFORM=mp-xhs vue-cli-service uni-build --watch",
"dev:quickapp-native": "cross-env NODE_ENV=development UNI_PLATFORM=quickapp-native vue-cli-service uni-build --watch",
"dev:quickapp-webview": "cross-env NODE_ENV=development UNI_PLATFORM=quickapp-webview vue-cli-service uni-build --watch",
"dev:quickapp-webview-huawei": "cross-env NODE_ENV=development UNI_PLATFORM=quickapp-webview-huawei vue-cli-service uni-build --watch",
"dev:quickapp-webview-union": "cross-env NODE_ENV=development UNI_PLATFORM=quickapp-webview-union vue-cli-service uni-build --watch",
"info": "node node_modules/@dcloudio/vue-cli-plugin-uni/commands/info.js",
"serve:quickapp-native": "node node_modules/@dcloudio/uni-quickapp-native/bin/serve.js",
"test:android": "cross-env UNI_PLATFORM=app-plus UNI_OS_NAME=android jest -i",
"test:h5": "cross-env UNI_PLATFORM=h5 jest -i",
"test:ios": "cross-env UNI_PLATFORM=app-plus UNI_OS_NAME=ios jest -i",
"test:mp-baidu": "cross-env UNI_PLATFORM=mp-baidu jest -i",
"test:mp-weixin": "cross-env UNI_PLATFORM=mp-weixin jest -i"
},
"repository": {
"type": "git",
"url": "http://internel-git.mashibing.cn/chenhui/shopping-app.git"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"@dcloudio/uni-app-plus": "^2.0.1-34720220422002",
"@dcloudio/uni-h5": "^2.0.1-34720220422002",
"@dcloudio/uni-helper-json": "*",
"@dcloudio/uni-i18n": "^2.0.1-34720220422002",
"@dcloudio/uni-mp-360": "^2.0.1-34720220422002",
"@dcloudio/uni-mp-alipay": "^2.0.1-34720220422002",
"@dcloudio/uni-mp-baidu": "^2.0.1-34720220422002",
"@dcloudio/uni-mp-jd": "^2.0.1-34720220422002",
"@dcloudio/uni-mp-kuaishou": "^2.0.1-34720220422002",
"@dcloudio/uni-mp-lark": "^2.0.1-34720220422002",
"@dcloudio/uni-mp-qq": "^2.0.1-34720220422002",
"@dcloudio/uni-mp-toutiao": "^2.0.1-34720220422002",
"@dcloudio/uni-mp-vue": "^2.0.1-34720220422002",
"@dcloudio/uni-mp-weixin": "^2.0.1-34720220422002",
"@dcloudio/uni-mp-xhs": "^2.0.1-34720220422002",
"@dcloudio/uni-quickapp-native": "^2.0.1-34720220422002",
"@dcloudio/uni-quickapp-webview": "^2.0.1-34720220422002",
"@dcloudio/uni-stat": "^2.0.1-34720220422002",
"@vue/shared": "^3.0.0",
"caniuse-lite": "^1.0.30001640",
"core-js": "^3.6.5",
"flyio": "^0.6.2",
"js-util-all": "^1.0.6",
"mp-html": "^2.2.2",
"regenerator-runtime": "^0.12.1",
"uni-read-pages": "^1.0.5",
"uni-simple-router": "^2.0.7",
"uview-ui": "^2.0.29",
"vuex": "^3.6.2"
"vue": "^2.6.11",
"vuex": "^3.2.0"
},
"devDependencies": {
"@dcloudio/uni-helper-json": "^1.0.13",
"git-repo-info": "^2.1.1"
"@babel/runtime": "~7.12.0",
"@dcloudio/types": "^2.6.7",
"@dcloudio/uni-automator": "2.0.2-4010520240507001",
"@dcloudio/uni-cli-i18n": "2.0.2-4010520240507001",
"@dcloudio/uni-cli-shared": "2.0.2-4010520240507001",
"@dcloudio/uni-migration": "2.0.2-4010520240507001",
"@dcloudio/uni-template-compiler": "2.0.2-4010520240507001",
"@dcloudio/vue-cli-plugin-hbuilderx": "2.0.2-4010520240507001",
"@dcloudio/vue-cli-plugin-uni": "2.0.2-4010520240507001",
"@dcloudio/vue-cli-plugin-uni-optimize": "2.0.2-4010520240507001",
"@dcloudio/webpack-uni-mp-loader": "2.0.2-4010520240507001",
"@dcloudio/webpack-uni-pages-loader": "2.0.2-4010520240507001",
"@vue/cli-plugin-babel": "~4.5.15",
"@vue/cli-service": "~4.5.15",
"babel-plugin-import": "1.13.8",
"cross-env": "7.0.3",
"jest": "25.5.4",
"mini-types": "*",
"miniprogram-api-typings": "*",
"postcss-comment": "^2.0.0",
"sass": "^1.52.1",
"vue-template-compiler": "^2.6.11"
},
"browserslist": [
"Android >= 4.4",
"ios >= 9"
],
"uni-app": {
"scripts": {}
}
}

@ -1,926 +0,0 @@
<template>
<view class="chat-list" :class="{'loading':!loading,'isInput':isInput==true,'otherInput':otherInput==true}">
<view v-for="(item,index) in msgData" :key="item.id" :id="item.id" :class="{'nowAt':item.messageId == isNowAit}">
<!-- <view v-if="index>0&&item.sendTime - msgList[index-1].sendTime > 300000">
<view class="chat-item-hint">
<view style="background: none;">{{getTime(item.sendTime)}}</view>
</view>
</view> -->
<!-- 接收的消息 -->
<view class="chat-item-l" v-if="item.fromId != userInfo.id">
<view class="head-img">
<image class="head-img" src="@/static/message/xt.png"></image>
</view>
<view>
<view class="group-user-name clamp" v-if="imObject && imObject.type===2">
{{item.fromNickName||item.nickName}}
</view>
<!-- 文字类型消息 -->
<view v-if="item.type == msgType['txt']" class="chat-item-content" :class="{'jump-box':false}">
<!-- 普通文字消息 -->
<view>{{item.ctx}}</view>
</view>
<!-- 图片类型消息 -->
<view v-if="item.type == msgType['img']" class="chat-item-content-voice" >
<img class="des-img" mode='aspectFit' :src="item.ctx" @click="previewImg(item.ctx)">
</img>
</view>
<!-- 视频类型消息 -->
<view v-if="item.type == msgType['video']" class="chat-item-content-video" @click="clickVideo(item)">
<image class="v-icon" src="@/static/im/ship@2x.png" mode=""></image>
<view class="v-bottom">
<image class="v-b-icon" src="@/static/im/xiazai.png"></image>
</view>
</view>
</view>
</view>
<!-- 发送的消息 -->
<view class="chat-item-r" v-else >
<!-- 文字类型消息 -->
<view v-if="item.type == msgType['txt']" class="chat-item-content" :style="{'maxWidth':Width + 'px'}">
<view v-html="getUrl(item.content)"></view>
</view>
<!-- 图片类型消息 -->
<view v-if="item.type == msgType['img']" class="chat-item-content-voice" :style="{'maxWidth':Width + 'px'}">
<image class="des-img" mode='aspectFit' :src="item.ctx" @click="previewImg(item.ctx)">
</image>
</view>
<!-- 视频类型消息 -->
<view v-if="item.type == msgType['video']" class="chat-item-content-video" @click="clickVideo(item)">
<image class="v-icon" src="@/static/im/ship@2x.png" mode=""></image>
<view class="v-bottom">
<image class="v-b-icon" src="@/static/im/xiazai.png"></image>
</view>
</view>
<!-- 头像 -->
<view class="head-img">
<image class="head-img" src="@/static/message/xt.png"></image>
</view>
</view>
<view v-if="item.type === msgType['tips']">
<view class="chat-item-hint">
<view>{{item.ctx}}</view>
</view>
</view>
</view>
<!-- <view class="ait-jump" @click="aitJump"> -->
<view class="ait-jump" v-if="aitMsgId" @click="aitJump">
<image src="@/static/im/aitbtn1.png"></image>
<text>有人@</text>
<image @click.stop="aitMsgId=''" src="@/static/im/aitbtn2.png"></image>
</view>
<!-- <yinrh-menu-popup v-model="popup" :pop-data="menu" dynamic :x="x" :y="y" direction="row" theme="dark"
:placement="place" @tapPopup="tapPopup" /> -->
</view>
</template>
<script>
import {MSG_TYPE} from '@/common/dicts/im';
export default {
props: {
imObject: {
type: Object,
default: () => {}
},
isInput: {
type: Boolean,
default: false
},
otherInput: {
type: Boolean,
default: false
},
unReadCount: {
type: [String, Number],
default: 0
},
identity: {
type: [String, Number],
default: 0
}
},
data() {
return {
msgType : MSG_TYPE,
msgData :[
{id : 1, fromId : 9, type:1, ctx : 'ype 1文本消息 2语音消息 3图片消息 4视频消息 7提示消息'},
{id : 5, fromId : 3, type:1, ctx: 'ype 1文本消息 2语音消息 3图片消息 4视频消息 7提示消息'},
{id : 2, fromId : 9, type:7, ctx: '给你移动了客服'},
{id : 3, fromId : 2, type:3, ctx : 'https://msb-edu-dev.oss-cn-beijing.aliyuncs.com/mall-product/product2bca55bb5c3adb4d02a7a76039d097eewww800-800.jpg'},
{id : 3, fromId : 2, type:3, ctx : 'https://msb-edu-dev.oss-cn-beijing.aliyuncs.com/uc/account-avatar/aitbtn1.png'},
// {id : 4, formId : 9, type:4},
],
Width: '',
userNo: '',
historyParams: {},
msgList: [],
pullLoad: true,
firstPage: true,
loading: true,
popup: false,
aitMsgId: '',
isNowAit: '',
menu: [{
title: '转发'
}, {
title: '撤回'
}, {
title: '收藏'
}, {
title: '复制'
}],
value: false, // menutrue-
place: 'bottom-end',
x: 0,
y: 0,
selectMsg: {},
//
innerAudioContext: {},
//
audioItem: {}
}
},
created() {
// let app = this;
// uni.getSystemInfo({
// success: function(res) {
// app.Width = res.windowWidth - 116;
// app.Height = res.windowHeight;
// }
// });
// app.innerAudioContext = uni.createInnerAudioContext();
// app.innerAudioContext.autoplay = true;
// app.innerAudioContext.onEnded(() => {
// app.stopAudio()
// })
// //
// app.userNo = uni.getStorageSync('loginToken').userNo
// // app.historyParams = {
// // sessionId: app.imObject.sessionId,
// // msgCount: 100,
// // msgId: '',
// // }
// app.firstPage = true;
// app.msgList = [];
// let msgData = this.imDB.where({
// sessionId: app.imObject.sessionId
// }).limit(100).orderBy('messageId', 'desc').get()
// msgData = msgData.reverse()
// if (app.unReadCount > 0 || msgData.length <= 0) {
// app.getHistoryMsg();
// app.$emit('clearUnReadCount')
// } else {
// app.randerList(msgData)
// app.firstPage = false;
// }
//pushlist
},
beforeDestroy() {
this.chatListOnload()
},
computed: {
imDB: function() {
return this.$store.state.imDB;
},
userInfo (){
return this.$store.state.userInfo
}
},
methods: {
aitJump() {
let app = this;
uni.createSelectorQuery().select(".chat-list").boundingClientRect(data => { //
uni.createSelectorQuery().select("#msg" + app.aitMsgId).boundingClientRect((res) => { //
uni.pageScrollTo({
duration: 0, //0uniapp bug
scrollTop: res.top - data.top, //
})
app.isNowAit = app.aitMsgId
app.aitMsgId = ''
}).exec()
}).exec();
},
chatListOnload() {
uni.$off('scoket')
this.innerAudioContext.stop();
// this.msgList = [];
},
reprot(item) {
},
getUrl(str) {
},
fnThrottle(method, delay, duration) {
},
getHistoryMsg() {
},
randerList(list) {
},
getContent(item) {
},
clickVideo(item) {
let app = this;
uni.showModal({
title: '提示',
content: '暂时无法播放视频,是否下载视频文件?',
success: function(res) {
if (res.confirm) {
app.download(item)
}
}
});
},
download(item) {
if (item.isLoading) {
return false;
}
this.downloadFile(item)
},
scrollTop() {
if (this.pullLoad) {
this.getHistoryMsg();
}
},
tapPopup(e) {
},
copy() {
},
deleteMessage() {
},
forwardMsg() {
},
previewImg(logourl) {
let _this = this;
let imgsArray = [];
imgsArray[0] = logourl
uni.previewImage({
current: 0,
urls: imgsArray
});
},
playAudio(item) {
},
stopAudio() {
},
getSize(num) {
},
getTime(time) {
return dateFormat(time, 'yyyy-MM-dd HH:mm')
},
jumpPages(type, id, flag) {
},
delUnReadCount(res) {
let app = this;
delUnReadCount({
sessionId: res.sessionId,
userId: app.userNo,
platform: 2
})
}
}
}
</script>
<script module="test" lang="renderjs">
export default {
mounted() {
window.addEventListener("click", function(e) {
if (e.target.id == 'isa') {
uni.navigateTo({
url: 'pages/open-url/index?src=' + e.target.innerHTML
})
}
});
},
}
</script>
<style lang="scss" scoped>
.chat-item-content {
color: #0062CC;
position: relative;
.file-loading {
width: 22rpx;
height: 22rpx;
position: absolute;
left: -50rpx;
}
.file-fail {
height: 80rpx;
width: 110rpx;
position: absolute;
left: -110rpx;
background: url('@/static/im/fail.png') no-repeat;
background-position-x: 20rpx;
background-position-y: top;
background-size: 50rpx 50rpx;
&::before {
position: absolute;
content: '发送失败';
font-size: 20rpx;
font-family: PingFang SC;
font-weight: 400;
color: #999999;
width: 200rpx;
top: 52rpx;
}
}
}
.otherInput {
padding-bottom: 500rpx !important;
}
.isInput {
// padding-bottom: 718rpx !important;
}
.loading {
opacity: 0;
}
.chat-list {
padding: 20rpx 32rpx;
height: 100%;
overflow-y: auto;
overflow-x: hidden;
.chat-item-time {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
font-size: 24rpx;
font-family: DIN;
font-weight: 500;
color: #69707F;
margin: 30rpx 0;
}
.chat-item-hint {
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 20rpx;
view {
background: #EEEEEE;
border-radius: 25rpx;
padding: 12rpx 42rpx;
font-size: 24rpx;
font-family: PingFang SC;
font-weight: 500;
color: #999999;
}
}
.chat-item-l {
display: flex;
align-items: top;
margin: 20rpx 0;
.head-img {
width: 64rpx;
height: 64rpx;
margin-right: 20rpx;
border-radius: 50%;
}
.group-user-name {
font-size: 28rpx;
color: #999999;
padding-bottom: 12rpx;
max-width: 300rpx;
}
.jump-box {
position: relative;
padding-bottom: 56rpx !important;
}
.chat-item-content {
background: #FFFFFF;
border-radius: 2rpx 16rpx 16rpx 16rpx;
margin-right: 84rpx;
background-color: #fff;
box-sizing: border-box;
padding: 20rpx 30rpx;
font-size: 28rpx;
font-family: PingFang SC;
font-weight: 500;
color: #000000;
display: flex;
align-items: center;
word-break: break-all;
white-space: pre-wrap;
.audio-icon {
width: 24rpx;
height: 32rpx;
}
}
.chat-item-content-video {
width: 287rpx;
height: 161rpx;
background: #DCDCDC;
border-radius: 2rpx 16rpx 16rpx 16rpx;
position: relative;
.v-icon {
position: absolute;
left: 120rpx;
top: 48rpx;
width: 46rpx;
height: 46rpx;
}
.v-bottom {
position: absolute;
left: 0;
bottom: 0;
width: 100%;
height: 40rpx;
background: rgba(0, 0, 0, 0.4);
border-radius: 2rpx 16rpx 16rpx 16rpx;
.v-b-icon {
position: absolute;
width: 23rpx;
height: 22rpx;
right: 20rpx;
bottom: 9rpx;
}
}
}
.chat-item-content-voice {
display: flex;
align-items: center;
width: auto;
max-width: 400rpx;
height: auto;
// height: 320rpx;
// background: #FB3A4E;
border-radius: 2rpx 2rpx 16rpx 16rpx;
font-size: 28rpx;
font-family: DIN;
font-weight: 500;
color: #333333;
// padding: 30rpx;
.des-img,
.des-video {
// width: 100%;
height: 150rpx;
// margin-right: 15rpx;
}
}
.chat-item-content-datum {
width: 465rpx;
display: flex;
align-items: center;
justify-content: space-between;
background: #FFFFFF;
border-radius: 2rpx 16rpx 16rpx 16rpx;
margin-right: 84rpx;
background-color: #fff;
box-sizing: border-box;
padding: 35rpx 30rpx;
.datum-info {
display: flex;
flex-flow: column;
flex: 1;
.datum-title {
flex: 1;
width: 300rpx;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
font-size: 32rpx;
line-height: 32rpx;
font-family: PingFang SC;
font-weight: 500;
color: #333333;
}
.datum-size {
margin-top: 15rpx;
font-size: 28rpx;
font-family: PingFang SC;
font-weight: 500;
color: #999999;
}
}
}
.chat-item-content-picture {
display: flex;
align-items: center;
border-radius: 2rpx 16rpx 16rpx 16rpx;
background-color: #fff;
box-sizing: border-box;
overflow: hidden;
image {
width: 213rpx;
}
}
}
.chat-item-r {
display: flex;
align-items: top;
justify-content: flex-end;
margin: 20rpx 0;
>.head-img {
margin-left: 20rpx;
}
.head-img {
width: 64rpx;
height: 64rpx;
padding: 0;
border-radius: 50%;
}
.chat-item-content {
background: #FB3A4E;
border-radius: 16rpx 2rpx 16rpx 16rpx;
margin-left: 84rpx;
box-sizing: border-box;
padding: 20rpx 30rpx;
font-size: 28rpx;
font-family: PingFang SC;
font-weight: 500;
color: #FFFFFF;
word-break: break-all;
white-space: pre-wrap;
display: flex;
align-items: center;
.audio-icon {
width: 24rpx;
height: 32rpx;
}
}
.chat-item-content-video {
width: 287rpx;
height: 161rpx;
background: #DCDCDC;
border-radius: 16rpx 2rpx 16rpx 16rpx;
position: relative;
.v-icon {
position: absolute;
left: 120rpx;
top: 48rpx;
width: 46rpx;
height: 46rpx;
}
.v-bottom {
position: absolute;
left: 0;
bottom: 0;
width: 100%;
height: 40rpx;
background: rgba(0, 0, 0, 0.4);
border-radius: 2rpx 2rpx 16rpx 16rpx;
.v-b-icon {
position: absolute;
width: 23rpx;
height: 22rpx;
right: 20rpx;
bottom: 9rpx;
}
}
}
.chat-item-content-voice {
display: flex;
align-items: center;
justify-content: flex-end;
width: auto;
max-width: 400rpx;
height: auto;
// height: 320rpx;
// background: #FB3A4E;
border-radius: 16rpx 2rpx 16rpx 16rpx;
font-size: 28rpx;
font-family: DIN;
font-weight: 500;
color: #333333;
// padding: 30rpx;
.des-img,
.des-video {
// width: 100%;
height: 150rpx;
// margin-right: 15rpx;
}
}
.chat-item-content-datum {
width: 465rpx;
display: flex;
align-items: center;
justify-content: space-between;
background: #FFFFFF;
border-radius: 16rpx 2rpx 16rpx 16rpx;
margin-left: 84rpx;
background-color: #fff;
box-sizing: border-box;
padding: 35rpx 30rpx;
position: relative;
.file-loading {
width: 22rpx;
height: 22rpx;
position: absolute;
left: -50rpx;
}
.file-fail {
height: 80rpx;
width: 110rpx;
position: absolute;
left: -110rpx;
background: url('@/static/im/fail.png') no-repeat;
background-position-x: 15rpx;
background-position-y: top;
background-size: 50rpx 50rpx;
&::before {
position: absolute;
content: '发送失败';
font-size: 20rpx;
font-family: PingFang SC;
font-weight: 400;
color: #999999;
width: 200rpx;
top: 52rpx;
}
}
.datum-info {
display: flex;
flex-flow: column;
flex: 1;
.datum-title {
flex: 1;
width: 300rpx;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
font-size: 32rpx;
line-height: 32rpx;
font-family: PingFang SC;
font-weight: 500;
color: #333333;
}
.datum-size {
margin-top: 15rpx;
font-size: 28rpx;
font-family: PingFang SC;
font-weight: 500;
color: #999999;
}
}
}
.chat-item-content-picture {
display: flex;
align-items: center;
border-radius: 16rpx 2rpx 16rpx 16rpx;
background-color: #fff;
box-sizing: border-box;
overflow: hidden;
image {
width: 213rpx;
}
}
}
}
.datum-type {
image {
width: 74rpx;
height: 77rpx;
}
}
.jump-ques {
color: #00CCFF;
}
.voice-mask {
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 100%;
background-color: rgba($color: #000000, $alpha: 0.6);
z-index: 1003;
.vm-box {
width: 617rpx;
height: 514rpx;
background: #FFFFFF;
border-radius: 16rpx;
position: fixed;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
padding: 40rpx;
.vm-title {
font-size: 32rpx;
font-family: PingFang SC;
font-weight: 500;
color: #333333;
margin-bottom: 25rpx;
}
.vm-user {
display: flex;
align-items: center;
margin-bottom: 20rpx;
.vmu-img {
width: 80rpx;
height: 80rpx;
border-radius: 50%;
margin-right: 20rpx;
}
.vmu-txt {
font-size: 30rpx;
font-family: PingFang SC;
font-weight: bold;
color: #333333;
}
}
.vm-msg {
width: 377rpx;
height: 76rpx;
background: #FB3A4E;
border-radius: 2rpx 16rpx 16rpx 16rpx;
display: flex;
align-items: center;
padding-left: 30rpx;
margin-bottom: 20rpx;
.vmm-img {
width: 24rpx;
height: 32rpx;
transform: rotate(180deg);
}
.vmm-txt {
font-size: 28rpx;
font-family: DIN;
font-weight: 500;
color: #F3F5F6;
}
}
.vm-ipt {
width: 537rpx;
height: 68rpx;
background: #F6F6F6;
border-radius: 8rpx;
font-size: 28rpx;
color: #999;
padding-left: 20rpx;
}
.vm-btm {
height: 106rpx;
width: 100%;
position: absolute;
left: 0;
bottom: 0;
display: flex;
border-top: 1rpx solid #F5F6F6;
.vmb-cel,
.vmb-sub {
width: 50%;
height: 100%;
text-align: center;
line-height: 106rpx;
font-size: 32rpx;
font-family: PingFang SC;
font-weight: 500;
color: #999999;
}
.vmb-cel {
border-right: 1rpx solid #F5F6F6;
}
}
}
}
.chat-item-l {
/deep/.at_span {
&::after {
content: attr(data-name);
color: #FB3A4E;
}
}
}
.chat-item-r {
/deep/.at_span {
&::after {
content: attr(data-name);
color: #ffffff;
}
}
}
.ait-jump {
position: fixed;
right: 0rpx;
bottom: 200rpx;
width: 273rpx;
height: 78rpx;
background: #FFFFFF;
box-shadow: 0rpx 4rpx 30rpx 1rpx rgba(0, 0, 0, 0.06);
border-radius: 100rpx 0rpx 0rpx 100rpx;
z-index: 9999;
display: flex;
align-items: center;
padding: 0 30rpx;
image {
width: 16rpx;
height: 16rpx;
&:nth-child(1) {
margin-right: 20rpx;
}
&:last-child {
margin-left: auto;
}
}
text {
font-size: 28rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #FB3A4E;
}
}
.nowAt {
animation: isAt 3s 1;
-webkit-animation: isAt 3s 1;
/* Safari 和 Chrome */
}
@keyframes isAt {
0% {
background: #eee;
}
100% {
background: #fff;
}
}
</style>

@ -1,913 +0,0 @@
<template>
<!-- -->
<view class="chat-bottom" :style="{'bottom':isInput==true?getKeyHeight()+'px':'0px'}" @touchend='endAudio'>
<view class="bottom-operation">
<view class="goVoice" @click="setAudioShow">
<image src="../../../static/im/voice.png" mode=""></image>
</view>
<!-- <u-input type="textarea" maxlength="300" :clearable="false" height="80rpx" v-model="chatInfo" placeholder-style="color:#999;" placeholder="输入文字..." /> -->
<textarea v-if="!isIos()&&!audioShow" class="textarea" :class="{'textarea2':chatInfo}" maxlength="300"
v-model="chatInfo" @focus='onInput' placeholder-style="color:#999;" placeholder="输入文字..."
:auto-height='true' :adjust-position="false" />
<textarea v-if="isIos()&&!audioShow" class="textarea" :class="{'textarea2':chatInfo}" maxlength="300"
v-model="chatInfo" @focus='onInput' placeholder-style="color:#999;" placeholder="输入文字..."
:auto-height='true' />
<!-- <view class="textarea" v-if="audioShow"></view> -->
<view class="goexpression" @click="setEmojiShow">
<image src="../../../static/im/expression.png" mode=""></image>
</view>
<view v-show="chatInfo" class="send-btn" @touchend.prevent="sendMsg">
发送
</view>
<view class="more" v-show="!chatInfo" @click="setMoreShow">
<image src="../../../static/im/more.png" mode=""></image>
</view>
</view>
<view class="bottom-box">
<view v-show="emojiShow" class="emoji-box">
<view class="tools-box">
<text class="emoji" @click="setEmoji(item)"
v-for="(item,index) in getEmoji()">{{entitiestoUtf16(item)}}</text>
</view>
</view>
<view v-show="moreShow" class="operation-box">
<view class="operation-item" @click="goQuick">
<view class="item-btn">
<image src="../../../static/im/reply.png" mode=""></image>
</view>
<view class="item-hint">回复</view>
</view>
<view class="operation-item" @click="chooseImage">
<view class="item-btn">
<image src="../../../static/im/picture.png" mode=""></image>
</view>
<view class="item-hint">相册</view>
</view>
<view class="operation-item" @click="chooseFile">
<view class="item-btn">
<image src="../../../static/im/file.png" mode=""></image>
</view>
<view class="item-hint">文件</view>
</view>
<view class="operation-item" @click="chatCollect">
<view class="item-btn">
<image src="../../../static/im/collect.png"></image>
</view>
<view class="item-hint">收藏</view>
</view>
</view>
</view>
<u-popup v-model="showAitFlag" mode="bottom" border-radius="16" >
<!-- -->
<view class="ait-box" :style="{'height':isInput==true? (425 - keyHeight/2) +'px':'425px'}">
<view class="ab-title" >
<u-icon class='abt-close' name="arrow-down" color="#333333" size="24"></u-icon>
<text class="abt-txt">选择提醒的人</text>
</view>
<view class="ipt-wrp">
<image class="ipt-icon" src="@/static/sousuo.png"></image>
<input type="text" confirm-type="search" v-model="aitKeyword" class="ipt" placeholder="昵称搜索" >
</view>
<view class="ab-item" @click="setAit()">
<view class="abi-all">@</view>
<view class="abi-name">@所有人({{groupPeoList.length}})</view>
</view>
<view class="ab-item" @click="setAit(item)" v-for="(item,index) in groupPeoList" v-if="item.nickName.includes(aitKeyword)">
<image class="abi-img" :src="item.avatar"></image>
<view class="abi-name clamp">{{item.nickName}}</view>
</view>
</view>
</u-popup>
</view>
</template>
<script>
import {
utf16toEntities,
entitiestoUtf16
} from '@/common/js/utils.js'
import emojiData from '@/common/js/emoji.js'
import {
sendMsg,
sendGroupMsg,
sendSpecialMessage,
sendTextMsg,
getUserByGroupId
} from '@/common/api-request/im.js'
import cCircle from "@/components/Your_Exios-Circle/Your_Exios-Circle.vue"
import api from '@/common/js/api.js'
const baseUrl = api.host['local'];
export default {
components: {
cCircle
},
props: {
toUserNo: {
type: [String, Number],
default: ''
},
sendType: {
type: [String, Number],
default: ''
},
isInput: {
type: Boolean,
default: false
},
keyHeight: {
type: Number,
default: 0
},
isScreen: {
type: Boolean,
default: false
}
},
data() {
return {
chatInfo: '',
userNo: '',
moreShow: false,
emojiShow: false,
audioShow: false,
showAitFlag: false,
groupPeoList: [],
recorderManager: {}, //
innerAudioContext: {}, //
voicePath: [], //
timer: null, //
audioText: '长按录音',
audioStart: false,
sendFlag: true, //
voiceCel: false,
stamp: 0, //
txtIndex: 0, //
aitKeyword: '',
isserchinput:false
};
},
created() {
let app = this;
app.userNo = uni.getStorageSync('loginToken').userNo
//
app.recorderManager = uni.getRecorderManager();
console.log('录音对象', app.recorderManager)
app.innerAudioContext = uni.createInnerAudioContext();
app.innerAudioContext.autoplay = true;
app.recorderManager.onStop(function(res) {
console.log('-------停止录音', res)
let now = new Date().getTime()
let obj = {
path: res.tempFilePath,
duration: parseInt((now - app.stamp) / 100) * 100
}
if (obj.duration < 1000) {
uni.showToast({
icon: 'none',
title: '录音太短了!'
})
setTimeout(() => {
app.cancelAudio()
}, 200)
} else {
//
if (!app.voiceCel) {
app.voicePath.push(obj);
app.sendAudio()
}
}
});
if (app.sendType === 2) {
getUserByGroupId(app.toUserNo).then(res => {
console.log('--------------获取群成员', res.data)
app.groupPeoList = res.data
app.groupPeoList.forEach((el, idx) => {
if (el.userNo == app.userNo) {
app.groupPeoList.splice(idx, 1)
}
})
})
}
},
beforeDestroy() {
let app = this;
if (app.innerAudioContext.stop) {
app.innerAudioContext.stop()
}
if (app.timer) {
clearInterval(app.timer)
app.timer = null;
}
},
onShow() {
},
methods: {
getserchInput(){
//
uni.onKeyboardHeightChange(res => {
if (res.height > 0) {
console.log(res.height,'禁停')
// app.keyHeight = res.height
// app.isInput = true;
} else {
// app.isInput = false;
}
})
},
setAit(item) {
let app = this;
app.showAitFlag = false;
//,便
let curEnd = app.chatInfo.slice(app.txtIndex)
let curStr = app.chatInfo.slice(0, app.txtIndex)
if (item) {
app.chatInfo = curStr + item.nickName + '\t' + curEnd
} else {
app.chatInfo = curStr + '所有人' + '\t' + curEnd
}
console.log(item)
},
//
getKeyHeight() {
// if (this.isIos()) {
// if (this.isScreen) {
// return (this.keyHeight - 35)
// } else {
// return (this.keyHeight - 5)
// }
// } else {
// // return this.keyHeight
// return 0
// }
return 0
},
async sendMsg() {
let app = this;
let ids = []
let isAt = false;
if (app.sendType === 2) {
//@\t
let reg = /@.*?\\t/gi;
let result = JSON.stringify(app.chatInfo).match(reg)
if (result) {
for (let i = 0; i < result.length; i++) {
let el = result[i];
let cur = el.slice(1, el.length - 2)
if (cur == '所有人') {
app.groupPeoList.forEach(val => {
ids.push(val.userNo)
})
break;
} else {
app.groupPeoList.forEach(val => {
if (val.nickName == cur) {
ids.push(val.userNo)
}
})
}
console.log(cur)
}
}
isAt = ids.length > 0 ? true : false;
}
if (!app.sendFlag) {
return false;
}
app.sendFlag = false;
let res;
if (!app.chatInfo) {
uni.showToast({
icon: 'none',
title: "请输入聊天内容!"
})
app.sendFlag = true;
return false;
}
if (app.sendType === 1) {
//
res = await sendTextMsg({
content: app.chatInfo,
fromUserNo: app.userNo,
toUserNo: app.toUserNo
})
} else {
//
res = await sendTextMsg({
content: app.chatInfo,
fromUserNo: app.userNo,
groupId: app.toUserNo,
atUsers: ids,
isAt: isAt
})
}
if (res.code === 200) {
app.chatInfo = '';
uni.$emit('scoket', JSON.stringify(res.data))
// app.audioShow = false;
// app.moreShow = false;
// app.emojiShow = false;
} else {
uni.showToast({
icon: 'none',
title: res.msg
})
}
app.sendFlag = true;
},
chooseImage() {
let app = this;
uni.chooseImage({
count: 1, //9
sizeType: ['original', 'compressed'], //
sourceType: ['album', 'camera'], //
success: function(res) {
console.log(res.tempFilePaths[0]);
let filePath = res.tempFilePaths[0]
app.uploadFile(filePath, 1)
}
});
},
chooseFile() {
let app = this;
if (this.isIos()) {
const iOSFileSelect = uni.requireNativePlugin('YangChuan-YCiOSFileSelect');
let params = {
"document-types": ["public.text", "public.zip", "public.movie", "public.data", "com.adobe.pdf",
"com.microsoft.word.doc", "com.adobe.postscript", "com.microsoft.excel.xls",
"com.adobe.encapsulated- postscript", "com.microsoft.powerpoint.ppt",
"com.adobe.photoshop- image", "com.microsoft.word.rtf",
"com.microsoft.advanced- systems-format", "com.microsoft.advanced- stream-redirector"
],
"isBase64": 0
}
iOSFileSelect.show(params, result => {
let filePath = result.url
console.log(result,'result')
let fileName = result.lastName
let fileSize = result.version
app.uploadFile(filePath, 4,fileName,fileSize)
})
} else {
const plugin = uni.requireNativePlugin('GuoWei-SelectFileModule')
plugin.chooseFile({
count: 1
},
result => {
let filePath = result.files[0].url
let fileName = result.files[0].name
let fileSize = result.files[0].size
console.log('-----im文件选择', result)
app.uploadFile(filePath, 4, fileName, fileSize)
}
)
}
},
startAudio() {
console.log('开始录音', this.recorderManager);
let app = this
clearInterval(app.timer)
app.timer = null;
app.stamp = new Date().getTime()
uni.vibrateShort({
success: function() {
console.log('开始录音2', this.recorderManager);
app.timer = setInterval(() => {
uni.showToast({
icon: 'none',
title: '录音时间过长!'
})
app.endAudio()
app.$emit('longStop')
}, 60000)
console.log('开始录音3', this.recorderManager);
app.recorderManager.start();
app.audioText = '松开停止'
}
});
},
endAudio(val = false) {
let app = this;
app.voiceCel = val;
if (app.timer) {
console.log('录音结束');
clearInterval(app.timer)
app.timer = null;
app.recorderManager.stop();
app.audioText = '点击播放'
}
},
playVoice() {
console.log('播放录音');
// console.log('this.voicePath', this.voicePath, this.audioStart);
if (!this.audioStart) {
this.audioStart = true
this.innerAudioContext.src = this.voicePath[0];
this.innerAudioContext.play();
this.audioText = '暂停播放'
} else if (this.audioStart) {
this.audioStart = false
this.innerAudioContext.stop()
this.audioText = '点击播放'
}
},
cancelAudio() {
let app = this;
// app.audioShow = false;
app.moreShow = false;
app.emojiShow = false;
app.timer = null;
app.innerAudioContext.stop()
app.voicePath.length > 0 ? app.voicePath.shift() : app.voicePath = []
app.audioStart = false;
app.audioText = '长按录音'
},
sendAudio() {
let app = this;
if (app.voicePath.length == 1) {
app.uploadFile(app.voicePath[0].path, 2)
}
},
uploadFile(filePath, type, fileName = '', fileSize = 0) {
let header = {}
let app = this;
if (uni.getStorageSync('loginToken')) {
let token = uni.getStorageSync('loginToken');
header['Authorization'] = token.tokenHead + token.token;
header['R-Authorization'] = token.tokenHead + token.refreshToken;
// header['Content-Type'] = 'multipart/form-data'
}
let scoketParams = {
isLoading: 'load',
fromUserNo: app.userNo,
toUserNo: app.sendType == 1 ? app.toUserNo : '',
groupId: app.sendType == 2 ? app.toUserNo : '',
type: type,
fileName: fileName,
fileSize: fileSize,
filePath: filePath,
audioSeconds: app.voicePath && app.voicePath.length > 0 ? app.voicePath[0].duration : ''
}
console.log('ios',scoketParams)
uni.$emit('scoket', JSON.stringify(scoketParams))
uni.uploadFile({
url: baseUrl + '/edu-im/file/upload',
filePath: filePath,
header: header,
name: "file",
success: function(res) {
let resData = JSON.parse(res.data).data
let params = {
content: resData.content,
fileName: resData.filename,
size: resData.size,
fromUserNo: app.userNo,
toUserNo: app.sendType == 1 ? app.toUserNo : '',
groupId: app.sendType == 2 ? app.toUserNo : '',
type: type,
audioSeconds: app.voicePath && app.voicePath.length > 0 ? app.voicePath[0]
.duration : ''
}
sendSpecialMessage(params).then(ret => {
console.log('ret', ret)
if (ret.code === 200) {
console.log('-----------------im发送图片', ret)
app.chatInfo = '';
uni.$emit('scoket', JSON.stringify(ret.data))
app.innerAudioContext.stop()
// app.audioShow = false;
app.moreShow = false;
app.emojiShow = false;
app.audioStart = false;
app.audioText = '长按录音'
if (app.voicePath.length > 1) {
app.voicePath.shift()
setTimeout(() => {
app.sendAudio()
}, 1000)
} else {
app.voicePath = []
}
} else {
uni.showToast({
icon: 'none',
title: ret.msg
})
}
})
},
fail: function(error) {
// uni.showToast({
// title: "", //
// duration: 3000, //
// icon: "none", //"success""loading"
// });
scoketParams.isLoading = 'fail'
uni.$emit('scoket', JSON.stringify(scoketParams))
}
})
},
chatCollect() {
uni.navigateTo({
url: '/pages/im/chat/chatCollect'
})
},
goQuick() {
uni.navigateTo({
url: '/pages/im/quick/index?sendType=' + this.sendType + '&toUserNo=' + this.toUserNo
})
},
getEmoji() {
return [...emojiData[0].list, ...emojiData[1].list, ...emojiData[4].list]
},
setEmoji(data) {
let str = ' ' + this.entitiestoUtf16(data) + ' '
this.chatInfo += str;
},
onInput() {
this.emojiShow = false;
this.audioShow = false;
this.moreShow = false;
this.$emit('setInput', false)
},
setMoreShow() {
this.moreShow = !this.moreShow;
this.emojiShow = false;
this.audioShow = false;
this.$emit('setInput', this.moreShow)
},
setAudioShow() {
this.audioShow = !this.audioShow;
this.emojiShow = false;
this.moreShow = false;
this.$emit('setInput', false)
// this.$emit('setInput', this.audioShow)
},
setEmojiShow() {
// this.chatInfo = '@\t@asdadad1\t2 '
// console.log(JSON.stringify(this.chatInfo))
// return false;
this.emojiShow = !this.emojiShow;
this.moreShow = false;
this.audioShow = false;
this.$emit('setInput', this.emojiShow)
},
utf16toEntities(val) {
return utf16toEntities(val)
},
entitiestoUtf16(val) {
return entitiestoUtf16(val)
},
},
watch: {
audioShow: function(n, o) {
this.$emit('onAudioShow', n)
},
chatInfo: function(n, o) {
let app = this;
if (app.sendType != 2) {
return false;
}
//
uni.getSelectedTextRange({
success: res => {
app.txtIndex = res.end;
//,便
let curEnd = n.slice(res.end)
let curStr = n.slice(0, res.end)
/*
新增艾特相关
*/
let oldStr1 = o.slice(0, res.end)
if (curStr == oldStr1 + '@') {
app.aitKeyword = '';
app.showAitFlag = true;
uni.hideKeyboard()
}
/*
删除艾特相关
*/
//
let oldStr = o.slice(0, res.end + 1)
//\t,
if (curStr.length < oldStr.length && curStr + '\t' == oldStr) {
//
let num = curStr.lastIndexOf('@')
let nowStr = curStr.slice(0, num)
app.chatInfo = nowStr + curEnd;
console.log('删除艾特')
}
}
})
}
}
}
</script>
<style lang="scss">
// .isInput {
// bottom: 570rpx !important;
// }
.chat-bottom {
position: fixed;
bottom: 0;
width: 100%;
min-height: 148rpx;
background-color: #fff;
display: flex;
flex-flow: column;
.bottom-operation {
width: 100%;
display: flex;
align-items: flex-end;
padding: 17px 30rpx;
}
.goVoice {
width: 52rpx;
height: 52rpx;
margin-right: 10rpx;
margin-bottom: 15rpx;
image {
width: 100%;
height: 100%;
}
}
.textarea {
height: 80rpx;
max-height: 200rpx !important;
overflow: auto;
width: 490rpx;
line-height: 80rpx;
background: #F8F8F8;
border-radius: 40rpx;
padding: 0 40rpx;
}
.textarea2 {
width: 420rpx;
line-height: 48rpx;
min-height: 80rpx;
/deep/.uni-textarea-textarea{
padding-top: 16rpx;
}
}
.audio {
flex: 1;
background: #F8F8F8;
border-radius: 39rpx;
font-size: 28rpx;
font-family: PingFang SC;
font-weight: 500;
color: #333;
height: 78rpx;
text-align: center;
line-height: 78rpx;
}
/deep/.u-input {
flex: 1;
background: #F8F8F8;
border-radius: 39rpx;
font-size: 28rpx;
font-family: PingFang SC;
font-weight: 500;
color: #333;
max-height: 200rpx !important;
overflow-y: auto;
.u-input__textarea {
display: flex;
align-items: center;
box-sizing: border-box;
padding: 20rpx 40rpx;
max-height: 200rpx;
}
}
.goexpression {
width: 52rpx;
height: 53rpx;
margin-left: 15rpx;
margin-right: 19rpx;
margin-bottom: 15rpx;
image {
width: 100%;
height: 100%;
}
}
.more {
width: 53rpx;
height: 53rpx;
margin-bottom: 15rpx;
image {
width: 100%;
height: 100%;
}
}
.send-btn {
display: flex;
align-items: center;
justify-content: center;
width: 120rpx;
height: 60rpx;
background-color: #fb3a4e;
color: #fff;
font-size: 28rpx;
border-radius: 10rpx;
margin-bottom: 15rpx;
transition: all .3s;
}
.operation-box {
display: flex;
align-items: center;
flex-wrap: wrap;
justify-content: space-around;
background-color: #f8f8f8;
padding: 0 30rpx;
.operation-item {
width: 120rpx;
padding: 30rpx 0;
.item-btn {
display: flex;
align-items: center;
justify-content: center;
width: 120rpx;
height: 120rpx;
background-color: #fff;
border-radius: 16rpx;
image {
width: 50rpx;
height: 50rpx;
}
}
.item-hint {
text-align: center;
font-size: 24rpx;
font-family: PingFang SC;
font-weight: 500;
color: #999999;
margin-top: 13rpx;
}
}
}
}
.bottom-box {
max-height: 300rpx;
overflow-y: auto;
}
.emoji-box {
padding: 0 30rpx 30rpx;
.emoji {
margin: 10rpx;
font-size: 48rpx;
}
}
.audio-box {
height: 300rpx;
display: flex;
justify-content: center;
align-items: center;
.circle {
margin: 0 100rpx;
width: 150rpx;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
.audio-icon {
width: 120rpx;
height: 120rpx;
border-radius: 50%;
margin-bottom: 20rpx;
}
}
}
.ait-box {
width: 750rpx;
height: 850rpx;
background-color: #fff;
z-index: 999;
.ab-title {
position: relative;
display: flex;
justify-content: center;
align-items: center;
margin-top: 40rpx;
.abt-close {
position: absolute;
top: 10rpx;
left: 40rpx;
}
.abt-txt {
font-size: 28rpx;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 500;
color: #000000;
}
}
.ab-item {
width: 750rpx;
height: 120rpx;
display: flex;
padding: 0 40rpx;
align-items: center;
&:hover {
background-color: #EEEEEE;
}
.abi-all {
width: 80rpx;
height: 80rpx;
border-radius: 50%;
margin-right: 30rpx;
background-color: #FFEBED;
text-align: center;
line-height: 80rpx;
font-size: 36rpx;
font-family: SF Pro Display-Medium, SF Pro Display;
font-weight: 500;
color: #FB3A4E;
}
.abi-img {
width: 80rpx;
height: 80rpx;
border-radius: 50%;
margin-right: 30rpx;
}
.abi-name {
font-size: 28rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #333333;
}
}
}
.ipt-wrp {
margin: 18rpx auto;
position: relative;
width: 690rpx;
.ipt-icon {
position: absolute;
left: 28rpx;
height: 24rpx;
width: 24rpx;
top: 20rpx;
}
.ipt {
width: 100%;
height: 64rpx;
background: #f6f6f6;
border-radius: 32rpx;
font-size: 28rpx;
color: #999;
padding-left: 76rpx;
}
}
</style>

@ -1,127 +0,0 @@
<!--
* @Author: ch
* @Date: 2022-03-26 14:32:03
* @LastEditors: ch
* @LastEditTime: 2022-05-17 16:22:13
* @Description: file content
-->
<template>
<view class="main">
<view class="msg-item" v-for="item in msgData" :key="item.id">
<view class="msg-item--title">
<text>{{item.payload.title }} {{item.id}}</text>
<text class="msg-item--time">{{item.createTimeStamp}}</text>
</view>
<view class="msg-item--con">
<image class="msg-item--img" src="@/static/message/xt.png" mode="widthFix"/>
<view class="msg-item--desc">{{item.payload.content}}</view>
</view>
</view>
<u-loadmore status="loading" v-if="!msgData.length"/>
</view>
</template>
<script>
import {MsbWebSkt, createUUID} from '@/common/utils';
export default {
data(){
return {
}
},
computed:{
curSessionData(){
return this.$store.state.sessionData.find(i =>i.id == this.$store.state.sessionMsgId)
},
msgData (){
return this.curSessionData ? this.curSessionData.messageList : [];
}
},
onReachBottom(){
this.getHistoryMsg();
},
onShow(){
if(!this.$store.state.sessionMsgId){
this.$Router.back();
return false
}
uni.setNavigationBarTitle({
title : this.curSessionData.fromNickname
});
this.getHistoryMsg();
this.readMsg();
},
methods:{
/**
* 获取历史消息
*/
getHistoryMsg(){
this.loading = true;
const lastMsg = this.msgData[this.msgData.length - 1] || {};
MsbWebSkt.send({
data : JSON.stringify({
traceId : createUUID(),
traceType : "2",
content: {
sessionId : this.$store.state.sessionMsgId,
topMessageId : lastMsg.id || null
}
})
})
},
/**
* 已读消息
*/
readMsg(){
MsbWebSkt.send({
data : JSON.stringify({
traceId : createUUID(),
traceType : "6",
content: {
sessionId : this.$store.state.sessionMsgId
}
})
});
//
const count = this.$store.state.sessionMsgCount - this.curSessionData.unreadCount;
//
this.curSessionData.unreadCount = 0;
this.$store.commit('SET_SESSION_MSG_COUNT', count)
}
}
}
</script>
<style lang="scss" scoped>
.msg-item{
padding: 40rpx 0 0 40rpx;
&--title{
display: flex;
justify-content: space-between;
align-items: center;
padding-right: 40rpx;
font-size: $font-size-lg;
color: $color-grey6;
}
&--time{
font-size: $font-size-sm;
color: $color-grey4;
}
&--con{
display: flex;
border-bottom: 1px solid $color-grey2;
padding: 40rpx 0;
}
&--img{
width: 140rpx;
height: 140rpx;
border-radius: 12rpx;
margin-right: 40rpx;
}
&--desc{
width: 455rpx;
font-size: $font-size-base;
line-height: 39rpx;
color: $color-grey5;
}
}
</style>

@ -0,0 +1,22 @@
const path = require('path')
module.exports = {
parser: require('postcss-comment'),
plugins: [
require('postcss-import')({
resolve (id, basedir, importOptions) {
if (id.startsWith('~@/')) {
return path.resolve(process.env.UNI_INPUT_DIR, id.substr(3))
} else if (id.startsWith('@/')) {
return path.resolve(process.env.UNI_INPUT_DIR, id.substr(2))
} else if (id.startsWith('/') && !id.startsWith('//')) {
return path.resolve(process.env.UNI_INPUT_DIR, id.substr(1))
}
return id
}
}),
require('autoprefixer')({
remove: process.env.UNI_PLATFORM !== 'h5'
}),
require('@dcloudio/vue-cli-plugin-uni/packages/postcss')
]
}

@ -0,0 +1,32 @@
<!--
* @Author: ch
* @Date: 2022-05-27 17:44:36
* @LastEditors: ch
* @LastEditTime: 2022-06-29 21:37:10
* @Description: file content
-->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>
<%= htmlWebpackPlugin.options.title %>
</title>
<script>
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') || CSS.supports('top: constant(a)'))
document.write('<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' + (coverSupport ? ', viewport-fit=cover' : '') + '" />')
</script>
<link rel="stylesheet" href="<%= BASE_URL %>static/index.<%= VUE_APP_INDEX_CSS_HASH %>.css" />
</head>
<body class="page">
<noscript>
<strong>Please enable JavaScript to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>

@ -1,22 +1,23 @@
<!--
* @Author: ch
* @Date: 2019-04-01 01:47:12
* @Date: 2022-05-23 20:13:23
* @LastEditors: ch
* @LastEditTime: 2022-04-30 17:47:26
* @LastEditTime: 2022-05-24 10:00:15
* @Description: file content
-->
<script>
export default {
onLaunch: function() {
// console.log('App Launch')
console.log('App Launch')
},
onShow: function() {
console.log('App Show')
},
onHide: function() {
// console.log('App Hide')
console.log('App Hide')
}
}
</script>
<style lang="scss">
@ -37,6 +38,4 @@
/* 兼容 iOS >= 11.2 */
}
/* #endif */
</style>
</style>

@ -0,0 +1,18 @@
/*
* @Author: ch
* @Date: 2022-05-31 11:17:38
* @LastEditors: ch
* @LastEditTime: 2022-05-31 11:35:10
* @Description: file content
*/
import {ToAsyncAwait, MsbRequest} from '@/common/utils';
import { AD_PLATFORM } from '../dicts/ad';
const BASE_URL = '/mall/marketing';
// 获取广告列表
export const ApiGetAdList = (params) => ToAsyncAwait(MsbRequest.get(`${BASE_URL}/app/advertisement`, {
platform : AD_PLATFORM.MOBILE,
...params
}))

@ -2,13 +2,34 @@
* @Author: ch
* @Date: 2022-04-06 17:29:13
* @LastEditors: ch
* @LastEditTime: 2022-04-15 14:17:14
* @LastEditTime: 2022-05-31 11:18:44
* @Description: file content
*/
import {ToAsyncAwait, MsbRequestTk} from '@/common/utils';
import {ToAsyncAwait, MsbRequest, MsbRequestTk} from '@/common/utils';
const BASE_URL = '/mall/base';
const BASE_URL_UC = '/uc';
/**
* 登录
* @param {*} data
*/
export const ApiPostLogin = (data) => ToAsyncAwait(MsbRequest.post(`${BASE_URL_UC}/user/login`, data));
/**
* 退出登录
* @param {*} data
*/
export const ApiGetLogout= () => ToAsyncAwait(MsbRequest.get(`${BASE_URL_UC}/user/logout`));
/**
* 获取手机验证码
* @param {*} params
*/
export const ApiGetCode = (params) => ToAsyncAwait(MsbRequest.get(`${BASE_URL_UC}/user/login/verificationCode`, params));
/**
* 获取收货地址
*/

@ -0,0 +1,66 @@
/*
* @Author: ch
* @Date: 2022-06-20 11:38:48
* @LastEditors: ch
* @LastEditTime: 2022-06-30 11:53:57
* @Description: file content
*/
import {ToAsyncAwait, MsbRequest, MsbRequestTk} from '@/common/utils';
const BASE_URL = '/mall/comment';
/**
* 根据商品获取评论列表
* @param {*} param0
*/
export const ApiGetCommentList = (params) =>
ToAsyncAwait(MsbRequestTk.get(`${BASE_URL}/app/comment`,params, {
notVerifyToken: true
}));
/**
* 根据商品获取评论总数
* @param {*} param0
*/
export const ApiGetCommentCount = ({productId}) =>
ToAsyncAwait(MsbRequestTk.get(`${BASE_URL}/app/comment/getAllCommentCountByProductId/${productId}`,{}, {
notVerifyToken: true
}));
/**
* 根据商品获取标签评论总数
* @param {*} param0
*/
export const ApiGetCommentTabCount = ({productId}) =>
ToAsyncAwait(MsbRequestTk.get(`${BASE_URL}/app/comment/listCommentLabel/${productId}`,{}, {
notVerifyToken: true
}));
/**
* 获取订单评论详情
* @param {*} param0
*/
export const ApiGetOrderCommentDetail = ({orderId}) =>
ToAsyncAwait(MsbRequestTk.get(`${BASE_URL}/app/comment/listOrderCommentByOrderId/${orderId}`));
/**
* 获取评论详情
* @param {*} param0
*/
export const ApiGetCommentDetail = ({commentId}) =>
ToAsyncAwait(MsbRequestTk.get(`${BASE_URL}/app/comment/getCommentDetail/${commentId}`,{}, {
notVerifyToken: true
}));
/**
* 新增评论
* @param {*} param0
*/
export const ApiPostComment = (data) =>
ToAsyncAwait(MsbRequestTk.post(`${BASE_URL}/app/comment`, data));
/**
* 更新评论有用数
* @param {*} param0
*/
export const ApiPutCommentUseful = (data) =>
ToAsyncAwait(MsbRequestTk.put(`${BASE_URL}/app/comment/updateUsefulCount`,data));

@ -0,0 +1,16 @@
/*
* @Author: ch
* @Date: 2022-05-27 17:44:36
* @LastEditors: ch
* @LastEditTime: 2022-06-09 11:34:36
* @Description: file content
*/
import {ToAsyncAwait, MsbRequestTk} from '@/common/utils';
const BASE_URL = '/mall/im';
/**
* 获取soket登录秘钥
*/
export const ApiGetSoketTicket = () => ToAsyncAwait(MsbRequestTk.get(`${BASE_URL}/ticket`, {
ticketType: 'CONNECT_TICKET'
}));

@ -2,7 +2,7 @@
* @Author: ch
* @Date: 2022-03-17 16:37:45
* @LastEditors: ch
* @LastEditTime: 2022-05-16 15:52:57
* @LastEditTime: 2022-05-24 17:25:25
* @Description: file content
*/
@ -18,7 +18,7 @@ export const ApiPostLogin = (data) => ToAsyncAwait(MsbRequest.post(`${BASE_URL}/
* 退出登录
* @param {*} data
*/
export const ApiGetLogout= () => ToAsyncAwait(MsbRequest.post(`${BASE_URL}/user/logout`));
export const ApiGetLogout= () => ToAsyncAwait(MsbRequest.get(`${BASE_URL}/user/logout`));
/**
* 获取手机验证码
* @param {*} params

@ -2,7 +2,7 @@
* @Author: ch
* @Date: 2022-03-29 17:38:17
* @LastEditors: ch
* @LastEditTime: 2022-05-10 16:14:53
* @LastEditTime: 2022-06-23 16:21:32
* @Description: file content
*/
import {ToAsyncAwait, MsbRequestTk} from '@/common/utils';
@ -84,8 +84,11 @@ export const ApiPutCancelOrder = (data) =>
export const ApiGetOrderStatistics = () =>
ToAsyncAwait(MsbRequestTk.get(`${BASE_URL}/app/tradeOrder/statistics`));
/**
* 获取待评价订单详请列表
*/
export const ApiGetCommentOrderDetailList = (params) =>
ToAsyncAwait(MsbRequestTk.get(`${BASE_URL}/app/tradeOrder/listOrderProductWaitComment`,params))
/**

@ -0,0 +1,51 @@
/*
* @Author: ch
* @Date: 2022-04-28 16:30:54
* @LastEditors: ch
* @LastEditTime: 2022-07-09 10:16:00
* @Description: file content
*/
import {ToAsyncAwait, MsbRequest, MsbRequestTk} from '@/common/utils';
const BASE_URL = '/mall/trade';
export const ApiPostCashierPrepay = (data) =>
ToAsyncAwait(MsbRequestTk.post(`${BASE_URL}/payCenter/cashierPrepay`, data));
/**
* 微信h5支付获取支付URL
* @param {*} data
*/
export const ApiPostWxH5Pay = (data) =>
ToAsyncAwait(MsbRequestTk.post(`${BASE_URL}/payCenter/wxPay/h5`, data));
/**
* 微信JSAPI支付获取支付参数
* @param {*} data
*/
export const ApiPostWxJsApiPay = (data) =>
ToAsyncAwait(MsbRequestTk.post(`${BASE_URL}/payCenter/wxPay/jsapi`, data));
/**
* 微信APP支付
* @param {*} data
*/
export const ApiPostWxAppPay = (data) =>
ToAsyncAwait(MsbRequestTk.post(`${BASE_URL}/payCenter/wxPay/app`, data));
/**
* 支付宝APP支付
* @param {*} data
*/
export const ApiPostAliAppPay = (data) =>
ToAsyncAwait(MsbRequestTk.post(`${BASE_URL}/payCenter/aliPay/app`, data));
/**
* 支付宝h5支付获取支付URL
* @param {*} data
*/
export const ApiPostAliH5Pay = (data) =>
ToAsyncAwait(MsbRequestTk.post(`${BASE_URL}/payCenter/aliPay/wap`, data));

@ -2,13 +2,12 @@
* @Author: ch
* @Date: 2022-04-28 16:30:54
* @LastEditors: ch
* @LastEditTime: 2022-05-17 20:07:26
* @LastEditTime: 2022-06-29 17:16:50
* @Description: file content
*/
import {ToAsyncAwait, MsbRequest, MsbRequestTk} from '@/common/utils';
const BASE_URL = '/mall/trade';
// 第三方鉴权服务
const AUTH_URL = '/third';
const APPID = 'wxd2015f0c56defa02';
@ -33,24 +32,3 @@ export const ApiGetOpenId = ({code}) =>
*/
export const ApiPostThirdInfo = (data) =>
ToAsyncAwait(MsbRequestTk.post(`${AUTH_URL}/third/saveThirdInfo`, {...data, appId:APPID}));
/**
* 微信h5支付获取支付URL
* @param {*} data
*/
export const ApiPostWxH5Pay = (data) =>
ToAsyncAwait(MsbRequestTk.post(`${BASE_URL}/pay/wxPay/h5`, data));
/**
* 微信JSAPI支付获取支付参数
* @param {*} data
*/
export const ApiPostWxJsApiPay = (data) =>
ToAsyncAwait(MsbRequestTk.post(`${BASE_URL}/pay/wxPay/jsapi`, data));
/**
* 微信APP支付
* @param {*} data
*/
export const ApiPostWxAppPay = (data) =>
ToAsyncAwait(MsbRequestTk.post(`${BASE_URL}/pay/wxPay/app`, data));

@ -0,0 +1,42 @@
/*
* @Author: ch
* @Date: 2022-05-31 11:05:08
* @LastEditors: ch
* @LastEditTime: 2022-05-31 17:23:02
* @Description: file content
*/
const AD_PLATFORM = {
PC: 2,
MOBILE : 1
}
const AD_LOCATION = {
// 首页轮播图
HOME_BANNER: 1,
// 首页精装区
HOME_HARDCOVER: 2,
// 分类banner
CATEGORY_BANNER : 3
}
const AD_JUMP_TYPE = {
// 商品详情
GOODS: 1,
// 分类
CATEGORY: 2,
// 链接
LINK: 3,
// 不跳转
NO_JUMP : 4
}
export {
// 广告所属平台
AD_PLATFORM,
// 广告位置
AD_LOCATION,
// 广告跳转类型
AD_JUMP_TYPE
}

@ -0,0 +1,706 @@
[
{ "code": "110000", "name": "北京市", "children": [{ "code": "110100", "name": "北京城区", "children": [{ "code": "110101", "name": "东城区" }, { "code": "110102", "name": "西城区" }, { "code": "110105", "name": "朝阳区" }, { "code": "110106", "name": "丰台区" }, { "code": "110107", "name": "石景山区" }, { "code": "110108", "name": "海淀区" }, { "code": "110109", "name": "门头沟区" }, { "code": "110111", "name": "房山区" }, { "code": "110112", "name": "通州区" }, { "code": "110113", "name": "顺义区" }, { "code": "110114", "name": "昌平区" }, { "code": "110115", "name": "大兴区" }, { "code": "110116", "name": "怀柔区" }, { "code": "110117", "name": "平谷区" }, { "code": "110118", "name": "密云区" }, { "code": "110119", "name": "延庆区" }] }] },
{ "code": "120000", "name": "天津市", "children": [{ "code": "120100", "name": "天津城区", "children": [{ "code": "120101", "name": "和平区" }, { "code": "120102", "name": "河东区" }, { "code": "120103", "name": "河西区" }, { "code": "120104", "name": "南开区" }, { "code": "120105", "name": "河北区" }, { "code": "120106", "name": "红桥区" }, { "code": "120110", "name": "东丽区" }, { "code": "120111", "name": "西青区" }, { "code": "120112", "name": "津南区" }, { "code": "120113", "name": "北辰区" }, { "code": "120114", "name": "武清区" }, { "code": "120115", "name": "宝坻区" }, { "code": "120116", "name": "滨海新区" }, { "code": "120117", "name": "宁河区" }, { "code": "120118", "name": "静海区" }, { "code": "120119", "name": "蓟州区" }] }] },
{
"code": "130000",
"name": "河北省",
"children": [
{
"code": "130100",
"name": "石家庄市",
"children": [
{ "code": "130102", "name": "长安区" },
{ "code": "130104", "name": "桥西区" },
{ "code": "130105", "name": "新华区" },
{ "code": "130107", "name": "井陉矿区" },
{ "code": "130108", "name": "裕华区" },
{ "code": "130109", "name": "藁城区" },
{ "code": "130110", "name": "鹿泉区" },
{ "code": "130111", "name": "栾城区" },
{ "code": "130121", "name": "井陉县" },
{ "code": "130123", "name": "正定县" },
{ "code": "130125", "name": "行唐县" },
{ "code": "130126", "name": "灵寿县" },
{ "code": "130127", "name": "高邑县" },
{ "code": "130128", "name": "深泽县" },
{ "code": "130129", "name": "赞皇县" },
{ "code": "130130", "name": "无极县" },
{ "code": "130131", "name": "平山县" },
{ "code": "130132", "name": "元氏县" },
{ "code": "130133", "name": "赵县" },
{ "code": "130181", "name": "辛集市" },
{ "code": "130183", "name": "晋州市" },
{ "code": "130184", "name": "新乐市" }
]
},
{ "code": "130200", "name": "唐山市", "children": [{ "code": "130202", "name": "路南区" }, { "code": "130203", "name": "路北区" }, { "code": "130204", "name": "古冶区" }, { "code": "130205", "name": "开平区" }, { "code": "130207", "name": "丰南区" }, { "code": "130208", "name": "丰润区" }, { "code": "130209", "name": "曹妃甸区" }, { "code": "130223", "name": "滦县" }, { "code": "130224", "name": "滦南县" }, { "code": "130225", "name": "乐亭县" }, { "code": "130227", "name": "迁西县" }, { "code": "130229", "name": "玉田县" }, { "code": "130281", "name": "遵化市" }, { "code": "130283", "name": "迁安市" }] },
{ "code": "130300", "name": "秦皇岛市", "children": [{ "code": "130302", "name": "海港区" }, { "code": "130303", "name": "山海关区" }, { "code": "130304", "name": "北戴河区" }, { "code": "130306", "name": "抚宁区" }, { "code": "130321", "name": "青龙满族自治县" }, { "code": "130322", "name": "昌黎县" }, { "code": "130324", "name": "卢龙县" }] },
{
"code": "130400",
"name": "邯郸市",
"children": [{ "code": "130402", "name": "邯山区" }, { "code": "130403", "name": "丛台区" }, { "code": "130404", "name": "复兴区" }, { "code": "130406", "name": "峰峰矿区" }, { "code": "130407", "name": "肥乡区" }, { "code": "130408", "name": "永年区" }, { "code": "130423", "name": "临漳县" }, { "code": "130424", "name": "成安县" }, { "code": "130425", "name": "大名县" }, { "code": "130426", "name": "涉县" }, { "code": "130427", "name": "磁县" }, { "code": "130430", "name": "邱县" }, { "code": "130431", "name": "鸡泽县" }, { "code": "130432", "name": "广平县" }, { "code": "130433", "name": "馆陶县" }, { "code": "130434", "name": "魏县" }, { "code": "130435", "name": "曲周县" }, { "code": "130481", "name": "武安市" }]
},
{
"code": "130500",
"name": "邢台市",
"children": [
{ "code": "130502", "name": "桥东区" },
{ "code": "130503", "name": "桥西区" },
{ "code": "130521", "name": "邢台县" },
{ "code": "130522", "name": "临城县" },
{ "code": "130523", "name": "内丘县" },
{ "code": "130524", "name": "柏乡县" },
{ "code": "130525", "name": "隆尧县" },
{ "code": "130526", "name": "任县" },
{ "code": "130527", "name": "南和县" },
{ "code": "130528", "name": "宁晋县" },
{ "code": "130529", "name": "巨鹿县" },
{ "code": "130530", "name": "新河县" },
{ "code": "130531", "name": "广宗县" },
{ "code": "130532", "name": "平乡县" },
{ "code": "130533", "name": "威县" },
{ "code": "130534", "name": "清河县" },
{ "code": "130535", "name": "临西县" },
{ "code": "130581", "name": "南宫市" },
{ "code": "130582", "name": "沙河市" }
]
},
{
"code": "130600",
"name": "保定市",
"children": [
{ "code": "130602", "name": "竞秀区" },
{ "code": "130606", "name": "莲池区" },
{ "code": "130607", "name": "满城区" },
{ "code": "130608", "name": "清苑区" },
{ "code": "130609", "name": "徐水区" },
{ "code": "130623", "name": "涞水县" },
{ "code": "130624", "name": "阜平县" },
{ "code": "130626", "name": "定兴县" },
{ "code": "130627", "name": "唐县" },
{ "code": "130628", "name": "高阳县" },
{ "code": "130629", "name": "容城县" },
{ "code": "130630", "name": "涞源县" },
{ "code": "130631", "name": "望都县" },
{ "code": "130632", "name": "安新县" },
{ "code": "130633", "name": "易县" },
{ "code": "130634", "name": "曲阳县" },
{ "code": "130635", "name": "蠡县" },
{ "code": "130636", "name": "顺平县" },
{ "code": "130637", "name": "博野县" },
{ "code": "130638", "name": "雄县" },
{ "code": "130681", "name": "涿州市" },
{ "code": "130682", "name": "定州市" },
{ "code": "130683", "name": "安国市" },
{ "code": "130684", "name": "高碑店市" }
]
},
{ "code": "130700", "name": "张家口市", "children": [{ "code": "130702", "name": "桥东区" }, { "code": "130703", "name": "桥西区" }, { "code": "130705", "name": "宣化区" }, { "code": "130706", "name": "下花园区" }, { "code": "130708", "name": "万全区" }, { "code": "130709", "name": "崇礼区" }, { "code": "130722", "name": "张北县" }, { "code": "130723", "name": "康保县" }, { "code": "130724", "name": "沽源县" }, { "code": "130725", "name": "尚义县" }, { "code": "130726", "name": "蔚县" }, { "code": "130727", "name": "阳原县" }, { "code": "130728", "name": "怀安县" }, { "code": "130730", "name": "怀来县" }, { "code": "130731", "name": "涿鹿县" }, { "code": "130732", "name": "赤城县" }] },
{ "code": "130800", "name": "承德市", "children": [{ "code": "130802", "name": "双桥区" }, { "code": "130803", "name": "双滦区" }, { "code": "130804", "name": "鹰手营子矿区" }, { "code": "130821", "name": "承德县" }, { "code": "130822", "name": "兴隆县" }, { "code": "130824", "name": "滦平县" }, { "code": "130825", "name": "隆化县" }, { "code": "130826", "name": "丰宁满族自治县" }, { "code": "130827", "name": "宽城满族自治县" }, { "code": "130828", "name": "围场满族蒙古族自治县" }, { "code": "130881", "name": "平泉市" }] },
{ "code": "130900", "name": "沧州市", "children": [{ "code": "130902", "name": "新华区" }, { "code": "130903", "name": "运河区" }, { "code": "130921", "name": "沧县" }, { "code": "130922", "name": "青县" }, { "code": "130923", "name": "东光县" }, { "code": "130924", "name": "海兴县" }, { "code": "130925", "name": "盐山县" }, { "code": "130926", "name": "肃宁县" }, { "code": "130927", "name": "南皮县" }, { "code": "130928", "name": "吴桥县" }, { "code": "130929", "name": "献县" }, { "code": "130930", "name": "孟村回族自治县" }, { "code": "130981", "name": "泊头市" }, { "code": "130982", "name": "任丘市" }, { "code": "130983", "name": "黄骅市" }, { "code": "130984", "name": "河间市" }] },
{ "code": "131000", "name": "廊坊市", "children": [{ "code": "131002", "name": "安次区" }, { "code": "131003", "name": "广阳区" }, { "code": "131022", "name": "固安县" }, { "code": "131023", "name": "永清县" }, { "code": "131024", "name": "香河县" }, { "code": "131025", "name": "大城县" }, { "code": "131026", "name": "文安县" }, { "code": "131028", "name": "大厂回族自治县" }, { "code": "131081", "name": "霸州市" }, { "code": "131082", "name": "三河市" }] },
{ "code": "131100", "name": "衡水市", "children": [{ "code": "131102", "name": "桃城区" }, { "code": "131103", "name": "冀州区" }, { "code": "131121", "name": "枣强县" }, { "code": "131122", "name": "武邑县" }, { "code": "131123", "name": "武强县" }, { "code": "131124", "name": "饶阳县" }, { "code": "131125", "name": "安平县" }, { "code": "131126", "name": "故城县" }, { "code": "131127", "name": "景县" }, { "code": "131128", "name": "阜城县" }, { "code": "131182", "name": "深州市" }] }
]
},
{
"code": "140000",
"name": "山西省",
"children": [
{ "code": "140100", "name": "太原市", "children": [{ "code": "140105", "name": "小店区" }, { "code": "140106", "name": "迎泽区" }, { "code": "140107", "name": "杏花岭区" }, { "code": "140108", "name": "尖草坪区" }, { "code": "140109", "name": "万柏林区" }, { "code": "140110", "name": "晋源区" }, { "code": "140121", "name": "清徐县" }, { "code": "140122", "name": "阳曲县" }, { "code": "140123", "name": "娄烦县" }, { "code": "140181", "name": "古交市" }] },
{ "code": "140200", "name": "大同市", "children": [{ "code": "140202", "name": "城区" }, { "code": "140203", "name": "矿区" }, { "code": "140211", "name": "南郊区" }, { "code": "140212", "name": "新荣区" }, { "code": "140221", "name": "阳高县" }, { "code": "140222", "name": "天镇县" }, { "code": "140223", "name": "广灵县" }, { "code": "140224", "name": "灵丘县" }, { "code": "140225", "name": "浑源县" }, { "code": "140226", "name": "左云县" }, { "code": "140227", "name": "大同县" }] },
{ "code": "140300", "name": "阳泉市", "children": [{ "code": "140302", "name": "城区" }, { "code": "140303", "name": "矿区" }, { "code": "140311", "name": "郊区" }, { "code": "140321", "name": "平定县" }, { "code": "140322", "name": "盂县" }] },
{ "code": "140400", "name": "长治市", "children": [{ "code": "140402", "name": "城区" }, { "code": "140411", "name": "郊区" }, { "code": "140421", "name": "长治县" }, { "code": "140423", "name": "襄垣县" }, { "code": "140424", "name": "屯留县" }, { "code": "140425", "name": "平顺县" }, { "code": "140426", "name": "黎城县" }, { "code": "140427", "name": "壶关县" }, { "code": "140428", "name": "长子县" }, { "code": "140429", "name": "武乡县" }, { "code": "140430", "name": "沁县" }, { "code": "140431", "name": "沁源县" }, { "code": "140481", "name": "潞城市" }] },
{ "code": "140500", "name": "晋城市", "children": [{ "code": "140502", "name": "城区" }, { "code": "140521", "name": "沁水县" }, { "code": "140522", "name": "阳城县" }, { "code": "140524", "name": "陵川县" }, { "code": "140525", "name": "泽州县" }, { "code": "140581", "name": "高平市" }] },
{ "code": "140600", "name": "朔州市", "children": [{ "code": "140602", "name": "朔城区" }, { "code": "140603", "name": "平鲁区" }, { "code": "140621", "name": "山阴县" }, { "code": "140622", "name": "应县" }, { "code": "140623", "name": "右玉县" }, { "code": "140624", "name": "怀仁县" }] },
{ "code": "140700", "name": "晋中市", "children": [{ "code": "140702", "name": "榆次区" }, { "code": "140721", "name": "榆社县" }, { "code": "140722", "name": "左权县" }, { "code": "140723", "name": "和顺县" }, { "code": "140724", "name": "昔阳县" }, { "code": "140725", "name": "寿阳县" }, { "code": "140726", "name": "太谷县" }, { "code": "140727", "name": "祁县" }, { "code": "140728", "name": "平遥县" }, { "code": "140729", "name": "灵石县" }, { "code": "140781", "name": "介休市" }] },
{ "code": "140800", "name": "运城市", "children": [{ "code": "140802", "name": "盐湖区" }, { "code": "140821", "name": "临猗县" }, { "code": "140822", "name": "万荣县" }, { "code": "140823", "name": "闻喜县" }, { "code": "140824", "name": "稷山县" }, { "code": "140825", "name": "新绛县" }, { "code": "140826", "name": "绛县" }, { "code": "140827", "name": "垣曲县" }, { "code": "140828", "name": "夏县" }, { "code": "140829", "name": "平陆县" }, { "code": "140830", "name": "芮城县" }, { "code": "140881", "name": "永济市" }, { "code": "140882", "name": "河津市" }] },
{ "code": "140900", "name": "忻州市", "children": [{ "code": "140902", "name": "忻府区" }, { "code": "140921", "name": "定襄县" }, { "code": "140922", "name": "五台县" }, { "code": "140923", "name": "代县" }, { "code": "140924", "name": "繁峙县" }, { "code": "140925", "name": "宁武县" }, { "code": "140926", "name": "静乐县" }, { "code": "140927", "name": "神池县" }, { "code": "140928", "name": "五寨县" }, { "code": "140929", "name": "岢岚县" }, { "code": "140930", "name": "河曲县" }, { "code": "140931", "name": "保德县" }, { "code": "140932", "name": "偏关县" }, { "code": "140981", "name": "原平市" }] },
{ "code": "141000", "name": "临汾市", "children": [{ "code": "141002", "name": "尧都区" }, { "code": "141021", "name": "曲沃县" }, { "code": "141022", "name": "翼城县" }, { "code": "141023", "name": "襄汾县" }, { "code": "141024", "name": "洪洞县" }, { "code": "141025", "name": "古县" }, { "code": "141026", "name": "安泽县" }, { "code": "141027", "name": "浮山县" }, { "code": "141028", "name": "吉县" }, { "code": "141029", "name": "乡宁县" }, { "code": "141030", "name": "大宁县" }, { "code": "141031", "name": "隰县" }, { "code": "141032", "name": "永和县" }, { "code": "141033", "name": "蒲县" }, { "code": "141034", "name": "汾西县" }, { "code": "141081", "name": "侯马市" }, { "code": "141082", "name": "霍州市" }] },
{ "code": "141100", "name": "吕梁市", "children": [{ "code": "141102", "name": "离石区" }, { "code": "141121", "name": "文水县" }, { "code": "141122", "name": "交城县" }, { "code": "141123", "name": "兴县" }, { "code": "141124", "name": "临县" }, { "code": "141125", "name": "柳林县" }, { "code": "141126", "name": "石楼县" }, { "code": "141127", "name": "岚县" }, { "code": "141128", "name": "方山县" }, { "code": "141129", "name": "中阳县" }, { "code": "141130", "name": "交口县" }, { "code": "141181", "name": "孝义市" }, { "code": "141182", "name": "汾阳市" }] }
]
},
{
"code": "150000",
"name": "内蒙古自治区",
"children": [
{ "code": "150100", "name": "呼和浩特市", "children": [{ "code": "150102", "name": "新城区" }, { "code": "150103", "name": "回民区" }, { "code": "150104", "name": "玉泉区" }, { "code": "150105", "name": "赛罕区" }, { "code": "150121", "name": "土默特左旗" }, { "code": "150122", "name": "托克托县" }, { "code": "150123", "name": "和林格尔县" }, { "code": "150124", "name": "清水河县" }, { "code": "150125", "name": "武川县" }] },
{ "code": "150200", "name": "包头市", "children": [{ "code": "150202", "name": "东河区" }, { "code": "150203", "name": "昆都仑区" }, { "code": "150204", "name": "青山区" }, { "code": "150205", "name": "石拐区" }, { "code": "150206", "name": "白云鄂博矿区" }, { "code": "150207", "name": "九原区" }, { "code": "150221", "name": "土默特右旗" }, { "code": "150222", "name": "固阳县" }, { "code": "150223", "name": "达尔罕茂明安联合旗" }] },
{ "code": "150300", "name": "乌海市", "children": [{ "code": "150302", "name": "海勃湾区" }, { "code": "150303", "name": "海南区" }, { "code": "150304", "name": "乌达区" }] },
{ "code": "150400", "name": "赤峰市", "children": [{ "code": "150402", "name": "红山区" }, { "code": "150403", "name": "元宝山区" }, { "code": "150404", "name": "松山区" }, { "code": "150421", "name": "阿鲁科尔沁旗" }, { "code": "150422", "name": "巴林左旗" }, { "code": "150423", "name": "巴林右旗" }, { "code": "150424", "name": "林西县" }, { "code": "150425", "name": "克什克腾旗" }, { "code": "150426", "name": "翁牛特旗" }, { "code": "150428", "name": "喀喇沁旗" }, { "code": "150429", "name": "宁城县" }, { "code": "150430", "name": "敖汉旗" }] },
{ "code": "150500", "name": "通辽市", "children": [{ "code": "150502", "name": "科尔沁区" }, { "code": "150521", "name": "科尔沁左翼中旗" }, { "code": "150522", "name": "科尔沁左翼后旗" }, { "code": "150523", "name": "开鲁县" }, { "code": "150524", "name": "库伦旗" }, { "code": "150525", "name": "奈曼旗" }, { "code": "150526", "name": "扎鲁特旗" }, { "code": "150581", "name": "霍林郭勒市" }] },
{ "code": "150600", "name": "鄂尔多斯市", "children": [{ "code": "150602", "name": "东胜区" }, { "code": "150603", "name": "康巴什区" }, { "code": "150621", "name": "达拉特旗" }, { "code": "150622", "name": "准格尔旗" }, { "code": "150623", "name": "鄂托克前旗" }, { "code": "150624", "name": "鄂托克旗" }, { "code": "150625", "name": "杭锦旗" }, { "code": "150626", "name": "乌审旗" }, { "code": "150627", "name": "伊金霍洛旗" }] },
{ "code": "150700", "name": "呼伦贝尔市", "children": [{ "code": "150702", "name": "海拉尔区" }, { "code": "150703", "name": "扎赉诺尔区" }, { "code": "150721", "name": "阿荣旗" }, { "code": "150722", "name": "莫力达瓦达斡尔族自治旗" }, { "code": "150723", "name": "鄂伦春自治旗" }, { "code": "150724", "name": "鄂温克族自治旗" }, { "code": "150725", "name": "陈巴尔虎旗" }, { "code": "150726", "name": "新巴尔虎左旗" }, { "code": "150727", "name": "新巴尔虎右旗" }, { "code": "150781", "name": "满洲里市" }, { "code": "150782", "name": "牙克石市" }, { "code": "150783", "name": "扎兰屯市" }, { "code": "150784", "name": "额尔古纳市" }, { "code": "150785", "name": "根河市" }] },
{ "code": "150800", "name": "巴彦淖尔市", "children": [{ "code": "150802", "name": "临河区" }, { "code": "150821", "name": "五原县" }, { "code": "150822", "name": "磴口县" }, { "code": "150823", "name": "乌拉特前旗" }, { "code": "150824", "name": "乌拉特中旗" }, { "code": "150825", "name": "乌拉特后旗" }, { "code": "150826", "name": "杭锦后旗" }] },
{ "code": "150900", "name": "乌兰察布市", "children": [{ "code": "150902", "name": "集宁区" }, { "code": "150921", "name": "卓资县" }, { "code": "150922", "name": "化德县" }, { "code": "150923", "name": "商都县" }, { "code": "150924", "name": "兴和县" }, { "code": "150925", "name": "凉城县" }, { "code": "150926", "name": "察哈尔右翼前旗" }, { "code": "150927", "name": "察哈尔右翼中旗" }, { "code": "150928", "name": "察哈尔右翼后旗" }, { "code": "150929", "name": "四子王旗" }, { "code": "150981", "name": "丰镇市" }] },
{ "code": "152200", "name": "兴安盟", "children": [{ "code": "152201", "name": "乌兰浩特市" }, { "code": "152202", "name": "阿尔山市" }, { "code": "152221", "name": "科尔沁右翼前旗" }, { "code": "152222", "name": "科尔沁右翼中旗" }, { "code": "152223", "name": "扎赉特旗" }, { "code": "152224", "name": "突泉县" }] },
{ "code": "152500", "name": "锡林郭勒盟", "children": [{ "code": "152501", "name": "二连浩特市" }, { "code": "152502", "name": "锡林浩特市" }, { "code": "152522", "name": "阿巴嘎旗" }, { "code": "152523", "name": "苏尼特左旗" }, { "code": "152524", "name": "苏尼特右旗" }, { "code": "152525", "name": "东乌珠穆沁旗" }, { "code": "152526", "name": "西乌珠穆沁旗" }, { "code": "152527", "name": "太仆寺旗" }, { "code": "152528", "name": "镶黄旗" }, { "code": "152529", "name": "正镶白旗" }, { "code": "152530", "name": "正蓝旗" }, { "code": "152531", "name": "多伦县" }] },
{ "code": "152900", "name": "阿拉善盟", "children": [{ "code": "152921", "name": "阿拉善左旗" }, { "code": "152922", "name": "阿拉善右旗" }, { "code": "152923", "name": "额济纳旗" }] }
]
},
{
"code": "210000",
"name": "辽宁省",
"children": [
{ "code": "210100", "name": "沈阳市", "children": [{ "code": "210102", "name": "和平区" }, { "code": "210103", "name": "沈河区" }, { "code": "210104", "name": "大东区" }, { "code": "210105", "name": "皇姑区" }, { "code": "210106", "name": "铁西区" }, { "code": "210111", "name": "苏家屯区" }, { "code": "210112", "name": "浑南区" }, { "code": "210113", "name": "沈北新区" }, { "code": "210114", "name": "于洪区" }, { "code": "210115", "name": "辽中区" }, { "code": "210123", "name": "康平县" }, { "code": "210124", "name": "法库县" }, { "code": "210181", "name": "新民市" }] },
{ "code": "210200", "name": "大连市", "children": [{ "code": "210202", "name": "中山区" }, { "code": "210203", "name": "西岗区" }, { "code": "210204", "name": "沙河口区" }, { "code": "210211", "name": "甘井子区" }, { "code": "210212", "name": "旅顺口区" }, { "code": "210213", "name": "金州区" }, { "code": "210214", "name": "普兰店区" }, { "code": "210224", "name": "长海县" }, { "code": "210281", "name": "瓦房店市" }, { "code": "210283", "name": "庄河市" }] },
{ "code": "210300", "name": "鞍山市", "children": [{ "code": "210302", "name": "铁东区" }, { "code": "210303", "name": "铁西区" }, { "code": "210304", "name": "立山区" }, { "code": "210311", "name": "千山区" }, { "code": "210321", "name": "台安县" }, { "code": "210323", "name": "岫岩满族自治县" }, { "code": "210381", "name": "海城市" }] },
{ "code": "210400", "name": "抚顺市", "children": [{ "code": "210402", "name": "新抚区" }, { "code": "210403", "name": "东洲区" }, { "code": "210404", "name": "望花区" }, { "code": "210411", "name": "顺城区" }, { "code": "210421", "name": "抚顺县" }, { "code": "210422", "name": "新宾满族自治县" }, { "code": "210423", "name": "清原满族自治县" }] },
{ "code": "210500", "name": "本溪市", "children": [{ "code": "210502", "name": "平山区" }, { "code": "210503", "name": "溪湖区" }, { "code": "210504", "name": "明山区" }, { "code": "210505", "name": "南芬区" }, { "code": "210521", "name": "本溪满族自治县" }, { "code": "210522", "name": "桓仁满族自治县" }] },
{ "code": "210600", "name": "丹东市", "children": [{ "code": "210602", "name": "元宝区" }, { "code": "210603", "name": "振兴区" }, { "code": "210604", "name": "振安区" }, { "code": "210624", "name": "宽甸满族自治县" }, { "code": "210681", "name": "东港市" }, { "code": "210682", "name": "凤城市" }] },
{ "code": "210700", "name": "锦州市", "children": [{ "code": "210702", "name": "古塔区" }, { "code": "210703", "name": "凌河区" }, { "code": "210711", "name": "太和区" }, { "code": "210726", "name": "黑山县" }, { "code": "210727", "name": "义县" }, { "code": "210781", "name": "凌海市" }, { "code": "210782", "name": "北镇市" }] },
{ "code": "210800", "name": "营口市", "children": [{ "code": "210802", "name": "站前区" }, { "code": "210803", "name": "西市区" }, { "code": "210804", "name": "鲅鱼圈区" }, { "code": "210811", "name": "老边区" }, { "code": "210881", "name": "盖州市" }, { "code": "210882", "name": "大石桥市" }] },
{ "code": "210900", "name": "阜新市", "children": [{ "code": "210902", "name": "海州区" }, { "code": "210903", "name": "新邱区" }, { "code": "210904", "name": "太平区" }, { "code": "210905", "name": "清河门区" }, { "code": "210911", "name": "细河区" }, { "code": "210921", "name": "阜新蒙古族自治县" }, { "code": "210922", "name": "彰武县" }] },
{ "code": "211000", "name": "辽阳市", "children": [{ "code": "211002", "name": "白塔区" }, { "code": "211003", "name": "文圣区" }, { "code": "211004", "name": "宏伟区" }, { "code": "211005", "name": "弓长岭区" }, { "code": "211011", "name": "太子河区" }, { "code": "211021", "name": "辽阳县" }, { "code": "211081", "name": "灯塔市" }] },
{ "code": "211100", "name": "盘锦市", "children": [{ "code": "211102", "name": "双台子区" }, { "code": "211103", "name": "兴隆台区" }, { "code": "211104", "name": "大洼区" }, { "code": "211122", "name": "盘山县" }] },
{ "code": "211200", "name": "铁岭市", "children": [{ "code": "211202", "name": "银州区" }, { "code": "211204", "name": "清河区" }, { "code": "211221", "name": "铁岭县" }, { "code": "211223", "name": "西丰县" }, { "code": "211224", "name": "昌图县" }, { "code": "211281", "name": "调兵山市" }, { "code": "211282", "name": "开原市" }] },
{ "code": "211300", "name": "朝阳市", "children": [{ "code": "211302", "name": "双塔区" }, { "code": "211303", "name": "龙城区" }, { "code": "211321", "name": "朝阳县" }, { "code": "211322", "name": "建平县" }, { "code": "211324", "name": "喀喇沁左翼蒙古族自治县" }, { "code": "211381", "name": "北票市" }, { "code": "211382", "name": "凌源市" }] },
{ "code": "211400", "name": "葫芦岛市", "children": [{ "code": "211402", "name": "连山区" }, { "code": "211403", "name": "龙港区" }, { "code": "211404", "name": "南票区" }, { "code": "211421", "name": "绥中县" }, { "code": "211422", "name": "建昌县" }, { "code": "211481", "name": "兴城市" }] }
]
},
{
"code": "220000",
"name": "吉林省",
"children": [
{ "code": "220100", "name": "长春市", "children": [{ "code": "220102", "name": "南关区" }, { "code": "220103", "name": "宽城区" }, { "code": "220104", "name": "朝阳区" }, { "code": "220105", "name": "二道区" }, { "code": "220106", "name": "绿园区" }, { "code": "220112", "name": "双阳区" }, { "code": "220113", "name": "九台区" }, { "code": "220122", "name": "农安县" }, { "code": "220182", "name": "榆树市" }, { "code": "220183", "name": "德惠市" }] },
{ "code": "220200", "name": "吉林市", "children": [{ "code": "220202", "name": "昌邑区" }, { "code": "220203", "name": "龙潭区" }, { "code": "220204", "name": "船营区" }, { "code": "220211", "name": "丰满区" }, { "code": "220221", "name": "永吉县" }, { "code": "220281", "name": "蛟河市" }, { "code": "220282", "name": "桦甸市" }, { "code": "220283", "name": "舒兰市" }, { "code": "220284", "name": "磐石市" }] },
{ "code": "220300", "name": "四平市", "children": [{ "code": "220302", "name": "铁西区" }, { "code": "220303", "name": "铁东区" }, { "code": "220322", "name": "梨树县" }, { "code": "220323", "name": "伊通满族自治县" }, { "code": "220381", "name": "公主岭市" }, { "code": "220382", "name": "双辽市" }] },
{ "code": "220400", "name": "辽源市", "children": [{ "code": "220402", "name": "龙山区" }, { "code": "220403", "name": "西安区" }, { "code": "220421", "name": "东丰县" }, { "code": "220422", "name": "东辽县" }] },
{ "code": "220500", "name": "通化市", "children": [{ "code": "220502", "name": "东昌区" }, { "code": "220503", "name": "二道江区" }, { "code": "220521", "name": "通化县" }, { "code": "220523", "name": "辉南县" }, { "code": "220524", "name": "柳河县" }, { "code": "220581", "name": "梅河口市" }, { "code": "220582", "name": "集安市" }] },
{ "code": "220600", "name": "白山市", "children": [{ "code": "220602", "name": "浑江区" }, { "code": "220605", "name": "江源区" }, { "code": "220621", "name": "抚松县" }, { "code": "220622", "name": "靖宇县" }, { "code": "220623", "name": "长白朝鲜族自治县" }, { "code": "220681", "name": "临江市" }] },
{ "code": "220700", "name": "松原市", "children": [{ "code": "220702", "name": "宁江区" }, { "code": "220721", "name": "前郭尔罗斯蒙古族自治县" }, { "code": "220722", "name": "长岭县" }, { "code": "220723", "name": "乾安县" }, { "code": "220781", "name": "扶余市" }] },
{ "code": "220800", "name": "白城市", "children": [{ "code": "220802", "name": "洮北区" }, { "code": "220821", "name": "镇赉县" }, { "code": "220822", "name": "通榆县" }, { "code": "220881", "name": "洮南市" }, { "code": "220882", "name": "大安市" }] },
{ "code": "222400", "name": "延边朝鲜族自治州", "children": [{ "code": "222401", "name": "延吉市" }, { "code": "222402", "name": "图们市" }, { "code": "222403", "name": "敦化市" }, { "code": "222404", "name": "珲春市" }, { "code": "222405", "name": "龙井市" }, { "code": "222406", "name": "和龙市" }, { "code": "222424", "name": "汪清县" }, { "code": "222426", "name": "安图县" }] }
]
},
{
"code": "230000",
"name": "黑龙江省",
"children": [
{
"code": "230100",
"name": "哈尔滨市",
"children": [{ "code": "230102", "name": "道里区" }, { "code": "230103", "name": "南岗区" }, { "code": "230104", "name": "道外区" }, { "code": "230108", "name": "平房区" }, { "code": "230109", "name": "松北区" }, { "code": "230110", "name": "香坊区" }, { "code": "230111", "name": "呼兰区" }, { "code": "230112", "name": "阿城区" }, { "code": "230113", "name": "双城区" }, { "code": "230123", "name": "依兰县" }, { "code": "230124", "name": "方正县" }, { "code": "230125", "name": "宾县" }, { "code": "230126", "name": "巴彦县" }, { "code": "230127", "name": "木兰县" }, { "code": "230128", "name": "通河县" }, { "code": "230129", "name": "延寿县" }, { "code": "230183", "name": "尚志市" }, { "code": "230184", "name": "五常市" }]
},
{ "code": "230200", "name": "齐齐哈尔市", "children": [{ "code": "230202", "name": "龙沙区" }, { "code": "230203", "name": "建华区" }, { "code": "230204", "name": "铁锋区" }, { "code": "230205", "name": "昂昂溪区" }, { "code": "230206", "name": "富拉尔基区" }, { "code": "230207", "name": "碾子山区" }, { "code": "230208", "name": "梅里斯达斡尔族区" }, { "code": "230221", "name": "龙江县" }, { "code": "230223", "name": "依安县" }, { "code": "230224", "name": "泰来县" }, { "code": "230225", "name": "甘南县" }, { "code": "230227", "name": "富裕县" }, { "code": "230229", "name": "克山县" }, { "code": "230230", "name": "克东县" }, { "code": "230231", "name": "拜泉县" }, { "code": "230281", "name": "讷河市" }] },
{ "code": "230300", "name": "鸡西市", "children": [{ "code": "230302", "name": "鸡冠区" }, { "code": "230303", "name": "恒山区" }, { "code": "230304", "name": "滴道区" }, { "code": "230305", "name": "梨树区" }, { "code": "230306", "name": "城子河区" }, { "code": "230307", "name": "麻山区" }, { "code": "230321", "name": "鸡东县" }, { "code": "230381", "name": "虎林市" }, { "code": "230382", "name": "密山市" }] },
{ "code": "230400", "name": "鹤岗市", "children": [{ "code": "230402", "name": "向阳区" }, { "code": "230403", "name": "工农区" }, { "code": "230404", "name": "南山区" }, { "code": "230405", "name": "兴安区" }, { "code": "230406", "name": "东山区" }, { "code": "230407", "name": "兴山区" }, { "code": "230421", "name": "萝北县" }, { "code": "230422", "name": "绥滨县" }] },
{ "code": "230500", "name": "双鸭山市", "children": [{ "code": "230502", "name": "尖山区" }, { "code": "230503", "name": "岭东区" }, { "code": "230505", "name": "四方台区" }, { "code": "230506", "name": "宝山区" }, { "code": "230521", "name": "集贤县" }, { "code": "230522", "name": "友谊县" }, { "code": "230523", "name": "宝清县" }, { "code": "230524", "name": "饶河县" }] },
{ "code": "230600", "name": "大庆市", "children": [{ "code": "230602", "name": "萨尔图区" }, { "code": "230603", "name": "龙凤区" }, { "code": "230604", "name": "让胡路区" }, { "code": "230605", "name": "红岗区" }, { "code": "230606", "name": "大同区" }, { "code": "230621", "name": "肇州县" }, { "code": "230622", "name": "肇源县" }, { "code": "230623", "name": "林甸县" }, { "code": "230624", "name": "杜尔伯特蒙古族自治县" }] },
{ "code": "230700", "name": "伊春市", "children": [{ "code": "230702", "name": "伊春区" }, { "code": "230703", "name": "南岔区" }, { "code": "230704", "name": "友好区" }, { "code": "230705", "name": "西林区" }, { "code": "230706", "name": "翠峦区" }, { "code": "230707", "name": "新青区" }, { "code": "230708", "name": "美溪区" }, { "code": "230709", "name": "金山屯区" }, { "code": "230710", "name": "五营区" }, { "code": "230711", "name": "乌马河区" }, { "code": "230712", "name": "汤旺河区" }, { "code": "230713", "name": "带岭区" }, { "code": "230714", "name": "乌伊岭区" }, { "code": "230715", "name": "红星区" }, { "code": "230716", "name": "上甘岭区" }, { "code": "230722", "name": "嘉荫县" }, { "code": "230781", "name": "铁力市" }] },
{ "code": "230800", "name": "佳木斯市", "children": [{ "code": "230803", "name": "向阳区" }, { "code": "230804", "name": "前进区" }, { "code": "230805", "name": "东风区" }, { "code": "230811", "name": "郊区" }, { "code": "230822", "name": "桦南县" }, { "code": "230826", "name": "桦川县" }, { "code": "230828", "name": "汤原县" }, { "code": "230881", "name": "同江市" }, { "code": "230882", "name": "富锦市" }, { "code": "230883", "name": "抚远市" }] },
{ "code": "230900", "name": "七台河市", "children": [{ "code": "230902", "name": "新兴区" }, { "code": "230903", "name": "桃山区" }, { "code": "230904", "name": "茄子河区" }, { "code": "230921", "name": "勃利县" }] },
{ "code": "231000", "name": "牡丹江市", "children": [{ "code": "231002", "name": "东安区" }, { "code": "231003", "name": "阳明区" }, { "code": "231004", "name": "爱民区" }, { "code": "231005", "name": "西安区" }, { "code": "231025", "name": "林口县" }, { "code": "231081", "name": "绥芬河市" }, { "code": "231083", "name": "海林市" }, { "code": "231084", "name": "宁安市" }, { "code": "231085", "name": "穆棱市" }, { "code": "231086", "name": "东宁市" }] },
{ "code": "231100", "name": "黑河市", "children": [{ "code": "231102", "name": "爱辉区" }, { "code": "231121", "name": "嫩江县" }, { "code": "231123", "name": "逊克县" }, { "code": "231124", "name": "孙吴县" }, { "code": "231181", "name": "北安市" }, { "code": "231182", "name": "五大连池市" }] },
{ "code": "231200", "name": "绥化市", "children": [{ "code": "231202", "name": "北林区" }, { "code": "231221", "name": "望奎县" }, { "code": "231222", "name": "兰西县" }, { "code": "231223", "name": "青冈县" }, { "code": "231224", "name": "庆安县" }, { "code": "231225", "name": "明水县" }, { "code": "231226", "name": "绥棱县" }, { "code": "231281", "name": "安达市" }, { "code": "231282", "name": "肇东市" }, { "code": "231283", "name": "海伦市" }] },
{ "code": "232700", "name": "大兴安岭地区", "children": [{ "code": "232701", "name": "加格达奇区" }, { "code": "232721", "name": "呼玛县" }, { "code": "232722", "name": "塔河县" }, { "code": "232723", "name": "漠河县" }] }
]
},
{ "code": "310000", "name": "上海市", "children": [{ "code": "310100", "name": "上海城区", "children": [{ "code": "310101", "name": "黄浦区" }, { "code": "310104", "name": "徐汇区" }, { "code": "310105", "name": "长宁区" }, { "code": "310106", "name": "静安区" }, { "code": "310107", "name": "普陀区" }, { "code": "310109", "name": "虹口区" }, { "code": "310110", "name": "杨浦区" }, { "code": "310112", "name": "闵行区" }, { "code": "310113", "name": "宝山区" }, { "code": "310114", "name": "嘉定区" }, { "code": "310115", "name": "浦东新区" }, { "code": "310116", "name": "金山区" }, { "code": "310117", "name": "松江区" }, { "code": "310118", "name": "青浦区" }, { "code": "310120", "name": "奉贤区" }, { "code": "310151", "name": "崇明区" }] }] },
{
"code": "320000",
"name": "江苏省",
"children": [
{ "code": "320100", "name": "南京市", "children": [{ "code": "320102", "name": "玄武区" }, { "code": "320104", "name": "秦淮区" }, { "code": "320105", "name": "建邺区" }, { "code": "320106", "name": "鼓楼区" }, { "code": "320111", "name": "浦口区" }, { "code": "320113", "name": "栖霞区" }, { "code": "320114", "name": "雨花台区" }, { "code": "320115", "name": "江宁区" }, { "code": "320116", "name": "六合区" }, { "code": "320117", "name": "溧水区" }, { "code": "320118", "name": "高淳区" }] },
{ "code": "320200", "name": "无锡市", "children": [{ "code": "320205", "name": "锡山区" }, { "code": "320206", "name": "惠山区" }, { "code": "320211", "name": "滨湖区" }, { "code": "320213", "name": "梁溪区" }, { "code": "320214", "name": "新吴区" }, { "code": "320281", "name": "江阴市" }, { "code": "320282", "name": "宜兴市" }] },
{ "code": "320300", "name": "徐州市", "children": [{ "code": "320302", "name": "鼓楼区" }, { "code": "320303", "name": "云龙区" }, { "code": "320305", "name": "贾汪区" }, { "code": "320311", "name": "泉山区" }, { "code": "320312", "name": "铜山区" }, { "code": "320321", "name": "丰县" }, { "code": "320322", "name": "沛县" }, { "code": "320324", "name": "睢宁县" }, { "code": "320381", "name": "新沂市" }, { "code": "320382", "name": "邳州市" }] },
{ "code": "320400", "name": "常州市", "children": [{ "code": "320402", "name": "天宁区" }, { "code": "320404", "name": "钟楼区" }, { "code": "320411", "name": "新北区" }, { "code": "320412", "name": "武进区" }, { "code": "320413", "name": "金坛区" }, { "code": "320481", "name": "溧阳市" }] },
{ "code": "320500", "name": "苏州市", "children": [{ "code": "320505", "name": "虎丘区" }, { "code": "320506", "name": "吴中区" }, { "code": "320507", "name": "相城区" }, { "code": "320508", "name": "姑苏区" }, { "code": "320509", "name": "吴江区" }, { "code": "320581", "name": "常熟市" }, { "code": "320582", "name": "张家港市" }, { "code": "320583", "name": "昆山市" }, { "code": "320585", "name": "太仓市" }] },
{ "code": "320600", "name": "南通市", "children": [{ "code": "320602", "name": "崇川区" }, { "code": "320611", "name": "港闸区" }, { "code": "320612", "name": "通州区" }, { "code": "320621", "name": "海安县" }, { "code": "320623", "name": "如东县" }, { "code": "320681", "name": "启东市" }, { "code": "320682", "name": "如皋市" }, { "code": "320684", "name": "海门市" }] },
{ "code": "320700", "name": "连云港市", "children": [{ "code": "320703", "name": "连云区" }, { "code": "320706", "name": "海州区" }, { "code": "320707", "name": "赣榆区" }, { "code": "320722", "name": "东海县" }, { "code": "320723", "name": "灌云县" }, { "code": "320724", "name": "灌南县" }] },
{ "code": "320800", "name": "淮安市", "children": [{ "code": "320803", "name": "淮安区" }, { "code": "320804", "name": "淮阴区" }, { "code": "320812", "name": "清江浦区" }, { "code": "320813", "name": "洪泽区" }, { "code": "320826", "name": "涟水县" }, { "code": "320830", "name": "盱眙县" }, { "code": "320831", "name": "金湖县" }] },
{ "code": "320900", "name": "盐城市", "children": [{ "code": "320902", "name": "亭湖区" }, { "code": "320903", "name": "盐都区" }, { "code": "320904", "name": "大丰区" }, { "code": "320921", "name": "响水县" }, { "code": "320922", "name": "滨海县" }, { "code": "320923", "name": "阜宁县" }, { "code": "320924", "name": "射阳县" }, { "code": "320925", "name": "建湖县" }, { "code": "320981", "name": "东台市" }] },
{ "code": "321000", "name": "扬州市", "children": [{ "code": "321002", "name": "广陵区" }, { "code": "321003", "name": "邗江区" }, { "code": "321012", "name": "江都区" }, { "code": "321023", "name": "宝应县" }, { "code": "321081", "name": "仪征市" }, { "code": "321084", "name": "高邮市" }] },
{ "code": "321100", "name": "镇江市", "children": [{ "code": "321102", "name": "京口区" }, { "code": "321111", "name": "润州区" }, { "code": "321112", "name": "丹徒区" }, { "code": "321181", "name": "丹阳市" }, { "code": "321182", "name": "扬中市" }, { "code": "321183", "name": "句容市" }] },
{ "code": "321200", "name": "泰州市", "children": [{ "code": "321202", "name": "海陵区" }, { "code": "321203", "name": "高港区" }, { "code": "321204", "name": "姜堰区" }, { "code": "321281", "name": "兴化市" }, { "code": "321282", "name": "靖江市" }, { "code": "321283", "name": "泰兴市" }] },
{ "code": "321300", "name": "宿迁市", "children": [{ "code": "321302", "name": "宿城区" }, { "code": "321311", "name": "宿豫区" }, { "code": "321322", "name": "沭阳县" }, { "code": "321323", "name": "泗阳县" }, { "code": "321324", "name": "泗洪县" }] }
]
},
{
"code": "330000",
"name": "浙江省",
"children": [
{ "code": "330100", "name": "杭州市", "children": [{ "code": "330102", "name": "上城区" }, { "code": "330103", "name": "下城区" }, { "code": "330104", "name": "江干区" }, { "code": "330105", "name": "拱墅区" }, { "code": "330106", "name": "西湖区" }, { "code": "330108", "name": "滨江区" }, { "code": "330109", "name": "萧山区" }, { "code": "330110", "name": "余杭区" }, { "code": "330111", "name": "富阳区" }, { "code": "330122", "name": "桐庐县" }, { "code": "330127", "name": "淳安县" }, { "code": "330182", "name": "建德市" }, { "code": "330185", "name": "临安市" }] },
{ "code": "330200", "name": "宁波市", "children": [{ "code": "330203", "name": "海曙区" }, { "code": "330205", "name": "江北区" }, { "code": "330206", "name": "北仑区" }, { "code": "330211", "name": "镇海区" }, { "code": "330212", "name": "鄞州区" }, { "code": "330213", "name": "奉化区" }, { "code": "330225", "name": "象山县" }, { "code": "330226", "name": "宁海县" }, { "code": "330281", "name": "余姚市" }, { "code": "330282", "name": "慈溪市" }] },
{ "code": "330300", "name": "温州市", "children": [{ "code": "330302", "name": "鹿城区" }, { "code": "330303", "name": "龙湾区" }, { "code": "330304", "name": "瓯海区" }, { "code": "330305", "name": "洞头区" }, { "code": "330324", "name": "永嘉县" }, { "code": "330326", "name": "平阳县" }, { "code": "330327", "name": "苍南县" }, { "code": "330328", "name": "文成县" }, { "code": "330329", "name": "泰顺县" }, { "code": "330381", "name": "瑞安市" }, { "code": "330382", "name": "乐清市" }] },
{ "code": "330400", "name": "嘉兴市", "children": [{ "code": "330402", "name": "南湖区" }, { "code": "330411", "name": "秀洲区" }, { "code": "330421", "name": "嘉善县" }, { "code": "330424", "name": "海盐县" }, { "code": "330481", "name": "海宁市" }, { "code": "330482", "name": "平湖市" }, { "code": "330483", "name": "桐乡市" }] },
{ "code": "330500", "name": "湖州市", "children": [{ "code": "330502", "name": "吴兴区" }, { "code": "330503", "name": "南浔区" }, { "code": "330521", "name": "德清县" }, { "code": "330522", "name": "长兴县" }, { "code": "330523", "name": "安吉县" }] },
{ "code": "330600", "name": "绍兴市", "children": [{ "code": "330602", "name": "越城区" }, { "code": "330603", "name": "柯桥区" }, { "code": "330604", "name": "上虞区" }, { "code": "330624", "name": "新昌县" }, { "code": "330681", "name": "诸暨市" }, { "code": "330683", "name": "嵊州市" }] },
{ "code": "330700", "name": "金华市", "children": [{ "code": "330702", "name": "婺城区" }, { "code": "330703", "name": "金东区" }, { "code": "330723", "name": "武义县" }, { "code": "330726", "name": "浦江县" }, { "code": "330727", "name": "磐安县" }, { "code": "330781", "name": "兰溪市" }, { "code": "330782", "name": "义乌市" }, { "code": "330783", "name": "东阳市" }, { "code": "330784", "name": "永康市" }] },
{ "code": "330800", "name": "衢州市", "children": [{ "code": "330802", "name": "柯城区" }, { "code": "330803", "name": "衢江区" }, { "code": "330822", "name": "常山县" }, { "code": "330824", "name": "开化县" }, { "code": "330825", "name": "龙游县" }, { "code": "330881", "name": "江山市" }] },
{ "code": "330900", "name": "舟山市", "children": [{ "code": "330902", "name": "定海区" }, { "code": "330903", "name": "普陀区" }, { "code": "330921", "name": "岱山县" }, { "code": "330922", "name": "嵊泗县" }] },
{ "code": "331000", "name": "台州市", "children": [{ "code": "331002", "name": "椒江区" }, { "code": "331003", "name": "黄岩区" }, { "code": "331004", "name": "路桥区" }, { "code": "331021", "name": "玉环市" }, { "code": "331022", "name": "三门县" }, { "code": "331023", "name": "天台县" }, { "code": "331024", "name": "仙居县" }, { "code": "331081", "name": "温岭市" }, { "code": "331082", "name": "临海市" }] },
{ "code": "331100", "name": "丽水市", "children": [{ "code": "331102", "name": "莲都区" }, { "code": "331121", "name": "青田县" }, { "code": "331122", "name": "缙云县" }, { "code": "331123", "name": "遂昌县" }, { "code": "331124", "name": "松阳县" }, { "code": "331125", "name": "云和县" }, { "code": "331126", "name": "庆元县" }, { "code": "331127", "name": "景宁畲族自治县" }, { "code": "331181", "name": "龙泉市" }] }
]
},
{
"code": "340000",
"name": "安徽省",
"children": [
{ "code": "340100", "name": "合肥市", "children": [{ "code": "340102", "name": "瑶海区" }, { "code": "340103", "name": "庐阳区" }, { "code": "340104", "name": "蜀山区" }, { "code": "340111", "name": "包河区" }, { "code": "340121", "name": "长丰县" }, { "code": "340122", "name": "肥东县" }, { "code": "340123", "name": "肥西县" }, { "code": "340124", "name": "庐江县" }, { "code": "340181", "name": "巢湖市" }] },
{ "code": "340200", "name": "芜湖市", "children": [{ "code": "340202", "name": "镜湖区" }, { "code": "340203", "name": "弋江区" }, { "code": "340207", "name": "鸠江区" }, { "code": "340208", "name": "三山区" }, { "code": "340221", "name": "芜湖县" }, { "code": "340222", "name": "繁昌县" }, { "code": "340223", "name": "南陵县" }, { "code": "340225", "name": "无为县" }] },
{ "code": "340300", "name": "蚌埠市", "children": [{ "code": "340302", "name": "龙子湖区" }, { "code": "340303", "name": "蚌山区" }, { "code": "340304", "name": "禹会区" }, { "code": "340311", "name": "淮上区" }, { "code": "340321", "name": "怀远县" }, { "code": "340322", "name": "五河县" }, { "code": "340323", "name": "固镇县" }] },
{ "code": "340400", "name": "淮南市", "children": [{ "code": "340402", "name": "大通区" }, { "code": "340403", "name": "田家庵区" }, { "code": "340404", "name": "谢家集区" }, { "code": "340405", "name": "八公山区" }, { "code": "340406", "name": "潘集区" }, { "code": "340421", "name": "凤台县" }, { "code": "340422", "name": "寿县" }] },
{ "code": "340500", "name": "马鞍山市", "children": [{ "code": "340503", "name": "花山区" }, { "code": "340504", "name": "雨山区" }, { "code": "340506", "name": "博望区" }, { "code": "340521", "name": "当涂县" }, { "code": "340522", "name": "含山县" }, { "code": "340523", "name": "和县" }] },
{ "code": "340600", "name": "淮北市", "children": [{ "code": "340602", "name": "杜集区" }, { "code": "340603", "name": "相山区" }, { "code": "340604", "name": "烈山区" }, { "code": "340621", "name": "濉溪县" }] },
{ "code": "340700", "name": "铜陵市", "children": [{ "code": "340705", "name": "铜官区" }, { "code": "340706", "name": "义安区" }, { "code": "340711", "name": "郊区" }, { "code": "340722", "name": "枞阳县" }] },
{ "code": "340800", "name": "安庆市", "children": [{ "code": "340802", "name": "迎江区" }, { "code": "340803", "name": "大观区" }, { "code": "340811", "name": "宜秀区" }, { "code": "340822", "name": "怀宁县" }, { "code": "340824", "name": "潜山县" }, { "code": "340825", "name": "太湖县" }, { "code": "340826", "name": "宿松县" }, { "code": "340827", "name": "望江县" }, { "code": "340828", "name": "岳西县" }, { "code": "340881", "name": "桐城市" }] },
{ "code": "341000", "name": "黄山市", "children": [{ "code": "341002", "name": "屯溪区" }, { "code": "341003", "name": "黄山区" }, { "code": "341004", "name": "徽州区" }, { "code": "341021", "name": "歙县" }, { "code": "341022", "name": "休宁县" }, { "code": "341023", "name": "黟县" }, { "code": "341024", "name": "祁门县" }] },
{ "code": "341100", "name": "滁州市", "children": [{ "code": "341102", "name": "琅琊区" }, { "code": "341103", "name": "南谯区" }, { "code": "341122", "name": "来安县" }, { "code": "341124", "name": "全椒县" }, { "code": "341125", "name": "定远县" }, { "code": "341126", "name": "凤阳县" }, { "code": "341181", "name": "天长市" }, { "code": "341182", "name": "明光市" }] },
{ "code": "341200", "name": "阜阳市", "children": [{ "code": "341202", "name": "颍州区" }, { "code": "341203", "name": "颍东区" }, { "code": "341204", "name": "颍泉区" }, { "code": "341221", "name": "临泉县" }, { "code": "341222", "name": "太和县" }, { "code": "341225", "name": "阜南县" }, { "code": "341226", "name": "颍上县" }, { "code": "341282", "name": "界首市" }] },
{ "code": "341300", "name": "宿州市", "children": [{ "code": "341302", "name": "埇桥区" }, { "code": "341321", "name": "砀山县" }, { "code": "341322", "name": "萧县" }, { "code": "341323", "name": "灵璧县" }, { "code": "341324", "name": "泗县" }] },
{ "code": "341500", "name": "六安市", "children": [{ "code": "341502", "name": "金安区" }, { "code": "341503", "name": "裕安区" }, { "code": "341504", "name": "叶集区" }, { "code": "341522", "name": "霍邱县" }, { "code": "341523", "name": "舒城县" }, { "code": "341524", "name": "金寨县" }, { "code": "341525", "name": "霍山县" }] },
{ "code": "341600", "name": "亳州市", "children": [{ "code": "341602", "name": "谯城区" }, { "code": "341621", "name": "涡阳县" }, { "code": "341622", "name": "蒙城县" }, { "code": "341623", "name": "利辛县" }] },
{ "code": "341700", "name": "池州市", "children": [{ "code": "341702", "name": "贵池区" }, { "code": "341721", "name": "东至县" }, { "code": "341722", "name": "石台县" }, { "code": "341723", "name": "青阳县" }] },
{ "code": "341800", "name": "宣城市", "children": [{ "code": "341802", "name": "宣州区" }, { "code": "341821", "name": "郎溪县" }, { "code": "341822", "name": "广德县" }, { "code": "341823", "name": "泾县" }, { "code": "341824", "name": "绩溪县" }, { "code": "341825", "name": "旌德县" }, { "code": "341881", "name": "宁国市" }] }
]
},
{
"code": "350000",
"name": "福建省",
"children": [
{ "code": "350100", "name": "福州市", "children": [{ "code": "350102", "name": "鼓楼区" }, { "code": "350103", "name": "台江区" }, { "code": "350104", "name": "仓山区" }, { "code": "350105", "name": "马尾区" }, { "code": "350111", "name": "晋安区" }, { "code": "350121", "name": "闽侯县" }, { "code": "350122", "name": "连江县" }, { "code": "350123", "name": "罗源县" }, { "code": "350124", "name": "闽清县" }, { "code": "350125", "name": "永泰县" }, { "code": "350128", "name": "平潭县" }, { "code": "350181", "name": "福清市" }, { "code": "350182", "name": "长乐市" }] },
{ "code": "350200", "name": "厦门市", "children": [{ "code": "350203", "name": "思明区" }, { "code": "350205", "name": "海沧区" }, { "code": "350206", "name": "湖里区" }, { "code": "350211", "name": "集美区" }, { "code": "350212", "name": "同安区" }, { "code": "350213", "name": "翔安区" }] },
{ "code": "350300", "name": "莆田市", "children": [{ "code": "350302", "name": "城厢区" }, { "code": "350303", "name": "涵江区" }, { "code": "350304", "name": "荔城区" }, { "code": "350305", "name": "秀屿区" }, { "code": "350322", "name": "仙游县" }] },
{ "code": "350400", "name": "三明市", "children": [{ "code": "350402", "name": "梅列区" }, { "code": "350403", "name": "三元区" }, { "code": "350421", "name": "明溪县" }, { "code": "350423", "name": "清流县" }, { "code": "350424", "name": "宁化县" }, { "code": "350425", "name": "大田县" }, { "code": "350426", "name": "尤溪县" }, { "code": "350427", "name": "沙县" }, { "code": "350428", "name": "将乐县" }, { "code": "350429", "name": "泰宁县" }, { "code": "350430", "name": "建宁县" }, { "code": "350481", "name": "永安市" }] },
{ "code": "350500", "name": "泉州市", "children": [{ "code": "350502", "name": "鲤城区" }, { "code": "350503", "name": "丰泽区" }, { "code": "350504", "name": "洛江区" }, { "code": "350505", "name": "泉港区" }, { "code": "350521", "name": "惠安县" }, { "code": "350524", "name": "安溪县" }, { "code": "350525", "name": "永春县" }, { "code": "350526", "name": "德化县" }, { "code": "350527", "name": "金门县" }, { "code": "350581", "name": "石狮市" }, { "code": "350582", "name": "晋江市" }, { "code": "350583", "name": "南安市" }] },
{ "code": "350600", "name": "漳州市", "children": [{ "code": "350602", "name": "芗城区" }, { "code": "350603", "name": "龙文区" }, { "code": "350622", "name": "云霄县" }, { "code": "350623", "name": "漳浦县" }, { "code": "350624", "name": "诏安县" }, { "code": "350625", "name": "长泰县" }, { "code": "350626", "name": "东山县" }, { "code": "350627", "name": "南靖县" }, { "code": "350628", "name": "平和县" }, { "code": "350629", "name": "华安县" }, { "code": "350681", "name": "龙海市" }] },
{ "code": "350700", "name": "南平市", "children": [{ "code": "350702", "name": "延平区" }, { "code": "350703", "name": "建阳区" }, { "code": "350721", "name": "顺昌县" }, { "code": "350722", "name": "浦城县" }, { "code": "350723", "name": "光泽县" }, { "code": "350724", "name": "松溪县" }, { "code": "350725", "name": "政和县" }, { "code": "350781", "name": "邵武市" }, { "code": "350782", "name": "武夷山市" }, { "code": "350783", "name": "建瓯市" }] },
{ "code": "350800", "name": "龙岩市", "children": [{ "code": "350802", "name": "新罗区" }, { "code": "350803", "name": "永定区" }, { "code": "350821", "name": "长汀县" }, { "code": "350823", "name": "上杭县" }, { "code": "350824", "name": "武平县" }, { "code": "350825", "name": "连城县" }, { "code": "350881", "name": "漳平市" }] },
{ "code": "350900", "name": "宁德市", "children": [{ "code": "350902", "name": "蕉城区" }, { "code": "350921", "name": "霞浦县" }, { "code": "350922", "name": "古田县" }, { "code": "350923", "name": "屏南县" }, { "code": "350924", "name": "寿宁县" }, { "code": "350925", "name": "周宁县" }, { "code": "350926", "name": "柘荣县" }, { "code": "350981", "name": "福安市" }, { "code": "350982", "name": "福鼎市" }] }
]
},
{
"code": "360000",
"name": "江西省",
"children": [
{ "code": "360100", "name": "南昌市", "children": [{ "code": "360102", "name": "东湖区" }, { "code": "360103", "name": "西湖区" }, { "code": "360104", "name": "青云谱区" }, { "code": "360105", "name": "湾里区" }, { "code": "360111", "name": "青山湖区" }, { "code": "360112", "name": "新建区" }, { "code": "360121", "name": "南昌县" }, { "code": "360123", "name": "安义县" }, { "code": "360124", "name": "进贤县" }] },
{ "code": "360200", "name": "景德镇市", "children": [{ "code": "360202", "name": "昌江区" }, { "code": "360203", "name": "珠山区" }, { "code": "360222", "name": "浮梁县" }, { "code": "360281", "name": "乐平市" }] },
{ "code": "360300", "name": "萍乡市", "children": [{ "code": "360302", "name": "安源区" }, { "code": "360313", "name": "湘东区" }, { "code": "360321", "name": "莲花县" }, { "code": "360322", "name": "上栗县" }, { "code": "360323", "name": "芦溪县" }] },
{ "code": "360400", "name": "九江市", "children": [{ "code": "360402", "name": "濂溪区" }, { "code": "360403", "name": "浔阳区" }, { "code": "360421", "name": "九江县" }, { "code": "360423", "name": "武宁县" }, { "code": "360424", "name": "修水县" }, { "code": "360425", "name": "永修县" }, { "code": "360426", "name": "德安县" }, { "code": "360428", "name": "都昌县" }, { "code": "360429", "name": "湖口县" }, { "code": "360430", "name": "彭泽县" }, { "code": "360481", "name": "瑞昌市" }, { "code": "360482", "name": "共青城市" }, { "code": "360483", "name": "庐山市" }] },
{ "code": "360500", "name": "新余市", "children": [{ "code": "360502", "name": "渝水区" }, { "code": "360521", "name": "分宜县" }] },
{ "code": "360600", "name": "鹰潭市", "children": [{ "code": "360602", "name": "月湖区" }, { "code": "360622", "name": "余江县" }, { "code": "360681", "name": "贵溪市" }] },
{
"code": "360700",
"name": "赣州市",
"children": [{ "code": "360702", "name": "章贡区" }, { "code": "360703", "name": "南康区" }, { "code": "360704", "name": "赣县区" }, { "code": "360722", "name": "信丰县" }, { "code": "360723", "name": "大余县" }, { "code": "360724", "name": "上犹县" }, { "code": "360725", "name": "崇义县" }, { "code": "360726", "name": "安远县" }, { "code": "360727", "name": "龙南县" }, { "code": "360728", "name": "定南县" }, { "code": "360729", "name": "全南县" }, { "code": "360730", "name": "宁都县" }, { "code": "360731", "name": "于都县" }, { "code": "360732", "name": "兴国县" }, { "code": "360733", "name": "会昌县" }, { "code": "360734", "name": "寻乌县" }, { "code": "360735", "name": "石城县" }, { "code": "360781", "name": "瑞金市" }]
},
{ "code": "360800", "name": "吉安市", "children": [{ "code": "360802", "name": "吉州区" }, { "code": "360803", "name": "青原区" }, { "code": "360821", "name": "吉安县" }, { "code": "360822", "name": "吉水县" }, { "code": "360823", "name": "峡江县" }, { "code": "360824", "name": "新干县" }, { "code": "360825", "name": "永丰县" }, { "code": "360826", "name": "泰和县" }, { "code": "360827", "name": "遂川县" }, { "code": "360828", "name": "万安县" }, { "code": "360829", "name": "安福县" }, { "code": "360830", "name": "永新县" }, { "code": "360881", "name": "井冈山市" }] },
{ "code": "360900", "name": "宜春市", "children": [{ "code": "360902", "name": "袁州区" }, { "code": "360921", "name": "奉新县" }, { "code": "360922", "name": "万载县" }, { "code": "360923", "name": "上高县" }, { "code": "360924", "name": "宜丰县" }, { "code": "360925", "name": "靖安县" }, { "code": "360926", "name": "铜鼓县" }, { "code": "360981", "name": "丰城市" }, { "code": "360982", "name": "樟树市" }, { "code": "360983", "name": "高安市" }] },
{ "code": "361000", "name": "抚州市", "children": [{ "code": "361002", "name": "临川区" }, { "code": "361003", "name": "东乡区" }, { "code": "361021", "name": "南城县" }, { "code": "361022", "name": "黎川县" }, { "code": "361023", "name": "南丰县" }, { "code": "361024", "name": "崇仁县" }, { "code": "361025", "name": "乐安县" }, { "code": "361026", "name": "宜黄县" }, { "code": "361027", "name": "金溪县" }, { "code": "361028", "name": "资溪县" }, { "code": "361030", "name": "广昌县" }] },
{ "code": "361100", "name": "上饶市", "children": [{ "code": "361102", "name": "信州区" }, { "code": "361103", "name": "广丰区" }, { "code": "361121", "name": "上饶县" }, { "code": "361123", "name": "玉山县" }, { "code": "361124", "name": "铅山县" }, { "code": "361125", "name": "横峰县" }, { "code": "361126", "name": "弋阳县" }, { "code": "361127", "name": "余干县" }, { "code": "361128", "name": "鄱阳县" }, { "code": "361129", "name": "万年县" }, { "code": "361130", "name": "婺源县" }, { "code": "361181", "name": "德兴市" }] }
]
},
{
"code": "370000",
"name": "山东省",
"children": [
{ "code": "370100", "name": "济南市", "children": [{ "code": "370102", "name": "历下区" }, { "code": "370103", "name": "市中区" }, { "code": "370104", "name": "槐荫区" }, { "code": "370105", "name": "天桥区" }, { "code": "370112", "name": "历城区" }, { "code": "370113", "name": "长清区" }, { "code": "370114", "name": "章丘区" }, { "code": "370124", "name": "平阴县" }, { "code": "370125", "name": "济阳县" }, { "code": "370126", "name": "商河县" }] },
{ "code": "370200", "name": "青岛市", "children": [{ "code": "370202", "name": "市南区" }, { "code": "370203", "name": "市北区" }, { "code": "370211", "name": "黄岛区" }, { "code": "370212", "name": "崂山区" }, { "code": "370213", "name": "李沧区" }, { "code": "370214", "name": "城阳区" }, { "code": "370281", "name": "胶州市" }, { "code": "370282", "name": "即墨市" }, { "code": "370283", "name": "平度市" }, { "code": "370285", "name": "莱西市" }] },
{ "code": "370300", "name": "淄博市", "children": [{ "code": "370302", "name": "淄川区" }, { "code": "370303", "name": "张店区" }, { "code": "370304", "name": "博山区" }, { "code": "370305", "name": "临淄区" }, { "code": "370306", "name": "周村区" }, { "code": "370321", "name": "桓台县" }, { "code": "370322", "name": "高青县" }, { "code": "370323", "name": "沂源县" }] },
{ "code": "370400", "name": "枣庄市", "children": [{ "code": "370402", "name": "市中区" }, { "code": "370403", "name": "薛城区" }, { "code": "370404", "name": "峄城区" }, { "code": "370405", "name": "台儿庄区" }, { "code": "370406", "name": "山亭区" }, { "code": "370481", "name": "滕州市" }] },
{ "code": "370500", "name": "东营市", "children": [{ "code": "370502", "name": "东营区" }, { "code": "370503", "name": "河口区" }, { "code": "370505", "name": "垦利区" }, { "code": "370522", "name": "利津县" }, { "code": "370523", "name": "广饶县" }] },
{ "code": "370600", "name": "烟台市", "children": [{ "code": "370602", "name": "芝罘区" }, { "code": "370611", "name": "福山区" }, { "code": "370612", "name": "牟平区" }, { "code": "370613", "name": "莱山区" }, { "code": "370634", "name": "长岛县" }, { "code": "370681", "name": "龙口市" }, { "code": "370682", "name": "莱阳市" }, { "code": "370683", "name": "莱州市" }, { "code": "370684", "name": "蓬莱市" }, { "code": "370685", "name": "招远市" }, { "code": "370686", "name": "栖霞市" }, { "code": "370687", "name": "海阳市" }] },
{ "code": "370700", "name": "潍坊市", "children": [{ "code": "370702", "name": "潍城区" }, { "code": "370703", "name": "寒亭区" }, { "code": "370704", "name": "坊子区" }, { "code": "370705", "name": "奎文区" }, { "code": "370724", "name": "临朐县" }, { "code": "370725", "name": "昌乐县" }, { "code": "370781", "name": "青州市" }, { "code": "370782", "name": "诸城市" }, { "code": "370783", "name": "寿光市" }, { "code": "370784", "name": "安丘市" }, { "code": "370785", "name": "高密市" }, { "code": "370786", "name": "昌邑市" }] },
{ "code": "370800", "name": "济宁市", "children": [{ "code": "370811", "name": "任城区" }, { "code": "370812", "name": "兖州区" }, { "code": "370826", "name": "微山县" }, { "code": "370827", "name": "鱼台县" }, { "code": "370828", "name": "金乡县" }, { "code": "370829", "name": "嘉祥县" }, { "code": "370830", "name": "汶上县" }, { "code": "370831", "name": "泗水县" }, { "code": "370832", "name": "梁山县" }, { "code": "370881", "name": "曲阜市" }, { "code": "370883", "name": "邹城市" }] },
{ "code": "370900", "name": "泰安市", "children": [{ "code": "370902", "name": "泰山区" }, { "code": "370911", "name": "岱岳区" }, { "code": "370921", "name": "宁阳县" }, { "code": "370923", "name": "东平县" }, { "code": "370982", "name": "新泰市" }, { "code": "370983", "name": "肥城市" }] },
{ "code": "371000", "name": "威海市", "children": [{ "code": "371002", "name": "环翠区" }, { "code": "371003", "name": "文登区" }, { "code": "371082", "name": "荣成市" }, { "code": "371083", "name": "乳山市" }] },
{ "code": "371100", "name": "日照市", "children": [{ "code": "371102", "name": "东港区" }, { "code": "371103", "name": "岚山区" }, { "code": "371121", "name": "五莲县" }, { "code": "371122", "name": "莒县" }] },
{ "code": "371200", "name": "莱芜市", "children": [{ "code": "371202", "name": "莱城区" }, { "code": "371203", "name": "钢城区" }] },
{ "code": "371300", "name": "临沂市", "children": [{ "code": "371302", "name": "兰山区" }, { "code": "371311", "name": "罗庄区" }, { "code": "371312", "name": "河东区" }, { "code": "371321", "name": "沂南县" }, { "code": "371322", "name": "郯城县" }, { "code": "371323", "name": "沂水县" }, { "code": "371324", "name": "兰陵县" }, { "code": "371325", "name": "费县" }, { "code": "371326", "name": "平邑县" }, { "code": "371327", "name": "莒南县" }, { "code": "371328", "name": "蒙阴县" }, { "code": "371329", "name": "临沭县" }] },
{ "code": "371400", "name": "德州市", "children": [{ "code": "371402", "name": "德城区" }, { "code": "371403", "name": "陵城区" }, { "code": "371422", "name": "宁津县" }, { "code": "371423", "name": "庆云县" }, { "code": "371424", "name": "临邑县" }, { "code": "371425", "name": "齐河县" }, { "code": "371426", "name": "平原县" }, { "code": "371427", "name": "夏津县" }, { "code": "371428", "name": "武城县" }, { "code": "371481", "name": "乐陵市" }, { "code": "371482", "name": "禹城市" }] },
{ "code": "371500", "name": "聊城市", "children": [{ "code": "371502", "name": "东昌府区" }, { "code": "371521", "name": "阳谷县" }, { "code": "371522", "name": "莘县" }, { "code": "371523", "name": "茌平县" }, { "code": "371524", "name": "东阿县" }, { "code": "371525", "name": "冠县" }, { "code": "371526", "name": "高唐县" }, { "code": "371581", "name": "临清市" }] },
{ "code": "371600", "name": "滨州市", "children": [{ "code": "371602", "name": "滨城区" }, { "code": "371603", "name": "沾化区" }, { "code": "371621", "name": "惠民县" }, { "code": "371622", "name": "阳信县" }, { "code": "371623", "name": "无棣县" }, { "code": "371625", "name": "博兴县" }, { "code": "371626", "name": "邹平县" }] },
{ "code": "371700", "name": "菏泽市", "children": [{ "code": "371702", "name": "牡丹区" }, { "code": "371703", "name": "定陶区" }, { "code": "371721", "name": "曹县" }, { "code": "371722", "name": "单县" }, { "code": "371723", "name": "成武县" }, { "code": "371724", "name": "巨野县" }, { "code": "371725", "name": "郓城县" }, { "code": "371726", "name": "鄄城县" }, { "code": "371728", "name": "东明县" }] }
]
},
{
"code": "410000",
"name": "河南省",
"children": [
{ "code": "410100", "name": "郑州市", "children": [{ "code": "410102", "name": "中原区" }, { "code": "410103", "name": "二七区" }, { "code": "410104", "name": "管城回族区" }, { "code": "410105", "name": "金水区" }, { "code": "410106", "name": "上街区" }, { "code": "410108", "name": "惠济区" }, { "code": "410122", "name": "中牟县" }, { "code": "410181", "name": "巩义市" }, { "code": "410182", "name": "荥阳市" }, { "code": "410183", "name": "新密市" }, { "code": "410184", "name": "新郑市" }, { "code": "410185", "name": "登封市" }] },
{ "code": "410200", "name": "开封市", "children": [{ "code": "410202", "name": "龙亭区" }, { "code": "410203", "name": "顺河回族区" }, { "code": "410204", "name": "鼓楼区" }, { "code": "410205", "name": "禹王台区" }, { "code": "410212", "name": "祥符区" }, { "code": "410221", "name": "杞县" }, { "code": "410222", "name": "通许县" }, { "code": "410223", "name": "尉氏县" }, { "code": "410225", "name": "兰考县" }] },
{ "code": "410300", "name": "洛阳市", "children": [{ "code": "410302", "name": "老城区" }, { "code": "410303", "name": "西工区" }, { "code": "410304", "name": "瀍河回族区" }, { "code": "410305", "name": "涧西区" }, { "code": "410306", "name": "吉利区" }, { "code": "410311", "name": "洛龙区" }, { "code": "410322", "name": "孟津县" }, { "code": "410323", "name": "新安县" }, { "code": "410324", "name": "栾川县" }, { "code": "410325", "name": "嵩县" }, { "code": "410326", "name": "汝阳县" }, { "code": "410327", "name": "宜阳县" }, { "code": "410328", "name": "洛宁县" }, { "code": "410329", "name": "伊川县" }, { "code": "410381", "name": "偃师市" }] },
{ "code": "410400", "name": "平顶山市", "children": [{ "code": "410402", "name": "新华区" }, { "code": "410403", "name": "卫东区" }, { "code": "410404", "name": "石龙区" }, { "code": "410411", "name": "湛河区" }, { "code": "410421", "name": "宝丰县" }, { "code": "410422", "name": "叶县" }, { "code": "410423", "name": "鲁山县" }, { "code": "410425", "name": "郏县" }, { "code": "410481", "name": "舞钢市" }, { "code": "410482", "name": "汝州市" }] },
{ "code": "410500", "name": "安阳市", "children": [{ "code": "410502", "name": "文峰区" }, { "code": "410503", "name": "北关区" }, { "code": "410505", "name": "殷都区" }, { "code": "410506", "name": "龙安区" }, { "code": "410522", "name": "安阳县" }, { "code": "410523", "name": "汤阴县" }, { "code": "410526", "name": "滑县" }, { "code": "410527", "name": "内黄县" }, { "code": "410581", "name": "林州市" }] },
{ "code": "410600", "name": "鹤壁市", "children": [{ "code": "410602", "name": "鹤山区" }, { "code": "410603", "name": "山城区" }, { "code": "410611", "name": "淇滨区" }, { "code": "410621", "name": "浚县" }, { "code": "410622", "name": "淇县" }] },
{ "code": "410700", "name": "新乡市", "children": [{ "code": "410702", "name": "红旗区" }, { "code": "410703", "name": "卫滨区" }, { "code": "410704", "name": "凤泉区" }, { "code": "410711", "name": "牧野区" }, { "code": "410721", "name": "新乡县" }, { "code": "410724", "name": "获嘉县" }, { "code": "410725", "name": "原阳县" }, { "code": "410726", "name": "延津县" }, { "code": "410727", "name": "封丘县" }, { "code": "410728", "name": "长垣县" }, { "code": "410781", "name": "卫辉市" }, { "code": "410782", "name": "辉县市" }] },
{ "code": "410800", "name": "焦作市", "children": [{ "code": "410802", "name": "解放区" }, { "code": "410803", "name": "中站区" }, { "code": "410804", "name": "马村区" }, { "code": "410811", "name": "山阳区" }, { "code": "410821", "name": "修武县" }, { "code": "410822", "name": "博爱县" }, { "code": "410823", "name": "武陟县" }, { "code": "410825", "name": "温县" }, { "code": "410882", "name": "沁阳市" }, { "code": "410883", "name": "孟州市" }] },
{ "code": "410900", "name": "濮阳市", "children": [{ "code": "410902", "name": "华龙区" }, { "code": "410922", "name": "清丰县" }, { "code": "410923", "name": "南乐县" }, { "code": "410926", "name": "范县" }, { "code": "410927", "name": "台前县" }, { "code": "410928", "name": "濮阳县" }] },
{ "code": "411000", "name": "许昌市", "children": [{ "code": "411002", "name": "魏都区" }, { "code": "411003", "name": "建安区" }, { "code": "411024", "name": "鄢陵县" }, { "code": "411025", "name": "襄城县" }, { "code": "411081", "name": "禹州市" }, { "code": "411082", "name": "长葛市" }] },
{ "code": "411100", "name": "漯河市", "children": [{ "code": "411102", "name": "源汇区" }, { "code": "411103", "name": "郾城区" }, { "code": "411104", "name": "召陵区" }, { "code": "411121", "name": "舞阳县" }, { "code": "411122", "name": "临颍县" }] },
{ "code": "411200", "name": "三门峡市", "children": [{ "code": "411202", "name": "湖滨区" }, { "code": "411203", "name": "陕州区" }, { "code": "411221", "name": "渑池县" }, { "code": "411224", "name": "卢氏县" }, { "code": "411281", "name": "义马市" }, { "code": "411282", "name": "灵宝市" }] },
{ "code": "411300", "name": "南阳市", "children": [{ "code": "411302", "name": "宛城区" }, { "code": "411303", "name": "卧龙区" }, { "code": "411321", "name": "南召县" }, { "code": "411322", "name": "方城县" }, { "code": "411323", "name": "西峡县" }, { "code": "411324", "name": "镇平县" }, { "code": "411325", "name": "内乡县" }, { "code": "411326", "name": "淅川县" }, { "code": "411327", "name": "社旗县" }, { "code": "411328", "name": "唐河县" }, { "code": "411329", "name": "新野县" }, { "code": "411330", "name": "桐柏县" }, { "code": "411381", "name": "邓州市" }] },
{ "code": "411400", "name": "商丘市", "children": [{ "code": "411402", "name": "梁园区" }, { "code": "411403", "name": "睢阳区" }, { "code": "411421", "name": "民权县" }, { "code": "411422", "name": "睢县" }, { "code": "411423", "name": "宁陵县" }, { "code": "411424", "name": "柘城县" }, { "code": "411425", "name": "虞城县" }, { "code": "411426", "name": "夏邑县" }, { "code": "411481", "name": "永城市" }] },
{ "code": "411500", "name": "信阳市", "children": [{ "code": "411502", "name": "浉河区" }, { "code": "411503", "name": "平桥区" }, { "code": "411521", "name": "罗山县" }, { "code": "411522", "name": "光山县" }, { "code": "411523", "name": "新县" }, { "code": "411524", "name": "商城县" }, { "code": "411525", "name": "固始县" }, { "code": "411526", "name": "潢川县" }, { "code": "411527", "name": "淮滨县" }, { "code": "411528", "name": "息县" }] },
{ "code": "411600", "name": "周口市", "children": [{ "code": "411602", "name": "川汇区" }, { "code": "411621", "name": "扶沟县" }, { "code": "411622", "name": "西华县" }, { "code": "411623", "name": "商水县" }, { "code": "411624", "name": "沈丘县" }, { "code": "411625", "name": "郸城县" }, { "code": "411626", "name": "淮阳县" }, { "code": "411627", "name": "太康县" }, { "code": "411628", "name": "鹿邑县" }, { "code": "411681", "name": "项城市" }] },
{ "code": "411700", "name": "驻马店市", "children": [{ "code": "411702", "name": "驿城区" }, { "code": "411721", "name": "西平县" }, { "code": "411722", "name": "上蔡县" }, { "code": "411723", "name": "平舆县" }, { "code": "411724", "name": "正阳县" }, { "code": "411725", "name": "确山县" }, { "code": "411726", "name": "泌阳县" }, { "code": "411727", "name": "汝南县" }, { "code": "411728", "name": "遂平县" }, { "code": "411729", "name": "新蔡县" }] },
{ "code": "419001", "name": "济源市", "children": [{ "code": "419001", "name": "济源市" }] }
]
},
{
"code": "420000",
"name": "湖北省",
"children": [
{ "code": "420100", "name": "武汉市", "children": [{ "code": "420102", "name": "江岸区" }, { "code": "420103", "name": "江汉区" }, { "code": "420104", "name": "硚口区" }, { "code": "420105", "name": "汉阳区" }, { "code": "420106", "name": "武昌区" }, { "code": "420107", "name": "青山区" }, { "code": "420111", "name": "洪山区" }, { "code": "420112", "name": "东西湖区" }, { "code": "420113", "name": "汉南区" }, { "code": "420114", "name": "蔡甸区" }, { "code": "420115", "name": "江夏区" }, { "code": "420116", "name": "黄陂区" }, { "code": "420117", "name": "新洲区" }] },
{ "code": "420200", "name": "黄石市", "children": [{ "code": "420202", "name": "黄石港区" }, { "code": "420203", "name": "西塞山区" }, { "code": "420204", "name": "下陆区" }, { "code": "420205", "name": "铁山区" }, { "code": "420222", "name": "阳新县" }, { "code": "420281", "name": "大冶市" }] },
{ "code": "420300", "name": "十堰市", "children": [{ "code": "420302", "name": "茅箭区" }, { "code": "420303", "name": "张湾区" }, { "code": "420304", "name": "郧阳区" }, { "code": "420322", "name": "郧西县" }, { "code": "420323", "name": "竹山县" }, { "code": "420324", "name": "竹溪县" }, { "code": "420325", "name": "房县" }, { "code": "420381", "name": "丹江口市" }] },
{ "code": "420500", "name": "宜昌市", "children": [{ "code": "420502", "name": "西陵区" }, { "code": "420503", "name": "伍家岗区" }, { "code": "420504", "name": "点军区" }, { "code": "420505", "name": "猇亭区" }, { "code": "420506", "name": "夷陵区" }, { "code": "420525", "name": "远安县" }, { "code": "420526", "name": "兴山县" }, { "code": "420527", "name": "秭归县" }, { "code": "420528", "name": "长阳土家族自治县" }, { "code": "420529", "name": "五峰土家族自治县" }, { "code": "420581", "name": "宜都市" }, { "code": "420582", "name": "当阳市" }, { "code": "420583", "name": "枝江市" }] },
{ "code": "420600", "name": "襄阳市", "children": [{ "code": "420602", "name": "襄城区" }, { "code": "420606", "name": "樊城区" }, { "code": "420607", "name": "襄州区" }, { "code": "420624", "name": "南漳县" }, { "code": "420625", "name": "谷城县" }, { "code": "420626", "name": "保康县" }, { "code": "420682", "name": "老河口市" }, { "code": "420683", "name": "枣阳市" }, { "code": "420684", "name": "宜城市" }] },
{ "code": "420700", "name": "鄂州市", "children": [{ "code": "420702", "name": "梁子湖区" }, { "code": "420703", "name": "华容区" }, { "code": "420704", "name": "鄂城区" }] },
{ "code": "420800", "name": "荆门市", "children": [{ "code": "420802", "name": "东宝区" }, { "code": "420804", "name": "掇刀区" }, { "code": "420821", "name": "京山县" }, { "code": "420822", "name": "沙洋县" }, { "code": "420881", "name": "钟祥市" }] },
{ "code": "420900", "name": "孝感市", "children": [{ "code": "420902", "name": "孝南区" }, { "code": "420921", "name": "孝昌县" }, { "code": "420922", "name": "大悟县" }, { "code": "420923", "name": "云梦县" }, { "code": "420981", "name": "应城市" }, { "code": "420982", "name": "安陆市" }, { "code": "420984", "name": "汉川市" }] },
{ "code": "421000", "name": "荆州市", "children": [{ "code": "421002", "name": "沙市区" }, { "code": "421003", "name": "荆州区" }, { "code": "421022", "name": "公安县" }, { "code": "421023", "name": "监利县" }, { "code": "421024", "name": "江陵县" }, { "code": "421081", "name": "石首市" }, { "code": "421083", "name": "洪湖市" }, { "code": "421087", "name": "松滋市" }] },
{ "code": "421100", "name": "黄冈市", "children": [{ "code": "421102", "name": "黄州区" }, { "code": "421121", "name": "团风县" }, { "code": "421122", "name": "红安县" }, { "code": "421123", "name": "罗田县" }, { "code": "421124", "name": "英山县" }, { "code": "421125", "name": "浠水县" }, { "code": "421126", "name": "蕲春县" }, { "code": "421127", "name": "黄梅县" }, { "code": "421181", "name": "麻城市" }, { "code": "421182", "name": "武穴市" }] },
{ "code": "421200", "name": "咸宁市", "children": [{ "code": "421202", "name": "咸安区" }, { "code": "421221", "name": "嘉鱼县" }, { "code": "421222", "name": "通城县" }, { "code": "421223", "name": "崇阳县" }, { "code": "421224", "name": "通山县" }, { "code": "421281", "name": "赤壁市" }] },
{ "code": "421300", "name": "随州市", "children": [{ "code": "421303", "name": "曾都区" }, { "code": "421321", "name": "随县" }, { "code": "421381", "name": "广水市" }] },
{ "code": "422800", "name": "恩施土家族苗族自治州", "children": [{ "code": "422801", "name": "恩施市" }, { "code": "422802", "name": "利川市" }, { "code": "422822", "name": "建始县" }, { "code": "422823", "name": "巴东县" }, { "code": "422825", "name": "宣恩县" }, { "code": "422826", "name": "咸丰县" }, { "code": "422827", "name": "来凤县" }, { "code": "422828", "name": "鹤峰县" }] },
{ "code": "429004", "name": "仙桃市", "children": [{ "code": "429004", "name": "仙桃市" }] },
{ "code": "429005", "name": "潜江市", "children": [{ "code": "429005", "name": "潜江市" }] },
{ "code": "429006", "name": "天门市", "children": [{ "code": "429006", "name": "天门市" }] },
{ "code": "429021", "name": "神农架林区", "children": [{ "code": "429021", "name": "神农架林区" }] }
]
},
{
"code": "430000",
"name": "湖南省",
"children": [
{ "code": "430100", "name": "长沙市", "children": [{ "code": "430102", "name": "芙蓉区" }, { "code": "430103", "name": "天心区" }, { "code": "430104", "name": "岳麓区" }, { "code": "430105", "name": "开福区" }, { "code": "430111", "name": "雨花区" }, { "code": "430112", "name": "望城区" }, { "code": "430121", "name": "长沙县" }, { "code": "430124", "name": "宁乡市" }, { "code": "430181", "name": "浏阳市" }] },
{ "code": "430200", "name": "株洲市", "children": [{ "code": "430202", "name": "荷塘区" }, { "code": "430203", "name": "芦淞区" }, { "code": "430204", "name": "石峰区" }, { "code": "430211", "name": "天元区" }, { "code": "430221", "name": "株洲县" }, { "code": "430223", "name": "攸县" }, { "code": "430224", "name": "茶陵县" }, { "code": "430225", "name": "炎陵县" }, { "code": "430281", "name": "醴陵市" }] },
{ "code": "430300", "name": "湘潭市", "children": [{ "code": "430302", "name": "雨湖区" }, { "code": "430304", "name": "岳塘区" }, { "code": "430321", "name": "湘潭县" }, { "code": "430381", "name": "湘乡市" }, { "code": "430382", "name": "韶山市" }] },
{ "code": "430400", "name": "衡阳市", "children": [{ "code": "430405", "name": "珠晖区" }, { "code": "430406", "name": "雁峰区" }, { "code": "430407", "name": "石鼓区" }, { "code": "430408", "name": "蒸湘区" }, { "code": "430412", "name": "南岳区" }, { "code": "430421", "name": "衡阳县" }, { "code": "430422", "name": "衡南县" }, { "code": "430423", "name": "衡山县" }, { "code": "430424", "name": "衡东县" }, { "code": "430426", "name": "祁东县" }, { "code": "430481", "name": "耒阳市" }, { "code": "430482", "name": "常宁市" }] },
{ "code": "430500", "name": "邵阳市", "children": [{ "code": "430502", "name": "双清区" }, { "code": "430503", "name": "大祥区" }, { "code": "430511", "name": "北塔区" }, { "code": "430521", "name": "邵东县" }, { "code": "430522", "name": "新邵县" }, { "code": "430523", "name": "邵阳县" }, { "code": "430524", "name": "隆回县" }, { "code": "430525", "name": "洞口县" }, { "code": "430527", "name": "绥宁县" }, { "code": "430528", "name": "新宁县" }, { "code": "430529", "name": "城步苗族自治县" }, { "code": "430581", "name": "武冈市" }] },
{ "code": "430600", "name": "岳阳市", "children": [{ "code": "430602", "name": "岳阳楼区" }, { "code": "430603", "name": "云溪区" }, { "code": "430611", "name": "君山区" }, { "code": "430621", "name": "岳阳县" }, { "code": "430623", "name": "华容县" }, { "code": "430624", "name": "湘阴县" }, { "code": "430626", "name": "平江县" }, { "code": "430681", "name": "汨罗市" }, { "code": "430682", "name": "临湘市" }] },
{ "code": "430700", "name": "常德市", "children": [{ "code": "430702", "name": "武陵区" }, { "code": "430703", "name": "鼎城区" }, { "code": "430721", "name": "安乡县" }, { "code": "430722", "name": "汉寿县" }, { "code": "430723", "name": "澧县" }, { "code": "430724", "name": "临澧县" }, { "code": "430725", "name": "桃源县" }, { "code": "430726", "name": "石门县" }, { "code": "430781", "name": "津市市" }] },
{ "code": "430800", "name": "张家界市", "children": [{ "code": "430802", "name": "永定区" }, { "code": "430811", "name": "武陵源区" }, { "code": "430821", "name": "慈利县" }, { "code": "430822", "name": "桑植县" }] },
{ "code": "430900", "name": "益阳市", "children": [{ "code": "430902", "name": "资阳区" }, { "code": "430903", "name": "赫山区" }, { "code": "430921", "name": "南县" }, { "code": "430922", "name": "桃江县" }, { "code": "430923", "name": "安化县" }, { "code": "430981", "name": "沅江市" }] },
{ "code": "431000", "name": "郴州市", "children": [{ "code": "431002", "name": "北湖区" }, { "code": "431003", "name": "苏仙区" }, { "code": "431021", "name": "桂阳县" }, { "code": "431022", "name": "宜章县" }, { "code": "431023", "name": "永兴县" }, { "code": "431024", "name": "嘉禾县" }, { "code": "431025", "name": "临武县" }, { "code": "431026", "name": "汝城县" }, { "code": "431027", "name": "桂东县" }, { "code": "431028", "name": "安仁县" }, { "code": "431081", "name": "资兴市" }] },
{ "code": "431100", "name": "永州市", "children": [{ "code": "431102", "name": "零陵区" }, { "code": "431103", "name": "冷水滩区" }, { "code": "431121", "name": "祁阳县" }, { "code": "431122", "name": "东安县" }, { "code": "431123", "name": "双牌县" }, { "code": "431124", "name": "道县" }, { "code": "431125", "name": "江永县" }, { "code": "431126", "name": "宁远县" }, { "code": "431127", "name": "蓝山县" }, { "code": "431128", "name": "新田县" }, { "code": "431129", "name": "江华瑶族自治县" }] },
{ "code": "431200", "name": "怀化市", "children": [{ "code": "431202", "name": "鹤城区" }, { "code": "431221", "name": "中方县" }, { "code": "431222", "name": "沅陵县" }, { "code": "431223", "name": "辰溪县" }, { "code": "431224", "name": "溆浦县" }, { "code": "431225", "name": "会同县" }, { "code": "431226", "name": "麻阳苗族自治县" }, { "code": "431227", "name": "新晃侗族自治县" }, { "code": "431228", "name": "芷江侗族自治县" }, { "code": "431229", "name": "靖州苗族侗族自治县" }, { "code": "431230", "name": "通道侗族自治县" }, { "code": "431281", "name": "洪江市" }] },
{ "code": "431300", "name": "娄底市", "children": [{ "code": "431302", "name": "娄星区" }, { "code": "431321", "name": "双峰县" }, { "code": "431322", "name": "新化县" }, { "code": "431381", "name": "冷水江市" }, { "code": "431382", "name": "涟源市" }] },
{ "code": "433100", "name": "湘西土家族苗族自治州", "children": [{ "code": "433101", "name": "吉首市" }, { "code": "433122", "name": "泸溪县" }, { "code": "433123", "name": "凤凰县" }, { "code": "433124", "name": "花垣县" }, { "code": "433125", "name": "保靖县" }, { "code": "433126", "name": "古丈县" }, { "code": "433127", "name": "永顺县" }, { "code": "433130", "name": "龙山县" }] }
]
},
{
"code": "440000",
"name": "广东省",
"children": [
{ "code": "440100", "name": "广州市", "children": [{ "code": "440103", "name": "荔湾区" }, { "code": "440104", "name": "越秀区" }, { "code": "440105", "name": "海珠区" }, { "code": "440106", "name": "天河区" }, { "code": "440111", "name": "白云区" }, { "code": "440112", "name": "黄埔区" }, { "code": "440113", "name": "番禺区" }, { "code": "440114", "name": "花都区" }, { "code": "440115", "name": "南沙区" }, { "code": "440117", "name": "从化区" }, { "code": "440118", "name": "增城区" }] },
{ "code": "440200", "name": "韶关市", "children": [{ "code": "440203", "name": "武江区" }, { "code": "440204", "name": "浈江区" }, { "code": "440205", "name": "曲江区" }, { "code": "440222", "name": "始兴县" }, { "code": "440224", "name": "仁化县" }, { "code": "440229", "name": "翁源县" }, { "code": "440232", "name": "乳源瑶族自治县" }, { "code": "440233", "name": "新丰县" }, { "code": "440281", "name": "乐昌市" }, { "code": "440282", "name": "南雄市" }] },
{ "code": "440300", "name": "深圳市", "children": [{ "code": "440303", "name": "罗湖区" }, { "code": "440304", "name": "福田区" }, { "code": "440305", "name": "南山区" }, { "code": "440306", "name": "宝安区" }, { "code": "440307", "name": "龙岗区" }, { "code": "440308", "name": "盐田区" }, { "code": "440309", "name": "龙华区" }, { "code": "440310", "name": "坪山区" }] },
{ "code": "440400", "name": "珠海市", "children": [{ "code": "440402", "name": "香洲区" }, { "code": "440403", "name": "斗门区" }, { "code": "440404", "name": "金湾区" }] },
{ "code": "440500", "name": "汕头市", "children": [{ "code": "440507", "name": "龙湖区" }, { "code": "440511", "name": "金平区" }, { "code": "440512", "name": "濠江区" }, { "code": "440513", "name": "潮阳区" }, { "code": "440514", "name": "潮南区" }, { "code": "440515", "name": "澄海区" }, { "code": "440523", "name": "南澳县" }] },
{ "code": "440600", "name": "佛山市", "children": [{ "code": "440604", "name": "禅城区" }, { "code": "440605", "name": "南海区" }, { "code": "440606", "name": "顺德区" }, { "code": "440607", "name": "三水区" }, { "code": "440608", "name": "高明区" }] },
{ "code": "440700", "name": "江门市", "children": [{ "code": "440703", "name": "蓬江区" }, { "code": "440704", "name": "江海区" }, { "code": "440705", "name": "新会区" }, { "code": "440781", "name": "台山市" }, { "code": "440783", "name": "开平市" }, { "code": "440784", "name": "鹤山市" }, { "code": "440785", "name": "恩平市" }] },
{ "code": "440800", "name": "湛江市", "children": [{ "code": "440802", "name": "赤坎区" }, { "code": "440803", "name": "霞山区" }, { "code": "440804", "name": "坡头区" }, { "code": "440811", "name": "麻章区" }, { "code": "440823", "name": "遂溪县" }, { "code": "440825", "name": "徐闻县" }, { "code": "440881", "name": "廉江市" }, { "code": "440882", "name": "雷州市" }, { "code": "440883", "name": "吴川市" }] },
{ "code": "440900", "name": "茂名市", "children": [{ "code": "440902", "name": "茂南区" }, { "code": "440904", "name": "电白区" }, { "code": "440981", "name": "高州市" }, { "code": "440982", "name": "化州市" }, { "code": "440983", "name": "信宜市" }] },
{ "code": "441200", "name": "肇庆市", "children": [{ "code": "441202", "name": "端州区" }, { "code": "441203", "name": "鼎湖区" }, { "code": "441204", "name": "高要区" }, { "code": "441223", "name": "广宁县" }, { "code": "441224", "name": "怀集县" }, { "code": "441225", "name": "封开县" }, { "code": "441226", "name": "德庆县" }, { "code": "441284", "name": "四会市" }] },
{ "code": "441300", "name": "惠州市", "children": [{ "code": "441302", "name": "惠城区" }, { "code": "441303", "name": "惠阳区" }, { "code": "441322", "name": "博罗县" }, { "code": "441323", "name": "惠东县" }, { "code": "441324", "name": "龙门县" }] },
{ "code": "441400", "name": "梅州市", "children": [{ "code": "441402", "name": "梅江区" }, { "code": "441403", "name": "梅县区" }, { "code": "441422", "name": "大埔县" }, { "code": "441423", "name": "丰顺县" }, { "code": "441424", "name": "五华县" }, { "code": "441426", "name": "平远县" }, { "code": "441427", "name": "蕉岭县" }, { "code": "441481", "name": "兴宁市" }] },
{ "code": "441500", "name": "汕尾市", "children": [{ "code": "441502", "name": "城区" }, { "code": "441521", "name": "海丰县" }, { "code": "441523", "name": "陆河县" }, { "code": "441581", "name": "陆丰市" }] },
{ "code": "441600", "name": "河源市", "children": [{ "code": "441602", "name": "源城区" }, { "code": "441621", "name": "紫金县" }, { "code": "441622", "name": "龙川县" }, { "code": "441623", "name": "连平县" }, { "code": "441624", "name": "和平县" }, { "code": "441625", "name": "东源县" }] },
{ "code": "441700", "name": "阳江市", "children": [{ "code": "441702", "name": "江城区" }, { "code": "441704", "name": "阳东区" }, { "code": "441721", "name": "阳西县" }, { "code": "441781", "name": "阳春市" }] },
{ "code": "441800", "name": "清远市", "children": [{ "code": "441802", "name": "清城区" }, { "code": "441803", "name": "清新区" }, { "code": "441821", "name": "佛冈县" }, { "code": "441823", "name": "阳山县" }, { "code": "441825", "name": "连山壮族瑶族自治县" }, { "code": "441826", "name": "连南瑶族自治县" }, { "code": "441881", "name": "英德市" }, { "code": "441882", "name": "连州市" }] },
{ "code": "441900", "name": "东莞市", "children": [{ "code": "441900", "name": "东莞市" }] },
{ "code": "442000", "name": "中山市", "children": [{ "code": "442000", "name": "中山市" }] },
{ "code": "442100", "name": "东沙群岛", "children": [{ "code": "442100", "name": "东沙群岛" }] },
{ "code": "445100", "name": "潮州市", "children": [{ "code": "445102", "name": "湘桥区" }, { "code": "445103", "name": "潮安区" }, { "code": "445122", "name": "饶平县" }] },
{ "code": "445200", "name": "揭阳市", "children": [{ "code": "445202", "name": "榕城区" }, { "code": "445203", "name": "揭东区" }, { "code": "445222", "name": "揭西县" }, { "code": "445224", "name": "惠来县" }, { "code": "445281", "name": "普宁市" }] },
{ "code": "445300", "name": "云浮市", "children": [{ "code": "445302", "name": "云城区" }, { "code": "445303", "name": "云安区" }, { "code": "445321", "name": "新兴县" }, { "code": "445322", "name": "郁南县" }, { "code": "445381", "name": "罗定市" }] }
]
},
{
"code": "450000",
"name": "广西壮族自治区",
"children": [
{ "code": "450100", "name": "南宁市", "children": [{ "code": "450102", "name": "兴宁区" }, { "code": "450103", "name": "青秀区" }, { "code": "450105", "name": "江南区" }, { "code": "450107", "name": "西乡塘区" }, { "code": "450108", "name": "良庆区" }, { "code": "450109", "name": "邕宁区" }, { "code": "450110", "name": "武鸣区" }, { "code": "450123", "name": "隆安县" }, { "code": "450124", "name": "马山县" }, { "code": "450125", "name": "上林县" }, { "code": "450126", "name": "宾阳县" }, { "code": "450127", "name": "横县" }] },
{ "code": "450200", "name": "柳州市", "children": [{ "code": "450202", "name": "城中区" }, { "code": "450203", "name": "鱼峰区" }, { "code": "450204", "name": "柳南区" }, { "code": "450205", "name": "柳北区" }, { "code": "450206", "name": "柳江区" }, { "code": "450222", "name": "柳城县" }, { "code": "450223", "name": "鹿寨县" }, { "code": "450224", "name": "融安县" }, { "code": "450225", "name": "融水苗族自治县" }, { "code": "450226", "name": "三江侗族自治县" }] },
{ "code": "450300", "name": "桂林市", "children": [{ "code": "450302", "name": "秀峰区" }, { "code": "450303", "name": "叠彩区" }, { "code": "450304", "name": "象山区" }, { "code": "450305", "name": "七星区" }, { "code": "450311", "name": "雁山区" }, { "code": "450312", "name": "临桂区" }, { "code": "450321", "name": "阳朔县" }, { "code": "450323", "name": "灵川县" }, { "code": "450324", "name": "全州县" }, { "code": "450325", "name": "兴安县" }, { "code": "450326", "name": "永福县" }, { "code": "450327", "name": "灌阳县" }, { "code": "450328", "name": "龙胜各族自治县" }, { "code": "450329", "name": "资源县" }, { "code": "450330", "name": "平乐县" }, { "code": "450331", "name": "荔浦县" }, { "code": "450332", "name": "恭城瑶族自治县" }] },
{ "code": "450400", "name": "梧州市", "children": [{ "code": "450403", "name": "万秀区" }, { "code": "450405", "name": "长洲区" }, { "code": "450406", "name": "龙圩区" }, { "code": "450421", "name": "苍梧县" }, { "code": "450422", "name": "藤县" }, { "code": "450423", "name": "蒙山县" }, { "code": "450481", "name": "岑溪市" }] },
{ "code": "450500", "name": "北海市", "children": [{ "code": "450502", "name": "海城区" }, { "code": "450503", "name": "银海区" }, { "code": "450512", "name": "铁山港区" }, { "code": "450521", "name": "合浦县" }] },
{ "code": "450600", "name": "防城港市", "children": [{ "code": "450602", "name": "港口区" }, { "code": "450603", "name": "防城区" }, { "code": "450621", "name": "上思县" }, { "code": "450681", "name": "东兴市" }] },
{ "code": "450700", "name": "钦州市", "children": [{ "code": "450702", "name": "钦南区" }, { "code": "450703", "name": "钦北区" }, { "code": "450721", "name": "灵山县" }, { "code": "450722", "name": "浦北县" }] },
{ "code": "450800", "name": "贵港市", "children": [{ "code": "450802", "name": "港北区" }, { "code": "450803", "name": "港南区" }, { "code": "450804", "name": "覃塘区" }, { "code": "450821", "name": "平南县" }, { "code": "450881", "name": "桂平市" }] },
{ "code": "450900", "name": "玉林市", "children": [{ "code": "450902", "name": "玉州区" }, { "code": "450903", "name": "福绵区" }, { "code": "450921", "name": "容县" }, { "code": "450922", "name": "陆川县" }, { "code": "450923", "name": "博白县" }, { "code": "450924", "name": "兴业县" }, { "code": "450981", "name": "北流市" }] },
{ "code": "451000", "name": "百色市", "children": [{ "code": "451002", "name": "右江区" }, { "code": "451021", "name": "田阳县" }, { "code": "451022", "name": "田东县" }, { "code": "451023", "name": "平果县" }, { "code": "451024", "name": "德保县" }, { "code": "451026", "name": "那坡县" }, { "code": "451027", "name": "凌云县" }, { "code": "451028", "name": "乐业县" }, { "code": "451029", "name": "田林县" }, { "code": "451030", "name": "西林县" }, { "code": "451031", "name": "隆林各族自治县" }, { "code": "451081", "name": "靖西市" }] },
{ "code": "451100", "name": "贺州市", "children": [{ "code": "451102", "name": "八步区" }, { "code": "451103", "name": "平桂区" }, { "code": "451121", "name": "昭平县" }, { "code": "451122", "name": "钟山县" }, { "code": "451123", "name": "富川瑶族自治县" }] },
{ "code": "451200", "name": "河池市", "children": [{ "code": "451202", "name": "金城江区" }, { "code": "451203", "name": "宜州区" }, { "code": "451221", "name": "南丹县" }, { "code": "451222", "name": "天峨县" }, { "code": "451223", "name": "凤山县" }, { "code": "451224", "name": "东兰县" }, { "code": "451225", "name": "罗城仫佬族自治县" }, { "code": "451226", "name": "环江毛南族自治县" }, { "code": "451227", "name": "巴马瑶族自治县" }, { "code": "451228", "name": "都安瑶族自治县" }, { "code": "451229", "name": "大化瑶族自治县" }] },
{ "code": "451300", "name": "来宾市", "children": [{ "code": "451302", "name": "兴宾区" }, { "code": "451321", "name": "忻城县" }, { "code": "451322", "name": "象州县" }, { "code": "451323", "name": "武宣县" }, { "code": "451324", "name": "金秀瑶族自治县" }, { "code": "451381", "name": "合山市" }] },
{ "code": "451400", "name": "崇左市", "children": [{ "code": "451402", "name": "江州区" }, { "code": "451421", "name": "扶绥县" }, { "code": "451422", "name": "宁明县" }, { "code": "451423", "name": "龙州县" }, { "code": "451424", "name": "大新县" }, { "code": "451425", "name": "天等县" }, { "code": "451481", "name": "凭祥市" }] }
]
},
{
"code": "460000",
"name": "海南省",
"children": [
{ "code": "460100", "name": "海口市", "children": [{ "code": "460105", "name": "秀英区" }, { "code": "460106", "name": "龙华区" }, { "code": "460107", "name": "琼山区" }, { "code": "460108", "name": "美兰区" }] },
{ "code": "460200", "name": "三亚市", "children": [{ "code": "460202", "name": "海棠区" }, { "code": "460203", "name": "吉阳区" }, { "code": "460204", "name": "天涯区" }, { "code": "460205", "name": "崖州区" }] },
{ "code": "460300", "name": "三沙市", "children": [{ "code": "460321", "name": "西沙群岛" }, { "code": "460322", "name": "南沙群岛" }, { "code": "460323", "name": "中沙群岛的岛礁及其海域" }] },
{ "code": "460400", "name": "儋州市", "children": [{ "code": "460400", "name": "儋州市" }] },
{ "code": "469001", "name": "五指山市", "children": [{ "code": "469001", "name": "五指山市" }] },
{ "code": "469002", "name": "琼海市", "children": [{ "code": "469002", "name": "琼海市" }] },
{ "code": "469005", "name": "文昌市", "children": [{ "code": "469005", "name": "文昌市" }] },
{ "code": "469006", "name": "万宁市", "children": [{ "code": "469006", "name": "万宁市" }] },
{ "code": "469007", "name": "东方市", "children": [{ "code": "469007", "name": "东方市" }] },
{ "code": "469021", "name": "定安县", "children": [{ "code": "469021", "name": "定安县" }] },
{ "code": "469022", "name": "屯昌县", "children": [{ "code": "469022", "name": "屯昌县" }] },
{ "code": "469023", "name": "澄迈县", "children": [{ "code": "469023", "name": "澄迈县" }] },
{ "code": "469024", "name": "临高县", "children": [{ "code": "469024", "name": "临高县" }] },
{ "code": "469025", "name": "白沙黎族自治县", "children": [{ "code": "469025", "name": "白沙黎族自治县" }] },
{ "code": "469026", "name": "昌江黎族自治县", "children": [{ "code": "469026", "name": "昌江黎族自治县" }] },
{ "code": "469027", "name": "乐东黎族自治县", "children": [{ "code": "469027", "name": "乐东黎族自治县" }] },
{ "code": "469028", "name": "陵水黎族自治县", "children": [{ "code": "469028", "name": "陵水黎族自治县" }] },
{ "code": "469029", "name": "保亭黎族苗族自治县", "children": [{ "code": "469029", "name": "保亭黎族苗族自治县" }] },
{ "code": "469030", "name": "琼中黎族苗族自治县", "children": [{ "code": "469030", "name": "琼中黎族苗族自治县" }] }
]
},
{
"code": "500000",
"name": "重庆市",
"children": [
{
"code": "500100",
"name": "重庆城区",
"children": [
{ "code": "500101", "name": "万州区" },
{ "code": "500102", "name": "涪陵区" },
{ "code": "500103", "name": "渝中区" },
{ "code": "500104", "name": "大渡口区" },
{ "code": "500105", "name": "江北区" },
{ "code": "500106", "name": "沙坪坝区" },
{ "code": "500107", "name": "九龙坡区" },
{ "code": "500108", "name": "南岸区" },
{ "code": "500109", "name": "北碚区" },
{ "code": "500110", "name": "綦江区" },
{ "code": "500111", "name": "大足区" },
{ "code": "500112", "name": "渝北区" },
{ "code": "500113", "name": "巴南区" },
{ "code": "500114", "name": "黔江区" },
{ "code": "500115", "name": "长寿区" },
{ "code": "500116", "name": "江津区" },
{ "code": "500117", "name": "合川区" },
{ "code": "500118", "name": "永川区" },
{ "code": "500119", "name": "南川区" },
{ "code": "500120", "name": "璧山区" },
{ "code": "500151", "name": "铜梁区" },
{ "code": "500152", "name": "潼南区" },
{ "code": "500153", "name": "荣昌区" },
{ "code": "500154", "name": "开州区" }
]
},
{ "code": "500200", "name": "重庆郊县", "children": [{ "code": "500155", "name": "梁平区" }, { "code": "500156", "name": "武隆区" }, { "code": "500229", "name": "城口县" }, { "code": "500230", "name": "丰都县" }, { "code": "500231", "name": "垫江县" }, { "code": "500233", "name": "忠县" }, { "code": "500235", "name": "云阳县" }, { "code": "500236", "name": "奉节县" }, { "code": "500237", "name": "巫山县" }, { "code": "500238", "name": "巫溪县" }, { "code": "500240", "name": "石柱土家族自治县" }, { "code": "500241", "name": "秀山土家族苗族自治县" }, { "code": "500242", "name": "酉阳土家族苗族自治县" }, { "code": "500243", "name": "彭水苗族土家族自治县" }] }
]
},
{
"code": "510000",
"name": "四川省",
"children": [
{
"code": "510100",
"name": "成都市",
"children": [
{ "code": "510104", "name": "锦江区" },
{ "code": "510105", "name": "青羊区" },
{ "code": "510106", "name": "金牛区" },
{ "code": "510107", "name": "武侯区" },
{ "code": "510108", "name": "成华区" },
{ "code": "510112", "name": "龙泉驿区" },
{ "code": "510113", "name": "青白江区" },
{ "code": "510114", "name": "新都区" },
{ "code": "510115", "name": "温江区" },
{ "code": "510116", "name": "双流区" },
{ "code": "510117", "name": "郫都区" },
{ "code": "510121", "name": "金堂县" },
{ "code": "510129", "name": "大邑县" },
{ "code": "510131", "name": "蒲江县" },
{ "code": "510132", "name": "新津县" },
{ "code": "510181", "name": "都江堰市" },
{ "code": "510182", "name": "彭州市" },
{ "code": "510183", "name": "邛崃市" },
{ "code": "510184", "name": "崇州市" },
{ "code": "510185", "name": "简阳市" }
]
},
{ "code": "510300", "name": "自贡市", "children": [{ "code": "510302", "name": "自流井区" }, { "code": "510303", "name": "贡井区" }, { "code": "510304", "name": "大安区" }, { "code": "510311", "name": "沿滩区" }, { "code": "510321", "name": "荣县" }, { "code": "510322", "name": "富顺县" }] },
{ "code": "510400", "name": "攀枝花市", "children": [{ "code": "510402", "name": "东区" }, { "code": "510403", "name": "西区" }, { "code": "510411", "name": "仁和区" }, { "code": "510421", "name": "米易县" }, { "code": "510422", "name": "盐边县" }] },
{ "code": "510500", "name": "泸州市", "children": [{ "code": "510502", "name": "江阳区" }, { "code": "510503", "name": "纳溪区" }, { "code": "510504", "name": "龙马潭区" }, { "code": "510521", "name": "泸县" }, { "code": "510522", "name": "合江县" }, { "code": "510524", "name": "叙永县" }, { "code": "510525", "name": "古蔺县" }] },
{ "code": "510600", "name": "德阳市", "children": [{ "code": "510603", "name": "旌阳区" }, { "code": "510623", "name": "中江县" }, { "code": "510626", "name": "罗江县" }, { "code": "510681", "name": "广汉市" }, { "code": "510682", "name": "什邡市" }, { "code": "510683", "name": "绵竹市" }] },
{ "code": "510700", "name": "绵阳市", "children": [{ "code": "510703", "name": "涪城区" }, { "code": "510704", "name": "游仙区" }, { "code": "510705", "name": "安州区" }, { "code": "510722", "name": "三台县" }, { "code": "510723", "name": "盐亭县" }, { "code": "510725", "name": "梓潼县" }, { "code": "510726", "name": "北川羌族自治县" }, { "code": "510727", "name": "平武县" }, { "code": "510781", "name": "江油市" }] },
{ "code": "510800", "name": "广元市", "children": [{ "code": "510802", "name": "利州区" }, { "code": "510811", "name": "昭化区" }, { "code": "510812", "name": "朝天区" }, { "code": "510821", "name": "旺苍县" }, { "code": "510822", "name": "青川县" }, { "code": "510823", "name": "剑阁县" }, { "code": "510824", "name": "苍溪县" }] },
{ "code": "510900", "name": "遂宁市", "children": [{ "code": "510903", "name": "船山区" }, { "code": "510904", "name": "安居区" }, { "code": "510921", "name": "蓬溪县" }, { "code": "510922", "name": "射洪县" }, { "code": "510923", "name": "大英县" }] },
{ "code": "511000", "name": "内江市", "children": [{ "code": "511002", "name": "市中区" }, { "code": "511011", "name": "东兴区" }, { "code": "511024", "name": "威远县" }, { "code": "511025", "name": "资中县" }, { "code": "511028", "name": "隆昌市" }] },
{ "code": "511100", "name": "乐山市", "children": [{ "code": "511102", "name": "市中区" }, { "code": "511111", "name": "沙湾区" }, { "code": "511112", "name": "五通桥区" }, { "code": "511113", "name": "金口河区" }, { "code": "511123", "name": "犍为县" }, { "code": "511124", "name": "井研县" }, { "code": "511126", "name": "夹江县" }, { "code": "511129", "name": "沐川县" }, { "code": "511132", "name": "峨边彝族自治县" }, { "code": "511133", "name": "马边彝族自治县" }, { "code": "511181", "name": "峨眉山市" }] },
{ "code": "511300", "name": "南充市", "children": [{ "code": "511302", "name": "顺庆区" }, { "code": "511303", "name": "高坪区" }, { "code": "511304", "name": "嘉陵区" }, { "code": "511321", "name": "南部县" }, { "code": "511322", "name": "营山县" }, { "code": "511323", "name": "蓬安县" }, { "code": "511324", "name": "仪陇县" }, { "code": "511325", "name": "西充县" }, { "code": "511381", "name": "阆中市" }] },
{ "code": "511400", "name": "眉山市", "children": [{ "code": "511402", "name": "东坡区" }, { "code": "511403", "name": "彭山区" }, { "code": "511421", "name": "仁寿县" }, { "code": "511423", "name": "洪雅县" }, { "code": "511424", "name": "丹棱县" }, { "code": "511425", "name": "青神县" }] },
{ "code": "511500", "name": "宜宾市", "children": [{ "code": "511502", "name": "翠屏区" }, { "code": "511503", "name": "南溪区" }, { "code": "511521", "name": "宜宾县" }, { "code": "511523", "name": "江安县" }, { "code": "511524", "name": "长宁县" }, { "code": "511525", "name": "高县" }, { "code": "511526", "name": "珙县" }, { "code": "511527", "name": "筠连县" }, { "code": "511528", "name": "兴文县" }, { "code": "511529", "name": "屏山县" }] },
{ "code": "511600", "name": "广安市", "children": [{ "code": "511602", "name": "广安区" }, { "code": "511603", "name": "前锋区" }, { "code": "511621", "name": "岳池县" }, { "code": "511622", "name": "武胜县" }, { "code": "511623", "name": "邻水县" }, { "code": "511681", "name": "华蓥市" }] },
{ "code": "511700", "name": "达州市", "children": [{ "code": "511702", "name": "通川区" }, { "code": "511703", "name": "达川区" }, { "code": "511722", "name": "宣汉县" }, { "code": "511723", "name": "开江县" }, { "code": "511724", "name": "大竹县" }, { "code": "511725", "name": "渠县" }, { "code": "511781", "name": "万源市" }] },
{ "code": "511800", "name": "雅安市", "children": [{ "code": "511802", "name": "雨城区" }, { "code": "511803", "name": "名山区" }, { "code": "511822", "name": "荥经县" }, { "code": "511823", "name": "汉源县" }, { "code": "511824", "name": "石棉县" }, { "code": "511825", "name": "天全县" }, { "code": "511826", "name": "芦山县" }, { "code": "511827", "name": "宝兴县" }] },
{ "code": "511900", "name": "巴中市", "children": [{ "code": "511902", "name": "巴州区" }, { "code": "511903", "name": "恩阳区" }, { "code": "511921", "name": "通江县" }, { "code": "511922", "name": "南江县" }, { "code": "511923", "name": "平昌县" }] },
{ "code": "512000", "name": "资阳市", "children": [{ "code": "512002", "name": "雁江区" }, { "code": "512021", "name": "安岳县" }, { "code": "512022", "name": "乐至县" }] },
{ "code": "513200", "name": "阿坝藏族羌族自治州", "children": [{ "code": "513201", "name": "马尔康市" }, { "code": "513221", "name": "汶川县" }, { "code": "513222", "name": "理县" }, { "code": "513223", "name": "茂县" }, { "code": "513224", "name": "松潘县" }, { "code": "513225", "name": "九寨沟县" }, { "code": "513226", "name": "金川县" }, { "code": "513227", "name": "小金县" }, { "code": "513228", "name": "黑水县" }, { "code": "513230", "name": "壤塘县" }, { "code": "513231", "name": "阿坝县" }, { "code": "513232", "name": "若尔盖县" }, { "code": "513233", "name": "红原县" }] },
{
"code": "513300",
"name": "甘孜藏族自治州",
"children": [{ "code": "513301", "name": "康定市" }, { "code": "513322", "name": "泸定县" }, { "code": "513323", "name": "丹巴县" }, { "code": "513324", "name": "九龙县" }, { "code": "513325", "name": "雅江县" }, { "code": "513326", "name": "道孚县" }, { "code": "513327", "name": "炉霍县" }, { "code": "513328", "name": "甘孜县" }, { "code": "513329", "name": "新龙县" }, { "code": "513330", "name": "德格县" }, { "code": "513331", "name": "白玉县" }, { "code": "513332", "name": "石渠县" }, { "code": "513333", "name": "色达县" }, { "code": "513334", "name": "理塘县" }, { "code": "513335", "name": "巴塘县" }, { "code": "513336", "name": "乡城县" }, { "code": "513337", "name": "稻城县" }, { "code": "513338", "name": "得荣县" }]
},
{ "code": "513400", "name": "凉山彝族自治州", "children": [{ "code": "513401", "name": "西昌市" }, { "code": "513422", "name": "木里藏族自治县" }, { "code": "513423", "name": "盐源县" }, { "code": "513424", "name": "德昌县" }, { "code": "513425", "name": "会理县" }, { "code": "513426", "name": "会东县" }, { "code": "513427", "name": "宁南县" }, { "code": "513428", "name": "普格县" }, { "code": "513429", "name": "布拖县" }, { "code": "513430", "name": "金阳县" }, { "code": "513431", "name": "昭觉县" }, { "code": "513432", "name": "喜德县" }, { "code": "513433", "name": "冕宁县" }, { "code": "513434", "name": "越西县" }, { "code": "513435", "name": "甘洛县" }, { "code": "513436", "name": "美姑县" }, { "code": "513437", "name": "雷波县" }] }
]
},
{
"code": "520000",
"name": "贵州省",
"children": [
{ "code": "520100", "name": "贵阳市", "children": [{ "code": "520102", "name": "南明区" }, { "code": "520103", "name": "云岩区" }, { "code": "520111", "name": "花溪区" }, { "code": "520112", "name": "乌当区" }, { "code": "520113", "name": "白云区" }, { "code": "520115", "name": "观山湖区" }, { "code": "520121", "name": "开阳县" }, { "code": "520122", "name": "息烽县" }, { "code": "520123", "name": "修文县" }, { "code": "520181", "name": "清镇市" }] },
{ "code": "520200", "name": "六盘水市", "children": [{ "code": "520201", "name": "钟山区" }, { "code": "520203", "name": "六枝特区" }, { "code": "520221", "name": "水城县" }, { "code": "520222", "name": "盘州市" }] },
{ "code": "520300", "name": "遵义市", "children": [{ "code": "520302", "name": "红花岗区" }, { "code": "520303", "name": "汇川区" }, { "code": "520304", "name": "播州区" }, { "code": "520322", "name": "桐梓县" }, { "code": "520323", "name": "绥阳县" }, { "code": "520324", "name": "正安县" }, { "code": "520325", "name": "道真仡佬族苗族自治县" }, { "code": "520326", "name": "务川仡佬族苗族自治县" }, { "code": "520327", "name": "凤冈县" }, { "code": "520328", "name": "湄潭县" }, { "code": "520329", "name": "余庆县" }, { "code": "520330", "name": "习水县" }, { "code": "520381", "name": "赤水市" }, { "code": "520382", "name": "仁怀市" }] },
{ "code": "520400", "name": "安顺市", "children": [{ "code": "520402", "name": "西秀区" }, { "code": "520403", "name": "平坝区" }, { "code": "520422", "name": "普定县" }, { "code": "520423", "name": "镇宁布依族苗族自治县" }, { "code": "520424", "name": "关岭布依族苗族自治县" }, { "code": "520425", "name": "紫云苗族布依族自治县" }] },
{ "code": "520500", "name": "毕节市", "children": [{ "code": "520502", "name": "七星关区" }, { "code": "520521", "name": "大方县" }, { "code": "520522", "name": "黔西县" }, { "code": "520523", "name": "金沙县" }, { "code": "520524", "name": "织金县" }, { "code": "520525", "name": "纳雍县" }, { "code": "520526", "name": "威宁彝族回族苗族自治县" }, { "code": "520527", "name": "赫章县" }] },
{ "code": "520600", "name": "铜仁市", "children": [{ "code": "520602", "name": "碧江区" }, { "code": "520603", "name": "万山区" }, { "code": "520621", "name": "江口县" }, { "code": "520622", "name": "玉屏侗族自治县" }, { "code": "520623", "name": "石阡县" }, { "code": "520624", "name": "思南县" }, { "code": "520625", "name": "印江土家族苗族自治县" }, { "code": "520626", "name": "德江县" }, { "code": "520627", "name": "沿河土家族自治县" }, { "code": "520628", "name": "松桃苗族自治县" }] },
{ "code": "522300", "name": "黔西南布依族苗族自治州", "children": [{ "code": "522301", "name": "兴义市" }, { "code": "522322", "name": "兴仁县" }, { "code": "522323", "name": "普安县" }, { "code": "522324", "name": "晴隆县" }, { "code": "522325", "name": "贞丰县" }, { "code": "522326", "name": "望谟县" }, { "code": "522327", "name": "册亨县" }, { "code": "522328", "name": "安龙县" }] },
{ "code": "522600", "name": "黔东南苗族侗族自治州", "children": [{ "code": "522601", "name": "凯里市" }, { "code": "522622", "name": "黄平县" }, { "code": "522623", "name": "施秉县" }, { "code": "522624", "name": "三穗县" }, { "code": "522625", "name": "镇远县" }, { "code": "522626", "name": "岑巩县" }, { "code": "522627", "name": "天柱县" }, { "code": "522628", "name": "锦屏县" }, { "code": "522629", "name": "剑河县" }, { "code": "522630", "name": "台江县" }, { "code": "522631", "name": "黎平县" }, { "code": "522632", "name": "榕江县" }, { "code": "522633", "name": "从江县" }, { "code": "522634", "name": "雷山县" }, { "code": "522635", "name": "麻江县" }, { "code": "522636", "name": "丹寨县" }] },
{ "code": "522700", "name": "黔南布依族苗族自治州", "children": [{ "code": "522701", "name": "都匀市" }, { "code": "522702", "name": "福泉市" }, { "code": "522722", "name": "荔波县" }, { "code": "522723", "name": "贵定县" }, { "code": "522725", "name": "瓮安县" }, { "code": "522726", "name": "独山县" }, { "code": "522727", "name": "平塘县" }, { "code": "522728", "name": "罗甸县" }, { "code": "522729", "name": "长顺县" }, { "code": "522730", "name": "龙里县" }, { "code": "522731", "name": "惠水县" }, { "code": "522732", "name": "三都水族自治县" }] }
]
},
{
"code": "530000",
"name": "云南省",
"children": [
{ "code": "530100", "name": "昆明市", "children": [{ "code": "530102", "name": "五华区" }, { "code": "530103", "name": "盘龙区" }, { "code": "530111", "name": "官渡区" }, { "code": "530112", "name": "西山区" }, { "code": "530113", "name": "东川区" }, { "code": "530114", "name": "呈贡区" }, { "code": "530115", "name": "晋宁区" }, { "code": "530124", "name": "富民县" }, { "code": "530125", "name": "宜良县" }, { "code": "530126", "name": "石林彝族自治县" }, { "code": "530127", "name": "嵩明县" }, { "code": "530128", "name": "禄劝彝族苗族自治县" }, { "code": "530129", "name": "寻甸回族彝族自治县" }, { "code": "530181", "name": "安宁市" }] },
{ "code": "530300", "name": "曲靖市", "children": [{ "code": "530302", "name": "麒麟区" }, { "code": "530303", "name": "沾益区" }, { "code": "530321", "name": "马龙县" }, { "code": "530322", "name": "陆良县" }, { "code": "530323", "name": "师宗县" }, { "code": "530324", "name": "罗平县" }, { "code": "530325", "name": "富源县" }, { "code": "530326", "name": "会泽县" }, { "code": "530381", "name": "宣威市" }] },
{ "code": "530400", "name": "玉溪市", "children": [{ "code": "530402", "name": "红塔区" }, { "code": "530403", "name": "江川区" }, { "code": "530422", "name": "澄江县" }, { "code": "530423", "name": "通海县" }, { "code": "530424", "name": "华宁县" }, { "code": "530425", "name": "易门县" }, { "code": "530426", "name": "峨山彝族自治县" }, { "code": "530427", "name": "新平彝族傣族自治县" }, { "code": "530428", "name": "元江哈尼族彝族傣族自治县" }] },
{ "code": "530500", "name": "保山市", "children": [{ "code": "530502", "name": "隆阳区" }, { "code": "530521", "name": "施甸县" }, { "code": "530523", "name": "龙陵县" }, { "code": "530524", "name": "昌宁县" }, { "code": "530581", "name": "腾冲市" }] },
{ "code": "530600", "name": "昭通市", "children": [{ "code": "530602", "name": "昭阳区" }, { "code": "530621", "name": "鲁甸县" }, { "code": "530622", "name": "巧家县" }, { "code": "530623", "name": "盐津县" }, { "code": "530624", "name": "大关县" }, { "code": "530625", "name": "永善县" }, { "code": "530626", "name": "绥江县" }, { "code": "530627", "name": "镇雄县" }, { "code": "530628", "name": "彝良县" }, { "code": "530629", "name": "威信县" }, { "code": "530630", "name": "水富县" }] },
{ "code": "530700", "name": "丽江市", "children": [{ "code": "530702", "name": "古城区" }, { "code": "530721", "name": "玉龙纳西族自治县" }, { "code": "530722", "name": "永胜县" }, { "code": "530723", "name": "华坪县" }, { "code": "530724", "name": "宁蒗彝族自治县" }] },
{ "code": "530800", "name": "普洱市", "children": [{ "code": "530802", "name": "思茅区" }, { "code": "530821", "name": "宁洱哈尼族彝族自治县" }, { "code": "530822", "name": "墨江哈尼族自治县" }, { "code": "530823", "name": "景东彝族自治县" }, { "code": "530824", "name": "景谷傣族彝族自治县" }, { "code": "530825", "name": "镇沅彝族哈尼族拉祜族自治县" }, { "code": "530826", "name": "江城哈尼族彝族自治县" }, { "code": "530827", "name": "孟连傣族拉祜族佤族自治县" }, { "code": "530828", "name": "澜沧拉祜族自治县" }, { "code": "530829", "name": "西盟佤族自治县" }] },
{ "code": "530900", "name": "临沧市", "children": [{ "code": "530902", "name": "临翔区" }, { "code": "530921", "name": "凤庆县" }, { "code": "530922", "name": "云县" }, { "code": "530923", "name": "永德县" }, { "code": "530924", "name": "镇康县" }, { "code": "530925", "name": "双江拉祜族佤族布朗族傣族自治县" }, { "code": "530926", "name": "耿马傣族佤族自治县" }, { "code": "530927", "name": "沧源佤族自治县" }] },
{ "code": "532300", "name": "楚雄彝族自治州", "children": [{ "code": "532301", "name": "楚雄市" }, { "code": "532322", "name": "双柏县" }, { "code": "532323", "name": "牟定县" }, { "code": "532324", "name": "南华县" }, { "code": "532325", "name": "姚安县" }, { "code": "532326", "name": "大姚县" }, { "code": "532327", "name": "永仁县" }, { "code": "532328", "name": "元谋县" }, { "code": "532329", "name": "武定县" }, { "code": "532331", "name": "禄丰县" }] },
{ "code": "532500", "name": "红河哈尼族彝族自治州", "children": [{ "code": "532501", "name": "个旧市" }, { "code": "532502", "name": "开远市" }, { "code": "532503", "name": "蒙自市" }, { "code": "532504", "name": "弥勒市" }, { "code": "532523", "name": "屏边苗族自治县" }, { "code": "532524", "name": "建水县" }, { "code": "532525", "name": "石屏县" }, { "code": "532527", "name": "泸西县" }, { "code": "532528", "name": "元阳县" }, { "code": "532529", "name": "红河县" }, { "code": "532530", "name": "金平苗族瑶族傣族自治县" }, { "code": "532531", "name": "绿春县" }, { "code": "532532", "name": "河口瑶族自治县" }] },
{ "code": "532600", "name": "文山壮族苗族自治州", "children": [{ "code": "532601", "name": "文山市" }, { "code": "532622", "name": "砚山县" }, { "code": "532623", "name": "西畴县" }, { "code": "532624", "name": "麻栗坡县" }, { "code": "532625", "name": "马关县" }, { "code": "532626", "name": "丘北县" }, { "code": "532627", "name": "广南县" }, { "code": "532628", "name": "富宁县" }] },
{ "code": "532800", "name": "西双版纳傣族自治州", "children": [{ "code": "532801", "name": "景洪市" }, { "code": "532822", "name": "勐海县" }, { "code": "532823", "name": "勐腊县" }] },
{ "code": "532900", "name": "大理白族自治州", "children": [{ "code": "532901", "name": "大理市" }, { "code": "532922", "name": "漾濞彝族自治县" }, { "code": "532923", "name": "祥云县" }, { "code": "532924", "name": "宾川县" }, { "code": "532925", "name": "弥渡县" }, { "code": "532926", "name": "南涧彝族自治县" }, { "code": "532927", "name": "巍山彝族回族自治县" }, { "code": "532928", "name": "永平县" }, { "code": "532929", "name": "云龙县" }, { "code": "532930", "name": "洱源县" }, { "code": "532931", "name": "剑川县" }, { "code": "532932", "name": "鹤庆县" }] },
{ "code": "533100", "name": "德宏傣族景颇族自治州", "children": [{ "code": "533102", "name": "瑞丽市" }, { "code": "533103", "name": "芒市" }, { "code": "533122", "name": "梁河县" }, { "code": "533123", "name": "盈江县" }, { "code": "533124", "name": "陇川县" }] },
{ "code": "533300", "name": "怒江傈僳族自治州", "children": [{ "code": "533301", "name": "泸水市" }, { "code": "533323", "name": "福贡县" }, { "code": "533324", "name": "贡山独龙族怒族自治县" }, { "code": "533325", "name": "兰坪白族普米族自治县" }] },
{ "code": "533400", "name": "迪庆藏族自治州", "children": [{ "code": "533401", "name": "香格里拉市" }, { "code": "533422", "name": "德钦县" }, { "code": "533423", "name": "维西傈僳族自治县" }] }
]
},
{
"code": "540000",
"name": "西藏自治区",
"children": [
{ "code": "540100", "name": "拉萨市", "children": [{ "code": "540102", "name": "城关区" }, { "code": "540103", "name": "堆龙德庆区" }, { "code": "540121", "name": "林周县" }, { "code": "540122", "name": "当雄县" }, { "code": "540123", "name": "尼木县" }, { "code": "540124", "name": "曲水县" }, { "code": "540126", "name": "达孜县" }, { "code": "540127", "name": "墨竹工卡县" }] },
{
"code": "540200",
"name": "日喀则市",
"children": [{ "code": "540202", "name": "桑珠孜区" }, { "code": "540221", "name": "南木林县" }, { "code": "540222", "name": "江孜县" }, { "code": "540223", "name": "定日县" }, { "code": "540224", "name": "萨迦县" }, { "code": "540225", "name": "拉孜县" }, { "code": "540226", "name": "昂仁县" }, { "code": "540227", "name": "谢通门县" }, { "code": "540228", "name": "白朗县" }, { "code": "540229", "name": "仁布县" }, { "code": "540230", "name": "康马县" }, { "code": "540231", "name": "定结县" }, { "code": "540232", "name": "仲巴县" }, { "code": "540233", "name": "亚东县" }, { "code": "540234", "name": "吉隆县" }, { "code": "540235", "name": "聂拉木县" }, { "code": "540236", "name": "萨嘎县" }, { "code": "540237", "name": "岗巴县" }]
},
{ "code": "540300", "name": "昌都市", "children": [{ "code": "540302", "name": "卡若区" }, { "code": "540321", "name": "江达县" }, { "code": "540322", "name": "贡觉县" }, { "code": "540323", "name": "类乌齐县" }, { "code": "540324", "name": "丁青县" }, { "code": "540325", "name": "察雅县" }, { "code": "540326", "name": "八宿县" }, { "code": "540327", "name": "左贡县" }, { "code": "540328", "name": "芒康县" }, { "code": "540329", "name": "洛隆县" }, { "code": "540330", "name": "边坝县" }] },
{ "code": "540400", "name": "林芝市", "children": [{ "code": "540402", "name": "巴宜区" }, { "code": "540421", "name": "工布江达县" }, { "code": "540422", "name": "米林县" }, { "code": "540423", "name": "墨脱县" }, { "code": "540424", "name": "波密县" }, { "code": "540425", "name": "察隅县" }, { "code": "540426", "name": "朗县" }] },
{ "code": "540500", "name": "山南市", "children": [{ "code": "540502", "name": "乃东区" }, { "code": "540521", "name": "扎囊县" }, { "code": "540522", "name": "贡嘎县" }, { "code": "540523", "name": "桑日县" }, { "code": "540524", "name": "琼结县" }, { "code": "540525", "name": "曲松县" }, { "code": "540526", "name": "措美县" }, { "code": "540527", "name": "洛扎县" }, { "code": "540528", "name": "加查县" }, { "code": "540529", "name": "隆子县" }, { "code": "540530", "name": "错那县" }, { "code": "540531", "name": "浪卡子县" }] },
{ "code": "542400", "name": "那曲地区", "children": [{ "code": "542421", "name": "那曲县" }, { "code": "542422", "name": "嘉黎县" }, { "code": "542423", "name": "比如县" }, { "code": "542424", "name": "聂荣县" }, { "code": "542425", "name": "安多县" }, { "code": "542426", "name": "申扎县" }, { "code": "542427", "name": "索县" }, { "code": "542428", "name": "班戈县" }, { "code": "542429", "name": "巴青县" }, { "code": "542430", "name": "尼玛县" }, { "code": "542431", "name": "双湖县" }] },
{ "code": "542500", "name": "阿里地区", "children": [{ "code": "542521", "name": "普兰县" }, { "code": "542522", "name": "札达县" }, { "code": "542523", "name": "噶尔县" }, { "code": "542524", "name": "日土县" }, { "code": "542525", "name": "革吉县" }, { "code": "542526", "name": "改则县" }, { "code": "542527", "name": "措勤县" }] }
]
},
{
"code": "610000",
"name": "陕西省",
"children": [
{ "code": "610100", "name": "西安市", "children": [{ "code": "610102", "name": "新城区" }, { "code": "610103", "name": "碑林区" }, { "code": "610104", "name": "莲湖区" }, { "code": "610111", "name": "灞桥区" }, { "code": "610112", "name": "未央区" }, { "code": "610113", "name": "雁塔区" }, { "code": "610114", "name": "阎良区" }, { "code": "610115", "name": "临潼区" }, { "code": "610116", "name": "长安区" }, { "code": "610117", "name": "高陵区" }, { "code": "610118", "name": "鄠邑区" }, { "code": "610122", "name": "蓝田县" }, { "code": "610124", "name": "周至县" }] },
{ "code": "610200", "name": "铜川市", "children": [{ "code": "610202", "name": "王益区" }, { "code": "610203", "name": "印台区" }, { "code": "610204", "name": "耀州区" }, { "code": "610222", "name": "宜君县" }] },
{ "code": "610300", "name": "宝鸡市", "children": [{ "code": "610302", "name": "渭滨区" }, { "code": "610303", "name": "金台区" }, { "code": "610304", "name": "陈仓区" }, { "code": "610322", "name": "凤翔县" }, { "code": "610323", "name": "岐山县" }, { "code": "610324", "name": "扶风县" }, { "code": "610326", "name": "眉县" }, { "code": "610327", "name": "陇县" }, { "code": "610328", "name": "千阳县" }, { "code": "610329", "name": "麟游县" }, { "code": "610330", "name": "凤县" }, { "code": "610331", "name": "太白县" }] },
{ "code": "610400", "name": "咸阳市", "children": [{ "code": "610402", "name": "秦都区" }, { "code": "610403", "name": "杨陵区" }, { "code": "610404", "name": "渭城区" }, { "code": "610422", "name": "三原县" }, { "code": "610423", "name": "泾阳县" }, { "code": "610424", "name": "乾县" }, { "code": "610425", "name": "礼泉县" }, { "code": "610426", "name": "永寿县" }, { "code": "610427", "name": "彬县" }, { "code": "610428", "name": "长武县" }, { "code": "610429", "name": "旬邑县" }, { "code": "610430", "name": "淳化县" }, { "code": "610431", "name": "武功县" }, { "code": "610481", "name": "兴平市" }] },
{ "code": "610500", "name": "渭南市", "children": [{ "code": "610502", "name": "临渭区" }, { "code": "610503", "name": "华州区" }, { "code": "610522", "name": "潼关县" }, { "code": "610523", "name": "大荔县" }, { "code": "610524", "name": "合阳县" }, { "code": "610525", "name": "澄城县" }, { "code": "610526", "name": "蒲城县" }, { "code": "610527", "name": "白水县" }, { "code": "610528", "name": "富平县" }, { "code": "610581", "name": "韩城市" }, { "code": "610582", "name": "华阴市" }] },
{ "code": "610600", "name": "延安市", "children": [{ "code": "610602", "name": "宝塔区" }, { "code": "610603", "name": "安塞区" }, { "code": "610621", "name": "延长县" }, { "code": "610622", "name": "延川县" }, { "code": "610623", "name": "子长县" }, { "code": "610625", "name": "志丹县" }, { "code": "610626", "name": "吴起县" }, { "code": "610627", "name": "甘泉县" }, { "code": "610628", "name": "富县" }, { "code": "610629", "name": "洛川县" }, { "code": "610630", "name": "宜川县" }, { "code": "610631", "name": "黄龙县" }, { "code": "610632", "name": "黄陵县" }] },
{ "code": "610700", "name": "汉中市", "children": [{ "code": "610702", "name": "汉台区" }, { "code": "610721", "name": "南郑县" }, { "code": "610722", "name": "城固县" }, { "code": "610723", "name": "洋县" }, { "code": "610724", "name": "西乡县" }, { "code": "610725", "name": "勉县" }, { "code": "610726", "name": "宁强县" }, { "code": "610727", "name": "略阳县" }, { "code": "610728", "name": "镇巴县" }, { "code": "610729", "name": "留坝县" }, { "code": "610730", "name": "佛坪县" }] },
{ "code": "610800", "name": "榆林市", "children": [{ "code": "610802", "name": "榆阳区" }, { "code": "610803", "name": "横山区" }, { "code": "610822", "name": "府谷县" }, { "code": "610824", "name": "靖边县" }, { "code": "610825", "name": "定边县" }, { "code": "610826", "name": "绥德县" }, { "code": "610827", "name": "米脂县" }, { "code": "610828", "name": "佳县" }, { "code": "610829", "name": "吴堡县" }, { "code": "610830", "name": "清涧县" }, { "code": "610831", "name": "子洲县" }, { "code": "610881", "name": "神木市" }] },
{ "code": "610900", "name": "安康市", "children": [{ "code": "610902", "name": "汉滨区" }, { "code": "610921", "name": "汉阴县" }, { "code": "610922", "name": "石泉县" }, { "code": "610923", "name": "宁陕县" }, { "code": "610924", "name": "紫阳县" }, { "code": "610925", "name": "岚皋县" }, { "code": "610926", "name": "平利县" }, { "code": "610927", "name": "镇坪县" }, { "code": "610928", "name": "旬阳县" }, { "code": "610929", "name": "白河县" }] },
{ "code": "611000", "name": "商洛市", "children": [{ "code": "611002", "name": "商州区" }, { "code": "611021", "name": "洛南县" }, { "code": "611022", "name": "丹凤县" }, { "code": "611023", "name": "商南县" }, { "code": "611024", "name": "山阳县" }, { "code": "611025", "name": "镇安县" }, { "code": "611026", "name": "柞水县" }] }
]
},
{
"code": "620000",
"name": "甘肃省",
"children": [
{ "code": "620100", "name": "兰州市", "children": [{ "code": "620102", "name": "城关区" }, { "code": "620103", "name": "七里河区" }, { "code": "620104", "name": "西固区" }, { "code": "620105", "name": "安宁区" }, { "code": "620111", "name": "红古区" }, { "code": "620121", "name": "永登县" }, { "code": "620122", "name": "皋兰县" }, { "code": "620123", "name": "榆中县" }] },
{ "code": "620200", "name": "嘉峪关市", "children": [{ "code": "620200", "name": "嘉峪关市" }] },
{ "code": "620300", "name": "金昌市", "children": [{ "code": "620302", "name": "金川区" }, { "code": "620321", "name": "永昌县" }] },
{ "code": "620400", "name": "白银市", "children": [{ "code": "620402", "name": "白银区" }, { "code": "620403", "name": "平川区" }, { "code": "620421", "name": "靖远县" }, { "code": "620422", "name": "会宁县" }, { "code": "620423", "name": "景泰县" }] },
{ "code": "620500", "name": "天水市", "children": [{ "code": "620502", "name": "秦州区" }, { "code": "620503", "name": "麦积区" }, { "code": "620521", "name": "清水县" }, { "code": "620522", "name": "秦安县" }, { "code": "620523", "name": "甘谷县" }, { "code": "620524", "name": "武山县" }, { "code": "620525", "name": "张家川回族自治县" }] },
{ "code": "620600", "name": "武威市", "children": [{ "code": "620602", "name": "凉州区" }, { "code": "620621", "name": "民勤县" }, { "code": "620622", "name": "古浪县" }, { "code": "620623", "name": "天祝藏族自治县" }] },
{ "code": "620700", "name": "张掖市", "children": [{ "code": "620702", "name": "甘州区" }, { "code": "620721", "name": "肃南裕固族自治县" }, { "code": "620722", "name": "民乐县" }, { "code": "620723", "name": "临泽县" }, { "code": "620724", "name": "高台县" }, { "code": "620725", "name": "山丹县" }] },
{ "code": "620800", "name": "平凉市", "children": [{ "code": "620802", "name": "崆峒区" }, { "code": "620821", "name": "泾川县" }, { "code": "620822", "name": "灵台县" }, { "code": "620823", "name": "崇信县" }, { "code": "620824", "name": "华亭县" }, { "code": "620825", "name": "庄浪县" }, { "code": "620826", "name": "静宁县" }] },
{ "code": "620900", "name": "酒泉市", "children": [{ "code": "620902", "name": "肃州区" }, { "code": "620921", "name": "金塔县" }, { "code": "620922", "name": "瓜州县" }, { "code": "620923", "name": "肃北蒙古族自治县" }, { "code": "620924", "name": "阿克塞哈萨克族自治县" }, { "code": "620981", "name": "玉门市" }, { "code": "620982", "name": "敦煌市" }] },
{ "code": "621000", "name": "庆阳市", "children": [{ "code": "621002", "name": "西峰区" }, { "code": "621021", "name": "庆城县" }, { "code": "621022", "name": "环县" }, { "code": "621023", "name": "华池县" }, { "code": "621024", "name": "合水县" }, { "code": "621025", "name": "正宁县" }, { "code": "621026", "name": "宁县" }, { "code": "621027", "name": "镇原县" }] },
{ "code": "621100", "name": "定西市", "children": [{ "code": "621102", "name": "安定区" }, { "code": "621121", "name": "通渭县" }, { "code": "621122", "name": "陇西县" }, { "code": "621123", "name": "渭源县" }, { "code": "621124", "name": "临洮县" }, { "code": "621125", "name": "漳县" }, { "code": "621126", "name": "岷县" }] },
{ "code": "621200", "name": "陇南市", "children": [{ "code": "621202", "name": "武都区" }, { "code": "621221", "name": "成县" }, { "code": "621222", "name": "文县" }, { "code": "621223", "name": "宕昌县" }, { "code": "621224", "name": "康县" }, { "code": "621225", "name": "西和县" }, { "code": "621226", "name": "礼县" }, { "code": "621227", "name": "徽县" }, { "code": "621228", "name": "两当县" }] },
{ "code": "622900", "name": "临夏回族自治州", "children": [{ "code": "622901", "name": "临夏市" }, { "code": "622921", "name": "临夏县" }, { "code": "622922", "name": "康乐县" }, { "code": "622923", "name": "永靖县" }, { "code": "622924", "name": "广河县" }, { "code": "622925", "name": "和政县" }, { "code": "622926", "name": "东乡族自治县" }, { "code": "622927", "name": "积石山保安族东乡族撒拉族自治县" }] },
{ "code": "623000", "name": "甘南藏族自治州", "children": [{ "code": "623001", "name": "合作市" }, { "code": "623021", "name": "临潭县" }, { "code": "623022", "name": "卓尼县" }, { "code": "623023", "name": "舟曲县" }, { "code": "623024", "name": "迭部县" }, { "code": "623025", "name": "玛曲县" }, { "code": "623026", "name": "碌曲县" }, { "code": "623027", "name": "夏河县" }] }
]
},
{
"code": "630000",
"name": "青海省",
"children": [
{ "code": "630100", "name": "西宁市", "children": [{ "code": "630102", "name": "城东区" }, { "code": "630103", "name": "城中区" }, { "code": "630104", "name": "城西区" }, { "code": "630105", "name": "城北区" }, { "code": "630121", "name": "大通回族土族自治县" }, { "code": "630122", "name": "湟中县" }, { "code": "630123", "name": "湟源县" }] },
{ "code": "630200", "name": "海东市", "children": [{ "code": "630202", "name": "乐都区" }, { "code": "630203", "name": "平安区" }, { "code": "630222", "name": "民和回族土族自治县" }, { "code": "630223", "name": "互助土族自治县" }, { "code": "630224", "name": "化隆回族自治县" }, { "code": "630225", "name": "循化撒拉族自治县" }] },
{ "code": "632200", "name": "海北藏族自治州", "children": [{ "code": "632221", "name": "门源回族自治县" }, { "code": "632222", "name": "祁连县" }, { "code": "632223", "name": "海晏县" }, { "code": "632224", "name": "刚察县" }] },
{ "code": "632300", "name": "黄南藏族自治州", "children": [{ "code": "632321", "name": "同仁县" }, { "code": "632322", "name": "尖扎县" }, { "code": "632323", "name": "泽库县" }, { "code": "632324", "name": "河南蒙古族自治县" }] },
{ "code": "632500", "name": "海南藏族自治州", "children": [{ "code": "632521", "name": "共和县" }, { "code": "632522", "name": "同德县" }, { "code": "632523", "name": "贵德县" }, { "code": "632524", "name": "兴海县" }, { "code": "632525", "name": "贵南县" }] },
{ "code": "632600", "name": "果洛藏族自治州", "children": [{ "code": "632621", "name": "玛沁县" }, { "code": "632622", "name": "班玛县" }, { "code": "632623", "name": "甘德县" }, { "code": "632624", "name": "达日县" }, { "code": "632625", "name": "久治县" }, { "code": "632626", "name": "玛多县" }] },
{ "code": "632700", "name": "玉树藏族自治州", "children": [{ "code": "632701", "name": "玉树市" }, { "code": "632722", "name": "杂多县" }, { "code": "632723", "name": "称多县" }, { "code": "632724", "name": "治多县" }, { "code": "632725", "name": "囊谦县" }, { "code": "632726", "name": "曲麻莱县" }] },
{ "code": "632800", "name": "海西蒙古族藏族自治州", "children": [{ "code": "632801", "name": "格尔木市" }, { "code": "632802", "name": "德令哈市" }, { "code": "632821", "name": "乌兰县" }, { "code": "632822", "name": "都兰县" }, { "code": "632823", "name": "天峻县" }, { "code": "632825", "name": "海西蒙古族藏族自治州直辖" }] }
]
},
{
"code": "640000",
"name": "宁夏回族自治区",
"children": [
{ "code": "640100", "name": "银川市", "children": [{ "code": "640104", "name": "兴庆区" }, { "code": "640105", "name": "西夏区" }, { "code": "640106", "name": "金凤区" }, { "code": "640121", "name": "永宁县" }, { "code": "640122", "name": "贺兰县" }, { "code": "640181", "name": "灵武市" }] },
{ "code": "640200", "name": "石嘴山市", "children": [{ "code": "640202", "name": "大武口区" }, { "code": "640205", "name": "惠农区" }, { "code": "640221", "name": "平罗县" }] },
{ "code": "640300", "name": "吴忠市", "children": [{ "code": "640302", "name": "利通区" }, { "code": "640303", "name": "红寺堡区" }, { "code": "640323", "name": "盐池县" }, { "code": "640324", "name": "同心县" }, { "code": "640381", "name": "青铜峡市" }] },
{ "code": "640400", "name": "固原市", "children": [{ "code": "640402", "name": "原州区" }, { "code": "640422", "name": "西吉县" }, { "code": "640423", "name": "隆德县" }, { "code": "640424", "name": "泾源县" }, { "code": "640425", "name": "彭阳县" }] },
{ "code": "640500", "name": "中卫市", "children": [{ "code": "640502", "name": "沙坡头区" }, { "code": "640521", "name": "中宁县" }, { "code": "640522", "name": "海原县" }] }
]
},
{
"code": "650000",
"name": "新疆维吾尔自治区",
"children": [
{ "code": "650100", "name": "乌鲁木齐市", "children": [{ "code": "650102", "name": "天山区" }, { "code": "650103", "name": "沙依巴克区" }, { "code": "650104", "name": "新市区" }, { "code": "650105", "name": "水磨沟区" }, { "code": "650106", "name": "头屯河区" }, { "code": "650107", "name": "达坂城区" }, { "code": "650109", "name": "米东区" }, { "code": "650121", "name": "乌鲁木齐县" }] },
{ "code": "650200", "name": "克拉玛依市", "children": [{ "code": "650202", "name": "独山子区" }, { "code": "650203", "name": "克拉玛依区" }, { "code": "650204", "name": "白碱滩区" }, { "code": "650205", "name": "乌尔禾区" }] },
{ "code": "650400", "name": "吐鲁番市", "children": [{ "code": "650402", "name": "高昌区" }, { "code": "650421", "name": "鄯善县" }, { "code": "650422", "name": "托克逊县" }] },
{ "code": "650500", "name": "哈密市", "children": [{ "code": "650502", "name": "伊州区" }, { "code": "650521", "name": "巴里坤哈萨克自治县" }, { "code": "650522", "name": "伊吾县" }] },
{ "code": "652300", "name": "昌吉回族自治州", "children": [{ "code": "652301", "name": "昌吉市" }, { "code": "652302", "name": "阜康市" }, { "code": "652323", "name": "呼图壁县" }, { "code": "652324", "name": "玛纳斯县" }, { "code": "652325", "name": "奇台县" }, { "code": "652327", "name": "吉木萨尔县" }, { "code": "652328", "name": "木垒哈萨克自治县" }] },
{ "code": "652700", "name": "博尔塔拉蒙古自治州", "children": [{ "code": "652701", "name": "博乐市" }, { "code": "652702", "name": "阿拉山口市" }, { "code": "652722", "name": "精河县" }, { "code": "652723", "name": "温泉县" }] },
{ "code": "652800", "name": "巴音郭楞蒙古自治州", "children": [{ "code": "652801", "name": "库尔勒市" }, { "code": "652822", "name": "轮台县" }, { "code": "652823", "name": "尉犁县" }, { "code": "652824", "name": "若羌县" }, { "code": "652825", "name": "且末县" }, { "code": "652826", "name": "焉耆回族自治县" }, { "code": "652827", "name": "和静县" }, { "code": "652828", "name": "和硕县" }, { "code": "652829", "name": "博湖县" }] },
{ "code": "652900", "name": "阿克苏地区", "children": [{ "code": "652901", "name": "阿克苏市" }, { "code": "652922", "name": "温宿县" }, { "code": "652923", "name": "库车县" }, { "code": "652924", "name": "沙雅县" }, { "code": "652925", "name": "新和县" }, { "code": "652926", "name": "拜城县" }, { "code": "652927", "name": "乌什县" }, { "code": "652928", "name": "阿瓦提县" }, { "code": "652929", "name": "柯坪县" }] },
{ "code": "653000", "name": "克孜勒苏柯尔克孜自治州", "children": [{ "code": "653001", "name": "阿图什市" }, { "code": "653022", "name": "阿克陶县" }, { "code": "653023", "name": "阿合奇县" }, { "code": "653024", "name": "乌恰县" }] },
{ "code": "653100", "name": "喀什地区", "children": [{ "code": "653101", "name": "喀什市" }, { "code": "653121", "name": "疏附县" }, { "code": "653122", "name": "疏勒县" }, { "code": "653123", "name": "英吉沙县" }, { "code": "653124", "name": "泽普县" }, { "code": "653125", "name": "莎车县" }, { "code": "653126", "name": "叶城县" }, { "code": "653127", "name": "麦盖提县" }, { "code": "653128", "name": "岳普湖县" }, { "code": "653129", "name": "伽师县" }, { "code": "653130", "name": "巴楚县" }, { "code": "653131", "name": "塔什库尔干塔吉克自治县" }] },
{ "code": "653200", "name": "和田地区", "children": [{ "code": "653201", "name": "和田市" }, { "code": "653221", "name": "和田县" }, { "code": "653222", "name": "墨玉县" }, { "code": "653223", "name": "皮山县" }, { "code": "653224", "name": "洛浦县" }, { "code": "653225", "name": "策勒县" }, { "code": "653226", "name": "于田县" }, { "code": "653227", "name": "民丰县" }] },
{ "code": "654000", "name": "伊犁哈萨克自治州", "children": [{ "code": "654002", "name": "伊宁市" }, { "code": "654003", "name": "奎屯市" }, { "code": "654004", "name": "霍尔果斯市" }, { "code": "654021", "name": "伊宁县" }, { "code": "654022", "name": "察布查尔锡伯自治县" }, { "code": "654023", "name": "霍城县" }, { "code": "654024", "name": "巩留县" }, { "code": "654025", "name": "新源县" }, { "code": "654026", "name": "昭苏县" }, { "code": "654027", "name": "特克斯县" }, { "code": "654028", "name": "尼勒克县" }] },
{ "code": "654200", "name": "塔城地区", "children": [{ "code": "654201", "name": "塔城市" }, { "code": "654202", "name": "乌苏市" }, { "code": "654221", "name": "额敏县" }, { "code": "654223", "name": "沙湾县" }, { "code": "654224", "name": "托里县" }, { "code": "654225", "name": "裕民县" }, { "code": "654226", "name": "和布克赛尔蒙古自治县" }] },
{ "code": "654300", "name": "阿勒泰地区", "children": [{ "code": "654301", "name": "阿勒泰市" }, { "code": "654321", "name": "布尔津县" }, { "code": "654322", "name": "富蕴县" }, { "code": "654323", "name": "福海县" }, { "code": "654324", "name": "哈巴河县" }, { "code": "654325", "name": "青河县" }, { "code": "654326", "name": "吉木乃县" }] },
{ "code": "659001", "name": "石河子市", "children": [{ "code": "659001", "name": "石河子市" }] },
{ "code": "659002", "name": "阿拉尔市", "children": [{ "code": "659002", "name": "阿拉尔市" }] },
{ "code": "659003", "name": "图木舒克市", "children": [{ "code": "659003", "name": "图木舒克市" }] },
{ "code": "659004", "name": "五家渠市", "children": [{ "code": "659004", "name": "五家渠市" }] },
{ "code": "659005", "name": "北屯市", "children": [{ "code": "659005", "name": "北屯市" }] },
{ "code": "659006", "name": "铁门关市", "children": [{ "code": "659006", "name": "铁门关市" }] },
{ "code": "659007", "name": "双河市", "children": [{ "code": "659007", "name": "双河市" }] },
{ "code": "659008", "name": "可克达拉市", "children": [{ "code": "659008", "name": "可克达拉市" }] },
{ "code": "659009", "name": "昆玉市", "children": [{ "code": "659009", "name": "昆玉市" }] }
]
},
{ "code": "710000", "name": "台湾省", "children": [{ "code": "710000", "name": "台湾省", "children": [{ "code": "710000", "name": "台湾省" }] }] },
{
"code": "810000",
"name": "香港特别行政区",
"children": [
{
"code": "810100",
"name": "香港城区",
"children": [{ "code": "810101", "name": "中西区" }, { "code": "810102", "name": "湾仔区" }, { "code": "810103", "name": "东区" }, { "code": "810104", "name": "南区" }, { "code": "810105", "name": "油尖旺区" }, { "code": "810106", "name": "深水埗区" }, { "code": "810107", "name": "九龙城区" }, { "code": "810108", "name": "黄大仙区" }, { "code": "810109", "name": "观塘区" }, { "code": "810110", "name": "荃湾区" }, { "code": "810111", "name": "屯门区" }, { "code": "810112", "name": "元朗区" }, { "code": "810113", "name": "北区" }, { "code": "810114", "name": "大埔区" }, { "code": "810115", "name": "西贡区" }, { "code": "810116", "name": "沙田区" }, { "code": "810117", "name": "葵青区" }, { "code": "810118", "name": "离岛区" }]
}
]
},
{ "code": "820000", "name": "澳门特别行政区", "children": [{ "code": "820100", "name": "澳门城区", "children": [{ "code": "820101", "name": "花地玛堂区" }, { "code": "820102", "name": "花王堂区" }, { "code": "820103", "name": "望德堂区" }, { "code": "820104", "name": "大堂区" }, { "code": "820105", "name": "风顺堂区" }, { "code": "820106", "name": "嘉模堂区" }, { "code": "820107", "name": "路凼填海区" }, { "code": "820108", "name": "圣方济各堂区" }] }] }
]

@ -0,0 +1,33 @@
/*
* @Author: ch
* @Date: 2022-06-20 11:10:23
* @LastEditors: ch
* @LastEditTime: 2022-06-28 16:33:25
* @Description: file content
*/
export default {
TYPE : {
// 评价
COMMENT: 1,
// 追评
FOLLOW_COMMENT: 2,
// 回复
ANSWER: 3,
},
// 是否显示
DISPLAY: {
SHOW: 1,
HIDE : 0
},
// 用户类型
USER_TYPE: {
STORE : 1,
USER : 2
},
// 是否默认评价
IS_DEFAULT_COMMENT: {
YES: 1,
NOT : 0
},
RATE_LABEL : ['非常不满意','不满意','一般','满意','非常满意']
}

@ -0,0 +1,19 @@
/*
* @Author: ch
* @Date: 2022-05-26 15:39:52
* @LastEditors: ch
* @LastEditTime: 2022-05-26 15:47:28
* @Description: file content
*/
// 商品类型
const GOODS_TYPE = {
// 虚拟
VIRTUAL: 2,
// 实物
ENTITY : 1
}
export {
GOODS_TYPE
}

@ -2,7 +2,7 @@
* @Author: ch
* @Date: 2022-05-10 20:50:54
* @LastEditors: ch
* @LastEditTime: 2022-05-13 14:28:29
* @LastEditTime: 2022-05-23 14:29:55
* @Description: file content
*/
@ -20,16 +20,30 @@ const MSG_TYPE = {
// 提示消息
TIP : 7
}
const TYPE = {
// 系统会话类型
const SYS_IO = {
// 连接心跳
HEART: 0,
// 获取会话列表
GET_SESSION_LIST: 1,
// 查询会话消息
GET_SESSION_MSG: 2,
// 发送消息
SEND_MSG: 3,
// 根据消息ID查询消息
GET_ID_MSG: 4,
}
const KF_IO = {
// 会话心跳
HEART: 22,
// 给某个会话发送消息
SEND_MSG: 20,
// 创建会话
CRETAE_SEEION: 21,
// 会话心跳
SESSION_HEART : 22
}
export {
// 消息类型
MSG_TYPE
MSG_TYPE,
SYS_IO,
KF_IO
}

@ -0,0 +1,35 @@
/*
* @Author: ch
* @Date: 2022-05-26 11:49:16
* @LastEditors: ch
* @LastEditTime: 2022-06-22 11:23:02
* @Description: file content
*/
// 订单状态
export const ORDER_STATUS = {
// 待支付
AWAIT_PAY: 1
}
export default {
TYPE : {
//(1, "普通订单"),
NORMAL: 1,
//(2, "免费订单"),
FREE: 2,
//(3, "秒杀订单"),
SECKILL: 3,
//(4, "虚拟商品订单"),
VIRTUAL : 4
},
// 订单状态 1待支付2已关闭3已支付4已发货5已收货6已完成7已追评
STATUS: {
AWAIT_PAY: 1,
CLOSE: 2,
FINISH_PAY: 3,
FINISH_SEND_GOODS: 4,
FINISH_TAKE_GOODS: 5,
FINISH: 6,
FINISH_FOLLOW_COMMENT : 7
}
}

@ -0,0 +1,483 @@
/*
* @Author: ch
* @Date: 2022-05-18 14:54:47
* @LastEditors: ch
* @LastEditTime: 2022-06-14 17:24:14
* @Description: file content
*/
import { CreateUUID, FormatDate, ToAsyncAwait } from "@/common/utils";
import './potoReq';
import './protoRsp'
const connect = Symbol('connect');
const send = Symbol('send');
const onMessage = Symbol('onMessage');
const fromatPotoReq = (traceId, traceType, content) => {
let messageModel = new proto.ReqModel();
messageModel.setTraceid(traceId);
messageModel.setTracetype(traceType);
content && messageModel.setContent(JSON.stringify(content));
return messageModel.serializeBinary();
},
fromatPotoRsp = (data) => {
const res = proto.RspModel.deserializeBinary(new Uint8Array(data));
let ctx = res.getContent();
ctx = ctx ? JSON.parse(ctx) : {};
if (ctx.payload) {
ctx.payload = JSON.parse(ctx.payload);
}
return {
content: ctx,
traceId: res.getTraceid(),
traceType: res.getTracetype(),
code: res.getCode(),
message: res.getMessage(),
};
};
class MsbIm {
defaultOption = {
ioKey: 'traceId',
reconnect: true,
};
socket = null;
isOpen = false;
queue = {};
interceptors = {
dataChangeBefore: null,
dataChangeAfter: null,
onClose: null,
onMessage: null,
};
sessionData = [];
curSessionId = null;
constructor(option) {
this.option = {
...this.defaultOption,
...option,
};
}
/**
* 创建连接返回一个Promise 创建成功并成功打开连接算连接成功
* @param {*} option
*/
[connect](option) {
return new Promise((resolve, reject) => {
const open = () => {
console.log('[im] open');
this.isOpen = true;
resolve(this.socket);
};
const message = async (res) => {
const result = fromatPotoRsp(res.data);
this.interceptors.onMessage && this.interceptors.onMessage(result);
// 处理服务端主动推送的消息
this[onMessage](result);
// 如果再消息堆里有此消息回调,则执行回调,并删除
const cbk = this.queue[result[this.option.ioKey]];
if (cbk) {
cbk(result.code !== 200 ? { error: result } : { result: result });
delete this.queue[result[this.option.ioKey]];
}
};
const close = () => {
console.log('[im] close');
this.interceptors.onClose && this.interceptors.onClose();
};
let isUni = false;
try {
isUni = uni;
} catch (e) {
isUni = false;
}
if (isUni) {
this.socket = uni.connectSocket({
...this.option,
fail(e) {
reject(e);
},
});
this.socket.onOpen(() => {
open();
this.socket.onMessage((res) => {
message(res);
});
});
this.socket.onClose(() => {
close();
});
} else if (WebSocket) {
try {
this.socket = new WebSocket(this.option.url);
this.socket.binaryType = 'arraybuffer';
this.socket.onopen = () => {
open();
};
this.socket.onmessage = (res) => {
message(res);
};
this.socket.onclose = () => {
close();
};
} catch (e) {
reject(e);
}
}
});
}
/**
* 向服务端发送消息||请求返回一个Promise对象收到ioKey对应的消息会算一个同步完成
* @param {*} data
*/
[send](data) {
return new Promise((resolve, reject) => {
if (!this.isOpen) {
return reject('连接未打开');
}
this.queue[data[this.option.ioKey]] = ({ result, error }) => {
if (result) {
resolve(result);
} else {
reject(error);
}
};
const par = fromatPotoReq(data.traceId, data.traceType, data.content);
let isUni = false;
try {
isUni = uni;
} catch (e) {
isUni = false;
}
if (isUni) {
this.socket.send({
data: par,
fail(e) {
reject({ error: e });
},
});
} else if (WebSocket) {
this.socket.send(par);
}
});
}
/**
* 服务端推送消息只处理服务端主动推送的消息
* @param {*} data
*/
[onMessage](data) {
// 判断非服务端主动推送消息不做处理
if (data[this.option.ioKey] || data.code !== 200) {
return false;
}
console.log('[im] 主动接收的消息', data);
let ctx = data.content;
let historyData = [...this.sessionData],
newData = [];
const hisIndex = historyData.findIndex((i) => i.id === ctx.sessionId);
if (hisIndex >= 0) {
// 存在会话往现有会话增加一条消息,并修改最后一条消息为当前消息
const curHisData = historyData[hisIndex];
curHisData.messageList.push(ctx);
curHisData.lastMessage = ctx;
// 不在当前会话窗口则向会话消息加1条未读
if (ctx.sessionId !== this.curSessionId) {
curHisData.unreadCount++;
} else {
this.setRead({
content: {
sessionId: this.curSessionId,
},
});
}
newData = historyData;
} else {
// 会话列表不存在,则创建一个会话
newData = [
...historyData,
{
fromAvatar: ctx.session.fromAvatar,
fromId: ctx.session.fromId,
fromNickname: ctx.session.fromNickname,
id: ctx.sessionId,
lastMessage: ctx,
messageList: [ctx],
updateTimeStamp: ctx.createTimeStamp,
unreadCount: 1,
},
];
}
this.setSessionData(newData);
}
init(config) {
return new Promise((resolve, reject) => {
const heart = () => {
// 要优化 心跳没回复需要重连
setTimeout(async () => {
if (this.isOpen) {
await this[send]({
traceId: CreateUUID(),
traceType: 0,
content: { text: 'ping' },
});
}
heart();
}, 1000);
};
this.option = {
...this.option,
...config,
};
this[connect]()
.then((res) => {
resolve(res);
heart();
})
.catch((e) => {
console.log('eeeee', e);
});
});
}
/**
* 设置数据
*/
setSessionData(data) {
let newData = JSON.parse(JSON.stringify(data));
this.interceptors.dataChangeBefore && this.interceptors.dataChangeBefore(newData, this.sessionData);
this.sessionData = newData;
this.interceptors.dataChangeAfter && this.interceptors.dataChangeAfter(this.sessionData);
}
/**
* 设置当前聊天窗口
* Data为Session数据
* @param {*} data
*/
setCurSessionId(id) {
this.curSessionId = id;
}
/**
* 获取会话列表
* @param {*} params
*/
async getSessionList(params) {
const par = {
traceId: CreateUUID(),
traceType: 1,
...params,
};
console.log('[im] 获取会话列表--start', par);
let { error, result } = await ToAsyncAwait(this[send](par));
console.log('[im] 获取会话列表--end', result, error);
if (error) {
return Promise.reject(error);
}
const { content } = result;
// let newData = [];
content.sessionVOS.forEach((item) => {
if (item.lastMessage) {
item.lastMessage.payload = JSON.parse(item.lastMessage.payload || {});
}
let historyData = this.sessionData;
let hisIndex = historyData.findIndex((i) => i.id === item.id);
if (hisIndex < 0) {
item.messageList = [];
}
// let historyData = this.sessionData;
// let hisIndex = historyData.findIndex((i) => i.id === item.id);
// if (hisIndex >= 0) {
// historyData[hisIndex].lastMessage = item.lastMessage;
// historyData[hisIndex].unreadCount++;
// newData.push(historyData[hisIndex]);
// } else {
// item.messageList = [];
// newData = [...newData, item];
// }
});
this.setSessionData(content.sessionVOS);
return Promise.resolve(result);
}
/**
* 获取会话的历史消息记录
* @param {*} params
*/
async getHistoryMsg() {
const curSessionIdx = this.sessionData.findIndex((i) => i.id === this.curSessionId);
const curSession = this.sessionData[curSessionIdx];
console.log(curSession, this.curSessionId, 'this.curSessionId');
const msgList = curSession.messageList || [];
const par = {
traceId: CreateUUID(),
traceType: 2,
content: {
sessionId: this.curSessionId,
topMessageId: msgList.length ? msgList[0].id : null,
},
};
console.log('[im] 获取会话历史消息--start', par);
const { error, result } = await ToAsyncAwait(this[send](par));
console.log('[im] 获取会话历史消息--end', result, error);
if (error) {
return Promise.reject(error);
}
const { content } = result;
if (content.length) {
let newData = this.sessionData;
content.forEach((item) => {
item.payload = JSON.parse(item.payload);
});
newData[curSessionIdx].messageList = content.concat(newData[curSessionIdx].messageList);
this.setSessionData(newData);
}
return Promise.resolve(result);
}
/**
* 会话已读
* @param {*} params
*/
async setRead(params) {
const par = {
traceId: CreateUUID(),
traceType: '6',
...params,
};
console.log('[im] 会话已读--start', par);
const { error, result } = await this[send](par);
console.log('[im] 会话已读--end', result, error);
let newData = this.sessionData.map((item) => {
if (item.id == params.content.sessionId) {
item.unreadCount = 0;
}
return item;
});
this.setSessionData(newData);
}
/**
* 发送消息
* @param {*} params
*/
async sendMsg(params) {
const index = this.sessionData.findIndex((i) => i.id === this.curSessionId);
let curSession = this.sessionData[index];
// 临时消息体
let par = {
...params,
traceId: CreateUUID(),
traceType: 3,
};
let msgCtx = {
...params.content,
...par,
createTimeStamp: new Date().getTime(),
sendStatus: 'loading',
};
if (typeof msgCtx.payload === 'string') {
msgCtx.payload = JSON.parse(msgCtx.payload);
}
// 点发送,立即把消息加入消息列表,标记为发送中状态
curSession.lastMessage = msgCtx;
curSession.messageList.push(msgCtx);
this.setSessionData(this.sessionData);
// 超过时间未返回视为发送失败
this.timerStatus(msgCtx);
console.log('[im] 发送消息--start', par);
const { error, result } = await ToAsyncAwait(this[send](par));
console.log('[im] 发送消息--end', result, error);
// 接到通知,标记消息是否发送成功
for (let i = curSession.messageList.length; i--; ) {
const item = curSession.messageList[i];
if (item[this.option.ioKey] === par[this.option.ioKey]) {
curSession.messageList[i].sendStatus = msgCtx.sendStatus = error ? 'fail' : 'success';
break;
}
}
let newData = [...this.sessionData];
curSession.lastMessage = msgCtx;
newData[index] = curSession;
this.setSessionData(newData);
if (error) {
return Promise.reject(error);
}
return Promise.resolve(result);
}
/**
* 发送失败时重新发送
* @param {*} params
*/
async resend(params) {
params.sendStatus = 'loading';
this.timerStatus(params);
console.log('[im] 重新发送消息--start', params);
const { error, result } = await ToAsyncAwait(
this[send]({
traceId: params.traceId,
traceType: params.traceType,
content: params.content,
})
);
console.log('[im] 重新发送消息--end', result, error);
params.createTimeStamp = result.createTimeStamp;
if (error) {
params.sendStatus = 'fail';
return Promise.reject(error);
}
params.sendStatus = 'success';
return Promise.resolve(result);
}
timerStatus(msg) {
setTimeout(() => {
if (msg.sendStatus === 'loading') {
msg.sendStatus = 'fail';
delete this.queue[msg.traceId];
}
}, 3000);
}
/**
* 主动创建会话
* @param {*} params
*/
async createSession(params) {
const par = {
traceId: CreateUUID(),
traceType: 9,
...params,
};
console.log('[im] 主动创建会话--start', par);
const { result, error } = await ToAsyncAwait(this[send](par));
console.log('[im] 主动创建会话--end', result, error);
if (error) {
return Promise.reject(error);
}
const { content } = result;
let historyData = this.sessionData;
let curSession = historyData.find((i) => i.id === content.id);
if (!curSession) {
curSession = {
...content,
unreadCount: 0,
messageList: [],
};
const newData = [...historyData, curSession];
this.setSessionData(newData);
}
return Promise.resolve(result);
}
close() {
this.socket.close();
this.socket = null;
this.isOpen = false;
this.setSessionData([]);
}
}
export default MsbIm;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -2,7 +2,7 @@
* @Author: ch
* @Date: 2022-03-18 11:11:05
* @LastEditors: ch
* @LastEditTime: 2022-03-18 11:11:05
* @LastEditTime: 2022-07-12 18:31:15
* @Description: file content
*/
import {RouterMount,createRouter} from 'uni-simple-router';
@ -13,6 +13,11 @@ const router = createRouter({
});
//全局路由前置守卫
router.beforeEach((to, from, next) => {
// 兼容页面刷新body样式丢失问题
// console.log(document);
if (document) {
document.body.setAttribute('class', `uni-body ${to.path.replace('/', '').replace(/\//g, '-')}`)
}
next();
});
// 全局路由后置守卫

@ -0,0 +1,72 @@
/*
* @Author: ch
* @Date: 2022-03-22 18:28:52
* @LastEditors: ch
* @LastEditTime: 2022-06-22 15:31:09
* @Description: file content
*/
import Vue from 'vue'
import Vuex from 'vuex';
Vue.use(Vuex);
const
// token
TOKEN = 'tk',
// 用户信息
USER_INFO = 'ui',
// 地址列表
ADDRESS = 'ads',
// oppenId
OPPED_ID = 'oi',
// 每个浏览器创建一个UUID作为同一个用户的标识
UUID = 'uid',
// 评价图片预览数据
COMMENT_PREVIEW = 'comment_preview';
export default new Vuex.Store({
state: {
token: uni.getStorageSync(TOKEN) || '',
userInfo: JSON.parse(uni.getStorageSync(USER_INFO) || '{}'),
address: JSON.parse(uni.getStorageSync(ADDRESS) || '[]'),
openId: uni.getStorageSync(OPPED_ID) || '',
uuid: uni.getStorageSync(UUID) || '',
comment_preview: JSON.parse(uni.getStorageSync(COMMENT_PREVIEW) || '{}'),
imData : [],
imMsgCount : 0
},
mutations:{
SET_TOKEN (state, token = ''){
state.token = token;
uni.setStorageSync(TOKEN, token);
},
SET_USER_INFO (state, userInfo = {}){
state.userInfo = userInfo;
uni.setStorageSync(USER_INFO, JSON.stringify(userInfo));
},
SET_ADDRESS (state, address = []){
state.address = address;
uni.setStorageSync(ADDRESS, JSON.stringify(address));
},
SET_UUID (state, uid){
state.uuid = uid;
uni.setStorageSync(UUID, uid);
},
SET_OPEN_ID (state, data){
state.openId = data;
uni.setStorageSync(OPPED_ID, data);
},
SET_COMMENT_PREVIEW(state, data) {
state.comment_preview = data;
uni.setStorageSync(COMMENT_PREVIEW, JSON.stringify(data));
},
SET_IM_DATA (state, data){
state.imData = data ;
},
SET_IM_MSG_COUNT (state, data){
state.imMsgCount = data;
}
},
actions : {
}
})

@ -0,0 +1,50 @@
/*
* @Author: ch
* @Date: 2022-04-29 14:26:10
* @LastEditors: ch
* @LastEditTime: 2022-07-13 10:37:21
* @Description: file content
*/
import { ApiPostAliH5Pay, ApiPostAliAppPay } from '@/common/api/pay';
const ENV = process.env;
export const Alipay = async ({orderId})=>{
// #ifdef APP-PLUS
const {error, result} = await ApiPostAliAppPay({orderId});
if(error){
uni.$u.toast(error.message);
return false;
}
const par = result.payDataInfo;
uni.requestPayment({
provider: 'alipay',
orderInfo :par.payData,
success(res) {
uni.navigateTo({
url : `/payResult?orderId=${orderId}&payType=appWx`
});
},
fail(e) {
uni.navigateTo({
url : `/payResult?orderId=${orderId}&payType=appWx`
});
}
}).then(res => {
console.log('res',res);
})
// #endif
// #ifdef H5
const { error, result } = await ApiPostAliH5Pay({
orderId,
returnUrl : decodeURIComponent(`${ENV.VUE_APP_STATIC_URL}/payResult?orderId=${orderId}&payType=alih5`)
});
if(error){
uni.$u.toast(error.message);
return false;
}
window.location.href = result.payDataInfo.payUrl;
// #endif
}

@ -0,0 +1,56 @@
/*
* @Author: ch
* @Date: 2022-05-20 11:00:07
* @LastEditors: ch
* @LastEditTime: 2022-07-13 10:37:52
* @Description: file content
*/
import MsbIm from '@/common/plugins/msbIm' ;
import { ToAsyncAwait, FormatJsonSearch } from '@/common/utils';
import { ApiGetCurrentUser } from '@/common/api/account';
import { ApiGetSoketTicket } from '@/common/api/im';
import $store from '@/common/store';
const ENV = process.env;
const Im = new MsbIm({
reconnect: true,
});
const ImInit = async () => {
const { error, result } = await ApiGetSoketTicket();
if (error) {
return false;
}
const par = FormatJsonSearch({
client: result.client,
ticket: result.ticket,
// 1普通用户 2客服链接
connect: 1,
user: $store.state.userInfo.id,
nickname: $store.state.userInfo.nickname,
avatar : $store.state.userInfo.avatar
})
await ToAsyncAwait(Im.init({
url: `${ENV.VUE_APP_IM_URL}/ws${par}`
}))
};
Im.interceptors.dataChangeAfter = () => {
$store.commit('SET_IM_DATA', Im.sessionData);
let msgCount = 0;
Im.sessionData.forEach(i => {
msgCount += i.unreadCount;
})
$store.commit('SET_IM_MSG_COUNT', msgCount);
}
Im.interceptors.onClose = () => {
Im.setSessionData([]);
Im.setCurSessionId(null);
$store.commit('SET_IM_DATA', []);
$store.commit('SET_IM_MSG_COUNT', 0);
}
export {
Im,
ImInit
}

@ -0,0 +1,23 @@
/*
* @Author: ch
* @Date: 2022-03-22 16:52:28
* @LastEditors: ch
* @LastEditTime: 2022-06-29 17:28:39
* @LastEditTime: 2022-06-29 17:22:32
* @Description: 所有工具类统一在这输出
*/
import * as util from './utils';
import * as requset from './requset';
import * as im from './im';
import * as wxpay from './wxpay';
import * as uploadFileOss from './uploadFileOss';
import * as alipay from './alipay';
export * from './utils';
export * from './requset';
export * from './im';
export * from './wxpay';
export * from './uploadFileOss';
export * from './alipay';
export default { ...util, ...requset, ...im, ...wxpay, ...uploadFileOss, ...alipay}

@ -0,0 +1,13 @@
/*
* @Author: ch
* @Date: 2022-05-06 15:33:55
* @LastEditors: ch
* @LastEditTime: 2022-07-13 10:38:34
* @Description: file content
*/
import { Wxpay } from './wxpay';
export const pay = ({orderId, openId, payType})=>{
if(payType === 'wxpay'){
Wxpay({orderId, openId});
}
}

@ -2,20 +2,21 @@
* @Author: ch
* @Date: 2022-03-17 17:42:32
* @LastEditors: ch
* @LastEditTime: 2022-05-17 18:15:04
* @LastEditTime: 2022-07-13 10:39:07
* @Description: 项目接口请求统一处理器返回一个需要token和不需要token的请求封装方法
*/
import MsbUniRequest from '@/common/plugins/msbUniRequest';
import $store from '@/common/store';
import { CreateUUID } from '@/common/utils';
const ENV = process.env;
const ENV = 'prod';
const BASE_URL = {
'test' : 'https://k8s-horse-gateway.mashibing.cn',
'dev' : '',
'release' : '',
'prod' : 'https://you-gateway.mashibing.com'
};
// 获取已有的UUID没则创建一个并保存到locaStorage中下次使用
let uuid = $store.state.uuid
if (!uuid) {
uuid = CreateUUID(16, 2);
$store.commit('SET_UUID', uuid);
}
/**
* 接口返回成功结果统一处理
* @param {*} response
@ -81,7 +82,7 @@ const clearRepeat = (option) =>{
// 不需要token的接口封装
const MsbRequest = new MsbUniRequest();
MsbRequest.baseUrl = BASE_URL[ENV];
MsbRequest.baseUrl = ENV.VUE_APP_BASE_URL;
MsbRequest.use('request', (option) => {
if(option.header.repeat){
@ -91,6 +92,7 @@ MsbRequest.use('request', (option) => {
return isRepeatVerify;
}
}
option.header.uid = uuid;
return option;
})
MsbRequest.use('success', successIntercept);
@ -100,28 +102,29 @@ MsbRequest.use('error', errorIntercept);
// 需要token的接口封装
const MsbRequestTk = new MsbUniRequest();
MsbRequestTk.baseUrl = BASE_URL[ENV];
MsbRequestTk.baseUrl = ENV.VUE_APP_BASE_URL;
MsbRequestTk.use('request', (option) => {
const token = $store.state.token;
if(!token){
option.header.uid = uuid;
if(!token && !option.header.notVerifyToken){
// 登录状态处理没有token直接跳转至登录
uni.redirectTo({
url: '/login'
});
return Promise.reject({message:'要先登录才能操作哦~'});
}else{
option.header = {...option.header, Authorization:token};
if(option.header.repeat){
// 如果当前请求不允许重复调用,则检查重复请求,当前接口有正在请求则不发起请求
const isRepeatVerify = repeatVerify(option);
if(isRepeatVerify){
return isRepeatVerify;
}
}
delete option.header.notVerifyToken
option.header = {...option.header, Authorization:token};
if(option.header.repeat){
// 如果当前请求不允许重复调用,则检查重复请求,当前接口有正在请求则不发起请求
const isRepeatVerify = repeatVerify(option);
if(isRepeatVerify){
return isRepeatVerify;
}
return option;
}
return option;
})
MsbRequestTk.use('success', successIntercept);
MsbRequestTk.use('error', errorIntercept);

@ -0,0 +1,46 @@
/*
* @Author: ch
* @Date: 2022-06-21 15:03:11
* @LastEditors: ch
* @LastEditTime: 2022-06-22 14:49:20
* @Description: file content
*/
import { ApiPostGetOssConfig } from '@/common/api/oss';
import {ToAsyncAwait} from '@/common/utils'
/**
*
* @param {*} file 文件
* @param {*} param1 获取OSS鉴权信息参数参考ApiPostGetOssConfig接口
* @returns {Promise}
*/
export const uploadFileOss = (file, {configId, serviceName}) =>{
return ToAsyncAwait(new Promise(async (resolve, reject) => {
const urlArr = file.url.split('/');
const fileName = file.name || urlArr[urlArr.length - 1];
const { error, result:oss } = await ApiPostGetOssConfig({ configId : `${configId}/`, serviceName });
if (error) {
reject(error);
return false
}
uni.uploadFile({
name : 'file',
filePath : file.url,
url : oss.host,
formData : {
name : fileName,
key : `${oss.dir}${'${filename}'}`,
policy : oss.policy,
OSSAccessKeyId : oss.accessId,
success_action_status : 200,
signature : oss.signature
},
success : async (res)=>{
resolve(`${oss.host}/${oss.dir}${fileName}`);
},
fail(e) {
reject(e);
}
})
}
))
}

@ -0,0 +1,99 @@
/*
* @Author: ch
* @Date: 2022-03-17 19:15:10
* @LastEditors: ch
* @LastEditTime: 2022-07-13 10:39:35
* @Description: 一些无法归类的公共方法容器
*/
import {
toAsyncAwait as ToAsyncAwait,
isPhone as IsPhone,
formatDate as FormatDate,
creatUuid as CreateUUID,
formatSearchJson as FormatSearchJson,
formatJsonSearch as FormatJsonSearch
} from "js-util-all";
import {AD_JUMP_TYPE} from '@/common/dicts/ad';
/**
* 首次运行时把定时器赋值给一个变量 第二次执行时
* 如果间隔没超过定时器设定的时间则会清除掉定时器
* 重新设定定时器 依次反复 当我们停止下来时
* 没有执行清除定时器 超过一定时间后触发回调函数
*/
const Debounce = (fn, delay) => {
let timer
return function () {
const that = this
const _args = arguments // 存一下传入的参数
if (timer) {
clearTimeout(timer)
}
timer = setTimeout(function () {
fn.apply(that, _args)
}, delay)
}
}
/**
* 广告跳转
* 兼容APP根据域名判断站内跳转还是站外跳转
* @param {*} link
*/
const AdJump = (item) => {
switch (item.jumpType) {
case AD_JUMP_TYPE.GOODS:
uni.navigateTo({
url: `/goodsDetail?id=${item.jumpUrl}`
});
break;
case AD_JUMP_TYPE.CATEGORY:
uni.navigateTo({
url: `/goodsList?categoryId=${item.jumpUrl}`
});
break;
case AD_JUMP_TYPE.LINK:
// #ifdef H5
window.location.href = item.jumpUrl;
// #endif
// #ifdef APP-PLUS
plus.runtime.openURL(item.jumpUrl);
// #endif
break;
default:
break
}
}
/**
* api接口错误处理
* @param {*} error 错误体
* @param {*} name 接口名 非必传如操作时错误提示不需要提示接口名时可不传
* @return Boolean true 存在错误并处理 false无错误
*/
const HandleApiError = (error, name) => {
let result = false
if (error) {
const tip = name ? `${name}错误:` : ``;
uni.$u.toast(`${tip}${error.message}`);
result = true;
}
return result;
}
// 工具类的文件需要把文件提供的工具类统一放最下方做一个统一输出
export {
// async await 标识结果处理
ToAsyncAwait,
// 判断是否为手机号
IsPhone,
// 时间格式化
FormatDate,
FormatSearchJson,
FormatJsonSearch,
CreateUUID,
// 防抖函数
Debounce,
// 广告跳转
AdJump,
HandleApiError
}

@ -2,11 +2,12 @@
* @Author: ch
* @Date: 2022-04-29 14:26:10
* @LastEditors: ch
* @LastEditTime: 2022-05-07 17:07:08
* @LastEditTime: 2022-07-13 10:40:10
* @Description: file content
*/
import { ApiPostWxH5Pay, ApiPostWxJsApiPay, ApiPostWxAppPay } from '@/common/api/wx';
import { ApiPostWxH5Pay, ApiPostWxJsApiPay, ApiPostWxAppPay } from '@/common/api/pay';
const ENV = process.env;
export const Wxpay = async ({orderId,openId})=>{
// #ifdef APP-PLUS
@ -15,7 +16,7 @@ export const Wxpay = async ({orderId,openId})=>{
uni.$u.toast(error.message);
return false;
}
const par = result.dataInfo;
const par = result.payDataInfo;
uni.requestPayment({
provider: 'wxpay',
orderInfo :{
@ -51,12 +52,12 @@ export const Wxpay = async ({orderId,openId})=>{
uni.$u.toast(error.message);
return false;
}
const par = result.dataInfo;
const par = result.payDataInfo;
WeixinJSBridge.invoke('getBrandWCPayRequest', {
appId : par.appId,
timeStamp : par.timeStamp,
nonceStr : par.nonceStr,
package : par.packageValue,
package: par.packageValue,
signType : par.signType,
paySign : par.paySign
}, res => {
@ -73,8 +74,8 @@ export const Wxpay = async ({orderId,openId})=>{
uni.$u.toast(error.message);
return false;
}
const redirect_url = decodeURIComponent(`https://you-app.mashibing.com/payResult?orderId=${orderId}&payType=wxh5`);
window.location.href = `${result.dataInfo.payUrl}&redirect_url=${redirect_url}`;
const redirect_url = decodeURIComponent(`${ENV.VUE_APP_STATIC_URL}/payResult?orderId=${orderId}&payType=wxh5`);
window.location.href = `${result.payDataInfo.h5Url}&redirect_url=${redirect_url}`;
}
// #endif

@ -2,7 +2,7 @@
* @Author: ch
* @Date: 2022-03-20 16:45:27
* @LastEditors: ch
* @LastEditTime: 2022-05-06 14:26:57
* @LastEditTime: 2022-06-22 19:34:13
* @Description: file content
-->
<template>
@ -38,10 +38,10 @@ export default {
...this.params
});
const res = result.records.map(item => {
// item.labelList[{text:'x',code : 'recommended'},{text:'x',code : 'second_kill'}]
//
item.seckill = false;
item.tagList = [];
item.labelList = item.labelList || [];
item.labelList.forEach(i => {
if(i.code === 'second_kill'){
item.seckill = true;

@ -0,0 +1,85 @@
<!--
* @Author: ch
* @Date: 2022-06-23 10:40:04
* @LastEditors: ch
* @LastEditTime: 2022-06-30 18:01:46
* @Description: file content
-->
<template>
<view class="follow">
<view class="follow--title">{{day}}追评:</view>
<view class="follow--ctx">{{followComment.commentContent}}</view>
<view class="follow--img" v-if="imgs.length">
<image class="follow--img-item" v-for="(item, idx) in imgs" :src="item" :key="idx" @click="preview(idx)" mode="aspectFit"/>
</view>
</view>
</template>
<script>
export default {
props : {
commentDetail : {
type : Object,
default : () => ({})
}
},
computed:{
followComment(){
return this.commentDetail.followComment || {}
},
day(){
const followTime = (new Date(this.followComment.createTime)).getTime();
const commentTime = (new Date(this.commentDetail.createTime)).getTime();
const day = Math.floor((followTime - commentTime) / (24 * 60 * 60 * 1000));
return day > 0 ? `${day}天后` : `当天`;
},
imgs (){
let urls = this.followComment.pictureUrl || '';
return urls ? urls.split(',') : [];
}
},
methods:{
preview(idx){
this.$store.commit('SET_COMMENT_PREVIEW', {
...this.commentDetail,
commentContent : this.followComment.commentContent,
pictureUrl : this.followComment.pictureUrl
});
this.$Router.push({
path : '/goodsCommentPreview',
query : {
idx
}
});
}
}
}
</script>
<style lang="scss" scoped>
.follow{
margin-top: 40rpx;
&--title{
color: $color-yellow3;
font-size: 28rpx;
}
&--ctx{
margin-top: 20rpx;
font-size: 30rpx;
line-height: 46rpx;
word-break: break-all;
}
&--img{
margin-top: 30rpx;
display: flex;
flex-wrap: wrap;
justify-content: flex-start;
&-item{
width: 210rpx;
height: 210rpx;
margin:20rpx 0;
}
}
}
</style>

@ -0,0 +1,66 @@
<!--
* @Author: ch
* @Date: 2022-06-20 14:30:45
* @LastEditors: ch
* @LastEditTime: 2022-06-28 21:14:46
* @Description: file content
-->
<template>
<view class="goods" @click="$Router.push(`/goodsDetail?id=${goods.productId}`)">
<image class="goods--img" :src="goods.productPicture" mode="aspectFit" ></image>
<view class="goods--ctx">
<view class="goods--title">{{ goods.productName }}</view>
<view class="goods--footer">
<view class="goods--sku">{{ goods.skuName }}</view>
<view><slot name="btns"></slot></view>
</view>
</view>
</view>
</template>
<script>
export default {
props : {
goods : {
type : Object,
default : ()=>({})
}
}
}
</script>
<style lang="scss" scoped>
.goods {
display: flex;
&--img {
width: 130rpx;
height: 130rpx;
margin-right: 30rpx;
}
&--ctx{
flex: 1;
overflow: hidden;
padding: 20rpx 0;
}
&--title{
font-size: 28rpx;
overflow:hidden;
text-overflow:ellipsis;
white-space: nowrap;
padding-right: 30rpx;
}
&--footer{
display: flex;
justify-content: space-between;
padding-right: 30rpx;
}
&--sku{
font-size: 24rpx;
color: #999;
margin-top: 20rpx;
}
}
</style>

@ -0,0 +1,93 @@
<!--
* @Author: ch
* @Date: 2022-06-21 15:50:01
* @LastEditors: ch
* @LastEditTime: 2022-06-30 18:00:16
* @Description: file content
-->
<template>
<view>
<view class="top">
<u-rate count="5" size="30rpx" :value="commentDetail.commentScore" activeColor="#FFA35B" readonly inactiveColor="#DDD"></u-rate>
<text class="top--time">{{ FormatDate(commentDetail.createTime, 'yyyy-mm-dd hh:ii') }}</text>
</view>
<view class="ctx">{{ commentDetail.commentContent }}</view>
<view class="img" v-if="imgs.length">
<image class="img--item" mode="aspectFit"
v-for="(item, idx) in imgs" :src="item" :key="idx" @click="preview(idx)"/>
</view>
</view>
</template>
<script>
import {FormatDate} from '@/common/utils';
export default {
props : {
commentDetail : {
type : Object,
default : () => ({})
},
imgPreview : {
type: Boolean,
default : true,
require : true
}
},
data(){
return {
curPreview : -1
}
},
computed : {
imgs (){
let urls = this.commentDetail.pictureUrl || '';
return urls ? urls.split(',') : [];
}
},
methods:{
FormatDate,
preview(idx){
if(!this.imgPreview){
return false
}
this.$store.commit('SET_COMMENT_PREVIEW', this.commentDetail);
this.$Router.push({
path : '/goodsCommentPreview',
query : {
idx
}
});
}
}
}
</script>
<style lang="scss" scoped>
.top{
display: flex;
justify-content: space-between;
margin: 20rpx 0;
&--time{
font-size: 24rpx;
color: #999;
}
}
.ctx{
font-size: 30rpx;
line-height: 46rpx;
word-break: break-all;
}
.img{
margin-top: 30rpx;
display: flex;
flex-wrap: wrap;
justify-content: flex-start;
&--item{
width: 210rpx;
height: 210rpx;
margin:20rpx 0;
}
}
</style>

@ -0,0 +1,56 @@
<!--
* @Author: ch
* @Date: 2022-06-21 15:59:23
* @LastEditors: ch
* @LastEditTime: 2022-06-30 17:57:25
* @Description: file content
-->
<template>
<view class="merchant">
<view class="merchant--title">
<text class="merchant--name">{{merchantComment.userName}}</text>
<text class="merchant--time">{{ FormatDate(merchantComment.createTime, 'yyyy-mm-dd hh:ii') }}
</text>
</view>
<view class="merchant--ctx">{{merchantComment.commentContent}}</view>
</view>
</template>
<script>
import {FormatDate} from '@/common/utils';
export default {
props : {
merchantComment : {
type : Object,
default : () => ({})
}
},
data(){
return {
}
},
methods : {
FormatDate
}
}
</script>
<style lang="scss" scoped>
.merchant{
margin-top: 40rpx;
padding: 30rpx;
background: #F5F5F5;
&--title{
display: flex;
justify-content: space-between;
margin-bottom: 24rpx;
}
&--time{
color: #999;
font-size: 24rpx;
}
&--ctx,&--name{
font-size: 26rpx;
color: #666;
}
}
</style>

@ -0,0 +1,138 @@
<!--
* @Author: ch
* @Date: 2022-06-20 16:36:14
* @LastEditors: ch
* @LastEditTime: 2022-06-30 21:06:31
* @Description: file content
-->
<template>
<view>
<view class="rate" v-if="type === COMMENT.TYPE.COMMENT">
<text class="rate--title">满意度评分</text>
<u-rate :count="5" v-model="rate" size="47rpx" activeColor="#FFA35B" inactiveColor="#DDD"></u-rate>
<text class="rate--desc">{{rateDesc}}</text>
</view>
<textarea class="textarea" placeholder="从多个维度评价,可以帮助更多想买的人哦~"
:maxlength="500" v-model="commentContent"></textarea>
<u-upload class="upload"
@afterRead="handleUpdateImg" @delete="handleDelImg"
:fileList="fileList" :maxCount="6" :previewFullImage="true">
</u-upload>
<view class="footer">
<UiButton type="solid" :disable="isVerify" @click="handleSubmit">
{{type === COMMENT.TYPE.COMMENT ? '发表评价' : '发表追评'}}
</UiButton>
</view>
</view>
</template>
<script>
import UiButton from '@/components/UiButton.vue';
import {ApiPostComment} from '@/common/api/comment';
import COMMENT from '@/common/dicts/comment';
import {uploadFileOss, HandleApiError} from '@/common/utils';
export default {
components: { UiButton },
props:{
type : {
type : String | Number,
default : COMMENT.TYPE.COMMENT
},
commentDetail : {
type : Object,
default : ()=> ({})
}
},
data(){
return {
COMMENT,
rate : 5,
commentContent : '',
fileList : []
}
},
computed:{
isVerify(){
if(this.type === COMMENT.TYPE.COMMENT){
return !this.rate || !this.commentContent.trim();
}else{
return !this.commentContent.trim();
}
},
isEdit (){
return ( this.commentContent || this.fileList.length > 0) ? true : false
},
rateDesc(){
return COMMENT.RATE_LABEL[this.rate-1];
}
},
watch:{
isEdit(){
this.$emit('editChang',this.isEdit)
}
},
methods:{
async handleSubmit(){
let data = {
commentContent : this.commentContent,
commentType : this.type,
orderProductId : this.commentDetail.orderProductId,
pictureUrl : this.fileList.map(i => i.url).join(',')
}
if(this.type === COMMENT.TYPE.COMMENT){
data.productId = this.commentDetail.productId;
data.commentScore = this.rate;
}else if(this.type === COMMENT.TYPE.FOLLOW_COMMENT){
data.originId = data.parentId = this.commentDetail.id;
}
const {error, result} = await ApiPostComment(data);
if(!HandleApiError(error)){
this.commentContent = '';
this.fileList = [];
this.$nextTick(()=>{
this.$emit('submit',result);
})
}
},
async handleUpdateImg(val){
const {error, result} = await uploadFileOss(val.file, {
configId : 'account-comment',
serviceName : 'comment'
})
if(error){
uni.$u.toast(error);
}
this.fileList.push({url : result});
},
handleDelImg(target){
this.fileList.splice(target.index, 1)
}
}
}
</script>
<style lang="scss" scoped>
.rate{
display: flex;
margin: 50rpx 0;
align-items: center;
&--title{
font-size: 28rpx;
margin-right: 30rpx;
}
&--desc{
font-size: 30rpx;
color: #999;
margin-left: 40rpx;
}
}
.textarea{
height: 200rpx;
margin-bottom: 40rpx;
}
.footer{
width: 100%;
text-align: right;
margin-top: 50rpx;
}
</style>

@ -0,0 +1,96 @@
<!--
* @Author: ch
* @Date: 2022-06-21 16:01:19
* @LastEditors: ch
* @LastEditTime: 2022-07-01 17:55:01
* @Description: file content
-->
<template>
<view class="thumb">
<view class="thumb--item" @click="handleUseful">
<u-icon name="thumb-up-fill" v-if="isLike"></u-icon>
<u-icon name="thumb-up" v-else></u-icon>
<text>{{usefulCount}}</text>
</view>
<view class="thumb--item" @click="$Router.push(`/goodsCommentDetail?id=${commentDetail.id}`)">
<u-icon name="chat"></u-icon>
<text>{{commentDetail.replyCount}}</text>
</view>
</view>
</template>
<script>
import {Debounce, HandleApiError} from '@/common/utils';
import {ApiPutCommentUseful} from '@/common/api/comment'
export default {
props : {
commentDetail : {
type : Object,
default : ()=>({})
}
},
data(){
return {
debounce : null,
isLike : false,
usefulCount : 0
}
},
watch :{
commentDetail :{
handler(){
this.isLike = this.commentDetail.isLike;
this.usefulCount = this.commentDetail.usefulCount;
},
deep:true
}
},
mounted(){
this.isLike = this.commentDetail.isLike;
// console.log('---',this.isLike,this.commentDetail.usefulCount);
this.usefulCount = this.commentDetail.usefulCount;
},
methods:{
handleUseful(){
this.isLike = !this.isLike
if(this.isLike){
this.usefulCount++;
}else{
this.usefulCount--;
}
if(!this.debounce){
this.debounce = Debounce(this.updateUseFul, 500);
}
this.debounce();
},
async updateUseFul(){
if(this.isLike === this.commentDetail.isLike){
return false
}
const {error, result} = await ApiPutCommentUseful({
commentId : this.commentDetail.id,
isLike : this.isLike
});
HandleApiError(error);
}
}
}
</script>
<style lang="scss" scoped>
.thumb{
display: flex;
justify-content: flex-end;
margin-top: 40rpx;
&--item{
display: flex;
align-items: center;
margin-left: 50rpx;
text{
font-size: 24rpx;
margin-left: 10rpx;
}
}
}
</style>

@ -0,0 +1,47 @@
<!--
* @Author: ch
* @Date: 2022-06-21 22:27:52
* @LastEditors: ch
* @LastEditTime: 2022-07-01 17:14:36
* @Description: file content
-->
<template>
<view class="comment-user">
<image class="comment-user--avatr" :src="userData.userAvatar" shape="circle"/>
<view>
<view class="comment-user--name">{{userData.userName}}</view>
<text class="comment-user--sku" v-if="userData.skuName">{{userData.skuName}}</text>
</view>
</view>
</template>
<script>
export default {
props : {
userData : {
type : Object,
default : ()=> ({})
}
}
}
</script>
<style lang="scss" scoped>
.comment-user{
display: flex;
justify-content: flex-start;
&--avatr{
width: 71rpx;
height: 71rpx;
margin-right: 17rpx;
}
&--name{
margin-top: 5rpx;
}
&--sku{
margin-top: 10rpx;
font-size: 24rpx;
color: #999;
}
}
</style>

@ -2,7 +2,7 @@
* @Author: ch
* @Date: 2022-04-19 11:37:50
* @LastEditors: ch
* @LastEditTime: 2022-05-05 11:08:44
* @LastEditTime: 2022-06-29 17:27:12
* @Description: file content
-->
<template>
@ -12,7 +12,7 @@
<script>
import UiRadioPicker from './UiRadioPicker.vue'
import { ApiPostWxPay } from '@/common/api/order';
import { Wxpay } from '@/common/utils';
import { Wxpay, Alipay } from '@/common/utils';
export default {
components: { UiRadioPicker },
props : {
@ -32,13 +32,19 @@ export default {
label : '微信支付',
value : 'wxpay'
},
// {
// label : '',
// value : 'alipay'
// }
]
}
},
mounted(){
// APP
if(!this.$store.state.openId){
this.options.push({
label : '支付宝支付',
value : 'alipay'
})
}
},
methods:{
confirm(val){
const orderId = this.order.orderId;
@ -46,7 +52,8 @@ export default {
Wxpay({orderId, openId: this.$store.state.openId});
this.close();
}else{
uni.$u.toast('暂不支持支付宝支付');
// uni.$u.toast('');
Alipay({orderId})
}
},
close(){

@ -2,7 +2,7 @@
* @Author: ch
* @Date: 2022-03-29 16:05:06
* @LastEditors: ch
* @LastEditTime: 2022-04-30 15:33:47
* @LastEditTime: 2022-05-21 20:04:47
* @Description: file content
-->
<template>
@ -14,6 +14,7 @@
</UiCell>
<u-picker
:show="show"
ref="picker"
keyName="name"
:columns="columnsData"
:defaultIndex="defaultIndex"
@ -25,7 +26,7 @@
</template>
<script>
import UiCell from "./UiCell";
import Province from '@/common/dicts/area';
import Province from '@/common/dicts/area.json';
const DefaultCityColumn = Province[0].children;
const DefaultAreaColumn = DefaultCityColumn[0].children;
export default {
@ -82,10 +83,22 @@ export default {
this.columnsData = [Province, DefaultCityColumn, DefaultAreaColumn];
}
},
changeCity(val, b, c) {
changeCity(val) {
if(val.columnIndex == 2){
return;
}
let newIndexs = val.indexs;
if(val.columnIndex == 0){
newIndexs[1] = 0;
}
newIndexs[2] = 0;
this.defaultIndex = newIndexs;
const city = val.value[0].children;
const area = val.value[1].children;
this.columnsData = [Province, city, area]
const area = city[newIndexs[1]].children;
this.$refs.picker.setColumnValues(1, city);
this.$refs.picker.setColumnValues(2, area);
},
confirm(value) {
this.show = false;

@ -2,7 +2,7 @@
* @Author: ch
* @Date: 2022-04-07 17:22:44
* @LastEditors: ch
* @LastEditTime: 2022-05-07 19:46:04
* @LastEditTime: 2022-05-24 09:57:03
* @Description: file content
-->
@ -175,7 +175,7 @@ export default {
}
}
}
/deep/ {
::v-deep {
.goods-item--pirce{
text{
font-size: $font-size-lg;

@ -2,7 +2,7 @@
* @Author: ch
* @Date: 2022-03-31 14:49:33
* @LastEditors: ch
* @LastEditTime: 2022-04-22 18:24:57
* @LastEditTime: 2022-05-24 09:57:04
* @Description: file content
-->
<template>
@ -88,7 +88,7 @@ export default {
}
}
}
/deep/{
::v-deep{
.ui-money{
text{
font-size: $font-size-base;

@ -2,7 +2,7 @@
* @Author: ch
* @Date: 2022-04-22 16:48:11
* @LastEditors: ch
* @LastEditTime: 2022-04-22 20:52:22
* @LastEditTime: 2022-05-24 09:57:05
* @Description: file content
-->
<template>
@ -81,7 +81,7 @@ export default {
margin-left: 60rpx;
}
}
/deep/{
::v-deep{
.ui-money{
text{
font-size: $font-size-base;

@ -2,11 +2,11 @@
* @Author: ch
* @Date: 2022-03-31 15:42:55
* @LastEditors: ch
* @LastEditTime: 2022-04-19 13:57:30
* @LastEditTime: 2022-06-22 14:12:46
* @Description: file content
-->
<template>
<view class="ui-white-box">
<view class="ui-white-box" @click="$emit('click')">
<slot></slot>
</view>
</template>
@ -14,6 +14,6 @@
.ui-white-box{
margin: 20rpx 30rpx;
background: $color-grey0;
border-radius: 20rpx;
border-radius: 8rpx;
}
</style>

@ -2,7 +2,7 @@
* @Author: ch
* @Date: 2021-07-26 23:22:16
* @LastEditors: ch
* @LastEditTime: 2022-05-16 09:46:02
* @LastEditTime: 2022-06-20 17:38:48
* @Description: file content
*/
import Vue from 'vue';
@ -11,34 +11,39 @@ import App from './App';
import {router,RouterMount} from '@/common/router/index.js';
import uView from 'uview-ui';
import store from '@/common/store';
import Confirm from '@/components/mount/index';
import route from 'uview-ui/libs/util/route';
import {toSearchJson} from '@/common/utils';
import {FormatSearchJson} from '@/common/utils';
import {ApiGetOpenId, ApiGetAuthUrl} from '@/common/api/wx';
import {MsbWebSkt, MsbWebSktInit, createUUID} from '@/common/utils';
import {ApiGetCurrentUser} from '@/common/api/account';
import {Im, ImInit} from '@/common/utils';
import { ApiSktSysGetSession, ApiSktSysHeart } from './common/api/im';
if(store.state.token){
// 进入应用则向IM发起心跳包 以及获取IM会话数据
MsbWebSktInit().then(()=>{
MsbWebSkt.send({
data : JSON.stringify({
traceId : createUUID(),
traceType : "1",
content: { sysId : "1"}
})
});
const socketInit = () => {
if (!store.state.userInfo.id) {
setTimeout(() => {
socketInit();
},10000)
return false;
}
// 初始化IM
ImInit().then(() => {
// 获取到会话列表
Im.getSessionList();
});
}
setInterval(()=>{
MsbWebSkt.send({
data : JSON.stringify({
traceId : createUUID(),
traceType : "0",
content: { text : "ping"}
})
})
}, 5000);
})
const getUserInfo = async () => {
const { error, result } = await ApiGetCurrentUser();
if (error) {
uni.$u.toast(error.message);
return false;
}
store.commit('SET_USER_INFO', result);
};
if (store.state.token) {
socketInit();
getUserInfo();
}
@ -47,7 +52,7 @@ if(store.state.token){
const ua = navigator ? navigator.userAgent.toLowerCase() : '';
if(ua.includes('micromessenger')) {
if(!store.state.openId){
let query = toSearchJson(window.location.search)
let query = FormatSearchJson(window.location.search)
if(query.code){
ApiGetOpenId({
code : query.code
@ -76,7 +81,6 @@ if(ua.includes('micromessenger')) {
Vue.use(router);
Vue.use(uView);
Vue.use(Confirm);
Vue.prototype.$store = store;
Vue.config.productionTip = false;

@ -1,8 +1,8 @@
{
"name" : "马士兵严选",
"appid" : "__UNI__3FB31B6",
"appid" : "__UNI__5FEB250",
"description" : "",
"versionName" : "1.0.0",
"versionName" : "1.0.1",
"versionCode" : "100",
"transformPx" : false,
/* 5+App */
@ -40,10 +40,14 @@
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
]
],
"abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ],
"minSdkVersion" : 21
},
/* ios */
"ios" : {},
"ios" : {
"dSYMs" : false
},
/* SDK */
"sdkConfigs" : {
"ad" : {},
@ -52,39 +56,18 @@
"__platform__" : [ "android" ],
"appid" : "wx17b34a4a90ef18f7",
"UniversalLinks" : ""
},
"alipay" : {
"__platform__" : [ "android" ]
}
}
},
"icons" : {
"android" : {
"hdpi" : "unpackage/res/icons/72x72.png",
"xhdpi" : "unpackage/res/icons/96x96.png",
"xxhdpi" : "unpackage/res/icons/144x144.png",
"xxxhdpi" : "unpackage/res/icons/192x192.png"
},
"ios" : {
"appstore" : "unpackage/res/icons/1024x1024.png",
"ipad" : {
"app" : "unpackage/res/icons/76x76.png",
"app@2x" : "unpackage/res/icons/152x152.png",
"notification" : "unpackage/res/icons/20x20.png",
"notification@2x" : "unpackage/res/icons/40x40.png",
"proapp@2x" : "unpackage/res/icons/167x167.png",
"settings" : "unpackage/res/icons/29x29.png",
"settings@2x" : "unpackage/res/icons/58x58.png",
"spotlight" : "unpackage/res/icons/40x40.png",
"spotlight@2x" : "unpackage/res/icons/80x80.png"
},
"iphone" : {
"app@2x" : "unpackage/res/icons/120x120.png",
"app@3x" : "unpackage/res/icons/180x180.png",
"notification@2x" : "unpackage/res/icons/40x40.png",
"notification@3x" : "unpackage/res/icons/60x60.png",
"settings@2x" : "unpackage/res/icons/58x58.png",
"settings@3x" : "unpackage/res/icons/87x87.png",
"spotlight@2x" : "unpackage/res/icons/80x80.png",
"spotlight@3x" : "unpackage/res/icons/120x120.png"
}
"hdpi" : "src/static/app-icon/72.png",
"xhdpi" : "src/static/app-icon/96.png",
"xxhdpi" : "src/static/app-icon/144.png",
"xxxhdpi" : "src/static/app-icon/192.png"
}
}
}
@ -118,19 +101,11 @@
"base" : ""
},
"devServer" : {
"proxy" : {
"/uc/" : {
"target" : "https://k8s-horse-gateway.mashibing.cn"
},
"/mall/" : {
"target" : "https://k8s-horse-gateway.mashibing.cn"
},
"/pay/" : {
"target" : "https://k8s-horse-gateway.mashibing.cn"
},
"/oss/" : {
"target" : "https://k8s-horse-gateway.mashibing.cn"
}
"port" : 8080
},
"optimization" : {
"treeShaking" : {
"enable" : true
}
}
}

@ -10,6 +10,13 @@
"backgroundColor" : "#69ADE5"
}
},
{
"path": "pages/webView",
"aliasPath" : "/webView",
"style": {
"navigationBarTitleText": "收银台"
}
},
{
"path": "pages/login",
"aliasPath" : "/login",
@ -58,6 +65,42 @@
"navigationBarTitleText": "马士兵严选"
}
},
{
"path": "pages/goods/enable",
"aliasPath" : "/enable",
"style": {
"navigationBarTitleText": "商品详情"
}
},
{
"path": "pages/goods/comment/list",
"aliasPath" : "/goodsCommentList",
"style": {
"navigationBarTitleText": "全部评价"
}
},
{
"path": "pages/goods/comment/otherList",
"aliasPath" : "/goodsCommentOtherList",
"style": {
"navigationBarTitleText": "全部评价"
}
},
{
"path": "pages/goods/comment/preview",
"aliasPath" : "/goodsCommentPreview",
"style": {
"navigationStyle" : "custom",
"navigationBarTitleText": "马士兵严选"
}
},
{
"path": "pages/goods/comment/detail",
"aliasPath" : "/goodsCommentDetail",
"style": {
"navigationBarTitleText": "全部评价"
}
},
{
"path": "pages/account/index",
"aliasPath" : "/account",
@ -177,6 +220,20 @@
"navigationBarTitleText": "支付中"
}
},
{
"path": "pages/order/comment/index/index",
"aliasPath" : "/comment",
"style": {
"navigationBarTitleText": "发表评价"
}
},
{
"path": "pages/order/comment/success",
"aliasPath" : "/commentSuccess",
"style": {
"navigationBarTitleText": "评价成功"
}
},
{
"path": "pages/order/saleAfter/saleAfterList",
"aliasPath" : "/saleAfterList",
@ -283,5 +340,15 @@
"custom": {
"^u-(.*)": "uview-ui/components/u-$1/u-$1.vue"
}
},
"condition" : { //
"current": 0, //(list )
"list": [
{
"name": "", //
"path": "", //
"query": "" //onLoad
}
]
}
}

@ -2,7 +2,7 @@
* @Author: ch
* @Date: 2022-03-22 14:12:18
* @LastEditors: ch
* @LastEditTime: 2022-04-29 23:09:52
* @LastEditTime: 2022-05-24 09:57:08
* @Description: file content
-->
<template>
@ -126,7 +126,7 @@ page {
left: 30rpx;
width: 670rpx;
}
/deep/ {
::v-deep {
.form--city .ui-cell{
padding: 0 40rpx;
}

@ -2,7 +2,7 @@
* @Author: ch
* @Date: 2022-03-22 14:12:18
* @LastEditors: ch
* @LastEditTime: 2022-05-07 19:07:02
* @LastEditTime: 2022-05-24 09:57:10
* @Description: file content
-->
<template>
@ -160,7 +160,7 @@ page {
left: 30rpx;
width: 670rpx;
}
/deep/ {
::v-deep {
.del-address .ui-cell--title{
color: $color-yellow3;
}

@ -3,13 +3,13 @@
components: { UiCell },: ch
* @Date: 2019-08-22 19:41:20
* @LastEditors: ch
* @LastEditTime: 2022-05-17 18:00:28
* @LastEditTime: 2022-06-28 16:38:33
* @Description: file content
-->
<template>
<view>
<view class="header">
<u-badge class="header--badge" max="99" :value="$store.state.sessionMsgCount"
<u-badge class="header--badge" max="99" :value="$store.state.imMsgCount"
@click="$Router.push('/messageGroup')"></u-badge>
<image class="header--msg" @click="$Router.push('/messageGroup')" src="@/static/account/xx.png" />
</view>
@ -38,6 +38,11 @@
<image class="item-icon" src="@/static/account/sh.png"/>
<view>待收货</view>
</view>
<view class="order-tabs--item" @click="$Router.push('/orderList?tab=5')">
<u-badge class="item-badge" max="99" :value="statistic.waitComment"></u-badge>
<image class="item-icon" src="@/static/account/pj.png"/>
<view>待评价</view>
</view>
</view>
</view>
<view class="cell">
@ -95,7 +100,8 @@ export default {
this.statistic = result;
},
service(){
uni.$u.toast('客服休息中');
// uni.$u.toast('');
this.$Router.push('/messageChat');
}
}
@ -134,6 +140,10 @@ page {
top: 10rpx;
z-index: 99;
border: 1px solid #fff;
/* #ifndef H5 */
top: 90rpx;
/* #endif */
}
&--cell{
border: 0;
@ -208,7 +218,7 @@ page {
border: 0;
}
}
/deep/{
::v-deep{
.header--cell .ui-cell--title{
font-weight: bold;
font-size: $font-size-lg;

@ -2,13 +2,16 @@
* @Author: ch
* @Date: 2022-03-26 14:32:03
* @LastEditors: ch
* @LastEditTime: 2022-05-17 16:22:51
* @LastEditTime: 2022-06-14 20:48:40
* @Description: file content
-->
<template>
<view class="main">
<template v-for="item in msgData">
<view class="send" :key="item.id" v-if="item.fromId == $store.state.userInfo.id">
<text class="send--status" v-if="item.sendStatus === 'loading'"></text>
<text class="send--status send--status__fail" v-if="item.sendStatus === 'fail'" @click="resend(item)"></text>
<template v-if="item.type == MSG_TYPE.CUSTOM">
<GoodsInfo class="send--box" position="msg" v-if="item.payload.id" :goodsInfo="item.payload"/>
<OrderInfo class="send--box" position="msg" v-if="item.payload.orderId" :orderInfo="item.payload"/>
@ -19,13 +22,16 @@
<view class="send--box" v-if="item.type == MSG_TYPE.VIDEO">
<video class="send--box__video" :src="item.payload.url"></video>
</view>
<image class="avatar" :src="item.fromAvatar || '@/static/message/xt.png'" mode="widthFix"/>
<image class="avatar" :src="$store.state.userInfo.avatar || require('@/static/message/xt.png')" mode="widthFix"/>
</view>
<view class="tips" :key="item.id" v-else-if="item.type == MSG_TYPE.TIP">
<view class="tips--box">{{item.payload.text}}</view>
</view>
<view class="tips" :key="item.id" v-else-if="item.type === MSG_TYPE.CUSTOM && item.payload.customType == 'transferWaiterSession'">
<view class="tips--box">现在由客服{{item.payload.toNickname}}为您服务</view>
</view>
<view class="receive" :key="item.id" v-else>
<image class="avatar" :src="item.fromAvatar || '@/static/message/xt.png'" mode="widthFix"/>
<image class="avatar" :src="item.fromAvatar || require('@/static/message/xt.png')" mode="widthFix"/>
<view>
<view class="receive--name">{{item.fromNickname}}</view>
<template v-if="item.type == MSG_TYPE.CUSTOM">
@ -42,18 +48,18 @@
</view>
</view>
</template>
<Footer :goodsInfo="goodsInfo" :orderInfo="orderInfo"></Footer>
<Footer :goodsInfo="goodsInfo" :orderInfo="orderInfo" :sessionId="sessionId"></Footer>
</view>
</template>
<script>
import {MSG_TYPE} from '@/common/dicts/im';
import {MsbWebSkt, createUUID} from '@/common/utils';
import {Im, ToAsyncAwait} from '@/common/utils';
import {ApiGetOrderDetail} from '@/common/api/order';
import {ApiGetGoodsDetail} from '@/common/api/goods';
import UiButton from '@/components/UiButton.vue';
import Footer from './components/Footer.vue';
import GoodsInfo from './components/GoodsInfo.vue';
import OrderInfo from './components/OrderInfo.vue';
import Footer from './modules/Footer.vue';
import GoodsInfo from './modules/GoodsInfo.vue';
import OrderInfo from './modules/OrderInfo.vue';
export default {
components: { UiButton, Footer, GoodsInfo, OrderInfo },
data(){
@ -68,14 +74,19 @@ export default {
},
computed:{
curSessionData(){
return this.$store.state.sessionData.find(i =>i.id == this.$store.state.sessionMsgId) || {}
const data = this.$store.state.imData.find(i => i.id == this.sessionId) || {};
if(data.id){
Im.setCurSessionId(data.id);
}
return data;
},
msgData (){
return this.curSessionData ? this.curSessionData.messageList : [];
}
},
destroyed(){
Im.setCurSessionId(null);
},
watch:{
msgData(){
this.$nextTick(()=>{
@ -99,104 +110,105 @@ export default {
this.$Router.push('/login');
return false;
}
this.goodsId = this.$Route.query.goodsId;
this.orderId = this.$Route.query.orderId;
this.sessionId = this.$Route.query.sessionId;
this.socketInit();
if(this.goodsId){
this.createSessionMain();
this.getGoodsInfo();
}else if(this.orderId){
this.createSessionMain();
}
if(this.orderId){
this.getOrderInfo();
}else if(this.sessionId){
this.$store.commit('SET_SESSION_MSG_ID',this.sessionId);
this.getHistoryMsg();
this.readMsg();
this.heartMsg();
}else{
this.createSessionMain();
}
this.$nextTick(()=>{
uni.pageScrollTo({
scrollTop : 99999,
duration : 0
});
})
},
methods:{
/**
* 创建会话主体
* 如果是从商品或订单进来需要创建会话
*/
createSessionMain(){
MsbWebSkt.send({
data : JSON.stringify({
traceId : createUUID(),
traceType : '21',
content : {
storeId : 1
}
}),
success:()=>{
//
setTimeout(()=>{
this.getHistoryMsg();
this.readMsg();
this.heartMsg();
},1000)
socketInit(){
if(!Im.isOpen){
setTimeout(()=>{
this.socketInit();
}, 100)
return false;
}
if(this.sessionId){
if(!this.msgData?.length){
this.getHistoryMsg();
}
});
this.readMsg();
}else{
this.createSessionMain();
}
},
/**
* 发送心跳
* 创建会话主体
* 如果是从商品或订单进来需要创建会话
*/
heartMsg(){
MsbWebSkt.send({
data : JSON.stringify({
traceId : createUUID(),
traceType : '22',
content : {
storeId : 1
}
}),
complete: () =>{
setTimeout(()=>{
this.heartMsg();
},5000)
async createSessionMain(){
if(!Im.isOpen){
setTimeout(()=>this.createSessionMain(),1000);
return false;
}
const {error, result} = await ToAsyncAwait(Im.createSession({
content : {
sessionType : 3
}
})
}));
if(error){
uni.$u.toast(error.message);
return false;
}
this.sessionId = result.content.id;
Im.setCurSessionId(this.sessionId);
this.getHistoryMsg();
// this.readMsg();
},
/**
* 获取历史消息
*/
getHistoryMsg(){
async getHistoryMsg(){
if(!this.curSessionData.id){
setTimeout(()=>{
this.getHistoryMsg();
}, 500)
return false;
}
this.loading = true;
const lastMsg = this.msgData?.length ? this.msgData[0] : {};
MsbWebSkt.send({
data : JSON.stringify({
traceId : createUUID(),
traceType : "23",
content: {
sessionId : this.$store.state.sessionMsgId,
topMessageId : lastMsg.id || null
}
})
})
const {error, result} = await ToAsyncAwait(Im.getHistoryMsg());
if(error){
uni.$u.toast(error.errMsg || error.message);
return false
}
this.loading = false;
},
/**
* 已读消息
* 把当前会话消息置为已读
*/
readMsg(){
MsbWebSkt.send({
data : JSON.stringify({
traceId : createUUID(),
traceType : "6",
content: {
sessionId : this.$store.state.sessionMsgId
}
})
});
//
const count = this.$store.state.sessionMsgCount - this.curSessionData.unreadCount;
//
this.curSessionData.unreadCount = 0;
this.$store.commit('SET_SESSION_MSG_COUNT', count)
async readMsg(){
const {error, result} = await ToAsyncAwait(Im.setRead({
content: {
sessionId : this.sessionId
}
}));
if(error){
uni.$u.toast(error.errMsg || error.message);
console.log(error);
return false
}
},
resend(item){
Im.resend(item)
},
/**
* 从订单页进来查询订单信息
@ -265,6 +277,7 @@ page{
color: #333;
font-size: 32rpx;
line-height: 40rpx;
word-break: break-all;
}
&__img{
height: 140rpx;
@ -275,8 +288,19 @@ page{
display: flex;
justify-content: flex-end;
margin-top:30rpx ;
&--status{
font-size: $font-size-sm;
color: $color-grey3;
display: flex;
align-items: center;
line-height: 46rpx;
margin-right: 10rpx;
&__fail{
color: $color-yellow4;
}
}
&--box{
max-width: 552rpx;
max-width: 480rpx;
margin-right:30rpx;
&__txt{
padding: 20rpx 30rpx;
@ -285,6 +309,7 @@ page{
color: #fff;
font-size: 32rpx;
line-height: 46rpx;
word-break: break-all;
}
&__img{
height: 140rpx;

@ -2,7 +2,7 @@
* @Author: ch
* @Date: 2022-05-11 11:45:08
* @LastEditors: ch
* @LastEditTime: 2022-05-16 20:06:16
* @LastEditTime: 2022-06-14 12:55:27
* @Description: file content
-->
<template>
@ -12,9 +12,9 @@
<view class="operation">
<textarea class="operation--input" :focus="focus" v-model="msgCtx" @focus="moreShow = false" @click="emojiShow = false"/>
<view class="operation--btns">
<image class="operation--emoji" src="@/static/imxx/emoji.png" @click="emojiShow = !emojiShow"/>
<image class="operation--emoji" src="@/static/im/emoji.png" @click="emojiShow = !emojiShow"/>
<view class="operation--send" v-if="msgCtx.length" @click="send(msgCtx, MSG_TYPE.TXT)"></view>
<image class="operation--more" v-else src="@/static/imxx/more.png" @click="moreShow = true" />
<image class="operation--more" v-else src="@/static/im/more.png" @click="moreShow = true" />
</view>
</view>
<view class="emoji" v-if="emojiShow">
@ -30,14 +30,14 @@
<view class="other" v-if="moreShow">
<u-upload @afterRead="uploadImg" >
<view class="other--btn">
<image class="other--img" src="@/static/imxx/img.png"/>
<image class="other--img" src="@/static/im/img.png"/>
<view>图片</view>
</view>
</u-upload>
<u-upload @afterRead="uploadVideo" compressed accept="video">
<view class="other--btn">
<image class="other--img" src="@/static/imxx/video.png"/>
<image class="other--img" src="@/static/im/video.png"/>
<view>视频</view>
</view>
</u-upload>
@ -45,7 +45,7 @@
</view>
</template>
<script>
import {MsbWebSkt, createUUID} from '@/common/utils';
import {Im, ToAsyncAwait} from '@/common/utils';
import {MSG_TYPE} from '@/common/dicts/im';
import {Request} from '@/common/utils';
import {ApiPutUser} from '@/common/api/account';
@ -64,6 +64,10 @@ export default {
goodsInfo : {
type : Object,
default : () => ({})
},
sessionId : {
type : Number | String,
default : ''
}
},
data(){
@ -115,7 +119,7 @@ export default {
/**
* 统一发送函数
*/
send(val, type){
async send(val, type){
let payload = {};
switch(type){
case MSG_TYPE.CUSTOM :
@ -130,19 +134,20 @@ export default {
break;
}
MsbWebSkt.send({
data : JSON.stringify({
traceId : createUUID(),
traceType : '20',
content: {
toSessionId : this.$store.state.sessionMsgId,
payload : payload,
toId : 1,
type : type
}
})
});
this.msgCtx = '';
const {error, result} = await ToAsyncAwait(Im.sendMsg({
fromId : this.$store.state.userInfo.id,
content: {
toSessionId : this.sessionId,
payload : payload,
toId : 1,
type : type
}
}));
if(error){
uni.$u.toast(error.message);
return false
}
this.focus = false;
this.$nextTick(() => {
this.focus = true;
@ -153,11 +158,11 @@ export default {
this.msgCtx += str;
},
sendGoods(){
this.send(this.simpleGoods, MSG_TYPE.CUSTOM);
this.send({...this.simpleGoods, customType:'goodsInfo'}, MSG_TYPE.CUSTOM);
this.goodsShow = false;
},
sendOrder(){
this.send(this.simpleOrder, MSG_TYPE.CUSTOM);
this.send({...this.simpleOrder, customType : 'orderInfo'}, MSG_TYPE.CUSTOM);
this.orderShow = false;
},
uploadImg(val){

@ -2,7 +2,7 @@
* @Author: ch
* @Date: 2022-05-13 15:57:31
* @LastEditors: ch
* @LastEditTime: 2022-05-14 13:47:05
* @LastEditTime: 2022-05-24 09:57:11
* @Description: file content
-->
<template>
@ -14,7 +14,7 @@
</view>
<template v-if="position === 'footer'">
<UiButton class="product--btn" size="min" type="gradual" @click="send"></UiButton>
<image class="product--close" src="@/static/imxx/close.png" @click="close"/>
<image class="product--close" src="@/static/im/close.png" @click="close"/>
</template>
</view>
</template>
@ -85,7 +85,7 @@ export default {
right:30rpx;
}
}
/deep/{
::v-deep{
.product--con-price{
text{
color: #FF512B;

@ -2,7 +2,7 @@
* @Author: ch
* @Date: 2022-05-14 14:00:14
* @LastEditors: ch
* @LastEditTime: 2022-05-14 15:57:30
* @LastEditTime: 2022-05-24 09:57:12
* @Description: file content
-->
<template>
@ -78,7 +78,7 @@ export default {
margin-top: 26rpx;
}
}
/deep/{
::v-deep{
.order--con-price{
text{
color: #FF512B;

@ -2,28 +2,38 @@
* @Author: ch
* @Date: 2022-03-22 16:13:00
* @LastEditors: ch
* @LastEditTime: 2022-05-14 16:32:09
* @LastEditTime: 2022-06-17 16:31:20
* @Description: file content
-->
<template>
<view >
<BsEmpty tips="暂时还没有消息哦~" v-if="!$store.state.sessionData.length"
<BsEmpty tips="暂时还没有消息哦~" v-if="!sessionData.length"
:icon="require('@/static/message/empty.png')" />
<view class="msgItem" v-for="item in $store.state.sessionData" :key="item.id"
<view class="msgItem" v-for="item in sessionData" :key="item.id"
@click="openMsg(item)">
<image class="msgItem--headImg" src="@/static/account/tx.png"></image>
<image class="msgItem--headImg" :src="item.fromAvatar || require('@/static/message/xt.png')"></image>
<view class="msgItem--con">
<view>
<text class="msgItem--title">{{item.fromNickname}}</text>
<text class="msgItem--text" v-if="item.lastMessage">
<template v-if="item.lastMessage.type == msgType.TXT">{{item.lastMessage.payload.content || item.lastMessage.payload.text}}</template>
<template v-if="item.lastMessage.type == msgType.CUSTOM">[]</template>
<template v-if="item.lastMessage.type == msgType.CUSTOM">
<template v-if="item.lastMessage.payload.customType === 'app_push'">
{{item.lastMessage.payload.link ? '[链接]' : item.lastMessage.payload.content}}
</template>
<template v-if="item.lastMessage.payload.customType === 'transferWaiterSession'">
[客服转移]
</template>
<template v-else>
{{item.lastMessage.payload.content || '[未知消息]'}}
</template>
</template>
<template v-if="item.lastMessage.type == msgType.IMG">[]</template>
<template v-if="item.lastMessage.type == msgType.VIDEO">[]</template>
</text>
</view>
<view class="msgItem--right">
<text class="msgItem--time" v-if="item.lastMessage">{{item.lastMessage.createTimeStamp}}</text>
<text class="msgItem--time" v-if="item.lastMessage">{{FormatDate(item.lastMessage.createTimeStamp, 'mm-dd hh:ii:ss')}}</text>
<u-badge class="msgItem--badge" :value="item.unreadCount"></u-badge>
</view>
</view>
@ -33,12 +43,13 @@
<script>
import BsEmpty from '../../../components/BsEmpty.vue';
import {MSG_TYPE} from '@/common/dicts/im';
import {FormatDate, Im} from '@/common/utils';
export default {
components: { BsEmpty },
data (){
return {
msgType : MSG_TYPE,
sessionData : this.$store.state.sessionData
}
},
onShow(){
@ -46,15 +57,22 @@ export default {
this.$Router.push('/login');
}
},
computed:{
sessionData (){
return this.$store.state.imData.sort((a,b) => b.updateTimeStamp - a.updateTimeStamp);
}
},
methods:{
FormatDate,
openMsg(item){
this.$store.commit('SET_SESSION_MSG_ID', item.id);
if(item.type === 3){
this.$Router.push(`/messageChat?sessionId=${item.id}`);
}else{
this.$Router.push(`/messageSystem`);
Im.setCurSessionId(item.id);
if(item.type === 4){
if(JSON.parse(item.payload).type === 'system'){
this.$Router.push(`/messageSystem?sessionId=${item.id}`);
return false;
}
}
this.$Router.push(`/messageChat?sessionId=${item.id}`);
}
}
}
@ -94,6 +112,8 @@ export default {
display:-webkit-box;
-webkit-box-orient:vertical;
-webkit-line-clamp:2;
word-break: break-all;
}
&--right{
text-align: right;

@ -0,0 +1,160 @@
<!--
* @Author: ch
* @Date: 2022-03-26 14:32:03
* @LastEditors: ch
* @LastEditTime: 2022-06-02 18:07:09
* @Description: file content
-->
<template>
<view class="main">
<view class="msg-item" v-for="item in msgData" :key="item.id">
<view class="msg-item--title">
<text>{{item.payload.title }}</text>
<text class="msg-item--time">{{FormatDate(item.createTimeStamp, 'mm-dd hh:ii:ss')}}</text>
</view>
<view class="msg-item--con" @click="handleDetail(item)">
<image class="msg-item--img" :src="item.payload.productImageUrls ? item.payload.productImageUrls[0] : require('@/static/message/xt.png')" mode="widthFix"/>
<view class="msg-item--desc">
<view >{{item.payload.content}}</view>
<template v-if="item.payload.customType === 'orderAutoDelivery'">
<template v-for="i in item.payload.virtualProductContentList">
<text class="msg-item--desc-link" v-if="i.shipType === 1" @click="openLink(i)" :key="i.shipContent">[]</text>
<text v-else :key="i.shipContent">{{i.shipContent}}</text>
</template>
</template>
</view>
</view>
</view>
<u-loadmore status="loading" v-if="!msgData || !msgData.length"/>
</view>
</template>
<script>
import {Im, CreateUUID, ToAsyncAwait, FormatDate} from '@/common/utils';
export default {
data(){
return {}
},
computed:{
curSessionData(){
const data = this.$store.state.imData.find(i =>i.id == this.$Route.query.sessionId) || {}
if(data.id){
Im.setCurSessionId(data.id);
}
return data;
},
msgData (){
let data = this.curSessionData ? this.curSessionData.messageList : [];
return Object.assign([],data).reverse();
}
},
watch:{
curSessionData(){
this.setTitle();
}
},
onReachBottom(){
this.getHistoryMsg();
},
onShow(){
if(!this.$route.query.sessionId){
this.$Router.back();
return false
}
this.getHistoryMsg();
this.readMsg();
this.setTitle();
},
methods:{
FormatDate : FormatDate,
/**
* 获取历史消息
*/
setTitle(){
uni.setNavigationBarTitle({
title : this.curSessionData?.fromNickname || '系统消息'
});
},
async getHistoryMsg(){
this.loading = true;
await ToAsyncAwait(Im.getHistoryMsg());
},
/**
* 把当前会话消息置为已读
*/
async readMsg(){
Im.setRead({
content: {
sessionId : this.$route.query.sessionId
}
});
},
/**
* 点击详情跳转
*/
handleDetail(item){
if(['orderPay','orderDelivery','orderCancel'].includes(item.payload.customType)){
this.$Router.push(`/orderDetail?id=${item.payload.primaryId}`)
}else if(['refundFail','refundSuccess'].includes(item.payload.customType)){
this.$Router.push(`/saleAfterDetail?id=${item.payload.primaryId}`)
}else if(item.payload.linkJump){
// #ifdef H5
window.location.href = item.payload.linkJump;
// #endif
// #ifdef APP-PLUS
plus.runtime.openURL(item.payload.linkJump);
// #endif
}
},
openLink(item){
debugger
if(item.shipType === 1){
// #ifdef H5
window.location.href = item.shipContent;
// #endif
// #ifdef APP-PLUS
plus.runtime.openURL(item.shipContent);
// #endif
}
}
}
}
</script>
<style lang="scss" scoped>
.msg-item{
padding: 40rpx 0 0 40rpx;
&--title{
display: flex;
justify-content: space-between;
align-items: center;
padding-right: 40rpx;
font-size: $font-size-lg;
color: $color-grey6;
}
&--time{
font-size: $font-size-sm;
color: $color-grey4;
}
&--con{
display: flex;
border-bottom: 1px solid $color-grey2;
padding: 40rpx 0;
}
&--img{
width: 140rpx;
height: 140rpx;
border-radius: 12rpx;
margin-right: 40rpx;
}
&--desc{
width: 455rpx;
font-size: $font-size-base;
line-height: 39rpx;
color: $color-grey5;
&-link{
color: $color-yellow4;
margin-right: 10rpx;
}
}
}
</style>

@ -2,7 +2,7 @@
* @Author: ch
* @Date: 2022-03-22 15:09:06
* @LastEditors: ch
* @LastEditTime: 2022-05-16 20:21:20
* @LastEditTime: 2022-06-23 17:45:29
* @Description: file content
-->
<template>
@ -19,7 +19,7 @@
<script>
import UiButton from '@/components/UiButton.vue'
import UiCell from '@/components/UiCell.vue';
import {MsbWebSkt} from '@/common/utils';
import {Im} from '@/common/utils';
import {ApiGetLogout} from '@/common/api/index';
export default {
components: { UiCell, UiButton },
@ -28,6 +28,7 @@ export default {
return this.$store.state.userInfo
}
},
methods:{
logout(){
uni.showModal({
@ -37,12 +38,13 @@ export default {
confirmColor : '#3A83FB',
success:async ({confirm})=>{
if(confirm){
await ApiGetLogout();
this.$store.commit('SET_SESSION_DATA',[])
this.$store.commit('SET_SESSION_MSG_COUNT',0)
this.$store.commit('SET_SESSION_MSG_ID','')
const {error} = await ApiGetLogout();
if(error){
uni.$u.toast(error.message);
return false;
}
this.$store.commit('SET_TOKEN');
MsbWebSkt.close();
Im.close();
this.$Router.replace('/login');
}
}
@ -93,7 +95,7 @@ page {
font-size: $font-size-lg;
}
/deep/{
::v-deep{
.userInfo .uiCell--title{
font-size: $font-size-lg;
}

@ -2,7 +2,7 @@
* @Author: ch
* @Date: 2022-03-28 15:38:23
* @LastEditors: ch
* @LastEditTime: 2022-05-17 11:44:50
* @LastEditTime: 2022-06-13 20:49:32
* @Description: file content
-->
<template>
@ -38,7 +38,7 @@ export default {
nickname : this.userInfo.nickname
});
if(error){
ui.$u.totas(error.message);
uni.$u.toast(error.message);
return false;
}
this.$store.commit('SET_USER_INFO', {...this.userInfo});

@ -2,7 +2,7 @@
* @Author: ch
* @Date: 2022-03-28 15:38:23
* @LastEditors: ch
* @LastEditTime: 2022-05-17 17:42:23
* @LastEditTime: 2022-06-13 20:59:54
* @Description: file content
-->
<template>
@ -106,7 +106,7 @@ export default {
const avatar = `${oss.host}/${oss.dir}${fileName}`;
const {error, result} = await ApiPutUser({avatar});
if(error){
ui.$u.totas(error.message);
uni.$u.toast(error.message);
return false
}
this.$store.commit('SET_USER_INFO', {...this.userInfo, avatar});
@ -143,7 +143,7 @@ page {
border: 0;
}
}
/deep/{
::v-deep{
.userInfo .uiCell--title{
font-size: $font-size-lg;
}

@ -2,7 +2,7 @@
* @Author: ch
* @Date: 2019-08-22 19:41:20
* @LastEditors: ch
* @LastEditTime: 2022-05-17 11:29:38
* @LastEditTime: 2022-05-30 17:44:51
* @Description: file content
-->
<template>
@ -10,7 +10,7 @@
</template>
<script>
import PageCtx from './components/PageCtx';
import PageCtx from './modules/PageCtx';
export default {
components : {PageCtx},
onShow(){

@ -301,12 +301,22 @@ export default {
* 结算选中的商品
*/
handleOrder() {
const ids = this.checkedIds;
const ids = this.checkedIds;
//
const baseType = this.list.find(i => ids[0] === i.id).productType;
for(let id of ids){
const item = this.list.find(i => id === i.id);
if(item.productType != baseType){
uni.$u.toast('虚拟商品需要单独结算,不可和其他实物订单合并结算哦~');
return false;
}
}
if (ids.length) {
this.$Router.push({
path : '/orderSubmit',
query : {
mode: 'cart',
productType : baseType,
ids:ids.join(',')
}
})
@ -573,7 +583,7 @@ export default {
}
/deep/{
::v-deep{
.cart-item--price{
text{
font-size: $font-size-lg;

@ -2,7 +2,7 @@
* @Author: ch
* @Date: 2022-04-08 18:36:14
* @LastEditors: ch
* @LastEditTime: 2022-05-17 11:29:41
* @LastEditTime: 2022-05-30 17:44:55
* @Description: file content
-->
<template>
@ -10,7 +10,7 @@
</template>
<script>
import PageCtx from './components/PageCtx';
import PageCtx from './modules/PageCtx';
import {ApiGetCartList} from '@/common/api/cart';
export default {
components : {PageCtx},

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

Loading…
Cancel
Save