@ -0,0 +1,2 @@ |
||||
unpackage |
||||
node_modules |
@ -0,0 +1,24 @@ |
||||
{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/ |
||||
// launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数 |
||||
"version": "0.0", |
||||
"configurations": [{ |
||||
"default" : |
||||
{ |
||||
"launchtype" : "local" |
||||
}, |
||||
"h5" : |
||||
{ |
||||
"launchtype" : "local" |
||||
}, |
||||
"mp-toutiao" : |
||||
{ |
||||
"launchtype" : "local" |
||||
}, |
||||
"mp-weixin" : |
||||
{ |
||||
"launchtype" : "local" |
||||
}, |
||||
"type" : "uniCloud" |
||||
} |
||||
] |
||||
} |
@ -0,0 +1,36 @@ |
||||
<script> |
||||
export default { |
||||
onLaunch: function() { |
||||
// uni.setEnableDebug({ |
||||
// enableDebug: true |
||||
// }) |
||||
}, |
||||
onShow: function() { |
||||
console.log('App Launch'); |
||||
const updateManager = uni.getUpdateManager(); |
||||
// 检查小程序是否有新版本发布 |
||||
updateManager.onCheckForUpdate(function (res) { |
||||
// 请求完新版本信息的回调 |
||||
console.log('onCheckForUpdate', res.hasUpdate); |
||||
}); |
||||
|
||||
// 小程序有新版本,则静默下载新版本,做好更新准备 |
||||
updateManager.onUpdateReady(function (res) { |
||||
updateManager.applyUpdate() |
||||
}); |
||||
|
||||
updateManager.onUpdateFailed(function (res) { |
||||
console.log('onUpdateFailed', res); |
||||
// 新的版本下载失败 |
||||
uni.showModal({ |
||||
title: '已经有新版本了哟~', |
||||
content: '新版本已经上线啦~,请您删除当前小程序,重新搜索打开哟~' |
||||
}); |
||||
}) |
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<style lang="scss"> |
||||
@import '@/uni_modules/uni-scss/index.scss'; |
||||
</style> |
@ -0,0 +1,26 @@ |
||||
import request from '@/apis/request.js' |
||||
const { get, post } = request |
||||
|
||||
export const partnerOperatingList = (data) => { |
||||
return post('nakadai/nakadai/partner/article/management/partnerOperatingList', data) |
||||
} |
||||
|
||||
export const findById = id => { |
||||
return post('nakadai/nakadai/applets/partner/browse?contentId=' + id) |
||||
} |
||||
|
||||
export const queryClassificationByType = id => { |
||||
return post('nakadai/nakadai/partner/article/classification/queryClassificationByType?typeId=' + id) |
||||
} |
||||
|
||||
export const schemeList = data => { |
||||
return post('nakadai/nakadai/partner/schemeManagement/schemeList', data) |
||||
} |
||||
|
||||
export const schemeFindById = id => { |
||||
return post('nakadai/nakadai/partner/schemeManagement/findById?id=' + id) |
||||
} |
||||
|
||||
export const collectCourse = (id, state) => { |
||||
return post('nakadai/nakadai/partner/article/management/collectCourse?contentId=' + id + '&state=' + state) |
||||
} |
@ -0,0 +1,54 @@ |
||||
import request from '@/apis/request.js' |
||||
const { get, post } = request |
||||
|
||||
export const queryCustomer = (data) => { |
||||
return post('nakadai/nakadai/customer/queryCustomer', data) |
||||
} |
||||
|
||||
export const list = (data) => { |
||||
return post('nakadai/nakadai/applets/customer/getCustomerListBasedOnBusinessManagerId', data) |
||||
} |
||||
|
||||
export const all = (data) => { |
||||
return post('nakadai/nakadai/applets/customer/customerList', data) |
||||
} |
||||
|
||||
export const queryCustomerDetails = (data) => { |
||||
return get('nakadai/nakadai/customer/queryCustomerDetails', data) |
||||
} |
||||
|
||||
export const querySchool = (data) => { |
||||
return get('nakadai/nakadai/school/querySchool', data) |
||||
} |
||||
|
||||
export const queryIndustryClass = (data) => { |
||||
return get('nakadai/nakadai/hrIndustryClass/queryIndustryClass', data) |
||||
} |
||||
|
||||
export const queryIndustry = (data) => { |
||||
return get('nakadai/nakadai/hrIndustry/queryIndustry', data) |
||||
} |
||||
|
||||
export const queryCustomerIsExists = (data) => { |
||||
return get('nakadai/nakadai/customer/queryCustomerIsExists', data) |
||||
} |
||||
|
||||
export const addCustomer = (data) => { |
||||
return post('nakadai/nakadai/customer/addCustomer', data) |
||||
} |
||||
|
||||
export const updateCustomer = (data) => { |
||||
return post('nakadai/nakadai/customer/updateCustomer', data) |
||||
} |
||||
|
||||
export const getProductsSubscribedByCustomers = (data) => { |
||||
return get('nakadai/nakadai/customer/getProductsSubscribedByCustomers', data) |
||||
} |
||||
|
||||
export const getTeamsByAccountId = (data) => { |
||||
return post('nakadai/nakadai/applets/customer/getTeamsByAccountId', data) |
||||
} |
||||
|
||||
export const getTheBusinessManagerIdsUnderTheTeam = id => { |
||||
return post(`nakadai/nakadai/applets/customer/getTheBusinessManagerIdsUnderTheTeam?id=${id}`) |
||||
} |
@ -0,0 +1,42 @@ |
||||
import request from '@/apis/request.js' |
||||
const { get, post } = request |
||||
|
||||
export const getOrderOtherTime = (data) => { |
||||
return post('nakadai/nakadai/orderOther/getOrderOtherTime', data) |
||||
} |
||||
|
||||
export const add = (data) => { |
||||
return post('nakadai/nakadai/order/add', data) |
||||
} |
||||
|
||||
export const update = (data) => { |
||||
return post('nakadai/nakadai/order/update', data) |
||||
} |
||||
|
||||
export const getDetail = (data) => { |
||||
return get('nakadai/nakadai/order/get', data) |
||||
} |
||||
|
||||
export const renew = (data) => { |
||||
return post('nakadai/nakadai/orderOther/renew', data) |
||||
} |
||||
|
||||
export const list = (data) => { |
||||
return post('nakadai/nakadai/applets/order/orderList', data) |
||||
} |
||||
|
||||
export const orderList = (data) => { |
||||
return post('nakadai/nakadai/order/list', data) |
||||
} |
||||
|
||||
export const del = (data) => { |
||||
return post('nakadai/nakadai/order/delete', data) |
||||
} |
||||
|
||||
export const miniProgramOrderRecord = (data) => { |
||||
return post('nakadai/nakadai/applets/order/miniProgramOrderRecord', data) |
||||
} |
||||
|
||||
export const queryCitySettlementPrice = (mallId, provinceId, cityId) => { |
||||
return post(`nakadai/mallPrice/queryCitySettlementPrice?mallId=${mallId}&provinceId=${provinceId}&cityId=${cityId}`) |
||||
} |
@ -0,0 +1,42 @@ |
||||
import request from '@/apis/request.js' |
||||
const { get, post } = request |
||||
|
||||
export const savePartnerAccount = (data) => { |
||||
return post('nakadai/nakadai/partnerAccount/savePartnerAccount', data) |
||||
} |
||||
|
||||
export const teamList = (data) => { |
||||
return post('nakadai/nakadai/partnerAccount/partnerAccountList', data) |
||||
} |
||||
|
||||
export const generateInvitationCode = accountId => { |
||||
return post(`nakadai/nakadai/partnerAccount/generateInvitationCode?accountId=${accountId}`) |
||||
} |
||||
|
||||
export const treeList = (data) => { |
||||
return post('nakadai/nakadai/partnerClassification/treeList', data) |
||||
} |
||||
|
||||
export const my = (data) => { |
||||
return get('nakadai/nakadai/partner-team/my', data) |
||||
} |
||||
|
||||
export const mailFileSend = (data) => { |
||||
return post('nakadai/nakadai/partnerAccount/mailFileSend', data) |
||||
} |
||||
|
||||
export const salesProgress = data => { |
||||
return post(`nakadai/nakadai/applets/partner/salesProgress`, data) |
||||
} |
||||
|
||||
export const annualOperatingAnalysis = data => { |
||||
return post(`nakadai/nakadai/applets/partner/annualOperatingAnalysis`, data) |
||||
} |
||||
|
||||
export const editProvinceCity = data => { |
||||
return post(`nakadai/nakadai/partner-team/editProvinceCity`, data) |
||||
} |
||||
|
||||
export const getPartnerTeamRates = data => { |
||||
return post(`nakadai/nakadai/partner-team/getPartnerTeamRates`, data) |
||||
} |
@ -0,0 +1,50 @@ |
||||
import request from '@/apis/request.js' |
||||
const { get, post } = request |
||||
|
||||
export const AppletsDataProductList = (data) => { |
||||
return post('nakadai/nakadai/dataProduct/AppletsDataProductList', data) |
||||
} |
||||
|
||||
export const tagsList = () => { |
||||
return get('nakadai/tags/tagsList') |
||||
} |
||||
|
||||
export const listOfGoods = (data) => { |
||||
return post('nakadai/mall/listOfGoods', data) |
||||
} |
||||
|
||||
export const detailsOfGoods = (id) => { |
||||
return get('nakadai/mall/detailsOfGoods?mallId=' + id) |
||||
} |
||||
|
||||
export const productCategoryList = () => { |
||||
return get('nakadai/productClassification/productCategoryList') |
||||
} |
||||
|
||||
export const productTypeList = () => { |
||||
return get('nakadai/productType/productTypeList') |
||||
} |
||||
|
||||
export const addToShoppingCart = (data) => { |
||||
return post('nakadai/mini/program/shopping/cart/addToShoppingCart', data) |
||||
} |
||||
|
||||
export const delCart = (data) => { |
||||
return post('nakadai/mini/program/shopping/cart/batchDeletion', data) |
||||
} |
||||
|
||||
export const shoppingCartList = (data) => { |
||||
return post('nakadai/mini/program/shopping/cart/shoppingCartList', data) |
||||
} |
||||
|
||||
export const courseDiscipline = () => { |
||||
return get('nakadai/nakadai/subject/courseDiscipline') |
||||
} |
||||
|
||||
export const courseProfessionalClass = id => { |
||||
return get('nakadai/nakadai/subject/courseProfessionalClass?disciplineId=' + id) |
||||
} |
||||
|
||||
export const courseProfessional = id => { |
||||
return get('nakadai/nakadai/subject/courseProfessional?professionalClassId=' + id) |
||||
} |
@ -0,0 +1,84 @@ |
||||
import request from '@/apis/request.js' |
||||
const { get, post } = request |
||||
|
||||
export const login = (data) => { |
||||
return post('users/users/user/weChatAppletCallbackByPartner', data) |
||||
} |
||||
|
||||
export const queryProvince = () => { |
||||
return get('nakadai/nakadai/province/queryProvince') |
||||
} |
||||
|
||||
export const queryCity = (data) => { |
||||
return get('nakadai/nakadai/city/queryCity', data) |
||||
} |
||||
|
||||
export const updateAvatars = url => { |
||||
return post(`users/users/user/updateAvatars?url=` + url) |
||||
} |
||||
|
||||
export const userBinding = (data) => { |
||||
return post('users/users/user/userBinding', data) |
||||
} |
||||
|
||||
export const examinePassword = (data) => { |
||||
return post('users/users/userAccount/examinePassword', data) |
||||
} |
||||
|
||||
export const getUserRolesPermissionMenu = (data) => { |
||||
return get('users/users/user-role/getUserRolesPermissionMenu', data) |
||||
} |
||||
|
||||
export const updatePersonCenter = (data) => { |
||||
return post('users/users/userAccount/updatePersonCenter', data) |
||||
} |
||||
|
||||
export const queryUserInfoDetails = () => { |
||||
return get('users/users/userAccount/queryUserInfoDetails') |
||||
} |
||||
|
||||
export const updateMyEmail = (data) => { |
||||
return post('nakadai/nakadai/partner-team/updateMyEmail', data) |
||||
} |
||||
|
||||
export const mailCodeSend = (data) => { |
||||
return post('nakadai/nakadai/partner-team/mailCodeSend', data) |
||||
} |
||||
|
||||
export const changeAccount = account => { |
||||
return post(`users/users/applets/mine/changeAccount?account=${account}`) |
||||
} |
||||
|
||||
export const changePhoneNumber = (phone, code) => { |
||||
return post(`users/users/applets/mine/changePhoneNumber?phone=${phone}&code=${code}`) |
||||
} |
||||
|
||||
export const checkIfAnAccountExists = account => { |
||||
return post(`users/users/applets/mine/checkIfAnAccountExists?account=${account}`) |
||||
} |
||||
|
||||
export const checkIfThePhoneNumberExists = phone => { |
||||
return post(`users/users/applets/mine/checkIfThePhoneNumberExists?phone=${phone}`) |
||||
} |
||||
|
||||
export const queryPartnerAccount = phone => { |
||||
return post(`nakadai/nakadai/partnerAccount/queryPartnerAccount?phone=${phone}`) |
||||
} |
||||
|
||||
export const getSessionKey = data => { |
||||
return post(`users/users/user/getSessionKey`, data) |
||||
} |
||||
|
||||
export const partnerAccountApplication = data => { |
||||
return post(`nakadai/nakadai/partnerAccount/partnerAccountApplication`, data) |
||||
} |
||||
|
||||
export const loginByOpenid = openid => { |
||||
return post(`users/users/user/loginByOpenid?openid=` + openid) |
||||
} |
||||
|
||||
export const checkWorkNumOrAccount = account => { |
||||
return post(`occupationlab/occupationlab/architecture/checkWorkNumOrAccount?platformId=4&type=0&account=` + account) |
||||
} |
||||
|
||||
export const updateUserAvatars = `http://39.108.250.202:9000/users/users/userAccount/updateUserAvatars` |
@ -0,0 +1,91 @@ |
||||
import config from '@/config/request' |
||||
let HTTP_COUNT = 0 // loading次数
|
||||
|
||||
const request = options => { |
||||
HTTP_COUNT++ |
||||
if (config.showLoading) { |
||||
// 请求数据时的loading
|
||||
// uni.showToast({
|
||||
// title: '加载中',
|
||||
// duration: 200,
|
||||
// icon: 'loading'
|
||||
// })
|
||||
} |
||||
const header = Object.assign({}, config.headers, { |
||||
token: uni.getStorageSync('token') |
||||
}) |
||||
const otherUrl = ['queryPartnerAccount', 'getSessionKey', 'loginByOpenid', 'partnerAccountApplication', 'checkWorkNumOrAccount'] |
||||
return new Promise((resolve, reject)=>{ |
||||
const { url } = options |
||||
uni.request({ |
||||
header, |
||||
// url: (otherUrl.find(e => url.includes(e)) ? 'http://192.168.31.116:9000/' : config.baseURL) + url,
|
||||
url: config.baseURL + url, |
||||
method: options.method || 'GET', // 请求类型,默认为GET
|
||||
data: options.data || {}, // 请求参数,默认空对象
|
||||
success: ({ data }) => { |
||||
const { status, message } = data |
||||
// 状态判断,根据后台定义并提示
|
||||
if (status === 200) { |
||||
resolve(data) |
||||
} else if (status == 401) { |
||||
// 登录过期
|
||||
uni.clearStorageSync() |
||||
uni.showToast({ |
||||
title: message, |
||||
icon: 'none' |
||||
}) |
||||
setTimeout(() => { |
||||
uni.navigateTo({ |
||||
url: '../login/login' |
||||
}) |
||||
}, 1500) |
||||
reject(data) |
||||
} else if (status == 10028 || status == 10014) { // 用户不存在
|
||||
resolve(data) |
||||
} else if (!status) { |
||||
resolve(data) |
||||
} else { |
||||
uni.showToast({ |
||||
title: message, |
||||
icon: 'none' |
||||
}) |
||||
reject(data) |
||||
} |
||||
}, |
||||
fail: err => { |
||||
uni.showToast({ |
||||
title: '请求失败!', |
||||
icon: 'none' |
||||
}) |
||||
reject(err) |
||||
}, |
||||
complete: () => { |
||||
if (config.showLoading) { |
||||
// HTTP_COUNT--
|
||||
// HTTP_COUNT || uni.hideLoading()
|
||||
} |
||||
} |
||||
}) |
||||
}) |
||||
} |
||||
|
||||
const get = (url, data, options = {}) => { |
||||
options.method = 'GET' |
||||
options.data = data |
||||
options.url = url |
||||
return request(options) |
||||
} |
||||
|
||||
const post = (url, data, options = {}) => { |
||||
options.method = 'POST' |
||||
options.data = data |
||||
options.url = url |
||||
return request(options) |
||||
} |
||||
|
||||
export default { |
||||
request, |
||||
get, |
||||
post |
||||
} |
@ -0,0 +1,40 @@ |
||||
<template> |
||||
<view class="none"> |
||||
<image src="../../static/image/none.png" mode="widthFix"></image> |
||||
<view class="text">{{ text }}</view> |
||||
</view> |
||||
</template> |
||||
|
||||
<script> |
||||
export default { |
||||
props: { |
||||
text: { |
||||
type: String, |
||||
default: '暂无数据' |
||||
}, |
||||
}, |
||||
data() { |
||||
return { |
||||
|
||||
} |
||||
}, |
||||
methods: { |
||||
|
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<style scoped lang="scss"> |
||||
.none { |
||||
padding-top: 100rpx; |
||||
text-align: center; |
||||
image { |
||||
width: 426rpx; |
||||
margin-bottom: 52rpx; |
||||
} |
||||
.text { |
||||
font-size: 28rpx; |
||||
color: #333; |
||||
} |
||||
} |
||||
</style> |
@ -0,0 +1,130 @@ |
||||
<template> |
||||
<view |
||||
class="u-mask" |
||||
hover-stop-propagation |
||||
:style="[maskStyle, zoomStyle]" |
||||
@tap="click" |
||||
@touchmove.stop.prevent="() => {}" |
||||
:class="{ |
||||
'u-mask-zoom': zoom, |
||||
'u-mask-show': show, |
||||
}" |
||||
> |
||||
<slot /> |
||||
</view> |
||||
</template> |
||||
|
||||
<script> |
||||
/** |
||||
* mask 遮罩 |
||||
* @description 创建一个遮罩层,用于强调特定的页面元素,并阻止用户对遮罩下层的内容进行操作,一般用于弹窗场景 |
||||
* @tutorial https://www.uviewui.com/components/mask.html |
||||
* @property {Boolean} show 是否显示遮罩(默认false) |
||||
* @property {String Number} z-index z-index 层级(默认1070) |
||||
* @property {Object} custom-style 自定义样式对象,见上方说明 |
||||
* @property {String Number} duration 动画时长,单位毫秒(默认300) |
||||
* @property {Boolean} zoom 是否使用scale对这招进行缩放(默认true) |
||||
* @property {Boolean} mask-click-able 遮罩是否可点击,为false时点击不会发送click事件(默认true) |
||||
* @event {Function} click mask-click-able为true时,点击遮罩发送此事件 |
||||
* @example <u-mask :show="show" @click="show = false"></u-mask> |
||||
*/ |
||||
export default { |
||||
name: "u-mask", |
||||
props: { |
||||
// 是否显示遮罩 |
||||
show: { |
||||
type: Boolean, |
||||
default: false, |
||||
}, |
||||
// 层级z-index |
||||
zIndex: { |
||||
type: [Number, String], |
||||
default: "", |
||||
}, |
||||
// 用户自定义样式 |
||||
customStyle: { |
||||
type: Object, |
||||
default() { |
||||
return {}; |
||||
}, |
||||
}, |
||||
// 遮罩的动画样式, 是否使用使用zoom进行scale进行缩放 |
||||
zoom: { |
||||
type: Boolean, |
||||
default: true, |
||||
}, |
||||
// 遮罩的过渡时间,单位为ms |
||||
duration: { |
||||
type: [Number, String], |
||||
default: 300, |
||||
}, |
||||
// 是否可以通过点击遮罩进行关闭 |
||||
maskClickAble: { |
||||
type: Boolean, |
||||
default: true, |
||||
}, |
||||
}, |
||||
data() { |
||||
return { |
||||
zoomStyle: { |
||||
transform: "", |
||||
}, |
||||
scale: "scale(1.2, 1.2)", |
||||
}; |
||||
}, |
||||
watch: { |
||||
show(n) { |
||||
if (n && this.zoom) { |
||||
// 当展示遮罩的时候,设置scale为1,达到缩小(原来为1.2)的效果 |
||||
this.zoomStyle.transform = "scale(1, 1)"; |
||||
} else if (!n && this.zoom) { |
||||
// 当隐藏遮罩的时候,设置scale为1.2,达到放大(因为显示遮罩时已重置为1)的效果 |
||||
this.zoomStyle.transform = this.scale; |
||||
} |
||||
}, |
||||
}, |
||||
computed: { |
||||
maskStyle() { |
||||
let style = {}; |
||||
style.backgroundColor = "rgba(0, 0, 0, 0.6)"; |
||||
if (this.show) |
||||
style.zIndex = this.zIndex ? this.zIndex : this.$u.zIndex.mask; |
||||
else style.zIndex = -1; |
||||
style.transition = `all ${this.duration / 1000}s ease-in-out`; |
||||
// 判断用户传递的对象是否为空,不为空就进行合并 |
||||
if (Object.keys(this.customStyle).length) |
||||
style = { |
||||
...style, |
||||
...this.customStyle, |
||||
}; |
||||
return style; |
||||
}, |
||||
}, |
||||
methods: { |
||||
click() { |
||||
if (!this.maskClickAble) return; |
||||
this.$emit("click"); |
||||
}, |
||||
}, |
||||
}; |
||||
</script> |
||||
|
||||
<style lang="scss" scoped> |
||||
.u-mask { |
||||
position: fixed; |
||||
top: 0; |
||||
left: 0; |
||||
right: 0; |
||||
bottom: 0; |
||||
opacity: 0; |
||||
transition: transform 0.3s; |
||||
} |
||||
|
||||
.u-mask-show { |
||||
opacity: 1; |
||||
} |
||||
|
||||
.u-mask-zoom { |
||||
transform: scale(1.2, 1.2); |
||||
} |
||||
</style> |
@ -0,0 +1,510 @@ |
||||
<template> |
||||
<view |
||||
v-if="visibleSync" |
||||
:style="[ |
||||
customStyle, |
||||
{ |
||||
zIndex: uZindex - 1, |
||||
}, |
||||
]" |
||||
class="u-drawer" |
||||
hover-stop-propagation |
||||
> |
||||
<z-mask |
||||
:duration="duration" |
||||
:custom-style="maskCustomStyle" |
||||
:maskClickAble="maskCloseAble" |
||||
:z-index="uZindex - 2" |
||||
:show="showDrawer && mask" |
||||
@click="maskClick" |
||||
></z-mask> |
||||
<view |
||||
class="u-drawer-content" |
||||
@tap="modeCenterClose(mode)" |
||||
:class="[ |
||||
safeAreaInsetBottom ? 'safe-area-inset-bottom' : '', |
||||
'u-drawer-' + mode, |
||||
showDrawer ? 'u-drawer-content-visible' : '', |
||||
zoom && mode == 'center' ? 'u-animation-zoom' : '', |
||||
]" |
||||
@transitionend="transitionend" |
||||
@touchmove.stop.prevent |
||||
@tap.stop.prevent |
||||
:style="[style]" |
||||
> |
||||
<view |
||||
class="u-mode-center-box" |
||||
@tap.stop.prevent |
||||
@touchmove.stop.prevent |
||||
v-if="mode == 'center'" |
||||
:style="[centerStyle]" |
||||
> |
||||
<u-icon |
||||
@click="close" |
||||
v-if="closeable" |
||||
class="u-close" |
||||
:class="['u-close--' + closeIconPos]" |
||||
:name="closeIcon" |
||||
:color="closeIconColor" |
||||
:size="closeIconSize" |
||||
></u-icon> |
||||
<scroll-view class="u-drawer__scroll-view" scroll-y="true"> |
||||
<slot /> |
||||
</scroll-view> |
||||
<slot name="fixedContent" /> |
||||
</view> |
||||
<scroll-view class="u-drawer__scroll-view" scroll-y="true" v-else> |
||||
<slot /> |
||||
</scroll-view> |
||||
<view @tap="close" class="u-close" :class="['u-close--' + closeIconPos]"> |
||||
<u-icon |
||||
v-if="mode != 'center' && closeable" |
||||
:name="closeIcon" |
||||
:color="closeIconColor" |
||||
:size="closeIconSize" |
||||
></u-icon> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</template> |
||||
|
||||
<script> |
||||
/** |
||||
* popup 弹窗 |
||||
* @description 弹出层容器,用于展示弹窗、信息提示等内容,支持上、下、左、右和中部弹出。组件只提供容器,内部内容由用户自定义 |
||||
* @tutorial https://www.uviewui.com/components/popup.html |
||||
* @property {String} mode 弹出方向(默认left) |
||||
* @property {Boolean} mask 是否显示遮罩(默认true) |
||||
* @property {Stringr | Number} length mode=left | 见官网说明(默认auto) |
||||
* @property {Boolean} zoom 是否开启缩放动画,只在mode为center时有效(默认true) |
||||
* @property {Boolean} safe-area-inset-bottom 是否开启底部安全区适配(默认false) |
||||
* @property {Boolean} mask-close-able 点击遮罩是否可以关闭弹出层(默认true) |
||||
* @property {Object} custom-style 用户自定义样式 |
||||
* @property {Stringr | Number} negative-top 中部弹出时,往上偏移的值 |
||||
* @property {Numberr | String} border-radius 弹窗圆角值(默认0) |
||||
* @property {Numberr | String} z-index 弹出内容的z-index值(默认1075) |
||||
* @property {Boolean} closeable 是否显示关闭图标(默认false) |
||||
* @property {String} close-icon 关闭图标的名称,只能uView的内置图标 |
||||
* @property {String} close-icon-pos 自定义关闭图标位置(默认top-right) |
||||
* @property {String} close-icon-color 关闭图标的颜色(默认#909399) |
||||
* @property {Number | String} close-icon-size 关闭图标的大小,单位rpx(默认30) |
||||
* @event {Function} open 弹出层打开 |
||||
* @event {Function} close 弹出层收起 |
||||
* @example <u-popup v-model="show"><view>出淤泥而不染,濯清涟而不妖</view></u-popup> |
||||
*/ |
||||
import ZMask from "./mask.vue"; |
||||
export default { |
||||
name: "popup", |
||||
components: { |
||||
ZMask, |
||||
}, |
||||
props: { |
||||
/** |
||||
* 显示状态 |
||||
*/ |
||||
show: { |
||||
type: Boolean, |
||||
default: false, |
||||
}, |
||||
/** |
||||
* 弹出方向,left|right|top|bottom|center |
||||
*/ |
||||
mode: { |
||||
type: String, |
||||
default: "left", |
||||
}, |
||||
/** |
||||
* 是否显示遮罩 |
||||
*/ |
||||
mask: { |
||||
type: Boolean, |
||||
default: true, |
||||
}, |
||||
// 抽屉的宽度(mode=left|right),或者高度(mode=top|bottom),单位rpx,或者"auto" |
||||
// 或者百分比"50%",表示由内容撑开高度或者宽度 |
||||
length: { |
||||
type: [Number, String], |
||||
default: "auto", |
||||
}, |
||||
// 是否开启缩放动画,只在mode=center时有效 |
||||
zoom: { |
||||
type: Boolean, |
||||
default: true, |
||||
}, |
||||
// 是否开启底部安全区适配,开启的话,会在iPhoneX机型底部添加一定的内边距 |
||||
safeAreaInsetBottom: { |
||||
type: Boolean, |
||||
default: false, |
||||
}, |
||||
// 是否可以通过点击遮罩进行关闭 |
||||
maskCloseAble: { |
||||
type: Boolean, |
||||
default: true, |
||||
}, |
||||
// 用户自定义样式 |
||||
customStyle: { |
||||
type: Object, |
||||
default() { |
||||
return {}; |
||||
}, |
||||
}, |
||||
value: { |
||||
type: Boolean, |
||||
default: false, |
||||
}, |
||||
// 此为内部参数,不在文档对外使用,为了解决Picker和keyboard等融合了弹窗的组件 |
||||
// 对v-model双向绑定多层调用造成报错不能修改props值的问题 |
||||
popup: { |
||||
type: Boolean, |
||||
default: true, |
||||
}, |
||||
// 显示显示弹窗的圆角,单位rpx |
||||
borderRadius: { |
||||
type: [Number, String], |
||||
default: 0, |
||||
}, |
||||
zIndex: { |
||||
type: [Number, String], |
||||
default: "10075", |
||||
}, |
||||
// 是否显示关闭图标 |
||||
closeable: { |
||||
type: Boolean, |
||||
default: false, |
||||
}, |
||||
// 关闭图标的名称,只能uView的内置图标 |
||||
closeIcon: { |
||||
type: String, |
||||
default: "close", |
||||
}, |
||||
// 自定义关闭图标位置,top-left为左上角,top-right为右上角,bottom-left为左下角,bottom-right为右下角 |
||||
closeIconPos: { |
||||
type: String, |
||||
default: "top-right", |
||||
}, |
||||
// 关闭图标的颜色 |
||||
closeIconColor: { |
||||
type: String, |
||||
default: "#909399", |
||||
}, |
||||
// 关闭图标的大小,单位rpx |
||||
closeIconSize: { |
||||
type: [String, Number], |
||||
default: "30", |
||||
}, |
||||
// 宽度,只对左,右,中部弹出时起作用,单位rpx,或者"auto" |
||||
// 或者百分比"50%",表示由内容撑开高度或者宽度,优先级高于length参数 |
||||
width: { |
||||
type: String, |
||||
default: "", |
||||
}, |
||||
// 高度,只对上,下,中部弹出时起作用,单位rpx,或者"auto" |
||||
// 或者百分比"50%",表示由内容撑开高度或者宽度,优先级高于length参数 |
||||
height: { |
||||
type: String, |
||||
default: "", |
||||
}, |
||||
// 给一个负的margin-top,往上偏移,避免和键盘重合的情况,仅在mode=center时有效 |
||||
negativeTop: { |
||||
type: [String, Number], |
||||
default: 0, |
||||
}, |
||||
// 遮罩的样式,一般用于修改遮罩的透明度 |
||||
maskCustomStyle: { |
||||
type: Object, |
||||
default() { |
||||
return {}; |
||||
}, |
||||
}, |
||||
// 遮罩打开或收起的动画过渡时间,单位ms |
||||
duration: { |
||||
type: [String, Number], |
||||
default: 250, |
||||
}, |
||||
// 中间弹窗的背景颜色值 |
||||
centerPupBg: { |
||||
type: String, |
||||
default: "#fff", |
||||
}, |
||||
bgColor: { |
||||
type: String, |
||||
default: "#fff", |
||||
}, |
||||
}, |
||||
|
||||
data() { |
||||
return { |
||||
visibleSync: false, |
||||
showDrawer: false, |
||||
timer: null, |
||||
closeFromInner: false, // value的值改变,是发生在内部还是外部 |
||||
}; |
||||
}, |
||||
computed: { |
||||
// 根据mode的位置,设定其弹窗的宽度(mode = left|right),或者高度(mode = top|bottom) |
||||
style() { |
||||
let style = {}; |
||||
// 如果是左边或者上边弹出时,需要给translate设置为负值,用于隐藏 |
||||
if (this.mode == "left" || this.mode == "right") { |
||||
style = { |
||||
width: this.width |
||||
? this.getUnitValue(this.width) |
||||
: this.getUnitValue(this.length), |
||||
height: "100%", |
||||
transform: `translate3D(${ |
||||
this.mode == "left" ? "-100%" : "100%" |
||||
},0px,0px)`, |
||||
background: this.bgColor, |
||||
}; |
||||
} else if (this.mode == "top" || this.mode == "bottom") { |
||||
style = { |
||||
width: "100%", |
||||
height: this.height |
||||
? this.getUnitValue(this.height) |
||||
: this.getUnitValue(this.length), |
||||
transform: `translate3D(0px,${ |
||||
this.mode == "top" ? "-100%" : "100%" |
||||
},0px)`, |
||||
background: this.bgColor, |
||||
}; |
||||
} |
||||
style.zIndex = this.uZindex; |
||||
// 如果用户设置了borderRadius值,添加弹窗的圆角 |
||||
if (this.borderRadius) { |
||||
switch (this.mode) { |
||||
case "left": |
||||
style.borderRadius = `0 ${this.borderRadius}rpx ${this.borderRadius}rpx 0`; |
||||
break; |
||||
case "top": |
||||
style.borderRadius = `0 0 ${this.borderRadius}rpx ${this.borderRadius}rpx`; |
||||
break; |
||||
case "right": |
||||
style.borderRadius = `${this.borderRadius}rpx 0 0 ${this.borderRadius}rpx`; |
||||
break; |
||||
case "bottom": |
||||
style.borderRadius = `${this.borderRadius}rpx ${this.borderRadius}rpx 0 0`; |
||||
break; |
||||
default: |
||||
} |
||||
// 不加可能圆角无效 |
||||
style.overflow = "hidden"; |
||||
} |
||||
if (this.duration) |
||||
style.transition = `all ${this.duration / 1000}s linear`; |
||||
return style; |
||||
}, |
||||
// 中部弹窗的特有样式 |
||||
centerStyle() { |
||||
let style = {}; |
||||
style.width = this.width |
||||
? this.getUnitValue(this.width) |
||||
: this.getUnitValue(this.length); |
||||
// 中部弹出的模式,如果没有设置高度,就用auto值,由内容撑开高度 |
||||
style.height = this.height ? this.getUnitValue(this.height) : "auto"; |
||||
style.zIndex = this.uZindex; |
||||
// style.marginTop = `-${this.$u.addUnit(this.negativeTop)}`; |
||||
style.background = this.centerPupBg; |
||||
if (this.borderRadius) { |
||||
style.borderRadius = `${this.borderRadius}rpx`; |
||||
// 不加可能圆角无效 |
||||
style.overflow = "hidden"; |
||||
} |
||||
return style; |
||||
}, |
||||
// 计算整理后的z-index值 |
||||
uZindex() { |
||||
return this.zIndex ? this.zIndex : this.$u.zIndex.popup; |
||||
}, |
||||
}, |
||||
watch: { |
||||
value(val) { |
||||
if (val) { |
||||
this.open(); |
||||
} else if (!this.closeFromInner) { |
||||
this.close(); |
||||
} |
||||
this.closeFromInner = false; |
||||
}, |
||||
}, |
||||
mounted() { |
||||
// 组件渲染完成时,检查value是否为true,如果是,弹出popup |
||||
this.value && this.open(); |
||||
}, |
||||
methods: { |
||||
// 动画结束回调 |
||||
transitionend(e) { |
||||
// console.log(e, "动画结束popup"); |
||||
}, |
||||
// 判断传入的值,是否带有单位,如果没有,就默认用rpx单位 |
||||
getUnitValue(val) { |
||||
if (/(%|px|rpx|auto)$/.test(val)) return val; |
||||
else return val + "rpx"; |
||||
}, |
||||
// 遮罩被点击 |
||||
maskClick() { |
||||
this.close(); |
||||
}, |
||||
close() { |
||||
// 标记关闭是内部发生的,否则修改了value值,导致watch中对value检测,导致再执行一遍close |
||||
// 造成@close事件触发两次 |
||||
this.closeFromInner = true; |
||||
this.change("showDrawer", "visibleSync", false); |
||||
}, |
||||
// 中部弹出时,需要.u-drawer-content将居中内容,此元素会铺满屏幕,点击需要关闭弹窗 |
||||
// 让其只在mode=center时起作用 |
||||
modeCenterClose(mode) { |
||||
if (mode != "center" || !this.maskCloseAble) return; |
||||
this.close(); |
||||
}, |
||||
open() { |
||||
this.change("visibleSync", "showDrawer", true); |
||||
}, |
||||
// 此处的原理是,关闭时先通过动画隐藏弹窗和遮罩,再移除整个组件 |
||||
// 打开时,先渲染组件,延时一定时间再让遮罩和弹窗的动画起作用 |
||||
change(param1, param2, status) { |
||||
// 如果this.popup为false,意味着为picker,actionsheet等组件调用了popup组件 |
||||
if (this.popup == true) { |
||||
this.$emit("input", status); |
||||
} |
||||
this[param1] = status; |
||||
if (status) { |
||||
// #ifdef H5 || MP |
||||
this.timer = setTimeout(() => { |
||||
this[param2] = status; |
||||
this.$emit(status ? "open" : "close"); |
||||
}, 50); |
||||
// #endif |
||||
// #ifndef H5 || MP |
||||
this.$nextTick(() => { |
||||
this[param2] = status; |
||||
this.$emit(status ? "open" : "close"); |
||||
}); |
||||
// #endif |
||||
} else { |
||||
this.timer = setTimeout(() => { |
||||
this[param2] = status; |
||||
this.$emit(status ? "open" : "close"); |
||||
}, this.duration); |
||||
} |
||||
}, |
||||
}, |
||||
}; |
||||
</script> |
||||
|
||||
<style scoped lang="scss"> |
||||
@mixin vue-flex($direction: row) { |
||||
/* #ifndef APP-NVUE */ |
||||
display: flex; |
||||
flex-direction: $direction; |
||||
/* #endif */ |
||||
} |
||||
.u-drawer { |
||||
/* #ifndef APP-NVUE */ |
||||
display: block; |
||||
/* #endif */ |
||||
position: fixed; |
||||
top: 0; |
||||
left: 0; |
||||
right: 0; |
||||
bottom: 0; |
||||
overflow: hidden; |
||||
} |
||||
|
||||
.u-drawer-content { |
||||
/* #ifndef APP-NVUE */ |
||||
display: block; |
||||
/* #endif */ |
||||
position: absolute; |
||||
z-index: 1003; |
||||
transition: all 0.25s linear; |
||||
} |
||||
|
||||
.u-drawer__scroll-view { |
||||
width: 100%; |
||||
height: 100%; |
||||
} |
||||
|
||||
.u-drawer-left { |
||||
top: 0; |
||||
bottom: 0; |
||||
left: 0; |
||||
} |
||||
|
||||
.u-drawer-right { |
||||
right: 0; |
||||
top: 0; |
||||
bottom: 0; |
||||
} |
||||
|
||||
.u-drawer-top { |
||||
top: 0; |
||||
left: 0; |
||||
right: 0; |
||||
} |
||||
|
||||
.u-drawer-bottom { |
||||
bottom: 0; |
||||
left: 0; |
||||
right: 0; |
||||
} |
||||
|
||||
.u-drawer-center { |
||||
@include vue-flex; |
||||
flex-direction: column; |
||||
bottom: 0; |
||||
left: 0; |
||||
right: 0; |
||||
top: 0; |
||||
justify-content: center; |
||||
align-items: center; |
||||
opacity: 0; |
||||
z-index: 99999; |
||||
} |
||||
|
||||
.u-mode-center-box { |
||||
min-width: 100rpx; |
||||
min-height: 100rpx; |
||||
/* #ifndef APP-NVUE */ |
||||
display: block; |
||||
/* #endif */ |
||||
position: relative; |
||||
} |
||||
|
||||
.u-drawer-content-visible.u-drawer-center { |
||||
transform: scale(1); |
||||
opacity: 1; |
||||
} |
||||
|
||||
.u-animation-zoom { |
||||
transform: scale(1.15); |
||||
} |
||||
|
||||
.u-drawer-content-visible { |
||||
transform: translate3D(0px, 0px, 0px) !important; |
||||
} |
||||
|
||||
.u-close { |
||||
position: absolute; |
||||
z-index: 3; |
||||
} |
||||
|
||||
.u-close--top-left { |
||||
top: 30rpx; |
||||
left: 30rpx; |
||||
} |
||||
|
||||
.u-close--top-right { |
||||
top: 30rpx; |
||||
right: 30rpx; |
||||
} |
||||
|
||||
.u-close--bottom-left { |
||||
bottom: 30rpx; |
||||
left: 30rpx; |
||||
} |
||||
|
||||
.u-close--bottom-right { |
||||
right: 30rpx; |
||||
bottom: 30rpx; |
||||
} |
||||
</style> |
@ -0,0 +1,155 @@ |
||||
## 导入即用 全端支持 |
||||
|
||||
### 有问题 + wx : zy597172583 标注来意 可评论 看到及时回复 |
||||
1.使用方式 |
||||
|
||||
```javascript |
||||
<template> |
||||
<filter-popup :data="filterData" :form.sync="filterForm" v-model="popup.filter" title="全部筛选" height="1104rpx" @finsh="subFinsh"></filter-popup> |
||||
</template> |
||||
<script> |
||||
import FilterPopup from "@/components/filter-popup/filter-popup"; |
||||
export default { |
||||
components: { |
||||
FilterPopup, |
||||
}, |
||||
data() { |
||||
return { |
||||
//筛选表单数据 |
||||
filterData: [ |
||||
{ |
||||
children: false,//是否有子项 |
||||
title: "意向度", |
||||
key: "intention_type", //键名 接收对象名字 |
||||
keyValue: "value", //获取的值是哪个 |
||||
isRadio: true, //是否单选 否则多选 |
||||
data: [ |
||||
{ |
||||
title: "一般意向", |
||||
id: 1, |
||||
value: 1, |
||||
}, |
||||
{ |
||||
title: "中意向度", |
||||
id: 2, |
||||
value: 2, |
||||
}, |
||||
{ |
||||
title: "高意向度", |
||||
id: 3, |
||||
value: 3, |
||||
}, |
||||
], |
||||
}, |
||||
{ |
||||
children: false,//是否有子项 |
||||
title: "手机号码", |
||||
key: "is_bind_phone", //键名 接收对象名字 |
||||
keyValue: "value", //获取的值是哪个 |
||||
isRadio: true, //是否单选 否则多选 |
||||
data: [ |
||||
{ |
||||
title: "未绑定", |
||||
value: 0, |
||||
}, |
||||
{ |
||||
title: "已绑定", |
||||
value: 1, |
||||
}, |
||||
], |
||||
}, |
||||
{ |
||||
children: false,//是否有子项 |
||||
title: "企微好友", |
||||
key: "is_work_customer", //键名 接收对象名字 |
||||
keyValue: "value", //获取的值是哪个 |
||||
isRadio: true, //是否单选 否则多选 |
||||
data: [ |
||||
{ |
||||
title: "未添加", |
||||
value: 0, |
||||
}, |
||||
{ |
||||
title: "已添加", |
||||
value: 1, |
||||
}, |
||||
], |
||||
}, |
||||
{ |
||||
children: true,//是否有子项 |
||||
isRadio: false, //是否单选 |
||||
title: "标签内容", |
||||
key: "label", //键名 接收对象名字 |
||||
keyValue: "id", //获取的值是哪个 |
||||
data: [ |
||||
{ |
||||
title: "客户重要程度", |
||||
id: 22, |
||||
children: [ |
||||
{ |
||||
title: "一般意向2", |
||||
id: 32, |
||||
value: 1, |
||||
}, |
||||
{ |
||||
title: "一般意向3", |
||||
id: 12, |
||||
value: 1, |
||||
}, |
||||
], |
||||
}, |
||||
{ |
||||
title: "客户重要程度2", |
||||
id: 122, |
||||
children: [ |
||||
{ |
||||
title: "一般意向2", |
||||
id: 43, |
||||
value: 1, |
||||
}, |
||||
{ |
||||
title: "一般意向3", |
||||
id: 23, |
||||
value: 1, |
||||
}, |
||||
], |
||||
}, |
||||
], |
||||
}, |
||||
], //筛选数据 |
||||
filterForm: {}, //选中的表单 |
||||
}; |
||||
}, |
||||
} |
||||
``` |
||||
|
||||
2.组件props |
||||
|
||||
| 参数名 | 类型 | 介绍 | |
||||
| ---------- | ------- | ------------------------------------------------- | |
||||
| form | Object | .sync双向绑定的表单值 , 可传入显示初始哪些被选中 | |
||||
| data | Array | 动态渲染选项的数据数组 | |
||||
| title | String | 标题 | |
||||
| height | String | 弹出层高度 单位 rpx px upx 百分比 vw等 | |
||||
| themeColor | String | 组件主体颜色 默认:\#0066ff | |
||||
| mask | Boolean | 是否显示弹出遮盖层 | |
||||
|
||||
3.data 参数 |
||||
|
||||
| 参数名 | 类型 | 是否必填 | 介绍 | |
||||
| -------- | ------- | -------- | ------------------------------------------------------------ | |
||||
| children | Boolean | 是 | 是否有子项 | |
||||
| data | Array | 是 | 渲染出来的选项数据 | |
||||
| isRadio | Boolean | 是 | 是否单选 单个选项指定,单选还是多选 | |
||||
| title | String | 是 | 标签内容标题 | |
||||
| key | String | 是 | 接收对象名字 会作为@finsh返回对象的键名 | |
||||
| keyValue | String | 是 | 获取的值是哪个 自定义指定获取哪个键值 value还是id或者自己定义的 | |
||||
|
||||
4.事件 |
||||
|
||||
| 事件名 | 返回参数 | 简介 | |
||||
| ------ | -------- | ----------------------------------------- | |
||||
| finsh | Object | 点击确定时触发 返回参数为选中值的对象数组 | |
||||
| close | 无 | 组件点击关闭时触发 | |
||||
|
||||
![image-20210730095456900](https://yzhsaas-cdn.qietongvip.com/asd.png) |
@ -0,0 +1,596 @@ |
||||
<template> |
||||
<popup |
||||
:mask="mask" |
||||
border-radius="50" |
||||
v-model="acceptValue" |
||||
mode="bottom" |
||||
class="filter-popup" |
||||
:height="height" |
||||
@close="close" |
||||
:style="{ '--color': themeColor }" |
||||
:mask-custom-style="{ background: 'rgba(0, 0, 0, 0.7)' }" |
||||
> |
||||
<view class="top-title flex-row-sb" v-if="showTop"> |
||||
<view class="popup-title flex-row-c-c">{{ title }}</view> |
||||
<text class="saasIcon flex-row-c-c" @click="close"></text> |
||||
</view> |
||||
|
||||
<scroll-view class="select-scroll" scroll-y :style="{ height: `calc( ${height} - 120rpx - 152rpx )` }"> |
||||
<view class="select-main"> |
||||
<view v-if="showCategory" class="select-item"> |
||||
<view class="title">学科专业</view> |
||||
<view class="category-wrap"> |
||||
<picker mode="multiSelector" v-model="category" @change="change" @columnchange="columnchange" :range="categories" range-key="title"> |
||||
<view class="category">{{categoryName ? categoryName : '请选择'}}</view> |
||||
</picker> |
||||
<uni-icons v-if="categoryName" class="icon" type="closeempty" size="16" color="#333" @click.stop="delCatagory"></uni-icons> |
||||
</view> |
||||
</view> |
||||
|
||||
<view class="select-item" v-for="(item, index) in data" :key="index"> |
||||
<view class="title"> {{ item.title }} </view> |
||||
<view class="tag-list" v-if="!item.children"> |
||||
<view |
||||
class="tag-item" |
||||
:class="[acceptForm[item.key].includes(item2.value) ? 'select-on' : '']" |
||||
v-for="(item2, index2) in item.data" |
||||
:key="index2" |
||||
@click="selectTagBuyValueOrId(item2, item.key, item.keyValue, item.isRadio)" |
||||
> |
||||
{{ item2.title }} |
||||
</view> |
||||
</view> |
||||
<!-- 有childer --> |
||||
<view class="select-childer" v-else v-for="item2 in item.data" :key="item2.id"> |
||||
<view class="childer-title flex-row--c">{{ item2.title }}</view> |
||||
<view class="tag-list"> |
||||
<view |
||||
class="tag-item" |
||||
:class="[acceptForm[item.key].includes(item3.id) ? 'select-on' : '']" |
||||
v-for="item3 in item2.children" |
||||
:key="item3.id" |
||||
@click="selectTagBuyValueOrId(item3, item.key, item.keyValue, item.isRadio)" |
||||
> |
||||
{{ item3.title }} |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</scroll-view> |
||||
|
||||
<view class="filter-button flex-row-c"> |
||||
<view class="btn flex-row"> |
||||
<view class="btn-1 flex-row-c-c" @click="reset">重置</view> |
||||
<view class="btn-2 flex-row-c-c" @click="finsh">完成</view> |
||||
</view> |
||||
</view> |
||||
</popup> |
||||
</template> |
||||
|
||||
<script> |
||||
import { courseDiscipline, courseProfessionalClass, courseProfessional } from '@/apis/modules/product.js' |
||||
import Popup from './components/popup.vue'; |
||||
export default { |
||||
components:{ |
||||
Popup |
||||
}, |
||||
name: "filter-popup", |
||||
props: { |
||||
//选中的表单 |
||||
form: { |
||||
type: Object, |
||||
default: () => {}, |
||||
}, |
||||
//主题颜色 |
||||
themeColor: { |
||||
type: String, |
||||
default: "#0066ff", |
||||
}, |
||||
//渲染数据 |
||||
data: { |
||||
type: Array, |
||||
default: () => [], |
||||
}, |
||||
//标题 |
||||
title: { |
||||
type: String, |
||||
default: "请选择", |
||||
}, |
||||
value: { |
||||
type: Boolean, |
||||
default: false, |
||||
}, |
||||
mask: { |
||||
type: Boolean, |
||||
default: true, |
||||
}, |
||||
height: { |
||||
type: String, |
||||
default: "600rpx", |
||||
}, |
||||
//是否显示退出按钮 |
||||
showTop: { |
||||
type: Boolean, |
||||
default: true, |
||||
}, |
||||
//是否显示学科专业选择 |
||||
showCategory: { |
||||
type: Boolean, |
||||
default: false, |
||||
}, |
||||
}, |
||||
computed: { |
||||
// 接收表单 |
||||
acceptForm: { |
||||
get() { |
||||
this.originForm = JSON.parse(JSON.stringify(this.form)) |
||||
if (Object.keys(this.form).length) { |
||||
return this.form; |
||||
} else { |
||||
let obj = {}; |
||||
this.data.forEach((item) => { |
||||
obj[item.key] = []; |
||||
}); |
||||
return obj; |
||||
} |
||||
}, |
||||
set(nval) { |
||||
// console.log("set Form :>> ", nval); |
||||
this.$emit("update:form", nval); |
||||
}, |
||||
}, |
||||
acceptValue: { |
||||
get() { |
||||
return this.value; |
||||
}, |
||||
set(nval) { |
||||
this.$emit("input", nval); |
||||
}, |
||||
}, |
||||
}, |
||||
data() { |
||||
return { |
||||
originForm: {}, |
||||
|
||||
categoryName:'', |
||||
categoryId: '', |
||||
professionalCategoryId: '', |
||||
professionalId: '', |
||||
categories:[], |
||||
category: [] |
||||
} |
||||
}, |
||||
mounted() { |
||||
this.getDis() |
||||
}, |
||||
methods: { |
||||
//选择存value 还是id |
||||
selectTagBuyValueOrId(item, key, keyValue, isRadio) { |
||||
//如果是单选 |
||||
if (isRadio) { |
||||
if (keyValue == "value") { |
||||
if (this.acceptForm[key].some((value) => value === item.value)) { |
||||
this.acceptForm[key] = this.acceptForm[key].filter((value) => value !== item.value); |
||||
return; |
||||
} |
||||
this.acceptForm[key] = []; |
||||
this.acceptForm[key].push(item.value); |
||||
} else { |
||||
if (this.acceptForm[key].some((id) => id === item.id)) { |
||||
this.acceptForm[key] = this.acceptForm[key].filter((id) => id !== item.id); |
||||
return; |
||||
} |
||||
this.acceptForm[key] = []; |
||||
this.acceptForm[key].push(item.id); |
||||
} |
||||
} else { |
||||
if (keyValue == "value") { |
||||
this.acceptForm[key].some((value) => value === item.value) |
||||
? (this.acceptForm[key] = this.acceptForm[key].filter((value) => value !== item.value)) |
||||
: this.acceptForm[key].push(item.value); |
||||
} else { |
||||
this.acceptForm[key].some((id) => id === item.id) |
||||
? (this.acceptForm[key] = this.acceptForm[key].filter((id) => id !== item.id)) |
||||
: this.acceptForm[key].push(item.id); |
||||
} |
||||
} |
||||
|
||||
this.acceptForm = this.acceptForm; |
||||
}, |
||||
|
||||
// 查询学科类别 |
||||
async getDis() { |
||||
const { list } = await courseDiscipline() |
||||
list.map(e => { |
||||
e.id = e.disciplineId |
||||
e.title = e.disciplineName |
||||
}) |
||||
this.categories.push(list) |
||||
|
||||
const res = await courseProfessionalClass(1) |
||||
res.list.map(e => { |
||||
e.id = e.professionalClassId |
||||
e.title = e.professionalClassName |
||||
}) |
||||
this.categories.push(res.list) |
||||
|
||||
const res1 = await courseProfessional(1) |
||||
res1.list.map(e => { |
||||
e.id = e.professionalId |
||||
e.title = e.professionalName |
||||
}) |
||||
this.categories.push(res1.list) |
||||
}, |
||||
// 学科专业确定回调 |
||||
change(e) { |
||||
const i0 = e.detail.value[0] |
||||
const i1 = e.detail.value[1] |
||||
const i2 = e.detail.value[2] |
||||
const i1IsNumber = typeof i1 === 'number' |
||||
const i2IsNumber = typeof i2 === 'number' |
||||
const list = this.categories |
||||
this.categoryId = list[0][i0].id |
||||
this.categoryName = list[0][i0].title |
||||
|
||||
this.professionalCategoryId = '' |
||||
this.professionalId = '' |
||||
if (i1IsNumber && list[1].length > 0) { |
||||
this.professionalCategoryId = list[1][i1].id |
||||
this.categoryName += '/' + list[1][i1].title |
||||
} |
||||
if (i2IsNumber && list[2].length > 0) { |
||||
this.professionalId = list[2][i2].id |
||||
this.categoryName += '/' + list[2][i2].title |
||||
} |
||||
}, |
||||
// 学科专业切换回调 |
||||
async columnchange(e) { |
||||
const { column } = e.detail |
||||
if (column == 0) { |
||||
const { list } = await courseProfessionalClass(this.categories[0][e.detail.value].id) |
||||
list.map(e => { |
||||
e.id = e.professionalClassId |
||||
e.title = e.professionalClassName |
||||
}) |
||||
this.categories[1] = list |
||||
this.categories[2] = [] |
||||
this.$set(this.categories, 1, list) |
||||
console.log('inner',this.categories) |
||||
} else |
||||
if (column == 1) { |
||||
const { list } = await courseProfessional(this.categories[1][e.detail.value].id) |
||||
list.map(e => { |
||||
e.id = e.professionalId |
||||
e.title = e.professionalName |
||||
}) |
||||
this.categories[2] = list |
||||
this.$set(this.categories, 2, list) |
||||
} |
||||
}, |
||||
// 删除学科专业 |
||||
delCatagory() { |
||||
this.category = [] |
||||
this.categoryName = '' |
||||
this.categoryId = '' |
||||
this.professionalCategoryId = '' |
||||
this.professionalId = '' |
||||
}, |
||||
|
||||
// 点击完成 |
||||
finsh() { |
||||
if (this.showCategory) { |
||||
this.acceptForm.categoryId = this.categoryId |
||||
this.acceptForm.professionalCategoryId = this.professionalCategoryId |
||||
this.acceptForm.professionalId = this.professionalId |
||||
this.acceptForm.categoryName = this.categoryName |
||||
} |
||||
this.$emit("finsh", this.acceptForm); |
||||
this.$emit("input", false); |
||||
}, |
||||
close() { |
||||
this.$emit("input", false); |
||||
this.$emit("close"); |
||||
}, |
||||
//重置 |
||||
reset() { |
||||
this.acceptForm = {} |
||||
this.categoryId = '' |
||||
this.professionalCategoryId = '' |
||||
this.professionalId = '' |
||||
this.categoryName = '' |
||||
this.$nextTick(() => { |
||||
this.$emit("finsh", this.acceptForm); |
||||
this.$emit("input", false); |
||||
}) |
||||
}, |
||||
}, |
||||
}; |
||||
</script> |
||||
<style lang="scss" scoped> |
||||
@font-face { |
||||
font-family: 'iconfont'; /* Project id 2729410 */ |
||||
src: url('https://at.alicdn.com/t/font_2729410_3nhq3ibbcqg.woff2?t=1628330097695') format('woff2'), |
||||
url('https://at.alicdn.com/t/font_2729410_3nhq3ibbcqg.woff?t=1628330097695') format('woff'), |
||||
url('https://at.alicdn.com/t/font_2729410_3nhq3ibbcqg.ttf?t=1628330097695') format('truetype'); |
||||
} |
||||
.saasIcon { |
||||
font-family: "iconfont" !important; |
||||
font-style: normal; |
||||
-webkit-font-smoothing: antialiased; |
||||
-webkit-text-stroke-width: 0.2px; |
||||
-moz-osx-font-smoothing: grayscale; |
||||
} |
||||
.filter-popup { |
||||
color: #000000; |
||||
.top-title { |
||||
font-weight: bold; |
||||
height: 90rpx; |
||||
margin-left: 70rpx; |
||||
font-size: 30rpx; |
||||
margin-top: 20rpx; |
||||
.popup-title { |
||||
height: 100%; |
||||
} |
||||
.saasIcon { |
||||
// width: 150rpx; |
||||
height: 100%; |
||||
padding-right: 70rpx; |
||||
} |
||||
} |
||||
.select-scroll { |
||||
} |
||||
.category-wrap { |
||||
display: flex; |
||||
align-items: center; |
||||
margin-top: 10rpx; |
||||
.icon { |
||||
margin-left: 10rpx; |
||||
} |
||||
} |
||||
.category { |
||||
font-size: 28rpx; |
||||
} |
||||
.select-main { |
||||
padding: 0 32rpx; |
||||
.select-item { |
||||
.title { |
||||
font-weight: bold; |
||||
font-size: 28rpx; |
||||
color: #000000; |
||||
padding-top: 30rpx; |
||||
} |
||||
.tag-list { |
||||
display: flex; |
||||
flex-wrap: wrap; |
||||
margin-left: -12rpx; |
||||
.tag-item { |
||||
margin-top: 20rpx; |
||||
padding: 10rpx 40rpx; |
||||
font-size: 26rpx; |
||||
background: #f5f5f5; |
||||
color: #484848; |
||||
border-radius: 36rpx; |
||||
margin-left: 12rpx; |
||||
&.select-on { |
||||
background: var(--color); |
||||
color: #fff; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
.select-childer { |
||||
.childer-title { |
||||
color: #484848; |
||||
font-size: 28rpx; |
||||
border-bottom: 1px solid #f5f5f5; |
||||
height: 80rpx; |
||||
} |
||||
} |
||||
} |
||||
.filter-button { |
||||
width: 100%; |
||||
height: 152rpx; |
||||
background: #ffffff; |
||||
box-shadow: 0px -3px 12px rgba(0, 0, 0, 0.06); |
||||
position: fixed; |
||||
bottom: 0; |
||||
.btn { |
||||
border-radius: 100rpx; |
||||
margin-top: 26rpx; |
||||
width: 680rpx; |
||||
height: 80rpx; |
||||
color: #ffffff; |
||||
font-size: 28rpx; |
||||
overflow: hidden; |
||||
.btn-1 { |
||||
flex: 1; |
||||
background: linear-gradient(271deg, #2698fb 0%, #84c6ff 100%); |
||||
} |
||||
.btn-2 { |
||||
flex: 1; |
||||
background: linear-gradient(90deg, #0066ff 0%, #1371ff 100%); |
||||
} |
||||
} |
||||
} |
||||
|
||||
// 自定义css |
||||
.flex-row { |
||||
display: flex; |
||||
} |
||||
|
||||
.flex-row-c { |
||||
display: flex; |
||||
justify-content: center; |
||||
} |
||||
|
||||
.flex-row--c { |
||||
display: flex; |
||||
align-items: center; |
||||
} |
||||
|
||||
.flex-row-c-c { |
||||
display: flex; |
||||
justify-content: center; |
||||
align-items: center; |
||||
} |
||||
|
||||
.flex-row-sb-c { |
||||
display: flex; |
||||
justify-content: space-between; |
||||
align-items: center; |
||||
} |
||||
|
||||
.flex-row-sb-t { |
||||
display: flex; |
||||
justify-content: space-between; |
||||
align-items: flex-start; |
||||
} |
||||
|
||||
.flex-row-sb-b { |
||||
display: flex; |
||||
justify-content: space-between; |
||||
align-items: flex-end; |
||||
} |
||||
|
||||
.flex-row-c-sb { |
||||
display: flex; |
||||
justify-content: center; |
||||
align-items: space-between; |
||||
} |
||||
|
||||
.flex-row-sb { |
||||
display: flex; |
||||
justify-content: space-between; |
||||
} |
||||
|
||||
.flex-row-l { |
||||
display: flex; |
||||
justify-content: flex-start; |
||||
} |
||||
|
||||
.flex-row-l-c { |
||||
display: flex; |
||||
justify-content: flex-start; |
||||
align-items: center; |
||||
} |
||||
|
||||
.flex-row-c-t { |
||||
display: flex; |
||||
justify-content: center; |
||||
align-items: flex-start; |
||||
} |
||||
|
||||
.flex-row-r-c { |
||||
display: flex; |
||||
justify-content: flex-end; |
||||
align-items: center; |
||||
} |
||||
|
||||
.flex-row-r { |
||||
display: flex; |
||||
justify-content: flex-end; |
||||
} |
||||
|
||||
.flex-row--b { |
||||
display: flex; |
||||
align-items: flex-end; |
||||
} |
||||
|
||||
.flex-col { |
||||
display: flex; |
||||
flex-direction: column; |
||||
} |
||||
|
||||
.flex-col-c { |
||||
display: flex; |
||||
flex-direction: column; |
||||
justify-content: center; |
||||
} |
||||
|
||||
.flex-col--c { |
||||
display: flex; |
||||
flex-direction: column; |
||||
align-items: center; |
||||
} |
||||
|
||||
.flex-col-c-c { |
||||
display: flex; |
||||
flex-direction: column; |
||||
justify-content: center; |
||||
align-items: center; |
||||
} |
||||
|
||||
.flex-col-sb-c { |
||||
display: flex; |
||||
flex-direction: column; |
||||
justify-content: space-between; |
||||
align-items: center; |
||||
} |
||||
|
||||
.flex-col-c-sb { |
||||
display: flex; |
||||
flex-direction: column; |
||||
justify-content: center; |
||||
align-items: space-between; |
||||
} |
||||
|
||||
.flex-col-sb { |
||||
display: flex; |
||||
flex-direction: column; |
||||
justify-content: space-between; |
||||
} |
||||
|
||||
.flex-col-t-c { |
||||
display: flex; |
||||
flex-direction: column; |
||||
justify-content: flex-start; |
||||
align-items: center; |
||||
} |
||||
|
||||
.flex-col-c-l { |
||||
display: flex; |
||||
flex-direction: column; |
||||
justify-content: center; |
||||
align-items: flex-start; |
||||
} |
||||
|
||||
.flex-col-t { |
||||
display: flex; |
||||
flex-direction: column; |
||||
justify-content: flex-start; |
||||
} |
||||
|
||||
.flex-col-b { |
||||
display: flex; |
||||
flex-direction: column; |
||||
justify-content: flex-end; |
||||
} |
||||
|
||||
.flex-col-b-c { |
||||
display: flex; |
||||
flex-direction: column; |
||||
justify-content: flex-end; |
||||
align-items: center; |
||||
} |
||||
|
||||
.flex-col-c-l { |
||||
display: flex; |
||||
flex-direction: column; |
||||
justify-content: center; |
||||
align-items: flex-end; |
||||
} |
||||
|
||||
.flex-col--l { |
||||
display: flex; |
||||
flex-direction: column; |
||||
align-items: flex-start; |
||||
} |
||||
|
||||
.flex-col--r { |
||||
display: flex; |
||||
flex-direction: column; |
||||
align-items: flex-end; |
||||
} |
||||
} |
||||
</style> |
@ -0,0 +1,26 @@ |
||||
<template> |
||||
<view class="per-mask"> |
||||
<view class="mask"></view> |
||||
<view class="texts"> |
||||
<view class="text">权限审核中,可联系下方平台运营加快审核进度</view> |
||||
<image class="qrcode" src="https://occupationlab.com/images/customer.png" mode="widthFix"></image> |
||||
</view> |
||||
</view> |
||||
</template> |
||||
|
||||
<script> |
||||
export default { |
||||
data() { |
||||
return { |
||||
|
||||
} |
||||
}, |
||||
methods: { |
||||
|
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<style scoped lang="scss"> |
||||
|
||||
</style> |
@ -0,0 +1,10 @@ |
||||
/** |
||||
/** |
||||
* 产品 配置文件 |
||||
* @author yujialong |
||||
*/ |
||||
|
||||
export default { |
||||
normalIcon: 'https://huoran.oss-cn-shenzhen.aliyuncs.com/20220609/png/1534733700683030528.png', // 通用图标
|
||||
dataIcon: 'https://huoran.oss-cn-shenzhen.aliyuncs.com/20220627/png/1541256164447641600.png' // 数据图标
|
||||
} |
@ -0,0 +1,21 @@ |
||||
/** |
||||
/** |
||||
* 请求配置文件 |
||||
* @author yujialong |
||||
*/ |
||||
|
||||
export default { |
||||
baseURL: 'https://huorantech.cn/', |
||||
// baseURL: 'http://192.168.31.152:9000/',
|
||||
// baseURL: 'http://121.37.12.51/',
|
||||
headers: { |
||||
'Content-Type': 'application/json;charset=UTF-8' |
||||
}, |
||||
data: {}, |
||||
method: 'POST', |
||||
responseType: 'json', // 响应数据类型
|
||||
withCredentials: false, // 携带cookie
|
||||
// ======================== 以下为注入axios的配置项 =============================
|
||||
showLoading: true, // 是否显示加载动画
|
||||
isFormData: false // 是否序列化表单数据
|
||||
} |
@ -0,0 +1,14 @@ |
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta charset="UTF-8" /> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
||||
<title></title> |
||||
<!--preload-links--> |
||||
<!--app-context--> |
||||
</head> |
||||
<body> |
||||
<div id="app"><!--app-html--></div> |
||||
<script type="module" src="/main.js"></script> |
||||
</body> |
||||
</html> |
@ -0,0 +1,35 @@ |
||||
var crypto = require('crypto') |
||||
|
||||
function WXBizDataCrypt(appId, sessionKey) { |
||||
this.appId = appId |
||||
this.sessionKey = sessionKey |
||||
} |
||||
|
||||
WXBizDataCrypt.prototype.decryptData = function (encryptedData, iv) { |
||||
// base64 decode
|
||||
var sessionKey = new Buffer(this.sessionKey, 'base64') |
||||
encryptedData = new Buffer(encryptedData, 'base64') |
||||
iv = new Buffer(iv, 'base64') |
||||
|
||||
try { |
||||
// 解密
|
||||
var decipher = crypto.createDecipheriv('aes-128-cbc', sessionKey, iv) |
||||
// 设置自动 padding 为 true,删除填充补位
|
||||
decipher.setAutoPadding(true) |
||||
var decoded = decipher.update(encryptedData, 'binary', 'utf8') |
||||
decoded += decipher.final('utf8') |
||||
|
||||
decoded = JSON.parse(decoded) |
||||
|
||||
} catch (err) { |
||||
throw new Error('Illegal Buffer') |
||||
} |
||||
|
||||
if (decoded.watermark.appid !== this.appId) { |
||||
throw new Error('Illegal Buffer') |
||||
} |
||||
|
||||
return decoded |
||||
} |
||||
|
||||
module.exports = WXBizDataCrypt |
@ -0,0 +1,39 @@ |
||||
/** |
||||
* @file 百度移动统计配置文件 |
||||
*/ |
||||
|
||||
module.exports = { |
||||
/** |
||||
* 从百度移动统计获取的AppKey |
||||
* @type {string} |
||||
*/ |
||||
appKey: 'ce2fa79380', |
||||
|
||||
/** |
||||
* 是否使用了插件 |
||||
* @type {boolean} |
||||
*/ |
||||
hasPlugin: false, |
||||
|
||||
/** |
||||
* 是否获取当前的地理位置和速度信息 |
||||
* @type {boolean} |
||||
*/ |
||||
getLocation: false, |
||||
|
||||
/** |
||||
* 是否获取组件滚动信息 |
||||
* @type {boolean} |
||||
*/ |
||||
getComponentScroll: false, |
||||
/** |
||||
* 是否开启了A/B 测试 |
||||
* @type {boolean} |
||||
*/ |
||||
hasABTest: false, |
||||
/** |
||||
* 是否开启热力图功能 |
||||
* @type {boolean} |
||||
*/ |
||||
hasHeatmap: false, |
||||
}; |
@ -0,0 +1,36 @@ |
||||
export default{ |
||||
// 监听用户点击右上角菜单的「转发」按钮时触发的事件
|
||||
onShareAppMessage() { |
||||
// 设置转发的参数
|
||||
return { |
||||
title: "职站商城", |
||||
// path: '',
|
||||
imageUrl: "", |
||||
success: function(res) { |
||||
if (res.errMsg == 'shareAppMessage:ok') { |
||||
console.log("成功", res) |
||||
} |
||||
}, |
||||
fail: function(res) { |
||||
console.log("失败", res) |
||||
} |
||||
} |
||||
}, |
||||
// 分享到朋友圈
|
||||
onShareTimeline:function(res){ |
||||
return { |
||||
title: '职站商城', |
||||
// imageUrl:'/static/image/phone.png',
|
||||
query:''
|
||||
} |
||||
}, |
||||
// 收藏
|
||||
onAddToFavorites:function(res) { |
||||
return { |
||||
title: '职站商城', |
||||
// imageUrl:'/static/image/phone.png',
|
||||
query: '', |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,20 @@ |
||||
|
||||
// #ifdef MP-WEIXIN
|
||||
import uma from 'umtrack-wx'; |
||||
uma.init({ |
||||
appKey: '64cc98d5a1a164591b62da3e', // 由友盟分配的APP_KEY
|
||||
useOpenid: true, |
||||
// 使用Openid进行统计,此项为false时将使用友盟+uuid进行用户统计。
|
||||
// 使用Openid来统计微信小程序的用户,会使统计的指标更为准确,对系统准确性要求高的应用推荐使用Openid
|
||||
autoGetOpenid: true, |
||||
// 使用openid进行统计时,是否授权友盟自动获取Openid,
|
||||
// 如若需要,请到友盟后台"设置管理-应用信息"(https://mp.umeng.com/setting/appset)中设置appId及secret
|
||||
debug: true,// 是否打开调试模式
|
||||
uploadUserInfo: true, // 自动上传用户信息,设为false取消上传,默认为false
|
||||
enableVerify: true |
||||
}); |
||||
uma.install = function(Vue) { |
||||
Vue.prototype.$uma = uma; |
||||
} |
||||
export default uma; |
||||
// #endif
|
@ -0,0 +1,124 @@ |
||||
import Product from '@/config/product' |
||||
|
||||
const files = [ |
||||
'https://huorantech.cn/%E7%94%A8%E6%88%B7%E6%9C%8D%E5%8A%A1%E5%8D%8F%E8%AE%AE.docx', // 用户服务协议
|
||||
'https://huorantech.cn/%E7%94%A8%E6%88%B7%E9%9A%90%E7%A7%81%E5%8D%8F%E8%AE%AE.docx', // 用户隐私协议
|
||||
'https://huorantech.cn/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E5%AE%9E%E9%AA%8C%E5%AE%A4%E5%BB%BA%E8%AE%BE%E6%96%B9%E6%A1%88-2020.1.docx', // 人工智能
|
||||
'https://huorantech.cn/%E5%A4%A7%E6%95%B0%E6%8D%AE%E7%AE%A1%E7%90%86%E4%B8%8E%E5%BA%94%E7%94%A8%E4%B8%93%E4%B8%9A%E5%BB%BA%E8%AE%BE%E6%96%B9%E6%A1%88.docx', // 大数据
|
||||
'https://huorantech.cn/%E9%87%91%E8%9E%8D%E7%A7%91%E6%8A%80%E5%AE%9E%E9%AA%8C%E5%AE%A4%E5%BB%BA%E8%AE%BE%E6%96%B9%E6%A1%88V2.0.docx', // 金融科技
|
||||
] |
||||
const docExts = ['doc', 'xls', 'ppt', 'pdf', 'docx', 'xlsx', 'pptx'] |
||||
export default { |
||||
// 路由跳转
|
||||
to(url) { |
||||
uni.navigateTo({ |
||||
url |
||||
}) |
||||
}, |
||||
// 成功提示
|
||||
sucMsg(title, duration = 1500) { |
||||
uni.showToast({ |
||||
title, |
||||
duration |
||||
}) |
||||
}, |
||||
// 错误提示
|
||||
errMsg(title, duration = 1500) { |
||||
uni.showToast({ |
||||
title, |
||||
icon: 'none', |
||||
duration |
||||
}) |
||||
}, |
||||
// 如果非数字,则返回0
|
||||
handleNaN(val) { |
||||
return isNaN(val) || val == 0 ? '' : val |
||||
}, |
||||
// 小于10,返回0+传入值
|
||||
preZero(val) { |
||||
return val < 10 ? '0' + val : val |
||||
}, |
||||
//返回格式化时间,传参例如:"yyyy-MM-dd hh:mm:ss"
|
||||
formatDate(date, fmt = 'yyyy-MM-dd hh:mm:ss') { |
||||
var date = date ? date : new Date() |
||||
var o = {
|
||||
"M+" : date.getMonth()+1, //月份
|
||||
"d+" : date.getDate(), //日
|
||||
"h+" : date.getHours(), //小时
|
||||
"m+" : date.getMinutes(), //分
|
||||
"s+" : date.getSeconds(), //秒
|
||||
"q+" : Math.floor((date.getMonth()+3)/3), //季度
|
||||
"S" : date.getMilliseconds() //毫秒
|
||||
} |
||||
if(/(y+)/.test(fmt)) { |
||||
fmt=fmt.replace(RegExp.$1, (date.getFullYear()+"").substr(4 - RegExp.$1.length)) |
||||
} |
||||
for(var k in o) { |
||||
if(new RegExp("("+ k +")").test(fmt)){ |
||||
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length))) |
||||
} |
||||
} |
||||
return fmt |
||||
}, |
||||
// 获取商务经理id
|
||||
getBmId(val) { |
||||
return uni.getStorageSync('team').partnerId |
||||
}, |
||||
// 获取商务经理名称
|
||||
getBmName(val) { |
||||
return uni.getStorageSync('team').partnerClassificationName |
||||
}, |
||||
// 返回图标。如果有图标,则直接返回
|
||||
getIcon(e) { |
||||
return e.appletIcon || Product.normalIcon |
||||
}, |
||||
// 判断文件类型是否能够通过uni.openDocument打开(doc, xls, ppt, pdf, docx, xlsx, pptx)
|
||||
isDoc(ext) { |
||||
return docExts.includes(ext) |
||||
}, |
||||
// 预览文档
|
||||
openFile(id) { |
||||
uni.showLoading({ |
||||
title: '加载中', |
||||
mask: true |
||||
}) |
||||
// 下载文件资源到本地
|
||||
uni.downloadFile({ |
||||
url: files[id], |
||||
success: function(res) { |
||||
uni.hideLoading(); |
||||
uni.showLoading({ |
||||
title: '正在打开', |
||||
mask: true |
||||
}) |
||||
// 新开页面打开文档,支持格式:doc, xls, ppt, pdf, docx, xlsx, pptx。
|
||||
uni.openDocument({ |
||||
filePath: res.tempFilePath, |
||||
fileType: 'docx', // 文件类型,指定文件类型打开文件,有效值 doc, xls, ppt, pdf, docx, xlsx, pptx
|
||||
showMenu: true, // 允许出现分享功能
|
||||
success: res => { |
||||
uni.hideLoading() |
||||
}, |
||||
fail: openError => { |
||||
uni.hideLoading() |
||||
} |
||||
}) |
||||
}, |
||||
fail: function(err) { |
||||
uni.hideLoading() |
||||
} |
||||
}) |
||||
}, |
||||
// 产品管理的产品分类(classificationId)有6个,订单管理的产品分类(authority)有5个,后者是由前者决定的,但是id不一样。把产品管理的分类id传入这个函数,即可返回订单的分类id
|
||||
getOrderType(id) { |
||||
if (id == 1 || id == 2) return 1 |
||||
if (id == 3) return 2 |
||||
if (id == 4) return 3 |
||||
if (id == 5) return 0 |
||||
if (id == 6) return 4 |
||||
}, |
||||
// 去掉html标签
|
||||
removeTag(str) { |
||||
return str.replace(/(<[^>]+>)|(( )+)/g , '') |
||||
}, |
||||
} |
@ -0,0 +1,43 @@ |
||||
|
||||
// #ifndef VUE3
|
||||
import Vue from 'vue' |
||||
import App from './App' |
||||
import util from '@/libs/util' |
||||
import uma from './libs/uma' |
||||
import share from './libs/share' |
||||
import mtjWxSdk from './libs/mtj-wx-sdk' |
||||
|
||||
Vue.config.productionTip = false |
||||
Vue.prototype.$util = util |
||||
Vue.use(uma) |
||||
Vue.mixin(share) |
||||
|
||||
App.mpType = 'app' |
||||
|
||||
// 权限控制
|
||||
Vue.prototype.auth = function(text){ |
||||
const auth = uni.getStorageSync('auth') |
||||
if (text && auth && auth.length) { |
||||
const isPermission = auth.includes(text) |
||||
return auth.includes(text) |
||||
} |
||||
// return true
|
||||
} |
||||
|
||||
const app = new Vue({ |
||||
...App, |
||||
share |
||||
}) |
||||
app.$mount() |
||||
// #endif
|
||||
|
||||
// #ifdef VUE3
|
||||
import { createSSRApp } from 'vue' |
||||
import App from './App.vue' |
||||
export function createApp() { |
||||
const app = createSSRApp(App) |
||||
return { |
||||
app |
||||
} |
||||
} |
||||
// #endif
|
@ -0,0 +1,73 @@ |
||||
{ |
||||
"name" : "职站商城", |
||||
"appid" : "__UNI__2E89BA6", |
||||
"description" : "", |
||||
"versionName" : "1.0.0", |
||||
"versionCode" : "100", |
||||
"transformPx" : false, |
||||
"app-plus" : { |
||||
/* 5+App特有相关 */ |
||||
"usingComponents" : true, |
||||
"nvueCompiler" : "uni-app", |
||||
"splashscreen" : { |
||||
"alwaysShowBeforeRender" : true, |
||||
"waiting" : true, |
||||
"autoclose" : true, |
||||
"delay" : 0 |
||||
}, |
||||
"modules" : {}, |
||||
/* 模块配置 */ |
||||
"distribute" : { |
||||
/* 应用发布信息 */ |
||||
"android" : { |
||||
/* android打包配置 */ |
||||
"permissions" : [ |
||||
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>", |
||||
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>", |
||||
"<uses-permission android:name=\"android.permission.VIBRATE\"/>", |
||||
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>", |
||||
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>", |
||||
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>", |
||||
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>", |
||||
"<uses-permission android:name=\"android.permission.CAMERA\"/>", |
||||
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>", |
||||
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>", |
||||
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>", |
||||
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>", |
||||
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>", |
||||
"<uses-feature android:name=\"android.hardware.camera\"/>", |
||||
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>" |
||||
] |
||||
}, |
||||
"ios" : {}, |
||||
/* ios打包配置 */ |
||||
"sdkConfigs" : {} |
||||
} |
||||
}, |
||||
/* SDK配置 */ |
||||
"sdkConfigs" : {}, |
||||
"quickapp" : {}, |
||||
/* 快应用特有相关 */ |
||||
"mp-weixin" : { |
||||
"appid" : "wx2b506fdb0eeee65d", |
||||
"setting" : { |
||||
"urlCheck" : false, |
||||
"es6" : true, |
||||
"minified" : true |
||||
}, |
||||
"usingComponents" : true, |
||||
"optimization" : { |
||||
"subPackages" : true |
||||
}, |
||||
"uniStatistics" : { |
||||
"enable" : false |
||||
} |
||||
}, |
||||
"vueVersion" : "2", |
||||
"uniStatistics" : { |
||||
"version" : "2" |
||||
}, |
||||
"mp-toutiao" : { |
||||
"appid" : "tt2192572fbea04fe601" |
||||
} |
||||
} |
@ -0,0 +1,278 @@ |
||||
<template> |
||||
<view class="wrap"> |
||||
<view class="banner"> |
||||
<image class="pic" :src="form.mall.coverDrawing" mode="widthFix"></image> |
||||
</view> |
||||
|
||||
<view class="info"> |
||||
<view class="line"> |
||||
<view class="label">状态:</view> |
||||
<view class="val">进行中</view> |
||||
</view> |
||||
<view class="line"> |
||||
<view class="label">人数限制:</view> |
||||
<view class="val">进行中</view> |
||||
</view> |
||||
<view class="line"> |
||||
<view class="label">活动地点:</view> |
||||
<view class="val">进行中</view> |
||||
</view> |
||||
<view class="line"> |
||||
<view class="label">主办方:</view> |
||||
<view class="val">进行中</view> |
||||
</view> |
||||
<view class="line"> |
||||
<view class="label">已报名人员:</view> |
||||
<view class="val">进行中</view> |
||||
</view> |
||||
</view> |
||||
|
||||
<ul class="tab"> |
||||
<li v-for="(tab, i) in tabs" :class="{active: curTab === tab.id}" @click="tabChange(tab)">{{ tab.name }}</li> |
||||
</ul> |
||||
|
||||
<view v-if="!curTab" class="detail"> |
||||
|
||||
</view> |
||||
<view v-else class="list"> |
||||
|
||||
</view> |
||||
</view> |
||||
</template> |
||||
|
||||
<script> |
||||
import { detailsOfGoods, addToShoppingCart, shoppingCartList, productCategoryList } from '@/apis/modules/product.js' |
||||
export default { |
||||
data() { |
||||
return { |
||||
id: '', |
||||
curTab: 0, |
||||
tabs: [ |
||||
{ |
||||
name: '活动详情', |
||||
id: 0 |
||||
}, |
||||
{ |
||||
name: '活动通知', |
||||
id: 1 |
||||
}, |
||||
{ |
||||
name: '已报名人员', |
||||
id: 2 |
||||
} |
||||
], |
||||
form: { |
||||
classificationIds: [], |
||||
interfaceDiagram: [], |
||||
mall: { |
||||
coverDrawing: '' |
||||
}, |
||||
goodsRes: {}, |
||||
mallAnnex: [] |
||||
}, |
||||
shopCartTotal: 0, |
||||
types: [], |
||||
dotsStyles: { |
||||
backgroundColor: 'rgba(83, 200, 249,0.3)', |
||||
border: '1px rgba(83, 200, 249,0.3) solid', |
||||
color: '#fff', |
||||
selectedBackgroundColor: 'rgba(83, 200, 249,0.9)', |
||||
selectedBorder: '1px rgba(83, 200, 249,0.9) solid' |
||||
}, |
||||
mpStyle: { |
||||
p: 'font-size: 25rpx !important;font-family: Microsoft Yahei !important;font-weight: 400 !important;color: #333 !important;', |
||||
span: 'font-size: 25rpx !important;font-family: Microsoft Yahei !important;font-weight: 400 !important;color: #333 !important;' |
||||
} |
||||
} |
||||
}, |
||||
onShow() { |
||||
const pages = getCurrentPages() |
||||
const { options } = pages[pages.length - 1] |
||||
this.id = options.id |
||||
this.getInfo() |
||||
this.getShopCart() |
||||
this.getTypes() |
||||
}, |
||||
methods: { |
||||
// 获取详情 |
||||
getInfo() { |
||||
uni.showLoading({ |
||||
title: '加载中' |
||||
}) |
||||
detailsOfGoods(this.id).then(res => { |
||||
const e = res.orderDetails |
||||
e.mall.productIntroduction = this.$util.removeTag(e.mall.productIntroduction) |
||||
// e.mall.detailedIntroduction = this.$util.removeTag(e.mall.detailedIntroduction) |
||||
this.form = e |
||||
const pics = this.form.mall.interfaceDiagram |
||||
if (pics) { |
||||
this.form.interfaceDiagram = pics.split(',') |
||||
// this.tabs.push({ |
||||
// name: '界面图', |
||||
// id: 1 |
||||
// }) |
||||
} |
||||
// this.form.mallAnnex && this.form.mallAnnex.length && this.tabs.push({ |
||||
// name: '参数', |
||||
// id: 2 |
||||
// }) |
||||
uni.hideLoading() |
||||
}).catch(e => { |
||||
uni.hideLoading() |
||||
}) |
||||
}, |
||||
// 获取购物车数量 |
||||
getShopCart() { |
||||
shoppingCartList({ |
||||
pageNum: 1, |
||||
pageSize: 1000, |
||||
}).then(({ data }) => { |
||||
this.shopCartTotal = data.total |
||||
}).catch(e => {}) |
||||
}, |
||||
// 产品分类 |
||||
getTypes() { |
||||
productCategoryList().then(res => { |
||||
this.types = res.classificationList |
||||
}).catch(e => {}) |
||||
}, |
||||
// tab切换 |
||||
tabChange(id) { |
||||
this.curTab = id |
||||
}, |
||||
// 下载全部 |
||||
downloadAll() { |
||||
const fileName = [] |
||||
const urls = [] |
||||
this.form.mallAnnex.forEach(e => { |
||||
fileName.push(e.fileName) |
||||
urls.push(e.filePath) |
||||
}) |
||||
uni.setStorageSync('files', { |
||||
copyWriting: this.form.mall.productName, |
||||
fileName, |
||||
urls |
||||
}) |
||||
this.$util.to(`/team/send/send`) |
||||
}, |
||||
// 下载附件 |
||||
download(item) { |
||||
uni.setStorageSync('files', { |
||||
copyWriting: this.form.mall.productName, |
||||
fileName: [item.fileName], |
||||
urls: [item.filePath] |
||||
}) |
||||
this.$util.to(`/team/send/send`) |
||||
}, |
||||
// 加入购物车 |
||||
addShop() { |
||||
uni.showLoading({ |
||||
title: '加载中' |
||||
}) |
||||
addToShoppingCart({ |
||||
mallId: this.id |
||||
}).then(res => { |
||||
this.$util.sucMsg('加购成功') |
||||
uni.hideLoading() |
||||
this.getShopCart() |
||||
}).catch(e => { |
||||
uni.hideLoading() |
||||
}) |
||||
}, |
||||
// 下单 |
||||
order() { |
||||
const { mall } = this.form |
||||
const classificationId = this.form.classificationIds[0] |
||||
const authority = this.$util.getOrderType(classificationId) |
||||
// 把该产品添加至缓存 |
||||
uni.setStorageSync('courses', [{ |
||||
dataOrCourseId: mall.associatedProduct, // id |
||||
mallId: mall.mallId, |
||||
productName: mall.productName, // 名称 |
||||
periodOfUse: '', // 使用期限 |
||||
startTime: this.$util.formatDate(new Date(), 'yyyy-MM-dd'), // 开始 |
||||
endTime: '', // 终止 |
||||
remainingPeriod: '', // 剩余期限 |
||||
marketValue: '', // 市场价 |
||||
marketPrice: mall.marketUnitPrice, // 市场单价 |
||||
finalPrice: 0, // 成交价 |
||||
finalValue: 0, // 成交单价(数据产品特有) |
||||
discountRate: '0%', // 折扣率 |
||||
accountNum: 1, // 账号数 |
||||
totalAmount: '', // 总价 |
||||
isEnable: 0, // 启用否:1启用,0禁用 |
||||
ship: 0, // 发货否(0未发货,1已发货,默认不发货) |
||||
authority, // 区分权限 |
||||
options: 2, |
||||
miniProgramPictureAddress: mall.appletIcon || '', // 图标 |
||||
settlementPrice: 0, // 结算价 |
||||
settlementPriceUnit: 0, // 结算单价 |
||||
serviceFee: 0 // 平台服务费(前端计算后展示,不入库) |
||||
}]) |
||||
this.$util.to(`../orderDetail/orderDetail?shopCart=1`) |
||||
} |
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<style scoped lang="scss"> |
||||
.wrap { |
||||
padding-bottom: 140rpx; |
||||
} |
||||
.banner { |
||||
.pic { |
||||
width: 100%; |
||||
} |
||||
} |
||||
.info { |
||||
position: relative; |
||||
padding: 20rpx; |
||||
margin: -150rpx 30rpx 30rpx; |
||||
background-color: #fff; |
||||
border-radius: 8px; |
||||
.line { |
||||
display: flex; |
||||
align-items: center; |
||||
margin: 20rpx 0; |
||||
} |
||||
.label { |
||||
width: 180rpx; |
||||
font-size: 28rpx; |
||||
} |
||||
.val { |
||||
font-size: 28rpx; |
||||
font-weight: 600; |
||||
color: #333; |
||||
} |
||||
} |
||||
.tabs { |
||||
display: flex; |
||||
justify-content: center; |
||||
margin-bottom: 32rpx; |
||||
li { |
||||
width: 33.33%; |
||||
text-align: center; |
||||
font-size: 28rpx; |
||||
color: #333; |
||||
white-space: nowrap; |
||||
} |
||||
.active { |
||||
color: #007EFF; |
||||
&:after { |
||||
content: ''; |
||||
display: block; |
||||
width: 40rpx; |
||||
height: 8rpx; |
||||
margin: 18rpx auto 0; |
||||
border-radius: 4px; |
||||
background-color: #007EFF; |
||||
} |
||||
} |
||||
} |
||||
.detail { |
||||
padding: 34rpx 32rpx; |
||||
margin: 16rpx 0; |
||||
border-radius: 20px; |
||||
background-color: #fff; |
||||
} |
||||
</style> |
@ -0,0 +1,324 @@ |
||||
<template> |
||||
<view class="wrap"> |
||||
<view class="banner-wrap bg-wh"> |
||||
<view class="pic-wrap"> |
||||
<image class="pic" :src="form.mall.coverDrawing" mode="widthFix"></image> |
||||
<view class="pro-title">{{ form.mall.productName }}</view> |
||||
</view> |
||||
</view> |
||||
|
||||
<view class="detail"> |
||||
<ul class="tabs"> |
||||
<li :class="{active: curTab === 0}" @click="tabChange(0)">主页</li> |
||||
<li :class="{active: curTab === 1, disabled: !form.interfaceDiagram}" @click="tabChange(1)">商品</li> |
||||
</ul> |
||||
</view> |
||||
|
||||
<view v-if="!curTab" class="detail"> |
||||
<view class="title">公司简介</view> |
||||
</view> |
||||
<view v-else class="list"> |
||||
<view class="item"> |
||||
<image class="pic" src="@/static/image/info-bg.jpg"></image> |
||||
<view class="texts"> |
||||
<view class="name">测试标题</view> |
||||
<view class="price">¥12.8</view> |
||||
</view> |
||||
</view> |
||||
<view class="item"> |
||||
<image class="pic" src="@/static/image/info-bg.jpg"></image> |
||||
<view class="texts"> |
||||
<view class="name">测试标题</view> |
||||
<view class="price">¥12.8</view> |
||||
</view> |
||||
</view> |
||||
<view class="item"> |
||||
<image class="pic" src="@/static/image/info-bg.jpg"></image> |
||||
<view class="texts"> |
||||
<view class="name">测试标题</view> |
||||
<view class="price">¥12.8</view> |
||||
</view> |
||||
</view> |
||||
<view class="item"> |
||||
<image class="pic" src="@/static/image/info-bg.jpg"></image> |
||||
<view class="texts"> |
||||
<view class="name">测试标题</view> |
||||
<view class="price">¥12.8</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</template> |
||||
|
||||
<script> |
||||
import { detailsOfGoods, addToShoppingCart, shoppingCartList, productCategoryList } from '@/apis/modules/product.js' |
||||
export default { |
||||
data() { |
||||
return { |
||||
id: '', |
||||
curTab: 0, |
||||
tabs: [ |
||||
{ |
||||
name: '详情介绍', |
||||
id: 0 |
||||
}, |
||||
{ |
||||
name: '界面图', |
||||
id: 1 |
||||
}, |
||||
{ |
||||
name: '参数', |
||||
id: 2 |
||||
} |
||||
], |
||||
form: { |
||||
classificationIds: [], |
||||
interfaceDiagram: [], |
||||
mall: { |
||||
coverDrawing: '' |
||||
}, |
||||
goodsRes: {}, |
||||
mallAnnex: [] |
||||
}, |
||||
shopCartTotal: 0, |
||||
types: [], |
||||
dotsStyles: { |
||||
backgroundColor: 'rgba(83, 200, 249,0.3)', |
||||
border: '1px rgba(83, 200, 249,0.3) solid', |
||||
color: '#fff', |
||||
selectedBackgroundColor: 'rgba(83, 200, 249,0.9)', |
||||
selectedBorder: '1px rgba(83, 200, 249,0.9) solid' |
||||
}, |
||||
mpStyle: { |
||||
p: 'font-size: 25rpx !important;font-family: Microsoft Yahei !important;font-weight: 400 !important;color: #333 !important;', |
||||
span: 'font-size: 25rpx !important;font-family: Microsoft Yahei !important;font-weight: 400 !important;color: #333 !important;' |
||||
} |
||||
} |
||||
}, |
||||
onShow() { |
||||
const pages = getCurrentPages() |
||||
const { options } = pages[pages.length - 1] |
||||
this.id = options.id |
||||
this.getInfo() |
||||
this.getShopCart() |
||||
this.getTypes() |
||||
}, |
||||
methods: { |
||||
// 获取详情 |
||||
getInfo() { |
||||
uni.showLoading({ |
||||
title: '加载中' |
||||
}) |
||||
detailsOfGoods(this.id).then(res => { |
||||
const e = res.orderDetails |
||||
e.mall.productIntroduction = this.$util.removeTag(e.mall.productIntroduction) |
||||
// e.mall.detailedIntroduction = this.$util.removeTag(e.mall.detailedIntroduction) |
||||
this.form = e |
||||
const pics = this.form.mall.interfaceDiagram |
||||
if (pics) { |
||||
this.form.interfaceDiagram = pics.split(',') |
||||
// this.tabs.push({ |
||||
// name: '界面图', |
||||
// id: 1 |
||||
// }) |
||||
} |
||||
// this.form.mallAnnex && this.form.mallAnnex.length && this.tabs.push({ |
||||
// name: '参数', |
||||
// id: 2 |
||||
// }) |
||||
uni.hideLoading() |
||||
}).catch(e => { |
||||
uni.hideLoading() |
||||
}) |
||||
}, |
||||
// 获取购物车数量 |
||||
getShopCart() { |
||||
shoppingCartList({ |
||||
pageNum: 1, |
||||
pageSize: 1000, |
||||
}).then(({ data }) => { |
||||
this.shopCartTotal = data.total |
||||
}).catch(e => {}) |
||||
}, |
||||
// 产品分类 |
||||
getTypes() { |
||||
productCategoryList().then(res => { |
||||
this.types = res.classificationList |
||||
}).catch(e => {}) |
||||
}, |
||||
// tab切换 |
||||
tabChange(id) { |
||||
this.curTab = id |
||||
}, |
||||
// 下载全部 |
||||
downloadAll() { |
||||
const fileName = [] |
||||
const urls = [] |
||||
this.form.mallAnnex.forEach(e => { |
||||
fileName.push(e.fileName) |
||||
urls.push(e.filePath) |
||||
}) |
||||
uni.setStorageSync('files', { |
||||
copyWriting: this.form.mall.productName, |
||||
fileName, |
||||
urls |
||||
}) |
||||
this.$util.to(`/team/send/send`) |
||||
}, |
||||
// 下载附件 |
||||
download(item) { |
||||
uni.setStorageSync('files', { |
||||
copyWriting: this.form.mall.productName, |
||||
fileName: [item.fileName], |
||||
urls: [item.filePath] |
||||
}) |
||||
this.$util.to(`/team/send/send`) |
||||
}, |
||||
// 加入购物车 |
||||
addShop() { |
||||
uni.showLoading({ |
||||
title: '加载中' |
||||
}) |
||||
addToShoppingCart({ |
||||
mallId: this.id |
||||
}).then(res => { |
||||
this.$util.sucMsg('加购成功') |
||||
uni.hideLoading() |
||||
this.getShopCart() |
||||
}).catch(e => { |
||||
uni.hideLoading() |
||||
}) |
||||
}, |
||||
// 下单 |
||||
order() { |
||||
const { mall } = this.form |
||||
const classificationId = this.form.classificationIds[0] |
||||
const authority = this.$util.getOrderType(classificationId) |
||||
// 把该产品添加至缓存 |
||||
uni.setStorageSync('courses', [{ |
||||
dataOrCourseId: mall.associatedProduct, // id |
||||
mallId: mall.mallId, |
||||
productName: mall.productName, // 名称 |
||||
periodOfUse: '', // 使用期限 |
||||
startTime: this.$util.formatDate(new Date(), 'yyyy-MM-dd'), // 开始 |
||||
endTime: '', // 终止 |
||||
remainingPeriod: '', // 剩余期限 |
||||
marketValue: '', // 市场价 |
||||
marketPrice: mall.marketUnitPrice, // 市场单价 |
||||
finalPrice: 0, // 成交价 |
||||
finalValue: 0, // 成交单价(数据产品特有) |
||||
discountRate: '0%', // 折扣率 |
||||
accountNum: 1, // 账号数 |
||||
totalAmount: '', // 总价 |
||||
isEnable: 0, // 启用否:1启用,0禁用 |
||||
ship: 0, // 发货否(0未发货,1已发货,默认不发货) |
||||
authority, // 区分权限 |
||||
options: 2, |
||||
miniProgramPictureAddress: mall.appletIcon || '', // 图标 |
||||
settlementPrice: 0, // 结算价 |
||||
settlementPriceUnit: 0, // 结算单价 |
||||
serviceFee: 0 // 平台服务费(前端计算后展示,不入库) |
||||
}]) |
||||
this.$util.to(`../orderDetail/orderDetail?shopCart=1`) |
||||
} |
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<style scoped lang="scss"> |
||||
.wrap { |
||||
padding-bottom: 140rpx; |
||||
} |
||||
.banner-wrap { |
||||
width: 100%; |
||||
border-radius: 0px 0px 20px 20px; |
||||
.pic-wrap { |
||||
padding: 20rpx 32rpx; |
||||
border-bottom: 1px solid #E2E2E2; |
||||
} |
||||
.pic { |
||||
width: 100%; |
||||
} |
||||
.pro-title { |
||||
margin-top: 22rpx; |
||||
font-size: 30rpx; |
||||
font-weight: 600; |
||||
color: #333; |
||||
} |
||||
.fields { |
||||
padding: 26rpx 32rpx; |
||||
} |
||||
.field { |
||||
display: flex; |
||||
align-items: center; |
||||
font-size: 28rpx; |
||||
color: #333; |
||||
&:first-child { |
||||
margin-bottom: 22rpx; |
||||
} |
||||
.icon { |
||||
width: 36rpx; |
||||
height: 36rpx; |
||||
margin-right: 12rpx ; |
||||
} |
||||
} |
||||
} |
||||
.tabs { |
||||
display: flex; |
||||
justify-content: center; |
||||
margin-bottom: 32rpx; |
||||
li { |
||||
width: 33.33%; |
||||
text-align: center; |
||||
font-size: 28rpx; |
||||
color: #333; |
||||
white-space: nowrap; |
||||
} |
||||
.active { |
||||
color: #007EFF; |
||||
&:after { |
||||
content: ''; |
||||
display: block; |
||||
width: 40rpx; |
||||
height: 8rpx; |
||||
margin: 18rpx auto 0; |
||||
border-radius: 4px; |
||||
background-color: #007EFF; |
||||
} |
||||
} |
||||
} |
||||
.detail { |
||||
padding: 34rpx 32rpx; |
||||
margin: 16rpx 0; |
||||
border-radius: 20px; |
||||
background-color: #fff; |
||||
} |
||||
.list { |
||||
display: flex; |
||||
flex-wrap: wrap; |
||||
padding: 0 10rpx; |
||||
.item { |
||||
width: calc((100% - 40rpx) / 2); |
||||
margin: 20rpx 10rpx; |
||||
background-color: #fff; |
||||
border-radius: 8px; |
||||
overflow: hidden; |
||||
} |
||||
.pic { |
||||
width: 100%; |
||||
height: 200rpx; |
||||
} |
||||
.texts { |
||||
padding: 20rpx; |
||||
} |
||||
.name { |
||||
margin-bottom: 10rpx; |
||||
font-size: 30rpx; |
||||
font-weight: 600; |
||||
} |
||||
.price { |
||||
font-size: 26rpx; |
||||
color: #ff0047; |
||||
} |
||||
} |
||||
</style> |
@ -0,0 +1,777 @@ |
||||
{ |
||||
"name": "筛选 菜单 筛选菜单 上拉筛选 ", |
||||
"version": "1.0.4", |
||||
"lockfileVersion": 1, |
||||
"requires": true, |
||||
"dependencies": { |
||||
"ajv": { |
||||
"version": "6.12.6", |
||||
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", |
||||
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", |
||||
"requires": { |
||||
"fast-deep-equal": "^3.1.1", |
||||
"fast-json-stable-stringify": "^2.0.0", |
||||
"json-schema-traverse": "^0.4.1", |
||||
"uri-js": "^4.2.2" |
||||
} |
||||
}, |
||||
"ajv-errors": { |
||||
"version": "1.0.1", |
||||
"resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", |
||||
"integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" |
||||
}, |
||||
"ajv-keywords": { |
||||
"version": "3.5.2", |
||||
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", |
||||
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" |
||||
}, |
||||
"ansi-colors": { |
||||
"version": "3.2.4", |
||||
"resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", |
||||
"integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" |
||||
}, |
||||
"aproba": { |
||||
"version": "1.2.0", |
||||
"resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", |
||||
"integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" |
||||
}, |
||||
"array-union": { |
||||
"version": "1.0.2", |
||||
"resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", |
||||
"integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", |
||||
"requires": { |
||||
"array-uniq": "^1.0.1" |
||||
} |
||||
}, |
||||
"array-uniq": { |
||||
"version": "1.0.3", |
||||
"resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", |
||||
"integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==" |
||||
}, |
||||
"balanced-match": { |
||||
"version": "1.0.2", |
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", |
||||
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" |
||||
}, |
||||
"big.js": { |
||||
"version": "5.2.2", |
||||
"resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", |
||||
"integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" |
||||
}, |
||||
"bluebird": { |
||||
"version": "3.7.2", |
||||
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", |
||||
"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" |
||||
}, |
||||
"brace-expansion": { |
||||
"version": "1.1.11", |
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", |
||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", |
||||
"requires": { |
||||
"balanced-match": "^1.0.0", |
||||
"concat-map": "0.0.1" |
||||
} |
||||
}, |
||||
"buffer-from": { |
||||
"version": "1.1.2", |
||||
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", |
||||
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" |
||||
}, |
||||
"cacache": { |
||||
"version": "11.3.3", |
||||
"resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", |
||||
"integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", |
||||
"requires": { |
||||
"bluebird": "^3.5.5", |
||||
"chownr": "^1.1.1", |
||||
"figgy-pudding": "^3.5.1", |
||||
"glob": "^7.1.4", |
||||
"graceful-fs": "^4.1.15", |
||||
"lru-cache": "^5.1.1", |
||||
"mississippi": "^3.0.0", |
||||
"mkdirp": "^0.5.1", |
||||
"move-concurrently": "^1.0.1", |
||||
"promise-inflight": "^1.0.1", |
||||
"rimraf": "^2.6.3", |
||||
"ssri": "^6.0.1", |
||||
"unique-filename": "^1.1.1", |
||||
"y18n": "^4.0.0" |
||||
} |
||||
}, |
||||
"chownr": { |
||||
"version": "1.1.4", |
||||
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", |
||||
"integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" |
||||
}, |
||||
"commondir": { |
||||
"version": "1.0.1", |
||||
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", |
||||
"integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" |
||||
}, |
||||
"concat-map": { |
||||
"version": "0.0.1", |
||||
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", |
||||
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" |
||||
}, |
||||
"concat-stream": { |
||||
"version": "1.6.2", |
||||
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", |
||||
"integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", |
||||
"requires": { |
||||
"buffer-from": "^1.0.0", |
||||
"inherits": "^2.0.3", |
||||
"readable-stream": "^2.2.2", |
||||
"typedarray": "^0.0.6" |
||||
} |
||||
}, |
||||
"copy-concurrently": { |
||||
"version": "1.0.5", |
||||
"resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", |
||||
"integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", |
||||
"requires": { |
||||
"aproba": "^1.1.1", |
||||
"fs-write-stream-atomic": "^1.0.8", |
||||
"iferr": "^0.1.5", |
||||
"mkdirp": "^0.5.1", |
||||
"rimraf": "^2.5.4", |
||||
"run-queue": "^1.0.0" |
||||
} |
||||
}, |
||||
"copy-webpack-plugin": { |
||||
"version": "5.0.3", |
||||
"resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.0.3.tgz", |
||||
"integrity": "sha512-PlZRs9CUMnAVylZq+vg2Juew662jWtwOXOqH4lbQD9ZFhRG9R7tVStOgHt21CBGVq7k5yIJaz8TXDLSjV+Lj8Q==", |
||||
"requires": { |
||||
"cacache": "^11.3.2", |
||||
"find-cache-dir": "^2.1.0", |
||||
"glob-parent": "^3.1.0", |
||||
"globby": "^7.1.1", |
||||
"is-glob": "^4.0.1", |
||||
"loader-utils": "^1.2.3", |
||||
"minimatch": "^3.0.4", |
||||
"normalize-path": "^3.0.0", |
||||
"p-limit": "^2.2.0", |
||||
"schema-utils": "^1.0.0", |
||||
"serialize-javascript": "^1.7.0", |
||||
"webpack-log": "^2.0.0" |
||||
} |
||||
}, |
||||
"core-util-is": { |
||||
"version": "1.0.3", |
||||
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", |
||||
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" |
||||
}, |
||||
"cyclist": { |
||||
"version": "1.0.1", |
||||
"resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", |
||||
"integrity": "sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==" |
||||
}, |
||||
"dir-glob": { |
||||
"version": "2.2.2", |
||||
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", |
||||
"integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", |
||||
"requires": { |
||||
"path-type": "^3.0.0" |
||||
} |
||||
}, |
||||
"duplexify": { |
||||
"version": "3.7.1", |
||||
"resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", |
||||
"integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", |
||||
"requires": { |
||||
"end-of-stream": "^1.0.0", |
||||
"inherits": "^2.0.1", |
||||
"readable-stream": "^2.0.0", |
||||
"stream-shift": "^1.0.0" |
||||
} |
||||
}, |
||||
"emojis-list": { |
||||
"version": "3.0.0", |
||||
"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", |
||||
"integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" |
||||
}, |
||||
"end-of-stream": { |
||||
"version": "1.4.4", |
||||
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", |
||||
"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", |
||||
"requires": { |
||||
"once": "^1.4.0" |
||||
} |
||||
}, |
||||
"fast-deep-equal": { |
||||
"version": "3.1.3", |
||||
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", |
||||
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" |
||||
}, |
||||
"fast-json-stable-stringify": { |
||||
"version": "2.1.0", |
||||
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", |
||||
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" |
||||
}, |
||||
"figgy-pudding": { |
||||
"version": "3.5.2", |
||||
"resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", |
||||
"integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" |
||||
}, |
||||
"find-cache-dir": { |
||||
"version": "2.1.0", |
||||
"resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", |
||||
"integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", |
||||
"requires": { |
||||
"commondir": "^1.0.1", |
||||
"make-dir": "^2.0.0", |
||||
"pkg-dir": "^3.0.0" |
||||
} |
||||
}, |
||||
"find-up": { |
||||
"version": "3.0.0", |
||||
"resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", |
||||
"integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", |
||||
"requires": { |
||||
"locate-path": "^3.0.0" |
||||
} |
||||
}, |
||||
"flush-write-stream": { |
||||
"version": "1.1.1", |
||||
"resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", |
||||
"integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", |
||||
"requires": { |
||||
"inherits": "^2.0.3", |
||||
"readable-stream": "^2.3.6" |
||||
} |
||||
}, |
||||
"from2": { |
||||
"version": "2.3.0", |
||||
"resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", |
||||
"integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", |
||||
"requires": { |
||||
"inherits": "^2.0.1", |
||||
"readable-stream": "^2.0.0" |
||||
} |
||||
}, |
||||
"fs-write-stream-atomic": { |
||||
"version": "1.0.10", |
||||
"resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", |
||||
"integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", |
||||
"requires": { |
||||
"graceful-fs": "^4.1.2", |
||||
"iferr": "^0.1.5", |
||||
"imurmurhash": "^0.1.4", |
||||
"readable-stream": "1 || 2" |
||||
} |
||||
}, |
||||
"fs.realpath": { |
||||
"version": "1.0.0", |
||||
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", |
||||
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" |
||||
}, |
||||
"glob": { |
||||
"version": "7.2.3", |
||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", |
||||
"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", |
||||
"requires": { |
||||
"fs.realpath": "^1.0.0", |
||||
"inflight": "^1.0.4", |
||||
"inherits": "2", |
||||
"minimatch": "^3.1.1", |
||||
"once": "^1.3.0", |
||||
"path-is-absolute": "^1.0.0" |
||||
} |
||||
}, |
||||
"glob-parent": { |
||||
"version": "3.1.0", |
||||
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", |
||||
"integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", |
||||
"requires": { |
||||
"is-glob": "^3.1.0", |
||||
"path-dirname": "^1.0.0" |
||||
}, |
||||
"dependencies": { |
||||
"is-glob": { |
||||
"version": "3.1.0", |
||||
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", |
||||
"integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", |
||||
"requires": { |
||||
"is-extglob": "^2.1.0" |
||||
} |
||||
} |
||||
} |
||||
}, |
||||
"globby": { |
||||
"version": "7.1.1", |
||||
"resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", |
||||
"integrity": "sha512-yANWAN2DUcBtuus5Cpd+SKROzXHs2iVXFZt/Ykrfz6SAXqacLX25NZpltE+39ceMexYF4TtEadjuSTw8+3wX4g==", |
||||
"requires": { |
||||
"array-union": "^1.0.1", |
||||
"dir-glob": "^2.0.0", |
||||
"glob": "^7.1.2", |
||||
"ignore": "^3.3.5", |
||||
"pify": "^3.0.0", |
||||
"slash": "^1.0.0" |
||||
}, |
||||
"dependencies": { |
||||
"pify": { |
||||
"version": "3.0.0", |
||||
"resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", |
||||
"integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==" |
||||
} |
||||
} |
||||
}, |
||||
"graceful-fs": { |
||||
"version": "4.2.10", |
||||
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", |
||||
"integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" |
||||
}, |
||||
"iferr": { |
||||
"version": "0.1.5", |
||||
"resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", |
||||
"integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==" |
||||
}, |
||||
"ignore": { |
||||
"version": "3.3.10", |
||||
"resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", |
||||
"integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" |
||||
}, |
||||
"imurmurhash": { |
||||
"version": "0.1.4", |
||||
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", |
||||
"integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" |
||||
}, |
||||
"inflight": { |
||||
"version": "1.0.6", |
||||
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", |
||||
"integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", |
||||
"requires": { |
||||
"once": "^1.3.0", |
||||
"wrappy": "1" |
||||
} |
||||
}, |
||||
"inherits": { |
||||
"version": "2.0.4", |
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", |
||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" |
||||
}, |
||||
"is-extglob": { |
||||
"version": "2.1.1", |
||||
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", |
||||
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" |
||||
}, |
||||
"is-glob": { |
||||
"version": "4.0.3", |
||||
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", |
||||
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", |
||||
"requires": { |
||||
"is-extglob": "^2.1.1" |
||||
} |
||||
}, |
||||
"isarray": { |
||||
"version": "1.0.0", |
||||
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", |
||||
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" |
||||
}, |
||||
"json-schema-traverse": { |
||||
"version": "0.4.1", |
||||
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", |
||||
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" |
||||
}, |
||||
"json5": { |
||||
"version": "1.0.2", |
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", |
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", |
||||
"requires": { |
||||
"minimist": "^1.2.0" |
||||
} |
||||
}, |
||||
"loader-utils": { |
||||
"version": "1.4.2", |
||||
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", |
||||
"integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", |
||||
"requires": { |
||||
"big.js": "^5.2.2", |
||||
"emojis-list": "^3.0.0", |
||||
"json5": "^1.0.1" |
||||
} |
||||
}, |
||||
"locate-path": { |
||||
"version": "3.0.0", |
||||
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", |
||||
"integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", |
||||
"requires": { |
||||
"p-locate": "^3.0.0", |
||||
"path-exists": "^3.0.0" |
||||
} |
||||
}, |
||||
"lru-cache": { |
||||
"version": "5.1.1", |
||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", |
||||
"integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", |
||||
"requires": { |
||||
"yallist": "^3.0.2" |
||||
} |
||||
}, |
||||
"make-dir": { |
||||
"version": "2.1.0", |
||||
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", |
||||
"integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", |
||||
"requires": { |
||||
"pify": "^4.0.1", |
||||
"semver": "^5.6.0" |
||||
} |
||||
}, |
||||
"minimatch": { |
||||
"version": "3.1.2", |
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", |
||||
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", |
||||
"requires": { |
||||
"brace-expansion": "^1.1.7" |
||||
} |
||||
}, |
||||
"minimist": { |
||||
"version": "1.2.8", |
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", |
||||
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" |
||||
}, |
||||
"mississippi": { |
||||
"version": "3.0.0", |
||||
"resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", |
||||
"integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", |
||||
"requires": { |
||||
"concat-stream": "^1.5.0", |
||||
"duplexify": "^3.4.2", |
||||
"end-of-stream": "^1.1.0", |
||||
"flush-write-stream": "^1.0.0", |
||||
"from2": "^2.1.0", |
||||
"parallel-transform": "^1.1.0", |
||||
"pump": "^3.0.0", |
||||
"pumpify": "^1.3.3", |
||||
"stream-each": "^1.1.0", |
||||
"through2": "^2.0.0" |
||||
} |
||||
}, |
||||
"mkdirp": { |
||||
"version": "0.5.6", |
||||
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", |
||||
"integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", |
||||
"requires": { |
||||
"minimist": "^1.2.6" |
||||
} |
||||
}, |
||||
"move-concurrently": { |
||||
"version": "1.0.1", |
||||
"resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", |
||||
"integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", |
||||
"requires": { |
||||
"aproba": "^1.1.1", |
||||
"copy-concurrently": "^1.0.0", |
||||
"fs-write-stream-atomic": "^1.0.8", |
||||
"mkdirp": "^0.5.1", |
||||
"rimraf": "^2.5.4", |
||||
"run-queue": "^1.0.3" |
||||
} |
||||
}, |
||||
"normalize-path": { |
||||
"version": "3.0.0", |
||||
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", |
||||
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" |
||||
}, |
||||
"once": { |
||||
"version": "1.4.0", |
||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", |
||||
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", |
||||
"requires": { |
||||
"wrappy": "1" |
||||
} |
||||
}, |
||||
"p-limit": { |
||||
"version": "2.3.0", |
||||
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", |
||||
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", |
||||
"requires": { |
||||
"p-try": "^2.0.0" |
||||
} |
||||
}, |
||||
"p-locate": { |
||||
"version": "3.0.0", |
||||
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", |
||||
"integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", |
||||
"requires": { |
||||
"p-limit": "^2.0.0" |
||||
} |
||||
}, |
||||
"p-try": { |
||||
"version": "2.2.0", |
||||
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", |
||||
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" |
||||
}, |
||||
"parallel-transform": { |
||||
"version": "1.2.0", |
||||
"resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", |
||||
"integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", |
||||
"requires": { |
||||
"cyclist": "^1.0.1", |
||||
"inherits": "^2.0.3", |
||||
"readable-stream": "^2.1.5" |
||||
} |
||||
}, |
||||
"path-dirname": { |
||||
"version": "1.0.2", |
||||
"resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", |
||||
"integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==" |
||||
}, |
||||
"path-exists": { |
||||
"version": "3.0.0", |
||||
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", |
||||
"integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" |
||||
}, |
||||
"path-is-absolute": { |
||||
"version": "1.0.1", |
||||
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", |
||||
"integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" |
||||
}, |
||||
"path-type": { |
||||
"version": "3.0.0", |
||||
"resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", |
||||
"integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", |
||||
"requires": { |
||||
"pify": "^3.0.0" |
||||
}, |
||||
"dependencies": { |
||||
"pify": { |
||||
"version": "3.0.0", |
||||
"resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", |
||||
"integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==" |
||||
} |
||||
} |
||||
}, |
||||
"pify": { |
||||
"version": "4.0.1", |
||||
"resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", |
||||
"integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" |
||||
}, |
||||
"pkg-dir": { |
||||
"version": "3.0.0", |
||||
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", |
||||
"integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", |
||||
"requires": { |
||||
"find-up": "^3.0.0" |
||||
} |
||||
}, |
||||
"process-nextick-args": { |
||||
"version": "2.0.1", |
||||
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", |
||||
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" |
||||
}, |
||||
"promise-inflight": { |
||||
"version": "1.0.1", |
||||
"resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", |
||||
"integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" |
||||
}, |
||||
"pump": { |
||||
"version": "3.0.0", |
||||
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", |
||||
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", |
||||
"requires": { |
||||
"end-of-stream": "^1.1.0", |
||||
"once": "^1.3.1" |
||||
} |
||||
}, |
||||
"pumpify": { |
||||
"version": "1.5.1", |
||||
"resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", |
||||
"integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", |
||||
"requires": { |
||||
"duplexify": "^3.6.0", |
||||
"inherits": "^2.0.3", |
||||
"pump": "^2.0.0" |
||||
}, |
||||
"dependencies": { |
||||
"pump": { |
||||
"version": "2.0.1", |
||||
"resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", |
||||
"integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", |
||||
"requires": { |
||||
"end-of-stream": "^1.1.0", |
||||
"once": "^1.3.1" |
||||
} |
||||
} |
||||
} |
||||
}, |
||||
"punycode": { |
||||
"version": "2.3.0", |
||||
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", |
||||
"integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" |
||||
}, |
||||
"readable-stream": { |
||||
"version": "2.3.7", |
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", |
||||
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", |
||||
"requires": { |
||||
"core-util-is": "~1.0.0", |
||||
"inherits": "~2.0.3", |
||||
"isarray": "~1.0.0", |
||||
"process-nextick-args": "~2.0.0", |
||||
"safe-buffer": "~5.1.1", |
||||
"string_decoder": "~1.1.1", |
||||
"util-deprecate": "~1.0.1" |
||||
} |
||||
}, |
||||
"rimraf": { |
||||
"version": "2.7.1", |
||||
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", |
||||
"integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", |
||||
"requires": { |
||||
"glob": "^7.1.3" |
||||
} |
||||
}, |
||||
"run-queue": { |
||||
"version": "1.0.3", |
||||
"resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", |
||||
"integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", |
||||
"requires": { |
||||
"aproba": "^1.1.1" |
||||
} |
||||
}, |
||||
"safe-buffer": { |
||||
"version": "5.1.2", |
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", |
||||
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" |
||||
}, |
||||
"schema-utils": { |
||||
"version": "1.0.0", |
||||
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", |
||||
"integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", |
||||
"requires": { |
||||
"ajv": "^6.1.0", |
||||
"ajv-errors": "^1.0.0", |
||||
"ajv-keywords": "^3.1.0" |
||||
} |
||||
}, |
||||
"semver": { |
||||
"version": "5.7.1", |
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", |
||||
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" |
||||
}, |
||||
"serialize-javascript": { |
||||
"version": "1.9.1", |
||||
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", |
||||
"integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==" |
||||
}, |
||||
"slash": { |
||||
"version": "1.0.0", |
||||
"resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", |
||||
"integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==" |
||||
}, |
||||
"ssri": { |
||||
"version": "6.0.2", |
||||
"resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", |
||||
"integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", |
||||
"requires": { |
||||
"figgy-pudding": "^3.5.1" |
||||
} |
||||
}, |
||||
"stream-each": { |
||||
"version": "1.2.3", |
||||
"resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", |
||||
"integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", |
||||
"requires": { |
||||
"end-of-stream": "^1.1.0", |
||||
"stream-shift": "^1.0.0" |
||||
} |
||||
}, |
||||
"stream-shift": { |
||||
"version": "1.0.1", |
||||
"resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", |
||||
"integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" |
||||
}, |
||||
"string_decoder": { |
||||
"version": "1.1.1", |
||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", |
||||
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", |
||||
"requires": { |
||||
"safe-buffer": "~5.1.0" |
||||
} |
||||
}, |
||||
"through2": { |
||||
"version": "2.0.5", |
||||
"resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", |
||||
"integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", |
||||
"requires": { |
||||
"readable-stream": "~2.3.6", |
||||
"xtend": "~4.0.1" |
||||
} |
||||
}, |
||||
"typedarray": { |
||||
"version": "0.0.6", |
||||
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", |
||||
"integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" |
||||
}, |
||||
"umtrack-wx": { |
||||
"version": "2.8.0", |
||||
"resolved": "https://registry.npmjs.org/umtrack-wx/-/umtrack-wx-2.8.0.tgz", |
||||
"integrity": "sha512-F5ul+Q7bDJ6MDrn9ysPAyB9nyP1vCxLGUBkSJ4uvknt8rjmX4tqy1IUnJuWKj9ZH2BtkjRFpldQXJSlLDOYfhQ==" |
||||
}, |
||||
"unique-filename": { |
||||
"version": "1.1.1", |
||||
"resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", |
||||
"integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", |
||||
"requires": { |
||||
"unique-slug": "^2.0.0" |
||||
} |
||||
}, |
||||
"unique-slug": { |
||||
"version": "2.0.2", |
||||
"resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", |
||||
"integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", |
||||
"requires": { |
||||
"imurmurhash": "^0.1.4" |
||||
} |
||||
}, |
||||
"uri-js": { |
||||
"version": "4.4.1", |
||||
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", |
||||
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", |
||||
"requires": { |
||||
"punycode": "^2.1.0" |
||||
} |
||||
}, |
||||
"util-deprecate": { |
||||
"version": "1.0.2", |
||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", |
||||
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" |
||||
}, |
||||
"uuid": { |
||||
"version": "3.4.0", |
||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", |
||||
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" |
||||
}, |
||||
"webpack-log": { |
||||
"version": "2.0.0", |
||||
"resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", |
||||
"integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", |
||||
"requires": { |
||||
"ansi-colors": "^3.0.0", |
||||
"uuid": "^3.3.2" |
||||
} |
||||
}, |
||||
"wrappy": { |
||||
"version": "1.0.2", |
||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", |
||||
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" |
||||
}, |
||||
"xtend": { |
||||
"version": "4.0.2", |
||||
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", |
||||
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" |
||||
}, |
||||
"y18n": { |
||||
"version": "4.0.3", |
||||
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", |
||||
"integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" |
||||
}, |
||||
"yallist": { |
||||
"version": "3.1.1", |
||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", |
||||
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,16 @@ |
||||
{ |
||||
"id": "filter-popup", |
||||
"name": "筛选 菜单 筛选菜单 上拉筛选 ", |
||||
"version": "1.0.4", |
||||
"description": "筛选菜单,支持单选和多选 , 选择后的数据通过.sync双向绑定,全端支持 导入即用", |
||||
"keywords": [ |
||||
"筛选", |
||||
"菜单", |
||||
"筛选菜单", |
||||
"上拉筛选" |
||||
], |
||||
"dependencies": { |
||||
"copy-webpack-plugin": "^5.0.3", |
||||
"umtrack-wx": "^2.8.0" |
||||
} |
||||
} |
@ -0,0 +1,222 @@ |
||||
{ |
||||
"pages": [ |
||||
{ |
||||
"path" : "pages/login/login", |
||||
"style" : |
||||
{ |
||||
"navigationBarTitleText": "登录", |
||||
"enablePullDownRefresh": false |
||||
} |
||||
}, |
||||
{ |
||||
"path" : "pages/index/index", |
||||
"style" : |
||||
{ |
||||
"enablePullDownRefresh": false |
||||
} |
||||
}, |
||||
{ |
||||
"path" : "pages/supplier/supplier", |
||||
"style" : |
||||
{ |
||||
"navigationBarTitleText": "供应商", |
||||
"enablePullDownRefresh": false |
||||
} |
||||
}, |
||||
{ |
||||
"path" : "pages/shop/shop", |
||||
"style" : |
||||
{ |
||||
"navigationBarTitleText": "商城", |
||||
"enablePullDownRefresh": false |
||||
} |
||||
}, |
||||
{ |
||||
"path" : "pages/person/person", |
||||
"style" : |
||||
{ |
||||
"navigationBarTitleText": "我的", |
||||
"navigationStyle": "custom", |
||||
"enablePullDownRefresh": false |
||||
} |
||||
} |
||||
,{ |
||||
"path" : "pages/reg/reg", |
||||
"style" : |
||||
{ |
||||
"navigationBarTitleText": "", |
||||
"enablePullDownRefresh": false |
||||
} |
||||
|
||||
} |
||||
], |
||||
"subPackages": [ |
||||
{ |
||||
"root": "order", |
||||
"pages": [ |
||||
{ |
||||
"path" : "supplierDetail/supplierDetail", |
||||
"style" : |
||||
{ |
||||
"navigationBarTitleText": "供应商详情", |
||||
"enablePullDownRefresh": false |
||||
} |
||||
}, |
||||
{ |
||||
"path" : "activityDetail/activityDetail", |
||||
"style" : |
||||
{ |
||||
"navigationBarTitleText" : "活动详情", |
||||
"enablePullDownRefresh" : false |
||||
} |
||||
} |
||||
] |
||||
}, |
||||
{ |
||||
"root": "team", |
||||
"pages": [ |
||||
{ |
||||
"path" : "setting/setting", |
||||
"style" : |
||||
{ |
||||
"navigationBarTitleText": "设置", |
||||
"enablePullDownRefresh": false |
||||
} |
||||
}, |
||||
{ |
||||
"path" : "password/password", |
||||
"style" : |
||||
{ |
||||
"navigationBarTitleText": "修改密码", |
||||
"enablePullDownRefresh": false |
||||
} |
||||
}, |
||||
{ |
||||
"path" : "teams/teams", |
||||
"style" : |
||||
{ |
||||
"navigationBarTitleText": "团队", |
||||
"enablePullDownRefresh": true |
||||
} |
||||
}, |
||||
{ |
||||
"path" : "addStaff/addStaff", |
||||
"style" : |
||||
{ |
||||
"navigationBarTitleText": "邀请成员", |
||||
"enablePullDownRefresh": false |
||||
} |
||||
}, |
||||
{ |
||||
"path" : "account/account", |
||||
"style" : |
||||
{ |
||||
"navigationBarTitleText": "修改账号", |
||||
"enablePullDownRefresh": false |
||||
} |
||||
} |
||||
,{ |
||||
"path" : "phone/phone", |
||||
"style" : |
||||
{ |
||||
"navigationBarTitleText": "修改手机号", |
||||
"enablePullDownRefresh": false |
||||
} |
||||
} |
||||
,{ |
||||
"path" : "email/email", |
||||
"style" : |
||||
{ |
||||
"navigationBarTitleText": "修改邮箱", |
||||
"enablePullDownRefresh": false |
||||
} |
||||
} |
||||
,{ |
||||
"path" : "qrcode/qrcode", |
||||
"style" : |
||||
{ |
||||
"navigationBarTitleText": "邀请加入", |
||||
"enablePullDownRefresh": false |
||||
} |
||||
} |
||||
,{ |
||||
"path" : "article/article", |
||||
"style" : |
||||
{ |
||||
"navigationBarTitleText": "学习", |
||||
"navigationBarTextStyle": "black", |
||||
"navigationBarBackgroundColor": "#fff", |
||||
"enablePullDownRefresh": false |
||||
} |
||||
} |
||||
,{ |
||||
"path" : "scheme/scheme", |
||||
"style" : |
||||
{ |
||||
"navigationBarTitleText": "方案详情", |
||||
"enablePullDownRefresh": false |
||||
} |
||||
}, |
||||
{ |
||||
"path" : "send/send", |
||||
"style" : |
||||
{ |
||||
"navigationBarTitleText": "下载发送", |
||||
"enablePullDownRefresh": false |
||||
} |
||||
} |
||||
] |
||||
} |
||||
], |
||||
"preloadRule": { |
||||
"pages/index/index": { |
||||
"network": "all", |
||||
"packages": ["order"] |
||||
} |
||||
}, |
||||
"condition": { //模式配置,仅开发期间生效 |
||||
"current": 0, //当前激活的模式(list 的索引项) |
||||
"list": [{ |
||||
"name": "test", //模式名称 |
||||
"path": "pages/login/login" //启动页面,必选 |
||||
}] |
||||
}, |
||||
"globalStyle": { |
||||
"navigationBarTextStyle": "white", |
||||
"navigationBarTitleText": "幼教产业B2B产业平台", |
||||
"navigationBarBackgroundColor": "#007EFF", |
||||
"backgroundColor": "#f5f5f5", |
||||
"app-plus": { |
||||
"background": "#efeff4" |
||||
} |
||||
}, |
||||
"tabBar": { |
||||
"color": "#B8B9B8", |
||||
"selectedColor": "#007FFF", |
||||
"borderStyle": "white", |
||||
"backgroundColor": "#ffffff", |
||||
"fontSize": "22px", |
||||
"iconWidth": "20px", |
||||
"list": [{ |
||||
"pagePath": "pages/index/index", |
||||
"iconPath": "static/image/tab1.png", |
||||
"selectedIconPath": "static/image/tab1-1.png", |
||||
"text": "首页" |
||||
}, { |
||||
"pagePath": "pages/supplier/supplier", |
||||
"iconPath": "static/image/tab2.png", |
||||
"selectedIconPath": "static/image/tab2-1.png", |
||||
"text": "供应商" |
||||
},{ |
||||
"pagePath": "pages/shop/shop", |
||||
"iconPath": "static/image/tab3.png", |
||||
"selectedIconPath": "static/image/tab3-1.png", |
||||
"text": "商城" |
||||
}, { |
||||
"pagePath": "pages/person/person", |
||||
"iconPath": "static/image/tab4.png", |
||||
"selectedIconPath": "static/image/tab4-1.png", |
||||
"text": "我的" |
||||
}] |
||||
} |
||||
} |
@ -0,0 +1,211 @@ |
||||
<template> |
||||
<view :class="[{oh: !per}]"> |
||||
<view class="page"> |
||||
<view class="search-wrap"> |
||||
<uni-search-bar class="search" radius="30" placeholder="请输入" v-model="keyword" clearButton="auto" cancelButton="none" @confirm="searchConfirm" /> |
||||
<view> |
||||
<uni-icons type="notification" size="20"></uni-icons> |
||||
</view> |
||||
</view> |
||||
|
||||
<view class="banner"> |
||||
<image class="pic" src="@/static/image/index/banner.png" mode="widthFix"></image> |
||||
</view> |
||||
|
||||
|
||||
<view class="block"> |
||||
<view class="title-wrap"> |
||||
<view class="title">爆款推荐</view> |
||||
</view> |
||||
|
||||
<image class="pic" src="@/static/image/info-bg.jpg" mode="widthFix"></image> |
||||
</view> |
||||
|
||||
<view class="block"> |
||||
<view class="title">活动速递</view> |
||||
<ul class="tab"> |
||||
<li v-for="(tab, i) in tabs" :class="{active: curTab === tab.id}" @click="tabChange(tab)">{{ tab.name }}</li> |
||||
</ul> |
||||
<view class="list"> |
||||
<view v-for="(item, i) in hotProducts" :key="i" class="item" @click="toDetail(item)"> |
||||
<image class="pic" src="@/static/image/info-bg.jpg"></image> |
||||
<view class="texts"> |
||||
<view class="name ell">{{ item.productName }}</view> |
||||
<view class="des ell">{{ item.tagsName }}</view> |
||||
<view class="meta">{{ item.marketUnitPrice }}元/年</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
<view v-if="!per" class="per-mask">功能升级中,敬请期待...</view> |
||||
</view> |
||||
</template> |
||||
|
||||
<script> |
||||
import { getUserRolesPermissionMenu } from '@/apis/modules/user.js' |
||||
import { tagsList, listOfGoods, shoppingCartList } from '@/apis/modules/product.js' |
||||
import { getTeamsByAccountId } from '@/apis/modules/client.js' |
||||
export default { |
||||
data() { |
||||
return { |
||||
per: true, // 是否有权限 |
||||
teamId: uni.getStorageSync('teamId') || '', |
||||
list: [], |
||||
keyword: '', |
||||
tags: [], |
||||
hotProducts: [], |
||||
offcialProducts: [], |
||||
total: 0, |
||||
curTab: 0, |
||||
tabs: [ |
||||
{ |
||||
name: '全部', |
||||
id: 0 |
||||
}, |
||||
{ |
||||
name: '论坛', |
||||
id: 1 |
||||
} |
||||
], |
||||
} |
||||
}, |
||||
onShow() { |
||||
this.keyword = '' |
||||
this.per = true |
||||
this.getProducts() |
||||
}, |
||||
methods: { |
||||
// 初始化权限 |
||||
initRole() { |
||||
if (!uni.getStorageSync('auth').includes('首页')) { |
||||
this.per = false |
||||
} |
||||
this.getProducts() |
||||
}, |
||||
// 产品 |
||||
getProducts() { |
||||
// 热销产品 |
||||
listOfGoods({ |
||||
pageNum: 1, |
||||
pageSize: 5, |
||||
sort: 1, |
||||
isShelves: 0, |
||||
hotTag: 1 |
||||
}).then(({ page }) => { |
||||
page.records.forEach(e => { |
||||
e.productIntroduction = this.$util.removeTag(e.productIntroduction) |
||||
}) |
||||
this.hotProducts = page.records |
||||
}).catch(e => {}) |
||||
}, |
||||
// 模糊查询回调 |
||||
searchConfirm(e) { |
||||
e.value && this.$util.to(`/order/products/products?keyword=${e.value}`) |
||||
}, |
||||
// 跳转学习详情 |
||||
toDetail(item) { |
||||
this.$util.to('/order/activityDetail/activityDetail?id=' + item.mallId) |
||||
}, |
||||
// tab切换 |
||||
tabChange(tab) { |
||||
this.curTab = tab.id |
||||
// this.initList() |
||||
}, |
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<style scoped lang="scss"> |
||||
.page { |
||||
position: relative; |
||||
box-sizing: border-box; |
||||
background-color: #fff; |
||||
border-top-left-radius: 16px; |
||||
border-top-right-radius: 16px; |
||||
} |
||||
.banner { |
||||
position: relative; |
||||
.pic { |
||||
width: 100%; |
||||
} |
||||
} |
||||
.search-wrap { |
||||
display: flex; |
||||
justify-content: space-between; |
||||
align-items: center; |
||||
padding: 0 10rpx; |
||||
.search { |
||||
flex: 1; |
||||
} |
||||
} |
||||
.all { |
||||
font-size: 24rpx; |
||||
border-radius: 20px; |
||||
} |
||||
.block { |
||||
margin: 20rpx 0; |
||||
.title-wrap { |
||||
display: flex; |
||||
justify-content: space-between; |
||||
margin-bottom: 34rpx; |
||||
} |
||||
.title { |
||||
display: inline-flex; |
||||
align-items: center; |
||||
font-size: 28rpx; |
||||
font-weight: 600; |
||||
color: #333; |
||||
} |
||||
} |
||||
.list { |
||||
.item { |
||||
display: flex; |
||||
align-items: center; |
||||
margin-bottom: 28rpx; |
||||
} |
||||
.pic { |
||||
width: 220rpx; |
||||
height: 140rpx; |
||||
margin-right: 20rpx; |
||||
border-radius: 8px; |
||||
} |
||||
.texts { |
||||
width: calc(100% - 240rpx); |
||||
} |
||||
.name { |
||||
font-size: 28rpx; |
||||
font-weight: 600; |
||||
color: #333; |
||||
} |
||||
.des { |
||||
margin: 10rpx 0; |
||||
font-size: 22rpx; |
||||
color: #666; |
||||
} |
||||
.meta { |
||||
display: flex; |
||||
align-items: center; |
||||
font-size: 24rpx; |
||||
color: #2E2D31; |
||||
.icon { |
||||
width: 32rpx; |
||||
height: 32rpx; |
||||
margin-right: 12rpx; |
||||
} |
||||
text { |
||||
width: 330rpx; |
||||
} |
||||
} |
||||
} |
||||
.plus { |
||||
bottom: 140rpx; |
||||
right: 60rpx; |
||||
.icon { |
||||
width: 106rpx; |
||||
} |
||||
.uni-badge { |
||||
font-size: 32rpx; |
||||
} |
||||
} |
||||
</style> |
@ -0,0 +1,328 @@ |
||||
<template> |
||||
<view class="page"> |
||||
<view class="wrap"> |
||||
<!-- <image class="logo" src="@/static/image/logo.png" mode="widthFix"></image> --> |
||||
<view class="hello">幼教产业B2B产业平台登录</view> |
||||
<template v-if="isLogin"> |
||||
<button class="btn phone" open-type="getPhoneNumber" @getphonenumber="onGetPhoneNumber"> |
||||
<image src="@/static/image/phone.png" mode="widthFix"></image> |
||||
{{ isReg ? '获取手机号' : '绑定手机'}} |
||||
</button> |
||||
</template> |
||||
<template v-else> |
||||
<view class="btn wechat" @click="login"> |
||||
快捷登录 |
||||
</view> |
||||
</template> |
||||
<view class="tips">如果没有账号会自动创建账号</view> |
||||
|
||||
<view class="agree"> |
||||
<uni-data-checkbox class="check" multiple v-model="agree" :localdata="agreeData"></uni-data-checkbox> |
||||
<text @click="toAgreement(0)">《用户服务协议》</text> |
||||
<text @click="toAgreement(1)">《用户隐私协议》</text> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</template> |
||||
|
||||
<script> |
||||
import { login, userBinding, getSessionKey, queryPartnerAccount } from '@/apis/modules/user.js' |
||||
import WXBizDataCrypt from '@/libs/WXBizDataCrypt' |
||||
export default { |
||||
data() { |
||||
return { |
||||
agree: [], |
||||
agreeData: [{ |
||||
text: '同意', |
||||
value: 1 |
||||
}], |
||||
isLogin: false, // 是否已登录 |
||||
isReg: false, // 是否是注册 |
||||
sessionKey: '', |
||||
openid: '', |
||||
unionid: '', |
||||
submiting: false |
||||
} |
||||
}, |
||||
onShow() { |
||||
// uni.setStorageSync('token', 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyIiwiaWF0IjoxNjg2NzExNTA5LCJleHAiOjE2ODY3NTQ3MDksImFjY291bnRJZCI6IjEyNTU4In0.SX1sNFtb2JiCufgTz3ZmQkcJ-FtVci7Hp0DFd_mVk8E') |
||||
// 先授权用户信息,再授权手机号 |
||||
this.checkLogin() |
||||
}, |
||||
methods: { |
||||
// 检查登录状态 |
||||
checkLogin() { |
||||
if (uni.getStorageSync('token')) { |
||||
this.toIndex() |
||||
} else { |
||||
uni.clearStorageSync() |
||||
this.isLogin = false |
||||
} |
||||
}, |
||||
// 授权用户信息 |
||||
login() { |
||||
this.isReg = false |
||||
if (this.agree.length) { |
||||
if (this.submiting) return false |
||||
const that = this |
||||
uni.getUserProfile({ |
||||
lang: 'zh_CN', |
||||
desc: '登录', |
||||
success: ({ userInfo }) => { |
||||
uni.setStorageSync('userName', userInfo.nickName) |
||||
uni.setStorageSync('avatar', userInfo.avatarUrl) |
||||
uni.login({ |
||||
success: ({ code }) => { |
||||
if (code) { |
||||
this.submiting = true |
||||
login({ |
||||
code, |
||||
avatarUrl: userInfo.avatarUrl |
||||
}).then((res) => { |
||||
const { data, status } = res |
||||
this.submiting = false |
||||
// 用户不存在,则让用户授权手机号,直接去注册 |
||||
if (status == 10028) { |
||||
// 这里需要再调一次uni的login,因为code用过了一次,已经失效了 |
||||
uni.login({ |
||||
success: ({ code }) => { |
||||
getSessionKey({ |
||||
code, |
||||
}).then(({ sessionKey }) => { |
||||
this.sessionKey = sessionKey.session_key |
||||
this.openid = sessionKey.openid |
||||
this.isLogin = true |
||||
}).catch(e => {}) |
||||
this.isReg = true |
||||
} |
||||
}) |
||||
} else { |
||||
const e = data.sessionKey |
||||
this.sessionKey = e.session_key |
||||
this.openid = e.openid |
||||
this.unionid = e.unionid |
||||
uni.setStorageSync('sessionKey', e.session_key) |
||||
uni.setStorageSync('openid', e.openid) |
||||
// 如果没有绑定手机号,则显示绑定按钮,引导用户绑定,否则,直接跳到首页 |
||||
if (data.state === 'login') { |
||||
this.toIndex() |
||||
uni.setStorageSync('token', data.token) |
||||
} else { |
||||
this.isLogin = true |
||||
} |
||||
} |
||||
}).catch(e => { |
||||
this.submiting = false |
||||
}) |
||||
} else { |
||||
this.submiting = false |
||||
that.$util.errMsg('登录失败!') |
||||
} |
||||
} |
||||
}) |
||||
}, |
||||
fail(res) { |
||||
that.$util.errMsg('登录授权失败!') |
||||
} |
||||
}) |
||||
} else { |
||||
this.$util.errMsg('请先阅读勾选协议!') |
||||
} |
||||
}, |
||||
// 绑定手机号 |
||||
onGetPhoneNumber(e){ |
||||
if (this.submiting) return false |
||||
const { encryptedData, iv } = e.detail |
||||
// 获取手机号有两种方法,1.前端使用js完成;2.使用接口完成 |
||||
// const WXBizDataCrypt = require('@/libs/WXBizDataCrypt') |
||||
const accountInfo = uni.getAccountInfoSync() // 获取小程序appid |
||||
const pc = new WXBizDataCrypt(accountInfo.miniProgram.appId , this.sessionKey) |
||||
const data = pc.decryptData(encryptedData , iv) |
||||
this.submiting = true |
||||
const phone = data.phoneNumber |
||||
if (this.isReg) { // 注册 |
||||
this.$util.to(`../reg/reg?openid=${this.openid}&phone=${phone}`) |
||||
} else { // 登录绑定手机号 |
||||
userBinding({ |
||||
openid: this.openid, |
||||
phone, |
||||
unionid: this.unionid, |
||||
platformId: 4 |
||||
}).then(res => { |
||||
const { token, status } = res |
||||
if (status == 10014) { |
||||
// 这里需要再调一次uni的login,因为code用过了一次,已经失效了 |
||||
uni.login({ |
||||
success: ({ code }) => { |
||||
getSessionKey({ |
||||
code, |
||||
}).then(({ sessionKey }) => { |
||||
this.sessionKey = sessionKey.session_key |
||||
this.openid = sessionKey.openid |
||||
this.$util.to(`../reg/reg?openid=${this.openid}&phone=${phone}`) |
||||
}).catch(e => {}) |
||||
this.isReg = true |
||||
} |
||||
}) |
||||
} else { |
||||
this.submiting = false |
||||
uni.setStorageSync('token', token) |
||||
this.toIndex() |
||||
} |
||||
}).catch(e => { |
||||
this.submiting = false |
||||
uni.showToast({ |
||||
title: e.message, |
||||
icon: 'none' |
||||
}) |
||||
}) |
||||
} |
||||
}, |
||||
// 注册申请授权 |
||||
toReg() { |
||||
this.isReg = true |
||||
if (this.agree.length) { |
||||
const that = this |
||||
uni.getUserProfile({ |
||||
lang: 'zh_CN', |
||||
desc: '登录', |
||||
success: ({ userInfo }) => { |
||||
console.log(22, userInfo) |
||||
uni.setStorageSync('userName', userInfo.nickName) |
||||
uni.setStorageSync('avatar', userInfo.avatarUrl) |
||||
uni.login({ |
||||
success: ({ code }) => { |
||||
if (code) { |
||||
this.submiting = true |
||||
getSessionKey({ |
||||
code, |
||||
}).then(({ sessionKey }) => { |
||||
console.log(11, sessionKey) |
||||
this.sessionKey = sessionKey.session_key |
||||
this.openid = sessionKey.openid |
||||
this.submiting = false |
||||
this.isLogin = true |
||||
|
||||
}).catch(e => { |
||||
this.submiting = false |
||||
}) |
||||
} else { |
||||
this.submiting = false |
||||
that.$util.errMsg('登录失败!') |
||||
} |
||||
} |
||||
}) |
||||
}, |
||||
fail(res) { |
||||
that.$util.errMsg('登录授权失败!') |
||||
} |
||||
}) |
||||
} else { |
||||
this.$util.errMsg('请先阅读勾选协议!') |
||||
} |
||||
}, |
||||
toAgreement(id) { |
||||
this.$util.openFile(id) |
||||
}, |
||||
// 跳转到首页 |
||||
toIndex() { |
||||
uni.reLaunch({ |
||||
url: '../index/index' |
||||
}) |
||||
} |
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<style scoped lang="scss"> |
||||
.page { |
||||
min-height: calc(100vh - 170rpx); |
||||
padding-top: 170rpx; |
||||
background: url(@/static/image/login1.png) 0 0/175rpx auto no-repeat, |
||||
url(@/static/image/login2.png) bottom right/123rpx auto no-repeat; |
||||
overflow: hidden; |
||||
} |
||||
.wrap { |
||||
position: relative; |
||||
height: 60vh; |
||||
padding: 214rpx 74rpx 28rpx; |
||||
margin: 0 61rpx; |
||||
text-align: center; |
||||
background-color: #fff; |
||||
border-radius: 20rpx; |
||||
.logo { |
||||
width: 393rpx; |
||||
} |
||||
.hello { |
||||
margin: 36rpx 0; |
||||
font-size: 28rpx; |
||||
color: #333; |
||||
} |
||||
.tips { |
||||
margin-top: 30rpx; |
||||
font-size: 24rpx; |
||||
color: #adadad; |
||||
text-align: right; |
||||
} |
||||
.btn { |
||||
display: flex; |
||||
justify-content: center; |
||||
align-items: center; |
||||
width: 100%; |
||||
height: 88rpx; |
||||
font-size: 32rpx; |
||||
border-radius: 10rpx; |
||||
image { |
||||
width: 50rpx; |
||||
margin-right: 15rpx; |
||||
} |
||||
} |
||||
.wechat { |
||||
margin-bottom: 38rpx; |
||||
color: #fff; |
||||
background-color: #007EFF; |
||||
} |
||||
.phone { |
||||
color: #007EFF; |
||||
border: 1px solid #007EFF; |
||||
background-color: #fff; |
||||
image { |
||||
width: 40rpx; |
||||
} |
||||
} |
||||
.reg { |
||||
font-size: 28rpx; |
||||
color: #e61717; |
||||
text-align: right; |
||||
} |
||||
.agree { |
||||
position: absolute; |
||||
bottom: 28rpx; |
||||
left: 0%; |
||||
display: flex; |
||||
justify-content: center; |
||||
align-items: center; |
||||
width: 100%; |
||||
text-align: center; |
||||
font-size: 24rpx; |
||||
color: #ccc; |
||||
text { |
||||
color: #007EFF; |
||||
} |
||||
} |
||||
/deep/.check { |
||||
.checklist-box { |
||||
margin: 0; |
||||
} |
||||
.checkbox__inner { |
||||
width: 40rpx !important; |
||||
height: 40rpx !important; |
||||
border-radius: 50% !important; |
||||
} |
||||
.checkbox__inner-icon { |
||||
top: 8rpx !important; |
||||
left: 14rpx !important; |
||||
} |
||||
} |
||||
} |
||||
</style> |
@ -0,0 +1,406 @@ |
||||
<template> |
||||
<view class="page"> |
||||
<view class="status-bar"></view> |
||||
<image class="bg" src="@/static/image/person-bg.png"></image> |
||||
<view class="wrap"> |
||||
<view class="info"> |
||||
<button class="avatar-btn" open-type="chooseAvatar" @chooseavatar="onChooseAvatar"> |
||||
<image class="avatar" :src="avatar" mode=""></image> |
||||
</button> |
||||
<view class="text"> |
||||
<view class="name">{{ my.info.userName }}</view> |
||||
<view class="phone">{{ my.info.phone }}</view> |
||||
</view> |
||||
<view v-if="!disabled" class="tag">团队负责人</view> |
||||
</view> |
||||
|
||||
<view class="block"> |
||||
<view class="title">基础功能</view> |
||||
|
||||
<ul class="func"> |
||||
<li v-for="(item, i) in funcs" :key="i" @click="toFunc(item)"> |
||||
<view class="icon"> |
||||
<image src="@/static/image/info-bg.jpg"></image> |
||||
</view> |
||||
<view class="text ell">{{ item.name }}</view> |
||||
</li> |
||||
</ul> |
||||
</view> |
||||
|
||||
<view class="block"> |
||||
<view class="supplier"> |
||||
<view class="title">我是供应商</view> |
||||
<view class="badge">供应商负责人</view> |
||||
<view class="auth">未认证</view> |
||||
</view> |
||||
</view> |
||||
|
||||
|
||||
<view class="block"> |
||||
<view class="title">工作台</view> |
||||
|
||||
<ul class="func"> |
||||
<li v-for="(item, i) in funcs" :key="i" @click="toFunc(item)"> |
||||
<view class="icon"> |
||||
<image src="@/static/image/info-bg.jpg"></image> |
||||
</view> |
||||
<view class="text ell">{{ item.name }}</view> |
||||
</li> |
||||
</ul> |
||||
</view> |
||||
|
||||
<view class="list"> |
||||
<view v-if="auth('我的:设置')" class="item" @click="toSet"> |
||||
<view class="left"> |
||||
<image class="icon" src="@/static/image/person3.png" mode=""></image> |
||||
<text class="name">设置</text> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
<view v-if="!per" class="per-mask">功能升级中,敬请期待...</view> |
||||
</view> |
||||
</template> |
||||
|
||||
<script> |
||||
import { my, editProvinceCity } from '@/apis/modules/parner.js' |
||||
import { queryProvince, queryCity, updateAvatars, getUserRolesPermissionMenu } from '@/apis/modules/user.js' |
||||
import { getTeamsByAccountId } from '@/apis/modules/client.js' |
||||
export default { |
||||
data() { |
||||
return { |
||||
per: true, // 是否有权限 |
||||
teamId: uni.getStorageSync('teamId') || '', |
||||
teams: [], |
||||
my: { |
||||
info: { |
||||
phone: '' |
||||
}, |
||||
teamInfo: { |
||||
annualMarketingFee: '', |
||||
annualTeamFee: '', |
||||
}, |
||||
myIncome: 0, |
||||
teamIncome: 0 |
||||
}, |
||||
avatar: uni.getStorageSync('avatar') || '@/static/image/avatar.png', |
||||
userName: uni.getStorageSync('userName'), |
||||
hasOwnTeam: 0, // 有自己的团队 |
||||
disabled: true, |
||||
provinces: [], |
||||
cities: [], |
||||
provinceIcon: { |
||||
color: '#007eff', |
||||
size: '22', |
||||
type: 'location' |
||||
}, |
||||
cityIcon: { |
||||
color: '#007eff', |
||||
size: '22', |
||||
type: 'map-pin-ellipse' |
||||
}, |
||||
provinceId: '', |
||||
cityId: '', |
||||
provinceName: '', |
||||
cityName: '', |
||||
funcs: [ |
||||
{ |
||||
id: 1, |
||||
name: '我的电子券' |
||||
}, |
||||
{ |
||||
id: 2, |
||||
name: '已报名活动' |
||||
}, |
||||
] |
||||
} |
||||
}, |
||||
onShow() { |
||||
this.per = true |
||||
this.getTeam() |
||||
}, |
||||
methods: { |
||||
// 初始化权限 |
||||
initRole() { |
||||
if (!uni.getStorageSync('auth').includes('我的')) { |
||||
this.per = false |
||||
} else { |
||||
this.getInfo() |
||||
} |
||||
}, |
||||
// 查询当前角色权限 |
||||
getAuth() { |
||||
uni.showLoading({ |
||||
title: '加载中' |
||||
}) |
||||
getUserRolesPermissionMenu({ |
||||
teamId: this.teams.find(e => e.teamId == this.teamId).partnerClassificationId, |
||||
platformId: 4 |
||||
}).then(({ permissionMenu }) => { |
||||
uni.hideLoading() |
||||
const auth = [] |
||||
// 生成权限数组 |
||||
const generateAuth = (list, parent) => { |
||||
list.map(e => { |
||||
const name = `${parent ? parent + ':' : ''}${e.name}` |
||||
auth.push(name) |
||||
generateAuth(e.children, name) |
||||
}) |
||||
} |
||||
generateAuth(permissionMenu[0].children, '') |
||||
uni.setStorageSync('auth', auth) |
||||
this.initRole() |
||||
}).catch(e => { |
||||
uni.hideLoading() |
||||
uni.setStorageSync('auth', []) |
||||
this.initRole() |
||||
}) |
||||
}, |
||||
// 获取团队 |
||||
getTeam() { |
||||
uni.showLoading({ |
||||
title: '加载中' |
||||
}) |
||||
getTeamsByAccountId().then(({ data }) => { |
||||
let hasOwnTeam = 0 // 是否有自己的团队 |
||||
data.map(e => { |
||||
const n = e.partnerClassificationList |
||||
e.id = n.id |
||||
// parnerId是商务经理id,teamId则是下面这个,其他地方要用的话直接uni.getStorageSync('team').partnerId去使用 |
||||
e.teamId = e.isTeam == 1 ? +e.partnerClassificationId : n.id |
||||
e.partnerClassificationName = n.partnerClassificationName |
||||
delete e.partnerClassificationList |
||||
if (e.isTeam == 1) hasOwnTeam = 1 |
||||
}) |
||||
this.hasOwnTeam = hasOwnTeam |
||||
const teamId = uni.getStorageSync('teamId') |
||||
if (data.length) { |
||||
/** |
||||
* @description 如果是第一次进,则默认选中第一个团队,并把该团队的信息存入缓存 |
||||
* 或者团队列表里没有该id,则说明超管已经被转让,也需要重新选中团队 |
||||
*/ |
||||
const curTeam = data.find(e => e.teamId == teamId) |
||||
if (teamId && curTeam) { |
||||
uni.setStorageSync('team', curTeam) |
||||
} else if (!uni.getStorageSync('team') || !curTeam) { |
||||
this.teamId = data[0].teamId |
||||
uni.setStorageSync('teamId', data[0].teamId) |
||||
uni.setStorageSync('team', data[0]) |
||||
} |
||||
} else { |
||||
// 如果没有团队,则退出登录 |
||||
uni.hideLoading() |
||||
uni.clearStorageSync() |
||||
uni.navigateTo({ |
||||
url: '../login/login' |
||||
}) |
||||
} |
||||
this.disabled = uni.getStorageSync('team').isTeam == 0 // 成员不能改省份城市 |
||||
this.teams = data |
||||
this.getAuth() |
||||
}).catch(e => { |
||||
uni.hideLoading() |
||||
}) |
||||
}, |
||||
// 获取个人信息 |
||||
getInfo() { |
||||
const { partnerId, teamId } = uni.getStorageSync('team') |
||||
my({ |
||||
partnerId, |
||||
teamId |
||||
}).then(({ my }) => { |
||||
this.my = my |
||||
const avatar = my.info.userAvatars || 'https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png' |
||||
this.avatar = avatar |
||||
uni.setStorageSync('avatar', avatar) |
||||
this.provinceId = my.teamInfo.provinceId |
||||
this.cityId = my.teamInfo.cityId |
||||
uni.setStorageSync('provinceId', this.provinceId) |
||||
uni.setStorageSync('cityId', this.cityId) |
||||
this.getProvince() |
||||
this.provinceId && this.getCity() |
||||
}).catch(e => {}) |
||||
}, |
||||
// 上传头像回调 |
||||
onChooseAvatar(e) { |
||||
uni.uploadFile({ |
||||
url: 'https://huorantech.cn/nakadai/nakadai/oss/fileUpload', |
||||
filePath: e.detail.avatarUrl, |
||||
name: 'file', |
||||
header: { |
||||
token: uni.getStorageSync('token'), |
||||
}, |
||||
formData: {}, |
||||
success: ({ data }) => { |
||||
updateAvatars(JSON.parse(data).filesResult.fileUrl).then(res => { |
||||
this.getInfo() |
||||
}).catch(e => {}) |
||||
} |
||||
}) |
||||
}, |
||||
// 创建自己的团队 |
||||
createTeam() { |
||||
this.$util.to(`../reg/reg?openid=${uni.getStorageSync('openid')}&phone=${this.my.info.phone}&my=1`) |
||||
}, |
||||
// 进入设置 |
||||
toSet() { |
||||
this.$util.to(`/team/setting/setting`) |
||||
}, |
||||
toFunc(item) { |
||||
|
||||
} |
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<style scoped lang="scss"> |
||||
.bg { |
||||
width: 100%; |
||||
height: calc(var(--status-bar-height) + 317rpx); |
||||
} |
||||
.wrap { |
||||
position: relative; |
||||
padding: 0 24rpx; |
||||
margin-top: -150rpx; |
||||
} |
||||
.block { |
||||
padding: 24rpx; |
||||
margin-left: 0; |
||||
margin-right: 0; |
||||
.title { |
||||
margin-bottom: 20rpx; |
||||
font-size: 28rpx; |
||||
font-weight: 600; |
||||
} |
||||
} |
||||
.info { |
||||
display: flex; |
||||
align-items: center; |
||||
padding: 26rpx 34rpx; |
||||
background-color: #fff; |
||||
border-radius: 16rpx; |
||||
.avatar-btn { |
||||
padding: 0; |
||||
margin: 0 28rpx 0 0; |
||||
line-height: 0; |
||||
border: 0 !important; |
||||
background-color: transparent; |
||||
outline: none; |
||||
border-radius: 50%; |
||||
} |
||||
.avatar { |
||||
width: 120rpx; |
||||
height: 120rpx; |
||||
border: 0; |
||||
} |
||||
.text { |
||||
margin-right: 20rpx; |
||||
} |
||||
.name { |
||||
margin-bottom: 10rpx; |
||||
font-size: 40rpx; |
||||
color: #333; |
||||
} |
||||
.phone { |
||||
font-size: 28rpx; |
||||
color: #333; |
||||
} |
||||
.tag { |
||||
padding: 8rpx 16rpx; |
||||
margin-top: -50rpx; |
||||
font-size: 24rpx; |
||||
color: #fff; |
||||
background-color: #2979ff; |
||||
border-radius: 20px; |
||||
} |
||||
} |
||||
|
||||
.func { |
||||
display: flex; |
||||
flex-wrap: wrap; |
||||
li { |
||||
width: 25%; |
||||
margin-bottom: 24rpx; |
||||
text-align: center; |
||||
&:last-child { |
||||
image { |
||||
width: 50rpx; |
||||
height: 50rpx; |
||||
} |
||||
} |
||||
} |
||||
.icon { |
||||
display: flex; |
||||
justify-content: center; |
||||
align-items: center; |
||||
width: 90rpx; |
||||
height: 90rpx; |
||||
margin: 0 auto 18rpx; |
||||
background-color: rgb(228,239,255); |
||||
border-radius: 50%; |
||||
} |
||||
image { |
||||
width: 60rpx; |
||||
height: 60rpx; |
||||
} |
||||
.text { |
||||
width: 165rpx; |
||||
margin: 0 auto; |
||||
font-size: 24rpx; |
||||
color: #333; |
||||
} |
||||
} |
||||
.supplier { |
||||
display: flex; |
||||
justify-content: space-between; |
||||
align-items: center; |
||||
.title { |
||||
margin-bottom: 0; |
||||
} |
||||
.badge { |
||||
padding: 8rpx 16rpx; |
||||
font-size: 24rpx; |
||||
color: #fff; |
||||
background-color: #37cc07; |
||||
border-radius: 10px; |
||||
} |
||||
.auth { |
||||
font-size: 24rpx; |
||||
color: #9c9c9c; |
||||
} |
||||
} |
||||
.list { |
||||
margin-top: 16rpx; |
||||
.item { |
||||
display: flex; |
||||
justify-content: space-between; |
||||
align-items: center; |
||||
padding: 26rpx 28rpx; |
||||
margin-bottom: 16rpx; |
||||
background-color: #fff; |
||||
border-radius: 16rpx; |
||||
} |
||||
.left { |
||||
display: inline-flex; |
||||
align-items: center; |
||||
} |
||||
.icon { |
||||
width: 40rpx; |
||||
height: 40rpx; |
||||
margin-right: 16rpx; |
||||
} |
||||
text { |
||||
font-size: 28rpx; |
||||
color: #333; |
||||
} |
||||
} |
||||
.location { |
||||
margin-top: 30rpx; |
||||
} |
||||
.picker-wrap { |
||||
margin-top: 4px; |
||||
} |
||||
.name { |
||||
font-size: 24rpx; |
||||
} |
||||
</style> |
@ -0,0 +1,187 @@ |
||||
<template> |
||||
<view class="page"> |
||||
<image class="logo" src="@/static/image/logo.png" mode="widthFix"></image> |
||||
<view class="wrap"> |
||||
<view class="hello"> |
||||
{{ form.isTeam ? '或然科技城市合伙人,欢迎回来!' : form.isTeam === 0 ? '请认真填写您的姓名和意向开展业务的区域。创建成功后,我们将会有区域运营与您联系沟通后续事宜。' : '欢迎加入或然城市合伙人计划!请认真填写您的姓名和意向开展业务的区域。注册后,我们将会有区域运营与您联系沟通后续事宜。'}} |
||||
</view> |
||||
<view> |
||||
<uni-forms> |
||||
<uni-forms-item label="姓名"> |
||||
<uni-easyinput type="text" v-model="form.userName" placeholder="请输入姓名" :disabled="exist" /> |
||||
</uni-forms-item> |
||||
<uni-forms-item label="业务省份"> |
||||
<view v-if="form.isTeam" class="location">{{ form.provinceName }}</view> |
||||
<uni-data-picker v-else placeholder="请选择省份" popup-title="请选择省份" preload :localdata="provinces" :map="{text: 'provinceName', value: 'provinceId'}" v-model="form.provinceId" @change="getCity"></uni-data-picker> |
||||
</uni-forms-item> |
||||
<uni-forms-item label="业务城市"> |
||||
<view v-if="form.isTeam" class="location">{{ form.cityName }}</view> |
||||
<uni-data-picker v-else placeholder="请选择城市" popup-title="请选择城市" preload :localdata="cities" :map="{text: 'cityName', value: 'cityId'}" v-model="form.cityId"></uni-data-picker> |
||||
</uni-forms-item> |
||||
</uni-forms> |
||||
<view class="btns"> |
||||
<button type="primary" @click="submit">{{ form.isTeam ? '登录' : form.isTeam === 0 ? '确定' : '注册' }}</button> |
||||
<button @click="back">取消</button> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</template> |
||||
|
||||
<script> |
||||
import { queryPartnerAccount, queryProvince, queryCity, partnerAccountApplication, loginByOpenid, checkWorkNumOrAccount } from '@/apis/modules/user.js' |
||||
export default { |
||||
data() { |
||||
return { |
||||
openid: '', |
||||
phone: '', |
||||
my: false, |
||||
form: { |
||||
userName: '', |
||||
provinceId: '', |
||||
cityId: '', |
||||
}, |
||||
accountRepeat: false, |
||||
provinces: [], |
||||
cities: [], |
||||
exist: false |
||||
} |
||||
}, |
||||
onShow() { |
||||
const pages = getCurrentPages() |
||||
const { options } = pages[pages.length - 1] |
||||
this.openid = options.openid |
||||
this.phone = options.phone |
||||
this.my = options.my |
||||
this.getProvince() |
||||
this.checkLogin() |
||||
}, |
||||
methods: { |
||||
// 检查登录状态 |
||||
checkLogin() { |
||||
// 根据手机号获取是否注册过,如果有,则判断是否是队长(isTeam 1:队长,0:成员),如果没有返回team,则注册 |
||||
queryPartnerAccount(this.phone).then(({ team, username }) => { |
||||
if (team) { |
||||
team.teamId && uni.setStorageSync('teamId', team.teamId) |
||||
this.form.userName = team.userName |
||||
if (team) this.exist = true |
||||
if (team.isTeam) { |
||||
this.form = team |
||||
this.getCity() |
||||
} else { |
||||
this.form.isTeam = 0 |
||||
if (team.userName) this.form.userName = team.userName |
||||
} |
||||
} else if (username) { // 没有团队,只有username |
||||
this.form.userName = username |
||||
} |
||||
}).catch(e => {}) |
||||
}, |
||||
// 获取省份 |
||||
getProvince() { |
||||
queryProvince().then(({ list }) => { |
||||
this.provinces = list |
||||
}).catch(res => {}) |
||||
}, |
||||
// 获取城市 |
||||
getCity(val) { |
||||
if (this.form.provinceId) { |
||||
queryCity({ |
||||
provinceId: this.form.provinceId |
||||
}).then(({ list }) => { |
||||
this.cities = list |
||||
}).catch(res => {}) |
||||
} else { |
||||
this.cities = [] |
||||
} |
||||
if (val) this.form.cityId = '' |
||||
}, |
||||
// 提交 |
||||
submit() { |
||||
const { form } = this |
||||
if (!form.userName) return this.$util.errMsg('请输入姓名!') |
||||
if (!form.provinceId) return this.$util.errMsg('请选择意向省份!') |
||||
if (!form.cityId) return this.$util.errMsg('请选择意向城市!') |
||||
form.phone = this.phone |
||||
form.appOpenId = this.openid |
||||
form.uniqueIdentification = Date.now() |
||||
if (form.isTeam) { // 队长,直接登录 |
||||
loginByOpenid(this.openid).then(({ data }) => { |
||||
uni.setStorageSync('token', data.token) |
||||
this.toIndex() |
||||
}).catch(res => {}) |
||||
} else { // 新用户,注册。or 成员,创建自己的团队 |
||||
partnerAccountApplication(form).then(({ token, teamId }) => { |
||||
this.$util.sucMsg(form.isTeam === 0 ? '创建成功' : '注册成功') |
||||
// 如果返回了token,直接登录,并且把teamId存在缓存里,到了首页后直接选中该团队 |
||||
if (token) { |
||||
teamId && uni.setStorageSync('teamId', teamId) |
||||
uni.setStorageSync('token', token) |
||||
setTimeout(() => { |
||||
this.toIndex() |
||||
}, 1500) |
||||
} else { |
||||
setTimeout(() => { |
||||
uni.redirectTo({ |
||||
url: '../login/login' |
||||
}) |
||||
}, 1500) |
||||
} |
||||
}).catch(res => {}) |
||||
} |
||||
}, |
||||
// 跳转到首页 |
||||
toIndex() { |
||||
uni.reLaunch({ |
||||
url: this.my ? '../person/person' : '../index/index' |
||||
}) |
||||
}, |
||||
// 返回 |
||||
back() { |
||||
uni.navigateBack() |
||||
} |
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<style scoped lang="scss"> |
||||
.page { |
||||
min-height: 100%; |
||||
text-align: center; |
||||
background: url(@/static/image/login1.png) 0 0/175rpx auto no-repeat, |
||||
url(@/static/image/login2.png) bottom right/123rpx auto no-repeat; |
||||
.logo { |
||||
width: 393rpx; |
||||
margin: 100rpx 0 60rpx; |
||||
} |
||||
} |
||||
.wrap { |
||||
position: relative; |
||||
padding: 60rpx; |
||||
margin: 0 61rpx; |
||||
text-align: center; |
||||
border-radius: 8rpx; |
||||
background-color: #fff; |
||||
.hello { |
||||
margin-bottom: 30rpx; |
||||
font-size: 28rpx; |
||||
color: #333; |
||||
} |
||||
.btns { |
||||
display: flex; |
||||
button { |
||||
width: 200rpx; |
||||
font-size: 30rpx; |
||||
} |
||||
} |
||||
.location { |
||||
padding-left: 10px; |
||||
line-height: 38px; |
||||
font-size: 14px; |
||||
color: #D5D5D5; |
||||
border: 1px solid #e5e5e5; |
||||
background-color: #F7F6F6; |
||||
border-radius: 4px; |
||||
} |
||||
} |
||||
</style> |
@ -0,0 +1,25 @@ |
||||
<template> |
||||
<view class="oh"> |
||||
<view class="per-mask">功能升级中,敬请期待...</view> |
||||
</view> |
||||
</template> |
||||
|
||||
<script> |
||||
export default { |
||||
data() { |
||||
return { |
||||
per: true, // 是否有权限 |
||||
} |
||||
}, |
||||
onShow() { |
||||
|
||||
}, |
||||
methods: { |
||||
|
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<style scoped lang="scss"> |
||||
|
||||
</style> |
@ -0,0 +1,281 @@ |
||||
<template> |
||||
<view :class="[{oh: !per}]"> |
||||
<view class="page"> |
||||
<view class="search-wrap"> |
||||
<uni-search-bar class="search" radius="30" placeholder="请输入" v-model="keyword" clearButton="auto" cancelButton="none" @confirm="searchConfirm" /> |
||||
</view> |
||||
|
||||
<view class="banner"> |
||||
<image class="pic" src="@/static/image/index/banner.png" mode="widthFix"></image> |
||||
</view> |
||||
|
||||
<ul class="tab"> |
||||
<li v-for="(tab, i) in tabs" :class="{active: curTab === tab.id}" @click="tabChange(tab)">{{ tab.name }}</li> |
||||
</ul> |
||||
<view class="list"> |
||||
<li v-for="(item, i) in list" :key="i" @click="toDetail(item)"> |
||||
<view class="pro-name"> |
||||
<image class="icon" src="@/static/image/info-bg.jpg"></image> |
||||
{{ item.productName }} |
||||
</view> |
||||
<view class="info"> |
||||
<view class="line"> |
||||
<text class="name">产品简介:</text> |
||||
<view class="val ell-wrap"> |
||||
<view class="ell">{{ item.productIntroduction }}</view> |
||||
</view> |
||||
</view> |
||||
<view class="line"> |
||||
<text class="name">产品类型:</text> |
||||
<text class="val">{{ item.typeName }}</text> |
||||
</view> |
||||
</view> |
||||
</li> |
||||
</view> |
||||
</view> |
||||
<view v-if="!per" class="per-mask">功能升级中,敬请期待...</view> |
||||
</view> |
||||
</template> |
||||
|
||||
<script> |
||||
import { getUserRolesPermissionMenu } from '@/apis/modules/user.js' |
||||
import { tagsList, listOfGoods, shoppingCartList } from '@/apis/modules/product.js' |
||||
import { getTeamsByAccountId } from '@/apis/modules/client.js' |
||||
export default { |
||||
data() { |
||||
return { |
||||
per: true, // 是否有权限 |
||||
teamId: uni.getStorageSync('teamId') || '', |
||||
list: [], |
||||
keyword: '', |
||||
tags: [], |
||||
hotProducts: [], |
||||
offcialProducts: [], |
||||
total: 0, |
||||
curTab: 0, |
||||
tabs: [ |
||||
{ |
||||
name: '全部', |
||||
id: 0 |
||||
}, |
||||
{ |
||||
name: '论坛', |
||||
id: 1 |
||||
} |
||||
], |
||||
} |
||||
}, |
||||
onShow() { |
||||
this.keyword = '' |
||||
this.per = true |
||||
this.getInfo() |
||||
this.getShopCart() |
||||
}, |
||||
methods: { |
||||
// 初始化权限 |
||||
initRole() { |
||||
if (!uni.getStorageSync('auth').includes('首页')) { |
||||
this.per = false |
||||
} |
||||
this.getTags() |
||||
this.getProducts() |
||||
}, |
||||
// 查询当前角色权限 |
||||
getAuth() { |
||||
uni.getStorageSync('token') && getUserRolesPermissionMenu({ |
||||
teamId: this.list.find(e => e.teamId == this.teamId).partnerClassificationId, |
||||
platformId: 4 |
||||
}).then(({ permissionMenu }) => { |
||||
uni.hideLoading() |
||||
const auth = [] |
||||
// 生成权限数组 |
||||
const generateAuth = (list, parent) => { |
||||
list.map(e => { |
||||
const name = `${parent ? parent + ':' : ''}${e.name}` |
||||
auth.push(name) |
||||
generateAuth(e.children, name) |
||||
}) |
||||
} |
||||
generateAuth(permissionMenu[0].children, '') |
||||
uni.setStorageSync('auth', auth) |
||||
this.$forceUpdate() |
||||
this.initRole() |
||||
}).catch(e => { |
||||
uni.hideLoading() |
||||
uni.setStorageSync('auth', []) |
||||
this.initRole() |
||||
}) |
||||
}, |
||||
// 获取团队 |
||||
getInfo() { |
||||
uni.showLoading({ |
||||
title: '加载中' |
||||
}) |
||||
getTeamsByAccountId().then(({ data }) => { |
||||
data.map(e => { |
||||
const n = e.partnerClassificationList |
||||
e.id = n.id |
||||
// parnerId是商务经理id,teamId则是下面这个,其他地方要用的话直接uni.getStorageSync('team').partnerId去使用 |
||||
e.teamId = e.isTeam == 1 ? +e.partnerClassificationId : n.id |
||||
e.partnerClassificationName = n.partnerClassificationName |
||||
delete e.partnerClassificationList |
||||
}) |
||||
if (data.length) { |
||||
/** |
||||
* @description 如果是第一次进,则默认选中第一个团队,并把该团队的信息存入缓存 |
||||
* 或者团队列表里没有该id,则说明超管已经被转让,也需要重新选中团队 |
||||
*/ |
||||
if (!uni.getStorageSync('team') || !data.find(e => e.teamId == this.teamId)) { |
||||
this.teamId = data[0].teamId |
||||
uni.setStorageSync('team', data[0]) |
||||
} |
||||
} else { |
||||
// 如果没有团队,则退出登录 |
||||
uni.hideLoading() |
||||
uni.clearStorageSync() |
||||
uni.navigateTo({ |
||||
url: '../login/login' |
||||
}) |
||||
} |
||||
|
||||
this.list = data |
||||
this.getAuth() |
||||
}).catch(e => { |
||||
uni.hideLoading() |
||||
}) |
||||
}, |
||||
// 热门标签 |
||||
getTags() { |
||||
tagsList().then(res => { |
||||
this.tags = res.tagsList.slice(0, 8) |
||||
}).catch(e => {}) |
||||
}, |
||||
// 获取购物车数量 |
||||
getShopCart() { |
||||
shoppingCartList({ |
||||
pageNum: 1, |
||||
pageSize: 1000, |
||||
}).then(({ data }) => { |
||||
this.total = data.total |
||||
}).catch(e => {}) |
||||
}, |
||||
// 产品 |
||||
getProducts() { |
||||
// 热销产品 |
||||
listOfGoods({ |
||||
pageNum: 1, |
||||
pageSize: 5, |
||||
sort: 1, |
||||
isShelves: 0, |
||||
hotTag: 1 |
||||
}).then(({ page }) => { |
||||
page.records.forEach(e => { |
||||
e.productIntroduction = this.$util.removeTag(e.productIntroduction) |
||||
}) |
||||
this.hotProducts = page.records |
||||
}).catch(e => {}) |
||||
|
||||
// 官方推荐 |
||||
listOfGoods({ |
||||
pageNum: 1, |
||||
pageSize: 5, |
||||
sort: 0, |
||||
isShelves: 0, |
||||
hotTag: 1, |
||||
selection: 1 |
||||
}).then(({ page }) => { |
||||
page.records.forEach(e => { |
||||
e.productIntroduction = this.$util.removeTag(e.productIntroduction) |
||||
}) |
||||
this.offcialProducts = page.records |
||||
}).catch(e => {}) |
||||
}, |
||||
// 模糊查询回调 |
||||
searchConfirm(e) { |
||||
e.value && this.$util.to(`/order/products/products?keyword=${e.value}`) |
||||
}, |
||||
// 跳转热门标签 |
||||
toHot(item) { |
||||
this.$util.to(`/order/products/products?tagId=${item.tagsId}&tagsName=${item.tagsName}`) |
||||
}, |
||||
// 跳转学习 |
||||
toProduct() { |
||||
this.$util.to('/order/products/products') |
||||
}, |
||||
// 跳转学习详情 |
||||
toDetail(item) { |
||||
this.$util.to('/order/supplierDetail/supplierDetail?id=') |
||||
}, |
||||
// tab切换 |
||||
tabChange(tab) { |
||||
this.curTab = tab.id |
||||
// this.initList() |
||||
}, |
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<style scoped lang="scss"> |
||||
.banner { |
||||
position: relative; |
||||
.pic { |
||||
width: 100%; |
||||
} |
||||
} |
||||
.list { |
||||
li { |
||||
padding: 24rpx; |
||||
margin: 16rpx 24rpx; |
||||
background-color: #fff; |
||||
border-radius: 16rpx; |
||||
} |
||||
.pro-name { |
||||
display: flex; |
||||
align-items: center; |
||||
padding: 18rpx 0; |
||||
font-size: 30rpx; |
||||
font-weight: 600; |
||||
color: #333; |
||||
border-bottom: 1px solid #E6E8ED; |
||||
.icon { |
||||
width: 58rpx; |
||||
min-width: 58rpx; |
||||
height: 58rpx; |
||||
margin-right: 20rpx; |
||||
border-radius: 4px; |
||||
} |
||||
} |
||||
.info { |
||||
padding: 12rpx 0; |
||||
} |
||||
.line { |
||||
display: flex; |
||||
padding: 12rpx 0; |
||||
} |
||||
.name { |
||||
margin-right: 10rpx; |
||||
font-size: 28rpx; |
||||
color: #999; |
||||
} |
||||
.val { |
||||
max-width: 70%; |
||||
font-size: 28rpx; |
||||
color: #333; |
||||
} |
||||
.ell-wrap { |
||||
display: inline-flex; |
||||
align-items: center; |
||||
} |
||||
.ell { |
||||
white-space: nowrap; |
||||
text-overflow: ellipsis; |
||||
overflow: hidden; |
||||
} |
||||
.toggle { |
||||
margin-left: 10rpx; |
||||
white-space: nowrap; |
||||
font-size: 24rpx; |
||||
color: #0e92ef; |
||||
} |
||||
} |
||||
</style> |
@ -0,0 +1,32 @@ |
||||
@font-face { |
||||
font-family: "iconfont";
src: url('/static/iconfont/iconfont.ttf') format('truetype'); |
||||
} |
||||
|
||||
.iconfont { |
||||
font-family: "iconfont" !important; |
||||
font-size: 16px; |
||||
font-style: normal; |
||||
-webkit-font-smoothing: antialiased; |
||||
-moz-osx-font-smoothing: grayscale; |
||||
} |
||||
|
||||
.icon-qrcode:before { |
||||
content: "\e7dd"; |
||||
} |
||||
|
||||
.icon-dingdan:before { |
||||
content: "\e601"; |
||||
} |
||||
|
||||
.icon-product:before { |
||||
content: "\e788"; |
||||
} |
||||
|
||||
.icon-edit:before { |
||||
content: "\e621"; |
||||
} |
||||
|
||||
.icon-filter:before { |
||||
content: "\e6b9"; |
||||
} |
||||
|
After Width: | Height: | Size: 257 B |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 775 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 599 B |
After Width: | Height: | Size: 439 B |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 518 B |
After Width: | Height: | Size: 522 B |
After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 28 KiB |
After Width: | Height: | Size: 9.0 KiB |
After Width: | Height: | Size: 4.5 KiB |
After Width: | Height: | Size: 9.7 KiB |
After Width: | Height: | Size: 3.0 KiB |
After Width: | Height: | Size: 7.5 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 528 B |
After Width: | Height: | Size: 620 B |
After Width: | Height: | Size: 382 B |
After Width: | Height: | Size: 537 B |
After Width: | Height: | Size: 514 B |
After Width: | Height: | Size: 689 B |
After Width: | Height: | Size: 519 B |
After Width: | Height: | Size: 457 B |
After Width: | Height: | Size: 270 B |
After Width: | Height: | Size: 734 B |
After Width: | Height: | Size: 372 B |
After Width: | Height: | Size: 302 B |
After Width: | Height: | Size: 3.5 KiB |
After Width: | Height: | Size: 483 B |
After Width: | Height: | Size: 434 B |
After Width: | Height: | Size: 298 B |
After Width: | Height: | Size: 351 B |
After Width: | Height: | Size: 641 B |
After Width: | Height: | Size: 251 B |
After Width: | Height: | Size: 480 B |
After Width: | Height: | Size: 440 B |
After Width: | Height: | Size: 347 B |
After Width: | Height: | Size: 1007 B |
After Width: | Height: | Size: 510 B |
After Width: | Height: | Size: 502 B |
After Width: | Height: | Size: 325 B |
After Width: | Height: | Size: 282 B |
After Width: | Height: | Size: 48 KiB |
After Width: | Height: | Size: 368 B |
After Width: | Height: | Size: 218 B |
After Width: | Height: | Size: 223 B |
After Width: | Height: | Size: 372 B |
After Width: | Height: | Size: 195 B |
After Width: | Height: | Size: 331 B |
After Width: | Height: | Size: 222 B |
After Width: | Height: | Size: 410 B |
After Width: | Height: | Size: 373 B |
After Width: | Height: | Size: 197 B |